diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000000..6487cdc86f --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +changelog.md merge=union diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index ef0f7cf78b..aa647f761e 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,7 +1,7 @@ # CODEOWNERS: https://help.github.com/articles/about-codeowners/ +# Primary repo maintainers +* @ilgooz @lubtd @jeronimoalbi @aljo242 @tbruyelle @fadeev + # Docs *.md @ilgooz @aljo242 - -# Primary repo maintainers -* @ilgooz @lubtd @jeronimoalbi @aljo242 @tbruyelle diff --git a/.github/workflows/cl-enforcer.yml b/.github/workflows/cl-enforcer.yml new file mode 100644 index 0000000000..850a632159 --- /dev/null +++ b/.github/workflows/cl-enforcer.yml @@ -0,0 +1,18 @@ +name: Changelog Enforcer +on: + pull_request: + # The specific activity types are listed here to include "labeled" and "unlabeled" + # (which are not included by default for the "pull_request" trigger). + # This is needed to allow skipping enforcement of the changelog in PRs with specific labels, + # as defined in the (optional) "skipLabels" property. + types: [opened, synchronize, reopened, ready_for_review, labeled, unlabeled] + +jobs: + changelog: + runs-on: ubuntu-latest + steps: + - uses: dangoslen/changelog-enforcer@v3 + with: + changeLogPath: 'changelog.md' + missingUpdateErrorMessage: 'Please fill the changelog.md file or add the "Skip-Changelog" label' + versionPattern: '' diff --git a/.github/workflows/go-formatting.yml b/.github/workflows/go-formatting.yml new file mode 100644 index 0000000000..5bfd056765 --- /dev/null +++ b/.github/workflows/go-formatting.yml @@ -0,0 +1,29 @@ +name: Go formatting +on: + push: + branches: [develop] + paths: + - '**.go' + +jobs: + go-formatting: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Install Go + uses: actions/setup-go@v3 + with: + go-version: '1.18' + + - name: Run make format + run: make format + + - name: Create Pull Request + uses: peter-evans/create-pull-request@v3 + with: + title: "chore: go formatting" + commit-message: "chore: go formatting" + body: "" + branch: chore/go-formatting diff --git a/.gitpod.yml b/.gitpod.yml index 215496184b..8a083268b7 100644 --- a/.gitpod.yml +++ b/.gitpod.yml @@ -47,6 +47,9 @@ tasks: ports: - port: 1317 - port: 26657 + visibility: public + - port: 26659 + visibility: public - port: 8080 - port: 7575 visibility: public diff --git a/.gitpod/readme.md b/.gitpod/readme.md index ba97a75762..54f1330566 100644 --- a/.gitpod/readme.md +++ b/.gitpod/readme.md @@ -39,8 +39,8 @@ where: * Scaffold modules, messages, types with CRUD operations, IBC packets, and more * Start a blockchain node in development with live reloading * Connect to other blockchains with a built-in IBC relayer -* Use automatically generated TypeScript/Vuex clients to interact with your blockchain -* Use the Vue.js web app template with a set of components and Vuex modules +* Use automatically generated TypeScript clients and Vuex stores to interact with your blockchain +* Use the Vue 3 web app template with a set of UI components to build your custom web application ## Install Ignite CLI locally diff --git a/.golangci.yml b/.golangci.yml index c1ee08bd63..fc318c3a90 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -9,7 +9,6 @@ linters: disable-all: true enable: - bodyclose - - deadcode - depguard - dogsled # - errcheck @@ -22,13 +21,12 @@ linters: - gosimple - govet - ineffassign - - interfacer + # - interfacer # - maligned - misspell - nakedret - - scopelint + - exportloopref - staticcheck - - structcheck - stylecheck - typecheck - unconvert diff --git a/Makefile b/Makefile index f22ae02287..dc6f4a15d6 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,6 @@ # Project variables. PROJECT_NAME = ignite DATE := $(shell date '+%Y-%m-%dT%H:%M:%S') -FIND_ARGS := -name '*.go' -type f -not -name '*.pb.go' HEAD = $(shell git rev-parse HEAD) LD_FLAGS = -X github.com/ignite/cli/ignite/version.Head='$(HEAD)' \ -X github.com/ignite/cli/ignite/version.Date='$(DATE)' @@ -22,28 +21,38 @@ build: @-mkdir -p $(BUILD_FOLDER) 2> /dev/null @go build $(BUILD_FLAGS) -o $(BUILD_FOLDER) ./... +## mocks: generate mocks +mocks: + @echo Generating mocks + @go install github.com/vektra/mockery/v2 + @go generate ./... + + ## clean: Clean build files. Also runs `go clean` internally. clean: @echo Cleaning build cache... @-rm -rf $(BUILD_FOLDER) 2> /dev/null @go clean ./... +.PHONY: install build mocks clean + ## govet: Run go vet. govet: @echo Running go vet... @go vet ./... -## format: Run gofmt. +## format: Install and run goimports and gofumpt format: @echo Formatting... - @find . $(FIND_ARGS) | xargs gofmt -d -s - @find . $(FIND_ARGS) | xargs goimports -w -local github.com/ignite/cli + @go run mvdan.cc/gofumpt -w . + @go run golang.org/x/tools/cmd/goimports -w -local github.com/ignite/cli . ## lint: Run Golang CI Lint. lint: @echo Running gocilint... - @go install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.45.2 - @golangci-lint run --out-format=tab --issues-exit-code=0 + @go run github.com/golangci/golangci-lint/cmd/golangci-lint run --out-format=tab --issues-exit-code=0 + +.PHONY: govet format lint ## test-unit: Run the unit tests. test-unit: @@ -58,6 +67,8 @@ test-integration: install ## test: Run unit and integration tests. test: govet test-unit test-integration +.PHONY: test-unit test-integration test + help: Makefile @echo @echo " Choose a command run in "$(PROJECT_NAME)", or just run 'make' for install" @@ -65,4 +76,6 @@ help: Makefile @sed -n 's/^##//p' $< | column -t -s ':' | sed -e 's/^/ /' @echo +.PHONY: help + .DEFAULT_GOAL := install diff --git a/changelog.md b/changelog.md index 9f4618cccb..43e5e9e008 100644 --- a/changelog.md +++ b/changelog.md @@ -1,5 +1,57 @@ # Changelog +## [`v0.24.0`](https://github.com/ignite/cli/releases/tag/v0.24.0) + +### Features + +- Upgraded Cosmos SDK to `v0.46.0` and IBC to `v5` in CLI and scaffolding templates +- Change chain init to check that no gentx are present in the initial genesis +- Add `network rewards release` command +- Add "make mocks" target to Makefile +- Add `--skip-proto` flag to `build`, `init` and `serve` commands to build the chain without building proto files +- Add `node query tx` command to query a transaction in any chain. +- Add `node query bank` command to query an account's bank balance in any chain. +- Add `node tx bank send` command to send funds from one account to another in any chain. +- Implement `network profile` command +- Add `generate ts-client` command to generate a stand-alone modular TypeScript client. + +### Changes + +- Add changelog merge strategy in .gitattributes to avoid conflicts. +- Refactor `templates/app` to remove `monitoringp` module from the default template +- Updated keyring dependency to match Cosmos SDK +- Speed up the integration tests +- Refactor ignite network and fix genesis generation bug +- Make Go dependency verification optional during build by adding the `--check-dependencies` flag + so Ignite CLI can work in a Go workspace context. +- Temporary SPN address change for nightly +- Rename `simapp.go.plush` simulation file template to `helpers.go.plush` +- Remove campaign creation from the `network chain publish` command +- Optimized JavaScript generator to use a single typescript API generator binary +- Improve documentation and add support for protocol buffers and Go modules syntax +- Add inline documentation for CLI commands +- Change `cmd/account` to skip passphrase prompt when importing from mnemonic +- Add nodejs version in the output of ignite version +- Removed `handler.go` from scaffolded module template +- Migrated to `cosmossdk.io` packages for and `math` +- Vuex stores from the `generate vuex` command use the new TypeScript client +- Upgraded frontend Vue template to v0.3.10 + +### Fixes + +- Improved error handling for crypto wrapper functions +- Fix `pkg/cosmosclient` to call the faucet prior to creating the tx. +- Test and refactor `pkg/comosclient`. +- Change templates to add missing call to `RegisterMsgServer` in the default module's template to match what's specified in the docs +- Fix cosmoscmd appID parameter value to sign a transaction correctly +- Fix `scaffold query` command to use `GetClientQueryContext` instead of `GetClientTxContext` +- Fix flaky integration tests issue that failed with "text file busy" +- Fix default chain ID for publish +- Replace `os.Rename` with `xos.Rename` +- Fix CLI reference generation to add `ignite completion` documentation +- Remove usage of deprecated `io/ioutil` package + + ## [`v0.23.0`](https://github.com/ignite/cli/releases/tag/v0.23.0) ### Features @@ -29,7 +81,6 @@ - Rename `ignite-hq` to `ignite` - ## [`v0.22.1`](https://github.com/ignite/cli/releases/tag/v0.22.1) ### Fixes diff --git a/docs/docs.go b/docs/docs.go index f7e9b2c40b..3094352c72 100644 --- a/docs/docs.go +++ b/docs/docs.go @@ -3,5 +3,6 @@ package docs import "embed" // Docs are Ignite CLI docs. -//go:embed *.md */*.md +// +//go:embed docs var Docs embed.FS diff --git a/docs/docs/06-bounty.md b/docs/docs/06-bounty.md index 9615f6f2a7..cb364e10a5 100644 --- a/docs/docs/06-bounty.md +++ b/docs/docs/06-bounty.md @@ -1,5 +1,5 @@ --- -sidebar_position: 6 +sidebar_position: 7 description: Ignite CLI bounty program incentives and rewards. --- diff --git a/docs/docs/07-cli.md b/docs/docs/07-cli.md index 9880296298..ded778d73d 100644 --- a/docs/docs/07-cli.md +++ b/docs/docs/07-cli.md @@ -28,10 +28,12 @@ ignite scaffold chain github.com/username/mars **SEE ALSO** -* [ignite account](#ignite-account) - Commands for managing accounts +* [ignite account](#ignite-account) - Commands for managing Ignite accounts * [ignite chain](#ignite-chain) - Build, initialize and start a blockchain node or perform other actions on the blockchain +* [ignite completion](#ignite-completion) - Generate the autocompletion script for the specified shell * [ignite docs](#ignite-docs) - Show Ignite CLI docs * [ignite generate](#ignite-generate) - Generate clients, API docs from source code +* [ignite node](#ignite-node) - Make calls to a live blockchain node * [ignite relayer](#ignite-relayer) - Connect blockchains by using IBC protocol * [ignite scaffold](#ignite-scaffold) - Scaffold a new blockchain, module, message, query, and more * [ignite tools](#ignite-tools) - Tools for advanced users @@ -40,17 +42,26 @@ ignite scaffold chain github.com/username/mars ## ignite account -Commands for managing accounts +Commands for managing Ignite accounts **Synopsis** -Commands for managing accounts. An account is a pair of a private key and a public key. -Ignite CLI uses accounts to interact with the Ignite blockchain, use an IBC relayer, and more. +Commands for managing Ignite accounts. An Ignite account is a private/public +keypair stored in a keyring. Currently Ignite accounts are used when interacting +with Ignite relayer commands. + +Note: Ignite account commands are not for managing your chain's keys and accounts. Use +you chain's binary to manage accounts from "config.yml". For example, if your +blockchain is called "mychain", use "mychaind keys" to manage keys for the +chain. + **Options** ``` - -h, --help help for account + -h, --help help for account + --keyring-backend string Keyring backend to store your account keys (default "test") + --keyring-dir string The accounts keyring directory (default "/home/runner/.ignite/accounts") ``` **SEE ALSO** @@ -75,13 +86,19 @@ ignite account create [name] [flags] **Options** ``` - -h, --help help for create + -h, --help help for create +``` + +**Options inherited from parent commands** + +``` --keyring-backend string Keyring backend to store your account keys (default "test") + --keyring-dir string The accounts keyring directory (default "/home/runner/.ignite/accounts") ``` **SEE ALSO** -* [ignite account](#ignite-account) - Commands for managing accounts +* [ignite account](#ignite-account) - Commands for managing Ignite accounts ## ignite account delete @@ -95,13 +112,19 @@ ignite account delete [name] [flags] **Options** ``` - -h, --help help for delete + -h, --help help for delete +``` + +**Options inherited from parent commands** + +``` --keyring-backend string Keyring backend to store your account keys (default "test") + --keyring-dir string The accounts keyring directory (default "/home/runner/.ignite/accounts") ``` **SEE ALSO** -* [ignite account](#ignite-account) - Commands for managing accounts +* [ignite account](#ignite-account) - Commands for managing Ignite accounts ## ignite account export @@ -115,16 +138,22 @@ ignite account export [name] [flags] **Options** ``` - -h, --help help for export + -h, --help help for export + --non-interactive Do not enter into interactive mode + --passphrase string Passphrase to encrypt the exported key + --path string path to export private key. default: ./key_[name] +``` + +**Options inherited from parent commands** + +``` --keyring-backend string Keyring backend to store your account keys (default "test") - --non-interactive Do not enter into interactive mode - --passphrase string Account passphrase - --path string path to export private key. default: ./key_[name] + --keyring-dir string The accounts keyring directory (default "/home/runner/.ignite/accounts") ``` **SEE ALSO** -* [ignite account](#ignite-account) - Commands for managing accounts +* [ignite account](#ignite-account) - Commands for managing Ignite accounts ## ignite account import @@ -138,16 +167,22 @@ ignite account import [name] [flags] **Options** ``` - -h, --help help for import + -h, --help help for import + --non-interactive Do not enter into interactive mode + --passphrase string Passphrase to decrypt the imported key (ignored when secret is a mnemonic) + --secret string Your mnemonic or path to your private key (use interactive mode instead to securely pass your mnemonic) +``` + +**Options inherited from parent commands** + +``` --keyring-backend string Keyring backend to store your account keys (default "test") - --non-interactive Do not enter into interactive mode - --passphrase string Account passphrase - --secret string Your mnemonic or path to your private key (use interactive mode instead to securely pass your mnemonic) + --keyring-dir string The accounts keyring directory (default "/home/runner/.ignite/accounts") ``` **SEE ALSO** -* [ignite account](#ignite-account) - Commands for managing accounts +* [ignite account](#ignite-account) - Commands for managing Ignite accounts ## ignite account list @@ -161,14 +196,20 @@ ignite account list [flags] **Options** ``` - --address-prefix string Account address prefix (default "cosmos") - -h, --help help for list + --address-prefix string Account address prefix (default "cosmos") + -h, --help help for list +``` + +**Options inherited from parent commands** + +``` --keyring-backend string Keyring backend to store your account keys (default "test") + --keyring-dir string The accounts keyring directory (default "/home/runner/.ignite/accounts") ``` **SEE ALSO** -* [ignite account](#ignite-account) - Commands for managing accounts +* [ignite account](#ignite-account) - Commands for managing Ignite accounts ## ignite account show @@ -182,14 +223,20 @@ ignite account show [name] [flags] **Options** ``` - --address-prefix string Account address prefix (default "cosmos") - -h, --help help for show + --address-prefix string Account address prefix (default "cosmos") + -h, --help help for show +``` + +**Options inherited from parent commands** + +``` --keyring-backend string Keyring backend to store your account keys (default "test") + --keyring-dir string The accounts keyring directory (default "/home/runner/.ignite/accounts") ``` **SEE ALSO** -* [ignite account](#ignite-account) - Commands for managing accounts +* [ignite account](#ignite-account) - Commands for managing Ignite accounts ## ignite chain @@ -198,7 +245,54 @@ Build, initialize and start a blockchain node or perform other actions on the bl **Synopsis** -Build, initialize and start a blockchain node or perform other actions on the blockchain. +Commands in this namespace let you to build, initialize, and start your +blockchain node locally for development purposes. + +To run these commands you should be inside the project's directory so that +Ignite can find the source code. To ensure that you are, run "ls", you should +see the following files in the output: "go.mod", "x", "proto", "app", etc. + +By default the "build" command will identify the "main" package of the project, +install dependencies if necessary, set build flags, compile the project into a +binary and install the binary. The "build" command is useful if you just want +the compiled binary, for example, to initialize and start the chain manually. It +can also be used to release your chain's binaries automatically as part of +continuous integration workflow. + +The "init" command will build the chain's binary and use it to initialize a +local validator node. By default the validator node will be initialized in your +$HOME directory in a hidden directory that matches the name of your project. +This directory is called a data directory and contains a chain's genesis file +and a validator key. This command is useful if you want to quickly build and +initialize the data directory and use the chain's binary to manually start the +blockchain. The "init" command is meant only for development purposes, not +production. + +The "serve" command builds, initializes, and starts your blockchain locally with +a single validator node for development purposes. "serve" also watches the +source code directory for file changes and intelligently +re-builds/initializes/starts the chain, essentially providing "code-reloading". +The "serve" command is meant only for development purposes, not production. + +To distinguish between production and development consider the following. + +In production, blockchains often run the same software on many validator nodes +that are run by different people and entities. To launch a blockchain in +production, the validator entities coordinate the launch process to start their +nodes simultaneously. + +During development, a blockchain can be started locally on a single validator +node. This convenient process lets you restart a chain quickly and iterate +faster. Starting a chain on a single node in development is similar to starting +a traditional web application on a local server. + +The "faucet" command lets you send tokens to an address from the "faucet" +account defined in "config.yml". Alternatively, you can use the chain's binary +to send token from any other account that exists on chain. + +The "simulate" command helps you start a simulation testing process for your +chain. + **Options** @@ -222,17 +316,58 @@ Build a node binary **Synopsis** -By default, build your node binaries -and add the binaries to your $(go env GOPATH)/bin path. -To build binaries for a release, use the --release flag. The app binaries -for one or more specified release targets are built in a release/ dir under the app's -source. Specify the release targets with GOOS:GOARCH build tags. -If the optional --release.targets is not specified, a binary is created for your current environment. +The build command compiles the source code of the project into a binary and +installs the binary in the $(go env GOPATH)/bin directory. + +You can customize the output directory for the binary using a flag: + + ignite chain build --output dist + +To compile the binary Ignite first compiles protocol buffer (proto) files into +Go source code. Proto files contain required type and services definitions. If +you're using another program to compile proto files, you can use a flag to tell +Ignite to skip the proto compilation step: + + ignite chain build --skip-proto + +Afterwards, Ignite install dependencies specified in the go.mod file. By default +Ignite doesn't check that dependencies of the main module stored in the module +cache have not been modified since they were downloaded. To enforce dependency +checking (essentially, running "go mod verify") use a flag: + + ignite chain build --check-dependencies + +Next, Ignite identifies the "main" package of the project. By default the "main" +package is located in "cmd/{app}d" directory, where "{app}" is the name of the +scaffolded project and "d" stands for daemon. If your your project contains more +than one "main" package, specify the path to the one that Ignite should compile +in config.yml: + +build: + main: custom/path/to/main + +By default the binary name will match the top-level module name (specified in +go.mod) with a suffix "d". This can be customized in config.yml: + +build: + binary: mychaind + +You can also specify custom linker flags: + +build: + ldflags: + - "-X main.Version=development" + - "-X main.Date=01/05/2022T19:54" + +To build binaries for a release, use the --release flag. The binaries for one or +more specified release targets are built in a "release/" directory in the +project's source directory. Specify the release targets with GOOS:GOARCH build +tags. If the optional --release.targets is not specified, a binary is created +for your current environment. + + ignite chain build --release -t linux:amd64 -t darwin:amd64 -t darwin:arm64 -Sample usages: - - ignite chain build - - ignite chain build --release -t linux:amd64 -t darwin:amd64 -t darwin:arm64 ``` ignite chain build [flags] @@ -241,16 +376,17 @@ ignite chain build [flags] **Options** ``` - --clear-cache Clear the build cache (advanced) + --check-dependencies verify that cached dependencies have not been modified since they were downloaded + --clear-cache clear the build cache (advanced) -h, --help help for build - --home string Home directory used for blockchains -o, --output string binary output path -p, --path string path of the app (default ".") - --proto-all-modules Enables proto code generation for 3rd party modules used in your chain. Available only without the --release flag + --proto-all-modules enables proto code generation for 3rd party modules used in your chain. Available only without the --release flag --release build for a release --release.prefix string tarball prefix for each release target. Available only with --release flag -t, --release.targets strings release targets. Available only with --release flag - -v, --verbose Verbose output + --skip-proto skip file generation from proto + -v, --verbose verbose output ``` **SEE ALSO** @@ -270,7 +406,7 @@ ignite chain faucet [address] [coin<,...>] [flags] ``` -h, --help help for faucet - --home string Home directory used for blockchains + --home string home directory used for blockchains -p, --path string path of the app (default ".") -v, --verbose Verbose output ``` @@ -284,6 +420,70 @@ ignite chain faucet [address] [coin<,...>] [flags] Initialize your chain +**Synopsis** + +The init command compiles and installs the binary (like "ignite chain build") +and uses that binary to initialize the blockchain's data directory for one +validator. To learn how the build process works, refer to "ignite chain build +--help". + +By default, the data directory will be initialized in $HOME/.mychain, where +"mychain" is the name of the project. To set a custom data directory use the +--home flag or set the value in config.yml: + +init: + home: "~/.customdir" + +The data directory contains three files in the "config" directory: app.toml, +config.toml, client.toml. These files let you customize the behavior of your +blockchain node and the client executable. When a chain is re-initialized the +data directory can be reset. To make some values in these files persistent, set +them in config.yml: + +init: + app: + minimum-gas-prices: "0.025stake" + config: + consensus: + timeout_commit: "5s" + timeout_propose: "5s" + client: + output: "json" + +The configuration above changes the minimum gas price of the validator (by +default the gas price is set to 0 to allow "free" transactions), sets the block +time to 5s, and changes the output format to JSON. To see what kind of values +this configuration accepts see the generated TOML files in the data directory. + +As part of the initialization process Ignite creates on-chain accounts with +token balances. By default, config.yml has two accounts in the top-level +"accounts" property. You can add more accounts and change their token balances. +Refer to config.yml guide to see which values you can set. + +One of these accounts is a validator account and the amount of self-delegated +tokens can be set in the top-level "validator" property. + +One of the most important components of an initialized chain is the genesis +file, the 0th block of the chain. The genesis file is stored in the data +directory "config" subdirectory and contains the initial state of the chain, +including consensus and module parameters. You can customize the values of the +genesis in config.yml: + +genesis: + app_state: + staking: + params: + bond_denom: "foo" + +The example above changes the staking token to "foo". If you change the staking +denom, make sure the validator account has the right tokens. + +The init command is meant to be used ONLY FOR DEVELOPMENT PURPOSES. Under the +hood it runs commands like "appd init", "appd add-genesis-account", "appd +gentx", and "appd collect-gentx". For production, you may want to run these +commands manually to ensure a production-level node initialization. + + ``` ignite chain init [flags] ``` @@ -291,10 +491,12 @@ ignite chain init [flags] **Options** ``` - --clear-cache Clear the build cache (advanced) - -h, --help help for init - --home string Home directory used for blockchains - -p, --path string path of the app (default ".") + --check-dependencies verify that cached dependencies have not been modified since they were downloaded + --clear-cache clear the build cache (advanced) + -h, --help help for init + --home string home directory used for blockchains + -p, --path string path of the app (default ".") + --skip-proto skip file generation from proto ``` **SEE ALSO** @@ -308,7 +510,39 @@ Start a blockchain node in development **Synopsis** -Start a blockchain node with automatic reloading +The serve command compiles and installs the binary (like "ignite chain build"), +uses that binary to initialize the blockchain's data directory for one validator +(like "ignite chain init"), and starts the node locally for development purposes +with automatic code reloading. + +Automatic code reloading means Ignite starts watching the project directory. +Whenever a file change is detected, Ignite automatically rebuilds, reinitializes +and restarts the node. + +Whenever possible Ignite will try to keep the current state of the chain by +exporting and importing the genesis file. + +To force Ignite to start from a clean slate even if a genesis file exists, use +the following flag: + + ignite chain serve --reset-once + +To force Ignite to reset the state every time the source code is modified, use +the following flag: + + ignite chain serve --force-reset + +With Ignite it's possible to start more than one blockchain from the same source +code using different config files. This is handy if you're building +inter-blockchain functionality and, for example, want to try sending packets +from one blockchain to another. To start a node using a specific config file: + + ignite chain serve --config mars.yml + +The serve command is meant to be used ONLY FOR DEVELOPMENT PURPOSES. Under the +hood, it runs "appd start", where "appd" is the name of your chain's binary. For +production, you may want to run "appd start" manually. + ``` ignite chain serve [flags] @@ -317,15 +551,17 @@ ignite chain serve [flags] **Options** ``` - --clear-cache Clear the build cache (advanced) - -c, --config string Ignite config file (default: ./config.yml) - -f, --force-reset Force reset of the app state on start and every source change - -h, --help help for serve - --home string Home directory used for blockchains - -p, --path string path of the app (default ".") - --proto-all-modules Enables proto code generation for 3rd party modules used in your chain - -r, --reset-once Reset of the app state on first start - -v, --verbose Verbose output + --check-dependencies verify that cached dependencies have not been modified since they were downloaded + --clear-cache clear the build cache (advanced) + -c, --config string Ignite config file (default: ./config.yml) + -f, --force-reset Force reset of the app state on start and every source change + -h, --help help for serve + --home string home directory used for blockchains + -p, --path string path of the app (default ".") + --proto-all-modules enables proto code generation for 3rd party modules used in your chain + -r, --reset-once Reset of the app state on first start + --skip-proto skip file generation from proto + -v, --verbose Verbose output ``` **SEE ALSO** @@ -372,6 +608,188 @@ ignite chain simulate [flags] * [ignite chain](#ignite-chain) - Build, initialize and start a blockchain node or perform other actions on the blockchain +## ignite completion + +Generate the autocompletion script for the specified shell + +**Synopsis** + +Generate the autocompletion script for ignite for the specified shell. +See each sub-command's help for details on how to use the generated script. + + +**Options** + +``` + -h, --help help for completion +``` + +**SEE ALSO** + +* [ignite](#ignite) - Ignite CLI offers everything you need to scaffold, test, build, and launch your blockchain +* [ignite completion bash](#ignite-completion-bash) - Generate the autocompletion script for bash +* [ignite completion fish](#ignite-completion-fish) - Generate the autocompletion script for fish +* [ignite completion powershell](#ignite-completion-powershell) - Generate the autocompletion script for powershell +* [ignite completion zsh](#ignite-completion-zsh) - Generate the autocompletion script for zsh + + +## ignite completion bash + +Generate the autocompletion script for bash + +**Synopsis** + +Generate the autocompletion script for the bash shell. + +This script depends on the 'bash-completion' package. +If it is not installed already, you can install it via your OS's package manager. + +To load completions in your current shell session: + + source <(ignite completion bash) + +To load completions for every new session, execute once: + +**#### Linux:** + + ignite completion bash > /etc/bash_completion.d/ignite + +**#### macOS:** + + ignite completion bash > $(brew --prefix)/etc/bash_completion.d/ignite + +You will need to start a new shell for this setup to take effect. + + +``` +ignite completion bash +``` + +**Options** + +``` + -h, --help help for bash + --no-descriptions disable completion descriptions +``` + +**SEE ALSO** + +* [ignite completion](#ignite-completion) - Generate the autocompletion script for the specified shell + + +## ignite completion fish + +Generate the autocompletion script for fish + +**Synopsis** + +Generate the autocompletion script for the fish shell. + +To load completions in your current shell session: + + ignite completion fish | source + +To load completions for every new session, execute once: + + ignite completion fish > ~/.config/fish/completions/ignite.fish + +You will need to start a new shell for this setup to take effect. + + +``` +ignite completion fish [flags] +``` + +**Options** + +``` + -h, --help help for fish + --no-descriptions disable completion descriptions +``` + +**SEE ALSO** + +* [ignite completion](#ignite-completion) - Generate the autocompletion script for the specified shell + + +## ignite completion powershell + +Generate the autocompletion script for powershell + +**Synopsis** + +Generate the autocompletion script for powershell. + +To load completions in your current shell session: + + ignite completion powershell | Out-String | Invoke-Expression + +To load completions for every new session, add the output of the above command +to your powershell profile. + + +``` +ignite completion powershell [flags] +``` + +**Options** + +``` + -h, --help help for powershell + --no-descriptions disable completion descriptions +``` + +**SEE ALSO** + +* [ignite completion](#ignite-completion) - Generate the autocompletion script for the specified shell + + +## ignite completion zsh + +Generate the autocompletion script for zsh + +**Synopsis** + +Generate the autocompletion script for the zsh shell. + +If shell completion is not already enabled in your environment you will need +to enable it. You can execute the following once: + + echo "autoload -U compinit; compinit" >> ~/.zshrc + +To load completions in your current shell session: + + source <(ignite completion zsh); compdef _ignite ignite + +To load completions for every new session, execute once: + +**#### Linux:** + + ignite completion zsh > "${fpath[1]}/_ignite" + +**#### macOS:** + + ignite completion zsh > $(brew --prefix)/share/zsh/site-functions/_ignite + +You will need to start a new shell for this setup to take effect. + + +``` +ignite completion zsh [flags] +``` + +**Options** + +``` + -h, --help help for zsh + --no-descriptions disable completion descriptions +``` + +**SEE ALSO** + +* [ignite completion](#ignite-completion) - Generate the autocompletion script for the specified shell + + ## ignite docs Show Ignite CLI docs @@ -406,7 +824,7 @@ Produced source code can be regenerated by running a command again and is not me **Options** ``` - --clear-cache Clear the build cache (advanced) + --clear-cache clear the build cache (advanced) -h, --help help for generate -p, --path string path of the app (default ".") ``` @@ -417,7 +835,8 @@ Produced source code can be regenerated by running a command again and is not me * [ignite generate dart](#ignite-generate-dart) - Generate a Dart client * [ignite generate openapi](#ignite-generate-openapi) - Generate generates an OpenAPI spec for your chain from your config.yml * [ignite generate proto-go](#ignite-generate-proto-go) - Generate proto based Go code needed for the app's source code -* [ignite generate vuex](#ignite-generate-vuex) - Generate Vuex store for you chain's frontend from your config.yml +* [ignite generate ts-client](#ignite-generate-ts-client) - Generate Typescript client for your chain's frontend +* [ignite generate vuex](#ignite-generate-vuex) - Generate Typescript client and Vuex stores for your chain's frontend from your `config.yml` file ## ignite generate dart @@ -438,7 +857,7 @@ ignite generate dart [flags] **Options inherited from parent commands** ``` - --clear-cache Clear the build cache (advanced) + --clear-cache clear the build cache (advanced) -p, --path string path of the app (default ".") ``` @@ -465,7 +884,7 @@ ignite generate openapi [flags] **Options inherited from parent commands** ``` - --clear-cache Clear the build cache (advanced) + --clear-cache clear the build cache (advanced) -p, --path string path of the app (default ".") ``` @@ -492,7 +911,35 @@ ignite generate proto-go [flags] **Options inherited from parent commands** ``` - --clear-cache Clear the build cache (advanced) + --clear-cache clear the build cache (advanced) + -p, --path string path of the app (default ".") +``` + +**SEE ALSO** + +* [ignite generate](#ignite-generate) - Generate clients, API docs from source code + + +## ignite generate ts-client + +Generate Typescript client for your chain's frontend + +``` +ignite generate ts-client [flags] +``` + +**Options** + +``` + -h, --help help for ts-client + --proto-all-modules enables proto code generation for 3rd party modules used in your chain + -y, --yes Answers interactive yes/no questions with yes +``` + +**Options inherited from parent commands** + +``` + --clear-cache clear the build cache (advanced) -p, --path string path of the app (default ".") ``` @@ -503,7 +950,7 @@ ignite generate proto-go [flags] ## ignite generate vuex -Generate Vuex store for you chain's frontend from your config.yml +Generate Typescript client and Vuex stores for your chain's frontend from your `config.yml` file ``` ignite generate vuex [flags] @@ -513,14 +960,14 @@ ignite generate vuex [flags] ``` -h, --help help for vuex - --proto-all-modules Enables proto code generation for 3rd party modules used in your chain + --proto-all-modules enables proto code generation for 3rd party modules used in your chain -y, --yes Answers interactive yes/no questions with yes ``` **Options inherited from parent commands** ``` - --clear-cache Clear the build cache (advanced) + --clear-cache clear the build cache (advanced) -p, --path string path of the app (default ".") ``` @@ -529,6 +976,225 @@ ignite generate vuex [flags] * [ignite generate](#ignite-generate) - Generate clients, API docs from source code +## ignite node + +Make calls to a live blockchain node + +**Options** + +``` + -h, --help help for node + --node string : to tendermint rpc interface for this chain (default "https://rpc.cosmos.network:443") +``` + +**SEE ALSO** + +* [ignite](#ignite) - Ignite CLI offers everything you need to scaffold, test, build, and launch your blockchain +* [ignite node query](#ignite-node-query) - Querying subcommands +* [ignite node tx](#ignite-node-tx) - Transactions subcommands + + +## ignite node query + +Querying subcommands + +**Options** + +``` + -h, --help help for query +``` + +**Options inherited from parent commands** + +``` + --node string : to tendermint rpc interface for this chain (default "https://rpc.cosmos.network:443") +``` + +**SEE ALSO** + +* [ignite node](#ignite-node) - Make calls to a live blockchain node +* [ignite node query bank](#ignite-node-query-bank) - Querying commands for the bank module +* [ignite node query tx](#ignite-node-query-tx) - Query for transaction by hash + + +## ignite node query bank + +Querying commands for the bank module + +**Options** + +``` + -h, --help help for bank +``` + +**Options inherited from parent commands** + +``` + --node string : to tendermint rpc interface for this chain (default "https://rpc.cosmos.network:443") +``` + +**SEE ALSO** + +* [ignite node query](#ignite-node-query) - Querying subcommands +* [ignite node query bank balances](#ignite-node-query-bank-balances) - Query for account balances by account name or address + + +## ignite node query bank balances + +Query for account balances by account name or address + +``` +ignite node query bank balances [from_account_or_address] [flags] +``` + +**Options** + +``` + --address-prefix string Account address prefix (default "cosmos") + --count-total count total number of records in all balances to query for + -h, --help help for balances + --home string home directory used for blockchains + --keyring-backend string Keyring backend to store your account keys (default "test") + --keyring-dir string The accounts keyring directory (default "/home/runner/.ignite/accounts") + --limit uint pagination limit of all balances to query for (default 100) + --offset uint pagination offset of all balances to query for + --page uint pagination page of all balances to query for. This sets offset to a multiple of limit (default 1) + --page-key string pagination page-key of all balances to query for + --reverse results are sorted in descending order +``` + +**Options inherited from parent commands** + +``` + --node string : to tendermint rpc interface for this chain (default "https://rpc.cosmos.network:443") +``` + +**SEE ALSO** + +* [ignite node query bank](#ignite-node-query-bank) - Querying commands for the bank module + + +## ignite node query tx + +Query for transaction by hash + +``` +ignite node query tx [hash] [flags] +``` + +**Options** + +``` + -h, --help help for tx +``` + +**Options inherited from parent commands** + +``` + --node string : to tendermint rpc interface for this chain (default "https://rpc.cosmos.network:443") +``` + +**SEE ALSO** + +* [ignite node query](#ignite-node-query) - Querying subcommands + + +## ignite node tx + +Transactions subcommands + +**Options** + +``` + --address-prefix string Account address prefix (default "cosmos") + --broadcast-mode string Transaction broadcasting mode (sync|async|block), use sync if you encounter timeouts (default "block") + --fees string Fees to pay along with transaction; eg: 10uatom + --gas string gas limit to set per-transaction; set to "auto" to calculate sufficient gas automatically (default "auto") + --gas-prices string Gas prices in decimal format to determine the transaction fee (e.g. 0.1uatom) + --generate-only Build an unsigned transaction and write it to STDOUT + -h, --help help for tx + --home string home directory used for blockchains + --keyring-backend string Keyring backend to store your account keys (default "test") + --keyring-dir string The accounts keyring directory (default "/home/runner/.ignite/accounts") +``` + +**Options inherited from parent commands** + +``` + --node string : to tendermint rpc interface for this chain (default "https://rpc.cosmos.network:443") +``` + +**SEE ALSO** + +* [ignite node](#ignite-node) - Make calls to a live blockchain node +* [ignite node tx bank](#ignite-node-tx-bank) - Bank transaction subcommands + + +## ignite node tx bank + +Bank transaction subcommands + +**Options** + +``` + -h, --help help for bank +``` + +**Options inherited from parent commands** + +``` + --address-prefix string Account address prefix (default "cosmos") + --broadcast-mode string Transaction broadcasting mode (sync|async|block), use sync if you encounter timeouts (default "block") + --fees string Fees to pay along with transaction; eg: 10uatom + --gas string gas limit to set per-transaction; set to "auto" to calculate sufficient gas automatically (default "auto") + --gas-prices string Gas prices in decimal format to determine the transaction fee (e.g. 0.1uatom) + --generate-only Build an unsigned transaction and write it to STDOUT + --home string home directory used for blockchains + --keyring-backend string Keyring backend to store your account keys (default "test") + --keyring-dir string The accounts keyring directory (default "/home/runner/.ignite/accounts") + --node string : to tendermint rpc interface for this chain (default "https://rpc.cosmos.network:443") +``` + +**SEE ALSO** + +* [ignite node tx](#ignite-node-tx) - Transactions subcommands +* [ignite node tx bank send](#ignite-node-tx-bank-send) - Send funds from one account to another. + + +## ignite node tx bank send + +Send funds from one account to another. + +``` +ignite node tx bank send [from_account_or_address] [to_account_or_address] [amount] [flags] +``` + +**Options** + +``` + -h, --help help for send +``` + +**Options inherited from parent commands** + +``` + --address-prefix string Account address prefix (default "cosmos") + --broadcast-mode string Transaction broadcasting mode (sync|async|block), use sync if you encounter timeouts (default "block") + --fees string Fees to pay along with transaction; eg: 10uatom + --gas string gas limit to set per-transaction; set to "auto" to calculate sufficient gas automatically (default "auto") + --gas-prices string Gas prices in decimal format to determine the transaction fee (e.g. 0.1uatom) + --generate-only Build an unsigned transaction and write it to STDOUT + --home string home directory used for blockchains + --keyring-backend string Keyring backend to store your account keys (default "test") + --keyring-dir string The accounts keyring directory (default "/home/runner/.ignite/accounts") + --node string : to tendermint rpc interface for this chain (default "https://rpc.cosmos.network:443") +``` + +**SEE ALSO** + +* [ignite node tx bank](#ignite-node-tx-bank) - Bank transaction subcommands + + ## ignite relayer Connect blockchains by using IBC protocol @@ -560,6 +1226,7 @@ ignite relayer configure [flags] -a, --advanced Advanced configuration options for custom IBC modules -h, --help help for configure --keyring-backend string Keyring backend to store your account keys (default "test") + --keyring-dir string The accounts keyring directory (default "/home/runner/.ignite/accounts") --ordered Set the channel as ordered -r, --reset Reset the relayer config --source-account string Source Account @@ -600,6 +1267,7 @@ ignite relayer connect [,...] [flags] ``` -h, --help help for connect --keyring-backend string Keyring backend to store your account keys (default "test") + --keyring-dir string The accounts keyring directory (default "/home/runner/.ignite/accounts") ``` **SEE ALSO** @@ -613,9 +1281,60 @@ Scaffold a new blockchain, module, message, query, and more **Synopsis** -Scaffold commands create and modify the source code files to add functionality. +Scaffolding is a quick way to generate code for major pieces of your +application. + +For details on each scaffolding target (chain, module, message, etc.) run the +corresponding command with a "--help" flag, for example, "ignite scaffold chain +--help". + +The Ignite team strongly recommends committing the code to a version control +system before running scaffolding commands. This will make it easier to see the +changes to the source code as well as undo the command if you've decided to roll +back the changes. + +This blockchain you create with the chain scaffolding command uses the modular +Cosmos SDK framework and imports many standard modules for functionality like +proof of stake, token transfer, inter-blockchain connectivity, governance, and +more. Custom functionality is implemented in modules located by convention in +the "x/" directory. By default, your blockchain comes with an empty custom +module. Use the module scaffolding command to create an additional module. + +An empty custom module doesn't do much, it's basically a container for logic +that is responsible for processing transactions and changing the application +state. Cosmos SDK blockchains work by processing user-submitted signed +transactions, which contain one or more messages. A message contains data that +describes a state transition. A module can be responsible for handling any +number of messages. + +A message scaffolding command will generate the code for handling a new type of +Cosmos SDK message. Message fields describe the state transition that the +message is intended to produce if processed without errors. + +Scaffolding messages is useful to create individual "actions" that your module +can perform. Sometimes, however, you want your blockchain to have the +functionality to create, read, update and delete (CRUD) instances of a +particular type. Depending on how you want to store the data there are three +commands that scaffold CRUD functionality for a type: list, map, and single. +These commands create four messages (one for each CRUD action), and the logic to +add, delete, and fetch the data from the store. If you want to scaffold only the +logic, for example, you've decided to scaffold messages separately, you can do +that as well with the "--no-message" flag. + +Reading data from a blockchain happens with a help of queries. Similar to how +you can scaffold messages to write data, you can scaffold queries to read the +data back from your blockchain application. + +You can also scaffold a type, which just produces a new protocol buffer file +with a proto message description. Note that proto messages produce (and +correspond with) Go types whereas Cosmos SDK messages correspond to proto "rpc" +in the "Msg" service. + +If you're building an application with custom IBC logic, you might need to +scaffold IBC packets. An IBC packet represents the data sent from one blockchain +to another. You can only scaffold IBC packets in IBC-enabled modules scaffolded +with an "--ibc" flag. Note that the default module is not IBC-enabled. -CRUD stands for "create, read, update, delete". **Options** @@ -655,7 +1374,7 @@ ignite scaffold band [queryName] --module [moduleName] [flags] **Options** ``` - --clear-cache Clear the build cache (advanced) + --clear-cache clear the build cache (advanced) -h, --help help for band --module string IBC Module to add the packet into -p, --path string path of the app (default ".") @@ -676,28 +1395,45 @@ Fully-featured Cosmos SDK blockchain Create a new application-specific Cosmos SDK blockchain. -For example, the following command will create a blockchain called "hello" in the "hello/" directory: +For example, the following command will create a blockchain called "hello" in +the "hello/" directory: ignite scaffold chain hello -A project name can be a simple name or a URL. The name will be used as the Go module path for the project. Examples of project names: +A project name can be a simple name or a URL. The name will be used as the Go +module path for the project. Examples of project names: ignite scaffold chain foo ignite scaffold chain foo/bar ignite scaffold chain example.org/foo ignite scaffold chain github.com/username/foo -A new directory with source code files will be created in the current directory. To use a different path use the "--path" flag. - -Most of the logic of your blockchain is written in custom modules. Each module effectively encapsulates an independent piece of functionality. Following the Cosmos SDK convention, custom modules are stored inside the "x/" directory. By default, Ignite creates a module with a name that matches the name of the project. To create a blockchain without a default module use the "--no-module" flag. Additional modules can be added after a project is created with "ignite scaffold module" command. - -Account addresses on Cosmos SDK-based blockchains have string prefixes. For example, the Cosmos Hub blockchain uses the default "cosmos" prefix, so that addresses look like this: "cosmos12fjzdtqfrrve7zyg9sv8j25azw2ua6tvu07ypf". To use a custom address prefix use the "--address-prefix" flag. For example: +A new directory with source code files will be created in the current directory. +To use a different path use the "--path" flag. + +Most of the logic of your blockchain is written in custom modules. Each module +effectively encapsulates an independent piece of functionality. Following the +Cosmos SDK convention, custom modules are stored inside the "x/" directory. By +default, Ignite creates a module with a name that matches the name of the +project. To create a blockchain without a default module use the "--no-module" +flag. Additional modules can be added after a project is created with "ignite +scaffold module" command. + +Account addresses on Cosmos SDK-based blockchains have string prefixes. For +example, the Cosmos Hub blockchain uses the default "cosmos" prefix, so that +addresses look like this: "cosmos12fjzdtqfrrve7zyg9sv8j25azw2ua6tvu07ypf". To +use a custom address prefix use the "--address-prefix" flag. For example: ignite scaffold chain foo --address-prefix bar -By default when compiling a blockchain's source code Ignite creates a cache to speed up the build process. To clear the cache when building a blockchain use the "--clear-cache" flag. It is very unlikely you will ever need to use this flag. +By default when compiling a blockchain's source code Ignite creates a cache to +speed up the build process. To clear the cache when building a blockchain use +the "--clear-cache" flag. It is very unlikely you will ever need to use this +flag. + +The blockchain is using the Cosmos SDK modular blockchain framework. Learn more +about Cosmos SDK on https://docs.cosmos.network -The blockchain is using the Cosmos SDK modular blockchain framework. Learn more about Cosmos SDK on https://docs.cosmos.network ``` ignite scaffold chain [name] [flags] @@ -707,7 +1443,7 @@ ignite scaffold chain [name] [flags] ``` --address-prefix string Account address prefix (default "cosmos") - --clear-cache Clear the build cache (advanced) + --clear-cache clear the build cache (advanced) -h, --help help for chain --no-module Create a project without a default module -p, --path string Create a project in a specific path (default ".") @@ -743,6 +1479,84 @@ ignite scaffold flutter [flags] CRUD for data stored as an array +**Synopsis** + +The "list" scaffolding command is used to generate files that implement the +logic for storing and interacting with data stored as a list in the blockchain +state. + +The command accepts a NAME argument that will be used as the name of a new type +of data. It also accepts a list of FIELDs that describe the type. + +The interaction with the data follows the create, read, updated, and delete +(CRUD) pattern. For each type three Cosmos SDK messages are defined for writing +data to the blockchain: MsgCreate{Name}, MsgUpdate{Name}, MsgDelete{Name}. For +reading data two queries are defined: {Name} and {Name}All. The type, messages, +and queries are defined in the "proto/" directory as protocol buffer messages. +Messages and queries are mounted in the "Msg" and "Query" services respectively. + +When messages are handled, the appropriate keeper methods are called. By +convention, the methods are defined in +"x/{moduleName}/keeper/msg_server_{name}.go". Helpful methods for getting, +setting, removing, and appending are defined in the same "keeper" package in +"{name}.go". + +The "list" command essentially allows you to define a new type of data and +provides the logic to create, read, update, and delete instances of the type. +For example, let's review a command that generates the code to handle a list of +posts and each post has "title" and "body" fields: + + ignite scaffold list post title body + +This provides you with a "Post" type, MsgCreatePost, MsgUpdatePost, +MsgDeletePost and two queries: Post and PostAll. The compiled CLI, let's say the +binary is "blogd" and the module is "blog", has commands to query the chain (see +"blogd q blog") and broadcast transactions with the messages above (see "blogd +tx blog"). + +The code generated with the list command is meant to be edited and tailored to +your application needs. Consider the code to be a "skeleton" for the actual +business logic you will implement next. + +By default, all fields are assumed to be strings. If you want a field of a +different type, you can specify it after a colon ":". The following types are +supported: string, bool, int, uint, coin, array.string, array.int, array.uint, +array.coin. An example of using custom types: + + ignite scaffold list pool amount:coin tags:array.string height:int + +Ignite also supports custom types: + + ignite scaffold list product-details name description + + ignite scaffold list product price:coin details:ProductDetails + +In the example above the "ProductDetails" type was defined first, and then used +as a custom type for the "details" field. Ignite doesn't support arrays of +custom types yet. + +By default the code will be scaffolded in the module that matches your project's +name. If you have several modules in your project, you might want to specify a +different module: + + ignite scaffold list post title body --module blog + +By default, each message comes with a "creator" field that represents the +address of the transaction signer. You can customize the name of this field with +a flag: + + ignite scaffold list post title body --signer author + +It's possible to scaffold just the getter/setter logic without the CRUD +messages. This is useful when you want the methods to handle a type, but would +like to scaffold messages manually. Use a flag to skip message scaffolding: + + ignite scaffold list post title body --no-message + +The "creator" field is not generated if a list is scaffolded with the +"--no-message" flag. + + ``` ignite scaffold list NAME [field]... [flags] ``` @@ -750,7 +1564,7 @@ ignite scaffold list NAME [field]... [flags] **Options** ``` - --clear-cache Clear the build cache (advanced) + --clear-cache clear the build cache (advanced) -h, --help help for list --module string Module to add into. Default is app's main module --no-message Disable CRUD interaction messages scaffolding @@ -769,6 +1583,49 @@ ignite scaffold list NAME [field]... [flags] CRUD for data stored as key-value pairs +**Synopsis** + +The "map" scaffolding command is used to generate files that implement the logic +for storing and interacting with data stored as key-value pairs (or a +dictionary) in the blockchain state. + +The "map" command is very similar to "ignite scaffold list" with the main +difference in how values are indexed. With "list" values are indexed by an +incrementing integer, whereas "list" values are indexed by a user-provided value +(or multiple values). + +Let's use the same blog post example: + + ignite scaffold map post title body + +This command scaffolds a "Post" type and CRUD functionality to create, read, +updated, and delete posts. However, when creating a new post with your chain's +binary (or by submitting a transaction through the chain's API) you will be +required to provide an "index": + + blogd tx blog create-post [index] [title] [body] + blogd tx blog create-post hello "My first post" "This is the body" + +This command will create a post and store it in the blockchain's state under the +"hello" index. You will be able to fetch back the value of the post by querying +for the "hello" key. + + blogd q blog show-post hello + +To customize the index, use the "--index" flag. Multiple indices can be +provided, which simplifies querying values. For example: + + ignite scaffold map product price desc --index category,guid + +With this command, you would get a "Product" value indexed by both a category +and a GUID (globally unique ID). This will let you programmatically fetch +product values that have the same category but are using different GUIDs. + +Since the behavior of "list" and "map" scaffolding is very similar, you can use +the "--no-message", "--module", "--signer" flags as well as the colon syntax for +custom types. + + ``` ignite scaffold map NAME [field]... [flags] ``` @@ -776,7 +1633,7 @@ ignite scaffold map NAME [field]... [flags] **Options** ``` - --clear-cache Clear the build cache (advanced) + --clear-cache clear the build cache (advanced) -h, --help help for map --index strings fields that index the value (default [index]) --module string Module to add into. Default is app's main module @@ -796,6 +1653,53 @@ ignite scaffold map NAME [field]... [flags] Message to perform state transition on the blockchain +**Synopsis** + +Message scaffolding is useful for quickly adding functionality to your +blockchain to handle specific Cosmos SDK messages. + +Messages are objects whose end goal is to trigger state transitions on the +blockchain. A message is a container for fields of data that affect how the +blockchain's state will change. You can think of messages as "actions" that a +user can perform. + +For example, the bank module has a "Send" message for token transfers between +accounts. The send message has three fields: from address (sender), to address +(recipient), and a token amount. When this message is successfully processed, +the token amount will be deducted from the sender's account and added to the +recipient's account. + +Ignite's message scaffolding lets you create new types of messages and add them +to your chain. For example: + + ignite scaffold message add-pool amount:coins denom active:bool --module dex + +The command above will create a new message MsgAddPool with three fields: amount +(in tokens), denom (a string), and active (a boolean). The message will be added +to the "dex" module. + +By default, the message is defined as a proto message in the +"proto/{module}/tx.proto" and registered in the "Msg" service. A CLI command to +create and broadcast a transaction with MsgAddPool is created in the module's +"cli" package. Additionally, Ignite scaffolds a message constructor and the code +to satisfy the sdk.Msg interface and register the message in the module. + +Most importantly in the "keeper" package Ignite scaffolds an "AddPool" function. +Inside this function, you can implement message handling logic. + +When successfully processed a message can return data. Use the —response flag to +specify response fields and their types. For example + + ignite scaffold message create-post title body --response id:int,title + +The command above will scaffold MsgCreatePost which returns both an ID (an +integer) and a title (a string). + +Message scaffolding follows the rules as "ignite scaffold list/map/single" and +supports fields with standard and custom types. See "ignite scaffold list —help" +for details. + + ``` ignite scaffold message [name] [field1] [field2] ... [flags] ``` @@ -803,7 +1707,7 @@ ignite scaffold message [name] [field1] [field2] ... [flags] **Options** ``` - --clear-cache Clear the build cache (advanced) + --clear-cache clear the build cache (advanced) -d, --desc string Description of the command -h, --help help for message --module string Module to add the message into. Default: app's main module @@ -825,7 +1729,65 @@ Scaffold a Cosmos SDK module **Synopsis** -Scaffold a new Cosmos SDK module in the `x` directory +Scaffold a new Cosmos SDK module. + +Cosmos SDK is a modular framework and each independent piece of functionality is +implemented in a separate module. By default your blockchain imports a set of +standard Cosmos SDK modules. To implement custom functionality of your +blockchain, scaffold a module and implement the logic of your application. + +This command does the following: + +* Creates a directory with module's protocol buffer files in "proto/" +* Creates a directory with module's boilerplate Go code in "x/" +* Imports the newly created module by modifying "app/app.go" +* Creates a file in "testutil/keeper/" that contains logic to create a keeper + for testing purposes + +This command will proceed with module scaffolding even if "app/app.go" doesn't +have the required default placeholders. If the placeholders are missing, you +will need to modify "app/app.go" manually to import the module. If you want the +command to fail if it can't import the module, use the "--require-registration" +flag. + +To scaffold an IBC-enabled module use the "--ibc" flag. An IBC-enabled module is +like a regular module with the addition of IBC-specific logic and placeholders +to scaffold IBC packets with "ignite scaffold packet". + +A module can depend on one or more other modules and import their keeper +methods. To scaffold a module with a dependency use the "--dep" flag + +For example, your new custom module "foo" might have functionality that requires +sending tokens between accounts. The method for sending tokens is a defined in +the "bank"'s module keeper. You can scaffold a "foo" module with the dependency +on "bank" with the following command: + + ignite scaffold module foo --dep bank + +You can then define which methods you want to import from the "bank" keeper in +"expected_keepers.go". + +You can also scaffold a module with a list of dependencies that can include both +standard and custom modules (provided they exist): + + ignite scaffold module bar --dep foo,mint,account + +Note: the "--dep" flag doesn't install third-party modules into your +application, it just generates extra code that specifies which existing modules +your new custom module depends on. + +A Cosmos SDK module can have parameters (or "params"). Params are values that +can be set at the genesis of the blockchain and can be modified while the +blockchain is running. An example of a param is "Inflation rate change" of the +"mint" module. A module can be scaffolded with params using the "--params" flag +that accepts a list of param names. By default params are of type "string", but +you can specify a type for each param. For example: + + ignite scaffold module foo --params baz:uint,bar:bool + +Refer to Cosmos SDK documentation to learn more about modules, dependencies and +params. + ``` ignite scaffold module [name] [flags] @@ -834,7 +1796,7 @@ ignite scaffold module [name] [flags] **Options** ``` - --clear-cache Clear the build cache (advanced) + --clear-cache clear the build cache (advanced) --dep strings module dependencies (e.g. --dep account,bank) -h, --help help for module --ibc scaffold an IBC module @@ -866,7 +1828,7 @@ ignite scaffold packet [packetName] [field1] [field2] ... --module [moduleName] ``` --ack strings Custom acknowledgment type (field1,field2,...) - --clear-cache Clear the build cache (advanced) + --clear-cache clear the build cache (advanced) -h, --help help for packet --module string IBC Module to add the packet into --no-message Disable send message scaffolding @@ -891,7 +1853,7 @@ ignite scaffold query [name] [request_field1] [request_field2] ... [flags] **Options** ``` - --clear-cache Clear the build cache (advanced) + --clear-cache clear the build cache (advanced) -d, --desc string Description of the command -h, --help help for query --module string Module to add the query into. Default: app's main module @@ -917,7 +1879,7 @@ ignite scaffold single NAME [field]... [flags] **Options** ``` - --clear-cache Clear the build cache (advanced) + --clear-cache clear the build cache (advanced) -h, --help help for single --module string Module to add into. Default is app's main module --no-message Disable CRUD interaction messages scaffolding @@ -943,7 +1905,7 @@ ignite scaffold type NAME [field]... [flags] **Options** ``` - --clear-cache Clear the build cache (advanced) + --clear-cache clear the build cache (advanced) -h, --help help for type --module string Module to add into. Default is app's main module --no-message Disable CRUD interaction messages scaffolding @@ -992,81 +1954,11 @@ Tools for advanced users **SEE ALSO** * [ignite](#ignite) - Ignite CLI offers everything you need to scaffold, test, build, and launch your blockchain -* [ignite tools completions](#ignite-tools-completions) - Generate completions script * [ignite tools ibc-relayer](#ignite-tools-ibc-relayer) - Typescript implementation of an IBC relayer * [ignite tools ibc-setup](#ignite-tools-ibc-setup) - Collection of commands to quickly setup a relayer * [ignite tools protoc](#ignite-tools-protoc) - Execute the protoc command -## ignite tools completions - -Generate completions script - -**Synopsis** - - The completions command outputs a completion script you can use in your shell. The output script requires - that [bash-completion](https://github.com/scop/bash-completion) is installed and enabled in your - system. Since most Unix-like operating systems come with bash-completion by default, bash-completion - is probably already installed and operational. - -Bash: - - $ source <(ignite tools completions bash) - - To load completions for every new session, run: - - ** Linux ** - $ ignite tools completions bash > /etc/bash_completion.d/ignite - - ** macOS ** - $ ignite tools completions bash > /usr/local/etc/bash_completion.d/ignite - -Zsh: - - If shell completions is not already enabled in your environment, you will need to enable it. You can execute the following once: - - $ echo "autoload -U compinit; compinit" >> ~/.zshrc - - To load completions for each session, execute once: - - $ ignite tools completions zsh > "${fpath[1]}/_ignite" - - You will need to start a new shell for this setup to take effect. - -fish: - - $ ignite tools completions fish | source - - To load completions for each session, execute once: - - $ ignite tools completions fish > ~/.config/fish/completionss/ignite.fish - -PowerShell: - - PS> ignite tools completions powershell | Out-String | Invoke-Expression - - To load completions for every new session, run: - - PS> ignite tools completions powershell > ignite.ps1 - - and source this file from your PowerShell profile. - - -``` -ignite tools completions -``` - -**Options** - -``` - -h, --help help for completions -``` - -**SEE ALSO** - -* [ignite tools](#ignite-tools) - Tools for advanced users - - ## ignite tools ibc-relayer Typescript implementation of an IBC relayer diff --git a/docs/docs/clients/01-typescript.md b/docs/docs/clients/01-typescript.md new file mode 100644 index 0000000000..29b4dde359 --- /dev/null +++ b/docs/docs/clients/01-typescript.md @@ -0,0 +1,181 @@ +--- +sidebar_position: 1 +description: Information about the generated Typescript client code. +--- + +# Typescript code generation + +The `ignite generate ts-client` command generates a Typescript client for your blockchain project. + +## Client code generation + +A TypeScript (TS) client is automatically generated for your blockchain for custom and standard Cosmos SDK modules. + +To enable client code generation, add the `client` entries to `config.yml`: + +```yaml +client: + typescript: + path: "ts-client" +``` + +A TS client is generated in the `ts-client` directory. + +## Client code regeneration + +By default, the filesystem is watched and the clients are regenerated automatically. Clients for standard Cosmos SDK modules are generated after you scaffold a blockchain. + +To regenerate all clients for custom and standard Cosmos SDK modules, run this command: + +```bash +ignite generate ts-client +``` + +## Preventing client code regeneration + +To prevent regenerating the client, remove the `client:typescript` property from `config.yml`. + +## Usage + +The code generated in `ts-client` comes with a `package.json` file ready to publish which you can modify to suit your needs. + +The client is based on a modular architecture where you can configure a client class to support the modules you need and instantiate it. + +By default, the generated client exports a client class that includes all the Cosmos SDK, custom and 3rd party modules in use in your project. + +To instantiate the client you need to provide environment information (endpoints and chain prefix) and an optional wallet (implementing the CosmJS OfflineSigner interface). + +For example, to connect to a local chain instance running under the Ignite CLI defaults, using Keplr as a wallet: + +```typescript +import { Client } from ''; + +const client = new Client({ + apiURL: "http://localhost:1317", + rpcURL: "http://localhost:26657", + prefix: "cosmos" + }, + window.keplr.getOfflineSigner() +); +``` + +The resulting client instance contains namespaces for each module, each with a `query` and `tx` namespace containing the module's relevant querying and transacting methods with full type and auto-completion support. + +e.g. + +```typescript +const balances = await client.CosmosBankV1Beta1.query.queryAllBalances('cosmos1qqqsyqcyq5rqwzqfys8f67'); +``` + +And for transactions: + +```typescript +const tx_result = await client.CosmosBankV1Beta1.tx.sendMsgSend( + { + value: { + amount: [ + { + amount: '200', + denom: 'token', + }, + ], + fromAddress: 'cosmos1qqqsyqcyq5rqwzqfys8f67', + toAddress: 'cosmos1qqqsyqcyq5rqwzqfys8f67' + }, + fee, + memo + } +); +``` + +If you prefer, you can construct a lighter client using only the modules you are interested in by importing the generic client class and expanding it with the modules you need: + +```typescript +import { IgniteClient } from '/client'; +import { Module as CosmosBankV1Beta1 } from '/cosmos.bank.v1beta1' +import { Module as CosmosStakingV1Beta1 } from '/cosmos.staking.v1beta1' + +const CustomClient = IgniteClient.plugin([CosmosBankV1Beta1, CosmosStakingV1Beta1]); + +const client = new CustomClient({ + apiURL: "http://localhost:1317", + rpcURL: "http://localhost:26657", + prefix: "cosmos" + }, + window.keplr.getOfflineSigner() +); +``` + +You can also construct TX messages separately and send them in a single TX using a global signing client like so: + +```typescript +const msg1 = await client.CosmosBankV1Beta1.tx.msgSend( + { + value: { + amount: [ + { + amount: '200', + denom: 'token', + }, + ], + fromAddress: 'cosmos1qqqsyqcyq5rqwzqfys8f67', + toAddress: 'cosmos1qqqsyqcyq5rqwzqfys8f67' + } + } +); +const msg2 = await client.CosmosBankV1Beta1.tx.msgSend( + { + value: { + amount: [ + { + amount: '200', + denom: 'token', + }, + ], + fromAddress: 'cosmos1qqqsyqcyq5rqwzqfys8f67', + toAddress: 'cosmos1qqqsyqcyq5rqwzqfys8f67' + }, + } +); +const tx_result = await client.signAndBroadcast([msg1,msg2], fee, memo); +``` + +Finally, for additional ease-of-use, apart from the modular client mentioned above, each generated module is usable on its own in a stripped-down way by exposing a separate txClient and queryClient. + +e.g. + +```typescript +import { queryClient } from '/cosmos.bank.v1beta1'; + +const client = queryClient({ addr: 'http://localhost:1317' }); +const balances = await client.queryAllBalances('cosmos1qqqsyqcyq5rqwzqfys8f67'); +``` + +and + +```typescript +import { txClient } from '/cosmos.bank.v1beta1'; + +const client = txClient({ + signer: window.keplr.getOfflineSigner(), + prefix: 'cosmos', + addr: 'http://localhost:26657' +}); + +const tx_result = await client.sendMsgSend( + { + value: { + amount: [ + { + amount: '200', + denom: 'token', + }, + ], + fromAddress: 'cosmos1qqqsyqcyq5rqwzqfys8f67', + toAddress: 'cosmos1qqqsyqcyq5rqwzqfys8f67' + }, + fee, + memo + } +); +``` \ No newline at end of file diff --git a/docs/docs/clients/_category_.json b/docs/docs/clients/_category_.json new file mode 100644 index 0000000000..ed461b9a8f --- /dev/null +++ b/docs/docs/clients/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Clients", + "position": 5, + "link": null + } \ No newline at end of file diff --git a/docs/docs/contributing/02-technical-setup.md b/docs/docs/contributing/02-technical-setup.md index c848abf1ca..9d1d9a8001 100644 --- a/docs/docs/contributing/02-technical-setup.md +++ b/docs/docs/contributing/02-technical-setup.md @@ -49,7 +49,7 @@ The Z shell, also known as zsh, is a UNIX shell that is built on top of the macO 1. Edit your `~/.zshrc` file to add the plugins to load on startup: - ```sh + ``` plugins=( git zsh-autosuggestions diff --git a/docs/docs/contributing/_category_.json b/docs/docs/contributing/_category_.json index 16abb6c990..ee10837b07 100644 --- a/docs/docs/contributing/_category_.json +++ b/docs/docs/contributing/_category_.json @@ -1,5 +1,5 @@ { "label": "Contributing to Ignite CLI docs", - "position": 5, + "position": 6, "link": null } \ No newline at end of file diff --git a/docs/docs/contributing/templates/01-concept_template.md b/docs/docs/contributing/templates/01-concept_template.md index 7176371671..752e2ed032 100644 --- a/docs/docs/contributing/templates/01-concept_template.md +++ b/docs/docs/contributing/templates/01-concept_template.md @@ -94,7 +94,7 @@ This is `inline code`. Use it for referencing package names and commands. Here's a command someone types on a command line: -```command +```bash which go ``` diff --git a/docs/docs/contributing/templates/02-tutorial-template.md b/docs/docs/contributing/templates/02-tutorial-template.md index d7a200330f..1114e4d135 100644 --- a/docs/docs/contributing/templates/02-tutorial-template.md +++ b/docs/docs/contributing/templates/02-tutorial-template.md @@ -82,13 +82,13 @@ Finally... To verify the version of Ignite CLI that is installed, run the following command: -```sh +```bash ignite --version ``` You'll see release details like the following output: -```bash +``` Ignite version: v0.19.6 Ignite CLI build date: 2021-12-18T05:56:36Z Ignite CLI source hash: - @@ -105,8 +105,8 @@ When showing the contents of a file, try to show only the relevant parts and exp Modify the title by changing the contents of the `` tag: -```js -... +```protobuf +// ... message Post { string creator = 1; @@ -121,7 +121,7 @@ message MsgCreatePost { string body = 3; } -... +// ... ``` Now transition to the next step by telling the user what's next. @@ -160,7 +160,7 @@ This is `inline code`. Use single tick marks for filenames and commands. Here's a command you can type on a command line: -```sh +```bash which go ``` diff --git a/docs/docs/guide/01-install.md b/docs/docs/guide/01-install.md index 17a4cf423a..6823e80431 100644 --- a/docs/docs/guide/01-install.md +++ b/docs/docs/guide/01-install.md @@ -30,7 +30,7 @@ Ignite CLI is written in the Go programming language. To use Ignite CLI on a loc To verify the version of Ignite CLI you have installed, run the following command: -```sh +```bash ignite version ``` diff --git a/docs/docs/guide/02-hello.md b/docs/docs/guide/02-hello.md index c86171c2d0..4a46ec5cd2 100644 --- a/docs/docs/guide/02-hello.md +++ b/docs/docs/guide/02-hello.md @@ -154,7 +154,7 @@ git commit -am "Scaffolded a hello query with Ignite CLI" In the `proto/hello/query.proto` file, the `Hello` rpc has been added to the `Query` service. -```proto +```protobuf service Query { rpc Hello(QueryHelloRequest) returns (QueryHelloResponse) { option (google.api.http).get = "/hello/hello/hello"; @@ -173,7 +173,7 @@ Here's how the `Hello` rpc for the `Query` service works: Now, take a look at the following request and response types: -```proto +```protobuf message QueryHelloRequest { } @@ -239,10 +239,12 @@ Make the required changes to the `x/hello/module.go` file. ```go import ( - "encoding/json" - "fmt" - //... + // ... + "context" + + // ... + ) ``` Do not save the file yet, you need to continue with these modifications. @@ -259,7 +261,7 @@ Make the required changes to the `x/hello/module.go` file. 2. After the chain has been started, visit [http://localhost:1317/hello/hello/hello](http://localhost:1317/hello/hello/hello) and see your text displayed: - ```go + ```json { "text": "Hello, Ignite CLI!", } diff --git a/docs/docs/guide/03-blog/00-build-blog.md b/docs/docs/guide/03-blog/00-build-blog.md index 11b1c11fb8..75c1664cf0 100644 --- a/docs/docs/guide/03-blog/00-build-blog.md +++ b/docs/docs/guide/03-blog/00-build-blog.md @@ -35,11 +35,13 @@ First, create a new blockchain. Open a terminal and navigate to a directory where you have permissions to create files. To create your Cosmos SDK blockchain, run this command: ```bash -ignite scaffold chain blog +ignite scaffold chain blog --address-prefix blog ``` The `blog` directory is created with the default directory structure. +The new blockchain is scaffolded with the `--address-prefix blog` flag to use "blog" instead of the default "cosmos" address prefix. + ## High-level transaction review So far, you have learned how to modify proto files to define a new API endpoint and modify a keeper query function to return static data back to the user. Of course, a keeper can do more than return a string of data. Its purpose is to manage access to the state of the blockchain. @@ -66,11 +68,10 @@ The `message` command accepts message name (`createPost`) and a list of fields ( The `message` command has created and modified several files: -```bash +``` modify proto/blog/tx.proto modify x/blog/client/cli/tx.go create x/blog/client/cli/tx_create_post.go -modify x/blog/handler.go create x/blog/keeper/msg_server_create_post.go modify x/blog/module_simulation.go create x/blog/simulation/create_post.go @@ -83,7 +84,7 @@ create x/blog/types/message_create_post_test.go As always, start with a proto file. Inside the `proto/blog/tx.proto` file, the `MsgCreatePost` message has been created. Edit the file to add the line that defines the `id` for `message MsgCreatePostResponse`: -```go +```protobuf message MsgCreatePost { string creator = 1; string title = 2; @@ -105,27 +106,6 @@ service Msg { } ``` -Next, look at the `x/blog/handler.go` file. Ignite CLI has added a `case` to the `switch` statement inside the `NewHandler` function. This switch statement is responsible for routing messages and calling specific keeper methods based on the type of the message: - -```go -func NewHandler(k keeper.Keeper) sdk.Handler { - //... - return func(ctx sdk.Context, msg sdk.Msg) (*sdk.Result, error) { - //... - switch msg := msg.(type) { - case *types.MsgCreatePost: - res, err := msgServer.CreatePost(sdk.WrapSDKContext(ctx), msg) - return sdk.WrapServiceResult(ctx, res, err) - //... - } - } -} -``` - -The `case *types.MsgCreatePost` statement handles messages of type `MsgCreatePost`, calls the `CreatePost` method, and returns back the response. - -Every module has a handler function like this to process messages and call keeper methods. - ## Define messages logic In the newly scaffolded `x/blog/keeper/msg_server_create_post.go` file, you can see a placeholder implementation of the `CreatePost` function. Right now it does nothing and returns an empty response. For your blog chain, you want the contents of the message (title and body) to be written to the state as a new post. @@ -163,7 +143,7 @@ When you define the `Post` type in a proto file, Ignite CLI (with the help of `p Create the `proto/blog/post.proto` file and define the `Post` message: -```go +```protobuf syntax = "proto3"; package blog.blog; @@ -192,19 +172,19 @@ The next step is to define the `AppendPost` keeper method. Create the `x/blog/keeper/post.go` file and start thinking about the logic of the function and what you want to call the prefixes. The file will be empty for now. -- To implement `AppendPost` you must first understand how the key store works. You can think of a store as a key-value database where keys are lexicographically ordered. You can loop through keys and use `Get` and `Set` to retrieve and set values based on keys. To distinguish between different types of data that a module can keep in its store, you can use prefixes like `product-` or `post-`. +- To implement `AppendPost` you must first understand how the key store works. You can think of a store as a key-value database where keys are lexicographically ordered. You can loop through keys and use `Get` and `Set` to retrieve and set values based on keys. To distinguish between different types of data that a module can keep in its store, you can use prefixes like `product/` or `post/`. -- To keep a list of posts in what is essentially a key-value store, you need to keep track of the index of the posts you insert. Since both post values and post count (index) values are kept in the store, you can use different prefixes: `Post-value-` and `Post-count-`. +- To keep a list of posts in what is essentially a key-value store, you need to keep track of the index of the posts you insert. Since both post values and post count (index) values are kept in the store, you can use different prefixes: `Post/value/` and `Post/count/`. Then, add these prefixes to the `x/blog/types/keys.go` file in the `const` and add a comment that describes the keys: ```go const ( - //... + // ... // Keep track of the index of posts - PostKey = "Post-value-" - PostCountKey = "Post-count-" + PostKey = "Post/value/" + PostCountKey = "Post/count/" ) ``` @@ -217,9 +197,20 @@ Your blog is now updated to take these actions when a `Post` message is sent to ## Write data to the store -Now, after the `import` section in the `x/blog/keeper/post.go` file, draft the `AppendPost` function. You can add these comments to help you visualize what you do next: +In the `x/blog/keeper/post.go` file, draft the `AppendPost` function. You can add these comments to help you visualize what you do next: ```go +package keeper + +import ( + "encoding/binary" + + "github.com/cosmos/cosmos-sdk/store/prefix" + sdk "github.com/cosmos/cosmos-sdk/types" + + "blog/x/blog/types" +) + // func (k Keeper) AppendPost() uint64 { // count := k.GetPostCount() // store.Set() @@ -232,7 +223,7 @@ First, implement `GetPostCount`: ```go func (k Keeper) GetPostCount(ctx sdk.Context) uint64 { - // Get the store using storeKey (which is "blog") and PostCountKey (which is "Post-count-") + // Get the store using storeKey (which is "blog") and PostCountKey (which is "Post/count/") store := prefix.NewStore(ctx.KVStore(k.storeKey), []byte(types.PostCountKey)) // Convert the PostCountKey to bytes @@ -255,7 +246,7 @@ Now that `GetPostCount` returns the correct number of posts in the store, implem ```go func (k Keeper) SetPostCount(ctx sdk.Context, count uint64) { - // Get the store using storeKey (which is "blog") and PostCountKey (which is "Post-count-") + // Get the store using storeKey (which is "blog") and PostCountKey (which is "Post/count/") store := prefix.NewStore(ctx.KVStore(k.storeKey), []byte(types.PostCountKey)) // Convert the PostCountKey to bytes @@ -265,7 +256,7 @@ func (k Keeper) SetPostCount(ctx sdk.Context, count uint64) { bz := make([]byte, 8) binary.BigEndian.PutUint64(bz, count) - // Set the value of Post-count- to count + // Set the value of Post/count/ to count store.Set(byteKey, bz) } ``` @@ -273,17 +264,6 @@ func (k Keeper) SetPostCount(ctx sdk.Context, count uint64) { Now that you have implemented functions for getting the number of posts and setting the post count, at the top of the same `x/blog/keeper/post.go` file, implement the logic behind the `AppendPost` function: ```go -package keeper - -import ( - "encoding/binary" - - "github.com/cosmos/cosmos-sdk/store/prefix" - sdk "github.com/cosmos/cosmos-sdk/types" - - "blog/x/blog/types" -) - func (k Keeper) AppendPost(ctx sdk.Context, post types.Post) uint64 { // Get the current number of posts in the store count := k.GetPostCount(ctx) @@ -312,7 +292,7 @@ func (k Keeper) AppendPost(ctx sdk.Context, post types.Post) uint64 { By following these steps, you have implemented all of the code required to create new posts and store them on-chain. Now, when a transaction that contains a message of type `MsgCreatePost` is broadcast, the message is routed to your blog module. -- `x/blog/handler.go` calls `k.CreatePost` which in turn calls `AppendPost` +- `k.CreatePost` calls `AppendPost` - `AppendPost` gets the number of posts from the store, adds a post using the count as an ID, increments the count, and returns the ID Now that you have added the functionality to create posts and broadcast them to our chain, you can add querying. @@ -336,13 +316,13 @@ To define the types in proto files, make the following updates in `proto/blog/qu 1. Add the `import`: -```go +```protobuf import "blog/post.proto"; ``` 2. Add pagination to the post request: -```go +```protobuf message QueryPostsRequest { // Adding pagination to request cosmos.base.query.v1beta1.PageRequest pagination = 1; @@ -428,7 +408,7 @@ In the `x/blog/module.go` file: import ( "context" - // ... other imports + // ... ) ``` @@ -467,8 +447,8 @@ blogd tx blog create-post foo bar --from alice The transaction is output to the terminal. You are prompted to confirm the transaction: -```bash -{"body":{"messages":[{"@type":"/blog.blog.MsgCreatePost","creator":"cosmos1ctxp3pfdtr3sw9udz2ptuh59ce9z0eaa2zvv6w","title":"foo","body":"bar"}],"memo":"","timeout_height":"0","extension_options":[],"non_critical_extension_options":[]},"auth_info":{"signer_infos":[],"fee":{"amount":[],"gas_limit":"200000","payer":"","granter":""}},"signatures":[]} +``` +{"body":{"messages":[{"@type":"/blog.blog.MsgCreatePost","creator":"blog1ctxp3pfdtr3sw9udz2ptuh59ce9z0eaa2zvv6w","title":"foo","body":"bar"}],"memo":"","timeout_height":"0","extension_options":[],"non_critical_extension_options":[]},"auth_info":{"signer_infos":[],"fee":{"amount":[],"gas_limit":"200000","payer":"","granter":""}},"signatures":[]} confirm transaction before signing and broadcasting [y/N]: y ``` @@ -487,10 +467,10 @@ blogd q blog posts The result: -```bash +```yaml Post: - body: bar - creator: cosmos1ctxp3pfdtr3sw9udz2ptuh59ce9z0eaa2zvv6w + creator: blog1ctxp3pfdtr3sw9udz2ptuh59ce9z0eaa2zvv6w id: "0" title: foo pagination: diff --git a/docs/docs/guide/03-blog/01-comment-blog.md b/docs/docs/guide/03-blog/01-comment-blog.md index 6609839ebb..5959f8ce01 100644 --- a/docs/docs/guide/03-blog/01-comment-blog.md +++ b/docs/docs/guide/03-blog/01-comment-blog.md @@ -41,7 +41,7 @@ The `--no-message` flag disables CRUD interaction messages scaffolding because y The command output shows the files that were created and modified: -```text +``` create proto/blog/comment.proto modify proto/blog/genesis.proto modify proto/blog/query.proto @@ -65,7 +65,7 @@ modify x/blog/types/keys.go Make a small modification in `proto/blog/comment.proto` to change `createdAt` to int64: -```go +```protobuf message Comment { uint64 id = 1; string creator = 2; @@ -90,11 +90,10 @@ Here, `postID` is the reference to previously created blog post. The `message` command has created and modified several files: -```text +``` modify proto/blog/tx.proto modify x/blog/client/cli/tx.go create x/blog/client/cli/tx_create_comment.go -modify x/blog/handler.go create x/blog/keeper/msg_server_create_comment.go modify x/blog/module_simulation.go create x/blog/simulation/create_comment.go @@ -112,7 +111,7 @@ In the `proto/blog/tx.proto` file, edit `MsgCreateComment` to: * Add `id` * Define the `id` for `message MsgCreateCommentResponse`: -```go +```protobuf message MsgCreateComment { string creator = 1; uint64 postID = 2; @@ -128,13 +127,13 @@ message MsgCreateCommentResponse { You see in the `proto/blog/tx.proto` file that the `MsgCreateComment` has five fields: creator, title, body, postID, and id. Since the purpose of the `MsgCreateComment` message is to create new comments in the store, the only thing the message needs to return is an ID of a created comments. The `CreateComment` rpc was already added to the `Msg` service: -```go +```protobuf rpc CreateComment(MsgCreateComment) returns (MsgCreateCommentResponse); ``` Now, add the `id` field to `MsgCreatePost`: -```go +```protobuf message MsgCreatePost { string creator = 1; string title = 2; @@ -155,9 +154,11 @@ You need to do the following things: ```go import ( - //... + // ... sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + + // ... ) func (k msgServer) CreateComment(goCtx context.Context, msg *types.MsgCreateComment) (*types.MsgCreateCommentResponse, error) { @@ -192,7 +193,8 @@ func (k msgServer) CreateComment(goCtx context.Context, msg *types.MsgCreateComm When the Comment validity is checked, it throws 2 error messages - `ErrID` and `ErrCommendOld`. You can define the error messages by navigating to `x/blog/types/errors.go` and replacing the current values in 'var' with: ```go -//... +// ... + var ( ErrCommentOld = sdkerrors.Register(ModuleName, 1300, "") ErrID = sdkerrors.Register(ModuleName, 1400, "") @@ -236,11 +238,11 @@ Each file save triggers an automatic rebuild. Now, after you build and start yo Also, make a small modification in `proto/blog/post.proto` to add `createdAt`: -```go -//... +```protobuf +// ... message Post { - //... + // ... int64 createdAt = 5; } ``` @@ -249,7 +251,7 @@ message Post { The function `ignite scaffold list comment --no-message` has fetched all of the required functions for keeper. -Inside `x/blog/types/keys.go` file, you can see that the `comment-value` and `comment-count` keys are added. +Inside `x/blog/types/keys.go` file, you can see that the `Comment/value/` and `Comment/count/` keys are added. ## Write data to the store @@ -265,7 +267,7 @@ import ( "blog/x/blog/types" ) -//... +// ... func (k Keeper) GetPost(ctx sdk.Context, id uint64) (val types.Post, found bool) { store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefix(types.PostKey)) @@ -293,7 +295,7 @@ When you ran the `ignite scaffold list comment --no-message` command, these func By following these steps, you have implemented all of the code required to create comments and store them on-chain. Now, when a transaction that contains a message of type `MsgCreateComment` is broadcast, the message is routed to your blog module. -- `x/blog/handler.go` calls `k.CreateComment` which in turn calls `AppendComment`. +- `k.CreateComment` calls `AppendComment`. - `AppendComment` gets the number of comments from the store, adds a comment using the count as an ID, increments the count, and returns the ID. ## Create the delete-comment message @@ -310,11 +312,10 @@ Here, `commentID` and `postID` are the references to previously created comment The `message` command has created and modified several files: -```bash +``` modify proto/blog/tx.proto modify x/blog/client/cli/tx.go create x/blog/client/cli/tx_delete_comment.go -modify x/blog/handler.go create x/blog/keeper/msg_server_delete_comment.go modify x/blog/module_simulation.go create x/blog/simulation/delete_comment.go @@ -330,7 +331,7 @@ In the `proto/blog/tx.proto` file, edit `MsgDeleteComment` to: * Add `id` * Define the `id` for `message MsgDeleteCommentResponse`: -```go +```protobuf message MsgDeleteComment { string creator = 1; uint64 commentID = 2; @@ -398,7 +399,7 @@ ignite scaffold query comments id:uint --response title,body Also in `proto/blog/query.proto`, make these updates: -```go +```protobuf import "blog/post.proto"; message QueryCommentsRequest { @@ -408,7 +409,8 @@ message QueryCommentsRequest { cosmos.base.query.v1beta1.PageRequest pagination = 2; } -//... +// ... + message QueryCommentsResponse { Post Post = 1; @@ -501,8 +503,8 @@ blogd tx blog create-post Uno "This is the first post" --from alice As before, you are prompted to confirm the transaction: -```bash -{"body":{"messages":[{"@type":"/blog.blog.MsgCreatePost","creator":"cosmos1uamq9d6zj5p7lvzyhjugg8drkrcqckxtvj99ac","title":"Uno","body":"This is the first post","id":"0"}],"memo":"","timeout_height":"0","extension_options":[],"non_critical_extension_options":[]},"auth_info":{"signer_infos":[],"fee":{"amount":[],"gas_limit":"200000","payer":"","granter":""}},"signatures":[]} +```json +{"body":{"messages":[{"@type":"/blog.blog.MsgCreatePost","creator":"blog1uamq9d6zj5p7lvzyhjugg8drkrcqckxtvj99ac","title":"Uno","body":"This is the first post","id":"0"}],"memo":"","timeout_height":"0","extension_options":[],"non_critical_extension_options":[]},"auth_info":{"signer_infos":[],"fee":{"amount":[],"gas_limit":"200000","payer":"","granter":""}},"signatures":[]} ``` Create a comment: @@ -511,13 +513,13 @@ Create a comment: blogd tx blog create-comment 0 Uno "This is the first comment" --from alice ``` -```bash -{"body":{"messages":[{"@type":"/blog.blog.MsgCreateComment","creator":"cosmos1uamq9d6zj5p7lvzyhjugg8drkrcqckxtvj99ac","postID":"0","title":"Uno","body":"This is the first comment","id":"0"}],"memo":"","timeout_height":"0","extension_options":[],"non_critical_extension_options":[]},"auth_info":{"signer_infos":[],"fee":{"amount":[],"gas_limit":"200000","payer":"","granter":""}},"signatures":[]} +```json +{"body":{"messages":[{"@type":"/blog.blog.MsgCreateComment","creator":"blog1uamq9d6zj5p7lvzyhjugg8drkrcqckxtvj99ac","postID":"0","title":"Uno","body":"This is the first comment","id":"0"}],"memo":"","timeout_height":"0","extension_options":[],"non_critical_extension_options":[]},"auth_info":{"signer_infos":[],"fee":{"amount":[],"gas_limit":"200000","payer":"","granter":""}},"signatures":[]} ``` When prompted, press Enter to confirm the transaction: -```bash +``` confirm transaction before signing and broadcasting [y/N]: y ``` @@ -529,18 +531,18 @@ blogd q blog comments 0 The results are output: -```bash +```yaml Comment: - body: This is the first comment createdAt: "58" - creator: cosmos1uamq9d6zj5p7lvzyhjugg8drkrcqckxtvj99ac + creator: blog1uamq9d6zj5p7lvzyhjugg8drkrcqckxtvj99ac id: "0" postID: "0" title: Uno Post: body: This is the first post createdAt: "51" - creator: cosmos1uamq9d6zj5p7lvzyhjugg8drkrcqckxtvj99ac + creator: blog1uamq9d6zj5p7lvzyhjugg8drkrcqckxtvj99ac id: "0" title: Uno pagination: @@ -562,12 +564,12 @@ blogd q blog comments 0 The results are output: -```bash +```yaml Comment: [] Post: body: This is the first post createdAt: "12" - creator: cosmos12s696u0wutt42kc297td5naxgxtvtxdlsg07n2 + creator: blog12s696u0wutt42kc297td5naxgxtvtxdlsg07n2 id: "0" title: Uno pagination: @@ -585,7 +587,7 @@ blogd tx blog create-comment 53 "Edge1" "This is the 53 comment" --from alice - The transaction is not able to be completed because the blog id does not exist: -```bash +```yaml code: 22 codespace: sdk data: "" @@ -624,7 +626,7 @@ blogd tx blog create-comment 0 "Comment" "This is a comment" --from alice -y The transaction is not executed: -```bash +```yaml code: 1300 codespace: blog data: "" diff --git a/docs/docs/guide/03-blog/02-connect-blockchain.md b/docs/docs/guide/03-blog/02-connect-blockchain.md index c2f641c470..25bc4c99c1 100644 --- a/docs/docs/guide/03-blog/02-connect-blockchain.md +++ b/docs/docs/guide/03-blog/02-connect-blockchain.md @@ -30,7 +30,7 @@ Create your `blogclient` directory first, change your current working directory, ```bash mkdir blogclient cd blogclient -go mod init github.com/username/blogclient +go mod init blogclient touch main.go ``` @@ -41,21 +41,21 @@ Your blockchain client has only two dependencies: - The `blog` blockchain `types` for message types and a query client - `ignite` for the `cosmosclient` blockchain client -```go -module github.com/username/blogclient +```go-module +module blogclient -go 1.17 +go 1.18 require ( blog v0.0.0-00010101000000-000000000000 - github.com/ignite/cli v0.22.2 + github.com/ignite/cli v0.23.0 ) replace blog => ../blog replace github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1 ``` -The `replace` directive uses the package from the local `blog` directory and is specified as a relative path. +The `replace` directive uses the package from the local `blog` directory and is specified as a relative path to the `blogclient` directory. Cosmos SDK uses a custom version of the `protobuf` package, so use the `replace` directive to specify the correct dependency. @@ -76,58 +76,71 @@ import ( "fmt" "log" - // importing the general purpose Cosmos blockchain client + // Importing the general purpose Cosmos blockchain client "github.com/ignite/cli/ignite/pkg/cosmosclient" - // importing the types package of your blog blockchain + // Importing the types package of your blog blockchain "blog/x/blog/types" ) func main() { - // create an instance of cosmosclient - cosmos, err := cosmosclient.New(context.Background()) + // Prefix to use for account addresses. + // The address prefix was assigned to the blog blockchain + // using the `--address-prefix` flag during scaffolding. + addressPrefix := "blog" + + // Create a Cosmos client instance + cosmos, err := cosmosclient.New( + context.Background(), + cosmosclient.WithAddressPrefix(addressPrefix), + ) if err != nil { log.Fatal(err) } - // account `alice` was initialized during `ignite chain serve` + // Account `alice` was initialized during `ignite chain serve` accountName := "alice" - // get account from the keyring by account name and return a bech32 address - address, err := cosmos.Address(accountName) + // Get account from the keyring + account, err := cosmos.Account(accountName) if err != nil { log.Fatal(err) } - // define a message to create a post + addr, err := account.Address(addressPrefix) + if err != nil { + log.Fatal(err) + } + + // Define a message to create a post msg := &types.MsgCreatePost{ - Creator: address.String(), + Creator: addr, Title: "Hello!", Body: "This is the first post", } - // broadcast a transaction from account `alice` with the message to create a post - // store response in txResp - txResp, err := cosmos.BroadcastTx(accountName, msg) + // Broadcast a transaction from account `alice` with the message + // to create a post store response in txResp + txResp, err := cosmos.BroadcastTx(account, msg) if err != nil { log.Fatal(err) } - // print response from broadcasting a transaction + // Print response from broadcasting a transaction fmt.Print("MsgCreatePost:\n\n") fmt.Println(txResp) - // instantiate a query client for your `blog` blockchain + // Instantiate a query client for your `blog` blockchain queryClient := types.NewQueryClient(cosmos.Context()) - // query the blockchain using the client's `Posts` method to get all posts - // store all posts in queryResp + // Query the blockchain using the client's `Posts` method + // to get all posts store all posts in queryResp queryResp, err := queryClient.Posts(context.Background(), &types.QueryPostsRequest{}) if err != nil { log.Fatal(err) } - // print response from querying all the posts + // Print response from querying all the posts fmt.Print("\n\nAll posts:\n\n") fmt.Println(queryResp) } @@ -156,7 +169,7 @@ go run main.go If successful, the results of running the command are printed to the terminal: -```bash +``` # github.com/keybase/go-keychain ### Some warnings might be displayed which can be ignored MsgCreatePost: @@ -173,20 +186,20 @@ Response: All posts: -Post:<creator:"cosmos1j8d8pyjr5vynjvcq7xgzme0ny6ha30rpakxk3n" title:"foo" body:"bar" > Post:<creator:"cosmos1j8d8pyjr5vynjvcq7xgzme0ny6ha30rpakxk3n" id:1 title:"Hello!" body:"This is the first post" > pagination:<total:2 > +Post:<creator:"blog1j8d8pyjr5vynjvcq7xgzme0ny6ha30rpakxk3n" title:"foo" body:"bar" > Post:<creator:"blog1j8d8pyjr5vynjvcq7xgzme0ny6ha30rpakxk3n" id:1 title:"Hello!" body:"This is the first post" > pagination:<total:2 > ``` You can confirm the new post with using the `blogd query blog posts` command that you learned about in the previous chapter. The result looks similar to: -```bash +```yaml Post: - body: bar - creator: cosmos1j8d8pyjr5vynjvcq7xgzme0ny6ha30rpakxk3n + creator: blog1j8d8pyjr5vynjvcq7xgzme0ny6ha30rpakxk3n id: "0" title: foo - body: This is the first post - creator: cosmos1j8d8pyjr5vynjvcq7xgzme0ny6ha30rpakxk3n + creator: blog1j8d8pyjr5vynjvcq7xgzme0ny6ha30rpakxk3n id: "1" title: Hello! pagination: diff --git a/docs/docs/guide/04-nameservice/02-messages.md b/docs/docs/guide/04-nameservice/02-messages.md index 4c190f68a2..c32a5a8139 100644 --- a/docs/docs/guide/04-nameservice/02-messages.md +++ b/docs/docs/guide/04-nameservice/02-messages.md @@ -89,11 +89,10 @@ where: The `ignite scaffold message buy-name name bid` command creates and modifies several files: -```bash +``` modify proto/nameservice/tx.proto modify x/nameservice/client/cli/tx.go create x/nameservice/client/cli/tx_buy_name.go -modify x/nameservice/handler.go create x/nameservice/keeper/msg_server_buy_name.go modify x/nameservice/types/codec.go create x/nameservice/types/message_buy_name.go @@ -110,11 +109,11 @@ These are the changes for each one of these files: ```go syntax = "proto3"; - package username.nameservice.nameservice; + package nameservice.nameservice; // this line is used by starport scaffolding # proto/tx/import - option go_package = "github.com/username/nameservice/x/nameservice/types"; + option go_package = "nameservice/x/nameservice/types"; // Msg defines the Msg service. service Msg { @@ -141,10 +140,6 @@ These are the changes for each one of these files: Defines methods to satisfy the `Msg` interface. -- `x/nameservice/handler.go` - - Registers the `MsgBuyName` message in the module message handler. - - `x/nameservice/keeper/msg_server_buy_name.go` Defines the `BuyName` keeper method. You can notice that the message follows the `Msg` interface. The message `struct` contains all the information required when buying a name: `Name`, `Bid`, and `Creator`. This struct was added automatically. diff --git a/docs/docs/guide/04-nameservice/04-keeper.md b/docs/docs/guide/04-nameservice/04-keeper.md index cd27f2d0ba..38751bbfe3 100644 --- a/docs/docs/guide/04-nameservice/04-keeper.md +++ b/docs/docs/guide/04-nameservice/04-keeper.md @@ -19,10 +19,13 @@ In this section, define the keepers that are required by the nameservice module: ## Buy Name -To define the keeper for the buy name transaction, add this code to the `msg_server_buy_name.go` file: +To define the keeper for the buy name transaction, add this code to the `x/nameservice/keeper/msg_server_buy_name.go` file: ```go // x/nameservice/keeper/msg_server_buy_name.go + +package keeper + import ( "context" @@ -91,10 +94,13 @@ This dependency automatically created an `expected_keepers.go` file with a `Bank The `BuyName` transaction uses `SendCoins` and `SendCoinsFromAccountToModule` methods from the `bank` module. -Edit the `expected_keepers.go` file to add `SendCoins` and `SendCoinsFromAccountToModule` to be able to use it in the keeper methods of the `nameservice` module. +Edit the `x/nameservice/types/expected_keepers.go` file to add `SendCoins` and `SendCoinsFromAccountToModule` to be able to use it in the keeper methods of the `nameservice` module. ```go // x/nameservice/types/expected_keepers.go + +package types + import ( sdk "github.com/cosmos/cosmos-sdk/types" ) @@ -107,10 +113,13 @@ type BankKeeper interface { ## Set Name -To define the keeper for the set name transaction, add this code to the `msg_server_set_name.go` file: +To define the keeper for the set name transaction, add this code to the `x/nameservice/keeper/msg_server_set_name.go` file: ```go // x/nameservice/keeper/msg_server_set_name.go + +package keeper + import ( "context" @@ -148,10 +157,13 @@ func (k msgServer) SetName(goCtx context.Context, msg *types.MsgSetName) (*types ## Delete Name -To define the keeper for the delete name transaction, add this code to the `msg_server_delete_name.go` file: +To define the keeper for the delete name transaction, add this code to the `x/nameservice/keeper/msg_server_delete_name.go` file: ```go // x/nameservice/keeper/msg_server_delete_name.go + +package keeper + import ( "context" diff --git a/docs/docs/guide/05-scavenge/04-messages.md b/docs/docs/guide/05-scavenge/04-messages.md index 38d20f65d0..03342e9828 100644 --- a/docs/docs/guide/05-scavenge/04-messages.md +++ b/docs/docs/guide/05-scavenge/04-messages.md @@ -28,7 +28,7 @@ ignite scaffold message submit-scavenge solutionHash description reward The command creates and modifies several files: -```bash +``` modify app/app.go create proto/scavenge/genesis.proto create proto/scavenge/params.proto @@ -40,7 +40,6 @@ create x/scavenge/client/cli/query_params.go create x/scavenge/client/cli/tx.go create x/scavenge/genesis.go create x/scavenge/genesis_test.go -create x/scavenge/handler.go create x/scavenge/keeper/grpc_query.go create x/scavenge/keeper/grpc_query_params.go create x/scavenge/keeper/grpc_query_params_test.go @@ -75,10 +74,6 @@ The `scaffold message` command does all of these code updates for you: * Defines methods to satisfy `Msg` interface -* `x/scavenge/handler.go` - - * Registers the `MsgSubmitScavenge` message in the module message handler - * `x/scavenge/keeper/msg_server_submit_scavenge.go` * Defines the `SubmitScavenge` keeper method @@ -123,11 +118,10 @@ ignite scaffold message commit-solution solutionHash solutionScavengerHash ``` Because you're using the same `ignite scaffold message` command, the set of modified and created files is the same: -```bash +``` modify proto/scavenge/tx.proto modify x/scavenge/client/cli/tx.go create x/scavenge/client/cli/tx_commit_solution.go -modify x/scavenge/handler.go create x/scavenge/keeper/msg_server_commit_solution.go modify x/scavenge/module_simulation.go create x/scavenge/simulation/commit_solution.go diff --git a/docs/docs/guide/05-scavenge/05-types.md b/docs/docs/guide/05-scavenge/05-types.md index 07f4f0ca33..142895b5e2 100644 --- a/docs/docs/guide/05-scavenge/05-types.md +++ b/docs/docs/guide/05-scavenge/05-types.md @@ -22,7 +22,7 @@ ignite scaffold map scavenge solutionHash solution description reward scavenger The `ignite scaffold map` command creates and modifies several files: -```bash +``` modify proto/scavenge/genesis.proto modify proto/scavenge/query.proto create proto/scavenge/scavenge.proto diff --git a/docs/docs/guide/05-scavenge/06-handlers.md b/docs/docs/guide/05-scavenge/06-handlers.md index 7e6d6b2d96..8b42662cf9 100644 --- a/docs/docs/guide/05-scavenge/06-handlers.md +++ b/docs/docs/guide/05-scavenge/06-handlers.md @@ -4,12 +4,12 @@ sidebar_position: 6 # Handlers -For a message to reach a keeper, it has to go through a handler. A handler is where you can apply logic to allow or deny a message to succeed. +For a message to reach a keeper, it has to go through a message server handler. A handler is where you can apply logic to allow or deny a message to succeed. * If you're familiar with the [Model-view-controller](https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller) (MVC) software architecture, the keeper is a bit like the model, and the handler is a bit like the controller. * If you're familiar with [React](<https://en.wikipedia.org/wiki/React_(web_framework)>) or [Vue](https://en.wikipedia.org/wiki/Vue.js) architecture, the keeper is a bit like the reducer store and the handler is a bit like actions. -The module-wide message handler is defined in `x/scavenge/handler.go`. Three message types were automatically added to the handler: +Three message types were automatically added to the message server: * `MsgSubmitScavenge` * `MsgCommitSolution` diff --git a/docs/docs/guide/05-scavenge/07-keeper.md b/docs/docs/guide/05-scavenge/07-keeper.md index fa09c03185..e416ebeaeb 100644 --- a/docs/docs/guide/05-scavenge/07-keeper.md +++ b/docs/docs/guide/05-scavenge/07-keeper.md @@ -17,6 +17,8 @@ Make the required changes in the `x/scavenge/keeper/msg_server_submit_scavenge.g ```go // x/scavenge/keeper/msg_server_submit_scavenge.go +package keeper + import ( "context" @@ -82,6 +84,9 @@ To use the `BankKeeper` interface in the keeper methods of the `scavenge` module ```go // x/scavenge/types/expected_keepers.go + +package types + import ( sdk "github.com/cosmos/cosmos-sdk/types" ) @@ -101,6 +106,8 @@ Make the required changes in the `x/scavenge/keeper/msg_server_commit_solution.g ```go // x/scavenge/keeper/msg_server_commit_solution.go +package keeper + import ( "context" @@ -147,6 +154,8 @@ Make the required changes in the `x/scavenge/keeper/msg_server_reveal_solution.g ```go // x/scavenge/keeper/msg_server_reveal_solution.go +package keeper + import ( "context" "crypto/sha256" diff --git a/docs/docs/guide/05-scavenge/08-cli.md b/docs/docs/guide/05-scavenge/08-cli.md index 9945e68edc..ad5003fdc5 100644 --- a/docs/docs/guide/05-scavenge/08-cli.md +++ b/docs/docs/guide/05-scavenge/08-cli.md @@ -26,10 +26,11 @@ This method makes it easier to incorporate different modules for different reaso ```go // x/scavenge/client/cli/tx_commit_solution.go +package cli + import ( "crypto/sha256" "encoding/hex" - "strconv" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" @@ -93,10 +94,11 @@ Note that this file makes use of the `sha256` library for hashing the plain text ```go // x/scavenge/client/cli/tx_submit_scavenge.go +package cli + import ( "crypto/sha256" "encoding/hex" - "strconv" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" diff --git a/docs/docs/guide/06-loan.md b/docs/docs/guide/06-loan.md index 55529fd83a..4ae09aba93 100644 --- a/docs/docs/guide/06-loan.md +++ b/docs/docs/guide/06-loan.md @@ -110,7 +110,7 @@ Use the `--no-message` flag to disable CRUD messages in the scaffold. The data you store in an array-like data structure are the loans, with these parameters that are defined in the `Loan` message in `proto/loan/loan.proto`: -```proto +```protobuf message Loan { uint64 id = 1; string amount = 2; @@ -411,7 +411,7 @@ import ( // x/loan module sentinel errors var ( - ErrWrongLoanState = sdkerrors.Register(ModuleName, 1, "wrong loan state") + ErrWrongLoanState = sdkerrors.Register(ModuleName, 2, "wrong loan state") ) ``` @@ -717,8 +717,8 @@ import ( // x/loan module sentinel errors var ( - ErrWrongLoanState = sdkerrors.Register(ModuleName, 1, "wrong loan state") - ErrDeadline = sdkerrors.Register(ModuleName, 2, "deadline") + ErrWrongLoanState = sdkerrors.Register(ModuleName, 2, "wrong loan state") + ErrDeadline = sdkerrors.Register(ModuleName, 3, "deadline") ) ``` diff --git a/docs/docs/guide/07-ibc.md b/docs/docs/guide/07-ibc.md index 2008677757..89676ac15e 100644 --- a/docs/docs/guide/07-ibc.md +++ b/docs/docs/guide/07-ibc.md @@ -52,8 +52,8 @@ Use Ignite CLI to scaffold the blockchain app and the blog module. To scaffold a new blockchain named `planet`: -```go -ignite scaffold chain github.com/username/planet --no-module +```bash +ignite scaffold chain planet --no-module cd planet ``` @@ -65,7 +65,7 @@ Next, use Ignite CLI to scaffold a blog module with IBC capabilities. The blog m To scaffold a module named `blog`: -```go +```bash ignite scaffold module blog --ibc ``` @@ -81,19 +81,19 @@ These `ignite scaffold list` commands create CRUD code for the following transac - Creating blog posts - ```go + ```bash ignite scaffold list post title content creator --no-message --module blog ``` - Processing acknowledgments for sent posts - ```go + ```bash ignite scaffold list sentPost postID title chain creator --no-message --module blog ``` - Managing post timeouts - ```go + ```bash ignite scaffold list timedoutPost title chain creator --no-message --module blog ``` @@ -101,7 +101,7 @@ The scaffolded code includes proto files for defining data structures, messages, ### Ignite CLI Scaffold List Command Overview -```go +``` ignite scaffold list [typeName] [field1] [field2] ... [flags] ``` @@ -125,7 +125,7 @@ The `ignite packet` command creates the logic for an IBC packet that can be sent To scaffold a sendable and interpretable IBC packet: -```go +```bash ignite scaffold packet ibcPost title content --ack postID --module blog ``` @@ -137,7 +137,7 @@ Notice the fields in the `ibcPost` packet match the fields in the `post` type th The `ignite packet` command also scaffolds the CLI command that is capable of sending an IBC packet: -```go +```bash planetd tx blog send-ibcPost [portID] [channelID] [title] [content] ``` @@ -151,7 +151,7 @@ Start with the proto file that defines the structure of the IBC packet. To identify the creator of the post in the receiving blockchain, add the `creator` field inside the packet. This field was not specified directly in the command because it would automatically become a parameter in the `SendIbcPost` CLI command. -```proto +```protobuf // proto/blog/packet.proto message IbcPostPacketData { string title = 1; @@ -219,6 +219,8 @@ import ( //... "strconv" + + //... ) ``` @@ -418,7 +420,7 @@ When prompted, press Enter to accept the default values for `Source Account` and The output looks like: -```bash +``` --------------------------------------------- Setting up chains --------------------------------------------- @@ -444,7 +446,7 @@ ignite relayer connect Results: -```bash +``` ------ Paths ------ @@ -474,7 +476,7 @@ planetd q blog list-post --node tcp://localhost:26659 The packet has been received: -```bash +```yaml Post: - content: Hello Mars, I'm Alice from Earth creator: blog-channel-0-cosmos1aew8dk9cs3uzzgeldatgzvm5ca2k4m98xhy20x @@ -493,7 +495,7 @@ planetd q blog list-sent-post Output: -```bash +```yaml SentPost: - chain: blog-channel-0 creator: cosmos1aew8dk9cs3uzzgeldatgzvm5ca2k4m98xhy20x @@ -519,7 +521,7 @@ planetd q blog list-timedout-post Results: -```bash +```yaml TimedoutPost: - chain: blog-channel-0 creator: cosmos1fhpcsxn0g8uask73xpcgwxlfxtuunn3ey5ptjv @@ -544,7 +546,7 @@ planetd q blog list-post Results: -```bash +```yaml Post: - content: Hello Earth, I'm Alice from Mars creator: blog-channel-0-cosmos1xtpx43l826348s59au24p22pxg6q248638q2tf diff --git a/docs/docs/guide/08-interchange/02-init.md b/docs/docs/guide/08-interchange/02-init.md index 69d6df78af..509d9002fc 100644 --- a/docs/docs/guide/08-interchange/02-init.md +++ b/docs/docs/guide/08-interchange/02-init.md @@ -83,7 +83,7 @@ Cancelling orders is done locally in the network, there is no packet to send. Use the `message` command to create a message to cancel a sell or buy order: -```go +```bash ignite scaffold message cancel-sell-order port channel amountDenom priceDenom orderID:int --desc "Cancel a sell order" --module dex ignite scaffold message cancel-buy-order port channel amountDenom priceDenom orderID:int --desc "Cancel a buy order" --module dex ``` @@ -101,7 +101,7 @@ The token denoms must have the same behavior as described in the `ibc-transfer` For a `voucher` you store, define the source port ID, source channel ID, and the original denom: -```go +```bash ignite scaffold map denom-trace port channel origin --no-message --module dex ``` @@ -154,7 +154,8 @@ host: rpc: ":26659" p2p: ":26658" prof: ":6061" - grpc: ":9091" + grpc: ":9092" + grpc-web: ":9093" api: ":1318" genesis: chain_id: "venus" diff --git a/docs/docs/guide/08-interchange/03-walkthrough.md b/docs/docs/guide/08-interchange/03-walkthrough.md index dfc9f2c784..0cef375003 100644 --- a/docs/docs/guide/08-interchange/03-walkthrough.md +++ b/docs/docs/guide/08-interchange/03-walkthrough.md @@ -19,9 +19,8 @@ The next chapter contains the code for the implementation. To use the exchange, start by creating an order book for a pair of tokens: ```bash -interchanged tx dex send-create-pair [src-port] [src-channel] [sourceDenom] [targetDenom] # Create pair broadcasted to the source blockchain - +# interchanged tx dex send-create-pair [src-port] [src-channel] [sourceDenom] [targetDenom] interchanged tx dex send-create-pair dex channel-0 marscoin venuscoin ``` @@ -34,7 +33,7 @@ Creating an order book affects state on the source blockchain to which the trans On the source blockchain, the `send-create-pair` command creates an empty sell order book: -```yml +```yaml # Created a sell order book on the source blockchain SellOrderBook: - amountDenom: marscoin @@ -47,7 +46,7 @@ SellOrderBook: On the target blockchain, the same `send-createPair` command creates a buy order book: -```yml +```yaml # Created a buy order book on the target blockchain BuyOrderBook: - amountDenom: marscoin @@ -70,15 +69,14 @@ Sending an IBC packet requires a user to specify a port and a channel through wh After an order book is created, the next step is to create a sell order: ```bash -interchanged tx dex send-sell-order [src-port] [src-channel] [amountDenom] [amount] [priceDenom] [price] - # Sell order broadcasted to the source blockchain +# interchanged tx dex send-sell-order [src-port] [src-channel] [amountDenom] [amount] [priceDenom] [price] interchanged tx dex send-sell-order dex channel-0 marscoin 10 venuscoin 15 ``` The `send-sellOrder` command broadcasts a message that locks token on the source blockchain and creates a sell order on the source blockchain: -```yml +```yaml # Source blockchain balances: - amount: "990" # decreased from 1000 @@ -101,15 +99,14 @@ SellOrderBook: A buy order has the same arguments, the amount of token to be purchased and a price: ```bash -`interchanged tx dex send-buy-order [src-port] [src-channel] [amountDenom] [amount] [priceDenom] [price]` - # Buy order broadcasted to the target blockchain +# interchanged tx dex send-buy-order [src-port] [src-channel] [amountDenom] [amount] [priceDenom] [price]` interchanged tx dex send-buy-order dex channel-0 marscoin 10 venuscoin 5 ``` The `send-buy-order` command locks token on the target blockchain: -```yml +```yaml # Target blockchain balances: - amount: "950" # decreased from 1000 @@ -145,7 +142,7 @@ The sell order (for 5marscoin at 3venuscoin) is filled on the target chain by th The amount of the buy order on the target chain is decreased by 5marscoin: -```yml +```yaml # Target blockchain BuyOrderBook: - amountDenom: marscoin @@ -164,7 +161,7 @@ The sender of the filled sell order exchanged 5marscoin for 25 venuscoin voucher 25 vouchers is a product of the amount of the sell order (5marscoin) and price of the buy order (5venuscoin): -```yml +```yaml # Source blockchain balances: - amount: "25" # increased from 0 @@ -175,7 +172,7 @@ balances: The counterparty (the sender of the buy marscoin order) receives 5 marscoin vouchers: -```yml +```yaml # Target blockchain balances: - amount: "5" # increased from 0 @@ -197,7 +194,7 @@ A buy order is immediately filled on the source chain and the sell order creator The sell order amount is decreased by the amount of the filled buy order (by 5marscoin): -```yml +```yaml # Source blockchain balances: - amount: "100" # increased from 25 @@ -217,7 +214,7 @@ SellOrderBook: The creator of the buy order receives 5 marscoin vouchers for 75 venuscoin (5marscoin * 15venuscoin): -```yml +```yaml # Target blockchain balances: - amount: "10" # increased from 5 @@ -237,7 +234,7 @@ interchanged tx dex send-sell-order dex channel-0 marscoin 10 venuscoin 3 The sell amount is 10marscoin, but the opened buy order amount is only 5marscoin. The buy order gets filled completely and removed from the order book. The author of the previously created buy order receives 10 marscoin vouchers from the exchange: -```yml +```yaml # Target blockchain balances: - amount: "15" # increased from 5 @@ -253,7 +250,7 @@ BuyOrderBook: The author of the sell order successfuly exchanged 5 marscoin and received 25 venuscoin vouchers. The other 5marscoin created a sell order: -```yml +```yaml # Source blockchain balances: - amount: "125" # increased from 100 @@ -287,7 +284,7 @@ interchanged tx dex send-buy-order dex channel-0 marscoin 10 venuscoin 5 The buy order is partially filled for 5marscoin. An existing sell order for 5 marscoin (with a price of 3 venuscoin) on the source chain is completely filled and is removed from the order book. The author of the closed sell order receives 15 venuscoin vouchers (product of 5marscoin and 3venuscoin): -```yml +```yaml # Source blockchain balances: - amount: "140" # increased from 125 @@ -308,7 +305,7 @@ SellOrderBook: The author of the buy order receives 5 marscoin vouchers which locks 50 venuscoin of their token. The 5marscoin amount that is not filled by the sell order creates a buy order on the target chain: -```yml +```yaml # Target blockchain balances: - amount: "20" # increased from 15 @@ -344,7 +341,7 @@ interchanged tx dex cancel-sell-order dex channel-0 marscoin venuscoin 2 The balance of marscoin is increased: -```yml +```yaml # Source blockchain balances: - amount: "980" # increased from 975 @@ -362,7 +359,7 @@ interchanged tx dex cancel-buy-order dex channel-0 marscoin venuscoin 5 The amount of venuscoin is increased: -```yml +```yaml # Target blockchain balances: - amount: "850" # increased from 825 diff --git a/docs/docs/guide/08-interchange/04-creating-order-books.md b/docs/docs/guide/08-interchange/04-creating-order-books.md index 1175d89370..cf41c1b02e 100644 --- a/docs/docs/guide/08-interchange/04-creating-order-books.md +++ b/docs/docs/guide/08-interchange/04-creating-order-books.md @@ -32,7 +32,6 @@ The `send-create-pair` command is used to create order books. This command: - Creates and broadcasts a transaction with a message of type `SendCreatePair`. - The message gets routed to the `dex` module. -- The message is processed by the message handler in `x/dex/handler.go`. - Finally, a `SendCreatePair` keeper method is called. You need the `send-create-pair` command to do the following: @@ -120,7 +119,7 @@ First, add the proto buffer files to build the Go code files. You can modify the Create a new `order.proto` file in the `proto/dex` directory and add the content: -```proto +```protobuf // proto/dex/order.proto syntax = "proto3"; @@ -147,7 +146,7 @@ Don't forget to add the import as well. **Tip:** Don't forget to add the import as well. -```proto +```protobuf // proto/dex/buy_order_book.proto // ... @@ -163,7 +162,7 @@ Modify the `sell_order_book.proto` file to add the order book into the buy order The proto definition for the `SellOrderBook` looks like: -```proto +```protobuf // proto/dex/sell_order_book.proto // ... diff --git a/docs/docs/guide/08-interchange/05-mint-and-burn-voucher.md b/docs/docs/guide/08-interchange/05-mint-and-burn-voucher.md index 695e20cacd..516e167a60 100644 --- a/docs/docs/guide/08-interchange/05-mint-and-burn-voucher.md +++ b/docs/docs/guide/08-interchange/05-mint-and-burn-voucher.md @@ -27,11 +27,12 @@ Create a new `x/dex/keeper/mint.go` file: package keeper import ( - "fmt" - "strings" + "fmt" + "strings" - sdk "github.com/cosmos/cosmos-sdk/types" - ibctransfertypes "github.com/cosmos/ibc-go/v3/modules/apps/transfer/types" + sdkmath "cosmossdk.io/math" + sdk "github.com/cosmos/cosmos-sdk/types" + ibctransfertypes "github.com/cosmos/ibc-go/v5/modules/apps/transfer/types" "interchange/x/dex/types" ) @@ -45,12 +46,12 @@ func isIBCToken(denom string) bool { func (k Keeper) SafeBurn(ctx sdk.Context, port string, channel string, sender sdk.AccAddress, denom string, amount int32) error { if isIBCToken(denom) { // Burn the tokens - if err := k.BurnTokens(ctx, sender, sdk.NewCoin(denom, sdk.NewInt(int64(amount)))); err != nil { + if err := k.BurnTokens(ctx, sender, sdk.NewCoin(denom, sdkmath.NewInt(int64(amount)))); err != nil { return err } } else { // Lock the tokens - if err := k.LockTokens(ctx, port, channel, sender, sdk.NewCoin(denom, sdk.NewInt(int64(amount)))); err != nil { + if err := k.LockTokens(ctx, port, channel, sender, sdk.NewCoin(denom, sdkmath.NewInt(int64(amount)))); err != nil { return err } } @@ -140,7 +141,7 @@ package keeper import ( sdk "github.com/cosmos/cosmos-sdk/types" - ibctransfertypes "github.com/cosmos/ibc-go/v3/modules/apps/transfer/types" + ibctransfertypes "github.com/cosmos/ibc-go/v5/modules/apps/transfer/types" "interchange/x/dex/types" ) @@ -215,7 +216,7 @@ Go back to the `x/dex/keeper/mint.go` file and add the following code: func (k Keeper) SafeMint(ctx sdk.Context, port string, channel string, receiver sdk.AccAddress, denom string, amount int32) error { if isIBCToken(denom) { // Mint IBC tokens - if err := k.MintTokens(ctx, receiver, sdk.NewCoin(denom, sdk.NewInt(int64(amount)))); err != nil { + if err := k.MintTokens(ctx, receiver, sdk.NewCoin(denom, sdkmath.NewInt(int64(amount)))); err != nil { return err } } else { @@ -225,7 +226,7 @@ func (k Keeper) SafeMint(ctx sdk.Context, port string, channel string, receiver port, channel, receiver, - sdk.NewCoin(denom, sdk.NewInt(int64(amount))), + sdk.NewCoin(denom, sdkmath.NewInt(int64(amount))), ); err != nil { return err } diff --git a/docs/docs/guide/08-interchange/06-creating-sell-orders.md b/docs/docs/guide/08-interchange/06-creating-sell-orders.md index ffe9abce03..53663f915f 100644 --- a/docs/docs/guide/08-interchange/06-creating-sell-orders.md +++ b/docs/docs/guide/08-interchange/06-creating-sell-orders.md @@ -9,7 +9,7 @@ In this chapter, you implement the logic for creating sell orders. The packet proto file for a sell order is already generated. Add the seller information: -```proto +```protobuf // proto/dex/packet.proto message SellOrderPacketData { @@ -40,12 +40,14 @@ The `SendSellOrder` command: ```go // x/dex/keeper/msg_server_sell_order.go +package keeper + import ( "context" "errors" sdk "github.com/cosmos/cosmos-sdk/types" - clienttypes "github.com/cosmos/ibc-go/v3/modules/core/02-client/types" + clienttypes "github.com/cosmos/ibc-go/v5/modules/core/02-client/types" "interchange/x/dex/types" ) diff --git a/docs/docs/guide/08-interchange/07-creating-buy-orders.md b/docs/docs/guide/08-interchange/07-creating-buy-orders.md index 121814c181..eef16ffab5 100644 --- a/docs/docs/guide/08-interchange/07-creating-buy-orders.md +++ b/docs/docs/guide/08-interchange/07-creating-buy-orders.md @@ -11,7 +11,7 @@ In this chapter, you implement the creation of buy orders. The logic is very sim Add the buyer to the proto file definition: -```proto +```protobuf // proto/dex/packet.proto message BuyOrderPacketData { @@ -36,6 +36,8 @@ ignite generate proto-go --yes ```go // x/dex/keeper/msg_server_buy_order.go +package keeper + import ( "context" "errors" diff --git a/docs/docs/guide/08-interchange/08-cancelling-orders.md b/docs/docs/guide/08-interchange/08-cancelling-orders.md index 1dad33de05..29da4b4d44 100644 --- a/docs/docs/guide/08-interchange/08-cancelling-orders.md +++ b/docs/docs/guide/08-interchange/08-cancelling-orders.md @@ -16,6 +16,8 @@ Move to the keeper directory and edit the `x/dex/keeper/msg_server_cancel_sell_o ```go // x/dex/keeper/msg_server_cancel_sell_order.go +package keeper + import ( "context" "errors" @@ -112,6 +114,8 @@ To cancel a buy order, you have to get the ID of the specific buy order. Then yo ```go // x/dex/keeper/msg_server_cancel_buy_order.go +package keeper + import ( "context" "errors" diff --git a/docs/docs/guide/08-interchange/09-tests.md b/docs/docs/guide/08-interchange/09-tests.md index daca13b5ac..9361059450 100644 --- a/docs/docs/guide/08-interchange/09-tests.md +++ b/docs/docs/guide/08-interchange/09-tests.md @@ -725,6 +725,6 @@ func TestFillBuyOrder(t *testing.T) { When the tests are successful, your output is: -```go -ok github.com/username/interchange/x/dex/types 0.550s +``` +ok interchange/x/dex/types 0.550s ``` diff --git a/docs/docs/index.md b/docs/docs/index.md index 04b310b3f5..c5d3319678 100644 --- a/docs/docs/index.md +++ b/docs/docs/index.md @@ -61,3 +61,4 @@ Many projects already showcase the Tendermint BFT consensus engine and the Cosmo * [Finding Imposter](https://github.com/chantmk/Finding-imposter) * [Flares payment network](https://github.com/wangfeiping/flares) * [FirmaChain](https://github.com/firmachain/firmachain) +* [Sonr](https://github.com/sonr-io/sonr) diff --git a/docs/docs/kb/01-scaffold-chain.md b/docs/docs/kb/01-scaffold-chain.md index 66695a616d..a497cff5a1 100644 --- a/docs/docs/kb/01-scaffold-chain.md +++ b/docs/docs/kb/01-scaffold-chain.md @@ -12,12 +12,12 @@ The `ignite scaffold chain` command scaffolds a new Cosmos SDK blockchain projec To build the planet application: ```bash -ignite scaffold chain github.com/username/planet +ignite scaffold chain planet ``` ## Directory structure -The `ignite scaffold chain github.com/username/planet` command creates a directory called `planet` that contains all the files for your project and initializes a local git repository. The `github.com` URL in the argument is a string that is used for the Go module path. The repository name (`planet`, in this case) is used as the project's name. +The `ignite scaffold chain planet` command creates a directory called `planet` that contains all the files for your project and initializes a local git repository. The `planet` argument is a string that is used for the Go module path. The repository name (`planet`, in this case) is used as the project's name. The project directory structure: @@ -54,17 +54,14 @@ Account addresses on Cosmos SDK-based blockchains have string prefixes. For exam When you create a new blockchain, pass a prefix as a value to the `--address-prefix` flag: ```bash -ignite scaffold chain github.com/username/planet --address-prefix moonlight +ignite scaffold chain planet --address-prefix moonlight ``` Using the `moonlight` prefix, account addresses on your blockchain look like this: `moonlight12fjzdtqfrrve7zyg9sv8j25azw2ua6tvu07ypf`. ### Change prefix on existing blockchains -To change the prefix after the blockchain has been scaffolded, modify the `AccountAddressPrefix` in the `app/prefix.go` file. - -1. Change the `AccountAddressPrefix` variable in the `/app/prefix.go` file. Be sure to preserve other variables in the file. -2. To recognize the new prefix, change the `VITE_ADDRESS_PREFIX` variable in `/vue/.env`. +To change the prefix after the blockchain has been scaffolded, modify the `AccountAddressPrefix` in the `app/app.go` file. ## Cosmos SDK version diff --git a/docs/docs/kb/02-serve.md b/docs/docs/kb/02-serve.md index 19e9152be2..f452007bb9 100644 --- a/docs/docs/kb/02-serve.md +++ b/docs/docs/kb/02-serve.md @@ -33,7 +33,7 @@ The `ignite chain serve` command performs the following tasks: - Installs dependencies - Imports state, if possible - Builds protocol buffer files -- Optionally generates JavaScript (JS), TypeScript (TS), and Vuex clients +- Optionally generates TypeScript clients and Vuex stores - Builds a compiled blockchain binary - Creates accounts - Initializes a blockchain node @@ -72,7 +72,7 @@ Specify a custom home directory. ## Start a blockchain node in production -The `ignite chain serve` and `ignite chain build` commands compile the source code of the chain in a binary file and install the binary in `~/go/bin`. By default, the binary name is the name of the repository appended with `d`. For example, if you scaffold a chain using `ignite scaffold chain github.com/alice/chain`, then the binary is named `chaind`. +The `ignite chain serve` and `ignite chain build` commands compile the source code of the chain in a binary file and install the binary in `~/go/bin`. By default, the binary name is the name of the repository appended with `d`. For example, if you scaffold a chain using `ignite scaffold chain mars`, then the binary is named `marsd`. You can customize the binary name in `config.yml`: diff --git a/docs/docs/kb/03-config.md b/docs/docs/kb/03-config.md index 5cbe668b7a..278498af6b 100644 --- a/docs/docs/kb/03-config.md +++ b/docs/docs/kb/03-config.md @@ -21,6 +21,10 @@ A list of user accounts created during genesis of the blockchain. | address | N | String | Account address in Bech32 address format. | | mnemonic | N | String | Mnemonic used to generate an account. This field is ignored if `address` is specified. | +Note that you can only use `address` OR `mnemonic` for an account. You can't use both, because an address is derived from a mnemonic. + +If an account is a validator account (`alice` by default), it cannot have an `address` field. + **accounts example** ```yaml @@ -67,7 +71,17 @@ client: path: "vue/src/store" ``` -Generates TypeScript Vuex client for the blockchain in `path` on `serve` and `build` commands. +Generates Vuex stores for the blockchain in `path` on `serve` and `build` commands. + +### client.typescript + +```yaml +client: + typescript: + path: "vue/src/generated" +``` + +Generates TypeScript clients for the blockchain in `path` on `serve` and `build` commands. ### client.openapi @@ -88,7 +102,7 @@ The faucet service sends tokens to addresses. The default address for the web us | name | Y | String | Name of a key pair. The `name` key pair must be in `accounts`. | | coins | Y | List of Strings | One or more coins with denominations sent per request. | | coins_max | N | List of Strings | One or more maximum amounts of tokens sent for each address. | -| host | N | String | Host and port number. Default: `:4500` | +| host | N | String | Host and port number. Default: `:4500`. Cannot be higher than 65536 | | rate_limit_window | N | String | Time after which the token limit is reset (in seconds). | **faucet example** @@ -154,7 +168,7 @@ init: ## host -Configuration of host names and ports for processes started by Ignite CLI: +Configuration of host names and ports for processes started by Ignite CLI. Port numbers can't exceed 65536. **host example** diff --git a/docs/docs/kb/04-genesis.md b/docs/docs/kb/04-genesis.md index 303ac3791e..d400cb3c30 100644 --- a/docs/docs/kb/04-genesis.md +++ b/docs/docs/kb/04-genesis.md @@ -15,7 +15,7 @@ To set and test different values, add the `genesis` parameter to `config.yml`. To change the value of one parameter, add the key-value pair under the `genesis` parameter. For example, change the value of `chain-id`: -```yml +```yaml genesis: chain_id: "foobar" ``` @@ -24,7 +24,7 @@ genesis: You can change one or more parameters of different modules. For example, in the `staking` module you can add a key-value pair to `bond_denom` to change which token gets staked: -```yml +```yaml genesis: app_state: staking: diff --git a/docs/docs/kb/05-types.md b/docs/docs/kb/05-types.md index 72986790f6..af10e7bc31 100644 --- a/docs/docs/kb/05-types.md +++ b/docs/docs/kb/05-types.md @@ -31,13 +31,13 @@ For example, you can create a `list` type called `user` and then use the `user` Here's an example of how to scaffold a new `CoordinatorDescription` type that is reusable in the future: -```shell +```bash ignite scaffold list coordinator-description description:string --no-message ``` Now you can scaffold a message using the `CoordinatorDescription` type: -```shell +```bash ignite scaffold message add-coordinator address:string description:CoordinatorDescription ``` @@ -45,14 +45,14 @@ Run the chain and then send the message using the CLI. To pass the custom type in JSON format: -```shell +```bash ignite chain serve marsd tx mars add-coordinator cosmos1t4jkut0yfnsmqle9vxk3adfwwm9vj9gsj98vqf '{"description":"coordinator description"}' true --from alice --chain-id mars ``` If you try to use a type that is not created yet, the follow error occurs: -```shell +```bash ignite scaffold message validator validator:ValidatorDescription address:string -> the field type ValidatorDescription doesn't exist ``` diff --git a/docs/docs/kb/06-proto.md b/docs/docs/kb/06-proto.md index b3f031ff0c..ce2ecc6c2f 100644 --- a/docs/docs/kb/06-proto.md +++ b/docs/docs/kb/06-proto.md @@ -17,7 +17,7 @@ The `ignite chain serve` command automatically generates Go code from proto file Third-party proto files, including those of Cosmos SDK and Tendermint, are bundled with Ignite CLI. To import third-party proto files in your custom proto files: -```proto +```protobuf import "cosmos/base/query/v1beta1/pagination.proto"; ``` diff --git a/docs/docs/kb/07-frontend.md b/docs/docs/kb/07-frontend.md index bd2585139c..cdc5a6921d 100644 --- a/docs/docs/kb/07-frontend.md +++ b/docs/docs/kb/07-frontend.md @@ -11,17 +11,19 @@ The frontend app is built using the `@starport/vue` and `@starport/vuex` package ## Client code generation -JavaScript (JS), TypeScript (TS), and Vuex clients are automatically generated for your blockchain for custom and standard Cosmos SDK modules. +A TypeScript (TS) client and associated Vuex stores are automatically generated for your blockchain for custom and standard Cosmos SDK modules. To enable client code generation, add the `client` entries to `config.yml`: ```yaml client: + typescript: + path: "ts-client" vuex: - path: "js" + path: "vue/src/store" ``` -A Vuex client is generated in the `js` directory. JS and TS clients are also generated because they are dependencies of the Vuex client. +A TS client is generated in the `ts-client` directory (see: [TypeScript client information](https://docs.ignite.com/clients/typescript)) and Vuex store modules making use of this client are generated in the `vue/src/store` directory. ## Client code regeneration @@ -29,8 +31,11 @@ By default, the filesystem is watched and the clients are regenerated automatica To regenerate all clients for custom and standard Cosmos SDK modules, run this command: -`ignite generate vuex` +```bash +ignite generate vuex +``` +(Note: this command also runs the typescript client generation and you do not need to run `ignite generate ts-client` separately.) ## Preventing client code regeneration -To prevent regenerating the client, remove the `client` property from `config.yml`. +To prevent regenerating the client, remove the `client:vuex` property from `config.yml`. diff --git a/docs/docs/kb/10-band.md b/docs/docs/kb/10-band.md index ef74f6d666..ddd3d9e0e0 100644 --- a/docs/docs/kb/10-band.md +++ b/docs/docs/kb/10-band.md @@ -50,7 +50,7 @@ When you scaffold a BandChain oracle module, the following files and directories First, scaffold a chain but don't scaffold a default module: ```bash -ignite scaffold chain github.com/username/oracle --no-module +ignite scaffold chain oracle --no-module ``` Next, change to the new `oracle` directory and scaffold an IBC-enabled module named `consuming`: @@ -78,20 +78,24 @@ Now it's time to change the data. The output of the `ignite scaffold band coinRates --module consuming` command prompts you to update the `keys.go` file. -In the `x/oracle/types/keys.go` file, update the `Version` variable in the `const` block to the required version that the IBC module supports: +In the `x/consuming/types/keys.go` file, update the `Version` variable in the `const` block to the required version that the IBC module supports: ```go const ( - + // ... + // Version defines the current version the IBC module supports Version = "bandchain-1" + + // ... +) ``` ## Start your chain in development To run the chain from the `oracle` directory: -```shell +```bash ignite chain serve ``` @@ -134,7 +138,7 @@ When prompted, press Enter to accept the default source and target accounts. The command output confirms the relayer is successfully configured: -```bash +``` ? Source Account default ? Target Account default @@ -159,7 +163,7 @@ ignite relayer connect You can see the paths of the `oracle` port on the testnet and the `consuming` port on your local oracle module in the relayer connection status that is output to the terminal: -```bash +``` ------ Paths ------ @@ -179,7 +183,7 @@ Leave this terminal tab open so you can monitor the relayer. In another terminal tab, use the `oracled` binary to make a request transaction. Because BandChain has multiple scripts already deployed into the network, you can request any data using the BandChain script id. In this case, use script 37 for Coin Rates: -```shell +```bash # Coin Rates (script 37 into the testnet) oracled tx consuming coin-rates-data 37 4 3 --channel channel-0 --symbols "BTC,ETH,XRP,BCH" --multiplier 1000000 --fee-limit 30uband --prepare-gas 600000 --execute-gas 600000 --from alice --chain-id oracle ``` @@ -188,7 +192,7 @@ You can check the last request id that was returned by ack: ```bash oracled query consuming last-coin-rates-id -request_id: "101276" +# output: request_id: "101276" ``` Now you can check the data by request id to receive the data packet: @@ -203,7 +207,7 @@ You can scaffold multiples oracles by module. After scaffold, you must change th To create an example for the [gold price](https://laozi-testnet4.cosmoscan.io/oracle-script/33#bridge) bridge: -```shell +```bash ignite scaffold band goldPrice --module consuming ``` @@ -211,9 +215,9 @@ In the `proto/consuming/gold_price.proto` file: ```protobuf syntax = "proto3"; -package username.oracle.consuming; +package oracle.consuming; -option go_package = "github.com/username/oracle/x/consuming/types"; +option go_package = "oracle/x/consuming/types"; message GoldPriceCallData { uint64 multiplier = 2; @@ -232,13 +236,13 @@ package cli import ( "strconv" - "github.com/spf13/cobra" - - "github.com/username/oracle/x/consuming/types" "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" + "github.com/spf13/cobra" + + "oracle/x/consuming/types" ) // CmdRequestGoldPriceData creates and broadcast a GoldPrice request transaction @@ -341,20 +345,20 @@ func CmdRequestGoldPriceData() *cobra.Command { Make the request transaction: -```shell +```bash # Gold Price (script 33 into the testnet) oracled tx consuming gold-price-data 33 4 3 --channel channel-0 --multiplier 1000000 --fee-limit 30uband --prepare-gas 600000 --execute-gas 600000 --from alice --chain-id oracle ``` Check the last request id that was returned by ack: -```shell +```bash oracled query consuming last-gold-price-id -request_id: "101290" +# output: request_id: "101290" ``` Request the package data: -```shell +```bash oracled query consuming gold-price-result 101290 ``` diff --git a/docs/docs/kb/11-simapp.md b/docs/docs/kb/11-simapp.md index 13ade440af..c395265fce 100644 --- a/docs/docs/kb/11-simapp.md +++ b/docs/docs/kb/11-simapp.md @@ -26,15 +26,15 @@ For better randomizations, you can define a random seed. The simulation with the To create a new chain: -```shell -ignite scaffold chain github.com/username/mars +```bash +ignite scaffold chain mars ``` Review the empty `x/mars/simulation` folder and the `x/mars/module_simulation.go` file to see that a simulation is not registered. Now, scaffold a new message: -```shell +```bash ignite scaffold list user address balance:uint state ``` @@ -46,13 +46,13 @@ For this example, change the `defaultWeightMsgDeleteUser` to 30 and the `default Run the `BenchmarkSimulation` method into `app/simulation_test.go` to run simulation tests for all modules: -```shell +```bash ignite chain simulate ``` You can also define flags that are provided by the simulation. Flags are defined by the method `simapp.GetSimulatorFlags()`: -```shell +```bash ignite chain simulate -v --numBlocks 200 --blockSize 50 --seed 33 ``` @@ -60,7 +60,7 @@ Wait for the entire simulation to finish and check the result of the messages. The default `go test` command works to run the simulation: -```shell +```bash go test -v -benchmem -run=^$ -bench ^BenchmarkSimulation -cpuprofile cpu.out ./app -Commit=true ``` @@ -72,7 +72,7 @@ Use logic to avoid sending a message without returning an error. Return only `si Scaffolding a module with params automatically adds the module in the `module_simulaton.go` file: -```shell +```bash ignite s module earth --params channel:string,minLaunch:uint,maxLaunch:int ``` @@ -128,4 +128,4 @@ Now, register the keeper invariants into the `x/earth/module.go` file: func (am AppModule) RegisterInvariants(ir sdk.InvariantRegistry) { keeper.RegisterInvariants(ir, am.keeper) } -``` \ No newline at end of file +``` diff --git a/docs/docs/kb/12-params.md b/docs/docs/kb/12-params.md index e82134cc18..30a8010153 100644 --- a/docs/docs/kb/12-params.md +++ b/docs/docs/kb/12-params.md @@ -13,7 +13,7 @@ You can use Ignite CLI to scaffold parameters to be accessible for the module. P To scaffold a module with params using the `--params` flag: -```shell +```bash ignite scaffold module launch --params minLaunch:uint,maxLaunch:int ``` @@ -28,4 +28,4 @@ The params module supports all [built-in Ignite CLI types](./05-types.md). | string | string | Text type | | bool | bool | Boolean type | | int | int32 | Integer number | -| uint | uint64 | Unsigned integer number | \ No newline at end of file +| uint | uint64 | Unsigned integer number | diff --git a/docs/docs/migration/v0.18.md b/docs/docs/migration/v0.18.md index f57e148c30..8586bb920f 100644 --- a/docs/docs/migration/v0.18.md +++ b/docs/docs/migration/v0.18.md @@ -1,6 +1,6 @@ --- -sidebar_position: 4 -title: v0.18 +sidebar_position: 5 +title: v0.18.0 description: For chains that were scaffolded with Ignite CLI versions lower than v0.18, changes are required to use Ignite CLI v0.18. --- diff --git a/docs/docs/migration/v0.19.2.md b/docs/docs/migration/v0.19.2.md index 22b86bc65e..eab1264ad4 100644 --- a/docs/docs/migration/v0.19.2.md +++ b/docs/docs/migration/v0.19.2.md @@ -1,5 +1,5 @@ --- -sidebar_position: 3 +sidebar_position: 4 title: v0.19.2 description: For chains that were scaffolded with Ignite CLI versions lower than v0.19.2, changes are required to use Ignite CLI v0.19.2. --- diff --git a/docs/docs/migration/v0.20.0.md b/docs/docs/migration/v0.20.0.md index 76bb8efa97..970ec04ced 100644 --- a/docs/docs/migration/v0.20.0.md +++ b/docs/docs/migration/v0.20.0.md @@ -1,5 +1,5 @@ --- -sidebar_position: 2 +sidebar_position: 3 title: v0.20.0 description: For chains that were scaffolded with Ignite CLI versions lower than v0.20.0, changes are required to use Ignite CLI v0.20.0. --- diff --git a/docs/docs/migration/v0.22.0.md b/docs/docs/migration/v0.22.0.md index 3e33532796..8c3c5b5a8a 100644 --- a/docs/docs/migration/v0.22.0.md +++ b/docs/docs/migration/v0.22.0.md @@ -1,5 +1,5 @@ --- -sidebar_position: 1 +sidebar_position: 2 title: v0.22.0 description: For chains that were scaffolded with Ignite CLI versions lower than v0.22.0, changes are required to use Ignite CLI v0.22.0. --- diff --git a/docs/docs/migration/v0.22.2.md b/docs/docs/migration/v0.22.2.md index 00a4812585..d4bcd6ff88 100644 --- a/docs/docs/migration/v0.22.2.md +++ b/docs/docs/migration/v0.22.2.md @@ -1,5 +1,5 @@ --- -sidebar_position: 0 +sidebar_position: 1 title: v0.22.2 description: For chains that were scaffolded with Ignite CLI versions lower than v0.22.2, changes are required to use Ignite CLI v0.22.2. --- diff --git a/docs/docs/migration/v0.24.md b/docs/docs/migration/v0.24.md new file mode 100644 index 0000000000..1fb23bd7a6 --- /dev/null +++ b/docs/docs/migration/v0.24.md @@ -0,0 +1,246 @@ +--- +sidebar_position: 0 +title: v0.24.0 +description: For chains that were scaffolded with Ignite CLI versions lower than v0.24, changes are required to use Ignite CLI v0.24. +--- + +## Cosmos SDK v0.46 upgrade notes + +### Update dependencies + +Cosmos SDK v0.46 is compatible with the latest version of IBC Go v5. If you have a chain that is using an older version, update the dependencies in your project. + +Throughout the code you might see the following dependencies: + +```go +import ( + "github.com/cosmos/ibc-go/v3/..." +) +``` + +Where `v3` is the version of IBC Go and `...` are different IBC Go packages. + +To upgrade the version to `v5`, a global find-and-replace should work. Replace `cosmos/ibc-go/v3` (or whicherver version you're using) with `cosmos/ibc-go/v5` only in `*.go` files (to exclude unwated changes to files like `go,sum`). + +### Module keeper + +Add an import: + +```go +// x/{{moduleName}}/keeper/keeper.go + +import ( + //... + storetypes "github.com/cosmos/cosmos-sdk/store/types" +) +``` + +In the `Keeper` struct replace `sdk.StoreKey` with `storetypes.StoreKey`: + +```go +// x/{{moduleName}}/keeper/keeper.go + +type ( + Keeper struct { + cdc codec.BinaryCodec + storeKey storetypes.StoreKey + memKey storetypes.StoreKey + paramstore paramtypes.Subspace + } +) +``` + +In the argument list of the `NewKeeper` function definition: + +```go +// x/{{moduleName}}/keeper/keeper.go + +func NewKeeper( + //... + memKey storetypes.StoreKey, +) +``` + +Store type aliases have been removed from the Cosmos SDK `types` package and now have to be imported from `store/types`, instead. + + +In the `testutil/keeper/{{moduleName}}.go` replace `types.StoreKey` with `storetypes.StoreKey` and `types.MemStoreKey` with `storetypes.MemStoreKey`. + +```go +// testutil/keeper/{{moduleName}}.go + +func {{moduleName}}Keeper(t testing.TB) (*keeper.Keeper, sdk.Context) { + storeKey := sdk.NewKVStoreKey(storetypes.StoreKey) + memStoreKey := storetypes.NewMemoryStoreKey(storetypes.MemStoreKey) + //... +} +``` + +### Testutil network package + +Add the `require` package for testing and `pruningtypes` and remove `storetypes`: + +```go +// testutil/network/network.go + +import ( + pruningtypes "github.com/cosmos/cosmos-sdk/pruning/types" + "github.com/stretchr/testify/require" + // storetypes "github.com/cosmos/cosmos-sdk/store/types" <-- remove this line +) +``` + +In the `DefaultConfig` function replace `storetypes.NewPruningOptionsFromString` with `pruningtypes.NewPruningOptionsFromString` + +```go +// testutil/network/network.go + +func DefaultConfig() network.Config { + //... + return network.Config{ + AppConstructor: func(val network.Validator) servertypes.Application { + return app.New( + baseapp.SetPruning(pruningtypes.NewPruningOptionsFromString(val.AppConfig.Pruning)), + //... + ) + }, + //... +} +``` + +The `New` function in the Cosmos SDK `testutil/network` package now accepts [three arguments](https://github.com/cosmos/cosmos-sdk/blob/v0.46.0/testutil/network/network.go#L206) instead of two. + +In the `New` function add `t.TempDir()` as the second argument to `network.New()` and test that no error is thrown with `require.NoError(t, err)`: + +```go +// testutil/network/network.go + +func New(t *testing.T, configs ...network.Config) *network.Network { + //... + net, err := network.New(t, t.TempDir(), cfg) + require.NoError(t, err) + //... +} +``` + +### Testutil keeper package + +In the `{{moduleName}}Keeper` function make the following replacements: + +- `storetypes.StoreKey` → `types.StoreKey` +- `storetypes.MemStoreKey` → `types.MemStoreKey` +- `sdk.StoreTypeIAVL` → `storetypes.StoreTypeIAVL` +- `sdk.StoreTypeMemory` → `storetypes.StoreTypeMemory` + +```go +// testutil/keeper/{{moduleName}}.go + +func {{moduleName}}Keeper(t testing.TB) (*keeper.Keeper, sdk.Context) { + storeKey := sdk.NewKVStoreKey(types.StoreKey) + memStoreKey := storetypes.NewMemoryStoreKey(types.MemStoreKey) + //... + stateStore.MountStoreWithDB(storeKey, storetypes.StoreTypeIAVL, db) + stateStore.MountStoreWithDB(memStoreKey, storetypes.StoreTypeMemory, nil) + //... +} +``` + +### IBC modules + +If you have IBC-enabled modules (for example, added with `ignite scaffold module ... --ibc` or created manually), make the following changes to the source code. + +Cosmos SDK expects IBC modules to [implement the `IBCModule` interface](https://ibc.cosmos.network/main/ibc/apps/ibcmodule.html). Create a `IBCModule` type that embeds the module's keeper and a method that returns a new `IBCModule`. Methods in this file will be defined on this type. + +```go +// x/{{moduleName}}/module_ibc.go + +type IBCModule struct { + keeper keeper.Keeper +} + +func NewIBCModule(k keeper.Keeper) IBCModule { + return IBCModule{ + keeper: k, + } +} +``` + +Replace receivers for all methods in this file from `(am AppModule)` to `(im IBCModule)`. Replace all instances of `am.` with `im.` to fix the errors. + +`OnChanOpenInit` now returns to values: a `string` and an `error`: + +```go +// x/{{moduleName}}/module_ibc.go + +func (im IBCModule) OnChanOpenInit(...) (string, error) +``` + +Ensure that all return statements (five, in the default template) in `OnChanOpenInit` return two values. For example: + +```go +// x/{{moduleName}}/module_ibc.go + +func (im IBCModule) OnChanOpenInit(...) (string, error) { + //... + return "", sdkerrors.Wrapf(porttypes.ErrInvalidPort, "invalid port: %s, expected %s", portID, boundPort) + //... +} +``` + +Error acknowledgments returned from Transfer `OnRecvPacket` now include a deterministic ABCI code and error message. Remove the `.Error()` call: + +```go +// x/{{moduleName}}/module_ibc.go + +func (im IBCModule) OnRecvPacket(...) { + //... + if err := modulePacketData.Unmarshal(modulePacket.GetData()); err != nil { + // return channeltypes.NewErrorAcknowledgement(sdkerrors.Wrapf(sdkerrors.ErrUnknownRequest, "cannot unmarshal packet data: %s", err.Error()).Error()) + return channeltypes.NewErrorAcknowledgement(sdkerrors.Wrapf(sdkerrors.ErrUnknownRequest, "cannot unmarshal packet data: %s", err.Error())) + } + //... + default: + // errMsg := fmt.Sprintf("unrecognized %s packet type: %T", types.ModuleName, packet) + // return channeltypes.NewErrorAcknowledgement(errMsg) + err := fmt.Errorf("unrecognized %s packet type: %T", types.ModuleName, packet) + return channeltypes.NewErrorAcknowledgement(err) +} +``` + +After switching to using both `AppModule` and `IBCModule`, modifying the following line: + +```go +// x/{{moduleName}}/module.go +var ( + //... + _ porttypes.IBCModule = IBCModule{} // instead of "= AppModule{}" +) +``` + +### Main + +The `Execute` function in Cosmos SDK `server/cmd` package now accepts [three arguments](https://github.com/cosmos/cosmos-sdk/blob/v0.46.0/server/cmd/execute.go#L20) instead of two. + +```go +// cmd/{{projectName}}d/main.go + +func main() { + //... + if err := svrcmd.Execute(rootCmd, "", app.DefaultNodeHome); err != nil { + os.Exit(1) + } +} + +``` + +### Handler + +Cosmos SDK v0.46 no longer needs a `NewHandler` function that was used to handle messages and call appropriate keeper methods based on message types. Feel free to remove `x/{{moduleName}}/handler.go` file. + +Since there is no `NewHandler` now, modify the deprecated `Route` function to return `sdk.Route{}`: + +```go +// x/{{moduleName}}/module.go + +func (am AppModule) Route() sdk.Route { return sdk.Route{} } +``` diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index a81aa808c6..ff217d7cfd 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -197,6 +197,7 @@ const config = { prism: { theme: lightCodeTheme, darkTheme: darkCodeTheme, + additionalLanguages: ["protobuf", "go-module"], // https://prismjs.com/#supported-languages }, algolia: { appId: "VVETP7QCVE", diff --git a/go.mod b/go.mod index 52c13ae826..ca009427b2 100644 --- a/go.mod +++ b/go.mod @@ -3,245 +3,368 @@ module github.com/ignite/cli go 1.18 require ( - github.com/99designs/keyring v1.1.6 + cosmossdk.io/math v1.0.0-beta.3 + github.com/99designs/keyring v1.2.1 github.com/AlecAivazis/survey/v2 v2.1.1 + github.com/aws/smithy-go v1.8.0 github.com/blang/semver v3.5.1+incompatible github.com/briandowns/spinner v1.11.1 github.com/buger/jsonparser v1.1.1 github.com/cenkalti/backoff v2.2.1+incompatible github.com/charmbracelet/glow v1.4.0 - github.com/cosmos/cosmos-sdk v0.45.5 + github.com/cosmos/cosmos-sdk v0.46.1 github.com/cosmos/go-bip39 v1.0.0 - github.com/cosmos/ibc-go/v3 v3.0.1 - github.com/docker/docker v20.10.7+incompatible + github.com/cosmos/ibc-go/v5 v5.0.0-rc1 + github.com/docker/docker v20.10.17+incompatible github.com/emicklei/proto v1.9.0 github.com/fatih/color v1.13.0 github.com/ghodss/yaml v1.0.0 github.com/go-git/go-git/v5 v5.1.0 github.com/gobuffalo/genny v0.6.0 - github.com/gobuffalo/logger v1.0.3 - github.com/gobuffalo/packd v0.3.0 + github.com/gobuffalo/logger v1.0.6 + github.com/gobuffalo/packd v1.0.1 github.com/gobuffalo/plush v3.8.3+incompatible github.com/gobuffalo/plushgen v0.1.2 github.com/goccy/go-yaml v1.9.4 github.com/gogo/protobuf v1.3.3 + github.com/golangci/golangci-lint v1.49.0 github.com/google/go-github/v37 v37.0.0 - github.com/gookit/color v1.5.0 + github.com/gookit/color v1.5.1 github.com/gorilla/mux v1.8.0 github.com/gorilla/rpc v1.2.0 github.com/iancoleman/strcase v0.2.0 - github.com/imdario/mergo v0.3.12 + github.com/ignite/web v0.3.10 + github.com/imdario/mergo v0.3.13 github.com/jpillora/chisel v1.7.7 github.com/manifoldco/promptui v0.9.0 github.com/mattn/go-zglob v0.0.3 github.com/otiai10/copy v1.6.0 - github.com/pelletier/go-toml v1.9.4 + github.com/pelletier/go-toml v1.9.5 github.com/pkg/errors v0.9.1 github.com/radovskyb/watcher v1.0.7 github.com/rdegges/go-ipify v0.0.0-20150526035502-2d94a6a86c40 github.com/rs/cors v1.8.2 - 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.5.0 github.com/spf13/pflag v1.0.5 - github.com/stretchr/testify v1.7.1 + github.com/stretchr/testify v1.8.0 github.com/takuoki/gocase v1.0.0 github.com/tendermint/flutter/v2 v2.0.4 - github.com/tendermint/spn v0.2.1-0.20220708132853-26a17f03c072 - github.com/tendermint/tendermint v0.34.19 + github.com/tendermint/spn v0.2.1-0.20220907161743-aab4d3df1f2b + github.com/tendermint/tendermint v0.34.21 github.com/tendermint/tm-db v0.6.7 - github.com/tendermint/vue v0.3.5 - github.com/vektra/mockery/v2 v2.11.0 + github.com/vektra/mockery/v2 v2.14.0 go.etcd.io/bbolt v1.3.6 - golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3 - golang.org/x/sync v0.0.0-20210220032951-036812b2e83c - golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 + golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 + golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 + golang.org/x/term v0.0.0-20220722155259-a9ba230a4035 golang.org/x/text v0.3.7 - google.golang.org/grpc v1.46.2 - google.golang.org/protobuf v1.28.0 + golang.org/x/tools v0.1.12 + google.golang.org/grpc v1.49.0 + google.golang.org/protobuf v1.28.1 + gopkg.in/yaml.v2 v2.4.0 + mvdan.cc/gofumpt v0.3.1 ) require ( - filippo.io/edwards25519 v1.0.0-beta.2 // indirect + 4d63.com/gochecknoglobals v0.1.0 // indirect + cosmossdk.io/errors v1.0.0-beta.7 // indirect + filippo.io/edwards25519 v1.0.0-rc.1 // indirect + github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect + github.com/Antonboom/errname v0.1.7 // indirect + github.com/Antonboom/nilnil v0.1.1 // indirect + github.com/BurntSushi/toml v1.2.0 // indirect github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d // indirect - github.com/DataDog/zstd v1.4.5 // indirect - github.com/Microsoft/go-winio v0.5.1 // indirect - github.com/Microsoft/hcsshim v0.9.2 // indirect + github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24 // indirect + github.com/GaijinEntertainment/go-exhaustruct/v2 v2.3.0 // indirect + github.com/Masterminds/semver v1.5.0 // indirect + github.com/Microsoft/go-winio v0.5.2 // indirect + github.com/Microsoft/hcsshim v0.9.3 // indirect + github.com/OpenPeeDeeP/depguard v1.1.0 // indirect github.com/Workiva/go-datastructures v1.0.53 // indirect github.com/alecthomas/chroma v0.8.2 // indirect + github.com/alexkohler/prealloc v1.0.0 // indirect + github.com/alingse/asasalint v0.0.11 // indirect github.com/andrew-d/go-termutil v0.0.0-20150726205930-009166a695a2 // indirect - github.com/armon/go-metrics v0.3.10 // indirect + github.com/armon/go-metrics v0.4.0 // indirect github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 // indirect + github.com/ashanbrown/forbidigo v1.3.0 // indirect + github.com/ashanbrown/makezero v1.1.1 // indirect github.com/atotto/clipboard v0.1.2 // indirect github.com/aymerick/douceur v0.2.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bgentry/speakeasy v0.1.0 // indirect - github.com/btcsuite/btcd v0.22.0-beta // indirect + github.com/bkielbasa/cyclop v1.2.0 // indirect + github.com/blizzy78/varnamelen v0.8.0 // indirect + github.com/bombsimon/wsl/v3 v3.3.0 // indirect + github.com/breml/bidichk v0.2.3 // indirect + github.com/breml/errchkjson v0.3.0 // indirect + github.com/btcsuite/btcd v0.22.1 // indirect + github.com/butuzov/ireturn v0.1.1 // indirect github.com/calmh/randomart v1.1.0 // 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/charithe/durationcheck v0.0.9 // indirect github.com/charmbracelet/bubbles v0.7.6 // indirect github.com/charmbracelet/bubbletea v0.13.1 // indirect github.com/charmbracelet/charm v0.8.6 // indirect github.com/charmbracelet/glamour v0.2.1-0.20210311152407-2b8307dcb400 // indirect - github.com/chris-ramon/douceur v0.2.0 // indirect + github.com/chavacava/garif v0.0.0-20220630083739-93517212f375 // indirect github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e // indirect - github.com/coinbase/rosetta-sdk-go v0.7.0 // indirect + github.com/coinbase/rosetta-sdk-go v0.7.9 // indirect github.com/confio/ics23/go v0.7.0 // indirect github.com/containerd/cgroups v1.0.3 // indirect github.com/containerd/console v1.0.3 // indirect - github.com/containerd/containerd v1.6.2 // indirect + github.com/containerd/containerd v1.6.6 // indirect github.com/cosmos/btcutil v1.0.4 // indirect + github.com/cosmos/cosmos-proto v1.0.0-alpha7 // indirect github.com/cosmos/gorocksdb v1.2.0 // indirect - github.com/cosmos/iavl v0.17.3 // indirect + github.com/cosmos/iavl v0.19.1 // indirect github.com/cosmos/ledger-cosmos-go v0.11.1 // indirect github.com/cosmos/ledger-go v0.9.2 // indirect - github.com/cpuguy83/go-md2man/v2 v2.0.1 // indirect - github.com/danieljoos/wincred v1.0.2 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect + github.com/creachadair/taskgroup v0.3.2 // indirect + github.com/curioswitch/go-reassign v0.1.2 // indirect + github.com/daixiang0/gci v0.6.3 // indirect + github.com/danieljoos/wincred v1.1.2 // indirect github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964 // indirect github.com/davecgh/go-spew v1.1.1 // indirect + github.com/denis-tingaikin/go-header v0.4.3 // 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/dgrijalva/jwt-go v3.2.0+incompatible // indirect github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 // indirect - github.com/dlclark/regexp2 v1.2.0 // indirect + github.com/dlclark/regexp2 v1.4.1-0.20201116162257-a2a8dda75c91 // indirect github.com/docker/go-units v0.4.0 // indirect github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac // indirect - github.com/dvsekhvalnov/jose2go v0.0.0-20200901110807-248326c1351b // indirect + github.com/dvsekhvalnov/jose2go v1.5.0 // indirect github.com/emirpasic/gods v1.12.0 // indirect + github.com/esimonov/ifshort v1.0.4 // indirect + github.com/ettle/strcase v0.1.1 // indirect github.com/fatih/structs v1.1.0 // indirect + github.com/fatih/structtag v1.2.0 // indirect github.com/felixge/httpsnoop v1.0.1 // indirect - github.com/fsnotify/fsnotify v1.5.1 // indirect + github.com/firefart/nonamedreturns v1.0.4 // indirect + github.com/fsnotify/fsnotify v1.5.4 // indirect + github.com/fzipp/gocyclo v0.6.0 // indirect + github.com/go-critic/go-critic v0.6.4 // indirect github.com/go-git/gcfg v1.5.0 // indirect github.com/go-git/go-billy/v5 v5.0.0 // indirect github.com/go-kit/kit v0.12.0 // indirect - github.com/go-kit/log v0.2.0 // indirect + github.com/go-kit/log v0.2.1 // indirect github.com/go-logfmt/logfmt v0.5.1 // indirect + github.com/go-toolsmith/astcast v1.0.0 // indirect + github.com/go-toolsmith/astcopy v1.0.1 // indirect + github.com/go-toolsmith/astequal v1.0.2 // indirect + github.com/go-toolsmith/astfmt v1.0.0 // indirect + github.com/go-toolsmith/astp v1.0.0 // indirect + github.com/go-toolsmith/strparse v1.0.0 // indirect + github.com/go-toolsmith/typep v1.0.2 // indirect + github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b // indirect github.com/gobuffalo/envy v1.8.1 // indirect - github.com/gobuffalo/flect v0.2.0 // indirect - github.com/gobuffalo/github_flavored_markdown v1.1.0 // indirect - github.com/gobuffalo/helpers v0.5.0 // indirect - github.com/gobuffalo/tags v2.1.7+incompatible // indirect - github.com/gobuffalo/uuid v2.0.5+incompatible // indirect - github.com/gobuffalo/validate v2.0.3+incompatible // indirect + github.com/gobuffalo/flect v0.2.5 // indirect + github.com/gobuffalo/github_flavored_markdown v1.1.1 // indirect + github.com/gobuffalo/helpers v0.6.5 // indirect + github.com/gobuffalo/tags/v3 v3.1.3 // indirect + github.com/gobuffalo/validate/v3 v3.3.2 // indirect + github.com/gobwas/glob v0.2.3 // indirect github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect - github.com/gofrs/uuid v3.2.0+incompatible // indirect + github.com/gofrs/flock v0.8.1 // indirect + github.com/gofrs/uuid v4.2.0+incompatible // indirect github.com/gogo/gateway v1.1.0 // indirect + github.com/golang/glog v1.0.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.2 // indirect - github.com/golang/snappy v0.0.3 // indirect - github.com/google/btree v1.0.0 // indirect + github.com/golang/snappy v0.0.4 // indirect + github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2 // indirect + github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a // indirect + github.com/golangci/go-misc v0.0.0-20220329215616-d24fe342adfe // indirect + github.com/golangci/gofmt v0.0.0-20190930125516-244bba706f1a // indirect + github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0 // indirect + github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca // indirect + github.com/golangci/misspell v0.3.5 // indirect + github.com/golangci/revgrep v0.0.0-20220804021717-745bb2f7c2e6 // indirect + github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4 // indirect + github.com/google/btree v1.0.1 // indirect + github.com/google/go-cmp v0.5.8 // indirect github.com/google/go-querystring v1.0.0 // indirect github.com/google/orderedcode v0.0.1 // indirect - github.com/google/uuid v1.2.0 // indirect + github.com/google/uuid v1.3.0 // indirect + github.com/gordonklaus/ineffassign v0.0.0-20210914165742-4cc7213b9bc8 // indirect github.com/gorilla/css v1.0.0 // indirect github.com/gorilla/handlers v1.5.1 // indirect github.com/gorilla/websocket v1.5.0 // indirect + github.com/gostaticanalysis/analysisutil v0.7.1 // indirect + github.com/gostaticanalysis/comment v1.4.2 // indirect + github.com/gostaticanalysis/forcetypeassert v0.1.0 // indirect + github.com/gostaticanalysis/nilerr v0.1.1 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 // indirect github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c // indirect github.com/gtank/merlin v0.1.1 // indirect github.com/gtank/ristretto255 v0.1.2 // indirect + github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-immutable-radix v1.3.1 // indirect - github.com/hashicorp/golang-lru v0.5.4 // indirect + github.com/hashicorp/go-multierror v1.1.1 // indirect + github.com/hashicorp/go-version v1.6.0 // 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/hdevalence/ed25519consensus v0.0.0-20220222234857-c00d1f31bab3 // indirect + github.com/hexops/gotextdiff v1.0.3 // indirect + github.com/improbable-eng/grpc-web v0.15.0 // indirect github.com/inconshreveable/mousetrap v1.0.0 // indirect github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect + github.com/jgautheron/goconst v1.5.1 // indirect + github.com/jingyugao/rowserrcheck v1.1.1 // indirect + github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af // indirect github.com/jmhodges/levigo v1.0.0 // indirect github.com/joho/godotenv v1.3.0 // indirect github.com/jpillora/ansi v1.0.2 // indirect github.com/jpillora/backoff v1.0.0 // indirect github.com/jpillora/requestlog v1.0.0 // indirect github.com/jpillora/sizestr v1.0.0 // indirect + github.com/julz/importas v0.1.0 // indirect github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd // 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/kisielk/errcheck v1.6.2 // indirect + github.com/kisielk/gotool v1.0.0 // indirect + github.com/klauspost/compress v1.15.9 // indirect + github.com/kulti/thelper v0.6.3 // indirect + github.com/kunwardeep/paralleltest v1.0.6 // indirect + github.com/kyoh86/exportloopref v0.1.8 // indirect + github.com/ldez/gomoddirectives v0.2.3 // indirect + github.com/ldez/tagliatelle v0.3.1 // indirect + github.com/leonklingele/grouper v1.1.0 // indirect + github.com/lib/pq v1.10.6 // indirect + github.com/libp2p/go-buffer-pool v0.1.0 // indirect github.com/lucasb-eyer/go-colorful v1.2.0 // indirect - github.com/magiconair/properties v1.8.5 // indirect - github.com/mattn/go-colorable v0.1.12 // indirect - github.com/mattn/go-isatty v0.0.14 // indirect + github.com/lufeee/execinquery v1.2.1 // indirect + github.com/magiconair/properties v1.8.6 // indirect + github.com/maratori/testpackage v1.1.0 // indirect + github.com/matoous/godox v0.0.0-20210227103229-6504466cf951 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.16 // indirect github.com/mattn/go-runewidth v0.0.10 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect + github.com/mbilski/exhaustivestruct v1.2.0 // indirect github.com/meowgorithm/babyenv v1.3.1 // indirect + github.com/mgechev/revive v1.2.3 // indirect github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b // indirect - github.com/microcosm-cc/bluemonday v1.0.4 // indirect + github.com/microcosm-cc/bluemonday v1.0.16 // indirect github.com/mikesmitty/edkey v0.0.0-20170222072505-3356ea4e686a // indirect github.com/mimoo/StrobeGo v0.0.0-20181016162300-f8f6d4d2b643 // indirect github.com/minio/highwayhash v1.0.2 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect - github.com/mitchellh/mapstructure v1.4.3 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/moby/sys/mount v0.3.1 // indirect github.com/moby/sys/mountinfo v0.6.0 // indirect + github.com/moricho/tparallel v0.2.1 // indirect github.com/mtibben/percent v0.2.1 // indirect github.com/muesli/gitcha v0.2.0 // indirect github.com/muesli/go-app-paths v0.2.1 // indirect github.com/muesli/reflow v0.2.1-0.20210115123740-9e1d0d53df68 // indirect github.com/muesli/sasquatch v0.0.0-20200811221207-66979d92330a // indirect github.com/muesli/termenv v0.8.0 // indirect + github.com/nakabonne/nestif v0.3.1 // indirect + github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354 // indirect + github.com/nishanths/exhaustive v0.8.1 // indirect + github.com/nishanths/predeclared v0.2.2 // indirect github.com/olekukonko/tablewriter v0.0.5 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect - github.com/opencontainers/image-spec v1.0.2 // indirect - github.com/opencontainers/runc v1.1.0 // indirect + github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799 // indirect + github.com/opencontainers/runc v1.1.3 // indirect + github.com/pelletier/go-toml/v2 v2.0.2 // indirect github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5 // indirect + github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.12.1 // indirect + github.com/polyfloyd/go-errorlint v1.0.2 // indirect + github.com/prometheus/client_golang v1.12.2 // indirect github.com/prometheus/client_model v0.2.0 // indirect - github.com/prometheus/common v0.32.1 // indirect + github.com/prometheus/common v0.34.0 // indirect github.com/prometheus/procfs v0.7.3 // indirect + github.com/quasilyte/go-ruleguard v0.3.17 // indirect + github.com/quasilyte/gogrep v0.0.0-20220120141003-628d8b3623b5 // indirect + github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95 // indirect + github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 // indirect github.com/rakyll/statik v0.1.7 // indirect github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0 // indirect github.com/regen-network/cosmos-proto v0.3.1 // indirect github.com/rivo/uniseg v0.2.0 // indirect - github.com/rogpeppe/go-internal v1.4.0 // indirect - github.com/rs/zerolog v1.26.1 // indirect + github.com/rogpeppe/go-internal v1.8.1 // indirect + github.com/rs/zerolog v1.27.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect + github.com/ryancurrah/gomodguard v1.2.4 // indirect + github.com/ryanrolds/sqlclosecheck v0.3.0 // indirect github.com/sabhiram/go-gitignore v0.0.0-20180611051255-d3107576ba94 // indirect github.com/sahilm/fuzzy v0.1.0 // indirect + github.com/sanposhiho/wastedassign/v2 v2.0.6 // indirect github.com/sasha-s/go-deadlock v0.2.1-0.20190427202633-1595213edefa // indirect + github.com/sashamelentyev/interfacebloat v1.1.0 // indirect + github.com/sashamelentyev/usestdlibvars v1.13.0 // indirect + github.com/securego/gosec/v2 v2.13.1 // indirect github.com/segmentio/ksuid v1.0.3 // indirect - github.com/serenize/snaker v0.0.0-20171204205717-a683aaf2d516 // indirect - github.com/sergi/go-diff v1.1.0 // indirect - github.com/sirupsen/logrus v1.8.1 // indirect + github.com/sergi/go-diff v1.2.0 // indirect + github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c // indirect + github.com/sirupsen/logrus v1.9.0 // indirect + github.com/sivchari/containedctx v1.0.2 // indirect + github.com/sivchari/nosnakecase v1.7.0 // indirect + github.com/sivchari/tenv v1.7.0 // indirect + github.com/sonatard/noctx v0.0.1 // indirect github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d // indirect + github.com/sourcegraph/go-diff v0.6.1 // indirect github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e // indirect - github.com/spf13/afero v1.8.0 // indirect + github.com/spf13/afero v1.8.2 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect - github.com/spf13/viper v1.10.1 // indirect - github.com/stretchr/objx v0.2.0 // indirect - github.com/subosito/gotenv v1.2.0 // indirect - github.com/syndtr/goleveldb v1.0.1-0.20200815110645-5c35d600f0ca // indirect + github.com/spf13/viper v1.12.0 // indirect + github.com/ssgreg/nlreturn/v2 v2.2.1 // indirect + github.com/stbenjam/no-sprintf-host-port v0.1.1 // indirect + github.com/stretchr/objx v0.4.0 // indirect + github.com/subosito/gotenv v1.4.0 // indirect + github.com/sylvia7788/contextcheck v1.0.6 // indirect + github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 // indirect + github.com/tdakkota/asciicheck v0.1.1 // indirect github.com/tendermint/btcd v0.1.1 // indirect github.com/tendermint/crypto v0.0.0-20191022145703-50d29ede1e15 // indirect - github.com/tendermint/fundraising v0.3.1-0.20220613014523-03b4a2d4481a // indirect github.com/tendermint/go-amino v0.16.0 // indirect + github.com/tetafro/godot v1.4.11 // indirect + github.com/timakin/bodyclose v0.0.0-20210704033933-f49887972144 // indirect + github.com/timonwong/logrlint v0.1.0 // indirect + github.com/tomarrell/wrapcheck/v2 v2.6.2 // indirect github.com/tomasen/realip v0.0.0-20180522021738-f0c99a92ddce // indirect + github.com/tommy-muehle/go-mnd/v2 v2.5.0 // indirect + github.com/ultraware/funlen v0.0.3 // indirect + github.com/ultraware/whitespace v0.0.5 // indirect + github.com/uudashr/gocognit v1.0.6 // indirect github.com/xanzy/ssh-agent v0.2.1 // indirect github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 // indirect - github.com/yuin/goldmark v1.4.1 // indirect + github.com/yagipy/maintidx v1.0.0 // indirect + github.com/yeya24/promlinter v0.2.0 // indirect + github.com/yuin/goldmark v1.4.13 // indirect github.com/yuin/goldmark-emoji v1.0.1 // indirect - github.com/zondax/hid v0.9.0 // indirect + github.com/zondax/hid v0.9.1-0.20220302062450-5552068d2266 // indirect + gitlab.com/bosi/decorder v0.2.3 // indirect go.opencensus.io v0.23.0 // indirect - golang.org/x/crypto v0.0.0-20220112180741-5e0467b6c7ce // indirect - golang.org/x/net v0.0.0-20220225172249-27dd8689420f // indirect - golang.org/x/sys v0.0.0-20220315194320-039c03cc5b86 // indirect - golang.org/x/tools v0.1.10 // indirect - golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect - google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd // indirect - gopkg.in/ini.v1 v1.66.3 // indirect + go.uber.org/atomic v1.9.0 // indirect + go.uber.org/multierr v1.8.0 // indirect + go.uber.org/zap v1.21.0 // indirect + golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa // indirect + golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e // indirect + golang.org/x/exp/typeparams v0.0.0-20220613132600-b0d781184e0d // indirect + golang.org/x/net v0.0.0-20220726230323-06994584191e // indirect + golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab // indirect + golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f // indirect + google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc // indirect + gopkg.in/ini.v1 v1.66.6 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - gotest.tools/v3 v3.1.0 // indirect + honnef.co/go/tools v0.3.3 // indirect + mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed // indirect + mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b // indirect + mvdan.cc/unparam v0.0.0-20220706161116-678bad134442 // indirect nhooyr.io/websocket v1.8.6 // indirect + sigs.k8s.io/yaml v1.3.0 // indirect ) -replace ( - github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1 - github.com/keybase/go-keychain => github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 - google.golang.org/grpc => google.golang.org/grpc v1.33.2 -) +replace github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1 diff --git a/go.sum b/go.sum index 3788649191..4ffff42fd8 100644 --- a/go.sum +++ b/go.sum @@ -1,13 +1,17 @@ +4d63.com/gochecknoglobals v0.1.0 h1:zeZSRqj5yCg28tCkIV/z/lWbwvNm5qnKVS15PI8nhD0= +4d63.com/gochecknoglobals v0.1.0/go.mod h1:wfdC5ZjKSPr7CybKEcgJhUOgeAQW1+7WcyK8OvUilfo= bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= -bazil.org/fuse v0.0.0-20200407214033-5883e5a4b512/go.mod h1:FbcW6z/2VytnFDhZfumh8Ss8zxHE6qpMP5sHTRe0EaM= +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.43.0/go.mod h1:BOSR3VbTLkk6FDC/TcffxP4NF/FFBGA5ku+jvKOP7pg= cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.51.0/go.mod h1:hWtGJ6gnXH+KgDv+V0zFGDvpi07n3z8ZNj3T1RW0Gcw= cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= @@ -18,28 +22,19 @@ cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHOb cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= -cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= -cloud.google.com/go v0.98.0/go.mod h1:ua6Ush4NALrHk5QXDWnjvZHN93OuF0HfuEPq9I1X0cM= -cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= +cloud.google.com/go v0.102.0 h1:DAq3r8y4mDgyB/ZPJ9v/5VJNqjgJAxTn6ZYLlUywOu8= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/bigtable v1.2.0/go.mod h1:JcVAOl45lrTmQfLj7T6TxyMzIN/3FGGcFm+2xVAli2o= +cloud.google.com/go/compute v1.7.0 h1:v/k9Eueb8aAJ0vZuxKMrgm6kPhCLZU9HxFU+AFDs9Uk= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= -cloud.google.com/go/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= +cloud.google.com/go/iam v0.3.0 h1:exkAomrVUuzx9kWFI1wm3KI0uoDeUFPB4kKGzx6x+Gc= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= @@ -50,58 +45,59 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl 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= +cloud.google.com/go/storage v1.22.1 h1:F6IlQJZrZM++apn9V5/VfS3gbTUYg98PS3EMQAzqtfg= +collectd.org v0.3.0/go.mod h1:A/8DzQBkF6abtvrT2j/AU/4tiBgJWYyh0y/oB/4MlWE= +cosmossdk.io/errors v1.0.0-beta.7 h1:gypHW76pTQGVnHKo6QBkb4yFOJjC+sUGRc5Al3Odj1w= +cosmossdk.io/errors v1.0.0-beta.7/go.mod h1:mz6FQMJRku4bY7aqS/Gwfcmr/ue91roMEKAmDUDpBfE= +cosmossdk.io/math v1.0.0-beta.3 h1:TbZxSopz2LqjJ7aXYfn7nJSb8vNaBklW6BLpcei1qwM= +cosmossdk.io/math v1.0.0-beta.3/go.mod h1:3LYasri3Zna4XpbrTNdKsWmD5fHHkaNAod/mNT9XdE4= 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= +git.sr.ht/~sircmpwn/getopt v0.0.0-20191230200459-23622cc906b3/go.mod h1:wMEGFFFNuPos7vHmWXfszqImLppbc0wEhh6JBfJIUgw= +git.sr.ht/~sircmpwn/go-bare v0.0.0-20210406120253-ab86bc2846d9/go.mod h1:BVJwbDfVjCjoFiKrhkei6NdGcZYpkDkdyCdg1ukytRA= github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 h1:/vQbFIOMbk2FiG/kXiLl8BRyzTWDw7gX/Hz7Dd5eDMs= github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4/go.mod h1:hN7oaIRCjzsZ2dE+yG5k+rsdt3qcwykqK6HVGcKwsw4= -github.com/99designs/keyring v1.1.6 h1:kVDC2uCgVwecxCk+9zoCt2uEL6dt+dfVzMvGgnVcIuM= -github.com/99designs/keyring v1.1.6/go.mod h1:16e0ds7LGQQcT59QqkTg72Hh5ShM51Byv5PEmW6uoRU= +github.com/99designs/keyring v1.2.1 h1:tYLp1ULvO7i3fI5vE21ReQuj99QFSs7lGm0xWyJo87o= +github.com/99designs/keyring v1.2.1/go.mod h1:fc+wB5KTk9wQ9sDx0kFXB3A0MaeGHM9AwRStKOQ5vOA= github.com/AlecAivazis/survey/v2 v2.1.1 h1:LEMbHE0pLj75faaVEKClEX1TM4AJmmnOh9eimREzLWI= github.com/AlecAivazis/survey/v2 v2.1.1/go.mod h1:9FJRdMdDm8rnT+zHVbvQT2RTSTLq0Ttd6q3Vl2fahjk= -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/Antonboom/errname v0.1.7 h1:mBBDKvEYwPl4WFFNwec1CZO096G6vzK9vvDQzAwkako= +github.com/Antonboom/errname v0.1.7/go.mod h1:g0ONh16msHIPgJSGsecu1G/dcF2hlYR/0SddnIAGavU= +github.com/Antonboom/nilnil v0.1.1 h1:PHhrh5ANKFWRBh7TdYmyyq2gyT2lotnvFvvFbylF81Q= +github.com/Antonboom/nilnil v0.1.1/go.mod h1:L1jBqoWM7AOeTD+tSquifKSesRHs4ZdaxvZR+xdJEaI= github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go/sdk/azcore v0.19.0/go.mod h1:h6H6c8enJmmocHUbLiiGY6sx7f9i+X3m1CHdd5c6Rdw= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.11.0/go.mod h1:HcM1YX14R7CJcghJGOYCgdezslRSVzqwLf/q+4Y2r/0= -github.com/Azure/azure-sdk-for-go/sdk/internal v0.7.0/go.mod h1:yqy467j36fJxcRV2TzfVZ1pCb5vxm4BtZPUdYWe/Xo8= -github.com/Azure/azure-storage-blob-go v0.7.0/go.mod h1:f9YQKtsG1nMisotuTPpO0tjNuEjKRYAcJU8/ydDI++4= +github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1/go.mod h1:fBF9PQNqB8scdgpZ3ufzaLntG0AG7C1WjPMsiFOmfHM= +github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3/go.mod h1:KLF4gFr6DcKFZwSuH8w8yEK6DpFl3LP5rhdvAb7Yz5I= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0/go.mod h1:tPaiy8S5bQ+S5sOiDlINkp7+Ef339+Nz5L5XO+cnOHo= github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/Azure/go-autorest v10.8.1+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= github.com/Azure/go-autorest/autorest v0.11.1/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw= -github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= -github.com/Azure/go-autorest/autorest/adal v0.8.0/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc= github.com/Azure/go-autorest/autorest/adal v0.9.0/go.mod h1:/c022QCutn2P7uY+/oQWWNcK9YU+MH96NgK+jErpbcg= github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= -github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= -github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/toml v1.1.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/BurntSushi/toml v1.2.0 h1:Rt8g24XnyGTyglgET/PRUNlrUeu9F5L+7FilkXfZgs0= +github.com/BurntSushi/toml v1.2.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/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= +github.com/DATA-DOG/go-sqlmock v1.3.3/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/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/DataDog/zstd v1.5.0/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= +github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24 h1:sHglBQTwgx+rWPdisA5ynNEsoARbiCBOyGcJM4/OzsM= +github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs= +github.com/GaijinEntertainment/go-exhaustruct/v2 v2.3.0 h1:+r1rSv4gvYn0wmRjC8X7IAzX8QezqtFV9m0MUHFJgts= +github.com/GaijinEntertainment/go-exhaustruct/v2 v2.3.0/go.mod h1:b3g59n2Y+T5xmcxJL+UEG2f8cQploZm1mR/v6BW0mU0= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= +github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= +github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= @@ -110,9 +106,8 @@ github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugX github.com/Microsoft/go-winio v0.4.17-0.20210211115548-6eac466e5fa3/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= github.com/Microsoft/go-winio v0.4.17-0.20210324224401-5516f17a5958/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= github.com/Microsoft/go-winio v0.4.17/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -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/Microsoft/hcsshim v0.8.6/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= github.com/Microsoft/hcsshim v0.8.7-0.20190325164909-8abdbb8205e4/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= github.com/Microsoft/hcsshim v0.8.7/go.mod h1:OHd7sQqRFrYd3RmSgbgji+ctCwkbq2wbEYNSzOYtcBQ= @@ -121,17 +116,18 @@ github.com/Microsoft/hcsshim v0.8.14/go.mod h1:NtVKoYxQuTLx6gEq0L96c9Ju4JbRJ4nY2 github.com/Microsoft/hcsshim v0.8.15/go.mod h1:x38A4YbHbdxJtc0sF6oIz+RG0npwSCAvn69iY6URG00= github.com/Microsoft/hcsshim v0.8.16/go.mod h1:o5/SZqmR7x9JNKsW3pu+nqHm0MF8vbA+VxGOoXdC600= github.com/Microsoft/hcsshim v0.8.21/go.mod h1:+w2gRZ5ReXQhFOrvSQeNfhrYB/dg3oDwTOcER2fw4I4= -github.com/Microsoft/hcsshim v0.9.2 h1:wB06W5aYFfUB3IvootYAY2WnOmIdgPGfqSI6tufQNnY= -github.com/Microsoft/hcsshim v0.9.2/go.mod h1:7pLA8lDk46WKDWlVsENo92gC0XFa8rbKfyFRBqxEbCc= +github.com/Microsoft/hcsshim v0.9.3 h1:k371PzBuRrz2b+ebGuI2nVgVhgsVX60jMfSw80NECxo= +github.com/Microsoft/hcsshim v0.9.3/go.mod h1:7pLA8lDk46WKDWlVsENo92gC0XFa8rbKfyFRBqxEbCc= github.com/Microsoft/hcsshim/test v0.0.0-20201218223536-d3e5debf77da/go.mod h1:5hlzMzRKMLyo42nCZ9oml8AdTlq/0cvIaBv6tK1RehU= github.com/Microsoft/hcsshim/test v0.0.0-20210227013316-43a75bb4edd3/go.mod h1:mw7qgWloBUl75W/gVH3cQszUg1+gUITj7D6NY7ywVnY= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/Netflix/go-expect v0.0.0-20180615182759-c93bf25de8e8 h1:xzYJEypr/85nBpB11F9br+3HUrpgb+fcm5iADzXXYEw= github.com/Netflix/go-expect v0.0.0-20180615182759-c93bf25de8e8/go.mod h1:oX5x61PbNXchhh0oikYAH+4Pcfw5LKv21+Jnpr6r6Pc= 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 h1:pjK9nLPS1FwQYGGpPxoMYpe7qACHOhAWQMQzV71i49o= +github.com/OpenPeeDeeP/depguard v1.1.0/go.mod h1:JtAMzWkmFEzDPyAd+W0NHl1lvpQKTvT9jnRVsohBKpc= github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= @@ -140,16 +136,13 @@ github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:H 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.6.0/go.mod h1:0qHz5QP0GMX4pfmMA/zt5RgfNuXJrTP0zS7DqpHGGTw= github.com/VividCortex/gohistogram v1.0.0 h1:6+hBz+qvs0JOrrNhhmR7lFxo5sINxBCGXrdtl/UvroE= github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= -github.com/Workiva/go-datastructures v1.0.52/go.mod h1:Z+F2Rca0qCsVYDS8z7bAGm8f3UkzuWYS/oBZz5a7VVA= github.com/Workiva/go-datastructures v1.0.53 h1:J6Y/52yX10Xc5JjXmGtWoSSxs3mZnGSaq37xZZh7Yig= github.com/Workiva/go-datastructures v1.0.53/go.mod h1:1yZL+zfsztete+ePzZz/Zb1/t5BnDuE2Ya2MMGhzP6A= github.com/Zilliqa/gozilliqa-sdk v1.2.1-0.20201201074141-dd0ecada1be6/go.mod h1:eSYp2T6f0apnuW8TzhV3f6Aff2SE8Dwio++U4ha4yEM= -github.com/adlio/schema v1.1.13/go.mod h1:L5Z7tw+7lRK1Fnpi/LT/ooCP1elkXn0krMWBQHUhEDE= -github.com/adlio/schema v1.3.0 h1:eSVYLxYWbm/6ReZBCkLw4Fz7uqC+ZNoPvA39bOwi52A= -github.com/adlio/schema v1.3.0/go.mod h1:51QzxkpeFs6lRY11kPye26IaFPOV+HqEj01t5aXXKfs= +github.com/adlio/schema v1.3.3 h1:oBJn8I02PyTB466pZO1UZEn1TV5XLlifBSyMrmHl/1I= github.com/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= @@ -170,65 +163,96 @@ github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRF 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/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae/go.mod h1:CgnQgUtFrFz9mxFNtED3jI5tLDjKlOM+oUF/sTk6ps0= +github.com/alexkohler/prealloc v1.0.0 h1:Hbq0/3fJPQhNkN0dR95AVrr6R7tou91y0uHG5pOcUuw= +github.com/alexkohler/prealloc v1.0.0/go.mod h1:VetnK3dIgFBBKmg0YnD9F9x6Icjd+9cvfHR56wJVlKE= +github.com/alingse/asasalint v0.0.11 h1:SFwnQXJ49Kx/1GghOFz1XGqHYKp21Kq1nHad/0WQRnw= +github.com/alingse/asasalint v0.0.11/go.mod h1:nCaoMhw7a9kSJObvQyVzNTPBDbNpdocqrSP7t/cW5+I= github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/andrew-d/go-termutil v0.0.0-20150726205930-009166a695a2 h1:axBiC50cNZOs7ygH5BgQp4N+aYrZ2DNpWZ1KG3VOSOM= github.com/andrew-d/go-termutil v0.0.0-20150726205930-009166a695a2/go.mod h1:jnzFpU88PccN/tPPhCpnNU8mZphvKxYM9lLNkd8e+os= +github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/apache/arrow/go/arrow v0.0.0-20191024131854-af6fa24be0db/go.mod h1:VTxUBvSJ3s3eHAg65PNgrsn5BtqCRPdmyXh6rAfdxN0= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/aristanetworks/goarista v0.0.0-20170210015632-ea17b1a17847/go.mod h1:D/tb0zPVXnP7fmsLZjtdUhSsumbK/ij54UXjjVgMGxQ= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-metrics v0.3.9/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= -github.com/armon/go-metrics v0.3.10 h1:FR+drcQStOe+32sYyJYyZ7FIdgoGGBnwLl+flodp8Uo= -github.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= +github.com/armon/go-metrics v0.4.0 h1:yCQqn7dwca4ITXb+CbubHmedzaQYHhNhrEXLYUeEe8Q= +github.com/armon/go-metrics v0.4.0/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= +github.com/ashanbrown/forbidigo v1.3.0 h1:VkYIwb/xxdireGAdJNZoo24O4lmnEWkactplBlWTShc= +github.com/ashanbrown/forbidigo v1.3.0/go.mod h1:vVW7PEdqEFqapJe95xHkTfB1+XvZXBFg8t0sG2FIxmI= +github.com/ashanbrown/makezero v1.1.1 h1:iCQ87C0V0vSyO+M9E/FZYbu65auqH0lnsOkf5FcB28s= +github.com/ashanbrown/makezero v1.1.1/go.mod h1:i1bJLCRSCHOcOa9Y6MyF2FTfMZMFdHvxKHxgO5Z1axI= github.com/atotto/clipboard v0.1.2 h1:YZCtFu5Ie8qX2VmVTBnrqLSiU9XOWwqNRmdT3gIQzbY= github.com/atotto/clipboard v0.1.2/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI= github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= -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.40.45/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm+LY1U59Q= +github.com/aws/aws-sdk-go v1.40.45 h1:QN1nsY27ssD/JmW4s83qmSb+uL6DG4GmCDzjmJB4xUI= 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/aws-sdk-go-v2 v1.2.0/go.mod h1:zEQs02YRBw1DjK0PoJv3ygDYOFTre1ejlJWl8FwAuQo= +github.com/aws/aws-sdk-go-v2/config v1.1.1/go.mod h1:0XsVy9lBI/BCXm+2Tuvt39YmdHwS5unDQmxZOYe8F5Y= +github.com/aws/aws-sdk-go-v2/credentials v1.1.1/go.mod h1:mM2iIjwl7LULWtS6JCACyInboHirisUUdkBPoTHMOUo= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.0.2/go.mod h1:3hGg3PpiEjHnrkrlasTfxFqUsZ2GCk/fMUn4CbKgSkM= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.0.2/go.mod h1:45MfaXZ0cNbeuT0KQ1XJylq8A6+OpVV2E5kvY/Kq+u8= +github.com/aws/aws-sdk-go-v2/service/route53 v1.1.1/go.mod h1:rLiOUrPLW/Er5kRcQ7NkwbjlijluLsrIbu/iyl35RO4= +github.com/aws/aws-sdk-go-v2/service/sso v1.1.1/go.mod h1:SuZJxklHxLAXgLTc1iFXbEWkXs7QRTQpCLGaKIprQW0= +github.com/aws/aws-sdk-go-v2/service/sts v1.1.1/go.mod h1:Wi0EBZwiz/K44YliU0EKxqTCJGUfYTWXrrBwkq736bM= +github.com/aws/smithy-go v1.1.0/go.mod h1:EzMw8dbp/YJL4A5/sbhGddag+NPT7q084agLbB9LgIw= +github.com/aws/smithy-go v1.8.0 h1:AEwwwXQZtUwP5Mz506FeXXrKBe0jA8gVM+1gEcSRooc= github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= +github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas= github.com/bgentry/speakeasy v0.1.0 h1:ByYyxL9InA1OWqxJqqp2A5pYHUrCiAL6K3J+LKSsQkY= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= +github.com/bkielbasa/cyclop v1.2.0 h1:7Jmnh0yL2DjKfw28p86YTd/B4lRGcNuu12sKE35sM7A= +github.com/bkielbasa/cyclop v1.2.0/go.mod h1:qOI0yy6A7dYC4Zgsa72Ppm9kONl0RoIlPbzot9mhmeI= github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= +github.com/blizzy78/varnamelen v0.8.0 h1:oqSblyuQvFsW1hbBHh1zfwrKe3kcSj0rnXkKzsQ089M= +github.com/blizzy78/varnamelen v0.8.0/go.mod h1:V9TzQZ4fLJ1DSrjVDfl89H7aMnTvKkApdHeyESmyR7k= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= +github.com/bmizerany/pat v0.0.0-20170815010413-6226ea591a40/go.mod h1:8rLXio+WjiTceGBHIoTvn60HIbs7Hm7bcHjyrSqYB9c= +github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= +github.com/bombsimon/wsl/v3 v3.3.0 h1:Mka/+kRLoQJq7g2rggtgQsjuI/K5Efd87WX96EWFxjM= +github.com/bombsimon/wsl/v3 v3.3.0/go.mod h1:st10JtZYLE4D5sC7b8xV4zTKZwAQjCH/Hy2Pm1FNZIc= +github.com/breml/bidichk v0.2.3 h1:qe6ggxpTfA8E75hdjWPZ581sY3a2lnl0IRxLQFelECI= +github.com/breml/bidichk v0.2.3/go.mod h1:8u2C6DnAy0g2cEq+k/A2+tr9O1s+vHGxWn0LTc70T2A= +github.com/breml/errchkjson v0.3.0 h1:YdDqhfqMT+I1vIxPSas44P+9Z9HzJwCeAzjB8PxP1xw= +github.com/breml/errchkjson v0.3.0/go.mod h1:9Cogkyv9gcT8HREpzi3TiqBxCqDzo8awa92zSDFcofU= github.com/briandowns/spinner v1.11.1 h1:OixPqDEcX3juo5AjQZAnFPbeUA0jvkp2qzB5gOZJ/L0= github.com/briandowns/spinner v1.11.1/go.mod h1:QOuQk7x+EaDASo80FEXwlwiA+j/PPIcX3FScO+3/ZPQ= github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= -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.21.0-beta.0.20201114000516-e9c7a5ac6401/go.mod h1:Sv4JPQ3/M+teHz9Bo5jBpkNcP0x6r7rdihlNL/7tTAs= +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/btcec/v2 v2.1.2/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= +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= @@ -249,21 +273,27 @@ github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx2 github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= +github.com/butuzov/ireturn v0.1.1 h1:QvrO2QF2+/Cx1WA/vETCIYBKtRjc30vesdoPUNo1EbY= +github.com/butuzov/ireturn v0.1.1/go.mod h1:Wh6Zl3IMtTpaIKbmwzqi6olnM9ptYQxxVacMsOEFPoc= +github.com/bwesterb/go-ristretto v1.2.0/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= +github.com/c-bata/go-prompt v0.2.2/go.mod h1:VzqtzE2ksDBcdln8G7mk2RX9QyGjH+OVqOCSiVIqS34= github.com/calmh/randomart v1.1.0 h1:evl+iwc10LXtHdMZhzLxmsCQVmWnkXs44SbC6Uk0Il8= github.com/calmh/randomart v1.1.0/go.mod h1:DQUbPVyP+7PAs21w/AnfMKG5NioxS3TbZ2F9MSK/jFM= 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= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/charithe/durationcheck v0.0.9 h1:mPP4ucLrf/rKZiIG/a9IPXHGlh8p4CzgpyTy6EEutYk= +github.com/charithe/durationcheck v0.0.9/go.mod h1:SSbRIBVfMjCi/kEB6K65XEA83D6prSM8ap1UCpNKtgg= github.com/charmbracelet/bubbles v0.7.5/go.mod h1:IRTORFvhEI6OUH7WhN2Ks8Z8miNGimk1BE6cmHijOkM= github.com/charmbracelet/bubbles v0.7.6 h1:SCAp4ZEUf2tBNEsufo+Xxxu2dvbFhYSDPrX45toQZrM= github.com/charmbracelet/bubbles v0.7.6/go.mod h1:0D4XRYK0tjo8JMvflz1obpVcOikNZSG46SFauoZj22s= @@ -276,10 +306,11 @@ github.com/charmbracelet/glamour v0.2.1-0.20210311152407-2b8307dcb400 h1:vj8zwTs github.com/charmbracelet/glamour v0.2.1-0.20210311152407-2b8307dcb400/go.mod h1:VO5pQW96Vj3qJy9ikwb5Zo8lcvt2ZDFoE3UXl+SduQs= github.com/charmbracelet/glow v1.4.0 h1:pqOa+FsrjLb9aQXcX7xEj0OFZParmR0JEwhdSf1AVHc= github.com/charmbracelet/glow v1.4.0/go.mod h1:PmzpVs6fvXd60PmqRkbKtSz412SfDFPD3XbraI1hnJQ= +github.com/chavacava/garif v0.0.0-20220630083739-93517212f375 h1:E7LT642ysztPWE0dfz43cWOvMiF42DyTRC+eZIaO4yI= +github.com/chavacava/garif v0.0.0-20220630083739-93517212f375/go.mod h1:4m1Rv7xfuwWPNKXlThldNuJvutYM6J95wNuuVmn55To= github.com/checkpoint-restore/go-criu/v4 v4.1.0/go.mod h1:xUQBLp4RLc5zJtWY++yjOoMoB5lihDt7fai+75m+rGw= 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/chris-ramon/douceur v0.2.0 h1:IDMEdxlEUUBYBKE4z/mJnFyVXox+MjuEVDJNN27glkU= github.com/chris-ramon/douceur v0.2.0/go.mod h1:wDW5xjJdeoMm1mRt4sD4c/LbF/mWdEpRXQKjTR8nIBE= github.com/chzyer/logex v1.1.10 h1:Swpa1K6QvQznwJRcfTfQJmTE72DqScAa40E+fbHEXEE= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= @@ -295,21 +326,25 @@ github.com/cilium/ebpf v0.6.2/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJ github.com/cilium/ebpf v0.7.0/go.mod h1:/oI2+1shJiTGAMgl6/RgJr36Eo1jzrRcAWbcXO2usCA= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= -github.com/clbanning/mxj v1.8.4/go.mod h1:BVjHeAH+rl9rs6f+QIpeRl0tfu10SXn1pUSa5PVGJng= github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= -github.com/cloudflare/cloudflare-go v0.10.2-0.20190916151808-a80f83b9add9/go.mod h1:1MxXX1Ux4x6mqPmjkUgTP1CdXIBXKX7T+Jk9Gxrmx+U= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cloudflare/cloudflare-go v0.14.0/go.mod h1:EnwdgGMaFOruiPZRFSgn+TsQ3hQ7C/YWzIGLeu5c304= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211130200136-a8f946100490/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cockroachdb/apd/v2 v2.0.2 h1:weh8u7Cneje73dDh+2tEVLUvyBc89iwepWCD8b8034E= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= -github.com/coinbase/rosetta-sdk-go v0.7.0 h1:lmTO/JEpCvZgpbkOITL95rA80CPKb5CtMzLaqF2mCNg= -github.com/coinbase/rosetta-sdk-go v0.7.0/go.mod h1:7nD3oBPIiHqhRprqvMgPoGxe/nyq3yftRmpsy29coWE= -github.com/confio/ics23/go v0.6.6/go.mod h1:E45NqnlpxGnpfTWL/xauN7MRwEE28T4Dd4uraToOaKg= +github.com/coinbase/kryptology v1.8.0/go.mod h1:RYXOAPdzOGUe3qlSFkMGn58i3xUA8hmxYHksuq+8ciI= +github.com/coinbase/rosetta-sdk-go v0.7.9 h1:lqllBjMnazTjIqYrOGv8h8jxjg9+hJazIGZr9ZvoCcA= +github.com/coinbase/rosetta-sdk-go v0.7.9/go.mod h1:0/knutI7XGVqXmmH4OQD8OckFrbQ8yMsUZTG7FXCR2M= 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/consensys/bavard v0.1.8-0.20210406032232-f3452dc9b572/go.mod h1:Bpd0/3mZuaj6Sj+PqrmIquiOKy397AKGThQPaGzNXAQ= +github.com/consensys/bavard v0.1.8-0.20210915155054-088da2f7f54a/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= +github.com/consensys/gnark-crypto v0.4.1-0.20210426202927-39ac3d4b3f1f/go.mod h1:815PAHg3wvysy0SyIqanF8gZ0Y1wjk/hrDHD/iT88+Q= +github.com/consensys/gnark-crypto v0.5.3/go.mod h1:hOdPlWQV1gDLp7faZVeg8Y0iEPFaOUnCc4XeCCk96p0= github.com/containerd/aufs v0.0.0-20200908144142-dab0cbea06f4/go.mod h1:nukgQABAEopAHvB6j7cnP5zJ+/3aVcE7hCYqvIwAHyE= github.com/containerd/aufs v0.0.0-20201003224125-76a6863f2989/go.mod h1:AkGGQs9NM2vtYHaUen+NljV0/baGCAPELGm2q9ZXpWU= github.com/containerd/aufs v0.0.0-20210316121734-20793ff83c97/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= @@ -347,18 +382,16 @@ github.com/containerd/containerd v1.5.0-beta.4/go.mod h1:GmdgZd2zA2GYIBZ0w09Zvgq github.com/containerd/containerd v1.5.0-rc.0/go.mod h1:V/IXoMqNGgBlabz3tHD2TWDoTJseu1FGOKuoA4nNb2s= github.com/containerd/containerd v1.5.1/go.mod h1:0DOxVqwDy2iZvrZp2JUx/E+hS0UNTVn7dJnIOwtYR4g= github.com/containerd/containerd v1.5.7/go.mod h1:gyvv6+ugqY25TiXxcZC3L5yOeYgEw0QMhscqVp1AR9c= -github.com/containerd/containerd v1.6.2 h1:pcaPUGbYW8kBw6OgIZwIVIeEhdWVrBzsoCfVJ5BjrLU= -github.com/containerd/containerd v1.6.2/go.mod h1:sidY30/InSE1j2vdD1ihtKoJz+lWdaXMdiAeIupaf+s= +github.com/containerd/containerd v1.6.6 h1:xJNPhbrmz8xAMDNoVjHy9YHtWwEQNS+CDkcIRh7t8Y0= +github.com/containerd/containerd v1.6.6/go.mod h1:ZoP1geJldzCVY3Tonoz7b1IXk8rIX0Nltt5QE4OMNk0= github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= github.com/containerd/continuity v0.0.0-20190815185530-f2a389ac0a02/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= -github.com/containerd/continuity v0.0.0-20190827140505-75bee3e2ccb6/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= github.com/containerd/continuity v0.0.0-20191127005431-f65d91d395eb/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= github.com/containerd/continuity v0.0.0-20200710164510-efbc4488d8fe/go.mod h1:cECdGN1O8G9bgKTlLhuPJimka6Xb/Gg7vYzCTNVxhvo= github.com/containerd/continuity v0.0.0-20201208142359-180525291bb7/go.mod h1:kR3BEg7bDFaEddKm54WSmrol1fKWDU1nKYkgrcgZT7Y= github.com/containerd/continuity v0.0.0-20210208174643-50096c924a4e/go.mod h1:EXlVlkqNba9rJe3j7w3Xa924itAMLgZH4UD/Q4PExuQ= github.com/containerd/continuity v0.1.0/go.mod h1:ICJu0PwR54nI0yPEnJ6jcS+J7CZAUXrLh8lPo2knzsM= -github.com/containerd/continuity v0.2.1/go.mod h1:wCYX+dRqZdImhGucXOqTQn05AhX6EUDaGEMUzTFFpLg= -github.com/containerd/continuity v0.2.2 h1:QSqfxcn8c+12slxwu00AtzXrsami0MJb/MQs9lOLHLA= +github.com/containerd/continuity v0.3.0 h1:nisirsYROK15TAMVukJOUyGJjz4BNQJBVsNvAXZJ/eg= github.com/containerd/fifo v0.0.0-20180307165137-3d5202aec260/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= github.com/containerd/fifo v0.0.0-20200410184934-f15a3290365b/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= @@ -418,21 +451,24 @@ github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7 github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/coreos/go-systemd/v22 v22.3.3-0.20220203105225-a9a7ef127534/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cosmos/btcutil v1.0.4 h1:n7C2ngKXo7UC9gNyMNLbzqz7Asuf+7Qv4gnX/rOdQ44= github.com/cosmos/btcutil v1.0.4/go.mod h1:Ffqc8Hn6TJUdDgHBwIZLtrLQC1KdJ9jGJl/TvgUaxbU= -github.com/cosmos/cosmos-sdk v0.45.5 h1:GVrZM+lss6y626Pq6loxh/3KLRgK/J6/alTkcKkYmGU= -github.com/cosmos/cosmos-sdk v0.45.5/go.mod h1:WOqtDxN3eCCmnYLVla10xG7lEXkFjpTaqm2a2WasgCc= +github.com/cosmos/cosmos-proto v1.0.0-alpha7 h1:yqYUOHF2jopwZh4dVQp3xgqwftE5/2hkrwIV6vkUbO0= +github.com/cosmos/cosmos-proto v1.0.0-alpha7/go.mod h1:dosO4pSAbJF8zWCzCoTWP7nNsjcvSUBQmniFxDg5daw= +github.com/cosmos/cosmos-sdk v0.46.1 h1:7vUZXMyrmEb4xtBYpz1TobtrcnpgiZTi+tVjc0XWB4o= +github.com/cosmos/cosmos-sdk v0.46.1/go.mod h1:2+o8Qw8qnE02V+lQVZDJFQ8tri/hsiA5GmWaPERqVa0= 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.1 h1:JMQhAHYt/chIm240kIXeFIJfQr8m6FR3sE/eDqbpxWA= -github.com/cosmos/ibc-go/v3 v3.0.1/go.mod h1:DbOlOa4yKumaHGKApKkJN90L88PCjSD9ZBdAfL9tT40= +github.com/cosmos/iavl v0.19.1 h1:3gaq9b6SjiB0KBTygRnAvEGml2pQlu1TH8uma5g63Ys= +github.com/cosmos/iavl v0.19.1/go.mod h1:X9PKD3J0iFxdmgNLa7b2LYWdsGd90ToV5cAONApkEPw= +github.com/cosmos/ibc-go/v5 v5.0.0-rc1 h1:9cgpYmHh2jodB/t3LwB/pYA2sG9rdKB9cmXP0D5M0Fs= +github.com/cosmos/ibc-go/v5 v5.0.0-rc1/go.mod h1:Wqsguq98Iuns8tgTv8+xaGYbC+Q8zJfbpjzT6IgMJbs= github.com/cosmos/ledger-cosmos-go v0.11.1 h1:9JIYsGnXP613pb2vPjFeMMjBI5lEDsEaF6oYorTy6J4= github.com/cosmos/ledger-cosmos-go v0.11.1/go.mod h1:J8//BsAGTo3OC/vDLjMRFLW6q0WAaXvHnVc7ZmE8iUY= github.com/cosmos/ledger-go v0.9.2 h1:Nnao/dLwaVTk1Q5U9THldpUMMXU94BOTWPddSmVB6pI= @@ -440,45 +476,63 @@ github.com/cosmos/ledger-go v0.9.2/go.mod h1:oZJ2hHAZROdlHiwTg4t7kP+GKIIkBT+o6c9 github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.1 h1:r/myEWzV9lfsM1tFLgDyu0atFtJ1fXn261LKYj/3DxU= -github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= +github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/creachadair/taskgroup v0.3.2 h1:zlfutDS+5XG40AOxcHDSThxKzns8Tnr9jnr6VqkYlkM= +github.com/creachadair/taskgroup v0.3.2/go.mod h1:wieWwecHVzsidg2CsUnFinW1faVN4+kq+TDlRJQ0Wbk= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/cristalhq/acmd v0.7.0/go.mod h1:LG5oa43pE/BbxtfMoImHCQN++0Su7dzipdgBjMCBVDQ= +github.com/curioswitch/go-reassign v0.1.2 h1:ekM07+z+VFT560Exz4mTv0/s1yU9gem6CJc/tlYpkmI= +github.com/curioswitch/go-reassign v0.1.2/go.mod h1:bFJIHgtTM3hRm2sKXSPkbwNjSFyGURQXyn4IXD2qwfQ= +github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= 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/d2g/dhcp4 v0.0.0-20170904100407-a1d1b6c41b1c/go.mod h1:Ct2BUK8SB0YC1SMSibvLzxjeJLnrYEVLULFNiHY9YfQ= github.com/d2g/dhcp4client v1.0.0/go.mod h1:j0hNfjhrt2SxUOw55nL0ATM/z4Yt3t2Kd1mW34z5W5s= github.com/d2g/dhcp4server v0.0.0-20181031114812-7d4a0a7f59a5/go.mod h1:Eo87+Kg/IX2hfWJfwxMzLyuSZyxSoAug2nGa1G2QAi8= github.com/d2g/hardwareaddr v0.0.0-20190221164911-e7d9fbe030e4/go.mod h1:bMl4RjIciD2oAxI7DmWRx6gbeqrkoLqv3MV0vzNad+I= -github.com/danieljoos/wincred v1.0.2 h1:zf4bhty2iLuwgjgpraD2E9UbvO+fe54XXGJbOwe23fU= -github.com/danieljoos/wincred v1.0.2/go.mod h1:SnuYRW9lp1oJrZX/dXJqr0cPK5gYXqx3EJbmjhLdK9U= +github.com/daixiang0/gci v0.6.3 h1:wUAqXChk8HbwXn8AfxD9DYSCp9Bpz1L3e6Q4Roe+q9E= +github.com/daixiang0/gci v0.6.3/go.mod h1:EpVfrztufwVgQRXjnX4zuNinEpLj5OmMjtu/+MB0V0c= +github.com/danieljoos/wincred v1.1.2 h1:QLdCxFs1/Yl4zduvBdcHB8goaYk9RARS2SgLLRuAyr0= +github.com/danieljoos/wincred v1.1.2/go.mod h1:GijpziifJoIBfYh+S7BbkdUTU4LfM+QnGqR5Vl2tAx0= github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964 h1:y5HC9v93H5EPKqaS1UYVg1uYah5Xf51mBfIoWehClUQ= github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964/go.mod h1:Xd9hchkHSWYkEqJwUGisez3G1QY8Ryz0sdWrLPMGjLk= +github.com/dave/jennifer v1.2.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhrIygKg= 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/deckarep/golang-set v1.8.0/go.mod h1:5nI87KwE7wgsBU1F4GKAw2Qod7p5kyS383rP6+o6qqo= +github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= -github.com/denisenkom/go-mssqldb v0.12.0/go.mod h1:iiK0YP1ZeepvmBQk/QpLEhhTNJgfzrpArPY/aFvc9yU= +github.com/deepmap/oapi-codegen v1.6.0/go.mod h1:ryDa9AgbELGeB+YEXE1dR53yAjHwFvE9iAUlWl9Al3M= +github.com/deepmap/oapi-codegen v1.8.2/go.mod h1:YLgSKSDv/bZQB7N4ws6luhozi3cEdRktEqrX88CvjIw= +github.com/denis-tingaikin/go-header v0.4.3 h1:tEaZKAlqql6SKCY++utLmkPLd6K8IBM20Ha7UVm+mtU= +github.com/denis-tingaikin/go-header v0.4.3/go.mod h1:0wOCWuN71D5qIgE2nz9KrKmuYBAC2Mra5RassOIQ2/c= github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= 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 v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-bitstream v0.0.0-20180413035011-3522498ce2c8/go.mod h1:VMaSuZ+SZcx/wljOQKvp5srsbCiKDEb6K2wC4+PiBmQ= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y= github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/dlclark/regexp2 v1.2.0 h1:8sAhBGEM0dRWogWqWyQeIJnxjWO6oIjl8FKqREDsGfk= github.com/dlclark/regexp2 v1.2.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= +github.com/dlclark/regexp2 v1.4.1-0.20201116162257-a2a8dda75c91 h1:Izz0+t1Z5nI16/II7vuEo/nHjodOg0p7+OiDpjX5t1E= +github.com/dlclark/regexp2 v1.4.1-0.20201116162257-a2a8dda75c91/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= +github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= github.com/docker/cli v0.0.0-20191017083524-a8ff7f821017/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/distribution v0.0.0-20190905152932-14b96e55d84c/go.mod h1:0+TTO4EOBfRPhZXAeF1Vu+W3hHZ8eLp8PgKVZlcvtFY= @@ -486,8 +540,8 @@ github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/docker v1.4.2-0.20180625184442-8e610b2b55bf/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker v1.4.2-0.20190924003213-a8608b5b67c7/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v20.10.7+incompatible h1:Z6O9Nhsjv+ayUEeI1IojKbYcsGdgYSNqxe1s2MYzUhQ= -github.com/docker/docker v20.10.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v20.10.17+incompatible h1:JYCuMrWaVNophQTOrMMoSwudOVEfcegoZZrleKc1xwE= +github.com/docker/docker v20.10.17+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= @@ -500,18 +554,18 @@ github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDD github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/dop251/goja v0.0.0-20200721192441-a695b0cdd498/go.mod h1:Mw6PkjjMXWbTj+nnj4s3QPXq1jaT0s5pC0iFD4+BOAA= +github.com/dop251/goja v0.0.0-20211011172007-d99e4b8cbf48/go.mod h1:R9ET47fwRVRPZnOGvHxxhuZcbrMCuiqOz3Rlrh4KSnk= +github.com/dop251/goja_nodejs v0.0.0-20210225215109-d91c329300e7/go.mod h1:hn7BA7c8pLvoGndExHudxTDKZ84Pyvv+90pbBjbTz0Y= github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac h1:opbrjaN/L8gg6Xh5D04Tem+8xVcz6ajZlGCs49mQgyg= github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/dvsekhvalnov/jose2go v0.0.0-20200901110807-248326c1351b h1:HBah4D48ypg3J7Np4N+HY/ZR76fx3HEUGxDU6Uk39oQ= -github.com/dvsekhvalnov/jose2go v0.0.0-20200901110807-248326c1351b/go.mod h1:7BvyPhdbLxMXIYTFPLsyJRFMsKmOZnQmzh6Gb+uquuM= -github.com/dvyukov/go-fuzz v0.0.0-20200318091601-be3528f3a813/go.mod h1:11Gm+ccJnvAhCNLlf5+cS9KjtbaD5I5zaZpFMsTHWTw= +github.com/dvsekhvalnov/jose2go v1.5.0 h1:3j8ya4Z4kMCwT5nXIKFSV84YS+HdqSSO0VsTQxaLAeM= +github.com/dvsekhvalnov/jose2go v1.5.0/go.mod h1:QsHjhyTlD/lAVqn/NSbVZmSCGeDehTB/mPZadG+mhXU= github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= -github.com/edsrzf/mmap-go v0.0.0-20160512033002-935e0e8a636c/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= +github.com/eclipse/paho.mqtt.golang v1.2.0/go.mod h1:H9keYFcgq3Qr5OUJm/JZI/i6U7joQ8SYLhZwfeOo6Ts= github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= @@ -520,46 +574,55 @@ github.com/emicklei/proto v1.9.0 h1:l0QiNT6Qs7Yj0Mb4X6dnWBQer4ebei2BFcgQLbGqUDc= github.com/emicklei/proto v1.9.0/go.mod h1:rn1FgRS/FANiZdD2djyH7TMA9jdRDcYQ9IEN9yvjX0A= github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg= github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= +github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.10.1/go.mod h1:AY7fTTXNdv/aJ2O5jwpxAPOWUZ7hQAEvzN5Pf27BkQQ= +github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= 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/ethereum/go-ethereum v1.9.25/go.mod h1:vMkFiYLHI4tgPw4k2j4MHKoovchFE8plZ0M9VMk4/oM= +github.com/esimonov/ifshort v1.0.4 h1:6SID4yGWfRae/M7hkVDVVyppy8q/v9OuxNdmjLQStBA= +github.com/esimonov/ifshort v1.0.4/go.mod h1:Pe8zjlRrJ80+q2CxHLfEOfTwxCZ4O+MuhcHcfgNWTk0= +github.com/ethereum/go-ethereum v1.10.17/go.mod h1:Lt5WzjM07XlXc95YzrhosmR4J9Ahd6X2wyEV2SvGhk0= +github.com/ettle/strcase v0.1.1 h1:htFueZyVeE1XNnMEfbqp5r67qAN/4r6ya1ysq8Q+Zcw= +github.com/ettle/strcase v0.1.1/go.mod h1:hzDLsPC7/lwKyBOywSHEP89nt2pDgdy+No1NBA9o9VY= github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/facebookgo/ensure v0.0.0-20160127193407-b4ab57deab51/go.mod h1:Yg+htXGokKKdzcwhuNDwVvN+uBxDGXJ7G/VN1d8fa64= github.com/facebookgo/ensure v0.0.0-20200202191622-63f1cf65ac4c h1:8ISkoahWXwZR41ois5lSJBSVw4D0OV19Ht/JSTzvSv0= github.com/facebookgo/stack v0.0.0-20160209184415-751773369052 h1:JWuenKqqX8nojtoVVWjGfOF9635RETekkoH6Cc9SX0A= -github.com/facebookgo/stack v0.0.0-20160209184415-751773369052/go.mod h1:UbMTZqLaRiH3MsBH8va0n7s1pQYcu3uTb8G4tygF4Zg= -github.com/facebookgo/subset v0.0.0-20150612182917-8dac2c3c4870/go.mod h1:5tD+neXqOorC30/tWg0LCSkrqj/AR6gu8yY8/fpw1q0= github.com/facebookgo/subset v0.0.0-20200203212716-c811ad88dec4 h1:7HZCaLC5+BZpmbhCOZJ293Lz68O7PYrF2EzeiFMwCLk= -github.com/fatih/color v1.3.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= -github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= +github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4= +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/fjl/memsize v0.0.0-20180418122429-ca190fb6ffbc/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= +github.com/firefart/nonamedreturns v1.0.4 h1:abzI1p7mAEPYuR4A+VLKn4eNDOycjYo2phmY9sfv40Y= +github.com/firefart/nonamedreturns v1.0.4/go.mod h1:TDhe/tjI1BXo48CmYbUduTV7BdIga8MAO/xbKdcVsGI= +github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= -github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= -github.com/franela/goblin v0.0.0-20210519012713-85d372ac71e2/go.mod h1:VzmDKDJVZI3aJmnRI9VjAn9nJ8qPPsN1fqzr9dqInIo= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= +github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI= -github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= +github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= +github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA= +github.com/fzipp/gocyclo v0.6.0 h1:lsblElZG7d3ALtGMx9fmxeTKZaLLpU8mET09yN4BBLo= +github.com/fzipp/gocyclo v0.6.0/go.mod h1:rXPyn8fnlpa0R2csP/31uerbiVBugk5whMdlyaLkLoA= github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= +github.com/getkin/kin-openapi v0.53.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= +github.com/getkin/kin-openapi v0.61.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= @@ -569,6 +632,11 @@ github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwv github.com/gin-gonic/gin v1.7.0 h1:jGB9xAJQ12AIGNB4HguylppmDK1Am9ppF7XnGXXJuoU= github.com/gliderlabs/ssh v0.2.2 h1:6zsha5zo/TWhRhwqCD3+EarCAgZ2yN28ipRnGPnwkI0= github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= +github.com/glycerine/go-unsnap-stream v0.0.0-20180323001048-9f0cb55181dd/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE= +github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24= +github.com/go-chi/chi/v5 v5.0.0/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJpoZOs= +github.com/go-critic/go-critic v0.6.4 h1:tucuG1pvOyYgpBIrVxw0R6gwO42lNa92Aq3VaDoIs+E= +github.com/go-critic/go-critic v0.6.4/go.mod h1:qL5SOlk7NtY6sJPoVCTKDIgzNOxHkkkOCVDyi9wJe1U= github.com/go-git/gcfg v1.5.0 h1:Q5ViNfGF8zFgyJWPqYwA7qGFoMTEiBmdlkcfRmpIMa4= github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E= github.com/go-git/go-billy/v5 v5.0.0 h1:7NQHvd9FVid8VL4qVUMm8XifBK+2xCoZ2lSk0agRrHM= @@ -587,8 +655,9 @@ 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= @@ -600,6 +669,7 @@ github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dT github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= @@ -616,30 +686,54 @@ github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+ github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= 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-sourcemap/sourcemap v2.1.2+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= +github.com/go-sourcemap/sourcemap v2.1.3+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.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= 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-zookeeper/zk v1.0.2/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= +github.com/go-toolsmith/astcast v1.0.0 h1:JojxlmI6STnFVG9yOImLeGREv8W2ocNUM+iOhR6jE7g= +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/astcopy v1.0.1 h1:l09oBhAPyV74kLJ3ZO31iBU8htZGTwr9LTjuMCyL8go= +github.com/go-toolsmith/astcopy v1.0.1/go.mod h1:4TcEdbElGc9twQEYpVo/aieIXfHhiuLh4aLAck6dO7Y= +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/astequal v1.0.2 h1:+XvaV8zNxua+9+Oa4AHmgmpo4RYAbwr/qjNppLfX2yM= +github.com/go-toolsmith/astequal v1.0.2/go.mod h1:9Ai4UglvtR+4up+bAD4+hCj7iTo4m/OXVTSLnCyTAx4= +github.com/go-toolsmith/astfmt v1.0.0 h1:A0vDDXt+vsvLEdbMFJAUBI/uTbRw1ffOPnxsILnFL6k= +github.com/go-toolsmith/astfmt v1.0.0/go.mod h1:cnWmsOAuq4jJY6Ct5YWlVLmcmLMn1JUPuQIHCY7CJDw= +github.com/go-toolsmith/astp v1.0.0 h1:alXE75TXgcmupDsMK1fRAy0YUzLzqPVvBKoyWV+KPXg= +github.com/go-toolsmith/astp v1.0.0/go.mod h1:RSyrtpVlfTFGDYRbrjyWP1pYu//tSFcvdYrA8meBmLI= +github.com/go-toolsmith/pkgload v1.0.2-0.20220101231613-e814995d17c5 h1:eD9POs68PHkwrx7hAB78z1cb6PfGq/jyWn3wJywsH1o= +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 h1:Vcw78DnpCAKlM20kSbAyO4mPfJn/lyYA4BJUDxe2Jb4= +github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8= +github.com/go-toolsmith/typep v1.0.2 h1:8xdsa1+FSIH/RhEkgnD1j2CJOy5mNllW1Q9tRiYwvlk= +github.com/go-toolsmith/typep v1.0.2/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= +github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b h1:khEcpUM4yFcxg4/FHQWkvVRmgijNXRfzkIDHh23ggEo= +github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM= github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= github.com/gobuffalo/envy v1.7.1/go.mod h1:FurDp9+EDPE4aIUS3ZLyD+7/9fpx7YRt/ukY6jIHf0w= github.com/gobuffalo/envy v1.8.1 h1:RUr68liRvs0TS1D5qdW3mQv2SjAsu1QWMCx1tG4kDjs= github.com/gobuffalo/envy v1.8.1/go.mod h1:FurDp9+EDPE4aIUS3ZLyD+7/9fpx7YRt/ukY6jIHf0w= -github.com/gobuffalo/flect v0.2.0 h1:EWCvMGGxOjsgwlWaP+f4+Hh6yrrte7JeFL2S6b+0hdM= github.com/gobuffalo/flect v0.2.0/go.mod h1:W3K3X9ksuZfir8f/LrfVtWmCDQFfayuylOJ7sz/Fj80= +github.com/gobuffalo/flect v0.2.5 h1:H6vvsv2an0lalEaCDRThvtBfmg44W/QHXBCYUXf/6S4= +github.com/gobuffalo/flect v0.2.5/go.mod h1:1ZyCLIbg0YD7sDkzvFdPoOydPtD8y9JQnrOROolUcM8= github.com/gobuffalo/genny v0.6.0 h1:d7c6d66ZrTHHty01hDX1/TcTWvAJQxRZl885KWX5kHY= github.com/gobuffalo/genny v0.6.0/go.mod h1:Vigx9VDiNscYpa/LwrURqGXLSIbzTfapt9+K6gF1kTA= -github.com/gobuffalo/github_flavored_markdown v1.1.0 h1:8Zzj4fTRl/OP2R7sGerzSf6g2nEJnaBEJe7UAOiEvbQ= github.com/gobuffalo/github_flavored_markdown v1.1.0/go.mod h1:TSpTKWcRTI0+v7W3x8dkSKMLJSUpuVitlptCkpeY8ic= -github.com/gobuffalo/helpers v0.5.0 h1:w8SeLFxS4RL/QqwdGfYAVgdavqB2zaBaHjxUbT7z5/c= +github.com/gobuffalo/github_flavored_markdown v1.1.1 h1:kUf8ginyBOTRXcKSTPsPAqlA25vQ80+xAspLIYaxmTU= +github.com/gobuffalo/github_flavored_markdown v1.1.1/go.mod h1:yU32Pen+eorS58oxh/bNZx76zUOCJwmvyV5FBrvzOKQ= github.com/gobuffalo/helpers v0.5.0/go.mod h1:stpgxJ2C7T99NLyAxGUnYMM2zAtBk5NKQR0SIbd05j4= +github.com/gobuffalo/helpers v0.6.5 h1:Quf1KAUae97sdDmm/QP5V9P/0XYpK+HrhnYXU+nf65M= +github.com/gobuffalo/helpers v0.6.5/go.mod h1:LA4zcc89tkZsfKpJIWsXLibiqTgZQ4EvDszfxdqr9ZA= github.com/gobuffalo/here v0.6.0/go.mod h1:wAG085dHOYqUpf+Ap+WOdrPTp5IYcDAs/x7PLa8Y5fM= github.com/gobuffalo/logger v1.0.1/go.mod h1:2zbswyIUa45I+c+FLXuWl9zSWEiVuthsk8ze5s8JvPs= -github.com/gobuffalo/logger v1.0.3 h1:YaXOTHNPCvkqqA7w05A4v0k2tCdpr+sgFlgINbQ6gqc= github.com/gobuffalo/logger v1.0.3/go.mod h1:SoeejUwldiS7ZsyCBphOGURmWdwUFXs0J7TCjEhjKxM= -github.com/gobuffalo/packd v0.3.0 h1:eMwymTkA1uXsqxS0Tpoop3Lc0u3kTfiMBE6nKtQU4g4= +github.com/gobuffalo/logger v1.0.6 h1:nnZNpxYo0zx+Aj9RfMPBm+x9zAU2OayFh/xrAWi34HU= +github.com/gobuffalo/logger v1.0.6/go.mod h1:J31TBEHR1QLV2683OXTAItYIg8pv2JMHnF/quuAbMjs= github.com/gobuffalo/packd v0.3.0/go.mod h1:zC7QkmNkYVGKPw4tHpBQ+ml7W/3tIebgeo1b36chA3Q= +github.com/gobuffalo/packd v1.0.1 h1:U2wXfRr4E9DH8IdsDLlRFwTZTK7hLfq9qT/QHXGVe/0= +github.com/gobuffalo/packd v1.0.1/go.mod h1:PP2POP3p3RXGz7Jh6eYEf93S7vA2za6xM7QT85L4+VY= github.com/gobuffalo/packr/v2 v2.7.1 h1:n3CIW5T17T8v4GGK5sWXLVWJhCz7b5aNLSxW6gYim4o= github.com/gobuffalo/packr/v2 v2.7.1/go.mod h1:qYEvAazPaVxy7Y7KR0W8qYEE+RymX74kETFqjFoFlOc= github.com/gobuffalo/plush v3.8.3+incompatible h1:kzvUTnFPhwyfPEsx7U7LI05/IIslZVGnAlMA1heWub8= @@ -648,10 +742,14 @@ github.com/gobuffalo/plushgen v0.1.2 h1:s4yAgNdfNMyMQ7o+Is4f1VlH2L1tKosT+m7BF28C github.com/gobuffalo/plushgen v0.1.2/go.mod h1:3U71v6HWZpVER1nInTXeAwdoRNsRd4W8aeIa1Lyp+Bk= github.com/gobuffalo/tags v2.1.7+incompatible h1:GUxxh34f9SI4U0Pj3ZqvopO9SlzuqSf+g4ZGSPSszt4= github.com/gobuffalo/tags v2.1.7+incompatible/go.mod h1:9XmhOkyaB7UzvuY4UoZO4s67q8/xRMVJEaakauVQYeY= -github.com/gobuffalo/uuid v2.0.5+incompatible h1:c5uWRuEnYggYCrT9AJm0U2v1QTG7OVDAvxhj8tIV5Gc= +github.com/gobuffalo/tags/v3 v3.1.3 h1:yhq9gudiEngYtPzH1KtMUknxffQBqwNfkHKP6i4l4NE= +github.com/gobuffalo/tags/v3 v3.1.3/go.mod h1:WAAjKdskZUmdi6EkNjP2SXBwBwRovHsjJsPJbBiPlKc= github.com/gobuffalo/uuid v2.0.5+incompatible/go.mod h1:ErhIzkRhm0FtRuiE/PeORqcw4cVi1RtSpnwYrxuvkfE= -github.com/gobuffalo/validate v2.0.3+incompatible h1:6f4JCEz11Zi6iIlexMv7Jz10RBPvgI795AOaubtCwTE= github.com/gobuffalo/validate v2.0.3+incompatible/go.mod h1:N+EtDe0J8252BgfzQUChBgfd6L93m9weay53EWFVsMM= +github.com/gobuffalo/validate/v3 v3.3.2 h1:GZdJlDy6zDRXF5BnEiY+pGvGDFx95atMIWd3N3MMseE= +github.com/gobuffalo/validate/v3 v3.3.2/go.mod h1:jiEEw+N7KbAP2aInFxGnfitI0g7HjXqcp5hDD6TaQDU= +github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= +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= @@ -668,17 +766,23 @@ github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2/go.mod h1:bBOAhwG1umN6 github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= 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/uuid v3.2.0+incompatible h1:y12jRkkFxsd7GpqdSZ+/KCs/fJbqpEXSGd4+jfEaewE= +github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= +github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/gofrs/uuid v4.2.0+incompatible h1:yyYWMnhkhrKwwr8gAOcOCYxOOscHgDS9yZgBrnJfGa0= +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/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/googleapis v1.2.0/go.mod h1:Njal3psf3qN6dwBtQfUmBZh2ybovJ0tlu3o/AC7HYjU= github.com/gogo/googleapis v1.4.0/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= -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-jwt/jwt/v4 v4.3.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= +github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ= +github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -686,13 +790,13 @@ github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4er github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -711,17 +815,38 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -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 h1:23T5iq8rbUYlhpt5DB4XJkc6BU31uODLD1o1gKvZmD0= +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 h1:w8hkcTqaFpzKqonE9uMCefW1WDie15eSP/4MssdenaM= +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 h1:6RGUuS7EGotKx6J5HIP8ZtyMdiDscjMLfRBSPuzVVeo= +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 h1:iR3fYXUjHCR97qWS8ch1y9zPNsgXThGwjKPrYfqMPks= +github.com/golangci/gofmt v0.0.0-20190930125516-244bba706f1a/go.mod h1:9qCChq59u/eW8im404Q2WWTrnBUQKjpNYKMbU4M7EFU= +github.com/golangci/golangci-lint v1.49.0 h1:I8WHOavragDttlLHtSraHn/h39C+R60bEQ5NoGcHQr8= +github.com/golangci/golangci-lint v1.49.0/go.mod h1:+V/7lLv449R6w9mQ3WdV0EKh7Je/jTylMeSwBZcLeWE= +github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y= +github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0 h1:MfyDlzVjl1hoaPzPD4Gpb/QgoRfSBR0jdhwGyAWwMSA= +github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0/go.mod h1:66R6K6P6VWk9I95jvqGxkqJxVWGFy9XlDwLwVz1RCFg= +github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca h1:kNY3/svz5T29MYHubXix4aDDuE3RWHkPvopM/EDv/MA= +github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca/go.mod h1:tvlJhZqDe4LMs4ZHD0oMUlt9G2LWuDGoisJTBzLMV9o= +github.com/golangci/misspell v0.3.5 h1:pLzmVdl3VxTOncgzHcvLOKirdvcx/TydsClUQXTehjo= +github.com/golangci/misspell v0.3.5/go.mod h1:dEbvlSfYbMQDtrpRMQU675gSDLDNa8sCPPChZ7PhiVA= +github.com/golangci/revgrep v0.0.0-20220804021717-745bb2f7c2e6 h1:DIPQnGy2Gv2FSA4B/hh8Q7xx3B7AIDk3DAMeHclH1vQ= +github.com/golangci/revgrep v0.0.0-20220804021717-745bb2f7c2e6/go.mod h1:0AKcRCkMoKvUvlf89F6O7H2LYdhr1zBh736mBItOdRs= +github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4 h1:zwtduBRr5SSWhqsYNgcuWO2kFlpdOZbP0+yRjmvPGys= +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/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4= +github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= +github.com/google/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= 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= @@ -735,6 +860,7 @@ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= +github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-containerregistry v0.5.1/go.mod h1:Ct15B4yir3PLOP5jsy0GNeYVaIZs/MK/Jz5any1wFW0= github.com/google/go-github/v37 v37.0.0 h1:rCspN8/6kB1BAJWZfuafvHhyfIo5fkAulaP/3bOQ/tM= github.com/google/go-github/v37 v37.0.0/go.mod h1:LM7in3NmXDrX58GbEHy7FtNLbI2JijX93RnMKvWG3m4= @@ -749,7 +875,6 @@ github.com/google/goterm v0.0.0-20190703233501-fc88cf888a3f/go.mod h1:nOFQdrUlIl github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/orderedcode v0.0.1 h1:UzfcAexk9Vhv8+9pNOgRu41f16lHq725vPwnSeiG/Us= github.com/google/orderedcode v0.0.1/go.mod h1:iVyU4/qPKHY5h/wSd6rZZCDcLJNxiWO6dvsYES2Sb20= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= @@ -762,26 +887,25 @@ github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hf 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-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/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.2.0 h1:qJYtXnJRWmpe7m/3XlyhrsLrEURqHRM2kxzoxXqyUDs= github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa h1:7MYGT2XEMam7Mtzv1yDUYXANedWvwk3HKkR3MyGowy8= 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.4.0 h1:dS9eYAjhrE2RjmzYw2XAPvcXfmcQLtFEQWn0CR82awk= github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= +github.com/googleapis/go-type-adapters v1.0.0 h1:9XdMn+d/G57qq1s8dNc5IesGCXHf6V2HZ2JwRxfA2tA= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= -github.com/gookit/color v1.5.0 h1:1Opow3+BWDwqor78DcJkJCIwnkviFi+rrOANki9BUFw= -github.com/gookit/color v1.5.0/go.mod h1:43aQb+Zerm/BWh2GnrgOQm7ffz7tvQXEKV6BFMl7wAo= +github.com/gookit/color v1.5.1 h1:Vjg2VEcdHpwq+oY63s/ksHrgJYCTo0bwWvmmYWdE9fQ= +github.com/gookit/color v1.5.1/go.mod h1:wZFzea4X8qN6vHOSP2apMb4/+w/orMznEzYsIHPaqKM= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gordonklaus/ineffassign v0.0.0-20210914165742-4cc7213b9bc8 h1:PVRE9d4AQKmbelZ7emNig1+NT27DUmKZn5qXxfio54U= +github.com/gordonklaus/ineffassign v0.0.0-20210914165742-4cc7213b9bc8/go.mod h1:Qcp2HIAYhR7mNUVSIxZww3Guk4it82ghYcEXIAk+QT0= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/css v1.0.0 h1:BQqNyPTi50JCFMTw/b67hByjMVXZRwGha6wxVGkeihY= github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c= @@ -797,13 +921,26 @@ github.com/gorilla/rpc v1.2.0 h1:WvvdC2lNeT1SP32zrIce5l0ECBfbAlmrmSBsuc57wfk= github.com/gorilla/rpc v1.2.0/go.mod h1:V4h9r+4sF5HnzqbwIez0fKSpANP0zlYd3qR7p36jkTQ= github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.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/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/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.7.1 h1:ZMCjoue3DtDWQ5WyU16YbjbQEQ3VuzwxALrpYd+HeKk= +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 h1:hlnx5+S2fY9Zo9ePo4AhgYsYHbM2+eAv8m/s1JiCd6Q= +github.com/gostaticanalysis/comment v1.4.2/go.mod h1:KLUTGDv6HOCotCH8h2erHKmpci2ZoR8VPu34YA2uzdM= +github.com/gostaticanalysis/forcetypeassert v0.1.0 h1:6eUflI3DiGusXGK6X7cCcIgVCpZ2CiZ1Q7jl6ZxNV70= +github.com/gostaticanalysis/forcetypeassert v0.1.0/go.mod h1:qZEedyP/sY1lTGV1uJ3VhWZ2mqag3IkWsDHVbplHXak= +github.com/gostaticanalysis/nilerr v0.1.1 h1:ThE+hJP0fEp4zWLkWHWcRyI2Od0p7DlgYG3Uqrmrcpk= +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 h1:nhdCmubdmDF6VEatUNjgUZBJKWRqugoISdUv3PPQgHY= +github.com/graph-gophers/graphql-go v1.3.0/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/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= @@ -825,96 +962,114 @@ github.com/gtank/ristretto255 v0.1.2 h1:JEqUCPA1NvLq5DwYtuzigd7ss8fwbYay9fi4/5uM github.com/gtank/ristretto255 v0.1.2/go.mod h1:Ph5OpO6c7xKUGROZfWVLiJf9icMDwUeIvY4OmlYW69o= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= -github.com/hashicorp/consul/api v1.10.1/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= -github.com/hashicorp/consul/api v1.11.0/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= -github.com/hashicorp/consul/api v1.12.0/go.mod h1:6pVBMo0ebnYdt2S3H87XhekM/HHrUoTD2XXb/VrZVy0= github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= +github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0= github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-hclog v0.16.2/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-hclog v1.0.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= +github.com/hashicorp/go-getter v1.6.1 h1:NASsgP4q6tL94WH6nJxKWj8As2H/2kop/bB1d8JMyRY= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= 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 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= +github.com/hashicorp/go-safetemp v1.0.0 h1:2HR189eFNrjHQyENnQMMpCiBAsRxzbTMIgBhEyExpmo= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.1 h1:fv1ep09latC32wFoVwnqcnKJGnMSdBanPczbHAYm1BE= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= +github.com/hashicorp/go-version v1.6.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= github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY= -github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= -github.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk= -github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= -github.com/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/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= +github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= github.com/hinshun/vt10x v0.0.0-20180616224451-1954e6464174 h1:WlZsjVhE8Af9IcZDGgJGQpNflI3+MJSBhsgT5PCtzBQ= github.com/hinshun/vt10x v0.0.0-20180616224451-1954e6464174/go.mod h1:DqJ97dSdRW1W22yXSB90986pcOyQ7r45iio1KN2ez1A= -github.com/holiman/uint256 v1.1.1/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= +github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= +github.com/holiman/uint256 v1.2.0/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= -github.com/hudl/fargo v1.4.0/go.mod h1:9Ai6uvFy5fQNq6VPKtg+Ceq1+eTY4nKUlR2JElEOcDo= -github.com/huin/goupnp v1.0.0/go.mod h1:n9v9KO1tAxYH82qOn+UTIFQDmx5n1Zxd/ClZDMX7Bnc= +github.com/huin/goupnp v1.0.3-0.20220313090229-ca81a64b4204/go.mod h1:ZxNlw5WqJj6wSsRK5+YfflQGXYfccj5VgQsMNixHM7Y= github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= github.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0= 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/ignite/modules v0.0.0-20220830145312-d006783a7a21 h1:2eqRFOwuBtP5prBIslVokLwLkXqekbY4cENDf2mEyxQ= +github.com/ignite/web v0.3.10 h1:WPKQi1a6gjwZPlaizT5Zq+cyUZ6b0p6VSAHr5L4i2p4= +github.com/ignite/web v0.3.10/go.mod h1:WZWBaBYF8RazN7dE462BLpvXDY8ScacxcJ07BKwX/jY= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.9/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/improbable-eng/grpc-web v0.14.1 h1:NrN4PY71A6tAz2sKDvC5JCauENWp0ykG8Oq1H3cpFvw= -github.com/improbable-eng/grpc-web v0.14.1/go.mod h1:zEjGHa8DAlkoOXmswrNvhUGEYQA9UI7DhrGeHR1DMGU= +github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= +github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= +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 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/influxdata/influxdb v1.2.3-0.20180221223340-01288bdb0883/go.mod h1:qZna6X/4elxqT3yI9iZYdZrWWdeFOOprn86kgg4+IzY= +github.com/influxdata/flux v0.65.1/go.mod h1:J754/zds0vvpfwuq7Gc2wRdVwEodfpCFM7mYlOw2LqY= +github.com/influxdata/influxdb v1.8.3/go.mod h1:JugdFhsvvI8gadxOI6noqNeeBHvWNTbfYGtiAn+2jhI= +github.com/influxdata/influxdb-client-go/v2 v2.4.0/go.mod h1:vLNHdxTJkIf2mSLvGrpj8TCcISApPoXkaxP8g9uRlW8= 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/influxdata/influxql v1.1.1-0.20200828144457-65d3ef77d385/go.mod h1:gHp9y86a/pxhjJ+zMjNXiQAA197Xk9wLxaz+fGG+kWk= +github.com/influxdata/line-protocol v0.0.0-20180522152040-32c6aa80de5e/go.mod h1:4kt73NQhadE3daL3WhR5EJ/J2ocX0PZzwxQ0gXJ7oFE= +github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= +github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= +github.com/influxdata/promql/v2 v2.12.0/go.mod h1:fxOPu+DY0bqCTCECchSRtWfc+0X19ybifQhZoQNF5D8= +github.com/influxdata/roaring v0.4.13-0.20180809181101-fc520f41fab6/go.mod h1:bSgUQ7q5ZLSO+bKBGqJiCBGAl+9DxyW63zLTujjUlOE= +github.com/influxdata/tdigest v0.0.0-20181121200506-bf2b5ad3c0a9/go.mod h1:Js0mqiSBE6Ffsg94weZZ2c+v/ciT8QRHFOap7EKDrR0= +github.com/influxdata/usage-client v0.0.0-20160829180054-6d3895376368/go.mod h1:Wbbw6tYNvwa5dlB6304Sd+82Z3f7PmVZHVKU637d4po= github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= -github.com/jackpal/go-nat-pmp v1.0.2-0.20160603034137-1fa385a6f458/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= +github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= 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 h1:HxVbL1MhydKs8R8n/HE5NPvzfaYmQJA3o879lE4+WcM= +github.com/jgautheron/goconst v1.5.1/go.mod h1:aAosetZ5zaeC/2EfMeRswtxUFBpe2Hr7HzkgX4fanO4= +github.com/jhump/protoreflect v1.12.1-0.20220721211354-060cc04fc18b h1:izTof8BKh/nE1wrKOrloNA5q4odOarjf+Xpe+4qow98= +github.com/jingyugao/rowserrcheck v1.1.1 h1:zibz55j/MJtLsjP1OF4bSdgXxwL1b+Vn7Tjzq7gFzUs= +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 h1:KA9BjwUk7KlCh6S9EAGWBt1oExIUv9WyNCiRz5amv48= +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-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= 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/joefitzgerald/rainbow-reporter v0.1.0/go.mod h1:481CNgqmVHQZzdIbN52CupLJyoVwB10FQ/IQlF1pdL8= github.com/joho/godotenv v1.3.0 h1:Zjp+RcGpHhGlrMbJzXTrZZPrWj+1vfm90La1wgB6Bhc= github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= @@ -940,26 +1095,36 @@ github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnr github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= 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/jsternberg/zap-logfmt v1.0.0/go.mod h1:uvPs/4X51zdkcm5jXl5SYoN+4RK21K8mysFmDaM/h+o= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -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 h1:F78HnrsjY3cR7j0etXy5+TU1Zuy7Xt08X/1aJnH5xXY= +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/karalabe/usb v0.0.0-20190919080040-51dc0efba356/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= +github.com/jwilder/encoding v0.0.0-20170811194829-b4e1701a28ef/go.mod h1:Ct9fl0F6iIOGgxJ5npU/IUOhOhqlVrGjyIZc8/MagT0= +github.com/karalabe/usb v0.0.2/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd h1:Coekwdh0v2wtGp9Gmz1Ze3eVRAWJMLokvN3QjdzCHLY= github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/errcheck v1.6.2 h1:uGQ9xI8/pgc9iOoCe7kWQgRE6SBTrCGmTSf0LrEtY7c= +github.com/kisielk/errcheck v1.6.2/go.mod h1:nXw/i/MfnvRHqXa7XXmQMUB0oNFGuBrNI8d8NLy0LPw= +github.com/kisielk/gotool v1.0.0 h1:AV2c/EiW3KqPNT9ZKl07ehoAGi4C5/01Cfbblndcapg= 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.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.11.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.11.13/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= -github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc= -github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= +github.com/klauspost/compress v1.15.9 h1:wKRjX6JRtDdrE9qwa4b/Cip7ACOshUI4smpCQanqjSY= +github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= +github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +github.com/klauspost/crc32 v0.0.0-20161016154125-cb6bfca970f6/go.mod h1:+ZoRqAPRLkC4NPOvfYeR5KNOrY6TD+/sAC3HXPZgDYg= +github.com/klauspost/pgzip v1.0.2-0.20170402124221-0bf5dcad4ada/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= @@ -967,8 +1132,8 @@ 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 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.4/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.5 h1:hyz3dwM5QLc1Rfoz4FuWJQG5BN7tc6K1MndAUnGpQr4= @@ -976,15 +1141,30 @@ github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kulti/thelper v0.6.3 h1:ElhKf+AlItIu+xGnI990no4cE2+XaSu1ULymV2Yulxs= +github.com/kulti/thelper v0.6.3/go.mod h1:DsqKShOvP40epevkFrvIwkCMNYxMeTNjdWL4dqWHZ6I= +github.com/kunwardeep/paralleltest v1.0.6 h1:FCKYMF1OF2+RveWlABsdnmsvJrei5aoyZoaGS+Ugg8g= +github.com/kunwardeep/paralleltest v1.0.6/go.mod h1:Y0Y0XISdZM5IKm3TREQMZ6iteqn1YuwCsJO/0kL9Zes= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/kyoh86/exportloopref v0.1.8 h1:5Ry/at+eFdkX9Vsdw3qU4YkvGtzuVfzT4X7S77LoN/M= +github.com/kyoh86/exportloopref v0.1.8/go.mod h1:1tUcJeiioIs7VWe5gcOObrux3lb66+sBqGZrRkMwPgg= +github.com/labstack/echo/v4 v4.2.1/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4FW1e6jwpg= +github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= +github.com/ldez/gomoddirectives v0.2.3 h1:y7MBaisZVDYmKvt9/l1mjNCiSA1BVn34U0ObUcJwlhA= +github.com/ldez/gomoddirectives v0.2.3/go.mod h1:cpgBogWITnCfRq2qGoDkKMEVSaarhdBr6g8G04uz6d0= +github.com/ldez/tagliatelle v0.3.1 h1:3BqVVlReVUZwafJUwQ+oxbx2BEX2vUG4Yu/NOfMiKiM= +github.com/ldez/tagliatelle v0.3.1/go.mod h1:8s6WJQwEYHbKZDsp/LjArytKOG8qaMrKQQ3mFukHs88= +github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= -github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.10.4 h1:SO9z7FRPzA03QhHKJrH5BXA6HU1rS4V2nIVrrNC1iYk= -github.com/lib/pq v1.10.4/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/libp2p/go-buffer-pool v0.0.2 h1:QNK2iAFa8gjAe1SPz6mHSMuCcjs+X1wlHzeOSqcmlfs= -github.com/libp2p/go-buffer-pool v0.0.2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM= +github.com/leonklingele/grouper v1.1.0 h1:tC2y/ygPbMFSBOs3DcyaEMKnnwH7eYKzohOtRrf0SAg= +github.com/leonklingele/grouper v1.1.0/go.mod h1:uk3I3uDfi9B6PeUjsCKi6ndcf63Uy7snXgR4yDYQVDY= +github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.10.6 h1:jbk+ZieJ0D7EVGJYpL9QTz7/YW6UHbmdnZWYyK5cdBs= +github.com/lib/pq v1.10.6/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= +github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= github.com/linuxkit/virtsock v0.0.0-20201010232012-f8cee7dfc7a3/go.mod h1:3r6x7q95whyfWQpmGZTu3gk3v2YkMi05HEzl7Tf7YEo= @@ -992,90 +1172,99 @@ github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/lucasjones/reggen v0.0.0-20180717132126-cdb49ff09d77/go.mod h1:5ELEyG+X8f+meRWHuqUOewBOhvHkl7M76pdGEansxW4= -github.com/lyft/protoc-gen-star v0.5.3/go.mod h1:V0xaHgaf5oCCqmcxYcWiDfTiKsZsRc87/1qhoTACD8w= +github.com/lufeee/execinquery v1.2.1 h1:hf0Ems4SHcUGBxpGN7Jz78z1ppVkP/837ZlETPCEtOM= +github.com/lufeee/execinquery v1.2.1/go.mod h1:EC7DrEKView09ocscGHC+apXMIaorh4xqSxS/dy8SbM= +github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= github.com/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 h1:b6kJs+EmPFMYGkow9GiUyCyOvIwYetYJ3fSaWak/Gls= -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/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= github.com/manifoldco/promptui v0.9.0 h1:3V4HzJk1TtXW1MTZMP7mdlwbBpIinw3HztaIlYthEiA= github.com/manifoldco/promptui v0.9.0/go.mod h1:ka04sppxSGFAtxX0qhlYQjISsg9mR4GWtQEhdbn6Pgg= +github.com/maratori/testpackage v1.1.0 h1:GJY4wlzQhuBusMF1oahQCBtUV/AQ/k69IZ68vxaac2Q= +github.com/maratori/testpackage v1.1.0/go.mod h1:PeAhzU8qkCwdGEMTEupsHJNlQu2gZopMC6RjbhmHeDc= github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= +github.com/matoous/godox v0.0.0-20210227103229-6504466cf951 h1:pWxk9e//NbPwfxat7RXkts09K+dEBJWakUWwICVqYbA= +github.com/matoous/godox v0.0.0-20210227103229-6504466cf951/go.mod h1:1BELzlh859Sh1c6+90blK8lbYy0kwQf1bYlBhBysy1s= +github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE= +github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= +github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ= 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.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-ieproxy v0.0.0-20190610004146-91bb50d98149/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= -github.com/mattn/go-ieproxy v0.0.0-20190702010315-6dee0af9227d/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= +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-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.5-0.20180830101745-3fb116b82035/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= -github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= +github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.10 h1:CoZ3S2P7pvtP45xOtBw+/mDL2z0RKI576gSkzRRpdGg= github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= github.com/mattn/go-shellwords v1.0.6/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= -github.com/mattn/go-sqlite3 v1.14.9/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= +github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/mattn/go-tty v0.0.0-20180907095812-13ff1204f104/go.mod h1:XPvLUNfbS4fJH25nqRHfWLMa1ONC8Amw+mIA639KxkE= github.com/mattn/go-zglob v0.0.3 h1:6Ry4EYsScDyt5di4OI6xw1bYhOqfE5S33Z1OPy+d+To= github.com/mattn/go-zglob v0.0.3/go.mod h1:9fxibJccNxU2cnpIKLRRFA7zX7qhkJIQWBb449FYHOo= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/maxbrunsfeld/counterfeiter/v6 v6.2.2/go.mod h1:eD9eIE7cdwcMi9rYluz88Jz2VyhSmden33/aXg4oVIY= +github.com/mbilski/exhaustivestruct v1.2.0 h1:wCBmUnSYufAHO6J4AVWY6ff+oxWxsVFrwgOdMUQePUo= +github.com/mbilski/exhaustivestruct v1.2.0/go.mod h1:OeTBVxQWoEmB2J2JCHmXWPJ0aksxSUOUy+nvtVEfzXc= github.com/meowgorithm/babyenv v1.3.0/go.mod h1:lwNX+J6AGBFqNrMZ2PTLkM6SO+W4X8DOg9zBDO4j3Ig= github.com/meowgorithm/babyenv v1.3.1 h1:18ZEYIgbzoFQfRLF9+lxjRfk/ui6w8U0FWl07CgWvvc= github.com/meowgorithm/babyenv v1.3.1/go.mod h1:lwNX+J6AGBFqNrMZ2PTLkM6SO+W4X8DOg9zBDO4j3Ig= +github.com/mgechev/revive v1.2.3 h1:NzIEEa9+WimQ6q2Ov7OcNeySS/IOcwtkQ8RAh0R5UJ4= +github.com/mgechev/revive v1.2.3/go.mod h1:iAWlQishqCuj4yhV24FTnKSXGpbAA+0SckXB8GQMX/Q= github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b h1:j7+1HpAFS1zy5+Q4qx1fWh90gTKwiN4QCGoY9TWyyO4= github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= -github.com/microcosm-cc/bluemonday v1.0.4 h1:p0L+CTpo/PLFdkoPcJemLXG+fpMD7pYOoDEq1axMbGg= github.com/microcosm-cc/bluemonday v1.0.4/go.mod h1:8iwZnFn2CDDNZ0r6UXhF4xawGvzaqzCRa1n3/lO3W2w= +github.com/microcosm-cc/bluemonday v1.0.16 h1:kHmAq2t7WPWLjiGvzKa5o3HzSfahUKiOq7fAPUiMNIc= +github.com/microcosm-cc/bluemonday v1.0.16/go.mod h1:Z0r70sCuXHig8YpBzCc5eGHAap2K7e/u082ZUpDRRqM= 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.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.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= github.com/mikesmitty/edkey v0.0.0-20170222072505-3356ea4e686a h1:eU8j/ClY2Ty3qdHnn0TyW3ivFoPC/0F1gQZz8yTxbbE= github.com/mikesmitty/edkey v0.0.0-20170222072505-3356ea4e686a/go.mod h1:v8eSC2SMp9/7FTKUncp7fH9IwPfw+ysMObcEz5FWheQ= github.com/mimoo/StrobeGo v0.0.0-20181016162300-f8f6d4d2b643 h1:hLDRPB66XQT/8+wG9WsDpiCvZf1yKO7sz7scAjSlBa0= github.com/mimoo/StrobeGo v0.0.0-20181016162300-f8f6d4d2b643/go.mod h1:43+3pMjjKimDBf5Kr4ZFNGbLql1zKkbImw+fZbw3geM= -github.com/minio/highwayhash v1.0.1/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= github.com/minio/highwayhash v1.0.2 h1:Aak5U0nElisjDCfPSG79Tgzkn2gl66NxOMspRrKnA/g= github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= 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/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-testing-interface v1.0.0 h1:fzU/JVNcaqHQEcVFAKeR41fkiLdIPrefOvVG1VZ96U0= github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.4.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.4.3 h1:OVowDSCllw/YjdLkam3/sm7wEtOy59d8ndGgCcyj8cs= +github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A= +github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= github.com/moby/sys/mount v0.3.1 h1:RX1K0x95oR8j5P1YefKDt7tE1C2kCCixV0H8Aza3GaI= github.com/moby/sys/mount v0.3.1/go.mod h1:6IZknFQiqjLpwuYJD5Zk0qYEuJiws36M88MIXnZHya0= @@ -1094,8 +1283,11 @@ 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/moricho/tparallel v0.2.1 h1:95FytivzT6rYzdJLdtfn6m1bfFJylOJK41+lgv/EHf4= +github.com/moricho/tparallel v0.2.1/go.mod h1:fXEIZxG2vdfl0ZF8b42f5a78EhjjD5mX8qUplsoSU4k= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= +github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE+eKJXWVjKXM4ck2QobLqTDytGJbLLhJg= 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/muesli/gitcha v0.2.0 h1:+wOgT2dI9s2Tznj1t1rb/qkK5e0cb6qD8c4IX2TR/YY= @@ -1119,34 +1311,32 @@ github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+ github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/grpc-proxy v0.0.0-20181017164139-0f1106ef9c76/go.mod h1:x5OoJHDHqxHS801UIuhqGl6QdSAEJvtausosHSdazIo= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= +github.com/nakabonne/nestif v0.3.1 h1:wm28nZjhQY5HyYPx+weN3Q65k6ilSBxDb8v5S81B81U= +github.com/nakabonne/nestif v0.3.1/go.mod h1:9EtoZochLn5iUprVDmDjqGKPofoUEBL8U4Ngq6aY7OE= github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= -github.com/nats-io/jwt v1.2.2/go.mod h1:/xX356yQA6LuXI9xWW7mZNpxgF2mBmGecH+Fj34sP5Q= -github.com/nats-io/jwt/v2 v2.0.3/go.mod h1:VRP+deawSXyhNjXmxPCHskrR6Mq50BqpEI5SEcNiGlY= github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= -github.com/nats-io/nats-server/v2 v2.5.0/go.mod h1:Kj86UtrXAL6LwYRA6H4RqzkHhK0Vcv2ZnKD5WbQ1t3g= github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= -github.com/nats-io/nats.go v1.12.1/go.mod h1:BPko4oXsySz4aSWeFgOHLZs3G4Jq4ZAyE6/zMCxRT6w= github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -github.com/nats-io/nkeys v0.2.0/go.mod h1:XdZpAbhgyyODYqjTawOnIOI7VlbKSarI9Gfy1tqEu/s= -github.com/nats-io/nkeys v0.3.0/go.mod h1:gvUNGjVcM2IPr5rCsRsC6Wb3Hr2CQAm08dsxtV6A5y4= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= +github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354 h1:4kuARK6Y6FxaNu/BnU2OAaLF86eTVhP2hjTB6iMvItA= +github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354/go.mod h1:KSVJerMDfblTH7p5MZaTt+8zaT2iEk3AkVb9PQdZuE8= github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= -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/neilotoole/errgroup v0.1.6/go.mod h1:Q2nLGf+594h0CLBs/Mbg6qOr7GtqDK7C2S41udRnToE= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/nishanths/exhaustive v0.8.1 h1:0QKNascWv9qIHY7zRoZSxeRr6kuk5aAT3YXLTiDmjTo= +github.com/nishanths/exhaustive v0.8.1/go.mod h1:qj+zJJUgJ76tR92+25+03oYUhzF4R7/2Wk7fGTfCHmg= +github.com/nishanths/predeclared v0.2.2 h1:V2EPdZPliZymNAn79T8RkNApBjMmVKh5XRpLm/w98Vk= +github.com/nishanths/predeclared v0.2.2/go.mod h1:RROzoN6TnGQupbC+lqggsOlcgysk3LMK/HI84Mp280c= +github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/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.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v0.0.0-20151202141238-7f8ab55aaf3b/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= @@ -1159,9 +1349,9 @@ github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+ github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.14.0 h1:2mOpI4JVVPBN+WQRa0WKH2eXR+Ey+uK4n7Zj0aYpIQA= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/ginkgo v1.16.2/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E= -github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= +github.com/onsi/ginkgo/v2 v2.1.4 h1:GNapqRSid3zijZ9H77KrgVG4/8KqiyRsxcSxe+7ApXY= github.com/onsi/gomega v0.0.0-20151007035656-2152b45fa28a/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= @@ -1172,8 +1362,7 @@ github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7J github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= -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.20.0 h1:8W0cWlwFkflGPLltQvLRB7ZVD5HuP6ng320w2IS245Q= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= @@ -1183,17 +1372,16 @@ github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8 github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.0.0/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/image-spec v1.0.2 h1:9yCKha/T5XdGtO0q9Q9a6T5NUCsTn/DrBg0D7ufOcFM= -github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799 h1:rc3tiVYb5z54aKaDfakKn0dDjIyPpTtszkjuMzyt7ec= +github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= github.com/opencontainers/runc v1.0.0-rc8.0.20190926000215-3e425f80a8c9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= github.com/opencontainers/runc v1.0.0-rc9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= github.com/opencontainers/runc v1.0.0-rc93/go.mod h1:3NOsor4w32B2tC0Zbl8Knk4Wg84SM2ImC1fxBuqJ/H0= github.com/opencontainers/runc v1.0.2/go.mod h1:aTaHFFwQXuA71CiyxOdFFIorAoemI04suvGRQFzWTD0= -github.com/opencontainers/runc v1.0.3/go.mod h1:aTaHFFwQXuA71CiyxOdFFIorAoemI04suvGRQFzWTD0= -github.com/opencontainers/runc v1.1.0 h1:O9+X96OcDjkmmZyfaG996kV7yq8HsoU2h1XRRQcefG8= -github.com/opencontainers/runc v1.1.0/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 v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-spec v1.0.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-spec v1.0.2-0.20190207185410-29686dbc5559/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= @@ -1208,54 +1396,61 @@ github.com/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuh github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.0.3-0.20180606204148-bd9c31933947/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= -github.com/openzipkin/zipkin-go v0.2.5/go.mod h1:KpXfKdgRDnnhsxw4pNIH9Md5lyFqKUa4YDFlwRYAMyE= github.com/ory/dockertest v3.3.5+incompatible h1:iLLK6SQwIhcbrG783Dghaaa3WPzGc+4Emza6EbVUUGA= -github.com/ory/dockertest v3.3.5+incompatible/go.mod h1:1vX4m9wsvi00u5bseYwXaSnhNrne+V0E6LAcBILJdPs= +github.com/otiai10/copy v1.2.0/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw= github.com/otiai10/copy v1.6.0 h1:IinKAryFFuPONZ7cm6T6E2QX/vcJwSnlaA5lfoaXIiQ= github.com/otiai10/copy v1.6.0/go.mod h1:XWfuS3CrI0R6IE0FbgHsEazaXO8G0LpMp9o8tos0x4E= github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6j4vs= github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo= +github.com/otiai10/mint v1.3.1/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc= github.com/otiai10/mint v1.3.2 h1:VYWnrP5fXmz1MXvjuUvcBrXSjGE6xjON+axB/UrpO3E= 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/uuid v0.0.0-20170112150404-1b00554d8222/go.mod h1:VyrYX9gd7irzKovcSS6BIIEwPRkP2Wm2m9ufcdFSJ34= +github.com/paulbellamy/ratecounter v0.2.0/go.mod h1:Hfx1hDpSGoqxkVVpBi/IlYD7kChlfo5C6hzIHwPqfFE= 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.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc= -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 v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= +github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml/v2 v2.0.2 h1:+jQXlF3scKIcSEKkdHzXhCTDLPFi5r1wnK6yPS+49Gw= +github.com/pelletier/go-toml/v2 v2.0.2/go.mod h1:MovirKjgVRESsAvNZlAjtFwV867yGuwRkXbG66OzopI= github.com/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.0.1-0.20180619022028-8c1271fcf47f/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc= 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 h1:CdDQnGF8Nq9ocOS/xlSptM1N3BbrA6/kmaep5ggwaIA= +github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d/go.mod h1:3OzsM7FXDQlpCiw2j81fOmAwQLnZnLGXVKUzeKQXIAw= +github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= 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/diff v0.0.0-20210226163009-20ebb0f2a09e h1:aoZm08cpOy4WuID//EZDgcC4zIxODThtZNPirFr42+A= +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-0.20171018195549-f15c970de5b7/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/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= +github.com/pkg/term v0.0.0-20180730021639-bffc007b7fd5/go.mod h1:eCbImbZ95eXtAUIbLAuAVnBnwf83mjf6QIVH8SHYwqQ= 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.2 h1:kp1yvHflYhTmw5m3MmBy8SCyQkKPjwDthVuMH0ug6Yk= +github.com/polyfloyd/go-errorlint v1.0.2/go.mod h1:APVvOesVSAnne5SClsPxPdfvZTVDojXh1/G3qb5wjGI= 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/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= github.com/prometheus/client_golang v0.0.0-20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= @@ -1266,10 +1461,10 @@ github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQ github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.8.0/go.mod h1:O9VU6huf47PktckDQfMTX0Y8tY0/7TSWwj+ITvv0TnM= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.1 h1:ZiaPsmm9uiBeaSMRznKsCDNtPCS0T3JVDGF+06gjBzk= github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= +github.com/prometheus/client_golang v1.12.2 h1:51L9cDoUHVrXx4zWYlcLQIZ+d+VXHgqnYKkIuq4g/34= +github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= 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= @@ -1287,12 +1482,11 @@ github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+ github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.14.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.30.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= +github.com/prometheus/common v0.34.0 h1:RBmGO9d/FVjqHT0yUGQwBJhkwKV+wPCn7KGpvfab0uE= +github.com/prometheus/common v0.34.0/go.mod h1:gB3sOl7P0TvJabZpLY5uQMpUqRCPPCyRLCZYc7JZTNE= github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= 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= @@ -1308,8 +1502,20 @@ github.com/prometheus/procfs v0.3.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4O github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/tsdb v0.6.2-0.20190402121629-4f204dcbc150/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/quasilyte/go-ruleguard v0.3.1-0.20210203134552-1b5a410e1cc8/go.mod h1:KsAh3x0e7Fkpgs+Q9pNLS5XpFSvYCEVl5gP9Pp1xp30= +github.com/quasilyte/go-ruleguard v0.3.17 h1:cDdoaSbQg11LXPDQqiCK54QmQXsEQQCTIgdcpeULGSI= +github.com/quasilyte/go-ruleguard v0.3.17/go.mod h1:sST5PvaR7yb/Az5ksX8oc88usJ4EGjmJv7cK7y3jyig= +github.com/quasilyte/go-ruleguard/dsl v0.3.0/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= +github.com/quasilyte/go-ruleguard/dsl v0.3.21/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 h1:PDWGei+Rf2bBiuZIbZmM20J2ftEy9IeUCHA8HbQqed8= +github.com/quasilyte/gogrep v0.0.0-20220120141003-628d8b3623b5/go.mod h1:wSEyW6O61xRV6zb6My3HxrQ5/8ke7NE2OayqCHa3xRM= +github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95 h1:L8QM9bvf68pVdQ3bCFZMDmnt9yqcMBro1pC7F+IPYMY= +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 h1:M8mH9eK4OUR4lu7Gd+PU1fV2/qnDNfzT635KRSObncs= +github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567/go.mod h1:DWNGW8A4Y+GyBgPuaQJuWiy0XYftx4Xm/y5Jqk9I6VQ= github.com/radovskyb/watcher v1.0.7 h1:AYePLih6dpmS32vlHfhCeli8127LzkIgwJGcwwe8tUE= github.com/radovskyb/watcher v1.0.7/go.mod h1:78okwvY5wPdzcb1UYnip1pvrZNIVEIh/Cm+ZuvsUYIg= github.com/rakyll/statik v0.1.7 h1:OF3QCZUuyPxuGEP7B4ypUa7sB/iHtqOTDYZXGM8KOdQ= @@ -1323,6 +1529,7 @@ 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/retailnext/hllpp v1.0.1-0.20180308014038-101a6d2f8b52/go.mod h1:RDpi1RftBQPUCDRw6SmxeaREsAaRKnOclghuzp/WRzc= github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= @@ -1332,45 +1539,60 @@ github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6L github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.4.0 h1:LUa41nrWTQNGhzdsZ5lTnkwbNjj6rXTdazA1cSdjkOY= github.com/rogpeppe/go-internal v1.4.0/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rs/cors v0.0.0-20160617231935-a62a804a8a00/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= +github.com/rogpeppe/go-internal v1.8.1 h1:geMPLpDpQOgVyCg5z5GoRwLHepNdb71NXb67XFkP+Eg= +github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/cors v1.8.2 h1:KCooALfAYGs415Cwu5ABvv9n9509fSiG5SQJn/AQo4U= github.com/rs/cors v1.8.2/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= -github.com/rs/xhandler v0.0.0-20160618193221-ed27b6fd6521/go.mod h1:RvLn4FgxWubrpZHtQLnOf6EwhN2hEMusxZOhcW9H3UQ= github.com/rs/xid v1.3.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -github.com/rs/zerolog v1.26.1 h1:/ihwxqH+4z8UxyI70wM1z9yCvkWcfz/a3mj48k/Zngc= -github.com/rs/zerolog v1.26.1/go.mod h1:/wSSJWX7lVrsOwlbyTRSOJvqRlc+WjWlfes+CiJ+tmc= +github.com/rs/zerolog v1.27.0 h1:1T7qCieN22GVc8S4Q2yuexzBb1EqjbgjSH9RohbMjKs= +github.com/rs/zerolog v1.27.0/go.mod h1:7frBqO0oezxmnO7GF86FY++uy8I0Tk/If5ni1G9Qc0U= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ryancurrah/gomodguard v1.2.4 h1:CpMSDKan0LtNGGhPrvupAoLeObRFjND8/tU1rEOtBp4= +github.com/ryancurrah/gomodguard v1.2.4/go.mod h1:+Kem4VjWwvFpUJRJSwa16s1tBJe+vbv02+naTow2f6M= +github.com/ryanrolds/sqlclosecheck v0.3.0 h1:AZx+Bixh8zdUBxUA1NxbxVAS78vTPq4rCb8OUZI9xFw= +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/sabhiram/go-gitignore v0.0.0-20180611051255-d3107576ba94 h1:G04eS0JkAIVZfaJLjla9dNxkJCPiKIGZlw9AfOhzOD0= github.com/sabhiram/go-gitignore v0.0.0-20180611051255-d3107576ba94/go.mod h1:b18R55ulyQ/h3RaWyloPyER7fWQVZvimKKhnI5OfrJQ= github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= -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/sahilm/fuzzy v0.1.0 h1:FzWGaw2Opqyu+794ZQ9SYifWv2EIXpwP4q8dY1kDAwI= github.com/sahilm/fuzzy v0.1.0/go.mod h1:VFvziUEIMCrT6A6tw2RFIXPXXmzXbOsSHF0DOI8ZK9Y= github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= +github.com/sanposhiho/wastedassign/v2 v2.0.6 h1:+6/hQIHKNJAUixEj6EmOngGIisyeI+T3335lYTyxRoA= +github.com/sanposhiho/wastedassign/v2 v2.0.6/go.mod h1:KyZ0MWTwxxBmfwn33zh3k1dmsbF2ud9pAAGfoLfjhtI= github.com/sasha-s/go-deadlock v0.2.1-0.20190427202633-1595213edefa h1:0U2s5loxrTy6/VgfVoLuVLFJcURKLH49ie0zSch7gh4= github.com/sasha-s/go-deadlock v0.2.1-0.20190427202633-1595213edefa/go.mod h1:F73l+cr82YSh10GxyRI6qZiCgK64VaZjwesgfQ1/iLM= +github.com/sashamelentyev/interfacebloat v1.1.0 h1:xdRdJp0irL086OyW1H/RTZTr1h/tMEOsumirXcOJqAw= +github.com/sashamelentyev/interfacebloat v1.1.0/go.mod h1:+Y9yU5YdTkrNvoX0xHc84dxiN1iBi9+G8zZIhPVoNjQ= +github.com/sashamelentyev/usestdlibvars v1.13.0 h1:uObNudVEEHf6JbOJy5bgKJloA1bWjxR9fwgNFpPzKnI= +github.com/sashamelentyev/usestdlibvars v1.13.0/go.mod h1:D2Wb7niIYmTB+gB8z7kh8tyP5ccof1dQ+SFk+WW5NtY= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/sclevine/spec v1.2.0/go.mod h1:W4J29eT/Kzv7/b9IWLB055Z+qvVC9vt0Arko24q7p+U= 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.13.1 h1:7mU32qn2dyC81MH9L2kefnQyRMUarfDER3iQyMHcjYM= +github.com/securego/gosec/v2 v2.13.1/go.mod h1:EO1sImBMBWFjOTFzMWfTRrZW6M15gm60ljzrmy/wtHo= github.com/segmentio/fasthash v1.0.3/go.mod h1:waKX8l2N8yckOgmSsXJi7x1ZfdKZ4x7KRMzBtS3oedY= +github.com/segmentio/kafka-go v0.1.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= +github.com/segmentio/kafka-go v0.2.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= github.com/segmentio/ksuid v1.0.3 h1:FoResxvleQwYiPAVKe1tMUlEirodZqlqglIuFsdDntY= github.com/segmentio/ksuid v1.0.3/go.mod h1:/XUiZBD3kVx5SmUOl55voK5yeAbBNNIed+2O73XgrPE= -github.com/serenize/snaker v0.0.0-20171204205717-a683aaf2d516 h1:ofR1ZdrNSkiWcMsRrubK9tb2/SlZVWttAfqUjJi6QYc= github.com/serenize/snaker v0.0.0-20171204205717-a683aaf2d516/go.mod h1:Yow6lPLSAXx2ifx470yD/nUe22Dv5vBvxK/UK9UUTVs= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -github.com/shirou/gopsutil v2.20.5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ= +github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= +github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c h1:W65qqJCIOVP4jpqPQ0YvHYKwcMEMVWIzWC5iNQQfBTU= +github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c/go.mod h1:/PevMnwAxekIXwN8qQyfc5gl2NlkB3CQlkizAbOkeBs= +github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/shurcooL/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.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= @@ -1379,16 +1601,26 @@ github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMB github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= +github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/sivchari/containedctx v1.0.2 h1:0hLQKpgC53OVF1VT7CeoFHk9YKstur1XOgfYIc1yrHI= +github.com/sivchari/containedctx v1.0.2/go.mod h1:PwZOeqm4/DLoJOqMSIJs3aKqXRX4YO+uXww087KZ7Bw= +github.com/sivchari/nosnakecase v1.7.0 h1:7QkpWIRMe8x25gckkFd2A5Pi6Ymo0qgr4JrhGt95do8= +github.com/sivchari/nosnakecase v1.7.0/go.mod h1:CwDzrzPea40/GB6uynrNLiorAlgFRvRbFSgJx2Gs+QY= +github.com/sivchari/tenv v1.7.0 h1:d4laZMBK6jpe5PWepxlV9S+LC0yXqvYHiq8E6ceoVVE= +github.com/sivchari/tenv v1.7.0/go.mod h1:64yStXKSOxDfX47NlhVwND4dHwfZDdbp2Lyl018Icvg= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/snikch/goodman v0.0.0-20171125024755-10e37e294daa/go.mod h1:oJyF+mSPHbB5mVY2iO9KV3pTt/QbIkGaO8gQ2WrDbP4= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/sonatard/noctx v0.0.1 h1:VC1Qhl6Oxx9vvWo3UDgrGXYCeKCe3Wbw7qAWL6FrmTY= +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/annotate v0.0.0-20160123013949-f4cad6c6324d h1:yKm7XZV6j9Ev6lojP2XaIshpT4ymkqhMeSghO5Ps00E= github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE= +github.com/sourcegraph/go-diff v0.6.1 h1:hmA1LzxW0n1c3Q4YbrFgg4P99GSnebYa3x8gr0HZqLQ= +github.com/sourcegraph/go-diff v0.6.1/go.mod h1:iBszgVvyxdc8SFZ7gm69go2KDdt3ag071iBaWPF6cjs= github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e h1:qpG93cPwA5f7s/ZPBJnGOYQNK/vKsaDaseuKT5Asee8= github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod h1:HuIsMU8RRBOtsCgI77wP899iHVBQpCmg4ErYMZB+2IA= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= @@ -1396,22 +1628,18 @@ github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0b 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.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -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.0 h1:5MmtuhAgYeU6qpa7w7bP0dv6MBYuup0vekhSpSkoq60= -github.com/spf13/afero v1.8.0/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= +github.com/spf13/afero v1.8.2 h1:xehSyVa0YnHWsJ49JFljMpg1HX19V6NDZ1fkm1Xznbo= +github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.4.1 h1:s0hze+J0196ZfEMTs80N7UlFt0BDuQ7Q+JDnHiMWKdA= -github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= +github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= 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.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= -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 h1:X+jTBEBqF0bHN+9cSMgmfuvv2VHJ9ezmFNf9Y/XstYU= +github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= @@ -1425,24 +1653,26 @@ github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DM github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= -github.com/spf13/viper v1.10.0/go.mod h1:SoyBPwAtKDzypXNDFKN5kzH7ppppbGZtls1UpIy5AsM= -github.com/spf13/viper v1.10.1 h1:nuJZuYpG7gTj/XqiUwg8bA0cp1+M2mC3J4g5luUYBKk= -github.com/spf13/viper v1.10.1/go.mod h1:IGlFPqhNAPKRxohIzWpI5QEy4kuI7tcl5WvR+8qy1rU= +github.com/spf13/viper v1.12.0 h1:CZ7eSOd3kZoaYDLbXnmzgQI5RlciuXBMA+18HwHRfZQ= +github.com/spf13/viper v1.12.0/go.mod h1:b6COn30jlNxbm/V2IqWiNWkJ+vZNiMNksliPCiuKtSI= +github.com/ssgreg/nlreturn/v2 v2.2.1 h1:X4XDI7jstt3ySqGU86YGAURbxw3oTDPK9sPEi6YEwQ0= +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/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/stbenjam/no-sprintf-host-port v0.1.1 h1:tYugd/yrm1O0dV+ThCbaKZh195Dfm07ysF0U6JQXczc= +github.com/stbenjam/no-sprintf-host-port v0.1.1/go.mod h1:TLhvtIvONRzdmkFiio4O8LHsN9N74I+PhRquPsxpL0I= github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8= github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= -github.com/streadway/amqp v1.0.0/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= -github.com/streadway/handy v0.0.0-20200128134331-0f66f006fb2e/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= github.com/stretchr/objx v0.0.0-20180129172003-8a3f7159479f/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/objx v0.4.0 h1:M2gUjqZET1qApGOWNSnZ49BAIMX4F/1plDv3+l31EJ4= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/testify v0.0.0-20180303142811-b89eecf5ca5d/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.1.4/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.1/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= @@ -1450,52 +1680,69 @@ github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81P github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/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 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/subosito/gotenv v1.4.0 h1:yAzM1+SmVcz5R4tXGsNMu1jUl2aOJXoiWUCEwwnGrvs= +github.com/subosito/gotenv v1.4.0/go.mod h1:mZd6rFysKEcUhUHXJk0C/08wAgyDBFuwEYL7vWWGaGo= +github.com/sylvia7788/contextcheck v1.0.6 h1:o2EZgVPyMKE/Mtoqym61DInKEjwEbsmyoxg3VrmjNO4= +github.com/sylvia7788/contextcheck v1.0.6/go.mod h1:9XDxwvxyuKD+8N+a7Gs7bfWLityh5t70g/GjdEt2N2M= github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= 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/takuoki/gocase v1.0.0 h1:gPwLJTWVm2T1kUiCsKirg/faaIUGVTI0FA3SYr75a44= github.com/takuoki/gocase v1.0.0/go.mod h1:QgOKJrbuJoDrtoKswBX1/Dw8mJrkOV9tbQZJaxaJ6zc= github.com/tchap/go-patricia v2.2.6+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I= -github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c/go.mod h1:ahpPrc7HpcfEWDQRZEmnXMzHY03mLDYMCxeDzy46i+8= +github.com/tdakkota/asciicheck v0.1.1 h1:PKzG7JUTUmVspQTDqtkX9eSiLGossXTybutHwTXuO0A= +github.com/tdakkota/asciicheck v0.1.1/go.mod h1:yHp0ai0Z9gUljN3o0xMhYJnH/IcvkdTBOX2fmJ93JEM= github.com/tendermint/btcd v0.1.1 h1:0VcxPfflS2zZ3RiOAHkBiFUcPvbtRj5O7zHmcJWHV7s= github.com/tendermint/btcd v0.1.1/go.mod h1:DC6/m53jtQzr/NFmMNEu0rxf18/ktVoVtMrnDD5pN+U= github.com/tendermint/crypto v0.0.0-20191022145703-50d29ede1e15 h1:hqAk8riJvK4RMWx1aInLzndwxKalgi5rTqgfXxOxbEI= github.com/tendermint/crypto v0.0.0-20191022145703-50d29ede1e15/go.mod h1:z4YtwM70uOnk8h0pjJYlj3zdYwi9l03By6iAIF5j/Pk= github.com/tendermint/flutter/v2 v2.0.4 h1:0/FndUq1YgzNwfaDMZYHul6hb6A5yBX2nEZfJRaxZcI= github.com/tendermint/flutter/v2 v2.0.4/go.mod h1:hnaVhWhzv2Od1LqZFWrRKwiOHeMonsB9EIWP0AGMPw0= -github.com/tendermint/fundraising v0.3.1-0.20220613014523-03b4a2d4481a h1:DIxap6r3z89JLoaLp6TTtt8XS7Zgfy4XACfG6b+4plE= -github.com/tendermint/fundraising v0.3.1-0.20220613014523-03b4a2d4481a/go.mod h1:oJFZUZ/GsACtkYeWScKpHLdqMUThNWpMAi/G47LJUi4= +github.com/tendermint/fundraising v0.3.1 h1:S4uOV/T7YNBqXhsCZnq/TUoHB0d2kM+6tKeTD4WhLN0= 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/spn v0.2.1-0.20220708132853-26a17f03c072 h1:J7+gbosE+lUg/m6wGNHs8xRM5ugU3FbdLWwaNg5b9kw= -github.com/tendermint/spn v0.2.1-0.20220708132853-26a17f03c072/go.mod h1:Ek8O0rqggK/yz1ya55hr0tVUPvsAR5sHLLLClTbuPrc= -github.com/tendermint/tendermint v0.34.14/go.mod h1:FrwVm3TvsVicI9Z7FlucHV6Znfd5KBc/Lpp69cCwtk0= -github.com/tendermint/tendermint v0.34.19 h1:y0P1qI5wSa9IRuhKnTDA6IUcOrLi1hXJuALR+R7HFEk= -github.com/tendermint/tendermint v0.34.19/go.mod h1:R5+wgIwSxMdKQcmOaeudL0Cjkr3HDkhpcdum6VeU3R4= -github.com/tendermint/tm-db v0.6.4/go.mod h1:dptYhIpJ2M5kUuenLr+Yyf3zQOv1SgBZcl8/BmWlMBw= -github.com/tendermint/tm-db v0.6.6/go.mod h1:wP8d49A85B7/erz/r4YbKssKw6ylsO/hKtFk7E1aWZI= +github.com/tendermint/spn v0.2.1-0.20220907161743-aab4d3df1f2b h1:QqEBIiWRC+uPM8FCXuxcvzTS6isR/lycQJDRHgsmg2c= +github.com/tendermint/spn v0.2.1-0.20220907161743-aab4d3df1f2b/go.mod h1:CMzd3oBkjR9I1h/BEaU1K2V78XqARFWGjxPP9Xy/FIE= +github.com/tendermint/tendermint v0.34.21 h1:UiGGnBFHVrZhoQVQ7EfwSOLuCtarqCSsRf8VrklqB7s= +github.com/tendermint/tendermint v0.34.21/go.mod h1:XDvfg6U7grcFTDx7VkzxnhazQ/bspGJAn4DZ6DcLLjQ= github.com/tendermint/tm-db v0.6.7 h1:fE00Cbl0jayAoqlExN6oyQJ7fR/ZtoVOmvPJ//+shu8= github.com/tendermint/tm-db v0.6.7/go.mod h1:byQDzFkZV1syXr/ReXS808NxA2xvyuuVgXOJ/088L6I= -github.com/tendermint/vue v0.3.5 h1:PTZaW0+7/4lRJyUtuZOxFzMCahNLowTadVoCZns2Wmw= -github.com/tendermint/vue v0.3.5/go.mod h1:Sg9MGPF+uY+SJ79sdZgtC2LnH+FDU2qWuiRxoZn5bmw= -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/tenntenn/modver v1.0.1 h1:2klLppGhDgzJrScMpkj9Ujy3rXPUspSjAcev9tSEBgA= +github.com/tenntenn/modver v1.0.1/go.mod h1:bePIyQPb7UeioSRkw3Q0XeMhYZSMx9B8ePqg6SAMGH0= +github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3 h1:f+jULpRQGxTSkNYKJ51yaw6ChIqO+Je8UqsTKN/cDag= +github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3/go.mod h1:ON8b8w4BN/kE1EOhwT0o+d62W65a6aPw1nouo9LMgyY= +github.com/tetafro/godot v1.4.11 h1:BVoBIqAf/2QdbFmSwAWnaIqDivZdOV0ZRwEm6jivLKw= +github.com/tetafro/godot v1.4.11/go.mod h1:LR3CJpxDVGlYOWn3ZZg1PgNZdTUvzsZWu8xaEohUpn8= +github.com/tidwall/gjson v1.12.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/gjson v1.14.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= +github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/tidwall/sjson v1.2.4/go.mod h1:098SZ494YoMWPmMO6ct4dcFnqxwj9r/gF0Etp19pSNM= +github.com/timakin/bodyclose v0.0.0-20210704033933-f49887972144 h1:kl4KhGNsJIbDHS9/4U9yQo1UcPQM0kOMJHn29EoH/Ro= +github.com/timakin/bodyclose v0.0.0-20210704033933-f49887972144/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk= +github.com/timonwong/logrlint v0.1.0 h1:phZCcypL/vtx6cGxObJgWZ5wexZF5SXFPLOM+ru0e/M= +github.com/timonwong/logrlint v0.1.0/go.mod h1:Zleg4Gw+kRxNej+Ra7o+tEaW5k1qthTaYKU7rSD39LU= +github.com/tinylib/msgp v1.0.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= github.com/tinylib/msgp v1.1.5/go.mod h1:eQsjooMTnV42mHu917E26IogZ2930nFyBQdofk10Udg= +github.com/tklauser/go-sysconf v0.3.5/go.mod h1:MkWzOF4RMCshBAMXuhXJs64Rte09mITnppBXY/rYEFI= +github.com/tklauser/numcpus v0.2.2/go.mod h1:x3qojaO3uyYt0i56EW/VUYs7uBvdl2fkfZFu0T9wgjM= 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/tomarrell/wrapcheck/v2 v2.6.2 h1:3dI6YNcrJTQ/CJQ6M/DUkc0gnqYSIk6o0rChn9E/D0M= +github.com/tomarrell/wrapcheck/v2 v2.6.2/go.mod h1:ao7l5p0aOlUNJKI0qVwB4Yjlqutd0IvAB9Rdwyilxvg= github.com/tomasen/realip v0.0.0-20180522021738-f0c99a92ddce h1:fb190+cK2Xz/dvi9Hv8eCYJYvIGUTN2/KLq1pT6CjEc= github.com/tomasen/realip v0.0.0-20180522021738-f0c99a92ddce/go.mod h1:o8v6yHRoik09Xen7gje4m9ERNah1d1PPsVq1VEx9vE4= +github.com/tommy-muehle/go-mnd/v2 v2.5.0 h1:iAj0a8e6+dXSL7Liq0aXPox36FiN1dBbjA6lt9fl65s= +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= @@ -1504,49 +1751,68 @@ github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVM github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= +github.com/ulikunitz/xz v0.5.8 h1:ERv8V6GKqVi23rgu5cj9pVfVzJbOqAY2Ntl88O6c2nQ= +github.com/ultraware/funlen v0.0.3 h1:5ylVWm8wsNwH5aWo9438pwvsK0QiqVuUrt9bn7S/iLA= +github.com/ultraware/funlen v0.0.3/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA= +github.com/ultraware/whitespace v0.0.5 h1:hh+/cpIcopyMYbZNVov9iSxvJU3OYQg78Sfaqzi/CzI= +github.com/ultraware/whitespace v0.0.5/go.mod h1:aVMh/gQve5Maj9hQ/hg+F75lr/X5A89uZnzAmWSineA= github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/vektra/mockery/v2 v2.11.0 h1:9NkC3urGvJS9B0ve5aTbFjksbO9f/u5cZFgCTVJ30jg= -github.com/vektra/mockery/v2 v2.11.0/go.mod h1:8vf4KDDUptfkyypzdHLuE7OE2xA7Gdt60WgIS8PgD+U= +github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= +github.com/uudashr/gocognit v1.0.6 h1:2Cgi6MweCsdB6kpcVQp7EW4U23iBFQWfTXiWlyp842Y= +github.com/uudashr/gocognit v1.0.6/go.mod h1:nAIUuVBnYU7pcninia3BHOvQkpQCeO76Uscky5BOwcY= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= +github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= +github.com/vektra/mockery/v2 v2.14.0 h1:KZ1p5Hrn8tiY+LErRMr14HHle6khxo+JKOXLBW/yfqs= +github.com/vektra/mockery/v2 v2.14.0/go.mod h1:bnD1T8tExSgPD1ripLkDbr60JA9VtQeu12P3wgLZd7M= github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk= github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= github.com/vishvananda/netns v0.0.0-20180720170159-13995c7128cc/go.mod h1:ZjcWmFBXmLKZu9Nxj3WKYEafiSqer2rnvPr0en9UNpI= github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= -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/vmihailenco/msgpack/v5 v5.3.5/go.mod h1:7xyJ9e+0+9SaZT0Wt1RGleJXzli6Q/V5KbhBonMG9jc= +github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= +github.com/willf/bitset v1.1.3/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI= -github.com/wsddn/go-ecdh v0.0.0-20161211032359-48726bab9208/go.mod h1:IotVbo4F+mw0EzQ08zFqg7pK3FebNXpaMsRy2RT+Ees= github.com/xanzy/ssh-agent v0.2.1 h1:TCbipTQL2JiiCprBWx9frJ2eJlCYT00NmctrHxVAr70= github.com/xanzy/ssh-agent v0.2.1/go.mod h1:mLlQY/MoOhWBj+gOGMQkOeiEvkx+8pJSI+0Bx9h2kr4= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 h1:QldyIu/L63oPpyvQmHgvgickp1Yw510KJOqX7H24mg8= 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 h1:h5NvIsCz+nRDapQ0exNv4aJ0yXSI0420omVANTv3GJM= +github.com/yagipy/maintidx v1.0.0/go.mod h1:0qNf/I/CCZXSMhsRsrEPDZ+DkekpKLXAJfsTACwgXLk= github.com/ybbus/jsonrpc v2.1.2+incompatible/go.mod h1:XJrh1eMSzdIYFbM08flv0wp5G35eRniyeGut1z+LSiE= +github.com/yeya24/promlinter v0.2.0 h1:xFKDQ82orCU5jQujdaD8stOHiv8UN68BSdn2a8u8Y3o= +github.com/yeya24/promlinter v0.2.0/go.mod h1:u54lkmBOZrpEbQQ6gox2zWKKLKu2SGe+2KOiextY+IA= 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.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= 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 h1:/vn0k+RBvwlxEmP5E7SZMqNxPhfMVFEJiykr15/0XKM= github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13 h1:fVcFKWvrslecOb/tg+Cc05dkeYx540o0FuFt3nUVDoE= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yuin/goldmark-emoji v1.0.1 h1:ctuWEyzGBwiucEqxzwe0SOYDXPAucOrE9NQC18Wa1os= github.com/yuin/goldmark-emoji v1.0.1/go.mod h1:2w1E6FEWLcDQkoTE+7HU6QF1F6SLlNGjRIBbIZQFqkQ= github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA= github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= -github.com/zondax/hid v0.9.0 h1:eiT3P6vNxAEVxXMw66eZUAAnU2zD33JBkfG/EnfAKl8= github.com/zondax/hid v0.9.0/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= +github.com/zondax/hid v0.9.1-0.20220302062450-5552068d2266 h1:O9XLFXGkVswDFmH9LaYpqu+r/AAFWqr0DL6V00KEVFg= +github.com/zondax/hid v0.9.1-0.20220302062450-5552068d2266/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= +gitlab.com/bosi/decorder v0.2.3 h1:gX4/RgK16ijY8V+BRQHAySfQAb354T7/xQpDB2n10P0= +gitlab.com/bosi/decorder v0.2.3/go.mod h1:9K1RB5+VPNQYtXtTDAzd2OEftsZb1oV0IrJrzChSdGE= 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.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= @@ -1554,13 +1820,6 @@ 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.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg= -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/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/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/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk= go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= @@ -1577,18 +1836,22 @@ go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= 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/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= go.uber.org/goleak v1.1.12/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.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 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8= +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.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= 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 h1:WefMeulhovoZ2sYXz7st6K0sLj7bBhpiFaud4r4zST8= +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-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -1604,15 +1867,12 @@ golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190621222207-cc06ce4a13d4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190909091759-094676da4a83/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191122220453-ac88ee75c92c/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -1620,26 +1880,21 @@ golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201012173705-84dcc777aaee/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-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= 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-20210711020723-a769d52b0f97/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-20211215165025-cf75a172585e/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= -golang.org/x/crypto v0.0.0-20220112180741-5e0467b6c7ce h1:Roh6XWxHFKrPgC/EQhVubSAGQ6Ozk6IdxHSzt1mR0EI= -golang.org/x/crypto v0.0.0-20220112180741-5e0467b6c7ce/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa h1:zuSxTR4o9y82ebqCUJYNGJbGPo6sKVl54f/TVDObg1c= +golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190731235908-ec7cb31e5a56/go.mod h1:JhuoJpWY28nO4Vef9tZUw9qufEGTyX1+7lmHxV5q5G4= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= @@ -1648,9 +1903,15 @@ 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-20220428152302-39d4317da171/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= +golang.org/x/exp/typeparams v0.0.0-20220613132600-b0d781184e0d h1:+W8Qf4iJtMGKkyAygcKohjxTk4JPsL9DpzApJ22m5Ic= +golang.org/x/exp/typeparams v0.0.0-20220613132600-b0d781184e0d/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= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= @@ -1661,25 +1922,24 @@ golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRu golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mobile v0.0.0-20200801112145-973feb4309de/go.mod h1:skQtrUTUwhdJvXM/2KKJzY8pDgNr9I/FOMqDVRPBUS4= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191209134235-331c550502dd/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3 h1:kQgndtyPBW/JIYERgdxfwMYh3AVStj88WQTlNDi2a+o= +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 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1702,7 +1962,6 @@ 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-20190827160401-ba9fcec4b297/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-20191004110552-13f9640d40b9/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= @@ -1721,33 +1980,28 @@ golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81R golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210220033124-5f55cee0dc0d/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= -golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210825183410-e898025ed96a/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-20220225172249-27dd8689420f h1:oA4XRj0qtSt8Yo1Zms0CUlsT3KG69V2UGQWPBxujDmc= +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-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220726230323-06994584191e h1:wOQNKh1uuDGRnmgF0jDxh7ctgGy/3P4rYWQRVJD4/Yg= +golang.org/x/net v0.0.0-20220726230323-06994584191e/go.mod h1:AaygXjzTFtRAg2ttMY5RMuhpJ3cNnI0XpyFJD1iQRSM= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1757,14 +2011,9 @@ golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094 h1:2o1E+E8TpNLklK9nHiPiK1uzIYrIHt+cQx3ynCwq9V8= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1775,9 +2024,11 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 h1:uVc8UZUe6tr40fFVnUP5Oj+veunVezqYl9z7DYw9xzw= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1804,18 +2055,15 @@ golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190712062909-fae7ac547cb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190812073006-9eafafc0a87e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1825,6 +2073,7 @@ golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7w 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= +golang.org/x/sys v0.0.0-20200107162124-548cf772de50/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200120151820-655fe14d7479/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1851,7 +2100,7 @@ golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/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-20200817155316-9781c653f443/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200824131525-c12d262b63d8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6/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-20200916030750-2334cc1a136f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1859,7 +2108,6 @@ golang.org/x/sys v0.0.0-20200922070232-aee5d888a860/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201009025420-dfb3f7c4e634/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201015000850-e3ed0017c211/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201020230747-6e5568b54d1a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201117170446-d9b008d0a637/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1867,55 +2115,46 @@ golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201202213521-69691e467435/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-20210113181707-4bcb84eeeb78/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210316164454-77fc1eacc6aa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210420205809-ac73e9fd8988/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210903071746-97244b99971b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210819135213-f52c844e1c1c/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-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220315194320-039c03cc5b86 h1:A9i04dxx7Cribqbs8jf3FQLogkL/CV2YN7hj9KWJCkc= -golang.org/x/sys v0.0.0-20220315194320-039c03cc5b86/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220702020025-31831981b65f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab h1:2QkjZIsXupsJbJIdSjjUOgWK3aEtzyuh2mPt3l/CkeU= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-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-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -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-20220722155259-a9ba230a4035 h1:Q5284mrmYTpACcm+eAKjKJH48BBwSyfJqmmGDTtT8Vc= +golang.org/x/term v0.0.0-20220722155259-a9ba230a4035/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1932,15 +2171,22 @@ golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-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-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= @@ -1952,12 +2198,14 @@ golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190706070813-72ffa07ba3db/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= 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-20191004055002-72853e10c5a3/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= @@ -1968,8 +2216,9 @@ golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapK golang.org/x/tools v0.0.0-20191224055732-dd894d0a8a40/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-20200108203644-89082a384178/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= @@ -1979,7 +2228,10 @@ 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-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -1987,35 +2239,50 @@ golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20200616133436-c1934b75d054/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-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-20200916195026-c9a70fc28ce3/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= +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-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.10 h1:QjFRCZxdOhBJ/UNgnBZLbNV13DlbnK0quyivTnXJM20= +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/go.mod h1:SgwaegtQh8clINPpECJMqnxLv9I09HLqnW3RMqW0CA4= +golang.org/x/tools v0.1.12 h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= 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 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f h1:uF6paiQQebLeSXkrTqHqz0MXhXXS1KgF41eUdBNvxK0= +golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/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.0.0-20181121035319-3f7ecaa7e8ca/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= +gonum.org/v1/gonum v0.6.0/go.mod h1:9mxDZsDKxgMAuccQkewq682L+0eCu4dCN2yonUJTCLU= +gonum.org/v1/netlib v0.0.0-20181029234149-ec6d1f5cefe6/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= 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.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= @@ -2039,20 +2306,7 @@ google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz513 google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= -google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= -google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= -google.golang.org/api v0.62.0/go.mod h1:dKmwPCydfsad4qCH08MSdgWjfHOyfpd4VtDGgRFdavw= -google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= +google.golang.org/api v0.84.0 h1:NMB9J4cCxs9xEm+1Z9QiO3eFvn7EnQj3Eo3hN6ugVlg= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -2060,6 +2314,7 @@ google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7 google.golang.org/appengine v1.6.1/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 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8/go.mod h1:0H1ncTHf11KCFhTc/+EFRbzSCOZx+VUbRMk55Yv5MYk= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= @@ -2070,6 +2325,7 @@ google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRn google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190522204451-c2c4e71fbf69/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= +google.golang.org/genproto v0.0.0-20190716160619-c506a9f90610/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= 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= @@ -2077,6 +2333,7 @@ google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvx 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= google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200108215221-bd8f9a0ef82f/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200117163144-32f20d992d24/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= @@ -2102,47 +2359,44 @@ google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201119123407-9b1e624d6bc4/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210126160654-44e461bb6506/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211028162531-8db9c33dc351/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211129164237-f09f9a12af12/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211203200212-54befc351ae9/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd h1:e0TwkXOdbnH/1x5rc5MZ/VYyiZ4v+RdVfrGMqEwT68I= -google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/grpc v1.33.2 h1:EQyQC3sa8M+p6Ulc8yy9SWSS2GVwyRc83gAbG8lrl4o= +google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc h1:Nf+EdcTLHR8qDNN/KfkQL0u0ssxt9OhbaWCl5C0ucEI= +google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= +google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.19.1/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= +google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= +google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.49.0 h1:WTLtQzmQori5FUH25Pq4WT22oCsv8USpQ+F6rqtsmxw= +google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -2156,8 +2410,8 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0 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/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= 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= @@ -2165,18 +2419,19 @@ gopkg.in/check.v1 v1.0.0-20141024133853-64131543e789/go.mod h1:Co6ibVJAznAaIkqp8 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/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= +gopkg.in/errgo.v2 v2.1.0 h1:0vLT13EuvQ0hNvakwLuFZ/jYrLp5F3kcWHXdRggjCE8= 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/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.66.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.66.3 h1:jRskFVxYaMGAMUbN0UZ7niA9gzL9B49DOqE78vg0k3w= -gopkg.in/ini.v1 v1.66.3/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.66.6 h1:LATuAqN/shcYAOkv3wl2L4rkaKqkcgTBQjOyYDvcPKI= +gopkg.in/ini.v1 v1.66.6/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= 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= @@ -2202,13 +2457,15 @@ gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= 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.0.3 h1:4AuOwCGf4lLR9u3YOe2awrHygurzhO/HeQ6laiA6Sx0= gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= -gotest.tools/v3 v3.1.0 h1:rVV8Tcg/8jHUkPUorwjaMTtemIMVXfIPKiOqnhEhakk= -gotest.tools/v3 v3.1.0/go.mod h1:fHy7eyTmJFO5bQbUsEGQ1v4m2J3Jz9eWL54TP2/ZuYQ= +honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -2216,6 +2473,9 @@ 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.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= +honnef.co/go/tools v0.3.3 h1:oDx7VAwstgpYpb3wv0oxiZlxY+foCpRAwY7Vk6XpAgA= +honnef.co/go/tools v0.3.3/go.mod h1:jzwdWgg7Jdq75wlfblQxO4neNaFFSvgc1tD5Wv8U0Yw= k8s.io/api v0.20.1/go.mod h1:KqwcCVogGxQY3nBlRpwt+wpAMF/KjaCc7RpywacvqUo= k8s.io/api v0.20.4/go.mod h1:++lNL1AJMkDymriNniQsWRkMDzRaX2Y/POTUi8yvqYQ= k8s.io/api v0.20.6/go.mod h1:X9e8Qag6JV/bL5G6bU8sdVRltWKmdHsFUGS3eVndqE8= @@ -2246,12 +2506,22 @@ k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +mvdan.cc/gofumpt v0.3.1 h1:avhhrOmv0IuvQVK7fvwV91oFSGAk5/6Po8GXTzICeu8= +mvdan.cc/gofumpt v0.3.1/go.mod h1:w3ymliuxvzVx8DAutBnVyDqYb1Niy/yCJt/lk821YCE= +mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed h1:WX1yoOaKQfddO/mLzdV4wptyWgoH/6hwLs7QHTixo0I= +mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc= +mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b h1:DxJ5nJdkhDlLok9K6qO+5290kphDJbHOQO1DFFFTeBo= +mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4= +mvdan.cc/unparam v0.0.0-20220706161116-678bad134442 h1:seuXWbRB1qPrS3NQnHmFKLJLtskWyueeIzmLXghMGgk= +mvdan.cc/unparam v0.0.0-20220706161116-678bad134442/go.mod h1:F/Cxw/6mVrNKqrR2YjFf5CaW0Bw4RL8RfbEf4GRggJk= nhooyr.io/websocket v1.8.6 h1:s+C3xAMLwGmlI31Nyn/eAehUlZPwfYZu2JXM621Q5/k= nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= +pgregory.net/rapid v0.4.7/go.mod h1:UYpPVyjFHzYBGHIxLFoupi8vwk6rXNzRY9OMvVxFIOU= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= @@ -2259,4 +2529,6 @@ sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK sigs.k8s.io/structured-merge-diff/v4 v4.0.3/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= +sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= +sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= diff --git a/ignite/chainconfig/config.go b/ignite/chainconfig/config.go index 67084e9eba..bc8cdfc72a 100644 --- a/ignite/chainconfig/config.go +++ b/ignite/chainconfig/config.go @@ -21,12 +21,10 @@ var ( ConfigFileNames = []string{"config.yml", "config.yaml"} ) -var ( - // ErrCouldntLocateConfig returned when config.yml cannot be found in the source code. - ErrCouldntLocateConfig = errors.New( - "could not locate a config.yml in your chain. please follow the link for" + - "how-to: https://github.com/ignite/cli/blob/develop/docs/configure/index.md") -) +// ErrCouldntLocateConfig returned when config.yml cannot be found in the source code. +var ErrCouldntLocateConfig = errors.New( + "could not locate a config.yml in your chain. please follow the link for" + + "how-to: https://github.com/ignite/cli/blob/develop/docs/configure/index.md") // DefaultConf holds default configuration. var DefaultConf = Config{ @@ -114,8 +112,11 @@ type Proto struct { // Client configures code generation for clients. type Client struct { - // Vuex configures code generation for Vuex. - Vuex Vuex `yaml:"vuex"` + // TSClient configures code generation for Typescript Client. + Typescript Typescript `yaml:"typescript"` + + // Vuex configures code generation for Vuex stores. + Vuex Typescript `yaml:"vuex"` // Dart configures client code generation for Dart. Dart Dart `yaml:"dart"` @@ -124,9 +125,15 @@ type Client struct { OpenAPI OpenAPI `yaml:"openapi"` } -// Vuex configures code generation for Vuex. +// TSClient configures code generation for Typescript Client. +type Typescript struct { + // Path configures out location for generated Typescript Client code. + Path string `yaml:"path"` +} + +// Vuex configures code generation for Vuex stores. type Vuex struct { - // Path configures out location for generated Vuex code. + // Path configures out location for generated Vuex stores code. Path string `yaml:"path"` } @@ -265,5 +272,5 @@ func CreateConfigDir() error { return err } - return os.MkdirAll(confPath, 0755) + return os.MkdirAll(confPath, 0o755) } diff --git a/ignite/cmd/account.go b/ignite/cmd/account.go index 57801c0f57..0a113d9ea4 100644 --- a/ignite/cmd/account.go +++ b/ignite/cmd/account.go @@ -16,19 +16,30 @@ const ( flagPassphrase = "passphrase" flagNonInteractive = "non-interactive" flagKeyringBackend = "keyring-backend" + flagKeyringDir = "keyring-dir" flagFrom = "from" ) func NewAccount() *cobra.Command { c := &cobra.Command{ Use: "account [command]", - Short: "Commands for managing accounts", - Long: `Commands for managing accounts. An account is a pair of a private key and a public key. -Ignite CLI uses accounts to interact with the Ignite blockchain, use an IBC relayer, and more.`, + Short: "Commands for managing Ignite accounts", + Long: `Commands for managing Ignite accounts. An Ignite account is a private/public +keypair stored in a keyring. Currently Ignite accounts are used when interacting +with Ignite relayer commands. + +Note: Ignite account commands are not for managing your chain's keys and accounts. Use +you chain's binary to manage accounts from "config.yml". For example, if your +blockchain is called "mychain", use "mychaind keys" to manage keys for the +chain. +`, Aliases: []string{"a"}, Args: cobra.ExactArgs(1), } + c.PersistentFlags().AddFlagSet(flagSetKeyringBackend()) + c.PersistentFlags().AddFlagSet(flagSetKeyringDir()) + c.AddCommand(NewAccountCreate()) c.AddCommand(NewAccountDelete()) c.AddCommand(NewAccountShow()) @@ -42,14 +53,24 @@ Ignite CLI uses accounts to interact with the Ignite blockchain, use an IBC rela func printAccounts(cmd *cobra.Command, accounts ...cosmosaccount.Account) error { var accEntries [][]string for _, acc := range accounts { - accEntries = append(accEntries, []string{acc.Name, acc.Address(getAddressPrefix(cmd)), acc.PubKey()}) + addr, err := acc.Address(getAddressPrefix(cmd)) + if err != nil { + return err + } + + pubKey, err := acc.PubKey() + if err != nil { + return err + } + + accEntries = append(accEntries, []string{acc.Name, addr, pubKey}) } return entrywriter.MustWrite(os.Stdout, []string{"name", "address", "public key"}, accEntries...) } func flagSetKeyringBackend() *flag.FlagSet { fs := flag.NewFlagSet("", flag.ContinueOnError) - fs.String(flagKeyringBackend, "test", "Keyring backend to store your account keys") + fs.String(flagKeyringBackend, string(cosmosaccount.KeyringTest), "Keyring backend to store your account keys") return fs } @@ -58,6 +79,17 @@ func getKeyringBackend(cmd *cobra.Command) cosmosaccount.KeyringBackend { return cosmosaccount.KeyringBackend(backend) } +func flagSetKeyringDir() *flag.FlagSet { + fs := flag.NewFlagSet("", flag.ContinueOnError) + fs.String(flagKeyringDir, cosmosaccount.KeyringHome, "The accounts keyring directory") + return fs +} + +func getKeyringDir(cmd *cobra.Command) string { + keyringDir, _ := cmd.Flags().GetString(flagKeyringDir) + return keyringDir +} + func flagSetAccountPrefixes() *flag.FlagSet { fs := flag.NewFlagSet("", flag.ContinueOnError) fs.String(flagAddressPrefix, cosmosaccount.AccountPrefixCosmos, "Account address prefix") @@ -74,10 +106,17 @@ func getFrom(cmd *cobra.Command) string { return prefix } -func flagSetAccountImportExport() *flag.FlagSet { +func flagSetAccountImport() *flag.FlagSet { + fs := flag.NewFlagSet("", flag.ContinueOnError) + fs.Bool(flagNonInteractive, false, "Do not enter into interactive mode") + fs.String(flagPassphrase, "", "Passphrase to decrypt the imported key (ignored when secret is a mnemonic)") + return fs +} + +func flagSetAccountExport() *flag.FlagSet { fs := flag.NewFlagSet("", flag.ContinueOnError) fs.Bool(flagNonInteractive, false, "Do not enter into interactive mode") - fs.String(flagPassphrase, "", "Account passphrase") + fs.String(flagPassphrase, "", "Passphrase to encrypt the exported key") return fs } diff --git a/ignite/cmd/account_create.go b/ignite/cmd/account_create.go index 176e537dc2..e0febdc74b 100644 --- a/ignite/cmd/account_create.go +++ b/ignite/cmd/account_create.go @@ -16,8 +16,6 @@ func NewAccountCreate() *cobra.Command { RunE: accountCreateHandler, } - c.Flags().AddFlagSet(flagSetKeyringBackend()) - return c } @@ -26,14 +24,15 @@ func accountCreateHandler(cmd *cobra.Command, args []string) error { ca, err := cosmosaccount.New( cosmosaccount.WithKeyringBackend(getKeyringBackend(cmd)), + cosmosaccount.WithHome(getKeyringDir(cmd)), ) if err != nil { - return err + return fmt.Errorf("unable to create registry: %w", err) } _, mnemonic, err := ca.Create(name) if err != nil { - return err + return fmt.Errorf("unable to create account: %w", err) } fmt.Printf("Account %q created, keep your mnemonic in a secret place:\n\n%s\n", name, mnemonic) diff --git a/ignite/cmd/account_delete.go b/ignite/cmd/account_delete.go index f7f7ddb4e6..f999f86955 100644 --- a/ignite/cmd/account_delete.go +++ b/ignite/cmd/account_delete.go @@ -16,8 +16,6 @@ func NewAccountDelete() *cobra.Command { RunE: accountDeleteHandler, } - c.Flags().AddFlagSet(flagSetKeyringBackend()) - return c } @@ -26,6 +24,7 @@ func accountDeleteHandler(cmd *cobra.Command, args []string) error { ca, err := cosmosaccount.New( cosmosaccount.WithKeyringBackend(getKeyringBackend(cmd)), + cosmosaccount.WithHome(getKeyringDir(cmd)), ) if err != nil { return err diff --git a/ignite/cmd/account_export.go b/ignite/cmd/account_export.go index 2484af4b01..3436bc13c9 100644 --- a/ignite/cmd/account_export.go +++ b/ignite/cmd/account_export.go @@ -18,8 +18,7 @@ func NewAccountExport() *cobra.Command { RunE: accountExportHandler, } - c.Flags().AddFlagSet(flagSetKeyringBackend()) - c.Flags().AddFlagSet(flagSetAccountImportExport()) + c.Flags().AddFlagSet(flagSetAccountExport()) c.Flags().String(flagPath, "", "path to export private key. default: ./key_[name]") return c @@ -35,9 +34,14 @@ func accountExportHandler(cmd *cobra.Command, args []string) error { if err != nil { return err } + const minPassLength = 8 + if len(passphrase) < minPassLength { + return fmt.Errorf("passphrase must be at least %d characters", minPassLength) + } ca, err := cosmosaccount.New( cosmosaccount.WithKeyringBackend(getKeyringBackend(cmd)), + cosmosaccount.WithHome(getKeyringDir(cmd)), ) if err != nil { return err @@ -56,7 +60,7 @@ func accountExportHandler(cmd *cobra.Command, args []string) error { return err } - if err := os.WriteFile(path, []byte(armored), 0644); err != nil { + if err := os.WriteFile(path, []byte(armored), 0o644); err != nil { return err } diff --git a/ignite/cmd/account_import.go b/ignite/cmd/account_import.go index 78e67e3e06..762bf8b46c 100644 --- a/ignite/cmd/account_import.go +++ b/ignite/cmd/account_import.go @@ -23,8 +23,7 @@ func NewAccountImport() *cobra.Command { } c.Flags().String(flagSecret, "", "Your mnemonic or path to your private key (use interactive mode instead to securely pass your mnemonic)") - c.Flags().AddFlagSet(flagSetKeyringBackend()) - c.Flags().AddFlagSet(flagSetAccountImportExport()) + c.Flags().AddFlagSet(flagSetAccountImport()) return c } @@ -42,12 +41,14 @@ func accountImportHandler(cmd *cobra.Command, args []string) error { } } - passphrase, err := getPassphrase(cmd) - if err != nil { - return err - } - + var passphrase string if !bip39.IsMnemonicValid(secret) { + var err error + passphrase, err = getPassphrase(cmd) + if err != nil { + return err + } + privKey, err := os.ReadFile(secret) if os.IsNotExist(err) { return errors.New("mnemonic is not valid or private key not found at path") @@ -60,6 +61,7 @@ func accountImportHandler(cmd *cobra.Command, args []string) error { ca, err := cosmosaccount.New( cosmosaccount.WithKeyringBackend(getKeyringBackend(cmd)), + cosmosaccount.WithHome(getKeyringDir(cmd)), ) if err != nil { return err diff --git a/ignite/cmd/account_list.go b/ignite/cmd/account_list.go index b236c8575a..66066a6bc4 100644 --- a/ignite/cmd/account_list.go +++ b/ignite/cmd/account_list.go @@ -13,7 +13,6 @@ func NewAccountList() *cobra.Command { RunE: accountListHandler, } - c.Flags().AddFlagSet(flagSetKeyringBackend()) c.Flags().AddFlagSet(flagSetAccountPrefixes()) return c @@ -22,6 +21,7 @@ func NewAccountList() *cobra.Command { func accountListHandler(cmd *cobra.Command, args []string) error { ca, err := cosmosaccount.New( cosmosaccount.WithKeyringBackend(getKeyringBackend(cmd)), + cosmosaccount.WithHome(getKeyringDir(cmd)), ) if err != nil { return err diff --git a/ignite/cmd/account_show.go b/ignite/cmd/account_show.go index 7d340a41b1..dedc2e652a 100644 --- a/ignite/cmd/account_show.go +++ b/ignite/cmd/account_show.go @@ -14,7 +14,6 @@ func NewAccountShow() *cobra.Command { RunE: accountShowHandler, } - c.Flags().AddFlagSet(flagSetKeyringBackend()) c.Flags().AddFlagSet(flagSetAccountPrefixes()) return c @@ -25,6 +24,7 @@ func accountShowHandler(cmd *cobra.Command, args []string) error { ca, err := cosmosaccount.New( cosmosaccount.WithKeyringBackend(getKeyringBackend(cmd)), + cosmosaccount.WithHome(getKeyringDir(cmd)), ) if err != nil { return err diff --git a/ignite/cmd/chain.go b/ignite/cmd/chain.go index b2084dcdcf..95d158b035 100644 --- a/ignite/cmd/chain.go +++ b/ignite/cmd/chain.go @@ -6,9 +6,56 @@ import "github.com/spf13/cobra" // blockchains and so on. func NewChain() *cobra.Command { c := &cobra.Command{ - Use: "chain [command]", - Short: "Build, initialize and start a blockchain node or perform other actions on the blockchain", - Long: `Build, initialize and start a blockchain node or perform other actions on the blockchain.`, + Use: "chain [command]", + Short: "Build, initialize and start a blockchain node or perform other actions on the blockchain", + Long: `Commands in this namespace let you to build, initialize, and start your +blockchain node locally for development purposes. + +To run these commands you should be inside the project's directory so that +Ignite can find the source code. To ensure that you are, run "ls", you should +see the following files in the output: "go.mod", "x", "proto", "app", etc. + +By default the "build" command will identify the "main" package of the project, +install dependencies if necessary, set build flags, compile the project into a +binary and install the binary. The "build" command is useful if you just want +the compiled binary, for example, to initialize and start the chain manually. It +can also be used to release your chain's binaries automatically as part of +continuous integration workflow. + +The "init" command will build the chain's binary and use it to initialize a +local validator node. By default the validator node will be initialized in your +$HOME directory in a hidden directory that matches the name of your project. +This directory is called a data directory and contains a chain's genesis file +and a validator key. This command is useful if you want to quickly build and +initialize the data directory and use the chain's binary to manually start the +blockchain. The "init" command is meant only for development purposes, not +production. + +The "serve" command builds, initializes, and starts your blockchain locally with +a single validator node for development purposes. "serve" also watches the +source code directory for file changes and intelligently +re-builds/initializes/starts the chain, essentially providing "code-reloading". +The "serve" command is meant only for development purposes, not production. + +To distinguish between production and development consider the following. + +In production, blockchains often run the same software on many validator nodes +that are run by different people and entities. To launch a blockchain in +production, the validator entities coordinate the launch process to start their +nodes simultaneously. + +During development, a blockchain can be started locally on a single validator +node. This convenient process lets you restart a chain quickly and iterate +faster. Starting a chain on a single node in development is similar to starting +a traditional web application on a local server. + +The "faucet" command lets you send tokens to an address from the "faucet" +account defined in "config.yml". Alternatively, you can use the chain's binary +to send token from any other account that exists on chain. + +The "simulate" command helps you start a simulation testing process for your +chain. +`, Aliases: []string{"c"}, Args: cobra.ExactArgs(1), } diff --git a/ignite/cmd/chain_build.go b/ignite/cmd/chain_build.go index 7b26d51039..6bd685620a 100644 --- a/ignite/cmd/chain_build.go +++ b/ignite/cmd/chain_build.go @@ -5,6 +5,7 @@ import ( "path/filepath" "github.com/spf13/cobra" + flag "github.com/spf13/pflag" "github.com/ignite/cli/ignite/pkg/chaincmd" "github.com/ignite/cli/ignite/pkg/cliui/colors" @@ -12,10 +13,11 @@ import ( ) const ( - flagOutput = "output" - flagRelease = "release" - flagReleaseTargets = "release.targets" - flagReleasePrefix = "release.prefix" + flagCheckDependencies = "check-dependencies" + flagOutput = "output" + flagRelease = "release" + flagReleasePrefix = "release.prefix" + flagReleaseTargets = "release.targets" ) // NewChainBuild returns a new build command to build a blockchain app. @@ -23,30 +25,72 @@ func NewChainBuild() *cobra.Command { c := &cobra.Command{ Use: "build", Short: "Build a node binary", - Long: `By default, build your node binaries -and add the binaries to your $(go env GOPATH)/bin path. + Long: ` +The build command compiles the source code of the project into a binary and +installs the binary in the $(go env GOPATH)/bin directory. -To build binaries for a release, use the --release flag. The app binaries -for one or more specified release targets are built in a release/ dir under the app's -source. Specify the release targets with GOOS:GOARCH build tags. -If the optional --release.targets is not specified, a binary is created for your current environment. +You can customize the output directory for the binary using a flag: -Sample usages: - - ignite chain build - - ignite chain build --release -t linux:amd64 -t darwin:amd64 -t darwin:arm64`, + ignite chain build --output dist + +To compile the binary Ignite first compiles protocol buffer (proto) files into +Go source code. Proto files contain required type and services definitions. If +you're using another program to compile proto files, you can use a flag to tell +Ignite to skip the proto compilation step: + + ignite chain build --skip-proto + +Afterwards, Ignite install dependencies specified in the go.mod file. By default +Ignite doesn't check that dependencies of the main module stored in the module +cache have not been modified since they were downloaded. To enforce dependency +checking (essentially, running "go mod verify") use a flag: + + ignite chain build --check-dependencies + +Next, Ignite identifies the "main" package of the project. By default the "main" +package is located in "cmd/{app}d" directory, where "{app}" is the name of the +scaffolded project and "d" stands for daemon. If your your project contains more +than one "main" package, specify the path to the one that Ignite should compile +in config.yml: + +build: + main: custom/path/to/main + +By default the binary name will match the top-level module name (specified in +go.mod) with a suffix "d". This can be customized in config.yml: + +build: + binary: mychaind + +You can also specify custom linker flags: + +build: + ldflags: + - "-X main.Version=development" + - "-X main.Date=01/05/2022T19:54" + +To build binaries for a release, use the --release flag. The binaries for one or +more specified release targets are built in a "release/" directory in the +project's source directory. Specify the release targets with GOOS:GOARCH build +tags. If the optional --release.targets is not specified, a binary is created +for your current environment. + + ignite chain build --release -t linux:amd64 -t darwin:amd64 -t darwin:arm64 +`, Args: cobra.NoArgs, RunE: chainBuildHandler, } flagSetPath(c) flagSetClearCache(c) - c.Flags().AddFlagSet(flagSetHome()) c.Flags().AddFlagSet(flagSetProto3rdParty("Available only without the --release flag")) + c.Flags().AddFlagSet(flagSetCheckDependencies()) + c.Flags().AddFlagSet(flagSetSkipProto()) c.Flags().Bool(flagRelease, false, "build for a release") c.Flags().StringSliceP(flagReleaseTargets, "t", []string{}, "release targets. Available only with --release flag") c.Flags().String(flagReleasePrefix, "", "tarball prefix for each release target. Available only with --release flag") c.Flags().StringP(flagOutput, "o", "", "binary output path") - c.Flags().BoolP("verbose", "v", false, "Verbose output") + c.Flags().BoolP("verbose", "v", false, "verbose output") return c } @@ -68,6 +112,10 @@ func chainBuildHandler(cmd *cobra.Command, _ []string) error { chainOption = append(chainOption, chain.EnableThirdPartyModuleCodegen()) } + if flagGetCheckDependencies(cmd) { + chainOption = append(chainOption, chain.CheckDependencies()) + } + c, err := newChainWithHomeFlags(cmd, chainOption...) if err != nil { return err @@ -89,7 +137,7 @@ func chainBuildHandler(cmd *cobra.Command, _ []string) error { return nil } - binaryName, err := c.Build(cmd.Context(), cacheStorage, output) + binaryName, err := c.Build(cmd.Context(), cacheStorage, output, flagGetSkipProto(cmd)) if err != nil { return err } @@ -103,3 +151,15 @@ func chainBuildHandler(cmd *cobra.Command, _ []string) error { return nil } + +func flagSetCheckDependencies() *flag.FlagSet { + usage := "verify that cached dependencies have not been modified since they were downloaded" + fs := flag.NewFlagSet("", flag.ContinueOnError) + fs.Bool(flagCheckDependencies, false, usage) + return fs +} + +func flagGetCheckDependencies(cmd *cobra.Command) (check bool) { + check, _ = cmd.Flags().GetBool(flagCheckDependencies) + return +} diff --git a/ignite/cmd/chain_init.go b/ignite/cmd/chain_init.go index a3d6eab3c0..86623aac13 100644 --- a/ignite/cmd/chain_init.go +++ b/ignite/cmd/chain_init.go @@ -14,13 +14,76 @@ func NewChainInit() *cobra.Command { c := &cobra.Command{ Use: "init", Short: "Initialize your chain", - Args: cobra.NoArgs, - RunE: chainInitHandler, + Long: `The init command compiles and installs the binary (like "ignite chain build") +and uses that binary to initialize the blockchain's data directory for one +validator. To learn how the build process works, refer to "ignite chain build +--help". + +By default, the data directory will be initialized in $HOME/.mychain, where +"mychain" is the name of the project. To set a custom data directory use the +--home flag or set the value in config.yml: + +init: + home: "~/.customdir" + +The data directory contains three files in the "config" directory: app.toml, +config.toml, client.toml. These files let you customize the behavior of your +blockchain node and the client executable. When a chain is re-initialized the +data directory can be reset. To make some values in these files persistent, set +them in config.yml: + +init: + app: + minimum-gas-prices: "0.025stake" + config: + consensus: + timeout_commit: "5s" + timeout_propose: "5s" + client: + output: "json" + +The configuration above changes the minimum gas price of the validator (by +default the gas price is set to 0 to allow "free" transactions), sets the block +time to 5s, and changes the output format to JSON. To see what kind of values +this configuration accepts see the generated TOML files in the data directory. + +As part of the initialization process Ignite creates on-chain accounts with +token balances. By default, config.yml has two accounts in the top-level +"accounts" property. You can add more accounts and change their token balances. +Refer to config.yml guide to see which values you can set. + +One of these accounts is a validator account and the amount of self-delegated +tokens can be set in the top-level "validator" property. + +One of the most important components of an initialized chain is the genesis +file, the 0th block of the chain. The genesis file is stored in the data +directory "config" subdirectory and contains the initial state of the chain, +including consensus and module parameters. You can customize the values of the +genesis in config.yml: + +genesis: + app_state: + staking: + params: + bond_denom: "foo" + +The example above changes the staking token to "foo". If you change the staking +denom, make sure the validator account has the right tokens. + +The init command is meant to be used ONLY FOR DEVELOPMENT PURPOSES. Under the +hood it runs commands like "appd init", "appd add-genesis-account", "appd +gentx", and "appd collect-gentx". For production, you may want to run these +commands manually to ensure a production-level node initialization. +`, + Args: cobra.NoArgs, + RunE: chainInitHandler, } flagSetPath(c) flagSetClearCache(c) c.Flags().AddFlagSet(flagSetHome()) + c.Flags().AddFlagSet(flagSetCheckDependencies()) + c.Flags().AddFlagSet(flagSetSkipProto()) return c } @@ -31,6 +94,10 @@ func chainInitHandler(cmd *cobra.Command, _ []string) error { chain.KeyringBackend(chaincmd.KeyringBackendTest), } + if flagGetCheckDependencies(cmd) { + chainOption = append(chainOption, chain.CheckDependencies()) + } + c, err := newChainWithHomeFlags(cmd, chainOption...) if err != nil { return err @@ -41,7 +108,7 @@ func chainInitHandler(cmd *cobra.Command, _ []string) error { return err } - if _, err := c.Build(cmd.Context(), cacheStorage, ""); err != nil { + if _, err := c.Build(cmd.Context(), cacheStorage, "", flagGetSkipProto(cmd)); err != nil { return err } diff --git a/ignite/cmd/chain_serve.go b/ignite/cmd/chain_serve.go index 0fa4b10fa2..9f9512ec7a 100644 --- a/ignite/cmd/chain_serve.go +++ b/ignite/cmd/chain_serve.go @@ -17,15 +17,49 @@ func NewChainServe() *cobra.Command { c := &cobra.Command{ Use: "serve", Short: "Start a blockchain node in development", - Long: "Start a blockchain node with automatic reloading", - Args: cobra.NoArgs, - RunE: chainServeHandler, + Long: `The serve command compiles and installs the binary (like "ignite chain build"), +uses that binary to initialize the blockchain's data directory for one validator +(like "ignite chain init"), and starts the node locally for development purposes +with automatic code reloading. + +Automatic code reloading means Ignite starts watching the project directory. +Whenever a file change is detected, Ignite automatically rebuilds, reinitializes +and restarts the node. + +Whenever possible Ignite will try to keep the current state of the chain by +exporting and importing the genesis file. + +To force Ignite to start from a clean slate even if a genesis file exists, use +the following flag: + + ignite chain serve --reset-once + +To force Ignite to reset the state every time the source code is modified, use +the following flag: + + ignite chain serve --force-reset + +With Ignite it's possible to start more than one blockchain from the same source +code using different config files. This is handy if you're building +inter-blockchain functionality and, for example, want to try sending packets +from one blockchain to another. To start a node using a specific config file: + + ignite chain serve --config mars.yml + +The serve command is meant to be used ONLY FOR DEVELOPMENT PURPOSES. Under the +hood, it runs "appd start", where "appd" is the name of your chain's binary. For +production, you may want to run "appd start" manually. +`, + Args: cobra.NoArgs, + RunE: chainServeHandler, } flagSetPath(c) flagSetClearCache(c) c.Flags().AddFlagSet(flagSetHome()) c.Flags().AddFlagSet(flagSetProto3rdParty("")) + c.Flags().AddFlagSet(flagSetCheckDependencies()) + c.Flags().AddFlagSet(flagSetSkipProto()) c.Flags().BoolP("verbose", "v", false, "Verbose output") c.Flags().BoolP(flagForceReset, "f", false, "Force reset of the app state on start and every source change") c.Flags().BoolP(flagResetOnce, "r", false, "Reset of the app state on first start") @@ -43,6 +77,10 @@ func chainServeHandler(cmd *cobra.Command, args []string) error { chainOption = append(chainOption, chain.EnableThirdPartyModuleCodegen()) } + if flagGetCheckDependencies(cmd) { + chainOption = append(chainOption, chain.CheckDependencies()) + } + // check if custom config is defined config, err := cmd.Flags().GetString(flagConfig) if err != nil { @@ -80,5 +118,9 @@ func chainServeHandler(cmd *cobra.Command, args []string) error { serveOptions = append(serveOptions, chain.ServeResetOnce()) } + if flagGetSkipProto(cmd) { + serveOptions = append(serveOptions, chain.ServeSkipProto()) + } + return c.Serve(cmd.Context(), cacheStorage, serveOptions...) } diff --git a/ignite/cmd/cmd.go b/ignite/cmd/cmd.go index f5d03ca539..e285f2363a 100644 --- a/ignite/cmd/cmd.go +++ b/ignite/cmd/cmd.go @@ -32,6 +32,7 @@ const ( flagProto3rdParty = "proto-all-modules" flagYes = "yes" flagClearCache = "clear-cache" + flagSkipProto = "skip-proto" checkVersionTimeout = time.Millisecond * 600 cacheFileName = "ignite_cache.db" @@ -68,6 +69,7 @@ ignite scaffold chain github.com/username/mars`, c.AddCommand(NewChain()) c.AddCommand(NewGenerate()) c.AddCommand(NewNetwork()) + c.AddCommand(NewNode()) c.AddCommand(NewAccount()) c.AddCommand(NewRelayer()) c.AddCommand(NewTools()) @@ -97,7 +99,7 @@ func flagGetPath(cmd *cobra.Command) (path string) { func flagSetHome() *flag.FlagSet { fs := flag.NewFlagSet("", flag.ContinueOnError) - fs.String(flagHome, "", "Home directory used for blockchains") + fs.String(flagHome, "", "home directory used for blockchains") return fs } @@ -126,7 +128,7 @@ func getYes(cmd *cobra.Command) (ok bool) { func flagSetProto3rdParty(additionalInfo string) *flag.FlagSet { fs := flag.NewFlagSet("", flag.ContinueOnError) - info := "Enables proto code generation for 3rd party modules used in your chain" + info := "enables proto code generation for 3rd party modules used in your chain" if additionalInfo != "" { info += ". " + additionalInfo } @@ -140,8 +142,19 @@ func flagGetProto3rdParty(cmd *cobra.Command) bool { return isEnabled } +func flagSetSkipProto() *flag.FlagSet { + fs := flag.NewFlagSet("", flag.ContinueOnError) + fs.Bool(flagSkipProto, false, "skip file generation from proto") + return fs +} + +func flagGetSkipProto(cmd *cobra.Command) bool { + skip, _ := cmd.Flags().GetBool(flagSkipProto) + return skip +} + func flagSetClearCache(cmd *cobra.Command) { - cmd.PersistentFlags().Bool(flagClearCache, false, "Clear the build cache (advanced)") + cmd.PersistentFlags().Bool(flagClearCache, false, "clear the build cache (advanced)") } func flagGetClearCache(cmd *cobra.Command) bool { diff --git a/ignite/cmd/generate.go b/ignite/cmd/generate.go index f8a87bd737..36d17e5d03 100644 --- a/ignite/cmd/generate.go +++ b/ignite/cmd/generate.go @@ -19,6 +19,7 @@ Produced source code can be regenerated by running a command again and is not me flagSetPath(c) flagSetClearCache(c) c.AddCommand(addGitChangesVerifier(NewGenerateGo())) + c.AddCommand(addGitChangesVerifier(NewGenerateTSClient())) c.AddCommand(addGitChangesVerifier(NewGenerateVuex())) c.AddCommand(addGitChangesVerifier(NewGenerateDart())) c.AddCommand(addGitChangesVerifier(NewGenerateOpenAPI())) diff --git a/ignite/cmd/generate_typescript_client.go b/ignite/cmd/generate_typescript_client.go new file mode 100644 index 0000000000..e13dc4d894 --- /dev/null +++ b/ignite/cmd/generate_typescript_client.go @@ -0,0 +1,44 @@ +package ignitecmd + +import ( + "github.com/spf13/cobra" + + "github.com/ignite/cli/ignite/pkg/cliui" + "github.com/ignite/cli/ignite/services/chain" +) + +func NewGenerateTSClient() *cobra.Command { + c := &cobra.Command{ + Use: "ts-client", + Short: "Generate Typescript client for your chain's frontend", + RunE: generateTSClientHandler, + } + c.Flags().AddFlagSet(flagSetProto3rdParty("")) + return c +} + +func generateTSClientHandler(cmd *cobra.Command, args []string) error { + session := cliui.New() + defer session.Cleanup() + + session.StartSpinner("Generating...") + + c, err := newChainWithHomeFlags(cmd, chain.EnableThirdPartyModuleCodegen()) + if err != nil { + return err + } + + cacheStorage, err := newCache(cmd) + if err != nil { + return err + } + + if err := c.Generate(cmd.Context(), cacheStorage, chain.GenerateTSClient()); err != nil { + return err + } + + session.StopSpinner() + session.Println("⛏️ Generated Typescript Client") + + return nil +} diff --git a/ignite/cmd/generate_vuex.go b/ignite/cmd/generate_vuex.go index 6346d22553..26105477c3 100644 --- a/ignite/cmd/generate_vuex.go +++ b/ignite/cmd/generate_vuex.go @@ -12,7 +12,7 @@ import ( func NewGenerateVuex() *cobra.Command { c := &cobra.Command{ Use: "vuex", - Short: "Generate Vuex store for you chain's frontend from your config.yml", + Short: "Generate Typescript client and Vuex stores for your chain's frontend from your `config.yml` file", RunE: generateVuexHandler, } c.Flags().AddFlagSet(flagSetProto3rdParty("")) @@ -38,7 +38,7 @@ func generateVuexHandler(cmd *cobra.Command, args []string) error { } s.Stop() - fmt.Println("⛏️ Generated vuex stores.") + fmt.Println("⛏️ Generated Typescript Client and Vuex stores") return nil } diff --git a/ignite/cmd/network.go b/ignite/cmd/network.go index 62321f3f11..af7c30b26a 100644 --- a/ignite/cmd/network.go +++ b/ignite/cmd/network.go @@ -29,11 +29,11 @@ const ( flagSPNNodeAddress = "spn-node-address" flagSPNFaucetAddress = "spn-faucet-address" - spnNodeAddressNightly = "https://rpc.nightly.starport.network:443" - spnFaucetAddressNightly = "https://faucet.nightly.starport.network" + spnNodeAddressNightly = "http://178.128.251.28:26657" + spnFaucetAddressNightly = "http://178.128.251.28:4500" - spnNodeAddressLocal = "http://0.0.0.0:26657" - spnFaucetAddressLocal = "http://0.0.0.0:4500" + spnNodeAddressLocal = "http://0.0.0.0:26661" + spnFaucetAddressLocal = "http://0.0.0.0:4502" ) // NewNetwork creates a new network command that holds some other sub commands @@ -59,7 +59,7 @@ func NewNetwork() *cobra.Command { NewNetworkCampaign(), NewNetworkRequest(), NewNetworkReward(), - NewNetworkClient(), + NewNetworkProfile(), ) return c @@ -156,6 +156,7 @@ func getNetworkCosmosClient(cmd *cobra.Command) (cosmosclient.Client, error) { cosmosclient.WithAddressPrefix(networktypes.SPN), cosmosclient.WithUseFaucet(spnFaucetAddress, networktypes.SPNDenom, 5), cosmosclient.WithKeyringServiceName(cosmosaccount.KeyringServiceName), + cosmosclient.WithKeyringDir(getKeyringDir(cmd)), } keyringBackend := getKeyringBackend(cmd) diff --git a/ignite/cmd/network_campaign_account.go b/ignite/cmd/network_campaign_account.go index 90991d348d..d30a6c837b 100644 --- a/ignite/cmd/network_campaign_account.go +++ b/ignite/cmd/network_campaign_account.go @@ -7,9 +7,7 @@ import ( "github.com/ignite/cli/ignite/pkg/cliui/icons" ) -var ( - campaignMainnetsAccSummaryHeader = []string{"Mainnet Account", "Shares"} -) +var campaignMainnetsAccSummaryHeader = []string{"Mainnet Account", "Shares"} // NewNetworkCampaignAccount creates a new campaign account command that holds some other // sub commands related to account for a campaign. diff --git a/ignite/cmd/network_campaign_publish.go b/ignite/cmd/network_campaign_publish.go index 594ca2d191..1faa789ca9 100644 --- a/ignite/cmd/network_campaign_publish.go +++ b/ignite/cmd/network_campaign_publish.go @@ -23,6 +23,7 @@ func NewNetworkCampaignPublish() *cobra.Command { c.Flags().String(flagMetadata, "", "Add a metada to the chain") c.Flags().AddFlagSet(flagNetworkFrom()) c.Flags().AddFlagSet(flagSetKeyringBackend()) + c.Flags().AddFlagSet(flagSetKeyringDir()) c.Flags().AddFlagSet(flagSetHome()) return c } diff --git a/ignite/cmd/network_campaign_update.go b/ignite/cmd/network_campaign_update.go index 7734bc03df..6bd1916cba 100644 --- a/ignite/cmd/network_campaign_update.go +++ b/ignite/cmd/network_campaign_update.go @@ -30,6 +30,7 @@ func NewNetworkCampaignUpdate() *cobra.Command { c.Flags().String(flagCampaignTotalSupply, "", "Update the total of the mainnet of a campaign") c.Flags().AddFlagSet(flagNetworkFrom()) c.Flags().AddFlagSet(flagSetKeyringBackend()) + c.Flags().AddFlagSet(flagSetKeyringDir()) return c } diff --git a/ignite/cmd/network_chain_init.go b/ignite/cmd/network_chain_init.go index f4237ef5d3..ed2d155a42 100644 --- a/ignite/cmd/network_chain_init.go +++ b/ignite/cmd/network_chain_init.go @@ -47,7 +47,9 @@ func NewNetworkChainInit() *cobra.Command { c.Flags().AddFlagSet(flagNetworkFrom()) c.Flags().AddFlagSet(flagSetHome()) c.Flags().AddFlagSet(flagSetKeyringBackend()) + c.Flags().AddFlagSet(flagSetKeyringDir()) c.Flags().AddFlagSet(flagSetYes()) + c.Flags().AddFlagSet(flagSetCheckDependencies()) return c } @@ -104,7 +106,13 @@ func networkChainInitHandler(cmd *cobra.Command, args []string) error { return err } - c, err := nb.Chain(networkchain.SourceLaunch(chainLaunch)) + var networkOptions []networkchain.Option + + if flagGetCheckDependencies(cmd) { + networkOptions = append(networkOptions, networkchain.CheckDependencies()) + } + + c, err := nb.Chain(networkchain.SourceLaunch(chainLaunch), networkOptions...) if err != nil { return err } diff --git a/ignite/cmd/network_chain_install.go b/ignite/cmd/network_chain_install.go index 2ffaaf4317..a997c07031 100644 --- a/ignite/cmd/network_chain_install.go +++ b/ignite/cmd/network_chain_install.go @@ -24,6 +24,7 @@ func NewNetworkChainInstall() *cobra.Command { flagSetClearCache(c) c.Flags().AddFlagSet(flagNetworkFrom()) + c.Flags().AddFlagSet(flagSetCheckDependencies()) return c } @@ -57,7 +58,13 @@ func networkChainInstallHandler(cmd *cobra.Command, args []string) error { return err } - c, err := nb.Chain(networkchain.SourceLaunch(chainLaunch)) + var networkOptions []networkchain.Option + + if flagGetCheckDependencies(cmd) { + networkOptions = append(networkOptions, networkchain.CheckDependencies()) + } + + c, err := nb.Chain(networkchain.SourceLaunch(chainLaunch), networkOptions...) if err != nil { return err } diff --git a/ignite/cmd/network_chain_join.go b/ignite/cmd/network_chain_join.go index abbeccb12c..fc2a5b7762 100644 --- a/ignite/cmd/network_chain_join.go +++ b/ignite/cmd/network_chain_join.go @@ -5,13 +5,15 @@ import ( "fmt" sdk "github.com/cosmos/cosmos-sdk/types" + + "github.com/ignite/cli/ignite/pkg/cliui/icons" + "github.com/pkg/errors" "github.com/rdegges/go-ipify" "github.com/spf13/cobra" "github.com/ignite/cli/ignite/pkg/cliui" "github.com/ignite/cli/ignite/pkg/cliui/cliquiz" - "github.com/ignite/cli/ignite/pkg/cliui/icons" "github.com/ignite/cli/ignite/pkg/gitpod" "github.com/ignite/cli/ignite/pkg/xchisel" "github.com/ignite/cli/ignite/services/network" @@ -19,8 +21,9 @@ import ( ) const ( - flagGentx = "gentx" - flagAmount = "amount" + flagGentx = "gentx" + flagAmount = "amount" + flagNoAccount = "no-account" ) // NewNetworkChainJoin creates a new chain join command to join @@ -34,11 +37,14 @@ func NewNetworkChainJoin() *cobra.Command { } c.Flags().String(flagGentx, "", "Path to a gentx json file") - c.Flags().String(flagAmount, "", "Amount of coins for account request") + c.Flags().String(flagAmount, "", "Amount of coins for account request (ignored if coordinator has fixed the account balances or if --no-acount flag is set)") + c.Flags().Bool(flagNoAccount, false, "Prevent sending a request for a genesis account") c.Flags().AddFlagSet(flagNetworkFrom()) c.Flags().AddFlagSet(flagSetHome()) c.Flags().AddFlagSet(flagSetKeyringBackend()) + c.Flags().AddFlagSet(flagSetKeyringDir()) c.Flags().AddFlagSet(flagSetYes()) + c.Flags().AddFlagSet(flagSetCheckDependencies()) return c } @@ -48,8 +54,10 @@ func networkChainJoinHandler(cmd *cobra.Command, args []string) error { defer session.Cleanup() var ( + joinOptions []network.JoinOption gentxPath, _ = cmd.Flags().GetString(flagGentx) amount, _ = cmd.Flags().GetString(flagAmount) + noAccount, _ = cmd.Flags().GetBool(flagNoAccount) ) nb, err := newNetworkBuilder(cmd, CollectEvents(session.EventBus())) @@ -63,10 +71,6 @@ func networkChainJoinHandler(cmd *cobra.Command, args []string) error { return err } - joinOptions := []network.JoinOption{ - network.WithCustomGentxPath(gentxPath), - } - // if there is no custom gentx, we need to detect the public address. if gentxPath == "" { // get the peer public address for the validator. @@ -78,6 +82,11 @@ func networkChainJoinHandler(cmd *cobra.Command, args []string) error { joinOptions = append(joinOptions, network.WithPublicAddress(publicAddr)) } + cacheStorage, err := newCache(cmd) + if err != nil { + return err + } + n, err := nb.Network() if err != nil { return err @@ -88,34 +97,61 @@ func networkChainJoinHandler(cmd *cobra.Command, args []string) error { return err } - c, err := nb.Chain(networkchain.SourceLaunch(chainLaunch)) + var networkOptions []networkchain.Option + + if flagGetCheckDependencies(cmd) { + networkOptions = append(networkOptions, networkchain.CheckDependencies()) + } + + c, err := nb.Chain(networkchain.SourceLaunch(chainLaunch), networkOptions...) if err != nil { return err } - if amount != "" { - // parse the amount. - amountCoins, err := sdk.ParseCoinsNormalized(amount) + // use the default gentx path from chain home if not provided + if gentxPath == "" { + gentxPath, err = c.DefaultGentxPath() if err != nil { - return errors.Wrap(err, "error parsing amount") + return err } - joinOptions = append(joinOptions, network.WithAccountRequest(amountCoins)) } else { - if !getYes(cmd) { - question := fmt.Sprintf( - "You haven't set the --%s flag and therefore an account request won't be submitted. Do you confirm", - flagAmount, - ) - if err := session.AskConfirm(question); err != nil { - return session.PrintSaidNo() - } + // if a custom gentx is provided, we initialize the chain home in order to check accounts + if err := c.Init(cmd.Context(), cacheStorage); err != nil { + return err } + } - session.Printf("%s %s\n", icons.Info, "Account request won't be submitted") + // genesis account request + if !noAccount { + switch { + case c.IsAccountBalanceFixed(): + // fixed account balance + joinOptions = append(joinOptions, network.WithAccountRequest(c.AccountBalance())) + case amount != "": + // account balance set by user + amountCoins, err := sdk.ParseCoinsNormalized(amount) + if err != nil { + return errors.Wrap(err, "error parsing amount") + } + joinOptions = append(joinOptions, network.WithAccountRequest(amountCoins)) + default: + // fixed balance and no amount entered by the user, we ask if they want to skip account request + if !getYes(cmd) { + question := fmt.Sprintf( + "You haven't set the --%s flag and therefore an account request won't be submitted. Do you confirm", + flagAmount, + ) + if err := session.AskConfirm(question); err != nil { + return session.PrintSaidNo() + } + } + + _ = session.Printf("%s %s\n", icons.Info, "Account request won't be submitted") + } } // create the message to add the validator. - return n.Join(cmd.Context(), c, launchID, joinOptions...) + return n.Join(cmd.Context(), c, launchID, gentxPath, joinOptions...) } // askPublicAddress prepare questions to interactively ask for a publicAddress diff --git a/ignite/cmd/network_chain_launch.go b/ignite/cmd/network_chain_launch.go index 566c058f42..10b8ef6943 100644 --- a/ignite/cmd/network_chain_launch.go +++ b/ignite/cmd/network_chain_launch.go @@ -1,6 +1,9 @@ package ignitecmd import ( + "time" + + timeparser "github.com/aws/smithy-go/time" "github.com/spf13/cobra" "github.com/ignite/cli/ignite/pkg/cliui" @@ -8,7 +11,7 @@ import ( ) const ( - flagRemainingTime = "remaining-time" + flagLauchTime = "launch-time" ) // NewNetworkChainLaunch creates a new chain launch command to launch @@ -21,9 +24,14 @@ func NewNetworkChainLaunch() *cobra.Command { RunE: networkChainLaunchHandler, } - c.Flags().Duration(flagRemainingTime, 0, "Duration of time in seconds before the chain is effectively launched") + c.Flags().String( + flagLauchTime, + "", + "Timestamp the chain is effectively launched (example \"2022-01-01T00:00:00Z\")", + ) c.Flags().AddFlagSet(flagNetworkFrom()) c.Flags().AddFlagSet(flagSetKeyringBackend()) + c.Flags().AddFlagSet(flagSetKeyringDir()) return c } @@ -43,12 +51,21 @@ func networkChainLaunchHandler(cmd *cobra.Command, args []string) error { return err } - remainingTime, _ := cmd.Flags().GetDuration(flagRemainingTime) + // parse launch time + var launchTime time.Time + launchTimeStr, _ := cmd.Flags().GetString(flagLauchTime) + + if launchTimeStr != "" { + launchTime, err = timeparser.ParseDateTime(launchTimeStr) + if err != nil { + return err + } + } n, err := nb.Network() if err != nil { return err } - return n.TriggerLaunch(cmd.Context(), launchID, remainingTime) + return n.TriggerLaunch(cmd.Context(), launchID, launchTime) } diff --git a/ignite/cmd/network_chain_prepare.go b/ignite/cmd/network_chain_prepare.go index c170d2c127..8ac7102239 100644 --- a/ignite/cmd/network_chain_prepare.go +++ b/ignite/cmd/network_chain_prepare.go @@ -6,12 +6,14 @@ import ( "github.com/spf13/cobra" + "github.com/ignite/cli/ignite/pkg/cache" "github.com/ignite/cli/ignite/pkg/cliui" "github.com/ignite/cli/ignite/pkg/cliui/colors" "github.com/ignite/cli/ignite/pkg/cliui/icons" "github.com/ignite/cli/ignite/pkg/goenv" "github.com/ignite/cli/ignite/services/network" "github.com/ignite/cli/ignite/services/network/networkchain" + "github.com/ignite/cli/ignite/services/network/networktypes" ) const ( @@ -31,7 +33,9 @@ func NewNetworkChainPrepare() *cobra.Command { c.Flags().BoolP(flagForce, "f", false, "Force the prepare command to run even if the chain is not launched") c.Flags().AddFlagSet(flagNetworkFrom()) c.Flags().AddFlagSet(flagSetKeyringBackend()) + c.Flags().AddFlagSet(flagSetKeyringDir()) c.Flags().AddFlagSet(flagSetHome()) + c.Flags().AddFlagSet(flagSetCheckDependencies()) return c } @@ -73,39 +77,24 @@ func networkChainPrepareHandler(cmd *cobra.Command, args []string) error { return fmt.Errorf("chain %d launch has not been triggered yet. use --force to prepare anyway", launchID) } - c, err := nb.Chain(networkchain.SourceLaunch(chainLaunch)) - if err != nil { - return err - } + var networkOptions []networkchain.Option - // fetch the information to construct genesis - genesisInformation, err := n.GenesisInformation(cmd.Context(), launchID) - if err != nil { - return err + if flagGetCheckDependencies(cmd) { + networkOptions = append(networkOptions, networkchain.CheckDependencies()) } - rewardsInfo, lastBlockHeight, unboundingTime, err := n.RewardsInfo( - cmd.Context(), - launchID, - chainLaunch.ConsumerRevisionHeight, - ) + c, err := nb.Chain(networkchain.SourceLaunch(chainLaunch), networkOptions...) if err != nil { return err } - spnChainID, err := n.ChainID(cmd.Context()) - if err != nil { - return err - } - - if err := c.Prepare( - cmd.Context(), + if err := prepareFromGenesisInformation( + cmd, cacheStorage, - genesisInformation, - rewardsInfo, - spnChainID, - lastBlockHeight, - unboundingTime, + launchID, + n, + c, + chainLaunch, ); err != nil { return err } @@ -128,3 +117,52 @@ func networkChainPrepareHandler(cmd *cobra.Command, args []string) error { return nil } + +// prepareFromGenesisInformation prepares the genesis of the chain from the queried genesis information from the launch ID of the chain +func prepareFromGenesisInformation( + cmd *cobra.Command, + cacheStorage cache.Storage, + launchID uint64, + n network.Network, + c *networkchain.Chain, + chainLaunch networktypes.ChainLaunch, +) error { + var ( + rewardsInfo networktypes.Reward + lastBlockHeight int64 + consumerUnbondingTime int64 + ) + + // fetch the information to construct genesis + genesisInformation, err := n.GenesisInformation(cmd.Context(), launchID) + if err != nil { + return err + } + + // fetch the info for rewards if the consumer revision height is defined + if chainLaunch.ConsumerRevisionHeight > 0 { + rewardsInfo, lastBlockHeight, consumerUnbondingTime, err = n.RewardsInfo( + cmd.Context(), + launchID, + chainLaunch.ConsumerRevisionHeight, + ) + if err != nil { + return err + } + } + + spnChainID, err := n.ChainID(cmd.Context()) + if err != nil { + return err + } + + return c.Prepare( + cmd.Context(), + cacheStorage, + genesisInformation, + rewardsInfo, + spnChainID, + lastBlockHeight, + consumerUnbondingTime, + ) +} diff --git a/ignite/cmd/network_chain_publish.go b/ignite/cmd/network_chain_publish.go index a9d499eb00..38c936dea1 100644 --- a/ignite/cmd/network_chain_publish.go +++ b/ignite/cmd/network_chain_publish.go @@ -17,17 +17,18 @@ import ( ) const ( - flagTag = "tag" - flagBranch = "branch" - flagHash = "hash" - flagGenesis = "genesis" - flagCampaign = "campaign" - flagShares = "shares" - flagNoCheck = "no-check" - flagChainID = "chain-id" - flagMainnet = "mainnet" - flagRewardCoins = "reward.coins" - flagRewardHeight = "reward.height" + flagTag = "tag" + flagBranch = "branch" + flagHash = "hash" + flagGenesis = "genesis" + flagCampaign = "campaign" + flagShares = "shares" + flagNoCheck = "no-check" + flagChainID = "chain-id" + flagMainnet = "mainnet" + flagAccountBalance = "account-balance" + flagRewardCoins = "reward.coins" + flagRewardHeight = "reward.height" ) // NewNetworkChainPublish returns a new command to publish a new chain to start a new network. @@ -51,13 +52,16 @@ func NewNetworkChainPublish() *cobra.Command { c.Flags().String(flagCampaignTotalSupply, "", "Add a total of the mainnet of a campaign") c.Flags().String(flagShares, "", "Add shares for the campaign") c.Flags().Bool(flagMainnet, false, "Initialize a mainnet campaign") + c.Flags().String(flagAccountBalance, "", "Balance for each approved genesis account for the chain") c.Flags().String(flagRewardCoins, "", "Reward coins") c.Flags().Int64(flagRewardHeight, 0, "Last reward height") c.Flags().String(flagAmount, "", "Amount of coins for account request") c.Flags().AddFlagSet(flagNetworkFrom()) c.Flags().AddFlagSet(flagSetKeyringBackend()) + c.Flags().AddFlagSet(flagSetKeyringDir()) c.Flags().AddFlagSet(flagSetHome()) c.Flags().AddFlagSet(flagSetYes()) + c.Flags().AddFlagSet(flagSetCheckDependencies()) return c } @@ -78,6 +82,7 @@ func networkChainPublishHandler(cmd *cobra.Command, args []string) error { campaignTotalSupplyStr, _ = cmd.Flags().GetString(flagCampaignTotalSupply) sharesStr, _ = cmd.Flags().GetString(flagShares) isMainnet, _ = cmd.Flags().GetBool(flagMainnet) + accountBalance, _ = cmd.Flags().GetString(flagAccountBalance) rewardCoinsStr, _ = cmd.Flags().GetString(flagRewardCoins) rewardDuration, _ = cmd.Flags().GetInt64(flagRewardHeight) amount, _ = cmd.Flags().GetString(flagAmount) @@ -89,6 +94,11 @@ func networkChainPublishHandler(cmd *cobra.Command, args []string) error { return errors.Wrap(err, "error parsing amount") } + accountBalanceCoins, err := sdk.ParseCoinsNormalized(accountBalance) + if err != nil { + return errors.Wrap(err, "error parsing account balance") + } + source, err := xurl.MightHTTPS(args[0]) if err != nil { return fmt.Errorf("invalid source url format: %w", err) @@ -200,6 +210,10 @@ func networkChainPublishHandler(cmd *cobra.Command, args []string) error { publishOptions = append(publishOptions, network.WithChainID(chainID)) } + if !accountBalanceCoins.IsZero() { + publishOptions = append(publishOptions, network.WithAccountBalance(accountBalanceCoins)) + } + if isMainnet { publishOptions = append(publishOptions, network.Mainnet()) } @@ -217,6 +231,12 @@ func networkChainPublishHandler(cmd *cobra.Command, args []string) error { publishOptions = append(publishOptions, network.WithPercentageShares(sharePercentages)) } + // TODO: Issue an error or warning when this flag is used with "no-check"? + // The "check-dependencies" flag is ignored when the "no-check" one is present. + if flagGetCheckDependencies(cmd) { + initOptions = append(initOptions, networkchain.CheckDependencies()) + } + // init the chain. c, err := nb.Chain(sourceOption, initOptions...) if err != nil { @@ -260,7 +280,9 @@ func networkChainPublishHandler(cmd *cobra.Command, args []string) error { } else { session.Printf("%s Launch ID: %d \n", icons.Bullet, launchID) } - session.Printf("%s Campaign ID: %d \n", icons.Bullet, campaignID) + if campaignID != 0 { + session.Printf("%s Campaign ID: %d \n", icons.Bullet, campaignID) + } return nil } diff --git a/ignite/cmd/network_chain_revert_launch.go b/ignite/cmd/network_chain_revert_launch.go index cf83be77d7..d5732e1f1c 100644 --- a/ignite/cmd/network_chain_revert_launch.go +++ b/ignite/cmd/network_chain_revert_launch.go @@ -20,6 +20,7 @@ func NewNetworkChainRevertLaunch() *cobra.Command { c.Flags().AddFlagSet(flagNetworkFrom()) c.Flags().AddFlagSet(flagSetKeyringBackend()) + c.Flags().AddFlagSet(flagSetKeyringDir()) return c } diff --git a/ignite/cmd/network_chain_show_accounts.go b/ignite/cmd/network_chain_show_accounts.go index 9487ee5169..38fe83b641 100644 --- a/ignite/cmd/network_chain_show_accounts.go +++ b/ignite/cmd/network_chain_show_accounts.go @@ -63,7 +63,7 @@ func networkChainShowAccountsHandler(cmd *cobra.Command, args []string) error { return err } - genesisAccEntries = append(genesisAccEntries, []string{address, acc.Coins}) + genesisAccEntries = append(genesisAccEntries, []string{address, acc.Coins.String()}) } genesisVestingAccEntries := make([][]string, 0) for _, acc := range vestingAccs { @@ -74,8 +74,8 @@ func networkChainShowAccountsHandler(cmd *cobra.Command, args []string) error { genesisVestingAccEntries = append(genesisVestingAccEntries, []string{ address, - acc.TotalBalance, - acc.Vesting, + acc.TotalBalance.String(), + acc.Vesting.String(), strconv.FormatInt(acc.EndTime, 10), }) } diff --git a/ignite/cmd/network_chain_show_genesis.go b/ignite/cmd/network_chain_show_genesis.go index 5b21e472de..afca150f45 100644 --- a/ignite/cmd/network_chain_show_genesis.go +++ b/ignite/cmd/network_chain_show_genesis.go @@ -8,6 +8,7 @@ import ( "github.com/ignite/cli/ignite/pkg/cliui" "github.com/ignite/cli/ignite/pkg/cliui/icons" + "github.com/ignite/cli/ignite/pkg/xos" "github.com/ignite/cli/ignite/services/network/networkchain" ) @@ -55,66 +56,37 @@ func networkChainShowGenesisHandler(cmd *cobra.Command, args []string) error { return err } - genesisPath, err := c.GenesisPath() + // generate the genesis in a temp dir + tmpHome, err := os.MkdirTemp("", "*-spn") if err != nil { return err } - - spnChainID, err := n.ChainID(cmd.Context()) - if err != nil { + defer os.RemoveAll(tmpHome) + + c.SetHome(tmpHome) + + if err := prepareFromGenesisInformation( + cmd, + cacheStorage, + launchID, + n, + c, + chainLaunch, + ); err != nil { return err } - // check if the genesis already exists - if _, err = os.Stat(genesisPath); os.IsNotExist(err) { - // fetch the information to construct genesis - genesisInformation, err := n.GenesisInformation(cmd.Context(), launchID) - if err != nil { - return err - } - - // create the chain in a temp dir - tmpHome, err := os.MkdirTemp("", "*-spn") - if err != nil { - return err - } - defer os.RemoveAll(tmpHome) - - c.SetHome(tmpHome) - - rewardsInfo, lastBlockHeight, unboundingTime, err := n.RewardsInfo( - cmd.Context(), - launchID, - chainLaunch.ConsumerRevisionHeight, - ) - if err != nil { - return err - } - - if err = c.Prepare( - cmd.Context(), - cacheStorage, - genesisInformation, - rewardsInfo, - spnChainID, - lastBlockHeight, - unboundingTime, - ); err != nil { - return err - } - - // get the new genesis path - genesisPath, err = c.GenesisPath() - if err != nil { - return err - } + // get the new genesis path + genesisPath, err := c.GenesisPath() + if err != nil { + return err } - if err := os.MkdirAll(filepath.Dir(out), 0744); err != nil { + if err := os.MkdirAll(filepath.Dir(out), 0o744); err != nil { return err } - if err := os.Rename(genesisPath, out); err != nil { + if err := xos.Rename(genesisPath, out); err != nil { return err } diff --git a/ignite/cmd/network_chain_show_peers.go b/ignite/cmd/network_chain_show_peers.go index f9f5a4be92..4b6ba18fd6 100644 --- a/ignite/cmd/network_chain_show_peers.go +++ b/ignite/cmd/network_chain_show_peers.go @@ -62,14 +62,14 @@ func networkChainShowPeersHandler(cmd *cobra.Command, args []string) error { } - if err := os.MkdirAll(filepath.Dir(out), 0744); err != nil { + if err := os.MkdirAll(filepath.Dir(out), 0o744); err != nil { return err } b := &bytes.Buffer{} peerList := strings.Join(peers, ",") fmt.Fprintln(b, peerList) - if err := os.WriteFile(out, b.Bytes(), 0644); err != nil { + if err := os.WriteFile(out, b.Bytes(), 0o644); err != nil { return err } diff --git a/ignite/cmd/network_chain_show_validators.go b/ignite/cmd/network_chain_show_validators.go index 45784f5189..39981dd998 100644 --- a/ignite/cmd/network_chain_show_validators.go +++ b/ignite/cmd/network_chain_show_validators.go @@ -9,9 +9,7 @@ import ( "github.com/ignite/cli/ignite/services/network" ) -var ( - chainGenesisValSummaryHeader = []string{"Genesis Validator", "Self Delegation", "Peer"} -) +var chainGenesisValSummaryHeader = []string{"Genesis Validator", "Self Delegation", "Peer"} func newNetworkChainShowValidators() *cobra.Command { c := &cobra.Command{ diff --git a/ignite/cmd/network_client.go b/ignite/cmd/network_client.go deleted file mode 100644 index 400a826edc..0000000000 --- a/ignite/cmd/network_client.go +++ /dev/null @@ -1,20 +0,0 @@ -package ignitecmd - -import ( - "github.com/spf13/cobra" -) - -// NewNetworkClient creates a new client command that holds some other -// sub commands related to connect client to the network. -func NewNetworkClient() *cobra.Command { - c := &cobra.Command{ - Use: "client", - Short: "Connect your network with SPN", - } - - c.AddCommand( - NewNetworkClientCreate(), - ) - - return c -} diff --git a/ignite/cmd/network_client_create.go b/ignite/cmd/network_client_create.go deleted file mode 100644 index 759bdd515b..0000000000 --- a/ignite/cmd/network_client_create.go +++ /dev/null @@ -1,67 +0,0 @@ -package ignitecmd - -import ( - "github.com/spf13/cobra" - - "github.com/ignite/cli/ignite/pkg/cliui" - "github.com/ignite/cli/ignite/pkg/cliui/icons" - "github.com/ignite/cli/ignite/pkg/cosmosclient" - "github.com/ignite/cli/ignite/services/network" -) - -// NewNetworkClientCreate connects the monitoring modules of launched chains with SPN -func NewNetworkClientCreate() *cobra.Command { - c := &cobra.Command{ - Use: "create [launch-id] [node-api-url]", - Short: "Connect the monitoring modules of launched chains with SPN", - Args: cobra.ExactArgs(2), - RunE: networkClientCreateHandler, - } - c.Flags().AddFlagSet(flagNetworkFrom()) - c.Flags().AddFlagSet(flagSetKeyringBackend()) - return c -} - -func networkClientCreateHandler(cmd *cobra.Command, args []string) error { - session := cliui.New() - defer session.Cleanup() - - launchID, err := network.ParseID(args[0]) - if err != nil { - return err - } - nodeAPI := args[1] - - nb, err := newNetworkBuilder(cmd) - if err != nil { - return err - } - - nodeClient, err := cosmosclient.New(cmd.Context(), cosmosclient.WithNodeAddress(nodeAPI)) - if err != nil { - return err - } - node, err := network.NewNodeClient(nodeClient) - if err != nil { - return err - } - - rewardsInfo, unboundingTime, err := node.RewardsInfo(cmd.Context()) - if err != nil { - return err - } - - n, err := nb.Network() - if err != nil { - return err - } - - clientID, err := n.CreateClient(launchID, unboundingTime, rewardsInfo) - if err != nil { - return err - } - - session.StopSpinner() - session.Printf("%s Client created: %s\n", icons.Info, clientID) - return nil -} diff --git a/ignite/cmd/network_profile.go b/ignite/cmd/network_profile.go new file mode 100644 index 0000000000..81fef50682 --- /dev/null +++ b/ignite/cmd/network_profile.go @@ -0,0 +1,57 @@ +package ignitecmd + +import ( + "github.com/spf13/cobra" + + "github.com/ignite/cli/ignite/pkg/cliui" + "github.com/ignite/cli/ignite/pkg/yaml" + "github.com/ignite/cli/ignite/services/network" +) + +// NewNetworkProfile returns a new command to show the address profile info on Starport Network. +func NewNetworkProfile() *cobra.Command { + c := &cobra.Command{ + Use: "profile [campaign-id]", + Short: "Show the address profile info", + Args: cobra.RangeArgs(0, 1), + RunE: networkProfileHandler, + } + c.Flags().AddFlagSet(flagNetworkFrom()) + c.Flags().AddFlagSet(flagSetKeyringBackend()) + c.Flags().AddFlagSet(flagSetHome()) + return c +} + +func networkProfileHandler(cmd *cobra.Command, args []string) error { + session := cliui.New() + defer session.Cleanup() + + nb, err := newNetworkBuilder(cmd) + if err != nil { + return err + } + + n, err := nb.Network() + if err != nil { + return err + } + + var campaignID uint64 + if len(args) > 0 { + campaignID, err = network.ParseID(args[0]) + if err != nil { + return err + } + } + + profile, err := n.Profile(cmd.Context(), campaignID) + if err != nil { + return err + } + + profileInfo, err := yaml.Marshal(cmd.Context(), profile) + if err != nil { + return err + } + return session.Println(profileInfo) +} diff --git a/ignite/cmd/network_request_approve.go b/ignite/cmd/network_request_approve.go index 12baae54d9..1592c5773c 100644 --- a/ignite/cmd/network_request_approve.go +++ b/ignite/cmd/network_request_approve.go @@ -30,6 +30,7 @@ func NewNetworkRequestApprove() *cobra.Command { c.Flags().AddFlagSet(flagNetworkFrom()) c.Flags().AddFlagSet(flagSetHome()) c.Flags().AddFlagSet(flagSetKeyringBackend()) + c.Flags().AddFlagSet(flagSetKeyringDir()) return c } diff --git a/ignite/cmd/network_request_reject.go b/ignite/cmd/network_request_reject.go index 1a470539d5..34c7baaa57 100644 --- a/ignite/cmd/network_request_reject.go +++ b/ignite/cmd/network_request_reject.go @@ -22,6 +22,7 @@ func NewNetworkRequestReject() *cobra.Command { c.Flags().AddFlagSet(flagNetworkFrom()) c.Flags().AddFlagSet(flagSetHome()) c.Flags().AddFlagSet(flagSetKeyringBackend()) + c.Flags().AddFlagSet(flagSetKeyringDir()) return c } diff --git a/ignite/cmd/network_request_verify.go b/ignite/cmd/network_request_verify.go index 0e22746541..fa0ca7b1ec 100644 --- a/ignite/cmd/network_request_verify.go +++ b/ignite/cmd/network_request_verify.go @@ -28,6 +28,7 @@ func NewNetworkRequestVerify() *cobra.Command { c.Flags().AddFlagSet(flagNetworkFrom()) c.Flags().AddFlagSet(flagSetHome()) c.Flags().AddFlagSet(flagSetKeyringBackend()) + c.Flags().AddFlagSet(flagSetKeyringDir()) return c } diff --git a/ignite/cmd/network_reward.go b/ignite/cmd/network_reward.go index c4d5bc53b6..9526370a62 100644 --- a/ignite/cmd/network_reward.go +++ b/ignite/cmd/network_reward.go @@ -12,6 +12,7 @@ func NewNetworkReward() *cobra.Command { } c.AddCommand( NewNetworkRewardSet(), + NewNetworkRewardRelease(), ) return c } diff --git a/ignite/cmd/network_reward_release.go b/ignite/cmd/network_reward_release.go new file mode 100644 index 0000000000..ceae82dbff --- /dev/null +++ b/ignite/cmd/network_reward_release.go @@ -0,0 +1,317 @@ +package ignitecmd + +import ( + "bytes" + "errors" + "fmt" + "text/tabwriter" + + "github.com/spf13/cobra" + + "github.com/ignite/cli/ignite/pkg/cliui" + "github.com/ignite/cli/ignite/pkg/cliui/icons" + "github.com/ignite/cli/ignite/pkg/cosmosaccount" + "github.com/ignite/cli/ignite/pkg/cosmosclient" + "github.com/ignite/cli/ignite/pkg/relayer" + relayerconf "github.com/ignite/cli/ignite/pkg/relayer/config" + "github.com/ignite/cli/ignite/pkg/xurl" + "github.com/ignite/cli/ignite/services/network" + "github.com/ignite/cli/ignite/services/network/networktypes" +) + +const ( + flagTestnetFaucet = "testnet-faucet" + flagTestnetAddressPrefix = "testnet-prefix" + flagTestnetAccount = "testnet-account" + flagTestnetGasPrice = "testnet-gasprice" + flagTestnetGasLimit = "testnet-gaslimit" + flagSPNGasPrice = "spn-gasprice" + flagSPNGasLimit = "spn-gaslimit" + flagCreateClientOnly = "create-client-only" + + defaultTestnetGasPrice = "0.0000025stake" + defaultSPNGasPrice = "0.0000025" + networktypes.SPNDenom + defaultGasLimit = 400000 +) + +// NewNetworkRewardRelease connects the monitoring modules of launched +// chains with SPN and distribute rewards with chain Relayer +func NewNetworkRewardRelease() *cobra.Command { + c := &cobra.Command{ + Use: "release [launch-id] [chain-rpc]", + Short: "Connect the monitoring modules of launched chains with SPN", + Args: cobra.ExactArgs(2), + RunE: networkRewardRelease, + } + + c.Flags().AddFlagSet(flagNetworkFrom()) + c.Flags().AddFlagSet(flagSetKeyringBackend()) + c.Flags().String(flagSPNGasPrice, defaultSPNGasPrice, "Gas price used for transactions on SPN") + c.Flags().String(flagTestnetGasPrice, defaultTestnetGasPrice, "Gas price used for transactions on testnet chain") + c.Flags().Int64(flagSPNGasLimit, defaultGasLimit, "Gas limit used for transactions on SPN") + c.Flags().Int64(flagTestnetGasLimit, defaultGasLimit, "Gas limit used for transactions on testnet chain") + c.Flags().String(flagTestnetAddressPrefix, cosmosaccount.AccountPrefixCosmos, "Address prefix of the testnet chain") + c.Flags().String(flagTestnetAccount, cosmosaccount.DefaultAccount, "testnet chain Account") + c.Flags().String(flagTestnetFaucet, "", "Faucet address of the testnet chain") + c.Flags().Bool(flagCreateClientOnly, false, "Only create the network client id") + + return c +} + +func networkRewardRelease(cmd *cobra.Command, args []string) (err error) { + defer func() { + err = handleRelayerAccountErr(err) + }() + + session := cliui.New() + defer session.Cleanup() + + session.StartSpinner("Setting up chains...") + + launchID, err := network.ParseID(args[0]) + if err != nil { + return err + } + chainRPC := xurl.HTTPEnsurePort(args[1]) + + nb, err := newNetworkBuilder(cmd, CollectEvents(session.EventBus())) + if err != nil { + return err + } + n, err := nb.Network() + if err != nil { + return err + } + spnChainID, err := n.ChainID(cmd.Context()) + if err != nil { + return err + } + + ca, err := cosmosaccount.New( + cosmosaccount.WithKeyringBackend(getKeyringBackend(cmd)), + ) + if err != nil { + return err + } + + if err := ca.EnsureDefaultAccount(); err != nil { + return err + } + + var ( + createClientOnly, _ = cmd.Flags().GetBool(flagCreateClientOnly) + spnGasPrice, _ = cmd.Flags().GetString(flagSPNGasPrice) + testnetGasPrice, _ = cmd.Flags().GetString(flagTestnetGasPrice) + spnGasLimit, _ = cmd.Flags().GetInt64(flagSPNGasLimit) + testnetGasLimit, _ = cmd.Flags().GetInt64(flagTestnetGasLimit) + // TODO fetch from genesis + testnetAddressPrefix, _ = cmd.Flags().GetString(flagTestnetAddressPrefix) + testnetAccount, _ = cmd.Flags().GetString(flagTestnetAccount) + testnetFaucet, _ = cmd.Flags().GetString(flagTestnetFaucet) + ) + + session.StartSpinner("Creating network relayer client ID...") + chain, spn, err := createClient(cmd, n, session, launchID, chainRPC, spnChainID) + if err != nil { + return err + } + if createClientOnly { + return nil + } + + session.StartSpinner("Fetching chain info...") + session.Println() + + r := relayer.New(ca) + // initialize the chains + spnChain, err := initChain( + cmd, + r, + session, + relayerSource, + getFrom(cmd), + spnNodeAddress, + spnFaucetAddress, + spnGasPrice, + spnGasLimit, + networktypes.SPN, + spn.ClientID, + ) + if err != nil { + return err + } + spnChain.ID = spn.ChainID + + testnetChain, err := initChain( + cmd, + r, + session, + relayerTarget, + testnetAccount, + chainRPC, + testnetFaucet, + testnetGasPrice, + testnetGasLimit, + testnetAddressPrefix, + chain.ClientID, + ) + if err != nil { + return err + } + testnetChain.ID = chain.ChainID + + session.StartSpinner("Creating links between chains...") + + pathID, cfg, err := spnRelayerConfig(*spnChain, *testnetChain, spn, chain) + if err != nil { + return err + } + if spn.ChannelID == "" { + cfg, err = r.Link(cmd.Context(), cfg, pathID) + if err != nil { + return err + } + } + + session.StopSpinner() + if err := printSection(session, "Paths"); err != nil { + return err + } + + session.StartSpinner("Loading...") + + path, err := cfg.PathByID(pathID) + if err != nil { + return err + } + + session.StopSpinner() + + var buf bytes.Buffer + w := tabwriter.NewWriter(&buf, 0, 0, 1, ' ', tabwriter.TabIndent) + fmt.Fprintf(w, "%s:\n", path.ID) + fmt.Fprintf(w, " \t%s\t>\t(port: %s)\t(channel: %s)\n", path.Src.ChainID, path.Src.PortID, path.Src.ChannelID) + fmt.Fprintf(w, " \t%s\t>\t(port: %s)\t(channel: %s)\n", path.Dst.ChainID, path.Dst.PortID, path.Dst.ChannelID) + fmt.Fprintln(w) + w.Flush() + session.Print(buf.String()) + + if err := printSection(session, "Listening and relaying packets between chains..."); err != nil { + return err + } + + return r.Start(cmd.Context(), cfg, pathID, nil) +} + +func createClient( + cmd *cobra.Command, + n network.Network, + session cliui.Session, + launchID uint64, + nodeAPI, + spnChainID string, +) (networktypes.RewardIBCInfo, networktypes.RewardIBCInfo, error) { + nodeClient, err := cosmosclient.New(cmd.Context(), cosmosclient.WithNodeAddress(nodeAPI)) + if err != nil { + return networktypes.RewardIBCInfo{}, networktypes.RewardIBCInfo{}, err + } + node := network.NewNode(nodeClient) + + chainRelayer, err := node.RewardIBCInfo(cmd.Context()) + if err != nil { + return networktypes.RewardIBCInfo{}, networktypes.RewardIBCInfo{}, err + } + + rewardsInfo, chainID, unboundingTime, err := node.RewardsInfo(cmd.Context()) + if err != nil { + return networktypes.RewardIBCInfo{}, networktypes.RewardIBCInfo{}, err + } + + spnRelayer, err := n.RewardIBCInfo(cmd.Context(), launchID) + if errors.Is(err, network.ErrObjectNotFound) { + spnRelayer.ClientID, err = n.CreateClient(launchID, unboundingTime, rewardsInfo) + } + if err != nil { + return networktypes.RewardIBCInfo{}, networktypes.RewardIBCInfo{}, err + } + + chainRelayer.ChainID = chainID + spnRelayer.ChainID = spnChainID + + session.Printf( + "%s Network client: %s\n", + icons.Info, + spnRelayer.ClientID, + ) + printRelayerOptions(session, spnRelayer.ConnectionID, spnRelayer.ChainID, "connection") + printRelayerOptions(session, spnRelayer.ChannelID, spnRelayer.ChainID, "channel") + + session.Printf( + "%s Testnet chain %s client: %s\n", + icons.Info, + chainRelayer.ChainID, + chainRelayer.ClientID, + ) + printRelayerOptions(session, chainRelayer.ConnectionID, chainRelayer.ChainID, "connection") + printRelayerOptions(session, chainRelayer.ChannelID, chainRelayer.ChainID, "channel") + return chainRelayer, spnRelayer, err +} + +func printRelayerOptions(session cliui.Session, obj, chainID, option string) { + if obj != "" { + session.Printf("%s The chain %s already have a %s: %s\n", + icons.Bullet, + chainID, + option, + obj, + ) + } +} + +func spnRelayerConfig( + srcChain, + dstChain relayer.Chain, + srcChannel, + dstChannel networktypes.RewardIBCInfo, +) (string, relayerconf.Config, error) { + var ( + pathID = relayer.PathID(srcChain.ID, dstChain.ID) + conf = relayerconf.Config{ + Version: relayerconf.SupportVersion, + Chains: []relayerconf.Chain{srcChain.Config(), dstChain.Config()}, + Paths: []relayerconf.Path{ + { + ID: pathID, + Ordering: relayer.OrderingOrdered, + Src: relayerconf.PathEnd{ + ChainID: srcChain.ID, + PortID: networktypes.SPNPortID, + Version: networktypes.SPNVersion, + ConnectionID: srcChannel.ConnectionID, + ChannelID: srcChannel.ChannelID, + }, + Dst: relayerconf.PathEnd{ + ChainID: dstChain.ID, + PortID: networktypes.ChainPortID, + Version: networktypes.SPNVersion, + ConnectionID: dstChannel.ConnectionID, + ChannelID: dstChannel.ChannelID, + }, + }, + }, + } + ) + switch { + case srcChannel.ConnectionID != "" && + srcChannel.ChannelID != "" && + dstChannel.ConnectionID != "" && + dstChannel.ChannelID != "": + return pathID, conf, nil + case srcChannel.ConnectionID == "" && + srcChannel.ChannelID == "" && + dstChannel.ConnectionID == "" && + dstChannel.ChannelID == "": + return pathID, conf, nil + } + return pathID, conf, errors.New("connection was already established and is missing in one of the chains") +} diff --git a/ignite/cmd/network_reward_set.go b/ignite/cmd/network_reward_set.go index c2bfb21122..c64ba13e4e 100644 --- a/ignite/cmd/network_reward_set.go +++ b/ignite/cmd/network_reward_set.go @@ -21,6 +21,7 @@ func NewNetworkRewardSet() *cobra.Command { RunE: networkChainRewardSetHandler, } c.Flags().AddFlagSet(flagSetKeyringBackend()) + c.Flags().AddFlagSet(flagSetKeyringDir()) c.Flags().AddFlagSet(flagNetworkFrom()) c.Flags().AddFlagSet(flagSetHome()) return c diff --git a/ignite/cmd/node.go b/ignite/cmd/node.go new file mode 100644 index 0000000000..82e87ceedc --- /dev/null +++ b/ignite/cmd/node.go @@ -0,0 +1,76 @@ +package ignitecmd + +import ( + "github.com/spf13/cobra" + + "github.com/ignite/cli/ignite/pkg/cosmosaccount" + "github.com/ignite/cli/ignite/pkg/cosmosclient" + "github.com/ignite/cli/ignite/pkg/xurl" +) + +const ( + flagNode = "node" + cosmosRPCAddress = "https://rpc.cosmos.network:443" +) + +func NewNode() *cobra.Command { + c := &cobra.Command{ + Use: "node [command]", + Short: "Make calls to a live blockchain node", + Args: cobra.ExactArgs(1), + } + + c.PersistentFlags().String(flagNode, cosmosRPCAddress, "<host>:<port> to tendermint rpc interface for this chain") + + c.AddCommand(NewNodeQuery()) + c.AddCommand(NewNodeTx()) + + return c +} + +func newNodeCosmosClient(cmd *cobra.Command) (cosmosclient.Client, error) { + var ( + home = getHome(cmd) + prefix = getAddressPrefix(cmd) + node = getNode(cmd) + keyringBackend = getKeyringBackend(cmd) + keyringDir = getKeyringDir(cmd) + gas = getGas(cmd) + gasPrices = getGasPrices(cmd) + fees = getFees(cmd) + broadcastMode = getBroadcastMode(cmd) + generateOnly = getGenerateOnly(cmd) + ) + if keyringBackend == "" { + // Makes cosmosclient usable for commands that doesn't expose the keyring + // backend flag (cosmosclient.New returns an error if it's empty). + keyringBackend = cosmosaccount.KeyringTest + } + + options := []cosmosclient.Option{ + cosmosclient.WithAddressPrefix(prefix), + cosmosclient.WithHome(home), + cosmosclient.WithKeyringBackend(keyringBackend), + cosmosclient.WithKeyringDir(keyringDir), + cosmosclient.WithNodeAddress(xurl.HTTPEnsurePort(node)), + cosmosclient.WithBroadcastMode(broadcastMode), + cosmosclient.WithGenerateOnly(generateOnly), + } + + if gas != "" { + options = append(options, cosmosclient.WithGas(gas)) + } + if gasPrices != "" { + options = append(options, cosmosclient.WithGasPrices(gasPrices)) + } + if fees != "" { + options = append(options, cosmosclient.WithFees(fees)) + } + + return cosmosclient.New(cmd.Context(), options...) +} + +func getNode(cmd *cobra.Command) (node string) { + node, _ = cmd.Flags().GetString(flagNode) + return +} diff --git a/ignite/cmd/node_query.go b/ignite/cmd/node_query.go new file mode 100644 index 0000000000..0acdd4499f --- /dev/null +++ b/ignite/cmd/node_query.go @@ -0,0 +1,72 @@ +package ignitecmd + +import ( + "errors" + "fmt" + + "github.com/cosmos/cosmos-sdk/types/query" + "github.com/spf13/cobra" + flag "github.com/spf13/pflag" +) + +const ( + flagPage = "page" + flagLimit = "limit" + flagPageKey = "page-key" + flagOffset = "offset" + flagCountTotal = "count-total" + flagReverse = "reverse" +) + +func NewNodeQuery() *cobra.Command { + c := &cobra.Command{ + Use: "query", + Short: "Querying subcommands", + Aliases: []string{"q"}, + } + + c.AddCommand(NewNodeQueryBank()) + c.AddCommand(NewNodeQueryTx()) + + return c +} + +func flagSetPagination(query string) *flag.FlagSet { + fs := flag.NewFlagSet("", flag.ContinueOnError) + + fs.Uint64(flagPage, 1, fmt.Sprintf("pagination page of %s to query for. This sets offset to a multiple of limit", query)) + fs.String(flagPageKey, "", fmt.Sprintf("pagination page-key of %s to query for", query)) + fs.Uint64(flagOffset, 0, fmt.Sprintf("pagination offset of %s to query for", query)) + fs.Uint64(flagLimit, 100, fmt.Sprintf("pagination limit of %s to query for", query)) + fs.Bool(flagCountTotal, false, fmt.Sprintf("count total number of records in %s to query for", query)) + fs.Bool(flagReverse, false, "results are sorted in descending order") + + return fs +} + +func getPagination(cmd *cobra.Command) (*query.PageRequest, error) { + var ( + pageKey, _ = cmd.Flags().GetString(flagPageKey) + offset, _ = cmd.Flags().GetUint64(flagOffset) + limit, _ = cmd.Flags().GetUint64(flagLimit) + countTotal, _ = cmd.Flags().GetBool(flagCountTotal) + page, _ = cmd.Flags().GetUint64(flagPage) + reverse, _ = cmd.Flags().GetBool(flagReverse) + ) + + if page > 1 && offset > 0 { + return nil, errors.New("page and offset cannot be used together") + } + + if page > 1 { + offset = (page - 1) * limit + } + + return &query.PageRequest{ + Key: []byte(pageKey), + Offset: offset, + Limit: limit, + CountTotal: countTotal, + Reverse: reverse, + }, nil +} diff --git a/ignite/cmd/node_query_bank.go b/ignite/cmd/node_query_bank.go new file mode 100644 index 0000000000..9ebf9cc287 --- /dev/null +++ b/ignite/cmd/node_query_bank.go @@ -0,0 +1,14 @@ +package ignitecmd + +import "github.com/spf13/cobra" + +func NewNodeQueryBank() *cobra.Command { + c := &cobra.Command{ + Use: "bank", + Short: "Querying commands for the bank module", + } + + c.AddCommand(NewNodeQueryBankBalances()) + + return c +} diff --git a/ignite/cmd/node_query_bank_balances.go b/ignite/cmd/node_query_bank_balances.go new file mode 100644 index 0000000000..87533904e9 --- /dev/null +++ b/ignite/cmd/node_query_bank_balances.go @@ -0,0 +1,60 @@ +package ignitecmd + +import ( + "github.com/spf13/cobra" + + "github.com/ignite/cli/ignite/pkg/cliui" +) + +func NewNodeQueryBankBalances() *cobra.Command { + c := &cobra.Command{ + Use: "balances [from_account_or_address]", + Short: "Query for account balances by account name or address", + RunE: nodeQueryBankBalancesHandler, + Args: cobra.ExactArgs(1), + } + + c.Flags().AddFlagSet(flagSetHome()) + c.Flags().AddFlagSet(flagSetAccountPrefixes()) + c.Flags().AddFlagSet(flagSetKeyringBackend()) + c.Flags().AddFlagSet(flagSetKeyringDir()) + c.Flags().AddFlagSet(flagSetPagination("all balances")) + + return c +} + +func nodeQueryBankBalancesHandler(cmd *cobra.Command, args []string) error { + inputAccount := args[0] + + client, err := newNodeCosmosClient(cmd) + if err != nil { + return err + } + + // inputAccount can be an account of the keyring or a raw address + address, err := client.Address(inputAccount) + if err != nil { + address = inputAccount + } + + pagination, err := getPagination(cmd) + if err != nil { + return err + } + + session := cliui.New() + defer session.Cleanup() + session.StartSpinner("Querying...") + balances, err := client.BankBalances(cmd.Context(), address, pagination) + if err != nil { + return err + } + + var rows [][]string + for _, b := range balances { + rows = append(rows, []string{b.Amount.String(), b.Denom}) + } + + session.StopSpinner() + return session.PrintTable([]string{"Amount", "Denom"}, rows...) +} diff --git a/ignite/cmd/node_query_tx.go b/ignite/cmd/node_query_tx.go new file mode 100644 index 0000000000..fd28cbb4b4 --- /dev/null +++ b/ignite/cmd/node_query_tx.go @@ -0,0 +1,41 @@ +package ignitecmd + +import ( + "encoding/hex" + "encoding/json" + "fmt" + + "github.com/spf13/cobra" +) + +func NewNodeQueryTx() *cobra.Command { + c := &cobra.Command{ + Use: "tx [hash]", + Short: "Query for transaction by hash", + RunE: nodeQueryTxHandler, + Args: cobra.ExactArgs(1), + } + return c +} + +func nodeQueryTxHandler(cmd *cobra.Command, args []string) error { + bz, err := hex.DecodeString(args[0]) + if err != nil { + return err + } + client, err := newNodeCosmosClient(cmd) + if err != nil { + return err + } + + resp, err := client.RPC.Tx(cmd.Context(), bz, false) + if err != nil { + return err + } + bz, err = json.MarshalIndent(resp, "", " ") + if err != nil { + return err + } + fmt.Println(string(bz)) + return nil +} diff --git a/ignite/cmd/node_tx.go b/ignite/cmd/node_tx.go new file mode 100644 index 0000000000..006bec27d2 --- /dev/null +++ b/ignite/cmd/node_tx.go @@ -0,0 +1,76 @@ +package ignitecmd + +import ( + "fmt" + + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/spf13/cobra" + flag "github.com/spf13/pflag" +) + +const ( + flagGenerateOnly = "generate-only" + + gasFlagAuto = "auto" + flagGasPrices = "gas-prices" + flagGas = "gas" + flagFees = "fees" + flagBroadcastMode = "broadcast-mode" +) + +func NewNodeTx() *cobra.Command { + c := &cobra.Command{ + Use: "tx", + Short: "Transactions subcommands", + } + c.PersistentFlags().AddFlagSet(flagSetHome()) + c.PersistentFlags().AddFlagSet(flagSetKeyringBackend()) + c.PersistentFlags().AddFlagSet(flagSetAccountPrefixes()) + c.PersistentFlags().AddFlagSet(flagSetKeyringDir()) + c.PersistentFlags().AddFlagSet(flagSetGenerateOnly()) + c.PersistentFlags().AddFlagSet(flagSetGasFlags()) + c.PersistentFlags().String(flagFees, "", "Fees to pay along with transaction; eg: 10uatom") + c.PersistentFlags().String(flagBroadcastMode, flags.BroadcastBlock, "Transaction broadcasting mode (sync|async|block), use sync if you encounter timeouts") + + c.AddCommand(NewNodeTxBank()) + + return c +} + +func flagSetGenerateOnly() *flag.FlagSet { + fs := flag.NewFlagSet("", flag.ContinueOnError) + fs.Bool(flagGenerateOnly, false, "Build an unsigned transaction and write it to STDOUT") + return fs +} + +func getGenerateOnly(cmd *cobra.Command) bool { + generateOnly, _ := cmd.Flags().GetBool(flagGenerateOnly) + return generateOnly +} + +func flagSetGasFlags() *flag.FlagSet { + fs := flag.NewFlagSet("", flag.ContinueOnError) + fs.String(flagGasPrices, "", "Gas prices in decimal format to determine the transaction fee (e.g. 0.1uatom)") + fs.String(flagGas, gasFlagAuto, fmt.Sprintf("gas limit to set per-transaction; set to %q to calculate sufficient gas automatically", gasFlagAuto)) + return fs +} + +func getGasPrices(cmd *cobra.Command) string { + gasPrices, _ := cmd.Flags().GetString(flagGasPrices) + return gasPrices +} + +func getGas(cmd *cobra.Command) string { + gas, _ := cmd.Flags().GetString(flagGas) + return gas +} + +func getFees(cmd *cobra.Command) string { + fees, _ := cmd.Flags().GetString(flagFees) + return fees +} + +func getBroadcastMode(cmd *cobra.Command) string { + broadcastMode, _ := cmd.Flags().GetString(flagBroadcastMode) + return broadcastMode +} diff --git a/ignite/cmd/node_tx_bank.go b/ignite/cmd/node_tx_bank.go new file mode 100644 index 0000000000..9c541a5b36 --- /dev/null +++ b/ignite/cmd/node_tx_bank.go @@ -0,0 +1,14 @@ +package ignitecmd + +import "github.com/spf13/cobra" + +func NewNodeTxBank() *cobra.Command { + c := &cobra.Command{ + Use: "bank", + Short: "Bank transaction subcommands", + } + + c.AddCommand(NewNodeTxBankSend()) + + return c +} diff --git a/ignite/cmd/node_tx_bank_send.go b/ignite/cmd/node_tx_bank_send.go new file mode 100644 index 0000000000..d70a1ca353 --- /dev/null +++ b/ignite/cmd/node_tx_bank_send.go @@ -0,0 +1,84 @@ +package ignitecmd + +import ( + "github.com/cosmos/cosmos-sdk/client/flags" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/spf13/cobra" + + "github.com/ignite/cli/ignite/pkg/cliui" +) + +func NewNodeTxBankSend() *cobra.Command { + c := &cobra.Command{ + Use: "send [from_account_or_address] [to_account_or_address] [amount]", + Short: "Send funds from one account to another.", + RunE: nodeTxBankSendHandler, + Args: cobra.ExactArgs(3), + } + + return c +} + +func nodeTxBankSendHandler(cmd *cobra.Command, args []string) error { + var ( + fromAccountInput = args[0] + toAccountInput = args[1] + amount = args[2] + generateOnly = getGenerateOnly(cmd) + ) + + client, err := newNodeCosmosClient(cmd) + if err != nil { + return err + } + + // fromAccountInput must be an account of the keyring + fromAccount, err := client.Account(fromAccountInput) + if err != nil { + return err + } + + // toAccountInput can be an account of the keyring or a raw address + toAddress, err := client.Address(toAccountInput) + if err != nil { + toAddress = toAccountInput + } + + coins, err := sdk.ParseCoinsNormalized(amount) + if err != nil { + return err + } + + tx, err := client.BankSendTx(fromAccount, toAddress, coins) + if err != nil { + return err + } + + session := cliui.New() + defer session.Cleanup() + if generateOnly { + json, err := tx.EncodeJSON() + if err != nil { + return err + } + + session.StopSpinner() + return session.Println(string(json)) + } + + session.StartSpinner("Sending transaction...") + resp, err := tx.Broadcast() + if err != nil { + return err + } + + session.StopSpinner() + session.Printf("Transaction broadcast successful! (hash = %s)\n", resp.TxHash) + session.Printf("%s sent from %s to %s\n", amount, fromAccountInput, toAccountInput) + if getBroadcastMode(cmd) != flags.BroadcastBlock { + session.Println("Transaction waiting to be included in a block.") + session.Println("Run the following command to follow the transaction status:") + session.Printf(" ignite node --node %s q tx %s\n", getNode(cmd), resp.TxHash) + } + return nil +} diff --git a/ignite/cmd/relayer_configure.go b/ignite/cmd/relayer_configure.go index 3f8f4ba188..06e9575a5a 100644 --- a/ignite/cmd/relayer_configure.go +++ b/ignite/cmd/relayer_configure.go @@ -1,6 +1,8 @@ package ignitecmd import ( + "fmt" + "github.com/gookit/color" "github.com/pkg/errors" "github.com/spf13/cobra" @@ -83,6 +85,7 @@ func NewRelayerConfigure() *cobra.Command { c.Flags().String(flagSourceClientID, "", "use a custom client id for source") c.Flags().String(flagTargetClientID, "", "use a custom client id for target") c.Flags().AddFlagSet(flagSetKeyringBackend()) + c.Flags().AddFlagSet(flagSetKeyringDir()) return c } @@ -97,6 +100,7 @@ func relayerConfigureHandler(cmd *cobra.Command, args []string) (err error) { ca, err := cosmosaccount.New( cosmosaccount.WithKeyringBackend(getKeyringBackend(cmd)), + cosmosaccount.WithHome(getKeyringDir(cmd)), ) if err != nil { return err @@ -400,6 +404,10 @@ func relayerConfigureHandler(cmd *cobra.Command, args []string) (err error) { return err } + if err := sourceChain.EnsureChainSetup(cmd.Context()); err != nil { + return err + } + targetChain, err := initChain( cmd, r, @@ -417,6 +425,10 @@ func relayerConfigureHandler(cmd *cobra.Command, args []string) (err error) { return err } + if err := targetChain.EnsureChainSetup(cmd.Context()); err != nil { + return err + } + session.StartSpinner("Configuring...") // sets advanced channel options @@ -461,10 +473,9 @@ func initChain( clientID string, ) (*relayer.Chain, error) { defer session.StopSpinner() - session.StartSpinner("Initializing chain...") + session.StartSpinner(fmt.Sprintf("Initializing chain %s...", name)) c, account, err := r.NewChain( - cmd.Context(), accountName, rpcAddr, relayer.WithFaucet(faucetAddr), @@ -477,16 +488,18 @@ func initChain( return nil, errors.Wrapf(err, "cannot resolve %s", name) } - session.StopSpinner() - - accountAddr := account.Address(addressPrefix) + accountAddr, err := account.Address(addressPrefix) + if err != nil { + return nil, err + } + session.StopSpinner() session.Printf("🔐 Account on %q is %s(%s)\n \n", name, accountName, accountAddr) session.StartSpinner(color.Yellow.Sprintf("trying to receive tokens from a faucet...")) coins, err := c.TryRetrieve(cmd.Context()) - session.StopSpinner() + session.StopSpinner() session.Print(" |· ") if err != nil { session.Println(color.Yellow.Sprintf(err.Error())) diff --git a/ignite/cmd/relayer_connect.go b/ignite/cmd/relayer_connect.go index 2c7c44f275..74b3fe6be8 100644 --- a/ignite/cmd/relayer_connect.go +++ b/ignite/cmd/relayer_connect.go @@ -23,6 +23,7 @@ func NewRelayerConnect() *cobra.Command { } c.Flags().AddFlagSet(flagSetKeyringBackend()) + c.Flags().AddFlagSet(flagSetKeyringDir()) return c } @@ -37,6 +38,7 @@ func relayerConnectHandler(cmd *cobra.Command, args []string) (err error) { ca, err := cosmosaccount.New( cosmosaccount.WithKeyringBackend(getKeyringBackend(cmd)), + cosmosaccount.WithHome(getKeyringDir(cmd)), ) if err != nil { return err @@ -62,7 +64,6 @@ func relayerConnectHandler(cmd *cobra.Command, args []string) (err error) { if len(ids) == 0 { for _, path := range all { use = append(use, path.ID) - } } else { for _, id := range ids { @@ -71,7 +72,6 @@ func relayerConnectHandler(cmd *cobra.Command, args []string) (err error) { use = append(use, path.ID) break } - } } } @@ -84,7 +84,7 @@ func relayerConnectHandler(cmd *cobra.Command, args []string) (err error) { session.StartSpinner("Creating links between chains...") - if err := r.Link(cmd.Context(), use...); err != nil { + if err := r.LinkPaths(cmd.Context(), use...); err != nil { return err } @@ -118,5 +118,5 @@ func relayerConnectHandler(cmd *cobra.Command, args []string) (err error) { return err } - return r.Start(cmd.Context(), use...) + return r.StartPaths(cmd.Context(), use...) } diff --git a/ignite/cmd/scaffold.go b/ignite/cmd/scaffold.go index 0fcb16681a..f7ed2df48d 100644 --- a/ignite/cmd/scaffold.go +++ b/ignite/cmd/scaffold.go @@ -28,9 +28,60 @@ func NewScaffold() *cobra.Command { c := &cobra.Command{ Use: "scaffold [command]", Short: "Scaffold a new blockchain, module, message, query, and more", - Long: `Scaffold commands create and modify the source code files to add functionality. - -CRUD stands for "create, read, update, delete".`, + Long: `Scaffolding is a quick way to generate code for major pieces of your +application. + +For details on each scaffolding target (chain, module, message, etc.) run the +corresponding command with a "--help" flag, for example, "ignite scaffold chain +--help". + +The Ignite team strongly recommends committing the code to a version control +system before running scaffolding commands. This will make it easier to see the +changes to the source code as well as undo the command if you've decided to roll +back the changes. + +This blockchain you create with the chain scaffolding command uses the modular +Cosmos SDK framework and imports many standard modules for functionality like +proof of stake, token transfer, inter-blockchain connectivity, governance, and +more. Custom functionality is implemented in modules located by convention in +the "x/" directory. By default, your blockchain comes with an empty custom +module. Use the module scaffolding command to create an additional module. + +An empty custom module doesn't do much, it's basically a container for logic +that is responsible for processing transactions and changing the application +state. Cosmos SDK blockchains work by processing user-submitted signed +transactions, which contain one or more messages. A message contains data that +describes a state transition. A module can be responsible for handling any +number of messages. + +A message scaffolding command will generate the code for handling a new type of +Cosmos SDK message. Message fields describe the state transition that the +message is intended to produce if processed without errors. + +Scaffolding messages is useful to create individual "actions" that your module +can perform. Sometimes, however, you want your blockchain to have the +functionality to create, read, update and delete (CRUD) instances of a +particular type. Depending on how you want to store the data there are three +commands that scaffold CRUD functionality for a type: list, map, and single. +These commands create four messages (one for each CRUD action), and the logic to +add, delete, and fetch the data from the store. If you want to scaffold only the +logic, for example, you've decided to scaffold messages separately, you can do +that as well with the "--no-message" flag. + +Reading data from a blockchain happens with a help of queries. Similar to how +you can scaffold messages to write data, you can scaffold queries to read the +data back from your blockchain application. + +You can also scaffold a type, which just produces a new protocol buffer file +with a proto message description. Note that proto messages produce (and +correspond with) Go types whereas Cosmos SDK messages correspond to proto "rpc" +in the "Msg" service. + +If you're building an application with custom IBC logic, you might need to +scaffold IBC packets. An IBC packet represents the data sent from one blockchain +to another. You can only scaffold IBC packets in IBC-enabled modules scaffolded +with an "--ibc" flag. Note that the default module is not IBC-enabled. +`, Aliases: []string{"s"}, Args: cobra.ExactArgs(1), } diff --git a/ignite/cmd/scaffold_chain.go b/ignite/cmd/scaffold_chain.go index 34422f4523..79bfd7bee2 100644 --- a/ignite/cmd/scaffold_chain.go +++ b/ignite/cmd/scaffold_chain.go @@ -21,28 +21,45 @@ func NewScaffoldChain() *cobra.Command { Short: "Fully-featured Cosmos SDK blockchain", Long: `Create a new application-specific Cosmos SDK blockchain. -For example, the following command will create a blockchain called "hello" in the "hello/" directory: +For example, the following command will create a blockchain called "hello" in +the "hello/" directory: ignite scaffold chain hello -A project name can be a simple name or a URL. The name will be used as the Go module path for the project. Examples of project names: +A project name can be a simple name or a URL. The name will be used as the Go +module path for the project. Examples of project names: ignite scaffold chain foo ignite scaffold chain foo/bar ignite scaffold chain example.org/foo ignite scaffold chain github.com/username/foo -A new directory with source code files will be created in the current directory. To use a different path use the "--path" flag. - -Most of the logic of your blockchain is written in custom modules. Each module effectively encapsulates an independent piece of functionality. Following the Cosmos SDK convention, custom modules are stored inside the "x/" directory. By default, Ignite creates a module with a name that matches the name of the project. To create a blockchain without a default module use the "--no-module" flag. Additional modules can be added after a project is created with "ignite scaffold module" command. - -Account addresses on Cosmos SDK-based blockchains have string prefixes. For example, the Cosmos Hub blockchain uses the default "cosmos" prefix, so that addresses look like this: "cosmos12fjzdtqfrrve7zyg9sv8j25azw2ua6tvu07ypf". To use a custom address prefix use the "--address-prefix" flag. For example: +A new directory with source code files will be created in the current directory. +To use a different path use the "--path" flag. + +Most of the logic of your blockchain is written in custom modules. Each module +effectively encapsulates an independent piece of functionality. Following the +Cosmos SDK convention, custom modules are stored inside the "x/" directory. By +default, Ignite creates a module with a name that matches the name of the +project. To create a blockchain without a default module use the "--no-module" +flag. Additional modules can be added after a project is created with "ignite +scaffold module" command. + +Account addresses on Cosmos SDK-based blockchains have string prefixes. For +example, the Cosmos Hub blockchain uses the default "cosmos" prefix, so that +addresses look like this: "cosmos12fjzdtqfrrve7zyg9sv8j25azw2ua6tvu07ypf". To +use a custom address prefix use the "--address-prefix" flag. For example: ignite scaffold chain foo --address-prefix bar -By default when compiling a blockchain's source code Ignite creates a cache to speed up the build process. To clear the cache when building a blockchain use the "--clear-cache" flag. It is very unlikely you will ever need to use this flag. +By default when compiling a blockchain's source code Ignite creates a cache to +speed up the build process. To clear the cache when building a blockchain use +the "--clear-cache" flag. It is very unlikely you will ever need to use this +flag. -The blockchain is using the Cosmos SDK modular blockchain framework. Learn more about Cosmos SDK on https://docs.cosmos.network`, +The blockchain is using the Cosmos SDK modular blockchain framework. Learn more +about Cosmos SDK on https://docs.cosmos.network +`, Args: cobra.ExactArgs(1), RunE: scaffoldChainHandler, } diff --git a/ignite/cmd/scaffold_list.go b/ignite/cmd/scaffold_list.go index bb11773a2c..7386356fe4 100644 --- a/ignite/cmd/scaffold_list.go +++ b/ignite/cmd/scaffold_list.go @@ -11,8 +11,83 @@ func NewScaffoldList() *cobra.Command { c := &cobra.Command{ Use: "list NAME [field]...", Short: "CRUD for data stored as an array", - Args: cobra.MinimumNArgs(1), - RunE: scaffoldListHandler, + Long: `The "list" scaffolding command is used to generate files that implement the +logic for storing and interacting with data stored as a list in the blockchain +state. + +The command accepts a NAME argument that will be used as the name of a new type +of data. It also accepts a list of FIELDs that describe the type. + +The interaction with the data follows the create, read, updated, and delete +(CRUD) pattern. For each type three Cosmos SDK messages are defined for writing +data to the blockchain: MsgCreate{Name}, MsgUpdate{Name}, MsgDelete{Name}. For +reading data two queries are defined: {Name} and {Name}All. The type, messages, +and queries are defined in the "proto/" directory as protocol buffer messages. +Messages and queries are mounted in the "Msg" and "Query" services respectively. + +When messages are handled, the appropriate keeper methods are called. By +convention, the methods are defined in +"x/{moduleName}/keeper/msg_server_{name}.go". Helpful methods for getting, +setting, removing, and appending are defined in the same "keeper" package in +"{name}.go". + +The "list" command essentially allows you to define a new type of data and +provides the logic to create, read, update, and delete instances of the type. +For example, let's review a command that generates the code to handle a list of +posts and each post has "title" and "body" fields: + + ignite scaffold list post title body + +This provides you with a "Post" type, MsgCreatePost, MsgUpdatePost, +MsgDeletePost and two queries: Post and PostAll. The compiled CLI, let's say the +binary is "blogd" and the module is "blog", has commands to query the chain (see +"blogd q blog") and broadcast transactions with the messages above (see "blogd +tx blog"). + +The code generated with the list command is meant to be edited and tailored to +your application needs. Consider the code to be a "skeleton" for the actual +business logic you will implement next. + +By default, all fields are assumed to be strings. If you want a field of a +different type, you can specify it after a colon ":". The following types are +supported: string, bool, int, uint, coin, array.string, array.int, array.uint, +array.coin. An example of using custom types: + + ignite scaffold list pool amount:coin tags:array.string height:int + +Ignite also supports custom types: + + ignite scaffold list product-details name description + + ignite scaffold list product price:coin details:ProductDetails + +In the example above the "ProductDetails" type was defined first, and then used +as a custom type for the "details" field. Ignite doesn't support arrays of +custom types yet. + +By default the code will be scaffolded in the module that matches your project's +name. If you have several modules in your project, you might want to specify a +different module: + + ignite scaffold list post title body --module blog + +By default, each message comes with a "creator" field that represents the +address of the transaction signer. You can customize the name of this field with +a flag: + + ignite scaffold list post title body --signer author + +It's possible to scaffold just the getter/setter logic without the CRUD +messages. This is useful when you want the methods to handle a type, but would +like to scaffold messages manually. Use a flag to skip message scaffolding: + + ignite scaffold list post title body --no-message + +The "creator" field is not generated if a list is scaffolded with the +"--no-message" flag. +`, + Args: cobra.MinimumNArgs(1), + RunE: scaffoldListHandler, } flagSetPath(c) diff --git a/ignite/cmd/scaffold_map.go b/ignite/cmd/scaffold_map.go index 7f5707fa68..8a79fca02c 100644 --- a/ignite/cmd/scaffold_map.go +++ b/ignite/cmd/scaffold_map.go @@ -15,8 +15,48 @@ func NewScaffoldMap() *cobra.Command { c := &cobra.Command{ Use: "map NAME [field]...", Short: "CRUD for data stored as key-value pairs", - Args: cobra.MinimumNArgs(1), - RunE: scaffoldMapHandler, + Long: `The "map" scaffolding command is used to generate files that implement the logic +for storing and interacting with data stored as key-value pairs (or a +dictionary) in the blockchain state. + +The "map" command is very similar to "ignite scaffold list" with the main +difference in how values are indexed. With "list" values are indexed by an +incrementing integer, whereas "list" values are indexed by a user-provided value +(or multiple values). + +Let's use the same blog post example: + + ignite scaffold map post title body + +This command scaffolds a "Post" type and CRUD functionality to create, read, +updated, and delete posts. However, when creating a new post with your chain's +binary (or by submitting a transaction through the chain's API) you will be +required to provide an "index": + + blogd tx blog create-post [index] [title] [body] + blogd tx blog create-post hello "My first post" "This is the body" + +This command will create a post and store it in the blockchain's state under the +"hello" index. You will be able to fetch back the value of the post by querying +for the "hello" key. + + blogd q blog show-post hello + +To customize the index, use the "--index" flag. Multiple indices can be +provided, which simplifies querying values. For example: + + ignite scaffold map product price desc --index category,guid + +With this command, you would get a "Product" value indexed by both a category +and a GUID (globally unique ID). This will let you programmatically fetch +product values that have the same category but are using different GUIDs. + +Since the behavior of "list" and "map" scaffolding is very similar, you can use +the "--no-message", "--module", "--signer" flags as well as the colon syntax for +custom types. +`, + Args: cobra.MinimumNArgs(1), + RunE: scaffoldMapHandler, } flagSetPath(c) diff --git a/ignite/cmd/scaffold_message.go b/ignite/cmd/scaffold_message.go index a47cc6e576..31dcf1b6b7 100644 --- a/ignite/cmd/scaffold_message.go +++ b/ignite/cmd/scaffold_message.go @@ -17,8 +17,52 @@ func NewScaffoldMessage() *cobra.Command { c := &cobra.Command{ Use: "message [name] [field1] [field2] ...", Short: "Message to perform state transition on the blockchain", - Args: cobra.MinimumNArgs(1), - RunE: messageHandler, + Long: `Message scaffolding is useful for quickly adding functionality to your +blockchain to handle specific Cosmos SDK messages. + +Messages are objects whose end goal is to trigger state transitions on the +blockchain. A message is a container for fields of data that affect how the +blockchain's state will change. You can think of messages as "actions" that a +user can perform. + +For example, the bank module has a "Send" message for token transfers between +accounts. The send message has three fields: from address (sender), to address +(recipient), and a token amount. When this message is successfully processed, +the token amount will be deducted from the sender's account and added to the +recipient's account. + +Ignite's message scaffolding lets you create new types of messages and add them +to your chain. For example: + + ignite scaffold message add-pool amount:coins denom active:bool --module dex + +The command above will create a new message MsgAddPool with three fields: amount +(in tokens), denom (a string), and active (a boolean). The message will be added +to the "dex" module. + +By default, the message is defined as a proto message in the +"proto/{module}/tx.proto" and registered in the "Msg" service. A CLI command to +create and broadcast a transaction with MsgAddPool is created in the module's +"cli" package. Additionally, Ignite scaffolds a message constructor and the code +to satisfy the sdk.Msg interface and register the message in the module. + +Most importantly in the "keeper" package Ignite scaffolds an "AddPool" function. +Inside this function, you can implement message handling logic. + +When successfully processed a message can return data. Use the —response flag to +specify response fields and their types. For example + + ignite scaffold message create-post title body --response id:int,title + +The command above will scaffold MsgCreatePost which returns both an ID (an +integer) and a title (a string). + +Message scaffolding follows the rules as "ignite scaffold list/map/single" and +supports fields with standard and custom types. See "ignite scaffold list —help" +for details. +`, + Args: cobra.MinimumNArgs(1), + RunE: messageHandler, } flagSetPath(c) diff --git a/ignite/cmd/scaffold_module.go b/ignite/cmd/scaffold_module.go index 3f80b27818..89dfefe271 100644 --- a/ignite/cmd/scaffold_module.go +++ b/ignite/cmd/scaffold_module.go @@ -29,9 +29,67 @@ func NewScaffoldModule() *cobra.Command { c := &cobra.Command{ Use: "module [name]", Short: "Scaffold a Cosmos SDK module", - Long: "Scaffold a new Cosmos SDK module in the `x` directory", - Args: cobra.MinimumNArgs(1), - RunE: scaffoldModuleHandler, + Long: `Scaffold a new Cosmos SDK module. + +Cosmos SDK is a modular framework and each independent piece of functionality is +implemented in a separate module. By default your blockchain imports a set of +standard Cosmos SDK modules. To implement custom functionality of your +blockchain, scaffold a module and implement the logic of your application. + +This command does the following: + +* Creates a directory with module's protocol buffer files in "proto/" +* Creates a directory with module's boilerplate Go code in "x/" +* Imports the newly created module by modifying "app/app.go" +* Creates a file in "testutil/keeper/" that contains logic to create a keeper + for testing purposes + +This command will proceed with module scaffolding even if "app/app.go" doesn't +have the required default placeholders. If the placeholders are missing, you +will need to modify "app/app.go" manually to import the module. If you want the +command to fail if it can't import the module, use the "--require-registration" +flag. + +To scaffold an IBC-enabled module use the "--ibc" flag. An IBC-enabled module is +like a regular module with the addition of IBC-specific logic and placeholders +to scaffold IBC packets with "ignite scaffold packet". + +A module can depend on one or more other modules and import their keeper +methods. To scaffold a module with a dependency use the "--dep" flag + +For example, your new custom module "foo" might have functionality that requires +sending tokens between accounts. The method for sending tokens is a defined in +the "bank"'s module keeper. You can scaffold a "foo" module with the dependency +on "bank" with the following command: + + ignite scaffold module foo --dep bank + +You can then define which methods you want to import from the "bank" keeper in +"expected_keepers.go". + +You can also scaffold a module with a list of dependencies that can include both +standard and custom modules (provided they exist): + + ignite scaffold module bar --dep foo,mint,account + +Note: the "--dep" flag doesn't install third-party modules into your +application, it just generates extra code that specifies which existing modules +your new custom module depends on. + +A Cosmos SDK module can have parameters (or "params"). Params are values that +can be set at the genesis of the blockchain and can be modified while the +blockchain is running. An example of a param is "Inflation rate change" of the +"mint" module. A module can be scaffolded with params using the "--params" flag +that accepts a list of param names. By default params are of type "string", but +you can specify a type for each param. For example: + + ignite scaffold module foo --params baz:uint,bar:bool + +Refer to Cosmos SDK documentation to learn more about modules, dependencies and +params. +`, + Args: cobra.ExactArgs(1), + RunE: scaffoldModuleHandler, } flagSetPath(c) diff --git a/ignite/cmd/tools.go b/ignite/cmd/tools.go index df803e60f4..73729396fd 100644 --- a/ignite/cmd/tools.go +++ b/ignite/cmd/tools.go @@ -22,7 +22,6 @@ func NewTools() *cobra.Command { c.AddCommand(NewToolsIBCSetup()) c.AddCommand(NewToolsIBCRelayer()) c.AddCommand(NewToolsProtoc()) - c.AddCommand(NewToolsCompletions()) return c } @@ -74,7 +73,7 @@ func toolsProtocProxy(cmd *cobra.Command, args []string) error { } defer cleanup() - return toolsProxy(cmd.Context(), append(command.Command, args...)) + return toolsProxy(cmd.Context(), append(command.Command(), args...)) } func toolsProxy(ctx context.Context, command []string) error { @@ -87,75 +86,3 @@ func toolsProxy(ctx context.Context, command []string) error { ), ) } - -func NewToolsCompletions() *cobra.Command { - - // completionCmd represents the completion command - c := &cobra.Command{ - Use: "completions", - Short: "Generate completions script", - Long: ` The completions command outputs a completion script you can use in your shell. The output script requires - that [bash-completion](https://github.com/scop/bash-completion) is installed and enabled in your - system. Since most Unix-like operating systems come with bash-completion by default, bash-completion - is probably already installed and operational. - -Bash: - - $ source <(ignite tools completions bash) - - To load completions for every new session, run: - - ** Linux ** - $ ignite tools completions bash > /etc/bash_completion.d/ignite - - ** macOS ** - $ ignite tools completions bash > /usr/local/etc/bash_completion.d/ignite - -Zsh: - - If shell completions is not already enabled in your environment, you will need to enable it. You can execute the following once: - - $ echo "autoload -U compinit; compinit" >> ~/.zshrc - - To load completions for each session, execute once: - - $ ignite tools completions zsh > "${fpath[1]}/_ignite" - - You will need to start a new shell for this setup to take effect. - -fish: - - $ ignite tools completions fish | source - - To load completions for each session, execute once: - - $ ignite tools completions fish > ~/.config/fish/completionss/ignite.fish - -PowerShell: - - PS> ignite tools completions powershell | Out-String | Invoke-Expression - - To load completions for every new session, run: - - PS> ignite tools completions powershell > ignite.ps1 - - and source this file from your PowerShell profile. -`, - DisableFlagsInUseLine: true, - ValidArgs: []string{"bash", "zsh", "fish", "powershell"}, - Args: cobra.ExactValidArgs(1), - Run: func(cmd *cobra.Command, args []string) { - switch args[0] { - case "bash": - cmd.Root().GenBashCompletion(os.Stdout) - case "zsh": - cmd.Root().GenZshCompletion(os.Stdout) - case "fish": - cmd.Root().GenFishCompletion(os.Stdout, true) - case "powershell": - cmd.Root().GenPowerShellCompletionWithDesc(os.Stdout) - } - }, - } - return c -} diff --git a/ignite/errors/errors.go b/ignite/errors/errors.go index 1691ece322..a9a967499c 100644 --- a/ignite/errors/errors.go +++ b/ignite/errors/errors.go @@ -3,7 +3,5 @@ package sperrors import "errors" -var ( - // ErrOnlyStargateSupported is returned when underlying chain is not a stargate chain. - ErrOnlyStargateSupported = errors.New("this version of Cosmos SDK is no longer supported") -) +// ErrOnlyStargateSupported is returned when underlying chain is not a stargate chain. +var ErrOnlyStargateSupported = errors.New("this version of Cosmos SDK is no longer supported") diff --git a/ignite/internal/tools/gen-cli-docs/main.go b/ignite/internal/tools/gen-cli-docs/main.go index f153f5a12f..ca36c714b2 100644 --- a/ignite/internal/tools/gen-cli-docs/main.go +++ b/ignite/internal/tools/gen-cli-docs/main.go @@ -33,16 +33,19 @@ func main() { outPath := flag.String("out", ".", ".md file path to place Ignite CLI docs inside") flag.Parse() - if err := generate(ignitecmd.New(), *outPath); err != nil { + // Run ExecuteC so cobra adds the completion command. + cmd, _ := ignitecmd.New().ExecuteC() + + if err := generate(cmd, *outPath); err != nil { log.Fatal(err) } } func generate(cmd *cobra.Command, outPath string) error { - if err := os.MkdirAll(filepath.Dir(outPath), 0755); err != nil { + if err := os.MkdirAll(filepath.Dir(outPath), 0o755); err != nil { return err } - f, err := os.OpenFile(outPath, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0644) + f, err := os.OpenFile(outPath, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0o644) if err != nil { return err } diff --git a/ignite/internal/tools/tools.go b/ignite/internal/tools/tools.go index 969f531519..3e5736ce8d 100644 --- a/ignite/internal/tools/tools.go +++ b/ignite/internal/tools/tools.go @@ -4,5 +4,8 @@ package tools import ( + _ "github.com/golangci/golangci-lint/cmd/golangci-lint" _ "github.com/vektra/mockery/v2" + _ "golang.org/x/tools/cmd/goimports" + _ "mvdan.cc/gofumpt" ) diff --git a/ignite/pkg/cache/cache.go b/ignite/pkg/cache/cache.go index f83f7bd379..1c8d194d48 100644 --- a/ignite/pkg/cache/cache.go +++ b/ignite/pkg/cache/cache.go @@ -29,7 +29,7 @@ type Cache[T any] struct { // path is the full path (including filename) to the database file to ues // It does not need to be closed as this happens automatically in each call to the cache func NewStorage(path string) (Storage, error) { - if err := os.MkdirAll(filepath.Dir(path), 0755); err != nil { + if err := os.MkdirAll(filepath.Dir(path), 0o755); err != nil { return Storage{}, err } @@ -51,7 +51,7 @@ func Key(keyParts ...string) string { // Clear deletes all namespaces and cached values func (s Storage) Clear() error { - db, err := openDb(s.storagePath) + db, err := openDB(s.storagePath) if err != nil { return err } @@ -67,7 +67,7 @@ func (s Storage) Clear() error { // Put sets key to value within the namespace // If the key already exists, it will be overwritten func (c Cache[T]) Put(key string, value T) error { - db, err := openDb(c.storage.storagePath) + db, err := openDB(c.storage.storagePath) if err != nil { return err } @@ -92,7 +92,7 @@ func (c Cache[T]) Put(key string, value T) error { // Get fetches the value of key within the namespace. // If no value exists, it will return found == false func (c Cache[T]) Get(key string) (val T, err error) { - db, err := openDb(c.storage.storagePath) + db, err := openDB(c.storage.storagePath) if err != nil { return } @@ -128,7 +128,7 @@ func (c Cache[T]) Get(key string) (val T, err error) { // Delete removes a value for key within the namespace func (c Cache[T]) Delete(key string) error { - db, err := openDb(c.storage.storagePath) + db, err := openDB(c.storage.storagePath) if err != nil { return err } @@ -144,6 +144,6 @@ func (c Cache[T]) Delete(key string) error { }) } -func openDb(path string) (*bolt.DB, error) { - return bolt.Open(path, 0640, &bolt.Options{Timeout: 1 * time.Minute}) +func openDB(path string) (*bolt.DB, error) { + return bolt.Open(path, 0o640, &bolt.Options{Timeout: 1 * time.Minute}) } diff --git a/ignite/pkg/chaincmd/chaincmd.go b/ignite/pkg/chaincmd/chaincmd.go index b9df53d33c..814c5b7393 100644 --- a/ignite/pkg/chaincmd/chaincmd.go +++ b/ignite/pkg/chaincmd/chaincmd.go @@ -3,6 +3,8 @@ package chaincmd import ( "fmt" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/ignite/cli/ignite/pkg/cmdrunner/step" "github.com/ignite/cli/ignite/pkg/cosmosver" ) @@ -50,7 +52,6 @@ const ( constTendermint = "tendermint" constJSON = "json" - constSync = "sync" ) type KeyringBackend string @@ -524,8 +525,7 @@ func (c ChainCmd) BankSendCommand(fromAddress, toAddress, amount string) step.Op fromAddress, toAddress, amount, - optionBroadcastMode, - constSync, + optionBroadcastMode, flags.BroadcastSync, optionYes, ) diff --git a/ignite/pkg/chaincmd/runner/chain.go b/ignite/pkg/chaincmd/runner/chain.go index 51000c127a..2da1f379f3 100644 --- a/ignite/pkg/chaincmd/runner/chain.go +++ b/ignite/pkg/chaincmd/runner/chain.go @@ -239,7 +239,7 @@ func (r Runner) WaitTx(ctx context.Context, txHash string, retryDelay time.Durat func (r Runner) Export(ctx context.Context, exportedFile string) error { // Make sure the path exists dir := filepath.Dir(exportedFile) - if err := os.MkdirAll(dir, 0755); err != nil { + if err := os.MkdirAll(dir, 0o755); err != nil { return err } @@ -257,7 +257,7 @@ func (r Runner) Export(ctx context.Context, exportedFile string) error { } // Save the new state - return os.WriteFile(exportedFile, exportedState, 0644) + return os.WriteFile(exportedFile, exportedState, 0o644) } // EventSelector is used to query events. diff --git a/ignite/pkg/checksum/checksum.go b/ignite/pkg/checksum/checksum.go index c766eab640..4961e1b636 100644 --- a/ignite/pkg/checksum/checksum.go +++ b/ignite/pkg/checksum/checksum.go @@ -38,7 +38,7 @@ func Sum(dirPath, outPath string) error { } } - return os.WriteFile(outPath, b.Bytes(), 0666) + return os.WriteFile(outPath, b.Bytes(), 0o666) } // Binary returns SHA256 hash of executable file, file is searched by name in PATH diff --git a/ignite/pkg/cliui/cliui.go b/ignite/pkg/cliui/cliui.go index 4d7ab266ff..130f692db4 100644 --- a/ignite/pkg/cliui/cliui.go +++ b/ignite/pkg/cliui/cliui.go @@ -172,7 +172,7 @@ func (s Session) printLoop() { case events.StatusNeutral: resume := s.PauseSpinner() - fmt.Fprintf(s.out, event.Text()) + fmt.Fprint(s.out, event.Text()) resume() } diff --git a/ignite/pkg/cmdrunner/cmdrunner.go b/ignite/pkg/cmdrunner/cmdrunner.go index ed3cfe28b8..d1574334d9 100644 --- a/ignite/pkg/cmdrunner/cmdrunner.go +++ b/ignite/pkg/cmdrunner/cmdrunner.go @@ -6,6 +6,7 @@ import ( "io" "os" "os/exec" + "strings" "golang.org/x/sync/errgroup" @@ -21,6 +22,7 @@ type Runner struct { stdin io.Reader workdir string runParallel bool + debug bool } // Option defines option to run commands @@ -68,6 +70,12 @@ func EndSignal(s os.Signal) Option { } } +func EnableDebug() Option { + return func(r *Runner) { + r.debug = true + } +} + // New returns a new commands runner func New(options ...Option) *Runner { runner := &Runner{ @@ -85,9 +93,13 @@ func (r *Runner) Run(ctx context.Context, steps ...*step.Step) error { return nil } g, ctx := errgroup.WithContext(ctx) - for _, step := range steps { + for i, step := range steps { // copy s to a new variable to allocate a new address // so we can safely use it inside goroutines spawned in this loop. + if r.debug { + fmt.Printf("Step %d: %s %s\n", i, step.Exec.Command, + strings.Join(step.Exec.Args, " ")) + } step := step if err := ctx.Err(); err != nil { return err diff --git a/ignite/pkg/confile/confile.go b/ignite/pkg/confile/confile.go index 9d62ab8978..e92a7606a8 100644 --- a/ignite/pkg/confile/confile.go +++ b/ignite/pkg/confile/confile.go @@ -38,10 +38,10 @@ func (c *ConfigFile) Load(v interface{}) error { // Save saves v into config file by overwriting the previous content it also creates the // config file if it wasn't exist. func (c *ConfigFile) Save(v interface{}) error { - if err := os.MkdirAll(filepath.Dir(c.path), 0755); err != nil { + if err := os.MkdirAll(filepath.Dir(c.path), 0o755); err != nil { return err } - file, err := os.OpenFile(c.path, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0644) + file, err := os.OpenFile(c.path, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0o644) if err != nil { return err } diff --git a/ignite/pkg/confile/confile_test.go b/ignite/pkg/confile/confile_test.go index 3059f29902..95b4e971b2 100644 --- a/ignite/pkg/confile/confile_test.go +++ b/ignite/pkg/confile/confile_test.go @@ -26,7 +26,6 @@ func TestAll(t *testing.T) { for _, tt := range cases { t.Run(tt.name, func(t *testing.T) { - file, err := os.CreateTemp("", "") require.NoError(t, err) defer func() { @@ -51,5 +50,4 @@ func TestAll(t *testing.T) { require.Equal(t, "cosmos", d2.Hello) }) } - } diff --git a/ignite/pkg/cosmosaccount/cosmosaccount.go b/ignite/pkg/cosmosaccount/cosmosaccount.go index 3cd9d5f913..b5e8884f80 100644 --- a/ignite/pkg/cosmosaccount/cosmosaccount.go +++ b/ignite/pkg/cosmosaccount/cosmosaccount.go @@ -1,16 +1,22 @@ package cosmosaccount import ( + "bufio" + "encoding/hex" "errors" "fmt" "os" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + dkeyring "github.com/99designs/keyring" + "github.com/cosmos/cosmos-sdk/codec" + "github.com/cosmos/cosmos-sdk/codec/types" + cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" "github.com/cosmos/cosmos-sdk/crypto/hd" "github.com/cosmos/cosmos-sdk/crypto/keyring" sdktypes "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/bech32" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" "github.com/cosmos/go-bip39" ) @@ -25,9 +31,7 @@ const ( // KeyringHome used to store account related data. var KeyringHome = os.ExpandEnv("$HOME/.ignite/accounts") -var ( - ErrAccountExists = errors.New("account already exists") -) +var ErrAccountExists = errors.New("account already exists") const ( AccountPrefixCosmos = "cosmos" @@ -92,8 +96,11 @@ func New(options ...Option) (Registry, error) { } var err error - - r.Keyring, err = keyring.New(r.keyringServiceName, string(r.keyringBackend), r.homePath, os.Stdin) + inBuf := bufio.NewReader(os.Stdin) + interfaceRegistry := types.NewInterfaceRegistry() + cryptocodec.RegisterInterfaces(interfaceRegistry) + cdc := codec.NewProtoCodec(interfaceRegistry) + r.Keyring, err = keyring.New(r.keyringServiceName, string(r.keyringBackend), r.homePath, inBuf, cdc) if err != nil { return Registry{}, err } @@ -118,35 +125,45 @@ func NewInMemory(options ...Option) (Registry, error) { ) } -// Account represents an Cosmos SDK account. +// Account represents a Cosmos SDK account. type Account struct { // Name of the account. Name string - // Info holds additional info about the account. - Info keyring.Info + // Record holds additional info about the account. + Record *keyring.Record } // Address returns the address of the account from given prefix. -func (a Account) Address(accPrefix string) string { +func (a Account) Address(accPrefix string) (string, error) { if accPrefix == "" { accPrefix = AccountPrefixCosmos } - return toBench32(accPrefix, a.Info.GetPubKey().Address()) + pk, err := a.Record.GetPubKey() + if err != nil { + return "", err + } + + return toBech32(accPrefix, pk.Address()) } // PubKey returns a public key for account. -func (a Account) PubKey() string { - return a.Info.GetPubKey().String() +func (a Account) PubKey() (string, error) { + pk, err := a.Record.GetPubKey() + if err != nil { + return "", nil + } + + return pk.String(), nil } -func toBench32(prefix string, addr []byte) string { +func toBech32(prefix string, addr []byte) (string, error) { bech32Addr, err := bech32.ConvertAndEncode(prefix, addr) if err != nil { - panic(err) + return "", err } - return bech32Addr + return bech32Addr, nil } // EnsureDefaultAccount ensures that default account exists. @@ -172,7 +189,6 @@ func (r Registry) Create(name string) (acc Account, mnemonic string, err error) if !errors.As(err, &accErr) { return Account{}, "", err } - entropySeed, err := bip39.NewEntropy(256) if err != nil { return Account{}, "", err @@ -181,19 +197,18 @@ func (r Registry) Create(name string) (acc Account, mnemonic string, err error) if err != nil { return Account{}, "", err } - algo, err := r.algo() if err != nil { return Account{}, "", err } - info, err := r.Keyring.NewAccount(name, mnemonic, "", r.hdPath(), algo) + record, err := r.Keyring.NewAccount(name, mnemonic, "", r.hdPath(), algo) if err != nil { return Account{}, "", err } acc = Account{ - Name: name, - Info: info, + Name: name, + Record: record, } return acc, mnemonic, nil @@ -234,7 +249,6 @@ func (r Registry) Export(name, passphrase string) (key string, err error) { } return r.Keyring.ExportPrivKeyArmor(name, passphrase) - } // ExportHex exports an account as a private key in hex. @@ -243,40 +257,68 @@ func (r Registry) ExportHex(name, passphrase string) (hex string, err error) { return "", err } - return keyring.NewUnsafe(r.Keyring).UnsafeExportPrivKeyHex(name) + return unsafeExportPrivKeyHex(r.Keyring, name, passphrase) +} + +func unsafeExportPrivKeyHex(kr keyring.Keyring, uid, passphrase string) (privkey string, err error) { + priv, err := kr.ExportPrivKeyArmor(uid, passphrase) + if err != nil { + return "", err + } + + return hex.EncodeToString([]byte(priv)), nil } // GetByName returns an account by its name. func (r Registry) GetByName(name string) (Account, error) { - info, err := r.Keyring.Key(name) + record, err := r.Keyring.Key(name) if errors.Is(err, dkeyring.ErrKeyNotFound) || errors.Is(err, sdkerrors.ErrKeyNotFound) { return Account{}, &AccountDoesNotExistError{name} } if err != nil { - return Account{}, nil + return Account{}, err } acc := Account{ - Name: name, - Info: info, + Name: name, + Record: record, } return acc, nil } +// GetByAddress returns an account by its address. +func (r Registry) GetByAddress(address string) (Account, error) { + sdkAddr, err := sdktypes.AccAddressFromBech32(address) + if err != nil { + return Account{}, err + } + record, err := r.Keyring.KeyByAddress(sdkAddr) + if errors.Is(err, dkeyring.ErrKeyNotFound) || errors.Is(err, sdkerrors.ErrKeyNotFound) { + return Account{}, &AccountDoesNotExistError{address} + } + if err != nil { + return Account{}, err + } + return Account{ + Name: record.Name, + Record: record, + }, nil +} + // List lists all accounts. func (r Registry) List() ([]Account, error) { - info, err := r.Keyring.List() + records, err := r.Keyring.List() if err != nil { return nil, err } var accounts []Account - for _, accinfo := range info { + for _, record := range records { accounts = append(accounts, Account{ - Name: accinfo.GetName(), - Info: accinfo, + Name: record.Name, + Record: record, }) } diff --git a/ignite/pkg/cosmosaccount/cosmosaccount_test.go b/ignite/pkg/cosmosaccount/cosmosaccount_test.go new file mode 100644 index 0000000000..ec07b6d87b --- /dev/null +++ b/ignite/pkg/cosmosaccount/cosmosaccount_test.go @@ -0,0 +1,72 @@ +package cosmosaccount_test + +import ( + "testing" + + "github.com/stretchr/testify/require" + + "github.com/ignite/cli/ignite/pkg/cosmosaccount" +) + +const testAccountName = "myTestAccount" + +func TestRegistry(t *testing.T) { + tmpDir := t.TempDir() + registry, err := cosmosaccount.New(cosmosaccount.WithHome(tmpDir)) + require.NoError(t, err) + + account, mnemonic, err := registry.Create(testAccountName) + require.NoError(t, err) + require.Equal(t, testAccountName, account.Name) + require.NotEmpty(t, account.Record.PubKey.Value) + + getAccount, err := registry.GetByName(testAccountName) + require.NoError(t, err) + require.Equal(t, getAccount, account) + + sdkaddr, _ := account.Record.GetAddress() + addr := sdkaddr.String() + getAccount, err = registry.GetByAddress(addr) + require.NoError(t, err) + require.Equal(t, getAccount.Record.PubKey, account.Record.PubKey) + require.Equal(t, getAccount.Name, testAccountName) + require.Equal(t, getAccount.Name, account.Name) + require.Equal(t, getAccount.Name, account.Record.Name) + + addr, err = account.Address("cosmos") + require.NoError(t, err) + getAccount, err = registry.GetByAddress(addr) + require.NoError(t, err) + require.Equal(t, getAccount.Record.PubKey, account.Record.PubKey) + require.Equal(t, getAccount.Name, testAccountName) + require.Equal(t, getAccount.Name, account.Name) + require.Equal(t, getAccount.Name, account.Record.Name) + + secondTmpDir := t.TempDir() + secondRegistry, err := cosmosaccount.New(cosmosaccount.WithHome(secondTmpDir)) + require.NoError(t, err) + + importedAccount, err := secondRegistry.Import(testAccountName, mnemonic, "") + require.NoError(t, err) + require.Equal(t, testAccountName, importedAccount.Name) + require.Equal(t, importedAccount.Record.PubKey, account.Record.PubKey) + + _, _, err = registry.Create("another one") + require.NoError(t, err) + list, err := registry.List() + require.NoError(t, err) + require.Equal(t, 2, len(list)) + + err = registry.DeleteByName(testAccountName) + require.NoError(t, err) + afterDeleteList, err := registry.List() + require.NoError(t, err) + require.Equal(t, 1, len(afterDeleteList)) + + _, err = registry.GetByName(testAccountName) + var expectedErr *cosmosaccount.AccountDoesNotExistError + require.ErrorAs(t, err, &expectedErr) + + _, err = registry.GetByAddress(addr) + require.ErrorAs(t, err, &expectedErr) +} diff --git a/ignite/pkg/cosmosanalysis/app/app_test.go b/ignite/pkg/cosmosanalysis/app/app_test.go index 90b81e06cb..bcfbd6c935 100644 --- a/ignite/pkg/cosmosanalysis/app/app_test.go +++ b/ignite/pkg/cosmosanalysis/app/app_test.go @@ -59,7 +59,7 @@ func TestCheckKeeper(t *testing.T) { t.Run(tt.name, func(t *testing.T) { tmpDir := t.TempDir() tmpFile := filepath.Join(tmpDir, "app.go") - err := os.WriteFile(tmpFile, tt.appFile, 0644) + err := os.WriteFile(tmpFile, tt.appFile, 0o644) require.NoError(t, err) err = app.CheckKeeper(tmpDir, tt.keeperName) @@ -77,11 +77,11 @@ func TestGetRegisteredModules(t *testing.T) { tmpDir := t.TempDir() tmpFile := filepath.Join(tmpDir, "app.go") - err := os.WriteFile(tmpFile, AppFullFile, 0644) + err := os.WriteFile(tmpFile, AppFullFile, 0o644) require.NoError(t, err) tmpNoAppFile := filepath.Join(tmpDir, "someOtherFile.go") - err = os.WriteFile(tmpNoAppFile, NoAppFile, 0644) + err = os.WriteFile(tmpNoAppFile, NoAppFile, 0o644) require.NoError(t, err) registeredModules, err := app.FindRegisteredModules(tmpDir) @@ -99,10 +99,10 @@ func TestGetRegisteredModules(t *testing.T) { "github.com/cosmos/cosmos-sdk/x/crisis", "github.com/cosmos/cosmos-sdk/x/slashing", "github.com/cosmos/cosmos-sdk/x/feegrant/module", - "github.com/cosmos/ibc-go/v3/modules/core", + "github.com/cosmos/ibc-go/v5/modules/core", "github.com/cosmos/cosmos-sdk/x/upgrade", "github.com/cosmos/cosmos-sdk/x/evidence", - "github.com/cosmos/ibc-go/v3/modules/apps/transfer", + "github.com/cosmos/ibc-go/v5/modules/apps/transfer", "github.com/cosmos/cosmos-sdk/x/auth/vesting", "github.com/tendermint/testchain/x/testchain", "github.com/tendermint/testchain/x/queryonlymod", diff --git a/ignite/pkg/cosmosanalysis/app/testdata/app_full.go b/ignite/pkg/cosmosanalysis/app/testdata/app_full.go index d29a00f0e6..395014637a 100644 --- a/ignite/pkg/cosmosanalysis/app/testdata/app_full.go +++ b/ignite/pkg/cosmosanalysis/app/testdata/app_full.go @@ -27,8 +27,8 @@ import ( "github.com/cosmos/cosmos-sdk/x/slashing" "github.com/cosmos/cosmos-sdk/x/staking" "github.com/cosmos/cosmos-sdk/x/upgrade" - "github.com/cosmos/ibc-go/v3/modules/apps/transfer" - ibc "github.com/cosmos/ibc-go/v3/modules/core" + "github.com/cosmos/ibc-go/v5/modules/apps/transfer" + ibc "github.com/cosmos/ibc-go/v5/modules/core" abci "github.com/tendermint/tendermint/abci/types" "github.com/ignite/cli/ignite/pkg/openapiconsole" @@ -45,33 +45,32 @@ func (app *App) Name() string { return app.BaseApp.Name() } func (app *App) BeginBlocker(ctx sdk.Context, req abci.RequestBeginBlock) abci.ResponseBeginBlock { return app.mm.BeginBlock(ctx, req) } + func (app *App) EndBlocker(ctx sdk.Context, req abci.RequestEndBlock) abci.ResponseEndBlock { return app.mm.EndBlock(ctx, req) } -var ( - ModuleBasics = sdkmodule.NewBasicManager( - auth.AppModuleBasic{}, - genutil.AppModuleBasic{}, - bank.AppModuleBasic{}, - capability.AppModuleBasic{}, - staking.AppModuleBasic{}, - mint.AppModuleBasic{}, - distr.AppModuleBasic{}, - gov.NewAppModuleBasic(getGovProposalHandlers()...), - params.AppModuleBasic{}, - crisis.AppModuleBasic{}, - slashing.AppModuleBasic{}, - feegrantmodule.AppModuleBasic{}, - ibc.AppModuleBasic{}, - upgrade.AppModuleBasic{}, - evidence.AppModuleBasic{}, - transfer.AppModuleBasic{}, - vesting.AppModuleBasic{}, - testchainmodule.AppModuleBasic{}, - queryonlymodmodule.AppModuleBasic{}, - // this line is used by starport scaffolding # stargate/app/moduleBasic - ) +var ModuleBasics = sdkmodule.NewBasicManager( + auth.AppModuleBasic{}, + genutil.AppModuleBasic{}, + bank.AppModuleBasic{}, + capability.AppModuleBasic{}, + staking.AppModuleBasic{}, + mint.AppModuleBasic{}, + distr.AppModuleBasic{}, + gov.NewAppModuleBasic(getGovProposalHandlers()...), + params.AppModuleBasic{}, + crisis.AppModuleBasic{}, + slashing.AppModuleBasic{}, + feegrantmodule.AppModuleBasic{}, + ibc.AppModuleBasic{}, + upgrade.AppModuleBasic{}, + evidence.AppModuleBasic{}, + transfer.AppModuleBasic{}, + vesting.AppModuleBasic{}, + testchainmodule.AppModuleBasic{}, + queryonlymodmodule.AppModuleBasic{}, + // this line is used by starport scaffolding # stargate/app/moduleBasic ) func (app *App) RegisterAPIRoutes(apiSvr *api.Server, apiConfig config.APIConfig) { diff --git a/ignite/pkg/cosmosanalysis/app/testdata/app_generic.go b/ignite/pkg/cosmosanalysis/app/testdata/app_generic.go index ebd667e403..f7fd69aa64 100644 --- a/ignite/pkg/cosmosanalysis/app/testdata/app_generic.go +++ b/ignite/pkg/cosmosanalysis/app/testdata/app_generic.go @@ -1,5 +1,10 @@ package foo +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + abci "github.com/tendermint/tendermint/abci/types" +) + type Foo[T any] struct { FooKeeper foo.keeper i T @@ -12,6 +17,7 @@ func (f Foo[T]) Name() string { return app.BaseApp.Name() } func (f Foo[T]) BeginBlocker(ctx sdk.Context, req abci.RequestBeginBlock) abci.ResponseBeginBlock { return app.mm.BeginBlock(ctx, req) } + func (f Foo[T]) EndBlocker(ctx sdk.Context, req abci.RequestEndBlock) abci.ResponseEndBlock { return app.mm.EndBlock(ctx, req) } diff --git a/ignite/pkg/cosmosanalysis/app/testdata/app_minimal.go b/ignite/pkg/cosmosanalysis/app/testdata/app_minimal.go index f52dcfc031..1676a1e84e 100644 --- a/ignite/pkg/cosmosanalysis/app/testdata/app_minimal.go +++ b/ignite/pkg/cosmosanalysis/app/testdata/app_minimal.go @@ -1,5 +1,10 @@ package foo +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + abci "github.com/tendermint/tendermint/abci/types" +) + type Foo struct { FooKeeper foo.keeper } @@ -11,6 +16,7 @@ func (f Foo) Name() string { return app.BaseApp.Name() } func (f Foo) BeginBlocker(ctx sdk.Context, req abci.RequestBeginBlock) abci.ResponseBeginBlock { return app.mm.BeginBlock(ctx, req) } + func (f Foo) EndBlocker(ctx sdk.Context, req abci.RequestEndBlock) abci.ResponseEndBlock { return app.mm.EndBlock(ctx, req) } diff --git a/ignite/pkg/cosmosanalysis/app/testdata/two_app.go b/ignite/pkg/cosmosanalysis/app/testdata/two_app.go index 2dadd0d2ae..7197d62060 100644 --- a/ignite/pkg/cosmosanalysis/app/testdata/two_app.go +++ b/ignite/pkg/cosmosanalysis/app/testdata/two_app.go @@ -1,5 +1,10 @@ package foo +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + abci "github.com/tendermint/tendermint/abci/types" +) + type Foo struct { FooKeeper foo.keeper } @@ -11,6 +16,7 @@ func (f Foo) Name() string { return app.BaseApp.Name() } func (f Foo) BeginBlocker(ctx sdk.Context, req abci.RequestBeginBlock) abci.ResponseBeginBlock { return app.mm.BeginBlock(ctx, req) } + func (f Foo) EndBlocker(ctx sdk.Context, req abci.RequestEndBlock) abci.ResponseEndBlock { return app.mm.EndBlock(ctx, req) } @@ -26,6 +32,7 @@ func (f Bar) Name() string { return app.BaseApp.Name() } func (f Bar) BeginBlocker(ctx sdk.Context, req abci.RequestBeginBlock) abci.ResponseBeginBlock { return app.mm.BeginBlock(ctx, req) } + func (f Bar) EndBlocker(ctx sdk.Context, req abci.RequestEndBlock) abci.ResponseEndBlock { return app.mm.EndBlock(ctx, req) } diff --git a/ignite/pkg/cosmosanalysis/cosmosanalysis_test.go b/ignite/pkg/cosmosanalysis/cosmosanalysis_test.go index 6788c7c758..15885987fd 100644 --- a/ignite/pkg/cosmosanalysis/cosmosanalysis_test.go +++ b/ignite/pkg/cosmosanalysis/cosmosanalysis_test.go @@ -98,11 +98,11 @@ func TestFindImplementation(t *testing.T) { tmpDir := t.TempDir() f1 := filepath.Join(tmpDir, "1.go") - err := os.WriteFile(f1, file1, 0644) + err := os.WriteFile(f1, file1, 0o644) require.NoError(t, err) f2 := filepath.Join(tmpDir, "2.go") - err = os.WriteFile(f2, file2, 0644) + err = os.WriteFile(f2, file2, 0o644) require.NoError(t, err) // find in dir @@ -125,10 +125,10 @@ func TestFindImplementationInSpreadInMultipleFiles(t *testing.T) { tmpDir := t.TempDir() f1 := filepath.Join(tmpDir, "1.go") - err := os.WriteFile(f1, partialImplementation, 0644) + err := os.WriteFile(f1, partialImplementation, 0o644) require.NoError(t, err) f2 := filepath.Join(tmpDir, "2.go") - err = os.WriteFile(f2, restOfImplementation, 0644) + err = os.WriteFile(f2, restOfImplementation, 0o644) require.NoError(t, err) found, err := cosmosanalysis.FindImplementation(tmpDir, expectedinterface) @@ -142,10 +142,10 @@ func TestFindImplementationNotFound(t *testing.T) { tmpDir2 := t.TempDir() noImplFile := filepath.Join(tmpDir1, "1.go") - err := os.WriteFile(noImplFile, noImplementation, 0644) + err := os.WriteFile(noImplFile, noImplementation, 0o644) require.NoError(t, err) partialImplFile := filepath.Join(tmpDir2, "2.go") - err = os.WriteFile(partialImplFile, partialImplementation, 0644) + err = os.WriteFile(partialImplFile, partialImplementation, 0o644) require.NoError(t, err) // No implementation @@ -162,9 +162,9 @@ func TestFindAppFilePath(t *testing.T) { appFolder := filepath.Join(tmpDir, "app") secondaryAppFolder := filepath.Join(tmpDir, "myOwnAppDir") - err := os.Mkdir(appFolder, 0700) + err := os.Mkdir(appFolder, 0o700) require.NoError(t, err) - err = os.Mkdir(secondaryAppFolder, 0700) + err = os.Mkdir(secondaryAppFolder, 0o700) require.NoError(t, err) // No file @@ -173,7 +173,7 @@ func TestFindAppFilePath(t *testing.T) { // Only one file with app implementation myOwnAppFilePath := filepath.Join(secondaryAppFolder, "my_own_app.go") - err = os.WriteFile(myOwnAppFilePath, appFile, 0644) + err = os.WriteFile(myOwnAppFilePath, appFile, 0o644) require.NoError(t, err) pathFound, err := cosmosanalysis.FindAppFilePath(tmpDir) require.NoError(t, err) @@ -181,14 +181,14 @@ func TestFindAppFilePath(t *testing.T) { // With a test file added appTestFilePath := filepath.Join(secondaryAppFolder, "my_own_app_test.go") - err = os.WriteFile(appTestFilePath, appTestFile, 0644) + err = os.WriteFile(appTestFilePath, appTestFile, 0o644) require.NoError(t, err) pathFound, err = cosmosanalysis.FindAppFilePath(tmpDir) require.Contains(t, err.Error(), "cannot locate your app.go") // With an additional app file (that is app.go) appFilePath := filepath.Join(appFolder, "app.go") - err = os.WriteFile(appFilePath, appFile, 0644) + err = os.WriteFile(appFilePath, appFile, 0o644) require.NoError(t, err) pathFound, err = cosmosanalysis.FindAppFilePath(tmpDir) require.NoError(t, err) @@ -196,7 +196,7 @@ func TestFindAppFilePath(t *testing.T) { // With two app.go files extraAppFilePath := filepath.Join(secondaryAppFolder, "app.go") - err = os.WriteFile(extraAppFilePath, appFile, 0644) + err = os.WriteFile(extraAppFilePath, appFile, 0o644) require.NoError(t, err) pathFound, err = cosmosanalysis.FindAppFilePath(tmpDir) require.NoError(t, err) diff --git a/ignite/pkg/cosmosanalysis/module/module_test.go b/ignite/pkg/cosmosanalysis/module/module_test.go index bdc27477e2..ff2fc17348 100644 --- a/ignite/pkg/cosmosanalysis/module/module_test.go +++ b/ignite/pkg/cosmosanalysis/module/module_test.go @@ -32,7 +32,8 @@ var testModule = Module{ HTTPRules: []protoanalysis.HTTPRule{ { Params: []string{"mytypefield"}, - HasQuery: false, HasBody: false}, + HasQuery: false, HasBody: false, + }, }, }, }, @@ -48,7 +49,8 @@ var testModule = Module{ { Params: []string{"mytypefield"}, HasQuery: false, - HasBody: false}, + HasBody: false, + }, }, }, }, diff --git a/ignite/pkg/cosmosanalysis/module/testdata/planet/app/app.go b/ignite/pkg/cosmosanalysis/module/testdata/planet/app/app.go index eb215c1cd3..2977689d73 100644 --- a/ignite/pkg/cosmosanalysis/module/testdata/planet/app/app.go +++ b/ignite/pkg/cosmosanalysis/module/testdata/planet/app/app.go @@ -16,6 +16,7 @@ func (f Foo) Name() string { return app.BaseApp.Name() } func (f Foo) BeginBlocker(ctx sdk.Context, req abci.RequestBeginBlock) abci.ResponseBeginBlock { return app.mm.BeginBlock(ctx, req) } + func (f Foo) EndBlocker(ctx sdk.Context, req abci.RequestEndBlock) abci.ResponseEndBlock { return app.mm.EndBlock(ctx, req) } diff --git a/ignite/pkg/cosmosanalysis/module/testdata/planet/x/planet/types/types.go b/ignite/pkg/cosmosanalysis/module/testdata/planet/x/planet/types/types.go index cecbfe04c3..ecbf307c8a 100644 --- a/ignite/pkg/cosmosanalysis/module/testdata/planet/x/planet/types/types.go +++ b/ignite/pkg/cosmosanalysis/module/testdata/planet/x/planet/types/types.go @@ -1,4 +1,6 @@ package types -type QueryMyQueryRequest struct{} -type QueryMyQueryResponse struct{} +type ( + QueryMyQueryRequest struct{} + QueryMyQueryResponse struct{} +) diff --git a/ignite/pkg/cosmosclient/bank.go b/ignite/pkg/cosmosclient/bank.go new file mode 100644 index 0000000000..277b62bab2 --- /dev/null +++ b/ignite/pkg/cosmosclient/bank.go @@ -0,0 +1,41 @@ +package cosmosclient + +import ( + "context" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/query" + banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" + + "github.com/ignite/cli/ignite/pkg/cosmosaccount" +) + +func (c Client) BankBalances(ctx context.Context, address string, pagination *query.PageRequest) (sdk.Coins, error) { + defer c.lockBech32Prefix()() + + req := &banktypes.QueryAllBalancesRequest{ + Address: address, + Pagination: pagination, + } + + resp, err := c.bankQueryClient.AllBalances(ctx, req) + if err != nil { + return nil, rpcError(c.nodeAddress, err) + } + return resp.Balances, nil +} + +func (c Client) BankSendTx(fromAccount cosmosaccount.Account, toAddress string, amount sdk.Coins) (TxService, error) { + addr, err := fromAccount.Address(c.addressPrefix) + if err != nil { + return TxService{}, err + } + + msg := &banktypes.MsgSend{ + FromAddress: addr, + ToAddress: toAddress, + Amount: amount, + } + + return c.CreateTx(fromAccount, msg) +} diff --git a/ignite/pkg/cosmosclient/bank_test.go b/ignite/pkg/cosmosclient/bank_test.go new file mode 100644 index 0000000000..a3c2a16c86 --- /dev/null +++ b/ignite/pkg/cosmosclient/bank_test.go @@ -0,0 +1,41 @@ +package cosmosclient_test + +import ( + "context" + "testing" + + "cosmossdk.io/math" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/query" + banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestClientBankBalances(t *testing.T) { + var ( + ctx = context.Background() + address = "address" + pagination = &query.PageRequest{Offset: 1} + expectedBalances = sdk.NewCoins( + sdk.NewCoin("token", math.NewInt(1000)), + sdk.NewCoin("stake", math.NewInt(2000)), + ) + ) + c := newClient(t, func(s suite) { + req := &banktypes.QueryAllBalancesRequest{ + Address: address, + Pagination: pagination, + } + + s.bankQueryClient.EXPECT().AllBalances(ctx, req). + Return(&banktypes.QueryAllBalancesResponse{ + Balances: expectedBalances, + }, nil) + }) + + balances, err := c.BankBalances(ctx, address, pagination) + + require.NoError(t, err) + assert.Equal(t, expectedBalances, balances) +} diff --git a/ignite/pkg/cosmosclient/consensus.go b/ignite/pkg/cosmosclient/consensus.go new file mode 100644 index 0000000000..6baffcf167 --- /dev/null +++ b/ignite/pkg/cosmosclient/consensus.go @@ -0,0 +1,66 @@ +package cosmosclient + +import ( + "context" + "encoding/base64" + "time" + + commitmenttypes "github.com/cosmos/ibc-go/v5/modules/core/23-commitment/types" + "github.com/tendermint/tendermint/libs/bytes" + tmproto "github.com/tendermint/tendermint/proto/tendermint/types" + tmtypes "github.com/tendermint/tendermint/types" +) + +// ConsensusInfo is the validator consensus info +type ConsensusInfo struct { + Timestamp string `json:"Timestamp"` + Root string `json:"Root"` + NextValidatorsHash string `json:"NextValidatorsHash"` + ValidatorSet *tmproto.ValidatorSet `json:"ValidatorSet"` +} + +// ConsensusInfo returns the appropriate tendermint consensus state by given height +// and the validator set for the next height +func (c Client) ConsensusInfo(ctx context.Context, height int64) (ConsensusInfo, error) { + node, err := c.Context().GetNode() + if err != nil { + return ConsensusInfo{}, err + } + + commit, err := node.Commit(ctx, &height) + if err != nil { + return ConsensusInfo{}, err + } + + var ( + page = 1 + count = 10_000 + ) + validators, err := node.Validators(ctx, &height, &page, &count) + if err != nil { + return ConsensusInfo{}, err + } + + protoValset, err := tmtypes.NewValidatorSet(validators.Validators).ToProto() + if err != nil { + return ConsensusInfo{}, err + } + + heightNext := height + 1 + validatorsNext, err := node.Validators(ctx, &heightNext, &page, &count) + if err != nil { + return ConsensusInfo{}, err + } + + var ( + hash = tmtypes.NewValidatorSet(validatorsNext.Validators).Hash() + root = commitmenttypes.NewMerkleRoot(commit.AppHash) + ) + + return ConsensusInfo{ + Timestamp: commit.Time.Format(time.RFC3339Nano), + NextValidatorsHash: bytes.HexBytes(hash).String(), + Root: base64.StdEncoding.EncodeToString(root.Hash), + ValidatorSet: protoValset, + }, nil +} diff --git a/ignite/pkg/cosmosclient/cosmosclient.go b/ignite/pkg/cosmosclient/cosmosclient.go index 00d646745d..e75c2ee9d5 100644 --- a/ignite/pkg/cosmosclient/cosmosclient.go +++ b/ignite/pkg/cosmosclient/cosmosclient.go @@ -3,12 +3,12 @@ package cosmosclient import ( "context" - "encoding/base64" "encoding/hex" "fmt" "io" "os" "path/filepath" + "strconv" "strings" "sync" "time" @@ -21,31 +21,31 @@ import ( codectypes "github.com/cosmos/cosmos-sdk/codec/types" cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" sdktypes "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + txtypes "github.com/cosmos/cosmos-sdk/types/tx" "github.com/cosmos/cosmos-sdk/types/tx/signing" authtx "github.com/cosmos/cosmos-sdk/x/auth/tx" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" staking "github.com/cosmos/cosmos-sdk/x/staking/types" - commitmenttypes "github.com/cosmos/ibc-go/v3/modules/core/23-commitment/types" + gogogrpc "github.com/gogo/protobuf/grpc" "github.com/gogo/protobuf/proto" prototypes "github.com/gogo/protobuf/types" "github.com/pkg/errors" - "github.com/tendermint/tendermint/libs/bytes" - tmproto "github.com/tendermint/tendermint/proto/tendermint/types" + rpcclient "github.com/tendermint/tendermint/rpc/client" rpchttp "github.com/tendermint/tendermint/rpc/client/http" ctypes "github.com/tendermint/tendermint/rpc/core/types" - tmtypes "github.com/tendermint/tendermint/types" "github.com/ignite/cli/ignite/pkg/cosmosaccount" "github.com/ignite/cli/ignite/pkg/cosmosfaucet" ) -// FaucetTransferEnsureDuration is the duration that BroadcastTx will wait when a faucet transfer -// is triggered prior to broadcasting but transfer's tx is not committed in the state yet. -var FaucetTransferEnsureDuration = time.Second * 40 +var ( + // FaucetTransferEnsureDuration is the duration that BroadcastTx will wait when a faucet transfer + // is triggered prior to broadcasting but transfer's tx is not committed in the state yet. + FaucetTransferEnsureDuration = time.Second * 40 -var errCannotRetrieveFundsFromFaucet = errors.New("cannot retrieve funds from faucet") + errCannotRetrieveFundsFromFaucet = errors.New("cannot retrieve funds from faucet") +) const ( defaultNodeAddress = "http://localhost:26657" @@ -59,13 +59,23 @@ const ( defaultFaucetMinAmount = 100 ) +// FaucetClient allows to mock the cosmosfaucet.Client. +type FaucetClient interface { + Transfer(context.Context, cosmosfaucet.TransferRequest) (cosmosfaucet.TransferResponse, error) +} + +// Gasometer allows to mock the tx.CalculateGas func. +type Gasometer interface { + CalculateGas(clientCtx gogogrpc.ClientConn, txf tx.Factory, msgs ...sdktypes.Msg) (*txtypes.SimulateResponse, uint64, error) +} + // Client is a client to access your chain by querying and broadcasting transactions. type Client struct { // RPC is Tendermint RPC. - RPC *rpchttp.HTTP + RPC rpcclient.Client - // Factory is a Cosmos SDK tx factory. - Factory tx.Factory + // TxFactory is a Cosmos SDK tx factory. + TxFactory tx.Factory // context is a Cosmos SDK client context. context client.Context @@ -73,6 +83,11 @@ type Client struct { // AccountRegistry is the retistry to access accounts. AccountRegistry cosmosaccount.Registry + accountRetriever client.AccountRetriever + bankQueryClient banktypes.QueryClient + faucetClient FaucetClient + gasometer Gasometer + addressPrefix string nodeAddress string @@ -87,6 +102,13 @@ type Client struct { homePath string keyringServiceName string keyringBackend cosmosaccount.KeyringBackend + keyringDir string + + gas string + gasPrices string + fees string + broadcastMode string + generateOnly bool } // Option configures your client. @@ -116,6 +138,13 @@ func WithKeyringBackend(backend cosmosaccount.KeyringBackend) Option { } } +// WithKeyringDir sets the directory of the keyring. By default, it uses cosmosaccount.KeyringHome +func WithKeyringDir(keyringDir string) Option { + return func(c *Client) { + c.keyringDir = keyringDir + } +} + // WithNodeAddress sets the node address of your chain. When this option is not provided // `http://localhost:26657` is used as default. func WithNodeAddress(addr string) Option { @@ -143,6 +172,82 @@ func WithUseFaucet(faucetAddress, denom string, minAmount uint64) Option { } } +// WithGas sets an explicit gas-limit on transactions. +// Set to "auto" to calculate automatically +func WithGas(gas string) Option { + return func(c *Client) { + c.gas = gas + } +} + +// WithGasPrices sets the price per gas (e.g. 0.1uatom) +func WithGasPrices(gasPrices string) Option { + return func(c *Client) { + c.gasPrices = gasPrices + } +} + +// WithFees sets the fees (e.g. 10uatom) +func WithFees(fees string) Option { + return func(c *Client) { + c.fees = fees + } +} + +// WithBroadcastMode sets the broadcast mode +func WithBroadcastMode(broadcastMode string) Option { + return func(c *Client) { + c.broadcastMode = broadcastMode + } +} + +// WithGenerateOnly tells if txs will be generated only. +func WithGenerateOnly(generateOnly bool) Option { + return func(c *Client) { + c.generateOnly = generateOnly + } +} + +// WithRPCClient sets a tendermint RPC client. +// Already set by default. +func WithRPCClient(rpc rpcclient.Client) Option { + return func(c *Client) { + c.RPC = rpc + } +} + +// WithAccountRetriever sets the account retriever +// Already set by default. +func WithAccountRetriever(accountRetriever client.AccountRetriever) Option { + return func(c *Client) { + c.accountRetriever = accountRetriever + } +} + +// WithBankQueryClient sets the bank query client. +// Already set by default. +func WithBankQueryClient(bankQueryClient banktypes.QueryClient) Option { + return func(c *Client) { + c.bankQueryClient = bankQueryClient + } +} + +// WithFaucetClient sets the faucet client. +// Already set by default. +func WithFaucetClient(faucetClient FaucetClient) Option { + return func(c *Client) { + c.faucetClient = faucetClient + } +} + +// WithGasometer sets the gasometer. +// Already set by default. +func WithGasometer(gasometer Gasometer) Option { + return func(c *Client) { + c.gasometer = gasometer + } +} + // New creates a new client with given options. func New(ctx context.Context, options ...Option) (Client, error) { c := Client{ @@ -153,6 +258,8 @@ func New(ctx context.Context, options ...Option) (Client, error) { faucetDenom: defaultFaucetDenom, faucetMinAmount: defaultFaucetMinAmount, out: io.Discard, + gas: strconv.Itoa(defaultGasLimit), + broadcastMode: flags.BroadcastBlock, } var err error @@ -161,8 +268,15 @@ func New(ctx context.Context, options ...Option) (Client, error) { apply(&c) } - if c.RPC, err = rpchttp.New(c.nodeAddress, "/websocket"); err != nil { - return Client{}, err + if c.RPC == nil { + if c.RPC, err = rpchttp.New(c.nodeAddress, "/websocket"); err != nil { + return Client{}, err + } + } + // Wrap RPC client to have more contextualized errors + c.RPC = rpcWrapper{ + Client: c.RPC, + nodeAddress: c.nodeAddress, } statusResp, err := c.RPC.Status(ctx) @@ -180,38 +294,128 @@ func New(ctx context.Context, options ...Option) (Client, error) { c.homePath = filepath.Join(home, "."+c.chainID) } + if c.keyringDir == "" { + c.keyringDir = c.homePath + } + c.AccountRegistry, err = cosmosaccount.New( cosmosaccount.WithKeyringServiceName(c.keyringServiceName), cosmosaccount.WithKeyringBackend(c.keyringBackend), - cosmosaccount.WithHome(c.homePath), + cosmosaccount.WithHome(c.keyringDir), ) if err != nil { return Client{}, err } - c.context = newContext(c.RPC, c.out, c.chainID, c.homePath).WithKeyring(c.AccountRegistry.Keyring) - c.Factory = newFactory(c.context) + c.context = c.newContext() + c.TxFactory = newFactory(c.context) + + if c.accountRetriever == nil { + c.accountRetriever = authtypes.AccountRetriever{} + } + if c.bankQueryClient == nil { + c.bankQueryClient = banktypes.NewQueryClient(c.context) + } + if c.faucetClient == nil { + c.faucetClient = cosmosfaucet.NewClient(c.faucetAddress) + } + if c.gasometer == nil { + c.gasometer = gasometer{} + } + // set address prefix in SDK global config + c.SetConfigAddressPrefix() return c, nil } -func (c Client) Account(accountName string) (cosmosaccount.Account, error) { - return c.AccountRegistry.GetByName(accountName) +// LatestBlockHeight returns the lastest block height of the app. +func (c Client) LatestBlockHeight(ctx context.Context) (int64, error) { + resp, err := c.Status(ctx) + if err != nil { + return 0, err + } + return resp.SyncInfo.LatestBlockHeight, nil +} + +// WaitForNextBlock waits until next block is committed. +// It reads the current block height and then waits for another block to be +// committed. +// A timeout occurs after 10 seconds, to customize the timeout, use the +// WaitForNBlocks(ctx, 1, timeout) function. +func (c Client) WaitForNextBlock(ctx context.Context) error { + return c.WaitForNBlocks(ctx, 1, time.Second*10) +} + +// WaitForNBlocks reads the current block height and then waits for anothers n +// blocks to be committed. +func (c Client) WaitForNBlocks(ctx context.Context, n int64, timeout time.Duration) error { + start, err := c.LatestBlockHeight(ctx) + if err != nil { + return err + } + return c.WaitForBlockHeight(ctx, start+n, timeout) +} + +// WaitForBlockHeight waits until block height h is committed, or returns an +// error if ctx is canceled or if timeout is reached. +func (c Client) WaitForBlockHeight(ctx context.Context, h int64, timeout time.Duration) error { + ticker := time.NewTicker(time.Second) + defer ticker.Stop() + timeoutc := time.After(timeout) + + for { + latestHeight, err := c.LatestBlockHeight(ctx) + if err != nil { + return err + } + if latestHeight >= h { + return nil + } + select { + case <-timeoutc: + return errors.New("timeout exceeded waiting for block") + case <-ctx.Done(): + return ctx.Err() + case <-ticker.C: + } + } +} + +// Account returns the account with name or address equal to nameOrAddress. +func (c Client) Account(nameOrAddress string) (cosmosaccount.Account, error) { + defer c.lockBech32Prefix()() + + acc, err := c.AccountRegistry.GetByName(nameOrAddress) + if err == nil { + return acc, nil + } + return c.AccountRegistry.GetByAddress(nameOrAddress) } // Address returns the account address from account name. -func (c Client) Address(accountName string) (sdktypes.AccAddress, error) { - account, err := c.Account(accountName) +func (c Client) Address(accountName string) (string, error) { + a, err := c.AccountRegistry.GetByName(accountName) if err != nil { - return sdktypes.AccAddress{}, err + return "", err } - return account.Info.GetAddress(), nil + return a.Address(c.addressPrefix) } +// Context returns client context func (c Client) Context() client.Context { return c.context } +// SetConfigAddressPrefix sets the account prefix in the SDK global config +func (c Client) SetConfigAddressPrefix() { + // TODO find a better way if possible. + // https://github.com/ignite/cli/issues/2744 + mconf.Lock() + defer mconf.Unlock() + config := sdktypes.GetConfig() + config.SetBech32PrefixForAccount(c.addressPrefix, c.addressPrefix+"pub") +} + // Response of your broadcasted transaction. type Response struct { Codec codec.Codec @@ -221,14 +425,16 @@ type Response struct { } // Decode decodes the proto func response defined in your Msg service into your message type. -// message needs be a pointer. and you need to provide the correct proto message(struct) type to the Decode func. +// message needs to be a pointer. and you need to provide the correct proto message(struct) type to the Decode func. // // e.g., for the following CreateChain func the type would be: `types.MsgCreateChainResponse`. // // ```proto -// service Msg { -// rpc CreateChain(MsgCreateChain) returns (MsgCreateChainResponse); -// } +// +// service Msg { +// rpc CreateChain(MsgCreateChain) returns (MsgCreateChainResponse); +// } +// // ``` func (r Response) Decode(message proto.Message) error { data, err := hex.DecodeString(r.Data) @@ -241,178 +447,111 @@ func (r Response) Decode(message proto.Message) error { return err } - resData := txMsgData.Data[0] + // check deprecated Data + if len(txMsgData.Data) != 0 { + resData := txMsgData.Data[0] + return prototypes.UnmarshalAny(&prototypes.Any{ + // TODO get type url dynamically(basically remove `+ "Response"`) after the following issue has solved. + // https://github.com/ignite/cli/issues/2098 + // https://github.com/cosmos/cosmos-sdk/issues/10496 + TypeUrl: resData.MsgType + "Response", + Value: resData.Data, + }, message) + } + resData := txMsgData.MsgResponses[0] return prototypes.UnmarshalAny(&prototypes.Any{ - // TODO get type url dynamically(basically remove `+ "Response"`) after the following issue has solved. - // https://github.com/cosmos/cosmos-sdk/issues/10496 - TypeUrl: resData.MsgType + "Response", - Value: resData.Data, + TypeUrl: resData.TypeUrl, + Value: resData.Value, }, message) } -// ConsensusInfo is the validator consensus info -type ConsensusInfo struct { - Timestamp string `json:"Timestamp"` - Root string `json:"Root"` - NextValidatorsHash string `json:"NextValidatorsHash"` - ValidatorSet *tmproto.ValidatorSet `json:"ValidatorSet"` -} - -// ConsensusInfo returns the appropriate tendermint consensus state by given height -// and the validator set for the next height -func (c Client) ConsensusInfo(ctx context.Context, height int64) (ConsensusInfo, error) { - node, err := c.Context().GetNode() - if err != nil { - return ConsensusInfo{}, err - } - - commit, err := node.Commit(ctx, &height) - if err != nil { - return ConsensusInfo{}, err - } - - var ( - page = 1 - count = 10_000 - ) - validators, err := node.Validators(ctx, &height, &page, &count) - if err != nil { - return ConsensusInfo{}, err - } - - protoValset, err := tmtypes.NewValidatorSet(validators.Validators).ToProto() - if err != nil { - return ConsensusInfo{}, err - } - - heightNext := height + 1 - validatorsNext, err := node.Validators(ctx, &heightNext, &page, &count) - if err != nil { - return ConsensusInfo{}, err - } - - var ( - hash = tmtypes.NewValidatorSet(validatorsNext.Validators).Hash() - root = commitmenttypes.NewMerkleRoot(commit.AppHash) - ) - - return ConsensusInfo{ - Timestamp: commit.Time.Format(time.RFC3339Nano), - NextValidatorsHash: bytes.HexBytes(hash).String(), - Root: base64.StdEncoding.EncodeToString(root.Hash), - ValidatorSet: protoValset, - }, nil -} - // Status returns the node status func (c Client) Status(ctx context.Context) (*ctypes.ResultStatus, error) { return c.RPC.Status(ctx) } -// BroadcastTx creates and broadcasts a tx with given messages for account. -func (c Client) BroadcastTx(accountName string, msgs ...sdktypes.Msg) (Response, error) { - _, broadcast, err := c.BroadcastTxWithProvision(accountName, msgs...) - if err != nil { - return Response{}, err - } - return broadcast() -} - // protects sdktypes.Config. var mconf sync.Mutex -func (c Client) BroadcastTxWithProvision(accountName string, msgs ...sdktypes.Msg) ( - gas uint64, broadcast func() (Response, error), err error) { - if err := c.prepareBroadcast(context.Background(), accountName, msgs); err != nil { - return 0, nil, err - } - - // TODO find a better way if possible. +func (c Client) lockBech32Prefix() (unlockFn func()) { mconf.Lock() - defer mconf.Unlock() config := sdktypes.GetConfig() config.SetBech32PrefixForAccount(c.addressPrefix, c.addressPrefix+"pub") + return mconf.Unlock +} - accountAddress, err := c.Address(accountName) +func (c Client) BroadcastTx(account cosmosaccount.Account, msgs ...sdktypes.Msg) (Response, error) { + txService, err := c.CreateTx(account, msgs...) if err != nil { - return 0, nil, err + return Response{}, err } - ctx := c.context. - WithFromName(accountName). - WithFromAddress(accountAddress) + return txService.Broadcast() +} - txf, err := prepareFactory(ctx, c.Factory) - if err != nil { - return 0, nil, err +func (c Client) CreateTx(account cosmosaccount.Account, msgs ...sdktypes.Msg) (TxService, error) { + defer c.lockBech32Prefix()() + + if c.useFaucet && !c.generateOnly { + addr, err := account.Address(c.addressPrefix) + if err != nil { + return TxService{}, err + } + if err := c.makeSureAccountHasTokens(context.Background(), addr); err != nil { + return TxService{}, err + } } - _, gas, err = tx.CalculateGas(ctx, txf, msgs...) + sdkaddr, err := account.Record.GetAddress() if err != nil { - return 0, nil, err + return TxService{}, err } - // the simulated gas can vary from the actual gas needed for a real transaction - // we add an additional amount to endure sufficient gas is provided - gas += 10000 - txf = txf.WithGas(gas) - // Return the provision function - return gas, func() (Response, error) { - txUnsigned, err := tx.BuildUnsignedTx(txf, msgs...) - if err != nil { - return Response{}, err - } + ctx := c.context. + WithFromName(account.Name). + WithFromAddress(sdkaddr) - txUnsigned.SetFeeGranter(ctx.GetFeeGranterAddress()) - if err := tx.Sign(txf, accountName, txUnsigned, true); err != nil { - return Response{}, err - } + txf, err := c.prepareFactory(ctx) + if err != nil { + return TxService{}, err + } - txBytes, err := ctx.TxConfig.TxEncoder()(txUnsigned.GetTx()) + var gas uint64 + if c.gas != "" && c.gas != "auto" { + gas, err = strconv.ParseUint(c.gas, 10, 64) if err != nil { - return Response{}, err + return TxService{}, err } - - resp, err := ctx.BroadcastTx(txBytes) - if err == sdkerrors.ErrInsufficientFunds { - err = c.makeSureAccountHasTokens(context.Background(), accountAddress.String()) - if err != nil { - return Response{}, err - } - resp, err = ctx.BroadcastTx(txBytes) + } else { + _, gas, err = c.gasometer.CalculateGas(ctx, txf, msgs...) + if err != nil { + return TxService{}, err } + // the simulated gas can vary from the actual gas needed for a real transaction + // we add an additional amount to ensure sufficient gas is provided + gas += 20000 + } + txf = txf.WithGas(gas) + txf = txf.WithFees(c.fees) - return Response{ - Codec: ctx.Codec, - TxResponse: resp, - }, handleBroadcastResult(resp, err) - }, nil -} - -// prepareBroadcast performs checks and operations before broadcasting messages -func (c *Client) prepareBroadcast(ctx context.Context, accountName string, _ []sdktypes.Msg) error { - // TODO uncomment after https://github.com/tendermint/spn/issues/363 - // validate msgs. - // for _, msg := range msgs { - // if err := msg.ValidateBasic(); err != nil { - // return err - // } - // } + if c.gasPrices != "" { + txf = txf.WithGasPrices(c.gasPrices) + } - account, err := c.Account(accountName) + txUnsigned, err := txf.BuildUnsignedTx(msgs...) if err != nil { - return err + return TxService{}, err } - // make sure that account has enough balances before broadcasting. - if c.useFaucet { - if err := c.makeSureAccountHasTokens(ctx, account.Address(c.addressPrefix)); err != nil { - return err - } - } + txUnsigned.SetFeeGranter(ctx.GetFeeGranterAddress()) - return nil + return TxService{ + client: c, + clientContext: ctx, + txBuilder: txUnsigned, + txFactory: txf, + }, nil } // makeSureAccountHasTokens makes sure the address has a positive balance @@ -423,8 +562,7 @@ func (c *Client) makeSureAccountHasTokens(ctx context.Context, address string) e } // request coins from the faucet. - fc := cosmosfaucet.NewClient(c.faucetAddress) - faucetResp, err := fc.Transfer(ctx, cosmosfaucet.TransferRequest{AccountAddress: address}) + faucetResp, err := c.faucetClient.Transfer(ctx, cosmosfaucet.TransferRequest{AccountAddress: address}) if err != nil { return errors.Wrap(errCannotRetrieveFundsFromFaucet, err.Error()) } @@ -442,7 +580,7 @@ func (c *Client) makeSureAccountHasTokens(ctx context.Context, address string) e } func (c *Client) checkAccountBalance(ctx context.Context, address string) error { - resp, err := banktypes.NewQueryClient(c.context).Balance(ctx, &banktypes.QueryBalanceRequest{ + resp, err := c.bankQueryClient.Balance(ctx, &banktypes.QueryBalanceRequest{ Address: address, Denom: c.faucetDenom, }) @@ -461,28 +599,31 @@ func (c *Client) checkAccountBalance(ctx context.Context, address string) error func handleBroadcastResult(resp *sdktypes.TxResponse, err error) error { if err != nil { if strings.Contains(err.Error(), "not found") { - return errors.New("make sure that your SPN account has enough balance") + return errors.New("make sure that your account has enough balance") } return err } if resp.Code > 0 { - return fmt.Errorf("SPN error with '%d' code: %s", resp.Code, resp.RawLog) + return fmt.Errorf("error code: '%d' msg: '%s'", resp.Code, resp.RawLog) } return nil } -func prepareFactory(clientCtx client.Context, txf tx.Factory) (tx.Factory, error) { - from := clientCtx.GetFromAddress() +func (c *Client) prepareFactory(clientCtx client.Context) (tx.Factory, error) { + var ( + from = clientCtx.GetFromAddress() + txf = c.TxFactory + ) - if err := txf.AccountRetriever().EnsureExists(clientCtx, from); err != nil { + if err := c.accountRetriever.EnsureExists(clientCtx, from); err != nil { return txf, err } initNum, initSeq := txf.AccountNumber(), txf.Sequence() if initNum == 0 || initSeq == 0 { - num, seq, err := txf.AccountRetriever().GetAccountNumberSequence(clientCtx, from) + num, seq, err := c.accountRetriever.GetAccountNumberSequence(clientCtx, from) if err != nil { return txf, err } @@ -499,12 +640,7 @@ func prepareFactory(clientCtx client.Context, txf tx.Factory) (tx.Factory, error return txf, nil } -func newContext( - c *rpchttp.HTTP, - out io.Writer, - chainID, - home string, -) client.Context { +func (c Client) newContext() client.Context { var ( amino = codec.NewLegacyAmino() interfaceRegistry = codectypes.NewInterfaceRegistry() @@ -517,20 +653,23 @@ func newContext( sdktypes.RegisterInterfaces(interfaceRegistry) staking.RegisterInterfaces(interfaceRegistry) cryptocodec.RegisterInterfaces(interfaceRegistry) + banktypes.RegisterInterfaces(interfaceRegistry) return client.Context{}. - WithChainID(chainID). + WithChainID(c.chainID). WithInterfaceRegistry(interfaceRegistry). WithCodec(marshaler). WithTxConfig(txConfig). WithLegacyAmino(amino). WithInput(os.Stdin). - WithOutput(out). - WithAccountRetriever(authtypes.AccountRetriever{}). - WithBroadcastMode(flags.BroadcastBlock). - WithHomeDir(home). - WithClient(c). - WithSkipConfirmation(true) + WithOutput(c.out). + WithAccountRetriever(c.accountRetriever). + WithBroadcastMode(c.broadcastMode). + WithHomeDir(c.homePath). + WithClient(c.RPC). + WithSkipConfirmation(true). + WithKeyring(c.AccountRegistry.Keyring). + WithGenerateOnly(c.generateOnly) } func newFactory(clientCtx client.Context) tx.Factory { diff --git a/ignite/pkg/cosmosclient/cosmosclient_test.go b/ignite/pkg/cosmosclient/cosmosclient_test.go new file mode 100644 index 0000000000..e419a3f200 --- /dev/null +++ b/ignite/pkg/cosmosclient/cosmosclient_test.go @@ -0,0 +1,600 @@ +package cosmosclient_test + +import ( + "context" + "testing" + "time" + + sdktypes "github.com/cosmos/cosmos-sdk/types" + banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" + "github.com/pkg/errors" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + "github.com/tendermint/tendermint/p2p" + ctypes "github.com/tendermint/tendermint/rpc/core/types" + + "github.com/ignite/cli/ignite/pkg/cosmosaccount" + "github.com/ignite/cli/ignite/pkg/cosmosclient" + "github.com/ignite/cli/ignite/pkg/cosmosclient/mocks" + "github.com/ignite/cli/ignite/pkg/cosmosfaucet" +) + +//go:generate mockery --srcpkg github.com/tendermint/tendermint/rpc/client/ --name Client --structname RPCClient --filename rpclient.go --with-expecter +//go:generate mockery --srcpkg github.com/cosmos/cosmos-sdk/client --name AccountRetriever --filename account_retriever.go --with-expecter +//go:generate mockery --srcpkg github.com/cosmos/cosmos-sdk/x/bank/types --name QueryClient --structname BankQueryClient --filename bank_query_client.go --with-expecter +//go:generate mockery --srcpkg . --name FaucetClient --structname FaucetClient --filename faucet_client.go --with-expecter +//go:generate mockery --srcpkg . --name Gasometer --filename gasometer.go --with-expecter + +type suite struct { + rpcClient *mocks.RPCClient + accountRetriever *mocks.AccountRetriever + bankQueryClient *mocks.BankQueryClient + gasometer *mocks.Gasometer + faucetClient *mocks.FaucetClient +} + +func newClient(t *testing.T, setup func(suite), opts ...cosmosclient.Option) cosmosclient.Client { + s := suite{ + rpcClient: mocks.NewRPCClient(t), + accountRetriever: mocks.NewAccountRetriever(t), + bankQueryClient: mocks.NewBankQueryClient(t), + gasometer: mocks.NewGasometer(t), + faucetClient: mocks.NewFaucetClient(t), + } + // Because rpcClient is passed as argument inside clientContext of mocked + // methods, we must EXPECT a call to String (because testify/mock is calling + // String() on mocked methods' args) + s.rpcClient.EXPECT().String().Return("plop").Maybe() + // cosmosclient.New always makes a call to Status + s.rpcClient.EXPECT().Status(mock.Anything). + Return(&ctypes.ResultStatus{ + NodeInfo: p2p.DefaultNodeInfo{Network: "mychain"}, + }, nil).Once() + if setup != nil { + setup(s) + } + opts = append(opts, []cosmosclient.Option{ + cosmosclient.WithKeyringBackend(cosmosaccount.KeyringMemory), + cosmosclient.WithRPCClient(s.rpcClient), + cosmosclient.WithAccountRetriever(s.accountRetriever), + cosmosclient.WithBankQueryClient(s.bankQueryClient), + cosmosclient.WithGasometer(s.gasometer), + cosmosclient.WithFaucetClient(s.faucetClient), + }...) + c, err := cosmosclient.New(context.Background(), opts...) + require.NoError(t, err) + return c +} + +func TestClientWaitForBlockHeight(t *testing.T) { + var ( + ctx = context.Background() + canceledCtx, cancel = context.WithTimeout(ctx, 0) + targetBlockHeight = int64(42) + ) + cancel() + tests := []struct { + name string + ctx context.Context + waitBlockDuration time.Duration + expectedError string + setup func(suite) + }{ + { + name: "ok: no wait", + ctx: ctx, + setup: func(s suite) { + s.rpcClient.EXPECT().Status(ctx).Return(&ctypes.ResultStatus{ + SyncInfo: ctypes.SyncInfo{LatestBlockHeight: targetBlockHeight}, + }, nil) + }, + }, + { + name: "ok: wait 1 time", + ctx: ctx, + waitBlockDuration: time.Second * 2, // must exceed the wait loop duration + setup: func(s suite) { + s.rpcClient.EXPECT().Status(ctx).Return(&ctypes.ResultStatus{ + SyncInfo: ctypes.SyncInfo{LatestBlockHeight: targetBlockHeight - 1}, + }, nil).Once() + s.rpcClient.EXPECT().Status(ctx).Return(&ctypes.ResultStatus{ + SyncInfo: ctypes.SyncInfo{LatestBlockHeight: targetBlockHeight}, + }, nil).Once() + }, + }, + { + name: "fail: wait expired", + ctx: ctx, + waitBlockDuration: time.Millisecond, + expectedError: "timeout exceeded waiting for block", + setup: func(s suite) { + s.rpcClient.EXPECT().Status(ctx).Return(&ctypes.ResultStatus{ + SyncInfo: ctypes.SyncInfo{LatestBlockHeight: targetBlockHeight - 1}, + }, nil) + }, + }, + { + name: "fail: canceled context", + ctx: canceledCtx, + waitBlockDuration: time.Millisecond, + expectedError: canceledCtx.Err().Error(), + setup: func(s suite) { + s.rpcClient.EXPECT().Status(canceledCtx).Return(&ctypes.ResultStatus{ + SyncInfo: ctypes.SyncInfo{LatestBlockHeight: targetBlockHeight - 1}, + }, nil) + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + require := require.New(t) + c := newClient(t, tt.setup) + + err := c.WaitForBlockHeight(tt.ctx, targetBlockHeight, tt.waitBlockDuration) + + if tt.expectedError != "" { + require.EqualError(err, tt.expectedError) + return + } + require.NoError(err) + }) + } +} + +func TestClientAccount(t *testing.T) { + var ( + accountName = "bob" + passphrase = "passphrase" + ) + r, err := cosmosaccount.NewInMemory() + require.NoError(t, err) + expectedAccount, _, err := r.Create(accountName) + require.NoError(t, err) + expectedAddr, err := expectedAccount.Address("cosmos") + require.NoError(t, err) + // Export created account to we can import it in the Client below. + key, err := r.Export(accountName, passphrase) + require.NoError(t, err) + + tests := []struct { + name string + addressOrName string + expectedError string + }{ + { + name: "ok: find by name", + addressOrName: expectedAccount.Name, + }, + { + name: "ok: find by address", + addressOrName: expectedAddr, + }, + { + name: "fail: name not found", + addressOrName: "unknown", + expectedError: "decoding bech32 failed: invalid bech32 string length 7", + }, + { + name: "fail: address not found", + addressOrName: "cosmos1cs4hpwrpna6ucsgsa78jfp403l7gdynukrxkrv", + expectedError: `account "cosmos1cs4hpwrpna6ucsgsa78jfp403l7gdynukrxkrv" does not exist`, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + var ( + require = require.New(t) + assert = assert.New(t) + c = newClient(t, nil) + ) + _, err := c.AccountRegistry.Import(accountName, key, passphrase) + require.NoError(err) + + account, err := c.Account(tt.addressOrName) + + if tt.expectedError != "" { + require.EqualError(err, tt.expectedError) + return + } + require.NoError(err) + assert.Equal(expectedAccount, account) + }) + } +} + +func TestClientAddress(t *testing.T) { + var ( + accountName = "bob" + passphrase = "passphrase" + ) + r, err := cosmosaccount.NewInMemory() + require.NoError(t, err) + expectedAccount, _, err := r.Create(accountName) + require.NoError(t, err) + // Export created account to we can import it in the Client below. + key, err := r.Export(accountName, passphrase) + require.NoError(t, err) + + tests := []struct { + name string + accountName string + opts []cosmosclient.Option + expectedError string + expectedPrefix string + }{ + { + name: "ok: name exists", + accountName: expectedAccount.Name, + expectedPrefix: "cosmos", + }, + { + name: "ok: name exists with different prefix", + opts: []cosmosclient.Option{ + cosmosclient.WithAddressPrefix("test"), + }, + accountName: expectedAccount.Name, + expectedPrefix: "test", + }, + { + name: "fail: name not found", + accountName: "unknown", + expectedError: `account "unknown" does not exist`, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + var ( + require = require.New(t) + assert = assert.New(t) + c = newClient(t, nil, tt.opts...) + ) + _, err := c.AccountRegistry.Import(accountName, key, passphrase) + require.NoError(err) + + address, err := c.Address(tt.accountName) + + if tt.expectedError != "" { + require.EqualError(err, tt.expectedError) + return + } + require.NoError(err) + expectedAddr, err := expectedAccount.Address(tt.expectedPrefix) + require.NoError(err) + assert.Equal(expectedAddr, address) + }) + } +} + +func TestClientStatus(t *testing.T) { + var ( + ctx = context.Background() + expectedStatus = &ctypes.ResultStatus{ + NodeInfo: p2p.DefaultNodeInfo{Network: "mychain"}, + } + ) + tests := []struct { + name string + expectedError string + setup func(suite) + }{ + { + name: "ok", + setup: func(s suite) { + s.rpcClient.EXPECT().Status(ctx).Return(expectedStatus, nil).Once() + }, + }, + { + name: "fail", + expectedError: "error while requesting node 'http://localhost:26657': oups", + setup: func(s suite) { + s.rpcClient.EXPECT().Status(ctx).Return(expectedStatus, errors.New("oups")).Once() + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + c := newClient(t, tt.setup) + + status, err := c.Status(ctx) + + if tt.expectedError != "" { + require.EqualError(t, err, tt.expectedError) + return + } + require.NoError(t, err) + assert.Equal(t, expectedStatus, status) + }) + } +} + +func TestClientCreateTx(t *testing.T) { + const ( + defaultFaucetDenom = "token" + defaultFaucetMinAmount = 100 + ) + var ( + accountName = "bob" + passphrase = "passphrase" + ) + r, err := cosmosaccount.NewInMemory() + require.NoError(t, err) + a, _, err := r.Create(accountName) + require.NoError(t, err) + // Export created account to we can import it in the Client below. + key, err := r.Export(accountName, passphrase) + require.NoError(t, err) + sdkaddress, err := a.Record.GetAddress() + require.NoError(t, err) + + tests := []struct { + name string + opts []cosmosclient.Option + msg sdktypes.Msg + expectedJSONTx string + expectedError string + setup func(s suite) + }{ + { + name: "fail: account doesn't exist", + expectedError: "nope", + setup: func(s suite) { + s.accountRetriever.EXPECT(). + EnsureExists(mock.Anything, sdkaddress).Return(errors.New("nope")) + }, + }, + { + name: "ok: with default values", + msg: &banktypes.MsgSend{ + FromAddress: "from", + ToAddress: "to", + Amount: sdktypes.NewCoins( + sdktypes.NewCoin("token", sdktypes.NewIntFromUint64((1))), + ), + }, + expectedJSONTx: `{"body":{"messages":[{"@type":"/cosmos.bank.v1beta1.MsgSend","from_address":"from","to_address":"to","amount":[{"denom":"token","amount":"1"}]}],"memo":"","timeout_height":"0","extension_options":[],"non_critical_extension_options":[]},"auth_info":{"signer_infos":[],"fee":{"amount":[],"gas_limit":"300000","payer":"","granter":""},"tip":null},"signatures":[]}`, + setup: func(s suite) { + s.accountRetriever.EXPECT(). + EnsureExists(mock.Anything, sdkaddress). + Return(nil) + s.accountRetriever.EXPECT(). + GetAccountNumberSequence(mock.Anything, sdkaddress). + Return(1, 2, nil) + }, + }, + { + name: "ok: with faucet enabled, account balance is high enough", + opts: []cosmosclient.Option{ + cosmosclient.WithUseFaucet("localhost:1234", "", 0), + }, + msg: &banktypes.MsgSend{ + FromAddress: "from", + ToAddress: "to", + Amount: sdktypes.NewCoins( + sdktypes.NewCoin("token", sdktypes.NewIntFromUint64((1))), + ), + }, + expectedJSONTx: `{"body":{"messages":[{"@type":"/cosmos.bank.v1beta1.MsgSend","from_address":"from","to_address":"to","amount":[{"denom":"token","amount":"1"}]}],"memo":"","timeout_height":"0","extension_options":[],"non_critical_extension_options":[]},"auth_info":{"signer_infos":[],"fee":{"amount":[],"gas_limit":"300000","payer":"","granter":""},"tip":null},"signatures":[]}`, + setup: func(s suite) { + balance := sdktypes.NewCoin("token", sdktypes.NewIntFromUint64(defaultFaucetMinAmount)) + s.bankQueryClient.EXPECT().Balance( + context.Background(), + &banktypes.QueryBalanceRequest{ + Address: sdkaddress.String(), + Denom: defaultFaucetDenom, + }, + ).Return( + &banktypes.QueryBalanceResponse{ + Balance: &balance, + }, + nil, + ) + + s.accountRetriever.EXPECT(). + EnsureExists(mock.Anything, sdkaddress). + Return(nil) + s.accountRetriever.EXPECT(). + GetAccountNumberSequence(mock.Anything, sdkaddress). + Return(1, 2, nil) + }, + }, + { + name: "ok: with faucet enabled, account balance is too low", + opts: []cosmosclient.Option{ + cosmosclient.WithUseFaucet("localhost:1234", "", 0), + }, + msg: &banktypes.MsgSend{ + FromAddress: "from", + ToAddress: "to", + Amount: sdktypes.NewCoins( + sdktypes.NewCoin("token", sdktypes.NewIntFromUint64((1))), + ), + }, + expectedJSONTx: `{"body":{"messages":[{"@type":"/cosmos.bank.v1beta1.MsgSend","from_address":"from","to_address":"to","amount":[{"denom":"token","amount":"1"}]}],"memo":"","timeout_height":"0","extension_options":[],"non_critical_extension_options":[]},"auth_info":{"signer_infos":[],"fee":{"amount":[],"gas_limit":"300000","payer":"","granter":""},"tip":null},"signatures":[]}`, + setup: func(s suite) { + balance := sdktypes.NewCoin("token", sdktypes.NewIntFromUint64(defaultFaucetMinAmount-1)) + s.bankQueryClient.EXPECT().Balance( + context.Background(), + &banktypes.QueryBalanceRequest{ + Address: sdkaddress.String(), + Denom: defaultFaucetDenom, + }, + ).Return( + &banktypes.QueryBalanceResponse{ + Balance: &balance, + }, + nil, + ).Once() + + s.faucetClient.EXPECT().Transfer(context.Background(), + cosmosfaucet.TransferRequest{AccountAddress: sdkaddress.String()}, + ).Return( + cosmosfaucet.TransferResponse{}, nil, + ) + + newBalance := sdktypes.NewCoin("token", sdktypes.NewIntFromUint64(defaultFaucetMinAmount)) + s.bankQueryClient.EXPECT().Balance( + mock.Anything, + &banktypes.QueryBalanceRequest{ + Address: sdkaddress.String(), + Denom: defaultFaucetDenom, + }, + ).Return( + &banktypes.QueryBalanceResponse{ + Balance: &newBalance, + }, + nil, + ).Once() + + s.accountRetriever.EXPECT(). + EnsureExists(mock.Anything, sdkaddress). + Return(nil) + s.accountRetriever.EXPECT(). + GetAccountNumberSequence(mock.Anything, sdkaddress). + Return(1, 2, nil) + }, + }, + { + name: "ok: with fees", + opts: []cosmosclient.Option{ + cosmosclient.WithFees("10token"), + }, + msg: &banktypes.MsgSend{ + FromAddress: "from", + ToAddress: "to", + Amount: sdktypes.NewCoins( + sdktypes.NewCoin("token", sdktypes.NewIntFromUint64((1))), + ), + }, + expectedJSONTx: `{"body":{"messages":[{"@type":"/cosmos.bank.v1beta1.MsgSend","from_address":"from","to_address":"to","amount":[{"denom":"token","amount":"1"}]}],"memo":"","timeout_height":"0","extension_options":[],"non_critical_extension_options":[]},"auth_info":{"signer_infos":[],"fee":{"amount":[{"denom":"token","amount":"10"}],"gas_limit":"300000","payer":"","granter":""},"tip":null},"signatures":[]}`, + setup: func(s suite) { + s.accountRetriever.EXPECT(). + EnsureExists(mock.Anything, sdkaddress). + Return(nil) + s.accountRetriever.EXPECT(). + GetAccountNumberSequence(mock.Anything, sdkaddress). + Return(1, 2, nil) + }, + }, + { + name: "ok: with gas price", + opts: []cosmosclient.Option{ + // Should set fees to 3*defaultGasLimit + cosmosclient.WithGasPrices("3token"), + }, + msg: &banktypes.MsgSend{ + FromAddress: "from", + ToAddress: "to", + Amount: sdktypes.NewCoins( + sdktypes.NewCoin("token", sdktypes.NewIntFromUint64((1))), + ), + }, + expectedJSONTx: `{"body":{"messages":[{"@type":"/cosmos.bank.v1beta1.MsgSend","from_address":"from","to_address":"to","amount":[{"denom":"token","amount":"1"}]}],"memo":"","timeout_height":"0","extension_options":[],"non_critical_extension_options":[]},"auth_info":{"signer_infos":[],"fee":{"amount":[{"denom":"token","amount":"900000"}],"gas_limit":"300000","payer":"","granter":""},"tip":null},"signatures":[]}`, + setup: func(s suite) { + s.accountRetriever.EXPECT(). + EnsureExists(mock.Anything, sdkaddress). + Return(nil) + s.accountRetriever.EXPECT(). + GetAccountNumberSequence(mock.Anything, sdkaddress). + Return(1, 2, nil) + }, + }, + { + name: "fail: with fees and gas prices", + opts: []cosmosclient.Option{ + cosmosclient.WithFees("10token"), + cosmosclient.WithGasPrices("3token"), + }, + msg: &banktypes.MsgSend{ + FromAddress: "from", + ToAddress: "to", + Amount: sdktypes.NewCoins( + sdktypes.NewCoin("token", sdktypes.NewIntFromUint64((1))), + ), + }, + expectedError: "cannot provide both fees and gas prices", + setup: func(s suite) { + s.accountRetriever.EXPECT(). + EnsureExists(mock.Anything, sdkaddress). + Return(nil) + s.accountRetriever.EXPECT(). + GetAccountNumberSequence(mock.Anything, sdkaddress). + Return(1, 2, nil) + }, + }, + { + name: "ok: without empty gas limit", + opts: []cosmosclient.Option{ + cosmosclient.WithGas(""), + }, + msg: &banktypes.MsgSend{ + FromAddress: "from", + ToAddress: "to", + Amount: sdktypes.NewCoins( + sdktypes.NewCoin("token", sdktypes.NewIntFromUint64((1))), + ), + }, + expectedJSONTx: `{"body":{"messages":[{"@type":"/cosmos.bank.v1beta1.MsgSend","from_address":"from","to_address":"to","amount":[{"denom":"token","amount":"1"}]}],"memo":"","timeout_height":"0","extension_options":[],"non_critical_extension_options":[]},"auth_info":{"signer_infos":[],"fee":{"amount":[],"gas_limit":"20042","payer":"","granter":""},"tip":null},"signatures":[]}`, + setup: func(s suite) { + s.accountRetriever.EXPECT(). + EnsureExists(mock.Anything, sdkaddress). + Return(nil) + s.accountRetriever.EXPECT(). + GetAccountNumberSequence(mock.Anything, sdkaddress). + Return(1, 2, nil) + s.gasometer.EXPECT(). + CalculateGas(mock.Anything, mock.Anything, mock.Anything). + Return(nil, 42, nil) + }, + }, + { + name: "ok: without auto gas limit", + opts: []cosmosclient.Option{ + cosmosclient.WithGas("auto"), + }, + msg: &banktypes.MsgSend{ + FromAddress: "from", + ToAddress: "to", + Amount: sdktypes.NewCoins( + sdktypes.NewCoin("token", sdktypes.NewIntFromUint64((1))), + ), + }, + expectedJSONTx: `{"body":{"messages":[{"@type":"/cosmos.bank.v1beta1.MsgSend","from_address":"from","to_address":"to","amount":[{"denom":"token","amount":"1"}]}],"memo":"","timeout_height":"0","extension_options":[],"non_critical_extension_options":[]},"auth_info":{"signer_infos":[],"fee":{"amount":[],"gas_limit":"20042","payer":"","granter":""},"tip":null},"signatures":[]}`, + setup: func(s suite) { + s.accountRetriever.EXPECT(). + EnsureExists(mock.Anything, sdkaddress). + Return(nil) + s.accountRetriever.EXPECT(). + GetAccountNumberSequence(mock.Anything, sdkaddress). + Return(1, 2, nil) + s.gasometer.EXPECT(). + CalculateGas(mock.Anything, mock.Anything, mock.Anything). + Return(nil, 42, nil) + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + var ( + require = require.New(t) + assert = assert.New(t) + c = newClient(t, tt.setup, tt.opts...) + ) + account, err := c.AccountRegistry.Import(accountName, key, passphrase) + require.NoError(err) + + txs, err := c.CreateTx(account, tt.msg) + + if tt.expectedError != "" { + require.EqualError(err, tt.expectedError) + return + } + require.NoError(err) + assert.NotNil(txs) + bz, err := txs.EncodeJSON() + require.NoError(err) + assert.JSONEq(tt.expectedJSONTx, string(bz)) + }) + } +} diff --git a/ignite/pkg/cosmosclient/gasometer.go b/ignite/pkg/cosmosclient/gasometer.go new file mode 100644 index 0000000000..e576a67c15 --- /dev/null +++ b/ignite/pkg/cosmosclient/gasometer.go @@ -0,0 +1,15 @@ +package cosmosclient + +import ( + "github.com/cosmos/cosmos-sdk/client/tx" + sdktypes "github.com/cosmos/cosmos-sdk/types" + txtypes "github.com/cosmos/cosmos-sdk/types/tx" + gogogrpc "github.com/gogo/protobuf/grpc" +) + +// Implements Gasometer +type gasometer struct{} + +func (gasometer) CalculateGas(clientCtx gogogrpc.ClientConn, txf tx.Factory, msgs ...sdktypes.Msg) (*txtypes.SimulateResponse, uint64, error) { + return tx.CalculateGas(clientCtx, txf, msgs...) +} diff --git a/ignite/pkg/cosmosclient/mocks/account_retriever.go b/ignite/pkg/cosmosclient/mocks/account_retriever.go new file mode 100644 index 0000000000..fd5e8dc34a --- /dev/null +++ b/ignite/pkg/cosmosclient/mocks/account_retriever.go @@ -0,0 +1,229 @@ +// Code generated by mockery v2.14.0. DO NOT EDIT. + +package mocks + +import ( + client "github.com/cosmos/cosmos-sdk/client" + mock "github.com/stretchr/testify/mock" + + types "github.com/cosmos/cosmos-sdk/types" +) + +// AccountRetriever is an autogenerated mock type for the AccountRetriever type +type AccountRetriever struct { + mock.Mock +} + +type AccountRetriever_Expecter struct { + mock *mock.Mock +} + +func (_m *AccountRetriever) EXPECT() *AccountRetriever_Expecter { + return &AccountRetriever_Expecter{mock: &_m.Mock} +} + +// EnsureExists provides a mock function with given fields: clientCtx, addr +func (_m *AccountRetriever) EnsureExists(clientCtx client.Context, addr types.AccAddress) error { + ret := _m.Called(clientCtx, addr) + + var r0 error + if rf, ok := ret.Get(0).(func(client.Context, types.AccAddress) error); ok { + r0 = rf(clientCtx, addr) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// AccountRetriever_EnsureExists_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'EnsureExists' +type AccountRetriever_EnsureExists_Call struct { + *mock.Call +} + +// EnsureExists is a helper method to define mock.On call +// - clientCtx client.Context +// - addr types.AccAddress +func (_e *AccountRetriever_Expecter) EnsureExists(clientCtx interface{}, addr interface{}) *AccountRetriever_EnsureExists_Call { + return &AccountRetriever_EnsureExists_Call{Call: _e.mock.On("EnsureExists", clientCtx, addr)} +} + +func (_c *AccountRetriever_EnsureExists_Call) Run(run func(clientCtx client.Context, addr types.AccAddress)) *AccountRetriever_EnsureExists_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(client.Context), args[1].(types.AccAddress)) + }) + return _c +} + +func (_c *AccountRetriever_EnsureExists_Call) Return(_a0 error) *AccountRetriever_EnsureExists_Call { + _c.Call.Return(_a0) + return _c +} + +// GetAccount provides a mock function with given fields: clientCtx, addr +func (_m *AccountRetriever) GetAccount(clientCtx client.Context, addr types.AccAddress) (client.Account, error) { + ret := _m.Called(clientCtx, addr) + + var r0 client.Account + if rf, ok := ret.Get(0).(func(client.Context, types.AccAddress) client.Account); ok { + r0 = rf(clientCtx, addr) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(client.Account) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(client.Context, types.AccAddress) error); ok { + r1 = rf(clientCtx, addr) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// AccountRetriever_GetAccount_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetAccount' +type AccountRetriever_GetAccount_Call struct { + *mock.Call +} + +// GetAccount is a helper method to define mock.On call +// - clientCtx client.Context +// - addr types.AccAddress +func (_e *AccountRetriever_Expecter) GetAccount(clientCtx interface{}, addr interface{}) *AccountRetriever_GetAccount_Call { + return &AccountRetriever_GetAccount_Call{Call: _e.mock.On("GetAccount", clientCtx, addr)} +} + +func (_c *AccountRetriever_GetAccount_Call) Run(run func(clientCtx client.Context, addr types.AccAddress)) *AccountRetriever_GetAccount_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(client.Context), args[1].(types.AccAddress)) + }) + return _c +} + +func (_c *AccountRetriever_GetAccount_Call) Return(_a0 client.Account, _a1 error) *AccountRetriever_GetAccount_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +// GetAccountNumberSequence provides a mock function with given fields: clientCtx, addr +func (_m *AccountRetriever) GetAccountNumberSequence(clientCtx client.Context, addr types.AccAddress) (uint64, uint64, error) { + ret := _m.Called(clientCtx, addr) + + var r0 uint64 + if rf, ok := ret.Get(0).(func(client.Context, types.AccAddress) uint64); ok { + r0 = rf(clientCtx, addr) + } else { + r0 = ret.Get(0).(uint64) + } + + var r1 uint64 + if rf, ok := ret.Get(1).(func(client.Context, types.AccAddress) uint64); ok { + r1 = rf(clientCtx, addr) + } else { + r1 = ret.Get(1).(uint64) + } + + var r2 error + if rf, ok := ret.Get(2).(func(client.Context, types.AccAddress) error); ok { + r2 = rf(clientCtx, addr) + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} + +// AccountRetriever_GetAccountNumberSequence_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetAccountNumberSequence' +type AccountRetriever_GetAccountNumberSequence_Call struct { + *mock.Call +} + +// GetAccountNumberSequence is a helper method to define mock.On call +// - clientCtx client.Context +// - addr types.AccAddress +func (_e *AccountRetriever_Expecter) GetAccountNumberSequence(clientCtx interface{}, addr interface{}) *AccountRetriever_GetAccountNumberSequence_Call { + return &AccountRetriever_GetAccountNumberSequence_Call{Call: _e.mock.On("GetAccountNumberSequence", clientCtx, addr)} +} + +func (_c *AccountRetriever_GetAccountNumberSequence_Call) Run(run func(clientCtx client.Context, addr types.AccAddress)) *AccountRetriever_GetAccountNumberSequence_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(client.Context), args[1].(types.AccAddress)) + }) + return _c +} + +func (_c *AccountRetriever_GetAccountNumberSequence_Call) Return(accNum uint64, accSeq uint64, err error) *AccountRetriever_GetAccountNumberSequence_Call { + _c.Call.Return(accNum, accSeq, err) + return _c +} + +// GetAccountWithHeight provides a mock function with given fields: clientCtx, addr +func (_m *AccountRetriever) GetAccountWithHeight(clientCtx client.Context, addr types.AccAddress) (client.Account, int64, error) { + ret := _m.Called(clientCtx, addr) + + var r0 client.Account + if rf, ok := ret.Get(0).(func(client.Context, types.AccAddress) client.Account); ok { + r0 = rf(clientCtx, addr) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(client.Account) + } + } + + var r1 int64 + if rf, ok := ret.Get(1).(func(client.Context, types.AccAddress) int64); ok { + r1 = rf(clientCtx, addr) + } else { + r1 = ret.Get(1).(int64) + } + + var r2 error + if rf, ok := ret.Get(2).(func(client.Context, types.AccAddress) error); ok { + r2 = rf(clientCtx, addr) + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} + +// AccountRetriever_GetAccountWithHeight_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetAccountWithHeight' +type AccountRetriever_GetAccountWithHeight_Call struct { + *mock.Call +} + +// GetAccountWithHeight is a helper method to define mock.On call +// - clientCtx client.Context +// - addr types.AccAddress +func (_e *AccountRetriever_Expecter) GetAccountWithHeight(clientCtx interface{}, addr interface{}) *AccountRetriever_GetAccountWithHeight_Call { + return &AccountRetriever_GetAccountWithHeight_Call{Call: _e.mock.On("GetAccountWithHeight", clientCtx, addr)} +} + +func (_c *AccountRetriever_GetAccountWithHeight_Call) Run(run func(clientCtx client.Context, addr types.AccAddress)) *AccountRetriever_GetAccountWithHeight_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(client.Context), args[1].(types.AccAddress)) + }) + return _c +} + +func (_c *AccountRetriever_GetAccountWithHeight_Call) Return(_a0 client.Account, _a1 int64, _a2 error) *AccountRetriever_GetAccountWithHeight_Call { + _c.Call.Return(_a0, _a1, _a2) + return _c +} + +type mockConstructorTestingTNewAccountRetriever interface { + mock.TestingT + Cleanup(func()) +} + +// NewAccountRetriever creates a new instance of AccountRetriever. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +func NewAccountRetriever(t mockConstructorTestingTNewAccountRetriever) *AccountRetriever { + mock := &AccountRetriever{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/ignite/pkg/cosmosclient/mocks/bank_query_client.go b/ignite/pkg/cosmosclient/mocks/bank_query_client.go new file mode 100644 index 0000000000..4843a58b97 --- /dev/null +++ b/ignite/pkg/cosmosclient/mocks/bank_query_client.go @@ -0,0 +1,599 @@ +// Code generated by mockery v2.14.0. DO NOT EDIT. + +package mocks + +import ( + context "context" + + grpc "google.golang.org/grpc" + + mock "github.com/stretchr/testify/mock" + + types "github.com/cosmos/cosmos-sdk/x/bank/types" +) + +// BankQueryClient is an autogenerated mock type for the QueryClient type +type BankQueryClient struct { + mock.Mock +} + +type BankQueryClient_Expecter struct { + mock *mock.Mock +} + +func (_m *BankQueryClient) EXPECT() *BankQueryClient_Expecter { + return &BankQueryClient_Expecter{mock: &_m.Mock} +} + +// AllBalances provides a mock function with given fields: ctx, in, opts +func (_m *BankQueryClient) AllBalances(ctx context.Context, in *types.QueryAllBalancesRequest, opts ...grpc.CallOption) (*types.QueryAllBalancesResponse, error) { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, in) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *types.QueryAllBalancesResponse + if rf, ok := ret.Get(0).(func(context.Context, *types.QueryAllBalancesRequest, ...grpc.CallOption) *types.QueryAllBalancesResponse); ok { + r0 = rf(ctx, in, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.QueryAllBalancesResponse) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *types.QueryAllBalancesRequest, ...grpc.CallOption) error); ok { + r1 = rf(ctx, in, opts...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// BankQueryClient_AllBalances_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AllBalances' +type BankQueryClient_AllBalances_Call struct { + *mock.Call +} + +// AllBalances is a helper method to define mock.On call +// - ctx context.Context +// - in *types.QueryAllBalancesRequest +// - opts ...grpc.CallOption +func (_e *BankQueryClient_Expecter) AllBalances(ctx interface{}, in interface{}, opts ...interface{}) *BankQueryClient_AllBalances_Call { + return &BankQueryClient_AllBalances_Call{Call: _e.mock.On("AllBalances", + append([]interface{}{ctx, in}, opts...)...)} +} + +func (_c *BankQueryClient_AllBalances_Call) Run(run func(ctx context.Context, in *types.QueryAllBalancesRequest, opts ...grpc.CallOption)) *BankQueryClient_AllBalances_Call { + _c.Call.Run(func(args mock.Arguments) { + variadicArgs := make([]grpc.CallOption, len(args)-2) + for i, a := range args[2:] { + if a != nil { + variadicArgs[i] = a.(grpc.CallOption) + } + } + run(args[0].(context.Context), args[1].(*types.QueryAllBalancesRequest), variadicArgs...) + }) + return _c +} + +func (_c *BankQueryClient_AllBalances_Call) Return(_a0 *types.QueryAllBalancesResponse, _a1 error) *BankQueryClient_AllBalances_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +// Balance provides a mock function with given fields: ctx, in, opts +func (_m *BankQueryClient) Balance(ctx context.Context, in *types.QueryBalanceRequest, opts ...grpc.CallOption) (*types.QueryBalanceResponse, error) { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, in) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *types.QueryBalanceResponse + if rf, ok := ret.Get(0).(func(context.Context, *types.QueryBalanceRequest, ...grpc.CallOption) *types.QueryBalanceResponse); ok { + r0 = rf(ctx, in, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.QueryBalanceResponse) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *types.QueryBalanceRequest, ...grpc.CallOption) error); ok { + r1 = rf(ctx, in, opts...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// BankQueryClient_Balance_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Balance' +type BankQueryClient_Balance_Call struct { + *mock.Call +} + +// Balance is a helper method to define mock.On call +// - ctx context.Context +// - in *types.QueryBalanceRequest +// - opts ...grpc.CallOption +func (_e *BankQueryClient_Expecter) Balance(ctx interface{}, in interface{}, opts ...interface{}) *BankQueryClient_Balance_Call { + return &BankQueryClient_Balance_Call{Call: _e.mock.On("Balance", + append([]interface{}{ctx, in}, opts...)...)} +} + +func (_c *BankQueryClient_Balance_Call) Run(run func(ctx context.Context, in *types.QueryBalanceRequest, opts ...grpc.CallOption)) *BankQueryClient_Balance_Call { + _c.Call.Run(func(args mock.Arguments) { + variadicArgs := make([]grpc.CallOption, len(args)-2) + for i, a := range args[2:] { + if a != nil { + variadicArgs[i] = a.(grpc.CallOption) + } + } + run(args[0].(context.Context), args[1].(*types.QueryBalanceRequest), variadicArgs...) + }) + return _c +} + +func (_c *BankQueryClient_Balance_Call) Return(_a0 *types.QueryBalanceResponse, _a1 error) *BankQueryClient_Balance_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +// DenomMetadata provides a mock function with given fields: ctx, in, opts +func (_m *BankQueryClient) DenomMetadata(ctx context.Context, in *types.QueryDenomMetadataRequest, opts ...grpc.CallOption) (*types.QueryDenomMetadataResponse, error) { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, in) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *types.QueryDenomMetadataResponse + if rf, ok := ret.Get(0).(func(context.Context, *types.QueryDenomMetadataRequest, ...grpc.CallOption) *types.QueryDenomMetadataResponse); ok { + r0 = rf(ctx, in, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.QueryDenomMetadataResponse) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *types.QueryDenomMetadataRequest, ...grpc.CallOption) error); ok { + r1 = rf(ctx, in, opts...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// BankQueryClient_DenomMetadata_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DenomMetadata' +type BankQueryClient_DenomMetadata_Call struct { + *mock.Call +} + +// DenomMetadata is a helper method to define mock.On call +// - ctx context.Context +// - in *types.QueryDenomMetadataRequest +// - opts ...grpc.CallOption +func (_e *BankQueryClient_Expecter) DenomMetadata(ctx interface{}, in interface{}, opts ...interface{}) *BankQueryClient_DenomMetadata_Call { + return &BankQueryClient_DenomMetadata_Call{Call: _e.mock.On("DenomMetadata", + append([]interface{}{ctx, in}, opts...)...)} +} + +func (_c *BankQueryClient_DenomMetadata_Call) Run(run func(ctx context.Context, in *types.QueryDenomMetadataRequest, opts ...grpc.CallOption)) *BankQueryClient_DenomMetadata_Call { + _c.Call.Run(func(args mock.Arguments) { + variadicArgs := make([]grpc.CallOption, len(args)-2) + for i, a := range args[2:] { + if a != nil { + variadicArgs[i] = a.(grpc.CallOption) + } + } + run(args[0].(context.Context), args[1].(*types.QueryDenomMetadataRequest), variadicArgs...) + }) + return _c +} + +func (_c *BankQueryClient_DenomMetadata_Call) Return(_a0 *types.QueryDenomMetadataResponse, _a1 error) *BankQueryClient_DenomMetadata_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +// DenomOwners provides a mock function with given fields: ctx, in, opts +func (_m *BankQueryClient) DenomOwners(ctx context.Context, in *types.QueryDenomOwnersRequest, opts ...grpc.CallOption) (*types.QueryDenomOwnersResponse, error) { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, in) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *types.QueryDenomOwnersResponse + if rf, ok := ret.Get(0).(func(context.Context, *types.QueryDenomOwnersRequest, ...grpc.CallOption) *types.QueryDenomOwnersResponse); ok { + r0 = rf(ctx, in, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.QueryDenomOwnersResponse) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *types.QueryDenomOwnersRequest, ...grpc.CallOption) error); ok { + r1 = rf(ctx, in, opts...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// BankQueryClient_DenomOwners_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DenomOwners' +type BankQueryClient_DenomOwners_Call struct { + *mock.Call +} + +// DenomOwners is a helper method to define mock.On call +// - ctx context.Context +// - in *types.QueryDenomOwnersRequest +// - opts ...grpc.CallOption +func (_e *BankQueryClient_Expecter) DenomOwners(ctx interface{}, in interface{}, opts ...interface{}) *BankQueryClient_DenomOwners_Call { + return &BankQueryClient_DenomOwners_Call{Call: _e.mock.On("DenomOwners", + append([]interface{}{ctx, in}, opts...)...)} +} + +func (_c *BankQueryClient_DenomOwners_Call) Run(run func(ctx context.Context, in *types.QueryDenomOwnersRequest, opts ...grpc.CallOption)) *BankQueryClient_DenomOwners_Call { + _c.Call.Run(func(args mock.Arguments) { + variadicArgs := make([]grpc.CallOption, len(args)-2) + for i, a := range args[2:] { + if a != nil { + variadicArgs[i] = a.(grpc.CallOption) + } + } + run(args[0].(context.Context), args[1].(*types.QueryDenomOwnersRequest), variadicArgs...) + }) + return _c +} + +func (_c *BankQueryClient_DenomOwners_Call) Return(_a0 *types.QueryDenomOwnersResponse, _a1 error) *BankQueryClient_DenomOwners_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +// DenomsMetadata provides a mock function with given fields: ctx, in, opts +func (_m *BankQueryClient) DenomsMetadata(ctx context.Context, in *types.QueryDenomsMetadataRequest, opts ...grpc.CallOption) (*types.QueryDenomsMetadataResponse, error) { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, in) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *types.QueryDenomsMetadataResponse + if rf, ok := ret.Get(0).(func(context.Context, *types.QueryDenomsMetadataRequest, ...grpc.CallOption) *types.QueryDenomsMetadataResponse); ok { + r0 = rf(ctx, in, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.QueryDenomsMetadataResponse) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *types.QueryDenomsMetadataRequest, ...grpc.CallOption) error); ok { + r1 = rf(ctx, in, opts...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// BankQueryClient_DenomsMetadata_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DenomsMetadata' +type BankQueryClient_DenomsMetadata_Call struct { + *mock.Call +} + +// DenomsMetadata is a helper method to define mock.On call +// - ctx context.Context +// - in *types.QueryDenomsMetadataRequest +// - opts ...grpc.CallOption +func (_e *BankQueryClient_Expecter) DenomsMetadata(ctx interface{}, in interface{}, opts ...interface{}) *BankQueryClient_DenomsMetadata_Call { + return &BankQueryClient_DenomsMetadata_Call{Call: _e.mock.On("DenomsMetadata", + append([]interface{}{ctx, in}, opts...)...)} +} + +func (_c *BankQueryClient_DenomsMetadata_Call) Run(run func(ctx context.Context, in *types.QueryDenomsMetadataRequest, opts ...grpc.CallOption)) *BankQueryClient_DenomsMetadata_Call { + _c.Call.Run(func(args mock.Arguments) { + variadicArgs := make([]grpc.CallOption, len(args)-2) + for i, a := range args[2:] { + if a != nil { + variadicArgs[i] = a.(grpc.CallOption) + } + } + run(args[0].(context.Context), args[1].(*types.QueryDenomsMetadataRequest), variadicArgs...) + }) + return _c +} + +func (_c *BankQueryClient_DenomsMetadata_Call) Return(_a0 *types.QueryDenomsMetadataResponse, _a1 error) *BankQueryClient_DenomsMetadata_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +// Params provides a mock function with given fields: ctx, in, opts +func (_m *BankQueryClient) Params(ctx context.Context, in *types.QueryParamsRequest, opts ...grpc.CallOption) (*types.QueryParamsResponse, error) { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, in) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *types.QueryParamsResponse + if rf, ok := ret.Get(0).(func(context.Context, *types.QueryParamsRequest, ...grpc.CallOption) *types.QueryParamsResponse); ok { + r0 = rf(ctx, in, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.QueryParamsResponse) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *types.QueryParamsRequest, ...grpc.CallOption) error); ok { + r1 = rf(ctx, in, opts...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// BankQueryClient_Params_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Params' +type BankQueryClient_Params_Call struct { + *mock.Call +} + +// Params is a helper method to define mock.On call +// - ctx context.Context +// - in *types.QueryParamsRequest +// - opts ...grpc.CallOption +func (_e *BankQueryClient_Expecter) Params(ctx interface{}, in interface{}, opts ...interface{}) *BankQueryClient_Params_Call { + return &BankQueryClient_Params_Call{Call: _e.mock.On("Params", + append([]interface{}{ctx, in}, opts...)...)} +} + +func (_c *BankQueryClient_Params_Call) Run(run func(ctx context.Context, in *types.QueryParamsRequest, opts ...grpc.CallOption)) *BankQueryClient_Params_Call { + _c.Call.Run(func(args mock.Arguments) { + variadicArgs := make([]grpc.CallOption, len(args)-2) + for i, a := range args[2:] { + if a != nil { + variadicArgs[i] = a.(grpc.CallOption) + } + } + run(args[0].(context.Context), args[1].(*types.QueryParamsRequest), variadicArgs...) + }) + return _c +} + +func (_c *BankQueryClient_Params_Call) Return(_a0 *types.QueryParamsResponse, _a1 error) *BankQueryClient_Params_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +// SpendableBalances provides a mock function with given fields: ctx, in, opts +func (_m *BankQueryClient) SpendableBalances(ctx context.Context, in *types.QuerySpendableBalancesRequest, opts ...grpc.CallOption) (*types.QuerySpendableBalancesResponse, error) { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, in) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *types.QuerySpendableBalancesResponse + if rf, ok := ret.Get(0).(func(context.Context, *types.QuerySpendableBalancesRequest, ...grpc.CallOption) *types.QuerySpendableBalancesResponse); ok { + r0 = rf(ctx, in, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.QuerySpendableBalancesResponse) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *types.QuerySpendableBalancesRequest, ...grpc.CallOption) error); ok { + r1 = rf(ctx, in, opts...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// BankQueryClient_SpendableBalances_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SpendableBalances' +type BankQueryClient_SpendableBalances_Call struct { + *mock.Call +} + +// SpendableBalances is a helper method to define mock.On call +// - ctx context.Context +// - in *types.QuerySpendableBalancesRequest +// - opts ...grpc.CallOption +func (_e *BankQueryClient_Expecter) SpendableBalances(ctx interface{}, in interface{}, opts ...interface{}) *BankQueryClient_SpendableBalances_Call { + return &BankQueryClient_SpendableBalances_Call{Call: _e.mock.On("SpendableBalances", + append([]interface{}{ctx, in}, opts...)...)} +} + +func (_c *BankQueryClient_SpendableBalances_Call) Run(run func(ctx context.Context, in *types.QuerySpendableBalancesRequest, opts ...grpc.CallOption)) *BankQueryClient_SpendableBalances_Call { + _c.Call.Run(func(args mock.Arguments) { + variadicArgs := make([]grpc.CallOption, len(args)-2) + for i, a := range args[2:] { + if a != nil { + variadicArgs[i] = a.(grpc.CallOption) + } + } + run(args[0].(context.Context), args[1].(*types.QuerySpendableBalancesRequest), variadicArgs...) + }) + return _c +} + +func (_c *BankQueryClient_SpendableBalances_Call) Return(_a0 *types.QuerySpendableBalancesResponse, _a1 error) *BankQueryClient_SpendableBalances_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +// SupplyOf provides a mock function with given fields: ctx, in, opts +func (_m *BankQueryClient) SupplyOf(ctx context.Context, in *types.QuerySupplyOfRequest, opts ...grpc.CallOption) (*types.QuerySupplyOfResponse, error) { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, in) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *types.QuerySupplyOfResponse + if rf, ok := ret.Get(0).(func(context.Context, *types.QuerySupplyOfRequest, ...grpc.CallOption) *types.QuerySupplyOfResponse); ok { + r0 = rf(ctx, in, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.QuerySupplyOfResponse) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *types.QuerySupplyOfRequest, ...grpc.CallOption) error); ok { + r1 = rf(ctx, in, opts...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// BankQueryClient_SupplyOf_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SupplyOf' +type BankQueryClient_SupplyOf_Call struct { + *mock.Call +} + +// SupplyOf is a helper method to define mock.On call +// - ctx context.Context +// - in *types.QuerySupplyOfRequest +// - opts ...grpc.CallOption +func (_e *BankQueryClient_Expecter) SupplyOf(ctx interface{}, in interface{}, opts ...interface{}) *BankQueryClient_SupplyOf_Call { + return &BankQueryClient_SupplyOf_Call{Call: _e.mock.On("SupplyOf", + append([]interface{}{ctx, in}, opts...)...)} +} + +func (_c *BankQueryClient_SupplyOf_Call) Run(run func(ctx context.Context, in *types.QuerySupplyOfRequest, opts ...grpc.CallOption)) *BankQueryClient_SupplyOf_Call { + _c.Call.Run(func(args mock.Arguments) { + variadicArgs := make([]grpc.CallOption, len(args)-2) + for i, a := range args[2:] { + if a != nil { + variadicArgs[i] = a.(grpc.CallOption) + } + } + run(args[0].(context.Context), args[1].(*types.QuerySupplyOfRequest), variadicArgs...) + }) + return _c +} + +func (_c *BankQueryClient_SupplyOf_Call) Return(_a0 *types.QuerySupplyOfResponse, _a1 error) *BankQueryClient_SupplyOf_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +// TotalSupply provides a mock function with given fields: ctx, in, opts +func (_m *BankQueryClient) TotalSupply(ctx context.Context, in *types.QueryTotalSupplyRequest, opts ...grpc.CallOption) (*types.QueryTotalSupplyResponse, error) { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, in) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *types.QueryTotalSupplyResponse + if rf, ok := ret.Get(0).(func(context.Context, *types.QueryTotalSupplyRequest, ...grpc.CallOption) *types.QueryTotalSupplyResponse); ok { + r0 = rf(ctx, in, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.QueryTotalSupplyResponse) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *types.QueryTotalSupplyRequest, ...grpc.CallOption) error); ok { + r1 = rf(ctx, in, opts...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// BankQueryClient_TotalSupply_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'TotalSupply' +type BankQueryClient_TotalSupply_Call struct { + *mock.Call +} + +// TotalSupply is a helper method to define mock.On call +// - ctx context.Context +// - in *types.QueryTotalSupplyRequest +// - opts ...grpc.CallOption +func (_e *BankQueryClient_Expecter) TotalSupply(ctx interface{}, in interface{}, opts ...interface{}) *BankQueryClient_TotalSupply_Call { + return &BankQueryClient_TotalSupply_Call{Call: _e.mock.On("TotalSupply", + append([]interface{}{ctx, in}, opts...)...)} +} + +func (_c *BankQueryClient_TotalSupply_Call) Run(run func(ctx context.Context, in *types.QueryTotalSupplyRequest, opts ...grpc.CallOption)) *BankQueryClient_TotalSupply_Call { + _c.Call.Run(func(args mock.Arguments) { + variadicArgs := make([]grpc.CallOption, len(args)-2) + for i, a := range args[2:] { + if a != nil { + variadicArgs[i] = a.(grpc.CallOption) + } + } + run(args[0].(context.Context), args[1].(*types.QueryTotalSupplyRequest), variadicArgs...) + }) + return _c +} + +func (_c *BankQueryClient_TotalSupply_Call) Return(_a0 *types.QueryTotalSupplyResponse, _a1 error) *BankQueryClient_TotalSupply_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +type mockConstructorTestingTNewBankQueryClient interface { + mock.TestingT + Cleanup(func()) +} + +// NewBankQueryClient creates a new instance of BankQueryClient. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +func NewBankQueryClient(t mockConstructorTestingTNewBankQueryClient) *BankQueryClient { + mock := &BankQueryClient{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/ignite/pkg/cosmosclient/mocks/faucet_client.go b/ignite/pkg/cosmosclient/mocks/faucet_client.go new file mode 100644 index 0000000000..0a276e4d05 --- /dev/null +++ b/ignite/pkg/cosmosclient/mocks/faucet_client.go @@ -0,0 +1,84 @@ +// Code generated by mockery v2.14.0. DO NOT EDIT. + +package mocks + +import ( + context "context" + + cosmosfaucet "github.com/ignite/cli/ignite/pkg/cosmosfaucet" + + mock "github.com/stretchr/testify/mock" +) + +// FaucetClient is an autogenerated mock type for the FaucetClient type +type FaucetClient struct { + mock.Mock +} + +type FaucetClient_Expecter struct { + mock *mock.Mock +} + +func (_m *FaucetClient) EXPECT() *FaucetClient_Expecter { + return &FaucetClient_Expecter{mock: &_m.Mock} +} + +// Transfer provides a mock function with given fields: _a0, _a1 +func (_m *FaucetClient) Transfer(_a0 context.Context, _a1 cosmosfaucet.TransferRequest) (cosmosfaucet.TransferResponse, error) { + ret := _m.Called(_a0, _a1) + + var r0 cosmosfaucet.TransferResponse + if rf, ok := ret.Get(0).(func(context.Context, cosmosfaucet.TransferRequest) cosmosfaucet.TransferResponse); ok { + r0 = rf(_a0, _a1) + } else { + r0 = ret.Get(0).(cosmosfaucet.TransferResponse) + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, cosmosfaucet.TransferRequest) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// FaucetClient_Transfer_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Transfer' +type FaucetClient_Transfer_Call struct { + *mock.Call +} + +// Transfer is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 cosmosfaucet.TransferRequest +func (_e *FaucetClient_Expecter) Transfer(_a0 interface{}, _a1 interface{}) *FaucetClient_Transfer_Call { + return &FaucetClient_Transfer_Call{Call: _e.mock.On("Transfer", _a0, _a1)} +} + +func (_c *FaucetClient_Transfer_Call) Run(run func(_a0 context.Context, _a1 cosmosfaucet.TransferRequest)) *FaucetClient_Transfer_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(cosmosfaucet.TransferRequest)) + }) + return _c +} + +func (_c *FaucetClient_Transfer_Call) Return(_a0 cosmosfaucet.TransferResponse, _a1 error) *FaucetClient_Transfer_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +type mockConstructorTestingTNewFaucetClient interface { + mock.TestingT + Cleanup(func()) +} + +// NewFaucetClient creates a new instance of FaucetClient. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +func NewFaucetClient(t mockConstructorTestingTNewFaucetClient) *FaucetClient { + mock := &FaucetClient{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/ignite/pkg/cosmosclient/mocks/gasometer.go b/ignite/pkg/cosmosclient/mocks/gasometer.go new file mode 100644 index 0000000000..5f8594bf6d --- /dev/null +++ b/ignite/pkg/cosmosclient/mocks/gasometer.go @@ -0,0 +1,111 @@ +// Code generated by mockery v2.14.0. DO NOT EDIT. + +package mocks + +import ( + grpc "github.com/gogo/protobuf/grpc" + mock "github.com/stretchr/testify/mock" + + tx "github.com/cosmos/cosmos-sdk/client/tx" + + types "github.com/cosmos/cosmos-sdk/types" + + typestx "github.com/cosmos/cosmos-sdk/types/tx" +) + +// Gasometer is an autogenerated mock type for the Gasometer type +type Gasometer struct { + mock.Mock +} + +type Gasometer_Expecter struct { + mock *mock.Mock +} + +func (_m *Gasometer) EXPECT() *Gasometer_Expecter { + return &Gasometer_Expecter{mock: &_m.Mock} +} + +// CalculateGas provides a mock function with given fields: clientCtx, txf, msgs +func (_m *Gasometer) CalculateGas(clientCtx grpc.ClientConn, txf tx.Factory, msgs ...types.Msg) (*typestx.SimulateResponse, uint64, error) { + _va := make([]interface{}, len(msgs)) + for _i := range msgs { + _va[_i] = msgs[_i] + } + var _ca []interface{} + _ca = append(_ca, clientCtx, txf) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *typestx.SimulateResponse + if rf, ok := ret.Get(0).(func(grpc.ClientConn, tx.Factory, ...types.Msg) *typestx.SimulateResponse); ok { + r0 = rf(clientCtx, txf, msgs...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*typestx.SimulateResponse) + } + } + + var r1 uint64 + if rf, ok := ret.Get(1).(func(grpc.ClientConn, tx.Factory, ...types.Msg) uint64); ok { + r1 = rf(clientCtx, txf, msgs...) + } else { + r1 = ret.Get(1).(uint64) + } + + var r2 error + if rf, ok := ret.Get(2).(func(grpc.ClientConn, tx.Factory, ...types.Msg) error); ok { + r2 = rf(clientCtx, txf, msgs...) + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} + +// Gasometer_CalculateGas_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'CalculateGas' +type Gasometer_CalculateGas_Call struct { + *mock.Call +} + +// CalculateGas is a helper method to define mock.On call +// - clientCtx grpc.ClientConn +// - txf tx.Factory +// - msgs ...types.Msg +func (_e *Gasometer_Expecter) CalculateGas(clientCtx interface{}, txf interface{}, msgs ...interface{}) *Gasometer_CalculateGas_Call { + return &Gasometer_CalculateGas_Call{Call: _e.mock.On("CalculateGas", + append([]interface{}{clientCtx, txf}, msgs...)...)} +} + +func (_c *Gasometer_CalculateGas_Call) Run(run func(clientCtx grpc.ClientConn, txf tx.Factory, msgs ...types.Msg)) *Gasometer_CalculateGas_Call { + _c.Call.Run(func(args mock.Arguments) { + variadicArgs := make([]types.Msg, len(args)-2) + for i, a := range args[2:] { + if a != nil { + variadicArgs[i] = a.(types.Msg) + } + } + run(args[0].(grpc.ClientConn), args[1].(tx.Factory), variadicArgs...) + }) + return _c +} + +func (_c *Gasometer_CalculateGas_Call) Return(_a0 *typestx.SimulateResponse, _a1 uint64, _a2 error) *Gasometer_CalculateGas_Call { + _c.Call.Return(_a0, _a1, _a2) + return _c +} + +type mockConstructorTestingTNewGasometer interface { + mock.TestingT + Cleanup(func()) +} + +// NewGasometer creates a new instance of Gasometer. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +func NewGasometer(t mockConstructorTestingTNewGasometer) *Gasometer { + mock := &Gasometer{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/ignite/pkg/cosmosclient/mocks/rpclient.go b/ignite/pkg/cosmosclient/mocks/rpclient.go new file mode 100644 index 0000000000..f81b801e8b --- /dev/null +++ b/ignite/pkg/cosmosclient/mocks/rpclient.go @@ -0,0 +1,1806 @@ +// Code generated by mockery v2.14.0. DO NOT EDIT. + +package mocks + +import ( + bytes "github.com/tendermint/tendermint/libs/bytes" + client "github.com/tendermint/tendermint/rpc/client" + + context "context" + + coretypes "github.com/tendermint/tendermint/rpc/core/types" + + log "github.com/tendermint/tendermint/libs/log" + + mock "github.com/stretchr/testify/mock" + + types "github.com/tendermint/tendermint/types" +) + +// RPCClient is an autogenerated mock type for the Client type +type RPCClient struct { + mock.Mock +} + +type RPCClient_Expecter struct { + mock *mock.Mock +} + +func (_m *RPCClient) EXPECT() *RPCClient_Expecter { + return &RPCClient_Expecter{mock: &_m.Mock} +} + +// ABCIInfo provides a mock function with given fields: _a0 +func (_m *RPCClient) ABCIInfo(_a0 context.Context) (*coretypes.ResultABCIInfo, error) { + ret := _m.Called(_a0) + + var r0 *coretypes.ResultABCIInfo + if rf, ok := ret.Get(0).(func(context.Context) *coretypes.ResultABCIInfo); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*coretypes.ResultABCIInfo) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context) error); ok { + r1 = rf(_a0) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RPCClient_ABCIInfo_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ABCIInfo' +type RPCClient_ABCIInfo_Call struct { + *mock.Call +} + +// ABCIInfo is a helper method to define mock.On call +// - _a0 context.Context +func (_e *RPCClient_Expecter) ABCIInfo(_a0 interface{}) *RPCClient_ABCIInfo_Call { + return &RPCClient_ABCIInfo_Call{Call: _e.mock.On("ABCIInfo", _a0)} +} + +func (_c *RPCClient_ABCIInfo_Call) Run(run func(_a0 context.Context)) *RPCClient_ABCIInfo_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context)) + }) + return _c +} + +func (_c *RPCClient_ABCIInfo_Call) Return(_a0 *coretypes.ResultABCIInfo, _a1 error) *RPCClient_ABCIInfo_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +// ABCIQuery provides a mock function with given fields: ctx, path, data +func (_m *RPCClient) ABCIQuery(ctx context.Context, path string, data bytes.HexBytes) (*coretypes.ResultABCIQuery, error) { + ret := _m.Called(ctx, path, data) + + var r0 *coretypes.ResultABCIQuery + if rf, ok := ret.Get(0).(func(context.Context, string, bytes.HexBytes) *coretypes.ResultABCIQuery); ok { + r0 = rf(ctx, path, data) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*coretypes.ResultABCIQuery) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, string, bytes.HexBytes) error); ok { + r1 = rf(ctx, path, data) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RPCClient_ABCIQuery_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ABCIQuery' +type RPCClient_ABCIQuery_Call struct { + *mock.Call +} + +// ABCIQuery is a helper method to define mock.On call +// - ctx context.Context +// - path string +// - data bytes.HexBytes +func (_e *RPCClient_Expecter) ABCIQuery(ctx interface{}, path interface{}, data interface{}) *RPCClient_ABCIQuery_Call { + return &RPCClient_ABCIQuery_Call{Call: _e.mock.On("ABCIQuery", ctx, path, data)} +} + +func (_c *RPCClient_ABCIQuery_Call) Run(run func(ctx context.Context, path string, data bytes.HexBytes)) *RPCClient_ABCIQuery_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(string), args[2].(bytes.HexBytes)) + }) + return _c +} + +func (_c *RPCClient_ABCIQuery_Call) Return(_a0 *coretypes.ResultABCIQuery, _a1 error) *RPCClient_ABCIQuery_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +// ABCIQueryWithOptions provides a mock function with given fields: ctx, path, data, opts +func (_m *RPCClient) ABCIQueryWithOptions(ctx context.Context, path string, data bytes.HexBytes, opts client.ABCIQueryOptions) (*coretypes.ResultABCIQuery, error) { + ret := _m.Called(ctx, path, data, opts) + + var r0 *coretypes.ResultABCIQuery + if rf, ok := ret.Get(0).(func(context.Context, string, bytes.HexBytes, client.ABCIQueryOptions) *coretypes.ResultABCIQuery); ok { + r0 = rf(ctx, path, data, opts) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*coretypes.ResultABCIQuery) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, string, bytes.HexBytes, client.ABCIQueryOptions) error); ok { + r1 = rf(ctx, path, data, opts) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RPCClient_ABCIQueryWithOptions_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ABCIQueryWithOptions' +type RPCClient_ABCIQueryWithOptions_Call struct { + *mock.Call +} + +// ABCIQueryWithOptions is a helper method to define mock.On call +// - ctx context.Context +// - path string +// - data bytes.HexBytes +// - opts client.ABCIQueryOptions +func (_e *RPCClient_Expecter) ABCIQueryWithOptions(ctx interface{}, path interface{}, data interface{}, opts interface{}) *RPCClient_ABCIQueryWithOptions_Call { + return &RPCClient_ABCIQueryWithOptions_Call{Call: _e.mock.On("ABCIQueryWithOptions", ctx, path, data, opts)} +} + +func (_c *RPCClient_ABCIQueryWithOptions_Call) Run(run func(ctx context.Context, path string, data bytes.HexBytes, opts client.ABCIQueryOptions)) *RPCClient_ABCIQueryWithOptions_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(string), args[2].(bytes.HexBytes), args[3].(client.ABCIQueryOptions)) + }) + return _c +} + +func (_c *RPCClient_ABCIQueryWithOptions_Call) Return(_a0 *coretypes.ResultABCIQuery, _a1 error) *RPCClient_ABCIQueryWithOptions_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +// Block provides a mock function with given fields: ctx, height +func (_m *RPCClient) Block(ctx context.Context, height *int64) (*coretypes.ResultBlock, error) { + ret := _m.Called(ctx, height) + + var r0 *coretypes.ResultBlock + if rf, ok := ret.Get(0).(func(context.Context, *int64) *coretypes.ResultBlock); ok { + r0 = rf(ctx, height) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*coretypes.ResultBlock) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *int64) error); ok { + r1 = rf(ctx, height) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RPCClient_Block_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Block' +type RPCClient_Block_Call struct { + *mock.Call +} + +// Block is a helper method to define mock.On call +// - ctx context.Context +// - height *int64 +func (_e *RPCClient_Expecter) Block(ctx interface{}, height interface{}) *RPCClient_Block_Call { + return &RPCClient_Block_Call{Call: _e.mock.On("Block", ctx, height)} +} + +func (_c *RPCClient_Block_Call) Run(run func(ctx context.Context, height *int64)) *RPCClient_Block_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*int64)) + }) + return _c +} + +func (_c *RPCClient_Block_Call) Return(_a0 *coretypes.ResultBlock, _a1 error) *RPCClient_Block_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +// BlockByHash provides a mock function with given fields: ctx, hash +func (_m *RPCClient) BlockByHash(ctx context.Context, hash []byte) (*coretypes.ResultBlock, error) { + ret := _m.Called(ctx, hash) + + var r0 *coretypes.ResultBlock + if rf, ok := ret.Get(0).(func(context.Context, []byte) *coretypes.ResultBlock); ok { + r0 = rf(ctx, hash) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*coretypes.ResultBlock) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, []byte) error); ok { + r1 = rf(ctx, hash) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RPCClient_BlockByHash_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockByHash' +type RPCClient_BlockByHash_Call struct { + *mock.Call +} + +// BlockByHash is a helper method to define mock.On call +// - ctx context.Context +// - hash []byte +func (_e *RPCClient_Expecter) BlockByHash(ctx interface{}, hash interface{}) *RPCClient_BlockByHash_Call { + return &RPCClient_BlockByHash_Call{Call: _e.mock.On("BlockByHash", ctx, hash)} +} + +func (_c *RPCClient_BlockByHash_Call) Run(run func(ctx context.Context, hash []byte)) *RPCClient_BlockByHash_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].([]byte)) + }) + return _c +} + +func (_c *RPCClient_BlockByHash_Call) Return(_a0 *coretypes.ResultBlock, _a1 error) *RPCClient_BlockByHash_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +// BlockResults provides a mock function with given fields: ctx, height +func (_m *RPCClient) BlockResults(ctx context.Context, height *int64) (*coretypes.ResultBlockResults, error) { + ret := _m.Called(ctx, height) + + var r0 *coretypes.ResultBlockResults + if rf, ok := ret.Get(0).(func(context.Context, *int64) *coretypes.ResultBlockResults); ok { + r0 = rf(ctx, height) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*coretypes.ResultBlockResults) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *int64) error); ok { + r1 = rf(ctx, height) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RPCClient_BlockResults_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockResults' +type RPCClient_BlockResults_Call struct { + *mock.Call +} + +// BlockResults is a helper method to define mock.On call +// - ctx context.Context +// - height *int64 +func (_e *RPCClient_Expecter) BlockResults(ctx interface{}, height interface{}) *RPCClient_BlockResults_Call { + return &RPCClient_BlockResults_Call{Call: _e.mock.On("BlockResults", ctx, height)} +} + +func (_c *RPCClient_BlockResults_Call) Run(run func(ctx context.Context, height *int64)) *RPCClient_BlockResults_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*int64)) + }) + return _c +} + +func (_c *RPCClient_BlockResults_Call) Return(_a0 *coretypes.ResultBlockResults, _a1 error) *RPCClient_BlockResults_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +// BlockSearch provides a mock function with given fields: ctx, query, page, perPage, orderBy +func (_m *RPCClient) BlockSearch(ctx context.Context, query string, page *int, perPage *int, orderBy string) (*coretypes.ResultBlockSearch, error) { + ret := _m.Called(ctx, query, page, perPage, orderBy) + + var r0 *coretypes.ResultBlockSearch + if rf, ok := ret.Get(0).(func(context.Context, string, *int, *int, string) *coretypes.ResultBlockSearch); ok { + r0 = rf(ctx, query, page, perPage, orderBy) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*coretypes.ResultBlockSearch) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, string, *int, *int, string) error); ok { + r1 = rf(ctx, query, page, perPage, orderBy) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RPCClient_BlockSearch_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockSearch' +type RPCClient_BlockSearch_Call struct { + *mock.Call +} + +// BlockSearch is a helper method to define mock.On call +// - ctx context.Context +// - query string +// - page *int +// - perPage *int +// - orderBy string +func (_e *RPCClient_Expecter) BlockSearch(ctx interface{}, query interface{}, page interface{}, perPage interface{}, orderBy interface{}) *RPCClient_BlockSearch_Call { + return &RPCClient_BlockSearch_Call{Call: _e.mock.On("BlockSearch", ctx, query, page, perPage, orderBy)} +} + +func (_c *RPCClient_BlockSearch_Call) Run(run func(ctx context.Context, query string, page *int, perPage *int, orderBy string)) *RPCClient_BlockSearch_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(string), args[2].(*int), args[3].(*int), args[4].(string)) + }) + return _c +} + +func (_c *RPCClient_BlockSearch_Call) Return(_a0 *coretypes.ResultBlockSearch, _a1 error) *RPCClient_BlockSearch_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +// BlockchainInfo provides a mock function with given fields: ctx, minHeight, maxHeight +func (_m *RPCClient) BlockchainInfo(ctx context.Context, minHeight int64, maxHeight int64) (*coretypes.ResultBlockchainInfo, error) { + ret := _m.Called(ctx, minHeight, maxHeight) + + var r0 *coretypes.ResultBlockchainInfo + if rf, ok := ret.Get(0).(func(context.Context, int64, int64) *coretypes.ResultBlockchainInfo); ok { + r0 = rf(ctx, minHeight, maxHeight) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*coretypes.ResultBlockchainInfo) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, int64, int64) error); ok { + r1 = rf(ctx, minHeight, maxHeight) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RPCClient_BlockchainInfo_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockchainInfo' +type RPCClient_BlockchainInfo_Call struct { + *mock.Call +} + +// BlockchainInfo is a helper method to define mock.On call +// - ctx context.Context +// - minHeight int64 +// - maxHeight int64 +func (_e *RPCClient_Expecter) BlockchainInfo(ctx interface{}, minHeight interface{}, maxHeight interface{}) *RPCClient_BlockchainInfo_Call { + return &RPCClient_BlockchainInfo_Call{Call: _e.mock.On("BlockchainInfo", ctx, minHeight, maxHeight)} +} + +func (_c *RPCClient_BlockchainInfo_Call) Run(run func(ctx context.Context, minHeight int64, maxHeight int64)) *RPCClient_BlockchainInfo_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(int64), args[2].(int64)) + }) + return _c +} + +func (_c *RPCClient_BlockchainInfo_Call) Return(_a0 *coretypes.ResultBlockchainInfo, _a1 error) *RPCClient_BlockchainInfo_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +// BroadcastEvidence provides a mock function with given fields: _a0, _a1 +func (_m *RPCClient) BroadcastEvidence(_a0 context.Context, _a1 types.Evidence) (*coretypes.ResultBroadcastEvidence, error) { + ret := _m.Called(_a0, _a1) + + var r0 *coretypes.ResultBroadcastEvidence + if rf, ok := ret.Get(0).(func(context.Context, types.Evidence) *coretypes.ResultBroadcastEvidence); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*coretypes.ResultBroadcastEvidence) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, types.Evidence) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RPCClient_BroadcastEvidence_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BroadcastEvidence' +type RPCClient_BroadcastEvidence_Call struct { + *mock.Call +} + +// BroadcastEvidence is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 types.Evidence +func (_e *RPCClient_Expecter) BroadcastEvidence(_a0 interface{}, _a1 interface{}) *RPCClient_BroadcastEvidence_Call { + return &RPCClient_BroadcastEvidence_Call{Call: _e.mock.On("BroadcastEvidence", _a0, _a1)} +} + +func (_c *RPCClient_BroadcastEvidence_Call) Run(run func(_a0 context.Context, _a1 types.Evidence)) *RPCClient_BroadcastEvidence_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(types.Evidence)) + }) + return _c +} + +func (_c *RPCClient_BroadcastEvidence_Call) Return(_a0 *coretypes.ResultBroadcastEvidence, _a1 error) *RPCClient_BroadcastEvidence_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +// BroadcastTxAsync provides a mock function with given fields: _a0, _a1 +func (_m *RPCClient) BroadcastTxAsync(_a0 context.Context, _a1 types.Tx) (*coretypes.ResultBroadcastTx, error) { + ret := _m.Called(_a0, _a1) + + var r0 *coretypes.ResultBroadcastTx + if rf, ok := ret.Get(0).(func(context.Context, types.Tx) *coretypes.ResultBroadcastTx); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*coretypes.ResultBroadcastTx) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, types.Tx) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RPCClient_BroadcastTxAsync_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BroadcastTxAsync' +type RPCClient_BroadcastTxAsync_Call struct { + *mock.Call +} + +// BroadcastTxAsync is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 types.Tx +func (_e *RPCClient_Expecter) BroadcastTxAsync(_a0 interface{}, _a1 interface{}) *RPCClient_BroadcastTxAsync_Call { + return &RPCClient_BroadcastTxAsync_Call{Call: _e.mock.On("BroadcastTxAsync", _a0, _a1)} +} + +func (_c *RPCClient_BroadcastTxAsync_Call) Run(run func(_a0 context.Context, _a1 types.Tx)) *RPCClient_BroadcastTxAsync_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(types.Tx)) + }) + return _c +} + +func (_c *RPCClient_BroadcastTxAsync_Call) Return(_a0 *coretypes.ResultBroadcastTx, _a1 error) *RPCClient_BroadcastTxAsync_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +// BroadcastTxCommit provides a mock function with given fields: _a0, _a1 +func (_m *RPCClient) BroadcastTxCommit(_a0 context.Context, _a1 types.Tx) (*coretypes.ResultBroadcastTxCommit, error) { + ret := _m.Called(_a0, _a1) + + var r0 *coretypes.ResultBroadcastTxCommit + if rf, ok := ret.Get(0).(func(context.Context, types.Tx) *coretypes.ResultBroadcastTxCommit); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*coretypes.ResultBroadcastTxCommit) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, types.Tx) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RPCClient_BroadcastTxCommit_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BroadcastTxCommit' +type RPCClient_BroadcastTxCommit_Call struct { + *mock.Call +} + +// BroadcastTxCommit is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 types.Tx +func (_e *RPCClient_Expecter) BroadcastTxCommit(_a0 interface{}, _a1 interface{}) *RPCClient_BroadcastTxCommit_Call { + return &RPCClient_BroadcastTxCommit_Call{Call: _e.mock.On("BroadcastTxCommit", _a0, _a1)} +} + +func (_c *RPCClient_BroadcastTxCommit_Call) Run(run func(_a0 context.Context, _a1 types.Tx)) *RPCClient_BroadcastTxCommit_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(types.Tx)) + }) + return _c +} + +func (_c *RPCClient_BroadcastTxCommit_Call) Return(_a0 *coretypes.ResultBroadcastTxCommit, _a1 error) *RPCClient_BroadcastTxCommit_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +// BroadcastTxSync provides a mock function with given fields: _a0, _a1 +func (_m *RPCClient) BroadcastTxSync(_a0 context.Context, _a1 types.Tx) (*coretypes.ResultBroadcastTx, error) { + ret := _m.Called(_a0, _a1) + + var r0 *coretypes.ResultBroadcastTx + if rf, ok := ret.Get(0).(func(context.Context, types.Tx) *coretypes.ResultBroadcastTx); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*coretypes.ResultBroadcastTx) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, types.Tx) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RPCClient_BroadcastTxSync_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BroadcastTxSync' +type RPCClient_BroadcastTxSync_Call struct { + *mock.Call +} + +// BroadcastTxSync is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 types.Tx +func (_e *RPCClient_Expecter) BroadcastTxSync(_a0 interface{}, _a1 interface{}) *RPCClient_BroadcastTxSync_Call { + return &RPCClient_BroadcastTxSync_Call{Call: _e.mock.On("BroadcastTxSync", _a0, _a1)} +} + +func (_c *RPCClient_BroadcastTxSync_Call) Run(run func(_a0 context.Context, _a1 types.Tx)) *RPCClient_BroadcastTxSync_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(types.Tx)) + }) + return _c +} + +func (_c *RPCClient_BroadcastTxSync_Call) Return(_a0 *coretypes.ResultBroadcastTx, _a1 error) *RPCClient_BroadcastTxSync_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +// CheckTx provides a mock function with given fields: _a0, _a1 +func (_m *RPCClient) CheckTx(_a0 context.Context, _a1 types.Tx) (*coretypes.ResultCheckTx, error) { + ret := _m.Called(_a0, _a1) + + var r0 *coretypes.ResultCheckTx + if rf, ok := ret.Get(0).(func(context.Context, types.Tx) *coretypes.ResultCheckTx); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*coretypes.ResultCheckTx) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, types.Tx) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RPCClient_CheckTx_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'CheckTx' +type RPCClient_CheckTx_Call struct { + *mock.Call +} + +// CheckTx is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 types.Tx +func (_e *RPCClient_Expecter) CheckTx(_a0 interface{}, _a1 interface{}) *RPCClient_CheckTx_Call { + return &RPCClient_CheckTx_Call{Call: _e.mock.On("CheckTx", _a0, _a1)} +} + +func (_c *RPCClient_CheckTx_Call) Run(run func(_a0 context.Context, _a1 types.Tx)) *RPCClient_CheckTx_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(types.Tx)) + }) + return _c +} + +func (_c *RPCClient_CheckTx_Call) Return(_a0 *coretypes.ResultCheckTx, _a1 error) *RPCClient_CheckTx_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +// Commit provides a mock function with given fields: ctx, height +func (_m *RPCClient) Commit(ctx context.Context, height *int64) (*coretypes.ResultCommit, error) { + ret := _m.Called(ctx, height) + + var r0 *coretypes.ResultCommit + if rf, ok := ret.Get(0).(func(context.Context, *int64) *coretypes.ResultCommit); ok { + r0 = rf(ctx, height) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*coretypes.ResultCommit) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *int64) error); ok { + r1 = rf(ctx, height) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RPCClient_Commit_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Commit' +type RPCClient_Commit_Call struct { + *mock.Call +} + +// Commit is a helper method to define mock.On call +// - ctx context.Context +// - height *int64 +func (_e *RPCClient_Expecter) Commit(ctx interface{}, height interface{}) *RPCClient_Commit_Call { + return &RPCClient_Commit_Call{Call: _e.mock.On("Commit", ctx, height)} +} + +func (_c *RPCClient_Commit_Call) Run(run func(ctx context.Context, height *int64)) *RPCClient_Commit_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*int64)) + }) + return _c +} + +func (_c *RPCClient_Commit_Call) Return(_a0 *coretypes.ResultCommit, _a1 error) *RPCClient_Commit_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +// ConsensusParams provides a mock function with given fields: ctx, height +func (_m *RPCClient) ConsensusParams(ctx context.Context, height *int64) (*coretypes.ResultConsensusParams, error) { + ret := _m.Called(ctx, height) + + var r0 *coretypes.ResultConsensusParams + if rf, ok := ret.Get(0).(func(context.Context, *int64) *coretypes.ResultConsensusParams); ok { + r0 = rf(ctx, height) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*coretypes.ResultConsensusParams) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *int64) error); ok { + r1 = rf(ctx, height) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RPCClient_ConsensusParams_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ConsensusParams' +type RPCClient_ConsensusParams_Call struct { + *mock.Call +} + +// ConsensusParams is a helper method to define mock.On call +// - ctx context.Context +// - height *int64 +func (_e *RPCClient_Expecter) ConsensusParams(ctx interface{}, height interface{}) *RPCClient_ConsensusParams_Call { + return &RPCClient_ConsensusParams_Call{Call: _e.mock.On("ConsensusParams", ctx, height)} +} + +func (_c *RPCClient_ConsensusParams_Call) Run(run func(ctx context.Context, height *int64)) *RPCClient_ConsensusParams_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*int64)) + }) + return _c +} + +func (_c *RPCClient_ConsensusParams_Call) Return(_a0 *coretypes.ResultConsensusParams, _a1 error) *RPCClient_ConsensusParams_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +// ConsensusState provides a mock function with given fields: _a0 +func (_m *RPCClient) ConsensusState(_a0 context.Context) (*coretypes.ResultConsensusState, error) { + ret := _m.Called(_a0) + + var r0 *coretypes.ResultConsensusState + if rf, ok := ret.Get(0).(func(context.Context) *coretypes.ResultConsensusState); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*coretypes.ResultConsensusState) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context) error); ok { + r1 = rf(_a0) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RPCClient_ConsensusState_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ConsensusState' +type RPCClient_ConsensusState_Call struct { + *mock.Call +} + +// ConsensusState is a helper method to define mock.On call +// - _a0 context.Context +func (_e *RPCClient_Expecter) ConsensusState(_a0 interface{}) *RPCClient_ConsensusState_Call { + return &RPCClient_ConsensusState_Call{Call: _e.mock.On("ConsensusState", _a0)} +} + +func (_c *RPCClient_ConsensusState_Call) Run(run func(_a0 context.Context)) *RPCClient_ConsensusState_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context)) + }) + return _c +} + +func (_c *RPCClient_ConsensusState_Call) Return(_a0 *coretypes.ResultConsensusState, _a1 error) *RPCClient_ConsensusState_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +// DumpConsensusState provides a mock function with given fields: _a0 +func (_m *RPCClient) DumpConsensusState(_a0 context.Context) (*coretypes.ResultDumpConsensusState, error) { + ret := _m.Called(_a0) + + var r0 *coretypes.ResultDumpConsensusState + if rf, ok := ret.Get(0).(func(context.Context) *coretypes.ResultDumpConsensusState); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*coretypes.ResultDumpConsensusState) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context) error); ok { + r1 = rf(_a0) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RPCClient_DumpConsensusState_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DumpConsensusState' +type RPCClient_DumpConsensusState_Call struct { + *mock.Call +} + +// DumpConsensusState is a helper method to define mock.On call +// - _a0 context.Context +func (_e *RPCClient_Expecter) DumpConsensusState(_a0 interface{}) *RPCClient_DumpConsensusState_Call { + return &RPCClient_DumpConsensusState_Call{Call: _e.mock.On("DumpConsensusState", _a0)} +} + +func (_c *RPCClient_DumpConsensusState_Call) Run(run func(_a0 context.Context)) *RPCClient_DumpConsensusState_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context)) + }) + return _c +} + +func (_c *RPCClient_DumpConsensusState_Call) Return(_a0 *coretypes.ResultDumpConsensusState, _a1 error) *RPCClient_DumpConsensusState_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +// Genesis provides a mock function with given fields: _a0 +func (_m *RPCClient) Genesis(_a0 context.Context) (*coretypes.ResultGenesis, error) { + ret := _m.Called(_a0) + + var r0 *coretypes.ResultGenesis + if rf, ok := ret.Get(0).(func(context.Context) *coretypes.ResultGenesis); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*coretypes.ResultGenesis) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context) error); ok { + r1 = rf(_a0) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RPCClient_Genesis_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Genesis' +type RPCClient_Genesis_Call struct { + *mock.Call +} + +// Genesis is a helper method to define mock.On call +// - _a0 context.Context +func (_e *RPCClient_Expecter) Genesis(_a0 interface{}) *RPCClient_Genesis_Call { + return &RPCClient_Genesis_Call{Call: _e.mock.On("Genesis", _a0)} +} + +func (_c *RPCClient_Genesis_Call) Run(run func(_a0 context.Context)) *RPCClient_Genesis_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context)) + }) + return _c +} + +func (_c *RPCClient_Genesis_Call) Return(_a0 *coretypes.ResultGenesis, _a1 error) *RPCClient_Genesis_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +// GenesisChunked provides a mock function with given fields: _a0, _a1 +func (_m *RPCClient) GenesisChunked(_a0 context.Context, _a1 uint) (*coretypes.ResultGenesisChunk, error) { + ret := _m.Called(_a0, _a1) + + var r0 *coretypes.ResultGenesisChunk + if rf, ok := ret.Get(0).(func(context.Context, uint) *coretypes.ResultGenesisChunk); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*coretypes.ResultGenesisChunk) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, uint) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RPCClient_GenesisChunked_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GenesisChunked' +type RPCClient_GenesisChunked_Call struct { + *mock.Call +} + +// GenesisChunked is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 uint +func (_e *RPCClient_Expecter) GenesisChunked(_a0 interface{}, _a1 interface{}) *RPCClient_GenesisChunked_Call { + return &RPCClient_GenesisChunked_Call{Call: _e.mock.On("GenesisChunked", _a0, _a1)} +} + +func (_c *RPCClient_GenesisChunked_Call) Run(run func(_a0 context.Context, _a1 uint)) *RPCClient_GenesisChunked_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(uint)) + }) + return _c +} + +func (_c *RPCClient_GenesisChunked_Call) Return(_a0 *coretypes.ResultGenesisChunk, _a1 error) *RPCClient_GenesisChunked_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +// Health provides a mock function with given fields: _a0 +func (_m *RPCClient) Health(_a0 context.Context) (*coretypes.ResultHealth, error) { + ret := _m.Called(_a0) + + var r0 *coretypes.ResultHealth + if rf, ok := ret.Get(0).(func(context.Context) *coretypes.ResultHealth); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*coretypes.ResultHealth) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context) error); ok { + r1 = rf(_a0) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RPCClient_Health_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Health' +type RPCClient_Health_Call struct { + *mock.Call +} + +// Health is a helper method to define mock.On call +// - _a0 context.Context +func (_e *RPCClient_Expecter) Health(_a0 interface{}) *RPCClient_Health_Call { + return &RPCClient_Health_Call{Call: _e.mock.On("Health", _a0)} +} + +func (_c *RPCClient_Health_Call) Run(run func(_a0 context.Context)) *RPCClient_Health_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context)) + }) + return _c +} + +func (_c *RPCClient_Health_Call) Return(_a0 *coretypes.ResultHealth, _a1 error) *RPCClient_Health_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +// IsRunning provides a mock function with given fields: +func (_m *RPCClient) IsRunning() bool { + ret := _m.Called() + + var r0 bool + if rf, ok := ret.Get(0).(func() bool); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(bool) + } + + return r0 +} + +// RPCClient_IsRunning_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'IsRunning' +type RPCClient_IsRunning_Call struct { + *mock.Call +} + +// IsRunning is a helper method to define mock.On call +func (_e *RPCClient_Expecter) IsRunning() *RPCClient_IsRunning_Call { + return &RPCClient_IsRunning_Call{Call: _e.mock.On("IsRunning")} +} + +func (_c *RPCClient_IsRunning_Call) Run(run func()) *RPCClient_IsRunning_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *RPCClient_IsRunning_Call) Return(_a0 bool) *RPCClient_IsRunning_Call { + _c.Call.Return(_a0) + return _c +} + +// NetInfo provides a mock function with given fields: _a0 +func (_m *RPCClient) NetInfo(_a0 context.Context) (*coretypes.ResultNetInfo, error) { + ret := _m.Called(_a0) + + var r0 *coretypes.ResultNetInfo + if rf, ok := ret.Get(0).(func(context.Context) *coretypes.ResultNetInfo); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*coretypes.ResultNetInfo) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context) error); ok { + r1 = rf(_a0) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RPCClient_NetInfo_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'NetInfo' +type RPCClient_NetInfo_Call struct { + *mock.Call +} + +// NetInfo is a helper method to define mock.On call +// - _a0 context.Context +func (_e *RPCClient_Expecter) NetInfo(_a0 interface{}) *RPCClient_NetInfo_Call { + return &RPCClient_NetInfo_Call{Call: _e.mock.On("NetInfo", _a0)} +} + +func (_c *RPCClient_NetInfo_Call) Run(run func(_a0 context.Context)) *RPCClient_NetInfo_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context)) + }) + return _c +} + +func (_c *RPCClient_NetInfo_Call) Return(_a0 *coretypes.ResultNetInfo, _a1 error) *RPCClient_NetInfo_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +// NumUnconfirmedTxs provides a mock function with given fields: _a0 +func (_m *RPCClient) NumUnconfirmedTxs(_a0 context.Context) (*coretypes.ResultUnconfirmedTxs, error) { + ret := _m.Called(_a0) + + var r0 *coretypes.ResultUnconfirmedTxs + if rf, ok := ret.Get(0).(func(context.Context) *coretypes.ResultUnconfirmedTxs); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*coretypes.ResultUnconfirmedTxs) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context) error); ok { + r1 = rf(_a0) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RPCClient_NumUnconfirmedTxs_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'NumUnconfirmedTxs' +type RPCClient_NumUnconfirmedTxs_Call struct { + *mock.Call +} + +// NumUnconfirmedTxs is a helper method to define mock.On call +// - _a0 context.Context +func (_e *RPCClient_Expecter) NumUnconfirmedTxs(_a0 interface{}) *RPCClient_NumUnconfirmedTxs_Call { + return &RPCClient_NumUnconfirmedTxs_Call{Call: _e.mock.On("NumUnconfirmedTxs", _a0)} +} + +func (_c *RPCClient_NumUnconfirmedTxs_Call) Run(run func(_a0 context.Context)) *RPCClient_NumUnconfirmedTxs_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context)) + }) + return _c +} + +func (_c *RPCClient_NumUnconfirmedTxs_Call) Return(_a0 *coretypes.ResultUnconfirmedTxs, _a1 error) *RPCClient_NumUnconfirmedTxs_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +// OnReset provides a mock function with given fields: +func (_m *RPCClient) OnReset() error { + ret := _m.Called() + + var r0 error + if rf, ok := ret.Get(0).(func() error); ok { + r0 = rf() + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// RPCClient_OnReset_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'OnReset' +type RPCClient_OnReset_Call struct { + *mock.Call +} + +// OnReset is a helper method to define mock.On call +func (_e *RPCClient_Expecter) OnReset() *RPCClient_OnReset_Call { + return &RPCClient_OnReset_Call{Call: _e.mock.On("OnReset")} +} + +func (_c *RPCClient_OnReset_Call) Run(run func()) *RPCClient_OnReset_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *RPCClient_OnReset_Call) Return(_a0 error) *RPCClient_OnReset_Call { + _c.Call.Return(_a0) + return _c +} + +// OnStart provides a mock function with given fields: +func (_m *RPCClient) OnStart() error { + ret := _m.Called() + + var r0 error + if rf, ok := ret.Get(0).(func() error); ok { + r0 = rf() + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// RPCClient_OnStart_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'OnStart' +type RPCClient_OnStart_Call struct { + *mock.Call +} + +// OnStart is a helper method to define mock.On call +func (_e *RPCClient_Expecter) OnStart() *RPCClient_OnStart_Call { + return &RPCClient_OnStart_Call{Call: _e.mock.On("OnStart")} +} + +func (_c *RPCClient_OnStart_Call) Run(run func()) *RPCClient_OnStart_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *RPCClient_OnStart_Call) Return(_a0 error) *RPCClient_OnStart_Call { + _c.Call.Return(_a0) + return _c +} + +// OnStop provides a mock function with given fields: +func (_m *RPCClient) OnStop() { + _m.Called() +} + +// RPCClient_OnStop_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'OnStop' +type RPCClient_OnStop_Call struct { + *mock.Call +} + +// OnStop is a helper method to define mock.On call +func (_e *RPCClient_Expecter) OnStop() *RPCClient_OnStop_Call { + return &RPCClient_OnStop_Call{Call: _e.mock.On("OnStop")} +} + +func (_c *RPCClient_OnStop_Call) Run(run func()) *RPCClient_OnStop_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *RPCClient_OnStop_Call) Return() *RPCClient_OnStop_Call { + _c.Call.Return() + return _c +} + +// Quit provides a mock function with given fields: +func (_m *RPCClient) Quit() <-chan struct{} { + ret := _m.Called() + + var r0 <-chan struct{} + if rf, ok := ret.Get(0).(func() <-chan struct{}); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(<-chan struct{}) + } + } + + return r0 +} + +// RPCClient_Quit_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Quit' +type RPCClient_Quit_Call struct { + *mock.Call +} + +// Quit is a helper method to define mock.On call +func (_e *RPCClient_Expecter) Quit() *RPCClient_Quit_Call { + return &RPCClient_Quit_Call{Call: _e.mock.On("Quit")} +} + +func (_c *RPCClient_Quit_Call) Run(run func()) *RPCClient_Quit_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *RPCClient_Quit_Call) Return(_a0 <-chan struct{}) *RPCClient_Quit_Call { + _c.Call.Return(_a0) + return _c +} + +// Reset provides a mock function with given fields: +func (_m *RPCClient) Reset() error { + ret := _m.Called() + + var r0 error + if rf, ok := ret.Get(0).(func() error); ok { + r0 = rf() + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// RPCClient_Reset_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Reset' +type RPCClient_Reset_Call struct { + *mock.Call +} + +// Reset is a helper method to define mock.On call +func (_e *RPCClient_Expecter) Reset() *RPCClient_Reset_Call { + return &RPCClient_Reset_Call{Call: _e.mock.On("Reset")} +} + +func (_c *RPCClient_Reset_Call) Run(run func()) *RPCClient_Reset_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *RPCClient_Reset_Call) Return(_a0 error) *RPCClient_Reset_Call { + _c.Call.Return(_a0) + return _c +} + +// SetLogger provides a mock function with given fields: _a0 +func (_m *RPCClient) SetLogger(_a0 log.Logger) { + _m.Called(_a0) +} + +// RPCClient_SetLogger_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetLogger' +type RPCClient_SetLogger_Call struct { + *mock.Call +} + +// SetLogger is a helper method to define mock.On call +// - _a0 log.Logger +func (_e *RPCClient_Expecter) SetLogger(_a0 interface{}) *RPCClient_SetLogger_Call { + return &RPCClient_SetLogger_Call{Call: _e.mock.On("SetLogger", _a0)} +} + +func (_c *RPCClient_SetLogger_Call) Run(run func(_a0 log.Logger)) *RPCClient_SetLogger_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(log.Logger)) + }) + return _c +} + +func (_c *RPCClient_SetLogger_Call) Return() *RPCClient_SetLogger_Call { + _c.Call.Return() + return _c +} + +// Start provides a mock function with given fields: +func (_m *RPCClient) Start() error { + ret := _m.Called() + + var r0 error + if rf, ok := ret.Get(0).(func() error); ok { + r0 = rf() + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// RPCClient_Start_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Start' +type RPCClient_Start_Call struct { + *mock.Call +} + +// Start is a helper method to define mock.On call +func (_e *RPCClient_Expecter) Start() *RPCClient_Start_Call { + return &RPCClient_Start_Call{Call: _e.mock.On("Start")} +} + +func (_c *RPCClient_Start_Call) Run(run func()) *RPCClient_Start_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *RPCClient_Start_Call) Return(_a0 error) *RPCClient_Start_Call { + _c.Call.Return(_a0) + return _c +} + +// Status provides a mock function with given fields: _a0 +func (_m *RPCClient) Status(_a0 context.Context) (*coretypes.ResultStatus, error) { + ret := _m.Called(_a0) + + var r0 *coretypes.ResultStatus + if rf, ok := ret.Get(0).(func(context.Context) *coretypes.ResultStatus); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*coretypes.ResultStatus) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context) error); ok { + r1 = rf(_a0) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RPCClient_Status_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Status' +type RPCClient_Status_Call struct { + *mock.Call +} + +// Status is a helper method to define mock.On call +// - _a0 context.Context +func (_e *RPCClient_Expecter) Status(_a0 interface{}) *RPCClient_Status_Call { + return &RPCClient_Status_Call{Call: _e.mock.On("Status", _a0)} +} + +func (_c *RPCClient_Status_Call) Run(run func(_a0 context.Context)) *RPCClient_Status_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context)) + }) + return _c +} + +func (_c *RPCClient_Status_Call) Return(_a0 *coretypes.ResultStatus, _a1 error) *RPCClient_Status_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +// Stop provides a mock function with given fields: +func (_m *RPCClient) Stop() error { + ret := _m.Called() + + var r0 error + if rf, ok := ret.Get(0).(func() error); ok { + r0 = rf() + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// RPCClient_Stop_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Stop' +type RPCClient_Stop_Call struct { + *mock.Call +} + +// Stop is a helper method to define mock.On call +func (_e *RPCClient_Expecter) Stop() *RPCClient_Stop_Call { + return &RPCClient_Stop_Call{Call: _e.mock.On("Stop")} +} + +func (_c *RPCClient_Stop_Call) Run(run func()) *RPCClient_Stop_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *RPCClient_Stop_Call) Return(_a0 error) *RPCClient_Stop_Call { + _c.Call.Return(_a0) + return _c +} + +// String provides a mock function with given fields: +func (_m *RPCClient) String() string { + ret := _m.Called() + + var r0 string + if rf, ok := ret.Get(0).(func() string); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(string) + } + + return r0 +} + +// RPCClient_String_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'String' +type RPCClient_String_Call struct { + *mock.Call +} + +// String is a helper method to define mock.On call +func (_e *RPCClient_Expecter) String() *RPCClient_String_Call { + return &RPCClient_String_Call{Call: _e.mock.On("String")} +} + +func (_c *RPCClient_String_Call) Run(run func()) *RPCClient_String_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *RPCClient_String_Call) Return(_a0 string) *RPCClient_String_Call { + _c.Call.Return(_a0) + return _c +} + +// Subscribe provides a mock function with given fields: ctx, subscriber, query, outCapacity +func (_m *RPCClient) Subscribe(ctx context.Context, subscriber string, query string, outCapacity ...int) (<-chan coretypes.ResultEvent, error) { + _va := make([]interface{}, len(outCapacity)) + for _i := range outCapacity { + _va[_i] = outCapacity[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, subscriber, query) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 <-chan coretypes.ResultEvent + if rf, ok := ret.Get(0).(func(context.Context, string, string, ...int) <-chan coretypes.ResultEvent); ok { + r0 = rf(ctx, subscriber, query, outCapacity...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(<-chan coretypes.ResultEvent) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, string, string, ...int) error); ok { + r1 = rf(ctx, subscriber, query, outCapacity...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RPCClient_Subscribe_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Subscribe' +type RPCClient_Subscribe_Call struct { + *mock.Call +} + +// Subscribe is a helper method to define mock.On call +// - ctx context.Context +// - subscriber string +// - query string +// - outCapacity ...int +func (_e *RPCClient_Expecter) Subscribe(ctx interface{}, subscriber interface{}, query interface{}, outCapacity ...interface{}) *RPCClient_Subscribe_Call { + return &RPCClient_Subscribe_Call{Call: _e.mock.On("Subscribe", + append([]interface{}{ctx, subscriber, query}, outCapacity...)...)} +} + +func (_c *RPCClient_Subscribe_Call) Run(run func(ctx context.Context, subscriber string, query string, outCapacity ...int)) *RPCClient_Subscribe_Call { + _c.Call.Run(func(args mock.Arguments) { + variadicArgs := make([]int, len(args)-3) + for i, a := range args[3:] { + if a != nil { + variadicArgs[i] = a.(int) + } + } + run(args[0].(context.Context), args[1].(string), args[2].(string), variadicArgs...) + }) + return _c +} + +func (_c *RPCClient_Subscribe_Call) Return(out <-chan coretypes.ResultEvent, err error) *RPCClient_Subscribe_Call { + _c.Call.Return(out, err) + return _c +} + +// Tx provides a mock function with given fields: ctx, hash, prove +func (_m *RPCClient) Tx(ctx context.Context, hash []byte, prove bool) (*coretypes.ResultTx, error) { + ret := _m.Called(ctx, hash, prove) + + var r0 *coretypes.ResultTx + if rf, ok := ret.Get(0).(func(context.Context, []byte, bool) *coretypes.ResultTx); ok { + r0 = rf(ctx, hash, prove) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*coretypes.ResultTx) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, []byte, bool) error); ok { + r1 = rf(ctx, hash, prove) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RPCClient_Tx_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Tx' +type RPCClient_Tx_Call struct { + *mock.Call +} + +// Tx is a helper method to define mock.On call +// - ctx context.Context +// - hash []byte +// - prove bool +func (_e *RPCClient_Expecter) Tx(ctx interface{}, hash interface{}, prove interface{}) *RPCClient_Tx_Call { + return &RPCClient_Tx_Call{Call: _e.mock.On("Tx", ctx, hash, prove)} +} + +func (_c *RPCClient_Tx_Call) Run(run func(ctx context.Context, hash []byte, prove bool)) *RPCClient_Tx_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].([]byte), args[2].(bool)) + }) + return _c +} + +func (_c *RPCClient_Tx_Call) Return(_a0 *coretypes.ResultTx, _a1 error) *RPCClient_Tx_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +// TxSearch provides a mock function with given fields: ctx, query, prove, page, perPage, orderBy +func (_m *RPCClient) TxSearch(ctx context.Context, query string, prove bool, page *int, perPage *int, orderBy string) (*coretypes.ResultTxSearch, error) { + ret := _m.Called(ctx, query, prove, page, perPage, orderBy) + + var r0 *coretypes.ResultTxSearch + if rf, ok := ret.Get(0).(func(context.Context, string, bool, *int, *int, string) *coretypes.ResultTxSearch); ok { + r0 = rf(ctx, query, prove, page, perPage, orderBy) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*coretypes.ResultTxSearch) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, string, bool, *int, *int, string) error); ok { + r1 = rf(ctx, query, prove, page, perPage, orderBy) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RPCClient_TxSearch_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'TxSearch' +type RPCClient_TxSearch_Call struct { + *mock.Call +} + +// TxSearch is a helper method to define mock.On call +// - ctx context.Context +// - query string +// - prove bool +// - page *int +// - perPage *int +// - orderBy string +func (_e *RPCClient_Expecter) TxSearch(ctx interface{}, query interface{}, prove interface{}, page interface{}, perPage interface{}, orderBy interface{}) *RPCClient_TxSearch_Call { + return &RPCClient_TxSearch_Call{Call: _e.mock.On("TxSearch", ctx, query, prove, page, perPage, orderBy)} +} + +func (_c *RPCClient_TxSearch_Call) Run(run func(ctx context.Context, query string, prove bool, page *int, perPage *int, orderBy string)) *RPCClient_TxSearch_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(string), args[2].(bool), args[3].(*int), args[4].(*int), args[5].(string)) + }) + return _c +} + +func (_c *RPCClient_TxSearch_Call) Return(_a0 *coretypes.ResultTxSearch, _a1 error) *RPCClient_TxSearch_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +// UnconfirmedTxs provides a mock function with given fields: ctx, limit +func (_m *RPCClient) UnconfirmedTxs(ctx context.Context, limit *int) (*coretypes.ResultUnconfirmedTxs, error) { + ret := _m.Called(ctx, limit) + + var r0 *coretypes.ResultUnconfirmedTxs + if rf, ok := ret.Get(0).(func(context.Context, *int) *coretypes.ResultUnconfirmedTxs); ok { + r0 = rf(ctx, limit) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*coretypes.ResultUnconfirmedTxs) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *int) error); ok { + r1 = rf(ctx, limit) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RPCClient_UnconfirmedTxs_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'UnconfirmedTxs' +type RPCClient_UnconfirmedTxs_Call struct { + *mock.Call +} + +// UnconfirmedTxs is a helper method to define mock.On call +// - ctx context.Context +// - limit *int +func (_e *RPCClient_Expecter) UnconfirmedTxs(ctx interface{}, limit interface{}) *RPCClient_UnconfirmedTxs_Call { + return &RPCClient_UnconfirmedTxs_Call{Call: _e.mock.On("UnconfirmedTxs", ctx, limit)} +} + +func (_c *RPCClient_UnconfirmedTxs_Call) Run(run func(ctx context.Context, limit *int)) *RPCClient_UnconfirmedTxs_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*int)) + }) + return _c +} + +func (_c *RPCClient_UnconfirmedTxs_Call) Return(_a0 *coretypes.ResultUnconfirmedTxs, _a1 error) *RPCClient_UnconfirmedTxs_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +// Unsubscribe provides a mock function with given fields: ctx, subscriber, query +func (_m *RPCClient) Unsubscribe(ctx context.Context, subscriber string, query string) error { + ret := _m.Called(ctx, subscriber, query) + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, string, string) error); ok { + r0 = rf(ctx, subscriber, query) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// RPCClient_Unsubscribe_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Unsubscribe' +type RPCClient_Unsubscribe_Call struct { + *mock.Call +} + +// Unsubscribe is a helper method to define mock.On call +// - ctx context.Context +// - subscriber string +// - query string +func (_e *RPCClient_Expecter) Unsubscribe(ctx interface{}, subscriber interface{}, query interface{}) *RPCClient_Unsubscribe_Call { + return &RPCClient_Unsubscribe_Call{Call: _e.mock.On("Unsubscribe", ctx, subscriber, query)} +} + +func (_c *RPCClient_Unsubscribe_Call) Run(run func(ctx context.Context, subscriber string, query string)) *RPCClient_Unsubscribe_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(string), args[2].(string)) + }) + return _c +} + +func (_c *RPCClient_Unsubscribe_Call) Return(_a0 error) *RPCClient_Unsubscribe_Call { + _c.Call.Return(_a0) + return _c +} + +// UnsubscribeAll provides a mock function with given fields: ctx, subscriber +func (_m *RPCClient) UnsubscribeAll(ctx context.Context, subscriber string) error { + ret := _m.Called(ctx, subscriber) + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, string) error); ok { + r0 = rf(ctx, subscriber) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// RPCClient_UnsubscribeAll_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'UnsubscribeAll' +type RPCClient_UnsubscribeAll_Call struct { + *mock.Call +} + +// UnsubscribeAll is a helper method to define mock.On call +// - ctx context.Context +// - subscriber string +func (_e *RPCClient_Expecter) UnsubscribeAll(ctx interface{}, subscriber interface{}) *RPCClient_UnsubscribeAll_Call { + return &RPCClient_UnsubscribeAll_Call{Call: _e.mock.On("UnsubscribeAll", ctx, subscriber)} +} + +func (_c *RPCClient_UnsubscribeAll_Call) Run(run func(ctx context.Context, subscriber string)) *RPCClient_UnsubscribeAll_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(string)) + }) + return _c +} + +func (_c *RPCClient_UnsubscribeAll_Call) Return(_a0 error) *RPCClient_UnsubscribeAll_Call { + _c.Call.Return(_a0) + return _c +} + +// Validators provides a mock function with given fields: ctx, height, page, perPage +func (_m *RPCClient) Validators(ctx context.Context, height *int64, page *int, perPage *int) (*coretypes.ResultValidators, error) { + ret := _m.Called(ctx, height, page, perPage) + + var r0 *coretypes.ResultValidators + if rf, ok := ret.Get(0).(func(context.Context, *int64, *int, *int) *coretypes.ResultValidators); ok { + r0 = rf(ctx, height, page, perPage) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*coretypes.ResultValidators) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *int64, *int, *int) error); ok { + r1 = rf(ctx, height, page, perPage) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RPCClient_Validators_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Validators' +type RPCClient_Validators_Call struct { + *mock.Call +} + +// Validators is a helper method to define mock.On call +// - ctx context.Context +// - height *int64 +// - page *int +// - perPage *int +func (_e *RPCClient_Expecter) Validators(ctx interface{}, height interface{}, page interface{}, perPage interface{}) *RPCClient_Validators_Call { + return &RPCClient_Validators_Call{Call: _e.mock.On("Validators", ctx, height, page, perPage)} +} + +func (_c *RPCClient_Validators_Call) Run(run func(ctx context.Context, height *int64, page *int, perPage *int)) *RPCClient_Validators_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*int64), args[2].(*int), args[3].(*int)) + }) + return _c +} + +func (_c *RPCClient_Validators_Call) Return(_a0 *coretypes.ResultValidators, _a1 error) *RPCClient_Validators_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +type mockConstructorTestingTNewRPCClient interface { + mock.TestingT + Cleanup(func()) +} + +// NewRPCClient creates a new instance of RPCClient. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +func NewRPCClient(t mockConstructorTestingTNewRPCClient) *RPCClient { + mock := &RPCClient{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/ignite/pkg/cosmosclient/rpc.go b/ignite/pkg/cosmosclient/rpc.go new file mode 100644 index 0000000000..1658f83f36 --- /dev/null +++ b/ignite/pkg/cosmosclient/rpc.go @@ -0,0 +1,155 @@ +package cosmosclient + +import ( + "context" + + "github.com/pkg/errors" + "github.com/tendermint/tendermint/libs/bytes" + rpcclient "github.com/tendermint/tendermint/rpc/client" + ctypes "github.com/tendermint/tendermint/rpc/core/types" + "github.com/tendermint/tendermint/types" +) + +// rpcWrapper is a rpclient.Client but with more contextualized errors. +// Useful because the original implementation may return JSON errors when the +// requested node is busy, which is confusing for the user. With rpcWrapper, +// the error is prefixed with 'error while requesting node xxx: JSON error'. +// TODO(tb): we may remove this wrapper once https://github.com/tendermint/tendermint/issues/9312 is fixed. +type rpcWrapper struct { + rpcclient.Client + nodeAddress string +} + +func rpcError(node string, err error) error { + return errors.Wrapf(err, "error while requesting node '%s'", node) +} + +func (rpc rpcWrapper) ABCIInfo(ctx context.Context) (*ctypes.ResultABCIInfo, error) { + res, err := rpc.Client.ABCIInfo(ctx) + return res, rpcError(rpc.nodeAddress, err) +} + +func (rpc rpcWrapper) ABCIQuery(ctx context.Context, path string, data bytes.HexBytes) (*ctypes.ResultABCIQuery, error) { + res, err := rpc.Client.ABCIQuery(ctx, path, data) + return res, rpcError(rpc.nodeAddress, err) +} + +func (rpc rpcWrapper) ABCIQueryWithOptions(ctx context.Context, path string, data bytes.HexBytes, opts rpcclient.ABCIQueryOptions) (*ctypes.ResultABCIQuery, error) { + res, err := rpc.Client.ABCIQueryWithOptions(ctx, path, data, opts) + return res, rpcError(rpc.nodeAddress, err) +} + +func (rpc rpcWrapper) BroadcastTxCommit(ctx context.Context, tx types.Tx) (*ctypes.ResultBroadcastTxCommit, error) { + res, err := rpc.Client.BroadcastTxCommit(ctx, tx) + return res, rpcError(rpc.nodeAddress, err) +} + +func (rpc rpcWrapper) BroadcastTxAsync(ctx context.Context, tx types.Tx) (*ctypes.ResultBroadcastTx, error) { + res, err := rpc.Client.BroadcastTxAsync(ctx, tx) + return res, rpcError(rpc.nodeAddress, err) +} + +func (rpc rpcWrapper) BroadcastTxSync(ctx context.Context, tx types.Tx) (*ctypes.ResultBroadcastTx, error) { + res, err := rpc.Client.BroadcastTxSync(ctx, tx) + return res, rpcError(rpc.nodeAddress, err) +} + +func (rpc rpcWrapper) GenesisChunked(ctx context.Context, n uint) (*ctypes.ResultGenesisChunk, error) { + res, err := rpc.Client.GenesisChunked(ctx, n) + return res, rpcError(rpc.nodeAddress, err) +} + +func (rpc rpcWrapper) BlockchainInfo(ctx context.Context, minHeight int64, maxHeight int64) (*ctypes.ResultBlockchainInfo, error) { + res, err := rpc.Client.BlockchainInfo(ctx, minHeight, maxHeight) + return res, rpcError(rpc.nodeAddress, err) +} + +func (rpc rpcWrapper) NetInfo(ctx context.Context) (*ctypes.ResultNetInfo, error) { + res, err := rpc.Client.NetInfo(ctx) + return res, rpcError(rpc.nodeAddress, err) +} + +func (rpc rpcWrapper) DumpConsensusState(ctx context.Context) (*ctypes.ResultDumpConsensusState, error) { + res, err := rpc.Client.DumpConsensusState(ctx) + return res, rpcError(rpc.nodeAddress, err) +} + +func (rpc rpcWrapper) ConsensusState(ctx context.Context) (*ctypes.ResultConsensusState, error) { + res, err := rpc.Client.ConsensusState(ctx) + return res, rpcError(rpc.nodeAddress, err) +} + +func (rpc rpcWrapper) ConsensusParams(ctx context.Context, height *int64) (*ctypes.ResultConsensusParams, error) { + res, err := rpc.Client.ConsensusParams(ctx, height) + return res, rpcError(rpc.nodeAddress, err) +} + +func (rpc rpcWrapper) Health(ctx context.Context) (*ctypes.ResultHealth, error) { + res, err := rpc.Client.Health(ctx) + return res, rpcError(rpc.nodeAddress, err) +} + +func (rpc rpcWrapper) Block(ctx context.Context, height *int64) (*ctypes.ResultBlock, error) { + res, err := rpc.Client.Block(ctx, height) + return res, rpcError(rpc.nodeAddress, err) +} + +func (rpc rpcWrapper) BlockByHash(ctx context.Context, hash []byte) (*ctypes.ResultBlock, error) { + res, err := rpc.Client.BlockByHash(ctx, hash) + return res, rpcError(rpc.nodeAddress, err) +} + +func (rpc rpcWrapper) BlockResults(ctx context.Context, height *int64) (*ctypes.ResultBlockResults, error) { + res, err := rpc.Client.BlockResults(ctx, height) + return res, rpcError(rpc.nodeAddress, err) +} + +func (rpc rpcWrapper) Commit(ctx context.Context, height *int64) (*ctypes.ResultCommit, error) { + res, err := rpc.Client.Commit(ctx, height) + return res, rpcError(rpc.nodeAddress, err) +} + +func (rpc rpcWrapper) Validators(ctx context.Context, height *int64, page *int, perPage *int) (*ctypes.ResultValidators, error) { + res, err := rpc.Client.Validators(ctx, height, page, perPage) + return res, rpcError(rpc.nodeAddress, err) +} + +func (rpc rpcWrapper) Tx(ctx context.Context, hash []byte, prove bool) (*ctypes.ResultTx, error) { + res, err := rpc.Client.Tx(ctx, hash, prove) + return res, rpcError(rpc.nodeAddress, err) +} + +func (rpc rpcWrapper) TxSearch(ctx context.Context, query string, prove bool, page *int, perPage *int, orderBy string) (*ctypes.ResultTxSearch, error) { + res, err := rpc.Client.TxSearch(ctx, query, prove, page, perPage, orderBy) + return res, rpcError(rpc.nodeAddress, err) +} + +func (rpc rpcWrapper) BlockSearch(ctx context.Context, query string, page *int, perPage *int, orderBy string) (*ctypes.ResultBlockSearch, error) { + res, err := rpc.Client.BlockSearch(ctx, query, page, perPage, orderBy) + return res, rpcError(rpc.nodeAddress, err) +} + +func (rpc rpcWrapper) Status(ctx context.Context) (*ctypes.ResultStatus, error) { + res, err := rpc.Client.Status(ctx) + return res, rpcError(rpc.nodeAddress, err) +} + +func (rpc rpcWrapper) BroadcastEvidence(ctx context.Context, e types.Evidence) (*ctypes.ResultBroadcastEvidence, error) { + res, err := rpc.Client.BroadcastEvidence(ctx, e) + return res, rpcError(rpc.nodeAddress, err) +} + +func (rpc rpcWrapper) UnconfirmedTxs(ctx context.Context, limit *int) (*ctypes.ResultUnconfirmedTxs, error) { + res, err := rpc.Client.UnconfirmedTxs(ctx, limit) + return res, rpcError(rpc.nodeAddress, err) +} + +func (rpc rpcWrapper) NumUnconfirmedTxs(ctx context.Context) (*ctypes.ResultUnconfirmedTxs, error) { + res, err := rpc.Client.NumUnconfirmedTxs(ctx) + return res, rpcError(rpc.nodeAddress, err) +} + +func (rpc rpcWrapper) CheckTx(ctx context.Context, tx types.Tx) (*ctypes.ResultCheckTx, error) { + res, err := rpc.Client.CheckTx(ctx, tx) + return res, rpcError(rpc.nodeAddress, err) +} diff --git a/ignite/pkg/cosmosclient/txservice.go b/ignite/pkg/cosmosclient/txservice.go new file mode 100644 index 0000000000..16fb3e04dd --- /dev/null +++ b/ignite/pkg/cosmosclient/txservice.go @@ -0,0 +1,65 @@ +package cosmosclient + +import ( + "context" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/tx" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" +) + +type TxService struct { + client Client + clientContext client.Context + txBuilder client.TxBuilder + txFactory tx.Factory +} + +// Gas is gas decided to use for this tx. +// either calculated or configured by the caller. +func (s TxService) Gas() uint64 { + return s.txBuilder.GetTx().GetGas() +} + +// Broadcast signs and broadcasts this tx. +func (s TxService) Broadcast() (Response, error) { + defer s.client.lockBech32Prefix()() + + accountName := s.clientContext.GetFromName() + accountAddress := s.clientContext.GetFromAddress() + + // validate msgs. + for _, msg := range s.txBuilder.GetTx().GetMsgs() { + if err := msg.ValidateBasic(); err != nil { + return Response{}, err + } + } + + if err := tx.Sign(s.txFactory, accountName, s.txBuilder, true); err != nil { + return Response{}, err + } + + txBytes, err := s.clientContext.TxConfig.TxEncoder()(s.txBuilder.GetTx()) + if err != nil { + return Response{}, err + } + + resp, err := s.clientContext.BroadcastTx(txBytes) + if err == sdkerrors.ErrInsufficientFunds { + err = s.client.makeSureAccountHasTokens(context.Background(), accountAddress.String()) + if err != nil { + return Response{}, err + } + resp, err = s.clientContext.BroadcastTx(txBytes) + } + + return Response{ + Codec: s.clientContext.Codec, + TxResponse: resp, + }, handleBroadcastResult(resp, err) +} + +// EncodeJSON encodes the transaction as a json string +func (s TxService) EncodeJSON() ([]byte, error) { + return s.client.context.TxConfig.TxJSONEncoder()(s.txBuilder.GetTx()) +} diff --git a/ignite/pkg/cosmoscmd/genaccounts.go b/ignite/pkg/cosmoscmd/genaccounts.go index 52918ff58c..0589637c11 100644 --- a/ignite/pkg/cosmoscmd/genaccounts.go +++ b/ignite/pkg/cosmoscmd/genaccounts.go @@ -60,7 +60,7 @@ contain valid denominations. Accounts may optionally be supplied with vesting pa } // attempt to lookup address from Keybase if no address was provided - kb, err := keyring.New(sdk.KeyringServiceName(), keyringBackend, clientCtx.HomeDir, inBuf) + kb, err := keyring.New(sdk.KeyringServiceName(), keyringBackend, clientCtx.HomeDir, inBuf, cdc) if err != nil { return err } @@ -70,7 +70,10 @@ contain valid denominations. Accounts may optionally be supplied with vesting pa return fmt.Errorf("failed to get address from Keybase: %w", err) } - addr = info.GetAddress() + addr, err = info.GetAddress() + if err != nil { + return fmt.Errorf("failed to get address from Keybase: %w", err) + } } vestingStart, err := cmd.Flags().GetInt64(flagVestingStart) diff --git a/ignite/pkg/cosmoscmd/root.go b/ignite/pkg/cosmoscmd/root.go index 2d168ca355..f4155d84bb 100644 --- a/ignite/pkg/cosmoscmd/root.go +++ b/ignite/pkg/cosmoscmd/root.go @@ -17,6 +17,7 @@ import ( serverconfig "github.com/cosmos/cosmos-sdk/server/config" servertypes "github.com/cosmos/cosmos-sdk/server/types" "github.com/cosmos/cosmos-sdk/snapshots" + snapshottypes "github.com/cosmos/cosmos-sdk/snapshots/types" "github.com/cosmos/cosmos-sdk/store" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" @@ -28,6 +29,7 @@ import ( "github.com/spf13/cast" "github.com/spf13/cobra" "github.com/spf13/pflag" + tmcfg "github.com/tendermint/tendermint/config" tmcli "github.com/tendermint/tendermint/libs/cli" "github.com/tendermint/tendermint/libs/log" dbm "github.com/tendermint/tm-db" @@ -162,9 +164,8 @@ func NewRootCmd( customAppTemplate, customAppConfig := initAppConfig() - if err := server.InterceptConfigsPreRunHandler(cmd, customAppTemplate, customAppConfig); err != nil { + if err := server.InterceptConfigsPreRunHandler(cmd, customAppTemplate, customAppConfig, tmcfg.DefaultConfig()); err != nil { return err - } startProxyForTunneledPeers(initClientCtx, cmd) @@ -344,7 +345,7 @@ func (a appCreator) newApp( } snapshotDir := filepath.Join(cast.ToString(appOpts.Get(flags.FlagHome)), "data", "snapshots") - snapshotDB, err := sdk.NewLevelDB("metadata", snapshotDir) + snapshotDB, err := dbm.NewDB("metadata", dbm.GoLevelDBBackend, snapshotDir) if err != nil { panic(err) } @@ -353,6 +354,11 @@ func (a appCreator) newApp( panic(err) } + snapshotOptions := snapshottypes.NewSnapshotOptions( + cast.ToUint64(appOpts.Get(server.FlagStateSyncSnapshotInterval)), + cast.ToUint32(appOpts.Get(server.FlagStateSyncSnapshotKeepRecent)), + ) + return a.buildApp( logger, db, @@ -371,9 +377,7 @@ func (a appCreator) newApp( baseapp.SetInterBlockCache(cache), baseapp.SetTrace(cast.ToBool(appOpts.Get(server.FlagTrace))), baseapp.SetIndexEvents(cast.ToStringSlice(appOpts.Get(server.FlagIndexEvents))), - baseapp.SetSnapshotStore(snapshotStore), - baseapp.SetSnapshotInterval(cast.ToUint64(appOpts.Get(server.FlagStateSyncSnapshotInterval))), - baseapp.SetSnapshotKeepRecent(cast.ToUint32(appOpts.Get(server.FlagStateSyncSnapshotKeepRecent))), + baseapp.SetSnapshot(snapshotStore, snapshotOptions), ) } @@ -387,7 +391,6 @@ func (a appCreator) appExport( jailAllowedAddrs []string, appOpts servertypes.AppOptions, ) (servertypes.ExportedApp, error) { - var exportableApp ExportableApp homePath, ok := appOpts.Get(flags.FlagHome).(string) diff --git a/ignite/pkg/cosmosfaucet/cosmosfaucet.go b/ignite/pkg/cosmosfaucet/cosmosfaucet.go index 8bd98816ff..6ef5d18e64 100644 --- a/ignite/pkg/cosmosfaucet/cosmosfaucet.go +++ b/ignite/pkg/cosmosfaucet/cosmosfaucet.go @@ -5,6 +5,7 @@ import ( "context" "time" + sdkmath "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" chaincmdrunner "github.com/ignite/cli/ignite/pkg/chaincmd/runner" @@ -81,7 +82,7 @@ func Account(name, mnemonic string, coinType string) Option { // denom is denomination of the coin to be distributed by the faucet. func Coin(amount, maxAmount uint64, denom string) Option { return func(f *Faucet) { - f.coins = append(f.coins, sdk.NewCoin(denom, sdk.NewIntFromUint64(amount))) + f.coins = append(f.coins, sdk.NewCoin(denom, sdkmath.NewIntFromUint64(amount))) f.coinsMax[denom] = maxAmount } } diff --git a/ignite/pkg/cosmosgen/cosmosgen.go b/ignite/pkg/cosmosgen/cosmosgen.go index 0683091083..86275bb03f 100644 --- a/ignite/pkg/cosmosgen/cosmosgen.go +++ b/ignite/pkg/cosmosgen/cosmosgen.go @@ -8,7 +8,6 @@ import ( "github.com/ignite/cli/ignite/pkg/cache" "github.com/ignite/cli/ignite/pkg/cosmosanalysis/module" - "github.com/ignite/cli/ignite/pkg/gomodulepath" ) // generateOptions used to configure code generation. @@ -18,7 +17,10 @@ type generateOptions struct { jsOut func(module.Module) string jsIncludeThirdParty bool - vuexStoreRootPath string + tsClientRootPath string + + vuexOut func(module.Module) string + vuexRootPath string specOut string @@ -35,25 +37,20 @@ type ModulePathFunc func(module.Module) string // Option configures code generation. type Option func(*generateOptions) -// WithJSGeneration adds JS code generation. out hook is called for each module to -// retrieve the path that should be used to place generated js code inside for a given module. -// if includeThirdPartyModules set to true, code generation will be made for the 3rd party modules -// used by the app -including the SDK- as well. -func WithJSGeneration(includeThirdPartyModules bool, out ModulePathFunc) Option { +// WithTSClientGeneration adds Typescript Client code generation. +// The tsClientRootPath is used to determine the root path of generated Typescript classes. +func WithTSClientGeneration(out ModulePathFunc, tsClientRootPath string) Option { return func(o *generateOptions) { o.jsOut = out - o.jsIncludeThirdParty = includeThirdPartyModules + o.tsClientRootPath = tsClientRootPath } } -// WithVuexGeneration adds Vuex code generation. storeRootPath is used to determine the root path of generated -// Vuex stores. includeThirdPartyModules and out configures the underlying JS lib generation which is -// documented in WithJSGeneration. -func WithVuexGeneration(includeThirdPartyModules bool, out ModulePathFunc, storeRootPath string) Option { +func WithVuexGeneration(includeThirdPartyModules bool, out ModulePathFunc, vuexRootPath string) Option { return func(o *generateOptions) { - o.jsOut = out + o.vuexOut = out o.jsIncludeThirdParty = includeThirdPartyModules - o.vuexStoreRootPath = storeRootPath + o.vuexRootPath = vuexRootPath } } @@ -120,17 +117,29 @@ func Generate(ctx context.Context, cacheStorage cache.Storage, appPath, protoDir return err } + // Go generation must run first so the types are created before other + // generated code that requires sdk.Msg implementations to be defined if g.o.gomodPath != "" { if err := g.generateGo(); err != nil { return err } } - // js generation requires Go types to be existent in the source code. because - // sdk.Msg implementations defined on the generated Go types. - // so it needs to run after Go code gen. if g.o.jsOut != nil { - if err := g.generateJS(); err != nil { + if err := g.generateTS(); err != nil { + return err + } + } + + if g.o.vuexOut != nil { + if err := g.generateVuex(); err != nil { + return err + } + + // Update Vue app dependeciens when Vuex stores are generated. + // This update is required to link the "ts-client" folder so the + // package is available during development before publishing it. + if err := g.updateVueDependencies(); err != nil { return err } } @@ -148,14 +157,12 @@ func Generate(ctx context.Context, cacheStorage cache.Storage, appPath, protoDir } return nil - } -// VuexStoreModulePath generates Vuex store module paths for Cosmos SDK modules. +// TypescriptModulePath generates module paths for Cosmos SDK modules. // The root path is used as prefix for the generated paths. -func VuexStoreModulePath(rootPath string) ModulePathFunc { +func TypescriptModulePath(rootPath string) ModulePathFunc { return func(m module.Module) string { - appModulePath := gomodulepath.ExtractAppPath(m.GoModulePath) - return filepath.Join(rootPath, appModulePath, m.Pkg.Name, "module") + return filepath.Join(rootPath, m.Pkg.Name) } } diff --git a/ignite/pkg/cosmosgen/cosmosgen_test.go b/ignite/pkg/cosmosgen/cosmosgen_test.go index 7000fb9f08..f986d40689 100644 --- a/ignite/pkg/cosmosgen/cosmosgen_test.go +++ b/ignite/pkg/cosmosgen/cosmosgen_test.go @@ -9,8 +9,8 @@ import ( "github.com/ignite/cli/ignite/pkg/protoanalysis" ) -func TestVuexStoreModulePath(t *testing.T) { - modulePath := VuexStoreModulePath("prefix") +func TestTypescriptModulePath(t *testing.T) { + modulePath := TypescriptModulePath("prefix") cases := []struct { name string @@ -22,25 +22,25 @@ func TestVuexStoreModulePath(t *testing.T) { name: "github uri", goModulePath: "github.com/owner/app", protoPkgName: "owner.app.module", - want: "prefix/owner/app/owner.app.module/module", + want: "prefix/owner.app.module", }, { name: "short uri", goModulePath: "domain.com/app", protoPkgName: "app.module", - want: "prefix/app/app.module/module", + want: "prefix/app.module", }, { name: "path", goModulePath: "owner/app", protoPkgName: "owner.app.module", - want: "prefix/owner/app/owner.app.module/module", + want: "prefix/owner.app.module", }, { name: "name", goModulePath: "app", protoPkgName: "app.module", - want: "prefix/app/app.module/module", + want: "prefix/app.module", }, } diff --git a/ignite/pkg/cosmosgen/generate.go b/ignite/pkg/cosmosgen/generate.go index 51043f24c6..4a293000b3 100644 --- a/ignite/pkg/cosmosgen/generate.go +++ b/ignite/pkg/cosmosgen/generate.go @@ -6,13 +6,14 @@ import ( "path/filepath" "strings" + "github.com/pkg/errors" + "github.com/ignite/cli/ignite/pkg/cache" "github.com/ignite/cli/ignite/pkg/cmdrunner" "github.com/ignite/cli/ignite/pkg/cmdrunner/step" "github.com/ignite/cli/ignite/pkg/cosmosanalysis/module" "github.com/ignite/cli/ignite/pkg/gomodule" "github.com/ignite/cli/ignite/pkg/xfilepath" - "github.com/pkg/errors" ) const ( @@ -20,11 +21,9 @@ const ( moduleCacheNamespace = "generate.setup.module" ) -var ( - protocGlobalInclude = xfilepath.List( - xfilepath.JoinFromHome(xfilepath.Path("local/include")), - xfilepath.JoinFromHome(xfilepath.Path(".local/include")), - ) +var protocGlobalInclude = xfilepath.List( + xfilepath.JoinFromHome(xfilepath.Path("local/include")), + xfilepath.JoinFromHome(xfilepath.Path(".local/include")), ) type ModulesInPath struct { diff --git a/ignite/pkg/cosmosgen/generate_dart.go b/ignite/pkg/cosmosgen/generate_dart.go index 7059193b30..22750e2b72 100644 --- a/ignite/pkg/cosmosgen/generate_dart.go +++ b/ignite/pkg/cosmosgen/generate_dart.go @@ -16,11 +16,9 @@ import ( protocgendart "github.com/ignite/cli/ignite/pkg/protoc-gen-dart" ) -var ( - dartOut = []string{ - "--dart_out=grpc:.", - } -) +var dartOut = []string{ + "--dart_out=grpc:.", +} const ( dartExportFileName = "export.dart" @@ -84,7 +82,7 @@ func (g *dartGenerator) generateModule(ctx context.Context, plugin, appPath stri if err := os.RemoveAll(out); err != nil { return err } - if err := os.MkdirAll(clientOut, 0766); err != nil { + if err := os.MkdirAll(clientOut, 0o766); err != nil { return err } @@ -116,6 +114,6 @@ func (g *dartGenerator) generateModule(ctx context.Context, plugin, appPath stri exportContent.WriteString(fmt.Sprintf("export '%s';\n", path)) } - err = os.WriteFile(exportOut, exportContent.Bytes(), 0644) + err = os.WriteFile(exportOut, exportContent.Bytes(), 0o644) return errors.Wrap(err, "could not create the Dart export file for module") } diff --git a/ignite/pkg/cosmosgen/generate_go.go b/ignite/pkg/cosmosgen/generate_go.go index ab0dd44f84..1f915158cc 100644 --- a/ignite/pkg/cosmosgen/generate_go.go +++ b/ignite/pkg/cosmosgen/generate_go.go @@ -11,12 +11,10 @@ import ( "github.com/ignite/cli/ignite/pkg/protoc" ) -var ( - goOuts = []string{ - "--gocosmos_out=plugins=interfacetype+grpc,Mgoogle/protobuf/any.proto=github.com/cosmos/cosmos-sdk/codec/types:.", - "--grpc-gateway_out=logtostderr=true:.", - } -) +var goOuts = []string{ + "--gocosmos_out=plugins=interfacetype+grpc,Mgoogle/protobuf/any.proto=github.com/cosmos/cosmos-sdk/codec/types:.", + "--grpc-gateway_out=logtostderr=true:.", +} func (g *generator) generateGo() error { includePaths, err := g.resolveInclude(g.appPath) diff --git a/ignite/pkg/cosmosgen/generate_javascript.go b/ignite/pkg/cosmosgen/generate_javascript.go deleted file mode 100644 index 4d24387c4a..0000000000 --- a/ignite/pkg/cosmosgen/generate_javascript.go +++ /dev/null @@ -1,232 +0,0 @@ -package cosmosgen - -import ( - "context" - "fmt" - "os" - "path/filepath" - "strings" - - "github.com/iancoleman/strcase" - "golang.org/x/sync/errgroup" - - "github.com/ignite/cli/ignite/pkg/cache" - "github.com/ignite/cli/ignite/pkg/cosmosanalysis/module" - "github.com/ignite/cli/ignite/pkg/dirchange" - "github.com/ignite/cli/ignite/pkg/gomodulepath" - "github.com/ignite/cli/ignite/pkg/localfs" - "github.com/ignite/cli/ignite/pkg/nodetime/programs/sta" - tsproto "github.com/ignite/cli/ignite/pkg/nodetime/programs/ts-proto" - "github.com/ignite/cli/ignite/pkg/protoc" - "github.com/ignite/cli/ignite/pkg/xstrings" -) - -var ( - tsOut = []string{ - "--ts_proto_out=.", - } - - jsOpenAPIOut = []string{ - "--openapiv2_out=logtostderr=true,allow_merge=true,json_names_for_fields=false,Mgoogle/protobuf/any.proto=github.com/cosmos/cosmos-sdk/codec/types:.", - } -) - -const ( - vuexRootMarker = "vuex-root" - dirchangeCacheNamespace = "generate.javascript.dirchange" -) - -type jsGenerator struct { - g *generator -} - -func newJSGenerator(g *generator) *jsGenerator { - return &jsGenerator{ - g: g, - } -} - -func (g *generator) generateJS() error { - jsg := newJSGenerator(g) - - if err := jsg.generateModules(); err != nil { - return err - } - - return jsg.generateVuexModuleLoader() -} - -func (g *jsGenerator) generateModules() error { - tsprotoPluginPath, cleanup, err := tsproto.BinaryPath() - if err != nil { - return err - } - defer cleanup() - - gg := &errgroup.Group{} - - dirCache := cache.New[[]byte](g.g.cacheStorage, dirchangeCacheNamespace) - add := func(sourcePath string, modules []module.Module) { - for _, m := range modules { - m := m - gg.Go(func() error { - cacheKey := m.Pkg.Path - paths := append([]string{m.Pkg.Path, g.g.o.jsOut(m)}, g.g.o.includeDirs...) - changed, err := dirchange.HasDirChecksumChanged(dirCache, cacheKey, sourcePath, paths...) - if err != nil { - return err - } - - if !changed { - return nil - } - - if err := g.generateModule(g.g.ctx, tsprotoPluginPath, sourcePath, m); err != nil { - return err - } - - return dirchange.SaveDirChecksum(dirCache, cacheKey, sourcePath, paths...) - }) - } - } - - add(g.g.appPath, g.g.appModules) - - if g.g.o.jsIncludeThirdParty { - for sourcePath, modules := range g.g.thirdModules { - add(sourcePath, modules) - } - } - - return gg.Wait() -} - -// generateModule generates generates JS code for a module. -func (g *jsGenerator) generateModule(ctx context.Context, tsprotoPluginPath, appPath string, m module.Module) error { - var ( - out = g.g.o.jsOut(m) - storeDirPath = filepath.Dir(out) - typesOut = filepath.Join(out, "types") - ) - - includePaths, err := g.g.resolveInclude(appPath) - if err != nil { - return err - } - - if err := os.MkdirAll(typesOut, 0766); err != nil { - return err - } - - // generate ts-proto types. - err = protoc.Generate( - g.g.ctx, - typesOut, - m.Pkg.Path, - includePaths, - tsOut, - protoc.Plugin(tsprotoPluginPath, "--ts_proto_opt=snakeToCamel=false"), - protoc.Env("NODE_OPTIONS="), // unset nodejs options to avoid unexpected issues with vercel "pkg" - ) - if err != nil { - return err - } - - // generate OpenAPI spec. - oaitemp, err := os.MkdirTemp("", "gen-js-openapi-module-spec") - if err != nil { - return err - } - defer os.RemoveAll(oaitemp) - - err = protoc.Generate( - ctx, - oaitemp, - m.Pkg.Path, - includePaths, - jsOpenAPIOut, - ) - if err != nil { - return err - } - - // generate the REST client from the OpenAPI spec. - var ( - srcspec = filepath.Join(oaitemp, "apidocs.swagger.json") - outREST = filepath.Join(out, "rest.ts") - ) - - if err := sta.Generate(g.g.ctx, outREST, srcspec, "-1"); err != nil { // -1 removes the route namespace. - return err - } - - // generate the js client wrapper. - pp := filepath.Join(appPath, g.g.protoDir) - if err := templateJSClient.Write(out, pp, struct{ Module module.Module }{m}); err != nil { - return err - } - - // generate Vuex if enabled. - if g.g.o.vuexStoreRootPath != "" { - err = templateVuexStore.Write(storeDirPath, pp, struct{ Module module.Module }{m}) - if err != nil { - return err - } - } - - return nil -} - -func (g *jsGenerator) generateVuexModuleLoader() error { - modulePaths, err := localfs.Search(g.g.o.vuexStoreRootPath, vuexRootMarker) - if err != nil { - return err - } - - chainPath, _, err := gomodulepath.Find(g.g.appPath) - if err != nil { - return err - } - - appModulePath := gomodulepath.ExtractAppPath(chainPath.RawPath) - - type module struct { - Name string - Path string - FullName string - FullPath string - } - - data := struct { - Modules []module - PackageName string - }{ - PackageName: fmt.Sprintf("%s-js", strings.ReplaceAll(appModulePath, "/", "-")), - } - - for _, path := range modulePaths { - pathrel, err := filepath.Rel(g.g.o.vuexStoreRootPath, path) - if err != nil { - return err - } - - var ( - fullPath = filepath.Dir(pathrel) - fullName = xstrings.FormatUsername(strcase.ToCamel(strings.ReplaceAll(fullPath, "/", "_"))) - path = filepath.Base(fullPath) - name = strcase.ToCamel(path) - ) - data.Modules = append(data.Modules, module{ - Name: name, - Path: path, - FullName: fullName, - FullPath: fullPath, - }) - } - - if err := templateVuexRoot.Write(g.g.o.vuexStoreRootPath, "", data); err != nil { - return err - } - - return nil -} diff --git a/ignite/pkg/cosmosgen/generate_openapi.go b/ignite/pkg/cosmosgen/generate_openapi.go index af622a36d7..d3ee4b3a0a 100644 --- a/ignite/pkg/cosmosgen/generate_openapi.go +++ b/ignite/pkg/cosmosgen/generate_openapi.go @@ -65,7 +65,7 @@ func generateOpenAPISpec(g *generator) error { } if err != cache.ErrorNotFound { - if err := os.WriteFile(specPath, existingSpec, 0644); err != nil { + if err := os.WriteFile(specPath, existingSpec, 0o644); err != nil { return err } } else { @@ -141,7 +141,7 @@ func generateOpenAPISpec(g *generator) error { // ensure out dir exists. outDir := filepath.Dir(out) - if err := os.MkdirAll(outDir, 0766); err != nil { + if err := os.MkdirAll(outDir, 0o766); err != nil { return err } diff --git a/ignite/pkg/cosmosgen/generate_typescript.go b/ignite/pkg/cosmosgen/generate_typescript.go new file mode 100644 index 0000000000..548dede7fb --- /dev/null +++ b/ignite/pkg/cosmosgen/generate_typescript.go @@ -0,0 +1,221 @@ +package cosmosgen + +import ( + "context" + "os" + "path/filepath" + "sort" + "strings" + + "golang.org/x/sync/errgroup" + + "github.com/ignite/cli/ignite/pkg/cache" + "github.com/ignite/cli/ignite/pkg/cosmosanalysis/module" + "github.com/ignite/cli/ignite/pkg/dirchange" + "github.com/ignite/cli/ignite/pkg/gomodulepath" + "github.com/ignite/cli/ignite/pkg/nodetime/programs/sta" + tsproto "github.com/ignite/cli/ignite/pkg/nodetime/programs/ts-proto" + "github.com/ignite/cli/ignite/pkg/protoc" +) + +var ( + dirchangeCacheNamespace = "generate.typescript.dirchange" + jsOpenAPIOut = []string{"--openapiv2_out=logtostderr=true,allow_merge=true,json_names_for_fields=false,Mgoogle/protobuf/any.proto=github.com/cosmos/cosmos-sdk/codec/types:."} + tsOut = []string{"--ts_proto_out=."} +) + +type tsGenerator struct { + g *generator +} + +type generatePayload struct { + Modules []module.Module + PackageNS string +} + +func newTSGenerator(g *generator) *tsGenerator { + return &tsGenerator{g} +} + +func (g *generator) generateTS() error { + chainPath, _, err := gomodulepath.Find(g.appPath) + if err != nil { + return err + } + + appModulePath := gomodulepath.ExtractAppPath(chainPath.RawPath) + data := generatePayload{ + Modules: g.appModules, + PackageNS: strings.ReplaceAll(appModulePath, "/", "-"), + } + + // Third party modules are always required to generate the root + // template because otherwise it would be generated only with + // custom modules loosing the registration of the third party + // modules when the root templates are re-generated. + for _, modules := range g.thirdModules { + data.Modules = append(data.Modules, modules...) + } + + // Make sure the modules are always sorted to keep the import + // and module registration order consistent so the generated + // files are not changed. + sort.SliceStable(data.Modules, func(i, j int) bool { + return data.Modules[i].Pkg.Name < data.Modules[j].Pkg.Name + }) + + tsg := newTSGenerator(g) + if err := tsg.generateModuleTemplates(); err != nil { + return err + } + + return tsg.generateRootTemplates(data) +} + +func (g *tsGenerator) generateModuleTemplates() error { + protocCmd, cleanupProtoc, err := protoc.Command() + if err != nil { + return err + } + + defer cleanupProtoc() + + tsprotoPluginPath, cleanupPlugin, err := tsproto.BinaryPath() + if err != nil { + return err + } + + defer cleanupPlugin() + + staCmd, cleanupSTA, err := sta.Command() + if err != nil { + return err + } + + defer cleanupSTA() + + gg := &errgroup.Group{} + dirCache := cache.New[[]byte](g.g.cacheStorage, dirchangeCacheNamespace) + add := func(sourcePath string, modules []module.Module) { + for _, m := range modules { + m := m + + gg.Go(func() error { + cacheKey := m.Pkg.Path + paths := append([]string{m.Pkg.Path, g.g.o.jsOut(m)}, g.g.o.includeDirs...) + changed, err := dirchange.HasDirChecksumChanged(dirCache, cacheKey, sourcePath, paths...) + if err != nil { + return err + } + + if !changed { + return nil + } + + err = g.generateModuleTemplate(g.g.ctx, protocCmd, staCmd, tsprotoPluginPath, sourcePath, m) + if err != nil { + return err + } + + return dirchange.SaveDirChecksum(dirCache, cacheKey, sourcePath, paths...) + }) + } + } + + add(g.g.appPath, g.g.appModules) + + // Always generate third party modules; This is required because not generating them might + // lead to issues with the module registration in the root template. The root template must + // always be generated with 3rd party modules which means that if a new 3rd party module + // is available and not generated it would lead to the registration of a new not generated + // 3rd party module. + for sourcePath, modules := range g.g.thirdModules { + add(sourcePath, modules) + } + + return gg.Wait() +} + +func (g *tsGenerator) generateModuleTemplate( + ctx context.Context, + protocCmd protoc.Cmd, + staCmd sta.Cmd, + tsprotoPluginPath, appPath string, + m module.Module, +) error { + var ( + out = g.g.o.jsOut(m) + typesOut = filepath.Join(out, "types") + ) + + includePaths, err := g.g.resolveInclude(appPath) + if err != nil { + return err + } + + if err := os.MkdirAll(typesOut, 0o766); err != nil { + return err + } + + // generate ts-proto types + err = protoc.Generate( + ctx, + typesOut, + m.Pkg.Path, + includePaths, + tsOut, + protoc.Plugin(tsprotoPluginPath, "--ts_proto_opt=snakeToCamel=true"), + protoc.Env("NODE_OPTIONS="), // unset nodejs options to avoid unexpected issues with vercel "pkg" + protoc.WithCommand(protocCmd), + ) + if err != nil { + return err + } + + // generate OpenAPI spec + oaitemp, err := os.MkdirTemp("", "gen-js-openapi-module-spec") + if err != nil { + return err + } + + defer os.RemoveAll(oaitemp) + + err = protoc.Generate( + ctx, + oaitemp, + m.Pkg.Path, + includePaths, + jsOpenAPIOut, + protoc.WithCommand(protocCmd), + ) + if err != nil { + return err + } + + // generate the REST client from the OpenAPI spec + var ( + srcspec = filepath.Join(oaitemp, "apidocs.swagger.json") + outREST = filepath.Join(out, "rest.ts") + ) + + if err := sta.Generate(ctx, outREST, srcspec, sta.WithCommand(staCmd)); err != nil { + return err + } + + pp := filepath.Join(appPath, g.g.protoDir) + + return templateTSClientModule.Write(out, pp, struct { + Module module.Module + }{ + Module: m, + }) +} + +func (g *tsGenerator) generateRootTemplates(p generatePayload) error { + outDir := g.g.o.tsClientRootPath + if err := os.MkdirAll(outDir, 0o766); err != nil { + return err + } + + return templateTSClientRoot.Write(outDir, "", p) +} diff --git a/ignite/pkg/cosmosgen/generate_vuex.go b/ignite/pkg/cosmosgen/generate_vuex.go new file mode 100644 index 0000000000..8f3ef382a4 --- /dev/null +++ b/ignite/pkg/cosmosgen/generate_vuex.go @@ -0,0 +1,145 @@ +package cosmosgen + +import ( + "encoding/json" + "fmt" + "os" + "path/filepath" + "strings" + + "golang.org/x/sync/errgroup" + + "github.com/imdario/mergo" + + "github.com/ignite/cli/ignite/pkg/cosmosanalysis/module" + "github.com/ignite/cli/ignite/pkg/gomodulepath" +) + +type vuexGenerator struct { + g *generator +} + +func newVuexGenerator(g *generator) *vuexGenerator { + return &vuexGenerator{g} +} + +func (g *generator) updateVueDependencies() error { + // Init the path to the "vue" folder inside the app + vuePath := filepath.Join(g.appPath, "vue") + packagesPath := filepath.Join(vuePath, "package.json") + + // Read the Vue app package file + b, err := os.ReadFile(packagesPath) + if err != nil { + return err + } + + var pkg map[string]interface{} + + if err := json.Unmarshal(b, &pkg); err != nil { + return fmt.Errorf("error parsing %s: %w", packagesPath, err) + } + + // Add the link to the ts-client to the VUE app dependencies + chainPath, _, err := gomodulepath.Find(g.appPath) + if err != nil { + return err + } + + appModulePath := gomodulepath.ExtractAppPath(chainPath.RawPath) + tsClientNS := strings.ReplaceAll(appModulePath, "/", "-") + tsClientName := fmt.Sprintf("%s-client-ts", tsClientNS) + tsClientPath, err := filepath.Rel(vuePath, g.o.tsClientRootPath) + if err != nil { + return err + } + + err = mergo.Merge(&pkg, map[string]interface{}{ + "dependencies": map[string]interface{}{ + tsClientName: fmt.Sprintf("file:%s", tsClientPath), + }, + }) + if err != nil { + return fmt.Errorf("failed to link ts-client dependency in the Vue app: %w", err) + } + + // Save the modified package.json with the new dependencies + file, err := os.OpenFile(packagesPath, os.O_RDWR|os.O_TRUNC, 0o644) + if err != nil { + return err + } + + defer file.Close() + + enc := json.NewEncoder(file) + enc.SetIndent("", " ") + if err := enc.Encode(pkg); err != nil { + return fmt.Errorf("error updating %s: %w", packagesPath, err) + } + + return nil +} + +func (g *generator) generateVuex() error { + chainPath, _, err := gomodulepath.Find(g.appPath) + if err != nil { + return err + } + + appModulePath := gomodulepath.ExtractAppPath(chainPath.RawPath) + data := generatePayload{ + Modules: g.appModules, + PackageNS: strings.ReplaceAll(appModulePath, "/", "-"), + } + + if g.o.jsIncludeThirdParty { + for _, modules := range g.thirdModules { + data.Modules = append(data.Modules, modules...) + } + } + + vsg := newVuexGenerator(g) + if err := vsg.generateVueTemplates(data); err != nil { + return err + } + + return vsg.generateRootTemplates(data) +} + +func (g *vuexGenerator) generateVueTemplates(p generatePayload) error { + gg := &errgroup.Group{} + + for _, m := range p.Modules { + m := m + + gg.Go(func() error { + return g.generateVueTemplate(m, p) + }) + } + + return gg.Wait() +} + +func (g *vuexGenerator) generateVueTemplate(m module.Module, p generatePayload) error { + outDir := g.g.o.vuexOut(m) + if err := os.MkdirAll(outDir, 0o766); err != nil { + return err + } + + return templateTSClientVue.Write(outDir, "", struct { + Module module.Module + PackageNS string + }{ + Module: m, + PackageNS: p.PackageNS, + }) +} + +func (g *vuexGenerator) generateRootTemplates(p generatePayload) error { + outDir := g.g.o.vuexRootPath + if err := os.MkdirAll(outDir, 0o766); err != nil { + return err + } + + return templateTSClientVueRoot.Write(outDir, "", p) +} diff --git a/ignite/pkg/cosmosgen/template.go b/ignite/pkg/cosmosgen/template.go index 1f56f8a635..fc6124e65d 100644 --- a/ignite/pkg/cosmosgen/template.go +++ b/ignite/pkg/cosmosgen/template.go @@ -9,16 +9,18 @@ import ( "github.com/iancoleman/strcase" "github.com/takuoki/gocase" + "golang.org/x/text/cases" + "golang.org/x/text/language" ) var ( //go:embed templates/* templates embed.FS - templateJSClient = newTemplateWriter("js") // js wrapper client. - templateVuexRoot = newTemplateWriter("vuex/root") // vuex store loader. - templateVuexStore = newTemplateWriter("vuex/store") // vuex store. - + templateTSClientRoot = newTemplateWriter("root") + templateTSClientModule = newTemplateWriter("module") + templateTSClientVue = newTemplateWriter("vue") + templateTSClientVueRoot = newTemplateWriter("vue-root") ) type templateWriter struct { @@ -52,6 +54,22 @@ func (t templateWriter) Write(destDir, protoPath string, data interface{}) error "camelCaseSta": func(word string) string { return gocase.Revert(strcase.ToLowerCamel(word)) }, + "capitalCase": func(word string) string { + replacer := strings.NewReplacer("-", "_", ".", "_") + word = strcase.ToCamel(replacer.Replace(word)) + + return cases.Title(language.English).String(word) + }, + "camelCaseLowerSta": func(word string) string { + replacer := strings.NewReplacer("-", "_", ".", "_") + + return strcase.ToLowerCamel(replacer.Replace(word)) + }, + "camelCaseUpperSta": func(word string) string { + replacer := strings.NewReplacer("-", "_", ".", "_") + + return strcase.ToCamel(replacer.Replace(word)) + }, "resolveFile": func(fullPath string) string { rel, _ := filepath.Rel(protoPath, fullPath) rel = strings.TrimSuffix(rel, ".proto") @@ -75,7 +93,7 @@ func (t templateWriter) Write(destDir, protoPath string, data interface{}) error out := filepath.Join(destDir, strings.TrimSuffix(filepath.Base(path), ".tpl")) - f, err := os.OpenFile(out, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0766) + f, err := os.OpenFile(out, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0o766) if err != nil { return err } diff --git a/ignite/pkg/cosmosgen/templates/js/index.ts.tpl b/ignite/pkg/cosmosgen/templates/js/index.ts.tpl deleted file mode 100644 index 2b757fc7ca..0000000000 --- a/ignite/pkg/cosmosgen/templates/js/index.ts.tpl +++ /dev/null @@ -1,60 +0,0 @@ -// THIS FILE IS GENERATED AUTOMATICALLY. DO NOT MODIFY. - -import { StdFee } from "@cosmjs/launchpad"; -import { SigningStargateClient } from "@cosmjs/stargate"; -import { Registry, OfflineSigner, EncodeObject, DirectSecp256k1HdWallet } from "@cosmjs/proto-signing"; -import { Api } from "./rest"; -{{ range .Module.Msgs }}import { {{ .Name }} } from "./types/{{ resolveFile .FilePath }}"; -{{ end }} - -const types = [ - {{ range .Module.Msgs }}["/{{ .URI }}", {{ .Name }}], - {{ end }} -]; -export const MissingWalletError = new Error("wallet is required"); - -export const registry = new Registry(<any>types); - -const defaultFee = { - amount: [], - gas: "200000", -}; - -interface TxClientOptions { - addr: string -} - -interface SignAndBroadcastOptions { - fee: StdFee, - memo?: string -} - -const txClient = async (wallet: OfflineSigner, { addr: addr }: TxClientOptions = { addr: "http://localhost:26657" }) => { - if (!wallet) throw MissingWalletError; - let client; - if (addr) { - client = await SigningStargateClient.connectWithSigner(addr, wallet, { registry }); - }else{ - client = await SigningStargateClient.offline( wallet, { registry }); - } - const { address } = (await wallet.getAccounts())[0]; - - return { - signAndBroadcast: (msgs: EncodeObject[], { fee, memo }: SignAndBroadcastOptions = {fee: defaultFee, memo: ""}) => client.signAndBroadcast(address, msgs, fee,memo), - {{ range .Module.Msgs }}{{ camelCase .Name }}: (data: {{ .Name }}): EncodeObject => ({ typeUrl: "/{{ .URI }}", value: {{ .Name }}.fromPartial( data ) }), - {{ end }} - }; -}; - -interface QueryClientOptions { - addr: string -} - -const queryClient = async ({ addr: addr }: QueryClientOptions = { addr: "http://localhost:1317" }) => { - return new Api({ baseUrl: addr }); -}; - -export { - txClient, - queryClient, -}; diff --git a/ignite/pkg/cosmosgen/templates/module/index.ts.tpl b/ignite/pkg/cosmosgen/templates/module/index.ts.tpl new file mode 100644 index 0000000000..c9dfa159ec --- /dev/null +++ b/ignite/pkg/cosmosgen/templates/module/index.ts.tpl @@ -0,0 +1,6 @@ +import Module from './module'; +import { txClient, queryClient, registry } from './module'; +import { msgTypes } from './registry'; + +export * from "./types"; +export { Module, msgTypes, txClient, queryClient, registry }; diff --git a/ignite/pkg/cosmosgen/templates/module/module.ts.tpl b/ignite/pkg/cosmosgen/templates/module/module.ts.tpl new file mode 100644 index 0000000000..cbdb997ebc --- /dev/null +++ b/ignite/pkg/cosmosgen/templates/module/module.ts.tpl @@ -0,0 +1,99 @@ +// Generated by Ignite ignite.com/cli + +import { StdFee } from "@cosmjs/launchpad"; +import { SigningStargateClient, DeliverTxResponse } from "@cosmjs/stargate"; +import { EncodeObject, GeneratedType, OfflineSigner, Registry } from "@cosmjs/proto-signing"; +import { msgTypes } from './registry'; +import { IgniteClient } from "../client" +import { MissingWalletError } from "../helpers" +import { Api } from "./rest"; +{{ range .Module.Msgs }}import { {{ .Name }} } from "./types/{{ resolveFile .FilePath }}"; +{{ end }} + +export { {{ range $i,$type:=.Module.Msgs }}{{ if (gt $i 0) }}, {{ end }}{{ $type.Name }}{{ end }} }; +{{ range .Module.Msgs }} +type send{{ .Name }}Params = { + value: {{ .Name }}, + fee?: StdFee, + memo?: string +}; +{{ end }} +{{ range .Module.Msgs }} +type {{ camelCase .Name }}Params = { + value: {{ .Name }}, +}; +{{ end }} + +export const registry = new Registry(msgTypes); + +const defaultFee = { + amount: [], + gas: "200000", +}; + +interface TxClientOptions { + addr: string + prefix: string + signer?: OfflineSigner +} + +export const txClient = ({ signer, prefix, addr }: TxClientOptions = { addr: "http://localhost:26657", prefix: "cosmos" }) => { + + return { + {{ range .Module.Msgs }} + async send{{ .Name }}({ value, fee, memo }: send{{ .Name }}Params): Promise<DeliverTxResponse> { + if (!signer) { + throw new Error('TxClient:send{{ .Name }}: Unable to sign Tx. Signer is not present.') + } + try { + const { address } = (await signer.getAccounts())[0]; + const signingClient = await SigningStargateClient.connectWithSigner(addr,signer,{registry, prefix}); + let msg = this.{{ camelCase .Name }}({ value: {{ .Name }}.fromPartial(value) }) + return await signingClient.signAndBroadcast(address, [msg], fee ? fee : defaultFee, memo) + } catch (e: any) { + throw new Error('TxClient:send{{ .Name }}: Could not broadcast Tx: '+ e.message) + } + }, + {{ end }} + {{ range .Module.Msgs }} + {{ camelCase .Name }}({ value }: {{ camelCase .Name }}Params): EncodeObject { + try { + return { typeUrl: "/{{ .URI }}", value: {{ .Name }}.fromPartial( value ) } + } catch (e: any) { + throw new Error('TxClient:{{ .Name }}: Could not create message: ' + e.message) + } + }, + {{ end }} + } +}; + +interface QueryClientOptions { + addr: string +} + +export const queryClient = ({ addr: addr }: QueryClientOptions = { addr: "http://localhost:1317" }) => { + return new Api({ baseUrl: addr }); +}; + +class SDKModule { + public query: ReturnType<typeof queryClient>; + public tx: ReturnType<typeof txClient>; + + public registry: Array<[string, GeneratedType]>; + + constructor(client: IgniteClient) { + + this.query = queryClient({ addr: client.env.apiURL }); + this.tx = txClient({ signer: client.signer, addr: client.env.rpcURL, prefix: client.env.prefix ?? "cosmos" }); + } +}; + +const Module = (test: IgniteClient) => { + return { + module: { + {{ camelCaseUpperSta .Module.Pkg.Name }}: new SDKModule(test) + }, + registry: msgTypes + } +} +export default Module; \ No newline at end of file diff --git a/ignite/pkg/cosmosgen/templates/module/registry.ts.tpl b/ignite/pkg/cosmosgen/templates/module/registry.ts.tpl new file mode 100644 index 0000000000..dd9161b0e2 --- /dev/null +++ b/ignite/pkg/cosmosgen/templates/module/registry.ts.tpl @@ -0,0 +1,9 @@ +import { GeneratedType } from "@cosmjs/proto-signing"; +{{ range .Module.Msgs }}import { {{ .Name }} } from "./types/{{ resolveFile .FilePath }}"; +{{ end }} +const msgTypes: Array<[string, GeneratedType]> = [ + {{ range .Module.Msgs }}["/{{ .URI }}", {{ .Name }}], + {{ end }} +]; + +export { msgTypes } \ No newline at end of file diff --git a/ignite/pkg/cosmosgen/templates/module/types.ts.tpl b/ignite/pkg/cosmosgen/templates/module/types.ts.tpl new file mode 100644 index 0000000000..b1a86beaa2 --- /dev/null +++ b/ignite/pkg/cosmosgen/templates/module/types.ts.tpl @@ -0,0 +1,7 @@ +{{ range .Module.Types }}import { {{ .Name }} } from "./types/{{ resolveFile .FilePath }}" +{{ end }} + +export { + {{ range .Module.Types }}{{ .Name }}, + {{ end }} + } \ No newline at end of file diff --git a/ignite/pkg/cosmosgen/templates/root/client.ts.tpl b/ignite/pkg/cosmosgen/templates/root/client.ts.tpl new file mode 100644 index 0000000000..8badd9ce66 --- /dev/null +++ b/ignite/pkg/cosmosgen/templates/root/client.ts.tpl @@ -0,0 +1,51 @@ +import { GeneratedType, OfflineSigner, EncodeObject, Registry } from "@cosmjs/proto-signing"; +import { StdFee } from "@cosmjs/launchpad"; +import { SigningStargateClient } from "@cosmjs/stargate"; +import { Env } from "./env"; +import { UnionToIntersection, Return, Constructor } from "./helpers"; +import { Module } from "./modules"; + +const defaultFee = { + amount: [], + gas: "200000", +}; + +export class IgniteClient { + static plugins: Module[] = []; + env: Env; + signer: OfflineSigner; + registry: Array<[string, GeneratedType]> = []; + static plugin<T extends Module | Module[]>(plugin: T) { + const currentPlugins = this.plugins; + + class AugmentedClient extends this { + static plugins = currentPlugins.concat(plugin); + } + + if (Array.isArray(plugin)) { + type Extension = UnionToIntersection<Return<T>['module']> + return AugmentedClient as typeof AugmentedClient & Constructor<Extension>; + } + + type Extension = Return<T>['module'] + return AugmentedClient as typeof AugmentedClient & Constructor<Extension>; + } + async signAndBroadcast(msgs: EncodeObject[], fee: StdFee, memo: string) { + const { address } = (await this.signer.getAccounts())[0]; + const signingClient = await SigningStargateClient.connectWithSigner(this.env.rpcURL, this.signer, {registry: new Registry(this.registry), prefix: this.env.prefix}); + return await signingClient.signAndBroadcast(address, msgs, fee ? fee : defaultFee, memo) + } + constructor(env: Env, signer: OfflineSigner) { + this.env = env; + this.signer = signer; + const classConstructor = this.constructor as typeof IgniteClient; + classConstructor.plugins.forEach(plugin => { + const pluginInstance = plugin(this); + Object.assign(this, pluginInstance.module) + if (this.registry) { + this.registry = this.registry.concat(pluginInstance.registry) + } + }); + + } +} \ No newline at end of file diff --git a/ignite/pkg/cosmosgen/templates/root/env.ts.tpl b/ignite/pkg/cosmosgen/templates/root/env.ts.tpl new file mode 100644 index 0000000000..92558e4be6 --- /dev/null +++ b/ignite/pkg/cosmosgen/templates/root/env.ts.tpl @@ -0,0 +1,7 @@ +import { OfflineSigner } from "@cosmjs/proto-signing"; + +export interface Env { + apiURL: string + rpcURL: string + prefix?: string +} \ No newline at end of file diff --git a/ignite/pkg/cosmosgen/templates/root/helpers.ts.tpl b/ignite/pkg/cosmosgen/templates/root/helpers.ts.tpl new file mode 100644 index 0000000000..b03727b4d0 --- /dev/null +++ b/ignite/pkg/cosmosgen/templates/root/helpers.ts.tpl @@ -0,0 +1,32 @@ +export type Constructor<T> = new (...args: any[]) => T; + +export type AnyFunction = (...args: any) => any; + +export type UnionToIntersection<Union> = + (Union extends any + ? (argument: Union) => void + : never + ) extends (argument: infer Intersection) => void + ? Intersection + : never; + +export type Return<T> = + T extends AnyFunction + ? ReturnType<T> + : T extends AnyFunction[] + ? UnionToIntersection<ReturnType<T[number]>> + : never + + +export const MissingWalletError = new Error("wallet is required"); + +export function getStructure(template) { + let structure = { fields: [] } + for (const [key, value] of Object.entries(template)) { + let field: any = {} + field.name = key + field.type = typeof value + structure.fields.push(field) + } + return structure +} \ No newline at end of file diff --git a/ignite/pkg/cosmosgen/templates/root/index.ts.tpl b/ignite/pkg/cosmosgen/templates/root/index.ts.tpl new file mode 100644 index 0000000000..8c71febfe1 --- /dev/null +++ b/ignite/pkg/cosmosgen/templates/root/index.ts.tpl @@ -0,0 +1,21 @@ +// Generated by Ignite ignite.com/cli +import { Registry } from '@cosmjs/proto-signing' +import { IgniteClient } from "./client"; +import { MissingWalletError } from "./helpers"; +{{ range .Modules }}import { Module as {{ camelCaseUpperSta .Pkg.Name }}, msgTypes as {{ camelCaseUpperSta .Pkg.Name }}MsgTypes } from './{{ .Pkg.Name }}' +{{ end }} + +const Client = IgniteClient.plugin([ + {{ range $i,$module :=.Modules }}{{ if (gt $i 0) }}, {{ end }}{{ camelCaseUpperSta $module.Pkg.Name }}{{ end }} +]); + +const registry = new Registry([ + {{ range .Modules }}...{{ camelCaseUpperSta .Pkg.Name }}MsgTypes, + {{ end }} +]) + +export { + Client, + registry, + MissingWalletError +} diff --git a/ignite/pkg/cosmosgen/templates/root/modules.ts.tpl b/ignite/pkg/cosmosgen/templates/root/modules.ts.tpl new file mode 100644 index 0000000000..634b83c125 --- /dev/null +++ b/ignite/pkg/cosmosgen/templates/root/modules.ts.tpl @@ -0,0 +1,5 @@ +import { IgniteClient } from "./client"; +import { GeneratedType } from "@cosmjs/proto-signing"; + +export type ModuleInterface = { [key: string]: any } +export type Module = (instance: IgniteClient) => { module: ModuleInterface, registry: [string, GeneratedType][] } diff --git a/ignite/pkg/cosmosgen/templates/root/package.json.tpl b/ignite/pkg/cosmosgen/templates/root/package.json.tpl new file mode 100644 index 0000000000..91fb500aec --- /dev/null +++ b/ignite/pkg/cosmosgen/templates/root/package.json.tpl @@ -0,0 +1,28 @@ +{ + "name": "{{ .PackageNS }}-client-ts", + "version": "0.0.1", + "description": "Autogenerated Typescript Client", + "author": "Ignite Codegen <hello@ignite.com>", + "license": "Apache-2.0", + "licenses": [ + { + "type": "Apache-2.0", + "url": "http://www.apache.org/licenses/LICENSE-2.0" + } + ], + "main": "index.ts", + "publishConfig": { + "access": "public" + }, + "dependencies": { + "@cosmjs/launchpad": "0.27.0", + "@cosmjs/proto-signing": "0.27.0", + "@cosmjs/stargate": "0.27.0", + "buffer": "^6.0.3" + }, + "peerDependencies": { + "@cosmjs/launchpad": "0.27.0", + "@cosmjs/proto-signing": "0.27.0", + "@cosmjs/stargate": "0.27.0" + } +} diff --git a/ignite/pkg/cosmosgen/templates/vuex/root/index.ts.tpl b/ignite/pkg/cosmosgen/templates/vue-root/index.ts.tpl similarity index 75% rename from ignite/pkg/cosmosgen/templates/vuex/root/index.ts.tpl rename to ignite/pkg/cosmosgen/templates/vue-root/index.ts.tpl index 17ec64ac00..3f587f2b8d 100644 --- a/ignite/pkg/cosmosgen/templates/vuex/root/index.ts.tpl +++ b/ignite/pkg/cosmosgen/templates/vue-root/index.ts.tpl @@ -1,10 +1,10 @@ // THIS FILE IS GENERATED AUTOMATICALLY. DO NOT MODIFY. -{{ range .Modules }}import {{ .FullName }} from './{{ .FullPath }}' +{{ range .Modules }}import {{ camelCaseUpperSta .Pkg.Name }} from './{{ .Pkg.Name }}' {{ end }} export default { - {{ range .Modules }}{{ .FullName }}: load({{ .FullName }}, '{{ .Path }}'), + {{ range .Modules }}{{ camelCaseUpperSta .Pkg.Name }}: load({{ camelCaseUpperSta .Pkg.Name }}, '{{ .Pkg.Name }}'), {{ end }} } @@ -24,4 +24,4 @@ function load(mod, fullns) { }) } } -} +} \ No newline at end of file diff --git a/ignite/pkg/cosmosgen/templates/vue-root/package.json.tpl b/ignite/pkg/cosmosgen/templates/vue-root/package.json.tpl new file mode 100644 index 0000000000..93cc740347 --- /dev/null +++ b/ignite/pkg/cosmosgen/templates/vue-root/package.json.tpl @@ -0,0 +1,26 @@ +{ + "name": "{{ .PackageNS }}-vue", + "version": "0.0.1", + "description": "Autogenerated Vue Utils", + "author": "Ignite Codegen <hello@ignite.com>", + "license": "Apache-2.0", + "licenses": [ + { + "type": "Apache-2.0", + "url": "http://www.apache.org/licenses/LICENSE-2.0" + } + ], + "main": "index.ts", + "publishConfig": { + "access": "public" + }, + "dependencies": { + "{{ .PackageNS }}-client": "0.0.1", + "buffer": "^6.0.3" + }, + "peerDependencies": { + "@cosmjs/proto-signing": "0.27.0", + "@cosmjs/stargate": "0.27.0", + "vue": "3.2.31" + } +} diff --git a/ignite/pkg/cosmosgen/templates/vuex/store/index.ts.tpl b/ignite/pkg/cosmosgen/templates/vue/index.ts.tpl similarity index 80% rename from ignite/pkg/cosmosgen/templates/vuex/store/index.ts.tpl rename to ignite/pkg/cosmosgen/templates/vue/index.ts.tpl index 8aca66ed23..10a9d7f9a7 100644 --- a/ignite/pkg/cosmosgen/templates/vuex/store/index.ts.tpl +++ b/ignite/pkg/cosmosgen/templates/vue/index.ts.tpl @@ -1,20 +1,12 @@ -import { txClient, queryClient, MissingWalletError , registry} from './module' +import { Client, registry, MissingWalletError } from '{{ .PackageNS }}-client-ts' -{{ range .Module.Types }}import { {{ .Name }} } from "./module/types/{{ resolveFile .FilePath }}" +{{ range .Module.Types }}import { {{ .Name }} } from "{{ $.PackageNS }}-client-ts/{{ $.Module.Pkg.Name }}/types" {{ end }} export { {{ range $i,$type:=.Module.Types }}{{ if (gt $i 0) }}, {{ end }}{{ $type.Name }}{{ end }} }; -async function initTxClient(vuexGetters) { - return await txClient(vuexGetters['common/wallet/signer'], { - addr: vuexGetters['common/env/apiTendermint'] - }) -} - -async function initQueryClient(vuexGetters) { - return await queryClient({ - addr: vuexGetters['common/env/apiCosmos'] - }) +function initClient(vuexGetters) { + return new Client(vuexGetters['common/env/getEnv'], vuexGetters['common/wallet/signer']) } function mergeResults(value, next_values) { @@ -28,17 +20,18 @@ function mergeResults(value, next_values) { return value } +type Field = { + name: string; + type: unknown; +} function getStructure(template) { - let structure = { fields: [] } + let structure: {fields: Field[]} = { fields: [] } for (const [key, value] of Object.entries(template)) { - let field: any = {} - field.name = key - field.type = typeof value + let field = { name: key, type: typeof value } structure.fields.push(field) } return structure } - const getDefaultState = () => { return { {{ range .Module.HTTPQueries }}{{ .Name }}: {}, @@ -123,15 +116,15 @@ export default { async {{ $FullName }}{{ $n }}({ commit, rootGetters, getters }, { options: { subscribe, all} = { subscribe:false, all:false}, params, query=null }) { try { const key = params ?? {}; - const queryClient=await initQueryClient(rootGetters) - let value= (await queryClient.{{ camelCaseSta $FullName -}} + const client = initClient(rootGetters); + let value= (await client.{{ camelCaseUpperSta $.Module.Pkg.Name }}.query.{{ camelCaseSta $FullName -}} {{- $n -}}( {{- range $j,$a :=$rule.Params -}} {{- if (gt $j 0) -}}, {{ end }} key.{{ $a -}} {{- end -}} {{- if $rule.HasQuery -}} {{- if $rule.Params -}}, {{ end -}} - query + query ?? undefined {{- end -}} {{- if $rule.HasBody -}} {{- if or $rule.HasQuery $rule.Params}},{{ end -}} @@ -141,9 +134,9 @@ export default { {{ if $rule.HasQuery }} while (all && (<any> value).pagination && (<any> value).pagination.next_key!=null) { - let next_values=(await queryClient.{{ camelCaseSta $FullName -}} + let next_values=(await client.{{ camelCaseUpperSta $.Module.Pkg.Name }}.query.{{ camelCaseSta $FullName -}} {{- $n -}}( - {{- range $j,$a :=$rule.Params }} key.{{$a}}, {{ end -}}{...query, 'pagination.key':(<any> value).pagination.next_key} + {{- range $j,$a :=$rule.Params }} key.{{$a}}, {{ end -}}{...query ?? {}, 'pagination.key':(<any> value).pagination.next_key} as any {{- if $rule.HasBody -}}, {...key} {{- end -}} )).data @@ -162,10 +155,8 @@ export default { {{ end }} {{ range .Module.Msgs }}async send{{ .Name }}({ rootGetters }, { value, fee = [], memo = '' }) { try { - const txClient=await initTxClient(rootGetters) - const msg = await txClient.{{ camelCase .Name }}(value) - const result = await txClient.signAndBroadcast([msg], {fee: { amount: fee, - gas: "200000" }, memo}) + const client=await initClient(rootGetters) + const result = await client.{{ camelCaseUpperSta $.Module.Pkg.Name }}.tx.send{{ .Name }}({ value, fee: {amount: fee, gas: "200000"}, memo }) return result } catch (e) { if (e == MissingWalletError) { @@ -178,8 +169,8 @@ export default { {{ end }} {{ range .Module.Msgs }}async {{ .Name }}({ rootGetters }, { value }) { try { - const txClient=await initTxClient(rootGetters) - const msg = await txClient.{{ camelCase .Name }}(value) + const client=initClient(rootGetters) + const msg = await client.{{ camelCaseUpperSta $.Module.Pkg.Name }}.tx.{{ camelCase .Name }}({value}) return msg } catch (e) { if (e == MissingWalletError) { diff --git a/ignite/pkg/cosmosgen/templates/vuex/root/package.json.tpl b/ignite/pkg/cosmosgen/templates/vuex/root/package.json.tpl deleted file mode 100644 index 9f3b392396..0000000000 --- a/ignite/pkg/cosmosgen/templates/vuex/root/package.json.tpl +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "{{ .PackageName }}", - "version": "0.1.0", - "description": "Autogenerated cosmos modules vuex store", - "author": "Starport Codegen <hello@tendermint.com>", - "license": "Apache-2.0", - "licenses": [ - { - "type": "Apache-2.0", - "url": "http://www.apache.org/licenses/LICENSE-2.0" - } - ], - "main": "index.js", - "publishConfig": { - "access": "public" - } -} diff --git a/ignite/pkg/cosmosgen/templates/vuex/root/readme.md b/ignite/pkg/cosmosgen/templates/vuex/root/readme.md deleted file mode 100644 index a9a292f4b9..0000000000 --- a/ignite/pkg/cosmosgen/templates/vuex/root/readme.md +++ /dev/null @@ -1 +0,0 @@ -THIS FOLDER IS GENERATED AUTOMATICALLY. DO NOT MODIFY. diff --git a/ignite/pkg/cosmosgen/templates/vuex/store/package.json.tpl b/ignite/pkg/cosmosgen/templates/vuex/store/package.json.tpl deleted file mode 100644 index 4c32beb0ba..0000000000 --- a/ignite/pkg/cosmosgen/templates/vuex/store/package.json.tpl +++ /dev/null @@ -1,18 +0,0 @@ -{ - "name": "{{ replace .Module.Pkg.Name "." "-" }}-js", - "version": "0.1.0", - "description": "Autogenerated vuex store for Cosmos module {{ .Module.Pkg.Name }}", - "author": "Starport Codegen <hello@tendermint.com>", - "homepage": "http://{{ .Module.Pkg.GoImportName }}", - "license": "Apache-2.0", - "licenses": [ - { - "type": "Apache-2.0", - "url": "http://www.apache.org/licenses/LICENSE-2.0" - } - ], - "main": "index.js", - "publishConfig": { - "access": "public" - } -} \ No newline at end of file diff --git a/ignite/pkg/cosmosgen/templates/vuex/store/vuex-root b/ignite/pkg/cosmosgen/templates/vuex/store/vuex-root deleted file mode 100644 index 0fcc121a15..0000000000 --- a/ignite/pkg/cosmosgen/templates/vuex/store/vuex-root +++ /dev/null @@ -1 +0,0 @@ -THIS FILE IS GENERATED AUTOMATICALLY. DO NOT DELETE. diff --git a/ignite/pkg/cosmosibckeeper/expected_keeper.go b/ignite/pkg/cosmosibckeeper/expected_keeper.go index f794b6a6c1..b7362fa096 100644 --- a/ignite/pkg/cosmosibckeeper/expected_keeper.go +++ b/ignite/pkg/cosmosibckeeper/expected_keeper.go @@ -3,8 +3,8 @@ package cosmosibckeeper 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" + channeltypes "github.com/cosmos/ibc-go/v5/modules/core/04-channel/types" + ibcexported "github.com/cosmos/ibc-go/v5/modules/core/exported" ) // ChannelKeeper defines the expected IBC channel keeper diff --git a/ignite/pkg/cosmosibckeeper/keeper.go b/ignite/pkg/cosmosibckeeper/keeper.go index 254e0e56fc..6b4ec35d76 100644 --- a/ignite/pkg/cosmosibckeeper/keeper.go +++ b/ignite/pkg/cosmosibckeeper/keeper.go @@ -1,17 +1,18 @@ package cosmosibckeeper import ( + storetypes "github.com/cosmos/cosmos-sdk/store/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" - host "github.com/cosmos/ibc-go/v3/modules/core/24-host" + channeltypes "github.com/cosmos/ibc-go/v5/modules/core/04-channel/types" + host "github.com/cosmos/ibc-go/v5/modules/core/24-host" ) // Keeper defines the IBC Keeper type Keeper struct { portKey []byte - storeKey sdk.StoreKey + storeKey storetypes.StoreKey ChannelKeeper ChannelKeeper PortKeeper PortKeeper ScopedKeeper ScopedKeeper @@ -20,7 +21,7 @@ type Keeper struct { // NewKeeper create an IBC Keeper func NewKeeper( portKey []byte, - storeKey sdk.StoreKey, + storeKey storetypes.StoreKey, channelKeeper ChannelKeeper, portKeeper PortKeeper, scopedKeeper ScopedKeeper, diff --git a/ignite/pkg/cosmosutil/genesis.go b/ignite/pkg/cosmosutil/genesis.go index 20c88bf54a..83ba8a7356 100644 --- a/ignite/pkg/cosmosutil/genesis.go +++ b/ignite/pkg/cosmosutil/genesis.go @@ -50,6 +50,9 @@ type ( BondDenom string `json:"bond_denom"` } `json:"params"` } `json:"staking"` + Genutil struct { + GenTxs []struct{} `json:"gen_txs"` + } `json:"genutil"` } `json:"app_state"` } @@ -59,7 +62,7 @@ type ( GenesisField func(fields) ) -// HasAccount check if account exist into the genesis account +// HasAccount checks if account exist into the genesis account func (g Genesis) HasAccount(address string) bool { for _, account := range g.Accounts { if account == address { @@ -69,6 +72,11 @@ func (g Genesis) HasAccount(address string) bool { return false } +// GenTxCount returns the number of gentxs inside the genesis +func (cg ChainGenesis) GenTxCount() int { + return len(cg.AppState.Genutil.GenTxs) +} + // WithKeyValue sets key and value field to genesis file func WithKeyValue(key, value string) GenesisField { return func(f fields) { @@ -129,7 +137,7 @@ func UpdateGenesis(genesisPath string, options ...GenesisField) error { return err } } - return os.WriteFile(genesisPath, genesisBytes, 0644) + return os.WriteFile(genesisPath, genesisBytes, 0o644) } // ParseGenesisFromPath parse ChainGenesis object from a genesis file diff --git a/ignite/pkg/cosmosutil/genesis_test.go b/ignite/pkg/cosmosutil/genesis_test.go index a9e3afcd38..2f1e9314fc 100644 --- a/ignite/pkg/cosmosutil/genesis_test.go +++ b/ignite/pkg/cosmosutil/genesis_test.go @@ -58,12 +58,14 @@ func TestParseChainGenesis(t *testing.T) { Address string `json:"address"` }{{Address: "cosmos1dd246yq6z5vzjz9gh8cff46pll75yyl8ygndsj"}} genesis1.AppState.Staking.Params.BondDenom = "stake" + genesis1.AppState.Genutil.GenTxs = []struct{}{{}} // 1 gentx genesis2 := cosmosutil.ChainGenesis{ChainID: "earth-1"} genesis2.AppState.Auth.Accounts = []struct { Address string `json:"address"` }{{Address: "cosmos1mmlqwyqk7neqegffp99q86eckpm4pjah3ytlpa"}} genesis2.AppState.Staking.Params.BondDenom = "stake" + genesis2.AppState.Genutil.GenTxs = []struct{}{{}} // 1 gentx tests := []struct { name string @@ -315,7 +317,7 @@ func TestUpdateGenesis(t *testing.T) { ), ) } - require.NoError(t, os.WriteFile(tmpGenesis, []byte(tt.args.genesis), 0644)) + require.NoError(t, os.WriteFile(tmpGenesis, []byte(tt.args.genesis), 0o644)) err := cosmosutil.UpdateGenesis(tmpGenesis, tt.args.options...) if tt.err != nil { require.Error(t, err) @@ -339,3 +341,36 @@ func TestUpdateGenesis(t *testing.T) { }) } } + +func TestChainGenesis_GenTxCount(t *testing.T) { + // create a genesis with 10 gentx + testChainGenesis := cosmosutil.ChainGenesis{} + for i := 0; i < 10; i++ { + testChainGenesis.AppState.Genutil.GenTxs = append( + testChainGenesis.AppState.Genutil.GenTxs, + struct{}{}, + ) + } + + tests := []struct { + name string + chainGenesis cosmosutil.ChainGenesis + expected int + }{ + { + name: "should return 0 for initialized chain genesis", + chainGenesis: cosmosutil.ChainGenesis{}, + expected: 0, + }, + { + name: "should return the number of gentxs", + chainGenesis: testChainGenesis, + expected: 10, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + require.EqualValues(t, tt.expected, tt.chainGenesis.GenTxCount()) + }) + } +} diff --git a/ignite/pkg/cosmosutil/gentx.go b/ignite/pkg/cosmosutil/gentx.go index ad6cc56bb5..ed03ea067f 100644 --- a/ignite/pkg/cosmosutil/gentx.go +++ b/ignite/pkg/cosmosutil/gentx.go @@ -7,9 +7,9 @@ import ( "fmt" "os" - "github.com/tendermint/tendermint/crypto/ed25519" - + sdkmath "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/tendermint/tendermint/crypto/ed25519" ) var GentxFilename = "gentx.json" @@ -82,7 +82,7 @@ func ParseGentx(gentx []byte) (info GentxInfo, file []byte, err error) { return info, gentx, fmt.Errorf("invalid validator public key %s", err.Error()) } - amount, ok := sdk.NewIntFromString(stargateGentx.Body.Messages[0].Value.Amount) + amount, ok := sdkmath.NewIntFromString(stargateGentx.Body.Messages[0].Value.Amount) if !ok { return info, gentx, errors.New("the self-delegation inside the gentx is invalid") } diff --git a/ignite/pkg/cosmosutil/gentx_test.go b/ignite/pkg/cosmosutil/gentx_test.go index d2fffcad40..35f5ca773b 100644 --- a/ignite/pkg/cosmosutil/gentx_test.go +++ b/ignite/pkg/cosmosutil/gentx_test.go @@ -4,6 +4,7 @@ import ( "encoding/base64" "testing" + sdkmath "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/stretchr/testify/require" "github.com/tendermint/tendermint/crypto/ed25519" @@ -31,7 +32,7 @@ func TestParseGentx(t *testing.T) { PubKey: ed25519.PubKey(pk1), SelfDelegation: sdk.Coin{ Denom: "stake", - Amount: sdk.NewInt(95000000), + Amount: sdkmath.NewInt(95000000), }, Memo: "9b1f4adbfb0c0b513040d914bfb717303c0eaa71@192.168.0.148:26656", }, @@ -43,7 +44,7 @@ func TestParseGentx(t *testing.T) { PubKey: ed25519.PubKey(pk2), SelfDelegation: sdk.Coin{ Denom: "stake", - Amount: sdk.NewInt(95000000), + Amount: sdkmath.NewInt(95000000), }, Memo: "a412c917cb29f73cc3ad0592bbd0152fe0e690bd@192.168.0.148:26656", }, diff --git a/ignite/pkg/dirchange/dirchange.go b/ignite/pkg/dirchange/dirchange.go index 8d721abd06..10627dd5b2 100644 --- a/ignite/pkg/dirchange/dirchange.go +++ b/ignite/pkg/dirchange/dirchange.go @@ -102,7 +102,6 @@ func ChecksumFromPaths(workdir string, paths ...string) ([]byte, error) { return nil }) - if err != nil { return []byte{}, err } diff --git a/ignite/pkg/dirchange/dirchange_test.go b/ignite/pkg/dirchange/dirchange_test.go index f9344a972e..b2b51ee341 100644 --- a/ignite/pkg/dirchange/dirchange_test.go +++ b/ignite/pkg/dirchange/dirchange_test.go @@ -33,15 +33,15 @@ func TestHasDirChecksumChanged(t *testing.T) { // Create directory tree dir1 := filepath.Join(tempDir, "foo1") - err = os.MkdirAll(dir1, 0700) + err = os.MkdirAll(dir1, 0o700) require.NoError(t, err) defer os.RemoveAll(dir1) dir2 := filepath.Join(tempDir, "foo2") - err = os.MkdirAll(dir2, 0700) + err = os.MkdirAll(dir2, 0o700) require.NoError(t, err) defer os.RemoveAll(dir2) dir3 := filepath.Join(tempDir, "foo3") - err = os.MkdirAll(dir3, 0700) + err = os.MkdirAll(dir3, 0o700) require.NoError(t, err) defer os.RemoveAll(dir3) @@ -53,17 +53,17 @@ func TestHasDirChecksumChanged(t *testing.T) { require.NoError(t, err) // Create files - err = os.WriteFile(filepath.Join(dir1, "foo"), []byte("some bytes"), 0644) + err = os.WriteFile(filepath.Join(dir1, "foo"), []byte("some bytes"), 0o644) require.NoError(t, err) - err = os.WriteFile(filepath.Join(dir11, "foo"), randomBytes(15), 0644) + err = os.WriteFile(filepath.Join(dir11, "foo"), randomBytes(15), 0o644) require.NoError(t, err) - err = os.WriteFile(filepath.Join(dir12, "foo"), randomBytes(20), 0644) + err = os.WriteFile(filepath.Join(dir12, "foo"), randomBytes(20), 0o644) require.NoError(t, err) - err = os.WriteFile(filepath.Join(dir21, "foo"), randomBytes(20), 0644) + err = os.WriteFile(filepath.Join(dir21, "foo"), randomBytes(20), 0o644) require.NoError(t, err) - err = os.WriteFile(filepath.Join(dir3, "foo1"), randomBytes(10), 0644) + err = os.WriteFile(filepath.Join(dir3, "foo1"), randomBytes(10), 0o644) require.NoError(t, err) - err = os.WriteFile(filepath.Join(dir3, "foo2"), randomBytes(10), 0644) + err = os.WriteFile(filepath.Join(dir3, "foo2"), randomBytes(10), 0o644) require.NoError(t, err) // Check checksum @@ -76,7 +76,7 @@ func TestHasDirChecksumChanged(t *testing.T) { // Checksum remains the same if a file is deleted and recreated with the same content err = os.Remove(filepath.Join(dir1, "foo")) require.NoError(t, err) - err = os.WriteFile(filepath.Join(dir1, "foo"), []byte("some bytes"), 0644) + err = os.WriteFile(filepath.Join(dir1, "foo"), []byte("some bytes"), 0o644) require.NoError(t, err) tmpChecksum, err := dirchange.ChecksumFromPaths("", paths...) require.NoError(t, err) @@ -100,7 +100,7 @@ func TestHasDirChecksumChanged(t *testing.T) { require.NotEqual(t, checksum, tmpChecksum) // Checksum changes if a file is modified - err = os.WriteFile(filepath.Join(dir3, "foo1"), randomBytes(10), 0644) + err = os.WriteFile(filepath.Join(dir3, "foo1"), randomBytes(10), 0o644) require.NoError(t, err) newChecksum, err := dirchange.ChecksumFromPaths("", paths...) require.NoError(t, err) @@ -108,11 +108,11 @@ func TestHasDirChecksumChanged(t *testing.T) { // Error if no files in the specified dirs empty1 := filepath.Join(tempDir, "empty1") - err = os.MkdirAll(empty1, 0700) + err = os.MkdirAll(empty1, 0o700) require.NoError(t, err) defer os.RemoveAll(empty1) empty2 := filepath.Join(tempDir, "empty2") - err = os.MkdirAll(empty2, 0700) + err = os.MkdirAll(empty2, 0o700) require.NoError(t, err) defer os.RemoveAll(empty2) _, err = dirchange.ChecksumFromPaths("", empty1, empty2) @@ -150,7 +150,7 @@ func TestHasDirChecksumChanged(t *testing.T) { require.True(t, changed) // Return true if it has been changed - err = os.WriteFile(filepath.Join(dir21, "bar"), randomBytes(20), 0644) + err = os.WriteFile(filepath.Join(dir21, "bar"), randomBytes(20), 0o644) require.NoError(t, err) changed, err = dirchange.HasDirChecksumChanged(cache, ChecksumKey, "", paths...) require.NoError(t, err) diff --git a/ignite/pkg/goanalysis/goanalysis.go b/ignite/pkg/goanalysis/goanalysis.go index da519a9ee8..79521c0023 100644 --- a/ignite/pkg/goanalysis/goanalysis.go +++ b/ignite/pkg/goanalysis/goanalysis.go @@ -15,10 +15,8 @@ const ( goFileExtension = ".go" ) -var ( - // ErrMultipleMainPackagesFound is returned when multiple main packages found while expecting only one. - ErrMultipleMainPackagesFound = errors.New("multiple main packages found") -) +// ErrMultipleMainPackagesFound is returned when multiple main packages found while expecting only one. +var ErrMultipleMainPackagesFound = errors.New("multiple main packages found") // DiscoverMain finds main Go packages under path. func DiscoverMain(path string) (pkgPaths []string, err error) { diff --git a/ignite/pkg/goanalysis/goanalysis_test.go b/ignite/pkg/goanalysis/goanalysis_test.go index 7d8e4b0c23..f19578b9df 100644 --- a/ignite/pkg/goanalysis/goanalysis_test.go +++ b/ignite/pkg/goanalysis/goanalysis_test.go @@ -142,11 +142,11 @@ func createMainFiles(tmpDir string, mainFiles []string) (pathsWithMain []string, mainFile := filepath.Join(tmpDir, mf) dir := filepath.Dir(mainFile) - if err = os.MkdirAll(dir, 0770); err != nil { + if err = os.MkdirAll(dir, 0o770); err != nil { return nil, err } - if err = os.WriteFile(mainFile, MainFile, 0644); err != nil { + if err = os.WriteFile(mainFile, MainFile, 0o644); err != nil { return nil, err } @@ -160,7 +160,7 @@ func TestFindImportedPackages(t *testing.T) { tmpDir := t.TempDir() tmpFile := filepath.Join(tmpDir, "app.go") - err := os.WriteFile(tmpFile, ImportFile, 0644) + err := os.WriteFile(tmpFile, ImportFile, 0o644) require.NoError(t, err) packages, err := goanalysis.FindImportedPackages(tmpFile) diff --git a/ignite/pkg/localfs/save.go b/ignite/pkg/localfs/save.go index 2c84d71f1b..a06c984df6 100644 --- a/ignite/pkg/localfs/save.go +++ b/ignite/pkg/localfs/save.go @@ -1,10 +1,9 @@ package localfs import ( + "io/fs" "os" "path/filepath" - - "io/fs" ) // SaveTemp saves file system f to a temporary path in the local file system @@ -64,7 +63,7 @@ func Save(f fs.FS, path string) error { out := filepath.Join(path, wpath) if d.IsDir() { - return os.MkdirAll(out, 0744) + return os.MkdirAll(out, 0o744) } content, err := fs.ReadFile(f, wpath) @@ -72,6 +71,6 @@ func Save(f fs.FS, path string) error { return err } - return os.WriteFile(out, content, 0644) + return os.WriteFile(out, content, 0o644) }) } diff --git a/ignite/pkg/localfs/search_test.go b/ignite/pkg/localfs/search_test.go index 4e1c91d41c..84c88f8cc7 100644 --- a/ignite/pkg/localfs/search_test.go +++ b/ignite/pkg/localfs/search_test.go @@ -15,9 +15,9 @@ func setupGlobTests(t *testing.T, files []string) string { for _, file := range files { fileDir := filepath.Dir(file) fileDir = filepath.Join(tmpdir, fileDir) - err := os.MkdirAll(fileDir, 0755) + err := os.MkdirAll(fileDir, 0o755) require.NoError(t, err) - err = os.WriteFile(filepath.Join(tmpdir, file), []byte{}, 0644) + err = os.WriteFile(filepath.Join(tmpdir, file), []byte{}, 0o644) require.NoError(t, err) } return tmpdir diff --git a/ignite/pkg/multiformatname/multiformatname.go b/ignite/pkg/multiformatname/multiformatname.go index b11db197c2..e22bae3c0c 100644 --- a/ignite/pkg/multiformatname/multiformatname.go +++ b/ignite/pkg/multiformatname/multiformatname.go @@ -7,6 +7,8 @@ import ( "strings" "github.com/iancoleman/strcase" + + "github.com/ignite/cli/ignite/pkg/xstrings" ) // Name represents a name with multiple naming convention representations @@ -83,7 +85,7 @@ func basicCheckName(name string) error { func lowercase(name string) string { return strings.ToLower( strings.ReplaceAll( - strings.ReplaceAll(name, "-", ""), + xstrings.NoDash(name), "_", "", ), diff --git a/ignite/pkg/nodetime/data/nodetime-darwin-amd64.tar.gz b/ignite/pkg/nodetime/data/nodetime-darwin-amd64.tar.gz index 52912c3cec..829c8acc73 100644 Binary files a/ignite/pkg/nodetime/data/nodetime-darwin-amd64.tar.gz and b/ignite/pkg/nodetime/data/nodetime-darwin-amd64.tar.gz differ diff --git a/ignite/pkg/nodetime/data/nodetime-darwin-arm64.tar.gz b/ignite/pkg/nodetime/data/nodetime-darwin-arm64.tar.gz index f0647b6cbf..8787ebb327 100644 Binary files a/ignite/pkg/nodetime/data/nodetime-darwin-arm64.tar.gz and b/ignite/pkg/nodetime/data/nodetime-darwin-arm64.tar.gz differ diff --git a/ignite/pkg/nodetime/data/nodetime-linux-amd64.tar.gz b/ignite/pkg/nodetime/data/nodetime-linux-amd64.tar.gz index c10ebdfd19..1a747dc3ca 100644 Binary files a/ignite/pkg/nodetime/data/nodetime-linux-amd64.tar.gz and b/ignite/pkg/nodetime/data/nodetime-linux-amd64.tar.gz differ diff --git a/ignite/pkg/nodetime/data/nodetime-linux-arm64.tar.gz b/ignite/pkg/nodetime/data/nodetime-linux-arm64.tar.gz index 0c886d11fa..a57a199d48 100644 Binary files a/ignite/pkg/nodetime/data/nodetime-linux-arm64.tar.gz and b/ignite/pkg/nodetime/data/nodetime-linux-arm64.tar.gz differ diff --git a/ignite/pkg/nodetime/nodetime.go b/ignite/pkg/nodetime/nodetime.go index 40a2840c9d..229aab7e50 100644 --- a/ignite/pkg/nodetime/nodetime.go +++ b/ignite/pkg/nodetime/nodetime.go @@ -70,7 +70,7 @@ func Binary() []byte { // Command setups the nodetime binary and returns the command needed to execute c. func Command(c CommandName) (command []string, cleanup func(), err error) { cs := string(c) - path, cleanup, err := localfs.SaveBytesTemp(Binary(), cs, 0755) + path, cleanup, err := localfs.SaveBytesTemp(Binary(), cs, 0o755) if err != nil { return nil, nil, err } diff --git a/ignite/pkg/nodetime/programs/sta/sta.go b/ignite/pkg/nodetime/programs/sta/sta.go index 272e989c41..9e15dc976f 100644 --- a/ignite/pkg/nodetime/programs/sta/sta.go +++ b/ignite/pkg/nodetime/programs/sta/sta.go @@ -9,13 +9,59 @@ import ( "github.com/ignite/cli/ignite/pkg/nodetime" ) +// Option configures Generate configs. +type Option func(*configs) + +// Configs holds Generate configs. +type configs struct { + command Cmd +} + +// WithCommand assigns a typescript API generator command to use for code generation. +// This allows to use a single nodetime STA generator binary in multiple code generation +// calls. Otherwise `Generate` creates a new generator binary each time it is called. +func WithCommand(command Cmd) Option { + return func(c *configs) { + c.command = command + } +} + +// Cmd contains the information necessary to execute the typescript API generator command. +type Cmd struct { + command []string +} + +// Command returns the strings to execute the typescript API generator command. +func (c Cmd) Command() []string { + return c.command +} + +// Command sets the typescript API generator binary up and returns the command needed to execute it. +func Command() (command Cmd, cleanup func(), err error) { + c, cleanup, err := nodetime.Command(nodetime.CommandSTA) + command = Cmd{c} + return +} + // Generate generates client code and TS types to outPath from an OpenAPI spec that resides at specPath. -func Generate(ctx context.Context, outPath, specPath, moduleNameIndex string) error { - command, cleanup, err := nodetime.Command(nodetime.CommandSTA) - if err != nil { - return err +func Generate(ctx context.Context, outPath, specPath string, options ...Option) error { + c := configs{} + + for _, o := range options { + o(&c) + } + + command := c.command.Command() + if command == nil { + cmd, cleanup, err := Command() + if err != nil { + return err + } + + defer cleanup() + + command = cmd.Command() } - defer cleanup() dir := filepath.Dir(outPath) file := filepath.Base(outPath) @@ -23,7 +69,7 @@ func Generate(ctx context.Context, outPath, specPath, moduleNameIndex string) er // command constructs the sta command. command = append(command, []string{ "--module-name-index", - moduleNameIndex, + "-1", // -1 removes the route namespace "-p", specPath, "-o", diff --git a/ignite/pkg/nodetime/programs/ts-proto/tsproto.go b/ignite/pkg/nodetime/programs/ts-proto/tsproto.go index 8826344ab4..fd90252989 100644 --- a/ignite/pkg/nodetime/programs/ts-proto/tsproto.go +++ b/ignite/pkg/nodetime/programs/ts-proto/tsproto.go @@ -10,7 +10,10 @@ import ( "github.com/ignite/cli/ignite/pkg/nodetime" ) -const pluginName = "protoc-gen-ts_proto" +const ( + pluginName = "protoc-gen-ts_proto" + scriptTemplate = "#!/bin/bash\n%s $@\n" +) // BinaryPath returns the path to the binary of the ts-proto plugin so it can be passed to // protoc via --plugin option. @@ -19,22 +22,44 @@ const pluginName = "protoc-gen-ts_proto" // will be protoc-gen-ts_proto. // see why: https://github.com/stephenh/ts-proto/blob/7f76c05/README.markdown#quickstart. func BinaryPath() (path string, cleanup func(), err error) { - var command []string + // Create binary for the TypeScript protobuf generator + command, cleanupBin, err := nodetime.Command(nodetime.CommandTSProto) + if err != nil { + return + } - command, cleanup, err = nodetime.Command(nodetime.CommandTSProto) + defer func() { + if err != nil { + cleanupBin() + } + }() + + // Create a random directory for the script that runs the TypeScript protobuf generator. + // This is required to avoid potential flaky integration tests caused by one concurrent + // test overwriting the generator script while it is being run in a separate test process. + tmpDir, err := os.MkdirTemp("", "ts_proto_plugin") if err != nil { return } - tmpdir := os.TempDir() - path = filepath.Join(tmpdir, pluginName) + cleanupScriptDir := func() { os.RemoveAll(tmpDir) } + + defer func() { + if err != nil { + cleanupScriptDir() + } + }() - // comforting protoc by giving protoc-gen-ts_proto name to the plugin's binary. - script := fmt.Sprintf(`#!/bin/bash -%s "$@" -`, strings.Join(command, " ")) + cleanup = func() { + cleanupBin() + cleanupScriptDir() + } - err = os.WriteFile(path, []byte(script), 0755) + // Wrap the TypeScript protobuf generator in a script with a fixed name + // located in a random temporary directory. + script := fmt.Sprintf(scriptTemplate, strings.Join(command, " ")) + path = filepath.Join(tmpDir, pluginName) + err = os.WriteFile(path, []byte(script), 0o755) - return + return path, cleanup, err } diff --git a/ignite/pkg/nodetime/programs/ts-relayer/tsrelayer.go b/ignite/pkg/nodetime/programs/ts-relayer/tsrelayer.go index 4231296157..fa963b9407 100644 --- a/ignite/pkg/nodetime/programs/ts-relayer/tsrelayer.go +++ b/ignite/pkg/nodetime/programs/ts-relayer/tsrelayer.go @@ -31,7 +31,7 @@ func Call(ctx context.Context, method string, args, reply interface{}) error { resr, resw := io.Pipe() - g := errgroup.Group{} + g, ctx := errgroup.WithContext(ctx) g.Go(func() error { defer resw.Close() diff --git a/ignite/pkg/protoc-gen-dart/protoc-gen-dart.go b/ignite/pkg/protoc-gen-dart/protoc-gen-dart.go index 77ab4278fd..998df83a81 100644 --- a/ignite/pkg/protoc-gen-dart/protoc-gen-dart.go +++ b/ignite/pkg/protoc-gen-dart/protoc-gen-dart.go @@ -12,7 +12,7 @@ const Name = "protoc-gen-dart" // BinaryPath returns the binary path for the plugin. func BinaryPath() (path string, cleanup func(), err error) { - return localfs.SaveBytesTemp(data.Binary(), Name, 0755) + return localfs.SaveBytesTemp(data.Binary(), Name, 0o755) } // Flag returns the binary name-binary path format to pass to protoc --plugin. diff --git a/ignite/pkg/protoc/protoc.go b/ignite/pkg/protoc/protoc.go index f635206a41..c884e15883 100644 --- a/ignite/pkg/protoc/protoc.go +++ b/ignite/pkg/protoc/protoc.go @@ -24,6 +24,7 @@ type configs struct { isGeneratedDepsEnabled bool pluginOptions []string env []string + command Cmd } // Plugin configures a plugin for code generation. @@ -49,14 +50,34 @@ func Env(v ...string) Option { } } +// WithCommand assigns a protoc command to use for code generation. +// This allows to use a single protoc binary in multiple code generation calls. +// Otherwise `Generate` creates a new protoc binary each time it is called. +func WithCommand(command Cmd) Option { + return func(c *configs) { + c.command = command + } +} + +// Cmd contains the information necessary to execute the protoc command. type Cmd struct { - Command []string - Included []string + command []string + includes []string +} + +// Command returns the strings to execute the `protoc` command. +func (c Cmd) Command() []string { + return c.command +} + +// Includes returns the proto files import paths. +func (c Cmd) Includes() []string { + return c.includes } // Command sets the protoc binary up and returns the command needed to execute c. func Command() (command Cmd, cleanup func(), err error) { - path, cleanupProto, err := localfs.SaveBytesTemp(data.Binary(), "protoc", 0755) + path, cleanupProto, err := localfs.SaveBytesTemp(data.Binary(), "protoc", 0o755) if err != nil { return Cmd{}, nil, err } @@ -73,8 +94,8 @@ func Command() (command Cmd, cleanup func(), err error) { } command = Cmd{ - Command: []string{path, "-I", include}, - Included: []string{include}, + command: []string{path, "-I", include}, + includes: []string{include}, } return command, cleanup, nil @@ -88,13 +109,21 @@ func Generate(ctx context.Context, outDir, protoPath string, includePaths, proto o(&c) } - cmd, cleanup, err := Command() - if err != nil { - return err - } - defer cleanup() + // init the string to run the protoc command and the proto files import path + command := c.command.Command() + includes := c.command.Includes() + + if command == nil { + cmd, cleanup, err := Command() + if err != nil { + return err + } - command := cmd.Command + defer cleanup() + + command = cmd.Command() + includes = cmd.Includes() + } // add plugin if set. if c.pluginPath != "" { @@ -116,7 +145,7 @@ func Generate(ctx context.Context, outDir, protoPath string, includePaths, proto } // find out the list of proto files to generate code for and perform code generation. - files, err := discoverFiles(ctx, c, protoPath, append(cmd.Included, existentIncludePaths...), protoanalysis.NewCache()) + files, err := discoverFiles(ctx, c, protoPath, append(includes, existentIncludePaths...), protoanalysis.NewCache()) if err != nil { return err } @@ -150,7 +179,8 @@ func Generate(ctx context.Context, outDir, protoPath string, includePaths, proto // ones may need to be discovered as well. some protoc plugins already do this discovery internally but // for the ones that don't, it needs to be handled here if GenerateDependencies() is enabled. func discoverFiles(ctx context.Context, c configs, protoPath string, includePaths []string, cache protoanalysis.Cache) ( - discovered []string, err error) { + discovered []string, err error, +) { packages, err := protoanalysis.Parse(ctx, cache, protoPath) if err != nil { return nil, err diff --git a/ignite/pkg/relayer/chain.go b/ignite/pkg/relayer/chain.go index 0955da6654..cbcbf2c6e6 100644 --- a/ignite/pkg/relayer/chain.go +++ b/ignite/pkg/relayer/chain.go @@ -21,9 +21,7 @@ const ( OrderingOrdered = "ORDER_ORDERED" ) -var ( - errEndpointExistsWithDifferentChainID = errors.New("rpc endpoint already exists with a different chain id") -) +var errEndpointExistsWithDifferentChainID = errors.New("rpc endpoint already exists with a different chain id") // Chain represents a chain in relayer. type Chain struct { @@ -100,8 +98,9 @@ func WithClientID(clientID string) Option { } // NewChain creates a new chain on relayer or uses the existing matching chain. -func (r Relayer) NewChain(ctx context.Context, accountName, rpcAddress string, options ...Option) ( - *Chain, cosmosaccount.Account, error) { +func (r Relayer) NewChain(accountName, rpcAddress string, options ...Option) ( + *Chain, cosmosaccount.Account, error, +) { c := &Chain{ accountName: accountName, rpcAddress: fixRPCAddress(rpcAddress), @@ -113,10 +112,6 @@ func (r Relayer) NewChain(ctx context.Context, accountName, rpcAddress string, o o(c) } - if err := c.ensureChainSetup(ctx); err != nil { - return nil, cosmosaccount.Account{}, err - } - account, err := r.ca.GetByName(accountName) if err != nil { return nil, cosmosaccount.Account{}, err @@ -132,7 +127,10 @@ func (c *Chain) TryRetrieve(ctx context.Context) (sdk.Coins, error) { return nil, err } - addr := acc.Address(c.addressPrefix) + addr, err := acc.Address(c.addressPrefix) + if err != nil { + return nil, err + } if err = cosmosfaucet.TryRetrieve(ctx, c.ID, c.rpcAddress, c.faucetAddress, addr); err != nil { return nil, err @@ -140,6 +138,18 @@ func (c *Chain) TryRetrieve(ctx context.Context) (sdk.Coins, error) { return c.r.balance(ctx, c.rpcAddress, c.accountName, c.addressPrefix) } +func (c *Chain) Config() relayerconfig.Chain { + return relayerconfig.Chain{ + ID: c.ID, + Account: c.accountName, + AddressPrefix: c.addressPrefix, + RPCAddress: c.rpcAddress, + GasPrice: c.gasPrice, + GasLimit: c.gasLimit, + ClientID: c.clientID, + } +} + // channelOptions represents options for configuring the IBC channel between two chains type channelOptions struct { sourcePort string @@ -215,7 +225,7 @@ func (c *Chain) Connect(dst *Chain, options ...ChannelOption) (id string, err er // determine a unique path name from chain ids with incremental numbers. e.g.: // - src-dst // - src-dst-2 - pathID := fmt.Sprintf("%s-%s", c.ID, dst.ID) + pathID := PathID(c.ID, dst.ID) var suffix string i := 2 for { @@ -252,8 +262,8 @@ func (c *Chain) Connect(dst *Chain, options ...ChannelOption) (id string, err er return pathID, nil } -// ensureChainSetup sets up the new or existing chain. -func (c *Chain) ensureChainSetup(ctx context.Context) error { +// EnsureChainSetup sets up the new or existing chain. +func (c *Chain) EnsureChainSetup(ctx context.Context) error { client, err := cosmosclient.New(ctx, cosmosclient.WithNodeAddress(c.rpcAddress)) if err != nil { return err @@ -264,16 +274,7 @@ func (c *Chain) ensureChainSetup(ctx context.Context) error { } c.ID = status.NodeInfo.Network - confChain := relayerconfig.Chain{ - ID: c.ID, - Account: c.accountName, - AddressPrefix: c.addressPrefix, - RPCAddress: c.rpcAddress, - GasPrice: c.gasPrice, - GasLimit: c.gasLimit, - ClientID: c.clientID, - } - + confChain := c.Config() conf, err := relayerconfig.Get() if err != nil { return err @@ -302,3 +303,8 @@ func (c *Chain) ensureChainSetup(ctx context.Context) error { return relayerconfig.Save(conf) } + +// PathID creates path name from chain ids +func PathID(srcChainID, dstChainID string) string { + return fmt.Sprintf("%s-%s", srcChainID, dstChainID) +} diff --git a/ignite/pkg/relayer/config/config.go b/ignite/pkg/relayer/config/config.go index 974b03728a..bd0949e0a6 100644 --- a/ignite/pkg/relayer/config/config.go +++ b/ignite/pkg/relayer/config/config.go @@ -10,12 +10,14 @@ import ( "github.com/ignite/cli/ignite/pkg/confile" ) -const supportVersion = "2" +const SupportVersion = "2" var configPath = os.ExpandEnv("$HOME/.ignite/relayer/config.yml") -var ErrChainCannotBeFound = errors.New("chain cannot be found") -var ErrPathCannotBeFound = errors.New("path cannot be found") +var ( + ErrChainCannotBeFound = errors.New("chain cannot be found") + ErrPathCannotBeFound = errors.New("path cannot be found") +) type Config struct { Version string `json:"version" yaml:"version"` @@ -83,14 +85,14 @@ func Get() (Config, error) { if err := confile.New(confile.DefaultYAMLEncodingCreator, configPath).Load(&c); err != nil { return c, err } - if !reflect.DeepEqual(c, Config{}) && c.Version != supportVersion { + if !reflect.DeepEqual(c, Config{}) && c.Version != SupportVersion { return c, fmt.Errorf("your relayer setup is outdated. run 'rm %s' and configure relayer again", configPath) } return c, nil } func Save(c Config) error { - c.Version = supportVersion + c.Version = SupportVersion return confile.New(confile.DefaultYAMLEncodingCreator, configPath).Save(c) } diff --git a/ignite/pkg/relayer/relayer.go b/ignite/pkg/relayer/relayer.go index 7b0ca7666d..281865bd5f 100644 --- a/ignite/pkg/relayer/relayer.go +++ b/ignite/pkg/relayer/relayer.go @@ -2,14 +2,15 @@ package relayer import ( "context" + "encoding/hex" "fmt" "strings" "sync" "time" + "github.com/cosmos/cosmos-sdk/crypto" sdk "github.com/cosmos/cosmos-sdk/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - "golang.org/x/sync/errgroup" "github.com/ignite/cli/ignite/pkg/cosmosaccount" "github.com/ignite/cli/ignite/pkg/cosmosclient" @@ -20,6 +21,7 @@ import ( ) const ( + algoSecp256k1 = "secp256k1" ibcSetupGas int64 = 2256000 relayDuration = time.Second * 5 ) @@ -36,88 +38,108 @@ func New(ca cosmosaccount.Registry) Relayer { } } -// Link links all chains that has a path to each other. +// LinkPaths links all chains that has a path from config file to each other. // paths are optional and acts as a filter to only link some chains. // calling Link multiple times for the same paths does not have any side effects. -func (r Relayer) Link(ctx context.Context, pathIDs ...string) error { +func (r Relayer) LinkPaths( + ctx context.Context, + pathIDs ...string, +) error { conf, err := relayerconf.Get() if err != nil { return err } for _, id := range pathIDs { - path, err := conf.PathByID(id) + conf, err = r.Link(ctx, conf, id) if err != nil { return err } - - if path.Src.ChannelID != "" { // already linked. - continue - } - - if path, err = r.call(ctx, conf, path, "link"); err != nil { - return err - } - - if err := conf.UpdatePath(path); err != nil { - return err - } if err := relayerconf.Save(conf); err != nil { return err } } - return nil } -// Start relays packets for linked paths until ctx is canceled. -func (r Relayer) Start(ctx context.Context, pathIDs ...string) error { +// Link links chain path to each other. +func (r Relayer) Link( + ctx context.Context, + conf relayerconf.Config, + pathID string, +) (relayerconf.Config, error) { + path, err := conf.PathByID(pathID) + if err != nil { + return conf, err + } + + if path.Src.ChannelID != "" { + return conf, fmt.Errorf("path %s already linked", path.ID) + } + + if path, err = r.call(ctx, conf, path, "link"); err != nil { + return conf, err + } + + return conf, conf.UpdatePath(path) +} + +// StartPaths relays packets for linked paths from config file until ctx is canceled. +func (r Relayer) StartPaths(ctx context.Context, pathIDs ...string) error { conf, err := relayerconf.Get() if err != nil { return err } - wg, ctx := errgroup.WithContext(ctx) var m sync.Mutex // protects relayerconf.Path. - - start := func(id string) error { - path, err := conf.PathByID(id) + for _, id := range pathIDs { + id := id + err := r.Start(ctx, conf, id, func(path relayerconf.Config) error { + m.Lock() + defer m.Unlock() + return relayerconf.Save(conf) + }) if err != nil { return err } + } + return nil +} - if path, err = r.call(ctx, conf, path, "start"); err != nil { +// Start relays packets for linked path until ctx is canceled. +func (r Relayer) Start( + ctx context.Context, + conf relayerconf.Config, + pathID string, + postExecute func(path relayerconf.Config) error, +) error { + return ctxticker.DoNow(ctx, relayDuration, func() error { + path, err := conf.PathByID(pathID) + if err != nil { return err } - - m.Lock() - defer m.Unlock() - - conf, err := relayerconf.Get() + path, err = r.call(ctx, conf, path, "start") if err != nil { return err } - if err := conf.UpdatePath(path); err != nil { return err } - - return relayerconf.Save(conf) - } - - for _, id := range pathIDs { - id := id - - wg.Go(func() error { - return ctxticker.DoNow(ctx, relayDuration, func() error { return start(id) }) - }) - } - - return wg.Wait() + if postExecute != nil { + return postExecute(conf) + } + return nil + }) } -func (r Relayer) call(ctx context.Context, conf relayerconf.Config, path relayerconf.Path, action string) ( - reply relayerconf.Path, err error) { +func (r Relayer) call( + ctx context.Context, + conf relayerconf.Config, + path relayerconf.Path, + action string, +) ( + reply relayerconf.Path, err error, +) { srcChain, srcKey, err := r.prepare(ctx, conf, path.Src.ChainID) if err != nil { return relayerconf.Path{}, err @@ -139,7 +161,8 @@ func (r Relayer) call(ctx context.Context, conf relayerconf.Config, path relayer } func (r Relayer) prepare(ctx context.Context, conf relayerconf.Config, chainID string) ( - chain relayerconf.Chain, privKey string, err error) { + chain relayerconf.Chain, privKey string, err error, +) { chain, err = conf.ChainByID(chainID) if err != nil { return relayerconf.Chain{}, "", err @@ -160,8 +183,13 @@ func (r Relayer) prepare(ctx context.Context, conf relayerconf.Config, chainID s return relayerconf.Chain{}, "", err } + addr, err := account.Address(chain.AddressPrefix) + if err != nil { + return relayerconf.Chain{}, "", err + } + errMissingBalance := fmt.Errorf(`account "%s(%s)" on %q chain does not have enough balances`, - account.Address(chain.AddressPrefix), + addr, chain.Account, chain.ID, ) @@ -180,12 +208,25 @@ func (r Relayer) prepare(ctx context.Context, conf relayerconf.Config, chainID s } } - key, err := r.ca.ExportHex(chain.Account, "") + // Get the key in ASCII armored format + passphrase := "" + key, err := r.ca.Export(chain.Account, passphrase) if err != nil { return relayerconf.Chain{}, "", err } - return chain, key, nil + // Unarmor the key to be able to read it as bytes + priv, algo, err := crypto.UnarmorDecryptPrivKey(key, passphrase) + if err != nil { + return relayerconf.Chain{}, "", err + } + + // Check the algorithm because the TS relayer expects a secp256k1 private key + if algo != algoSecp256k1 { + return relayerconf.Chain{}, "", fmt.Errorf("private key algorithm must be secp256k1 instead of %s", algo) + } + + return chain, hex.EncodeToString(priv.Bytes()), nil } func (r Relayer) balance(ctx context.Context, rpcAddress, account, addressPrefix string) (sdk.Coins, error) { @@ -199,7 +240,10 @@ func (r Relayer) balance(ctx context.Context, rpcAddress, account, addressPrefix return nil, err } - addr := acc.Address(addressPrefix) + addr, err := acc.Address(addressPrefix) + if err != nil { + return nil, err + } queryClient := banktypes.NewQueryClient(client.Context()) res, err := queryClient.AllBalances(ctx, &banktypes.QueryAllBalancesRequest{Address: addr}) diff --git a/ignite/pkg/repoversion/repoversion.go b/ignite/pkg/repoversion/repoversion.go index f809667f1c..c5b31a2c14 100644 --- a/ignite/pkg/repoversion/repoversion.go +++ b/ignite/pkg/repoversion/repoversion.go @@ -45,7 +45,6 @@ func Determine(path string) (v Version, err error) { idMap := make(map[string]int) err = cIter.ForEach(func(c *object.Commit) error { - idMap[c.Hash.String()] = commitIndex commitIndex++ @@ -81,7 +80,6 @@ func Determine(path string) (v Version, err error) { } commit, err := repo.CommitObject(t.Hash()) - if err != nil { return err } diff --git a/ignite/pkg/xos/mv.go b/ignite/pkg/xos/mv.go new file mode 100644 index 0000000000..e92e51801d --- /dev/null +++ b/ignite/pkg/xos/mv.go @@ -0,0 +1,33 @@ +package xos + +import ( + "fmt" + "io" + "os" +) + +// Rename copy oldpath to newpath and then delete oldpath. +// Unlike os.Rename, it doesn't fail when the oldpath and newpath are in +// different partitions (error: invalid cross-device link). +func Rename(oldpath, newpath string) error { + inputFile, err := os.Open(oldpath) + if err != nil { + return fmt.Errorf("rename %s %s: couldn't open oldpath: %w", oldpath, newpath, err) + } + defer inputFile.Close() + outputFile, err := os.Create(newpath) + if err != nil { + return fmt.Errorf("rename %s %s: couldn't open dest file: %w", oldpath, newpath, err) + } + defer outputFile.Close() + _, err = io.Copy(outputFile, inputFile) + if err != nil { + return fmt.Errorf("rename %s %s: writing to output file failed: %w", oldpath, newpath, err) + } + // The copy was successful, so now delete the original file + err = os.Remove(oldpath) + if err != nil { + return fmt.Errorf("rename %s %s: failed removing original file: %w", oldpath, newpath, err) + } + return nil +} diff --git a/ignite/pkg/xos/mv_test.go b/ignite/pkg/xos/mv_test.go new file mode 100644 index 0000000000..c991d31b6d --- /dev/null +++ b/ignite/pkg/xos/mv_test.go @@ -0,0 +1,32 @@ +package xos_test + +import ( + "fmt" + "os" + "path" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/ignite/cli/ignite/pkg/xos" +) + +func TestRename(t *testing.T) { + var ( + dir = t.TempDir() + oldpath = path.Join(dir, "old") + newpath = path.Join(dir, "new") + require = require.New(t) + ) + err := os.WriteFile(oldpath, []byte("foo"), os.ModePerm) + require.NoError(err) + + err = xos.Rename(oldpath, newpath) + + require.NoError(err) + bz, err := os.ReadFile(newpath) + require.NoError(err) + require.Equal([]byte("foo"), bz) + _, err = os.Open(oldpath) + require.EqualError(err, fmt.Sprintf("open %s: no such file or directory", oldpath)) +} diff --git a/ignite/pkg/xtime/clock.go b/ignite/pkg/xtime/clock.go new file mode 100644 index 0000000000..55359a9752 --- /dev/null +++ b/ignite/pkg/xtime/clock.go @@ -0,0 +1,49 @@ +package xtime + +import "time" + +// Clock represents a clock that can retrieve current time +type Clock interface { + Now() time.Time + Add(duration time.Duration) +} + +// ClockSystem is a clock that retrieves system time +type ClockSystem struct{} + +// NewClockSystem returns a new ClockSystem +func NewClockSystem() ClockSystem { + return ClockSystem{} +} + +// Now implements Clock +func (ClockSystem) Now() time.Time { + return time.Now() +} + +// Add implements Clock +func (ClockSystem) Add(_ time.Duration) { + panic("Add can't be called for ClockSystem") +} + +// ClockMock is a clock mocking time with an internal counter +type ClockMock struct { + t time.Time +} + +// NewClockMock returns a new ClockMock +func NewClockMock(originalTime time.Time) *ClockMock { + return &ClockMock{ + t: originalTime, + } +} + +// Now implements Clock +func (c ClockMock) Now() time.Time { + return c.t +} + +// Add implements Clock +func (c *ClockMock) Add(duration time.Duration) { + c.t = c.t.Add(duration) +} diff --git a/ignite/pkg/xtime/clock_test.go b/ignite/pkg/xtime/clock_test.go new file mode 100644 index 0000000000..4d2c72f238 --- /dev/null +++ b/ignite/pkg/xtime/clock_test.go @@ -0,0 +1,24 @@ +package xtime_test + +import ( + "testing" + "time" + + "github.com/stretchr/testify/require" + + "github.com/ignite/cli/ignite/pkg/xtime" +) + +func TestClockSystem(t *testing.T) { + c := xtime.NewClockSystem() + require.False(t, c.Now().IsZero()) + require.Panics(t, func() { c.Add(time.Second) }) +} + +func TestClockMock(t *testing.T) { + timeSample := time.Now() + c := xtime.NewClockMock(timeSample) + require.True(t, c.Now().Equal(timeSample)) + c.Add(time.Second) + require.True(t, c.Now().Equal(timeSample.Add(time.Second))) +} diff --git a/ignite/pkg/xtime/unix_test.go b/ignite/pkg/xtime/unix_test.go index 7b40122ed5..4fc370e234 100644 --- a/ignite/pkg/xtime/unix_test.go +++ b/ignite/pkg/xtime/unix_test.go @@ -1,10 +1,12 @@ -package xtime +package xtime_test import ( "fmt" "testing" "time" + "github.com/ignite/cli/ignite/pkg/xtime" + "github.com/stretchr/testify/require" ) @@ -17,7 +19,7 @@ func TestSeconds(t *testing.T) { } for _, tt := range tests { t.Run(fmt.Sprintf("test %d value", tt), func(t *testing.T) { - got := Seconds(tt) + got := xtime.Seconds(tt) require.Equal(t, time.Duration(tt)*time.Second, got) }) } @@ -32,7 +34,7 @@ func TestNowAfter(t *testing.T) { } for _, tt := range tests { t.Run(fmt.Sprintf("test %d value", tt), func(t *testing.T) { - got := NowAfter(Seconds(tt)) + got := xtime.NowAfter(xtime.Seconds(tt)) date := time.Now().Add(time.Duration(tt) * time.Second) require.Equal(t, date.Format(time.UnixDate), got) }) @@ -59,7 +61,7 @@ func TestFormatUnix(t *testing.T) { } for _, tt := range tests { t.Run("test date "+tt.date.String(), func(t *testing.T) { - got := FormatUnix(tt.date) + got := xtime.FormatUnix(tt.date) require.Equal(t, tt.want, got) }) } diff --git a/ignite/pkg/xurl/xurl.go b/ignite/pkg/xurl/xurl.go index 6cbe8ac100..ead4ccbade 100644 --- a/ignite/pkg/xurl/xurl.go +++ b/ignite/pkg/xurl/xurl.go @@ -122,7 +122,7 @@ func parseURL(s string) (*url.URL, error) { func addressPort(s string) (string, bool) { // Check that the value doesn't contain a URI path - if strings.Index(s, "/") != -1 { + if strings.Contains(s, "/") { return "", false } diff --git a/ignite/services/chain/app.go b/ignite/services/chain/app.go index 2d8cb03c23..716478c8a2 100644 --- a/ignite/services/chain/app.go +++ b/ignite/services/chain/app.go @@ -2,9 +2,9 @@ package chain import ( "path/filepath" - "strings" "github.com/ignite/cli/ignite/pkg/gomodulepath" + "github.com/ignite/cli/ignite/pkg/xstrings" ) // App keeps info about chain. @@ -29,7 +29,7 @@ func NewAppAt(path string) (App, error) { // N returns app name without dashes. func (a App) N() string { - return strings.ReplaceAll(a.Name, "-", "") + return xstrings.NoDash(a.Name) } // D returns appd name. diff --git a/ignite/services/chain/build.go b/ignite/services/chain/build.go index b09daf4e28..410fc0f9af 100644 --- a/ignite/services/chain/build.go +++ b/ignite/services/chain/build.go @@ -30,19 +30,29 @@ const ( ) // Build builds and installs app binaries. -func (c *Chain) Build(ctx context.Context, cacheStorage cache.Storage, output string) (binaryName string, err error) { +func (c *Chain) Build( + ctx context.Context, + cacheStorage cache.Storage, + output string, + skipProto bool, +) (binaryName string, err error) { if err := c.setup(); err != nil { return "", err } - if err := c.build(ctx, cacheStorage, output); err != nil { + if err := c.build(ctx, cacheStorage, output, skipProto); err != nil { return "", err } return c.Binary() } -func (c *Chain) build(ctx context.Context, cacheStorage cache.Storage, output string) (err error) { +func (c *Chain) build( + ctx context.Context, + cacheStorage cache.Storage, + output string, + skipProto bool, +) (err error) { defer func() { var exitErr *exec.ExitError @@ -51,8 +61,11 @@ func (c *Chain) build(ctx context.Context, cacheStorage cache.Storage, output st } }() - if err := c.generateAll(ctx, cacheStorage); err != nil { - return err + // generate from proto files + if !skipProto { + if err := c.generateFromConfig(ctx, cacheStorage); err != nil { + return err + } } buildFlags, err := c.preBuild(ctx, cacheStorage) @@ -113,7 +126,7 @@ func (c *Chain) BuildRelease(ctx context.Context, cacheStorage cache.Storage, ou } } - if err := os.MkdirAll(releasePath, 0755); err != nil { + if err := os.MkdirAll(releasePath, 0o755); err != nil { return "", err } @@ -206,8 +219,12 @@ func (c *Chain) preBuild(ctx context.Context, cacheStorage cache.Storage) (build } if modChanged { - if err := gocmd.ModVerify(ctx, c.app.Path); err != nil { - return nil, err + // By default no dependencies are checked to avoid issues with module + // ziphash files in case a Go workspace is being used. + if c.options.checkDependencies { + if err := gocmd.ModVerify(ctx, c.app.Path); err != nil { + return nil, err + } } if err := dirchange.SaveDirChecksum(dirCache, modChecksumKey, c.app.Path, "go.mod"); err != nil { diff --git a/ignite/services/chain/chain.go b/ignite/services/chain/chain.go index e0207d1574..0d444accb1 100644 --- a/ignite/services/chain/chain.go +++ b/ignite/services/chain/chain.go @@ -83,6 +83,10 @@ type chainOptions struct { // for 3rd party modules. SDK modules are also considered as a 3rd party. isThirdPartyModuleCodegenEnabled bool + // checkDependencies checks that cached Go dependencies of the chain have not + // been modified since they were downloaded. + checkDependencies bool + // path of a custom config file ConfigFile string } @@ -133,6 +137,15 @@ func EnableThirdPartyModuleCodegen() Option { } } +// CheckDependencies checks that cached Go dependencies of the chain have not +// been modified since they were downloaded. Dependencies are checked by +// running `go mod verify`. +func CheckDependencies() Option { + return func(c *Chain) { + c.options.checkDependencies = true + } +} + // New initializes a new Chain with options that its source lives at path. func New(path string, options ...Option) (*Chain, error) { app, err := NewAppAt(path) @@ -179,7 +192,6 @@ func New(path string, options ...Option) (*Chain, error) { } func (c *Chain) appVersion() (v version, err error) { - ver, err := repoversion.Determine(c.app.Path) if err != nil { return version{}, err @@ -250,11 +262,7 @@ func (c *Chain) ID() (string, error) { // ChainID returns the default network chain's id. func (c *Chain) ChainID() (string, error) { - chainID, err := c.ID() - if err != nil { - return "", err - } - return chainid.NewGenesisChainID(chainID, 1), nil + return chainid.NewGenesisChainID(c.Name(), 1), nil } // Name returns the chain's name diff --git a/ignite/services/chain/faucet.go b/ignite/services/chain/faucet.go index c8cc2dcb4d..fa4502adfe 100644 --- a/ignite/services/chain/faucet.go +++ b/ignite/services/chain/faucet.go @@ -22,9 +22,7 @@ var ( ErrFaucetAccountDoesNotExist = errors.New("specified account (faucet.name) does not exist") ) -var ( - envAPIAddress = os.Getenv("API_ADDRESS") -) +var envAPIAddress = os.Getenv("API_ADDRESS") // Faucet returns the faucet for the chain or an error if the faucet // configuration is wrong or not configured (not enabled) at all. diff --git a/ignite/services/chain/generate.go b/ignite/services/chain/generate.go index b17850b704..b685ce5efd 100644 --- a/ignite/services/chain/generate.go +++ b/ignite/services/chain/generate.go @@ -12,16 +12,18 @@ import ( ) const ( - defaultVuexPath = "vue/src/store" - defaultDartPath = "flutter/lib" - defaultOpenAPIPath = "docs/static/openapi.yml" + defaultTSClientPath = "ts-client" + defaultVuexPath = "vue/src/store" + defaultDartPath = "flutter/lib" + defaultOpenAPIPath = "docs/static/openapi.yml" ) type generateOptions struct { - isGoEnabled bool - isVuexEnabled bool - isDartEnabled bool - isOpenAPIEnabled bool + isGoEnabled bool + isTSClientEnabled bool + isVuexEnabled bool + isDartEnabled bool + isOpenAPIEnabled bool } // GenerateTarget is a target to generate code for from proto files. @@ -34,9 +36,17 @@ func GenerateGo() GenerateTarget { } } -// GenerateVuex enables generating proto based Vuex store. +// GenerateTSClient enables generating proto based Typescript Client. +func GenerateTSClient() GenerateTarget { + return func(o *generateOptions) { + o.isTSClientEnabled = true + } +} + +// GenerateTSClient enables generating proto based Typescript Client. func GenerateVuex() GenerateTarget { return func(o *generateOptions) { + o.isTSClientEnabled = true o.isVuexEnabled = true } } @@ -55,7 +65,8 @@ func GenerateOpenAPI() GenerateTarget { } } -func (c *Chain) generateAll(ctx context.Context, cacheStorage cache.Storage) error { +// generateFromConfig makes code generation from proto files from the given config +func (c *Chain) generateFromConfig(ctx context.Context, cacheStorage cache.Storage) error { conf, err := c.Config() if err != nil { return err @@ -63,6 +74,11 @@ func (c *Chain) generateAll(ctx context.Context, cacheStorage cache.Storage) err var additionalTargets []GenerateTarget + // parse config for additional target + if conf.Client.Typescript.Path != "" { + additionalTargets = append(additionalTargets, GenerateTSClient()) + } + if conf.Client.Vuex.Path != "" { additionalTargets = append(additionalTargets, GenerateVuex()) } @@ -112,7 +128,26 @@ func (c *Chain) Generate( enableThirdPartyModuleCodegen := !c.protoBuiltAtLeastOnce && c.options.isThirdPartyModuleCodegenEnabled - // generate Vuex code as well if it is enabled. + // generate Typescript Client code as well if it is enabled. + if targetOptions.isTSClientEnabled { + tsClientPath := conf.Client.Typescript.Path + if tsClientPath == "" { + tsClientPath = defaultTSClientPath + } + + tsClientRootPath := filepath.Join(c.app.Path, tsClientPath) + if err := os.MkdirAll(tsClientRootPath, 0o766); err != nil { + return err + } + + options = append(options, + cosmosgen.WithTSClientGeneration( + cosmosgen.TypescriptModulePath(tsClientRootPath), + tsClientRootPath, + ), + ) + } + if targetOptions.isVuexEnabled { vuexPath := conf.Client.Vuex.Path if vuexPath == "" { @@ -120,14 +155,14 @@ func (c *Chain) Generate( } storeRootPath := filepath.Join(c.app.Path, vuexPath, "generated") - if err := os.MkdirAll(storeRootPath, 0766); err != nil { + if err := os.MkdirAll(storeRootPath, 0o766); err != nil { return err } options = append(options, cosmosgen.WithVuexGeneration( enableThirdPartyModuleCodegen, - cosmosgen.VuexStoreModulePath(storeRootPath), + cosmosgen.TypescriptModulePath(storeRootPath), storeRootPath, ), ) @@ -135,13 +170,12 @@ func (c *Chain) Generate( if targetOptions.isDartEnabled { dartPath := conf.Client.Dart.Path - if dartPath == "" { dartPath = defaultDartPath } rootPath := filepath.Join(c.app.Path, dartPath, "generated") - if err := os.MkdirAll(rootPath, 0766); err != nil { + if err := os.MkdirAll(rootPath, 0o766); err != nil { return err } diff --git a/ignite/services/chain/plugin-stargate.go b/ignite/services/chain/plugin-stargate.go index c6c1ed42ef..1c6dedf6db 100644 --- a/ignite/services/chain/plugin-stargate.go +++ b/ignite/services/chain/plugin-stargate.go @@ -85,7 +85,7 @@ func (p *stargatePlugin) appTOML(homePath string, conf chainconfig.Config) error gas := sdktypes.NewInt64Coin(staked.Denom, 0) config.Set("minimum-gas-prices", gas.String()) - file, err := os.OpenFile(path, os.O_RDWR|os.O_TRUNC, 0644) + file, err := os.OpenFile(path, os.O_RDWR|os.O_TRUNC, 0o644) if err != nil { return err } @@ -121,7 +121,7 @@ func (p *stargatePlugin) configTOML(homePath string, conf chainconfig.Config) er config.Set("p2p.laddr", p2pAddr) config.Set("rpc.pprof_laddr", conf.Host.Prof) - file, err := os.OpenFile(path, os.O_RDWR|os.O_TRUNC, 0644) + file, err := os.OpenFile(path, os.O_RDWR|os.O_TRUNC, 0o644) if err != nil { return err } @@ -142,7 +142,7 @@ func (p *stargatePlugin) clientTOML(homePath string) error { } config.Set("keyring-backend", "test") config.Set("broadcast-mode", "block") - file, err := os.OpenFile(path, os.O_RDWR|os.O_TRUNC, 0644) + file, err := os.OpenFile(path, os.O_RDWR|os.O_TRUNC, 0o644) if err != nil { return err } diff --git a/ignite/services/chain/serve.go b/ignite/services/chain/serve.go index 1db29b6a24..2986553459 100644 --- a/ignite/services/chain/serve.go +++ b/ignite/services/chain/serve.go @@ -57,6 +57,7 @@ var ( type serveOptions struct { forceReset bool resetOnce bool + skipProto bool } func newServeOption() serveOptions { @@ -83,6 +84,13 @@ func ServeResetOnce() ServeOption { } } +// ServeSkipProto allows to serve the app without generate Go from proto +func ServeSkipProto() ServeOption { + return func(c *serveOptions) { + c.skipProto = true + } +} + // Serve serves an app. func (c *Chain) Serve(ctx context.Context, cacheStorage cache.Storage, options ...ServeOption) error { serveOptions := newServeOption() @@ -138,7 +146,7 @@ func (c *Chain) Serve(ctx context.Context, cacheStorage cache.Storage, options . shouldReset := serveOptions.forceReset || serveOptions.resetOnce // serve the app. - err = c.serve(serveCtx, cacheStorage, shouldReset) + err = c.serve(serveCtx, cacheStorage, shouldReset, serveOptions.skipProto) serveOptions.resetOnce = false switch { @@ -247,7 +255,7 @@ func (c *Chain) watchAppBackend(ctx context.Context) error { // serve performs the operations to serve the blockchain: build, init and start // if the chain is already initialized and the file didn't changed, the app is directly started // if the files changed, the state is imported -func (c *Chain) serve(ctx context.Context, cacheStorage cache.Storage, forceReset bool) error { +func (c *Chain) serve(ctx context.Context, cacheStorage cache.Storage, forceReset, skipProto bool) error { conf, err := c.Config() if err != nil { return &CannotBuildAppError{err} @@ -328,7 +336,7 @@ func (c *Chain) serve(ctx context.Context, cacheStorage cache.Storage, forceRese // build phase if !isInit || appModified { // build the blockchain app - if err := c.build(ctx, cacheStorage, ""); err != nil { + if err := c.build(ctx, cacheStorage, "", skipProto); err != nil { return err } } @@ -480,7 +488,7 @@ func (c *Chain) chainSavePath() (string, error) { chainSavePath := filepath.Join(savePath, chainID) // ensure the path exists - if err := os.MkdirAll(savePath, 0700); err != nil && !os.IsExist(err) { + if err := os.MkdirAll(savePath, 0o700); err != nil && !os.IsExist(err) { return "", err } diff --git a/ignite/services/network/campaign.go b/ignite/services/network/campaign.go index c10624816f..890b36a506 100644 --- a/ignite/services/network/campaign.go +++ b/ignite/services/network/campaign.go @@ -7,6 +7,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" campaigntypes "github.com/tendermint/spn/x/campaign/types" + "github.com/ignite/cli/ignite/pkg/cosmoserror" "github.com/ignite/cli/ignite/pkg/events" "github.com/ignite/cli/ignite/services/network/networktypes" ) @@ -50,7 +51,9 @@ func (n Network) Campaign(ctx context.Context, campaignID uint64) (networktypes. res, err := n.campaignQuery.Campaign(ctx, &campaigntypes.QueryGetCampaignRequest{ CampaignID: campaignID, }) - if err != nil { + if cosmoserror.Unwrap(err) == cosmoserror.ErrNotFound { + return networktypes.Campaign{}, ErrObjectNotFound + } else if err != nil { return networktypes.Campaign{}, err } return networktypes.ToCampaign(res.Campaign), nil @@ -78,14 +81,17 @@ func (n Network) Campaigns(ctx context.Context) ([]networktypes.Campaign, error) // CreateCampaign creates a campaign in Network func (n Network) CreateCampaign(name, metadata string, totalSupply sdk.Coins) (uint64, error) { n.ev.Send(events.New(events.StatusOngoing, fmt.Sprintf("Creating campaign %s", name))) - + addr, err := n.account.Address(networktypes.SPN) + if err != nil { + return 0, err + } msgCreateCampaign := campaigntypes.NewMsgCreateCampaign( - n.account.Address(networktypes.SPN), + addr, name, totalSupply, []byte(metadata), ) - res, err := n.cosmos.BroadcastTx(n.account.Name, msgCreateCampaign) + res, err := n.cosmos.BroadcastTx(n.account, msgCreateCampaign) if err != nil { return 0, err } @@ -106,15 +112,20 @@ func (n Network) InitializeMainnet( mainnetChainID string, ) (uint64, error) { n.ev.Send(events.New(events.StatusOngoing, "Initializing the mainnet campaign")) + addr, err := n.account.Address(networktypes.SPN) + if err != nil { + return 0, err + } + msg := campaigntypes.NewMsgInitializeMainnet( - n.account.Address(networktypes.SPN), + addr, campaignID, sourceURL, sourceHash, mainnetChainID, ) - res, err := n.cosmos.BroadcastTx(n.account.Name, msg) + res, err := n.cosmos.BroadcastTx(n.account, msg) if err != nil { return 0, err } @@ -141,7 +152,10 @@ func (n Network) UpdateCampaign( } n.ev.Send(events.New(events.StatusOngoing, fmt.Sprintf("Updating the campaign %d", id))) - account := n.account.Address(networktypes.SPN) + account, err := n.account.Address(networktypes.SPN) + if err != nil { + return err + } msgs := make([]sdk.Msg, 0) if p.name != "" || len(p.metadata) > 0 { msgs = append(msgs, campaigntypes.NewMsgEditCampaign( @@ -159,7 +173,7 @@ func (n Network) UpdateCampaign( )) } - if _, err := n.cosmos.BroadcastTx(n.account.Name, msgs...); err != nil { + if _, err := n.cosmos.BroadcastTx(n.account, msgs...); err != nil { return err } n.ev.Send(events.New(events.StatusDone, fmt.Sprintf( diff --git a/ignite/services/network/client.go b/ignite/services/network/client.go index 712434339a..ae6f6f6e8a 100644 --- a/ignite/services/network/client.go +++ b/ignite/services/network/client.go @@ -1,18 +1,28 @@ package network import ( + "context" + "errors" + monitoringctypes "github.com/tendermint/spn/x/monitoringc/types" + "github.com/ignite/cli/ignite/pkg/cosmoserror" "github.com/ignite/cli/ignite/services/network/networktypes" ) +// CreateClient send create client message to SPN func (n Network) CreateClient( launchID uint64, unbondingTime int64, rewardsInfo networktypes.Reward, ) (string, error) { + addr, err := n.account.Address(networktypes.SPN) + if err != nil { + return "", err + } + msgCreateClient := monitoringctypes.NewMsgCreateClient( - n.account.Address(networktypes.SPN), + addr, launchID, rewardsInfo.ConsensusState, rewardsInfo.ValidatorSet, @@ -20,7 +30,7 @@ func (n Network) CreateClient( rewardsInfo.RevisionHeight, ) - res, err := n.cosmos.BroadcastTx(n.account.Name, msgCreateClient) + res, err := n.cosmos.BroadcastTx(n.account, msgCreateClient) if err != nil { return "", err } @@ -31,3 +41,59 @@ func (n Network) CreateClient( } return createClientRes.ClientID, nil } + +// verifiedClientIDs fetches the verified client ids from SPN by launch id +func (n Network) verifiedClientIDs(ctx context.Context, launchID uint64) ([]string, error) { + res, err := n.monitoringConsumerQuery. + VerifiedClientIds(ctx, + &monitoringctypes.QueryGetVerifiedClientIdsRequest{ + LaunchID: launchID, + }, + ) + + if cosmoserror.Unwrap(err) == cosmoserror.ErrNotFound { + return nil, ErrObjectNotFound + } else if err != nil { + return nil, err + } + return res.ClientIds, nil +} + +// RewardIBCInfo returns IBC info to relay packets for a chain to claim rewards. +func (n Network) RewardIBCInfo(ctx context.Context, launchID uint64) (networktypes.RewardIBCInfo, error) { + clientStates, err := n.verifiedClientIDs(ctx, launchID) + if err != nil { + return networktypes.RewardIBCInfo{}, err + } + if len(clientStates) == 0 { + return networktypes.RewardIBCInfo{}, ErrObjectNotFound + } + + clientID := clientStates[0] + + connections, err := n.node.clientConnections(ctx, clientID) + if err != nil && !errors.Is(err, ErrObjectNotFound) { + return networktypes.RewardIBCInfo{}, err + } + if errors.Is(err, ErrObjectNotFound) || len(connections) == 0 { + return networktypes.RewardIBCInfo{}, nil + } + + connectionID := connections[0] + + channels, err := n.node.connectionChannels(ctx, connectionID) + if err != nil && !errors.Is(err, ErrObjectNotFound) { + return networktypes.RewardIBCInfo{}, err + } + if errors.Is(err, ErrObjectNotFound) || len(connections) == 0 { + return networktypes.RewardIBCInfo{}, nil + } + + info := networktypes.RewardIBCInfo{ + ClientID: clientID, + ConnectionID: connectionID, + ChannelID: channels[0], + } + + return info, nil +} diff --git a/ignite/services/network/join.go b/ignite/services/network/join.go index 7e185700fc..da706a366d 100644 --- a/ignite/services/network/join.go +++ b/ignite/services/network/join.go @@ -7,7 +7,6 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" launchtypes "github.com/tendermint/spn/x/launch/types" - "github.com/ignite/cli/ignite/pkg/cosmoserror" "github.com/ignite/cli/ignite/pkg/cosmosutil" "github.com/ignite/cli/ignite/pkg/events" "github.com/ignite/cli/ignite/pkg/xurl" @@ -17,25 +16,19 @@ import ( type joinOptions struct { accountAmount sdk.Coins - gentxPath string publicAddress string } type JoinOption func(*joinOptions) +// WithAccountRequest allows to join the chain by requesting a genesis account with the specified amount of tokens func WithAccountRequest(amount sdk.Coins) JoinOption { return func(o *joinOptions) { o.accountAmount = amount } } -// TODO accept struct not file path -func WithCustomGentxPath(path string) JoinOption { - return func(o *joinOptions) { - o.gentxPath = path - } -} - +// WithPublicAddress allows to specify a peer public address for the node func WithPublicAddress(addr string) JoinOption { return func(o *joinOptions) { o.publicAddress = addr @@ -47,6 +40,7 @@ func (n Network) Join( ctx context.Context, c Chain, launchID uint64, + gentxPath string, options ...JoinOption, ) error { o := joinOptions{} @@ -54,15 +48,20 @@ func (n Network) Join( apply(&o) } - isCustomGentx := o.gentxPath != "" var ( nodeID string peer launchtypes.Peer err error ) - // if the custom gentx is not provided, get the chain default from the chain home folder. - if !isCustomGentx { + // parse the gentx content + gentxInfo, gentx, err := cosmosutil.GentxFromPath(gentxPath) + if err != nil { + return err + } + + // get the peer address + if o.publicAddress != "" { if nodeID, err = c.NodeID(ctx); err != nil { return err } @@ -71,32 +70,14 @@ func (n Network) Join( peer = launchtypes.NewPeerTunnel(nodeID, networkchain.HTTPTunnelChisel, o.publicAddress) } else { peer = launchtypes.NewPeerConn(nodeID, o.publicAddress) - - } - - if o.gentxPath, err = c.DefaultGentxPath(); err != nil { - return err } - } - - // parse the gentx content - gentxInfo, gentx, err := cosmosutil.GentxFromPath(o.gentxPath) - if err != nil { - return err - } - - if isCustomGentx { + } else { + // if the peer address is not specified, we parse it from the gentx memo if peer, err = ParsePeerAddress(gentxInfo.Memo); err != nil { return err } } - // get the chain genesis path from the home folder - genesisPath, err := c.GenesisPath() - if err != nil { - return err - } - // change the chain address prefix to spn accountAddress, err := cosmosutil.ChangeAddressPrefix(gentxInfo.DelegatorAddress, networktypes.SPN) if err != nil { @@ -104,91 +85,48 @@ func (n Network) Join( } if !o.accountAmount.IsZero() { - if err := n.ensureAccount( - ctx, - genesisPath, - isCustomGentx, - launchID, - accountAddress, - o.accountAmount, - ); err != nil { + if err := n.sendAccountRequest(launchID, accountAddress, o.accountAmount); err != nil { return err } } - return n.sendValidatorRequest(ctx, launchID, peer, accountAddress, gentx, gentxInfo) -} - -// ensureAccount creates an add AddAccount request message. -func (n Network) ensureAccount( - ctx context.Context, - genesisPath string, - isCustomGentx bool, - launchID uint64, - address string, - amount sdk.Coins, -) (err error) { - n.ev.Send(events.New(events.StatusOngoing, "Verifying account already exists "+address)) - - // if is custom gentx path, avoid to check account into genesis from the home folder - var accExist bool - if !isCustomGentx { - accExist, err = cosmosutil.CheckGenesisContainsAddress(genesisPath, address) - if err != nil { - return err - } - if accExist { - return fmt.Errorf("account %s already exist", address) - } - } - // check if account exists as a genesis account in SPN chain launch information - hasAccount, err := n.hasAccount(ctx, launchID, address) - if err != nil { - return err - } - if hasAccount { - return fmt.Errorf("account %s already exist", address) - } - - return n.sendAccountRequest(launchID, address, amount) + return n.sendValidatorRequest(launchID, peer, accountAddress, gentx, gentxInfo) } // sendValidatorRequest creates the RequestAddValidator message into the SPN func (n Network) sendValidatorRequest( - ctx context.Context, launchID uint64, peer launchtypes.Peer, valAddress string, gentx []byte, gentxInfo cosmosutil.GentxInfo, ) error { - // Check if the validator request already exist - hasValidator, err := n.hasValidator(ctx, launchID, valAddress) + addr, err := n.account.Address(networktypes.SPN) if err != nil { return err } - if hasValidator { - return fmt.Errorf("validator %s already exist", valAddress) - } - msg := launchtypes.NewMsgRequestAddValidator( - n.account.Address(networktypes.SPN), + msg := launchtypes.NewMsgSendRequest( + addr, launchID, - valAddress, - gentx, - gentxInfo.PubKey, - gentxInfo.SelfDelegation, - peer, + launchtypes.NewGenesisValidator( + launchID, + valAddress, + gentx, + gentxInfo.PubKey, + gentxInfo.SelfDelegation, + peer, + ), ) n.ev.Send(events.New(events.StatusOngoing, "Broadcasting validator transaction")) - res, err := n.cosmos.BroadcastTx(n.account.Name, msg) + res, err := n.cosmos.BroadcastTx(n.account, msg) if err != nil { return err } - var requestRes launchtypes.MsgRequestAddValidatorResponse + var requestRes launchtypes.MsgSendRequestResponse if err := res.Decode(&requestRes); err != nil { return err } @@ -203,41 +141,3 @@ func (n Network) sendValidatorRequest( } return nil } - -// hasValidator verify if the validator already exist into the SPN store -func (n Network) hasValidator(ctx context.Context, launchID uint64, address string) (bool, error) { - _, err := n.launchQuery.GenesisValidator(ctx, &launchtypes.QueryGetGenesisValidatorRequest{ - LaunchID: launchID, - Address: address, - }) - if cosmoserror.Unwrap(err) == cosmoserror.ErrNotFound { - return false, nil - } else if err != nil { - return false, err - } - return true, nil -} - -// hasAccount verify if the account already exist into the SPN store -func (n Network) hasAccount(ctx context.Context, launchID uint64, address string) (bool, error) { - _, err := n.launchQuery.VestingAccount(ctx, &launchtypes.QueryGetVestingAccountRequest{ - LaunchID: launchID, - Address: address, - }) - if cosmoserror.Unwrap(err) == cosmoserror.ErrNotFound { - return false, nil - } else if err != nil { - return false, err - } - - _, err = n.launchQuery.GenesisAccount(ctx, &launchtypes.QueryGetGenesisAccountRequest{ - LaunchID: launchID, - Address: address, - }) - if cosmoserror.Unwrap(err) == cosmoserror.ErrNotFound { - return false, nil - } else if err != nil { - return false, err - } - return true, nil -} diff --git a/ignite/services/network/join_test.go b/ignite/services/network/join_test.go index 9b8a629924..d2780c8e83 100644 --- a/ignite/services/network/join_test.go +++ b/ignite/services/network/join_test.go @@ -5,12 +5,12 @@ import ( "errors" "testing" + sdkmath "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" launchtypes "github.com/tendermint/spn/x/launch/types" - "github.com/ignite/cli/ignite/pkg/cosmoserror" "github.com/ignite/cli/ignite/services/network/networktypes" "github.com/ignite/cli/ignite/services/network/testutil" ) @@ -25,319 +25,203 @@ const ( func TestJoin(t *testing.T) { t.Run("successfully send join request", func(t *testing.T) { - var ( - account = testutil.NewTestAccount(t, testutil.TestAccountName) - tmp = t.TempDir() - gentx = testutil.NewGentx( - account.Address(networktypes.SPN), - TestDenom, - TestAmountString, - "", - testutil.PeerAddress, - ) - gentxPath = gentx.SaveTo(t, tmp) - genesisPath = testutil.NewGenesis(testutil.ChainID).SaveTo(t, tmp) - suite, network = newSuite(account) + account := testutil.NewTestAccount(t, testutil.TestAccountName) + tmp := t.TempDir() + addr, err := account.Address(networktypes.SPN) + require.NoError(t, err) + gentx := testutil.NewGentx( + addr, + TestDenom, + TestAmountString, + "", + testutil.PeerAddress, ) + gentxPath := gentx.SaveTo(t, tmp) + suite, network := newSuite(account) suite.ChainMock.On("NodeID", context.Background()).Return(testutil.NodeID, nil).Once() - suite.ChainMock.On("DefaultGentxPath").Return(gentxPath, nil).Once() - suite.ChainMock.On("GenesisPath").Return(genesisPath, nil).Once() - suite.LaunchQueryMock. - On( - "GenesisValidator", - context.Background(), - &launchtypes.QueryGetGenesisValidatorRequest{ - Address: account.Address(networktypes.SPN), - LaunchID: testutil.LaunchID, - }, - ). - Return(nil, cosmoserror.ErrNotFound). - Once() suite.CosmosClientMock. On( "BroadcastTx", - account.Name, - &launchtypes.MsgRequestAddValidator{ - Creator: account.Address(networktypes.SPN), - LaunchID: testutil.LaunchID, - ValAddress: account.Address(networktypes.SPN), - GenTx: gentx.JSON(t), - ConsPubKey: []byte{}, - SelfDelegation: sdk.NewCoin(TestDenom, sdk.NewInt(TestAmountInt)), - Peer: launchtypes.Peer{ - Id: testutil.NodeID, - Connection: &launchtypes.Peer_TcpAddress{ - TcpAddress: testutil.TCPAddress, - }, - }, - }, + account, + launchtypes.NewMsgSendRequest( + addr, + testutil.LaunchID, + launchtypes.NewGenesisValidator( + testutil.LaunchID, + addr, + gentx.JSON(t), + []byte{}, + sdk.NewCoin(TestDenom, sdkmath.NewInt(TestAmountInt)), + launchtypes.Peer{ + testutil.NodeID, + &launchtypes.Peer_TcpAddress{ + TcpAddress: testutil.TCPAddress, + }, + }), + ), ). - Return(testutil.NewResponse(&launchtypes.MsgRequestAddValidatorResponse{ + Return(testutil.NewResponse(&launchtypes.MsgSendRequestResponse{ RequestID: TestGenesisValidatorRequestID, AutoApproved: false, }), nil). Once() - joinErr := network.Join(context.Background(), suite.ChainMock, testutil.LaunchID, WithPublicAddress(testutil.TCPAddress)) + joinErr := network.Join( + context.Background(), + suite.ChainMock, + testutil.LaunchID, + gentxPath, + WithPublicAddress(testutil.TCPAddress), + ) require.NoError(t, joinErr) suite.AssertAllMocks(t) }) t.Run("successfully send join request with custom gentx", func(t *testing.T) { - var ( - account = testutil.NewTestAccount(t, testutil.TestAccountName) - tmp = t.TempDir() - gentx = testutil.NewGentx( - account.Address(networktypes.SPN), - TestDenom, - TestAmountString, - "", - testutil.PeerAddress, - ) - gentxPath = gentx.SaveTo(t, tmp) - genesisPath = testutil.NewGenesis(testutil.ChainID).SaveTo(t, tmp) - suite, network = newSuite(account) + account := testutil.NewTestAccount(t, testutil.TestAccountName) + tmp := t.TempDir() + addr, err := account.Address(networktypes.SPN) + require.NoError(t, err) + gentx := testutil.NewGentx( + addr, + TestDenom, + TestAmountString, + "", + testutil.PeerAddress, ) + gentxPath := gentx.SaveTo(t, tmp) + suite, network := newSuite(account) - suite.ChainMock.On("GenesisPath").Return(genesisPath, nil).Once() - suite.LaunchQueryMock. - On( - "GenesisValidator", - context.Background(), - &launchtypes.QueryGetGenesisValidatorRequest{ - Address: account.Address(networktypes.SPN), - LaunchID: testutil.LaunchID, - }, - ). - Return(nil, cosmoserror.ErrNotFound). - Once() suite.CosmosClientMock. On( "BroadcastTx", - account.Name, - &launchtypes.MsgRequestAddValidator{ - Creator: account.Address(networktypes.SPN), - LaunchID: testutil.LaunchID, - ValAddress: account.Address(networktypes.SPN), - GenTx: gentx.JSON(t), - ConsPubKey: []byte{}, - SelfDelegation: sdk.NewCoin(TestDenom, sdk.NewInt(TestAmountInt)), - Peer: launchtypes.Peer{ - Id: testutil.NodeID, - Connection: &launchtypes.Peer_TcpAddress{ - TcpAddress: testutil.TCPAddress, + account, + launchtypes.NewMsgSendRequest( + addr, + testutil.LaunchID, + launchtypes.NewGenesisValidator( + testutil.LaunchID, + addr, + gentx.JSON(t), + []byte{}, + sdk.NewCoin(TestDenom, sdkmath.NewInt(TestAmountInt)), + launchtypes.Peer{ + Id: testutil.NodeID, + Connection: &launchtypes.Peer_TcpAddress{ + TcpAddress: testutil.TCPAddress, + }, }, - }, - }, + ), + ), ). - Return(testutil.NewResponse(&launchtypes.MsgRequestAddValidatorResponse{ + Return(testutil.NewResponse(&launchtypes.MsgSendRequestResponse{ RequestID: TestGenesisValidatorRequestID, AutoApproved: false, }), nil). Once() - joinErr := network.Join(context.Background(), suite.ChainMock, testutil.LaunchID, WithCustomGentxPath(gentxPath)) + joinErr := network.Join(context.Background(), suite.ChainMock, testutil.LaunchID, gentxPath) require.NoError(t, joinErr) suite.AssertAllMocks(t) }) - t.Run("failed to send join request, validator already exists", func(t *testing.T) { - var ( - account = testutil.NewTestAccount(t, testutil.TestAccountName) - tmp = t.TempDir() - gentx = testutil.NewGentx( - account.Address(networktypes.SPN), - TestDenom, - TestAmountString, - "", - testutil.PeerAddress, - ) - gentxPath = gentx.SaveTo(t, tmp) - genesisPath = testutil.NewGenesis(testutil.ChainID).SaveTo(t, tmp) - suite, network = newSuite(account) - ) - - suite.ChainMock.On("NodeID", context.Background()).Return(testutil.NodeID, nil).Once() - suite.ChainMock.On("GenesisPath").Return(genesisPath, nil).Once() - suite.ChainMock.On("DefaultGentxPath").Return(gentxPath, nil).Once() - suite.LaunchQueryMock. - On( - "GenesisValidator", - context.Background(), - &launchtypes.QueryGetGenesisValidatorRequest{ - Address: account.Address(networktypes.SPN), - LaunchID: testutil.LaunchID, - }, - ). - Return(nil, nil). - Once() - - joinErr := network.Join(context.Background(), suite.ChainMock, testutil.LaunchID, WithPublicAddress(testutil.TCPAddress)) - require.Errorf(t, joinErr, "validator %s already exist", account.Address(networktypes.SPN)) - suite.AssertAllMocks(t) - }) - - t.Run("failed to send join request, failed to check validator existence", func(t *testing.T) { - var ( - account = testutil.NewTestAccount(t, testutil.TestAccountName) - tmp = t.TempDir() - gentx = testutil.NewGentx( - account.Address(networktypes.SPN), - TestDenom, - TestAmountString, - "", - testutil.PeerAddress, - ) - gentxPath = gentx.SaveTo(t, tmp) - genesisPath = testutil.NewGenesis(testutil.ChainID).SaveTo(t, tmp) - suite, network = newSuite(account) - expectedError = errors.New("failed to perform request") - ) - - suite.ChainMock.On("NodeID", context.Background()).Return(testutil.NodeID, nil).Once() - suite.ChainMock.On("GenesisPath").Return(genesisPath, nil).Once() - suite.ChainMock.On("DefaultGentxPath").Return(gentxPath, nil).Once() - suite.LaunchQueryMock. - On( - "GenesisValidator", - context.Background(), - &launchtypes.QueryGetGenesisValidatorRequest{ - Address: account.Address(networktypes.SPN), - LaunchID: testutil.LaunchID, - }, - ). - Return(nil, expectedError). - Once() - - joinErr := network.Join(context.Background(), suite.ChainMock, testutil.LaunchID, WithPublicAddress(testutil.TCPAddress)) - require.Error(t, joinErr) - require.Equal(t, expectedError, joinErr) - suite.AssertAllMocks(t) - }) - t.Run("failed to send join request, failed to broadcast join tx", func(t *testing.T) { - var ( - account = testutil.NewTestAccount(t, testutil.TestAccountName) - tmp = t.TempDir() - gentx = testutil.NewGentx( - account.Address(networktypes.SPN), - TestDenom, - TestAmountString, - "", - testutil.PeerAddress, - ) - gentxPath = gentx.SaveTo(t, tmp) - genesisPath = testutil.NewGenesis(testutil.ChainID).SaveTo(t, tmp) - suite, network = newSuite(account) - expectedError = errors.New("failed to add validator") + account := testutil.NewTestAccount(t, testutil.TestAccountName) + tmp := t.TempDir() + addr, err := account.Address(networktypes.SPN) + require.NoError(t, err) + gentx := testutil.NewGentx( + addr, + TestDenom, + TestAmountString, + "", + testutil.PeerAddress, ) + gentxPath := gentx.SaveTo(t, tmp) + suite, network := newSuite(account) + expectedError := errors.New("failed to add validator") suite.ChainMock.On("NodeID", context.Background()).Return(testutil.NodeID, nil).Once() - suite.ChainMock.On("GenesisPath").Return(genesisPath, nil).Once() - suite.ChainMock.On("DefaultGentxPath").Return(gentxPath, nil).Once() - suite.LaunchQueryMock. - On( - "GenesisValidator", - context.Background(), - &launchtypes.QueryGetGenesisValidatorRequest{ - Address: account.Address(networktypes.SPN), - LaunchID: testutil.LaunchID, - }, - ). - Return(nil, cosmoserror.ErrNotFound). - Once() suite.CosmosClientMock. On( "BroadcastTx", - account.Name, - &launchtypes.MsgRequestAddValidator{ - Creator: account.Address(networktypes.SPN), - LaunchID: testutil.LaunchID, - ValAddress: account.Address(networktypes.SPN), - GenTx: gentx.JSON(t), - ConsPubKey: []byte{}, - SelfDelegation: sdk.NewCoin(TestDenom, sdk.NewInt(TestAmountInt)), - Peer: launchtypes.Peer{ - Id: testutil.NodeID, - Connection: &launchtypes.Peer_TcpAddress{ - TcpAddress: testutil.TCPAddress, + account, + launchtypes.NewMsgSendRequest( + addr, + testutil.LaunchID, + launchtypes.NewGenesisValidator( + testutil.LaunchID, + addr, + gentx.JSON(t), + []byte{}, + sdk.NewCoin(TestDenom, sdkmath.NewInt(TestAmountInt)), + launchtypes.Peer{ + Id: testutil.NodeID, + Connection: &launchtypes.Peer_TcpAddress{ + TcpAddress: testutil.TCPAddress, + }, }, - }, - }, + ), + ), ). Return( - testutil.NewResponse(&launchtypes.MsgRequestAddValidatorResponse{}), + testutil.NewResponse(&launchtypes.MsgSendRequestResponse{}), expectedError, ). Once() - joinErr := network.Join(context.Background(), suite.ChainMock, testutil.LaunchID, WithPublicAddress(testutil.TCPAddress)) + joinErr := network.Join( + context.Background(), + suite.ChainMock, + testutil.LaunchID, + gentxPath, + WithPublicAddress(testutil.TCPAddress), + ) require.Error(t, joinErr) require.Equal(t, expectedError, joinErr) suite.AssertAllMocks(t) }) t.Run("successfully send join request with account request", func(t *testing.T) { - var ( - account = testutil.NewTestAccount(t, testutil.TestAccountName) - tmp = t.TempDir() - gentx = testutil.NewGentx( - account.Address(networktypes.SPN), - TestDenom, - TestAmountString, - "", - testutil.PeerAddress, - ) - gentxPath = gentx.SaveTo(t, tmp) - genesisPath = testutil.NewGenesis(testutil.ChainID).SaveTo(t, tmp) - suite, network = newSuite(account) + account := testutil.NewTestAccount(t, testutil.TestAccountName) + tmp := t.TempDir() + addr, err := account.Address(networktypes.SPN) + require.NoError(t, err) + gentx := testutil.NewGentx( + addr, + TestDenom, + TestAmountString, + "", + testutil.PeerAddress, ) + gentxPath := gentx.SaveTo(t, tmp) + suite, network := newSuite(account) suite.ChainMock.On("NodeID", context.Background()).Return(testutil.NodeID, nil).Once() - suite.ChainMock.On("GenesisPath").Return(genesisPath, nil).Once() - suite.ChainMock.On("DefaultGentxPath").Return(gentxPath, nil).Once() - suite.LaunchQueryMock. - On( - "GenesisValidator", - context.Background(), - &launchtypes.QueryGetGenesisValidatorRequest{ - Address: account.Address(networktypes.SPN), - LaunchID: testutil.LaunchID, - }, - ). - Return(nil, cosmoserror.ErrNotFound). - Once() - suite.LaunchQueryMock. - On( - "VestingAccount", - context.Background(), - &launchtypes.QueryGetVestingAccountRequest{ - Address: account.Address(networktypes.SPN), - LaunchID: testutil.LaunchID, - }). - Return(nil, cosmoserror.ErrNotFound). - Once() suite.CosmosClientMock. On( "BroadcastTx", - account.Name, - &launchtypes.MsgRequestAddValidator{ - Creator: account.Address(networktypes.SPN), - LaunchID: testutil.LaunchID, - ValAddress: account.Address(networktypes.SPN), - GenTx: gentx.JSON(t), - ConsPubKey: []byte{}, - SelfDelegation: sdk.NewCoin(TestDenom, sdk.NewInt(TestAmountInt)), - Peer: launchtypes.Peer{ - Id: testutil.NodeID, - Connection: &launchtypes.Peer_TcpAddress{ - TcpAddress: testutil.TCPAddress, + account, + launchtypes.NewMsgSendRequest( + addr, + testutil.LaunchID, + launchtypes.NewGenesisValidator( + testutil.LaunchID, + addr, + gentx.JSON(t), + []byte{}, + sdk.NewCoin(TestDenom, sdkmath.NewInt(TestAmountInt)), + launchtypes.Peer{ + Id: testutil.NodeID, + Connection: &launchtypes.Peer_TcpAddress{ + TcpAddress: testutil.TCPAddress, + }, }, - }, - }, + ), + ), ). - Return(testutil.NewResponse(&launchtypes.MsgRequestAddValidatorResponse{ + Return(testutil.NewResponse(&launchtypes.MsgSendRequestResponse{ RequestID: TestGenesisValidatorRequestID, AutoApproved: false, }), nil). @@ -345,15 +229,18 @@ func TestJoin(t *testing.T) { suite.CosmosClientMock. On( "BroadcastTx", - account.Name, - &launchtypes.MsgRequestAddAccount{ - Creator: account.Address(networktypes.SPN), - LaunchID: testutil.LaunchID, - Address: account.Address(networktypes.SPN), - Coins: sdk.NewCoins(sdk.NewCoin(TestDenom, sdk.NewInt(TestAmountInt))), - }, + account, + launchtypes.NewMsgSendRequest( + addr, + testutil.LaunchID, + launchtypes.NewGenesisAccount( + testutil.LaunchID, + addr, + sdk.NewCoins(sdk.NewCoin(TestDenom, sdkmath.NewInt(TestAmountInt))), + ), + ), ). - Return(testutil.NewResponse(&launchtypes.MsgRequestAddAccountResponse{ + Return(testutil.NewResponse(&launchtypes.MsgSendRequestResponse{ RequestID: TestAccountRequestID, AutoApproved: false, }), nil). @@ -363,98 +250,40 @@ func TestJoin(t *testing.T) { context.Background(), suite.ChainMock, testutil.LaunchID, - WithAccountRequest(sdk.NewCoins(sdk.NewCoin(TestDenom, sdk.NewInt(TestAmountInt)))), + gentxPath, + WithAccountRequest(sdk.NewCoins(sdk.NewCoin(TestDenom, sdkmath.NewInt(TestAmountInt)))), WithPublicAddress(testutil.TCPAddress), ) require.NoError(t, joinErr) suite.AssertAllMocks(t) }) - t.Run("failed to send join request with account request, account exists in genesis", func(t *testing.T) { - var ( - account = testutil.NewTestAccount(t, testutil.TestAccountName) - tmp = t.TempDir() - gentx = testutil.NewGentx( - account.Address(networktypes.SPN), - TestDenom, - TestAmountString, - "", - testutil.PeerAddress, - ) - gentxPath = gentx.SaveTo(t, tmp) - genesis = testutil.NewGenesis(testutil.ChainID).AddAccount(account.Address(networktypes.SPN)) - genesisPath = genesis.SaveTo(t, tmp) - suite, network = newSuite(account) - ) - - suite.ChainMock.On("NodeID", context.Background()).Return(testutil.NodeID, nil).Once() - suite.ChainMock.On("GenesisPath").Return(genesisPath, nil).Once() - suite.ChainMock.On("DefaultGentxPath").Return(gentxPath, nil).Once() - - joinErr := network.Join( - context.Background(), - suite.ChainMock, - testutil.LaunchID, - WithAccountRequest(sdk.NewCoins(sdk.NewCoin(TestDenom, sdk.NewInt(TestAmountInt)))), - WithPublicAddress(testutil.TCPAddress), - ) - require.Errorf(t, joinErr, "account %s already exist", account.Address(networktypes.SPN)) - suite.AssertAllMocks(t) - }) - - t.Run("failed to send join request with account request, failed to broadcast account tx", func(t *testing.T) { - var ( - account = testutil.NewTestAccount(t, testutil.TestAccountName) - tmp = t.TempDir() - gentx = testutil.NewGentx( - account.Address(networktypes.SPN), - TestDenom, - TestAmountString, - "", - testutil.PeerAddress, - ) - gentxPath = gentx.SaveTo(t, tmp) - genesisPath = testutil.NewGenesis(testutil.ChainID).SaveTo(t, tmp) - suite, network = newSuite(account) - expectedError = errors.New("failed to create account") + t.Run("failed to send join request, failed to read node id", func(t *testing.T) { + account := testutil.NewTestAccount(t, testutil.TestAccountName) + tmp := t.TempDir() + addr, err := account.Address(networktypes.SPN) + require.NoError(t, err) + gentx := testutil.NewGentx( + addr, + TestDenom, + TestAmountString, + "", + testutil.PeerAddress, ) + gentxPath := gentx.SaveTo(t, tmp) + suite, network := newSuite(account) + expectedError := errors.New("failed to get node id") - suite.ChainMock.On("NodeID", context.Background()).Return(testutil.NodeID, nil).Once() - suite.ChainMock.On("GenesisPath").Return(genesisPath, nil).Once() - suite.ChainMock.On("DefaultGentxPath").Return(gentxPath, nil).Once() - - suite.LaunchQueryMock. - On( - "VestingAccount", - context.Background(), - &launchtypes.QueryGetVestingAccountRequest{ - Address: account.Address(networktypes.SPN), - LaunchID: testutil.LaunchID, - }). - Return(nil, cosmoserror.ErrNotFound). - Once() - suite.CosmosClientMock. - On( - "BroadcastTx", - account.Name, - &launchtypes.MsgRequestAddAccount{ - Creator: account.Address(networktypes.SPN), - LaunchID: testutil.LaunchID, - Address: account.Address(networktypes.SPN), - Coins: sdk.NewCoins(sdk.NewCoin(TestDenom, sdk.NewInt(TestAmountInt))), - }, - ). - Return( - testutil.NewResponse(&launchtypes.MsgRequestAddAccountResponse{}), - expectedError, - ). + suite.ChainMock. + On("NodeID", mock.Anything). + Return("", expectedError). Once() joinErr := network.Join( context.Background(), suite.ChainMock, testutil.LaunchID, - WithAccountRequest(sdk.NewCoins(sdk.NewCoin(TestDenom, sdk.NewInt(TestAmountInt)))), + gentxPath, WithPublicAddress(testutil.TCPAddress), ) require.Error(t, joinErr) @@ -462,72 +291,7 @@ func TestJoin(t *testing.T) { suite.AssertAllMocks(t) }) - t.Run("failed to send join request, failed to read node id", func(t *testing.T) { - var ( - account = testutil.NewTestAccount(t, testutil.TestAccountName) - suite, network = newSuite(account) - expectedError = errors.New("failed to get node id") - ) - suite.ChainMock. - On("NodeID", mock.Anything). - Return("", expectedError). - Once() - - joinErr := network.Join(context.Background(), suite.ChainMock, testutil.LaunchID, WithPublicAddress(testutil.TCPAddress)) - require.Error(t, joinErr) - require.Equal(t, expectedError, joinErr) - suite.AssertAllMocks(t) - }) - - t.Run("failed to send join request, failed to read default gentx", func(t *testing.T) { - var ( - account = testutil.NewTestAccount(t, testutil.TestAccountName) - suite, network = newSuite(account) - expectedError = errors.New("failed to get default gentx path") - ) - - suite.ChainMock.On("NodeID", context.Background()).Return(testutil.NodeID, nil).Once() - suite.ChainMock. - On("DefaultGentxPath"). - Return("", expectedError). - Once() - - joinErr := network.Join(context.Background(), suite.ChainMock, testutil.LaunchID, WithPublicAddress(testutil.TCPAddress)) - require.Error(t, joinErr) - require.Equal(t, expectedError, joinErr) - suite.AssertAllMocks(t) - }) - - t.Run("failed to send join request, failed to read genesis", func(t *testing.T) { - var ( - account = testutil.NewTestAccount(t, testutil.TestAccountName) - tmp = t.TempDir() - gentx = testutil.NewGentx( - account.Address(networktypes.SPN), - TestDenom, - TestAmountString, - "", - testutil.PeerAddress, - ) - gentxPath = gentx.SaveTo(t, tmp) - suite, network = newSuite(account) - expectedError = errors.New("failed to get genesis path") - ) - - suite.ChainMock.On("NodeID", context.Background()).Return(testutil.NodeID, nil).Once() - suite.ChainMock.On("DefaultGentxPath").Return(gentxPath, nil).Once() - suite.ChainMock. - On("GenesisPath"). - Return("", expectedError). - Once() - - joinErr := network.Join(context.Background(), suite.ChainMock, testutil.LaunchID, WithPublicAddress(testutil.TCPAddress)) - require.Error(t, joinErr) - require.Equal(t, expectedError, joinErr) - suite.AssertAllMocks(t) - }) - - t.Run("failed to send join request, failed to read custom genesis", func(t *testing.T) { + t.Run("failed to send join request, failed to read gentx", func(t *testing.T) { var ( account = testutil.NewTestAccount(t, testutil.TestAccountName) gentxPath = "invalid/path" @@ -535,7 +299,7 @@ func TestJoin(t *testing.T) { expectedError = errors.New("chain home folder is not initialized yet: invalid/path") ) - joinErr := network.Join(context.Background(), suite.ChainMock, testutil.LaunchID, WithCustomGentxPath(gentxPath)) + joinErr := network.Join(context.Background(), suite.ChainMock, testutil.LaunchID, gentxPath) require.Error(t, joinErr) require.Equal(t, expectedError, joinErr) suite.AssertAllMocks(t) diff --git a/ignite/services/network/launch.go b/ignite/services/network/launch.go index 83c0b7204d..ca559b8d09 100644 --- a/ignite/services/network/launch.go +++ b/ignite/services/network/launch.go @@ -8,10 +8,15 @@ import ( launchtypes "github.com/tendermint/spn/x/launch/types" "github.com/ignite/cli/ignite/pkg/events" - "github.com/ignite/cli/ignite/pkg/xtime" "github.com/ignite/cli/ignite/services/network/networktypes" ) +// MinLaunchTimeOffset represents an offset used when minimum launch time is used +// minimum launch time will be block time + minimum launch time duration param +// block time when tx is executed is not predicable, therefore we add few seconds +// to ensure the minimum duration is reached +const MinLaunchTimeOffset = time.Second * 30 + // LaunchParams fetches the chain launch module params from SPN func (n Network) LaunchParams(ctx context.Context) (launchtypes.Params, error) { res, err := n.launchQuery.Params(ctx, &launchtypes.QueryParamsRequest{}) @@ -22,7 +27,7 @@ func (n Network) LaunchParams(ctx context.Context) (launchtypes.Params, error) { } // TriggerLaunch launches a chain as a coordinator -func (n Network) TriggerLaunch(ctx context.Context, launchID uint64, remainingTime time.Duration) error { +func (n Network) TriggerLaunch(ctx context.Context, launchID uint64, launchTime time.Time) error { n.ev.Send(events.New(events.StatusOngoing, fmt.Sprintf("Launching chain %d", launchID))) params, err := n.LaunchParams(ctx) if err != nil { @@ -30,27 +35,36 @@ func (n Network) TriggerLaunch(ctx context.Context, launchID uint64, remainingTi } var ( - minLaunch = xtime.Seconds(params.LaunchTimeRange.MinLaunchTime) - maxLaunch = xtime.Seconds(params.LaunchTimeRange.MaxLaunchTime) - address = n.account.Address(networktypes.SPN) + minLaunchTime = n.clock.Now().Add(params.LaunchTimeRange.MinLaunchTime).Add(MinLaunchTimeOffset) + maxLaunchTime = n.clock.Now().Add(params.LaunchTimeRange.MaxLaunchTime) ) - switch { - case remainingTime == 0: - // if the user does not specify the remaining time, use the minimal one - remainingTime = minLaunch - case remainingTime < minLaunch: - return fmt.Errorf("remaining time %s lower than minimum %s", - xtime.NowAfter(remainingTime), - xtime.NowAfter(minLaunch)) - case remainingTime > maxLaunch: - return fmt.Errorf("remaining time %s greater than maximum %s", - xtime.NowAfter(remainingTime), - xtime.NowAfter(maxLaunch)) + address, err := n.account.Address(networktypes.SPN) + if err != nil { + return err + } + + if launchTime.IsZero() { + // Use minimum launch time by default + launchTime = minLaunchTime + } else { + // check launch time is in range + switch { + case launchTime.Before(minLaunchTime): + return fmt.Errorf("launch time %s lower than minimum %s", + launchTime.String(), + minLaunchTime.String(), + ) + case launchTime.After(maxLaunchTime): + return fmt.Errorf("launch time %s bigger than maximum %s", + launchTime.String(), + maxLaunchTime.String(), + ) + } } - msg := launchtypes.NewMsgTriggerLaunch(address, launchID, int64(remainingTime.Seconds())) + msg := launchtypes.NewMsgTriggerLaunch(address, launchID, launchTime) n.ev.Send(events.New(events.StatusOngoing, "Setting launch time")) - res, err := n.cosmos.BroadcastTx(n.account.Name, msg) + res, err := n.cosmos.BroadcastTx(n.account, msg) if err != nil { return err } @@ -61,7 +75,7 @@ func (n Network) TriggerLaunch(ctx context.Context, launchID uint64, remainingTi } n.ev.Send(events.New(events.StatusDone, - fmt.Sprintf("Chain %d will be launched on %s", launchID, xtime.NowAfter(remainingTime)), + fmt.Sprintf("Chain %d will be launched on %s", launchID, launchTime.String()), )) return nil } @@ -70,9 +84,13 @@ func (n Network) TriggerLaunch(ctx context.Context, launchID uint64, remainingTi func (n Network) RevertLaunch(launchID uint64, chain Chain) error { n.ev.Send(events.New(events.StatusOngoing, fmt.Sprintf("Reverting launched chain %d", launchID))) - address := n.account.Address(networktypes.SPN) + address, err := n.account.Address(networktypes.SPN) + if err != nil { + return err + } + msg := launchtypes.NewMsgRevertLaunch(address, launchID) - _, err := n.cosmos.BroadcastTx(n.account.Name, msg) + _, err = n.cosmos.BroadcastTx(n.account, msg) if err != nil { return err } diff --git a/ignite/services/network/launch_test.go b/ignite/services/network/launch_test.go index 560c0df475..5c51523fb4 100644 --- a/ignite/services/network/launch_test.go +++ b/ignite/services/network/launch_test.go @@ -10,15 +10,14 @@ import ( "github.com/stretchr/testify/require" launchtypes "github.com/tendermint/spn/x/launch/types" - "github.com/ignite/cli/ignite/pkg/xtime" "github.com/ignite/cli/ignite/services/network/networktypes" "github.com/ignite/cli/ignite/services/network/testutil" ) const ( - TestMinRemainingTime = 3600 - TestMaxRemainingTime = 86400 - TestRevertDelay = 3600 + TestMinRemainingTime = time.Second * 3600 + TestMaxRemainingTime = time.Second * 86400 + TestRevertDelay = time.Second * 3600 ) func TestTriggerLaunch(t *testing.T) { @@ -28,6 +27,9 @@ func TestTriggerLaunch(t *testing.T) { suite, network = newSuite(account) ) + addr, err := account.Address(networktypes.SPN) + require.NoError(t, err) + suite.LaunchQueryMock. On("Params", context.Background(), &launchtypes.QueryParamsRequest{}). Return(&launchtypes.QueryParamsResponse{ @@ -35,15 +37,17 @@ func TestTriggerLaunch(t *testing.T) { }, nil). Once() suite.CosmosClientMock. - On("BroadcastTx", account.Name, &launchtypes.MsgTriggerLaunch{ - Coordinator: account.Address(networktypes.SPN), - LaunchID: testutil.LaunchID, - RemainingTime: TestMaxRemainingTime, - }). + On("BroadcastTx", + account, + &launchtypes.MsgTriggerLaunch{ + Coordinator: addr, + LaunchID: testutil.LaunchID, + LaunchTime: sampleTime.Add(TestMaxRemainingTime), + }). Return(testutil.NewResponse(&launchtypes.MsgTriggerLaunchResponse{}), nil). Once() - launchError := network.TriggerLaunch(context.Background(), testutil.LaunchID, TestMaxRemainingTime*time.Second) + launchError := network.TriggerLaunch(context.Background(), testutil.LaunchID, sampleTime.Add(TestMaxRemainingTime)) require.NoError(t, launchError) suite.AssertAllMocks(t) }) @@ -52,7 +56,7 @@ func TestTriggerLaunch(t *testing.T) { var ( account = testutil.NewTestAccount(t, testutil.TestAccountName) suite, network = newSuite(account) - remainingTimeLowerThanMinimum = (TestMinRemainingTime - 60) * time.Second + remainingTimeLowerThanMinimum = sampleTime ) suite.LaunchQueryMock. @@ -67,8 +71,8 @@ func TestTriggerLaunch(t *testing.T) { t, launchError, "remaining time %s lower than minimum %s", - xtime.NowAfter(remainingTimeLowerThanMinimum), - xtime.NowAfter(TestMinRemainingTime), + remainingTimeLowerThanMinimum.String(), + sampleTime.Add(TestMinRemainingTime).Add(MinLaunchTimeOffset).String(), ) suite.AssertAllMocks(t) }) @@ -77,7 +81,7 @@ func TestTriggerLaunch(t *testing.T) { var ( account = testutil.NewTestAccount(t, testutil.TestAccountName) suite, network = newSuite(account) - remainingTimeGreaterThanMaximum = (TestMaxRemainingTime + 60) * time.Hour + remainingTimeGreaterThanMaximum = sampleTime.Add(TestMaxRemainingTime).Add(time.Second) ) suite.LaunchQueryMock. @@ -92,8 +96,8 @@ func TestTriggerLaunch(t *testing.T) { t, launchError, "remaining time %s greater than maximum %s", - xtime.NowAfter(remainingTimeGreaterThanMaximum), - xtime.NowAfter(TestMaxRemainingTime), + remainingTimeGreaterThanMaximum.String(), + sampleTime.Add(TestMaxRemainingTime).String(), ) suite.AssertAllMocks(t) }) @@ -105,6 +109,9 @@ func TestTriggerLaunch(t *testing.T) { expectedError = errors.New("Failed to fetch") ) + addr, err := account.Address(networktypes.SPN) + require.NoError(t, err) + suite.LaunchQueryMock. On("Params", context.Background(), &launchtypes.QueryParamsRequest{}). Return(&launchtypes.QueryParamsResponse{ @@ -112,15 +119,17 @@ func TestTriggerLaunch(t *testing.T) { }, nil). Once() suite.CosmosClientMock. - On("BroadcastTx", account.Name, &launchtypes.MsgTriggerLaunch{ - Coordinator: account.Address(networktypes.SPN), - LaunchID: testutil.LaunchID, - RemainingTime: TestMaxRemainingTime, - }). + On("BroadcastTx", + account, + &launchtypes.MsgTriggerLaunch{ + Coordinator: addr, + LaunchID: testutil.LaunchID, + LaunchTime: sampleTime.Add(TestMaxRemainingTime), + }). Return(testutil.NewResponse(&launchtypes.MsgTriggerLaunch{}), expectedError). Once() - launchError := network.TriggerLaunch(context.Background(), testutil.LaunchID, TestMaxRemainingTime*time.Second) + launchError := network.TriggerLaunch(context.Background(), testutil.LaunchID, sampleTime.Add(TestMaxRemainingTime)) require.Error(t, launchError) require.Equal(t, expectedError, launchError) suite.AssertAllMocks(t) @@ -133,6 +142,9 @@ func TestTriggerLaunch(t *testing.T) { expectedError = errors.New("failed to fetch") ) + addr, err := account.Address(networktypes.SPN) + require.NoError(t, err) + suite.LaunchQueryMock. On("Params", context.Background(), &launchtypes.QueryParamsRequest{}). Return(&launchtypes.QueryParamsResponse{ @@ -140,15 +152,17 @@ func TestTriggerLaunch(t *testing.T) { }, nil). Once() suite.CosmosClientMock. - On("BroadcastTx", account.Name, &launchtypes.MsgTriggerLaunch{ - Coordinator: account.Address(networktypes.SPN), - LaunchID: testutil.LaunchID, - RemainingTime: TestMaxRemainingTime, - }). + On("BroadcastTx", + account, + &launchtypes.MsgTriggerLaunch{ + Coordinator: addr, + LaunchID: testutil.LaunchID, + LaunchTime: sampleTime.Add(TestMaxRemainingTime), + }). Return(testutil.NewResponse(&launchtypes.MsgCreateChainResponse{}), expectedError). Once() - launchError := network.TriggerLaunch(context.Background(), testutil.LaunchID, TestMaxRemainingTime*time.Second) + launchError := network.TriggerLaunch(context.Background(), testutil.LaunchID, sampleTime.Add(TestMaxRemainingTime)) require.Error(t, launchError) require.Equal(t, expectedError, launchError) suite.AssertAllMocks(t) @@ -168,7 +182,7 @@ func TestTriggerLaunch(t *testing.T) { }, expectedError). Once() - launchError := network.TriggerLaunch(context.Background(), testutil.LaunchID, (TestMaxRemainingTime+60)*time.Second) + launchError := network.TriggerLaunch(context.Background(), testutil.LaunchID, sampleTime.Add(TestMaxRemainingTime)) require.Error(t, launchError) require.Equal(t, expectedError, launchError) suite.AssertAllMocks(t) @@ -182,12 +196,17 @@ func TestRevertLaunch(t *testing.T) { suite, network = newSuite(account) ) + addr, err := account.Address(networktypes.SPN) + require.NoError(t, err) + suite.ChainMock.On("ResetGenesisTime").Return(nil).Once() suite.CosmosClientMock. - On("BroadcastTx", account.Name, &launchtypes.MsgRevertLaunch{ - Coordinator: account.Address(networktypes.SPN), - LaunchID: testutil.LaunchID, - }). + On("BroadcastTx", + account, + &launchtypes.MsgRevertLaunch{ + Coordinator: addr, + LaunchID: testutil.LaunchID, + }). Return(testutil.NewResponse(&launchtypes.MsgRevertLaunchResponse{}), nil). Once() @@ -203,11 +222,16 @@ func TestRevertLaunch(t *testing.T) { expectedError = errors.New("failed to revert launch") ) + addr, err := account.Address(networktypes.SPN) + require.NoError(t, err) + suite.CosmosClientMock. - On("BroadcastTx", account.Name, &launchtypes.MsgRevertLaunch{ - Coordinator: account.Address(networktypes.SPN), - LaunchID: testutil.LaunchID, - }). + On("BroadcastTx", + account, + &launchtypes.MsgRevertLaunch{ + Coordinator: addr, + LaunchID: testutil.LaunchID, + }). Return( testutil.NewResponse(&launchtypes.MsgRevertLaunchResponse{}), expectedError, @@ -227,15 +251,20 @@ func TestRevertLaunch(t *testing.T) { expectedError = errors.New("failed to reset genesis time") ) + addr, err := account.Address(networktypes.SPN) + require.NoError(t, err) + suite.ChainMock. On("ResetGenesisTime"). Return(expectedError). Once() suite.CosmosClientMock. - On("BroadcastTx", account.Name, &launchtypes.MsgRevertLaunch{ - Coordinator: account.Address(networktypes.SPN), - LaunchID: testutil.LaunchID, - }). + On("BroadcastTx", + account, + &launchtypes.MsgRevertLaunch{ + Coordinator: addr, + LaunchID: testutil.LaunchID, + }). Return(testutil.NewResponse(&launchtypes.MsgRevertLaunchResponse{}), nil). Once() @@ -244,5 +273,4 @@ func TestRevertLaunch(t *testing.T) { require.Equal(t, expectedError, revertError) suite.AssertAllMocks(t) }) - } diff --git a/ignite/services/network/mocks/account_info.go b/ignite/services/network/mocks/account_info.go index 41d46ebb59..38193c67ae 100644 --- a/ignite/services/network/mocks/account_info.go +++ b/ignite/services/network/mocks/account_info.go @@ -1,127 +1,21 @@ -// Code generated by mockery v2.12.3. DO NOT EDIT. +// Code generated by mockery v2.14.0. DO NOT EDIT. package mocks -import ( - hd "github.com/cosmos/cosmos-sdk/crypto/hd" - cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" - - keyring "github.com/cosmos/cosmos-sdk/crypto/keyring" - - mock "github.com/stretchr/testify/mock" - - types "github.com/cosmos/cosmos-sdk/types" -) +import mock "github.com/stretchr/testify/mock" // AccountInfo is an autogenerated mock type for the AccountInfo type type AccountInfo struct { mock.Mock } -// GetAddress provides a mock function with given fields: -func (_m *AccountInfo) GetAddress() types.AccAddress { - ret := _m.Called() - - var r0 types.AccAddress - if rf, ok := ret.Get(0).(func() types.AccAddress); ok { - r0 = rf() - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(types.AccAddress) - } - } - - return r0 -} - -// GetAlgo provides a mock function with given fields: -func (_m *AccountInfo) GetAlgo() hd.PubKeyType { - ret := _m.Called() - - var r0 hd.PubKeyType - if rf, ok := ret.Get(0).(func() hd.PubKeyType); ok { - r0 = rf() - } else { - r0 = ret.Get(0).(hd.PubKeyType) - } - - return r0 -} - -// GetName provides a mock function with given fields: -func (_m *AccountInfo) GetName() string { - ret := _m.Called() - - var r0 string - if rf, ok := ret.Get(0).(func() string); ok { - r0 = rf() - } else { - r0 = ret.Get(0).(string) - } - - return r0 -} - -// GetPath provides a mock function with given fields: -func (_m *AccountInfo) GetPath() (*hd.BIP44Params, error) { - ret := _m.Called() - - var r0 *hd.BIP44Params - if rf, ok := ret.Get(0).(func() *hd.BIP44Params); ok { - r0 = rf() - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*hd.BIP44Params) - } - } - - var r1 error - if rf, ok := ret.Get(1).(func() error); ok { - r1 = rf() - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// GetPubKey provides a mock function with given fields: -func (_m *AccountInfo) GetPubKey() cryptotypes.PubKey { - ret := _m.Called() - - var r0 cryptotypes.PubKey - if rf, ok := ret.Get(0).(func() cryptotypes.PubKey); ok { - r0 = rf() - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(cryptotypes.PubKey) - } - } - - return r0 -} - -// GetType provides a mock function with given fields: -func (_m *AccountInfo) GetType() keyring.KeyType { - ret := _m.Called() - - var r0 keyring.KeyType - if rf, ok := ret.Get(0).(func() keyring.KeyType); ok { - r0 = rf() - } else { - r0 = ret.Get(0).(keyring.KeyType) - } - - return r0 -} - -type NewAccountInfoT interface { +type mockConstructorTestingTNewAccountInfo interface { mock.TestingT Cleanup(func()) } // NewAccountInfo creates a new instance of AccountInfo. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -func NewAccountInfo(t NewAccountInfoT) *AccountInfo { +func NewAccountInfo(t mockConstructorTestingTNewAccountInfo) *AccountInfo { mock := &AccountInfo{} mock.Mock.Test(t) diff --git a/ignite/services/network/mocks/bank_client.go b/ignite/services/network/mocks/bank_client.go new file mode 100644 index 0000000000..15e02b7ece --- /dev/null +++ b/ignite/services/network/mocks/bank_client.go @@ -0,0 +1,303 @@ +// Code generated by mockery v2.14.0. DO NOT EDIT. + +package mocks + +import ( + context "context" + + grpc "google.golang.org/grpc" + + mock "github.com/stretchr/testify/mock" + + types "github.com/cosmos/cosmos-sdk/x/bank/types" +) + +// BankClient is an autogenerated mock type for the BankClient type +type BankClient struct { + mock.Mock +} + +// AllBalances provides a mock function with given fields: ctx, in, opts +func (_m *BankClient) AllBalances(ctx context.Context, in *types.QueryAllBalancesRequest, opts ...grpc.CallOption) (*types.QueryAllBalancesResponse, error) { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, in) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *types.QueryAllBalancesResponse + if rf, ok := ret.Get(0).(func(context.Context, *types.QueryAllBalancesRequest, ...grpc.CallOption) *types.QueryAllBalancesResponse); ok { + r0 = rf(ctx, in, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.QueryAllBalancesResponse) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *types.QueryAllBalancesRequest, ...grpc.CallOption) error); ok { + r1 = rf(ctx, in, opts...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// Balance provides a mock function with given fields: ctx, in, opts +func (_m *BankClient) Balance(ctx context.Context, in *types.QueryBalanceRequest, opts ...grpc.CallOption) (*types.QueryBalanceResponse, error) { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, in) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *types.QueryBalanceResponse + if rf, ok := ret.Get(0).(func(context.Context, *types.QueryBalanceRequest, ...grpc.CallOption) *types.QueryBalanceResponse); ok { + r0 = rf(ctx, in, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.QueryBalanceResponse) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *types.QueryBalanceRequest, ...grpc.CallOption) error); ok { + r1 = rf(ctx, in, opts...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// DenomMetadata provides a mock function with given fields: ctx, in, opts +func (_m *BankClient) DenomMetadata(ctx context.Context, in *types.QueryDenomMetadataRequest, opts ...grpc.CallOption) (*types.QueryDenomMetadataResponse, error) { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, in) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *types.QueryDenomMetadataResponse + if rf, ok := ret.Get(0).(func(context.Context, *types.QueryDenomMetadataRequest, ...grpc.CallOption) *types.QueryDenomMetadataResponse); ok { + r0 = rf(ctx, in, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.QueryDenomMetadataResponse) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *types.QueryDenomMetadataRequest, ...grpc.CallOption) error); ok { + r1 = rf(ctx, in, opts...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// DenomOwners provides a mock function with given fields: ctx, in, opts +func (_m *BankClient) DenomOwners(ctx context.Context, in *types.QueryDenomOwnersRequest, opts ...grpc.CallOption) (*types.QueryDenomOwnersResponse, error) { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, in) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *types.QueryDenomOwnersResponse + if rf, ok := ret.Get(0).(func(context.Context, *types.QueryDenomOwnersRequest, ...grpc.CallOption) *types.QueryDenomOwnersResponse); ok { + r0 = rf(ctx, in, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.QueryDenomOwnersResponse) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *types.QueryDenomOwnersRequest, ...grpc.CallOption) error); ok { + r1 = rf(ctx, in, opts...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// DenomsMetadata provides a mock function with given fields: ctx, in, opts +func (_m *BankClient) DenomsMetadata(ctx context.Context, in *types.QueryDenomsMetadataRequest, opts ...grpc.CallOption) (*types.QueryDenomsMetadataResponse, error) { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, in) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *types.QueryDenomsMetadataResponse + if rf, ok := ret.Get(0).(func(context.Context, *types.QueryDenomsMetadataRequest, ...grpc.CallOption) *types.QueryDenomsMetadataResponse); ok { + r0 = rf(ctx, in, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.QueryDenomsMetadataResponse) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *types.QueryDenomsMetadataRequest, ...grpc.CallOption) error); ok { + r1 = rf(ctx, in, opts...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// Params provides a mock function with given fields: ctx, in, opts +func (_m *BankClient) Params(ctx context.Context, in *types.QueryParamsRequest, opts ...grpc.CallOption) (*types.QueryParamsResponse, error) { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, in) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *types.QueryParamsResponse + if rf, ok := ret.Get(0).(func(context.Context, *types.QueryParamsRequest, ...grpc.CallOption) *types.QueryParamsResponse); ok { + r0 = rf(ctx, in, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.QueryParamsResponse) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *types.QueryParamsRequest, ...grpc.CallOption) error); ok { + r1 = rf(ctx, in, opts...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// SpendableBalances provides a mock function with given fields: ctx, in, opts +func (_m *BankClient) SpendableBalances(ctx context.Context, in *types.QuerySpendableBalancesRequest, opts ...grpc.CallOption) (*types.QuerySpendableBalancesResponse, error) { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, in) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *types.QuerySpendableBalancesResponse + if rf, ok := ret.Get(0).(func(context.Context, *types.QuerySpendableBalancesRequest, ...grpc.CallOption) *types.QuerySpendableBalancesResponse); ok { + r0 = rf(ctx, in, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.QuerySpendableBalancesResponse) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *types.QuerySpendableBalancesRequest, ...grpc.CallOption) error); ok { + r1 = rf(ctx, in, opts...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// SupplyOf provides a mock function with given fields: ctx, in, opts +func (_m *BankClient) SupplyOf(ctx context.Context, in *types.QuerySupplyOfRequest, opts ...grpc.CallOption) (*types.QuerySupplyOfResponse, error) { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, in) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *types.QuerySupplyOfResponse + if rf, ok := ret.Get(0).(func(context.Context, *types.QuerySupplyOfRequest, ...grpc.CallOption) *types.QuerySupplyOfResponse); ok { + r0 = rf(ctx, in, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.QuerySupplyOfResponse) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *types.QuerySupplyOfRequest, ...grpc.CallOption) error); ok { + r1 = rf(ctx, in, opts...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// TotalSupply provides a mock function with given fields: ctx, in, opts +func (_m *BankClient) TotalSupply(ctx context.Context, in *types.QueryTotalSupplyRequest, opts ...grpc.CallOption) (*types.QueryTotalSupplyResponse, error) { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, in) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *types.QueryTotalSupplyResponse + if rf, ok := ret.Get(0).(func(context.Context, *types.QueryTotalSupplyRequest, ...grpc.CallOption) *types.QueryTotalSupplyResponse); ok { + r0 = rf(ctx, in, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.QueryTotalSupplyResponse) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *types.QueryTotalSupplyRequest, ...grpc.CallOption) error); ok { + r1 = rf(ctx, in, opts...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +type mockConstructorTestingTNewBankClient interface { + mock.TestingT + Cleanup(func()) +} + +// NewBankClient creates a new instance of BankClient. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +func NewBankClient(t mockConstructorTestingTNewBankClient) *BankClient { + mock := &BankClient{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/ignite/services/network/mocks/campaign_client.go b/ignite/services/network/mocks/campaign_client.go index 4bded5b175..97d74073ad 100644 --- a/ignite/services/network/mocks/campaign_client.go +++ b/ignite/services/network/mocks/campaign_client.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.12.3. DO NOT EDIT. +// Code generated by mockery v2.14.0. DO NOT EDIT. package mocks @@ -17,36 +17,6 @@ type CampaignClient struct { mock.Mock } -// AuctionsOfCampaign provides a mock function with given fields: ctx, in, opts -func (_m *CampaignClient) AuctionsOfCampaign(ctx context.Context, in *types.QueryAuctionsOfCampaignRequest, opts ...grpc.CallOption) (*types.QueryAuctionsOfCampaignResponse, error) { - _va := make([]interface{}, len(opts)) - for _i := range opts { - _va[_i] = opts[_i] - } - var _ca []interface{} - _ca = append(_ca, ctx, in) - _ca = append(_ca, _va...) - ret := _m.Called(_ca...) - - var r0 *types.QueryAuctionsOfCampaignResponse - if rf, ok := ret.Get(0).(func(context.Context, *types.QueryAuctionsOfCampaignRequest, ...grpc.CallOption) *types.QueryAuctionsOfCampaignResponse); ok { - r0 = rf(ctx, in, opts...) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*types.QueryAuctionsOfCampaignResponse) - } - } - - var r1 error - if rf, ok := ret.Get(1).(func(context.Context, *types.QueryAuctionsOfCampaignRequest, ...grpc.CallOption) error); ok { - r1 = rf(ctx, in, opts...) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - // Campaign provides a mock function with given fields: ctx, in, opts func (_m *CampaignClient) Campaign(ctx context.Context, in *types.QueryGetCampaignRequest, opts ...grpc.CallOption) (*types.QueryGetCampaignResponse, error) { _va := make([]interface{}, len(opts)) @@ -137,66 +107,6 @@ func (_m *CampaignClient) CampaignChains(ctx context.Context, in *types.QueryGet return r0, r1 } -// CampaignSummaries provides a mock function with given fields: ctx, in, opts -func (_m *CampaignClient) CampaignSummaries(ctx context.Context, in *types.QueryCampaignSummariesRequest, opts ...grpc.CallOption) (*types.QueryCampaignSummariesResponse, error) { - _va := make([]interface{}, len(opts)) - for _i := range opts { - _va[_i] = opts[_i] - } - var _ca []interface{} - _ca = append(_ca, ctx, in) - _ca = append(_ca, _va...) - ret := _m.Called(_ca...) - - var r0 *types.QueryCampaignSummariesResponse - if rf, ok := ret.Get(0).(func(context.Context, *types.QueryCampaignSummariesRequest, ...grpc.CallOption) *types.QueryCampaignSummariesResponse); ok { - r0 = rf(ctx, in, opts...) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*types.QueryCampaignSummariesResponse) - } - } - - var r1 error - if rf, ok := ret.Get(1).(func(context.Context, *types.QueryCampaignSummariesRequest, ...grpc.CallOption) error); ok { - r1 = rf(ctx, in, opts...) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// CampaignSummary provides a mock function with given fields: ctx, in, opts -func (_m *CampaignClient) CampaignSummary(ctx context.Context, in *types.QueryCampaignSummaryRequest, opts ...grpc.CallOption) (*types.QueryCampaignSummaryResponse, error) { - _va := make([]interface{}, len(opts)) - for _i := range opts { - _va[_i] = opts[_i] - } - var _ca []interface{} - _ca = append(_ca, ctx, in) - _ca = append(_ca, _va...) - ret := _m.Called(_ca...) - - var r0 *types.QueryCampaignSummaryResponse - if rf, ok := ret.Get(0).(func(context.Context, *types.QueryCampaignSummaryRequest, ...grpc.CallOption) *types.QueryCampaignSummaryResponse); ok { - r0 = rf(ctx, in, opts...) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*types.QueryCampaignSummaryResponse) - } - } - - var r1 error - if rf, ok := ret.Get(1).(func(context.Context, *types.QueryCampaignSummaryRequest, ...grpc.CallOption) error); ok { - r1 = rf(ctx, in, opts...) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - // MainnetAccount provides a mock function with given fields: ctx, in, opts func (_m *CampaignClient) MainnetAccount(ctx context.Context, in *types.QueryGetMainnetAccountRequest, opts ...grpc.CallOption) (*types.QueryGetMainnetAccountResponse, error) { _va := make([]interface{}, len(opts)) @@ -407,13 +317,13 @@ func (_m *CampaignClient) TotalShares(ctx context.Context, in *types.QueryTotalS return r0, r1 } -type NewCampaignClientT interface { +type mockConstructorTestingTNewCampaignClient interface { mock.TestingT Cleanup(func()) } // NewCampaignClient creates a new instance of CampaignClient. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -func NewCampaignClient(t NewCampaignClientT) *CampaignClient { +func NewCampaignClient(t mockConstructorTestingTNewCampaignClient) *CampaignClient { mock := &CampaignClient{} mock.Mock.Test(t) diff --git a/ignite/services/network/mocks/chain.go b/ignite/services/network/mocks/chain.go index 9ff3b873ee..a2c997f378 100644 --- a/ignite/services/network/mocks/chain.go +++ b/ignite/services/network/mocks/chain.go @@ -1,12 +1,11 @@ -// Code generated by mockery v2.12.2. DO NOT EDIT. +// Code generated by mockery v2.14.0. DO NOT EDIT. package mocks import ( - "context" - "testing" + context "context" - "github.com/stretchr/testify/mock" + mock "github.com/stretchr/testify/mock" ) // Chain is an autogenerated mock type for the Chain type @@ -252,8 +251,13 @@ func (_m *Chain) SourceURL() string { return r0 } -// NewChain creates a new instance of Chain. It also registers the testing.TB interface on the mock and a cleanup function to assert the mocks expectations. -func NewChain(t testing.TB) *Chain { +type mockConstructorTestingTNewChain interface { + mock.TestingT + Cleanup(func()) +} + +// NewChain creates a new instance of Chain. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +func NewChain(t mockConstructorTestingTNewChain) *Chain { mock := &Chain{} mock.Mock.Test(t) diff --git a/ignite/services/network/mocks/cosmos_client.go b/ignite/services/network/mocks/cosmos_client.go index e203637f5e..71cd776a12 100644 --- a/ignite/services/network/mocks/cosmos_client.go +++ b/ignite/services/network/mocks/cosmos_client.go @@ -1,18 +1,21 @@ -// Code generated by mockery v2.12.2. DO NOT EDIT. +// Code generated by mockery v2.14.0. DO NOT EDIT. package mocks import ( - "context" - "testing" + context "context" + + client "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/types" - "github.com/stretchr/testify/mock" coretypes "github.com/tendermint/tendermint/rpc/core/types" - "github.com/ignite/cli/ignite/pkg/cosmosaccount" - "github.com/ignite/cli/ignite/pkg/cosmosclient" + cosmosaccount "github.com/ignite/cli/ignite/pkg/cosmosaccount" + + cosmosclient "github.com/ignite/cli/ignite/pkg/cosmosclient" + + mock "github.com/stretchr/testify/mock" + + types "github.com/cosmos/cosmos-sdk/types" ) // CosmosClient is an autogenerated mock type for the CosmosClient type @@ -20,71 +23,27 @@ type CosmosClient struct { mock.Mock } -// Account provides a mock function with given fields: accountName -func (_m *CosmosClient) Account(accountName string) (cosmosaccount.Account, error) { - ret := _m.Called(accountName) - - var r0 cosmosaccount.Account - if rf, ok := ret.Get(0).(func(string) cosmosaccount.Account); ok { - r0 = rf(accountName) - } else { - r0 = ret.Get(0).(cosmosaccount.Account) - } - - var r1 error - if rf, ok := ret.Get(1).(func(string) error); ok { - r1 = rf(accountName) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// Address provides a mock function with given fields: accountName -func (_m *CosmosClient) Address(accountName string) (types.AccAddress, error) { - ret := _m.Called(accountName) - - var r0 types.AccAddress - if rf, ok := ret.Get(0).(func(string) types.AccAddress); ok { - r0 = rf(accountName) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(types.AccAddress) - } - } - - var r1 error - if rf, ok := ret.Get(1).(func(string) error); ok { - r1 = rf(accountName) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// BroadcastTx provides a mock function with given fields: accountName, msgs -func (_m *CosmosClient) BroadcastTx(accountName string, msgs ...types.Msg) (cosmosclient.Response, error) { +// BroadcastTx provides a mock function with given fields: account, msgs +func (_m *CosmosClient) BroadcastTx(account cosmosaccount.Account, msgs ...types.Msg) (cosmosclient.Response, error) { _va := make([]interface{}, len(msgs)) for _i := range msgs { _va[_i] = msgs[_i] } var _ca []interface{} - _ca = append(_ca, accountName) + _ca = append(_ca, account) _ca = append(_ca, _va...) ret := _m.Called(_ca...) var r0 cosmosclient.Response - if rf, ok := ret.Get(0).(func(string, ...types.Msg) cosmosclient.Response); ok { - r0 = rf(accountName, msgs...) + if rf, ok := ret.Get(0).(func(cosmosaccount.Account, ...types.Msg) cosmosclient.Response); ok { + r0 = rf(account, msgs...) } else { r0 = ret.Get(0).(cosmosclient.Response) } var r1 error - if rf, ok := ret.Get(1).(func(string, ...types.Msg) error); ok { - r1 = rf(accountName, msgs...) + if rf, ok := ret.Get(1).(func(cosmosaccount.Account, ...types.Msg) error); ok { + r1 = rf(account, msgs...) } else { r1 = ret.Error(1) } @@ -92,43 +51,6 @@ func (_m *CosmosClient) BroadcastTx(accountName string, msgs ...types.Msg) (cosm return r0, r1 } -// BroadcastTxWithProvision provides a mock function with given fields: accountName, msgs -func (_m *CosmosClient) BroadcastTxWithProvision(accountName string, msgs ...types.Msg) (uint64, func() (cosmosclient.Response, error), error) { - _va := make([]interface{}, len(msgs)) - for _i := range msgs { - _va[_i] = msgs[_i] - } - var _ca []interface{} - _ca = append(_ca, accountName) - _ca = append(_ca, _va...) - ret := _m.Called(_ca...) - - var r0 uint64 - if rf, ok := ret.Get(0).(func(string, ...types.Msg) uint64); ok { - r0 = rf(accountName, msgs...) - } else { - r0 = ret.Get(0).(uint64) - } - - var r1 func() (cosmosclient.Response, error) - if rf, ok := ret.Get(1).(func(string, ...types.Msg) func() (cosmosclient.Response, error)); ok { - r1 = rf(accountName, msgs...) - } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).(func() (cosmosclient.Response, error)) - } - } - - var r2 error - if rf, ok := ret.Get(2).(func(string, ...types.Msg) error); ok { - r2 = rf(accountName, msgs...) - } else { - r2 = ret.Error(2) - } - - return r0, r1, r2 -} - // ConsensusInfo provides a mock function with given fields: ctx, height func (_m *CosmosClient) ConsensusInfo(ctx context.Context, height int64) (cosmosclient.ConsensusInfo, error) { ret := _m.Called(ctx, height) @@ -187,8 +109,13 @@ func (_m *CosmosClient) Status(ctx context.Context) (*coretypes.ResultStatus, er return r0, r1 } -// NewCosmosClient creates a new instance of CosmosClient. It also registers the testing.TB interface on the mock and a cleanup function to assert the mocks expectations. -func NewCosmosClient(t testing.TB) *CosmosClient { +type mockConstructorTestingTNewCosmosClient interface { + mock.TestingT + Cleanup(func()) +} + +// NewCosmosClient creates a new instance of CosmosClient. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +func NewCosmosClient(t mockConstructorTestingTNewCosmosClient) *CosmosClient { mock := &CosmosClient{} mock.Mock.Test(t) diff --git a/ignite/services/network/mocks/ibc_client.go b/ignite/services/network/mocks/ibc_client.go new file mode 100644 index 0000000000..778cccd9c5 --- /dev/null +++ b/ignite/services/network/mocks/ibc_client.go @@ -0,0 +1,267 @@ +// Code generated by mockery v2.12.2. DO NOT EDIT. + +package mocks + +import ( + "context" + "testing" + + types "github.com/cosmos/ibc-go/v5/modules/core/02-client/types" + "github.com/stretchr/testify/mock" + "google.golang.org/grpc" +) + +// IBCClient is an autogenerated mock type for the QueryClient type +type IBCClient struct { + mock.Mock +} + +// ClientParams provides a mock function with given fields: ctx, in, opts +func (_m *IBCClient) ClientParams(ctx context.Context, in *types.QueryClientParamsRequest, opts ...grpc.CallOption) (*types.QueryClientParamsResponse, error) { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, in) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *types.QueryClientParamsResponse + if rf, ok := ret.Get(0).(func(context.Context, *types.QueryClientParamsRequest, ...grpc.CallOption) *types.QueryClientParamsResponse); ok { + r0 = rf(ctx, in, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.QueryClientParamsResponse) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *types.QueryClientParamsRequest, ...grpc.CallOption) error); ok { + r1 = rf(ctx, in, opts...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ClientState provides a mock function with given fields: ctx, in, opts +func (_m *IBCClient) ClientState(ctx context.Context, in *types.QueryClientStateRequest, opts ...grpc.CallOption) (*types.QueryClientStateResponse, error) { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, in) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *types.QueryClientStateResponse + if rf, ok := ret.Get(0).(func(context.Context, *types.QueryClientStateRequest, ...grpc.CallOption) *types.QueryClientStateResponse); ok { + r0 = rf(ctx, in, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.QueryClientStateResponse) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *types.QueryClientStateRequest, ...grpc.CallOption) error); ok { + r1 = rf(ctx, in, opts...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ClientStates provides a mock function with given fields: ctx, in, opts +func (_m *IBCClient) ClientStates(ctx context.Context, in *types.QueryClientStatesRequest, opts ...grpc.CallOption) (*types.QueryClientStatesResponse, error) { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, in) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *types.QueryClientStatesResponse + if rf, ok := ret.Get(0).(func(context.Context, *types.QueryClientStatesRequest, ...grpc.CallOption) *types.QueryClientStatesResponse); ok { + r0 = rf(ctx, in, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.QueryClientStatesResponse) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *types.QueryClientStatesRequest, ...grpc.CallOption) error); ok { + r1 = rf(ctx, in, opts...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ClientStatus provides a mock function with given fields: ctx, in, opts +func (_m *IBCClient) ClientStatus(ctx context.Context, in *types.QueryClientStatusRequest, opts ...grpc.CallOption) (*types.QueryClientStatusResponse, error) { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, in) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *types.QueryClientStatusResponse + if rf, ok := ret.Get(0).(func(context.Context, *types.QueryClientStatusRequest, ...grpc.CallOption) *types.QueryClientStatusResponse); ok { + r0 = rf(ctx, in, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.QueryClientStatusResponse) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *types.QueryClientStatusRequest, ...grpc.CallOption) error); ok { + r1 = rf(ctx, in, opts...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ConsensusState provides a mock function with given fields: ctx, in, opts +func (_m *IBCClient) ConsensusState(ctx context.Context, in *types.QueryConsensusStateRequest, opts ...grpc.CallOption) (*types.QueryConsensusStateResponse, error) { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, in) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *types.QueryConsensusStateResponse + if rf, ok := ret.Get(0).(func(context.Context, *types.QueryConsensusStateRequest, ...grpc.CallOption) *types.QueryConsensusStateResponse); ok { + r0 = rf(ctx, in, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.QueryConsensusStateResponse) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *types.QueryConsensusStateRequest, ...grpc.CallOption) error); ok { + r1 = rf(ctx, in, opts...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ConsensusStates provides a mock function with given fields: ctx, in, opts +func (_m *IBCClient) ConsensusStates(ctx context.Context, in *types.QueryConsensusStatesRequest, opts ...grpc.CallOption) (*types.QueryConsensusStatesResponse, error) { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, in) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *types.QueryConsensusStatesResponse + if rf, ok := ret.Get(0).(func(context.Context, *types.QueryConsensusStatesRequest, ...grpc.CallOption) *types.QueryConsensusStatesResponse); ok { + r0 = rf(ctx, in, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.QueryConsensusStatesResponse) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *types.QueryConsensusStatesRequest, ...grpc.CallOption) error); ok { + r1 = rf(ctx, in, opts...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// UpgradedClientState provides a mock function with given fields: ctx, in, opts +func (_m *IBCClient) UpgradedClientState(ctx context.Context, in *types.QueryUpgradedClientStateRequest, opts ...grpc.CallOption) (*types.QueryUpgradedClientStateResponse, error) { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, in) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *types.QueryUpgradedClientStateResponse + if rf, ok := ret.Get(0).(func(context.Context, *types.QueryUpgradedClientStateRequest, ...grpc.CallOption) *types.QueryUpgradedClientStateResponse); ok { + r0 = rf(ctx, in, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.QueryUpgradedClientStateResponse) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *types.QueryUpgradedClientStateRequest, ...grpc.CallOption) error); ok { + r1 = rf(ctx, in, opts...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// UpgradedConsensusState provides a mock function with given fields: ctx, in, opts +func (_m *IBCClient) UpgradedConsensusState(ctx context.Context, in *types.QueryUpgradedConsensusStateRequest, opts ...grpc.CallOption) (*types.QueryUpgradedConsensusStateResponse, error) { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, in) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *types.QueryUpgradedConsensusStateResponse + if rf, ok := ret.Get(0).(func(context.Context, *types.QueryUpgradedConsensusStateRequest, ...grpc.CallOption) *types.QueryUpgradedConsensusStateResponse); ok { + r0 = rf(ctx, in, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.QueryUpgradedConsensusStateResponse) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *types.QueryUpgradedConsensusStateRequest, ...grpc.CallOption) error); ok { + r1 = rf(ctx, in, opts...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// NewIBCClient creates a new instance of IBCClient. It also registers the testing.TB interface on the mock and a cleanup function to assert the mocks expectations. +func NewIBCClient(t testing.TB) *IBCClient { + mock := &IBCClient{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/ignite/services/network/mocks/launch_client.go b/ignite/services/network/mocks/launch_client.go index ad0740f1fb..2b0a624386 100644 --- a/ignite/services/network/mocks/launch_client.go +++ b/ignite/services/network/mocks/launch_client.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.12.3. DO NOT EDIT. +// Code generated by mockery v2.14.0. DO NOT EDIT. package mocks @@ -347,13 +347,13 @@ func (_m *LaunchClient) VestingAccountAll(ctx context.Context, in *types.QueryAl return r0, r1 } -type NewLaunchClientT interface { +type mockConstructorTestingTNewLaunchClient interface { mock.TestingT Cleanup(func()) } // NewLaunchClient creates a new instance of LaunchClient. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -func NewLaunchClient(t NewLaunchClientT) *LaunchClient { +func NewLaunchClient(t mockConstructorTestingTNewLaunchClient) *LaunchClient { mock := &LaunchClient{} mock.Mock.Test(t) diff --git a/ignite/services/network/mocks/monitoringc_client.go b/ignite/services/network/mocks/monitoringc_client.go new file mode 100644 index 0000000000..f585bf98c5 --- /dev/null +++ b/ignite/services/network/mocks/monitoringc_client.go @@ -0,0 +1,237 @@ +// Code generated by mockery v2.12.2. DO NOT EDIT. + +package mocks + +import ( + "context" + "testing" + + "github.com/stretchr/testify/mock" + "github.com/tendermint/spn/x/monitoringc/types" + "google.golang.org/grpc" +) + +// MonitoringcClient is an autogenerated mock type for the QueryClient type +type MonitoringcClient struct { + mock.Mock +} + +// LaunchIDFromChannelID provides a mock function with given fields: ctx, in, opts +func (_m *MonitoringcClient) LaunchIDFromChannelID(ctx context.Context, in *types.QueryGetLaunchIDFromChannelIDRequest, opts ...grpc.CallOption) (*types.QueryGetLaunchIDFromChannelIDResponse, error) { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, in) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *types.QueryGetLaunchIDFromChannelIDResponse + if rf, ok := ret.Get(0).(func(context.Context, *types.QueryGetLaunchIDFromChannelIDRequest, ...grpc.CallOption) *types.QueryGetLaunchIDFromChannelIDResponse); ok { + r0 = rf(ctx, in, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.QueryGetLaunchIDFromChannelIDResponse) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *types.QueryGetLaunchIDFromChannelIDRequest, ...grpc.CallOption) error); ok { + r1 = rf(ctx, in, opts...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// LaunchIDFromChannelIDAll provides a mock function with given fields: ctx, in, opts +func (_m *MonitoringcClient) LaunchIDFromChannelIDAll(ctx context.Context, in *types.QueryAllLaunchIDFromChannelIDRequest, opts ...grpc.CallOption) (*types.QueryAllLaunchIDFromChannelIDResponse, error) { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, in) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *types.QueryAllLaunchIDFromChannelIDResponse + if rf, ok := ret.Get(0).(func(context.Context, *types.QueryAllLaunchIDFromChannelIDRequest, ...grpc.CallOption) *types.QueryAllLaunchIDFromChannelIDResponse); ok { + r0 = rf(ctx, in, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.QueryAllLaunchIDFromChannelIDResponse) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *types.QueryAllLaunchIDFromChannelIDRequest, ...grpc.CallOption) error); ok { + r1 = rf(ctx, in, opts...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// MonitoringHistory provides a mock function with given fields: ctx, in, opts +func (_m *MonitoringcClient) MonitoringHistory(ctx context.Context, in *types.QueryGetMonitoringHistoryRequest, opts ...grpc.CallOption) (*types.QueryGetMonitoringHistoryResponse, error) { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, in) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *types.QueryGetMonitoringHistoryResponse + if rf, ok := ret.Get(0).(func(context.Context, *types.QueryGetMonitoringHistoryRequest, ...grpc.CallOption) *types.QueryGetMonitoringHistoryResponse); ok { + r0 = rf(ctx, in, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.QueryGetMonitoringHistoryResponse) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *types.QueryGetMonitoringHistoryRequest, ...grpc.CallOption) error); ok { + r1 = rf(ctx, in, opts...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// Params provides a mock function with given fields: ctx, in, opts +func (_m *MonitoringcClient) Params(ctx context.Context, in *types.QueryParamsRequest, opts ...grpc.CallOption) (*types.QueryParamsResponse, error) { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, in) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *types.QueryParamsResponse + if rf, ok := ret.Get(0).(func(context.Context, *types.QueryParamsRequest, ...grpc.CallOption) *types.QueryParamsResponse); ok { + r0 = rf(ctx, in, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.QueryParamsResponse) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *types.QueryParamsRequest, ...grpc.CallOption) error); ok { + r1 = rf(ctx, in, opts...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ProviderClientID provides a mock function with given fields: ctx, in, opts +func (_m *MonitoringcClient) ProviderClientID(ctx context.Context, in *types.QueryGetProviderClientIDRequest, opts ...grpc.CallOption) (*types.QueryGetProviderClientIDResponse, error) { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, in) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *types.QueryGetProviderClientIDResponse + if rf, ok := ret.Get(0).(func(context.Context, *types.QueryGetProviderClientIDRequest, ...grpc.CallOption) *types.QueryGetProviderClientIDResponse); ok { + r0 = rf(ctx, in, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.QueryGetProviderClientIDResponse) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *types.QueryGetProviderClientIDRequest, ...grpc.CallOption) error); ok { + r1 = rf(ctx, in, opts...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ProviderClientIDAll provides a mock function with given fields: ctx, in, opts +func (_m *MonitoringcClient) ProviderClientIDAll(ctx context.Context, in *types.QueryAllProviderClientIDRequest, opts ...grpc.CallOption) (*types.QueryAllProviderClientIDResponse, error) { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, in) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *types.QueryAllProviderClientIDResponse + if rf, ok := ret.Get(0).(func(context.Context, *types.QueryAllProviderClientIDRequest, ...grpc.CallOption) *types.QueryAllProviderClientIDResponse); ok { + r0 = rf(ctx, in, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.QueryAllProviderClientIDResponse) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *types.QueryAllProviderClientIDRequest, ...grpc.CallOption) error); ok { + r1 = rf(ctx, in, opts...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// VerifiedClientIds provides a mock function with given fields: ctx, in, opts +func (_m *MonitoringcClient) VerifiedClientIds(ctx context.Context, in *types.QueryGetVerifiedClientIdsRequest, opts ...grpc.CallOption) (*types.QueryGetVerifiedClientIdsResponse, error) { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, in) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *types.QueryGetVerifiedClientIdsResponse + if rf, ok := ret.Get(0).(func(context.Context, *types.QueryGetVerifiedClientIdsRequest, ...grpc.CallOption) *types.QueryGetVerifiedClientIdsResponse); ok { + r0 = rf(ctx, in, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.QueryGetVerifiedClientIdsResponse) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *types.QueryGetVerifiedClientIdsRequest, ...grpc.CallOption) error); ok { + r1 = rf(ctx, in, opts...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// NewMonitoringcClient creates a new instance of MonitoringcClient. It also registers the testing.TB interface on the mock and a cleanup function to assert the mocks expectations. +func NewMonitoringcClient(t testing.TB) *MonitoringcClient { + mock := &MonitoringcClient{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/ignite/services/network/mocks/monitoringp_client.go b/ignite/services/network/mocks/monitoringp_client.go new file mode 100644 index 0000000000..f7cf4a69ba --- /dev/null +++ b/ignite/services/network/mocks/monitoringp_client.go @@ -0,0 +1,151 @@ +// Code generated by mockery v2.12.3. DO NOT EDIT. + +package mocks + +import ( + "context" + + "github.com/stretchr/testify/mock" + "github.com/tendermint/spn/x/monitoringp/types" + "google.golang.org/grpc" +) + +// MonitoringpClient is an autogenerated mock type for the QueryClient type +type MonitoringpClient struct { + mock.Mock +} + +// ConnectionChannelID provides a mock function with given fields: ctx, in, opts +func (_m *MonitoringpClient) ConnectionChannelID(ctx context.Context, in *types.QueryGetConnectionChannelIDRequest, opts ...grpc.CallOption) (*types.QueryGetConnectionChannelIDResponse, error) { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, in) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *types.QueryGetConnectionChannelIDResponse + if rf, ok := ret.Get(0).(func(context.Context, *types.QueryGetConnectionChannelIDRequest, ...grpc.CallOption) *types.QueryGetConnectionChannelIDResponse); ok { + r0 = rf(ctx, in, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.QueryGetConnectionChannelIDResponse) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *types.QueryGetConnectionChannelIDRequest, ...grpc.CallOption) error); ok { + r1 = rf(ctx, in, opts...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ConsumerClientID provides a mock function with given fields: ctx, in, opts +func (_m *MonitoringpClient) ConsumerClientID(ctx context.Context, in *types.QueryGetConsumerClientIDRequest, opts ...grpc.CallOption) (*types.QueryGetConsumerClientIDResponse, error) { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, in) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *types.QueryGetConsumerClientIDResponse + if rf, ok := ret.Get(0).(func(context.Context, *types.QueryGetConsumerClientIDRequest, ...grpc.CallOption) *types.QueryGetConsumerClientIDResponse); ok { + r0 = rf(ctx, in, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.QueryGetConsumerClientIDResponse) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *types.QueryGetConsumerClientIDRequest, ...grpc.CallOption) error); ok { + r1 = rf(ctx, in, opts...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// MonitoringInfo provides a mock function with given fields: ctx, in, opts +func (_m *MonitoringpClient) MonitoringInfo(ctx context.Context, in *types.QueryGetMonitoringInfoRequest, opts ...grpc.CallOption) (*types.QueryGetMonitoringInfoResponse, error) { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, in) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *types.QueryGetMonitoringInfoResponse + if rf, ok := ret.Get(0).(func(context.Context, *types.QueryGetMonitoringInfoRequest, ...grpc.CallOption) *types.QueryGetMonitoringInfoResponse); ok { + r0 = rf(ctx, in, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.QueryGetMonitoringInfoResponse) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *types.QueryGetMonitoringInfoRequest, ...grpc.CallOption) error); ok { + r1 = rf(ctx, in, opts...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// Params provides a mock function with given fields: ctx, in, opts +func (_m *MonitoringpClient) Params(ctx context.Context, in *types.QueryParamsRequest, opts ...grpc.CallOption) (*types.QueryParamsResponse, error) { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, in) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *types.QueryParamsResponse + if rf, ok := ret.Get(0).(func(context.Context, *types.QueryParamsRequest, ...grpc.CallOption) *types.QueryParamsResponse); ok { + r0 = rf(ctx, in, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.QueryParamsResponse) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *types.QueryParamsRequest, ...grpc.CallOption) error); ok { + r1 = rf(ctx, in, opts...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +type NewMonitoringpClientT interface { + mock.TestingT + Cleanup(func()) +} + +// NewMonitoringpClient creates a new instance of MonitoringpClient. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +func NewMonitoringpClient(t NewMonitoringpClientT) *MonitoringpClient { + mock := &MonitoringpClient{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/ignite/services/network/mocks/profile_client.go b/ignite/services/network/mocks/profile_client.go index 8463ff6060..32f05d0962 100644 --- a/ignite/services/network/mocks/profile_client.go +++ b/ignite/services/network/mocks/profile_client.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.12.3. DO NOT EDIT. +// Code generated by mockery v2.14.0. DO NOT EDIT. package mocks @@ -197,13 +197,13 @@ func (_m *ProfileClient) ValidatorByOperatorAddress(ctx context.Context, in *typ return r0, r1 } -type NewProfileClientT interface { +type mockConstructorTestingTNewProfileClient interface { mock.TestingT Cleanup(func()) } // NewProfileClient creates a new instance of ProfileClient. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -func NewProfileClient(t NewProfileClientT) *ProfileClient { +func NewProfileClient(t mockConstructorTestingTNewProfileClient) *ProfileClient { mock := &ProfileClient{} mock.Mock.Test(t) diff --git a/ignite/services/network/mocks/reward_client.go b/ignite/services/network/mocks/reward_client.go index f3f673f3d5..4f343046cf 100644 --- a/ignite/services/network/mocks/reward_client.go +++ b/ignite/services/network/mocks/reward_client.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.12.3. DO NOT EDIT. +// Code generated by mockery v2.14.0. DO NOT EDIT. package mocks @@ -107,13 +107,13 @@ func (_m *RewardClient) RewardPoolAll(ctx context.Context, in *types.QueryAllRew return r0, r1 } -type NewRewardClientT interface { +type mockConstructorTestingTNewRewardClient interface { mock.TestingT Cleanup(func()) } // NewRewardClient creates a new instance of RewardClient. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -func NewRewardClient(t NewRewardClientT) *RewardClient { +func NewRewardClient(t mockConstructorTestingTNewRewardClient) *RewardClient { mock := &RewardClient{} mock.Mock.Test(t) diff --git a/ignite/services/network/mocks/staking_client.go b/ignite/services/network/mocks/staking_client.go index a323ab6cc4..296cd5f1a9 100644 --- a/ignite/services/network/mocks/staking_client.go +++ b/ignite/services/network/mocks/staking_client.go @@ -1,14 +1,15 @@ -// Code generated by mockery v2.11.0. DO NOT EDIT. +// Code generated by mockery v2.14.0. DO NOT EDIT. package mocks import ( - "context" - "testing" + context "context" - "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/stretchr/testify/mock" - "google.golang.org/grpc" + grpc "google.golang.org/grpc" + + mock "github.com/stretchr/testify/mock" + + types "github.com/cosmos/cosmos-sdk/x/staking/types" ) // StakingClient is an autogenerated mock type for the StakingClient type @@ -436,9 +437,15 @@ func (_m *StakingClient) Validators(ctx context.Context, in *types.QueryValidato return r0, r1 } -// NewQueryClient creates a new instance of StakingClient. It also registers a cleanup function to assert the mocks expectations. -func NewQueryClient(t testing.TB) *StakingClient { +type mockConstructorTestingTNewStakingClient interface { + mock.TestingT + Cleanup(func()) +} + +// NewStakingClient creates a new instance of StakingClient. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +func NewStakingClient(t mockConstructorTestingTNewStakingClient) *StakingClient { mock := &StakingClient{} + mock.Mock.Test(t) t.Cleanup(func() { mock.AssertExpectations(t) }) diff --git a/ignite/services/network/network.go b/ignite/services/network/network.go index 15dba12d02..59234b5392 100644 --- a/ignite/services/network/network.go +++ b/ignite/services/network/network.go @@ -6,10 +6,12 @@ import ( "github.com/cosmos/cosmos-sdk/client" sdktypes "github.com/cosmos/cosmos-sdk/types" + banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/pkg/errors" campaigntypes "github.com/tendermint/spn/x/campaign/types" launchtypes "github.com/tendermint/spn/x/launch/types" + monitoringctypes "github.com/tendermint/spn/x/monitoringc/types" profiletypes "github.com/tendermint/spn/x/profile/types" rewardtypes "github.com/tendermint/spn/x/reward/types" ctypes "github.com/tendermint/tendermint/rpc/core/types" @@ -17,29 +19,31 @@ import ( "github.com/ignite/cli/ignite/pkg/cosmosaccount" "github.com/ignite/cli/ignite/pkg/cosmosclient" "github.com/ignite/cli/ignite/pkg/events" + "github.com/ignite/cli/ignite/pkg/xtime" ) //go:generate mockery --name CosmosClient --case underscore type CosmosClient interface { - Account(accountName string) (cosmosaccount.Account, error) - Address(accountName string) (sdktypes.AccAddress, error) Context() client.Context - BroadcastTx(accountName string, msgs ...sdktypes.Msg) (cosmosclient.Response, error) - BroadcastTxWithProvision(accountName string, msgs ...sdktypes.Msg) (gas uint64, broadcast func() (cosmosclient.Response, error), err error) + BroadcastTx(account cosmosaccount.Account, msgs ...sdktypes.Msg) (cosmosclient.Response, error) Status(ctx context.Context) (*ctypes.ResultStatus, error) ConsensusInfo(ctx context.Context, height int64) (cosmosclient.ConsensusInfo, error) } // Network is network builder. type Network struct { - ev events.Bus - cosmos CosmosClient - account cosmosaccount.Account - campaignQuery campaigntypes.QueryClient - launchQuery launchtypes.QueryClient - profileQuery profiletypes.QueryClient - rewardQuery rewardtypes.QueryClient - stakingQuery stakingtypes.QueryClient + node Node + ev events.Bus + cosmos CosmosClient + account cosmosaccount.Account + campaignQuery campaigntypes.QueryClient + launchQuery launchtypes.QueryClient + profileQuery profiletypes.QueryClient + rewardQuery rewardtypes.QueryClient + stakingQuery stakingtypes.QueryClient + bankQuery banktypes.QueryClient + monitoringConsumerQuery monitoringctypes.QueryClient + clock xtime.Clock } //go:generate mockery --name Chain --case underscore @@ -87,7 +91,25 @@ func WithRewardQueryClient(client rewardtypes.QueryClient) Option { func WithStakingQueryClient(client stakingtypes.QueryClient) Option { return func(n *Network) { - n.stakingQuery = client + n.node.stakingQuery = client + } +} + +func WithMonitoringConsumerQueryClient(client monitoringctypes.QueryClient) Option { + return func(n *Network) { + n.monitoringConsumerQuery = client + } +} + +func WithBankQueryClient(client banktypes.QueryClient) Option { + return func(n *Network) { + n.bankQuery = client + } +} + +func WithCustomClock(clock xtime.Clock) Option { + return func(n *Network) { + n.clock = clock } } @@ -101,13 +123,17 @@ func CollectEvents(ev events.Bus) Option { // New creates a Builder. func New(cosmos CosmosClient, account cosmosaccount.Account, options ...Option) Network { n := Network{ - cosmos: cosmos, - account: account, - campaignQuery: campaigntypes.NewQueryClient(cosmos.Context()), - launchQuery: launchtypes.NewQueryClient(cosmos.Context()), - profileQuery: profiletypes.NewQueryClient(cosmos.Context()), - rewardQuery: rewardtypes.NewQueryClient(cosmos.Context()), - stakingQuery: stakingtypes.NewQueryClient(cosmos.Context()), + cosmos: cosmos, + account: account, + node: NewNode(cosmos), + campaignQuery: campaigntypes.NewQueryClient(cosmos.Context()), + launchQuery: launchtypes.NewQueryClient(cosmos.Context()), + profileQuery: profiletypes.NewQueryClient(cosmos.Context()), + rewardQuery: rewardtypes.NewQueryClient(cosmos.Context()), + stakingQuery: stakingtypes.NewQueryClient(cosmos.Context()), + bankQuery: banktypes.NewQueryClient(cosmos.Context()), + monitoringConsumerQuery: monitoringctypes.NewQueryClient(cosmos.Context()), + clock: xtime.NewClockSystem(), } for _, opt := range options { opt(&n) @@ -118,10 +144,10 @@ func New(cosmos CosmosClient, account cosmosaccount.Account, options ...Option) func ParseID(id string) (uint64, error) { objID, err := strconv.ParseUint(id, 10, 64) if err != nil { - return 0, errors.Wrap(err, "error parsing launchID") + return 0, errors.Wrap(err, "error parsing ID") } if objID == 0 { - return 0, errors.New("launch ID must be greater than 0") + return 0, errors.New("ID must be greater than 0") } return objID, nil } diff --git a/ignite/services/network/network_test.go b/ignite/services/network/network_test.go index 42d146be29..26f98c7a57 100644 --- a/ignite/services/network/network_test.go +++ b/ignite/services/network/network_test.go @@ -3,13 +3,17 @@ package network import ( "errors" "testing" + "time" "github.com/stretchr/testify/require" "github.com/ignite/cli/ignite/pkg/cosmosaccount" + "github.com/ignite/cli/ignite/pkg/xtime" "github.com/ignite/cli/ignite/services/network/testutil" ) +var sampleTime = time.Unix(1000, 1000) + func newSuite(account cosmosaccount.Account) (testutil.Suite, Network) { suite := testutil.NewSuite() return suite, New( @@ -20,6 +24,9 @@ func newSuite(account cosmosaccount.Account) (testutil.Suite, Network) { WithProfileQueryClient(suite.ProfileQueryMock), WithRewardQueryClient(suite.RewardClient), WithStakingQueryClient(suite.StakingClient), + WithMonitoringConsumerQueryClient(suite.MonitoringConsumerClient), + WithBankQueryClient(suite.BankClient), + WithCustomClock(xtime.NewClockMock(sampleTime)), ) } @@ -38,17 +45,17 @@ func TestParseID(t *testing.T) { { name: "invalid uint", id: "-10", - err: errors.New("error parsing launchID: strconv.ParseUint: parsing \"-10\": invalid syntax"), + err: errors.New("error parsing ID: strconv.ParseUint: parsing \"-10\": invalid syntax"), }, { name: "invalid string", id: "test", - err: errors.New("error parsing launchID: strconv.ParseUint: parsing \"test\": invalid syntax"), + err: errors.New("error parsing ID: strconv.ParseUint: parsing \"test\": invalid syntax"), }, { name: "invalid launch id", id: "0", - err: errors.New("launch ID must be greater than 0"), + err: errors.New("ID must be greater than 0"), }, } for _, tt := range tests { diff --git a/ignite/services/network/networkchain/account.go b/ignite/services/network/networkchain/account.go index d53aa3fc99..c69f2bec99 100644 --- a/ignite/services/network/networkchain/account.go +++ b/ignite/services/network/networkchain/account.go @@ -9,6 +9,7 @@ import ( chaincmdrunner "github.com/ignite/cli/ignite/pkg/chaincmd/runner" "github.com/ignite/cli/ignite/pkg/cosmosutil" "github.com/ignite/cli/ignite/pkg/randstr" + "github.com/ignite/cli/ignite/pkg/xos" "github.com/ignite/cli/ignite/services/chain" ) @@ -48,7 +49,7 @@ func (c Chain) InitAccount(ctx context.Context, v chain.Validator, accountName s // rename the issued gentx into gentx.json gentxPath := filepath.Join(filepath.Dir(issuedGentxPath), cosmosutil.GentxFilename) - return gentxPath, os.Rename(issuedGentxPath, gentxPath) + return gentxPath, xos.Rename(issuedGentxPath, gentxPath) } // ImportAccount imports an account from Starport into the chain. diff --git a/ignite/services/network/networkchain/binarycache.go b/ignite/services/network/networkchain/binarycache.go index fcd7489406..d5d39455d3 100644 --- a/ignite/services/network/networkchain/binarycache.go +++ b/ignite/services/network/networkchain/binarycache.go @@ -51,7 +51,7 @@ func cacheBinaryForLaunchID(launchID uint64, binaryHash, sourceHash string) erro if err != nil { return err } - var cacheList = BinaryCacheList{} + cacheList := BinaryCacheList{} err = confile.New(confile.DefaultYAMLEncodingCreator, cachePath).Load(&cacheList) if err != nil { return err @@ -67,7 +67,7 @@ func checkBinaryCacheForLaunchID(launchID uint64, binaryHash, sourceHash string) if err != nil { return false, err } - var cacheList = BinaryCacheList{} + cacheList := BinaryCacheList{} err = confile.New(confile.DefaultYAMLEncodingCreator, cachePath).Load(&cacheList) if err != nil { return false, err diff --git a/ignite/services/network/networkchain/init.go b/ignite/services/network/networkchain/init.go index e389cca94c..e60f552026 100644 --- a/ignite/services/network/networkchain/init.go +++ b/ignite/services/network/networkchain/init.go @@ -2,6 +2,7 @@ package networkchain import ( "context" + "errors" "fmt" "os" @@ -77,7 +78,7 @@ func (c *Chain) initGenesis(ctx context.Context) error { } // replace the default genesis with the fetched genesis - if err := os.WriteFile(genesisPath, genesis, 0644); err != nil { + if err := os.WriteFile(genesisPath, genesis, 0o644); err != nil { return err } } else { @@ -94,8 +95,8 @@ func (c *Chain) initGenesis(ctx context.Context) error { } - // check the genesis is valid - if err := c.checkGenesis(ctx); err != nil { + // check the initial genesis is valid + if err := c.checkInitialGenesis(ctx); err != nil { return err } @@ -104,13 +105,30 @@ func (c *Chain) initGenesis(ctx context.Context) error { } // checkGenesis checks the stored genesis is valid -func (c *Chain) checkGenesis(ctx context.Context) error { +func (c *Chain) checkInitialGenesis(ctx context.Context) error { // perform static analysis of the chain with the validate-genesis command. chainCmd, err := c.chain.Commands(ctx) if err != nil { return err } + // the chain initial genesis should not contain gentx, gentxs should be added through requests + genesisPath, err := c.chain.GenesisPath() + if err != nil { + return err + } + genesisFile, err := os.ReadFile(genesisPath) + if err != nil { + return err + } + chainGenesis, err := cosmosutil.ParseChainGenesis(genesisFile) + if err != nil { + return err + } + if chainGenesis.GenTxCount() > 0 { + return errors.New("the initial genesis for the chain should not contain gentx") + } + return chainCmd.ValidateGenesis(ctx) // TODO: static analysis of the genesis with validate-genesis doesn't check the full validity of the genesis diff --git a/ignite/services/network/networkchain/networkchain.go b/ignite/services/network/networkchain/networkchain.go index c63ff0a976..e06c284be2 100644 --- a/ignite/services/network/networkchain/networkchain.go +++ b/ignite/services/network/networkchain/networkchain.go @@ -5,7 +5,9 @@ import ( "errors" "os" "os/exec" + "time" + sdk "github.com/cosmos/cosmos-sdk/types" "github.com/go-git/go-git/v5" "github.com/go-git/go-git/v5/plumbing" @@ -33,11 +35,14 @@ type Chain struct { hash string genesisURL string genesisHash string - launchTime int64 + launchTime time.Time + + accountBalance sdk.Coins keyringBackend chaincmd.KeyringBackend - isInitialized bool + isInitialized bool + checkDependencies bool ref plumbing.ReferenceName @@ -94,6 +99,7 @@ func SourceLaunch(launch networktypes.ChainLaunch) SourceOption { c.genesisHash = launch.GenesisHash c.home = ChainHome(launch.ID) c.launchTime = launch.LaunchTime + c.accountBalance = launch.AccountBalance } } @@ -125,6 +131,15 @@ func CollectEvents(ev events.Bus) Option { } } +// CheckDependencies checks that cached Go dependencies of the chain have +// not been modified since they were downloaded. Dependencies are checked +// by running `go mod verify`. +func CheckDependencies() Option { + return func(c *Chain) { + c.checkDependencies = true + } +} + // New initializes a network blockchain from source and options. func New(ctx context.Context, ar cosmosaccount.Registry, source SourceOption, options ...Option) (*Chain, error) { c := &Chain{ @@ -151,6 +166,10 @@ func New(ctx context.Context, ar cosmosaccount.Registry, source SourceOption, op chain.LogLevel(chain.LogSilent), } + if c.checkDependencies { + chainOption = append(chainOption, chain.CheckDependencies()) + } + // use test keyring backend on Gitpod in order to prevent prompting for keyring // password. This happens because Gitpod uses containers. if gitpod.IsOnGitpod() { @@ -226,6 +245,14 @@ func (c Chain) SourceHash() string { return c.hash } +func (c Chain) IsAccountBalanceFixed() bool { + return !c.accountBalance.IsZero() +} + +func (c Chain) AccountBalance() sdk.Coins { + return c.accountBalance +} + func (c Chain) IsHomeDirExist() (ok bool, err error) { home, err := c.chain.Home() if err != nil { @@ -276,7 +303,7 @@ func (c *Chain) Build(ctx context.Context, cacheStorage cache.Storage) (binaryNa c.ev.Send(events.New(events.StatusOngoing, "Building the chain's binary")) // build binary - if binaryName, err = c.chain.Build(ctx, cacheStorage, ""); err != nil { + if binaryName, err = c.chain.Build(ctx, cacheStorage, "", true); err != nil { return "", err } @@ -299,7 +326,6 @@ func (c *Chain) CacheBinary(launchID uint64) error { return err } binaryChecksum, err := checksum.Binary(binaryName) - if err != nil { return err } @@ -320,7 +346,7 @@ func fetchSource( } // ensure the path for chain source exists - if err := os.MkdirAll(path, 0755); err != nil { + if err := os.MkdirAll(path, 0o755); err != nil { return "", "", err } diff --git a/ignite/services/network/networkchain/prepare.go b/ignite/services/network/networkchain/prepare.go index f9898d629c..f505e77603 100644 --- a/ignite/services/network/networkchain/prepare.go +++ b/ignite/services/network/networkchain/prepare.go @@ -3,7 +3,6 @@ package networkchain import ( "context" "fmt" - "io/ioutil" "os" "path/filepath" "strconv" @@ -42,9 +41,9 @@ func (c Chain) Prepare( cacheStorage cache.Storage, gi networktypes.GenesisInformation, rewardsInfo networktypes.Reward, - chainID string, + spnChainID string, lastBlockHeight, - unbondingTime int64, + consumerUnbondingTime int64, ) error { // chain initialization genesisPath, err := c.chain.GenesisPath() @@ -77,9 +76,9 @@ func (c Chain) Prepare( ctx, gi, rewardsInfo, - chainID, + spnChainID, lastBlockHeight, - unbondingTime, + consumerUnbondingTime, ); err != nil { return err } @@ -109,7 +108,7 @@ func (c Chain) buildGenesis( rewardsInfo networktypes.Reward, spnChainID string, lastBlockHeight, - unbondingTime int64, + consumerUnbondingTime int64, ) error { c.ev.Send(events.New(events.StatusOngoing, "Building the genesis")) @@ -134,21 +133,30 @@ func (c Chain) buildGenesis( return errors.Wrap(err, "genesis of the blockchain can't be read") } - // update genesis - if err := cosmosutil.UpdateGenesis( - genesisPath, - // set genesis time and chain id + // set genesis time and chain id + genesisFields := []cosmosutil.GenesisField{ cosmosutil.WithKeyValue(cosmosutil.FieldChainID, c.id), - cosmosutil.WithKeyValueTimestamp(cosmosutil.FieldGenesisTime, c.launchTime), - // set the network consensus parameters - cosmosutil.WithKeyValue(cosmosutil.FieldConsumerChainID, spnChainID), - cosmosutil.WithKeyValueInt(cosmosutil.FieldLastBlockHeight, lastBlockHeight), - cosmosutil.WithKeyValue(cosmosutil.FieldConsensusTimestamp, rewardsInfo.ConsensusState.Timestamp), - cosmosutil.WithKeyValue(cosmosutil.FieldConsensusNextValidatorsHash, rewardsInfo.ConsensusState.NextValidatorsHash), - cosmosutil.WithKeyValue(cosmosutil.FieldConsensusRootHash, rewardsInfo.ConsensusState.Root.Hash), - cosmosutil.WithKeyValueInt(cosmosutil.FieldConsumerUnbondingPeriod, unbondingTime), - cosmosutil.WithKeyValueUint(cosmosutil.FieldConsumerRevisionHeight, rewardsInfo.RevisionHeight), - ); err != nil { + cosmosutil.WithKeyValueTimestamp(cosmosutil.FieldGenesisTime, c.launchTime.Unix()), + } + + // TODO: implement a single option for all reward related fields + // a single query will include all these options on SPN https://github.com/tendermint/spn/issues/815 + // such a refactoring can be worked afte the implementation of the query + if lastBlockHeight > 0 { + genesisFields = append( + genesisFields, + cosmosutil.WithKeyValue(cosmosutil.FieldConsensusTimestamp, rewardsInfo.ConsensusState.Timestamp), + cosmosutil.WithKeyValue(cosmosutil.FieldConsensusNextValidatorsHash, rewardsInfo.ConsensusState.NextValidatorsHash), + cosmosutil.WithKeyValue(cosmosutil.FieldConsensusRootHash, rewardsInfo.ConsensusState.Root.Hash), + cosmosutil.WithKeyValueUint(cosmosutil.FieldConsumerRevisionHeight, rewardsInfo.RevisionHeight), + cosmosutil.WithKeyValue(cosmosutil.FieldConsumerChainID, spnChainID), + cosmosutil.WithKeyValueInt(cosmosutil.FieldLastBlockHeight, lastBlockHeight), + cosmosutil.WithKeyValueInt(cosmosutil.FieldConsumerUnbondingPeriod, consumerUnbondingTime), + ) + } + + // update genesis + if err := cosmosutil.UpdateGenesis(genesisPath, genesisFields...); err != nil { return errors.Wrap(err, "genesis time can't be set") } @@ -178,7 +186,7 @@ func (c Chain) applyGenesisAccounts( } // call the add genesis account CLI command - err = cmd.AddGenesisAccount(ctx, acc.Address, acc.Coins) + err = cmd.AddGenesisAccount(ctx, acc.Address, acc.Coins.String()) if err != nil { return err } @@ -208,8 +216,8 @@ func (c Chain) applyVestingAccounts( err = cmd.AddVestingAccount( ctx, acc.Address, - acc.TotalBalance, - acc.Vesting, + acc.TotalBalance.String(), + acc.Vesting.String(), acc.EndTime, ) if err != nil { @@ -235,14 +243,14 @@ func (c Chain) applyGenesisValidators(ctx context.Context, genesisVals []network if err := os.RemoveAll(gentxDir); err != nil { return err } - if err := os.MkdirAll(gentxDir, 0700); err != nil { + if err := os.MkdirAll(gentxDir, 0o700); err != nil { return err } // write gentxs for i, val := range genesisVals { gentxPath := filepath.Join(gentxDir, fmt.Sprintf("gentx%d.json", i)) - if err = ioutil.WriteFile(gentxPath, val.Gentx, 0666); err != nil { + if err = os.WriteFile(gentxPath, val.Gentx, 0o666); err != nil { return err } } @@ -308,7 +316,7 @@ func (c Chain) updateConfigFromGenesisValidators(genesisVals []networktypes.Gene } // save config.toml file - configTomlFile, err := os.OpenFile(configPath, os.O_RDWR|os.O_TRUNC, 0644) + configTomlFile, err := os.OpenFile(configPath, os.O_RDWR|os.O_TRUNC, 0o644) if err != nil { return err } @@ -332,5 +340,4 @@ func (c Chain) updateConfigFromGenesisValidators(genesisVals []networktypes.Gene } } return nil - } diff --git a/ignite/services/network/networkchain/simulate.go b/ignite/services/network/networkchain/simulate.go index e176a0007b..62304a3d3f 100644 --- a/ignite/services/network/networkchain/simulate.go +++ b/ignite/services/network/networkchain/simulate.go @@ -77,7 +77,7 @@ func (c Chain) simulateChainStart(ctx context.Context) error { } // set the config with random ports to test the start command - addressAPI, err := c.setSimulationConfig() + rpcAddr, err := c.setSimulationConfig() if err != nil { return err } @@ -89,7 +89,7 @@ func (c Chain) simulateChainStart(ctx context.Context) error { // routine to check the app is listening go func() { defer cancel() - exit <- isChainListening(ctx, addressAPI) + exit <- isChainListening(ctx, rpcAddr) }() // routine chain start @@ -139,7 +139,7 @@ func (c Chain) setSimulationConfig() (string, error) { config.Set("api.address", apiAddr) config.Set("grpc.address", genAddr(ports[1])) - file, err := os.OpenFile(appPath, os.O_RDWR|os.O_TRUNC, 0644) + file, err := os.OpenFile(appPath, os.O_RDWR|os.O_TRUNC, 0o644) if err != nil { return "", err } @@ -176,7 +176,7 @@ func (c Chain) setSimulationConfig() (string, error) { config.Set("p2p.laddr", p2pAddr) config.Set("rpc.pprof_laddr", genAddr(ports[4])) - file, err = os.OpenFile(configPath, os.O_RDWR|os.O_TRUNC, 0644) + file, err = os.OpenFile(configPath, os.O_RDWR|os.O_TRUNC, 0o644) if err != nil { return "", err } @@ -184,18 +184,18 @@ func (c Chain) setSimulationConfig() (string, error) { _, err = config.WriteTo(file) - return genAddr(ports[0]), err + return genAddr(ports[2]), err } -// isChainListening checks if the chain is listening for API queries on the specified address -func isChainListening(ctx context.Context, addressAPI string) error { +// isChainListening checks if the chain is listening for RPC queries on the specified address +func isChainListening(ctx context.Context, rpcAddr string) error { checkAlive := func() error { - addr, err := xurl.HTTP(addressAPI) + addr, err := xurl.HTTP(rpcAddr) if err != nil { - return fmt.Errorf("invalid api address format %s: %w", addressAPI, err) + return fmt.Errorf("invalid rpc address format %s: %w", rpcAddr, err) } - ok, err := httpstatuschecker.Check(ctx, fmt.Sprintf("%s/node_info", addr)) + ok, err := httpstatuschecker.Check(ctx, fmt.Sprintf("%s/health", addr)) if err == nil && !ok { err = errors.New("app is not online") } diff --git a/ignite/services/network/networktypes/campaign.go b/ignite/services/network/networktypes/campaign.go index 61ba294241..3bbd15afaf 100644 --- a/ignite/services/network/networktypes/campaign.go +++ b/ignite/services/network/networktypes/campaign.go @@ -44,3 +44,17 @@ func ToMainnetAccount(acc campaigntypes.MainnetAccount) MainnetAccount { Shares: acc.Shares, } } + +// CampaignChains represents the chains of a campaign on SPN +type CampaignChains struct { + CampaignID uint64 `json:"CampaignID"` + Chains []uint64 `json:"Chains"` +} + +// ToCampaignChains converts a campaign chains data from SPN and returns a CampaignChains object +func ToCampaignChains(c campaigntypes.CampaignChains) CampaignChains { + return CampaignChains{ + CampaignID: c.CampaignID, + Chains: c.Chains, + } +} diff --git a/ignite/services/network/networktypes/chainlaunch.go b/ignite/services/network/networktypes/chainlaunch.go index 82deea657c..633344e46c 100644 --- a/ignite/services/network/networktypes/chainlaunch.go +++ b/ignite/services/network/networktypes/chainlaunch.go @@ -1,6 +1,12 @@ package networktypes -import launchtypes "github.com/tendermint/spn/x/launch/types" +import ( + "time" + + sdk "github.com/cosmos/cosmos-sdk/types" + + launchtypes "github.com/tendermint/spn/x/launch/types" +) type ( NetworkType string @@ -14,11 +20,12 @@ type ( SourceHash string `json:"SourceHash"` GenesisURL string `json:"GenesisURL"` GenesisHash string `json:"GenesisHash"` - LaunchTime int64 `json:"LaunchTime"` + LaunchTime time.Time `json:"LaunchTime"` CampaignID uint64 `json:"CampaignID"` LaunchTriggered bool `json:"LaunchTriggered"` Network NetworkType `json:"Network"` Reward string `json:"Reward,omitempty"` + AccountBalance sdk.Coins `json:"AccountBalance"` } ) @@ -33,9 +40,9 @@ func (n NetworkType) String() string { // ToChainLaunch converts a chain launch data from SPN and returns a ChainLaunch object func ToChainLaunch(chain launchtypes.Chain) ChainLaunch { - var launchTime int64 + var launchTime time.Time if chain.LaunchTriggered { - launchTime = chain.LaunchTimestamp + launchTime = chain.LaunchTime } network := NetworkTypeTestnet @@ -53,6 +60,7 @@ func ToChainLaunch(chain launchtypes.Chain) ChainLaunch { CampaignID: chain.CampaignID, LaunchTriggered: chain.LaunchTriggered, Network: network, + AccountBalance: chain.AccountBalance, } // check if custom genesis URL is provided. diff --git a/ignite/services/network/networktypes/chainlaunch_test.go b/ignite/services/network/networktypes/chainlaunch_test.go index 15cb79e8fd..71c657ca79 100644 --- a/ignite/services/network/networktypes/chainlaunch_test.go +++ b/ignite/services/network/networktypes/chainlaunch_test.go @@ -2,6 +2,7 @@ package networktypes_test import ( "testing" + "time" "github.com/stretchr/testify/require" launchtypes "github.com/tendermint/spn/x/launch/types" @@ -46,7 +47,7 @@ func TestToChainLaunch(t *testing.T) { SourceURL: "bar.com", SourceHash: "0xbbb", LaunchTriggered: true, - LaunchTimestamp: 100, + LaunchTime: time.Unix(100, 100).UTC(), InitialGenesis: launchtypes.NewGenesisURL( "genesisfoo.com", "0xccc", @@ -60,7 +61,7 @@ func TestToChainLaunch(t *testing.T) { GenesisURL: "genesisfoo.com", GenesisHash: "0xccc", LaunchTriggered: true, - LaunchTime: 100, + LaunchTime: time.Unix(100, 100).UTC(), CampaignID: 0, Network: "testnet", }, diff --git a/ignite/services/network/networktypes/genesisinformation.go b/ignite/services/network/networktypes/genesisinformation.go index 8cbffdb3e8..a370790159 100644 --- a/ignite/services/network/networktypes/genesisinformation.go +++ b/ignite/services/network/networktypes/genesisinformation.go @@ -21,32 +21,32 @@ type GenesisInformation struct { // GenesisAccount represents an account with initial coin allocation for the chain for the chain genesis type GenesisAccount struct { - Address string - Coins string + Address string `json:"Address,omitempty"` + Coins sdk.Coins `json:"Coins,omitempty"` } // VestingAccount represents a vesting account with initial coin allocation and vesting option for the chain genesis // VestingAccount supports currently only delayed vesting option type VestingAccount struct { - Address string - TotalBalance string - Vesting string - EndTime int64 + Address string `json:"Address,omitempty"` + TotalBalance sdk.Coins `json:"TotalBalance,omitempty"` + Vesting sdk.Coins `json:"Vesting,omitempty"` + EndTime int64 `json:"EndTime,omitempty"` } // GenesisValidator represents a genesis validator associated with a gentx in the chain genesis type GenesisValidator struct { - Address string - Gentx []byte - Peer launchtypes.Peer - SelfDelegation sdk.Coin + Address string `json:"Address,omitempty"` + Gentx []byte `json:"Gentx,omitempty"` + Peer launchtypes.Peer `json:"Peer,omitempty"` + SelfDelegation sdk.Coin `json:"SelfDelegation,omitempty"` } // ToGenesisAccount converts genesis account from SPN func ToGenesisAccount(acc launchtypes.GenesisAccount) GenesisAccount { return GenesisAccount{ Address: acc.Address, - Coins: acc.Coins.String(), + Coins: acc.Coins, } } @@ -59,8 +59,8 @@ func ToVestingAccount(acc launchtypes.VestingAccount) (VestingAccount, error) { return VestingAccount{ Address: acc.Address, - TotalBalance: delayedVesting.TotalBalance.String(), - Vesting: delayedVesting.Vesting.String(), + TotalBalance: delayedVesting.TotalBalance, + Vesting: delayedVesting.Vesting, EndTime: delayedVesting.EndTime, }, nil } @@ -96,6 +96,7 @@ func (gi GenesisInformation) ContainsGenesisAccount(address string) bool { } return false } + func (gi GenesisInformation) ContainsVestingAccount(address string) bool { for _, account := range gi.VestingAccounts { if account.Address == address { @@ -104,6 +105,7 @@ func (gi GenesisInformation) ContainsVestingAccount(address string) bool { } return false } + func (gi GenesisInformation) ContainsGenesisValidator(address string) bool { for _, account := range gi.GenesisValidators { if account.Address == address { diff --git a/ignite/services/network/networktypes/genesisinformation_test.go b/ignite/services/network/networktypes/genesisinformation_test.go index 954faa7c95..e5ba2c391b 100644 --- a/ignite/services/network/networktypes/genesisinformation_test.go +++ b/ignite/services/network/networktypes/genesisinformation_test.go @@ -4,6 +4,7 @@ import ( "testing" "time" + sdkmath "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/stretchr/testify/require" launchtypes "github.com/tendermint/spn/x/launch/types" @@ -11,10 +12,7 @@ import ( "github.com/ignite/cli/ignite/services/network/networktypes" ) -var ( - sampleCoins = sdk.NewCoins(sdk.NewCoin("bar", sdk.NewInt(1000)), sdk.NewCoin("foo", sdk.NewInt(2000))) - sampleCoinsStr = sampleCoins.String() -) +var sampleCoins = sdk.NewCoins(sdk.NewCoin("bar", sdkmath.NewInt(1000)), sdk.NewCoin("foo", sdkmath.NewInt(2000))) func TestToGenesisAccount(t *testing.T) { tests := []struct { @@ -30,7 +28,7 @@ func TestToGenesisAccount(t *testing.T) { }, expected: networktypes.GenesisAccount{ Address: "spn123", - Coins: sampleCoinsStr, + Coins: sampleCoins, }, }, } @@ -60,8 +58,8 @@ func TestToVestingAccount(t *testing.T) { }, expected: networktypes.VestingAccount{ Address: "spn123", - TotalBalance: sampleCoinsStr, - Vesting: sampleCoinsStr, + TotalBalance: sampleCoins, + Vesting: sampleCoins, EndTime: 1000, }, }, @@ -127,14 +125,14 @@ func TestGenesisInformation_ApplyRequest(t *testing.T) { []networktypes.GenesisAccount{ { Address: "spn1g50xher44l9hjuatjdfxgv254jh2wgzfs55yu3", - Coins: "1000foo", + Coins: sdk.NewCoins(sdk.NewCoin("foo", sdkmath.NewInt(1000))), }, }, []networktypes.VestingAccount{ { Address: "spn1gkzf4e0x6wr4djfd8h82v6cy507gy5v4spaus3", - TotalBalance: "1000foo", - Vesting: "500foo", + TotalBalance: sdk.NewCoins(sdk.NewCoin("foo", sdkmath.NewInt(1000))), + Vesting: sdk.NewCoins(sdk.NewCoin("foo", sdkmath.NewInt(500))), EndTime: time.Now().Unix(), }, }, diff --git a/ignite/services/network/networktypes/ibc.go b/ignite/services/network/networktypes/ibc.go deleted file mode 100644 index 379c34a266..0000000000 --- a/ignite/services/network/networktypes/ibc.go +++ /dev/null @@ -1,12 +0,0 @@ -package networktypes - -import ( - spntypes "github.com/tendermint/spn/pkg/types" -) - -// Reward is node reward info. -type Reward struct { - ConsensusState spntypes.ConsensusState - ValidatorSet spntypes.ValidatorSet - RevisionHeight uint64 -} diff --git a/ignite/services/network/networktypes/networktypes.go b/ignite/services/network/networktypes/networktypes.go index 19187885d8..a6f5c71f40 100644 --- a/ignite/services/network/networktypes/networktypes.go +++ b/ignite/services/network/networktypes/networktypes.go @@ -9,4 +9,13 @@ const ( // SPNDenom is the denom used for the spn chain native token SPNDenom = "uspn" + + // SPNVersion is the spn ibc version used for the relayer connection + SPNVersion = "monitoring-1" + + // SPNPortID is the spn ibc port id used for the relayer connection + SPNPortID = "monitoringc" + + // ChainPortID is the chain ibc port id used for the relayer connection + ChainPortID = "monitoringp" ) diff --git a/ignite/services/network/networktypes/profile.go b/ignite/services/network/networktypes/profile.go new file mode 100644 index 0000000000..07c8626181 --- /dev/null +++ b/ignite/services/network/networktypes/profile.go @@ -0,0 +1,117 @@ +package networktypes + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + campaigntypes "github.com/tendermint/spn/x/campaign/types" + profiletypes "github.com/tendermint/spn/x/profile/types" +) + +// Validator represents the Validator profile on SPN +type Validator struct { + Address string `json:"Address"` + OperatorAddresses []string `json:"OperatorAddresses"` + Identity string `json:"Identity"` + Website string `json:"Website"` + Details string `json:"Details"` + Moniker string `json:"Moniker"` + SecurityContact string `json:"SecurityContact"` +} + +func (v Validator) ToProfile( + campaignID uint64, + vouchers sdk.Coins, + shares campaigntypes.Shares, +) Profile { + return Profile{ + CampaignID: campaignID, + Address: v.Address, + Identity: v.Identity, + Website: v.Website, + Details: v.Details, + Moniker: v.Moniker, + SecurityContact: v.SecurityContact, + Vouchers: vouchers, + Shares: shares, + } +} + +// ToValidator converts a Validator data from SPN and returns a Validator object +func ToValidator(val profiletypes.Validator) Validator { + return Validator{ + Address: val.Address, + OperatorAddresses: val.OperatorAddresses, + Identity: val.Description.Identity, + Website: val.Description.Website, + Details: val.Description.Details, + Moniker: val.Description.Moniker, + SecurityContact: val.Description.SecurityContact, + } +} + +// Coordinator represents the Coordinator profile on SPN +type Coordinator struct { + CoordinatorID uint64 `json:"ID"` + Address string `json:"Address"` + Active bool `json:"Active"` + Identity string `json:"Identity"` + Website string `json:"Website"` + Details string `json:"Details"` +} + +func (c Coordinator) ToProfile( + campaignID uint64, + vouchers sdk.Coins, + shares campaigntypes.Shares, +) Profile { + return Profile{ + CampaignID: campaignID, + Address: c.Address, + Identity: c.Identity, + Website: c.Website, + Details: c.Details, + Vouchers: vouchers, + Shares: shares, + } +} + +// ToCoordinator converts a Coordinator data from SPN and returns a Coordinator object +func ToCoordinator(coord profiletypes.Coordinator) Coordinator { + return Coordinator{ + CoordinatorID: coord.CoordinatorID, + Address: coord.Address, + Active: coord.Active, + Identity: coord.Description.Identity, + Website: coord.Description.Website, + Details: coord.Description.Details, + } +} + +type ( + // ChainShare represents the share of a chain on SPN + ChainShare struct { + LaunchID uint64 `json:"LaunchID"` + Shares sdk.Coins `json:"Shares"` + } + + // Profile represents the address profile on SPN + Profile struct { + Address string `json:"Address"` + CampaignID uint64 `json:"CampaignID,omitempty"` + Identity string `json:"Identity,omitempty"` + Website string `json:"Website,omitempty"` + Details string `json:"Details,omitempty"` + Moniker string `json:"Moniker,omitempty"` + SecurityContact string `json:"SecurityContact,omitempty"` + Vouchers sdk.Coins `json:"Vouchers,omitempty"` + Shares campaigntypes.Shares `json:"Shares,omitempty"` + } + + // ProfileAcc represents the address profile method interface + ProfileAcc interface { + ToProfile( + campaignID uint64, + vouchers sdk.Coins, + shares campaigntypes.Shares, + ) Profile + } +) diff --git a/ignite/services/network/networktypes/request.go b/ignite/services/network/networktypes/request.go index 64d57029c2..c5744393b5 100644 --- a/ignite/services/network/networktypes/request.go +++ b/ignite/services/network/networktypes/request.go @@ -24,7 +24,6 @@ type ( // ToRequest converts a request data from SPN and returns a Request object func ToRequest(request launchtypes.Request) Request { - return Request{ LaunchID: request.LaunchID, RequestID: request.RequestID, diff --git a/ignite/services/network/networktypes/request_test.go b/ignite/services/network/networktypes/request_test.go index ce4a6a0d4a..e8cc6b639c 100644 --- a/ignite/services/network/networktypes/request_test.go +++ b/ignite/services/network/networktypes/request_test.go @@ -5,6 +5,7 @@ import ( "fmt" "testing" + sdkmath "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/stretchr/testify/require" launchtypes "github.com/tendermint/spn/x/launch/types" @@ -47,7 +48,7 @@ func TestVerifyAddValidatorRequest(t *testing.T) { Address: "spn1dd246yq6z5vzjz9gh8cff46pll75yyl8c5tt7g", GenTx: gentx, ConsPubKey: ed25519.PubKey(pk), - SelfDelegation: sdk.NewCoin("stake", sdk.NewInt(95000000)), + SelfDelegation: sdk.NewCoin("stake", sdkmath.NewInt(95000000)), Peer: launchtypes.NewPeerConn("nodeid", "127.163.0.1:2446"), }, }, @@ -59,7 +60,7 @@ func TestVerifyAddValidatorRequest(t *testing.T) { Address: "spn1dd246yq6z5vzjz9gh8cff46pll75yyl8c5tt7g", GenTx: gentx, ConsPubKey: ed25519.PubKey(pk), - SelfDelegation: sdk.NewCoin("stake", sdk.NewInt(95000000)), + SelfDelegation: sdk.NewCoin("stake", sdkmath.NewInt(95000000)), Peer: launchtypes.NewPeerConn("nodeid", "122.114.800.11"), }, }, @@ -72,7 +73,7 @@ func TestVerifyAddValidatorRequest(t *testing.T) { Address: "spn1dd246yq6z5vzjz9gh8cff46pll75yyl8c5tt7g", GenTx: []byte(`{}`), ConsPubKey: ed25519.PubKey(pk), - SelfDelegation: sdk.NewCoin("stake", sdk.NewInt(95000000)), + SelfDelegation: sdk.NewCoin("stake", sdkmath.NewInt(95000000)), Peer: launchtypes.NewPeerConn("nodeid", "127.163.0.1:2446"), }, }, @@ -85,7 +86,7 @@ func TestVerifyAddValidatorRequest(t *testing.T) { Address: "spn1dd246yq6z5vzjz9gh8cff46pll75yyl8c5tt7g", GenTx: gentx, ConsPubKey: ed25519.PubKey(pk), - SelfDelegation: sdk.NewCoin("foo", sdk.NewInt(95000000)), + SelfDelegation: sdk.NewCoin("foo", sdkmath.NewInt(95000000)), Peer: launchtypes.NewPeerConn("nodeid", "127.163.0.1:2446"), }, }, @@ -98,7 +99,7 @@ func TestVerifyAddValidatorRequest(t *testing.T) { Address: "spn1dd246yq6z5vzjz9gh8cff46pll75yyl8c5tt7g", GenTx: gentx, ConsPubKey: ed25519.PubKey(pk), - SelfDelegation: sdk.NewCoin("stake", sdk.NewInt(3)), + SelfDelegation: sdk.NewCoin("stake", sdkmath.NewInt(3)), Peer: launchtypes.NewPeerConn("nodeid", "127.163.0.1:2446"), }, }, @@ -111,7 +112,7 @@ func TestVerifyAddValidatorRequest(t *testing.T) { Address: "spn1dd246yq6z5vzjz9gh8cff46pll75yyl8c5tt7g", GenTx: gentx, ConsPubKey: ed25519.PubKey("cosmos1gkheudhhjsvq0s8fxt7p6pwe0k3k30kepcnz9p="), - SelfDelegation: sdk.NewCoin("stake", sdk.NewInt(95000000)), + SelfDelegation: sdk.NewCoin("stake", sdkmath.NewInt(95000000)), Peer: launchtypes.NewPeerConn("nodeid", "127.163.0.1:2446"), }, }, @@ -124,7 +125,7 @@ func TestVerifyAddValidatorRequest(t *testing.T) { Address: "spn1gkheudhhjsvq0s8fxt7p6pwe0k3k30keaytytm", GenTx: gentx, ConsPubKey: ed25519.PubKey(pk), - SelfDelegation: sdk.NewCoin("stake", sdk.NewInt(95000000)), + SelfDelegation: sdk.NewCoin("stake", sdkmath.NewInt(95000000)), Peer: launchtypes.NewPeerConn("nodeid", "127.163.0.1:2446"), }, }, diff --git a/ignite/services/network/networktypes/reward.go b/ignite/services/network/networktypes/reward.go new file mode 100644 index 0000000000..f7b8cfba6c --- /dev/null +++ b/ignite/services/network/networktypes/reward.go @@ -0,0 +1,22 @@ +package networktypes + +import ( + spntypes "github.com/tendermint/spn/pkg/types" +) + +type ( + // Reward is node reward info. + Reward struct { + ConsensusState spntypes.ConsensusState + ValidatorSet spntypes.ValidatorSet + RevisionHeight uint64 + } + + // RewardIBCInfo holds IBC info to relay packets to claim rewards. + RewardIBCInfo struct { + ChainID string + ClientID string + ConnectionID string + ChannelID string + } +) diff --git a/ignite/services/network/node.go b/ignite/services/network/node.go index 61991188b7..bd12497e76 100644 --- a/ignite/services/network/node.go +++ b/ignite/services/network/node.go @@ -5,30 +5,103 @@ import ( "encoding/base64" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" + ibcclienttypes "github.com/cosmos/ibc-go/v5/modules/core/02-client/types" + ibcconntypes "github.com/cosmos/ibc-go/v5/modules/core/03-connection/types" + ibcchanneltypes "github.com/cosmos/ibc-go/v5/modules/core/04-channel/types" spntypes "github.com/tendermint/spn/pkg/types" + monitoringptypes "github.com/tendermint/spn/x/monitoringp/types" + "github.com/ignite/cli/ignite/pkg/cosmoserror" "github.com/ignite/cli/ignite/services/network/networktypes" ) // Node is node builder. type Node struct { - cosmos CosmosClient - stakingQuery stakingtypes.QueryClient + cosmos CosmosClient + stakingQuery stakingtypes.QueryClient + ibcClientQuery ibcclienttypes.QueryClient + ibcConnQuery ibcconntypes.QueryClient + ibcChannelQuery ibcchanneltypes.QueryClient + monitoringProviderQuery monitoringptypes.QueryClient } -func NewNodeClient(cosmos CosmosClient) (Node, error) { +// NewNode creates a new client for node API +func NewNode(cosmos CosmosClient) Node { return Node{ - cosmos: cosmos, - stakingQuery: stakingtypes.NewQueryClient(cosmos.Context()), - }, nil + cosmos: cosmos, + stakingQuery: stakingtypes.NewQueryClient(cosmos.Context()), + ibcClientQuery: ibcclienttypes.NewQueryClient(cosmos.Context()), + ibcConnQuery: ibcconntypes.NewQueryClient(cosmos.Context()), + ibcChannelQuery: ibcchanneltypes.NewQueryClient(cosmos.Context()), + monitoringProviderQuery: monitoringptypes.NewQueryClient(cosmos.Context()), + } +} + +// RewardsInfo Fetches the consensus state with the validator set and the unbounding time +func (n Node) RewardsInfo(ctx context.Context) ( + reward networktypes.Reward, + chainID string, + unbondingTimeSeconds int64, + err error, +) { + status, err := n.cosmos.Status(ctx) + if err != nil { + return networktypes.Reward{}, "", 0, err + } + lastBlockHeight := status.SyncInfo.LatestBlockHeight + + info, err := n.consensus(ctx, n.cosmos, lastBlockHeight) + if err != nil { + return networktypes.Reward{}, "", 0, err + } + + stakingParams, err := n.stakingParams(ctx) + if err != nil { + return networktypes.Reward{}, "", 0, err + } + + return info, + status.NodeInfo.Network, + int64(stakingParams.UnbondingTime.Seconds()), + nil +} + +// RewardIBCInfo returns IBC info to relay packets to claim rewards for the chain. +func (n Node) RewardIBCInfo(ctx context.Context) (networktypes.RewardIBCInfo, error) { + clientID, err := n.consumerClientID(ctx) + if err != nil && err != ErrObjectNotFound { + return networktypes.RewardIBCInfo{}, err + } + + channelID, err := n.connectionChannelID(ctx) + if err != nil && err != ErrObjectNotFound { + return networktypes.RewardIBCInfo{}, err + } + + connections, err := n.clientConnections(ctx, clientID) + if err != nil && err != ErrObjectNotFound { + return networktypes.RewardIBCInfo{}, err + } + + info := networktypes.RewardIBCInfo{ + ClientID: clientID, + ChannelID: channelID, + } + + if len(connections) > 0 { + info.ConnectionID = connections[0] + } + + return info, nil } -// RewardsInfo Fetches the consensus state with the validator set -func RewardsInfo(ctx context.Context, client CosmosClient, height int64) (networktypes.Reward, error) { +// consensus Fetches the consensus state with the validator set +func (n Node) consensus(ctx context.Context, client CosmosClient, height int64) (networktypes.Reward, error) { consensusState, err := client.ConsensusInfo(ctx, height) if err != nil { return networktypes.Reward{}, err } + spnConsensusState := spntypes.NewConsensusState( consensusState.Timestamp, consensusState.NextValidatorsHash, @@ -44,15 +117,46 @@ func RewardsInfo(ctx context.Context, client CosmosClient, height int64) (networ ) } - return networktypes.Reward{ + reward := networktypes.Reward{ ConsensusState: spnConsensusState, ValidatorSet: spntypes.NewValidatorSet(validators...), RevisionHeight: uint64(height), - }, nil + } + + return reward, nil +} + +// connectionChannels fetches the chain connection channels by connection id +func (n Node) connectionChannels(ctx context.Context, connectionID string) (channels []string, err error) { + res, err := n.ibcChannelQuery.ConnectionChannels(ctx, &ibcchanneltypes.QueryConnectionChannelsRequest{ + Connection: connectionID, + }) + if cosmoserror.Unwrap(err) == cosmoserror.ErrNotFound { + return channels, nil + } else if err != nil { + return nil, err + } + for _, channel := range res.Channels { + channels = append(channels, channel.ChannelId) + } + return +} + +// clientConnections fetches the chain client connections by client id +func (n Node) clientConnections(ctx context.Context, clientID string) ([]string, error) { + res, err := n.ibcConnQuery.ClientConnections(ctx, &ibcconntypes.QueryClientConnectionsRequest{ + ClientId: clientID, + }) + if cosmoserror.Unwrap(err) == cosmoserror.ErrNotFound { + return []string{}, nil + } else if err != nil { + return nil, err + } + return res.ConnectionPaths, err } -// StakingParams fetches the staking module params -func (n Node) StakingParams(ctx context.Context) (stakingtypes.Params, error) { +// stakingParams fetches the staking module params +func (n Node) stakingParams(ctx context.Context) (stakingtypes.Params, error) { res, err := n.stakingQuery.Params(ctx, &stakingtypes.QueryParamsRequest{}) if err != nil { return stakingtypes.Params{}, err @@ -60,22 +164,28 @@ func (n Node) StakingParams(ctx context.Context) (stakingtypes.Params, error) { return res.Params, nil } -// RewardsInfo Fetches the consensus state with the validator set and the unbounding time -func (n Node) RewardsInfo(ctx context.Context) (networktypes.Reward, int64, error) { - status, err := n.cosmos.Status(ctx) - if err != nil { - return networktypes.Reward{}, 0, err - } - lastBlockHeight := status.SyncInfo.LatestBlockHeight - - info, err := RewardsInfo(ctx, n.cosmos, lastBlockHeight) - if err != nil { - return networktypes.Reward{}, 0, err +// consumerClientID fetches the consumer client id from the monitoring provider +func (n Node) consumerClientID(ctx context.Context) (string, error) { + res, err := n.monitoringProviderQuery.ConsumerClientID( + ctx, &monitoringptypes.QueryGetConsumerClientIDRequest{}, + ) + if cosmoserror.Unwrap(err) == cosmoserror.ErrNotFound { + return "", ErrObjectNotFound + } else if err != nil { + return "", err } + return res.ConsumerClientID.ClientID, nil +} - stakingParams, err := n.StakingParams(ctx) - if err != nil { - return networktypes.Reward{}, 0, err +// connectionChannelID fetches the consumer connection chnnael id from the monitoring provider +func (n Node) connectionChannelID(ctx context.Context) (string, error) { + res, err := n.monitoringProviderQuery.ConnectionChannelID( + ctx, &monitoringptypes.QueryGetConnectionChannelIDRequest{}, + ) + if cosmoserror.Unwrap(err) == cosmoserror.ErrNotFound { + return "", ErrObjectNotFound + } else if err != nil { + return "", err } - return info, int64(stakingParams.UnbondingTime.Seconds()), nil + return res.ConnectionChannelID.ChannelID, nil } diff --git a/ignite/services/network/profile.go b/ignite/services/network/profile.go new file mode 100644 index 0000000000..d4c4705724 --- /dev/null +++ b/ignite/services/network/profile.go @@ -0,0 +1,135 @@ +package network + +import ( + "context" + "errors" + + sdk "github.com/cosmos/cosmos-sdk/types" + banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" + campaigntypes "github.com/tendermint/spn/x/campaign/types" + profiletypes "github.com/tendermint/spn/x/profile/types" + + "github.com/ignite/cli/ignite/pkg/cosmoserror" + "github.com/ignite/cli/ignite/pkg/events" + "github.com/ignite/cli/ignite/services/network/networktypes" +) + +// CoordinatorIDByAddress returns the CoordinatorByAddress from SPN +func (n Network) CoordinatorIDByAddress(ctx context.Context, address string) (uint64, error) { + n.ev.Send(events.New(events.StatusOngoing, "Fetching coordinator by address")) + resCoordByAddr, err := n.profileQuery. + CoordinatorByAddress(ctx, + &profiletypes.QueryGetCoordinatorByAddressRequest{ + Address: address, + }, + ) + + if cosmoserror.Unwrap(err) == cosmoserror.ErrNotFound { + return 0, ErrObjectNotFound + } else if err != nil { + return 0, err + } + return resCoordByAddr.CoordinatorByAddress.CoordinatorID, nil +} + +// Coordinator returns the Coordinator by address from SPN +func (n Network) Coordinator(ctx context.Context, address string) (networktypes.Coordinator, error) { + n.ev.Send(events.New(events.StatusOngoing, "Fetching coordinator details")) + coordinatorID, err := n.CoordinatorIDByAddress(ctx, address) + if err != nil { + return networktypes.Coordinator{}, err + } + resCoord, err := n.profileQuery. + Coordinator(ctx, + &profiletypes.QueryGetCoordinatorRequest{ + CoordinatorID: coordinatorID, + }, + ) + if cosmoserror.Unwrap(err) == cosmoserror.ErrNotFound { + return networktypes.Coordinator{}, ErrObjectNotFound + } else if err != nil { + return networktypes.Coordinator{}, err + } + return networktypes.ToCoordinator(resCoord.Coordinator), nil +} + +// Validator returns the Validator by address from SPN +func (n Network) Validator(ctx context.Context, address string) (networktypes.Validator, error) { + n.ev.Send(events.New(events.StatusOngoing, "Fetching validator details")) + res, err := n.profileQuery. + Validator(ctx, + &profiletypes.QueryGetValidatorRequest{ + Address: address, + }, + ) + if cosmoserror.Unwrap(err) == cosmoserror.ErrNotFound { + return networktypes.Validator{}, ErrObjectNotFound + } else if err != nil { + return networktypes.Validator{}, err + } + return networktypes.ToValidator(res.Validator), nil +} + +// Balances returns the all balances by address from SPN +func (n Network) Balances(ctx context.Context, address string) (sdk.Coins, error) { + n.ev.Send(events.New(events.StatusOngoing, "Fetching address balances")) + res, err := banktypes.NewQueryClient(n.cosmos.Context()).AllBalances(ctx, + &banktypes.QueryAllBalancesRequest{ + Address: address, + }, + ) + if cosmoserror.Unwrap(err) == cosmoserror.ErrNotFound { + return sdk.Coins{}, ErrObjectNotFound + } else if err != nil { + return sdk.Coins{}, err + } + return res.Balances, nil +} + +// Profile returns the address profile info +func (n Network) Profile(ctx context.Context, campaignID uint64) (networktypes.Profile, error) { + address, err := n.account.Address(networktypes.SPN) + if err != nil { + return networktypes.Profile{}, err + } + + // fetch vouchers held by the account + coins, err := n.Balances(ctx, address) + if err != nil { + return networktypes.Profile{}, err + } + vouchers := sdk.NewCoins() + for _, coin := range coins { + // parse the coin to filter all non-voucher coins from the balance + _, err := campaigntypes.VoucherCampaign(coin.Denom) + if err == nil { + vouchers = append(vouchers, coin) + } + } + vouchers = vouchers.Sort() + + var shares campaigntypes.Shares + + // if a campaign ID is specified, fetches the shares of the campaign + if campaignID > 0 { + acc, err := n.MainnetAccount(ctx, campaignID, address) + if err != nil && err != ErrObjectNotFound { + return networktypes.Profile{}, err + } + shares = acc.Shares + } + + var p networktypes.ProfileAcc + p, err = n.Validator(ctx, address) + if errors.Is(err, ErrObjectNotFound) { + p, err = n.Coordinator(ctx, address) + if errors.Is(err, ErrObjectNotFound) { + p = networktypes.Coordinator{Address: address} + } else if err != nil { + return networktypes.Profile{}, err + } + } else if err != nil { + return networktypes.Profile{}, err + } + return p.ToProfile(campaignID, vouchers, shares), nil +} diff --git a/ignite/services/network/publish.go b/ignite/services/network/publish.go index 1105076261..84902a46aa 100644 --- a/ignite/services/network/publish.go +++ b/ignite/services/network/publish.go @@ -9,7 +9,6 @@ import ( launchtypes "github.com/tendermint/spn/x/launch/types" profiletypes "github.com/tendermint/spn/x/profile/types" - "github.com/ignite/cli/ignite/pkg/cosmoserror" "github.com/ignite/cli/ignite/pkg/cosmosutil" "github.com/ignite/cli/ignite/pkg/events" "github.com/ignite/cli/ignite/services/network/networktypes" @@ -25,6 +24,7 @@ type publishOptions struct { totalSupply sdk.Coins sharePercentages SharePercents mainnet bool + accountBalance sdk.Coins } // PublishOption configures chain creation. @@ -79,6 +79,13 @@ func WithPercentageShares(sharePercentages []SharePercent) PublishOption { } } +// WithAccountBalance set a balance used for all genesis account of the chain +func WithAccountBalance(accountBalance sdk.Coins) PublishOption { + return func(c *publishOptions) { + c.accountBalance = accountBalance + } +} + // Mainnet initialize a published chain into the mainnet func Mainnet() PublishOption { return func(o *publishOptions) { @@ -124,29 +131,31 @@ func (n Network) Publish(ctx context.Context, c Chain, options ...PublishOption) } } - coordinatorAddress := n.account.Address(networktypes.SPN) + coordinatorAddress, err := n.account.Address(networktypes.SPN) + if err != nil { + return 0, 0, err + } campaignID = o.campaignID n.ev.Send(events.New(events.StatusOngoing, "Publishing the network")) - _, err = n.profileQuery. - CoordinatorByAddress(ctx, &profiletypes.QueryGetCoordinatorByAddressRequest{ - Address: coordinatorAddress, - }) - if cosmoserror.Unwrap(err) == cosmoserror.ErrNotFound { + // a coordinator profile is necessary to publish a chain + // if the user doesn't have an associated coordinator profile, we create one + if _, err := n.CoordinatorIDByAddress(ctx, coordinatorAddress); err == ErrObjectNotFound { msgCreateCoordinator := profiletypes.NewMsgCreateCoordinator( coordinatorAddress, "", "", "", ) - if _, err := n.cosmos.BroadcastTx(n.account.Name, msgCreateCoordinator); err != nil { + if _, err := n.cosmos.BroadcastTx(n.account, msgCreateCoordinator); err != nil { return 0, 0, err } } else if err != nil { return 0, 0, err } + // check if a campaign associated to the chain is provided if campaignID != 0 { _, err = n.campaignQuery. Campaign(ctx, &campaigntypes.QueryGetCampaignRequest{ @@ -155,7 +164,9 @@ func (n Network) Publish(ctx context.Context, c Chain, options ...PublishOption) if err != nil { return 0, 0, err } - } else { + } else if o.mainnet { + // a mainnet is always associated to a campaign + // if no campaign is provided, we create one, and we directly initialize the mainnet campaignID, err = n.CreateCampaign(c.Name(), o.metadata, o.totalSupply) if err != nil { return 0, 0, err @@ -163,7 +174,7 @@ func (n Network) Publish(ctx context.Context, c Chain, options ...PublishOption) } // mint vouchers - if !o.sharePercentages.Empty() { + if campaignID != 0 && !o.sharePercentages.Empty() { totalSharesResp, err := n.campaignQuery.TotalShares(ctx, &campaigntypes.QueryTotalSharesRequest{}) if err != nil { return 0, 0, err @@ -180,12 +191,18 @@ func (n Network) Publish(ctx context.Context, c Chain, options ...PublishOption) // TODO consider moving to UpdateCampaign, but not sure, may not be relevant. // It is better to send multiple message in a single tx too. // consider ways to refactor to accomplish a better API and efficiency. + + addr, err := n.account.Address(networktypes.SPN) + if err != nil { + return 0, 0, err + } + msgMintVouchers := campaigntypes.NewMsgMintVouchers( - n.account.Address(networktypes.SPN), + addr, campaignID, campaigntypes.NewSharesFromCoins(sdk.NewCoins(coins...)), ) - _, err = n.cosmos.BroadcastTx(n.account.Name, msgMintVouchers) + _, err = n.cosmos.BroadcastTx(n.account, msgMintVouchers) if err != nil { return 0, 0, err } @@ -198,18 +215,24 @@ func (n Network) Publish(ctx context.Context, c Chain, options ...PublishOption) return 0, 0, err } } else { + addr, err := n.account.Address(networktypes.SPN) + if err != nil { + return 0, 0, err + } + msgCreateChain := launchtypes.NewMsgCreateChain( - n.account.Address(networktypes.SPN), + addr, chainID, c.SourceURL(), c.SourceHash(), o.genesisURL, genesisHash, - true, + campaignID != 0, campaignID, + o.accountBalance, nil, ) - res, err := n.cosmos.BroadcastTx(n.account.Name, msgCreateChain) + res, err := n.cosmos.BroadcastTx(n.account, msgCreateChain) if err != nil { return 0, 0, err } @@ -227,7 +250,12 @@ func (n Network) Publish(ctx context.Context, c Chain, options ...PublishOption) } func (n Network) SendAccountRequestForCoordinator(launchID uint64, amount sdk.Coins) error { - return n.sendAccountRequest(launchID, n.account.Address(networktypes.SPN), amount) + addr, err := n.account.Address(networktypes.SPN) + if err != nil { + return err + } + + return n.sendAccountRequest(launchID, addr, amount) } // SendAccountRequest creates an add AddAccount request message. @@ -236,20 +264,28 @@ func (n Network) sendAccountRequest( address string, amount sdk.Coins, ) error { - msg := launchtypes.NewMsgRequestAddAccount( - n.account.Address(networktypes.SPN), + addr, err := n.account.Address(networktypes.SPN) + if err != nil { + return err + } + + msg := launchtypes.NewMsgSendRequest( + addr, launchID, - address, - amount, + launchtypes.NewGenesisAccount( + launchID, + address, + amount, + ), ) n.ev.Send(events.New(events.StatusOngoing, "Broadcasting account transactions")) - res, err := n.cosmos.BroadcastTx(n.account.Name, msg) + res, err := n.cosmos.BroadcastTx(n.account, msg) if err != nil { return err } - var requestRes launchtypes.MsgRequestAddAccountResponse + var requestRes launchtypes.MsgSendRequestResponse if err := res.Decode(&requestRes); err != nil { return err } diff --git a/ignite/services/network/publish_test.go b/ignite/services/network/publish_test.go index bf506c4f04..883572edee 100644 --- a/ignite/services/network/publish_test.go +++ b/ignite/services/network/publish_test.go @@ -35,112 +35,164 @@ func startInvalidJSONServer() *httptest.Server { } func TestPublish(t *testing.T) { - t.Run("publish chain", func(t *testing.T) { + t.Run("publish chain without campaign", func(t *testing.T) { var ( account = testutil.NewTestAccount(t, testutil.TestAccountName) suite, network = newSuite(account) ) + addr, err := account.Address(networktypes.SPN) + require.NoError(t, err) + suite.ProfileQueryMock. On( "CoordinatorByAddress", context.Background(), &profiletypes.QueryGetCoordinatorByAddressRequest{ - Address: account.Address(networktypes.SPN), + Address: addr, }, ). - Return(nil, nil). + Return(&profiletypes.QueryGetCoordinatorByAddressResponse{ + CoordinatorByAddress: profiletypes.CoordinatorByAddress{ + Address: addr, + CoordinatorID: 1, + }, + }, nil). Once() suite.CosmosClientMock. On( "BroadcastTx", - account.Name, + account, &launchtypes.MsgCreateChain{ - Coordinator: account.Address(networktypes.SPN), + Coordinator: addr, GenesisChainID: testutil.ChainID, SourceURL: testutil.ChainSourceURL, SourceHash: testutil.ChainSourceHash, GenesisURL: "", GenesisHash: "", - HasCampaign: true, - CampaignID: testutil.CampaignID, + HasCampaign: false, + CampaignID: 0, }, ). Return(testutil.NewResponse(&launchtypes.MsgCreateChainResponse{ LaunchID: testutil.LaunchID, }), nil). Once() + suite.ChainMock.On("SourceHash").Return(testutil.ChainSourceHash).Once() + suite.ChainMock.On("SourceURL").Return(testutil.ChainSourceURL).Once() + suite.ChainMock.On("ChainID").Return(testutil.ChainID, nil).Once() + suite.ChainMock.On("CacheBinary", testutil.LaunchID).Return(nil).Once() + + launchID, campaignID, publishError := network.Publish(context.Background(), suite.ChainMock) + require.NoError(t, publishError) + require.Equal(t, testutil.LaunchID, launchID) + require.Equal(t, uint64(0), campaignID) + suite.AssertAllMocks(t) + }) + + t.Run("publish chain with custom account balance", func(t *testing.T) { + var ( + account = testutil.NewTestAccount(t, testutil.TestAccountName) + suite, network = newSuite(account) + ) + + accountBalance, err := sdk.ParseCoinsNormalized("1000foo,500bar") + require.NoError(t, err) + + addr, err := account.Address(networktypes.SPN) + require.NoError(t, err) + + suite.ProfileQueryMock. + On( + "CoordinatorByAddress", + context.Background(), + &profiletypes.QueryGetCoordinatorByAddressRequest{ + Address: addr, + }, + ). + Return(&profiletypes.QueryGetCoordinatorByAddressResponse{ + CoordinatorByAddress: profiletypes.CoordinatorByAddress{ + Address: addr, + CoordinatorID: 1, + }, + }, nil). + Once() suite.CosmosClientMock. On( "BroadcastTx", - account.Name, - &campaigntypes.MsgCreateCampaign{ - Coordinator: account.Address(networktypes.SPN), - CampaignName: testutil.ChainName, - Metadata: []byte{}, + account, + &launchtypes.MsgCreateChain{ + Coordinator: addr, + GenesisChainID: testutil.ChainID, + SourceURL: testutil.ChainSourceURL, + SourceHash: testutil.ChainSourceHash, + GenesisURL: "", + GenesisHash: "", + HasCampaign: false, + CampaignID: 0, + AccountBalance: accountBalance, }, ). - Return(testutil.NewResponse(&campaigntypes.MsgCreateCampaignResponse{ - CampaignID: testutil.CampaignID, + Return(testutil.NewResponse(&launchtypes.MsgCreateChainResponse{ + LaunchID: testutil.LaunchID, }), nil). Once() suite.ChainMock.On("SourceHash").Return(testutil.ChainSourceHash).Once() suite.ChainMock.On("SourceURL").Return(testutil.ChainSourceURL).Once() - suite.ChainMock.On("Name").Return(testutil.ChainName).Once() suite.ChainMock.On("ChainID").Return(testutil.ChainID, nil).Once() suite.ChainMock.On("CacheBinary", testutil.LaunchID).Return(nil).Once() - launchID, campaignID, publishError := network.Publish(context.Background(), suite.ChainMock) + launchID, campaignID, publishError := network.Publish( + context.Background(), + suite.ChainMock, + WithAccountBalance(accountBalance), + ) require.NoError(t, publishError) require.Equal(t, testutil.LaunchID, launchID) - require.Equal(t, testutil.CampaignID, campaignID) + require.Equal(t, uint64(0), campaignID) suite.AssertAllMocks(t) }) - t.Run("publish chain with shares", func(t *testing.T) { + t.Run("publish chain with pre created campaign", func(t *testing.T) { var ( account = testutil.NewTestAccount(t, testutil.TestAccountName) suite, network = newSuite(account) ) + addr, err := account.Address(networktypes.SPN) + require.NoError(t, err) + suite.ProfileQueryMock. On( "CoordinatorByAddress", context.Background(), &profiletypes.QueryGetCoordinatorByAddressRequest{ - Address: account.Address(networktypes.SPN), + Address: addr, }, ). - Return(nil, nil). + Return(&profiletypes.QueryGetCoordinatorByAddressResponse{ + CoordinatorByAddress: profiletypes.CoordinatorByAddress{ + Address: addr, + CoordinatorID: 1, + }, + }, nil). Once() suite.CampaignQueryMock. On( - "TotalShares", + "Campaign", context.Background(), - &campaigntypes.QueryTotalSharesRequest{}, - ). - Return(&campaigntypes.QueryTotalSharesResponse{ - TotalShares: 100000, - }, nil). - Once() - suite.CosmosClientMock. - On( - "BroadcastTx", - account.Name, - campaigntypes.NewMsgMintVouchers( - account.Address(networktypes.SPN), - testutil.CampaignID, - campaigntypes.NewSharesFromCoins(sdk.NewCoins(sdk.NewInt64Coin("foo", 2000), sdk.NewInt64Coin("staking", 50000))), - ), + &campaigntypes.QueryGetCampaignRequest{ + CampaignID: testutil.CampaignID, + }, ). - Return(testutil.NewResponse(&campaigntypes.MsgMintVouchersResponse{}), nil). + Return(nil, nil). Once() suite.CosmosClientMock. On( "BroadcastTx", - account.Name, + account, &launchtypes.MsgCreateChain{ - Coordinator: account.Address(networktypes.SPN), + Coordinator: addr, GenesisChainID: testutil.ChainID, SourceURL: testutil.ChainSourceURL, SourceHash: testutil.ChainSourceHash, @@ -154,53 +206,41 @@ func TestPublish(t *testing.T) { LaunchID: testutil.LaunchID, }), nil). Once() - suite.CosmosClientMock. - On( - "BroadcastTx", - account.Name, - &campaigntypes.MsgCreateCampaign{ - Coordinator: account.Address(networktypes.SPN), - CampaignName: testutil.ChainName, - Metadata: []byte{}, - }, - ). - Return(testutil.NewResponse(&campaigntypes.MsgCreateCampaignResponse{ - CampaignID: testutil.CampaignID, - }), nil). - Once() suite.ChainMock.On("SourceHash").Return(testutil.ChainSourceHash).Once() suite.ChainMock.On("SourceURL").Return(testutil.ChainSourceURL).Once() - suite.ChainMock.On("Name").Return(testutil.ChainName).Once() suite.ChainMock.On("ChainID").Return(testutil.ChainID, nil).Once() suite.ChainMock.On("CacheBinary", testutil.LaunchID).Return(nil).Once() - launchID, campaignID, publishError := network.Publish(context.Background(), suite.ChainMock, - WithPercentageShares([]SharePercent{ - SampleSharePercent(t, "foo", 2, 100), - SampleSharePercent(t, "staking", 50, 100), - }), - ) + launchID, campaignID, publishError := network.Publish(context.Background(), suite.ChainMock, WithCampaign(testutil.CampaignID)) require.NoError(t, publishError) require.Equal(t, testutil.LaunchID, launchID) require.Equal(t, testutil.CampaignID, campaignID) suite.AssertAllMocks(t) }) - t.Run("publish chain with pre created campaign", func(t *testing.T) { + t.Run("publish chain with a pre created campaign with shares", func(t *testing.T) { var ( account = testutil.NewTestAccount(t, testutil.TestAccountName) suite, network = newSuite(account) ) + addr, err := account.Address(networktypes.SPN) + require.NoError(t, err) + suite.ProfileQueryMock. On( "CoordinatorByAddress", context.Background(), &profiletypes.QueryGetCoordinatorByAddressRequest{ - Address: account.Address(networktypes.SPN), + Address: addr, }, ). - Return(nil, nil). + Return(&profiletypes.QueryGetCoordinatorByAddressResponse{ + CoordinatorByAddress: profiletypes.CoordinatorByAddress{ + Address: addr, + CoordinatorID: 1, + }, + }, nil). Once() suite.CampaignQueryMock. On( @@ -212,12 +252,34 @@ func TestPublish(t *testing.T) { ). Return(nil, nil). Once() + suite.CampaignQueryMock. + On( + "TotalShares", + context.Background(), + &campaigntypes.QueryTotalSharesRequest{}, + ). + Return(&campaigntypes.QueryTotalSharesResponse{ + TotalShares: 100000, + }, nil). + Once() suite.CosmosClientMock. On( "BroadcastTx", - account.Name, + account, + campaigntypes.NewMsgMintVouchers( + addr, + testutil.CampaignID, + campaigntypes.NewSharesFromCoins(sdk.NewCoins(sdk.NewInt64Coin("foo", 2000), sdk.NewInt64Coin("staking", 50000))), + ), + ). + Return(testutil.NewResponse(&campaigntypes.MsgMintVouchersResponse{}), nil). + Once() + suite.CosmosClientMock. + On( + "BroadcastTx", + account, &launchtypes.MsgCreateChain{ - Coordinator: account.Address(networktypes.SPN), + Coordinator: addr, GenesisChainID: testutil.ChainID, SourceURL: testutil.ChainSourceURL, SourceHash: testutil.ChainSourceHash, @@ -236,7 +298,12 @@ func TestPublish(t *testing.T) { suite.ChainMock.On("ChainID").Return(testutil.ChainID, nil).Once() suite.ChainMock.On("CacheBinary", testutil.LaunchID).Return(nil).Once() - launchID, campaignID, publishError := network.Publish(context.Background(), suite.ChainMock, WithCampaign(testutil.CampaignID)) + launchID, campaignID, publishError := network.Publish(context.Background(), suite.ChainMock, WithCampaign(testutil.CampaignID), + WithPercentageShares([]SharePercent{ + SampleSharePercent(t, "foo", 2, 100), + SampleSharePercent(t, "staking", 50, 100), + }), + ) require.NoError(t, publishError) require.Equal(t, testutil.LaunchID, launchID) require.Equal(t, testutil.CampaignID, campaignID) @@ -247,64 +314,57 @@ func TestPublish(t *testing.T) { var ( account = testutil.NewTestAccount(t, testutil.TestAccountName) customGenesisChainID = "test-custom-1" - customGenesisHash = "72a80a32e33513cd74423354502cef035e96b0bff59c754646b453b201d12d07" + customGenesisHash = "61da86775013bd18d6a019b533eedf1304b778fe8005090a0a0223720adfd8eb" gts = startGenesisTestServer(cosmosutil.ChainGenesis{ChainID: customGenesisChainID}) suite, network = newSuite(account) ) defer gts.Close() + addr, err := account.Address(networktypes.SPN) + require.NoError(t, err) + suite.ProfileQueryMock. On( "CoordinatorByAddress", context.Background(), &profiletypes.QueryGetCoordinatorByAddressRequest{ - Address: account.Address(networktypes.SPN), + Address: addr, }, ). - Return(nil, nil). + Return(&profiletypes.QueryGetCoordinatorByAddressResponse{ + CoordinatorByAddress: profiletypes.CoordinatorByAddress{ + Address: addr, + CoordinatorID: 1, + }, + }, nil). Once() suite.CosmosClientMock. On( "BroadcastTx", - account.Name, + account, &launchtypes.MsgCreateChain{ - Coordinator: account.Address(networktypes.SPN), + Coordinator: addr, GenesisChainID: customGenesisChainID, SourceURL: testutil.ChainSourceURL, SourceHash: testutil.ChainSourceHash, GenesisURL: gts.URL, GenesisHash: customGenesisHash, - HasCampaign: true, - CampaignID: testutil.CampaignID, + HasCampaign: false, + CampaignID: 0, }, ). Return(testutil.NewResponse(&launchtypes.MsgCreateChainResponse{ LaunchID: testutil.LaunchID, }), nil). Once() - suite.CosmosClientMock. - On( - "BroadcastTx", - account.Name, - &campaigntypes.MsgCreateCampaign{ - Coordinator: account.Address(networktypes.SPN), - CampaignName: testutil.ChainName, - Metadata: []byte{}, - }, - ). - Return(testutil.NewResponse(&campaigntypes.MsgCreateCampaignResponse{ - CampaignID: testutil.CampaignID, - }), nil). - Once() suite.ChainMock.On("SourceHash").Return(testutil.ChainSourceHash).Once() suite.ChainMock.On("SourceURL").Return(testutil.ChainSourceURL).Once() - suite.ChainMock.On("Name").Return(testutil.ChainName).Once() suite.ChainMock.On("CacheBinary", testutil.LaunchID).Return(nil).Once() launchID, campaignID, publishError := network.Publish(context.Background(), suite.ChainMock, WithCustomGenesis(gts.URL)) require.NoError(t, publishError) require.Equal(t, testutil.LaunchID, launchID) - require.Equal(t, testutil.CampaignID, campaignID) + require.Equal(t, uint64(0), campaignID) suite.AssertAllMocks(t) }) @@ -314,58 +374,51 @@ func TestPublish(t *testing.T) { suite, network = newSuite(account) ) + addr, err := account.Address(networktypes.SPN) + require.NoError(t, err) + suite.ProfileQueryMock. On( "CoordinatorByAddress", context.Background(), &profiletypes.QueryGetCoordinatorByAddressRequest{ - Address: account.Address(networktypes.SPN), + Address: addr, }, ). - Return(nil, nil). + Return(&profiletypes.QueryGetCoordinatorByAddressResponse{ + CoordinatorByAddress: profiletypes.CoordinatorByAddress{ + Address: addr, + CoordinatorID: 1, + }, + }, nil). Once() suite.CosmosClientMock. On( "BroadcastTx", - account.Name, + account, &launchtypes.MsgCreateChain{ - Coordinator: account.Address(networktypes.SPN), + Coordinator: addr, GenesisChainID: testutil.ChainID, SourceURL: testutil.ChainSourceURL, SourceHash: testutil.ChainSourceHash, GenesisURL: "", GenesisHash: "", - HasCampaign: true, - CampaignID: testutil.CampaignID, + HasCampaign: false, + CampaignID: 0, }, ). Return(testutil.NewResponse(&launchtypes.MsgCreateChainResponse{ LaunchID: testutil.LaunchID, }), nil). Once() - suite.CosmosClientMock. - On( - "BroadcastTx", - account.Name, - &campaigntypes.MsgCreateCampaign{ - Coordinator: account.Address(networktypes.SPN), - CampaignName: testutil.ChainName, - Metadata: []byte{}, - }, - ). - Return(testutil.NewResponse(&campaigntypes.MsgCreateCampaignResponse{ - CampaignID: testutil.CampaignID, - }), nil). - Once() suite.ChainMock.On("SourceHash").Return(testutil.ChainSourceHash).Once() suite.ChainMock.On("SourceURL").Return(testutil.ChainSourceURL).Once() - suite.ChainMock.On("Name").Return(testutil.ChainName).Once() suite.ChainMock.On("CacheBinary", testutil.LaunchID).Return(nil).Once() launchID, campaignID, publishError := network.Publish(context.Background(), suite.ChainMock, WithChainID(testutil.ChainID)) require.NoError(t, publishError) require.Equal(t, testutil.LaunchID, launchID) - require.Equal(t, testutil.CampaignID, campaignID) + require.Equal(t, uint64(0), campaignID) suite.AssertAllMocks(t) }) @@ -378,22 +431,30 @@ func TestPublish(t *testing.T) { ) defer gts.Close() + addr, err := account.Address(networktypes.SPN) + require.NoError(t, err) + suite.ProfileQueryMock. On( "CoordinatorByAddress", context.Background(), &profiletypes.QueryGetCoordinatorByAddressRequest{ - Address: account.Address(networktypes.SPN), + Address: addr, }, ). - Return(nil, nil). + Return(&profiletypes.QueryGetCoordinatorByAddressResponse{ + CoordinatorByAddress: profiletypes.CoordinatorByAddress{ + Address: addr, + CoordinatorID: 1, + }, + }, nil). Once() suite.CosmosClientMock. On( "BroadcastTx", - account.Name, + account, &campaigntypes.MsgCreateCampaign{ - Coordinator: account.Address(networktypes.SPN), + Coordinator: addr, CampaignName: testutil.ChainName, Metadata: []byte{}, }, @@ -405,9 +466,9 @@ func TestPublish(t *testing.T) { suite.CosmosClientMock. On( "BroadcastTx", - account.Name, + account, &campaigntypes.MsgInitializeMainnet{ - Coordinator: account.Address(networktypes.SPN), + Coordinator: addr, CampaignID: testutil.CampaignID, SourceURL: testutil.ChainSourceURL, SourceHash: testutil.ChainSourceHash, @@ -438,22 +499,30 @@ func TestPublish(t *testing.T) { expectedError = errors.New("failed to initialize mainnet") ) + addr, err := account.Address(networktypes.SPN) + require.NoError(t, err) + suite.ProfileQueryMock. On( "CoordinatorByAddress", context.Background(), &profiletypes.QueryGetCoordinatorByAddressRequest{ - Address: account.Address(networktypes.SPN), + Address: addr, }, ). - Return(nil, nil). + Return(&profiletypes.QueryGetCoordinatorByAddressResponse{ + CoordinatorByAddress: profiletypes.CoordinatorByAddress{ + Address: addr, + CoordinatorID: 1, + }, + }, nil). Once() suite.CosmosClientMock. On( "BroadcastTx", - account.Name, + account, &campaigntypes.MsgCreateCampaign{ - Coordinator: account.Address(networktypes.SPN), + Coordinator: addr, CampaignName: testutil.ChainName, Metadata: []byte{}, }, @@ -465,9 +534,9 @@ func TestPublish(t *testing.T) { suite.CosmosClientMock. On( "BroadcastTx", - account.Name, + account, &campaigntypes.MsgInitializeMainnet{ - Coordinator: account.Address(networktypes.SPN), + Coordinator: addr, CampaignID: testutil.CampaignID, SourceURL: testutil.ChainSourceURL, SourceHash: testutil.ChainSourceHash, @@ -510,25 +579,28 @@ func TestPublish(t *testing.T) { suite, network = newSuite(account) ) + addr, err := account.Address(networktypes.SPN) + require.NoError(t, err) + suite.ProfileQueryMock. On("CoordinatorByAddress", mock.Anything, &profiletypes.QueryGetCoordinatorByAddressRequest{ - Address: account.Address(networktypes.SPN), + Address: addr, }). Return(nil, cosmoserror.ErrNotFound). Once() suite.CosmosClientMock. On( "BroadcastTx", - account.Name, + account, &launchtypes.MsgCreateChain{ - Coordinator: account.Address(networktypes.SPN), + Coordinator: addr, GenesisChainID: testutil.ChainID, SourceURL: testutil.ChainSourceURL, SourceHash: testutil.ChainSourceHash, GenesisURL: "", GenesisHash: "", - HasCampaign: true, - CampaignID: testutil.CampaignID, + HasCampaign: false, + CampaignID: 0, }, ). Return(testutil.NewResponse(&launchtypes.MsgCreateChainResponse{ @@ -538,37 +610,22 @@ func TestPublish(t *testing.T) { suite.CosmosClientMock. On( "BroadcastTx", - account.Name, - &campaigntypes.MsgCreateCampaign{ - Coordinator: account.Address(networktypes.SPN), - CampaignName: testutil.ChainName, - Metadata: []byte{}, - }, - ). - Return(testutil.NewResponse(&campaigntypes.MsgCreateCampaignResponse{ - CampaignID: testutil.CampaignID, - }), nil). - Once() - suite.CosmosClientMock. - On( - "BroadcastTx", - account.Name, + account, &profiletypes.MsgCreateCoordinator{ - Address: account.Address(networktypes.SPN), + Address: addr, }, ). Return(testutil.NewResponse(&profiletypes.MsgCreateCoordinatorResponse{}), nil). Once() suite.ChainMock.On("SourceHash").Return(testutil.ChainSourceHash).Once() suite.ChainMock.On("SourceURL").Return(testutil.ChainSourceURL).Once() - suite.ChainMock.On("Name").Return(testutil.ChainName).Once() suite.ChainMock.On("ChainID").Return(testutil.ChainID, nil).Once() suite.ChainMock.On("CacheBinary", testutil.LaunchID).Return(nil).Once() launchID, campaignID, publishError := network.Publish(context.Background(), suite.ChainMock) require.NoError(t, publishError) require.Equal(t, testutil.LaunchID, launchID) - require.Equal(t, testutil.CampaignID, campaignID) + require.Equal(t, uint64(0), campaignID) suite.AssertAllMocks(t) }) @@ -579,9 +636,12 @@ func TestPublish(t *testing.T) { expectedError = errors.New("failed to fetch coordinator") ) + addr, err := account.Address(networktypes.SPN) + require.NoError(t, err) + suite.ProfileQueryMock. On("CoordinatorByAddress", mock.Anything, &profiletypes.QueryGetCoordinatorByAddressRequest{ - Address: account.Address(networktypes.SPN), + Address: addr, }). Return(nil, expectedError). Once() @@ -617,15 +677,23 @@ func TestPublish(t *testing.T) { suite, network = newSuite(account) ) + addr, err := account.Address(networktypes.SPN) + require.NoError(t, err) + suite.ProfileQueryMock. On( "CoordinatorByAddress", context.Background(), &profiletypes.QueryGetCoordinatorByAddressRequest{ - Address: account.Address(networktypes.SPN), + Address: addr, }, ). - Return(nil, nil). + Return(&profiletypes.QueryGetCoordinatorByAddressResponse{ + CoordinatorByAddress: profiletypes.CoordinatorByAddress{ + Address: addr, + CoordinatorID: 1, + }, + }, nil). Once() suite.CampaignQueryMock. On("Campaign", mock.Anything, &campaigntypes.QueryGetCampaignRequest{ @@ -641,46 +709,6 @@ func TestPublish(t *testing.T) { suite.AssertAllMocks(t) }) - t.Run("failed to publish chain, failed to create campaign", func(t *testing.T) { - var ( - account = testutil.NewTestAccount(t, testutil.TestAccountName) - suite, network = newSuite(account) - expectedError = errors.New("failed to create") - ) - - suite.ProfileQueryMock. - On( - "CoordinatorByAddress", - context.Background(), - &profiletypes.QueryGetCoordinatorByAddressRequest{ - Address: account.Address(networktypes.SPN), - }, - ). - Return(nil, nil). - Once() - suite.CosmosClientMock. - On( - "BroadcastTx", - account.Name, - &campaigntypes.MsgCreateCampaign{ - Coordinator: account.Address(networktypes.SPN), - CampaignName: testutil.ChainName, - Metadata: []byte{}, - }, - ). - Return(testutil.NewResponse(&campaigntypes.MsgCreateCampaignResponse{ - CampaignID: testutil.CampaignID, - }), expectedError). - Once() - suite.ChainMock.On("Name").Return(testutil.ChainName).Once() - suite.ChainMock.On("ChainID").Return(testutil.ChainID, nil).Once() - - _, _, publishError := network.Publish(context.Background(), suite.ChainMock) - require.Error(t, publishError) - require.Equal(t, expectedError, publishError) - suite.AssertAllMocks(t) - }) - t.Run("failed to publish chain, failed to create chain", func(t *testing.T) { var ( account = testutil.NewTestAccount(t, testutil.TestAccountName) @@ -688,52 +716,45 @@ func TestPublish(t *testing.T) { expectedError = errors.New("failed to create chain") ) + addr, err := account.Address(networktypes.SPN) + require.NoError(t, err) + suite.ProfileQueryMock. On( "CoordinatorByAddress", context.Background(), &profiletypes.QueryGetCoordinatorByAddressRequest{ - Address: account.Address(networktypes.SPN), + Address: addr, }, ). - Return(nil, nil). + Return(&profiletypes.QueryGetCoordinatorByAddressResponse{ + CoordinatorByAddress: profiletypes.CoordinatorByAddress{ + Address: addr, + CoordinatorID: 1, + }, + }, nil). Once() suite.CosmosClientMock. On( "BroadcastTx", - account.Name, + account, &launchtypes.MsgCreateChain{ - Coordinator: account.Address(networktypes.SPN), + Coordinator: addr, GenesisChainID: testutil.ChainID, SourceURL: testutil.ChainSourceURL, SourceHash: testutil.ChainSourceHash, GenesisURL: "", GenesisHash: "", - HasCampaign: true, - CampaignID: testutil.CampaignID, + HasCampaign: false, + CampaignID: 0, }, ). Return(testutil.NewResponse(&launchtypes.MsgCreateChainResponse{ LaunchID: testutil.LaunchID, }), expectedError). Once() - suite.CosmosClientMock. - On( - "BroadcastTx", - account.Name, - &campaigntypes.MsgCreateCampaign{ - Coordinator: account.Address(networktypes.SPN), - CampaignName: testutil.ChainName, - Metadata: []byte{}, - }, - ). - Return(testutil.NewResponse(&campaigntypes.MsgCreateCampaignResponse{ - CampaignID: testutil.CampaignID, - }), nil). - Once() suite.ChainMock.On("SourceHash").Return(testutil.ChainSourceHash).Once() suite.ChainMock.On("SourceURL").Return(testutil.ChainSourceURL).Once() - suite.ChainMock.On("Name").Return(testutil.ChainName).Once() suite.ChainMock.On("ChainID").Return(testutil.ChainID, nil).Once() _, _, publishError := network.Publish(context.Background(), suite.ChainMock) @@ -749,52 +770,45 @@ func TestPublish(t *testing.T) { expectedError = errors.New("failed to cache binary") ) + addr, err := account.Address(networktypes.SPN) + require.NoError(t, err) + suite.ProfileQueryMock. On( "CoordinatorByAddress", context.Background(), &profiletypes.QueryGetCoordinatorByAddressRequest{ - Address: account.Address(networktypes.SPN), + Address: addr, }, ). - Return(nil, nil). + Return(&profiletypes.QueryGetCoordinatorByAddressResponse{ + CoordinatorByAddress: profiletypes.CoordinatorByAddress{ + Address: addr, + CoordinatorID: 1, + }, + }, nil). Once() suite.CosmosClientMock. On( "BroadcastTx", - account.Name, + account, &launchtypes.MsgCreateChain{ - Coordinator: account.Address(networktypes.SPN), + Coordinator: addr, GenesisChainID: testutil.ChainID, SourceURL: testutil.ChainSourceURL, SourceHash: testutil.ChainSourceHash, GenesisURL: "", GenesisHash: "", - HasCampaign: true, - CampaignID: testutil.CampaignID, + HasCampaign: false, + CampaignID: 0, }, ). Return(testutil.NewResponse(&launchtypes.MsgCreateChainResponse{ LaunchID: testutil.LaunchID, }), nil). Once() - suite.CosmosClientMock. - On( - "BroadcastTx", - account.Name, - &campaigntypes.MsgCreateCampaign{ - Coordinator: account.Address(networktypes.SPN), - CampaignName: testutil.ChainName, - Metadata: []byte{}, - }, - ). - Return(testutil.NewResponse(&campaigntypes.MsgCreateCampaignResponse{ - CampaignID: testutil.CampaignID, - }), nil). - Once() suite.ChainMock.On("SourceHash").Return(testutil.ChainSourceHash).Once() suite.ChainMock.On("SourceURL").Return(testutil.ChainSourceURL).Once() - suite.ChainMock.On("Name").Return(testutil.ChainName).Once() suite.ChainMock.On("ChainID").Return(testutil.ChainID, nil).Once() suite.ChainMock. On("CacheBinary", testutil.LaunchID). diff --git a/ignite/services/network/queries.go b/ignite/services/network/queries.go index d29d76f752..f1ad33f20b 100644 --- a/ignite/services/network/queries.go +++ b/ignite/services/network/queries.go @@ -2,10 +2,10 @@ package network import ( "context" + "fmt" "sort" "sync" - stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/pkg/errors" campaigntypes "github.com/tendermint/spn/x/campaign/types" launchtypes "github.com/tendermint/spn/x/launch/types" @@ -17,10 +17,8 @@ import ( "github.com/ignite/cli/ignite/services/network/networktypes" ) -var ( - // ErrObjectNotFound is returned when the query returns a not found error. - ErrObjectNotFound = errors.New("query object not found") -) +// ErrObjectNotFound is returned when the query returns a not found error. +var ErrObjectNotFound = errors.New("query object not found") // ChainLaunch fetches the chain launch from Network by launch id. func (n Network) ChainLaunch(ctx context.Context, id uint64) (networktypes.ChainLaunch, error) { @@ -165,6 +163,31 @@ func (n Network) GenesisValidators(ctx context.Context, launchID uint64) (genVal return genVals, nil } +// MainnetAccount returns the campaign mainnet account for a launch from SPN +func (n Network) MainnetAccount( + ctx context.Context, + campaignID uint64, + address string, +) (acc networktypes.MainnetAccount, err error) { + n.ev.Send(events.New(events.StatusOngoing, + fmt.Sprintf("Fetching campaign %d mainnet account %s", campaignID, address)), + ) + res, err := n.campaignQuery. + MainnetAccount(ctx, + &campaigntypes.QueryGetMainnetAccountRequest{ + CampaignID: campaignID, + Address: address, + }, + ) + if cosmoserror.Unwrap(err) == cosmoserror.ErrNotFound { + return networktypes.MainnetAccount{}, ErrObjectNotFound + } else if err != nil { + return acc, err + } + + return networktypes.ToMainnetAccount(res.MainnetAccount), nil +} + // MainnetAccounts returns the list of campaign mainnet accounts for a launch from SPN func (n Network) MainnetAccounts(ctx context.Context, campaignID uint64) (genAccs []networktypes.MainnetAccount, err error) { n.ev.Send(events.New(events.StatusOngoing, "Fetching campaign mainnet accounts")) @@ -185,6 +208,48 @@ func (n Network) MainnetAccounts(ctx context.Context, campaignID uint64) (genAcc return genAccs, nil } +func (n Network) GenesisAccount(ctx context.Context, launchID uint64, address string) (networktypes.GenesisAccount, error) { + n.ev.Send(events.New(events.StatusOngoing, "Fetching genesis accounts")) + res, err := n.launchQuery.GenesisAccount(ctx, &launchtypes.QueryGetGenesisAccountRequest{ + LaunchID: launchID, + Address: address, + }) + if cosmoserror.Unwrap(err) == cosmoserror.ErrNotFound { + return networktypes.GenesisAccount{}, ErrObjectNotFound + } else if err != nil { + return networktypes.GenesisAccount{}, err + } + return networktypes.ToGenesisAccount(res.GenesisAccount), nil +} + +func (n Network) VestingAccount(ctx context.Context, launchID uint64, address string) (networktypes.VestingAccount, error) { + n.ev.Send(events.New(events.StatusOngoing, "Fetching vesting accounts")) + res, err := n.launchQuery.VestingAccount(ctx, &launchtypes.QueryGetVestingAccountRequest{ + LaunchID: launchID, + Address: address, + }) + if cosmoserror.Unwrap(err) == cosmoserror.ErrNotFound { + return networktypes.VestingAccount{}, ErrObjectNotFound + } else if err != nil { + return networktypes.VestingAccount{}, err + } + return networktypes.ToVestingAccount(res.VestingAccount) +} + +func (n Network) GenesisValidator(ctx context.Context, launchID uint64, address string) (networktypes.GenesisValidator, error) { + n.ev.Send(events.New(events.StatusOngoing, "Fetching genesis validator")) + res, err := n.launchQuery.GenesisValidator(ctx, &launchtypes.QueryGetGenesisValidatorRequest{ + LaunchID: launchID, + Address: address, + }) + if cosmoserror.Unwrap(err) == cosmoserror.ErrNotFound { + return networktypes.GenesisValidator{}, ErrObjectNotFound + } else if err != nil { + return networktypes.GenesisValidator{}, err + } + return networktypes.ToGenesisValidator(res.GenesisValidator), nil +} + // ChainReward fetches the chain reward from SPN by launch id func (n Network) ChainReward(ctx context.Context, launchID uint64) (rewardtypes.RewardPool, error) { res, err := n.rewardQuery. @@ -202,49 +267,6 @@ func (n Network) ChainReward(ctx context.Context, launchID uint64) (rewardtypes. return res.RewardPool, nil } -// stakingParams fetches the staking module params -func (n Network) stakingParams(ctx context.Context) (stakingtypes.Params, error) { - res, err := n.stakingQuery.Params(ctx, &stakingtypes.QueryParamsRequest{}) - if err != nil { - return stakingtypes.Params{}, err - } - return res.Params, nil -} - -// RewardsInfo Fetches the consensus state with the validator set, -// the unbounding time, and the last block height from chain rewards. -func (n Network) RewardsInfo( - ctx context.Context, - launchID uint64, - height int64, -) ( - rewardsInfo networktypes.Reward, - lastRewardHeight int64, - unboundingTime int64, - err error, -) { - rewardsInfo, err = RewardsInfo(ctx, n.cosmos, height) - if err != nil { - return rewardsInfo, 0, 0, err - } - - stakingParams, err := n.stakingParams(ctx) - if err != nil { - return rewardsInfo, 0, 0, err - } - unboundingTime = int64(stakingParams.UnbondingTime.Seconds()) - - chainReward, err := n.ChainReward(ctx, launchID) - if err == ErrObjectNotFound { - return rewardsInfo, 1, unboundingTime, nil - } else if err != nil { - return rewardsInfo, 0, 0, err - } - lastRewardHeight = chainReward.LastRewardHeight - - return -} - // ChainID fetches the network chain id func (n Network) ChainID(ctx context.Context) (string, error) { status, err := n.cosmos.Status(ctx) diff --git a/ignite/services/network/request.go b/ignite/services/network/request.go index 3e746afb80..3ceae00f2e 100644 --- a/ignite/services/network/request.go +++ b/ignite/services/network/request.go @@ -76,17 +76,22 @@ func (n Network) RequestFromIDs(ctx context.Context, launchID uint64, requestIDs func (n Network) SubmitRequest(launchID uint64, reviewal ...Reviewal) error { n.ev.Send(events.New(events.StatusOngoing, "Submitting requests...")) + addr, err := n.account.Address(networktypes.SPN) + if err != nil { + return err + } + messages := make([]sdk.Msg, len(reviewal)) for i, reviewal := range reviewal { messages[i] = launchtypes.NewMsgSettleRequest( - n.account.Address(networktypes.SPN), + addr, launchID, reviewal.RequestID, reviewal.IsApproved, ) } - res, err := n.cosmos.BroadcastTx(n.account.Name, messages...) + res, err := n.cosmos.BroadcastTx(n.account, messages...) if err != nil { return err } diff --git a/ignite/services/network/reward.go b/ignite/services/network/reward.go index ae39174682..7a126abc4b 100644 --- a/ignite/services/network/reward.go +++ b/ignite/services/network/reward.go @@ -1,6 +1,8 @@ package network import ( + "context" + "errors" "fmt" sdk "github.com/cosmos/cosmos-sdk/types" @@ -22,13 +24,18 @@ func (n Network) SetReward(launchID uint64, lastRewardHeight int64, coins sdk.Co ), )) + addr, err := n.account.Address(networktypes.SPN) + if err != nil { + return err + } + msg := rewardtypes.NewMsgSetRewards( - n.account.Address(networktypes.SPN), + addr, launchID, lastRewardHeight, coins, ) - res, err := n.cosmos.BroadcastTx(n.account.Name, msg) + res, err := n.cosmos.BroadcastTx(n.account, msg) if err != nil { return err } @@ -67,3 +74,37 @@ func (n Network) SetReward(launchID uint64, lastRewardHeight int64, coins sdk.Co } return nil } + +// RewardsInfo Fetches the consensus state with the validator set, +// the unbounding time, and the last block height from chain rewards. +func (n Network) RewardsInfo( + ctx context.Context, + launchID uint64, + height int64, +) ( + rewardsInfo networktypes.Reward, + lastRewardHeight int64, + unboundingTime int64, + err error, +) { + rewardsInfo, err = n.node.consensus(ctx, n.cosmos, height) + if err != nil { + return rewardsInfo, 0, 0, err + } + + stakingParams, err := n.node.stakingParams(ctx) + if err != nil { + return rewardsInfo, 0, 0, err + } + unboundingTime = int64(stakingParams.UnbondingTime.Seconds()) + + chainReward, err := n.ChainReward(ctx, launchID) + if errors.Is(err, ErrObjectNotFound) { + return rewardsInfo, 1, unboundingTime, nil + } else if err != nil { + return rewardsInfo, 0, 0, err + } + lastRewardHeight = chainReward.LastRewardHeight + + return +} diff --git a/ignite/services/network/reward_test.go b/ignite/services/network/reward_test.go index d770a75b3b..9da42b2bc6 100644 --- a/ignite/services/network/reward_test.go +++ b/ignite/services/network/reward_test.go @@ -4,9 +4,9 @@ import ( "errors" "testing" - "github.com/stretchr/testify/require" - + sdkmath "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/stretchr/testify/require" rewardtypes "github.com/tendermint/spn/x/reward/types" "github.com/ignite/cli/ignite/services/network/networktypes" @@ -18,16 +18,19 @@ func TestSetReward(t *testing.T) { var ( account = testutil.NewTestAccount(t, testutil.TestAccountName) suite, network = newSuite(account) - coins = sdk.NewCoins(sdk.NewCoin(TestDenom, sdk.NewInt(TestAmountInt))) + coins = sdk.NewCoins(sdk.NewCoin(TestDenom, sdkmath.NewInt(TestAmountInt))) lastRewarHeight = int64(10) ) + addr, err := account.Address(networktypes.SPN) + require.NoError(t, err) + suite.CosmosClientMock. On( "BroadcastTx", - account.Name, + account, &rewardtypes.MsgSetRewards{ - Provider: account.Address(networktypes.SPN), + Provider: addr, LaunchID: testutil.LaunchID, Coins: coins, LastRewardHeight: lastRewarHeight, @@ -49,16 +52,20 @@ func TestSetReward(t *testing.T) { var ( account = testutil.NewTestAccount(t, testutil.TestAccountName) suite, network = newSuite(account) - coins = sdk.NewCoins(sdk.NewCoin(TestDenom, sdk.NewInt(TestAmountInt))) + coins = sdk.NewCoins(sdk.NewCoin(TestDenom, sdkmath.NewInt(TestAmountInt))) lastRewarHeight = int64(10) expectedErr = errors.New("failed to set reward") ) + + addr, err := account.Address(networktypes.SPN) + require.NoError(t, err) + suite.CosmosClientMock. On( "BroadcastTx", - account.Name, + account, &rewardtypes.MsgSetRewards{ - Provider: account.Address(networktypes.SPN), + Provider: addr, LaunchID: testutil.LaunchID, Coins: coins, LastRewardHeight: lastRewarHeight, diff --git a/ignite/services/network/share_percent.go b/ignite/services/network/share_percent.go index 4e01c8a962..809252b7ab 100644 --- a/ignite/services/network/share_percent.go +++ b/ignite/services/network/share_percent.go @@ -102,7 +102,7 @@ func ParseSharePercents(percents string) (SharePercents, error) { } func uintPow(x, y uint64) uint64 { - var result = x + result := x for i := 1; uint64(i) < y; i++ { result *= x } diff --git a/ignite/services/network/share_percent_test.go b/ignite/services/network/share_percent_test.go index 26bb2bcdcc..616baec65d 100644 --- a/ignite/services/network/share_percent_test.go +++ b/ignite/services/network/share_percent_test.go @@ -4,10 +4,10 @@ import ( "errors" "testing" - "github.com/ignite/cli/ignite/services/network" - sdk "github.com/cosmos/cosmos-sdk/types" "github.com/stretchr/testify/require" + + "github.com/ignite/cli/ignite/services/network" ) func TestParseSharePercentages(t *testing.T) { diff --git a/ignite/services/network/testutil/genesis.go b/ignite/services/network/testutil/genesis.go index db88820b75..0f973a88da 100644 --- a/ignite/services/network/testutil/genesis.go +++ b/ignite/services/network/testutil/genesis.go @@ -53,7 +53,7 @@ func (g *Genesis) SaveTo(t *testing.T, dir string) string { encoded, err := json.Marshal(g) assert.NoError(t, err) savePath := filepath.Join(dir, "genesis.json") - err = os.WriteFile(savePath, encoded, 0666) + err = os.WriteFile(savePath, encoded, 0o666) assert.NoError(t, err) return savePath } diff --git a/ignite/services/network/testutil/gentx.go b/ignite/services/network/testutil/gentx.go index 7b5b139bcd..b0d1a7c561 100644 --- a/ignite/services/network/testutil/gentx.go +++ b/ignite/services/network/testutil/gentx.go @@ -55,7 +55,7 @@ func (g *Gentx) SaveTo(t *testing.T, dir string) string { encoded, err := json.Marshal(g) assert.NoError(t, err) savePath := filepath.Join(dir, "gentx0.json") - err = os.WriteFile(savePath, encoded, 0666) + err = os.WriteFile(savePath, encoded, 0o666) assert.NoError(t, err) return savePath } diff --git a/ignite/services/network/testutil/mocks.go b/ignite/services/network/testutil/mocks.go index 54fd02f8cc..3ffc90bf25 100644 --- a/ignite/services/network/testutil/mocks.go +++ b/ignite/services/network/testutil/mocks.go @@ -2,6 +2,8 @@ package testutil import ( "github.com/cosmos/cosmos-sdk/crypto/keyring" + banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" + stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" campaigntypes "github.com/tendermint/spn/x/campaign/types" launchtypes "github.com/tendermint/spn/x/launch/types" profiletypes "github.com/tendermint/spn/x/profile/types" @@ -28,7 +30,17 @@ type RewardClient interface { rewardtypes.QueryClient } +//go:generate mockery --name BankClient --case underscore --output ../mocks +type BankClient interface { + banktypes.QueryClient +} + +//go:generate mockery --name StakingClient --case underscore --output ../mocks +type StakingClient interface { + stakingtypes.QueryClient +} + //go:generate mockery --name AccountInfo --case underscore --output ../mocks type AccountInfo interface { - keyring.Info + keyring.Record } diff --git a/ignite/services/network/testutil/response.go b/ignite/services/network/testutil/response.go index 0bfd92f0a7..962e5001f2 100644 --- a/ignite/services/network/testutil/response.go +++ b/ignite/services/network/testutil/response.go @@ -2,12 +2,10 @@ package testutil import ( "encoding/hex" - "strings" "github.com/cosmos/cosmos-sdk/codec" codectypes "github.com/cosmos/cosmos-sdk/codec/types" sdk "github.com/cosmos/cosmos-sdk/types" - prototypes "github.com/gogo/protobuf/types" "google.golang.org/protobuf/runtime/protoiface" "github.com/ignite/cli/ignite/pkg/cosmosclient" @@ -17,14 +15,10 @@ import ( // for using as a return result for a cosmosclient mock func NewResponse(data protoiface.MessageV1) cosmosclient.Response { marshaler := codec.NewProtoCodec(codectypes.NewInterfaceRegistry()) - anyEncoded, _ := prototypes.MarshalAny(data) - txData := &sdk.TxMsgData{Data: []*sdk.MsgData{ - { - Data: anyEncoded.Value, - //TODO: Find a better way - MsgType: strings.TrimSuffix(anyEncoded.TypeUrl, "Response"), - }, - }} + anyEncoded, _ := codectypes.NewAnyWithValue(data) + + txData := &sdk.TxMsgData{MsgResponses: []*codectypes.Any{anyEncoded}} + encodedTxData, _ := marshaler.Marshal(txData) resp := cosmosclient.Response{ Codec: marshaler, diff --git a/ignite/services/network/testutil/suite.go b/ignite/services/network/testutil/suite.go index a63629b82a..9919bb07e8 100644 --- a/ignite/services/network/testutil/suite.go +++ b/ignite/services/network/testutil/suite.go @@ -10,13 +10,15 @@ import ( // Suite is a mocks container, used to write less code for tests setup type Suite struct { - ChainMock *mocks.Chain - CosmosClientMock *mocks.CosmosClient - LaunchQueryMock *mocks.LaunchClient - CampaignQueryMock *mocks.CampaignClient - ProfileQueryMock *mocks.ProfileClient - RewardClient *mocks.RewardClient - StakingClient *mocks.StakingClient + ChainMock *mocks.Chain + CosmosClientMock *mocks.CosmosClient + LaunchQueryMock *mocks.LaunchClient + CampaignQueryMock *mocks.CampaignClient + ProfileQueryMock *mocks.ProfileClient + RewardClient *mocks.RewardClient + StakingClient *mocks.StakingClient + BankClient *mocks.BankClient + MonitoringConsumerClient *mocks.MonitoringcClient } // AssertAllMocks asserts all suite mocks expectations @@ -28,6 +30,8 @@ func (s *Suite) AssertAllMocks(t *testing.T) { s.CampaignQueryMock.AssertExpectations(t) s.RewardClient.AssertExpectations(t) s.StakingClient.AssertExpectations(t) + s.MonitoringConsumerClient.AssertExpectations(t) + s.BankClient.AssertExpectations(t) } // NewSuite creates new suite with mocks @@ -35,12 +39,14 @@ func NewSuite() Suite { cosmos := new(mocks.CosmosClient) cosmos.On("Context").Return(client.Context{}) return Suite{ - ChainMock: new(mocks.Chain), - CosmosClientMock: cosmos, - LaunchQueryMock: new(mocks.LaunchClient), - CampaignQueryMock: new(mocks.CampaignClient), - ProfileQueryMock: new(mocks.ProfileClient), - RewardClient: new(mocks.RewardClient), - StakingClient: new(mocks.StakingClient), + ChainMock: new(mocks.Chain), + CosmosClientMock: cosmos, + LaunchQueryMock: new(mocks.LaunchClient), + CampaignQueryMock: new(mocks.CampaignClient), + ProfileQueryMock: new(mocks.ProfileClient), + RewardClient: new(mocks.RewardClient), + StakingClient: new(mocks.StakingClient), + BankClient: new(mocks.BankClient), + MonitoringConsumerClient: new(mocks.MonitoringcClient), } } diff --git a/ignite/services/scaffolder/component.go b/ignite/services/scaffolder/component.go index 14bee0b5bb..5f44b9a88e 100644 --- a/ignite/services/scaffolder/component.go +++ b/ignite/services/scaffolder/component.go @@ -120,7 +120,6 @@ func checkGoReservedWord(name string) error { // checkComponentCreated checks if the component has been already created with Starport in the project func checkComponentCreated(appPath, moduleName string, compName multiformatname.Name, noMessage bool) (err error) { - // associate the type to check with the component that scaffold this type typesToCheck := map[string]string{ compName.UpperCamel: componentType, diff --git a/ignite/services/scaffolder/init.go b/ignite/services/scaffolder/init.go index c34a38d385..b9fe640ae5 100644 --- a/ignite/services/scaffolder/init.go +++ b/ignite/services/scaffolder/init.go @@ -10,8 +10,8 @@ import ( "github.com/go-git/go-git/v5" "github.com/go-git/go-git/v5/plumbing/object" "github.com/gobuffalo/genny" + vue "github.com/ignite/web" "github.com/tendermint/flutter/v2" - "github.com/tendermint/vue" "github.com/ignite/cli/ignite/pkg/cache" "github.com/ignite/cli/ignite/pkg/gomodulepath" diff --git a/ignite/services/scaffolder/scaffolder.go b/ignite/services/scaffolder/scaffolder.go index 2c5def8284..5eb0e052b0 100644 --- a/ignite/services/scaffolder/scaffolder.go +++ b/ignite/services/scaffolder/scaffolder.go @@ -98,6 +98,21 @@ func protoc(cacheStorage cache.Storage, projectPath, gomodPath string) error { cosmosgen.IncludeDirs(conf.Build.Proto.ThirdPartyPaths), } + // generate Typescript Client code as well if it is enabled. + if conf.Client.Typescript.Path != "" { + tsClientRootPath := filepath.Join(projectPath, conf.Client.Typescript.Path) + if err := os.MkdirAll(tsClientRootPath, 0o766); err != nil { + return err + } + + options = append(options, + cosmosgen.WithTSClientGeneration( + cosmosgen.TypescriptModulePath(tsClientRootPath), + tsClientRootPath, + ), + ) + } + // generate Vuex code as well if it is enabled. if conf.Client.Vuex.Path != "" { storeRootPath := filepath.Join(projectPath, conf.Client.Vuex.Path, "generated") @@ -105,7 +120,7 @@ func protoc(cacheStorage cache.Storage, projectPath, gomodPath string) error { options = append(options, cosmosgen.WithVuexGeneration( false, - cosmosgen.VuexStoreModulePath(storeRootPath), + cosmosgen.TypescriptModulePath(storeRootPath), storeRootPath, ), ) diff --git a/ignite/templates/app/app.go b/ignite/templates/app/app.go index 23bb07cbea..db059f4dce 100644 --- a/ignite/templates/app/app.go +++ b/ignite/templates/app/app.go @@ -12,10 +12,8 @@ import ( "github.com/ignite/cli/ignite/templates/testutil" ) -var ( - //go:embed stargate/* stargate/**/* - fsStargate embed.FS -) +//go:embed stargate/* stargate/**/* +var fsStargate embed.FS // New returns the generator to scaffold a new Cosmos SDK app func New(opts *Options) (*genny.Generator, error) { diff --git a/ignite/templates/app/stargate/app/app.go.plush b/ignite/templates/app/stargate/app/app.go.plush index fef07342fd..51bdcb5359 100644 --- a/ignite/templates/app/stargate/app/app.go.plush +++ b/ignite/templates/app/stargate/app/app.go.plush @@ -1,6 +1,7 @@ package app import ( + "fmt" "io" "net/http" "os" @@ -9,19 +10,18 @@ import ( "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" + storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" "github.com/cosmos/cosmos-sdk/version" "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" @@ -56,6 +56,11 @@ import ( govclient "github.com/cosmos/cosmos-sdk/x/gov/client" govkeeper "github.com/cosmos/cosmos-sdk/x/gov/keeper" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" + govv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" + govv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" + "github.com/cosmos/cosmos-sdk/x/group" + groupkeeper "github.com/cosmos/cosmos-sdk/x/group/keeper" + groupmodule "github.com/cosmos/cosmos-sdk/x/group/module" "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" @@ -74,16 +79,21 @@ import ( 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" - 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" - ibcporttypes "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" + ica "github.com/cosmos/ibc-go/v5/modules/apps/27-interchain-accounts" + icahost "github.com/cosmos/ibc-go/v5/modules/apps/27-interchain-accounts/host" + icahostkeeper "github.com/cosmos/ibc-go/v5/modules/apps/27-interchain-accounts/host/keeper" + icahosttypes "github.com/cosmos/ibc-go/v5/modules/apps/27-interchain-accounts/host/types" + icatypes "github.com/cosmos/ibc-go/v5/modules/apps/27-interchain-accounts/types" + "github.com/cosmos/ibc-go/v5/modules/apps/transfer" + ibctransferkeeper "github.com/cosmos/ibc-go/v5/modules/apps/transfer/keeper" + ibctransfertypes "github.com/cosmos/ibc-go/v5/modules/apps/transfer/types" + ibc "github.com/cosmos/ibc-go/v5/modules/core" + ibcclient "github.com/cosmos/ibc-go/v5/modules/core/02-client" + ibcclientclient "github.com/cosmos/ibc-go/v5/modules/core/02-client/client" + ibcclienttypes "github.com/cosmos/ibc-go/v5/modules/core/02-client/types" + ibcporttypes "github.com/cosmos/ibc-go/v5/modules/core/05-port/types" + ibchost "github.com/cosmos/ibc-go/v5/modules/core/24-host" + ibckeeper "github.com/cosmos/ibc-go/v5/modules/core/keeper" "github.com/spf13/cast" abci "github.com/tendermint/tendermint/abci/types" tmjson "github.com/tendermint/tendermint/libs/json" @@ -94,10 +104,6 @@ import ( "github.com/ignite/cli/ignite/pkg/cosmoscmd" "github.com/ignite/cli/ignite/pkg/openapiconsole" - monitoringp "github.com/tendermint/spn/x/monitoringp" - monitoringpkeeper "github.com/tendermint/spn/x/monitoringp/keeper" - monitoringptypes "github.com/tendermint/spn/x/monitoringp/types" - "<%= ModulePath %>/docs" // this line is used by starport scaffolding # stargate/app/moduleImport @@ -117,8 +123,8 @@ func getGovProposalHandlers() []govclient.ProposalHandler { govProposalHandlers = append(govProposalHandlers, paramsclient.ProposalHandler, distrclient.ProposalHandler, - upgradeclient.ProposalHandler, - upgradeclient.CancelProposalHandler, + upgradeclient.LegacyProposalHandler, + upgradeclient.LegacyCancelProposalHandler, ibcclientclient.UpdateClientProposalHandler, ibcclientclient.UpgradeProposalHandler, // this line is used by starport scaffolding # stargate/app/govProposalHandler @@ -143,17 +149,18 @@ var ( staking.AppModuleBasic{}, mint.AppModuleBasic{}, distr.AppModuleBasic{}, - gov.NewAppModuleBasic(getGovProposalHandlers()...), + gov.NewAppModuleBasic(getGovProposalHandlers()), params.AppModuleBasic{}, crisis.AppModuleBasic{}, slashing.AppModuleBasic{}, feegrantmodule.AppModuleBasic{}, + groupmodule.AppModuleBasic{}, ibc.AppModuleBasic{}, upgrade.AppModuleBasic{}, evidence.AppModuleBasic{}, transfer.AppModuleBasic{}, + ica.AppModuleBasic{}, vesting.AppModuleBasic{}, - monitoringp.AppModuleBasic{}, // this line is used by starport scaffolding # stargate/app/moduleBasic ) @@ -161,6 +168,7 @@ var ( maccPerms = map[string][]string{ authtypes.FeeCollectorName: nil, distrtypes.ModuleName: nil, + icatypes.ModuleName: nil, minttypes.ModuleName: {authtypes.Minter}, stakingtypes.BondedPoolName: {authtypes.Burner, authtypes.Staking}, stakingtypes.NotBondedPoolName: {authtypes.Burner, authtypes.Staking}, @@ -198,9 +206,9 @@ type App struct { invCheckPeriod uint // keys to access the substores - keys map[string]*sdk.KVStoreKey - tkeys map[string]*sdk.TransientStoreKey - memKeys map[string]*sdk.MemoryStoreKey + keys map[string]*storetypes.KVStoreKey + tkeys map[string]*storetypes.TransientStoreKey + memKeys map[string]*storetypes.MemoryStoreKey // keepers AccountKeeper authkeeper.AccountKeeper @@ -218,13 +226,14 @@ type App struct { IBCKeeper *ibckeeper.Keeper // IBC Keeper must be a pointer in the app, so we can SetRouter on it correctly EvidenceKeeper evidencekeeper.Keeper TransferKeeper ibctransferkeeper.Keeper + ICAHostKeeper icahostkeeper.Keeper FeeGrantKeeper feegrantkeeper.Keeper - MonitoringKeeper monitoringpkeeper.Keeper + GroupKeeper groupkeeper.Keeper // make scoped keepers public for test purposes ScopedIBCKeeper capabilitykeeper.ScopedKeeper ScopedTransferKeeper capabilitykeeper.ScopedKeeper - ScopedMonitoringKeeper capabilitykeeper.ScopedKeeper + ScopedICAHostKeeper capabilitykeeper.ScopedKeeper // this line is used by starport scaffolding # stargate/app/keeperDeclaration @@ -232,7 +241,8 @@ type App struct { mm *module.Manager // sm is the simulation manager - sm *module.SimulationManager + sm *module.SimulationManager + configurator module.Configurator } // New returns a reference to an initialized blockchain app @@ -259,9 +269,9 @@ func New( keys := sdk.NewKVStoreKeys( authtypes.StoreKey, authz.ModuleName, banktypes.StoreKey, stakingtypes.StoreKey, - minttypes.StoreKey, distrtypes.StoreKey, slashingtypes.StoreKey, - govtypes.StoreKey, paramstypes.StoreKey, ibchost.StoreKey, upgradetypes.StoreKey, feegrant.StoreKey, - evidencetypes.StoreKey, ibctransfertypes.StoreKey, capabilitytypes.StoreKey, monitoringptypes.StoreKey, + minttypes.StoreKey, distrtypes.StoreKey, slashingtypes.StoreKey, govtypes.StoreKey, + paramstypes.StoreKey, ibchost.StoreKey, upgradetypes.StoreKey, feegrant.StoreKey, evidencetypes.StoreKey, + ibctransfertypes.StoreKey, icahosttypes.StoreKey, capabilitytypes.StoreKey, group.StoreKey, // this line is used by starport scaffolding # stargate/app/storeKey ) tkeys := sdk.NewTransientStoreKeys(paramstypes.TStoreKey) @@ -278,51 +288,123 @@ func New( memKeys: memKeys, } - app.ParamsKeeper = initParamsKeeper(appCodec, cdc, keys[paramstypes.StoreKey], tkeys[paramstypes.TStoreKey]) + app.ParamsKeeper = initParamsKeeper( + appCodec, + cdc, + keys[paramstypes.StoreKey], + tkeys[paramstypes.TStoreKey], + ) // set the BaseApp's parameter store - bApp.SetParamStore(app.ParamsKeeper.Subspace(baseapp.Paramspace).WithKeyTable(paramskeeper.ConsensusParamsKeyTable())) + bApp.SetParamStore(app.ParamsKeeper.Subspace(baseapp.Paramspace).WithKeyTable(paramstypes.ConsensusParamsKeyTable())) // add capability keeper and ScopeToModule for ibc module - app.CapabilityKeeper = capabilitykeeper.NewKeeper(appCodec, keys[capabilitytypes.StoreKey], memKeys[capabilitytypes.MemStoreKey]) + app.CapabilityKeeper = capabilitykeeper.NewKeeper( + appCodec, + keys[capabilitytypes.StoreKey], + memKeys[capabilitytypes.MemStoreKey], + ) // grant capabilities for the ibc and ibc-transfer modules scopedIBCKeeper := app.CapabilityKeeper.ScopeToModule(ibchost.ModuleName) scopedTransferKeeper := app.CapabilityKeeper.ScopeToModule(ibctransfertypes.ModuleName) + scopedICAHostKeeper := app.CapabilityKeeper.ScopeToModule(icahosttypes.SubModuleName) // this line is used by starport scaffolding # stargate/app/scopedKeeper // add keepers - app.AccountKeeper = authkeeper.NewAccountKeeper( - appCodec, keys[authtypes.StoreKey], app.GetSubspace(authtypes.ModuleName), authtypes.ProtoBaseAccount, maccPerms, + app.AccountKeeper = authkeeper.NewAccountKeeper( + appCodec, + keys[authtypes.StoreKey], + app.GetSubspace(authtypes.ModuleName), + authtypes.ProtoBaseAccount, + maccPerms, + sdk.Bech32PrefixAccAddr, ) app.AuthzKeeper = authzkeeper.NewKeeper( - keys[authz.ModuleName], appCodec, app.MsgServiceRouter(), + keys[authz.ModuleName], + appCodec, + app.MsgServiceRouter(), + app.AccountKeeper, ) app.BankKeeper = bankkeeper.NewBaseKeeper( - appCodec, keys[banktypes.StoreKey], app.AccountKeeper, app.GetSubspace(banktypes.ModuleName), app.ModuleAccountAddrs(), + appCodec, + keys[banktypes.StoreKey], + app.AccountKeeper, + app.GetSubspace(banktypes.ModuleName), + app.BlockedModuleAccountAddrs(), ) + stakingKeeper := stakingkeeper.NewKeeper( - appCodec, keys[stakingtypes.StoreKey], app.AccountKeeper, app.BankKeeper, app.GetSubspace(stakingtypes.ModuleName), + appCodec, + keys[stakingtypes.StoreKey], + app.AccountKeeper, + app.BankKeeper, + app.GetSubspace(stakingtypes.ModuleName), ) + app.MintKeeper = mintkeeper.NewKeeper( - appCodec, keys[minttypes.StoreKey], app.GetSubspace(minttypes.ModuleName), &stakingKeeper, - app.AccountKeeper, app.BankKeeper, authtypes.FeeCollectorName, + appCodec, + keys[minttypes.StoreKey], + app.GetSubspace(minttypes.ModuleName), + &stakingKeeper, + app.AccountKeeper, + app.BankKeeper, + authtypes.FeeCollectorName, ) + app.DistrKeeper = distrkeeper.NewKeeper( - appCodec, keys[distrtypes.StoreKey], app.GetSubspace(distrtypes.ModuleName), app.AccountKeeper, app.BankKeeper, - &stakingKeeper, authtypes.FeeCollectorName, app.ModuleAccountAddrs(), + appCodec, + keys[distrtypes.StoreKey], + app.GetSubspace(distrtypes.ModuleName), + app.AccountKeeper, + app.BankKeeper, + &stakingKeeper, + authtypes.FeeCollectorName, ) + app.SlashingKeeper = slashingkeeper.NewKeeper( - appCodec, keys[slashingtypes.StoreKey], &stakingKeeper, app.GetSubspace(slashingtypes.ModuleName), + appCodec, + keys[slashingtypes.StoreKey], + &stakingKeeper, + app.GetSubspace(slashingtypes.ModuleName), ) + app.CrisisKeeper = crisiskeeper.NewKeeper( - app.GetSubspace(crisistypes.ModuleName), invCheckPeriod, app.BankKeeper, authtypes.FeeCollectorName, + app.GetSubspace(crisistypes.ModuleName), + invCheckPeriod, + app.BankKeeper, + authtypes.FeeCollectorName, ) - app.FeeGrantKeeper = feegrantkeeper.NewKeeper(appCodec, keys[feegrant.StoreKey], app.AccountKeeper) - app.UpgradeKeeper = upgradekeeper.NewKeeper(skipUpgradeHeights, keys[upgradetypes.StoreKey], appCodec, homePath, app.BaseApp) + groupConfig := group.DefaultConfig() + /* + Example of setting group params: + groupConfig.MaxMetadataLen = 1000 + */ + app.GroupKeeper = groupkeeper.NewKeeper( + keys[group.StoreKey], + appCodec, + app.MsgServiceRouter(), + app.AccountKeeper, + groupConfig, + ) + + app.FeeGrantKeeper = feegrantkeeper.NewKeeper( + appCodec, + keys[feegrant.StoreKey], + app.AccountKeeper, + ) + + app.UpgradeKeeper = upgradekeeper.NewKeeper( + skipUpgradeHeights, + keys[upgradetypes.StoreKey], + appCodec, + homePath, + app.BaseApp, + authtypes.NewModuleAddress(govtypes.ModuleName).String(), + ) // register the staking hooks // NOTE: stakingKeeper above is passed by reference, so that it will contain these hooks @@ -333,62 +415,77 @@ func New( // ... other modules keepers // Create IBC Keeper - app.IBCKeeper = ibckeeper.NewKeeper( - appCodec, keys[ibchost.StoreKey], app.GetSubspace(ibchost.ModuleName), app.StakingKeeper, app.UpgradeKeeper, scopedIBCKeeper, + app.IBCKeeper = ibckeeper.NewKeeper( + appCodec, keys[ibchost.StoreKey], + app.GetSubspace(ibchost.ModuleName), + app.StakingKeeper, + app.UpgradeKeeper, + scopedIBCKeeper, ) - // register the proposal types - govRouter := govtypes.NewRouter() - govRouter.AddRoute(govtypes.RouterKey, govtypes.ProposalHandler). - AddRoute(paramproposal.RouterKey, params.NewParamChangeProposalHandler(app.ParamsKeeper)). - AddRoute(distrtypes.RouterKey, distr.NewCommunityPoolSpendProposalHandler(app.DistrKeeper)). - AddRoute(upgradetypes.RouterKey, upgrade.NewSoftwareUpgradeProposalHandler(app.UpgradeKeeper)). - AddRoute(ibcclienttypes.RouterKey, ibcclient.NewClientProposalHandler(app.IBCKeeper.ClientKeeper)) - // Create Transfer Keepers app.TransferKeeper = ibctransferkeeper.NewKeeper( - appCodec, keys[ibctransfertypes.StoreKey], app.GetSubspace(ibctransfertypes.ModuleName), - app.IBCKeeper.ChannelKeeper, app.IBCKeeper.ChannelKeeper, &app.IBCKeeper.PortKeeper, - app.AccountKeeper, app.BankKeeper, scopedTransferKeeper, + appCodec, + keys[ibctransfertypes.StoreKey], + app.GetSubspace(ibctransfertypes.ModuleName), + app.IBCKeeper.ChannelKeeper, + app.IBCKeeper.ChannelKeeper, + &app.IBCKeeper.PortKeeper, + app.AccountKeeper, + app.BankKeeper, + scopedTransferKeeper, + ) + transferModule := transfer.NewAppModule(app.TransferKeeper) + transferIBCModule := transfer.NewIBCModule(app.TransferKeeper) + + app.ICAHostKeeper = icahostkeeper.NewKeeper( + appCodec, keys[icahosttypes.StoreKey], + app.GetSubspace(icahosttypes.SubModuleName), + app.IBCKeeper.ChannelKeeper, + &app.IBCKeeper.PortKeeper, + app.AccountKeeper, + scopedICAHostKeeper, + app.MsgServiceRouter(), ) - var ( - transferModule = transfer.NewAppModule(app.TransferKeeper) - transferIBCModule = transfer.NewIBCModule(app.TransferKeeper) - ) + icaModule := ica.NewAppModule(nil, &app.ICAHostKeeper) + icaHostIBCModule := icahost.NewIBCModule(app.ICAHostKeeper) // Create evidence Keeper for to register the IBC light client misbehaviour evidence route evidenceKeeper := evidencekeeper.NewKeeper( - appCodec, keys[evidencetypes.StoreKey], &app.StakingKeeper, app.SlashingKeeper, + appCodec, + keys[evidencetypes.StoreKey], + &app.StakingKeeper, + app.SlashingKeeper, ) // If evidence needs to be handled for the app, set routes in router here and seal app.EvidenceKeeper = *evidenceKeeper + govRouter := govv1beta1.NewRouter() + govRouter. + AddRoute(govtypes.RouterKey, govv1beta1.ProposalHandler). + AddRoute(paramproposal.RouterKey, params.NewParamChangeProposalHandler(app.ParamsKeeper)). + AddRoute(distrtypes.RouterKey, distr.NewCommunityPoolSpendProposalHandler(app.DistrKeeper)). + AddRoute(upgradetypes.RouterKey, upgrade.NewSoftwareUpgradeProposalHandler(app.UpgradeKeeper)). + AddRoute(ibcclienttypes.RouterKey, ibcclient.NewClientProposalHandler(app.IBCKeeper.ClientKeeper)) + govConfig := govtypes.DefaultConfig() app.GovKeeper = govkeeper.NewKeeper( - appCodec, keys[govtypes.StoreKey], app.GetSubspace(govtypes.ModuleName), app.AccountKeeper, app.BankKeeper, - &stakingKeeper, govRouter, - ) - - scopedMonitoringKeeper := app.CapabilityKeeper.ScopeToModule(monitoringptypes.ModuleName) - app.MonitoringKeeper = *monitoringpkeeper.NewKeeper( appCodec, - keys[monitoringptypes.StoreKey], - keys[monitoringptypes.MemStoreKey], - app.GetSubspace(monitoringptypes.ModuleName), - app.StakingKeeper, - app.IBCKeeper.ClientKeeper, - app.IBCKeeper.ConnectionKeeper, - app.IBCKeeper.ChannelKeeper, - &app.IBCKeeper.PortKeeper, - scopedMonitoringKeeper, + keys[govtypes.StoreKey], + app.GetSubspace(govtypes.ModuleName), + app.AccountKeeper, + app.BankKeeper, + &stakingKeeper, + govRouter, + app.MsgServiceRouter(), + govConfig, ) - monitoringModule := monitoringp.NewAppModule(appCodec, app.MonitoringKeeper) // this line is used by starport scaffolding # stargate/app/keeperDefinition // Create static IBC router, add transfer route, then set and seal it ibcRouter := ibcporttypes.NewRouter() - ibcRouter.AddRoute(ibctransfertypes.ModuleName, transferIBCModule) - ibcRouter.AddRoute(monitoringptypes.ModuleName, monitoringModule) + ibcRouter.AddRoute(icahosttypes.SubModuleName, icaHostIBCModule). + AddRoute(ibctransfertypes.ModuleName, transferIBCModule) // this line is used by starport scaffolding # ibc/app/router app.IBCKeeper.SetRouter(ibcRouter) @@ -412,9 +509,10 @@ func New( bank.NewAppModule(appCodec, app.BankKeeper, app.AccountKeeper), capability.NewAppModule(appCodec, *app.CapabilityKeeper), feegrantmodule.NewAppModule(appCodec, app.AccountKeeper, app.BankKeeper, app.FeeGrantKeeper, app.interfaceRegistry), + groupmodule.NewAppModule(appCodec, app.GroupKeeper, app.AccountKeeper, app.BankKeeper, app.interfaceRegistry), crisis.NewAppModule(&app.CrisisKeeper, skipGenesisInvariants), gov.NewAppModule(appCodec, app.GovKeeper, app.AccountKeeper, app.BankKeeper), - mint.NewAppModule(appCodec, app.MintKeeper, app.AccountKeeper), + mint.NewAppModule(appCodec, app.MintKeeper, app.AccountKeeper, minttypes.DefaultInflationCalculationFn), slashing.NewAppModule(appCodec, app.SlashingKeeper, app.AccountKeeper, app.BankKeeper, app.StakingKeeper), distr.NewAppModule(appCodec, app.DistrKeeper, app.AccountKeeper, app.BankKeeper, app.StakingKeeper), staking.NewAppModule(appCodec, app.StakingKeeper, app.AccountKeeper, app.BankKeeper), @@ -423,7 +521,7 @@ func New( ibc.NewAppModule(app.IBCKeeper), params.NewAppModule(app.ParamsKeeper), transferModule, - monitoringModule, + icaModule, // this line is used by starport scaffolding # stargate/app/appModule ) @@ -432,6 +530,7 @@ func New( // CanWithdrawInvariant invariant. // NOTE: staking module is required if HistoricalEntries param > 0 app.mm.SetOrderBeginBlockers( + // upgrades should be run first upgradetypes.ModuleName, capabilitytypes.ModuleName, minttypes.ModuleName, @@ -439,18 +538,19 @@ func New( slashingtypes.ModuleName, evidencetypes.ModuleName, stakingtypes.ModuleName, - vestingtypes.ModuleName, - ibchost.ModuleName, - ibctransfertypes.ModuleName, authtypes.ModuleName, - authz.ModuleName, banktypes.ModuleName, govtypes.ModuleName, crisistypes.ModuleName, + ibctransfertypes.ModuleName, + ibchost.ModuleName, + icatypes.ModuleName, genutiltypes.ModuleName, + authz.ModuleName, feegrant.ModuleName, + group.ModuleName, paramstypes.ModuleName, - monitoringptypes.ModuleName, + vestingtypes.ModuleName, // this line is used by starport scaffolding # stargate/app/beginBlockers ) @@ -458,22 +558,23 @@ func New( crisistypes.ModuleName, govtypes.ModuleName, stakingtypes.ModuleName, + ibctransfertypes.ModuleName, + ibchost.ModuleName, + icatypes.ModuleName, capabilitytypes.ModuleName, authtypes.ModuleName, - authz.ModuleName, banktypes.ModuleName, distrtypes.ModuleName, slashingtypes.ModuleName, - vestingtypes.ModuleName, minttypes.ModuleName, genutiltypes.ModuleName, evidencetypes.ModuleName, + authz.ModuleName, feegrant.ModuleName, + group.ModuleName, paramstypes.ModuleName, upgradetypes.ModuleName, - ibchost.ModuleName, - ibctransfertypes.ModuleName, - monitoringptypes.ModuleName, + vestingtypes.ModuleName, // this line is used by starport scaffolding # stargate/app/endBlockers ) @@ -485,29 +586,35 @@ func New( app.mm.SetOrderInitGenesis( capabilitytypes.ModuleName, authtypes.ModuleName, - authz.ModuleName, banktypes.ModuleName, distrtypes.ModuleName, stakingtypes.ModuleName, - vestingtypes.ModuleName, slashingtypes.ModuleName, govtypes.ModuleName, minttypes.ModuleName, crisistypes.ModuleName, - ibchost.ModuleName, genutiltypes.ModuleName, + ibctransfertypes.ModuleName, + ibchost.ModuleName, + icatypes.ModuleName, evidencetypes.ModuleName, + authz.ModuleName, + feegrant.ModuleName, + group.ModuleName, paramstypes.ModuleName, upgradetypes.ModuleName, - ibctransfertypes.ModuleName, - feegrant.ModuleName, - monitoringptypes.ModuleName, + vestingtypes.ModuleName, // this line is used by starport scaffolding # stargate/app/initGenesis ) + // Uncomment if you want to set a custom migration order here. + // app.mm.SetOrderMigrations(custom order) + app.mm.RegisterInvariants(&app.CrisisKeeper) app.mm.RegisterRoutes(app.Router(), app.QueryRouter(), encodingConfig.Amino) - app.mm.RegisterServices(module.NewConfigurator(app.appCodec, app.MsgServiceRouter(), app.GRPCQueryRouter())) + + app.configurator = module.NewConfigurator(app.appCodec, app.MsgServiceRouter(), app.GRPCQueryRouter()) + app.mm.RegisterServices(app.configurator) // create the simulation manager and define the order of the modules for deterministic simulations app.sm = module.NewSimulationManager( @@ -517,15 +624,15 @@ func New( capability.NewAppModule(appCodec, *app.CapabilityKeeper), feegrantmodule.NewAppModule(appCodec, app.AccountKeeper, app.BankKeeper, app.FeeGrantKeeper, app.interfaceRegistry), gov.NewAppModule(appCodec, app.GovKeeper, app.AccountKeeper, app.BankKeeper), - mint.NewAppModule(appCodec, app.MintKeeper, app.AccountKeeper), + mint.NewAppModule(appCodec, app.MintKeeper, app.AccountKeeper, minttypes.DefaultInflationCalculationFn), staking.NewAppModule(appCodec, app.StakingKeeper, app.AccountKeeper, app.BankKeeper), distr.NewAppModule(appCodec, app.DistrKeeper, app.AccountKeeper, app.BankKeeper, app.StakingKeeper), slashing.NewAppModule(appCodec, app.SlashingKeeper, app.AccountKeeper, app.BankKeeper, app.StakingKeeper), params.NewAppModule(app.ParamsKeeper), + groupmodule.NewAppModule(appCodec, app.GroupKeeper, app.AccountKeeper, app.BankKeeper, app.interfaceRegistry), evidence.NewAppModule(app.EvidenceKeeper), ibc.NewAppModule(app.IBCKeeper), transferModule, - monitoringModule, // this line is used by starport scaffolding # stargate/app/appModule ) app.sm.RegisterStoreDecoders() @@ -549,10 +656,12 @@ func New( }, ) if err != nil { - panic(err) + panic(fmt.Errorf("failed to create AnteHandler: %s", err)) } app.SetAnteHandler(anteHandler) + app.SetInitChainer(app.InitChainer) + app.SetBeginBlocker(app.BeginBlocker) app.SetEndBlocker(app.EndBlocker) if loadLatest { @@ -563,7 +672,6 @@ func New( app.ScopedIBCKeeper = scopedIBCKeeper app.ScopedTransferKeeper = scopedTransferKeeper - app.ScopedMonitoringKeeper = scopedMonitoringKeeper // this line is used by starport scaffolding # stargate/app/beforeInitReturn return app @@ -610,6 +718,15 @@ func (app *App) ModuleAccountAddrs() map[string]bool { return modAccAddrs } +// BlockedModuleAccountAddrs returns all the app's blocked module account +// addresses. +func (app *App) BlockedModuleAccountAddrs() map[string]bool { + modAccAddrs := app.ModuleAccountAddrs() + delete(modAccAddrs, authtypes.NewModuleAddress(govtypes.ModuleName).String()) + + return modAccAddrs +} + // LegacyAmino returns SimApp's amino codec. // // NOTE: This is solely to be used for testing purposes as it may be desirable @@ -634,21 +751,21 @@ func (app *App) InterfaceRegistry() types.InterfaceRegistry { // GetKey returns the KVStoreKey for the provided store key. // // NOTE: This is solely to be used for testing purposes. -func (app *App) GetKey(storeKey string) *sdk.KVStoreKey { +func (app *App) GetKey(storeKey string) *storetypes.KVStoreKey { return app.keys[storeKey] } // GetTKey returns the TransientStoreKey for the provided store key. // // NOTE: This is solely to be used for testing purposes. -func (app *App) GetTKey(storeKey string) *sdk.TransientStoreKey { +func (app *App) GetTKey(storeKey string) *storetypes.TransientStoreKey { return app.tkeys[storeKey] } // GetMemKey returns the MemStoreKey for the provided mem key. // // NOTE: This is solely used for testing purposes. -func (app *App) GetMemKey(storeKey string) *sdk.MemoryStoreKey { +func (app *App) GetMemKey(storeKey string) *storetypes.MemoryStoreKey { return app.memKeys[storeKey] } @@ -664,16 +781,12 @@ func (app *App) GetSubspace(moduleName string) paramstypes.Subspace { // API server. func (app *App) 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 legacy and grpc-gateway routes for all modules. - ModuleBasics.RegisterRESTRoutes(clientCtx, apiSvr.Router) + // Register grpc-gateway routes for all modules. ModuleBasics.RegisterGRPCGatewayRoutes(clientCtx, apiSvr.GRPCGatewayRouter) // register app's OpenAPI routes. @@ -688,7 +801,12 @@ func (app *App) RegisterTxService(clientCtx client.Context) { // RegisterTendermintService implements the Application.RegisterTendermintService method. func (app *App) RegisterTendermintService(clientCtx client.Context) { - tmservice.RegisterTendermintService(app.BaseApp.GRPCQueryRouter(), clientCtx, app.interfaceRegistry) + tmservice.RegisterTendermintService( + clientCtx, + app.BaseApp.GRPCQueryRouter(), + app.interfaceRegistry, + app.Query, + ) } // GetMaccPerms returns a copy of the module account permissions @@ -701,7 +819,7 @@ func GetMaccPerms() map[string][]string { } // initParamsKeeper init params keeper and its subspaces -func initParamsKeeper(appCodec codec.BinaryCodec, legacyAmino *codec.LegacyAmino, key, tkey sdk.StoreKey) paramskeeper.Keeper { +func initParamsKeeper(appCodec codec.BinaryCodec, legacyAmino *codec.LegacyAmino, key, tkey storetypes.StoreKey) paramskeeper.Keeper { paramsKeeper := paramskeeper.NewKeeper(appCodec, legacyAmino, key, tkey) paramsKeeper.Subspace(authtypes.ModuleName) @@ -710,11 +828,11 @@ func initParamsKeeper(appCodec codec.BinaryCodec, legacyAmino *codec.LegacyAmino paramsKeeper.Subspace(minttypes.ModuleName) paramsKeeper.Subspace(distrtypes.ModuleName) paramsKeeper.Subspace(slashingtypes.ModuleName) - paramsKeeper.Subspace(govtypes.ModuleName).WithKeyTable(govtypes.ParamKeyTable()) + paramsKeeper.Subspace(govtypes.ModuleName).WithKeyTable(govv1.ParamKeyTable()) paramsKeeper.Subspace(crisistypes.ModuleName) paramsKeeper.Subspace(ibctransfertypes.ModuleName) paramsKeeper.Subspace(ibchost.ModuleName) - paramsKeeper.Subspace(monitoringptypes.ModuleName) + paramsKeeper.Subspace(icahosttypes.SubModuleName) // this line is used by starport scaffolding # stargate/app/paramSubspace return paramsKeeper @@ -723,4 +841,4 @@ func initParamsKeeper(appCodec codec.BinaryCodec, legacyAmino *codec.LegacyAmino // SimulationManager implements the SimulationApp interface func (app *App) SimulationManager() *module.SimulationManager { return app.sm -} +} \ No newline at end of file diff --git a/ignite/templates/app/stargate/app/export.go.plush b/ignite/templates/app/stargate/app/export.go.plush index a744e54964..815de1a7c8 100644 --- a/ignite/templates/app/stargate/app/export.go.plush +++ b/ignite/templates/app/stargate/app/export.go.plush @@ -110,14 +110,23 @@ func (app *App) prepForZeroHeightGenesis(ctx sdk.Context, jailAllowedAddrs []str feePool.CommunityPool = feePool.CommunityPool.Add(scraps...) app.DistrKeeper.SetFeePool(ctx, feePool) - app.DistrKeeper.Hooks().AfterValidatorCreated(ctx, val.GetOperator()) + err := app.DistrKeeper.Hooks().AfterValidatorCreated(ctx, val.GetOperator()) + if err != nil { + panic(err) + } return false }) // reinitialize all delegations for _, del := range dels { - app.DistrKeeper.Hooks().BeforeDelegationCreated(ctx, del.GetDelegatorAddr(), del.GetValidatorAddr()) - app.DistrKeeper.Hooks().AfterDelegationModified(ctx, del.GetDelegatorAddr(), del.GetValidatorAddr()) + err := app.DistrKeeper.Hooks().BeforeDelegationCreated(ctx, del.GetDelegatorAddr(), del.GetValidatorAddr()) + if err != nil { + panic(err) + } + err = app.DistrKeeper.Hooks().AfterDelegationModified(ctx, del.GetDelegatorAddr(), del.GetValidatorAddr()) + if err != nil { + panic(err) + } } // reset context height diff --git a/ignite/templates/app/stargate/cmd/{{binaryNamePrefix}}d/main.go.plush b/ignite/templates/app/stargate/cmd/{{binaryNamePrefix}}d/main.go.plush index 04d5ac4464..83191ff50f 100644 --- a/ignite/templates/app/stargate/cmd/{{binaryNamePrefix}}d/main.go.plush +++ b/ignite/templates/app/stargate/cmd/{{binaryNamePrefix}}d/main.go.plush @@ -6,6 +6,7 @@ import ( svrcmd "github.com/cosmos/cosmos-sdk/server/cmd" "<%= ModulePath %>/app" "github.com/ignite/cli/ignite/pkg/cosmoscmd" + "github.com/ignite/cli/ignite/pkg/xstrings" ) func main() { @@ -13,12 +14,12 @@ func main() { app.Name, app.AccountAddressPrefix, app.DefaultNodeHome, - app.Name, + xstrings.NoDash(app.Name), app.ModuleBasics, app.New, // this line is used by starport scaffolding # root/arguments ) - if err := svrcmd.Execute(rootCmd, app.DefaultNodeHome); err != nil { + if err := svrcmd.Execute(rootCmd, "", app.DefaultNodeHome); err != nil { os.Exit(1) } } diff --git a/ignite/templates/app/stargate/config.yml b/ignite/templates/app/stargate/config.yml index 0e5d5b665d..8d40480692 100644 --- a/ignite/templates/app/stargate/config.yml +++ b/ignite/templates/app/stargate/config.yml @@ -9,6 +9,8 @@ validator: client: openapi: path: "docs/static/openapi.yml" + typescript: + path: "ts-client" vuex: path: "vue/src/store" faucet: diff --git a/ignite/templates/app/stargate/go.mod.plush b/ignite/templates/app/stargate/go.mod.plush index 38952b9af5..b47b6a09a2 100644 --- a/ignite/templates/app/stargate/go.mod.plush +++ b/ignite/templates/app/stargate/go.mod.plush @@ -3,26 +3,201 @@ module <%= ModulePath %> go 1.18 require ( - github.com/cosmos/cosmos-sdk v0.45.5 - github.com/cosmos/ibc-go/v3 v3.0.1 + github.com/cosmos/cosmos-sdk v0.46.1 + github.com/cosmos/ibc-go/v5 v5.0.0-rc1 github.com/gogo/protobuf v1.3.3 github.com/golang/protobuf v1.5.2 - github.com/gorilla/mux v1.8.0 github.com/grpc-ecosystem/grpc-gateway v1.16.0 - github.com/ignite/cli v0.23.0 - github.com/spf13/cast v1.4.1 - github.com/spf13/cobra v1.4.0 - github.com/stretchr/testify v1.7.1 - github.com/tendermint/spn v0.2.1-0.20220708132853-26a17f03c072 - github.com/tendermint/tendermint v0.34.19 + github.com/ignite/cli v0.24.0 + github.com/spf13/cast v1.5.0 + github.com/spf13/cobra v1.5.0 + github.com/stretchr/testify v1.8.0 + github.com/tendermint/tendermint v0.34.21 github.com/tendermint/tm-db v0.6.7 - google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd - google.golang.org/grpc v1.46.2 + google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc + google.golang.org/grpc v1.49.0 gopkg.in/yaml.v2 v2.4.0 ) -replace ( - github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1 - github.com/keybase/go-keychain => github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 - google.golang.org/grpc => google.golang.org/grpc v1.33.2 +require ( + cloud.google.com/go v0.102.0 // indirect + cloud.google.com/go/compute v1.7.0 // indirect + cloud.google.com/go/iam v0.3.0 // indirect + cloud.google.com/go/storage v1.22.1 // indirect + cosmossdk.io/errors v1.0.0-beta.7 // indirect + cosmossdk.io/math v1.0.0-beta.3 // indirect + filippo.io/edwards25519 v1.0.0-rc.1 // indirect + github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect + github.com/99designs/keyring v1.2.1 // indirect + github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d // indirect + github.com/Microsoft/go-winio v0.5.2 // indirect + github.com/Microsoft/hcsshim v0.9.3 // indirect + github.com/Workiva/go-datastructures v1.0.53 // indirect + github.com/andrew-d/go-termutil v0.0.0-20150726205930-009166a695a2 // indirect + github.com/armon/go-metrics v0.4.0 // indirect + github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 // indirect + github.com/aws/aws-sdk-go v1.40.45 // indirect + github.com/beorn7/perks v1.0.1 // indirect + github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect + github.com/bgentry/speakeasy v0.1.0 // indirect + github.com/blang/semver v3.5.1+incompatible // indirect + github.com/btcsuite/btcd v0.22.1 // indirect + github.com/buger/jsonparser v1.1.1 // indirect + github.com/cenkalti/backoff v2.2.1+incompatible // 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/cockroachdb/apd/v2 v2.0.2 // indirect + github.com/coinbase/rosetta-sdk-go v0.7.9 // indirect + github.com/confio/ics23/go v0.7.0 // indirect + github.com/containerd/cgroups v1.0.3 // indirect + github.com/containerd/containerd v1.6.6 // indirect + github.com/cosmos/btcutil v1.0.4 // indirect + github.com/cosmos/cosmos-proto v1.0.0-alpha7 // indirect + github.com/cosmos/go-bip39 v1.0.0 // indirect + github.com/cosmos/gorocksdb v1.2.0 // indirect + github.com/cosmos/iavl v0.19.1 // indirect + github.com/cosmos/ledger-cosmos-go v0.11.1 // indirect + github.com/cosmos/ledger-go v0.9.2 // indirect + github.com/creachadair/taskgroup v0.3.2 // indirect + github.com/danieljoos/wincred v1.1.2 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f // indirect + github.com/dgraph-io/badger/v2 v2.2007.4 // indirect + github.com/dgraph-io/ristretto v0.1.0 // indirect + github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 // indirect + github.com/docker/docker v20.10.17+incompatible // indirect + github.com/docker/go-units v0.4.0 // indirect + github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac // indirect + github.com/dvsekhvalnov/jose2go v1.5.0 // indirect + github.com/emicklei/proto v1.9.0 // indirect + github.com/emirpasic/gods v1.12.0 // indirect + github.com/fatih/color v1.13.0 // indirect + github.com/felixge/httpsnoop v1.0.1 // indirect + github.com/fsnotify/fsnotify v1.5.4 // indirect + github.com/ghodss/yaml v1.0.0 // indirect + github.com/go-git/gcfg v1.5.0 // indirect + github.com/go-git/go-billy/v5 v5.0.0 // indirect + github.com/go-git/go-git/v5 v5.1.0 // indirect + github.com/go-kit/kit v0.12.0 // indirect + github.com/go-kit/log v0.2.1 // indirect + github.com/go-logfmt/logfmt v0.5.1 // indirect + github.com/goccy/go-yaml v1.9.4 // indirect + github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect + github.com/gogo/gateway v1.1.0 // indirect + github.com/golang/glog v1.0.0 // indirect + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/golang/snappy v0.0.4 // indirect + github.com/google/btree v1.0.1 // indirect + github.com/google/go-cmp v0.5.8 // indirect + github.com/google/orderedcode v0.0.1 // indirect + github.com/google/uuid v1.3.0 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa // indirect + github.com/googleapis/gax-go/v2 v2.4.0 // indirect + github.com/googleapis/go-type-adapters v1.0.0 // indirect + github.com/gookit/color v1.5.0 // indirect + github.com/gorilla/handlers v1.5.1 // indirect + github.com/gorilla/mux v1.8.0 // indirect + github.com/gorilla/websocket v1.5.0 // indirect + github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 // indirect + github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c // indirect + github.com/gtank/merlin v0.1.1 // indirect + github.com/gtank/ristretto255 v0.1.2 // indirect + github.com/hashicorp/go-cleanhttp v0.5.2 // indirect + github.com/hashicorp/go-getter v1.6.1 // indirect + github.com/hashicorp/go-immutable-radix v1.3.1 // indirect + github.com/hashicorp/go-safetemp v1.0.0 // indirect + github.com/hashicorp/go-version v1.6.0 // 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-20220222234857-c00d1f31bab3 // indirect + github.com/iancoleman/strcase v0.2.0 // indirect + github.com/imdario/mergo v0.3.13 // indirect + github.com/improbable-eng/grpc-web v0.15.0 // indirect + github.com/inconshreveable/mousetrap v1.0.0 // indirect + github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect + github.com/jmespath/go-jmespath v0.4.0 // indirect + github.com/jmhodges/levigo v1.0.0 // indirect + github.com/jpillora/ansi v1.0.2 // indirect + github.com/jpillora/backoff v1.0.0 // indirect + github.com/jpillora/chisel v1.7.7 // indirect + github.com/jpillora/requestlog v1.0.0 // indirect + github.com/jpillora/sizestr v1.0.0 // indirect + github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd // indirect + github.com/klauspost/compress v1.15.9 // indirect + github.com/lib/pq v1.10.6 // indirect + github.com/libp2p/go-buffer-pool v0.1.0 // indirect + github.com/magiconair/properties v1.8.6 // indirect + github.com/mattn/go-colorable v0.1.12 // indirect + github.com/mattn/go-isatty v0.0.14 // indirect + github.com/mattn/go-zglob v0.0.3 // indirect + github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect + github.com/mimoo/StrobeGo v0.0.0-20181016162300-f8f6d4d2b643 // indirect + github.com/minio/highwayhash v1.0.2 // indirect + github.com/mitchellh/go-homedir v1.1.0 // indirect + github.com/mitchellh/go-testing-interface v1.0.0 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/moby/sys/mount v0.3.1 // indirect + github.com/moby/sys/mountinfo v0.6.0 // indirect + github.com/mtibben/percent v0.2.1 // indirect + github.com/opencontainers/go-digest v1.0.0 // indirect + github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799 // indirect + github.com/opencontainers/runc v1.1.3 // indirect + github.com/otiai10/copy v1.6.0 // indirect + github.com/pelletier/go-toml v1.9.5 // indirect + github.com/pelletier/go-toml/v2 v2.0.2 // indirect + github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/prometheus/client_golang v1.12.2 // indirect + github.com/prometheus/client_model v0.2.0 // indirect + github.com/prometheus/common v0.34.0 // indirect + github.com/prometheus/procfs v0.7.3 // indirect + github.com/radovskyb/watcher v1.0.7 // indirect + github.com/rakyll/statik v0.1.7 // indirect + github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0 // indirect + github.com/regen-network/cosmos-proto v0.3.1 // indirect + github.com/rs/cors v1.8.2 // indirect + github.com/rs/zerolog v1.27.0 // indirect + github.com/sasha-s/go-deadlock v0.2.1-0.20190427202633-1595213edefa // indirect + github.com/sergi/go-diff v1.2.0 // indirect + github.com/sirupsen/logrus v1.9.0 // indirect + github.com/spf13/afero v1.8.2 // indirect + github.com/spf13/jwalterweatherman v1.1.0 // indirect + github.com/spf13/pflag v1.0.5 // indirect + github.com/spf13/viper v1.12.0 // indirect + github.com/subosito/gotenv v1.4.0 // indirect + github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 // indirect + github.com/takuoki/gocase v1.0.0 // indirect + github.com/tendermint/btcd v0.1.1 // indirect + github.com/tendermint/crypto v0.0.0-20191022145703-50d29ede1e15 // indirect + github.com/tendermint/go-amino v0.16.0 // indirect + github.com/tendermint/spn v0.2.1-0.20220826123316-985b629a92dd // indirect + github.com/tomasen/realip v0.0.0-20180522021738-f0c99a92ddce // indirect + github.com/ulikunitz/xz v0.5.8 // indirect + github.com/xanzy/ssh-agent v0.2.1 // indirect + github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 // indirect + github.com/zondax/hid v0.9.1-0.20220302062450-5552068d2266 // indirect + go.etcd.io/bbolt v1.3.6 // indirect + go.opencensus.io v0.23.0 // indirect + golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e // indirect + golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e // indirect + golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect + golang.org/x/net v0.0.0-20220726230323-06994584191e // indirect + golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094 // indirect + golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 // indirect + golang.org/x/sys v0.0.0-20220727055044-e65921a090b8 // indirect + golang.org/x/term v0.0.0-20220722155259-a9ba230a4035 // indirect + golang.org/x/text v0.3.7 // indirect + golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f // indirect + google.golang.org/api v0.84.0 // indirect + google.golang.org/appengine v1.6.7 // indirect + google.golang.org/protobuf v1.28.1 // indirect + gopkg.in/ini.v1 v1.66.6 // indirect + gopkg.in/warnings.v0 v0.1.2 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect + nhooyr.io/websocket v1.8.6 // indirect + sigs.k8s.io/yaml v1.3.0 // indirect ) + +replace github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1 diff --git a/ignite/templates/app/stargate/go.sum b/ignite/templates/app/stargate/go.sum index 7d4d8c0abd..bfdd26b9e1 100644 --- a/ignite/templates/app/stargate/go.sum +++ b/ignite/templates/app/stargate/go.sum @@ -1,21 +1,20 @@ -4d63.com/gochecknoglobals v0.0.0-20201008074935-acfc0b28355a/go.mod h1:wfdC5ZjKSPr7CybKEcgJhUOgeAQW1+7WcyK8OvUilfo= 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= -bitbucket.org/creachadair/shell v0.0.6/go.mod h1:8Qqi/cYk7vPnsOePHroKXDJYmb5x7ENhtiFtfZq8K+M= +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.43.0/go.mod h1:BOSR3VbTLkk6FDC/TcffxP4NF/FFBGA5ku+jvKOP7pg= cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.51.0/go.mod h1:hWtGJ6gnXH+KgDv+V0zFGDvpi07n3z8ZNj3T1RW0Gcw= cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= 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= @@ -31,96 +30,78 @@ cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aD cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= -cloud.google.com/go v0.98.0/go.mod h1:ua6Ush4NALrHk5QXDWnjvZHN93OuF0HfuEPq9I1X0cM= cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= +cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= +cloud.google.com/go v0.102.0 h1:DAq3r8y4mDgyB/ZPJ9v/5VJNqjgJAxTn6ZYLlUywOu8= +cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/bigtable v1.2.0/go.mod h1:JcVAOl45lrTmQfLj7T6TxyMzIN/3FGGcFm+2xVAli2o= +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/compute v1.7.0 h1:v/k9Eueb8aAJ0vZuxKMrgm6kPhCLZU9HxFU+AFDs9Uk= +cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= -cloud.google.com/go/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= +cloud.google.com/go/iam v0.3.0 h1:exkAomrVUuzx9kWFI1wm3KI0uoDeUFPB4kKGzx6x+Gc= +cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/pubsub v1.5.0/go.mod h1:ZEwJccE3z93Z2HWvstpri00jOg7oO4UZDtKhwDwqF0w= -cloud.google.com/go/spanner v1.7.0/go.mod h1:sd3K2gZ9Fd0vMPLXzeCrF6fq4i63Q7aTLW/lBIfBkIk= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -contrib.go.opencensus.io/exporter/stackdriver v0.13.4/go.mod h1:aXENhDJ1Y4lIg4EUaVTwzvYETVNZk10Pu26tevFKLUc= +cloud.google.com/go/storage v1.22.1 h1:F6IlQJZrZM++apn9V5/VfS3gbTUYg98PS3EMQAzqtfg= +cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= +collectd.org v0.3.0/go.mod h1:A/8DzQBkF6abtvrT2j/AU/4tiBgJWYyh0y/oB/4MlWE= +cosmossdk.io/errors v1.0.0-beta.7 h1:gypHW76pTQGVnHKo6QBkb4yFOJjC+sUGRc5Al3Odj1w= +cosmossdk.io/errors v1.0.0-beta.7/go.mod h1:mz6FQMJRku4bY7aqS/Gwfcmr/ue91roMEKAmDUDpBfE= +cosmossdk.io/math v1.0.0-beta.3 h1:TbZxSopz2LqjJ7aXYfn7nJSb8vNaBklW6BLpcei1qwM= +cosmossdk.io/math v1.0.0-beta.3/go.mod h1:3LYasri3Zna4XpbrTNdKsWmD5fHHkaNAod/mNT9XdE4= 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= +git.sr.ht/~sircmpwn/getopt v0.0.0-20191230200459-23622cc906b3/go.mod h1:wMEGFFFNuPos7vHmWXfszqImLppbc0wEhh6JBfJIUgw= +git.sr.ht/~sircmpwn/go-bare v0.0.0-20210406120253-ab86bc2846d9/go.mod h1:BVJwbDfVjCjoFiKrhkei6NdGcZYpkDkdyCdg1ukytRA= github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 h1:/vQbFIOMbk2FiG/kXiLl8BRyzTWDw7gX/Hz7Dd5eDMs= github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4/go.mod h1:hN7oaIRCjzsZ2dE+yG5k+rsdt3qcwykqK6HVGcKwsw4= -github.com/99designs/keyring v1.1.6 h1:kVDC2uCgVwecxCk+9zoCt2uEL6dt+dfVzMvGgnVcIuM= -github.com/99designs/keyring v1.1.6/go.mod h1:16e0ds7LGQQcT59QqkTg72Hh5ShM51Byv5PEmW6uoRU= -github.com/AdaLogics/go-fuzz-headers v0.0.0-20210715213245-6c3934b029d8/go.mod h1:CzsSbkDixRphAF5hS6wbMKq0eI6ccJRb7/A0M6JBnwg= -github.com/AlecAivazis/survey/v2 v2.1.1/go.mod h1:9FJRdMdDm8rnT+zHVbvQT2RTSTLq0Ttd6q3Vl2fahjk= -github.com/Antonboom/errname v0.1.4/go.mod h1:jRXo3m0E0EuCnK3wbsSVH3X55Z4iTDLl6ZfCxwFj4TM= -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/99designs/keyring v1.2.1 h1:tYLp1ULvO7i3fI5vE21ReQuj99QFSs7lGm0xWyJo87o= +github.com/99designs/keyring v1.2.1/go.mod h1:fc+wB5KTk9wQ9sDx0kFXB3A0MaeGHM9AwRStKOQ5vOA= github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go/sdk/azcore v0.19.0/go.mod h1:h6H6c8enJmmocHUbLiiGY6sx7f9i+X3m1CHdd5c6Rdw= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.11.0/go.mod h1:HcM1YX14R7CJcghJGOYCgdezslRSVzqwLf/q+4Y2r/0= -github.com/Azure/azure-sdk-for-go/sdk/internal v0.7.0/go.mod h1:yqy467j36fJxcRV2TzfVZ1pCb5vxm4BtZPUdYWe/Xo8= -github.com/Azure/azure-storage-blob-go v0.7.0/go.mod h1:f9YQKtsG1nMisotuTPpO0tjNuEjKRYAcJU8/ydDI++4= +github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1/go.mod h1:fBF9PQNqB8scdgpZ3ufzaLntG0AG7C1WjPMsiFOmfHM= +github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3/go.mod h1:KLF4gFr6DcKFZwSuH8w8yEK6DpFl3LP5rhdvAb7Yz5I= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0/go.mod h1:tPaiy8S5bQ+S5sOiDlINkp7+Ef339+Nz5L5XO+cnOHo= github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= -github.com/Azure/go-ansiterm v0.0.0-20210608223527-2377c96fe795/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/Azure/go-autorest v10.8.1+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= github.com/Azure/go-autorest/autorest v0.11.1/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw= -github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= -github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= -github.com/Azure/go-autorest/autorest/adal v0.8.0/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc= github.com/Azure/go-autorest/autorest/adal v0.9.0/go.mod h1:/c022QCutn2P7uY+/oQWWNcK9YU+MH96NgK+jErpbcg= github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= -github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= -github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= -github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= 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.0.0/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/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= +github.com/DATA-DOG/go-sqlmock v1.3.3/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/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/DataDog/zstd v1.5.0/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= 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.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= @@ -129,9 +110,8 @@ github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugX github.com/Microsoft/go-winio v0.4.17-0.20210211115548-6eac466e5fa3/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= github.com/Microsoft/go-winio v0.4.17-0.20210324224401-5516f17a5958/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= github.com/Microsoft/go-winio v0.4.17/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -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/Microsoft/hcsshim v0.8.6/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= github.com/Microsoft/hcsshim v0.8.7-0.20190325164909-8abdbb8205e4/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= github.com/Microsoft/hcsshim v0.8.7/go.mod h1:OHd7sQqRFrYd3RmSgbgji+ctCwkbq2wbEYNSzOYtcBQ= @@ -139,21 +119,15 @@ github.com/Microsoft/hcsshim v0.8.9/go.mod h1:5692vkUqntj1idxauYlpoINNKeqCiG6Sg3 github.com/Microsoft/hcsshim v0.8.14/go.mod h1:NtVKoYxQuTLx6gEq0L96c9Ju4JbRJ4nY2ow3VK6a9Lg= github.com/Microsoft/hcsshim v0.8.15/go.mod h1:x38A4YbHbdxJtc0sF6oIz+RG0npwSCAvn69iY6URG00= github.com/Microsoft/hcsshim v0.8.16/go.mod h1:o5/SZqmR7x9JNKsW3pu+nqHm0MF8vbA+VxGOoXdC600= -github.com/Microsoft/hcsshim v0.8.20/go.mod h1:+w2gRZ5ReXQhFOrvSQeNfhrYB/dg3oDwTOcER2fw4I4= github.com/Microsoft/hcsshim v0.8.21/go.mod h1:+w2gRZ5ReXQhFOrvSQeNfhrYB/dg3oDwTOcER2fw4I4= -github.com/Microsoft/hcsshim v0.8.23/go.mod h1:4zegtUJth7lAvFyc6cH2gGQ5B3OFQim01nnU2M8jKDg= -github.com/Microsoft/hcsshim v0.9.2 h1:wB06W5aYFfUB3IvootYAY2WnOmIdgPGfqSI6tufQNnY= -github.com/Microsoft/hcsshim v0.9.2/go.mod h1:7pLA8lDk46WKDWlVsENo92gC0XFa8rbKfyFRBqxEbCc= +github.com/Microsoft/hcsshim v0.9.3 h1:k371PzBuRrz2b+ebGuI2nVgVhgsVX60jMfSw80NECxo= +github.com/Microsoft/hcsshim v0.9.3/go.mod h1:7pLA8lDk46WKDWlVsENo92gC0XFa8rbKfyFRBqxEbCc= github.com/Microsoft/hcsshim/test v0.0.0-20201218223536-d3e5debf77da/go.mod h1:5hlzMzRKMLyo42nCZ9oml8AdTlq/0cvIaBv6tK1RehU= github.com/Microsoft/hcsshim/test v0.0.0-20210227013316-43a75bb4edd3/go.mod h1:mw7qgWloBUl75W/gVH3cQszUg1+gUITj7D6NY7ywVnY= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= -github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= -github.com/Netflix/go-expect v0.0.0-20180615182759-c93bf25de8e8/go.mod h1:oX5x61PbNXchhh0oikYAH+4Pcfw5LKv21+Jnpr6r6Pc= 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.0.1/go.mod h1:xsIw86fROiiwelg+jB2uM9PiKihMMmUx/1V+TNhjQvM= github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= @@ -162,104 +136,88 @@ github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:H 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/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= -github.com/VictoriaMetrics/fastcache v1.5.7/go.mod h1:ptDBkNMQI4RtmVo8VS/XwRY6RoTu1dAWCbrk+6WsEM8= +github.com/VictoriaMetrics/fastcache v1.6.0/go.mod h1:0qHz5QP0GMX4pfmMA/zt5RgfNuXJrTP0zS7DqpHGGTw= github.com/VividCortex/gohistogram v1.0.0 h1:6+hBz+qvs0JOrrNhhmR7lFxo5sINxBCGXrdtl/UvroE= github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= -github.com/Workiva/go-datastructures v1.0.52/go.mod h1:Z+F2Rca0qCsVYDS8z7bAGm8f3UkzuWYS/oBZz5a7VVA= github.com/Workiva/go-datastructures v1.0.53 h1:J6Y/52yX10Xc5JjXmGtWoSSxs3mZnGSaq37xZZh7Yig= github.com/Workiva/go-datastructures v1.0.53/go.mod h1:1yZL+zfsztete+ePzZz/Zb1/t5BnDuE2Ya2MMGhzP6A= github.com/Zilliqa/gozilliqa-sdk v1.2.1-0.20201201074141-dd0ecada1be6/go.mod h1:eSYp2T6f0apnuW8TzhV3f6Aff2SE8Dwio++U4ha4yEM= -github.com/adlio/schema v1.1.13/go.mod h1:L5Z7tw+7lRK1Fnpi/LT/ooCP1elkXn0krMWBQHUhEDE= -github.com/adlio/schema v1.2.3/go.mod h1:nD7ZWmMMbwU12Pqwg+qL0rTvHBrBXfNz+5UQxTfy38M= -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/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7 h1:uSoVVbwJiQipAclBbw+8quDsfcvFjOpI5iCf4p/cqCs= github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs= -github.com/alecthomas/assert v0.0.0-20170929043011-405dbfeb8e38/go.mod h1:r7bzyVFMNntcxPZXK3/+KdruV1H5KSlyVY0gc+NgInI= -github.com/alecthomas/chroma v0.8.2/go.mod h1:sko8vR34/90zvl5QdcUdvzL3J8NKjAUx9va9jPuFNoM= -github.com/alecthomas/colour v0.0.0-20160524082231-60882d9e2721/go.mod h1:QO9JBoKquHd+jz9nshCh40fOfO+JzsoXy8qTHF68zU0= -github.com/alecthomas/kong v0.2.4/go.mod h1:kQOmtJgV+Lb4aj+I2LEn40cbtawdWJ9Y8QLq+lElKxE= -github.com/alecthomas/repr v0.0.0-20180818092828-117648cd9897/go.mod h1:xTS7Pm1pD1mvyM075QCDSRqH6qRLXylzS24ZTpRiSzQ= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae/go.mod h1:CgnQgUtFrFz9mxFNtED3jI5tLDjKlOM+oUF/sTk6ps0= -github.com/alexflint/go-filemutex v1.1.0/go.mod h1:7P4iRhttt/nUvUOrYIhcpMzv2G6CY9UnI16Z+UJqRyk= -github.com/alexkohler/prealloc v1.0.0/go.mod h1:VetnK3dIgFBBKmg0YnD9F9x6Icjd+9cvfHR56wJVlKE= github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/andrew-d/go-termutil v0.0.0-20150726205930-009166a695a2 h1:axBiC50cNZOs7ygH5BgQp4N+aYrZ2DNpWZ1KG3VOSOM= github.com/andrew-d/go-termutil v0.0.0-20150726205930-009166a695a2/go.mod h1:jnzFpU88PccN/tPPhCpnNU8mZphvKxYM9lLNkd8e+os= -github.com/andybalholm/brotli v1.0.0/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= +github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= -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/arrow/go/arrow v0.0.0-20191024131854-af6fa24be0db/go.mod h1:VTxUBvSJ3s3eHAg65PNgrsn5BtqCRPdmyXh6rAfdxN0= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/aristanetworks/goarista v0.0.0-20170210015632-ea17b1a17847/go.mod h1:D/tb0zPVXnP7fmsLZjtdUhSsumbK/ij54UXjjVgMGxQ= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-metrics v0.3.9/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= -github.com/armon/go-metrics v0.3.10 h1:FR+drcQStOe+32sYyJYyZ7FIdgoGGBnwLl+flodp8Uo= -github.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= +github.com/armon/go-metrics v0.4.0 h1:yCQqn7dwca4ITXb+CbubHmedzaQYHhNhrEXLYUeEe8Q= +github.com/armon/go-metrics v0.4.0/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/ashanbrown/forbidigo v1.2.0/go.mod h1:vVW7PEdqEFqapJe95xHkTfB1+XvZXBFg8t0sG2FIxmI= -github.com/ashanbrown/makezero v0.0.0-20210520155254-b6261585ddde/go.mod h1:oG9Dnez7/ESBqc4EdrdNlryeo7d0KcW1ftXHm7nU/UU= -github.com/atotto/clipboard v0.1.2/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI= github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= -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.15.78/go.mod h1:E3/ieXAlvM0XWO57iftYVDLLvQ824smPP3ATZkfNZeM= 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 h1:QN1nsY27ssD/JmW4s83qmSb+uL6DG4GmCDzjmJB4xUI= 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/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= -github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/aws/aws-sdk-go-v2 v1.2.0/go.mod h1:zEQs02YRBw1DjK0PoJv3ygDYOFTre1ejlJWl8FwAuQo= +github.com/aws/aws-sdk-go-v2/config v1.1.1/go.mod h1:0XsVy9lBI/BCXm+2Tuvt39YmdHwS5unDQmxZOYe8F5Y= +github.com/aws/aws-sdk-go-v2/credentials v1.1.1/go.mod h1:mM2iIjwl7LULWtS6JCACyInboHirisUUdkBPoTHMOUo= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.0.2/go.mod h1:3hGg3PpiEjHnrkrlasTfxFqUsZ2GCk/fMUn4CbKgSkM= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.0.2/go.mod h1:45MfaXZ0cNbeuT0KQ1XJylq8A6+OpVV2E5kvY/Kq+u8= +github.com/aws/aws-sdk-go-v2/service/route53 v1.1.1/go.mod h1:rLiOUrPLW/Er5kRcQ7NkwbjlijluLsrIbu/iyl35RO4= +github.com/aws/aws-sdk-go-v2/service/sso v1.1.1/go.mod h1:SuZJxklHxLAXgLTc1iFXbEWkXs7QRTQpCLGaKIprQW0= +github.com/aws/aws-sdk-go-v2/service/sts v1.1.1/go.mod h1:Wi0EBZwiz/K44YliU0EKxqTCJGUfYTWXrrBwkq736bM= +github.com/aws/smithy-go v1.1.0/go.mod h1:EzMw8dbp/YJL4A5/sbhGddag+NPT7q084agLbB9LgIw= github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas= +github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ00z/TKoufEY6K/a0k6AhaJrQKdFe6OfVXsa4= github.com/bgentry/speakeasy v0.1.0 h1:ByYyxL9InA1OWqxJqqp2A5pYHUrCiAL6K3J+LKSsQkY= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= 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/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= -github.com/bombsimon/wsl/v3 v3.3.0/go.mod h1:st10JtZYLE4D5sC7b8xV4zTKZwAQjCH/Hy2Pm1FNZIc= -github.com/briandowns/spinner v1.11.1/go.mod h1:QOuQk7x+EaDASo80FEXwlwiA+j/PPIcX3FScO+3/ZPQ= +github.com/bmizerany/pat v0.0.0-20170815010413-6226ea591a40/go.mod h1:8rLXio+WjiTceGBHIoTvn60HIbs7Hm7bcHjyrSqYB9c= +github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= -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.21.0-beta.0.20201114000516-e9c7a5ac6401/go.mod h1:Sv4JPQ3/M+teHz9Bo5jBpkNcP0x6r7rdihlNL/7tTAs= +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/btcec/v2 v2.1.2/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= +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= @@ -280,36 +238,25 @@ github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx2 github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= -github.com/calmh/randomart v1.1.0/go.mod h1:DQUbPVyP+7PAs21w/AnfMKG5NioxS3TbZ2F9MSK/jFM= +github.com/bwesterb/go-ristretto v1.2.0/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= +github.com/c-bata/go-prompt v0.2.2/go.mod h1:VzqtzE2ksDBcdln8G7mk2RX9QyGjH+OVqOCSiVIqS34= 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.2/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/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= -github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/charithe/durationcheck v0.0.8/go.mod h1:SSbRIBVfMjCi/kEB6K65XEA83D6prSM8ap1UCpNKtgg= -github.com/charmbracelet/bubbles v0.7.5/go.mod h1:IRTORFvhEI6OUH7WhN2Ks8Z8miNGimk1BE6cmHijOkM= -github.com/charmbracelet/bubbles v0.7.6/go.mod h1:0D4XRYK0tjo8JMvflz1obpVcOikNZSG46SFauoZj22s= -github.com/charmbracelet/bubbletea v0.12.2/go.mod h1:3gZkYELUOiEUOp0bTInkxguucy/xRbGSOcbMs1geLxg= -github.com/charmbracelet/bubbletea v0.13.1/go.mod h1:tp9tr9Dadh0PLhgiwchE5zZJXm5543JYjHG9oY+5qSg= -github.com/charmbracelet/charm v0.8.6/go.mod h1:8dE3uX+TYSpa7Q6e/CmjN6WSd7koSAKNQTGWugFREx4= -github.com/charmbracelet/glamour v0.2.1-0.20210311152407-2b8307dcb400/go.mod h1:VO5pQW96Vj3qJy9ikwb5Zo8lcvt2ZDFoE3UXl+SduQs= -github.com/charmbracelet/glow v1.4.0/go.mod h1:PmzpVs6fvXd60PmqRkbKtSz412SfDFPD3XbraI1hnJQ= -github.com/chavacava/garif v0.0.0-20210405164556-e8a0a408d6af/go.mod h1:Qjyv4H3//PWVzTeCezG2b9IRn6myJxJSr4TD/xo6ojU= github.com/checkpoint-restore/go-criu/v4 v4.1.0/go.mod h1:xUQBLp4RLc5zJtWY++yjOoMoB5lihDt7fai+75m+rGw= 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/chris-ramon/douceur v0.2.0/go.mod h1:wDW5xjJdeoMm1mRt4sD4c/LbF/mWdEpRXQKjTR8nIBE= +github.com/cheggaaa/pb v1.0.27/go.mod h1:pQciLPpbU0oxA0h+VJYYLxO+XeDQb5pZijXscXHm81s= 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= @@ -321,27 +268,31 @@ github.com/cilium/ebpf v0.6.2/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJ github.com/cilium/ebpf v0.7.0/go.mod h1:/oI2+1shJiTGAMgl6/RgJr36Eo1jzrRcAWbcXO2usCA= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= -github.com/clbanning/mxj v1.8.4/go.mod h1:BVjHeAH+rl9rs6f+QIpeRl0tfu10SXn1pUSa5PVGJng= github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= -github.com/cloudflare/cloudflare-go v0.10.2-0.20190916151808-a80f83b9add9/go.mod h1:1MxXX1Ux4x6mqPmjkUgTP1CdXIBXKX7T+Jk9Gxrmx+U= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cloudflare/cloudflare-go v0.14.0/go.mod h1:EnwdgGMaFOruiPZRFSgn+TsQ3hQ7C/YWzIGLeu5c304= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211130200136-a8f946100490/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cockroachdb/apd/v2 v2.0.2 h1:weh8u7Cneje73dDh+2tEVLUvyBc89iwepWCD8b8034E= +github.com/cockroachdb/apd/v2 v2.0.2/go.mod h1:DDxRlzC2lo3/vSlmSoS7JkqbbrARPuFOGr0B9pvN3Gw= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= -github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= -github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= -github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= -github.com/coinbase/rosetta-sdk-go v0.6.10/go.mod h1:J/JFMsfcePrjJZkwQFLh+hJErkAmdm9Iyy3D5Y0LfXo= -github.com/coinbase/rosetta-sdk-go v0.7.0 h1:lmTO/JEpCvZgpbkOITL95rA80CPKb5CtMzLaqF2mCNg= -github.com/coinbase/rosetta-sdk-go v0.7.0/go.mod h1:7nD3oBPIiHqhRprqvMgPoGxe/nyq3yftRmpsy29coWE= -github.com/confio/ics23/go v0.0.0-20200817220745-f173e6211efb/go.mod h1:E45NqnlpxGnpfTWL/xauN7MRwEE28T4Dd4uraToOaKg= -github.com/confio/ics23/go v0.6.3/go.mod h1:E45NqnlpxGnpfTWL/xauN7MRwEE28T4Dd4uraToOaKg= -github.com/confio/ics23/go v0.6.6/go.mod h1:E45NqnlpxGnpfTWL/xauN7MRwEE28T4Dd4uraToOaKg= +github.com/coinbase/kryptology v1.8.0/go.mod h1:RYXOAPdzOGUe3qlSFkMGn58i3xUA8hmxYHksuq+8ciI= +github.com/coinbase/rosetta-sdk-go v0.7.9 h1:lqllBjMnazTjIqYrOGv8h8jxjg9+hJazIGZr9ZvoCcA= +github.com/coinbase/rosetta-sdk-go v0.7.9/go.mod h1:0/knutI7XGVqXmmH4OQD8OckFrbQ8yMsUZTG7FXCR2M= 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/consensys/bavard v0.1.8-0.20210406032232-f3452dc9b572/go.mod h1:Bpd0/3mZuaj6Sj+PqrmIquiOKy397AKGThQPaGzNXAQ= +github.com/consensys/bavard v0.1.8-0.20210915155054-088da2f7f54a/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= +github.com/consensys/gnark-crypto v0.4.1-0.20210426202927-39ac3d4b3f1f/go.mod h1:815PAHg3wvysy0SyIqanF8gZ0Y1wjk/hrDHD/iT88+Q= +github.com/consensys/gnark-crypto v0.5.3/go.mod h1:hOdPlWQV1gDLp7faZVeg8Y0iEPFaOUnCc4XeCCk96p0= github.com/containerd/aufs v0.0.0-20200908144142-dab0cbea06f4/go.mod h1:nukgQABAEopAHvB6j7cnP5zJ+/3aVcE7hCYqvIwAHyE= github.com/containerd/aufs v0.0.0-20201003224125-76a6863f2989/go.mod h1:AkGGQs9NM2vtYHaUen+NljV0/baGCAPELGm2q9ZXpWU= github.com/containerd/aufs v0.0.0-20210316121734-20793ff83c97/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= @@ -372,27 +323,22 @@ github.com/containerd/containerd v1.3.2/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMX github.com/containerd/containerd v1.4.0-beta.2.0.20200729163537-40b22ef07410/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= github.com/containerd/containerd v1.4.1/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= github.com/containerd/containerd v1.4.3/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.4.9/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= github.com/containerd/containerd v1.5.0-beta.1/go.mod h1:5HfvG1V2FsKesEGQ17k5/T7V960Tmcumvqn8Mc+pCYQ= github.com/containerd/containerd v1.5.0-beta.3/go.mod h1:/wr9AVtEM7x9c+n0+stptlo/uBBoBORwEx6ardVcmKU= github.com/containerd/containerd v1.5.0-beta.4/go.mod h1:GmdgZd2zA2GYIBZ0w09ZvgqEq8EfBp/m3lcVZIvPHhI= github.com/containerd/containerd v1.5.0-rc.0/go.mod h1:V/IXoMqNGgBlabz3tHD2TWDoTJseu1FGOKuoA4nNb2s= github.com/containerd/containerd v1.5.1/go.mod h1:0DOxVqwDy2iZvrZp2JUx/E+hS0UNTVn7dJnIOwtYR4g= github.com/containerd/containerd v1.5.7/go.mod h1:gyvv6+ugqY25TiXxcZC3L5yOeYgEw0QMhscqVp1AR9c= -github.com/containerd/containerd v1.5.8/go.mod h1:YdFSv5bTFLpG2HIYmfqDpSYYTDX+mc5qtSuYx1YUb/s= -github.com/containerd/containerd v1.6.2 h1:pcaPUGbYW8kBw6OgIZwIVIeEhdWVrBzsoCfVJ5BjrLU= -github.com/containerd/containerd v1.6.2/go.mod h1:sidY30/InSE1j2vdD1ihtKoJz+lWdaXMdiAeIupaf+s= +github.com/containerd/containerd v1.6.6 h1:xJNPhbrmz8xAMDNoVjHy9YHtWwEQNS+CDkcIRh7t8Y0= +github.com/containerd/containerd v1.6.6/go.mod h1:ZoP1geJldzCVY3Tonoz7b1IXk8rIX0Nltt5QE4OMNk0= github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= github.com/containerd/continuity v0.0.0-20190815185530-f2a389ac0a02/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= -github.com/containerd/continuity v0.0.0-20190827140505-75bee3e2ccb6/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= github.com/containerd/continuity v0.0.0-20191127005431-f65d91d395eb/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= github.com/containerd/continuity v0.0.0-20200710164510-efbc4488d8fe/go.mod h1:cECdGN1O8G9bgKTlLhuPJimka6Xb/Gg7vYzCTNVxhvo= github.com/containerd/continuity v0.0.0-20201208142359-180525291bb7/go.mod h1:kR3BEg7bDFaEddKm54WSmrol1fKWDU1nKYkgrcgZT7Y= github.com/containerd/continuity v0.0.0-20210208174643-50096c924a4e/go.mod h1:EXlVlkqNba9rJe3j7w3Xa924itAMLgZH4UD/Q4PExuQ= github.com/containerd/continuity v0.1.0/go.mod h1:ICJu0PwR54nI0yPEnJ6jcS+J7CZAUXrLh8lPo2knzsM= -github.com/containerd/continuity v0.2.1/go.mod h1:wCYX+dRqZdImhGucXOqTQn05AhX6EUDaGEMUzTFFpLg= -github.com/containerd/continuity v0.2.2 h1:QSqfxcn8c+12slxwu00AtzXrsami0MJb/MQs9lOLHLA= -github.com/containerd/continuity v0.2.2/go.mod h1:pWygW9u7LtS1o4N/Tn0FoCFDIXZ7rxcMX7HX1Dmibvk= +github.com/containerd/continuity v0.3.0 h1:nisirsYROK15TAMVukJOUyGJjz4BNQJBVsNvAXZJ/eg= github.com/containerd/fifo v0.0.0-20180307165137-3d5202aec260/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= github.com/containerd/fifo v0.0.0-20200410184934-f15a3290365b/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= @@ -401,8 +347,6 @@ github.com/containerd/fifo v0.0.0-20210316144830-115abcc95a1d/go.mod h1:ocF/ME1S github.com/containerd/fifo v1.0.0/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= github.com/containerd/go-cni v1.0.1/go.mod h1:+vUpYxKvAF72G9i1WoDOiPGRtQpqsNW/ZHtSlv++smU= github.com/containerd/go-cni v1.0.2/go.mod h1:nrNABBHzu0ZwCug9Ije8hL2xBCYh/pjfMb1aZGrrohk= -github.com/containerd/go-cni v1.1.0/go.mod h1:Rflh2EJ/++BA2/vY5ao3K6WJRR/bZKsX123aPk+kUtA= -github.com/containerd/go-cni v1.1.3/go.mod h1:Rflh2EJ/++BA2/vY5ao3K6WJRR/bZKsX123aPk+kUtA= github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= github.com/containerd/go-runc v0.0.0-20190911050354-e029b79d8cda/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= github.com/containerd/go-runc v0.0.0-20200220073739-7016d3ce2328/go.mod h1:PpyHrqVs8FTi9vpyHwPwiNEGaACDxT/N/pLcvMSRA9g= @@ -412,7 +356,6 @@ github.com/containerd/imgcrypt v1.0.1/go.mod h1:mdd8cEPW7TPgNG4FpuP3sGBiQ7Yi/zak github.com/containerd/imgcrypt v1.0.4-0.20210301171431-0ae5c75f59ba/go.mod h1:6TNsg0ctmizkrOgXRNQjAPFWpMYRWuiB6dSF4Pfa5SA= github.com/containerd/imgcrypt v1.1.1-0.20210312161619-7ed62a527887/go.mod h1:5AZJNI6sLHJljKuI9IHnw1pWqo/F0nGDOuR9zgTs7ow= github.com/containerd/imgcrypt v1.1.1/go.mod h1:xpLnwiQmEUJPvQoAapeb2SNCxz7Xr6PJrXQb0Dpc4ms= -github.com/containerd/imgcrypt v1.1.3/go.mod h1:/TPA1GIDXMzbj01yd8pIbQiLdQxed5ue1wb8bP7PQu4= github.com/containerd/nri v0.0.0-20201007170849-eb1350a75164/go.mod h1:+2wGSDGFYfE5+So4M5syatU0N0f0LbWpuqyMi4/BE8c= github.com/containerd/nri v0.0.0-20210316161719-dbaa18c31c14/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= github.com/containerd/nri v0.1.0/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= @@ -435,62 +378,43 @@ github.com/containerd/zfs v1.0.0/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNR github.com/containernetworking/cni v0.7.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= github.com/containernetworking/cni v0.8.0/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= github.com/containernetworking/cni v0.8.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= -github.com/containernetworking/cni v1.0.1/go.mod h1:AKuhXbN5EzmD4yTNtfSsX3tPcmtrBI6QcRV0NiNt15Y= github.com/containernetworking/plugins v0.8.6/go.mod h1:qnw5mN19D8fIwkqW7oHHYDHVlzhJpcY6TQxn/fUyDDM= github.com/containernetworking/plugins v0.9.1/go.mod h1:xP/idU2ldlzN6m4p5LmGiwRDjeJr6FLK6vuiUwoH7P8= -github.com/containernetworking/plugins v1.0.1/go.mod h1:QHCfGpaTwYTbbH+nZXKVTxNBDZcxSOplJT5ico8/FLE= github.com/containers/ocicrypt v1.0.1/go.mod h1:MeJDzk1RJHv89LjsH0Sp5KTY3ZYkjXO/C+bKAeWFIrc= github.com/containers/ocicrypt v1.1.0/go.mod h1:b8AOe0YR67uU8OqfVNcznfFpAzu3rdgUV4GP9qXPfu4= github.com/containers/ocicrypt v1.1.1/go.mod h1:Dm55fwWm1YZAjYRaJ94z2mfZikIyIN4B0oB3dj3jFxY= -github.com/containers/ocicrypt v1.1.2/go.mod h1:Dm55fwWm1YZAjYRaJ94z2mfZikIyIN4B0oB3dj3jFxY= 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= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-iptables v0.4.5/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= github.com/coreos/go-iptables v0.5.0/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= -github.com/coreos/go-iptables v0.6.0/go.mod h1:Qe8Bv2Xik5FyTXwgIbLAnv2sWSBmvWdFETJConOQ//Q= github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20161114122254-48702e0da86b/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= 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.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= 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.44.2/go.mod h1:fwQJdw+aECatpTvQTo1tSfHEsxACdZYU80QCZUPnHr4= -github.com/cosmos/cosmos-sdk v0.44.3/go.mod h1:bA3+VenaR/l/vDiYzaiwbWvRPWHMBX2jG0ygiFtiBp0= -github.com/cosmos/cosmos-sdk v0.44.4/go.mod h1:0QTCOkE8IWu5LZyfnbbjFjxYRIcV4pBOr7+zPpJwl58= -github.com/cosmos/cosmos-sdk v0.44.5/go.mod h1:maUA6m2TBxOJZkbwl0eRtEBgTX37kcaiOWU5t1HEGaY= -github.com/cosmos/cosmos-sdk v0.45.1/go.mod h1:XXS/asyCqWNWkx2rW6pSuen+EVcpAFxq6khrhnZgHaQ= -github.com/cosmos/cosmos-sdk v0.45.2/go.mod h1:DhSVBqJkhjB694w99FudptzPhU0XHd/qcyiNCLOjkds= -github.com/cosmos/cosmos-sdk v0.45.3/go.mod h1:qYm5JEr0ZlbnmoP/Q3b+dYMOliHf4ddHirpILiwZzqg= -github.com/cosmos/cosmos-sdk v0.45.4 h1:eStDAhJdMY8n5arbBRe+OwpNeBSunxSBHp1g55ulfdA= -github.com/cosmos/cosmos-sdk v0.45.4/go.mod h1:WOqtDxN3eCCmnYLVla10xG7lEXkFjpTaqm2a2WasgCc= +github.com/cosmos/cosmos-proto v1.0.0-alpha7 h1:yqYUOHF2jopwZh4dVQp3xgqwftE5/2hkrwIV6vkUbO0= +github.com/cosmos/cosmos-proto v1.0.0-alpha7/go.mod h1:dosO4pSAbJF8zWCzCoTWP7nNsjcvSUBQmniFxDg5daw= +github.com/cosmos/cosmos-sdk v0.46.1 h1:7vUZXMyrmEb4xtBYpz1TobtrcnpgiZTi+tVjc0XWB4o= +github.com/cosmos/cosmos-sdk v0.46.1/go.mod h1:2+o8Qw8qnE02V+lQVZDJFQ8tri/hsiA5GmWaPERqVa0= 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.15.0-rc3.0.20201009144442-230e9bdf52cd/go.mod h1:3xOIaNNX19p0QrX0VqWa6voPRoJRGGYtny+DH8NEPvE= -github.com/cosmos/iavl v0.15.0-rc5/go.mod h1:WqoPL9yPTQ85QBMT45OOUzPxG/U/JcJoN7uMjgxke/I= -github.com/cosmos/iavl v0.15.3/go.mod h1:OLjQiAQ4fGD2KDZooyJG9yz+p2ao2IAYSbke8mVvSA4= -github.com/cosmos/iavl v0.17.1/go.mod h1:7aisPZK8yCpQdy3PMvKeO+bhq1NwDjUwjzxwwROUxFk= -github.com/cosmos/iavl v0.17.2/go.mod h1:prJoErZFABYZGDHka1R6Oay4z9PrNeFFiMKHDAMOi4w= -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 v1.2.2 h1:bs6TZ8Es1kycIu2AHlRZ9dzJ+mveqlLN/0sjWtRH88o= -github.com/cosmos/ibc-go v1.2.2/go.mod h1:XmYjsRFOs6Q9Cz+CSsX21icNoH27vQKb3squgnCOCbs= -github.com/cosmos/ibc-go/v2 v2.0.2/go.mod h1:XUmW7wmubCRhIEAGtMGS+5IjiSSmcAwihoN/yPGd6Kk= -github.com/cosmos/ibc-go/v2 v2.0.3/go.mod h1:XUmW7wmubCRhIEAGtMGS+5IjiSSmcAwihoN/yPGd6Kk= -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.1 h1:3gaq9b6SjiB0KBTygRnAvEGml2pQlu1TH8uma5g63Ys= +github.com/cosmos/iavl v0.19.1/go.mod h1:X9PKD3J0iFxdmgNLa7b2LYWdsGd90ToV5cAONApkEPw= +github.com/cosmos/ibc-go/v5 v5.0.0-rc1 h1:9cgpYmHh2jodB/t3LwB/pYA2sG9rdKB9cmXP0D5M0Fs= +github.com/cosmos/ibc-go/v5 v5.0.0-rc1/go.mod h1:Wqsguq98Iuns8tgTv8+xaGYbC+Q8zJfbpjzT6IgMJbs= github.com/cosmos/ledger-cosmos-go v0.11.1 h1:9JIYsGnXP613pb2vPjFeMMjBI5lEDsEaF6oYorTy6J4= github.com/cosmos/ledger-cosmos-go v0.11.1/go.mod h1:J8//BsAGTo3OC/vDLjMRFLW6q0WAaXvHnVc7ZmE8iUY= github.com/cosmos/ledger-go v0.9.2 h1:Nnao/dLwaVTk1Q5U9THldpUMMXU94BOTWPddSmVB6pI= @@ -498,46 +422,50 @@ github.com/cosmos/ledger-go v0.9.2/go.mod h1:oZJ2hHAZROdlHiwTg4t7kP+GKIIkBT+o6c9 github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/creachadair/taskgroup v0.3.2 h1:zlfutDS+5XG40AOxcHDSThxKzns8Tnr9jnr6VqkYlkM= +github.com/creachadair/taskgroup v0.3.2/go.mod h1:wieWwecHVzsidg2CsUnFinW1faVN4+kq+TDlRJQ0Wbk= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= 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/d2g/dhcp4 v0.0.0-20170904100407-a1d1b6c41b1c/go.mod h1:Ct2BUK8SB0YC1SMSibvLzxjeJLnrYEVLULFNiHY9YfQ= github.com/d2g/dhcp4client v1.0.0/go.mod h1:j0hNfjhrt2SxUOw55nL0ATM/z4Yt3t2Kd1mW34z5W5s= github.com/d2g/dhcp4server v0.0.0-20181031114812-7d4a0a7f59a5/go.mod h1:Eo87+Kg/IX2hfWJfwxMzLyuSZyxSoAug2nGa1G2QAi8= github.com/d2g/hardwareaddr v0.0.0-20190221164911-e7d9fbe030e4/go.mod h1:bMl4RjIciD2oAxI7DmWRx6gbeqrkoLqv3MV0vzNad+I= -github.com/daixiang0/gci v0.2.9/go.mod h1:+4dZ7TISfSmqfAGv59ePaHfNzgGtIkHAhhdKggP1JAc= -github.com/danieljoos/wincred v1.0.2 h1:zf4bhty2iLuwgjgpraD2E9UbvO+fe54XXGJbOwe23fU= -github.com/danieljoos/wincred v1.0.2/go.mod h1:SnuYRW9lp1oJrZX/dXJqr0cPK5gYXqx3EJbmjhLdK9U= -github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964/go.mod h1:Xd9hchkHSWYkEqJwUGisez3G1QY8Ryz0sdWrLPMGjLk= -github.com/davecgh/go-spew v0.0.0-20161028175848-04cdfd42973b/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/danieljoos/wincred v1.1.2 h1:QLdCxFs1/Yl4zduvBdcHB8goaYk9RARS2SgLLRuAyr0= +github.com/danieljoos/wincred v1.1.2/go.mod h1:GijpziifJoIBfYh+S7BbkdUTU4LfM+QnGqR5Vl2tAx0= +github.com/dave/jennifer v1.2.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhrIygKg= 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/deckarep/golang-set v1.8.0/go.mod h1:5nI87KwE7wgsBU1F4GKAw2Qod7p5kyS383rP6+o6qqo= +github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= -github.com/denis-tingajkin/go-header v0.4.2/go.mod h1:eLRHAVXzE5atsKAnNRDB90WHCFFnBUn4RN0nRcs1LJA= -github.com/denisenkom/go-mssqldb v0.12.0/go.mod h1:iiK0YP1ZeepvmBQk/QpLEhhTNJgfzrpArPY/aFvc9yU= +github.com/deepmap/oapi-codegen v1.6.0/go.mod h1:ryDa9AgbELGeB+YEXE1dR53yAjHwFvE9iAUlWl9Al3M= +github.com/deepmap/oapi-codegen v1.8.2/go.mod h1:YLgSKSDv/bZQB7N4ws6luhozi3cEdRktEqrX88CvjIw= github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= 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.1/go.mod h1:26P/7fbL4kUZVEVKLAKXkBXKOydDmM2p1e+NhhnBCAE= -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 v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-bitstream v0.0.0-20180413035011-3522498ce2c8/go.mod h1:VMaSuZ+SZcx/wljOQKvp5srsbCiKDEb6K2wC4+PiBmQ= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y= github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= 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/dlclark/regexp2 v1.4.1-0.20201116162257-a2a8dda75c91/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= +github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= github.com/docker/cli v0.0.0-20191017083524-a8ff7f821017/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/distribution v0.0.0-20190905152932-14b96e55d84c/go.mod h1:0+TTO4EOBfRPhZXAeF1Vu+W3hHZ8eLp8PgKVZlcvtFY= @@ -545,8 +473,8 @@ github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/docker v1.4.2-0.20180625184442-8e610b2b55bf/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker v1.4.2-0.20190924003213-a8608b5b67c7/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v20.10.7+incompatible h1:Z6O9Nhsjv+ayUEeI1IojKbYcsGdgYSNqxe1s2MYzUhQ= -github.com/docker/docker v20.10.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v20.10.17+incompatible h1:JYCuMrWaVNophQTOrMMoSwudOVEfcegoZZrleKc1xwE= +github.com/docker/docker v20.10.17+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= @@ -559,18 +487,18 @@ github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDD github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/dop251/goja v0.0.0-20200721192441-a695b0cdd498/go.mod h1:Mw6PkjjMXWbTj+nnj4s3QPXq1jaT0s5pC0iFD4+BOAA= +github.com/dop251/goja v0.0.0-20211011172007-d99e4b8cbf48/go.mod h1:R9ET47fwRVRPZnOGvHxxhuZcbrMCuiqOz3Rlrh4KSnk= +github.com/dop251/goja_nodejs v0.0.0-20210225215109-d91c329300e7/go.mod h1:hn7BA7c8pLvoGndExHudxTDKZ84Pyvv+90pbBjbTz0Y= github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac h1:opbrjaN/L8gg6Xh5D04Tem+8xVcz6ajZlGCs49mQgyg= github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/dvsekhvalnov/jose2go v0.0.0-20200901110807-248326c1351b h1:HBah4D48ypg3J7Np4N+HY/ZR76fx3HEUGxDU6Uk39oQ= -github.com/dvsekhvalnov/jose2go v0.0.0-20200901110807-248326c1351b/go.mod h1:7BvyPhdbLxMXIYTFPLsyJRFMsKmOZnQmzh6Gb+uquuM= -github.com/dvyukov/go-fuzz v0.0.0-20200318091601-be3528f3a813/go.mod h1:11Gm+ccJnvAhCNLlf5+cS9KjtbaD5I5zaZpFMsTHWTw= +github.com/dvsekhvalnov/jose2go v1.5.0 h1:3j8ya4Z4kMCwT5nXIKFSV84YS+HdqSSO0VsTQxaLAeM= +github.com/dvsekhvalnov/jose2go v1.5.0/go.mod h1:QsHjhyTlD/lAVqn/NSbVZmSCGeDehTB/mPZadG+mhXU= github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= -github.com/edsrzf/mmap-go v0.0.0-20160512033002-935e0e8a636c/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= +github.com/eclipse/paho.mqtt.golang v1.2.0/go.mod h1:H9keYFcgq3Qr5OUJm/JZI/i6U7joQ8SYLhZwfeOo6Ts= github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= @@ -579,57 +507,46 @@ github.com/emicklei/proto v1.9.0 h1:l0QiNT6Qs7Yj0Mb4X6dnWBQer4ebei2BFcgQLbGqUDc= github.com/emicklei/proto v1.9.0/go.mod h1:rn1FgRS/FANiZdD2djyH7TMA9jdRDcYQ9IEN9yvjX0A= github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg= github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= -github.com/enigmampc/btcutil v1.0.3-0.20200723161021-e2fb6adb2a25/go.mod h1:hTr8+TLQmkUkgcuh3mcr5fjrT9c64ZzsBCdCEC6UppY= +github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.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/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= +github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= +github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= github.com/envoyproxy/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.2/go.mod h1:yZqNJUrNn20K8Q9n2CrjTKYyVEmX209Hgu+M1LBpeZE= -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/ethereum/go-ethereum v1.10.17/go.mod h1:Lt5WzjM07XlXc95YzrhosmR4J9Ahd6X2wyEV2SvGhk0= github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/facebookgo/ensure v0.0.0-20160127193407-b4ab57deab51/go.mod h1:Yg+htXGokKKdzcwhuNDwVvN+uBxDGXJ7G/VN1d8fa64= github.com/facebookgo/ensure v0.0.0-20200202191622-63f1cf65ac4c h1:8ISkoahWXwZR41ois5lSJBSVw4D0OV19Ht/JSTzvSv0= -github.com/facebookgo/ensure v0.0.0-20200202191622-63f1cf65ac4c/go.mod h1:Yg+htXGokKKdzcwhuNDwVvN+uBxDGXJ7G/VN1d8fa64= github.com/facebookgo/stack v0.0.0-20160209184415-751773369052 h1:JWuenKqqX8nojtoVVWjGfOF9635RETekkoH6Cc9SX0A= -github.com/facebookgo/stack v0.0.0-20160209184415-751773369052/go.mod h1:UbMTZqLaRiH3MsBH8va0n7s1pQYcu3uTb8G4tygF4Zg= -github.com/facebookgo/subset v0.0.0-20150612182917-8dac2c3c4870/go.mod h1:5tD+neXqOorC30/tWg0LCSkrqj/AR6gu8yY8/fpw1q0= github.com/facebookgo/subset v0.0.0-20200203212716-c811ad88dec4 h1:7HZCaLC5+BZpmbhCOZJ293Lz68O7PYrF2EzeiFMwCLk= -github.com/facebookgo/subset v0.0.0-20200203212716-c811ad88dec4/go.mod h1:5tD+neXqOorC30/tWg0LCSkrqj/AR6gu8yY8/fpw1q0= -github.com/fatih/color v1.3.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= 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 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= -github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= github.com/felixge/httpsnoop v1.0.1 h1:lvB5Jl89CsZtGIWuTcDM1E/vkVs49/Ml7JJe07l8SPQ= github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/fjl/memsize v0.0.0-20180418122429-ca190fb6ffbc/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= +github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= -github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= -github.com/franela/goblin v0.0.0-20210519012713-85d372ac71e2/go.mod h1:VzmDKDJVZI3aJmnRI9VjAn9nJ8qPPsN1fqzr9dqInIo= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= +github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI= -github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= +github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= +github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA= -github.com/fullstorydev/grpcurl v1.6.0/go.mod h1:ZQ+ayqbKMJNhzLmbpCiurTVlaK2M/3nqZCxaQ2Ze/sM= -github.com/fzipp/gocyclo v0.3.1/go.mod h1:DJHO6AUmbdqj2ET4Z9iArSuwWgYDRryYt2wASxc7x3E= github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= -github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= +github.com/getkin/kin-openapi v0.53.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= +github.com/getkin/kin-openapi v0.61.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= @@ -637,10 +554,11 @@ github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= github.com/gin-gonic/gin v1.7.0 h1:jGB9xAJQ12AIGNB4HguylppmDK1Am9ppF7XnGXXJuoU= -github.com/gin-gonic/gin v1.7.0/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY= github.com/gliderlabs/ssh v0.2.2 h1:6zsha5zo/TWhRhwqCD3+EarCAgZ2yN28ipRnGPnwkI0= github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= -github.com/go-critic/go-critic v0.5.6/go.mod h1:cVjj0DfqewQVIlIAGexPCaGaZDAqGE29PYDDADIVNEo= +github.com/glycerine/go-unsnap-stream v0.0.0-20180323001048-9f0cb55181dd/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE= +github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24= +github.com/go-chi/chi/v5 v5.0.0/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJpoZOs= github.com/go-git/gcfg v1.5.0 h1:Q5ViNfGF8zFgyJWPqYwA7qGFoMTEiBmdlkcfRmpIMa4= github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E= github.com/go-git/go-billy/v5 v5.0.0 h1:7NQHvd9FVid8VL4qVUMm8XifBK+2xCoZ2lSk0agRrHM= @@ -659,8 +577,9 @@ 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= @@ -668,14 +587,7 @@ github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNV github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.1/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/stdr v1.2.0/go.mod h1:YkVgnZu1ZjjL7xTxrfm/LLZBfkhTqSR1ydtm6jTKKwI= -github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= -github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= @@ -683,13 +595,11 @@ github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34 github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= 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= @@ -698,44 +608,10 @@ github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+ github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= 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-sourcemap/sourcemap v2.1.3+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-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= 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/astfmt v1.0.0/go.mod h1:cnWmsOAuq4jJY6Ct5YWlVLmcmLMn1JUPuQIHCY7CJDw= -github.com/go-toolsmith/astinfo v0.0.0-20180906194353-9809ff7efb21/go.mod h1:dDStQCHtmZpYOmjRP/8gHHnCCch3Zz3oEgCdZVdtweU= -github.com/go-toolsmith/astp v1.0.0/go.mod h1:RSyrtpVlfTFGDYRbrjyWP1pYu//tSFcvdYrA8meBmLI= -github.com/go-toolsmith/pkgload v1.0.0/go.mod h1:5eFArkbO80v7Z0kdngIxsRXRMTaX4Ilcwuh3clNrQJc= -github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8= -github.com/go-toolsmith/typep v1.0.0/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= -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/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= -github.com/gobuffalo/envy v1.7.1/go.mod h1:FurDp9+EDPE4aIUS3ZLyD+7/9fpx7YRt/ukY6jIHf0w= -github.com/gobuffalo/envy v1.8.1/go.mod h1:FurDp9+EDPE4aIUS3ZLyD+7/9fpx7YRt/ukY6jIHf0w= -github.com/gobuffalo/envy v1.9.0/go.mod h1:FurDp9+EDPE4aIUS3ZLyD+7/9fpx7YRt/ukY6jIHf0w= -github.com/gobuffalo/flect v0.2.0/go.mod h1:W3K3X9ksuZfir8f/LrfVtWmCDQFfayuylOJ7sz/Fj80= -github.com/gobuffalo/genny v0.6.0/go.mod h1:Vigx9VDiNscYpa/LwrURqGXLSIbzTfapt9+K6gF1kTA= -github.com/gobuffalo/github_flavored_markdown v1.1.0/go.mod h1:TSpTKWcRTI0+v7W3x8dkSKMLJSUpuVitlptCkpeY8ic= -github.com/gobuffalo/helpers v0.5.0/go.mod h1:stpgxJ2C7T99NLyAxGUnYMM2zAtBk5NKQR0SIbd05j4= -github.com/gobuffalo/here v0.6.0/go.mod h1:wAG085dHOYqUpf+Ap+WOdrPTp5IYcDAs/x7PLa8Y5fM= -github.com/gobuffalo/logger v1.0.1/go.mod h1:2zbswyIUa45I+c+FLXuWl9zSWEiVuthsk8ze5s8JvPs= -github.com/gobuffalo/logger v1.0.3/go.mod h1:SoeejUwldiS7ZsyCBphOGURmWdwUFXs0J7TCjEhjKxM= -github.com/gobuffalo/packd v0.3.0/go.mod h1:zC7QkmNkYVGKPw4tHpBQ+ml7W/3tIebgeo1b36chA3Q= -github.com/gobuffalo/packr/v2 v2.7.1/go.mod h1:qYEvAazPaVxy7Y7KR0W8qYEE+RymX74kETFqjFoFlOc= -github.com/gobuffalo/plush v3.8.3+incompatible/go.mod h1:rQ4zdtUUyZNqULlc6bqd5scsPfLKfT0+TGMChgduDvI= -github.com/gobuffalo/plushgen v0.1.2/go.mod h1:3U71v6HWZpVER1nInTXeAwdoRNsRd4W8aeIa1Lyp+Bk= -github.com/gobuffalo/tags v2.1.7+incompatible/go.mod h1:9XmhOkyaB7UzvuY4UoZO4s67q8/xRMVJEaakauVQYeY= -github.com/gobuffalo/uuid v2.0.5+incompatible/go.mod h1:ErhIzkRhm0FtRuiE/PeORqcw4cVi1RtSpnwYrxuvkfE= -github.com/gobuffalo/validate v2.0.3+incompatible/go.mod h1:N+EtDe0J8252BgfzQUChBgfd6L93m9weay53EWFVsMM= -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= @@ -752,17 +628,17 @@ github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2/go.mod h1:bBOAhwG1umN6 github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= 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 v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/gofrs/uuid v3.3.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/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/googleapis v1.2.0/go.mod h1:Njal3psf3qN6dwBtQfUmBZh2ybovJ0tlu3o/AC7HYjU= github.com/gogo/googleapis v1.4.0/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= -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-jwt/jwt/v4 v4.3.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= +github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ= github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -771,6 +647,7 @@ github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4er github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= @@ -780,7 +657,6 @@ 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= @@ -801,26 +677,15 @@ github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -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/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-20180628070357-927a3d87b613/go.mod h1:SyvUF2NxV+sN8upjjeVYr5W7tyxaT1JVtvhKhOn2ii8= -github.com/golangci/gofmt v0.0.0-20190930125516-244bba706f1a/go.mod h1:9qCChq59u/eW8im404Q2WWTrnBUQKjpNYKMbU4M7EFU= -github.com/golangci/golangci-lint v1.42.1/go.mod h1:MuInrVlgg2jq4do6XI1jbkErbVHVbwdrLLtGv6p2wPI= -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-20210208091834-cd28932614b5/go.mod h1:LK+zW4MpyytAWQRz0M4xnzEk50lSvqDQKfx304apFkY= -github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4/go.mod h1:Izgrg8RkN3rCIMLGE9CyYmU9pY2Jer6DgANEnZ/L/cQ= +github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4= github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= -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/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= 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= @@ -837,18 +702,16 @@ github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8 github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-containerregistry v0.5.1/go.mod h1:Ct15B4yir3PLOP5jsy0GNeYVaIZs/MK/Jz5any1wFW0= -github.com/google/go-github/v37 v37.0.0/go.mod h1:LM7in3NmXDrX58GbEHy7FtNLbI2JijX93RnMKvWG3m4= -github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= 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.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.1.1-0.20200604201612-c04b05f3adfa/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= -github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/goterm v0.0.0-20190703233501-fc88cf888a3f/go.mod h1:nOFQdrUlIlx6M6ODdSpBj1NVA+VgLC6kmw60mkw34H4= +github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.2.1 h1:d8MncMlErDFTwQGBK1xhv026j9kqhvw1Qv9IbWT1VLQ= github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/orderedcode v0.0.1 h1:UzfcAexk9Vhv8+9pNOgRu41f16lHq725vPwnSeiG/Us= github.com/google/orderedcode v0.0.1/go.mod h1:iVyU4/qPKHY5h/wSd6rZZCDcLJNxiWO6dvsYES2Sb20= @@ -858,7 +721,6 @@ 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= @@ -869,29 +731,30 @@ github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLe 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/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.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa h1:7MYGT2XEMam7Mtzv1yDUYXANedWvwk3HKkR3MyGowy8= +github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= 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 h1:dS9eYAjhrE2RjmzYw2XAPvcXfmcQLtFEQWn0CR82awk= +github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= -github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU= -github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97DwqyJO1AENw9kA= +github.com/googleapis/go-type-adapters v1.0.0 h1:9XdMn+d/G57qq1s8dNc5IesGCXHf6V2HZ2JwRxfA2tA= +github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= -github.com/gookit/color v1.4.2/go.mod h1:fqRyamkC1W8uxl+lxCQxOT09l/vYfZ+QeiX3rKQHCoQ= github.com/gookit/color v1.5.0 h1:1Opow3+BWDwqor78DcJkJCIwnkviFi+rrOANki9BUFw= 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-20210225214923-2e10b2664254/go.mod h1:M9mZEtGIsR1oDaZagNPNG9iq9n2HrhZ17dsXk73V3Lw= -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/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c= github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= @@ -900,29 +763,16 @@ github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2z github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/rpc v1.2.0/go.mod h1:V4h9r+4sF5HnzqbwIez0fKSpANP0zlYd3qR7p36jkTQ= github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.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/comment v1.3.0/go.mod h1:xMicKDx7XRXYdVwY9f9wQpDJVnqWxw9wCauCMKp+IBI= -github.com/gostaticanalysis/comment v1.4.1/go.mod h1:ih6ZxzTHLdadaiSnF5WY3dxUoXfXAlTaRzuaNDlSado= -github.com/gostaticanalysis/forcetypeassert v0.0.0-20200621232751-01d4955beaa5/go.mod h1:qZEedyP/sY1lTGV1uJ3VhWZ2mqag3IkWsDHVbplHXak= -github.com/gostaticanalysis/nilerr v0.1.1/go.mod h1:wZYb6YI5YAxxq0i1+VJbY0s2YONW0HU0GPE3+5PWN4A= -github.com/gotestyourself/gotestyourself v2.2.0+incompatible/go.mod h1:zZKM6oeNM8k+FRljX1mnzVYeS8wiGgQyvST1/GafPbY= -github.com/graph-gophers/graphql-go v0.0.0-20191115155744-f33e81362277/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= +github.com/graph-gophers/graphql-go v1.3.0/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -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.1/go.mod h1:EaizFBKfUKtMIF5iaDEhniwNedqGo9FuLFzppDr3uwI= github.com/grpc-ecosystem/go-grpc-middleware v1.2.2/go.mod h1:EaizFBKfUKtMIF5iaDEhniwNedqGo9FuLFzppDr3uwI= github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= @@ -930,11 +780,8 @@ 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.14.7/go.mod h1:oYZKL012gGh6LMyg/xA7Q2yq6j8bu0wa+9w14EEthWU= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.10.0/go.mod h1:XnLCLFp3tjoZJszVKjfpyAK6J8sYIcQXWQxmqLWF21I= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c/go.mod h1:NMPJylDgVpX0MLRlPy15sqSwOFv/U1GZ2m21JhFfek0= github.com/gtank/merlin v0.1.1-0.20191105220539-8318aed1a79f/go.mod h1:T86dnYJhcGOh5BjZFCJWTDeTK7XW8uE+E21Cy/bIQ+s= @@ -942,121 +789,106 @@ github.com/gtank/merlin v0.1.1 h1:eQ90iG7K9pOhtereWsmyRJ6RAwcP4tHTDBHXNg+u5is= github.com/gtank/merlin v0.1.1/go.mod h1:T86dnYJhcGOh5BjZFCJWTDeTK7XW8uE+E21Cy/bIQ+s= github.com/gtank/ristretto255 v0.1.2 h1:JEqUCPA1NvLq5DwYtuzigd7ss8fwbYay9fi4/5uMzcc= github.com/gtank/ristretto255 v0.1.2/go.mod h1:Ph5OpO6c7xKUGROZfWVLiJf9icMDwUeIvY4OmlYW69o= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= -github.com/hashicorp/consul/api v1.10.1/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= -github.com/hashicorp/consul/api v1.11.0/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= -github.com/hashicorp/consul/api v1.12.0/go.mod h1:6pVBMo0ebnYdt2S3H87XhekM/HHrUoTD2XXb/VrZVy0= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0= github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-hclog v0.16.2/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-hclog v1.0.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-getter v1.6.1 h1:NASsgP4q6tL94WH6nJxKWj8As2H/2kop/bB1d8JMyRY= +github.com/hashicorp/go-getter v1.6.1/go.mod h1:IZCrswsZPeWv9IkVnLElzRU/gz/QPi6pZHn4tv6vbwA= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= -github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= +github.com/hashicorp/go-safetemp v1.0.0 h1:2HR189eFNrjHQyENnQMMpCiBAsRxzbTMIgBhEyExpmo= +github.com/hashicorp/go-safetemp v1.0.0/go.mod h1:oaerMy3BhqiTbVye6QuFhFtIceqFoDHxNAB65b+Rj1I= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.1 h1:fv1ep09latC32wFoVwnqcnKJGnMSdBanPczbHAYm1BE= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-version v1.1.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= +github.com/hashicorp/go-version v1.6.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= github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY= -github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= -github.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk= -github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= -github.com/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/hinshun/vt10x v0.0.0-20180616224451-1954e6464174/go.mod h1:DqJ97dSdRW1W22yXSB90986pcOyQ7r45iio1KN2ez1A= -github.com/holiman/uint256 v1.1.1/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= +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/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= +github.com/holiman/uint256 v1.2.0/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/huandu/xstrings v1.0.0/go.mod h1:4qWG/gcEcfX4z/mBDHJ++3ReCw9ibxbsNJbcucJdbSo= -github.com/huandu/xstrings v1.2.0/go.mod h1:DvyZB1rfVYsBIigL8HwpZgxHwXozlTgGqn63UyNX5k4= github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= -github.com/hudl/fargo v1.4.0/go.mod h1:9Ai6uvFy5fQNq6VPKtg+Ceq1+eTY4nKUlR2JElEOcDo= -github.com/huin/goupnp v1.0.0/go.mod h1:n9v9KO1tAxYH82qOn+UTIFQDmx5n1Zxd/ClZDMX7Bnc= +github.com/huin/goupnp v1.0.3-0.20220313090229-ca81a64b4204/go.mod h1:ZxNlw5WqJj6wSsRK5+YfflQGXYfccj5VgQsMNixHM7Y= github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= github.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0= github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.4/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.9/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/improbable-eng/grpc-web v0.14.1 h1:NrN4PY71A6tAz2sKDvC5JCauENWp0ykG8Oq1H3cpFvw= -github.com/improbable-eng/grpc-web v0.14.1/go.mod h1:zEjGHa8DAlkoOXmswrNvhUGEYQA9UI7DhrGeHR1DMGU= +github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= +github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= +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 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/influxdata/influxdb v1.2.3-0.20180221223340-01288bdb0883/go.mod h1:qZna6X/4elxqT3yI9iZYdZrWWdeFOOprn86kgg4+IzY= +github.com/influxdata/flux v0.65.1/go.mod h1:J754/zds0vvpfwuq7Gc2wRdVwEodfpCFM7mYlOw2LqY= +github.com/influxdata/influxdb v1.8.3/go.mod h1:JugdFhsvvI8gadxOI6noqNeeBHvWNTbfYGtiAn+2jhI= +github.com/influxdata/influxdb-client-go/v2 v2.4.0/go.mod h1:vLNHdxTJkIf2mSLvGrpj8TCcISApPoXkaxP8g9uRlW8= 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/intel/goresctrl v0.2.0/go.mod h1:+CZdzouYFn5EsxgqAQTEzMfwKwuc0fVdMrT9FCCAVRQ= +github.com/influxdata/influxql v1.1.1-0.20200828144457-65d3ef77d385/go.mod h1:gHp9y86a/pxhjJ+zMjNXiQAA197Xk9wLxaz+fGG+kWk= +github.com/influxdata/line-protocol v0.0.0-20180522152040-32c6aa80de5e/go.mod h1:4kt73NQhadE3daL3WhR5EJ/J2ocX0PZzwxQ0gXJ7oFE= +github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= +github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= +github.com/influxdata/promql/v2 v2.12.0/go.mod h1:fxOPu+DY0bqCTCECchSRtWfc+0X19ybifQhZoQNF5D8= +github.com/influxdata/roaring v0.4.13-0.20180809181101-fc520f41fab6/go.mod h1:bSgUQ7q5ZLSO+bKBGqJiCBGAl+9DxyW63zLTujjUlOE= +github.com/influxdata/tdigest v0.0.0-20181121200506-bf2b5ad3c0a9/go.mod h1:Js0mqiSBE6Ffsg94weZZ2c+v/ciT8QRHFOap7EKDrR0= +github.com/influxdata/usage-client v0.0.0-20160829180054-6d3895376368/go.mod h1:Wbbw6tYNvwa5dlB6304Sd+82Z3f7PmVZHVKU637d4po= github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= -github.com/j-keck/arping v1.0.2/go.mod h1:aJbELhR92bSk7tp79AWM/ftfc90EfEi2bQJrbBFOsPw= -github.com/jackpal/go-nat-pmp v1.0.2-0.20160603034137-1fa385a6f458/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= +github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= github.com/jedisct1/go-minisign v0.0.0-20190909160543-45766022959e/go.mod h1:G1CVv03EnqU1wYL2dFwXxW2An0az9JTl/ZsqXQeBlkU= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jgautheron/goconst v1.5.1/go.mod h1:aAosetZ5zaeC/2EfMeRswtxUFBpe2Hr7HzkgX4fanO4= -github.com/jhump/protoreflect v1.6.1/go.mod h1:RZQ/lnuN+zqeRVpQigTwO6o0AJUkxbnSnpuG7toUTG4= -github.com/jhump/protoreflect v1.9.0 h1:npqHz788dryJiR/l6K/RUQAyh2SwV91+d1dnh4RjO9w= -github.com/jhump/protoreflect v1.9.0/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg= -github.com/jingyugao/rowserrcheck v1.1.0/go.mod h1:TOQpc2SLx6huPfoFGK3UOnEG+u02D3C1GeosjupAKCA= -github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af/go.mod h1:HEWGJkRDzjJY2sqdDwxccsGicWEf9BQOZsq2tV+xzM0= +github.com/jhump/protoreflect v1.12.1-0.20220721211354-060cc04fc18b h1:izTof8BKh/nE1wrKOrloNA5q4odOarjf+Xpe+4qow98= github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= 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/joefitzgerald/rainbow-reporter v0.1.0/go.mod h1:481CNgqmVHQZzdIbN52CupLJyoVwB10FQ/IQlF1pdL8= -github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= 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/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= -github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/jpillora/ansi v1.0.2 h1:+Ei5HCAH0xsrQRCT2PDr4mq9r4Gm4tg+arNdXRkB22s= github.com/jpillora/ansi v1.0.2/go.mod h1:D2tT+6uzJvN1nBVQILYWkIdq7zG+b5gcFN5WI/VyjMY= github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/jpillora/chisel v1.7.6/go.mod h1:BC2zg11mTIoyGPUjc2EkTgfz3uUUV93+K9tNYCCU/fw= github.com/jpillora/chisel v1.7.7 h1:eLbzoX+ekDhVmF5CpSJD01NtH/w7QMYeaFCIFbzn9ns= github.com/jpillora/chisel v1.7.7/go.mod h1:X3ZzJDlOSlkMLVY3DMsdrd03rMtugLYk2IOUhvX0SXo= github.com/jpillora/requestlog v1.0.0 h1:bg++eJ74T7DYL3DlIpiwknrtfdUA9oP/M4fL+PpqnyA= @@ -1074,32 +906,30 @@ github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnr github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= 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/jsternberg/zap-logfmt v1.0.0/go.mod h1:uvPs/4X51zdkcm5jXl5SYoN+4RK21K8mysFmDaM/h+o= 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.0.0-20210419104244-841f0c0fe66d/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/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= +github.com/jwilder/encoding v0.0.0-20170811194829-b4e1701a28ef/go.mod h1:Ct9fl0F6iIOGgxJ5npU/IUOhOhqlVrGjyIZc8/MagT0= +github.com/karalabe/usb v0.0.2/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd h1:Coekwdh0v2wtGp9Gmz1Ze3eVRAWJMLokvN3QjdzCHLY= github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= 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/kkdai/bstream v1.0.0/go.mod h1:FDnDOHt5Yx4p3FaHcioFT0QjDOtgUpvjeZqAs+NVZZA= +github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.10.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.11.0/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.11.2/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.11.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.11.13/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= -github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc= -github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= +github.com/klauspost/compress v1.15.9 h1:wKRjX6JRtDdrE9qwa4b/Cip7ACOshUI4smpCQanqjSY= +github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= +github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +github.com/klauspost/crc32 v0.0.0-20161016154125-cb6bfca970f6/go.mod h1:+ZoRqAPRLkC4NPOvfYeR5KNOrY6TD+/sAC3HXPZgDYg= +github.com/klauspost/pgzip v1.0.2-0.20170402124221-0bf5dcad4ada/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= @@ -1107,137 +937,90 @@ 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 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.4/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= 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.4.0/go.mod h1:vMu2Cizjy/grP+jmsvOFDx1kYP6+PD1lqg4Yu5exl2U= -github.com/kunwardeep/paralleltest v1.0.2/go.mod h1:ZPqNm1fVHPllh5LPVujzbVz1JN2GhLxSfY+oqUsvG30= 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.2/go.mod h1:cpgBogWITnCfRq2qGoDkKMEVSaarhdBr6g8G04uz6d0= -github.com/ldez/tagliatelle v0.2.0/go.mod h1:8s6WJQwEYHbKZDsp/LjArytKOG8qaMrKQQ3mFukHs88= +github.com/labstack/echo/v4 v4.2.1/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4FW1e6jwpg= +github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= +github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= 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/letsencrypt/pkcs11key/v4 v4.0.0/go.mod h1:EFUvBDay26dErnNb70Nd0/VW3tJiIbETBPTl9ATXQag= 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/libp2p/go-buffer-pool v0.0.2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM= +github.com/lib/pq v1.10.6 h1:jbk+ZieJ0D7EVGJYpL9QTz7/YW6UHbmdnZWYyK5cdBs= +github.com/lib/pq v1.10.6/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= +github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= github.com/linuxkit/virtsock v0.0.0-20201010232012-f8cee7dfc7a3/go.mod h1:3r6x7q95whyfWQpmGZTu3gk3v2YkMi05HEzl7Tf7YEo= -github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= -github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= -github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/lucasjones/reggen v0.0.0-20180717132126-cdb49ff09d77/go.mod h1:5ELEyG+X8f+meRWHuqUOewBOhvHkl7M76pdGEansxW4= -github.com/lyft/protoc-gen-star v0.5.3/go.mod h1:V0xaHgaf5oCCqmcxYcWiDfTiKsZsRc87/1qhoTACD8w= +github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.5 h1:b6kJs+EmPFMYGkow9GiUyCyOvIwYetYJ3fSaWak/Gls= -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/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= -github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/manifoldco/promptui v0.9.0/go.mod h1:ka04sppxSGFAtxX0qhlYQjISsg9mR4GWtQEhdbn6Pgg= -github.com/maratori/testpackage v1.0.1/go.mod h1:ddKdw+XG0Phzhx8BFDTKgpWP4i7MpApTE5fXSKAqwDU= github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= -github.com/matoous/godox v0.0.0-20210227103229-6504466cf951/go.mod h1:1BELzlh859Sh1c6+90blK8lbYy0kwQf1bYlBhBysy1s= +github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ= 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.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-ieproxy v0.0.0-20190610004146-91bb50d98149/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= -github.com/mattn/go-ieproxy v0.0.0-20190702010315-6dee0af9227d/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.5-0.20180830101745-3fb116b82035/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= -github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= +github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.6/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= github.com/mattn/go-shellwords v1.0.6/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= -github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= -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/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/mattn/go-tty v0.0.0-20180907095812-13ff1204f104/go.mod h1:XPvLUNfbS4fJH25nqRHfWLMa1ONC8Amw+mIA639KxkE= github.com/mattn/go-zglob v0.0.3 h1:6Ry4EYsScDyt5di4OI6xw1bYhOqfE5S33Z1OPy+d+To= github.com/mattn/go-zglob v0.0.3/go.mod h1:9fxibJccNxU2cnpIKLRRFA7zX7qhkJIQWBb449FYHOo= -github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/maxbrunsfeld/counterfeiter/v6 v6.2.2/go.mod h1:eD9eIE7cdwcMi9rYluz88Jz2VyhSmden33/aXg4oVIY= -github.com/mbilski/exhaustivestruct v1.2.0/go.mod h1:OeTBVxQWoEmB2J2JCHmXWPJ0aksxSUOUy+nvtVEfzXc= -github.com/meowgorithm/babyenv v1.3.0/go.mod h1:lwNX+J6AGBFqNrMZ2PTLkM6SO+W4X8DOg9zBDO4j3Ig= -github.com/meowgorithm/babyenv v1.3.1/go.mod h1:lwNX+J6AGBFqNrMZ2PTLkM6SO+W4X8DOg9zBDO4j3Ig= -github.com/mgechev/dots v0.0.0-20190921121421-c36f7dcfbb81/go.mod h1:KQ7+USdGKfpPjXk4Ga+5XxQM4Lm4e3gAogrreFAYpOg= -github.com/mgechev/revive v1.1.1/go.mod h1:PKqk4L74K6wVNwY2b6fr+9Qqr/3hIsHVfZCJdbvozrY= -github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= -github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= -github.com/microcosm-cc/bluemonday v1.0.4/go.mod h1:8iwZnFn2CDDNZ0r6UXhF4xawGvzaqzCRa1n3/lO3W2w= 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/mikesmitty/edkey v0.0.0-20170222072505-3356ea4e686a/go.mod h1:v8eSC2SMp9/7FTKUncp7fH9IwPfw+ysMObcEz5FWheQ= github.com/mimoo/StrobeGo v0.0.0-20181016162300-f8f6d4d2b643 h1:hLDRPB66XQT/8+wG9WsDpiCvZf1yKO7sz7scAjSlBa0= github.com/mimoo/StrobeGo v0.0.0-20181016162300-f8f6d4d2b643/go.mod h1:43+3pMjjKimDBf5Kr4ZFNGbLql1zKkbImw+fZbw3geM= -github.com/minio/highwayhash v1.0.1/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= github.com/minio/highwayhash v1.0.2 h1:Aak5U0nElisjDCfPSG79Tgzkn2gl66NxOMspRrKnA/g= github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= 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 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= 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 h1:fzU/JVNcaqHQEcVFAKeR41fkiLdIPrefOvVG1VZ96U0= github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.4.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.4.3 h1:OVowDSCllw/YjdLkam3/sm7wEtOy59d8ndGgCcyj8cs= github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A= -github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= -github.com/mitchellh/reflectwalk v1.0.1/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= -github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= -github.com/moby/sys/mount v0.3.0/go.mod h1:U2Z3ur2rXPFrFmy4q6WMwWrBOAQGYtYTRVM8BIvzbwk= github.com/moby/sys/mount v0.3.1 h1:RX1K0x95oR8j5P1YefKDt7tE1C2kCCixV0H8Aza3GaI= github.com/moby/sys/mount v0.3.1/go.mod h1:6IZknFQiqjLpwuYJD5Zk0qYEuJiws36M88MIXnZHya0= github.com/moby/sys/mountinfo v0.4.0/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= @@ -1245,11 +1028,8 @@ github.com/moby/sys/mountinfo v0.4.1/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2J github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= github.com/moby/sys/mountinfo v0.6.0 h1:gUDhXQx58YNrpHlK4nSL+7y2pxFZkUcXqzFDKWdC0Oo= github.com/moby/sys/mountinfo v0.6.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= -github.com/moby/sys/signal v0.6.0/go.mod h1:GQ6ObYZfqacOwTtlXvcmh9A26dVRul/hbOZn88Kg8Tg= github.com/moby/sys/symlink v0.1.0/go.mod h1:GGDODQmbFOjFsXvfLVn3+ZRxkch54RkSiGqsZeMYowQ= -github.com/moby/sys/symlink v0.2.0/go.mod h1:7uZVF2dqJjG/NsClqul95CqKOBRQyYSNnJ6BMgR/gFs= github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo= -github.com/moby/term v0.0.0-20210610120745-9d4ed1856297/go.mod h1:vgPCkQMyxTZ7IDy8SXRufE172gr8+K/JE/7hHFxHW3A= 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= @@ -1258,66 +1038,36 @@ 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/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= -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/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE+eKJXWVjKXM4ck2QobLqTDytGJbLLhJg= 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/muesli/gitcha v0.2.0/go.mod h1:Ri8m9TZS4+ORG4JVmVKUQcWZuxDvUW3UKxMdQfzG2zI= -github.com/muesli/go-app-paths v0.2.1/go.mod h1:SxS3Umca63pcFcLtbjVb+J0oD7cl4ixQWoBKhGEtEho= -github.com/muesli/reflow v0.1.0/go.mod h1:I9bWAt7QTg/que/qmUCJBGlj7wEq8OAFBjPNjc6xK4I= -github.com/muesli/reflow v0.2.0/go.mod h1:qT22vjVmM9MIUeLgsVYe/Ye7eZlbv9dZjL3dVhUqLX8= -github.com/muesli/reflow v0.2.1-0.20210115123740-9e1d0d53df68/go.mod h1:Xk+z4oIWdQqJzsxyjgl3P22oYZnHdZ8FFTHAQQt5BMQ= -github.com/muesli/sasquatch v0.0.0-20200811221207-66979d92330a/go.mod h1:+XG0ne5zXWBTSbbe7Z3/RWxaT8PZY6zaZ1dX6KjprYY= -github.com/muesli/termenv v0.7.2/go.mod h1:ct2L5N2lmix82RaY3bMWwVu/jUFc9Ule0KGDCiKYPh8= -github.com/muesli/termenv v0.7.4/go.mod h1:pZ7qY9l3F7e5xsAOS0zCew2tME+p7bWeBkotCEcIIcc= -github.com/muesli/termenv v0.8.0/go.mod h1:kzt/D/4a88RoheZmwfqorY3A+tnsSMA9HJC/fQSFKo0= github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= 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/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/nakabonne/nestif v0.3.0/go.mod h1:dI314BppzXjJ4HsCnbo7XzrJHPszZsjnk5wEBSYHI2c= github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= -github.com/nats-io/jwt v1.2.2/go.mod h1:/xX356yQA6LuXI9xWW7mZNpxgF2mBmGecH+Fj34sP5Q= -github.com/nats-io/jwt/v2 v2.0.3/go.mod h1:VRP+deawSXyhNjXmxPCHskrR6Mq50BqpEI5SEcNiGlY= github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= -github.com/nats-io/nats-server/v2 v2.5.0/go.mod h1:Kj86UtrXAL6LwYRA6H4RqzkHhK0Vcv2ZnKD5WbQ1t3g= github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= -github.com/nats-io/nats.go v1.12.1/go.mod h1:BPko4oXsySz4aSWeFgOHLZs3G4Jq4ZAyE6/zMCxRT6w= github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -github.com/nats-io/nkeys v0.2.0/go.mod h1:XdZpAbhgyyODYqjTawOnIOI7VlbKSarI9Gfy1tqEu/s= -github.com/nats-io/nkeys v0.3.0/go.mod h1:gvUNGjVcM2IPr5rCsRsC6Wb3Hr2CQAm08dsxtV6A5y4= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= -github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354/go.mod h1:KSVJerMDfblTH7p5MZaTt+8zaT2iEk3AkVb9PQdZuE8= github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= -github.com/neilotoole/errgroup v0.1.5/go.mod h1:Q2nLGf+594h0CLBs/Mbg6qOr7GtqDK7C2S41udRnToE= +github.com/neilotoole/errgroup v0.1.6/go.mod h1:Q2nLGf+594h0CLBs/Mbg6qOr7GtqDK7C2S41udRnToE= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nishanths/exhaustive v0.2.3/go.mod h1:bhIX678Nx8inLM9PbpvK1yv6oGtoP8BfaIeMzgBNKvc= -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.1/go.mod h1:HvkGJcA3naj4lOwnFXFDkFxVtSqQMB9sbB1usJ+xjQE= +github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/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 v0.0.0-20151202141238-7f8ab55aaf3b/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= @@ -1329,11 +1079,8 @@ github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+ github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.13.0/go.mod h1:+REjRxOmWfHCjfv9TTWB1jD1Frx4XydAD3zm1lskyM0= +github.com/onsi/ginkgo v1.14.0 h1:2mOpI4JVVPBN+WQRa0WKH2eXR+Ey+uK4n7Zj0aYpIQA= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/ginkgo v1.16.2/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E= -github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= -github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= github.com/onsi/gomega v0.0.0-20151007035656-2152b45fa28a/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= @@ -1343,10 +1090,8 @@ github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1Cpa github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.10.3 h1:gph6h/qe9GSUw1NhH1gp+qb+h8rXD8Cy60Z32Qw3ELA= github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= -github.com/onsi/gomega v1.13.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY= -github.com/onsi/gomega v1.15.0 h1:WjP/FQ/sk43MRmnEcT+MlDw2TFvkrXlprrPST/IudjU= -github.com/onsi/gomega v1.15.0/go.mod h1:cIuvLEne0aoVhAgh/O6ac0Op8WWw9H6eYCriF+tEHG0= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= @@ -1356,18 +1101,16 @@ github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8 github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.0.0/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/image-spec v1.0.2-0.20211117181255-693428a734f5/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/image-spec v1.0.2 h1:9yCKha/T5XdGtO0q9Q9a6T5NUCsTn/DrBg0D7ufOcFM= -github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799 h1:rc3tiVYb5z54aKaDfakKn0dDjIyPpTtszkjuMzyt7ec= +github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= github.com/opencontainers/runc v1.0.0-rc8.0.20190926000215-3e425f80a8c9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= github.com/opencontainers/runc v1.0.0-rc9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= github.com/opencontainers/runc v1.0.0-rc93/go.mod h1:3NOsor4w32B2tC0Zbl8Knk4Wg84SM2ImC1fxBuqJ/H0= github.com/opencontainers/runc v1.0.2/go.mod h1:aTaHFFwQXuA71CiyxOdFFIorAoemI04suvGRQFzWTD0= -github.com/opencontainers/runc v1.0.3/go.mod h1:aTaHFFwQXuA71CiyxOdFFIorAoemI04suvGRQFzWTD0= -github.com/opencontainers/runc v1.1.0 h1:O9+X96OcDjkmmZyfaG996kV7yq8HsoU2h1XRRQcefG8= -github.com/opencontainers/runc v1.1.0/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 v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-spec v1.0.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-spec v1.0.2-0.20190207185410-29686dbc5559/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= @@ -1382,15 +1125,13 @@ github.com/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuh github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.0.3-0.20180606204148-bd9c31933947/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= -github.com/openzipkin/zipkin-go v0.2.5/go.mod h1:KpXfKdgRDnnhsxw4pNIH9Md5lyFqKUa4YDFlwRYAMyE= github.com/ory/dockertest v3.3.5+incompatible h1:iLLK6SQwIhcbrG783Dghaaa3WPzGc+4Emza6EbVUUGA= -github.com/ory/dockertest v3.3.5+incompatible/go.mod h1:1vX4m9wsvi00u5bseYwXaSnhNrne+V0E6LAcBILJdPs= github.com/otiai10/copy v1.6.0 h1:IinKAryFFuPONZ7cm6T6E2QX/vcJwSnlaA5lfoaXIiQ= github.com/otiai10/copy v1.6.0/go.mod h1:XWfuS3CrI0R6IE0FbgHsEazaXO8G0LpMp9o8tos0x4E= github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= @@ -1402,38 +1143,35 @@ github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIw 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/uuid v0.0.0-20170112150404-1b00554d8222/go.mod h1:VyrYX9gd7irzKovcSS6BIIEwPRkP2Wm2m9ufcdFSJ34= +github.com/paulbellamy/ratecounter v0.2.0/go.mod h1:Hfx1hDpSGoqxkVVpBi/IlYD7kChlfo5C6hzIHwPqfFE= 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.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc= -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 v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= +github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml/v2 v2.0.2 h1:+jQXlF3scKIcSEKkdHzXhCTDLPFi5r1wnK6yPS+49Gw= +github.com/pelletier/go-toml/v2 v2.0.2/go.mod h1:MovirKjgVRESsAvNZlAjtFwV867yGuwRkXbG66OzopI= github.com/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.0.1-0.20180619022028-8c1271fcf47f/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc= 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.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= 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/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1-0.20171018195549-f15c970de5b7/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/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/pkg/term v0.0.0-20180730021639-bffc007b7fd5/go.mod h1:eCbImbZ95eXtAUIbLAuAVnBnwf83mjf6QIVH8SHYwqQ= 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 v0.0.0-20210722154253-910bb7978349/go.mod h1:wi9BfjxjF/bwiZ701TzmfKu6UKC357IOAtNr0Td0Lvw= 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/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= github.com/prometheus/client_golang v0.0.0-20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= @@ -1444,10 +1182,10 @@ github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQ github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.8.0/go.mod h1:O9VU6huf47PktckDQfMTX0Y8tY0/7TSWwj+ITvv0TnM= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.1 h1:ZiaPsmm9uiBeaSMRznKsCDNtPCS0T3JVDGF+06gjBzk= github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= +github.com/prometheus/client_golang v1.12.2 h1:51L9cDoUHVrXx4zWYlcLQIZ+d+VXHgqnYKkIuq4g/34= +github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= 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= @@ -1465,13 +1203,11 @@ github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+ github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.14.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.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 h1:RBmGO9d/FVjqHT0yUGQwBJhkwKV+wPCn7KGpvfab0uE= +github.com/prometheus/common v0.34.0/go.mod h1:gB3sOl7P0TvJabZpLY5uQMpUqRCPPCyRLCZYc7JZTNE= github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= 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= @@ -1487,18 +1223,7 @@ github.com/prometheus/procfs v0.3.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4O github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/tsdb v0.6.2-0.20190402121629-4f204dcbc150/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/pseudomuto/protoc-gen-doc v1.3.2/go.mod h1:y5+P6n3iGrbKG+9O04V5ld71in3v/bX88wUwgt+U8EA= -github.com/pseudomuto/protokit v0.2.0/go.mod h1:2PdH30hxVHsup8KpBTOXTBeMVhJZVio3Q8ViKSAXT0Q= -github.com/quasilyte/go-consistent v0.0.0-20190521200055-c6f3937de18c/go.mod h1:5STLWrekHfjyYwxBRVRXNOSewLJ3PWfDJd1VyTS21fI= -github.com/quasilyte/go-ruleguard v0.3.1-0.20210203134552-1b5a410e1cc8/go.mod h1:KsAh3x0e7Fkpgs+Q9pNLS5XpFSvYCEVl5gP9Pp1xp30= -github.com/quasilyte/go-ruleguard v0.3.4/go.mod h1:57FZgMnoo6jqxkYKmVj5Fc8vOt0rVzoE/UNAmFFIPqA= -github.com/quasilyte/go-ruleguard/dsl v0.3.0/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= -github.com/quasilyte/go-ruleguard/dsl v0.3.2/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-20210203162857-b223e0831f88/go.mod h1:4cgAphtvu7Ftv7vOT2ZOYhC6CvBxZixcasr8qIOTA50= -github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95/go.mod h1:rlzQ04UMyJXu/aOvhd8qT+hvDrFpiwqp8MRXDY9szc0= github.com/radovskyb/watcher v1.0.7 h1:AYePLih6dpmS32vlHfhCeli8127LzkIgwJGcwwe8tUE= github.com/radovskyb/watcher v1.0.7/go.mod h1:78okwvY5wPdzcb1UYnip1pvrZNIVEIh/Cm+ZuvsUYIg= github.com/rakyll/statik v0.1.7 h1:OF3QCZUuyPxuGEP7B4ypUa7sB/iHtqOTDYZXGM8KOdQ= @@ -1506,66 +1231,43 @@ github.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Ung github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0 h1:MkV+77GLUNo5oJ0jf870itWm3D0Sjh7+Za9gazKc5LQ= github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/rdegges/go-ipify v0.0.0-20150526035502-2d94a6a86c40/go.mod h1:j4c6zEU0eMG1oiZPUy+zD4ykX0NIpjZAEOEAviTWC18= github.com/regen-network/cosmos-proto v0.3.1 h1:rV7iM4SSFAagvy8RiyhiACbWEGotmqzywPxOvwMdxcg= github.com/regen-network/cosmos-proto v0.3.1/go.mod h1:jO0sVX6a1B36nmE8C9xBFXpNwWejXC7QqCOnH3O0+YM= github.com/regen-network/protobuf v1.3.3-alpha.regen.1 h1:OHEc+q5iIAXpqiqFKeLpu5NwTIkVXUs48vFMwzqpqY4= github.com/regen-network/protobuf v1.3.3-alpha.regen.1/go.mod h1:2DjTFR1HhMQhiWC5sZ4OhQ3+NtdbZ6oBDKQwq5Ou+FI= -github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/retailnext/hllpp v1.0.1-0.20180308014038-101a6d2f8b52/go.mod h1:RDpi1RftBQPUCDRw6SmxeaREsAaRKnOclghuzp/WRzc= 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.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.3.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.4.0/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.6.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rs/cors v0.0.0-20160617231935-a62a804a8a00/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= +github.com/rogpeppe/go-internal v1.8.1 h1:geMPLpDpQOgVyCg5z5GoRwLHepNdb71NXb67XFkP+Eg= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/cors v1.8.2 h1:KCooALfAYGs415Cwu5ABvv9n9509fSiG5SQJn/AQo4U= github.com/rs/cors v1.8.2/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= -github.com/rs/xhandler v0.0.0-20160618193221-ed27b6fd6521/go.mod h1:RvLn4FgxWubrpZHtQLnOf6EwhN2hEMusxZOhcW9H3UQ= -github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/rs/xid v1.3.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -github.com/rs/zerolog v1.23.0/go.mod h1:6c7hFfxPOy7TacJc4Fcdi24/J0NKYGzjG8FWRI916Qo= -github.com/rs/zerolog v1.26.1 h1:/ihwxqH+4z8UxyI70wM1z9yCvkWcfz/a3mj48k/Zngc= -github.com/rs/zerolog v1.26.1/go.mod h1:/wSSJWX7lVrsOwlbyTRSOJvqRlc+WjWlfes+CiJ+tmc= +github.com/rs/zerolog v1.27.0 h1:1T7qCieN22GVc8S4Q2yuexzBb1EqjbgjSH9RohbMjKs= +github.com/rs/zerolog v1.27.0/go.mod h1:7frBqO0oezxmnO7GF86FY++uy8I0Tk/If5ni1G9Qc0U= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryancurrah/gomodguard v1.2.3/go.mod h1:rYbA/4Tg5c54mV1sv4sQTP5WOPBcoLtnBZ7/TEhXAbg= -github.com/ryanrolds/sqlclosecheck v0.3.0/go.mod h1:1gREqxyTGR3lVtpngyFo3hZAgk0KCtEdgEkHwDbigdA= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/sabhiram/go-gitignore v0.0.0-20180611051255-d3107576ba94/go.mod h1:b18R55ulyQ/h3RaWyloPyER7fWQVZvimKKhnI5OfrJQ= github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= -github.com/safchain/ethtool v0.0.0-20210803160452-9aa261dae9b1/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= -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/sahilm/fuzzy v0.1.0/go.mod h1:VFvziUEIMCrT6A6tw2RFIXPXXmzXbOsSHF0DOI8ZK9Y= github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= -github.com/sanposhiho/wastedassign/v2 v2.0.6/go.mod h1:KyZ0MWTwxxBmfwn33zh3k1dmsbF2ud9pAAGfoLfjhtI= -github.com/sasha-s/go-deadlock v0.2.0/go.mod h1:StQn567HiB1fF2yJ44N9au7wOhrPS3iZqiDbRupzT10= github.com/sasha-s/go-deadlock v0.2.1-0.20190427202633-1595213edefa h1:0U2s5loxrTy6/VgfVoLuVLFJcURKLH49ie0zSch7gh4= github.com/sasha-s/go-deadlock v0.2.1-0.20190427202633-1595213edefa/go.mod h1:F73l+cr82YSh10GxyRI6qZiCgK64VaZjwesgfQ1/iLM= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw= github.com/sclevine/spec v1.2.0/go.mod h1:W4J29eT/Kzv7/b9IWLB055Z+qvVC9vt0Arko24q7p+U= 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/securego/gosec/v2 v2.8.1/go.mod h1:pUmsq6+VyFEElJMUX+QB3p3LWNHXg1R3xh2ssVJPs8Q= +github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= github.com/segmentio/fasthash v1.0.3/go.mod h1:waKX8l2N8yckOgmSsXJi7x1ZfdKZ4x7KRMzBtS3oedY= -github.com/segmentio/ksuid v1.0.3/go.mod h1:/XUiZBD3kVx5SmUOl55voK5yeAbBNNIed+2O73XgrPE= -github.com/serenize/snaker v0.0.0-20171204205717-a683aaf2d516/go.mod h1:Yow6lPLSAXx2ifx470yD/nUe22Dv5vBvxK/UK9UUTVs= +github.com/segmentio/kafka-go v0.1.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= +github.com/segmentio/kafka-go v0.2.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= 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.21.7/go.mod h1:RGl11Y7XMTQPmHh8F0ayC6haKNBgH4PXMJuTAcMOlz4= -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/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ= +github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= +github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= @@ -1574,42 +1276,30 @@ github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMB github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= +github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/snikch/goodman v0.0.0-20171125024755-10e37e294daa/go.mod h1:oJyF+mSPHbB5mVY2iO9KV3pTt/QbIkGaO8gQ2WrDbP4= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= -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/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE= -github.com/sourcegraph/go-diff v0.6.1/go.mod h1:iBszgVvyxdc8SFZ7gm69go2KDdt3ag071iBaWPF6cjs= -github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod h1:HuIsMU8RRBOtsCgI77wP899iHVBQpCmg4ErYMZB+2IA= 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.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -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.0 h1:5MmtuhAgYeU6qpa7w7bP0dv6MBYuup0vekhSpSkoq60= -github.com/spf13/afero v1.8.0/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= +github.com/spf13/afero v1.8.2 h1:xehSyVa0YnHWsJ49JFljMpg1HX19V6NDZ1fkm1Xznbo= +github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.4.1 h1:s0hze+J0196ZfEMTs80N7UlFt0BDuQ7Q+JDnHiMWKdA= -github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= +github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= 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.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= -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 h1:X+jTBEBqF0bHN+9cSMgmfuvv2VHJ9ezmFNf9Y/XstYU= +github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= @@ -1621,103 +1311,69 @@ 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 h1:nuJZuYpG7gTj/XqiUwg8bA0cp1+M2mC3J4g5luUYBKk= -github.com/spf13/viper v1.10.1/go.mod h1:IGlFPqhNAPKRxohIzWpI5QEy4kuI7tcl5WvR+8qy1rU= -github.com/ssgreg/nlreturn/v2 v2.1.0/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= +github.com/spf13/viper v1.12.0 h1:CZ7eSOd3kZoaYDLbXnmzgQI5RlciuXBMA+18HwHRfZQ= +github.com/spf13/viper v1.12.0/go.mod h1:b6COn30jlNxbm/V2IqWiNWkJ+vZNiMNksliPCiuKtSI= github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4/go.mod h1:RZLeN1LMWmRsyYjvAu+I6Dm9QmlDaIIt+Y+4Kd7Tp+Q= -github.com/steakknife/bloomfilter v0.0.0-20180922174646-6819c0d2a570/go.mod h1:8OR4w3TdeIHIh1g6EMY5p0gVNOovcWC+1vpc7naMuAw= -github.com/steakknife/hamming v0.0.0-20180906055917-c99c65617cd3/go.mod h1:hpGUWaI9xL8pRQCTXQgocU38Qw1g0Us7n5PxxTwTCYU= github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8= -github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= -github.com/streadway/amqp v1.0.0/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= -github.com/streadway/handy v0.0.0-20200128134331-0f66f006fb2e/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= github.com/stretchr/objx v0.0.0-20180129172003-8a3f7159479f/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 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/testify v0.0.0-20170130113145-4d4bfba8f1d1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/objx v0.4.0 h1:M2gUjqZET1qApGOWNSnZ49BAIMX4F/1plDv3+l31EJ4= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/testify v0.0.0-20180303142811-b89eecf5ca5d/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.1.4/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.2.1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.2.0/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/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= +github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/subosito/gotenv v1.4.0 h1:yAzM1+SmVcz5R4tXGsNMu1jUl2aOJXoiWUCEwwnGrvs= +github.com/subosito/gotenv v1.4.0/go.mod h1:mZd6rFysKEcUhUHXJk0C/08wAgyDBFuwEYL7vWWGaGo= github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= 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/takuoki/gocase v1.0.0 h1:gPwLJTWVm2T1kUiCsKirg/faaIUGVTI0FA3SYr75a44= github.com/takuoki/gocase v1.0.0/go.mod h1:QgOKJrbuJoDrtoKswBX1/Dw8mJrkOV9tbQZJaxaJ6zc= github.com/tchap/go-patricia v2.2.6+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I= -github.com/tdakkota/asciicheck v0.0.0-20200416200610-e657995f937b/go.mod h1:yHp0ai0Z9gUljN3o0xMhYJnH/IcvkdTBOX2fmJ93JEM= -github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c/go.mod h1:ahpPrc7HpcfEWDQRZEmnXMzHY03mLDYMCxeDzy46i+8= github.com/tendermint/btcd v0.1.1 h1:0VcxPfflS2zZ3RiOAHkBiFUcPvbtRj5O7zHmcJWHV7s= github.com/tendermint/btcd v0.1.1/go.mod h1:DC6/m53jtQzr/NFmMNEu0rxf18/ktVoVtMrnDD5pN+U= github.com/tendermint/crypto v0.0.0-20191022145703-50d29ede1e15 h1:hqAk8riJvK4RMWx1aInLzndwxKalgi5rTqgfXxOxbEI= github.com/tendermint/crypto v0.0.0-20191022145703-50d29ede1e15/go.mod h1:z4YtwM70uOnk8h0pjJYlj3zdYwi9l03By6iAIF5j/Pk= -github.com/tendermint/flutter/v2 v2.0.3/go.mod h1:hnaVhWhzv2Od1LqZFWrRKwiOHeMonsB9EIWP0AGMPw0= -github.com/tendermint/flutter/v2 v2.0.4/go.mod h1:hnaVhWhzv2Od1LqZFWrRKwiOHeMonsB9EIWP0AGMPw0= -github.com/tendermint/fundraising v0.2.0/go.mod h1:AoOF/njoU8FZMZTngspweCClg+3ANI0aRswe0FaUQsE= -github.com/tendermint/fundraising v0.3.0 h1:VtHfmVlAS93MUDlt6Em21l3taw6s9kLY/w8Cd1FB9fM= -github.com/tendermint/fundraising v0.3.0/go.mod h1:oJFZUZ/GsACtkYeWScKpHLdqMUThNWpMAi/G47LJUi4= +github.com/tendermint/fundraising v0.3.1 h1:S4uOV/T7YNBqXhsCZnq/TUoHB0d2kM+6tKeTD4WhLN0= 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/spn v0.1.1-0.20211210094128-4ca78a240c57/go.mod h1:p4BO8YC6kOKSKqMfySqaLHfwBmuPE/QcLwnnVhh7H9M= -github.com/tendermint/spn v0.1.1-0.20220407154406-5cfd1bf28150/go.mod h1:B+KuhkB4Sms4yh0UN1HGsVbbMa3vCypai22QXLudQ3o= -github.com/tendermint/spn v0.2.1-0.20220427143342-de7398284030/go.mod h1:9wXyogMDn9fK85s+bSADy+wvZ27DjLEByByMM+0O6NU= -github.com/tendermint/spn v0.2.1-0.20220609194312-7833ecf4454a h1:+xo1H4r/dLkUcx89/jP88TbVQiA40Rcn7yQyPozIj5k= -github.com/tendermint/spn v0.2.1-0.20220609194312-7833ecf4454a/go.mod h1:5w8qNkgtJM24CcMjqTsVOKnSbz+U2fke7bEGzRlcdHA= -github.com/tendermint/tendermint v0.34.0-rc4/go.mod h1:yotsojf2C1QBOw4dZrTcxbyxmPUrT4hNuOQWX9XUwB4= -github.com/tendermint/tendermint v0.34.0-rc6/go.mod h1:ugzyZO5foutZImv0Iyx/gOFCX6mjJTgbLHTwi17VDVg= -github.com/tendermint/tendermint v0.34.0/go.mod h1:Aj3PIipBFSNO21r+Lq3TtzQ+uKESxkbA3yo/INM4QwQ= -github.com/tendermint/tendermint v0.34.13/go.mod h1:6RVVRBqwtKhA+H59APKumO+B7Nye4QXSFc6+TYxAxCI= -github.com/tendermint/tendermint v0.34.14/go.mod h1:FrwVm3TvsVicI9Z7FlucHV6Znfd5KBc/Lpp69cCwtk0= -github.com/tendermint/tendermint v0.34.16/go.mod h1:n0G22GynfeXTYbrn2IeLeB+oqsAe6R6jl4vZxZ1Y8F4= -github.com/tendermint/tendermint v0.34.19 h1:y0P1qI5wSa9IRuhKnTDA6IUcOrLi1hXJuALR+R7HFEk= -github.com/tendermint/tendermint v0.34.19/go.mod h1:R5+wgIwSxMdKQcmOaeudL0Cjkr3HDkhpcdum6VeU3R4= -github.com/tendermint/tm-db v0.6.2/go.mod h1:GYtQ67SUvATOcoY8/+x6ylk8Qo02BQyLrAs+yAcLvGI= -github.com/tendermint/tm-db v0.6.3/go.mod h1:lfA1dL9/Y/Y8wwyPp2NMLyn5P5Ptr/gvDFNWtrCWSf8= -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/spn v0.2.1-0.20220826123316-985b629a92dd h1:G50RK8x61pNFGVSAI5UmXaBDA4h/P2+SDdftha9jjSM= +github.com/tendermint/spn v0.2.1-0.20220826123316-985b629a92dd/go.mod h1:5eAAx0g6FEXubQ1Sb7zJcDZqCSjb9yoJMVOQwjEt9qQ= +github.com/tendermint/tendermint v0.34.21 h1:UiGGnBFHVrZhoQVQ7EfwSOLuCtarqCSsRf8VrklqB7s= +github.com/tendermint/tendermint v0.34.21/go.mod h1:XDvfg6U7grcFTDx7VkzxnhazQ/bspGJAn4DZ6DcLLjQ= github.com/tendermint/tm-db v0.6.7 h1:fE00Cbl0jayAoqlExN6oyQJ7fR/ZtoVOmvPJ//+shu8= github.com/tendermint/tm-db v0.6.7/go.mod h1:byQDzFkZV1syXr/ReXS808NxA2xvyuuVgXOJ/088L6I= -github.com/tendermint/vue v0.3.5/go.mod h1:Sg9MGPF+uY+SJ79sdZgtC2LnH+FDU2qWuiRxoZn5bmw= -github.com/tetafro/godot v1.4.9/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-20200424151742-cb6215831a94/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk= +github.com/tidwall/gjson v1.12.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/gjson v1.14.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= +github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/tidwall/sjson v1.2.4/go.mod h1:098SZ494YoMWPmMO6ct4dcFnqxwj9r/gF0Etp19pSNM= +github.com/tinylib/msgp v1.0.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= github.com/tinylib/msgp v1.1.5/go.mod h1:eQsjooMTnV42mHu917E26IogZ2930nFyBQdofk10Udg= -github.com/tklauser/go-sysconf v0.3.7/go.mod h1:JZIdXh4RmBvZDBZ41ld2bGxRV3n4daiiqA3skYhAoQ4= -github.com/tklauser/numcpus v0.2.3/go.mod h1:vpEPS/JC+oZGGQ/My/vJnNsvMDQL6PwOqt8dsCw5j+E= +github.com/tklauser/go-sysconf v0.3.5/go.mod h1:MkWzOF4RMCshBAMXuhXJs64Rte09mITnppBXY/rYEFI= +github.com/tklauser/numcpus v0.2.2/go.mod h1:x3qojaO3uyYt0i56EW/VUYs7uBvdl2fkfZFu0T9wgjM= 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/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tomarrell/wrapcheck/v2 v2.3.0/go.mod h1:aF5rnkdtqNWP/gC7vPUO5pKsB0Oac2FDTQP4F+dpZMU= github.com/tomasen/realip v0.0.0-20180522021738-f0c99a92ddce h1:fb190+cK2Xz/dvi9Hv8eCYJYvIGUTN2/KLq1pT6CjEc= github.com/tomasen/realip v0.0.0-20180522021738-f0c99a92ddce/go.mod h1:o8v6yHRoik09Xen7gje4m9ERNah1d1PPsVq1VEx9vE4= -github.com/tommy-muehle/go-mnd/v2 v2.4.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= @@ -1726,80 +1382,56 @@ github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVM github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/ultraware/funlen v0.0.3/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA= -github.com/ultraware/whitespace v0.0.4/go.mod h1:aVMh/gQve5Maj9hQ/hg+F75lr/X5A89uZnzAmWSineA= +github.com/ulikunitz/xz v0.5.8 h1:ERv8V6GKqVi23rgu5cj9pVfVzJbOqAY2Ntl88O6c2nQ= +github.com/ulikunitz/xz v0.5.8/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/uudashr/gocognit v1.0.5/go.mod h1:wgYz0mitoKOTysqxTDMOUXg+Jb5SvtihkfmugIZYpEA= +github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasthttp v1.16.0/go.mod h1:YOKImeEosDdBPnxc0gy7INqi3m1zK6A+xl6TwOBhHCA= -github.com/valyala/quicktemplate v1.6.3/go.mod h1:fwPzK2fHuYEODzJ9pkw0ipCPNHZ2tD5KW4lOuSdPKzY= -github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= -github.com/vektra/mockery/v2 v2.11.0/go.mod h1:8vf4KDDUptfkyypzdHLuE7OE2xA7Gdt60WgIS8PgD+U= -github.com/viki-org/dnscache v0.0.0-20130720023526-c70c1f23c5d8/go.mod h1:dniwbG03GafCjFohMDmz6Zc6oCuiqgH6tGNyXTkHzXE= +github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= +github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk= github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= -github.com/vishvananda/netlink v1.1.1-0.20210330154013-f5de75959ad5/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= github.com/vishvananda/netns v0.0.0-20180720170159-13995c7128cc/go.mod h1:ZjcWmFBXmLKZu9Nxj3WKYEafiSqer2rnvPr0en9UNpI= github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= -github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= -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/vmihailenco/msgpack/v5 v5.3.5/go.mod h1:7xyJ9e+0+9SaZT0Wt1RGleJXzli6Q/V5KbhBonMG9jc= +github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= +github.com/willf/bitset v1.1.3/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI= -github.com/wsddn/go-ecdh v0.0.0-20161211032359-48726bab9208/go.mod h1:IotVbo4F+mw0EzQ08zFqg7pK3FebNXpaMsRy2RT+Ees= github.com/xanzy/ssh-agent v0.2.1 h1:TCbipTQL2JiiCprBWx9frJ2eJlCYT00NmctrHxVAr70= github.com/xanzy/ssh-agent v0.2.1/go.mod h1:mLlQY/MoOhWBj+gOGMQkOeiEvkx+8pJSI+0Bx9h2kr4= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 h1:QldyIu/L63oPpyvQmHgvgickp1Yw510KJOqX7H24mg8= 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/ybbus/jsonrpc v2.1.2+incompatible/go.mod h1:XJrh1eMSzdIYFbM08flv0wp5G35eRniyeGut1z+LSiE= -github.com/yeya24/promlinter v0.1.0/go.mod h1:rs5vtZzeBHqqMwXqFScncpCF6u06lezhZepno9AB1Oc= -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.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= 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/yuin/goldmark-emoji v1.0.1/go.mod h1:2w1E6FEWLcDQkoTE+7HU6QF1F6SLlNGjRIBbIZQFqkQ= github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA= github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= -github.com/zondax/hid v0.9.0 h1:eiT3P6vNxAEVxXMw66eZUAAnU2zD33JBkfG/EnfAKl8= github.com/zondax/hid v0.9.0/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= +github.com/zondax/hid v0.9.1-0.20220302062450-5552068d2266 h1:O9XLFXGkVswDFmH9LaYpqu+r/AAFWqr0DL6V00KEVFg= +github.com/zondax/hid v0.9.1-0.20220302062450-5552068d2266/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= 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 v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg= -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/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/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/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= -go.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3MSsE= -go.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc= -go.etcd.io/etcd/server/v3 v3.5.0/go.mod h1:3Ah5ruV+M+7RZr0+Y/5mNLwC+eQlni+mQmOVdCRJoS4= -go.mozilla.org/mozlog v0.0.0-20170222151521-4bb13139d403/go.mod h1:jHoPAGnDrCy6kaI2tAze5Prf0Nr0w/oNkROt2lw3n3o= go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk= go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= @@ -1811,48 +1443,19 @@ go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.28.0/go.mod h1:vEhqr0m4eTc+DWxfsXoXue2GBgV2uUwVznkGIHW/e5w= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4= -go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= -go.opentelemetry.io/otel v1.3.0/go.mod h1:PWIKzi6JCp7sM0k9yZ43VX+T345uNbAkDKwHVjb2PTs= -go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= -go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.3.0/go.mod h1:VpP4/RMn8bv8gNo9uK7/IMY4mtWLELsS+JIP0inH0h4= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.3.0/go.mod h1:hO1KLR7jcKaDDKDkvI9dP/FIhpmna5lkqPUQdEjFAM8= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.3.0/go.mod h1:keUU7UfnwWTWpJ+FWnyqmogPa82nuU5VUANFq49hlMY= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.3.0/go.mod h1:QNX1aly8ehqqX1LEa6YniTU7VY9I6R3X/oPxhGdTceE= -go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= -go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= -go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= -go.opentelemetry.io/otel/sdk v1.3.0/go.mod h1:rIo4suHNhQwBIPg9axF8V9CA72Wz2mKF1teNrup8yzs= -go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE= -go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE= -go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= -go.opentelemetry.io/otel/trace v1.3.0/go.mod h1:c/VDhno8888bvQYmbYLqe41/Ldmr/KKunbvWM4/fEjk= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.opentelemetry.io/proto/otlp v0.11.0/go.mod h1:QpEjXPrNQzrFDZgoTo49dgHR9RYRSrg3NAKnUGl9YpQ= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/goleak v1.1.12/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/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= +go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= 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= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/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-20181009213950-7c1a557ab941/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -1861,50 +1464,33 @@ golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnf golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190621222207-cc06ce4a13d4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190909091759-094676da4a83/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191122220453-ac88ee75c92c/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201012173705-84dcc777aaee/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-20210220033148-5ea612d1eb83/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-20210322153248-0c34fe9e7dc2/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-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20211215165025-cf75a172585e/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= -golang.org/x/crypto v0.0.0-20220112180741-5e0467b6c7ce h1:Roh6XWxHFKrPgC/EQhVubSAGQ6Ozk6IdxHSzt1mR0EI= -golang.org/x/crypto v0.0.0-20220112180741-5e0467b6c7ce/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e h1:T8NU3HyQ8ClP4SEE+KbFlg6n0NhuTsN4MyznaarGsZM= +golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190731235908-ec7cb31e5a56/go.mod h1:JhuoJpWY28nO4Vef9tZUw9qufEGTyX1+7lmHxV5q5G4= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= @@ -1913,9 +1499,12 @@ 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/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= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= @@ -1929,22 +1518,20 @@ golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPI golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mobile v0.0.0-20200801112145-973feb4309de/go.mod h1:skQtrUTUwhdJvXM/2KKJzY8pDgNr9I/FOMqDVRPBUS4= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191209134235-331c550502dd/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3 h1:kQgndtyPBW/JIYERgdxfwMYh3AVStj88WQTlNDi2a+o= -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 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1967,8 +1554,6 @@ 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-20190827160401-ba9fcec4b297/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-20191004110552-13f9640d40b9/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= @@ -1983,43 +1568,37 @@ golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210220033124-5f55cee0dc0d/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= -golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210520170846-37e1c6afe023/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210825183410-e898025ed96a/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-20211209124913-491a49abca63/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/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 h1:oA4XRj0qtSt8Yo1Zms0CUlsT3KG69V2UGQWPBxujDmc= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220726230323-06994584191e h1:wOQNKh1uuDGRnmgF0jDxh7ctgGy/3P4rYWQRVJD4/Yg= +golang.org/x/net v0.0.0-20220726230323-06994584191e/go.mod h1:AaygXjzTFtRAg2ttMY5RMuhpJ3cNnI0XpyFJD1iQRSM= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -2031,28 +1610,33 @@ golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= +golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094 h1:2o1E+E8TpNLklK9nHiPiK1uzIYrIHt+cQx3ynCwq9V8= +golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 h1:uVc8UZUe6tr40fFVnUP5Oj+veunVezqYl9z7DYw9xzw= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -2070,27 +1654,22 @@ golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190514135907-3a4b5fb9f71f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190515120540-06a5c4944438/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190522044717-8097e1b27ff5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190530182044-ad28b68e88f1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190602015325-4c4f7f33c9ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190712062909-fae7ac547cb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190812073006-9eafafc0a87e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2100,6 +1679,7 @@ golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7w 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= +golang.org/x/sys v0.0.0-20200107162124-548cf772de50/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200120151820-655fe14d7479/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2112,14 +1692,12 @@ golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200413165638-669c56c373c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2127,36 +1705,30 @@ golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/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-20200817155316-9781c653f443/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-20200826173525-f9321e4c35a6/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-20200916030750-2334cc1a136f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200922070232-aee5d888a860/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201009025420-dfb3f7c4e634/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201015000850-e3ed0017c211/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201020230747-6e5568b54d1a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201117170446-d9b008d0a637/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-20201202213521-69691e467435/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-20210113181707-4bcb84eeeb78/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210316164454-77fc1eacc6aa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210420205809-ac73e9fd8988/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2170,31 +1742,37 @@ golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210819135213-f52c844e1c1c/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-20210831042530-f4d43177bf5e/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-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-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220315194320-039c03cc5b86 h1:A9i04dxx7Cribqbs8jf3FQLogkL/CV2YN7hj9KWJCkc= -golang.org/x/sys v0.0.0-20220315194320-039c03cc5b86/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/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-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220517195934-5e4e11fc645e/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-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220727055044-e65921a090b8 h1:dyU22nBWzrmTQxtNrr4dzVOvaw35nUYE279vF9UmsI8= +golang.org/x/sys v0.0.0-20220727055044-e65921a090b8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/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-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -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-20220722155259-a9ba230a4035 h1:Q5284mrmYTpACcm+eAKjKJH48BBwSyfJqmmGDTtT8Vc= +golang.org/x/term v0.0.0-20220722155259-a9ba230a4035/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -2211,21 +1789,18 @@ golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190110163146-51295c7ec13a/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-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-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= @@ -2237,30 +1812,20 @@ golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190706070813-72ffa07ba3db/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= 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-20191004055002-72853e10c5a3/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-20191224055732-dd894d0a8a40/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-20200108203644-89082a384178/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= @@ -2270,50 +1835,23 @@ 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-20200505023115-26f46d2f7ef8/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-20200616133436-c1934b75d054/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-20200916195026-c9a70fc28ce3/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -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-20201114224030-61ea331ec02b/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201118003311-bd56c0adb394/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-20210101214203-2dba1e4ea05c/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210104081019-d8d6ddbec6ee/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= @@ -2323,15 +1861,18 @@ 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.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= 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 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f h1:uF6paiQQebLeSXkrTqHqz0MXhXXS1KgF41eUdBNvxK0= +golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/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.0.0-20181121035319-3f7ecaa7e8ca/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= +gonum.org/v1/gonum v0.6.0/go.mod h1:9mxDZsDKxgMAuccQkewq682L+0eCu4dCN2yonUJTCLU= +gonum.org/v1/netlib v0.0.0-20181029234149-ec6d1f5cefe6/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= 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.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= @@ -2340,7 +1881,6 @@ 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= @@ -2358,7 +1898,6 @@ google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34q google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= @@ -2367,38 +1906,44 @@ google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6 google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= -google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= -google.golang.org/api v0.62.0/go.mod h1:dKmwPCydfsad4qCH08MSdgWjfHOyfpd4VtDGgRFdavw= google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= +google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= +google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= +google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= +google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= +google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= +google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= +google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= +google.golang.org/api v0.84.0 h1:NMB9J4cCxs9xEm+1Z9QiO3eFvn7EnQj3Eo3hN6ugVlg= +google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= 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 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8/go.mod h1:0H1ncTHf11KCFhTc/+EFRbzSCOZx+VUbRMk55Yv5MYk= -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= google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190522204451-c2c4e71fbf69/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= +google.golang.org/genproto v0.0.0-20190716160619-c506a9f90610/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= 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= google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200108215221-bd8f9a0ef82f/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200117163144-32f20d992d24/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= @@ -2418,17 +1963,12 @@ google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1m google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20200527145253-8367513e4ece/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200626011028-ee7919e894b5/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200707001353-8e8330bf89df/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201111145450-ac7456db90a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201119123407-9b1e624d6bc4/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= @@ -2439,6 +1979,7 @@ google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= @@ -2455,21 +1996,72 @@ google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEc google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211028162531-8db9c33dc351/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211129164237-f09f9a12af12/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211203200212-54befc351ae9/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211223182754-3ac035c7e7cb/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220317150908-0efb43f6373e/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= -google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd h1:e0TwkXOdbnH/1x5rc5MZ/VYyiZ4v+RdVfrGMqEwT68I= -google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/grpc v1.33.2 h1:EQyQC3sa8M+p6Ulc8yy9SWSS2GVwyRc83gAbG8lrl4o= +google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc h1:Nf+EdcTLHR8qDNN/KfkQL0u0ssxt9OhbaWCl5C0ucEI= +google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= +google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.19.1/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= +google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= +google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.49.0 h1:WTLtQzmQori5FUH25Pq4WT22oCsv8USpQ+F6rqtsmxw= +google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= @@ -2481,12 +2073,12 @@ google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2 google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0 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/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= 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= @@ -2498,18 +2090,14 @@ gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= 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/cheggaaa/pb.v1 v1.0.27/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/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -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.63.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.66.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.66.3 h1:jRskFVxYaMGAMUbN0UZ7niA9gzL9B49DOqE78vg0k3w= -gopkg.in/ini.v1 v1.66.3/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.66.6 h1:LATuAqN/shcYAOkv3wl2L4rkaKqkcgTBQjOyYDvcPKI= +gopkg.in/ini.v1 v1.66.6/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= 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= @@ -2528,23 +2116,21 @@ 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.7/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-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= 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.0.3 h1:4AuOwCGf4lLR9u3YOe2awrHygurzhO/HeQ6laiA6Sx0= gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= -gotest.tools/v3 v3.1.0 h1:rVV8Tcg/8jHUkPUorwjaMTtemIMVXfIPKiOqnhEhakk= -gotest.tools/v3 v3.1.0/go.mod h1:fHy7eyTmJFO5bQbUsEGQ1v4m2J3Jz9eWL54TP2/ZuYQ= +honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -2552,68 +2138,53 @@ 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.2.1/go.mod h1:lPVVZ2BS5TfnjLyizF7o7hv7j9/L+8cZY2hLyjP9cGY= +honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= k8s.io/api v0.20.1/go.mod h1:KqwcCVogGxQY3nBlRpwt+wpAMF/KjaCc7RpywacvqUo= k8s.io/api v0.20.4/go.mod h1:++lNL1AJMkDymriNniQsWRkMDzRaX2Y/POTUi8yvqYQ= k8s.io/api v0.20.6/go.mod h1:X9e8Qag6JV/bL5G6bU8sdVRltWKmdHsFUGS3eVndqE8= -k8s.io/api v0.22.5/go.mod h1:mEhXyLaSD1qTOf40rRiKXkc+2iCem09rWLlFwhCEiAs= k8s.io/apimachinery v0.20.1/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= k8s.io/apimachinery v0.20.4/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= k8s.io/apimachinery v0.20.6/go.mod h1:ejZXtW1Ra6V1O5H8xPBGz+T3+4gfkTCeExAHKU57MAc= -k8s.io/apimachinery v0.22.1/go.mod h1:O3oNtNadZdeOMxHFVxOreoznohCpy0z6mocxbZr7oJ0= -k8s.io/apimachinery v0.22.5/go.mod h1:xziclGKwuuJ2RM5/rSFQSYAj0zdbci3DH8kj+WvyN0U= k8s.io/apiserver v0.20.1/go.mod h1:ro5QHeQkgMS7ZGpvf4tSMx6bBOgPfE+f52KwvXfScaU= k8s.io/apiserver v0.20.4/go.mod h1:Mc80thBKOyy7tbvFtB4kJv1kbdD0eIH8k8vianJcbFM= k8s.io/apiserver v0.20.6/go.mod h1:QIJXNt6i6JB+0YQRNcS0hdRHJlMhflFmsBDeSgT1r8Q= -k8s.io/apiserver v0.22.5/go.mod h1:s2WbtgZAkTKt679sYtSudEQrTGWUSQAPe6MupLnlmaQ= k8s.io/client-go v0.20.1/go.mod h1:/zcHdt1TeWSd5HoUe6elJmHSQ6uLLgp4bIJHVEuy+/Y= k8s.io/client-go v0.20.4/go.mod h1:LiMv25ND1gLUdBeYxBIwKpkSC5IsozMMmOOeSJboP+k= k8s.io/client-go v0.20.6/go.mod h1:nNQMnOvEUEsOzRRFIIkdmYOjAZrC8bgq0ExboWSU1I0= -k8s.io/client-go v0.22.5/go.mod h1:cs6yf/61q2T1SdQL5Rdcjg9J1ElXSwbjSrW2vFImM4Y= k8s.io/code-generator v0.19.7/go.mod h1:lwEq3YnLYb/7uVXLorOJfxg+cUu2oihFhHZ0n9NIla0= k8s.io/component-base v0.20.1/go.mod h1:guxkoJnNoh8LNrbtiQOlyp2Y2XFCZQmrcg2n/DeYNLk= k8s.io/component-base v0.20.4/go.mod h1:t4p9EdiagbVCJKrQ1RsA5/V4rFQNDfRlevJajlGwgjI= k8s.io/component-base v0.20.6/go.mod h1:6f1MPBAeI+mvuts3sIdtpjljHWBQ2cIy38oBIWMYnrM= -k8s.io/component-base v0.22.5/go.mod h1:VK3I+TjuF9eaa+Ln67dKxhGar5ynVbwnGrUiNF4MqCI= k8s.io/cri-api v0.17.3/go.mod h1:X1sbHmuXhwaHs9xxYffLqJogVsnI+f6cPRcgPel7ywM= k8s.io/cri-api v0.20.1/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= k8s.io/cri-api v0.20.4/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= k8s.io/cri-api v0.20.6/go.mod h1:ew44AjNXwyn1s0U4xCKGodU7J1HzBeZ1MpGrpa5r8Yc= -k8s.io/cri-api v0.23.1/go.mod h1:REJE3PSU0h/LOV1APBrupxrEJqnoxZC8KWzkBUHwrK4= k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20200428234225-8167cfdcfc14/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20201113003025-83324d819ded/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/klog/v2 v2.9.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= -k8s.io/klog/v2 v2.30.0/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o= k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= -k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= -k8s.io/kube-openapi v0.0.0-20211109043538-20434351676c/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20210819203725-bdf08cb9a70a/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20210930125809-cb0fa318a74b/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -mvdan.cc/gofumpt v0.1.1/go.mod h1:yXG1r1WqZVKWbVRtBWKWX9+CxGYfA51nSomhM0woR48= -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-20210104141923-aac4ce9116a7/go.mod h1:hBpJkZE8H/sb+VRFvw2+rBpHNsTBcvSpk61hr8mzXZE= nhooyr.io/websocket v1.8.6 h1:s+C3xAMLwGmlI31Nyn/eAehUlZPwfYZu2JXM621Q5/k= nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= +pgregory.net/rapid v0.4.7 h1:MTNRktPuv5FNqOO151TM9mDTa+XHcX6ypYeISDVD14g= +pgregory.net/rapid v0.4.7/go.mod h1:UYpPVyjFHzYBGHIxLFoupi8vwk6rXNzRY9OMvVxFIOU= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.22/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= sigs.k8s.io/structured-merge-diff/v4 v4.0.3/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.1.2/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= +sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= diff --git a/ignite/templates/field/datatype/bool.go b/ignite/templates/field/datatype/bool.go index a1d459f206..a0556c0c1a 100644 --- a/ignite/templates/field/datatype/bool.go +++ b/ignite/templates/field/datatype/bool.go @@ -6,36 +6,34 @@ import ( "github.com/ignite/cli/ignite/pkg/multiformatname" ) -var ( - // DataBool bool data type definition - DataBool = DataType{ - DataType: func(string) string { return "bool" }, - DefaultTestValue: "false", - ValueLoop: "false", - ValueIndex: "false", - ValueInvalidIndex: "false", - ProtoType: func(_, name string, index int) string { - return fmt.Sprintf("bool %s = %d", name, index) - }, - GenesisArgs: func(name multiformatname.Name, value int) string { - return fmt.Sprintf("%s: %t,\n", name.UpperCamel, value%2 == 0) - }, - CLIArgs: func(name multiformatname.Name, _, prefix string, argIndex int) string { - return fmt.Sprintf(`%s%s, err := cast.ToBoolE(args[%d]) +// DataBool bool data type definition +var DataBool = DataType{ + DataType: func(string) string { return "bool" }, + DefaultTestValue: "false", + ValueLoop: "false", + ValueIndex: "false", + ValueInvalidIndex: "false", + ProtoType: func(_, name string, index int) string { + return fmt.Sprintf("bool %s = %d", name, index) + }, + GenesisArgs: func(name multiformatname.Name, value int) string { + return fmt.Sprintf("%s: %t,\n", name.UpperCamel, value%2 == 0) + }, + CLIArgs: func(name multiformatname.Name, _, prefix string, argIndex int) string { + return fmt.Sprintf(`%s%s, err := cast.ToBoolE(args[%d]) if err != nil { return err }`, - prefix, name.UpperCamel, argIndex) - }, - ToBytes: func(name string) string { - return fmt.Sprintf(`%[1]vBytes := []byte{0} + prefix, name.UpperCamel, argIndex) + }, + ToBytes: func(name string) string { + return fmt.Sprintf(`%[1]vBytes := []byte{0} if %[1]v { %[1]vBytes = []byte{1} }`, name) - }, - ToString: func(name string) string { - return fmt.Sprintf("strconv.FormatBool(%s)", name) - }, - GoCLIImports: []GoImport{{Name: "github.com/spf13/cast"}}, - } -) + }, + ToString: func(name string) string { + return fmt.Sprintf("strconv.FormatBool(%s)", name) + }, + GoCLIImports: []GoImport{{Name: "github.com/spf13/cast"}}, +} diff --git a/ignite/templates/field/datatype/custom.go b/ignite/templates/field/datatype/custom.go index 17e69572a5..f240552d6a 100644 --- a/ignite/templates/field/datatype/custom.go +++ b/ignite/templates/field/datatype/custom.go @@ -6,25 +6,23 @@ import ( "github.com/ignite/cli/ignite/pkg/multiformatname" ) -var ( - // DataCustom custom data type definition - DataCustom = DataType{ - DataType: func(datatype string) string { return fmt.Sprintf("*%s", datatype) }, - DefaultTestValue: "null", - ProtoType: func(datatype, name string, index int) string { - return fmt.Sprintf("%s %s = %d", datatype, name, index) - }, - GenesisArgs: func(name multiformatname.Name, value int) string { - return fmt.Sprintf("%s: new(types.%s),\n", name.UpperCamel, name.UpperCamel) - }, - CLIArgs: func(name multiformatname.Name, datatype, prefix string, argIndex int) string { - return fmt.Sprintf(`%[1]v%[2]v := new(types.%[3]v) +// DataCustom custom data type definition +var DataCustom = DataType{ + DataType: func(datatype string) string { return fmt.Sprintf("*%s", datatype) }, + DefaultTestValue: "null", + ProtoType: func(datatype, name string, index int) string { + return fmt.Sprintf("%s %s = %d", datatype, name, index) + }, + GenesisArgs: func(name multiformatname.Name, value int) string { + return fmt.Sprintf("%s: new(types.%s),\n", name.UpperCamel, name.UpperCamel) + }, + CLIArgs: func(name multiformatname.Name, datatype, prefix string, argIndex int) string { + return fmt.Sprintf(`%[1]v%[2]v := new(types.%[3]v) err = json.Unmarshal([]byte(args[%[4]v]), %[1]v%[2]v) if err != nil { return err }`, prefix, name.UpperCamel, datatype, argIndex) - }, - GoCLIImports: []GoImport{{Name: "encoding/json"}}, - NonIndex: true, - } -) + }, + GoCLIImports: []GoImport{{Name: "encoding/json"}}, + NonIndex: true, +} diff --git a/ignite/templates/field/parse.go b/ignite/templates/field/parse.go index 29272df355..ae852d4425 100644 --- a/ignite/templates/field/parse.go +++ b/ignite/templates/field/parse.go @@ -18,7 +18,6 @@ func validateField(field string, isForbiddenField func(string) error) (multiform name, err := multiformatname.NewName(fieldSplit[0]) if err != nil { return name, "", err - } // Ensure the field Name is not a Go reserved Name, it would generate an incorrect code diff --git a/ignite/templates/ibc/oracle.go b/ignite/templates/ibc/oracle.go index 79e988bbda..a96182d1f9 100644 --- a/ignite/templates/ibc/oracle.go +++ b/ignite/templates/ibc/oracle.go @@ -19,10 +19,8 @@ import ( "github.com/ignite/cli/ignite/templates/testutil" ) -var ( - //go:embed oracle/* oracle/**/* - fsOracle embed.FS -) +//go:embed oracle/* oracle/**/* +var fsOracle embed.FS // OracleOptions are options to scaffold an oracle query in a IBC module type OracleOptions struct { @@ -43,7 +41,6 @@ func NewOracle(replacer placeholder.Replacer, opts *OracleOptions) (*genny.Gener g.RunFn(moduleOracleModify(replacer, opts)) g.RunFn(protoQueryOracleModify(replacer, opts)) g.RunFn(protoTxOracleModify(replacer, opts)) - g.RunFn(handlerTxOracleModify(replacer, opts)) g.RunFn(clientCliQueryOracleModify(replacer, opts)) g.RunFn(clientCliTxOracleModify(replacer, opts)) g.RunFn(codecOracleModify(replacer, opts)) @@ -86,9 +83,9 @@ func moduleOracleModify(replacer placeholder.Replacer, opts *OracleOptions) genn } // Recv packet dispatch - templateRecv := `oracleAck, err := am.handleOraclePacket(ctx, modulePacket) + templateRecv := `oracleAck, err := im.handleOraclePacket(ctx, modulePacket) if err != nil { - return channeltypes.NewErrorAcknowledgement(sdkerrors.Wrap(sdkerrors.ErrUnknownRequest, "cannot unmarshal packet data: "+err.Error()).Error()) + return channeltypes.NewErrorAcknowledgement(sdkerrors.Wrap(sdkerrors.ErrUnknownRequest, "cannot unmarshal packet data: "+err.Error())) } else if ack != oracleAck { return oracleAck } @@ -97,7 +94,7 @@ func moduleOracleModify(replacer placeholder.Replacer, opts *OracleOptions) genn content := replacer.ReplaceOnce(f.String(), PlaceholderOraclePacketModuleRecv, replacementRecv) // Ack packet dispatch - templateAck := `sdkResult, err := am.handleOracleAcknowledgment(ctx, ack, modulePacket) + templateAck := `sdkResult, err := im.handleOracleAcknowledgment(ctx, ack, modulePacket) if err != nil { return err } @@ -229,29 +226,6 @@ message Msg%[2]vDataResponse { } } -func handlerTxOracleModify(replacer placeholder.Replacer, opts *OracleOptions) genny.RunFn { - return func(r *genny.Runner) error { - path := filepath.Join(opts.AppPath, "x", opts.ModuleName, "handler.go") - f, err := r.Disk.Find(path) - if err != nil { - return err - } - - // Set once the MsgServer definition if it is not defined yet - replacementMsgServer := `msgServer := keeper.NewMsgServerImpl(k)` - content := replacer.ReplaceOnce(f.String(), PlaceholderHandlerMsgServer, replacementMsgServer) - - templateHandlers := `case *types.Msg%[2]vData: - res, err := msgServer.%[2]vData(sdk.WrapSDKContext(ctx), msg) - return sdk.WrapServiceResult(ctx, res, err) -%[1]v` - replacementHandlers := fmt.Sprintf(templateHandlers, Placeholder, opts.QueryName.UpperCamel) - content = replacer.Replace(content, Placeholder, replacementHandlers) - newFile := genny.NewFileS(path, content) - return r.File(newFile) - } -} - func clientCliQueryOracleModify(replacer placeholder.Replacer, opts *OracleOptions) genny.RunFn { return func(r *genny.Runner) error { path := filepath.Join(opts.AppPath, "x", opts.ModuleName, "client/cli/query.go") @@ -330,11 +304,11 @@ func packetHandlerOracleModify(replacer placeholder.Replacer, opts *OracleOption case types.%[3]vClientIDKey: var %[2]vResult types.%[3]vResult if err := obi.Decode(modulePacketData.Result, &%[2]vResult); err != nil { - ack = channeltypes.NewErrorAcknowledgement(err.Error()) + ack = channeltypes.NewErrorAcknowledgement(err) return ack, sdkerrors.Wrap(sdkerrors.ErrUnknownRequest, "cannot decode the %[2]v received packet") } - am.keeper.Set%[3]vResult(ctx, types.OracleRequestID(modulePacketData.RequestID), %[2]vResult) + im.keeper.Set%[3]vResult(ctx, types.OracleRequestID(modulePacketData.RequestID), %[2]vResult) // TODO: %[3]v oracle data reception logic %[1]v` @@ -350,7 +324,7 @@ func packetHandlerOracleModify(replacer placeholder.Replacer, opts *OracleOption return nil, sdkerrors.Wrap(err, "cannot decode the %[2]v oracle acknowledgment packet") } - am.keeper.SetLast%[3]vID(ctx, requestID) + im.keeper.SetLast%[3]vID(ctx, requestID) return &sdk.Result{}, nil %[1]v` replacementInterface := fmt.Sprintf(templateAck, PlaceholderOracleModuleAck, diff --git a/ignite/templates/ibc/oracle/x/{{moduleName}}/keeper/msg_{{queryName}}.go.plush b/ignite/templates/ibc/oracle/x/{{moduleName}}/keeper/msg_{{queryName}}.go.plush index 579c664abf..fae5b59b20 100644 --- a/ignite/templates/ibc/oracle/x/{{moduleName}}/keeper/msg_{{queryName}}.go.plush +++ b/ignite/templates/ibc/oracle/x/{{moduleName}}/keeper/msg_{{queryName}}.go.plush @@ -8,9 +8,9 @@ import ( "github.com/bandprotocol/bandchain-packet/packet" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - clienttypes "github.com/cosmos/ibc-go/v3/modules/core/02-client/types" - channeltypes "github.com/cosmos/ibc-go/v3/modules/core/04-channel/types" - host "github.com/cosmos/ibc-go/v3/modules/core/24-host" + clienttypes "github.com/cosmos/ibc-go/v5/modules/core/02-client/types" + channeltypes "github.com/cosmos/ibc-go/v5/modules/core/04-channel/types" + host "github.com/cosmos/ibc-go/v5/modules/core/24-host" "<%= ModulePath %>/x/<%= moduleName %>/types" ) diff --git a/ignite/templates/ibc/oracle/x/{{moduleName}}/oracle.go.plush b/ignite/templates/ibc/oracle/x/{{moduleName}}/oracle.go.plush index 0a8906bf59..dfb5dcc8b4 100644 --- a/ignite/templates/ibc/oracle/x/{{moduleName}}/oracle.go.plush +++ b/ignite/templates/ibc/oracle/x/{{moduleName}}/oracle.go.plush @@ -5,13 +5,13 @@ import ( "github.com/bandprotocol/bandchain-packet/packet" 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" + channeltypes "github.com/cosmos/ibc-go/v5/modules/core/04-channel/types" "<%= ModulePath %>/x/<%= moduleName %>/types" ) // handleOraclePacket handles the result of the received BandChain oracles // packet and saves the data into the KV database -func (am AppModule) handleOraclePacket( +func (im IBCModule) handleOraclePacket( ctx sdk.Context, modulePacket channeltypes.Packet, ) (channeltypes.Acknowledgement, error) { @@ -27,7 +27,7 @@ func (am AppModule) handleOraclePacket( default: err := sdkerrors.Wrapf(sdkerrors.ErrJSONUnmarshal, "oracle received packet not found: %s", modulePacketData.GetClientID()) - ack = channeltypes.NewErrorAcknowledgement(err.Error()) + ack = channeltypes.NewErrorAcknowledgement(err) return ack, err } @@ -41,7 +41,7 @@ func (am AppModule) handleOraclePacket( // handleOracleAcknowledgment handles the acknowledgment result from the BandChain // request and saves the request-id into the KV database -func (am AppModule) handleOracleAcknowledgment( +func (im IBCModule) handleOracleAcknowledgment( ctx sdk.Context, ack channeltypes.Acknowledgement, modulePacket channeltypes.Packet, diff --git a/ignite/templates/ibc/packet.go b/ignite/templates/ibc/packet.go index 766994759f..2e9c9c4511 100644 --- a/ignite/templates/ibc/packet.go +++ b/ignite/templates/ibc/packet.go @@ -69,7 +69,6 @@ func NewPacket(replacer placeholder.Replacer, opts *PacketOptions) (*genny.Gener // Add the send message if !opts.NoMessage { g.RunFn(protoTxModify(replacer, opts)) - g.RunFn(handlerTxModify(replacer, opts)) g.RunFn(clientCliTxModify(replacer, opts)) g.RunFn(codecModify(replacer, opts)) if err := g.Box(messagesTemplate); err != nil { @@ -109,14 +108,14 @@ func moduleModify(replacer placeholder.Replacer, opts *PacketOptions) genny.RunF // Recv packet dispatch templateRecv := `case *types.%[2]vPacketData_%[3]vPacket: - packetAck, err := am.keeper.OnRecv%[3]vPacket(ctx, modulePacket, *packet.%[3]vPacket) + packetAck, err := im.keeper.OnRecv%[3]vPacket(ctx, modulePacket, *packet.%[3]vPacket) if err != nil { - ack = channeltypes.NewErrorAcknowledgement(err.Error()) + ack = channeltypes.NewErrorAcknowledgement(err) } else { // Encode packet acknowledgment packetAckBytes, err := types.ModuleCdc.MarshalJSON(&packetAck) if err != nil { - return channeltypes.NewErrorAcknowledgement(sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error()).Error()) + return channeltypes.NewErrorAcknowledgement(sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error())) } ack = channeltypes.NewResultAcknowledgement(sdk.MustSortJSON(packetAckBytes)) } @@ -138,7 +137,7 @@ func moduleModify(replacer placeholder.Replacer, opts *PacketOptions) genny.RunF // Ack packet dispatch templateAck := `case *types.%[2]vPacketData_%[3]vPacket: - err := am.keeper.OnAcknowledgement%[3]vPacket(ctx, modulePacket, *packet.%[3]vPacket, ack) + err := im.keeper.OnAcknowledgement%[3]vPacket(ctx, modulePacket, *packet.%[3]vPacket, ack) if err != nil { return err } @@ -154,7 +153,7 @@ func moduleModify(replacer placeholder.Replacer, opts *PacketOptions) genny.RunF // Timeout packet dispatch templateTimeout := `case *types.%[2]vPacketData_%[3]vPacket: - err := am.keeper.OnTimeout%[3]vPacket(ctx, modulePacket, *packet.%[3]vPacket) + err := im.keeper.OnTimeout%[3]vPacket(ctx, modulePacket, *packet.%[3]vPacket) if err != nil { return err } @@ -336,32 +335,6 @@ message MsgSend%[2]vResponse { } } -func handlerTxModify(replacer placeholder.Replacer, opts *PacketOptions) genny.RunFn { - return func(r *genny.Runner) error { - path := filepath.Join(opts.AppPath, "x", opts.ModuleName, "handler.go") - f, err := r.Disk.Find(path) - if err != nil { - return err - } - - // Set once the MsgServer definition if it is not defined yet - replacementMsgServer := `msgServer := keeper.NewMsgServerImpl(k)` - content := replacer.ReplaceOnce(f.String(), PlaceholderHandlerMsgServer, replacementMsgServer) - - templateHandlers := `case *types.MsgSend%[2]v: - res, err := msgServer.Send%[2]v(sdk.WrapSDKContext(ctx), msg) - return sdk.WrapServiceResult(ctx, res, err) -%[1]v` - replacementHandlers := fmt.Sprintf(templateHandlers, - Placeholder, - opts.PacketName.UpperCamel, - ) - content = replacer.Replace(content, Placeholder, replacementHandlers) - newFile := genny.NewFileS(path, content) - return r.File(newFile) - } -} - func clientCliTxModify(replacer placeholder.Replacer, opts *PacketOptions) genny.RunFn { return func(r *genny.Runner) error { path := filepath.Join(opts.AppPath, "x", opts.ModuleName, "client/cli/tx.go") diff --git a/ignite/templates/ibc/packet/component/x/{{moduleName}}/keeper/{{packetName}}.go.plush b/ignite/templates/ibc/packet/component/x/{{moduleName}}/keeper/{{packetName}}.go.plush index 8f0a9d9626..178a9347bc 100644 --- a/ignite/templates/ibc/packet/component/x/{{moduleName}}/keeper/{{packetName}}.go.plush +++ b/ignite/templates/ibc/packet/component/x/{{moduleName}}/keeper/{{packetName}}.go.plush @@ -6,9 +6,9 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" "<%= ModulePath %>/x/<%= moduleName %>/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" - host "github.com/cosmos/ibc-go/v3/modules/core/24-host" + clienttypes "github.com/cosmos/ibc-go/v5/modules/core/02-client/types" + channeltypes "github.com/cosmos/ibc-go/v5/modules/core/04-channel/types" + host "github.com/cosmos/ibc-go/v5/modules/core/24-host" ) // Transmit<%= packetName.UpperCamel %>Packet transmits the packet over IBC with the specified source port and source channel diff --git a/ignite/templates/ibc/packet/messages/x/{{moduleName}}/client/cli/tx_{{packetName}}.go.plush b/ignite/templates/ibc/packet/messages/x/{{moduleName}}/client/cli/tx_{{packetName}}.go.plush index e4b588f158..171438b96d 100644 --- a/ignite/templates/ibc/packet/messages/x/{{moduleName}}/client/cli/tx_{{packetName}}.go.plush +++ b/ignite/templates/ibc/packet/messages/x/{{moduleName}}/client/cli/tx_{{packetName}}.go.plush @@ -9,7 +9,7 @@ import ( "github.com/cosmos/cosmos-sdk/client/flags" "github.com/cosmos/cosmos-sdk/client/tx" "<%= ModulePath %>/x/<%= moduleName %>/types" - channelutils "github.com/cosmos/ibc-go/v3/modules/core/04-channel/client/utils" + channelutils "github.com/cosmos/ibc-go/v5/modules/core/04-channel/client/utils" ) var _ = strconv.Itoa(0) diff --git a/ignite/templates/ibc/packet/messages/x/{{moduleName}}/keeper/msg_server_{{packetName}}.go.plush b/ignite/templates/ibc/packet/messages/x/{{moduleName}}/keeper/msg_server_{{packetName}}.go.plush index 7cdef1d931..3ba04068ad 100644 --- a/ignite/templates/ibc/packet/messages/x/{{moduleName}}/keeper/msg_server_{{packetName}}.go.plush +++ b/ignite/templates/ibc/packet/messages/x/{{moduleName}}/keeper/msg_server_{{packetName}}.go.plush @@ -5,7 +5,7 @@ import ( "<%= ModulePath %>/x/<%= moduleName %>/types" sdk "github.com/cosmos/cosmos-sdk/types" - clienttypes "github.com/cosmos/ibc-go/v3/modules/core/02-client/types" + clienttypes "github.com/cosmos/ibc-go/v5/modules/core/02-client/types" ) diff --git a/ignite/templates/message/stargate.go b/ignite/templates/message/stargate.go index f201b291ee..20777e5d6f 100644 --- a/ignite/templates/message/stargate.go +++ b/ignite/templates/message/stargate.go @@ -16,7 +16,6 @@ import ( func NewStargate(replacer placeholder.Replacer, opts *Options) (*genny.Generator, error) { g := genny.New() - g.RunFn(handlerModify(replacer, opts)) g.RunFn(protoTxRPCModify(replacer, opts)) g.RunFn(protoTxMessageModify(replacer, opts)) g.RunFn(typesCodecModify(replacer, opts)) @@ -42,32 +41,6 @@ func NewStargate(replacer placeholder.Replacer, opts *Options) (*genny.Generator return g, Box(template, opts, g) } -func handlerModify(replacer placeholder.Replacer, opts *Options) genny.RunFn { - return func(r *genny.Runner) error { - path := filepath.Join(opts.AppPath, "x", opts.ModuleName, "handler.go") - f, err := r.Disk.Find(path) - if err != nil { - return err - } - - // Set once the MsgServer definition if it is not defined yet - replacementMsgServer := `msgServer := keeper.NewMsgServerImpl(k)` - content := replacer.ReplaceOnce(f.String(), PlaceholderHandlerMsgServer, replacementMsgServer) - - templateHandlers := `case *types.Msg%[2]v: - res, err := msgServer.%[2]v(sdk.WrapSDKContext(ctx), msg) - return sdk.WrapServiceResult(ctx, res, err) -%[1]v` - replacementHandlers := fmt.Sprintf(templateHandlers, - Placeholder, - opts.MsgName.UpperCamel, - ) - content = replacer.Replace(content, Placeholder, replacementHandlers) - newFile := genny.NewFileS(path, content) - return r.File(newFile) - } -} - func protoTxRPCModify(replacer placeholder.Replacer, opts *Options) genny.RunFn { return func(r *genny.Runner) error { path := filepath.Join(opts.AppPath, "proto", opts.ModuleName, "tx.proto") diff --git a/ignite/templates/module/create/ibc.go b/ignite/templates/module/create/ibc.go index 69b39f5f6d..7357701578 100644 --- a/ignite/templates/module/create/ibc.go +++ b/ignite/templates/module/create/ibc.go @@ -93,7 +93,7 @@ func genesisTypesModify(replacer placeholder.Replacer, opts *CreateOptions) genn } // Import - templateImport := `host "github.com/cosmos/ibc-go/v3/modules/core/24-host" + templateImport := `host "github.com/cosmos/ibc-go/v5/modules/core/24-host" %s` replacementImport := fmt.Sprintf(templateImport, typed.PlaceholderGenesisTypesImport) content := replacer.Replace(f.String(), typed.PlaceholderGenesisTypesImport, replacementImport) @@ -177,15 +177,26 @@ func appIBCModify(replacer placeholder.Replacer, opts *CreateOptions) genny.RunF return err } + // create IBC module + templateIBCModule := `%[2]vIBCModule := %[2]vmodule.NewIBCModule(app.%[3]vKeeper) +%[1]v` + replacementIBCModule := fmt.Sprintf( + templateIBCModule, + module.PlaceholderSgAppKeeperDefinition, + opts.ModuleName, + xstrings.Title(opts.ModuleName), + ) + content := replacer.Replace(f.String(), module.PlaceholderSgAppKeeperDefinition, replacementIBCModule) + // Add route to IBC router - templateRouter := `ibcRouter.AddRoute(%[2]vmoduletypes.ModuleName, %[2]vModule) + templateRouter := `ibcRouter.AddRoute(%[2]vmoduletypes.ModuleName, %[2]vIBCModule) %[1]v` replacementRouter := fmt.Sprintf( templateRouter, module.PlaceholderIBCAppRouter, opts.ModuleName, ) - content := replacer.Replace(f.String(), module.PlaceholderIBCAppRouter, replacementRouter) + content = replacer.Replace(content, module.PlaceholderIBCAppRouter, replacementRouter) // Scoped keeper declaration for the module templateScopedKeeperDeclaration := `Scoped%[1]vKeeper capabilitykeeper.ScopedKeeper` diff --git a/ignite/templates/module/create/ibc/testutil/keeper/{{moduleName}}.go.plush b/ignite/templates/module/create/ibc/testutil/keeper/{{moduleName}}.go.plush index add3443f3c..3be5046120 100644 --- a/ignite/templates/module/create/ibc/testutil/keeper/{{moduleName}}.go.plush +++ b/ignite/templates/module/create/ibc/testutil/keeper/{{moduleName}}.go.plush @@ -14,8 +14,8 @@ import ( capabilitykeeper "github.com/cosmos/cosmos-sdk/x/capability/keeper" capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types" typesparams "github.com/cosmos/cosmos-sdk/x/params/types" - channeltypes "github.com/cosmos/ibc-go/v3/modules/core/04-channel/types" - ibcexported "github.com/cosmos/ibc-go/v3/modules/core/exported" + channeltypes "github.com/cosmos/ibc-go/v5/modules/core/04-channel/types" + ibcexported "github.com/cosmos/ibc-go/v5/modules/core/exported" "github.com/stretchr/testify/require" "github.com/tendermint/tendermint/libs/log" tmproto "github.com/tendermint/tendermint/proto/tendermint/types" @@ -55,8 +55,8 @@ func <%= title(moduleName) %>Keeper(t testing.TB) (*keeper.Keeper, sdk.Context) db := tmdb.NewMemDB() stateStore := store.NewCommitMultiStore(db) - stateStore.MountStoreWithDB(storeKey, sdk.StoreTypeIAVL, db) - stateStore.MountStoreWithDB(memStoreKey, sdk.StoreTypeMemory, nil) + stateStore.MountStoreWithDB(storeKey, storetypes.StoreTypeIAVL, db) + stateStore.MountStoreWithDB(memStoreKey, storetypes.StoreTypeMemory, nil) require.NoError(t, stateStore.LoadLatestVersion()) registry := codectypes.NewInterfaceRegistry() diff --git a/ignite/templates/module/create/ibc/x/{{moduleName}}/module_ibc.go.plush b/ignite/templates/module/create/ibc/x/{{moduleName}}/module_ibc.go.plush index 9920760016..108cae277d 100644 --- a/ignite/templates/module/create/ibc/x/{{moduleName}}/module_ibc.go.plush +++ b/ignite/templates/module/create/ibc/x/{{moduleName}}/module_ibc.go.plush @@ -6,15 +6,26 @@ import ( 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" - ibcexported "github.com/cosmos/ibc-go/v3/modules/core/exported" + channeltypes "github.com/cosmos/ibc-go/v5/modules/core/04-channel/types" + porttypes "github.com/cosmos/ibc-go/v5/modules/core/05-port/types" + host "github.com/cosmos/ibc-go/v5/modules/core/24-host" + ibcexported "github.com/cosmos/ibc-go/v5/modules/core/exported" + "<%= modulePath %>/x/<%= moduleName %>/keeper" "<%= modulePath %>/x/<%= moduleName %>/types" ) +type IBCModule struct { + keeper keeper.Keeper +} + +func NewIBCModule(k keeper.Keeper) IBCModule { + return IBCModule{ + keeper: k, + } +} + // OnChanOpenInit implements the IBCModule interface -func (am AppModule) OnChanOpenInit( +func (im IBCModule) OnChanOpenInit( ctx sdk.Context, order channeltypes.Order, connectionHops []string, @@ -23,31 +34,31 @@ func (am AppModule) OnChanOpenInit( chanCap *capabilitytypes.Capability, counterparty channeltypes.Counterparty, version string, -) error { +) (string, error) { <%= if (ibcOrdering != "NONE") { %>if order != channeltypes.<%= ibcOrdering %> { - return sdkerrors.Wrapf(channeltypes.ErrInvalidChannelOrdering, "expected %s channel, got %s ", channeltypes.<%= ibcOrdering %>, order) + return "", sdkerrors.Wrapf(channeltypes.ErrInvalidChannelOrdering, "expected %s channel, got %s ", channeltypes.<%= ibcOrdering %>, order) }<% } %> // Require portID is the portID module is bound to - boundPort := am.keeper.GetPort(ctx) + boundPort := im.keeper.GetPort(ctx) if boundPort != portID { - return sdkerrors.Wrapf(porttypes.ErrInvalidPort, "invalid port: %s, expected %s", portID, boundPort) + return "", sdkerrors.Wrapf(porttypes.ErrInvalidPort, "invalid port: %s, expected %s", portID, boundPort) } if version != types.Version { - return sdkerrors.Wrapf(types.ErrInvalidVersion, "got %s, expected %s", version, types.Version) + return "", sdkerrors.Wrapf(types.ErrInvalidVersion, "got %s, expected %s", version, types.Version) } // Claim channel capability passed back by IBC module - if err := am.keeper.ClaimCapability(ctx, chanCap, host.ChannelCapabilityPath(portID, channelID)); err != nil { - return err + if err := im.keeper.ClaimCapability(ctx, chanCap, host.ChannelCapabilityPath(portID, channelID)); err != nil { + return "", err } - return nil + return version, nil } // OnChanOpenTry implements the IBCModule interface -func (am AppModule) OnChanOpenTry( +func (im IBCModule) OnChanOpenTry( ctx sdk.Context, order channeltypes.Order, connectionHops []string, @@ -62,7 +73,7 @@ func (am AppModule) OnChanOpenTry( }<% } %> // Require portID is the portID module is bound to - boundPort := am.keeper.GetPort(ctx) + boundPort := im.keeper.GetPort(ctx) if boundPort != portID { return "", sdkerrors.Wrapf(porttypes.ErrInvalidPort, "invalid port: %s, expected %s", portID, boundPort) } @@ -75,9 +86,9 @@ func (am AppModule) OnChanOpenTry( // (ie chainA and chainB both call ChanOpenInit before one of them calls ChanOpenTry) // If module can already authenticate the capability then module already owns it so we don't need to claim // Otherwise, module does not have channel capability and we must claim it from IBC - if !am.keeper.AuthenticateCapability(ctx, chanCap, host.ChannelCapabilityPath(portID, channelID)) { + if !im.keeper.AuthenticateCapability(ctx, chanCap, host.ChannelCapabilityPath(portID, channelID)) { // Only claim channel capability passed back by IBC module if we do not already own it - if err := am.keeper.ClaimCapability(ctx, chanCap, host.ChannelCapabilityPath(portID, channelID)); err != nil { + if err := im.keeper.ClaimCapability(ctx, chanCap, host.ChannelCapabilityPath(portID, channelID)); err != nil { return "", err } } @@ -86,7 +97,7 @@ func (am AppModule) OnChanOpenTry( } // OnChanOpenAck implements the IBCModule interface -func (am AppModule) OnChanOpenAck( +func (im IBCModule) OnChanOpenAck( ctx sdk.Context, portID, channelID string, @@ -100,7 +111,7 @@ func (am AppModule) OnChanOpenAck( } // OnChanOpenConfirm implements the IBCModule interface -func (am AppModule) OnChanOpenConfirm( +func (im IBCModule) OnChanOpenConfirm( ctx sdk.Context, portID, channelID string, @@ -109,7 +120,7 @@ func (am AppModule) OnChanOpenConfirm( } // OnChanCloseInit implements the IBCModule interface -func (am AppModule) OnChanCloseInit( +func (im IBCModule) OnChanCloseInit( ctx sdk.Context, portID, channelID string, @@ -119,7 +130,7 @@ func (am AppModule) OnChanCloseInit( } // OnChanCloseConfirm implements the IBCModule interface -func (am AppModule) OnChanCloseConfirm( +func (im IBCModule) OnChanCloseConfirm( ctx sdk.Context, portID, channelID string, @@ -128,7 +139,7 @@ func (am AppModule) OnChanCloseConfirm( } // OnRecvPacket implements the IBCModule interface -func (am AppModule) OnRecvPacket( +func (im IBCModule) OnRecvPacket( ctx sdk.Context, modulePacket channeltypes.Packet, relayer sdk.AccAddress, @@ -139,15 +150,15 @@ func (am AppModule) OnRecvPacket( var modulePacketData types.<%= title(moduleName) %>PacketData if err := modulePacketData.Unmarshal(modulePacket.GetData()); err != nil { - return channeltypes.NewErrorAcknowledgement(sdkerrors.Wrapf(sdkerrors.ErrUnknownRequest, "cannot unmarshal packet data: %s", err.Error()).Error()) + return channeltypes.NewErrorAcknowledgement(sdkerrors.Wrapf(sdkerrors.ErrUnknownRequest, "cannot unmarshal packet data: %s", err.Error())) } // Dispatch packet switch packet := modulePacketData.Packet.(type) { // this line is used by starport scaffolding # ibc/packet/module/recv default: - errMsg := fmt.Sprintf("unrecognized %s packet type: %T", types.ModuleName, packet) - return channeltypes.NewErrorAcknowledgement(errMsg) + err := fmt.Errorf("unrecognized %s packet type: %T", types.ModuleName, packet) + return channeltypes.NewErrorAcknowledgement(err) } // NOTE: acknowledgement will be written synchronously during IBC handler execution. @@ -155,7 +166,7 @@ func (am AppModule) OnRecvPacket( } // OnAcknowledgementPacket implements the IBCModule interface -func (am AppModule) OnAcknowledgementPacket( +func (im IBCModule) OnAcknowledgementPacket( ctx sdk.Context, modulePacket channeltypes.Packet, acknowledgement []byte, @@ -212,7 +223,7 @@ func (am AppModule) OnAcknowledgementPacket( } // OnTimeoutPacket implements the IBCModule interface -func (am AppModule) OnTimeoutPacket( +func (im IBCModule) OnTimeoutPacket( ctx sdk.Context, modulePacket channeltypes.Packet, relayer sdk.AccAddress, diff --git a/ignite/templates/module/create/msgserver.go b/ignite/templates/module/create/msgserver.go index fe4465e92a..a69b00ecb6 100644 --- a/ignite/templates/module/create/msgserver.go +++ b/ignite/templates/module/create/msgserver.go @@ -13,7 +13,6 @@ import ( "github.com/ignite/cli/ignite/pkg/xgenny" "github.com/ignite/cli/ignite/templates/field/plushhelpers" "github.com/ignite/cli/ignite/templates/module" - "github.com/ignite/cli/ignite/templates/typed" ) const msgServiceImport = `"github.com/cosmos/cosmos-sdk/types/msgservice"` @@ -26,7 +25,6 @@ func AddMsgServerConventionToLegacyModule(replacer placeholder.Replacer, opts *M template = xgenny.NewEmbedWalker(fsMsgServer, "msgserver/", opts.AppPath) ) - g.RunFn(handlerPatch(replacer, opts.AppPath, opts.ModuleName)) g.RunFn(codecPath(replacer, opts.AppPath, opts.ModuleName)) if err := g.Box(template); err != nil { @@ -47,25 +45,6 @@ func AddMsgServerConventionToLegacyModule(replacer placeholder.Replacer, opts *M return g, nil } -func handlerPatch(replacer placeholder.Replacer, appPath, moduleName string) genny.RunFn { - return func(r *genny.Runner) error { - path := filepath.Join(appPath, "x", moduleName, "handler.go") - f, err := r.Disk.Find(path) - if err != nil { - return err - } - - // Add the msg server definition placeholder - old := "func NewHandler(k keeper.Keeper) sdk.Handler {" - new := fmt.Sprintf(`%v -%v`, old, typed.PlaceholderHandlerMsgServer) - content := replacer.ReplaceOnce(f.String(), old, new) - - newFile := genny.NewFileS(path, content) - return r.File(newFile) - } -} - func codecPath(replacer placeholder.Replacer, appPath, moduleName string) genny.RunFn { return func(r *genny.Runner) error { path := filepath.Join(appPath, "x", moduleName, "types/codec.go") diff --git a/ignite/templates/module/create/simapp/x/{{moduleName}}/simulation/simap.go.plush b/ignite/templates/module/create/simapp/x/{{moduleName}}/simulation/helpers.go.plush similarity index 100% rename from ignite/templates/module/create/simapp/x/{{moduleName}}/simulation/simap.go.plush rename to ignite/templates/module/create/simapp/x/{{moduleName}}/simulation/helpers.go.plush diff --git a/ignite/templates/module/create/stargate/testutil/keeper/{{moduleName}}.go.plush b/ignite/templates/module/create/stargate/testutil/keeper/{{moduleName}}.go.plush index 06e411158f..520d94c62c 100644 --- a/ignite/templates/module/create/stargate/testutil/keeper/{{moduleName}}.go.plush +++ b/ignite/templates/module/create/stargate/testutil/keeper/{{moduleName}}.go.plush @@ -23,8 +23,8 @@ func <%= title(moduleName) %>Keeper(t testing.TB) (*keeper.Keeper, sdk.Context) db := tmdb.NewMemDB() stateStore := store.NewCommitMultiStore(db) - stateStore.MountStoreWithDB(storeKey, sdk.StoreTypeIAVL, db) - stateStore.MountStoreWithDB(memStoreKey, sdk.StoreTypeMemory, nil) + stateStore.MountStoreWithDB(storeKey, storetypes.StoreTypeIAVL, db) + stateStore.MountStoreWithDB(memStoreKey, storetypes.StoreTypeMemory, nil) require.NoError(t, stateStore.LoadLatestVersion()) registry := codectypes.NewInterfaceRegistry() diff --git a/ignite/templates/module/create/stargate/x/{{moduleName}}/genesis.go.plush b/ignite/templates/module/create/stargate/x/{{moduleName}}/genesis.go.plush index 0f2555e734..7471ab041d 100644 --- a/ignite/templates/module/create/stargate/x/{{moduleName}}/genesis.go.plush +++ b/ignite/templates/module/create/stargate/x/{{moduleName}}/genesis.go.plush @@ -6,14 +6,13 @@ import ( "<%= modulePath %>/x/<%= moduleName %>/types" ) -// InitGenesis initializes the capability module's state from a provided genesis -// state. +// InitGenesis initializes the module's state from a provided genesis state. func InitGenesis(ctx sdk.Context, k keeper.Keeper, genState types.GenesisState) { // this line is used by starport scaffolding # genesis/module/init k.SetParams(ctx, genState.Params) } -// ExportGenesis returns the capability module's exported genesis. +// ExportGenesis returns the module's exported genesis func ExportGenesis(ctx sdk.Context, k keeper.Keeper) *types.GenesisState { genesis := types.DefaultGenesis() genesis.Params = k.GetParams(ctx) diff --git a/ignite/templates/module/create/stargate/x/{{moduleName}}/handler.go.plush b/ignite/templates/module/create/stargate/x/{{moduleName}}/handler.go.plush deleted file mode 100644 index 0439836a9d..0000000000 --- a/ignite/templates/module/create/stargate/x/{{moduleName}}/handler.go.plush +++ /dev/null @@ -1,26 +0,0 @@ -package <%= moduleName %> - -import ( - "fmt" - - sdk "github.com/cosmos/cosmos-sdk/types" - "<%= modulePath %>/x/<%= moduleName %>/keeper" - "<%= modulePath %>/x/<%= moduleName %>/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" -) - -// NewHandler ... -func NewHandler(k keeper.Keeper) sdk.Handler { - // this line is used by starport scaffolding # handler/msgServer - - return func(ctx sdk.Context, msg sdk.Msg) (*sdk.Result, error) { - ctx = ctx.WithEventManager(sdk.NewEventManager()) - - switch msg := msg.(type) { - // this line is used by starport scaffolding # 1 - default: - errMsg := fmt.Sprintf("unrecognized %s message type: %T", types.ModuleName, msg) - return nil, sdkerrors.Wrap(sdkerrors.ErrUnknownRequest, errMsg) - } - } -} diff --git a/ignite/templates/module/create/stargate/x/{{moduleName}}/keeper/keeper.go.plush b/ignite/templates/module/create/stargate/x/{{moduleName}}/keeper/keeper.go.plush index f67d52e97d..686fa47439 100644 --- a/ignite/templates/module/create/stargate/x/{{moduleName}}/keeper/keeper.go.plush +++ b/ignite/templates/module/create/stargate/x/{{moduleName}}/keeper/keeper.go.plush @@ -4,7 +4,7 @@ import ( "fmt" "github.com/tendermint/tendermint/libs/log" - + storetypes "github.com/cosmos/cosmos-sdk/store/types" "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" @@ -16,8 +16,8 @@ type ( Keeper struct { <%= if (isIBC) { %>*cosmosibckeeper.Keeper<% } %> cdc codec.BinaryCodec - storeKey sdk.StoreKey - memKey sdk.StoreKey + storeKey storetypes.StoreKey + memKey storetypes.StoreKey paramstore paramtypes.Subspace <%= for (dependency) in dependencies { %> <%= dependency.Name %>Keeper types.<%= title(dependency.Name) %>Keeper<% } %> @@ -27,7 +27,7 @@ type ( func NewKeeper( cdc codec.BinaryCodec, storeKey, - memKey sdk.StoreKey, + memKey storetypes.StoreKey, ps paramtypes.Subspace, <%= if (isIBC) { %>channelKeeper cosmosibckeeper.ChannelKeeper, portKeeper cosmosibckeeper.PortKeeper, diff --git a/ignite/templates/module/create/stargate/x/{{moduleName}}/module.go.plush b/ignite/templates/module/create/stargate/x/{{moduleName}}/module.go.plush index ecc079ba94..410a3231e7 100644 --- a/ignite/templates/module/create/stargate/x/{{moduleName}}/module.go.plush +++ b/ignite/templates/module/create/stargate/x/{{moduleName}}/module.go.plush @@ -1,11 +1,11 @@ package <%= moduleName %> import ( + "context" "encoding/json" "fmt" // this line is used by starport scaffolding # 1 - "github.com/gorilla/mux" "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/spf13/cobra" @@ -19,20 +19,20 @@ import ( "<%= modulePath %>/x/<%= moduleName %>/keeper" "<%= modulePath %>/x/<%= moduleName %>/types" "<%= modulePath %>/x/<%= moduleName %>/client/cli" - <%= if (isIBC) { %>porttypes "github.com/cosmos/ibc-go/v3/modules/core/05-port/types"<% } %> + <%= if (isIBC) { %>porttypes "github.com/cosmos/ibc-go/v5/modules/core/05-port/types"<% } %> ) var ( _ module.AppModule = AppModule{} _ module.AppModuleBasic = AppModuleBasic{} - <%= if (isIBC) { %>_ porttypes.IBCModule = AppModule{}<% } %> + <%= if (isIBC) { %>_ porttypes.IBCModule = IBCModule{}<% } %> ) // ---------------------------------------------------------------------------- // AppModuleBasic // ---------------------------------------------------------------------------- -// AppModuleBasic implements the AppModuleBasic interface for the capability module. +// AppModuleBasic implements the AppModuleBasic interface that defines the independent methods a Cosmos SDK module needs to implement. type AppModuleBasic struct { cdc codec.BinaryCodec } @@ -41,30 +41,27 @@ func NewAppModuleBasic(cdc codec.BinaryCodec) AppModuleBasic { return AppModuleBasic{cdc: cdc} } -// Name returns the capability module's name. +// Name returns the name of the module as a string func (AppModuleBasic) Name() string { return types.ModuleName } -func (AppModuleBasic) RegisterCodec(cdc *codec.LegacyAmino) { - types.RegisterCodec(cdc) -} - +// RegisterLegacyAminoCodec registers the amino codec for the module, which is used to marshal and unmarshal structs to/from []byte in order to persist them in the module's KVStore func (AppModuleBasic) RegisterLegacyAminoCodec(cdc *codec.LegacyAmino) { types.RegisterCodec(cdc) } -// RegisterInterfaces registers the module's interface types +// RegisterInterfaces registers a module's interface types and their concrete implementations as proto.Message func (a AppModuleBasic) RegisterInterfaces(reg cdctypes.InterfaceRegistry) { types.RegisterInterfaces(reg) } -// DefaultGenesis returns the capability module's default genesis state. +// DefaultGenesis returns a default GenesisState for the module, marshalled to json.RawMessage. The default GenesisState need to be defined by the module developer and is primarily used for testing func (AppModuleBasic) DefaultGenesis(cdc codec.JSONCodec) json.RawMessage { return cdc.MustMarshalJSON(types.DefaultGenesis()) } -// ValidateGenesis performs genesis state validation for the capability module. +// ValidateGenesis used to validate the GenesisState, given in its json.RawMessage form func (AppModuleBasic) ValidateGenesis(cdc codec.JSONCodec, config client.TxEncodingConfig, bz json.RawMessage) error { var genState types.GenesisState if err := cdc.UnmarshalJSON(bz, &genState); err != nil { @@ -73,21 +70,17 @@ func (AppModuleBasic) ValidateGenesis(cdc codec.JSONCodec, config client.TxEncod return genState.Validate() } -// RegisterRESTRoutes registers the capability module's REST service handlers. -func (AppModuleBasic) RegisterRESTRoutes(clientCtx client.Context, rtr *mux.Router) { -} - -// RegisterGRPCGatewayRoutes registers the gRPC Gateway routes for the module. +// RegisterGRPCGatewayRoutes registers the gRPC Gateway routes for the module func (AppModuleBasic) RegisterGRPCGatewayRoutes(clientCtx client.Context, mux *runtime.ServeMux) { - // this line is used by starport scaffolding # 2 + types.RegisterQueryHandlerClient(context.Background(), mux, types.NewQueryClient(clientCtx)) } -// GetTxCmd returns the capability module's root tx command. +// GetTxCmd returns the root Tx command for the module. The subcommands of this root command are used by end-users to generate new transactions containing messages defined in the module func (a AppModuleBasic) GetTxCmd() *cobra.Command { return cli.GetTxCmd() } -// GetQueryCmd returns the capability module's root query command. +// GetQueryCmd returns the root query command for the module. The subcommands of this root command are used by end-users to generate new queries to the subset of the state defined by the module func (AppModuleBasic) GetQueryCmd() *cobra.Command { return cli.GetQueryCmd(types.StoreKey) } @@ -96,7 +89,7 @@ func (AppModuleBasic) GetQueryCmd() *cobra.Command { // AppModule // ---------------------------------------------------------------------------- -// AppModule implements the AppModule interface for the capability module. +// AppModule implements the AppModule interface that defines the inter-dependent methods that modules need to implement type AppModule struct { AppModuleBasic @@ -119,35 +112,27 @@ func NewAppModule( } } -// Name returns the capability module's name. -func (am AppModule) Name() string { - return am.AppModuleBasic.Name() -} - -// Route returns the capability module's message routing key. -func (am AppModule) Route() sdk.Route { - return sdk.NewRoute(types.RouterKey, NewHandler(am.keeper)) -} +// Deprecated: use RegisterServices +func (am AppModule) Route() sdk.Route { return sdk.Route{} } -// QuerierRoute returns the capability module's query routing key. -func (AppModule) QuerierRoute() string { return types.QuerierRoute } +// Deprecated: use RegisterServices +func (AppModule) QuerierRoute() string { return types.RouterKey } -// LegacyQuerierHandler returns the capability module's Querier. -func (am AppModule) LegacyQuerierHandler(legacyQuerierCdc *codec.LegacyAmino) sdk.Querier { +// Deprecated: use RegisterServices +func (am AppModule) LegacyQuerierHandler(_ *codec.LegacyAmino) sdk.Querier { return nil } -// RegisterServices registers a GRPC query service to respond to the -// module-specific GRPC queries. +// RegisterServices registers a gRPC query service to respond to the module-specific gRPC queries func (am AppModule) RegisterServices(cfg module.Configurator) { + types.RegisterMsgServer(cfg.MsgServer(), keeper.NewMsgServerImpl(am.keeper)) types.RegisterQueryServer(cfg.QueryServer(), am.keeper) } -// RegisterInvariants registers the capability module's invariants. +// RegisterInvariants registers the invariants of the module. If an invariant deviates from its predicted value, the InvariantRegistry triggers appropriate logic (most often the chain will be halted) func (am AppModule) RegisterInvariants(_ sdk.InvariantRegistry) {} -// InitGenesis performs the capability module's genesis initialization It returns -// no validator updates. +// InitGenesis performs the module's genesis initialization. It returns no validator updates. func (am AppModule) InitGenesis(ctx sdk.Context, cdc codec.JSONCodec, gs json.RawMessage) []abci.ValidatorUpdate { var genState types.GenesisState // Initialize global index to index in genesis state @@ -158,20 +143,19 @@ func (am AppModule) InitGenesis(ctx sdk.Context, cdc codec.JSONCodec, gs json.Ra return []abci.ValidatorUpdate{} } -// ExportGenesis returns the capability module's exported genesis state as raw JSON bytes. +// ExportGenesis returns the module's exported genesis state as raw JSON bytes. func (am AppModule) ExportGenesis(ctx sdk.Context, cdc codec.JSONCodec) json.RawMessage { genState := ExportGenesis(ctx, am.keeper) return cdc.MustMarshalJSON(genState) } -// ConsensusVersion implements ConsensusVersion. -func (AppModule) ConsensusVersion() uint64 { return 2 } +// ConsensusVersion is a sequence number for state-breaking change of the module. It should be incremented on each consensus-breaking change introduced by the module. To avoid wrong/empty versions, the initial version should be set to 1 +func (AppModule) ConsensusVersion() uint64 { return 1 } -// BeginBlock executes all ABCI BeginBlock logic respective to the capability module. +// BeginBlock contains the logic that is automatically triggered at the beginning of each block func (am AppModule) BeginBlock(_ sdk.Context, _ abci.RequestBeginBlock) {} -// EndBlock executes all ABCI EndBlock logic respective to the capability module. It -// returns no validator updates. +// EndBlock contains the logic that is automatically triggered at the end of each block func (am AppModule) EndBlock(_ sdk.Context, _ abci.RequestEndBlock) []abci.ValidatorUpdate { return []abci.ValidatorUpdate{} } diff --git a/ignite/templates/module/create/stargate/x/{{moduleName}}/types/genesis.go.plush b/ignite/templates/module/create/stargate/x/{{moduleName}}/types/genesis.go.plush index aa82115f83..c41be07425 100644 --- a/ignite/templates/module/create/stargate/x/{{moduleName}}/types/genesis.go.plush +++ b/ignite/templates/module/create/stargate/x/{{moduleName}}/types/genesis.go.plush @@ -4,10 +4,10 @@ import ( // this line is used by starport scaffolding # genesis/types/import ) -// DefaultIndex is the default capability global index +// DefaultIndex is the default global index const DefaultIndex uint64 = 1 -// DefaultGenesis returns the default Capability genesis state +// DefaultGenesis returns the default genesis state func DefaultGenesis() *GenesisState { return &GenesisState{ // this line is used by starport scaffolding # genesis/types/default diff --git a/ignite/templates/module/create/stargate/x/{{moduleName}}/types/keys.go.plush b/ignite/templates/module/create/stargate/x/{{moduleName}}/types/keys.go.plush index f1d2a4c708..8d4509c869 100644 --- a/ignite/templates/module/create/stargate/x/{{moduleName}}/types/keys.go.plush +++ b/ignite/templates/module/create/stargate/x/{{moduleName}}/types/keys.go.plush @@ -7,12 +7,9 @@ const ( // StoreKey defines the primary module store key StoreKey = ModuleName - // RouterKey is the message route for slashing + // RouterKey defines the module's message routing key RouterKey = ModuleName - // QuerierRoute defines the module's query routing key - QuerierRoute = ModuleName - // MemStoreKey defines the in-memory store key MemStoreKey = "mem_<%= moduleName %>" diff --git a/ignite/templates/query/query.go b/ignite/templates/query/query.go index b6deb9f9e5..531aaf8719 100644 --- a/ignite/templates/query/query.go +++ b/ignite/templates/query/query.go @@ -11,10 +11,8 @@ import ( "github.com/ignite/cli/ignite/templates/field/plushhelpers" ) -var ( - //go:embed stargate/* stargate/**/* - fsStargate embed.FS -) +//go:embed stargate/* stargate/**/* +var fsStargate embed.FS func Box(box packd.Walker, opts *Options, g *genny.Generator) error { if err := g.Box(box); err != nil { diff --git a/ignite/templates/query/stargate/x/{{moduleName}}/client/cli/query_{{queryName}}.go.plush b/ignite/templates/query/stargate/x/{{moduleName}}/client/cli/query_{{queryName}}.go.plush index e1a8030975..2d69d2ee17 100644 --- a/ignite/templates/query/stargate/x/{{moduleName}}/client/cli/query_{{queryName}}.go.plush +++ b/ignite/templates/query/stargate/x/{{moduleName}}/client/cli/query_{{queryName}}.go.plush @@ -20,7 +20,7 @@ func Cmd<%= QueryName.UpperCamel %>() *cobra.Command { RunE: func(cmd *cobra.Command, args []string) (err error) { <%= for (i, field) in ReqFields { %> <%= field.CLIArgs("req", i) %> <% } %> - clientCtx, err := client.GetClientTxContext(cmd) + clientCtx, err := client.GetClientQueryContext(cmd) if err != nil { return err } @@ -50,4 +50,4 @@ func Cmd<%= QueryName.UpperCamel %>() *cobra.Command { flags.AddQueryFlagsToCmd(cmd) return cmd -} \ No newline at end of file +} diff --git a/ignite/templates/testutil/register.go b/ignite/templates/testutil/register.go index 242e4741af..281dcb2e7c 100644 --- a/ignite/templates/testutil/register.go +++ b/ignite/templates/testutil/register.go @@ -8,10 +8,8 @@ import ( "github.com/ignite/cli/ignite/pkg/xgenny" ) -var ( - //go:embed stargate/* stargate/**/* - fsStargate embed.FS -) +//go:embed stargate/* stargate/**/* +var fsStargate embed.FS // Register testutil template using existing generator. // Register is meant to be used by modules that depend on this module. diff --git a/ignite/templates/testutil/stargate/testutil/network/network.go.plush b/ignite/templates/testutil/stargate/testutil/network/network.go.plush index c08157ff8d..02655e68c9 100644 --- a/ignite/templates/testutil/stargate/testutil/network/network.go.plush +++ b/ignite/templates/testutil/stargate/testutil/network/network.go.plush @@ -5,12 +5,13 @@ import ( "testing" "time" + "github.com/stretchr/testify/require" "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/crypto/hd" "github.com/cosmos/cosmos-sdk/crypto/keyring" + pruningtypes "github.com/cosmos/cosmos-sdk/pruning/types" servertypes "github.com/cosmos/cosmos-sdk/server/types" "github.com/cosmos/cosmos-sdk/simapp" - storetypes "github.com/cosmos/cosmos-sdk/store/types" "github.com/cosmos/cosmos-sdk/testutil/network" sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" @@ -38,7 +39,8 @@ func New(t *testing.T, configs ...network.Config) *network.Network { } else { cfg = configs[0] } - net := network.New(t, cfg) + net, err := network.New(t, t.TempDir(), cfg) + require.NoError(t, err) t.Cleanup(net.Cleanup) return net } @@ -58,7 +60,7 @@ func DefaultConfig() network.Config { val.Ctx.Logger, tmdb.NewMemDB(), nil, true, map[int64]bool{}, val.Ctx.Config.RootDir, 0, encoding, simapp.EmptyAppOptions{}, - baseapp.SetPruning(storetypes.NewPruningOptionsFromString(val.AppConfig.Pruning)), + baseapp.SetPruning(pruningtypes.NewPruningOptionsFromString(val.AppConfig.Pruning)), baseapp.SetMinGasPrices(val.AppConfig.MinGasPrices), ) }, @@ -71,7 +73,7 @@ func DefaultConfig() network.Config { AccountTokens: sdk.TokensFromConsensusPower(1000, sdk.DefaultPowerReduction), StakingTokens: sdk.TokensFromConsensusPower(500, sdk.DefaultPowerReduction), BondedTokens: sdk.TokensFromConsensusPower(100, sdk.DefaultPowerReduction), - PruningStrategy: storetypes.PruningOptionNothing, + PruningStrategy: pruningtypes.PruningOptionNothing, CleanupDir: true, SigningAlgo: string(hd.Secp256k1Type), KeyringOptions: []keyring.Option{}, diff --git a/ignite/templates/typed/dry/stargate.go b/ignite/templates/typed/dry/stargate.go index 8fc54f7fd3..f3162e59fd 100644 --- a/ignite/templates/typed/dry/stargate.go +++ b/ignite/templates/typed/dry/stargate.go @@ -9,10 +9,8 @@ import ( "github.com/ignite/cli/ignite/templates/typed" ) -var ( - //go:embed stargate/component/* stargate/component/**/* - fsStargateComponent embed.FS -) +//go:embed stargate/component/* stargate/component/**/* +var fsStargateComponent embed.FS // NewStargate returns the generator to scaffold a basic type in a Stargate module. func NewStargate(opts *typed.Options) (*genny.Generator, error) { diff --git a/ignite/templates/typed/list/stargate.go b/ignite/templates/typed/list/stargate.go index ccfe970b3a..68654696b0 100644 --- a/ignite/templates/typed/list/stargate.go +++ b/ignite/templates/typed/list/stargate.go @@ -49,7 +49,6 @@ func NewStargate(replacer placeholder.Replacer, opts *typed.Options) (*genny.Gen ) g.RunFn(protoQueryModify(replacer, opts)) - g.RunFn(moduleGRPCGatewayModify(replacer, opts)) g.RunFn(typesKeyModify(opts)) g.RunFn(clientCliQueryModify(replacer, opts)) @@ -58,7 +57,6 @@ func NewStargate(replacer placeholder.Replacer, opts *typed.Options) (*genny.Gen if !opts.NoMessage { // Modifications for new messages - g.RunFn(handlerModify(replacer, opts)) g.RunFn(protoTxModify(replacer, opts)) g.RunFn(typesCodecModify(replacer, opts)) g.RunFn(clientCliTxModify(replacer, opts)) @@ -81,41 +79,6 @@ func NewStargate(replacer placeholder.Replacer, opts *typed.Options) (*genny.Gen return g, typed.Box(componentTemplate, opts, g) } -func handlerModify(replacer placeholder.Replacer, opts *typed.Options) genny.RunFn { - return func(r *genny.Runner) error { - path := filepath.Join(opts.AppPath, "x", opts.ModuleName, "handler.go") - f, err := r.Disk.Find(path) - if err != nil { - return err - } - - // Set once the MsgServer definition if it is not defined yet - replacementMsgServer := `msgServer := keeper.NewMsgServerImpl(k)` - content := replacer.ReplaceOnce(f.String(), typed.PlaceholderHandlerMsgServer, replacementMsgServer) - - templateHandlers := `case *types.MsgCreate%[2]v: - res, err := msgServer.Create%[2]v(sdk.WrapSDKContext(ctx), msg) - return sdk.WrapServiceResult(ctx, res, err) - - case *types.MsgUpdate%[2]v: - res, err := msgServer.Update%[2]v(sdk.WrapSDKContext(ctx), msg) - return sdk.WrapServiceResult(ctx, res, err) - - case *types.MsgDelete%[2]v: - res, err := msgServer.Delete%[2]v(sdk.WrapSDKContext(ctx), msg) - return sdk.WrapServiceResult(ctx, res, err) - -%[1]v` - replacementHandlers := fmt.Sprintf(templateHandlers, - typed.Placeholder, - opts.TypeName.UpperCamel, - ) - content = replacer.Replace(content, typed.Placeholder, replacementHandlers) - newFile := genny.NewFileS(path, content) - return r.File(newFile) - } -} - func protoTxModify(replacer placeholder.Replacer, opts *typed.Options) genny.RunFn { return func(r *genny.Runner) error { path := filepath.Join(opts.AppPath, "proto", opts.ModuleName, "tx.proto") @@ -279,22 +242,6 @@ message QueryAll%[2]vResponse { } } -func moduleGRPCGatewayModify(replacer placeholder.Replacer, opts *typed.Options) genny.RunFn { - return func(r *genny.Runner) error { - path := filepath.Join(opts.AppPath, "x", opts.ModuleName, "module.go") - f, err := r.Disk.Find(path) - if err != nil { - return err - } - replacement := `"context"` - content := replacer.ReplaceOnce(f.String(), typed.Placeholder, replacement) - replacement = `types.RegisterQueryHandlerClient(context.Background(), mux, types.NewQueryClient(clientCtx))` - content = replacer.ReplaceOnce(content, typed.Placeholder2, replacement) - newFile := genny.NewFileS(path, content) - return r.File(newFile) - } -} - func typesKeyModify(opts *typed.Options) genny.RunFn { return func(r *genny.Runner) error { path := filepath.Join(opts.AppPath, "x", opts.ModuleName, "types/keys.go") @@ -304,8 +251,8 @@ func typesKeyModify(opts *typed.Options) genny.RunFn { } content := f.String() + fmt.Sprintf(` const ( - %[1]vKey= "%[1]v-value-" - %[1]vCountKey= "%[1]v-count-" + %[1]vKey= "%[1]v/value/" + %[1]vCountKey= "%[1]v/count/" ) `, opts.TypeName.UpperCamel) newFile := genny.NewFileS(path, content) diff --git a/ignite/templates/typed/list/stargate/messages/x/{{moduleName}}/client/cli/tx_{{typeName}}_test.go.plush b/ignite/templates/typed/list/stargate/messages/x/{{moduleName}}/client/cli/tx_{{typeName}}_test.go.plush index a22e44ec9d..a7007fd7de 100644 --- a/ignite/templates/typed/list/stargate/messages/x/{{moduleName}}/client/cli/tx_{{typeName}}_test.go.plush +++ b/ignite/templates/typed/list/stargate/messages/x/{{moduleName}}/client/cli/tx_{{typeName}}_test.go.plush @@ -4,6 +4,7 @@ import ( "fmt" "testing" + sdkmath "cosmossdk.io/math" "github.com/cosmos/cosmos-sdk/client/flags" clitestutil "github.com/cosmos/cosmos-sdk/testutil/cli" sdk "github.com/cosmos/cosmos-sdk/types" @@ -32,7 +33,7 @@ func TestCreate<%= TypeName.UpperCamel %>(t *testing.T) { fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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(net.Config.BondDenom, sdk.NewInt(10))).String()), + fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(net.Config.BondDenom, sdkmath.NewInt(10))).String()), }, }, } { @@ -64,7 +65,7 @@ func TestUpdate<%= TypeName.UpperCamel %>(t *testing.T) { fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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(net.Config.BondDenom, sdk.NewInt(10))).String()), + fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(net.Config.BondDenom, sdkmath.NewInt(10))).String()), } args := []string{} args = append(args, fields...) @@ -119,7 +120,7 @@ func TestDelete<%= TypeName.UpperCamel %>(t *testing.T) { fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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(net.Config.BondDenom, sdk.NewInt(10))).String()), + fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(net.Config.BondDenom, sdkmath.NewInt(10))).String()), } args := []string{} args = append(args, fields...) diff --git a/ignite/templates/typed/map/stargate.go b/ignite/templates/typed/map/stargate.go index c86b8b0886..400c713576 100644 --- a/ignite/templates/typed/map/stargate.go +++ b/ignite/templates/typed/map/stargate.go @@ -75,7 +75,6 @@ func NewStargate(replacer placeholder.Replacer, opts *typed.Options) (*genny.Gen ) g.RunFn(protoRPCModify(replacer, opts)) - g.RunFn(moduleGRPCGatewayModify(replacer, opts)) g.RunFn(clientCliQueryModify(replacer, opts)) g.RunFn(genesisProtoModify(replacer, opts)) g.RunFn(genesisTypesModify(replacer, opts)) @@ -86,7 +85,6 @@ func NewStargate(replacer placeholder.Replacer, opts *typed.Options) (*genny.Gen // Modifications for new messages if !opts.NoMessage { g.RunFn(protoTxModify(replacer, opts)) - g.RunFn(handlerModify(replacer, opts)) g.RunFn(clientCliTxModify(replacer, opts)) g.RunFn(typesCodecModify(replacer, opts)) @@ -218,24 +216,6 @@ message QueryAll%[2]vResponse { } } -func moduleGRPCGatewayModify(replacer placeholder.Replacer, opts *typed.Options) genny.RunFn { - return func(r *genny.Runner) error { - path := filepath.Join(opts.AppPath, "x", opts.ModuleName, "module.go") - f, err := r.Disk.Find(path) - if err != nil { - return err - } - replacement := `"context"` - content := replacer.ReplaceOnce(f.String(), typed.Placeholder, replacement) - - replacement = `types.RegisterQueryHandlerClient(context.Background(), mux, types.NewQueryClient(clientCtx))` - content = replacer.ReplaceOnce(content, typed.Placeholder2, replacement) - - newFile := genny.NewFileS(path, content) - return r.File(newFile) - } -} - func clientCliQueryModify(replacer placeholder.Replacer, opts *typed.Options) genny.RunFn { return func(r *genny.Runner) error { path := filepath.Join(opts.AppPath, "x", opts.ModuleName, "client/cli/query.go") @@ -581,38 +561,6 @@ message MsgDelete%[2]vResponse {} } } -func handlerModify(replacer placeholder.Replacer, opts *typed.Options) genny.RunFn { - return func(r *genny.Runner) error { - path := filepath.Join(opts.AppPath, "x", opts.ModuleName, "handler.go") - f, err := r.Disk.Find(path) - if err != nil { - return err - } - - // Set once the MsgServer definition if it is not defined yet - replacementMsgServer := `msgServer := keeper.NewMsgServerImpl(k)` - content := replacer.ReplaceOnce(f.String(), typed.PlaceholderHandlerMsgServer, replacementMsgServer) - - templateHandlers := `case *types.MsgCreate%[2]v: - res, err := msgServer.Create%[2]v(sdk.WrapSDKContext(ctx), msg) - return sdk.WrapServiceResult(ctx, res, err) - case *types.MsgUpdate%[2]v: - res, err := msgServer.Update%[2]v(sdk.WrapSDKContext(ctx), msg) - return sdk.WrapServiceResult(ctx, res, err) - case *types.MsgDelete%[2]v: - res, err := msgServer.Delete%[2]v(sdk.WrapSDKContext(ctx), msg) - return sdk.WrapServiceResult(ctx, res, err) -%[1]v` - replacementHandlers := fmt.Sprintf(templateHandlers, - typed.Placeholder, - opts.TypeName.UpperCamel, - ) - content = replacer.Replace(content, typed.Placeholder, replacementHandlers) - newFile := genny.NewFileS(path, content) - return r.File(newFile) - } -} - func clientCliTxModify(replacer placeholder.Replacer, opts *typed.Options) genny.RunFn { return func(r *genny.Runner) error { path := filepath.Join(opts.AppPath, "x", opts.ModuleName, "client/cli/tx.go") diff --git a/ignite/templates/typed/map/stargate/tests/messages/x/{{moduleName}}/client/cli/tx_{{typeName}}_test.go.plush b/ignite/templates/typed/map/stargate/tests/messages/x/{{moduleName}}/client/cli/tx_{{typeName}}_test.go.plush index c6861ae624..b636237d3a 100644 --- a/ignite/templates/typed/map/stargate/tests/messages/x/{{moduleName}}/client/cli/tx_{{typeName}}_test.go.plush +++ b/ignite/templates/typed/map/stargate/tests/messages/x/{{moduleName}}/client/cli/tx_{{typeName}}_test.go.plush @@ -5,6 +5,7 @@ import ( "strconv" "testing" + sdkmath "cosmossdk.io/math" "github.com/cosmos/cosmos-sdk/client/flags" clitestutil "github.com/cosmos/cosmos-sdk/testutil/cli" sdk "github.com/cosmos/cosmos-sdk/types" @@ -40,7 +41,7 @@ func TestCreate<%= TypeName.UpperCamel %>(t *testing.T) { fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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(net.Config.BondDenom, sdk.NewInt(10))).String()), + fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(net.Config.BondDenom, sdkmath.NewInt(10))).String()), }, }, } { @@ -74,7 +75,7 @@ func TestUpdate<%= TypeName.UpperCamel %>(t *testing.T) { fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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(net.Config.BondDenom, sdk.NewInt(10))).String()), + fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(net.Config.BondDenom, sdkmath.NewInt(10))).String()), } args := []string{ <%= for (i, index) in Indexes { %>"0", @@ -138,7 +139,7 @@ func TestDelete<%= TypeName.UpperCamel %>(t *testing.T) { fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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(net.Config.BondDenom, sdk.NewInt(10))).String()), + fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(net.Config.BondDenom, sdkmath.NewInt(10))).String()), } args := []string{ <%= for (i, index) in Indexes { %>"0", diff --git a/ignite/templates/typed/singleton/stargate.go b/ignite/templates/typed/singleton/stargate.go index 4514910fd3..b08a64eaeb 100644 --- a/ignite/templates/typed/singleton/stargate.go +++ b/ignite/templates/typed/singleton/stargate.go @@ -51,7 +51,6 @@ func NewStargate(replacer placeholder.Replacer, opts *typed.Options) (*genny.Gen g.RunFn(typesKeyModify(opts)) g.RunFn(protoRPCModify(replacer, opts)) - g.RunFn(moduleGRPCGatewayModify(replacer, opts)) g.RunFn(clientCliQueryModify(replacer, opts)) g.RunFn(genesisProtoModify(replacer, opts)) g.RunFn(genesisTypesModify(replacer, opts)) @@ -62,7 +61,6 @@ func NewStargate(replacer placeholder.Replacer, opts *typed.Options) (*genny.Gen // Modifications for new messages if !opts.NoMessage { g.RunFn(protoTxModify(replacer, opts)) - g.RunFn(handlerModify(replacer, opts)) g.RunFn(clientCliTxModify(replacer, opts)) g.RunFn(typesCodecModify(replacer, opts)) @@ -90,7 +88,7 @@ func typesKeyModify(opts *typed.Options) genny.RunFn { } content := f.String() + fmt.Sprintf(` const ( - %[1]vKey= "%[1]v-value-" + %[1]vKey= "%[1]v/value/" ) `, opts.TypeName.UpperCamel) newFile := genny.NewFileS(path, content) @@ -153,24 +151,6 @@ message QueryGet%[2]vResponse { } } -func moduleGRPCGatewayModify(replacer placeholder.Replacer, opts *typed.Options) genny.RunFn { - return func(r *genny.Runner) error { - path := filepath.Join(opts.AppPath, "x", opts.ModuleName, "module.go") - f, err := r.Disk.Find(path) - if err != nil { - return err - } - replacement := `"context"` - content := replacer.ReplaceOnce(f.String(), typed.Placeholder, replacement) - - replacement = `types.RegisterQueryHandlerClient(context.Background(), mux, types.NewQueryClient(clientCtx))` - content = replacer.ReplaceOnce(content, typed.Placeholder2, replacement) - - newFile := genny.NewFileS(path, content) - return r.File(newFile) - } -} - func clientCliQueryModify(replacer placeholder.Replacer, opts *typed.Options) genny.RunFn { return func(r *genny.Runner) error { path := filepath.Join(opts.AppPath, "x", opts.ModuleName, "client/cli/query.go") @@ -439,38 +419,6 @@ message MsgDelete%[2]vResponse {} } } -func handlerModify(replacer placeholder.Replacer, opts *typed.Options) genny.RunFn { - return func(r *genny.Runner) error { - path := filepath.Join(opts.AppPath, "x", opts.ModuleName, "handler.go") - f, err := r.Disk.Find(path) - if err != nil { - return err - } - - // Set once the MsgServer definition if it is not defined yet - replacementMsgServer := `msgServer := keeper.NewMsgServerImpl(k)` - content := replacer.ReplaceOnce(f.String(), typed.PlaceholderHandlerMsgServer, replacementMsgServer) - - templateHandlers := `case *types.MsgCreate%[2]v: - res, err := msgServer.Create%[2]v(sdk.WrapSDKContext(ctx), msg) - return sdk.WrapServiceResult(ctx, res, err) - case *types.MsgUpdate%[2]v: - res, err := msgServer.Update%[2]v(sdk.WrapSDKContext(ctx), msg) - return sdk.WrapServiceResult(ctx, res, err) - case *types.MsgDelete%[2]v: - res, err := msgServer.Delete%[2]v(sdk.WrapSDKContext(ctx), msg) - return sdk.WrapServiceResult(ctx, res, err) -%[1]v` - replacementHandlers := fmt.Sprintf(templateHandlers, - typed.Placeholder, - opts.TypeName.UpperCamel, - ) - content = replacer.Replace(content, typed.Placeholder, replacementHandlers) - newFile := genny.NewFileS(path, content) - return r.File(newFile) - } -} - func clientCliTxModify(replacer placeholder.Replacer, opts *typed.Options) genny.RunFn { return func(r *genny.Runner) error { path := filepath.Join(opts.AppPath, "x", opts.ModuleName, "client/cli/tx.go") diff --git a/ignite/templates/typed/singleton/stargate/messages/x/{{moduleName}}/client/cli/tx_{{typeName}}_test.go.plush b/ignite/templates/typed/singleton/stargate/messages/x/{{moduleName}}/client/cli/tx_{{typeName}}_test.go.plush index 516b7fa514..68a1f0ed57 100644 --- a/ignite/templates/typed/singleton/stargate/messages/x/{{moduleName}}/client/cli/tx_{{typeName}}_test.go.plush +++ b/ignite/templates/typed/singleton/stargate/messages/x/{{moduleName}}/client/cli/tx_{{typeName}}_test.go.plush @@ -4,6 +4,7 @@ import ( "fmt" "testing" + sdkmath "cosmossdk.io/math" "github.com/cosmos/cosmos-sdk/client/flags" clitestutil "github.com/cosmos/cosmos-sdk/testutil/cli" sdk "github.com/cosmos/cosmos-sdk/types" @@ -31,7 +32,7 @@ func TestCreate<%= TypeName.UpperCamel %>(t *testing.T) { fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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(net.Config.BondDenom, sdk.NewInt(10))).String()), + fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(net.Config.BondDenom, sdkmath.NewInt(10))).String()), }, }, } { @@ -62,7 +63,7 @@ func TestUpdate<%= TypeName.UpperCamel %>(t *testing.T) { fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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(net.Config.BondDenom, sdk.NewInt(10))).String()), + fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(net.Config.BondDenom, sdkmath.NewInt(10))).String()), } var args []string args = append(args, fields...) @@ -109,7 +110,7 @@ func TestDelete<%= TypeName.UpperCamel %>(t *testing.T) { fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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(net.Config.BondDenom, sdk.NewInt(10))).String()), + fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(net.Config.BondDenom, sdkmath.NewInt(10))).String()), } var args []string args = append(args, fields...) diff --git a/ignite/version/version.go b/ignite/version/version.go index 8383ffae1b..5c4f4b0b4d 100644 --- a/ignite/version/version.go +++ b/ignite/version/version.go @@ -46,7 +46,6 @@ func CheckNext(ctx context.Context) (isAvailable bool, version string, err error NewClient(nil). Repositories. GetLatestRelease(ctx, "ignite", "cli") - if err != nil { return false, "", err } @@ -92,6 +91,17 @@ func Long(ctx context.Context) string { cmdOut := &bytes.Buffer{} + nodeJSCmd := "node" + if xexec.IsCommandAvailable(nodeJSCmd) { + cmdOut.Reset() + + err := exec.Exec(ctx, []string{nodeJSCmd, "-v"}, exec.StepOption(step.Stdout(cmdOut))) + if err == nil { + write("Your Node.js version", strings.TrimSpace(cmdOut.String())) + } + } + + cmdOut.Reset() err := exec.Exec(ctx, []string{"go", "version"}, exec.StepOption(step.Stdout(cmdOut))) if err != nil { panic(err) diff --git a/integration/account/cmd_account_test.go b/integration/account/cmd_account_test.go new file mode 100644 index 0000000000..9679220832 --- /dev/null +++ b/integration/account/cmd_account_test.go @@ -0,0 +1,112 @@ +package account_test + +import ( + "bytes" + "strings" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/ignite/cli/ignite/pkg/cmdrunner/step" + "github.com/ignite/cli/ignite/pkg/randstr" + envtest "github.com/ignite/cli/integration" +) + +const testAccountMnemonic = "develop mansion drum glow husband trophy labor jelly fault run pause inside jazz foil page injury foam oppose fruit chunk segment morning series nation" + +func TestAccount(t *testing.T) { + var ( + env = envtest.New(t) + tmpDir = t.TempDir() + accountName = randstr.Runes(10) + ) + + env.Must(env.Exec("create account", + step.NewSteps(step.New( + step.Exec(envtest.IgniteApp, "account", "create", accountName, "--keyring-dir", tmpDir), + )), + )) + + listOutputBuffer := &bytes.Buffer{} + env.Must(env.Exec("list accounts", + step.NewSteps(step.New( + step.Exec(envtest.IgniteApp, "account", "list", "--keyring-dir", tmpDir), + )), + envtest.ExecStdout(listOutputBuffer), + )) + require.True(t, strings.Contains(listOutputBuffer.String(), accountName)) + + env.Must(env.Exec("delete account", + step.NewSteps(step.New( + step.Exec(envtest.IgniteApp, "account", "delete", accountName, "--keyring-dir", tmpDir), + )), + )) + + listOutputAfterDeleteBuffer := &bytes.Buffer{} + env.Must(env.Exec("list accounts after delete", + step.NewSteps(step.New( + step.Exec(envtest.IgniteApp, "account", "list", "--keyring-dir", tmpDir), + )), + envtest.ExecStdout(listOutputAfterDeleteBuffer), + )) + require.Equal(t, listOutputAfterDeleteBuffer.String(), "Name \tAddress Public Key \t\n\n") + + env.Must(env.Exec("import account with mnemonic", + step.NewSteps(step.New( + step.Exec( + envtest.IgniteApp, "account", "import", "testaccount42", + "--keyring-dir", tmpDir, + "--secret", testAccountMnemonic, + ), + )), + )) + + env.Must(env.Exec("import account with private key", + step.NewSteps(step.New( + step.Exec( + envtest.IgniteApp, "account", "import", "testaccount43", + "--non-interactive", + "--keyring-dir", tmpDir, + "--secret", "testdata/key", + "--passphrase", "passpass", + ), + )), + )) + + listOutputAfterImportBuffer := &bytes.Buffer{} + env.Must(env.Exec("list accounts after import", + step.NewSteps(step.New( + step.Exec(envtest.IgniteApp, "account", "list", "--keyring-dir", tmpDir), + )), + envtest.ExecStdout(listOutputAfterImportBuffer), + )) + require.Equal(t, `Name Address Public Key +testaccount42 cosmos1ytnkpns7mfd6jjkvq9ztdvjdrt2xvmft2qxzqd PubKeySecp256k1{02FDF6D6F63B6B8E3CC71D03669BE0808F9990EE2A7FDBBF47E6BBEC4176E7763C} +testaccount43 cosmos18p4xchk2aqp39nsjwr69ql44upzsfnh8r9lzql PubKeySecp256k1{0228B8FC609973D91BFF7A9933424F31E15A54B97F8FDF7CE5A83B4DC20988068F} + +`, listOutputAfterImportBuffer.String()) + + showOutputBuffer := &bytes.Buffer{} + env.Must(env.Exec("show account", + step.NewSteps(step.New( + step.Exec(envtest.IgniteApp, "account", "show", "testaccount42", "--keyring-dir", tmpDir), + )), + envtest.ExecStdout(showOutputBuffer), + )) + require.Equal(t, `Name Address Public Key +testaccount42 cosmos1ytnkpns7mfd6jjkvq9ztdvjdrt2xvmft2qxzqd PubKeySecp256k1{02FDF6D6F63B6B8E3CC71D03669BE0808F9990EE2A7FDBBF47E6BBEC4176E7763C} + +`, showOutputBuffer.String()) + + showOutputWithDifferentPrefixBuffer := &bytes.Buffer{} + env.Must(env.Exec("show account with address prefix", + step.NewSteps(step.New( + step.Exec(envtest.IgniteApp, "account", "show", "testaccount42", "--keyring-dir", tmpDir, "--address-prefix", "test"), + )), + envtest.ExecStdout(showOutputWithDifferentPrefixBuffer), + )) + require.Equal(t, `Name Address Public Key +testaccount42 test1ytnkpns7mfd6jjkvq9ztdvjdrt2xvmftxemuve PubKeySecp256k1{02FDF6D6F63B6B8E3CC71D03669BE0808F9990EE2A7FDBBF47E6BBEC4176E7763C} + +`, showOutputWithDifferentPrefixBuffer.String()) +} diff --git a/integration/account/testdata/key b/integration/account/testdata/key new file mode 100644 index 0000000000..523c678ff1 --- /dev/null +++ b/integration/account/testdata/key @@ -0,0 +1,9 @@ +-----BEGIN TENDERMINT PRIVATE KEY----- +kdf: bcrypt +salt: DF141717258C6DFA02F3531A7606CC06 +type: secp256k1 + +7iYel/9+f4pY772S1WstIgUxzTTK81sXHtzI0YnmvbrH4wcbM/yfe1VPJJ11L6WT +dxs0v9A4DjwD9dOY73+zQc6NypB07OlyOykJXcA= +=Dojr +-----END TENDERMINT PRIVATE KEY----- \ No newline at end of file diff --git a/integration/app.go b/integration/app.go new file mode 100644 index 0000000000..4063723b36 --- /dev/null +++ b/integration/app.go @@ -0,0 +1,237 @@ +package envtest + +import ( + "fmt" + "os" + "path" + "path/filepath" + "strconv" + "time" + + "github.com/stretchr/testify/require" + "gopkg.in/yaml.v2" + + "github.com/ignite/cli/ignite/chainconfig" + "github.com/ignite/cli/ignite/pkg/availableport" + "github.com/ignite/cli/ignite/pkg/cmdrunner/step" + "github.com/ignite/cli/ignite/pkg/gocmd" + "github.com/ignite/cli/ignite/pkg/xurl" +) + +const ServeTimeout = time.Minute * 15 + +const defaultConfigFileName = "config.yml" + +type App struct { + path string + configPath string + homePath string + + env Env +} + +type AppOption func(*App) + +func AppConfigPath(path string) AppOption { + return func(o *App) { + o.configPath = path + } +} + +func AppHomePath(path string) AppOption { + return func(o *App) { + o.homePath = path + } +} + +// Scaffold scaffolds an app to a unique appPath and returns it. +func (e Env) Scaffold(name string, flags ...string) App { + root := e.TmpDir() + + e.Exec("scaffold an app", + step.NewSteps(step.New( + step.Exec( + IgniteApp, + append([]string{ + "scaffold", + "chain", + name, + }, flags...)..., + ), + step.Workdir(root), + )), + ) + + var ( + appDirName = path.Base(name) + appSourcePath = filepath.Join(root, appDirName) + appHomePath = e.AppHome(appDirName) + ) + + e.t.Cleanup(func() { os.RemoveAll(appHomePath) }) + + return e.App(appSourcePath, AppHomePath(appHomePath)) +} + +func (e Env) App(path string, options ...AppOption) App { + app := App{ + env: e, + path: path, + } + + for _, apply := range options { + apply(&app) + } + + if app.configPath == "" { + app.configPath = filepath.Join(path, defaultConfigFileName) + } + + return app +} + +func (a App) SourcePath() string { + return a.path +} + +func (a *App) SetConfigPath(path string) { + a.configPath = path +} + +// Binary returns the binary name of the app. Can be executed directly w/o any +// path after app.Serve is called, since it should be in the $PATH. +func (a App) Binary() string { + return path.Base(a.path) + "d" +} + +// Serve serves an application lives under path with options where msg describes the +// execution from the serving action. +// unless calling with Must(), Serve() will not exit test runtime on failure. +func (a App) Serve(msg string, options ...ExecOption) (ok bool) { + serveCommand := []string{ + "chain", + "serve", + "-v", + } + + if a.homePath != "" { + serveCommand = append(serveCommand, "--home", a.homePath) + } + if a.configPath != "" { + serveCommand = append(serveCommand, "--config", a.configPath) + } + + return a.env.Exec(msg, + step.NewSteps(step.New( + step.Exec(IgniteApp, serveCommand...), + step.Workdir(a.path), + )), + options..., + ) +} + +// Simulate runs the simulation test for the app +func (a App) Simulate(numBlocks, blockSize int) { + a.env.Exec("running the simulation tests", + step.NewSteps(step.New( + step.Exec( + IgniteApp, // TODO + "chain", + "simulate", + "--numBlocks", + strconv.Itoa(numBlocks), + "--blockSize", + strconv.Itoa(blockSize), + ), + step.Workdir(a.path), + )), + ) +} + +// EnsureSteady ensures that app living at the path can compile and its tests are passing. +func (a App) EnsureSteady() { + _, statErr := os.Stat(a.configPath) + + require.False(a.env.t, os.IsNotExist(statErr), "config.yml cannot be found") + + a.env.Exec("make sure app is steady", + step.NewSteps(step.New( + step.Exec(gocmd.Name(), "test", "./..."), + step.Workdir(a.path), + )), + ) +} + +// EnableFaucet enables faucet by finding a random port for the app faucet and update config.yml +// with this port and provided coins options. +func (a App) EnableFaucet(coins, coinsMax []string) (faucetAddr string) { + // find a random available port + port, err := availableport.Find(1) + require.NoError(a.env.t, err) + + a.EditConfig(func(conf *chainconfig.Config) { + conf.Faucet.Port = port[0] + conf.Faucet.Coins = coins + conf.Faucet.CoinsMax = coinsMax + }) + + addr, err := xurl.HTTP(fmt.Sprintf("0.0.0.0:%d", port[0])) + require.NoError(a.env.t, err) + + return addr +} + +// RandomizeServerPorts randomizes server ports for the app at path, updates +// its config.yml and returns new values. +func (a App) RandomizeServerPorts() chainconfig.Host { + // generate random server ports and servers list. + ports, err := availableport.Find(6) + require.NoError(a.env.t, err) + + genAddr := func(port int) string { + return fmt.Sprintf("localhost:%d", port) + } + + servers := chainconfig.Host{ + RPC: genAddr(ports[0]), + P2P: genAddr(ports[1]), + Prof: genAddr(ports[2]), + GRPC: genAddr(ports[3]), + GRPCWeb: genAddr(ports[4]), + API: genAddr(ports[5]), + } + + a.EditConfig(func(conf *chainconfig.Config) { + conf.Host = servers + }) + + return servers +} + +// UseRandomHomeDir sets in the blockchain config files generated temporary directories for home directories +// Returns the random home directory +func (a App) UseRandomHomeDir() (homeDirPath string) { + dir := a.env.TmpDir() + + a.EditConfig(func(conf *chainconfig.Config) { + conf.Init.Home = dir + }) + + return dir +} + +func (a App) EditConfig(apply func(*chainconfig.Config)) { + f, err := os.OpenFile(a.configPath, os.O_RDWR|os.O_CREATE, 0o755) + require.NoError(a.env.t, err) + defer f.Close() + + var conf chainconfig.Config + require.NoError(a.env.t, yaml.NewDecoder(f).Decode(&conf)) + + apply(&conf) + + require.NoError(a.env.t, f.Truncate(0)) + _, err = f.Seek(0, 0) + require.NoError(a.env.t, err) + require.NoError(a.env.t, yaml.NewEncoder(f).Encode(conf)) +} diff --git a/integration/app/cmd_app_test.go b/integration/app/cmd_app_test.go index 91e91fea39..3316fe604a 100644 --- a/integration/app/cmd_app_test.go +++ b/integration/app/cmd_app_test.go @@ -1,5 +1,4 @@ //go:build !relayer -// +build !relayer package app_test @@ -16,53 +15,53 @@ import ( func TestGenerateAnApp(t *testing.T) { var ( - env = envtest.New(t) - path = env.Scaffold("github.com/test/blog") + env = envtest.New(t) + app = env.Scaffold("github.com/test/blog") ) - _, statErr := os.Stat(filepath.Join(path, "x", "blog")) + _, statErr := os.Stat(filepath.Join(app.SourcePath(), "x", "blog")) require.False(t, os.IsNotExist(statErr), "the default module should be scaffolded") - env.EnsureAppIsSteady(path) + app.EnsureSteady() } // TestGenerateAnAppWithName tests scaffolding a new chain using a local name instead of a GitHub URI. func TestGenerateAnAppWithName(t *testing.T) { var ( - env = envtest.New(t) - path = env.Scaffold("blog") + env = envtest.New(t) + app = env.Scaffold("blog") ) - _, statErr := os.Stat(filepath.Join(path, "x", "blog")) + _, statErr := os.Stat(filepath.Join(app.SourcePath(), "x", "blog")) require.False(t, os.IsNotExist(statErr), "the default module should be scaffolded") - env.EnsureAppIsSteady(path) + app.EnsureSteady() } func TestGenerateAnAppWithNoDefaultModule(t *testing.T) { var ( - env = envtest.New(t) - path = env.Scaffold("github.com/test/blog", "--no-module") + env = envtest.New(t) + app = env.Scaffold("github.com/test/blog", "--no-module") ) - _, statErr := os.Stat(filepath.Join(path, "x", "blog")) + _, statErr := os.Stat(filepath.Join(app.SourcePath(), "x", "blog")) require.True(t, os.IsNotExist(statErr), "the default module should not be scaffolded") - env.EnsureAppIsSteady(path) + app.EnsureSteady() } func TestGenerateAnAppWithNoDefaultModuleAndCreateAModule(t *testing.T) { var ( - env = envtest.New(t) - path = env.Scaffold("github.com/test/blog", "--no-module") + env = envtest.New(t) + app = env.Scaffold("github.com/test/blog", "--no-module") ) - defer env.EnsureAppIsSteady(path) + defer app.EnsureSteady() env.Must(env.Exec("should scaffold a new module into a chain that never had modules before", step.NewSteps(step.New( step.Exec(envtest.IgniteApp, "s", "module", "--yes", "first_module"), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), )) } @@ -71,45 +70,45 @@ func TestGenerateAnAppWithWasm(t *testing.T) { t.Skip() var ( - env = envtest.New(t) - path = env.Scaffold("github.com/test/blog") + env = envtest.New(t) + app = env.Scaffold("github.com/test/blog") ) env.Must(env.Exec("add Wasm module", step.NewSteps(step.New( step.Exec(envtest.IgniteApp, "s", "wasm", "--yes"), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), )) env.Must(env.Exec("should not add Wasm module second time", step.NewSteps(step.New( step.Exec(envtest.IgniteApp, "s", "wasm", "--yes"), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), envtest.ExecShouldError(), )) - env.EnsureAppIsSteady(path) + app.EnsureSteady() } func TestGenerateAStargateAppWithEmptyModule(t *testing.T) { var ( - env = envtest.New(t) - path = env.Scaffold("github.com/test/blog") + env = envtest.New(t) + app = env.Scaffold("github.com/test/blog") ) env.Must(env.Exec("create a module", step.NewSteps(step.New( step.Exec(envtest.IgniteApp, "s", "module", "--yes", "example", "--require-registration"), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), )) env.Must(env.Exec("should prevent creating an existing module", step.NewSteps(step.New( step.Exec(envtest.IgniteApp, "s", "module", "--yes", "example", "--require-registration"), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), envtest.ExecShouldError(), )) @@ -117,7 +116,7 @@ func TestGenerateAStargateAppWithEmptyModule(t *testing.T) { env.Must(env.Exec("should prevent creating a module with an invalid name", step.NewSteps(step.New( step.Exec(envtest.IgniteApp, "s", "module", "--yes", "example1", "--require-registration"), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), envtest.ExecShouldError(), )) @@ -125,7 +124,7 @@ func TestGenerateAStargateAppWithEmptyModule(t *testing.T) { env.Must(env.Exec("should prevent creating a module with a reserved name", step.NewSteps(step.New( step.Exec(envtest.IgniteApp, "s", "module", "--yes", "tx", "--require-registration"), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), envtest.ExecShouldError(), )) @@ -133,7 +132,7 @@ func TestGenerateAStargateAppWithEmptyModule(t *testing.T) { env.Must(env.Exec("should prevent creating a module with a forbidden prefix", step.NewSteps(step.New( step.Exec(envtest.IgniteApp, "s", "module", "--yes", "ibcfoo", "--require-registration"), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), envtest.ExecShouldError(), )) @@ -141,7 +140,7 @@ func TestGenerateAStargateAppWithEmptyModule(t *testing.T) { env.Must(env.Exec("should prevent creating a module prefixed with an existing module", step.NewSteps(step.New( step.Exec(envtest.IgniteApp, "s", "module", "--yes", "examplefoo", "--require-registration"), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), envtest.ExecShouldError(), )) @@ -158,7 +157,7 @@ func TestGenerateAStargateAppWithEmptyModule(t *testing.T) { "account,bank,staking,slashing,example", "--require-registration", ), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), )) @@ -174,7 +173,7 @@ func TestGenerateAStargateAppWithEmptyModule(t *testing.T) { "dup,dup", "--require-registration", ), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), envtest.ExecShouldError(), )) @@ -191,10 +190,10 @@ func TestGenerateAStargateAppWithEmptyModule(t *testing.T) { "inexistent", "--require-registration", ), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), envtest.ExecShouldError(), )) - env.EnsureAppIsSteady(path) + app.EnsureSteady() } diff --git a/integration/app/cmd_ibc_test.go b/integration/app/cmd_ibc_test.go index 62fb9db369..de6fa6f794 100644 --- a/integration/app/cmd_ibc_test.go +++ b/integration/app/cmd_ibc_test.go @@ -1,10 +1,8 @@ //go:build !relayer -// +build !relayer package app_test import ( - "path/filepath" "testing" "github.com/ignite/cli/ignite/pkg/cmdrunner/step" @@ -12,16 +10,15 @@ import ( ) func TestCreateModuleWithIBC(t *testing.T) { - var ( - env = envtest.New(t) - path = env.Scaffold("github.com/test/blogibc") + env = envtest.New(t) + app = env.Scaffold("github.com/test/blogibc") ) env.Must(env.Exec("create an IBC module", step.NewSteps(step.New( step.Exec(envtest.IgniteApp, "s", "module", "--yes", "foo", "--ibc", "--require-registration"), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), )) @@ -37,14 +34,14 @@ func TestCreateModuleWithIBC(t *testing.T) { "--path", "./blogibc", ), - step.Workdir(filepath.Dir(path)), + step.Workdir(app.SourcePath()), )), )) env.Must(env.Exec("create a type in an IBC module", step.NewSteps(step.New( step.Exec(envtest.IgniteApp, "s", "list", "--yes", "user", "email", "--module", "foo"), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), )) @@ -61,7 +58,7 @@ func TestCreateModuleWithIBC(t *testing.T) { "ordered", "--require-registration", ), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), )) @@ -78,14 +75,14 @@ func TestCreateModuleWithIBC(t *testing.T) { "unordered", "--require-registration", ), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), )) env.Must(env.Exec("create a non IBC module", step.NewSteps(step.New( step.Exec(envtest.IgniteApp, "s", "module", "--yes", "non_ibc", "--require-registration"), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), )) @@ -102,24 +99,23 @@ func TestCreateModuleWithIBC(t *testing.T) { "account,bank,staking,slashing", "--require-registration", ), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), )) - env.EnsureAppIsSteady(path) + app.EnsureSteady() } func TestCreateIBCOracle(t *testing.T) { - var ( - env = envtest.New(t) - path = env.Scaffold("github.com/test/ibcoracle") + env = envtest.New(t) + app = env.Scaffold("github.com/test/ibcoracle") ) env.Must(env.Exec("create an IBC module", step.NewSteps(step.New( step.Exec(envtest.IgniteApp, "s", "module", "--yes", "foo", "--ibc", "--require-registration"), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), )) @@ -136,28 +132,28 @@ func TestCreateIBCOracle(t *testing.T) { "defaultName,isLaunched:bool,minLaunch:uint,maxLaunch:int", "--require-registration", ), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), )) env.Must(env.Exec("create the first BandChain oracle integration", step.NewSteps(step.New( step.Exec(envtest.IgniteApp, "s", "band", "--yes", "oracleone", "--module", "foo"), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), )) env.Must(env.Exec("create the second BandChain oracle integration", step.NewSteps(step.New( step.Exec(envtest.IgniteApp, "s", "band", "--yes", "oracletwo", "--module", "foo"), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), )) env.Must(env.Exec("should prevent creating a BandChain oracle with no module specified", step.NewSteps(step.New( step.Exec(envtest.IgniteApp, "s", "band", "--yes", "invalidOracle"), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), envtest.ExecShouldError(), )) @@ -165,7 +161,7 @@ func TestCreateIBCOracle(t *testing.T) { env.Must(env.Exec("should prevent creating a BandChain oracle in a non existent module", step.NewSteps(step.New( step.Exec(envtest.IgniteApp, "s", "band", "--yes", "invalidOracle", "--module", "nomodule"), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), envtest.ExecShouldError(), )) @@ -173,32 +169,31 @@ func TestCreateIBCOracle(t *testing.T) { env.Must(env.Exec("create a non-IBC module", step.NewSteps(step.New( step.Exec(envtest.IgniteApp, "s", "module", "--yes", "bar", "--params", "name,minLaunch:uint,maxLaunch:int", "--require-registration"), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), )) env.Must(env.Exec("should prevent creating a BandChain oracle in a non IBC module", step.NewSteps(step.New( step.Exec(envtest.IgniteApp, "s", "band", "--yes", "invalidOracle", "--module", "bar"), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), envtest.ExecShouldError(), )) - env.EnsureAppIsSteady(path) + app.EnsureSteady() } func TestCreateIBCPacket(t *testing.T) { - var ( - env = envtest.New(t) - path = env.Scaffold("github.com/test/blogibc2") + env = envtest.New(t) + app = env.Scaffold("github.com/test/blogibc2") ) env.Must(env.Exec("create an IBC module", step.NewSteps(step.New( step.Exec(envtest.IgniteApp, "s", "module", "--yes", "foo", "--ibc", "--require-registration"), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), )) @@ -217,14 +212,14 @@ func TestCreateIBCPacket(t *testing.T) { "--ack", "foo:string,bar:int,baz:bool", ), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), )) env.Must(env.Exec("should prevent creating a packet with no module specified", step.NewSteps(step.New( step.Exec(envtest.IgniteApp, "s", "packet", "--yes", "bar", "text"), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), envtest.ExecShouldError(), )) @@ -232,7 +227,7 @@ func TestCreateIBCPacket(t *testing.T) { env.Must(env.Exec("should prevent creating a packet in a non existent module", step.NewSteps(step.New( step.Exec(envtest.IgniteApp, "s", "packet", "--yes", "bar", "text", "--module", "nomodule"), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), envtest.ExecShouldError(), )) @@ -240,7 +235,7 @@ func TestCreateIBCPacket(t *testing.T) { env.Must(env.Exec("should prevent creating an existing packet", step.NewSteps(step.New( step.Exec(envtest.IgniteApp, "s", "packet", "--yes", "bar", "post", "--module", "foo"), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), envtest.ExecShouldError(), )) @@ -267,52 +262,52 @@ func TestCreateIBCPacket(t *testing.T) { "victory:bool", "--module", "foo"), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), )) env.Must(env.Exec("create a custom field type", step.NewSteps(step.New( step.Exec(envtest.IgniteApp, "s", "type", "--yes", "custom-type", "customField:uint", "--module", "foo"), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), )) env.Must(env.Exec("create a packet with a custom field type", step.NewSteps(step.New( step.Exec(envtest.IgniteApp, "s", "packet", "--yes", "foo-baz", "customField:CustomType", "--module", "foo"), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), )) env.Must(env.Exec("create a packet with no send message", step.NewSteps(step.New( step.Exec(envtest.IgniteApp, "s", "packet", "--yes", "nomessage", "foo", "--no-message", "--module", "foo"), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), )) env.Must(env.Exec("create a packet with no field", step.NewSteps(step.New( step.Exec(envtest.IgniteApp, "s", "packet", "--yes", "empty", "--module", "foo"), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), )) env.Must(env.Exec("create a non-IBC module", step.NewSteps(step.New( step.Exec(envtest.IgniteApp, "s", "module", "--yes", "bar", "--require-registration"), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), )) env.Must(env.Exec("should prevent creating a packet in a non IBC module", step.NewSteps(step.New( step.Exec(envtest.IgniteApp, "s", "packet", "--yes", "foo", "text", "--module", "bar"), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), envtest.ExecShouldError(), )) - env.EnsureAppIsSteady(path) + app.EnsureSteady() } diff --git a/integration/app/tx_test.go b/integration/app/tx_test.go index 82ee598550..c4e4257a73 100644 --- a/integration/app/tx_test.go +++ b/integration/app/tx_test.go @@ -1,5 +1,4 @@ //go:build !relayer -// +build !relayer package app_test @@ -21,12 +20,103 @@ import ( envtest "github.com/ignite/cli/integration" ) +func TestSignTxWithDashedAppName(t *testing.T) { + var ( + env = envtest.New(t) + appname = "dashed-app-name" + app = env.Scaffold(appname) + host = app.RandomizeServerPorts() + ctx, cancel = context.WithCancel(env.Ctx()) + ) + + nodeAddr, err := xurl.TCP(host.RPC) + if err != nil { + t.Fatalf("cant read nodeAddr from host.RPC %v: %v", host.RPC, err) + } + + env.Exec("scaffold a simple list", + step.NewSteps(step.New( + step.Workdir(app.SourcePath()), + step.Exec( + envtest.IgniteApp, + "scaffold", + "list", + "item", + "str", + "--yes", + ), + )), + ) + + var ( + output = &bytes.Buffer{} + isTxBodyRetrieved bool + txResponse struct { + Code int + RawLog string `json:"raw_log"` + } + ) + // sign tx to add an item to the list. + steps := step.NewSteps( + step.New( + step.Exec( + app.Binary(), + "config", + "output", "json", + ), + step.PreExec(func() error { + return env.IsAppServed(ctx, host) + }), + ), + step.New( + step.Stdout(output), + step.PreExec(func() error { + err := env.IsAppServed(ctx, host) + return err + }), + step.Exec( + app.Binary(), + "tx", + "dashedappname", + "create-item", + "helloworld", + "--from", "alice", + "--node", nodeAddr, + "--yes", + ), + step.PostExec(func(execErr error) error { + if execErr != nil { + return execErr + } + err := json.Unmarshal(output.Bytes(), &txResponse) + if err != nil { + return fmt.Errorf("unmarshling tx response: %w", err) + } + return nil + }), + ), + ) + + go func() { + defer cancel() + isTxBodyRetrieved = env.Exec("sign a tx", steps, envtest.ExecRetry()) + }() + + env.Must(app.Serve("should serve", envtest.ExecCtx(ctx))) + + if !isTxBodyRetrieved { + t.FailNow() + } + require.Equal(t, 0, txResponse.Code, + "tx failed code=%d log=%s", txResponse.Code, txResponse.RawLog) +} + func TestGetTxViaGRPCGateway(t *testing.T) { var ( env = envtest.New(t) appname = randstr.Runes(10) - path = env.Scaffold(fmt.Sprintf("github.com/test/%s", appname)) - host = env.RandomizeServerPorts(path, "") + app = env.Scaffold(fmt.Sprintf("github.com/test/%s", appname)) + host = app.RandomizeServerPorts() ctx, cancel = context.WithCancel(env.Ctx()) ) @@ -53,7 +143,7 @@ func TestGetTxViaGRPCGateway(t *testing.T) { steps := step.NewSteps( step.New( step.Exec( - appname+"d", + app.Binary(), "config", "output", "json", ), @@ -63,7 +153,7 @@ func TestGetTxViaGRPCGateway(t *testing.T) { ), step.New( step.Exec( - appname+"d", + app.Binary(), "keys", "list", "--keyring-backend", "test", @@ -101,7 +191,7 @@ func TestGetTxViaGRPCGateway(t *testing.T) { // endpoint by asserting denom and amount. return cmdrunner.New().Run(ctx, step.New( step.Exec( - appname+"d", + app.Binary(), "tx", "bank", "send", @@ -167,7 +257,7 @@ func TestGetTxViaGRPCGateway(t *testing.T) { isTxBodyRetrieved = env.Exec("retrieve account addresses", steps, envtest.ExecRetry()) }() - env.Must(env.Serve("should serve", path, "", "", envtest.ExecCtx(ctx))) + env.Must(app.Serve("should serve", envtest.ExecCtx(ctx))) if !isTxBodyRetrieved { t.FailNow() diff --git a/integration/app/cache_test.go b/integration/chain/cache_test.go similarity index 73% rename from integration/app/cache_test.go rename to integration/chain/cache_test.go index 85dceb4030..bfd752fd8a 100644 --- a/integration/app/cache_test.go +++ b/integration/chain/cache_test.go @@ -1,4 +1,6 @@ -package app_test +//go:build !relayer + +package chain_test import ( "context" @@ -16,11 +18,11 @@ import ( func TestCliWithCaching(t *testing.T) { var ( env = envtest.New(t) - path = env.Scaffold("github.com/test/cacheblog") - vueGenerated = filepath.Join(path, "vue/src/store/generated") - openapiGenerated = filepath.Join(path, "docs/static/openapi.yml") - typesDir = filepath.Join(path, "x/cacheblog/types") - servers = env.RandomizeServerPorts(path, "") + app = env.Scaffold("github.com/test/cacheblog") + vueGenerated = filepath.Join(app.SourcePath(), "vue/src/store/generated") + openapiGenerated = filepath.Join(app.SourcePath(), "docs/static/openapi.yml") + typesDir = filepath.Join(app.SourcePath(), "x/cacheblog/types") + servers = app.RandomizeServerPorts() ctx, cancel = context.WithTimeout(env.Ctx(), envtest.ServeTimeout) isBackendAliveErr error ) @@ -36,7 +38,7 @@ func TestCliWithCaching(t *testing.T) { "myfield2:bool", "--yes", ), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), )) @@ -50,7 +52,7 @@ func TestCliWithCaching(t *testing.T) { "mytypefield", "--yes", ), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), )) @@ -62,11 +64,11 @@ func TestCliWithCaching(t *testing.T) { "build", "--proto-all-modules", ), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), )) - env.EnsureAppIsSteady(path) + app.EnsureSteady() deleteCachedFiles(t, vueGenerated, openapiGenerated, typesDir) @@ -78,11 +80,11 @@ func TestCliWithCaching(t *testing.T) { "build", "--proto-all-modules", ), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), )) - env.EnsureAppIsSteady(path) + app.EnsureSteady() deleteCachedFiles(t, vueGenerated, openapiGenerated, typesDir) @@ -90,7 +92,7 @@ func TestCliWithCaching(t *testing.T) { defer cancel() isBackendAliveErr = env.IsAppServed(ctx, servers) }() - env.Must(env.Serve("should serve with Stargate version", path, "", "", envtest.ExecCtx(ctx))) + env.Must(app.Serve("should serve with Stargate version", envtest.ExecCtx(ctx))) require.NoError(t, isBackendAliveErr, "app cannot get online in time") } diff --git a/integration/app/cmd_serve_test.go b/integration/chain/cmd_serve_test.go similarity index 64% rename from integration/app/cmd_serve_test.go rename to integration/chain/cmd_serve_test.go index d040b50f30..27d0a74219 100644 --- a/integration/app/cmd_serve_test.go +++ b/integration/chain/cmd_serve_test.go @@ -1,17 +1,16 @@ //go:build !relayer -// +build !relayer -package app_test +package chain_test import ( "context" - "os" "path/filepath" "testing" "github.com/stretchr/testify/require" "github.com/ignite/cli/ignite/pkg/cmdrunner/step" + "github.com/ignite/cli/ignite/pkg/xos" envtest "github.com/ignite/cli/integration" ) @@ -20,14 +19,14 @@ func TestServeStargateWithWasm(t *testing.T) { var ( env = envtest.New(t) - apath = env.Scaffold("github.com/test/sgblog") - servers = env.RandomizeServerPorts(apath, "") + app = env.Scaffold("github.com/test/sgblog") + servers = app.RandomizeServerPorts() ) env.Must(env.Exec("add Wasm module", step.NewSteps(step.New( step.Exec(envtest.IgniteApp, "s", "wasm", "--yes"), - step.Workdir(apath), + step.Workdir(app.SourcePath()), )), )) @@ -39,7 +38,7 @@ func TestServeStargateWithWasm(t *testing.T) { defer cancel() isBackendAliveErr = env.IsAppServed(ctx, servers) }() - env.Must(env.Serve("should serve with Stargate version", apath, "", "", envtest.ExecCtx(ctx))) + env.Must(app.Serve("should serve with Stargate version", envtest.ExecCtx(ctx))) require.NoError(t, isBackendAliveErr, "app cannot get online in time") } @@ -47,8 +46,8 @@ func TestServeStargateWithWasm(t *testing.T) { func TestServeStargateWithCustomHome(t *testing.T) { var ( env = envtest.New(t) - apath = env.Scaffold("github.com/test/sgblog2") - servers = env.RandomizeServerPorts(apath, "") + app = env.Scaffold("github.com/test/sgblog2") + servers = app.RandomizeServerPorts() ) var ( @@ -59,7 +58,7 @@ func TestServeStargateWithCustomHome(t *testing.T) { defer cancel() isBackendAliveErr = env.IsAppServed(ctx, servers) }() - env.Must(env.Serve("should serve with Stargate version", apath, "./home", "", envtest.ExecCtx(ctx))) + env.Must(app.Serve("should serve with Stargate version", envtest.ExecCtx(ctx))) require.NoError(t, isBackendAliveErr, "app cannot get online in time") } @@ -67,13 +66,10 @@ func TestServeStargateWithCustomHome(t *testing.T) { func TestServeStargateWithConfigHome(t *testing.T) { var ( env = envtest.New(t) - apath = env.Scaffold("github.com/test/sgblog3") - servers = env.RandomizeServerPorts(apath, "") + app = env.Scaffold("github.com/test/sgblog3") + servers = app.RandomizeServerPorts() ) - // Set config homes - env.SetRandomHomeConfig(apath, "") - var ( ctx, cancel = context.WithTimeout(env.Ctx(), envtest.ServeTimeout) isBackendAliveErr error @@ -82,7 +78,7 @@ func TestServeStargateWithConfigHome(t *testing.T) { defer cancel() isBackendAliveErr = env.IsAppServed(ctx, servers) }() - env.Must(env.Serve("should serve with Stargate version", apath, "", "", envtest.ExecCtx(ctx))) + env.Must(app.Serve("should serve with Stargate version", envtest.ExecCtx(ctx))) require.NoError(t, isBackendAliveErr, "app cannot get online in time") } @@ -91,19 +87,17 @@ func TestServeStargateWithCustomConfigFile(t *testing.T) { tmpDir := t.TempDir() var ( - env = envtest.New(t) - apath = env.Scaffold("github.com/test/sgblog4") + env = envtest.New(t) + app = env.Scaffold("github.com/test/sgblog4") ) // Move config newConfig := "new_config.yml" newConfigPath := filepath.Join(tmpDir, newConfig) - err := os.Rename(filepath.Join(apath, "config.yml"), newConfigPath) + err := xos.Rename(filepath.Join(app.SourcePath(), "config.yml"), newConfigPath) require.NoError(t, err) + app.SetConfigPath(newConfigPath) - servers := env.RandomizeServerPorts(tmpDir, newConfig) - - // Set config homes - env.SetRandomHomeConfig(tmpDir, newConfig) + servers := app.RandomizeServerPorts() var ( ctx, cancel = context.WithTimeout(env.Ctx(), envtest.ServeTimeout) @@ -113,7 +107,7 @@ func TestServeStargateWithCustomConfigFile(t *testing.T) { defer cancel() isBackendAliveErr = env.IsAppServed(ctx, servers) }() - env.Must(env.Serve("should serve with Stargate version", apath, "", newConfigPath, envtest.ExecCtx(ctx))) + env.Must(app.Serve("should serve with Stargate version", envtest.ExecCtx(ctx))) require.NoError(t, isBackendAliveErr, "app cannot get online in time") } @@ -122,12 +116,10 @@ func TestServeStargateWithCustomConfigFile(t *testing.T) { func TestServeStargateWithName(t *testing.T) { var ( env = envtest.New(t) - apath = env.Scaffold("sgblog5") - servers = env.RandomizeServerPorts(apath, "") + app = env.Scaffold("sgblog5") + servers = app.RandomizeServerPorts() ) - env.SetRandomHomeConfig(apath, "") - ctx, cancel := context.WithTimeout(env.Ctx(), envtest.ServeTimeout) var isBackendAliveErr error @@ -138,7 +130,7 @@ func TestServeStargateWithName(t *testing.T) { isBackendAliveErr = env.IsAppServed(ctx, servers) }() - env.Must(env.Serve("should serve with Stargate version", apath, "", "", envtest.ExecCtx(ctx))) + env.Must(app.Serve("should serve with Stargate version", envtest.ExecCtx(ctx))) require.NoError(t, isBackendAliveErr, "app cannot get online in time") } diff --git a/integration/app/config_test.go b/integration/chain/config_test.go similarity index 82% rename from integration/app/config_test.go rename to integration/chain/config_test.go index ece287ef96..80b439ae64 100644 --- a/integration/app/config_test.go +++ b/integration/chain/config_test.go @@ -1,7 +1,6 @@ //go:build !relayer -// +build !relayer -package app_test +package chain_test import ( "context" @@ -21,15 +20,15 @@ func TestOverwriteSDKConfigsAndChainID(t *testing.T) { var ( env = envtest.New(t) appname = randstr.Runes(10) - path = env.Scaffold(fmt.Sprintf("github.com/test/%s", appname)) - servers = env.RandomizeServerPorts(path, "") + app = env.Scaffold(fmt.Sprintf("github.com/test/%s", appname)) + servers = app.RandomizeServerPorts() ctx, cancel = context.WithCancel(env.Ctx()) isBackendAliveErr error ) var c chainconfig.Config - cf := confile.New(confile.DefaultYAMLEncodingCreator, filepath.Join(path, "config.yml")) + cf := confile.New(confile.DefaultYAMLEncodingCreator, filepath.Join(app.SourcePath(), "config.yml")) require.NoError(t, cf.Load(&c)) c.Genesis = map[string]interface{}{"chain_id": "cosmos"} @@ -42,7 +41,7 @@ func TestOverwriteSDKConfigsAndChainID(t *testing.T) { defer cancel() isBackendAliveErr = env.IsAppServed(ctx, servers) }() - env.Must(env.Serve("should serve", path, "", "", envtest.ExecCtx(ctx))) + env.Must(app.Serve("should serve", envtest.ExecCtx(ctx))) require.NoError(t, isBackendAliveErr, "app cannot get online in time") configs := []struct { @@ -58,7 +57,7 @@ func TestOverwriteSDKConfigsAndChainID(t *testing.T) { for _, c := range configs { var conf map[string]interface{} - cf := confile.New(c.ec, filepath.Join(env.AppdHome(appname), c.relpath)) + cf := confile.New(c.ec, filepath.Join(env.AppHome(appname), c.relpath)) require.NoError(t, cf.Load(&conf)) require.Equal(t, c.expectedVal, conf[c.key]) } diff --git a/integration/cosmosgen/cosmosgen_test.go b/integration/cosmosgen/cosmosgen_test.go index f526cfb872..5b8571740a 100644 --- a/integration/cosmosgen/cosmosgen_test.go +++ b/integration/cosmosgen/cosmosgen_test.go @@ -15,8 +15,8 @@ import ( func TestCosmosGen(t *testing.T) { var ( env = envtest.New(t) - path = env.Scaffold("github.com/test/blog") - dirGenerated = filepath.Join(path, "vue/src/store/generated") + app = env.Scaffold("github.com/test/blog") + dirGenerated = filepath.Join(app.SourcePath(), "vue/src/store/generated") ) const ( @@ -33,7 +33,7 @@ func TestCosmosGen(t *testing.T) { "--yes", withMsgModuleName, ), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), )) @@ -50,7 +50,7 @@ func TestCosmosGen(t *testing.T) { "--module", withMsgModuleName, ), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), )) @@ -63,7 +63,7 @@ func TestCosmosGen(t *testing.T) { "--yes", withoutMsgModuleName, ), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), )) @@ -79,7 +79,7 @@ func TestCosmosGen(t *testing.T) { "--module", withoutMsgModuleName, ), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), )) @@ -95,13 +95,13 @@ func TestCosmosGen(t *testing.T) { "--module", withoutMsgModuleName, ), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), )) require.NoError(t, os.RemoveAll(dirGenerated)) - env.Must(env.Exec("generate vuex", + env.Must(env.Exec("generate typescript", step.NewSteps(step.New( step.Exec( envtest.IgniteApp, @@ -110,11 +110,11 @@ func TestCosmosGen(t *testing.T) { "--yes", "--proto-all-modules", ), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), )) - var expectedCosmosModules = []string{ + expectedCosmosModules := []string{ "cosmos.auth.v1beta1", "cosmos.authz.v1beta1", "cosmos.bank.v1beta1", @@ -124,7 +124,10 @@ func TestCosmosGen(t *testing.T) { "cosmos.evidence.v1beta1", "cosmos.feegrant.v1beta1", "cosmos.gov.v1beta1", + "cosmos.gov.v1", + "cosmos.group.v1", "cosmos.mint.v1beta1", + "cosmos.nft.v1beta1", "cosmos.params.v1beta1", "cosmos.slashing.v1beta1", "cosmos.staking.v1beta1", @@ -133,29 +136,21 @@ func TestCosmosGen(t *testing.T) { "cosmos.vesting.v1beta1", } - var expectedCustomModules = []string{ + expectedCustomModules := []string{ "test.blog.blog", "test.blog.withmsg", "test.blog.withoutmsg", } - for _, chainModule := range expectedCustomModules { - _, statErr := os.Stat(filepath.Join(dirGenerated, "test/blog", chainModule)) - require.False(t, os.IsNotExist(statErr), fmt.Sprintf("the %s vuex store should have be generated", chainModule)) + for _, customModule := range expectedCustomModules { + _, statErr := os.Stat(filepath.Join(dirGenerated, customModule)) + require.False(t, os.IsNotExist(statErr), fmt.Sprintf("the %s module should have been generated", customModule)) require.NoError(t, statErr) } - chainDir, err := os.ReadDir(filepath.Join(dirGenerated, "test/blog")) - require.Equal(t, len(expectedCustomModules), len(chainDir), "no extra modules should have been generated for test/blog") - require.NoError(t, err) - for _, cosmosModule := range expectedCosmosModules { - _, statErr := os.Stat(filepath.Join(dirGenerated, "cosmos/cosmos-sdk", cosmosModule)) - require.False(t, os.IsNotExist(statErr), fmt.Sprintf("the %s code generation for module should have be made", cosmosModule)) + _, statErr := os.Stat(filepath.Join(dirGenerated, cosmosModule)) + require.False(t, os.IsNotExist(statErr), fmt.Sprintf("the %s module should have been generated", cosmosModule)) require.NoError(t, statErr) } - - cosmosDirs, err := os.ReadDir(filepath.Join(dirGenerated, "cosmos/cosmos-sdk")) - require.Equal(t, len(expectedCosmosModules), len(cosmosDirs), "no extra modules should have been generated for cosmos/cosmos-sdk") - require.NoError(t, err) } diff --git a/integration/env.go b/integration/env.go index 50830861e2..30a0d17c3f 100644 --- a/integration/env.go +++ b/integration/env.go @@ -1,38 +1,30 @@ package envtest import ( - "bytes" "context" "errors" + "flag" "fmt" - "io" "os" - "path" "path/filepath" "strconv" + "strings" "testing" "time" "github.com/cenkalti/backoff" - "github.com/goccy/go-yaml" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/ignite/cli/ignite/chainconfig" - "github.com/ignite/cli/ignite/pkg/availableport" - "github.com/ignite/cli/ignite/pkg/cmdrunner" - "github.com/ignite/cli/ignite/pkg/cmdrunner/step" "github.com/ignite/cli/ignite/pkg/cosmosfaucet" - "github.com/ignite/cli/ignite/pkg/gocmd" "github.com/ignite/cli/ignite/pkg/httpstatuschecker" "github.com/ignite/cli/ignite/pkg/xexec" "github.com/ignite/cli/ignite/pkg/xurl" ) const ( - ServeTimeout = time.Minute * 15 - IgniteApp = "ignite" - ConfigYML = "config.yml" + IgniteApp = "ignite" + Stargate = "stargate" ) var isCI, _ = strconv.ParseBool(os.Getenv("CI")) @@ -71,185 +63,6 @@ func (e Env) Ctx() context.Context { return e.ctx } -type execOptions struct { - ctx context.Context - shouldErr, shouldRetry bool - stdout, stderr io.Writer -} - -type ExecOption func(*execOptions) - -// ExecShouldError sets the expectations of a command's execution to end with a failure. -func ExecShouldError() ExecOption { - return func(o *execOptions) { - o.shouldErr = true - } -} - -// ExecCtx sets cancelation context for the execution. -func ExecCtx(ctx context.Context) ExecOption { - return func(o *execOptions) { - o.ctx = ctx - } -} - -// ExecStdout captures stdout of an execution. -func ExecStdout(w io.Writer) ExecOption { - return func(o *execOptions) { - o.stdout = w - } -} - -// ExecStderr captures stderr of an execution. -func ExecStderr(w io.Writer) ExecOption { - return func(o *execOptions) { - o.stderr = w - } -} - -// ExecRetry retries command until it is successful before context is canceled. -func ExecRetry() ExecOption { - return func(o *execOptions) { - o.shouldRetry = true - } -} - -// Exec executes a command step with options where msg describes the expectation from the test. -// unless calling with Must(), Exec() will not exit test runtime on failure. -func (e Env) Exec(msg string, steps step.Steps, options ...ExecOption) (ok bool) { - opts := &execOptions{ - ctx: e.ctx, - stdout: io.Discard, - stderr: io.Discard, - } - for _, o := range options { - o(opts) - } - var ( - stdout = &bytes.Buffer{} - stderr = &bytes.Buffer{} - ) - copts := []cmdrunner.Option{ - cmdrunner.DefaultStdout(io.MultiWriter(stdout, opts.stdout)), - cmdrunner.DefaultStderr(io.MultiWriter(stderr, opts.stderr)), - } - if isCI { - copts = append(copts, cmdrunner.EndSignal(os.Kill)) - } - err := cmdrunner. - New(copts...). - Run(opts.ctx, steps...) - if err == context.Canceled { - err = nil - } - if err != nil { - fmt.Fprintln(os.Stderr, err) - if opts.shouldRetry && opts.ctx.Err() == nil { - time.Sleep(time.Second) - return e.Exec(msg, steps, options...) - } - } - if err != nil { - msg = fmt.Sprintf("%s\n\nLogs:\n\n%s\n\nError Logs:\n\n%s\n", - msg, - stdout.String(), - stderr.String()) - } - if opts.shouldErr { - return assert.Error(e.t, err, msg) - } - return assert.NoError(e.t, err, msg) -} - -const ( - Stargate = "stargate" -) - -// Scaffold scaffolds an app to a unique appPath and returns it. -func (e Env) Scaffold(name string, flags ...string) (appPath string) { - root := e.TmpDir() - e.Exec("scaffold an app", - step.NewSteps(step.New( - step.Exec( - IgniteApp, - append([]string{ - "scaffold", - "chain", - name, - }, flags...)..., - ), - step.Workdir(root), - )), - ) - - appDir := path.Base(name) - - // Cleanup the home directory and cache of the app - e.t.Cleanup(func() { - os.RemoveAll(filepath.Join(e.Home(), fmt.Sprintf(".%s", appDir))) - }) - - return filepath.Join(root, appDir) -} - -// Serve serves an application lives under path with options where msg describes the -// execution from the serving action. -// unless calling with Must(), Serve() will not exit test runtime on failure. -func (e Env) Serve(msg, path, home, configPath string, options ...ExecOption) (ok bool) { - serveCommand := []string{ - "chain", - "serve", - "-v", - } - - if home != "" { - serveCommand = append(serveCommand, "--home", home) - } - if configPath != "" { - serveCommand = append(serveCommand, "--config", configPath) - } - - return e.Exec(msg, - step.NewSteps(step.New( - step.Exec(IgniteApp, serveCommand...), - step.Workdir(path), - )), - options..., - ) -} - -// Simulate runs the simulation test for the app -func (e Env) Simulate(appPath string, numBlocks, blockSize int) { - e.Exec("running the simulation tests", - step.NewSteps(step.New( - step.Exec( - IgniteApp, - "chain", - "simulate", - "--numBlocks", - strconv.Itoa(numBlocks), - "--blockSize", - strconv.Itoa(blockSize), - ), - step.Workdir(appPath), - )), - ) -} - -// EnsureAppIsSteady ensures that app living at the path can compile and its tests -// are passing. -func (e Env) EnsureAppIsSteady(appPath string) { - _, statErr := os.Stat(filepath.Join(appPath, ConfigYML)) - require.False(e.t, os.IsNotExist(statErr), "config.yml cannot be found") - - e.Exec("make sure app is steady", - step.NewSteps(step.New( - step.Exec(gocmd.Name(), "test", "./..."), - step.Workdir(appPath), - )), - ) -} - // IsAppServed checks that app is served properly and servers are started to listening // before ctx canceled. func (e Env) IsAppServed(ctx context.Context, host chainconfig.Host) error { @@ -259,12 +72,16 @@ func (e Env) IsAppServed(ctx context.Context, host chainconfig.Host) error { return err } - ok, err := httpstatuschecker.Check(ctx, fmt.Sprintf("%s/node_info", addr)) + ok, err := httpstatuschecker.Check(ctx, fmt.Sprintf("%s/cosmos/base/tendermint/v1beta1/node_info", addr)) if err == nil && !ok { err = errors.New("app is not online") } + if HasTestVerboseFlag() { + fmt.Printf("IsAppServed at %s: %v\n", addr, err) + } return err } + return backoff.Retry(checkAlive, backoff.WithContext(backoff.NewConstantBackOff(time.Second), ctx)) } @@ -274,108 +91,25 @@ func (e Env) IsFaucetServed(ctx context.Context, faucetClient cosmosfaucet.HTTPC _, err := faucetClient.FaucetInfo(ctx) return err } + return backoff.Retry(checkAlive, backoff.WithContext(backoff.NewConstantBackOff(time.Second), ctx)) } // TmpDir creates a new temporary directory. func (e Env) TmpDir() (path string) { - path, err := os.MkdirTemp("", "integration") - require.NoError(e.t, err, "create a tmp dir") - e.t.Cleanup(func() { os.RemoveAll(path) }) - return path + return e.t.TempDir() } -// RandomizeServerPorts randomizes server ports for the app at path, updates -// its config.yml and returns new values. -func (e Env) RandomizeServerPorts(path string, configFile string) chainconfig.Host { - if configFile == "" { - configFile = ConfigYML - } - - // generate random server ports and servers list. - ports, err := availableport.Find(6) - require.NoError(e.t, err) - - genAddr := func(port int) string { - return fmt.Sprintf("localhost:%d", port) - } - - servers := chainconfig.Host{ - RPC: genAddr(ports[0]), - P2P: genAddr(ports[1]), - Prof: genAddr(ports[2]), - GRPC: genAddr(ports[3]), - GRPCWeb: genAddr(ports[4]), - API: genAddr(ports[5]), - } - - // update config.yml with the generated servers list. - configyml, err := os.OpenFile(filepath.Join(path, configFile), os.O_RDWR|os.O_CREATE, 0755) - require.NoError(e.t, err) - defer configyml.Close() - - var conf chainconfig.Config - require.NoError(e.t, yaml.NewDecoder(configyml).Decode(&conf)) - - conf.Host = servers - require.NoError(e.t, configyml.Truncate(0)) - _, err = configyml.Seek(0, 0) - require.NoError(e.t, err) - require.NoError(e.t, yaml.NewEncoder(configyml).Encode(conf)) - - return servers -} - -// ConfigureFaucet finds a random port for the app faucet and updates config.yml with this port and provided coins options -func (e Env) ConfigureFaucet(path string, configFile string, coins, coinsMax []string) string { - if configFile == "" { - configFile = ConfigYML - } - - // find a random available port - port, err := availableport.Find(1) - require.NoError(e.t, err) - - configyml, err := os.OpenFile(filepath.Join(path, configFile), os.O_RDWR|os.O_CREATE, 0755) - require.NoError(e.t, err) - defer configyml.Close() - - var conf chainconfig.Config - require.NoError(e.t, yaml.NewDecoder(configyml).Decode(&conf)) - - conf.Faucet.Port = port[0] - conf.Faucet.Coins = coins - conf.Faucet.CoinsMax = coinsMax - require.NoError(e.t, configyml.Truncate(0)) - _, err = configyml.Seek(0, 0) - require.NoError(e.t, err) - require.NoError(e.t, yaml.NewEncoder(configyml).Encode(conf)) - - addr, err := xurl.HTTP(fmt.Sprintf("0.0.0.0:%d", port[0])) +// Home returns user's home dir. +func (e Env) Home() string { + home, err := os.UserHomeDir() require.NoError(e.t, err) - - return addr + return home } -// SetRandomHomeConfig sets in the blockchain config files generated temporary directories for home directories -func (e Env) SetRandomHomeConfig(path string, configFile string) { - if configFile == "" { - configFile = ConfigYML - } - - // update config.yml with the generated temporary directories - configyml, err := os.OpenFile(filepath.Join(path, configFile), os.O_RDWR|os.O_CREATE, 0755) - require.NoError(e.t, err) - defer configyml.Close() - - var conf chainconfig.Config - require.NoError(e.t, yaml.NewDecoder(configyml).Decode(&conf)) - - conf.Init.Home = e.TmpDir() - require.NoError(e.t, configyml.Truncate(0)) - _, err = configyml.Seek(0, 0) - require.NoError(e.t, err) - require.NoError(e.t, yaml.NewEncoder(configyml).Encode(conf)) +// AppHome returns app's root home/data dir path. +func (e Env) AppHome(name string) string { + return filepath.Join(e.Home(), fmt.Sprintf(".%s", name)) } // Must fails the immediately if not ok. @@ -386,14 +120,18 @@ func (e Env) Must(ok bool) { } } -// Home returns user's home dir. -func (e Env) Home() string { - home, err := os.UserHomeDir() - require.NoError(e.t, err) - return home +func (e Env) HasFailed() bool { + return e.t.Failed() } -// AppdHome returns appd's home dir. -func (e Env) AppdHome(name string) string { - return filepath.Join(e.Home(), fmt.Sprintf(".%s", name)) +func (e Env) RequireExpectations() { + e.Must(e.HasFailed()) +} + +func Contains(s, partial string) bool { + return strings.Contains(s, strings.TrimSpace(partial)) +} + +func HasTestVerboseFlag() bool { + return flag.Lookup("test.v").Value.String() == "true" } diff --git a/integration/exec.go b/integration/exec.go new file mode 100644 index 0000000000..0d9bcb96fc --- /dev/null +++ b/integration/exec.go @@ -0,0 +1,110 @@ +package envtest + +import ( + "bytes" + "context" + "fmt" + "io" + "os" + "time" + + "github.com/stretchr/testify/assert" + + "github.com/ignite/cli/ignite/pkg/cmdrunner" + "github.com/ignite/cli/ignite/pkg/cmdrunner/step" +) + +type execOptions struct { + ctx context.Context + shouldErr, shouldRetry bool + stdout, stderr io.Writer +} + +type ExecOption func(*execOptions) + +// ExecShouldError sets the expectations of a command's execution to end with a failure. +func ExecShouldError() ExecOption { + return func(o *execOptions) { + o.shouldErr = true + } +} + +// ExecCtx sets cancelation context for the execution. +func ExecCtx(ctx context.Context) ExecOption { + return func(o *execOptions) { + o.ctx = ctx + } +} + +// ExecStdout captures stdout of an execution. +func ExecStdout(w io.Writer) ExecOption { + return func(o *execOptions) { + o.stdout = w + } +} + +// ExecStderr captures stderr of an execution. +func ExecStderr(w io.Writer) ExecOption { + return func(o *execOptions) { + o.stderr = w + } +} + +// ExecRetry retries command until it is successful before context is canceled. +func ExecRetry() ExecOption { + return func(o *execOptions) { + o.shouldRetry = true + } +} + +// Exec executes a command step with options where msg describes the expectation from the test. +// unless calling with Must(), Exec() will not exit test runtime on failure. +func (e Env) Exec(msg string, steps step.Steps, options ...ExecOption) (ok bool) { + opts := &execOptions{ + ctx: e.ctx, + stdout: io.Discard, + stderr: io.Discard, + } + for _, o := range options { + o(opts) + } + var ( + stdout = &bytes.Buffer{} + stderr = &bytes.Buffer{} + ) + copts := []cmdrunner.Option{ + cmdrunner.DefaultStdout(io.MultiWriter(stdout, opts.stdout)), + cmdrunner.DefaultStderr(io.MultiWriter(stderr, opts.stderr)), + } + if HasTestVerboseFlag() { + fmt.Printf("Executing %d step(s) for %q\n", len(steps), msg) + copts = append(copts, cmdrunner.EnableDebug()) + } + if isCI { + copts = append(copts, cmdrunner.EndSignal(os.Kill)) + } + err := cmdrunner. + New(copts...). + Run(opts.ctx, steps...) + if err == context.Canceled { + err = nil + } + if err != nil { + fmt.Fprintln(os.Stderr, err) + if opts.shouldRetry && opts.ctx.Err() == nil { + time.Sleep(time.Second) + return e.Exec(msg, steps, options...) + } + } + + if err != nil { + msg = fmt.Sprintf("%s\n\nLogs:\n\n%s\n\nError Logs:\n\n%s\n", + msg, + stdout.String(), + stderr.String()) + } + if opts.shouldErr { + return assert.Error(e.t, err, msg) + } + return assert.NoError(e.t, err, msg) +} diff --git a/integration/faucet/faucet_test.go b/integration/faucet/faucet_test.go index c6e9633763..b3e7fc029f 100644 --- a/integration/faucet/faucet_test.go +++ b/integration/faucet/faucet_test.go @@ -32,9 +32,9 @@ var ( func TestRequestCoinsFromFaucet(t *testing.T) { var ( env = envtest.New(t) - apath = env.Scaffold("github.com/test/faucet") - servers = env.RandomizeServerPorts(apath, "") - faucetURL = env.ConfigureFaucet(apath, "", defaultCoins, maxCoins) + app = env.Scaffold("github.com/test/faucet") + servers = app.RandomizeServerPorts() + faucetURL = app.EnableFaucet(defaultCoins, maxCoins) ctx, cancel = context.WithTimeout(env.Ctx(), envtest.ServeTimeout) faucetClient = cosmosfaucet.NewClient(faucetURL) ) @@ -46,7 +46,7 @@ func TestRequestCoinsFromFaucet(t *testing.T) { // serve the app go func() { - env.Serve("should serve app", apath, "", "", envtest.ExecCtx(ctx)) + app.Serve("should serve app", envtest.ExecCtx(ctx)) }() // wait servers to be online diff --git a/integration/list/cmd_list_test.go b/integration/list/cmd_list_test.go index 9dd3dcb93e..a77bf7a794 100644 --- a/integration/list/cmd_list_test.go +++ b/integration/list/cmd_list_test.go @@ -1,10 +1,8 @@ //go:build !relayer -// +build !relayer package list_test import ( - "path/filepath" "testing" "github.com/ignite/cli/ignite/pkg/cmdrunner/step" @@ -13,21 +11,38 @@ import ( func TestGenerateAnAppWithStargateWithListAndVerify(t *testing.T) { var ( - env = envtest.New(t) - path = env.Scaffold("github.com/test/blog") + env = envtest.New(t) + app = env.Scaffold("github.com/test/blog") ) + env.Must(env.Exec("create a module", + step.NewSteps(step.New( + step.Exec(envtest.IgniteApp, "s", "module", "--yes", "example", "--require-registration"), + step.Workdir(app.SourcePath()), + )), + )) + env.Must(env.Exec("create a list", step.NewSteps(step.New( step.Exec(envtest.IgniteApp, "s", "list", "--yes", "user", "email"), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), )) - env.Must(env.Exec("create a list with custom path", + env.Must(env.Exec("create a list with custom path and module", step.NewSteps(step.New( - step.Exec(envtest.IgniteApp, "s", "list", "--yes", "AppPath", "email", "--path", "blog"), - step.Workdir(filepath.Dir(path)), + step.Exec(envtest.IgniteApp, + "s", + "list", + "--yes", + "AppPath", + "email", + "--path", + "blog", + "--module", + "example", + ), + step.Workdir(app.SourcePath()), )), )) @@ -52,28 +67,44 @@ func TestGenerateAnAppWithStargateWithListAndVerify(t *testing.T) { "textCoinsAlias:coins", "--no-simulation", ), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), )) env.Must(env.Exec("create a list with bool", step.NewSteps(step.New( - step.Exec(envtest.IgniteApp, "s", "list", "--yes", "document", "signed:bool"), - step.Workdir(path), + step.Exec(envtest.IgniteApp, + "s", + "list", + "--yes", + "document", + "signed:bool", + "--module", + "example", + ), + step.Workdir(app.SourcePath()), )), )) env.Must(env.Exec("create a list with custom field type", step.NewSteps(step.New( - step.Exec(envtest.IgniteApp, "s", "list", "--yes", "custom", "document:Document"), - step.Workdir(path), + step.Exec(envtest.IgniteApp, + "s", + "list", + "--yes", + "custom", + "document:Document", + "--module", + "example", + ), + step.Workdir(app.SourcePath()), )), )) env.Must(env.Exec("should prevent creating a list with duplicated fields", step.NewSteps(step.New( step.Exec(envtest.IgniteApp, "s", "list", "--yes", "company", "name", "name"), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), envtest.ExecShouldError(), )) @@ -81,7 +112,7 @@ func TestGenerateAnAppWithStargateWithListAndVerify(t *testing.T) { env.Must(env.Exec("should prevent creating a list with unrecognized field type", step.NewSteps(step.New( step.Exec(envtest.IgniteApp, "s", "list", "--yes", "employee", "level:itn"), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), envtest.ExecShouldError(), )) @@ -89,7 +120,7 @@ func TestGenerateAnAppWithStargateWithListAndVerify(t *testing.T) { env.Must(env.Exec("should prevent creating an existing list", step.NewSteps(step.New( step.Exec(envtest.IgniteApp, "s", "list", "--yes", "user", "email"), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), envtest.ExecShouldError(), )) @@ -97,7 +128,7 @@ func TestGenerateAnAppWithStargateWithListAndVerify(t *testing.T) { env.Must(env.Exec("should prevent creating a list whose name is a reserved word", step.NewSteps(step.New( step.Exec(envtest.IgniteApp, "s", "list", "--yes", "map", "size:int"), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), envtest.ExecShouldError(), )) @@ -105,7 +136,7 @@ func TestGenerateAnAppWithStargateWithListAndVerify(t *testing.T) { env.Must(env.Exec("should prevent creating a list containing a field with a reserved word", step.NewSteps(step.New( step.Exec(envtest.IgniteApp, "s", "list", "--yes", "document", "type:int"), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), envtest.ExecShouldError(), )) @@ -113,55 +144,17 @@ func TestGenerateAnAppWithStargateWithListAndVerify(t *testing.T) { env.Must(env.Exec("create a list with no interaction message", step.NewSteps(step.New( step.Exec(envtest.IgniteApp, "s", "list", "--yes", "nomessage", "email", "--no-message"), - step.Workdir(path), - )), - )) - - env.EnsureAppIsSteady(path) -} - -func TestCreateListInCustomModuleWithStargate(t *testing.T) { - var ( - env = envtest.New(t) - path = env.Scaffold("github.com/test/blog") - ) - - env.Must(env.Exec("create a module", - step.NewSteps(step.New( - step.Exec(envtest.IgniteApp, "s", "module", "--yes", "example", "--require-registration"), - step.Workdir(path), - )), - )) - - env.Must(env.Exec("create a list", - step.NewSteps(step.New( - step.Exec(envtest.IgniteApp, "s", "list", "--yes", "user", "email", "--module", "example"), - step.Workdir(path), - )), - )) - - env.Must(env.Exec("create a list in the app's module", - step.NewSteps(step.New( - step.Exec(envtest.IgniteApp, "s", "list", "--yes", "user", "email"), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), )) env.Must(env.Exec("should prevent creating a list in a non existent module", step.NewSteps(step.New( step.Exec(envtest.IgniteApp, "s", "list", "--yes", "user", "email", "--module", "idontexist"), - step.Workdir(path), - )), - envtest.ExecShouldError(), - )) - - env.Must(env.Exec("should prevent creating an existing list", - step.NewSteps(step.New( - step.Exec(envtest.IgniteApp, "s", "list", "--yes", "user", "email", "--module", "example"), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), envtest.ExecShouldError(), )) - env.EnsureAppIsSteady(path) + app.EnsureSteady() } diff --git a/integration/map/cmd_map_test.go b/integration/map/cmd_map_test.go index 631ae4d918..e549ed92c6 100644 --- a/integration/map/cmd_map_test.go +++ b/integration/map/cmd_map_test.go @@ -1,5 +1,4 @@ //go:build !relayer -// +build !relayer package map_test @@ -13,35 +12,35 @@ import ( func TestCreateMapWithStargate(t *testing.T) { var ( - env = envtest.New(t) - path = env.Scaffold("github.com/test/blog") + env = envtest.New(t) + app = env.Scaffold("github.com/test/blog") ) env.Must(env.Exec("create a map", step.NewSteps(step.New( step.Exec(envtest.IgniteApp, "s", "map", "--yes", "user", "user-id", "email"), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), )) env.Must(env.Exec("create a map with custom path", step.NewSteps(step.New( - step.Exec(envtest.IgniteApp, "s", "map", "--yes", "appPath", "email", "--path", filepath.Join(path, "app")), - step.Workdir(filepath.Dir(path)), + step.Exec(envtest.IgniteApp, "s", "map", "--yes", "appPath", "email", "--path", filepath.Join(app.SourcePath(), "app")), + step.Workdir(app.SourcePath()), )), )) env.Must(env.Exec("create a map with no message", step.NewSteps(step.New( step.Exec(envtest.IgniteApp, "s", "map", "--yes", "nomessage", "email", "--no-message"), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), )) env.Must(env.Exec("create a module", step.NewSteps(step.New( step.Exec(envtest.IgniteApp, "s", "module", "--yes", "example", "--require-registration"), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), )) @@ -58,14 +57,14 @@ func TestCreateMapWithStargate(t *testing.T) { "example", "--no-simulation", ), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), )) env.Must(env.Exec("should prevent creating a map with a typename that already exist", step.NewSteps(step.New( step.Exec(envtest.IgniteApp, "s", "map", "--yes", "user", "email", "--module", "example"), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), envtest.ExecShouldError(), )) @@ -73,14 +72,14 @@ func TestCreateMapWithStargate(t *testing.T) { env.Must(env.Exec("create a map in a custom module", step.NewSteps(step.New( step.Exec(envtest.IgniteApp, "s", "map", "--yes", "mapUser", "email", "--module", "example"), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), )) env.Must(env.Exec("create a map with a custom field type", step.NewSteps(step.New( step.Exec(envtest.IgniteApp, "s", "map", "--yes", "mapDetail", "user:MapUser", "--module", "example"), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), )) @@ -106,7 +105,7 @@ func TestCreateMapWithStargate(t *testing.T) { "--module", "example", ), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), )) @@ -125,7 +124,7 @@ func TestCreateMapWithStargate(t *testing.T) { "--module", "example", ), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), )) @@ -143,7 +142,7 @@ func TestCreateMapWithStargate(t *testing.T) { "--module", "example", ), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), envtest.ExecShouldError(), )) @@ -152,14 +151,14 @@ func TestCreateMapWithStargate(t *testing.T) { step.NewSteps(step.New( step.Exec(envtest.IgniteApp, "s", "message", "--yes", "create-scavenge", "description"), step.Exec(envtest.IgniteApp, "s", "map", "--yes", "scavenge", "description", "--no-message"), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), )) env.Must(env.Exec("should prevent creating a map with duplicated indexes", step.NewSteps(step.New( step.Exec(envtest.IgniteApp, "s", "map", "--yes", "map_with_duplicated_index", "email", "--index", "foo,foo"), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), envtest.ExecShouldError(), )) @@ -167,10 +166,10 @@ func TestCreateMapWithStargate(t *testing.T) { env.Must(env.Exec("should prevent creating a map with an index present in fields", step.NewSteps(step.New( step.Exec(envtest.IgniteApp, "s", "map", "--yes", "map_with_invalid_index", "email", "--index", "email"), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), envtest.ExecShouldError(), )) - env.EnsureAppIsSteady(path) + app.EnsureSteady() } diff --git a/integration/node/cmd_query_bank_test.go b/integration/node/cmd_query_bank_test.go new file mode 100644 index 0000000000..d5577a6bd1 --- /dev/null +++ b/integration/node/cmd_query_bank_test.go @@ -0,0 +1,284 @@ +package node_test + +import ( + "bytes" + "context" + "path/filepath" + "strings" + "testing" + + "github.com/cosmos/cosmos-sdk/crypto/keyring" + sdktypes "github.com/cosmos/cosmos-sdk/types" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/ignite/cli/ignite/chainconfig" + "github.com/ignite/cli/ignite/pkg/cliui/entrywriter" + "github.com/ignite/cli/ignite/pkg/cmdrunner/step" + "github.com/ignite/cli/ignite/pkg/cosmosaccount" + "github.com/ignite/cli/ignite/pkg/cosmosclient" + "github.com/ignite/cli/ignite/pkg/randstr" + "github.com/ignite/cli/ignite/pkg/xurl" + envtest "github.com/ignite/cli/integration" +) + +const ( + keyringTestDirName = "keyring-test" + testPrefix = "testpref" +) + +func assertBankBalanceOutput(t *testing.T, output string, balances string) { + var table [][]string + coins, err := sdktypes.ParseCoinsNormalized(balances) + require.NoError(t, err, "wrong balances %s", balances) + for _, c := range coins { + table = append(table, []string{c.Amount.String(), c.Denom}) + } + var expectedBalances strings.Builder + entrywriter.MustWrite(&expectedBalances, []string{"Amount", "Denom"}, table...) + assert.Contains(t, output, expectedBalances.String()) +} + +func TestNodeQueryBankBalances(t *testing.T) { + var ( + appname = randstr.Runes(10) + alice = "alice" + + env = envtest.New(t) + app = env.Scaffold(appname, "--address-prefix", testPrefix) + home = env.AppHome(appname) + servers = app.RandomizeServerPorts() + + accKeyringDir = t.TempDir() + ) + + node, err := xurl.HTTP(servers.RPC) + require.NoError(t, err) + + ca, err := cosmosaccount.New( + cosmosaccount.WithHome(filepath.Join(home, keyringTestDirName)), + cosmosaccount.WithKeyringBackend(cosmosaccount.KeyringTest), + ) + require.NoError(t, err) + + aliceAccount, aliceMnemonic, err := ca.Create(alice) + require.NoError(t, err) + + app.EditConfig(func(conf *chainconfig.Config) { + conf.Accounts = []chainconfig.Account{ + { + Name: alice, + Mnemonic: aliceMnemonic, + Coins: []string{"5600atoken", "1200btoken", "100000000stake"}, + }, + } + conf.Faucet = chainconfig.Faucet{} + conf.Init.KeyringBackend = keyring.BackendTest + }) + + env.Must(env.Exec("import alice", + step.NewSteps(step.New( + step.Exec( + envtest.IgniteApp, + "account", + "import", + alice, + "--keyring-dir", accKeyringDir, + "--non-interactive", + "--secret", aliceMnemonic, + ), + )), + )) + + var ( + ctx, cancel = context.WithTimeout(env.Ctx(), envtest.ServeTimeout) + isBackendAliveErr error + ) + + // do not fail the test in a goroutine, it has to be done in the main. + go func() { + defer cancel() + + if isBackendAliveErr = env.IsAppServed(ctx, servers); isBackendAliveErr != nil { + return + } + + client, err := cosmosclient.New(context.Background(), + cosmosclient.WithAddressPrefix(testPrefix), + cosmosclient.WithNodeAddress(node), + ) + require.NoError(t, err) + require.NoError(t, client.WaitForNextBlock(context.Background())) + + b := &bytes.Buffer{} + + env.Exec("query bank balances by account name", + step.NewSteps(step.New( + step.Exec( + envtest.IgniteApp, + "node", + "query", + "bank", + "balances", + "alice", + "--node", node, + "--keyring-dir", accKeyringDir, + "--address-prefix", testPrefix, + ), + )), + envtest.ExecStdout(b), + ) + + if env.HasFailed() { + return + } + + assertBankBalanceOutput(t, b.String(), "5600atoken,1200btoken") + + b.Reset() + + aliceAddr, err := aliceAccount.Address(testPrefix) + require.NoError(t, err) + + env.Exec("query bank balances by address", + step.NewSteps(step.New( + step.Exec( + envtest.IgniteApp, + "node", + "query", + "bank", + "balances", + aliceAddr, + "--node", node, + "--keyring-dir", accKeyringDir, + "--address-prefix", testPrefix, + ), + )), + envtest.ExecStdout(b), + ) + + if env.HasFailed() { + return + } + + assertBankBalanceOutput(t, b.String(), "5600atoken,1200btoken") + + b.Reset() + env.Exec("query bank balances with pagination -page 1", + step.NewSteps(step.New( + step.Exec( + envtest.IgniteApp, + "node", + "query", + "bank", + "balances", + "alice", + "--node", node, + "--keyring-dir", accKeyringDir, + "--address-prefix", testPrefix, + "--limit", "1", + "--page", "1", + ), + )), + envtest.ExecStdout(b), + ) + + if env.HasFailed() { + return + } + + assertBankBalanceOutput(t, b.String(), "5600atoken") + assert.NotContains(t, b.String(), "btoken") + + b.Reset() + env.Exec("query bank balances with pagination -page 2", + step.NewSteps(step.New( + step.Exec( + envtest.IgniteApp, + "node", + "query", + "bank", + "balances", + "alice", + "--node", node, + "--keyring-dir", accKeyringDir, + "--address-prefix", testPrefix, + "--limit", "1", + "--page", "2", + ), + )), + envtest.ExecStdout(b), + ) + + if env.HasFailed() { + return + } + + assertBankBalanceOutput(t, b.String(), "1200btoken") + assert.NotContains(t, b.String(), "atoken") + + b.Reset() + env.Exec("query bank balances fail with non-existent account name", + step.NewSteps(step.New( + step.Exec( + envtest.IgniteApp, + "node", + "query", + "bank", + "balances", + "nonexistentaccount", + "--node", node, + "--keyring-dir", accKeyringDir, + "--address-prefix", testPrefix, + ), + )), + envtest.ExecShouldError(), + ) + + if env.HasFailed() { + return + } + + env.Exec("query bank balances fail with non-existent address", + step.NewSteps(step.New( + step.Exec( + envtest.IgniteApp, + "node", + "query", + "bank", + "balances", + testPrefix+"1gspvt8qsk8cryrsxnqt452cjczjm5ejdgla24e", + "--node", node, + "--keyring-dir", accKeyringDir, + "--address-prefix", testPrefix, + ), + )), + envtest.ExecShouldError(), + ) + + if env.HasFailed() { + return + } + + env.Exec("query bank balances should fail with a wrong prefix", + step.NewSteps(step.New( + step.Exec( + envtest.IgniteApp, + "node", + "query", + "bank", + "balances", + "alice", + "--node", node, + "--keyring-dir", accKeyringDir, + // the default prefix will fail this test, which is on purpose. + ), + )), + envtest.ExecShouldError(), + ) + }() + + env.Must(app.Serve("should serve with Stargate version", envtest.ExecCtx(ctx))) + + require.NoError(t, isBackendAliveErr, "app cannot get online in time") +} diff --git a/integration/node/cmd_query_tx_test.go b/integration/node/cmd_query_tx_test.go new file mode 100644 index 0000000000..a83a8c7478 --- /dev/null +++ b/integration/node/cmd_query_tx_test.go @@ -0,0 +1,97 @@ +package node_test + +import ( + "bytes" + "context" + "regexp" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/ignite/cli/ignite/pkg/cmdrunner/step" + "github.com/ignite/cli/ignite/pkg/cosmosclient" + "github.com/ignite/cli/ignite/pkg/randstr" + "github.com/ignite/cli/ignite/pkg/xurl" + envtest "github.com/ignite/cli/integration" +) + +func TestNodeQueryTx(t *testing.T) { + var ( + appname = randstr.Runes(10) + // alice = "alice" + // bob = "bob" + + env = envtest.New(t) + app = env.Scaffold(appname) + home = env.AppHome(appname) + servers = app.RandomizeServerPorts() + + // accKeyringDir = t.TempDir() + ) + + node, err := xurl.HTTP(servers.RPC) + require.NoError(t, err) + + var ( + ctx, cancel = context.WithTimeout(env.Ctx(), envtest.ServeTimeout) + isBackendAliveErr error + ) + + go func() { + defer cancel() + + if isBackendAliveErr = env.IsAppServed(ctx, servers); isBackendAliveErr != nil { + return + } + client, err := cosmosclient.New(context.Background(), + cosmosclient.WithAddressPrefix(testPrefix), + cosmosclient.WithNodeAddress(node), + ) + require.NoError(t, err) + require.NoError(t, client.WaitForNextBlock(context.Background())) + + b := &bytes.Buffer{} + env.Exec("send 100token from alice to bob", + step.NewSteps(step.New( + step.Exec( + envtest.IgniteApp, + "node", + "tx", + "bank", + "send", + "alice", + "bob", + "100token", + "--node", node, + "--keyring-dir", home, + "--broadcast-mode", "sync", + ), + step.Stdout(b), + )), + ) + require.False(t, env.HasFailed(), b.String()) + + // Parse tx hash from output + res := regexp.MustCompile(`\(hash = (\w+)\)`).FindAllStringSubmatch(b.String(), -1) + require.Len(t, res[0], 2, "can't extract hash from command output") + hash := res[0][1] + require.NoError(t, client.WaitForNextBlock(context.Background())) + + env.Must(env.Exec("query tx", + step.NewSteps(step.New( + step.Exec( + envtest.IgniteApp, + "node", + "query", + "tx", + hash, + "--node", node, + ), + )), + )) + }() + + env.Must(app.Serve("should serve with Stargate version", envtest.ExecCtx(ctx))) + + require.NoError(t, isBackendAliveErr, "app cannot get online in time") +} diff --git a/integration/node/cmd_tx_bank_send_test.go b/integration/node/cmd_tx_bank_send_test.go new file mode 100644 index 0000000000..c98436807a --- /dev/null +++ b/integration/node/cmd_tx_bank_send_test.go @@ -0,0 +1,327 @@ +package node_test + +import ( + "bytes" + "context" + "fmt" + "path/filepath" + "testing" + + "github.com/cosmos/cosmos-sdk/crypto/keyring" + "github.com/stretchr/testify/require" + + "github.com/ignite/cli/ignite/chainconfig" + "github.com/ignite/cli/ignite/pkg/cmdrunner/step" + "github.com/ignite/cli/ignite/pkg/cosmosaccount" + "github.com/ignite/cli/ignite/pkg/cosmosclient" + "github.com/ignite/cli/ignite/pkg/randstr" + "github.com/ignite/cli/ignite/pkg/xurl" + envtest "github.com/ignite/cli/integration" +) + +func TestNodeTxBankSend(t *testing.T) { + var ( + appname = randstr.Runes(10) + alice = "alice" + bob = "bob" + + env = envtest.New(t) + app = env.Scaffold(appname, "--address-prefix", testPrefix) + home = env.AppHome(appname) + servers = app.RandomizeServerPorts() + + accKeyringDir = t.TempDir() + ) + + node, err := xurl.HTTP(servers.RPC) + require.NoError(t, err) + + ca, err := cosmosaccount.New( + cosmosaccount.WithHome(filepath.Join(home, keyringTestDirName)), + cosmosaccount.WithKeyringBackend(cosmosaccount.KeyringTest), + ) + require.NoError(t, err) + + aliceAccount, aliceMnemonic, err := ca.Create(alice) + require.NoError(t, err) + + bobAccount, bobMnemonic, err := ca.Create(bob) + require.NoError(t, err) + + app.EditConfig(func(conf *chainconfig.Config) { + conf.Accounts = []chainconfig.Account{ + { + Name: alice, + Mnemonic: aliceMnemonic, + Coins: []string{"2000token", "100000000stake"}, + }, + { + Name: bob, + Mnemonic: bobMnemonic, + Coins: []string{"10000token", "100000000stake"}, + }, + } + conf.Faucet = chainconfig.Faucet{} + conf.Init.KeyringBackend = keyring.BackendTest + }) + env.Must(env.Exec("import alice", + step.NewSteps(step.New( + step.Exec( + envtest.IgniteApp, + "account", + "import", + "alice", + "--keyring-dir", accKeyringDir, + "--non-interactive", + "--secret", aliceMnemonic, + ), + )), + )) + + env.Must(env.Exec("import bob", + step.NewSteps(step.New( + step.Exec( + envtest.IgniteApp, + "account", + "import", + "bob", + "--keyring-dir", accKeyringDir, + "--non-interactive", + "--secret", bobMnemonic, + ), + )), + )) + + var ( + ctx, cancel = context.WithTimeout(env.Ctx(), envtest.ServeTimeout) + isBackendAliveErr error + ) + + go func() { + defer cancel() + + if isBackendAliveErr = env.IsAppServed(ctx, servers); isBackendAliveErr != nil { + return + } + client, err := cosmosclient.New(context.Background(), + cosmosclient.WithAddressPrefix(testPrefix), + cosmosclient.WithNodeAddress(node), + ) + require.NoError(t, err) + require.NoError(t, client.WaitForNextBlock(context.Background())) + + env.Exec("send 100token from alice to bob", + step.NewSteps(step.New( + step.Exec( + envtest.IgniteApp, + "node", + "tx", + "bank", + "send", + "alice", + "bob", + "100token", + "--node", node, + "--keyring-dir", accKeyringDir, + "--address-prefix", testPrefix, + ), + )), + ) + + if env.HasFailed() { + return + } + + bobAddr, err := bobAccount.Address(testPrefix) + require.NoError(t, err) + aliceAddr, err := aliceAccount.Address(testPrefix) + require.NoError(t, err) + + env.Exec("send 2stake from bob to alice using addresses", + step.NewSteps(step.New( + step.Exec( + envtest.IgniteApp, + "node", + "tx", + "bank", + "send", + bobAddr, + aliceAddr, + "2stake", + "--node", node, + "--keyring-dir", accKeyringDir, + "--address-prefix", testPrefix, + ), + )), + ) + + if env.HasFailed() { + return + } + + env.Exec("send 5token from alice to bob using a combination of address and account", + step.NewSteps(step.New( + step.Exec( + envtest.IgniteApp, + "node", + "tx", + "bank", + "send", + "alice", + bobAddr, + "5token", + "--node", node, + "--keyring-dir", accKeyringDir, + "--address-prefix", testPrefix, + ), + )), + ) + + if env.HasFailed() { + return + } + + b := &bytes.Buffer{} + env.Exec("query bank balances for alice", + step.NewSteps(step.New( + step.Exec( + envtest.IgniteApp, + "node", + "query", + "bank", + "balances", + "alice", + "--node", node, + "--keyring-dir", accKeyringDir, + "--address-prefix", testPrefix, + ), + )), + envtest.ExecStdout(b), + ) + + assertBankBalanceOutput(t, b.String(), "2stake,1895token") + + if env.HasFailed() { + return + } + + b.Reset() + env.Exec("query bank balances for bob", + step.NewSteps(step.New( + step.Exec( + envtest.IgniteApp, + "node", + "query", + "bank", + "balances", + "bob", + "--node", node, + "--keyring-dir", accKeyringDir, + "--address-prefix", testPrefix, + ), + )), + envtest.ExecStdout(b), + ) + + assertBankBalanceOutput(t, b.String(), "99999998stake,10105token") + + // check generated tx + b.Reset() + env.Exec("generate unsigned tx", + step.NewSteps(step.New( + step.Exec( + envtest.IgniteApp, + "node", + "tx", + "bank", + "send", + "alice", + "bob", + "5token", + "--node", node, + "--keyring-dir", accKeyringDir, + "--address-prefix", testPrefix, + "--generate-only", + ), + )), + envtest.ExecStdout(b), + ) + + require.Contains(t, b.String(), + fmt.Sprintf(`"body":{"messages":[{"@type":"/cosmos.bank.v1beta1.MsgSend","from_address":"%s","to_address":"%s","amount":[{"denom":"token","amount":"5"}]}]`, + aliceAddr, bobAddr), + ) + require.Contains(t, b.String(), `"signatures":[]`) + + // test with gas + env.Exec("send 100token from bob to alice with gas flags", + step.NewSteps(step.New( + step.Exec( + envtest.IgniteApp, + "node", + "tx", + "bank", + "send", + "bob", + "alice", + "100token", + "--node", node, + "--keyring-dir", accKeyringDir, + "--address-prefix", testPrefix, + "--gas", "200000", + "--gas-prices", "1stake", + ), + )), + ) + + // not enough minerals + env.Exec("send 100token from alice to bob with too little gas", + step.NewSteps(step.New( + step.Exec( + envtest.IgniteApp, + "node", + "tx", + "bank", + "send", + "alice", + "bob", + "100token", + "--node", node, + "--keyring-dir", accKeyringDir, + "--address-prefix", testPrefix, + "--gas", "2", + "--gas-prices", "1stake", + ), + )), + envtest.ExecShouldError(), + ) + + b.Reset() + env.Exec("generate bank send tx with gas flags", + step.NewSteps(step.New( + step.Exec( + envtest.IgniteApp, + "node", + "tx", + "bank", + "send", + "alice", + "bob", + "100token", + "--node", node, + "--keyring-dir", accKeyringDir, + "--address-prefix", testPrefix, + "--gas", "2000034", + "--gas-prices", "0.089stake", + "--generate-only", + ), + )), + envtest.ExecStdout(b), + ) + require.Contains(t, b.String(), `"fee":{"amount":[{"denom":"stake","amount":"178004"}],"gas_limit":"2000034"`) + }() + + env.Must(app.Serve("should serve with Stargate version", envtest.ExecCtx(ctx))) + + require.NoError(t, isBackendAliveErr, "app cannot get online in time") +} diff --git a/integration/other_components/cmd_message_test.go b/integration/other_components/cmd_message_test.go index ffd41c14f8..bba8ae0615 100644 --- a/integration/other_components/cmd_message_test.go +++ b/integration/other_components/cmd_message_test.go @@ -1,10 +1,8 @@ //go:build !relayer -// +build !relayer package other_components_test import ( - "path/filepath" "testing" "github.com/ignite/cli/ignite/pkg/cmdrunner/step" @@ -13,8 +11,8 @@ import ( func TestGenerateAnAppWithMessage(t *testing.T) { var ( - env = envtest.New(t) - path = env.Scaffold("github.com/test/blog") + env = envtest.New(t) + app = env.Scaffold("github.com/test/blog") ) env.Must(env.Exec("create a message", @@ -31,7 +29,7 @@ func TestGenerateAnAppWithMessage(t *testing.T) { "-r", "foo,bar:int,foobar:bool", ), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), )) @@ -52,14 +50,14 @@ func TestGenerateAnAppWithMessage(t *testing.T) { "blog", "--no-simulation", ), - step.Workdir(filepath.Dir(path)), + step.Workdir(app.SourcePath()), )), )) env.Must(env.Exec("should prevent creating an existing message", step.NewSteps(step.New( step.Exec(envtest.IgniteApp, "s", "message", "--yes", "do-foo", "bar"), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), envtest.ExecShouldError(), )) @@ -67,7 +65,7 @@ func TestGenerateAnAppWithMessage(t *testing.T) { env.Must(env.Exec("create a message with a custom signer name", step.NewSteps(step.New( step.Exec(envtest.IgniteApp, "s", "message", "--yes", "do-bar", "bar", "--signer", "bar-doer"), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), )) @@ -91,21 +89,21 @@ func TestGenerateAnAppWithMessage(t *testing.T) { "textCoins:array.coin", "textCoinsAlias:coins", ), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), )) env.Must(env.Exec("create a message with the custom field type", step.NewSteps(step.New( step.Exec(envtest.IgniteApp, "s", "message", "--yes", "foo-baz", "customField:CustomType"), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), )) env.Must(env.Exec("create a module", step.NewSteps(step.New( step.Exec(envtest.IgniteApp, "s", "module", "--yes", "foo", "--require-registration"), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), )) @@ -126,9 +124,9 @@ func TestGenerateAnAppWithMessage(t *testing.T) { "--response", "foo,bar:int,foobar:bool", ), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), )) - env.EnsureAppIsSteady(path) + app.EnsureSteady() } diff --git a/integration/other_components/cmd_query_test.go b/integration/other_components/cmd_query_test.go index bfe1f7273d..94ec3dc46d 100644 --- a/integration/other_components/cmd_query_test.go +++ b/integration/other_components/cmd_query_test.go @@ -1,10 +1,8 @@ //go:build !relayer -// +build !relayer package other_components_test import ( - "path/filepath" "testing" "github.com/ignite/cli/ignite/pkg/cmdrunner/step" @@ -13,8 +11,8 @@ import ( func TestGenerateAnAppWithQuery(t *testing.T) { var ( - env = envtest.New(t) - path = env.Scaffold("github.com/test/blog") + env = envtest.New(t) + app = env.Scaffold("github.com/test/blog") ) env.Must(env.Exec("create a query", @@ -31,7 +29,7 @@ func TestGenerateAnAppWithQuery(t *testing.T) { "-r", "foo,bar:int,foobar:bool", ), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), )) @@ -51,7 +49,7 @@ func TestGenerateAnAppWithQuery(t *testing.T) { "--path", "./blog", ), - step.Workdir(filepath.Dir(path)), + step.Workdir(app.SourcePath()), )), )) @@ -70,7 +68,7 @@ func TestGenerateAnAppWithQuery(t *testing.T) { "foo,bar:int,foobar:bool", "--paginated", ), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), )) @@ -94,21 +92,21 @@ func TestGenerateAnAppWithQuery(t *testing.T) { "textCoins:array.coin", "textCoinsAlias:coins", ), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), )) env.Must(env.Exec("create a query with the custom field type as a response", step.NewSteps(step.New( step.Exec(envtest.IgniteApp, "s", "query", "--yes", "foobaz", "-r", "bar:CustomType"), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), )) env.Must(env.Exec("should prevent using custom type in request params", step.NewSteps(step.New( step.Exec(envtest.IgniteApp, "s", "query", "--yes", "bur", "bar:CustomType"), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), envtest.ExecShouldError(), )) @@ -116,14 +114,14 @@ func TestGenerateAnAppWithQuery(t *testing.T) { env.Must(env.Exec("create an empty query", step.NewSteps(step.New( step.Exec(envtest.IgniteApp, "s", "query", "--yes", "foobar"), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), )) env.Must(env.Exec("should prevent creating an existing query", step.NewSteps(step.New( step.Exec(envtest.IgniteApp, "s", "query", "--yes", "foo", "bar"), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), envtest.ExecShouldError(), )) @@ -131,7 +129,7 @@ func TestGenerateAnAppWithQuery(t *testing.T) { env.Must(env.Exec("create a module", step.NewSteps(step.New( step.Exec(envtest.IgniteApp, "s", "module", "--yes", "foo", "--require-registration"), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), )) @@ -151,9 +149,9 @@ func TestGenerateAnAppWithQuery(t *testing.T) { "--response", "foo,bar:int,foobar:bool", ), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), )) - env.EnsureAppIsSteady(path) + app.EnsureSteady() } diff --git a/integration/simulation/simapp_test.go b/integration/simulation/simapp_test.go index df219d91ba..1718cbe59f 100644 --- a/integration/simulation/simapp_test.go +++ b/integration/simulation/simapp_test.go @@ -1,5 +1,4 @@ //go:build !relayer -// +build !relayer package simulation_test @@ -12,42 +11,42 @@ import ( func TestGenerateAnAppAndSimulate(t *testing.T) { var ( - env = envtest.New(t) - path = env.Scaffold("github.com/test/blog") + env = envtest.New(t) + app = env.Scaffold("github.com/test/blog") ) env.Must(env.Exec("create a list", step.NewSteps(step.New( step.Exec(envtest.IgniteApp, "s", "list", "--yes", "foo", "foobar"), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), )) env.Must(env.Exec("create an singleton type", step.NewSteps(step.New( step.Exec(envtest.IgniteApp, "s", "single", "--yes", "baz", "foobar"), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), )) env.Must(env.Exec("create an singleton type", step.NewSteps(step.New( step.Exec(envtest.IgniteApp, "s", "list", "--yes", "noSimapp", "foobar", "--no-simulation"), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), )) env.Must(env.Exec("create a message", step.NewSteps(step.New( step.Exec(envtest.IgniteApp, "s", "message", "--yes", "msgFoo", "foobar"), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), )) env.Must(env.Exec("scaffold a new module", step.NewSteps(step.New( step.Exec(envtest.IgniteApp, "s", "module", "--yes", "new_module"), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), )) @@ -63,9 +62,9 @@ func TestGenerateAnAppAndSimulate(t *testing.T) { "--module", "new_module", ), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), )) - env.Simulate(path, 100, 50) + app.Simulate(100, 50) } diff --git a/integration/single/cmd_singleton_test.go b/integration/single/cmd_singleton_test.go index e6ff2659d7..e412083e4e 100644 --- a/integration/single/cmd_singleton_test.go +++ b/integration/single/cmd_singleton_test.go @@ -1,10 +1,8 @@ //go:build !relayer -// +build !relayer package single_test import ( - "path/filepath" "testing" "github.com/ignite/cli/ignite/pkg/cmdrunner/step" @@ -13,56 +11,56 @@ import ( func TestCreateSingletonWithStargate(t *testing.T) { var ( - env = envtest.New(t) - path = env.Scaffold("github.com/test/blog") + env = envtest.New(t) + app = env.Scaffold("github.com/test/blog") ) env.Must(env.Exec("create an singleton type", step.NewSteps(step.New( step.Exec(envtest.IgniteApp, "s", "single", "--yes", "user", "email"), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), )) env.Must(env.Exec("create an singleton type with custom path", step.NewSteps(step.New( - step.Exec(envtest.IgniteApp, "s", "single", "--yes", "appPath", "email", "--path", path), - step.Workdir(filepath.Dir(path)), + step.Exec(envtest.IgniteApp, "s", "single", "--yes", "appPath", "email", "--path", app.SourcePath()), + step.Workdir(app.SourcePath()), )), )) env.Must(env.Exec("create an singleton type with no message", step.NewSteps(step.New( step.Exec(envtest.IgniteApp, "s", "single", "--yes", "no-message", "email", "--no-message"), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), )) env.Must(env.Exec("create a module", step.NewSteps(step.New( step.Exec(envtest.IgniteApp, "s", "module", "--yes", "example", "--require-registration"), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), )) env.Must(env.Exec("create another type", step.NewSteps(step.New( step.Exec(envtest.IgniteApp, "s", "list", "--yes", "user", "email", "--module", "example"), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), )) env.Must(env.Exec("create another type with a custom field type", step.NewSteps(step.New( step.Exec(envtest.IgniteApp, "s", "list", "--yes", "user-detail", "user:User", "--module", "example"), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), )) env.Must(env.Exec("should prevent creating an singleton type with a typename that already exist", step.NewSteps(step.New( step.Exec(envtest.IgniteApp, "s", "single", "--yes", "user", "email", "--module", "example"), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), envtest.ExecShouldError(), )) @@ -70,9 +68,9 @@ func TestCreateSingletonWithStargate(t *testing.T) { env.Must(env.Exec("create an singleton type in a custom module", step.NewSteps(step.New( step.Exec(envtest.IgniteApp, "s", "single", "--yes", "singleuser", "email", "--module", "example"), - step.Workdir(path), + step.Workdir(app.SourcePath()), )), )) - env.EnsureAppIsSteady(path) + app.EnsureSteady() } diff --git a/readme.md b/readme.md index 438888aac0..a97162f598 100644 --- a/readme.md +++ b/readme.md @@ -34,14 +34,16 @@ For questions and support, join the official [Ignite Discord](https://discord.gg Blockchains created with Ignite CLI use the [Cosmos SDK](https://github.com/cosmos/cosmos-sdk/) framework. To ensure the best possible experience, use the version of Ignite CLI that corresponds to the version of Cosmos SDK that your blockchain is built with. Unless noted otherwise, a row refers to a minor version and all associated patch versions. -| Ignite CLI | Cosmos SDK | IBC | Notes | -| -------- | ---------- | -------------------- | ------------------------------------------------ | -| v0.21.1 | v0.45.4 | v2.0.3 | Supports Cosmos SDK v0.46.0-alpha1 and above | -| v0.21.0 | v0.45.4 | v2.0.3 | | -| v0.20.0 | v0.45.3 | v2.0.3 | | -| v0.19 | v0.44 | v1.2.2 | | -| v0.18 | v0.44 | v1.2.2 | `ignite chain serve` works with v0.44.x chains | -| v0.17 | v0.42 | Same with Cosmos SDK | | +| Ignite CLI | Cosmos SDK | IBC | Notes | +|-------------|---------------|-------------------------|-----------------------------------------------| + | v0.24.0 | v0.46.0 | v5.0.0 | | +| v0.23.0 | v0.45.5 | v3.0.1 | | +| v0.21.1 | v0.45.4 | v2.0.3 | Supports Cosmos SDK v0.46.0-alpha1 and above | +| v0.21.0 | v0.45.4 | v2.0.3 | | +| v0.20.0 | v0.45.3 | v2.0.3 | | +| v0.19 | v0.44 | v1.2.2 | | +| v0.18 | v0.44 | v1.2.2 | `ignite chain serve` works with v0.44.x chains | +| v0.17 | v0.42 | Same with Cosmos SDK | | To upgrade your blockchain to the newer version of Cosmos SDK, see the [Migration guide](https://docs.ignite.com/migration/). diff --git a/scripts/data/gen-nodetime/package-lock.json b/scripts/data/gen-nodetime/package-lock.json index c845c9e4cf..78e62e9c45 100644 --- a/scripts/data/gen-nodetime/package-lock.json +++ b/scripts/data/gen-nodetime/package-lock.json @@ -8,17 +8,18 @@ "name": "nodetime", "version": "1.0.0", "dependencies": { - "@confio/relayer": "0.2.0", - "@cosmjs/crypto": "0.25.0", - "@cosmjs/launchpad": "0.25.0", - "@cosmjs/proto-signing": "0.25.0", - "@cosmjs/stargate": "0.25.0", - "@cosmjs/tendermint-rpc": "0.25.0", + "@confio/relayer": "0.5.1", + "@cosmjs/crypto": "0.28.11", + "@cosmjs/encoding": "0.28.11", + "@cosmjs/proto-signing": "0.28.11", + "@cosmjs/stargate": "0.28.11", + "@cosmjs/tendermint-rpc": "0.28.11", "js-yaml": "^4.0.0", "json-rpc-2.0": "^0.2.16", "long": "^4.0.0", "pkg": "github:vercel/pkg#main", "protobufjs": "^6.10.2", + "sinon": "^9.2.4", "swagger-combine": "^1.3.0", "swagger-typescript-api": "^5.1.7", "ts-proto": "^1.68.0" @@ -32,33 +33,14 @@ } }, "node_modules/@apidevtools/json-schema-ref-parser": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.0.7.tgz", - "integrity": "sha512-QdwOGF1+eeyFh+17v2Tz626WX0nucd1iKOm6JUTUvCZdbolblCOOQCxGrQPY0f7jEhn36PiAWqZnsC2r5vmUWg==", + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.0.9.tgz", + "integrity": "sha512-GBD2Le9w2+lVFoc4vswGI/TjkNIZSVp7+9xPf+X3uidBfWnAeUWmquteSyt0+VCrhNMWj/FTABISQrD3Z/YA+w==", "dependencies": { "@jsdevtools/ono": "^7.1.3", + "@types/json-schema": "^7.0.6", "call-me-maybe": "^1.0.1", - "js-yaml": "^3.13.1" - } - }, - "node_modules/@apidevtools/json-schema-ref-parser/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/@apidevtools/json-schema-ref-parser/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "js-yaml": "^4.1.0" } }, "node_modules/@apidevtools/openapi-schemas": { @@ -75,47 +57,19 @@ "integrity": "sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg==" }, "node_modules/@apidevtools/swagger-parser": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/@apidevtools/swagger-parser/-/swagger-parser-9.0.1.tgz", - "integrity": "sha512-Irqybg4dQrcHhZcxJc/UM4vO7Ksoj1Id5e+K94XUOzllqX1n47HEA50EKiXTCQbykxuJ4cYGIivjx/MRSTC5OA==", - "dependencies": { - "@apidevtools/json-schema-ref-parser": "^8.0.0", - "@apidevtools/openapi-schemas": "^2.0.2", - "@apidevtools/swagger-methods": "^3.0.0", - "@jsdevtools/ono": "^7.1.0", - "call-me-maybe": "^1.0.1", - "openapi-types": "^1.3.5", - "z-schema": "^4.2.2" - } - }, - "node_modules/@apidevtools/swagger-parser/node_modules/@apidevtools/json-schema-ref-parser": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-8.0.0.tgz", - "integrity": "sha512-n4YBtwQhdpLto1BaUCyAeflizmIbaloGShsPyRtFf5qdFJxfssj+GgLavczgKJFa3Bq+3St2CKcpRJdjtB4EBw==", + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/@apidevtools/swagger-parser/-/swagger-parser-10.0.3.tgz", + "integrity": "sha512-sNiLY51vZOmSPFZA5TF35KZ2HbgYklQnTSDnkghamzLb3EkNtcQnrBQEj5AOCxHpTtXpqMCRM1CrmV2rG6nw4g==", "dependencies": { - "@jsdevtools/ono": "^7.1.0", + "@apidevtools/json-schema-ref-parser": "^9.0.6", + "@apidevtools/openapi-schemas": "^2.0.4", + "@apidevtools/swagger-methods": "^3.0.2", + "@jsdevtools/ono": "^7.1.3", "call-me-maybe": "^1.0.1", - "js-yaml": "^3.13.1" - } - }, - "node_modules/@apidevtools/swagger-parser/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/@apidevtools/swagger-parser/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "z-schema": "^5.0.1" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "peerDependencies": { + "openapi-types": ">=7" } }, "node_modules/@babel/helper-validator-identifier": { @@ -149,41 +103,48 @@ "node": ">=6.9.0" } }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "engines": { + "node": ">=0.1.90" + } + }, "node_modules/@confio/ics23": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/@confio/ics23/-/ics23-0.6.5.tgz", - "integrity": "sha512-1GdPMsaP/l8JSF4P4HWFLBhdcxHcJT8lS0nknBYNSZ1XrJOsJKUy6EkOwd9Pa1qJkXzY2gyNv7MdHR+AIwSTAg==", + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@confio/ics23/-/ics23-0.6.8.tgz", + "integrity": "sha512-wB6uo+3A50m0sW/EWcU64xpV/8wShZ6bMTa7pF8eYsTrSkQA7oLUIJcs/wb8g4y2Oyq701BaGiO6n/ak5WXO1w==", "dependencies": { - "js-sha512": "^0.8.0", - "protobufjs": "^6.8.8", - "ripemd160": "^2.0.2", - "sha.js": "^2.4.11" + "@noble/hashes": "^1.0.0", + "protobufjs": "^6.8.8" } }, "node_modules/@confio/relayer": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@confio/relayer/-/relayer-0.2.0.tgz", - "integrity": "sha512-MbjTwerv+5zixsKU4WkGlq7CcYfMudO9O9/WD99Cvpp387Pum2ualAZ4Li7iBRMqzfnqqoZaPJ3Ybya9j2La7Q==", - "dependencies": { - "@cosmjs/cosmwasm-stargate": "0.25.5", - "@cosmjs/crypto": "0.25.5", - "@cosmjs/encoding": "0.25.5", - "@cosmjs/faucet-client": "0.25.5", - "@cosmjs/math": "0.25.5", - "@cosmjs/proto-signing": "0.25.5", - "@cosmjs/stargate": "0.25.5", - "@cosmjs/stream": "0.25.5", - "@cosmjs/tendermint-rpc": "0.25.5", - "@cosmjs/utils": "0.25.5", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@confio/relayer/-/relayer-0.5.1.tgz", + "integrity": "sha512-SvUYFze9Mgvj/pjAfhPQXtGw0jd2hE8m1LlRvX/iw2ndkWyHcp2WsgqJosCqDZcuBUrgW0KgqgvwPUv3bKJqbQ==", + "dependencies": { + "@cosmjs/cosmwasm-stargate": "^0.28.9", + "@cosmjs/crypto": "^0.28.9", + "@cosmjs/encoding": "^0.28.9", + "@cosmjs/faucet-client": "^0.28.9", + "@cosmjs/math": "^0.28.9", + "@cosmjs/proto-signing": "^0.28.9", + "@cosmjs/stargate": "^0.28.9", + "@cosmjs/stream": "^0.28.9", + "@cosmjs/tendermint-rpc": "^0.28.9", + "@cosmjs/utils": "^0.28.9", "ajv": "7.1.1", - "axios": "0.21.1", + "axios": "0.21.4", "commander": "7.1.0", + "cosmjs-types": "^0.4.0", "fast-safe-stringify": "2.0.4", "js-yaml": "4.0.0", "lodash": "4.17.21", "prom-client": "13.1.0", - "protobufjs": "6.10.2", - "table": "6.0.7", + "protobufjs": "^6.10.3", + "table": "^6.7.1", "triple-beam": "1.3.0", "winston": "3.3.3" }, @@ -195,66 +156,6 @@ "node": ">=12" } }, - "node_modules/@confio/relayer/node_modules/@cosmjs/crypto": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@cosmjs/crypto/-/crypto-0.25.5.tgz", - "integrity": "sha512-i0Nfbk4JXAwyKNGPFu0o1xV6IJUbYmmveySytbU/yweybcZppxoczjSQ1sGrUaLVLvgfcpfwZte3jKqDR67+dg==", - "dependencies": { - "@cosmjs/encoding": "^0.25.5", - "@cosmjs/math": "^0.25.5", - "@cosmjs/utils": "^0.25.5", - "bip39": "^3.0.2", - "bn.js": "^4.11.8", - "elliptic": "^6.5.3", - "js-sha3": "^0.8.0", - "libsodium-wrappers": "^0.7.6", - "ripemd160": "^2.0.2", - "sha.js": "^2.4.11" - } - }, - "node_modules/@confio/relayer/node_modules/@cosmjs/proto-signing": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@cosmjs/proto-signing/-/proto-signing-0.25.5.tgz", - "integrity": "sha512-YWVp+dGHt7v6ZKjOs8CI9xkpOV49eweHbYMv/vCVYF4cEh0kWwy2WzbWIkUH9zwwUqCxigVOTBYUCfbsjEbfug==", - "dependencies": { - "@cosmjs/amino": "^0.25.5", - "long": "^4.0.0", - "protobufjs": "~6.10.2" - } - }, - "node_modules/@confio/relayer/node_modules/@cosmjs/stargate": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@cosmjs/stargate/-/stargate-0.25.5.tgz", - "integrity": "sha512-cOZ+fOC16YT7W2vjBnnk9oJfuIlB02KdK6dn6aigMd4mx+7DS2jvNslpQrfKmtrwB9AVsgc6tklBkYwG5qAuKQ==", - "dependencies": { - "@confio/ics23": "^0.6.3", - "@cosmjs/amino": "^0.25.5", - "@cosmjs/encoding": "^0.25.5", - "@cosmjs/math": "^0.25.5", - "@cosmjs/proto-signing": "^0.25.5", - "@cosmjs/stream": "^0.25.5", - "@cosmjs/tendermint-rpc": "^0.25.5", - "@cosmjs/utils": "^0.25.5", - "long": "^4.0.0", - "protobufjs": "~6.10.2" - } - }, - "node_modules/@confio/relayer/node_modules/@cosmjs/tendermint-rpc": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@cosmjs/tendermint-rpc/-/tendermint-rpc-0.25.5.tgz", - "integrity": "sha512-WlUCFVdhbwA3IDA1C858S8WOtLseZLXKTdj5fz1sTKSBmtrig4l1ZMKHHlZRprvmjSpkpbjgSQU+RjjvBd75BA==", - "dependencies": { - "@cosmjs/crypto": "^0.25.5", - "@cosmjs/encoding": "^0.25.5", - "@cosmjs/json-rpc": "^0.25.5", - "@cosmjs/math": "^0.25.5", - "@cosmjs/socket": "^0.25.5", - "@cosmjs/stream": "^0.25.5", - "axios": "^0.21.1", - "readonly-date": "^1.0.0", - "xstream": "^11.14.0" - } - }, "node_modules/@confio/relayer/node_modules/ajv": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/ajv/-/ajv-7.1.1.tgz", @@ -283,186 +184,58 @@ "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.4.tgz", "integrity": "sha512-mNlGUdKOeGNleyrmgbKYtbnCr9KZkZXU7eM89JRo8vY10f7Ul1Fbj07hUBW3N4fC0xM+fmfFfa2zM7mIizhpNQ==" }, - "node_modules/@confio/relayer/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, "node_modules/@cosmjs/amino": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@cosmjs/amino/-/amino-0.25.5.tgz", - "integrity": "sha512-q9tU2b9hJ3S/KxYCLSyiZCfkaidbSPBr2sJ5HPLxz48y5O4k9sYM7bPa0zioeePaIBnby3AOgyjucVxlbzUlYg==", - "dependencies": { - "@cosmjs/crypto": "^0.25.5", - "@cosmjs/encoding": "^0.25.5", - "@cosmjs/math": "^0.25.5", - "@cosmjs/utils": "^0.25.5" - } - }, - "node_modules/@cosmjs/amino/node_modules/@cosmjs/crypto": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@cosmjs/crypto/-/crypto-0.25.5.tgz", - "integrity": "sha512-i0Nfbk4JXAwyKNGPFu0o1xV6IJUbYmmveySytbU/yweybcZppxoczjSQ1sGrUaLVLvgfcpfwZte3jKqDR67+dg==", - "dependencies": { - "@cosmjs/encoding": "^0.25.5", - "@cosmjs/math": "^0.25.5", - "@cosmjs/utils": "^0.25.5", - "bip39": "^3.0.2", - "bn.js": "^4.11.8", - "elliptic": "^6.5.3", - "js-sha3": "^0.8.0", - "libsodium-wrappers": "^0.7.6", - "ripemd160": "^2.0.2", - "sha.js": "^2.4.11" - } - }, - "node_modules/@cosmjs/cosmwasm-launchpad": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@cosmjs/cosmwasm-launchpad/-/cosmwasm-launchpad-0.25.5.tgz", - "integrity": "sha512-9/Z8m9rfovtgchN1thcdVBEBXCrh5clVNgpVp1rpbkUSSGA7T5tCR8H1qX0+Yd3HLRh212O5EnCfzzXjNxR21A==", - "deprecated": "This package is unmaintained and will not be updated after CosmJS 0.25.See https://github.com/cosmos/cosmjs/issues/786", - "dependencies": { - "@cosmjs/crypto": "^0.25.5", - "@cosmjs/encoding": "^0.25.5", - "@cosmjs/launchpad": "^0.25.5", - "@cosmjs/math": "^0.25.5", - "@cosmjs/utils": "^0.25.5", - "pako": "^2.0.2" - } - }, - "node_modules/@cosmjs/cosmwasm-launchpad/node_modules/@cosmjs/crypto": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@cosmjs/crypto/-/crypto-0.25.5.tgz", - "integrity": "sha512-i0Nfbk4JXAwyKNGPFu0o1xV6IJUbYmmveySytbU/yweybcZppxoczjSQ1sGrUaLVLvgfcpfwZte3jKqDR67+dg==", + "version": "0.28.11", + "resolved": "https://registry.npmjs.org/@cosmjs/amino/-/amino-0.28.11.tgz", + "integrity": "sha512-WJkQQq8gbk5doJJ/3Gcax26I+VC4HdbbSlNdyT5hc6T+U2Jmyry9RLSE+wEZyFMgEabhr43SbIxf64gWZeR8YA==", "dependencies": { - "@cosmjs/encoding": "^0.25.5", - "@cosmjs/math": "^0.25.5", - "@cosmjs/utils": "^0.25.5", - "bip39": "^3.0.2", - "bn.js": "^4.11.8", - "elliptic": "^6.5.3", - "js-sha3": "^0.8.0", - "libsodium-wrappers": "^0.7.6", - "ripemd160": "^2.0.2", - "sha.js": "^2.4.11" - } - }, - "node_modules/@cosmjs/cosmwasm-launchpad/node_modules/@cosmjs/launchpad": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@cosmjs/launchpad/-/launchpad-0.25.5.tgz", - "integrity": "sha512-7zsFWQHLAiOUBXV/QWvffI/5Ssma67lEO3V01DZ8CtfnWiO4bCSbnU2sslSAH11RkrPdNfRBM7WOBczMMigIzw==", - "dependencies": { - "@cosmjs/amino": "^0.25.5", - "@cosmjs/crypto": "^0.25.5", - "@cosmjs/encoding": "^0.25.5", - "@cosmjs/math": "^0.25.5", - "@cosmjs/utils": "^0.25.5", - "axios": "^0.21.1", - "fast-deep-equal": "^3.1.3" + "@cosmjs/crypto": "0.28.11", + "@cosmjs/encoding": "0.28.11", + "@cosmjs/math": "0.28.11", + "@cosmjs/utils": "0.28.11" } }, "node_modules/@cosmjs/cosmwasm-stargate": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@cosmjs/cosmwasm-stargate/-/cosmwasm-stargate-0.25.5.tgz", - "integrity": "sha512-lUwjXMnVO+8iZtqwKr4hEBgA9q03AqAhUBNNyyG8oeTpgASrQ1ZlLjjmBWgvEpw4JokRduDf7il+NNENjaeAhQ==", - "dependencies": { - "@cosmjs/amino": "^0.25.5", - "@cosmjs/cosmwasm-launchpad": "^0.25.5", - "@cosmjs/crypto": "^0.25.5", - "@cosmjs/encoding": "^0.25.5", - "@cosmjs/math": "^0.25.5", - "@cosmjs/proto-signing": "^0.25.5", - "@cosmjs/stargate": "^0.25.5", - "@cosmjs/tendermint-rpc": "^0.25.5", - "@cosmjs/utils": "^0.25.5", - "long": "^4.0.0", - "pako": "^2.0.2", - "protobufjs": "~6.10.2" - } - }, - "node_modules/@cosmjs/cosmwasm-stargate/node_modules/@cosmjs/crypto": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@cosmjs/crypto/-/crypto-0.25.5.tgz", - "integrity": "sha512-i0Nfbk4JXAwyKNGPFu0o1xV6IJUbYmmveySytbU/yweybcZppxoczjSQ1sGrUaLVLvgfcpfwZte3jKqDR67+dg==", - "dependencies": { - "@cosmjs/encoding": "^0.25.5", - "@cosmjs/math": "^0.25.5", - "@cosmjs/utils": "^0.25.5", - "bip39": "^3.0.2", - "bn.js": "^4.11.8", - "elliptic": "^6.5.3", - "js-sha3": "^0.8.0", - "libsodium-wrappers": "^0.7.6", - "ripemd160": "^2.0.2", - "sha.js": "^2.4.11" - } - }, - "node_modules/@cosmjs/cosmwasm-stargate/node_modules/@cosmjs/proto-signing": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@cosmjs/proto-signing/-/proto-signing-0.25.5.tgz", - "integrity": "sha512-YWVp+dGHt7v6ZKjOs8CI9xkpOV49eweHbYMv/vCVYF4cEh0kWwy2WzbWIkUH9zwwUqCxigVOTBYUCfbsjEbfug==", - "dependencies": { - "@cosmjs/amino": "^0.25.5", - "long": "^4.0.0", - "protobufjs": "~6.10.2" - } - }, - "node_modules/@cosmjs/cosmwasm-stargate/node_modules/@cosmjs/stargate": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@cosmjs/stargate/-/stargate-0.25.5.tgz", - "integrity": "sha512-cOZ+fOC16YT7W2vjBnnk9oJfuIlB02KdK6dn6aigMd4mx+7DS2jvNslpQrfKmtrwB9AVsgc6tklBkYwG5qAuKQ==", - "dependencies": { - "@confio/ics23": "^0.6.3", - "@cosmjs/amino": "^0.25.5", - "@cosmjs/encoding": "^0.25.5", - "@cosmjs/math": "^0.25.5", - "@cosmjs/proto-signing": "^0.25.5", - "@cosmjs/stream": "^0.25.5", - "@cosmjs/tendermint-rpc": "^0.25.5", - "@cosmjs/utils": "^0.25.5", + "version": "0.28.11", + "resolved": "https://registry.npmjs.org/@cosmjs/cosmwasm-stargate/-/cosmwasm-stargate-0.28.11.tgz", + "integrity": "sha512-sZ04c9ZvwAC7IngNeOhTnHJLBu7PXX3QfWM2vCVGd9puP9f3Hj3nbre75WKjHZ3DDVvxfS3u3JUJ6LjVWeIRuQ==", + "dependencies": { + "@cosmjs/amino": "0.28.11", + "@cosmjs/crypto": "0.28.11", + "@cosmjs/encoding": "0.28.11", + "@cosmjs/math": "0.28.11", + "@cosmjs/proto-signing": "0.28.11", + "@cosmjs/stargate": "0.28.11", + "@cosmjs/tendermint-rpc": "0.28.11", + "@cosmjs/utils": "0.28.11", + "cosmjs-types": "^0.4.0", "long": "^4.0.0", - "protobufjs": "~6.10.2" - } - }, - "node_modules/@cosmjs/cosmwasm-stargate/node_modules/@cosmjs/tendermint-rpc": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@cosmjs/tendermint-rpc/-/tendermint-rpc-0.25.5.tgz", - "integrity": "sha512-WlUCFVdhbwA3IDA1C858S8WOtLseZLXKTdj5fz1sTKSBmtrig4l1ZMKHHlZRprvmjSpkpbjgSQU+RjjvBd75BA==", - "dependencies": { - "@cosmjs/crypto": "^0.25.5", - "@cosmjs/encoding": "^0.25.5", - "@cosmjs/json-rpc": "^0.25.5", - "@cosmjs/math": "^0.25.5", - "@cosmjs/socket": "^0.25.5", - "@cosmjs/stream": "^0.25.5", - "axios": "^0.21.1", - "readonly-date": "^1.0.0", - "xstream": "^11.14.0" + "pako": "^2.0.2" } }, "node_modules/@cosmjs/crypto": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@cosmjs/crypto/-/crypto-0.25.0.tgz", - "integrity": "sha512-zs1zk0JTj5Hbn4IH4WwM5IZ4h+6JHN0SRxvrjZ3ubMC0cjktW7NtMKK07GxQkIvL/Gg+/iLJ3lMk0ft+G84zzA==", - "dependencies": { - "@cosmjs/encoding": "^0.25.0", - "@cosmjs/math": "^0.25.0", - "@cosmjs/utils": "^0.25.0", - "bip39": "^3.0.2", - "bn.js": "^4.11.8", + "version": "0.28.11", + "resolved": "https://registry.npmjs.org/@cosmjs/crypto/-/crypto-0.28.11.tgz", + "integrity": "sha512-oJXOeBX4FP8bp0ZVydJFcRplErHp8cC6vNoULRck+7hcLuvp9tyv3SBOkBkwxTv81VcQyGCgn7WE0NYEKrpUbw==", + "dependencies": { + "@cosmjs/encoding": "0.28.11", + "@cosmjs/math": "0.28.11", + "@cosmjs/utils": "0.28.11", + "@noble/hashes": "^1", + "bn.js": "^5.2.0", "elliptic": "^6.5.3", - "js-sha3": "^0.8.0", - "libsodium-wrappers": "^0.7.6", - "pbkdf2": "^3.1.2", - "ripemd160": "^2.0.2", - "sha.js": "^2.4.11", - "unorm": "^1.5.0" + "libsodium-wrappers": "^0.7.6" } }, + "node_modules/@cosmjs/crypto/node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" + }, "node_modules/@cosmjs/encoding": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@cosmjs/encoding/-/encoding-0.25.5.tgz", - "integrity": "sha512-QT7MaPBiMeCaMJ6VZZKeOqDQlAxMEzTFjBFhbkdyx5DVRc4dPOVO4HbTggmIN5/eizIv4/CNJSVTR//tO53J0A==", + "version": "0.28.11", + "resolved": "https://registry.npmjs.org/@cosmjs/encoding/-/encoding-0.28.11.tgz", + "integrity": "sha512-J7pvlzAt8hBZn316wGRmUlK3xwMgNXUvj4v56DK4fA0fv6VfGwMvVtHCXaqNQtzOGkC6EQcshzA/fL5MBIwu6A==", "dependencies": { "base64-js": "^1.3.0", "bech32": "^1.1.4", @@ -470,115 +243,121 @@ } }, "node_modules/@cosmjs/faucet-client": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@cosmjs/faucet-client/-/faucet-client-0.25.5.tgz", - "integrity": "sha512-bslIU0Oa9WUPexgwxkQlq2opNAVyBFFMUjlkduricNc9C6/UOR/l6mjB0mt+VU6JTcc9wkxf6wt3wD2dwZQklw==", + "version": "0.28.11", + "resolved": "https://registry.npmjs.org/@cosmjs/faucet-client/-/faucet-client-0.28.11.tgz", + "integrity": "sha512-alQGznExoZKTFWrA7ejyCVWa3t2VI162MY9uDlV0MbeGOcS9GgAtapHUlapd4q1Ynq6PQ35tlLEITpsBR4VJoQ==", "dependencies": { - "axios": "^0.21.1" + "axios": "^0.21.2" } }, "node_modules/@cosmjs/json-rpc": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@cosmjs/json-rpc/-/json-rpc-0.25.5.tgz", - "integrity": "sha512-WFDallAolxBqB8V/mYxU0riF/OBoc6Fc2DDsZhds5xOZxeN9sTX0qWhu1UiFyURw4Z9D+SjB9QngqSDBTMTdjw==", + "version": "0.28.11", + "resolved": "https://registry.npmjs.org/@cosmjs/json-rpc/-/json-rpc-0.28.11.tgz", + "integrity": "sha512-YNZTozu5yWHyGGet5Wfc0CcxQezkMr37YaeU9elCaa11ClHlYAQ2NrPpPBOmgnJKsMhzfiKcAE9Sf6f4a0hCxA==", "dependencies": { - "@cosmjs/stream": "^0.25.5", + "@cosmjs/stream": "0.28.11", "xstream": "^11.14.0" } }, - "node_modules/@cosmjs/launchpad": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@cosmjs/launchpad/-/launchpad-0.25.0.tgz", - "integrity": "sha512-+ByFM9ZiplO4NpelxS0XulZb1BvWhAesZgkfafg346lPhvbcKEKXKph9ElbDsfJxifXcFEywwGrdIW7pdAxjtQ==", - "dependencies": { - "@cosmjs/amino": "^0.25.0", - "@cosmjs/crypto": "^0.25.0", - "@cosmjs/encoding": "^0.25.0", - "@cosmjs/math": "^0.25.0", - "@cosmjs/utils": "^0.25.0", - "axios": "^0.21.1", - "fast-deep-equal": "^3.1.3" - } - }, "node_modules/@cosmjs/math": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@cosmjs/math/-/math-0.25.5.tgz", - "integrity": "sha512-LWovT1uTHlr+VEce27/14Wrgc4INJYOYk1+ncyvbZertixNFH6OMnc9Xkk0DIV4RYmW+/fvB9kCXVnNtQGSuHg==", + "version": "0.28.11", + "resolved": "https://registry.npmjs.org/@cosmjs/math/-/math-0.28.11.tgz", + "integrity": "sha512-MyhPnC4sYu86c2/0PpEeynaPl4nvAmLZH3acPh96SzcjERONbGZjjKtBFPq1avBrev2CCSPrZ4O8u9xpQ4aSvg==", "dependencies": { - "bn.js": "^4.11.8" + "bn.js": "^5.2.0" } }, + "node_modules/@cosmjs/math/node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" + }, "node_modules/@cosmjs/proto-signing": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@cosmjs/proto-signing/-/proto-signing-0.25.0.tgz", - "integrity": "sha512-5nEYuY4VmzY7ul7WwIL9WI5ZshOXmp/uZrj+L0IppbTvBK0ZRCxfZwJQWfHv7kjJoNfprFapKiZZfKz8LnsCIA==", - "dependencies": { - "@cosmjs/amino": "^0.25.0", - "long": "^4.0.0", - "protobufjs": "~6.10.2" + "version": "0.28.11", + "resolved": "https://registry.npmjs.org/@cosmjs/proto-signing/-/proto-signing-0.28.11.tgz", + "integrity": "sha512-ym0DpLff+0RBkD/mtFf6wrzyuGhcbcjuDMEdcUWOrJTo6n8DXeRmHkJkyy/mrG3QC4tQX/A81+DhfkANQmgcxw==", + "dependencies": { + "@cosmjs/amino": "0.28.11", + "@cosmjs/crypto": "0.28.11", + "@cosmjs/encoding": "0.28.11", + "@cosmjs/math": "0.28.11", + "@cosmjs/utils": "0.28.11", + "cosmjs-types": "^0.4.0", + "long": "^4.0.0" } }, "node_modules/@cosmjs/socket": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@cosmjs/socket/-/socket-0.25.5.tgz", - "integrity": "sha512-wcJVbD4xlF4+5hMum4tOmAy5ppX+E9qrB9Pvt3T7BK+6T5uobxiBQCLEiDwHP3n42RBj+xQWJrScPf5IEWmZKg==", + "version": "0.28.11", + "resolved": "https://registry.npmjs.org/@cosmjs/socket/-/socket-0.28.11.tgz", + "integrity": "sha512-4BhsWN984SLBhwPCD89riQ3SEJzJ1RLJPeP6apIGjhh6pguQZmwa2U/TZjnEUOGnJkUG2FZUH99jRGSTYaIvZg==", "dependencies": { - "@cosmjs/stream": "^0.25.5", + "@cosmjs/stream": "0.28.11", "isomorphic-ws": "^4.0.1", "ws": "^7", "xstream": "^11.14.0" } }, + "node_modules/@cosmjs/socket/node_modules/@cosmjs/stream": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@cosmjs/stream/-/stream-0.25.6.tgz", + "integrity": "sha512-2mXIzf+WaFd+GSrRaJJETVXeZoC5sosuKChFERxSY8zXQ/f3OaG9J6m+quHpPbU3nAIEtnF1jgBVqJiD+NKwGQ==", + "dependencies": { + "xstream": "^11.14.0" + } + }, "node_modules/@cosmjs/stargate": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@cosmjs/stargate/-/stargate-0.25.0.tgz", - "integrity": "sha512-XKnh8QDKoYCGGviMSs+JteY1gVVkkBad+mMGcoGrBbvzDFc4Xm7alQDb/JVNWCLmALyIrqmdQ4Nfn1Znpfi9CA==", - "dependencies": { - "@confio/ics23": "^0.6.3", - "@cosmjs/amino": "^0.25.0", - "@cosmjs/encoding": "^0.25.0", - "@cosmjs/math": "^0.25.0", - "@cosmjs/proto-signing": "^0.25.0", - "@cosmjs/stream": "^0.25.0", - "@cosmjs/tendermint-rpc": "^0.25.0", - "@cosmjs/utils": "^0.25.0", + "version": "0.28.11", + "resolved": "https://registry.npmjs.org/@cosmjs/stargate/-/stargate-0.28.11.tgz", + "integrity": "sha512-UyFH/mTNNKTZohVhj+SmjCRv/xopqU/UinGedmWzs4MqEZteX9xs6D3HTmRCgpmBQ03lpbTslE/FhhT9Hkl9KQ==", + "dependencies": { + "@confio/ics23": "^0.6.8", + "@cosmjs/amino": "0.28.11", + "@cosmjs/encoding": "0.28.11", + "@cosmjs/math": "0.28.11", + "@cosmjs/proto-signing": "0.28.11", + "@cosmjs/stream": "0.28.11", + "@cosmjs/tendermint-rpc": "0.28.11", + "@cosmjs/utils": "0.28.11", + "cosmjs-types": "^0.4.0", "long": "^4.0.0", - "protobufjs": "~6.10.2" + "protobufjs": "~6.11.3", + "xstream": "^11.14.0" } }, "node_modules/@cosmjs/stream": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@cosmjs/stream/-/stream-0.25.5.tgz", - "integrity": "sha512-a+0sDNKZTxw9p4j5tl7SI0siMTii7AQot1+5vkH5BkQoAv3C3D8jagPouUz3RUFuh13qftPxPLiHzDFLNSjTnQ==", + "version": "0.28.11", + "resolved": "https://registry.npmjs.org/@cosmjs/stream/-/stream-0.28.11.tgz", + "integrity": "sha512-3b6P4Il8mYzvY2bvEQyzgP+cm0HIGSpHNtuGjiWsQF3Wtp450iVRfEJqdt4+91vvxzfdjQEkQOLMaymnswX3sw==", "dependencies": { "xstream": "^11.14.0" } }, "node_modules/@cosmjs/tendermint-rpc": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@cosmjs/tendermint-rpc/-/tendermint-rpc-0.25.0.tgz", - "integrity": "sha512-clQZm30BJBmdHfm02saOoEUt0jFe3OAwVYOysOqFwnPddf6IcygEGnrI7JHjffrOKfKwgLYIwqL2rUeyBmZhtA==", - "dependencies": { - "@cosmjs/crypto": "^0.25.0", - "@cosmjs/encoding": "^0.25.0", - "@cosmjs/json-rpc": "^0.25.0", - "@cosmjs/math": "^0.25.0", - "@cosmjs/socket": "^0.25.0", - "@cosmjs/stream": "^0.25.0", - "axios": "^0.21.1", + "version": "0.28.11", + "resolved": "https://registry.npmjs.org/@cosmjs/tendermint-rpc/-/tendermint-rpc-0.28.11.tgz", + "integrity": "sha512-TUhWsUYxbKftQmHQK5TBH62vNaKB1ybxoFZ2uJtGMVvY3jcBux7P0Ll/u5nwrM0ETAeo2RjucehJUpGBy9q+HQ==", + "dependencies": { + "@cosmjs/crypto": "0.28.11", + "@cosmjs/encoding": "0.28.11", + "@cosmjs/json-rpc": "0.28.11", + "@cosmjs/math": "0.28.11", + "@cosmjs/socket": "0.28.11", + "@cosmjs/stream": "0.28.11", + "@cosmjs/utils": "0.28.11", + "axios": "^0.21.2", "readonly-date": "^1.0.0", "xstream": "^11.14.0" } }, "node_modules/@cosmjs/utils": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@cosmjs/utils/-/utils-0.25.5.tgz", - "integrity": "sha512-U4YdgJadFgXWblthgyXqP28Yw5rsw2IX/cOES0pa6fiB81hoYl2LXqXiuKp2yVPoAgk8JpkFh3i5KchcD9muJg==" + "version": "0.28.11", + "resolved": "https://registry.npmjs.org/@cosmjs/utils/-/utils-0.28.11.tgz", + "integrity": "sha512-FXVEr7Pg6MX9VbY5NemuKbtFVabSlUlArWIV+R74FQg5LIuSa+0QkxSpNldCuOLBEU4/GlrzybT4uEl338vSzg==" }, "node_modules/@dabh/diagnostics": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.2.tgz", - "integrity": "sha512-+A1YivoVDNNVCdfozHSR8v/jyuuLTMXwjWuxPFlFlUapXoGc+Gj9mDlTDDfrwl7rXCl2tNZ0kE8sIBO6YOn96Q==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", + "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", "dependencies": { "colorspace": "1.1.x", "enabled": "2.0.x", @@ -586,15 +365,26 @@ } }, "node_modules/@exodus/schemasafe": { - "version": "1.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@exodus/schemasafe/-/schemasafe-1.0.0-rc.3.tgz", - "integrity": "sha512-GoXw0U2Qaa33m3eUcxuHnHpNvHjNlLo0gtV091XBpaRINaB4X6FGCG5XKxSFNFiPpugUDqNruHzaqpTdDm4AOg==" + "version": "1.0.0-rc.6", + "resolved": "https://registry.npmjs.org/@exodus/schemasafe/-/schemasafe-1.0.0-rc.6.tgz", + "integrity": "sha512-dDnQizD94EdBwEj/fh3zPRa/HWCS9O5au2PuHhZBbuM3xWHxuaKzPBOEWze7Nn0xW68MIpZ7Xdyn1CoCpjKCuQ==" }, "node_modules/@jsdevtools/ono": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==" }, + "node_modules/@noble/hashes": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.1.2.tgz", + "integrity": "sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -681,26 +471,52 @@ "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=" }, + "node_modules/@sinonjs/commons": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", + "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", + "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "node_modules/@sinonjs/samsam": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-5.3.1.tgz", + "integrity": "sha512-1Hc0b1TtyfBu8ixF/tpfSHTVWKwCBLY4QJbkgnE7HcwyvT2xArDxb4K7dMgqRm3szI+LJbzmW/s4xxEhv6hwDg==", + "dependencies": { + "@sinonjs/commons": "^1.6.0", + "lodash.get": "^4.4.2", + "type-detect": "^4.0.8" + } + }, + "node_modules/@sinonjs/text-encoding": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", + "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==" + }, "node_modules/@types/long": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==" }, "node_modules/@types/node": { - "version": "13.13.45", - "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.45.tgz", - "integrity": "sha512-703YTEp8AwQeapI0PTXDOj+Bs/mtdV/k9VcTP7z/de+lx6XjFMKdB+JhKnK+6PZ5za7omgZ3V6qm/dNkMj/Zow==" + "version": "13.13.52", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.52.tgz", + "integrity": "sha512-s3nugnZumCC//n4moGGe6tkNMyYEdaDBitVjwPxXmR5lnMG5dHePinH2EdxkG3Rh1ghFHHixAG4NJhpJW1rthQ==" }, "node_modules/@types/object-hash": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/@types/object-hash/-/object-hash-1.3.4.tgz", "integrity": "sha512-xFdpkAkikBgqBdG9vIlsqffDV8GpvnPEzs0IUtr1v3BEB97ijsFQ4RXVbUZwjFThhB4MDSTUfvmxUD5PGx0wXA==" }, - "node_modules/@types/prettier": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-1.19.1.tgz", - "integrity": "sha512-5qOlnZscTn4xxM5MeGXAMOsIOIKIbh9e85zJWfBRVPlRMEVawzoPhINYbRGkBZCI8LxvBe7tJCdWiarA99OZfQ==" - }, "node_modules/@types/swagger-schema-official": { "version": "2.0.21", "resolved": "https://registry.npmjs.org/@types/swagger-schema-official/-/swagger-schema-official-2.0.21.tgz", @@ -717,12 +533,27 @@ "node": ">= 6.0.0" } }, + "node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, "node_modules/ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, "node_modules/ansi-styles": { @@ -753,6 +584,33 @@ "readable-stream": "^2.0.6" } }, + "node_modules/are-we-there-yet/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/are-we-there-yet/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/are-we-there-yet/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -775,9 +633,9 @@ } }, "node_modules/async": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", - "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==" + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", + "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==" }, "node_modules/at-least-node": { "version": "1.0.0", @@ -788,11 +646,11 @@ } }, "node_modules/axios": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", - "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", "dependencies": { - "follow-redirects": "^1.10.0" + "follow-redirects": "^1.14.0" } }, "node_modules/base64-js": { @@ -824,22 +682,6 @@ "resolved": "https://registry.npmjs.org/bintrees/-/bintrees-1.0.1.tgz", "integrity": "sha1-DmVcm5wkNeqraL9AJyJtK1WjRSQ=" }, - "node_modules/bip39": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/bip39/-/bip39-3.0.3.tgz", - "integrity": "sha512-P0dKrz4g0V0BjXfx7d9QNkJ/Txcz/k+hM9TnjqjUaXtuOfAvxXSw2rJw8DX0e3ZPwnK/IgDxoRqf0bvoVCqbMg==", - "dependencies": { - "@types/node": "11.11.6", - "create-hash": "^1.1.0", - "pbkdf2": "^3.0.9", - "randombytes": "^2.0.1" - } - }, - "node_modules/bip39/node_modules/@types/node": { - "version": "11.11.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-11.11.6.tgz", - "integrity": "sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ==" - }, "node_modules/bl": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", @@ -850,19 +692,6 @@ "readable-stream": "^3.4.0" } }, - "node_modules/bl/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", @@ -932,15 +761,6 @@ "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" }, - "node_modules/cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, "node_modules/cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", @@ -951,6 +771,46 @@ "wrap-ansi": "^7.0.0" } }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", @@ -960,12 +820,12 @@ } }, "node_modules/color": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/color/-/color-3.0.0.tgz", - "integrity": "sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", "dependencies": { - "color-convert": "^1.9.1", - "color-string": "^1.5.2" + "color-convert": "^1.9.3", + "color-string": "^1.6.0" } }, "node_modules/color-convert": { @@ -985,9 +845,9 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/color-string": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.5.tgz", - "integrity": "sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.0.tgz", + "integrity": "sha512-9Mrz2AQLefkH1UvASKj6v6hj/7eWgjnT/cVsR8CumieLoT+g900exWeNogqtweI8dxloXN9BDQTYro1oWu/5CQ==", "dependencies": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" @@ -1006,29 +866,21 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, - "node_modules/colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "engines": { - "node": ">=0.1.90" - } - }, "node_modules/colorspace": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.2.tgz", - "integrity": "sha512-vt+OoIP2d76xLhjwbBaucYlNSpPsrJWPlBTtwCpQKIu6/CSMutyzX93O/Do0qzpH3YoHEes8YEFXyZ797rEhzQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", + "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", "dependencies": { - "color": "3.0.x", + "color": "^3.1.3", "text-hex": "1.0.x" } }, "node_modules/commander": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", - "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.1.0.tgz", + "integrity": "sha512-pRxBna3MJe6HKnBGsDyMv8ETbptw3axEdYHoqNh7gu5oDcew8fs0xnivZGm06Ogk8zGAJ9VX+OPEr2GXEQK4dg==", "engines": { - "node": ">= 6" + "node": ">= 10" } }, "node_modules/console-control-strings": { @@ -1037,33 +889,17 @@ "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" }, "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "node_modules/create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dependencies": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, - "node_modules/create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "node_modules/cosmjs-types": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cosmjs-types/-/cosmjs-types-0.4.1.tgz", + "integrity": "sha512-I7E/cHkIgoJzMNQdFF0YVqPlaTqrqKHrskuSTIqlEyxfB5Lf3WKCajSXVK2yHOfOFfSux/RxEdpMzw/eO4DIog==", "dependencies": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" + "long": "^4.0.0", + "protobufjs": "~6.11.2" } }, "node_modules/dataloader": { @@ -1087,11 +923,6 @@ } } }, - "node_modules/debug/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, "node_modules/decompress-response": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", @@ -1117,14 +948,18 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" }, "node_modules/define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", "dependencies": { - "object-keys": "^1.0.12" + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/delegates": { @@ -1143,6 +978,14 @@ "node": ">=0.10" } }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -1249,9 +1092,9 @@ } }, "node_modules/eta": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/eta/-/eta-1.12.1.tgz", - "integrity": "sha512-H8npoci2J/7XiPnVcCVulBSPsTNGvGaINyMjQDU8AFqp9LGsEYS88g2CiU+d01Sg44WtX7o4nb8wUJ9vnI+tiA==", + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/eta/-/eta-1.12.3.tgz", + "integrity": "sha512-qHixwbDLtekO/d51Yr4glcaUJCIjGVJyTzuqV4GPlgZo1YpgOKG+avQynErZIYrfM6JIJdtiG2Kox8tbb+DoGg==", "engines": { "node": ">=6.0.0" }, @@ -1293,9 +1136,9 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" }, "node_modules/fast-safe-stringify": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", - "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==" + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.4.tgz", + "integrity": "sha512-mNlGUdKOeGNleyrmgbKYtbnCr9KZkZXU7eM89JRo8vY10f7Ul1Fbj07hUBW3N4fC0xM+fmfFfa2zM7mIizhpNQ==" }, "node_modules/fastq": { "version": "1.13.0", @@ -1306,9 +1149,9 @@ } }, "node_modules/fecha": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.1.tgz", - "integrity": "sha512-MMMQ0ludy/nBs1/o0zVOiKTpG7qMbonKUzjJgQFEuvq6INZ1OraKPRAWkBq5vlKLOUMpmNYG1JoN3oDPUQ9m3Q==" + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.2.tgz", + "integrity": "sha512-5rOQWkBVz3FnYWTi/ELZmq4CoK1Pb+xKNZWuJRsOwo0+8DrP43CrWJtyLVvb5U7z7ggE5llahfDbLjaVNzXVJQ==" }, "node_modules/fill-range": { "version": "7.0.1", @@ -1327,9 +1170,9 @@ "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" }, "node_modules/follow-redirects": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.2.tgz", - "integrity": "sha512-6mPTgLxYm3r6Bkkg0vNM0HTjfGrOEtsfbhagQvbxDEsEkpNhw582upBaoRZylzen6krEmxXJgt9Ju6HiI4O7BA==", + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", + "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==", "funding": [ { "type": "individual", @@ -1354,19 +1197,46 @@ "readable-stream": "^2.0.0" } }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" - }, - "node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "node_modules/from2/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/from2/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/from2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, + "node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", "universalify": "^2.0.0" }, "engines": { @@ -1393,49 +1263,6 @@ "wide-align": "^1.1.0" } }, - "node_modules/gauge/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/gauge/node_modules/is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dependencies": { - "number-is-nan": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/gauge/node_modules/string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dependencies": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/gauge/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -1444,6 +1271,19 @@ "node": "6.* || 8.* || >= 10.*" } }, + "node_modules/get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/github-from-package": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", @@ -1494,9 +1334,9 @@ } }, "node_modules/graceful-fs": { - "version": "4.2.9", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", - "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" }, "node_modules/has": { "version": "1.0.3", @@ -1522,51 +1362,6 @@ "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" }, - "node_modules/hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/hash-base/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/hash-base/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/hash.js": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", @@ -1587,14 +1382,14 @@ } }, "node_modules/http2-client": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/http2-client/-/http2-client-1.3.3.tgz", - "integrity": "sha512-nUxLymWQ9pzkzTmir24p2RtsgruLmhje7lH3hLX1IpwvyTg77fW+1brenPPP3USAR+rQ36p5sTA/x7sjCJVkAA==" + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/http2-client/-/http2-client-1.3.5.tgz", + "integrity": "sha512-EC2utToWl4RKfs5zd36Mxq7nzHHBuomZboI0yYL6Y0RmBgT7Sgkq4rQ0ezFTYoIsSs7Tm9SJe+o2FcAg6GBhGA==" }, "node_modules/https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "dependencies": { "agent-base": "6", "debug": "4" @@ -1661,9 +1456,9 @@ "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" }, "node_modules/is-core-module": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", - "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", + "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", "dependencies": { "has": "^1.0.3" }, @@ -1680,11 +1475,14 @@ } }, "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dependencies": { + "number-is-nan": "^1.0.0" + }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, "node_modules/is-glob": { @@ -1707,11 +1505,14 @@ } }, "node_modules/is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/isarray": { @@ -1727,20 +1528,10 @@ "ws": "*" } }, - "node_modules/js-sha3": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", - "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" - }, - "node_modules/js-sha512": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/js-sha512/-/js-sha512-0.8.0.tgz", - "integrity": "sha512-PWsmefG6Jkodqt+ePTvBZCSMFgN7Clckjd0O7su3I0+BW2QWUTJNzjktHsztGLhncP2h8mcF9V9Y2Ha59pAViQ==" - }, "node_modules/js-yaml": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.0.0.tgz", - "integrity": "sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dependencies": { "argparse": "^2.0.1" }, @@ -1749,21 +1540,26 @@ } }, "node_modules/json-rpc-2.0": { - "version": "0.2.16", - "resolved": "https://registry.npmjs.org/json-rpc-2.0/-/json-rpc-2.0-0.2.16.tgz", - "integrity": "sha512-nXKBcNZxkoeyKpotT/T3tciv+e7EQb13nuDRLD2tff8Vs39VpPTOvL0BOXM3mN5QE10BlVEq5LDSV344m4zpeg==" + "version": "0.2.19", + "resolved": "https://registry.npmjs.org/json-rpc-2.0/-/json-rpc-2.0-0.2.19.tgz", + "integrity": "sha512-tegZKneDQjWintJS5Zlw8xNvJK0/xq4sct2M5AgfFmcCJFMjvrLgk1noH7OPfFgEQ+ScueuWdaGfikCPr+qBtg==" }, "node_modules/json-schema-ref-parser": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/json-schema-ref-parser/-/json-schema-ref-parser-9.0.7.tgz", - "integrity": "sha512-uxU9Ix+MVszvCTvBucQiIcNEny3oAEFg7EQHSZw2bquCCuqUqEPEczIdv/Uqo1Zv4/wDPZqOI+ulrMk1ncMtjQ==", + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/json-schema-ref-parser/-/json-schema-ref-parser-9.0.9.tgz", + "integrity": "sha512-qcP2lmGy+JUoQJ4DOQeLaZDqH9qSkeGCK3suKWxJXS82dg728Mn3j97azDMaOUmJAN4uCq91LdPx4K7E8F1a7Q==", "dependencies": { - "@apidevtools/json-schema-ref-parser": "9.0.7" + "@apidevtools/json-schema-ref-parser": "9.0.9" }, "engines": { "node": ">=10" } }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, "node_modules/jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", @@ -1775,6 +1571,11 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/just-extend": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", + "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==" + }, "node_modules/kuler": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", @@ -1793,14 +1594,14 @@ } }, "node_modules/libsodium": { - "version": "0.7.9", - "resolved": "https://registry.npmjs.org/libsodium/-/libsodium-0.7.9.tgz", - "integrity": "sha512-gfeADtR4D/CM0oRUviKBViMGXZDgnFdMKMzHsvBdqLBHd9ySi6EtYnmuhHVDDYgYpAO8eU8hEY+F8vIUAPh08A==" + "version": "0.7.10", + "resolved": "https://registry.npmjs.org/libsodium/-/libsodium-0.7.10.tgz", + "integrity": "sha512-eY+z7hDrDKxkAK+QKZVNv92A5KYkxfvIshtBJkmg5TSiCnYqZP3i9OO9whE79Pwgm4jGaoHgkM4ao/b9Cyu4zQ==" }, "node_modules/libsodium-wrappers": { - "version": "0.7.9", - "resolved": "https://registry.npmjs.org/libsodium-wrappers/-/libsodium-wrappers-0.7.9.tgz", - "integrity": "sha512-9HaAeBGk1nKTRFRHkt7nzxqCvnkWTjn1pdjKgcUnZxj0FyOP4CnhgFhMdrFfgNsukijBGyBLpP2m2uKT1vuWhQ==", + "version": "0.7.10", + "resolved": "https://registry.npmjs.org/libsodium-wrappers/-/libsodium-wrappers-0.7.10.tgz", + "integrity": "sha512-pO3F1Q9NPLB/MWIhehim42b/Fwb30JNScCNh8TcQ/kIc+qGLQch8ag8wb0keK3EP5kbGakk1H8Wwo7v+36rNQg==", "dependencies": { "libsodium": "^0.7.0" } @@ -1820,15 +1621,20 @@ "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==" + }, "node_modules/logform": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/logform/-/logform-2.2.0.tgz", - "integrity": "sha512-N0qPlqfypFx7UHNn4B3lzS/b0uLqt2hmuoa+PpuXNYgozdJYAyauF5Ky0BWVjrxDlMWiT3qN4zPq3vVAfZy7Yg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.4.0.tgz", + "integrity": "sha512-CPSJw4ftjf517EhXZGGvTHHkYobo7ZCc0kvwUoOYcjfR2UVrI66RHj8MCrfAdEitdmFqbu2BYdYs8FHHZSb6iw==", "dependencies": { - "colors": "^1.2.1", - "fast-safe-stringify": "^2.0.4", + "@colors/colors": "1.5.0", "fecha": "^4.2.0", "ms": "^2.1.1", + "safe-stable-stringify": "^2.3.1", "triple-beam": "^1.3.0" } }, @@ -1862,16 +1668,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -1914,9 +1710,9 @@ "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" }, "node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" }, "node_modules/mkdirp-classic": { "version": "0.5.3", @@ -1924,9 +1720,9 @@ "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" }, "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/multistream": { "version": "4.1.0", @@ -1951,23 +1747,10 @@ "readable-stream": "^3.6.0" } }, - "node_modules/multistream/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/nanoid": { - "version": "3.1.20", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz", - "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.2.tgz", + "integrity": "sha512-CuHBogktKwpm5g2sRgv83jEy2ijFzBwMoYA60orPDR7ynsLijJDqgsi4RDGj3OJpy3Ieb+LYwiRmIOGyytgITA==", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -1980,6 +1763,18 @@ "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" }, + "node_modules/nise": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/nise/-/nise-4.1.0.tgz", + "integrity": "sha512-eQMEmGN/8arp0xsvGoQ+B1qvSkR73B1nWSCh7nOt5neMCtwcQVYQGdzQMhcNscktTsWB54xnlSQFzOAPJD8nXA==", + "dependencies": { + "@sinonjs/commons": "^1.7.0", + "@sinonjs/fake-timers": "^6.0.0", + "@sinonjs/text-encoding": "^0.7.1", + "just-extend": "^4.0.2", + "path-to-regexp": "^1.7.0" + } + }, "node_modules/node-abi": { "version": "2.30.1", "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.30.1.tgz", @@ -2061,10 +1856,15 @@ "fast-safe-stringify": "^2.0.7" } }, + "node_modules/oas-kit-common/node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" + }, "node_modules/oas-linter": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/oas-linter/-/oas-linter-3.2.1.tgz", - "integrity": "sha512-e5G6bbq3Nrfxm+SDPR5AiZ6n2smVUmhLA1OgI2/Bl8e2ywfWsKw/yuqrwiXXiNHb1wdM/GyPMX6QjCGJODlaaA==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/oas-linter/-/oas-linter-3.2.2.tgz", + "integrity": "sha512-KEGjPDVoU5K6swgo9hJVA/qYGlwfbFx+Kg2QB/kd7rzV5N8N5Mg6PlsoCMohVnQmo+pzJap/F610qTodKzecGQ==", "dependencies": { "@exodus/schemasafe": "^1.0.0-rc.2", "should": "^13.2.1", @@ -2075,15 +1875,15 @@ } }, "node_modules/oas-resolver": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/oas-resolver/-/oas-resolver-2.5.4.tgz", - "integrity": "sha512-1vIj5Wkjmi+kZj5sFamt95LkuXoalmoKUohtaUQoCQZjLfPFaY8uZ7nw6IZaWuE6eLON2b6xrXhxD4hiTdYl0g==", + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/oas-resolver/-/oas-resolver-2.5.6.tgz", + "integrity": "sha512-Yx5PWQNZomfEhPPOphFbZKi9W93CocQj18NlD2Pa4GWZzdZpSJvYwoiuurRI7m3SpcChrnO08hkuQDL3FGsVFQ==", "dependencies": { "node-fetch-h2": "^2.3.0", "oas-kit-common": "^1.0.8", - "reftools": "^1.1.8", + "reftools": "^1.1.9", "yaml": "^1.10.0", - "yargs": "^16.1.1" + "yargs": "^17.0.1" }, "bin": { "resolve": "resolve.js" @@ -2092,6 +1892,71 @@ "url": "https://github.com/Mermade/oas-kit?sponsor=1" } }, + "node_modules/oas-resolver/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/oas-resolver/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/oas-resolver/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/oas-resolver/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/oas-resolver/node_modules/yargs": { + "version": "17.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.4.1.tgz", + "integrity": "sha512-WSZD9jgobAg3ZKuCQZSa3g9QOJeCCqLoLAykiWgmXnDo9EPnn4RPf5qVTtzgOx66o6/oqhcA5tHtJXpG8pMt3g==", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/oas-resolver/node_modules/yargs-parser": { + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz", + "integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==", + "engines": { + "node": ">=12" + } + }, "node_modules/oas-schema-walker": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/oas-schema-walker/-/oas-schema-walker-1.1.5.tgz", @@ -2101,16 +1966,16 @@ } }, "node_modules/oas-validator": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/oas-validator/-/oas-validator-5.0.5.tgz", - "integrity": "sha512-d10yy6xlhRTh6np44k2U0gm5M66pioYTllH8J1ZTj+WSY3cpTvU+Dt51iWOT85HJqyGHo0RZKXF3u/NGQWDFgg==", + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/oas-validator/-/oas-validator-5.0.8.tgz", + "integrity": "sha512-cu20/HE5N5HKqVygs3dt94eYJfBi0TsZvPVXDhbXQHiEityDN+RROTleefoKRKKJ9dFAF2JBkDHgvWj0sjKGmw==", "dependencies": { "call-me-maybe": "^1.0.1", "oas-kit-common": "^1.0.8", - "oas-linter": "^3.2.1", - "oas-resolver": "^2.5.4", + "oas-linter": "^3.2.2", + "oas-resolver": "^2.5.6", "oas-schema-walker": "^1.1.5", - "reftools": "^1.1.8", + "reftools": "^1.1.9", "should": "^13.2.1", "yaml": "^1.10.0" }, @@ -2159,9 +2024,10 @@ } }, "node_modules/openapi-types": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-1.3.5.tgz", - "integrity": "sha512-11oi4zYorsgvg5yBarZplAqbpev5HkuVNPlZaPTknPDzAynq+lnJdXAmruGWP0s+dNYZS7bjM+xrTpJw7184Fg==" + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-11.0.0.tgz", + "integrity": "sha512-GB+QO6o1hAtKsb8tP3/FTD5jpkdKrf42L4Gel9UySngMurzr+Q9pO+dtnmySQCzoCEfJr39IH6bveEn71xNcVg==", + "peer": true }, "node_modules/optionator": { "version": "0.8.3", @@ -2188,15 +2054,28 @@ } }, "node_modules/pako": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pako/-/pako-2.0.3.tgz", - "integrity": "sha512-WjR1hOeg+kki3ZIOjaf4b5WVcay1jaliKSYiEaB1XzwhMQZJxRdQRv0V31EKBYlxb4T7SK3hjfc/jxyU64BoSw==" + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pako/-/pako-2.0.4.tgz", + "integrity": "sha512-v8tweI900AUkZN6heMU/4Uy4cXRc2AYNRggVmTR+dEncawDJgCdLMximOVA2p4qO57WMynangsfGRb5WD6L1Bg==" }, "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, + "node_modules/path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/path-to-regexp/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -2205,21 +2084,6 @@ "node": ">=8" } }, - "node_modules/pbkdf2": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", - "dependencies": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - }, - "engines": { - "node": ">=0.12" - } - }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", @@ -2232,8 +2096,8 @@ } }, "node_modules/pkg": { - "version": "5.5.2", - "resolved": "git+ssh://git@github.com/vercel/pkg.git#edfcc7b139d667d6be0e46f4101e917ca9c154bd", + "version": "5.6.0", + "resolved": "git+ssh://git@github.com/vercel/pkg.git#8cd98af1ad7ab74df40fa9ffd5e6decdfb298969", "license": "MIT", "dependencies": { "@babel/parser": "7.16.2", @@ -2245,7 +2109,7 @@ "into-stream": "^6.0.0", "minimist": "^1.2.5", "multistream": "^4.1.0", - "pkg-fetch": "3.2.6", + "pkg-fetch": "3.3.0", "prebuild-install": "6.1.4", "progress": "^2.0.3", "resolve": "^1.20.0", @@ -2265,9 +2129,9 @@ } }, "node_modules/pkg-fetch": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/pkg-fetch/-/pkg-fetch-3.2.6.tgz", - "integrity": "sha512-Q8fx6SIT022g0cdSE4Axv/xpfHeltspo2gg1KsWRinLQZOTRRAtOOaEFghA1F3jJ8FVsh8hGrL/Pb6Ea5XHIFw==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/pkg-fetch/-/pkg-fetch-3.3.0.tgz", + "integrity": "sha512-xJnIZ1KP+8rNN+VLafwu4tEeV4m8IkFBDdCFqmAJz9K1aiXEtbARmdbEe6HlXWGSVuShSHjFXpfkKRkDBQ5kiA==", "dependencies": { "chalk": "^4.1.2", "fs-extra": "^9.1.0", @@ -2282,20 +2146,6 @@ "pkg-fetch": "lib-es5/bin.js" } }, - "node_modules/pkg-fetch/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/prebuild-install": { "version": "6.1.4", "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-6.1.4.tgz", @@ -2331,14 +2181,17 @@ } }, "node_modules/prettier": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.2.1.tgz", - "integrity": "sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.6.2.tgz", + "integrity": "sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew==", "bin": { "prettier": "bin-prettier.js" }, "engines": { "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" } }, "node_modules/process-nextick-args": { @@ -2366,9 +2219,9 @@ } }, "node_modules/protobufjs": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.10.2.tgz", - "integrity": "sha512-27yj+04uF6ya9l+qfpH187aqEzfCF4+Uit0I9ZBQVqK09hk/SQzKa2MUqUpXaVa7LOFRg1TSSr3lVxGOk6c0SQ==", + "version": "6.11.3", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.3.tgz", + "integrity": "sha512-xL96WDdCZYdU7Slin569tFX712BxsxslWwAfAhCYjQKGTq7dAU91Lomy6nLLhh/dyGhk/YH4TwTSRxTzhuHyZg==", "hasInstallScript": true, "dependencies": { "@protobufjs/aspromise": "^1.1.2", @@ -2382,7 +2235,7 @@ "@protobufjs/pool": "^1.1.0", "@protobufjs/utf8": "^1.1.0", "@types/long": "^4.0.1", - "@types/node": "^13.7.0", + "@types/node": ">=13.7.0", "long": "^4.0.0" }, "bin": { @@ -2426,14 +2279,6 @@ } ] }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, "node_modules/rc": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", @@ -2449,28 +2294,27 @@ } }, "node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/readonly-date": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/readonly-date/-/readonly-date-1.0.0.tgz", + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readonly-date": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/readonly-date/-/readonly-date-1.0.0.tgz", "integrity": "sha512-tMKIV7hlk0h4mO3JTmmVuIlJVXjKk3Sep9Bf5OH0O+758ruuVkUy2J9SttDLm91IEX/WHlXPSpxMGjPj4beMIQ==" }, "node_modules/reftools": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/reftools/-/reftools-1.1.8.tgz", - "integrity": "sha512-Yvz9NH8uFHzD/AXX82Li1GdAP6FzDBxEZw+njerNBBQv/XHihqsWAjNfXtaq4QD2l4TEZVnp4UbktdYSegAM3g==", + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/reftools/-/reftools-1.1.9.tgz", + "integrity": "sha512-OVede/NQE13xBQ+ob5CKd5KyeJYU2YInb1bmV4nRoOfquZPkAkxuOXicSe1PvqIuZZ4kD13sPKBbR7UFDmli6w==", "funding": { "url": "https://github.com/Mermade/oas-kit?sponsor=1" } @@ -2492,12 +2336,16 @@ } }, "node_modules/resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", + "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", "dependencies": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -2512,15 +2360,6 @@ "node": ">=0.10.0" } }, - "node_modules/ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -2544,16 +2383,44 @@ } }, "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-stable-stringify": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.3.1.tgz", + "integrity": "sha512-kYBSfT+troD9cDA85VDnHZ1rpHC50O0g1e6WlGHVCz/g+JS+9WKLj+XwFYyR8UbrZN8ll9HUpDAAddY58MGisg==", + "engines": { + "node": ">=10" + } }, "node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dependencies": { + "lru-cache": "^6.0.0" + }, "bin": { "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/set-blocking": { @@ -2561,18 +2428,6 @@ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" }, - "node_modules/sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - }, - "bin": { - "sha.js": "bin.js" - } - }, "node_modules/should": { "version": "13.2.3", "resolved": "https://registry.npmjs.org/should/-/should-13.2.3.tgz", @@ -2663,6 +2518,23 @@ "is-arrayish": "^0.3.1" } }, + "node_modules/sinon": { + "version": "9.2.4", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-9.2.4.tgz", + "integrity": "sha512-zljcULZQsJxVra28qIAL6ow1Z9tpattkCTEJR4RBP3TGc00FcttsP5pK284Nas5WjMZU5Yzy3kAIp3B3KRf5Yg==", + "dependencies": { + "@sinonjs/commons": "^1.8.1", + "@sinonjs/fake-timers": "^6.0.1", + "@sinonjs/samsam": "^5.3.1", + "diff": "^4.0.2", + "nise": "^4.0.4", + "supports-color": "^7.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/sinon" + } + }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -2687,6 +2559,14 @@ "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, + "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -2696,11 +2576,6 @@ "node": ">=0.10.0" } }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" - }, "node_modules/stack-trace": { "version": "0.0.10", "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", @@ -2717,7 +2592,26 @@ "readable-stream": "^2.1.4" } }, - "node_modules/string_decoder": { + "node_modules/stream-meter/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/stream-meter/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/stream-meter/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", @@ -2726,27 +2620,27 @@ } }, "node_modules/string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, "node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dependencies": { - "ansi-regex": "^5.0.0" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, "node_modules/strip-json-comments": { @@ -2768,17 +2662,28 @@ "node": ">=8" } }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/swagger-combine": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/swagger-combine/-/swagger-combine-1.3.0.tgz", - "integrity": "sha512-3L/UA3iwQUh2DZZF8xuMXHM7ERilLIro7v49zJV4DhmTs/KyaW/+tsVkHGoMKR00/YnrF1lasRm1E9A5fsq/TQ==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/swagger-combine/-/swagger-combine-1.4.0.tgz", + "integrity": "sha512-nVQPzSGixSJ6U3BSTBYswIbamumNCz1ZXPqnCrXYz6BHlSeOtfGKuyZ+sAWtpOepUFuOu93x+VOIzAxLKK6xYw==", "dependencies": { "call-me-maybe": "^1.0.1", - "js-yaml": "^3.13.1", - "json-schema-ref-parser": "^9.0.1", - "lodash": "^4.17.15", + "js-yaml": "^4.1.0", + "json-schema-ref-parser": "^9.0.9", + "lodash": "^4.17.21", "minimist": "^1.2.5", - "swagger-parser": "^9.0.1", + "swagger-parser": "^10.0.3", "traverse": "^0.6.6", "url-join": "^4.0.1" }, @@ -2786,35 +2691,15 @@ "swagger-combine": "bin/swagger-combine" }, "engines": { - "node": ">=8" - } - }, - "node_modules/swagger-combine/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/swagger-combine/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "node": ">=10" } }, "node_modules/swagger-parser": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/swagger-parser/-/swagger-parser-9.0.1.tgz", - "integrity": "sha512-oxOHUaeNetO9ChhTJm2fD+48DbGbLD09ZEOwPOWEqcW8J6zmjWxutXtSuOiXsoRgDWvORYlImbwM21Pn+EiuvQ==", + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/swagger-parser/-/swagger-parser-10.0.3.tgz", + "integrity": "sha512-nF7oMeL4KypldrQhac8RyHerJeGPD1p2xDh900GPvc+Nk7nWP6jX2FcC7WmkinMoAmoO774+AFXcWsW8gMWEIg==", "dependencies": { - "@apidevtools/swagger-parser": "9.0.1" + "@apidevtools/swagger-parser": "10.0.3" }, "engines": { "node": ">=10" @@ -2848,22 +2733,30 @@ "swagger-typescript-api": "index.js" } }, + "node_modules/swagger-typescript-api/node_modules/commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "engines": { + "node": ">= 6" + } + }, "node_modules/swagger2openapi": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/swagger2openapi/-/swagger2openapi-7.0.5.tgz", - "integrity": "sha512-Hzxse+VTX0u8xBgYJ665EjO6BfvW2PN9Yv+yIjBDm6ga9jl83+4CEdCCpznH+ILr5MS8bIIXB+XcQUM3u25w4g==", + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/swagger2openapi/-/swagger2openapi-7.0.8.tgz", + "integrity": "sha512-upi/0ZGkYgEcLeGieoz8gT74oWHA0E7JivX7aN9mAf+Tc7BQoRBvnIGHoPDw+f9TXTW4s6kGYCZJtauP6OYp7g==", "dependencies": { "call-me-maybe": "^1.0.1", "node-fetch": "^2.6.1", "node-fetch-h2": "^2.3.0", "node-readfiles": "^0.2.0", "oas-kit-common": "^1.0.8", - "oas-resolver": "^2.5.4", + "oas-resolver": "^2.5.6", "oas-schema-walker": "^1.1.5", - "oas-validator": "^5.0.5", - "reftools": "^1.1.8", + "oas-validator": "^5.0.8", + "reftools": "^1.1.9", "yaml": "^1.10.0", - "yargs": "^16.1.1" + "yargs": "^17.0.1" }, "bin": { "boast": "boast.js", @@ -2874,6 +2767,71 @@ "url": "https://github.com/Mermade/oas-kit?sponsor=1" } }, + "node_modules/swagger2openapi/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/swagger2openapi/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/swagger2openapi/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/swagger2openapi/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/swagger2openapi/node_modules/yargs": { + "version": "17.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.4.1.tgz", + "integrity": "sha512-WSZD9jgobAg3ZKuCQZSa3g9QOJeCCqLoLAykiWgmXnDo9EPnn4RPf5qVTtzgOx66o6/oqhcA5tHtJXpG8pMt3g==", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/swagger2openapi/node_modules/yargs-parser": { + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz", + "integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==", + "engines": { + "node": ">=12" + } + }, "node_modules/symbol-observable": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-2.0.3.tgz", @@ -2883,39 +2841,20 @@ } }, "node_modules/table": { - "version": "6.0.7", - "resolved": "https://registry.npmjs.org/table/-/table-6.0.7.tgz", - "integrity": "sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g==", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.0.tgz", + "integrity": "sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==", "dependencies": { - "ajv": "^7.0.2", - "lodash": "^4.17.20", + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", "slice-ansi": "^4.0.0", - "string-width": "^4.2.0" + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" }, "engines": { "node": ">=10.0.0" } }, - "node_modules/table/node_modules/ajv": { - "version": "7.2.4", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-7.2.4.tgz", - "integrity": "sha512-nBeQgg/ZZA3u3SYxyaDvpvDtgZ/EZPF547ARgZBrG9Bhu1vKDwAIjtIf+sDtJUKa2zOcEbmRLBRSyMraS/Oy1A==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/table/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, "node_modules/tar-fs": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", @@ -2942,19 +2881,6 @@ "node": ">=6" } }, - "node_modules/tar-stream/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/tdigest": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/tdigest/-/tdigest-0.1.1.tgz", @@ -3003,36 +2929,36 @@ "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" }, "node_modules/ts-poet": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/ts-poet/-/ts-poet-4.5.0.tgz", - "integrity": "sha512-Vs2Zsiz3zf5qdFulFTIEpaLdgWeHXKh+4pv+ycVqEh+ZuUOVGrN0i9lbxVx7DB1FBogExytz3OuaBMJfWffpSQ==", + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/ts-poet/-/ts-poet-4.11.0.tgz", + "integrity": "sha512-OaXnCKsRs0yrc0O7LFhnq/US2DB4Wd313cS+qjG2XMksZ74pF/jvMHkJdURXJiAo4kSahL2N4e8JOdwUjOMNdw==", "dependencies": { - "@types/prettier": "^1.19.0", "lodash": "^4.17.15", - "prettier": "^2.0.2" + "prettier": "^2.5.1" } }, "node_modules/ts-proto": { - "version": "1.68.0", - "resolved": "https://registry.npmjs.org/ts-proto/-/ts-proto-1.68.0.tgz", - "integrity": "sha512-FTl/IeM3Y0fXwtrdl6mmTaZXMVwutI6+nKyjK0/ziQtd1THPt8DQtzYdTSNouewRin/SovlTkfSXZzNTxsWRog==", + "version": "1.110.4", + "resolved": "https://registry.npmjs.org/ts-proto/-/ts-proto-1.110.4.tgz", + "integrity": "sha512-conMr8adLW8nnnacTyU6aAuAz+TOGjjXc56V5J9J8eeTXzl18R0+85oZ8CVx4Kf6/cHLALgGKmeHhPPIOrwy6Q==", "dependencies": { "@types/object-hash": "^1.3.0", "dataloader": "^1.4.0", "object-hash": "^1.3.1", "protobufjs": "^6.8.8", - "ts-poet": "^4.5.0", - "ts-proto-descriptors": "^1.2.0" + "ts-poet": "^4.11.0", + "ts-proto-descriptors": "1.6.0" }, "bin": { "protoc-gen-ts_proto": "protoc-gen-ts_proto" } }, "node_modules/ts-proto-descriptors": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/ts-proto-descriptors/-/ts-proto-descriptors-1.2.0.tgz", - "integrity": "sha512-0t2WITzCiQ/3H6zPuFrFFOj2jhH6xZNu7agS7aKecKrz7tjRMW9VrmlBlJXslTTC3K7/4phV4qlsP5fOfLxuDg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ts-proto-descriptors/-/ts-proto-descriptors-1.6.0.tgz", + "integrity": "sha512-Vrhue2Ti99us/o76mGy28nF3W/Uanl1/8detyJw2yyRwiBC5yxy+hEZqQ/ZX2PbZ1vyCpJ51A9L4PnCCnkBMTQ==", "dependencies": { + "long": "^4.0.0", "protobufjs": "^6.8.8" } }, @@ -3063,10 +2989,18 @@ "node": ">= 0.8.0" } }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "engines": { + "node": ">=4" + } + }, "node_modules/typescript": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.4.tgz", - "integrity": "sha512-V+evlYHZnQkaz8TRBuxTA92yZBPotr5H+WhQ7bD3hZUndx5tGOa1fuCgeSjxAzM1RiN5IzvadIXTVefuuwZCRg==", + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz", + "integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -3083,14 +3017,6 @@ "node": ">= 10.0.0" } }, - "node_modules/unorm": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.6.0.tgz", - "integrity": "sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==", - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -3110,9 +3036,9 @@ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "node_modules/validator": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-12.2.0.tgz", - "integrity": "sha512-jJfE/DW6tIK1Ek8nCfNFqt8Wb3nzMoAbocBF6/Icgg1ZFSBpObdnwVY2jQj6qUqzhx5jc71fpvBWyLGO7Xl+nQ==", + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", + "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==", "engines": { "node": ">= 0.10" } @@ -3159,30 +3085,18 @@ } }, "node_modules/winston-transport": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.4.0.tgz", - "integrity": "sha512-Lc7/p3GtqtqPBYYtS6KCN3c77/2QCev51DvcJKbkFPQNoj1sinkGwLGFDxkXY9J6p9+EPnYs+D90uwbnaiURTw==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.5.0.tgz", + "integrity": "sha512-YpZzcUzBedhlTAfJg6vJDlyEai/IFMIVcaEZZyl3UXIl4gmqRpU7AE89AHLkbzLUsv0NVmw7ts+iztqKxxPW1Q==", "dependencies": { - "readable-stream": "^2.3.7", - "triple-beam": "^1.2.0" + "logform": "^2.3.2", + "readable-stream": "^3.6.0", + "triple-beam": "^1.3.0" }, "engines": { "node": ">= 6.4.0" } }, - "node_modules/winston/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", @@ -3207,15 +3121,55 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "node_modules/ws": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.2.tgz", - "integrity": "sha512-lkF7AWRicoB9mAgjeKbGqVUekLnSNO4VjKVnuPHpQeOxZOErX6BPXwJk70nFslRCEEA8EVW7ZjKwXaP9N+1sKQ==", + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", "engines": { "node": ">=8.3.0" }, @@ -3242,9 +3196,9 @@ } }, "node_modules/y18n": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.5.tgz", - "integrity": "sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg==", + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "engines": { "node": ">=10" } @@ -3255,9 +3209,9 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/yaml": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz", - "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==", + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", "engines": { "node": ">= 6" } @@ -3280,30 +3234,70 @@ } }, "node_modules/yargs-parser": { - "version": "20.2.6", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.6.tgz", - "integrity": "sha512-AP1+fQIWSM/sMiET8fyayjx/J+JmTPt2Mr0FkrgqB4todtfa53sOsrSAcIrJRD5XS20bKUwaDIuMkWKCEiQLKA==", + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "engines": { "node": ">=10" } }, - "node_modules/z-schema": { + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/string-width": { "version": "4.2.3", - "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-4.2.3.tgz", - "integrity": "sha512-zkvK/9TC6p38IwcrbnT3ul9in1UX4cm1y/VZSs4GHKIiDCrlafc+YQBgQBUdDXLAoZHf2qvQ7gJJOo6yT1LH6A==", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/z-schema": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.3.tgz", + "integrity": "sha512-sGvEcBOTNum68x9jCpCVGPFJ6mWnkD0YxOcddDlJHRx3tKdB2q8pCHExMVZo/AV/6geuVJXG7hljDaWG8+5GDw==", "dependencies": { "lodash.get": "^4.4.2", "lodash.isequal": "^4.5.0", - "validator": "^12.0.0" + "validator": "^13.7.0" }, "bin": { "z-schema": "bin/z-schema" }, "engines": { - "node": ">=6.0.0" + "node": ">=8.0.0" }, "optionalDependencies": { - "commander": "^2.7.1" + "commander": "^2.20.3" } }, "node_modules/z-schema/node_modules/commander": { @@ -3315,32 +3309,14 @@ }, "dependencies": { "@apidevtools/json-schema-ref-parser": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.0.7.tgz", - "integrity": "sha512-QdwOGF1+eeyFh+17v2Tz626WX0nucd1iKOm6JUTUvCZdbolblCOOQCxGrQPY0f7jEhn36PiAWqZnsC2r5vmUWg==", + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.0.9.tgz", + "integrity": "sha512-GBD2Le9w2+lVFoc4vswGI/TjkNIZSVp7+9xPf+X3uidBfWnAeUWmquteSyt0+VCrhNMWj/FTABISQrD3Z/YA+w==", "requires": { "@jsdevtools/ono": "^7.1.3", + "@types/json-schema": "^7.0.6", "call-me-maybe": "^1.0.1", - "js-yaml": "^3.13.1" - }, - "dependencies": { - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - } + "js-yaml": "^4.1.0" } }, "@apidevtools/openapi-schemas": { @@ -3354,46 +3330,16 @@ "integrity": "sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg==" }, "@apidevtools/swagger-parser": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/@apidevtools/swagger-parser/-/swagger-parser-9.0.1.tgz", - "integrity": "sha512-Irqybg4dQrcHhZcxJc/UM4vO7Ksoj1Id5e+K94XUOzllqX1n47HEA50EKiXTCQbykxuJ4cYGIivjx/MRSTC5OA==", - "requires": { - "@apidevtools/json-schema-ref-parser": "^8.0.0", - "@apidevtools/openapi-schemas": "^2.0.2", - "@apidevtools/swagger-methods": "^3.0.0", - "@jsdevtools/ono": "^7.1.0", + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/@apidevtools/swagger-parser/-/swagger-parser-10.0.3.tgz", + "integrity": "sha512-sNiLY51vZOmSPFZA5TF35KZ2HbgYklQnTSDnkghamzLb3EkNtcQnrBQEj5AOCxHpTtXpqMCRM1CrmV2rG6nw4g==", + "requires": { + "@apidevtools/json-schema-ref-parser": "^9.0.6", + "@apidevtools/openapi-schemas": "^2.0.4", + "@apidevtools/swagger-methods": "^3.0.2", + "@jsdevtools/ono": "^7.1.3", "call-me-maybe": "^1.0.1", - "openapi-types": "^1.3.5", - "z-schema": "^4.2.2" - }, - "dependencies": { - "@apidevtools/json-schema-ref-parser": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-8.0.0.tgz", - "integrity": "sha512-n4YBtwQhdpLto1BaUCyAeflizmIbaloGShsPyRtFf5qdFJxfssj+GgLavczgKJFa3Bq+3St2CKcpRJdjtB4EBw==", - "requires": { - "@jsdevtools/ono": "^7.1.0", - "call-me-maybe": "^1.0.1", - "js-yaml": "^3.13.1" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - } + "z-schema": "^5.0.1" } }, "@babel/helper-validator-identifier": { @@ -3415,105 +3361,49 @@ "to-fast-properties": "^2.0.0" } }, + "@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==" + }, "@confio/ics23": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/@confio/ics23/-/ics23-0.6.5.tgz", - "integrity": "sha512-1GdPMsaP/l8JSF4P4HWFLBhdcxHcJT8lS0nknBYNSZ1XrJOsJKUy6EkOwd9Pa1qJkXzY2gyNv7MdHR+AIwSTAg==", + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@confio/ics23/-/ics23-0.6.8.tgz", + "integrity": "sha512-wB6uo+3A50m0sW/EWcU64xpV/8wShZ6bMTa7pF8eYsTrSkQA7oLUIJcs/wb8g4y2Oyq701BaGiO6n/ak5WXO1w==", "requires": { - "js-sha512": "^0.8.0", - "protobufjs": "^6.8.8", - "ripemd160": "^2.0.2", - "sha.js": "^2.4.11" + "@noble/hashes": "^1.0.0", + "protobufjs": "^6.8.8" } }, "@confio/relayer": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@confio/relayer/-/relayer-0.2.0.tgz", - "integrity": "sha512-MbjTwerv+5zixsKU4WkGlq7CcYfMudO9O9/WD99Cvpp387Pum2ualAZ4Li7iBRMqzfnqqoZaPJ3Ybya9j2La7Q==", - "requires": { - "@cosmjs/cosmwasm-stargate": "0.25.5", - "@cosmjs/crypto": "0.25.5", - "@cosmjs/encoding": "0.25.5", - "@cosmjs/faucet-client": "0.25.5", - "@cosmjs/math": "0.25.5", - "@cosmjs/proto-signing": "0.25.5", - "@cosmjs/stargate": "0.25.5", - "@cosmjs/stream": "0.25.5", - "@cosmjs/tendermint-rpc": "0.25.5", - "@cosmjs/utils": "0.25.5", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@confio/relayer/-/relayer-0.5.1.tgz", + "integrity": "sha512-SvUYFze9Mgvj/pjAfhPQXtGw0jd2hE8m1LlRvX/iw2ndkWyHcp2WsgqJosCqDZcuBUrgW0KgqgvwPUv3bKJqbQ==", + "requires": { + "@cosmjs/cosmwasm-stargate": "^0.28.9", + "@cosmjs/crypto": "^0.28.9", + "@cosmjs/encoding": "^0.28.9", + "@cosmjs/faucet-client": "^0.28.9", + "@cosmjs/math": "^0.28.9", + "@cosmjs/proto-signing": "^0.28.9", + "@cosmjs/stargate": "^0.28.9", + "@cosmjs/stream": "^0.28.9", + "@cosmjs/tendermint-rpc": "^0.28.9", + "@cosmjs/utils": "^0.28.9", "ajv": "7.1.1", - "axios": "0.21.1", + "axios": "0.21.4", "commander": "7.1.0", + "cosmjs-types": "^0.4.0", "fast-safe-stringify": "2.0.4", "js-yaml": "4.0.0", "lodash": "4.17.21", "prom-client": "13.1.0", - "protobufjs": "6.10.2", - "table": "6.0.7", + "protobufjs": "^6.10.3", + "table": "^6.7.1", "triple-beam": "1.3.0", "winston": "3.3.3" }, "dependencies": { - "@cosmjs/crypto": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@cosmjs/crypto/-/crypto-0.25.5.tgz", - "integrity": "sha512-i0Nfbk4JXAwyKNGPFu0o1xV6IJUbYmmveySytbU/yweybcZppxoczjSQ1sGrUaLVLvgfcpfwZte3jKqDR67+dg==", - "requires": { - "@cosmjs/encoding": "^0.25.5", - "@cosmjs/math": "^0.25.5", - "@cosmjs/utils": "^0.25.5", - "bip39": "^3.0.2", - "bn.js": "^4.11.8", - "elliptic": "^6.5.3", - "js-sha3": "^0.8.0", - "libsodium-wrappers": "^0.7.6", - "ripemd160": "^2.0.2", - "sha.js": "^2.4.11" - } - }, - "@cosmjs/proto-signing": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@cosmjs/proto-signing/-/proto-signing-0.25.5.tgz", - "integrity": "sha512-YWVp+dGHt7v6ZKjOs8CI9xkpOV49eweHbYMv/vCVYF4cEh0kWwy2WzbWIkUH9zwwUqCxigVOTBYUCfbsjEbfug==", - "requires": { - "@cosmjs/amino": "^0.25.5", - "long": "^4.0.0", - "protobufjs": "~6.10.2" - } - }, - "@cosmjs/stargate": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@cosmjs/stargate/-/stargate-0.25.5.tgz", - "integrity": "sha512-cOZ+fOC16YT7W2vjBnnk9oJfuIlB02KdK6dn6aigMd4mx+7DS2jvNslpQrfKmtrwB9AVsgc6tklBkYwG5qAuKQ==", - "requires": { - "@confio/ics23": "^0.6.3", - "@cosmjs/amino": "^0.25.5", - "@cosmjs/encoding": "^0.25.5", - "@cosmjs/math": "^0.25.5", - "@cosmjs/proto-signing": "^0.25.5", - "@cosmjs/stream": "^0.25.5", - "@cosmjs/tendermint-rpc": "^0.25.5", - "@cosmjs/utils": "^0.25.5", - "long": "^4.0.0", - "protobufjs": "~6.10.2" - } - }, - "@cosmjs/tendermint-rpc": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@cosmjs/tendermint-rpc/-/tendermint-rpc-0.25.5.tgz", - "integrity": "sha512-WlUCFVdhbwA3IDA1C858S8WOtLseZLXKTdj5fz1sTKSBmtrig4l1ZMKHHlZRprvmjSpkpbjgSQU+RjjvBd75BA==", - "requires": { - "@cosmjs/crypto": "^0.25.5", - "@cosmjs/encoding": "^0.25.5", - "@cosmjs/json-rpc": "^0.25.5", - "@cosmjs/math": "^0.25.5", - "@cosmjs/socket": "^0.25.5", - "@cosmjs/stream": "^0.25.5", - "axios": "^0.21.1", - "readonly-date": "^1.0.0", - "xstream": "^11.14.0" - } - }, "ajv": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/ajv/-/ajv-7.1.1.tgz", @@ -3534,194 +3424,63 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.4.tgz", "integrity": "sha512-mNlGUdKOeGNleyrmgbKYtbnCr9KZkZXU7eM89JRo8vY10f7Ul1Fbj07hUBW3N4fC0xM+fmfFfa2zM7mIizhpNQ==" - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" } } }, "@cosmjs/amino": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@cosmjs/amino/-/amino-0.25.5.tgz", - "integrity": "sha512-q9tU2b9hJ3S/KxYCLSyiZCfkaidbSPBr2sJ5HPLxz48y5O4k9sYM7bPa0zioeePaIBnby3AOgyjucVxlbzUlYg==", + "version": "0.28.11", + "resolved": "https://registry.npmjs.org/@cosmjs/amino/-/amino-0.28.11.tgz", + "integrity": "sha512-WJkQQq8gbk5doJJ/3Gcax26I+VC4HdbbSlNdyT5hc6T+U2Jmyry9RLSE+wEZyFMgEabhr43SbIxf64gWZeR8YA==", "requires": { - "@cosmjs/crypto": "^0.25.5", - "@cosmjs/encoding": "^0.25.5", - "@cosmjs/math": "^0.25.5", - "@cosmjs/utils": "^0.25.5" - }, - "dependencies": { - "@cosmjs/crypto": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@cosmjs/crypto/-/crypto-0.25.5.tgz", - "integrity": "sha512-i0Nfbk4JXAwyKNGPFu0o1xV6IJUbYmmveySytbU/yweybcZppxoczjSQ1sGrUaLVLvgfcpfwZte3jKqDR67+dg==", - "requires": { - "@cosmjs/encoding": "^0.25.5", - "@cosmjs/math": "^0.25.5", - "@cosmjs/utils": "^0.25.5", - "bip39": "^3.0.2", - "bn.js": "^4.11.8", - "elliptic": "^6.5.3", - "js-sha3": "^0.8.0", - "libsodium-wrappers": "^0.7.6", - "ripemd160": "^2.0.2", - "sha.js": "^2.4.11" - } - } - } - }, - "@cosmjs/cosmwasm-launchpad": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@cosmjs/cosmwasm-launchpad/-/cosmwasm-launchpad-0.25.5.tgz", - "integrity": "sha512-9/Z8m9rfovtgchN1thcdVBEBXCrh5clVNgpVp1rpbkUSSGA7T5tCR8H1qX0+Yd3HLRh212O5EnCfzzXjNxR21A==", - "requires": { - "@cosmjs/crypto": "^0.25.5", - "@cosmjs/encoding": "^0.25.5", - "@cosmjs/launchpad": "^0.25.5", - "@cosmjs/math": "^0.25.5", - "@cosmjs/utils": "^0.25.5", - "pako": "^2.0.2" - }, - "dependencies": { - "@cosmjs/crypto": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@cosmjs/crypto/-/crypto-0.25.5.tgz", - "integrity": "sha512-i0Nfbk4JXAwyKNGPFu0o1xV6IJUbYmmveySytbU/yweybcZppxoczjSQ1sGrUaLVLvgfcpfwZte3jKqDR67+dg==", - "requires": { - "@cosmjs/encoding": "^0.25.5", - "@cosmjs/math": "^0.25.5", - "@cosmjs/utils": "^0.25.5", - "bip39": "^3.0.2", - "bn.js": "^4.11.8", - "elliptic": "^6.5.3", - "js-sha3": "^0.8.0", - "libsodium-wrappers": "^0.7.6", - "ripemd160": "^2.0.2", - "sha.js": "^2.4.11" - } - }, - "@cosmjs/launchpad": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@cosmjs/launchpad/-/launchpad-0.25.5.tgz", - "integrity": "sha512-7zsFWQHLAiOUBXV/QWvffI/5Ssma67lEO3V01DZ8CtfnWiO4bCSbnU2sslSAH11RkrPdNfRBM7WOBczMMigIzw==", - "requires": { - "@cosmjs/amino": "^0.25.5", - "@cosmjs/crypto": "^0.25.5", - "@cosmjs/encoding": "^0.25.5", - "@cosmjs/math": "^0.25.5", - "@cosmjs/utils": "^0.25.5", - "axios": "^0.21.1", - "fast-deep-equal": "^3.1.3" - } - } + "@cosmjs/crypto": "0.28.11", + "@cosmjs/encoding": "0.28.11", + "@cosmjs/math": "0.28.11", + "@cosmjs/utils": "0.28.11" } }, "@cosmjs/cosmwasm-stargate": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@cosmjs/cosmwasm-stargate/-/cosmwasm-stargate-0.25.5.tgz", - "integrity": "sha512-lUwjXMnVO+8iZtqwKr4hEBgA9q03AqAhUBNNyyG8oeTpgASrQ1ZlLjjmBWgvEpw4JokRduDf7il+NNENjaeAhQ==", - "requires": { - "@cosmjs/amino": "^0.25.5", - "@cosmjs/cosmwasm-launchpad": "^0.25.5", - "@cosmjs/crypto": "^0.25.5", - "@cosmjs/encoding": "^0.25.5", - "@cosmjs/math": "^0.25.5", - "@cosmjs/proto-signing": "^0.25.5", - "@cosmjs/stargate": "^0.25.5", - "@cosmjs/tendermint-rpc": "^0.25.5", - "@cosmjs/utils": "^0.25.5", + "version": "0.28.11", + "resolved": "https://registry.npmjs.org/@cosmjs/cosmwasm-stargate/-/cosmwasm-stargate-0.28.11.tgz", + "integrity": "sha512-sZ04c9ZvwAC7IngNeOhTnHJLBu7PXX3QfWM2vCVGd9puP9f3Hj3nbre75WKjHZ3DDVvxfS3u3JUJ6LjVWeIRuQ==", + "requires": { + "@cosmjs/amino": "0.28.11", + "@cosmjs/crypto": "0.28.11", + "@cosmjs/encoding": "0.28.11", + "@cosmjs/math": "0.28.11", + "@cosmjs/proto-signing": "0.28.11", + "@cosmjs/stargate": "0.28.11", + "@cosmjs/tendermint-rpc": "0.28.11", + "@cosmjs/utils": "0.28.11", + "cosmjs-types": "^0.4.0", "long": "^4.0.0", - "pako": "^2.0.2", - "protobufjs": "~6.10.2" - }, - "dependencies": { - "@cosmjs/crypto": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@cosmjs/crypto/-/crypto-0.25.5.tgz", - "integrity": "sha512-i0Nfbk4JXAwyKNGPFu0o1xV6IJUbYmmveySytbU/yweybcZppxoczjSQ1sGrUaLVLvgfcpfwZte3jKqDR67+dg==", - "requires": { - "@cosmjs/encoding": "^0.25.5", - "@cosmjs/math": "^0.25.5", - "@cosmjs/utils": "^0.25.5", - "bip39": "^3.0.2", - "bn.js": "^4.11.8", - "elliptic": "^6.5.3", - "js-sha3": "^0.8.0", - "libsodium-wrappers": "^0.7.6", - "ripemd160": "^2.0.2", - "sha.js": "^2.4.11" - } - }, - "@cosmjs/proto-signing": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@cosmjs/proto-signing/-/proto-signing-0.25.5.tgz", - "integrity": "sha512-YWVp+dGHt7v6ZKjOs8CI9xkpOV49eweHbYMv/vCVYF4cEh0kWwy2WzbWIkUH9zwwUqCxigVOTBYUCfbsjEbfug==", - "requires": { - "@cosmjs/amino": "^0.25.5", - "long": "^4.0.0", - "protobufjs": "~6.10.2" - } - }, - "@cosmjs/stargate": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@cosmjs/stargate/-/stargate-0.25.5.tgz", - "integrity": "sha512-cOZ+fOC16YT7W2vjBnnk9oJfuIlB02KdK6dn6aigMd4mx+7DS2jvNslpQrfKmtrwB9AVsgc6tklBkYwG5qAuKQ==", - "requires": { - "@confio/ics23": "^0.6.3", - "@cosmjs/amino": "^0.25.5", - "@cosmjs/encoding": "^0.25.5", - "@cosmjs/math": "^0.25.5", - "@cosmjs/proto-signing": "^0.25.5", - "@cosmjs/stream": "^0.25.5", - "@cosmjs/tendermint-rpc": "^0.25.5", - "@cosmjs/utils": "^0.25.5", - "long": "^4.0.0", - "protobufjs": "~6.10.2" - } - }, - "@cosmjs/tendermint-rpc": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@cosmjs/tendermint-rpc/-/tendermint-rpc-0.25.5.tgz", - "integrity": "sha512-WlUCFVdhbwA3IDA1C858S8WOtLseZLXKTdj5fz1sTKSBmtrig4l1ZMKHHlZRprvmjSpkpbjgSQU+RjjvBd75BA==", - "requires": { - "@cosmjs/crypto": "^0.25.5", - "@cosmjs/encoding": "^0.25.5", - "@cosmjs/json-rpc": "^0.25.5", - "@cosmjs/math": "^0.25.5", - "@cosmjs/socket": "^0.25.5", - "@cosmjs/stream": "^0.25.5", - "axios": "^0.21.1", - "readonly-date": "^1.0.0", - "xstream": "^11.14.0" - } - } + "pako": "^2.0.2" } }, "@cosmjs/crypto": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@cosmjs/crypto/-/crypto-0.25.0.tgz", - "integrity": "sha512-zs1zk0JTj5Hbn4IH4WwM5IZ4h+6JHN0SRxvrjZ3ubMC0cjktW7NtMKK07GxQkIvL/Gg+/iLJ3lMk0ft+G84zzA==", - "requires": { - "@cosmjs/encoding": "^0.25.0", - "@cosmjs/math": "^0.25.0", - "@cosmjs/utils": "^0.25.0", - "bip39": "^3.0.2", - "bn.js": "^4.11.8", + "version": "0.28.11", + "resolved": "https://registry.npmjs.org/@cosmjs/crypto/-/crypto-0.28.11.tgz", + "integrity": "sha512-oJXOeBX4FP8bp0ZVydJFcRplErHp8cC6vNoULRck+7hcLuvp9tyv3SBOkBkwxTv81VcQyGCgn7WE0NYEKrpUbw==", + "requires": { + "@cosmjs/encoding": "0.28.11", + "@cosmjs/math": "0.28.11", + "@cosmjs/utils": "0.28.11", + "@noble/hashes": "^1", + "bn.js": "^5.2.0", "elliptic": "^6.5.3", - "js-sha3": "^0.8.0", - "libsodium-wrappers": "^0.7.6", - "pbkdf2": "^3.1.2", - "ripemd160": "^2.0.2", - "sha.js": "^2.4.11", - "unorm": "^1.5.0" + "libsodium-wrappers": "^0.7.6" + }, + "dependencies": { + "bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" + } } }, "@cosmjs/encoding": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@cosmjs/encoding/-/encoding-0.25.5.tgz", - "integrity": "sha512-QT7MaPBiMeCaMJ6VZZKeOqDQlAxMEzTFjBFhbkdyx5DVRc4dPOVO4HbTggmIN5/eizIv4/CNJSVTR//tO53J0A==", + "version": "0.28.11", + "resolved": "https://registry.npmjs.org/@cosmjs/encoding/-/encoding-0.28.11.tgz", + "integrity": "sha512-J7pvlzAt8hBZn316wGRmUlK3xwMgNXUvj4v56DK4fA0fv6VfGwMvVtHCXaqNQtzOGkC6EQcshzA/fL5MBIwu6A==", "requires": { "base64-js": "^1.3.0", "bech32": "^1.1.4", @@ -3729,115 +3488,125 @@ } }, "@cosmjs/faucet-client": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@cosmjs/faucet-client/-/faucet-client-0.25.5.tgz", - "integrity": "sha512-bslIU0Oa9WUPexgwxkQlq2opNAVyBFFMUjlkduricNc9C6/UOR/l6mjB0mt+VU6JTcc9wkxf6wt3wD2dwZQklw==", + "version": "0.28.11", + "resolved": "https://registry.npmjs.org/@cosmjs/faucet-client/-/faucet-client-0.28.11.tgz", + "integrity": "sha512-alQGznExoZKTFWrA7ejyCVWa3t2VI162MY9uDlV0MbeGOcS9GgAtapHUlapd4q1Ynq6PQ35tlLEITpsBR4VJoQ==", "requires": { - "axios": "^0.21.1" + "axios": "^0.21.2" } }, "@cosmjs/json-rpc": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@cosmjs/json-rpc/-/json-rpc-0.25.5.tgz", - "integrity": "sha512-WFDallAolxBqB8V/mYxU0riF/OBoc6Fc2DDsZhds5xOZxeN9sTX0qWhu1UiFyURw4Z9D+SjB9QngqSDBTMTdjw==", + "version": "0.28.11", + "resolved": "https://registry.npmjs.org/@cosmjs/json-rpc/-/json-rpc-0.28.11.tgz", + "integrity": "sha512-YNZTozu5yWHyGGet5Wfc0CcxQezkMr37YaeU9elCaa11ClHlYAQ2NrPpPBOmgnJKsMhzfiKcAE9Sf6f4a0hCxA==", "requires": { - "@cosmjs/stream": "^0.25.5", + "@cosmjs/stream": "0.28.11", "xstream": "^11.14.0" } }, - "@cosmjs/launchpad": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@cosmjs/launchpad/-/launchpad-0.25.0.tgz", - "integrity": "sha512-+ByFM9ZiplO4NpelxS0XulZb1BvWhAesZgkfafg346lPhvbcKEKXKph9ElbDsfJxifXcFEywwGrdIW7pdAxjtQ==", - "requires": { - "@cosmjs/amino": "^0.25.0", - "@cosmjs/crypto": "^0.25.0", - "@cosmjs/encoding": "^0.25.0", - "@cosmjs/math": "^0.25.0", - "@cosmjs/utils": "^0.25.0", - "axios": "^0.21.1", - "fast-deep-equal": "^3.1.3" - } - }, "@cosmjs/math": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@cosmjs/math/-/math-0.25.5.tgz", - "integrity": "sha512-LWovT1uTHlr+VEce27/14Wrgc4INJYOYk1+ncyvbZertixNFH6OMnc9Xkk0DIV4RYmW+/fvB9kCXVnNtQGSuHg==", + "version": "0.28.11", + "resolved": "https://registry.npmjs.org/@cosmjs/math/-/math-0.28.11.tgz", + "integrity": "sha512-MyhPnC4sYu86c2/0PpEeynaPl4nvAmLZH3acPh96SzcjERONbGZjjKtBFPq1avBrev2CCSPrZ4O8u9xpQ4aSvg==", "requires": { - "bn.js": "^4.11.8" + "bn.js": "^5.2.0" + }, + "dependencies": { + "bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" + } } }, "@cosmjs/proto-signing": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@cosmjs/proto-signing/-/proto-signing-0.25.0.tgz", - "integrity": "sha512-5nEYuY4VmzY7ul7WwIL9WI5ZshOXmp/uZrj+L0IppbTvBK0ZRCxfZwJQWfHv7kjJoNfprFapKiZZfKz8LnsCIA==", - "requires": { - "@cosmjs/amino": "^0.25.0", - "long": "^4.0.0", - "protobufjs": "~6.10.2" + "version": "0.28.11", + "resolved": "https://registry.npmjs.org/@cosmjs/proto-signing/-/proto-signing-0.28.11.tgz", + "integrity": "sha512-ym0DpLff+0RBkD/mtFf6wrzyuGhcbcjuDMEdcUWOrJTo6n8DXeRmHkJkyy/mrG3QC4tQX/A81+DhfkANQmgcxw==", + "requires": { + "@cosmjs/amino": "0.28.11", + "@cosmjs/crypto": "0.28.11", + "@cosmjs/encoding": "0.28.11", + "@cosmjs/math": "0.28.11", + "@cosmjs/utils": "0.28.11", + "cosmjs-types": "^0.4.0", + "long": "^4.0.0" } }, "@cosmjs/socket": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@cosmjs/socket/-/socket-0.25.5.tgz", - "integrity": "sha512-wcJVbD4xlF4+5hMum4tOmAy5ppX+E9qrB9Pvt3T7BK+6T5uobxiBQCLEiDwHP3n42RBj+xQWJrScPf5IEWmZKg==", + "version": "0.28.11", + "resolved": "https://registry.npmjs.org/@cosmjs/socket/-/socket-0.28.11.tgz", + "integrity": "sha512-4BhsWN984SLBhwPCD89riQ3SEJzJ1RLJPeP6apIGjhh6pguQZmwa2U/TZjnEUOGnJkUG2FZUH99jRGSTYaIvZg==", "requires": { - "@cosmjs/stream": "^0.25.5", + "@cosmjs/stream": "0.28.11", "isomorphic-ws": "^4.0.1", "ws": "^7", "xstream": "^11.14.0" + }, + "dependencies": { + "@cosmjs/stream": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@cosmjs/stream/-/stream-0.25.6.tgz", + "integrity": "sha512-2mXIzf+WaFd+GSrRaJJETVXeZoC5sosuKChFERxSY8zXQ/f3OaG9J6m+quHpPbU3nAIEtnF1jgBVqJiD+NKwGQ==", + "requires": { + "xstream": "^11.14.0" + } + } } }, "@cosmjs/stargate": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@cosmjs/stargate/-/stargate-0.25.0.tgz", - "integrity": "sha512-XKnh8QDKoYCGGviMSs+JteY1gVVkkBad+mMGcoGrBbvzDFc4Xm7alQDb/JVNWCLmALyIrqmdQ4Nfn1Znpfi9CA==", - "requires": { - "@confio/ics23": "^0.6.3", - "@cosmjs/amino": "^0.25.0", - "@cosmjs/encoding": "^0.25.0", - "@cosmjs/math": "^0.25.0", - "@cosmjs/proto-signing": "^0.25.0", - "@cosmjs/stream": "^0.25.0", - "@cosmjs/tendermint-rpc": "^0.25.0", - "@cosmjs/utils": "^0.25.0", + "version": "0.28.11", + "resolved": "https://registry.npmjs.org/@cosmjs/stargate/-/stargate-0.28.11.tgz", + "integrity": "sha512-UyFH/mTNNKTZohVhj+SmjCRv/xopqU/UinGedmWzs4MqEZteX9xs6D3HTmRCgpmBQ03lpbTslE/FhhT9Hkl9KQ==", + "requires": { + "@confio/ics23": "^0.6.8", + "@cosmjs/amino": "0.28.11", + "@cosmjs/encoding": "0.28.11", + "@cosmjs/math": "0.28.11", + "@cosmjs/proto-signing": "0.28.11", + "@cosmjs/stream": "0.28.11", + "@cosmjs/tendermint-rpc": "0.28.11", + "@cosmjs/utils": "0.28.11", + "cosmjs-types": "^0.4.0", "long": "^4.0.0", - "protobufjs": "~6.10.2" + "protobufjs": "~6.11.3", + "xstream": "^11.14.0" } }, "@cosmjs/stream": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@cosmjs/stream/-/stream-0.25.5.tgz", - "integrity": "sha512-a+0sDNKZTxw9p4j5tl7SI0siMTii7AQot1+5vkH5BkQoAv3C3D8jagPouUz3RUFuh13qftPxPLiHzDFLNSjTnQ==", + "version": "0.28.11", + "resolved": "https://registry.npmjs.org/@cosmjs/stream/-/stream-0.28.11.tgz", + "integrity": "sha512-3b6P4Il8mYzvY2bvEQyzgP+cm0HIGSpHNtuGjiWsQF3Wtp450iVRfEJqdt4+91vvxzfdjQEkQOLMaymnswX3sw==", "requires": { "xstream": "^11.14.0" } }, "@cosmjs/tendermint-rpc": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@cosmjs/tendermint-rpc/-/tendermint-rpc-0.25.0.tgz", - "integrity": "sha512-clQZm30BJBmdHfm02saOoEUt0jFe3OAwVYOysOqFwnPddf6IcygEGnrI7JHjffrOKfKwgLYIwqL2rUeyBmZhtA==", - "requires": { - "@cosmjs/crypto": "^0.25.0", - "@cosmjs/encoding": "^0.25.0", - "@cosmjs/json-rpc": "^0.25.0", - "@cosmjs/math": "^0.25.0", - "@cosmjs/socket": "^0.25.0", - "@cosmjs/stream": "^0.25.0", - "axios": "^0.21.1", + "version": "0.28.11", + "resolved": "https://registry.npmjs.org/@cosmjs/tendermint-rpc/-/tendermint-rpc-0.28.11.tgz", + "integrity": "sha512-TUhWsUYxbKftQmHQK5TBH62vNaKB1ybxoFZ2uJtGMVvY3jcBux7P0Ll/u5nwrM0ETAeo2RjucehJUpGBy9q+HQ==", + "requires": { + "@cosmjs/crypto": "0.28.11", + "@cosmjs/encoding": "0.28.11", + "@cosmjs/json-rpc": "0.28.11", + "@cosmjs/math": "0.28.11", + "@cosmjs/socket": "0.28.11", + "@cosmjs/stream": "0.28.11", + "@cosmjs/utils": "0.28.11", + "axios": "^0.21.2", "readonly-date": "^1.0.0", "xstream": "^11.14.0" } }, "@cosmjs/utils": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@cosmjs/utils/-/utils-0.25.5.tgz", - "integrity": "sha512-U4YdgJadFgXWblthgyXqP28Yw5rsw2IX/cOES0pa6fiB81hoYl2LXqXiuKp2yVPoAgk8JpkFh3i5KchcD9muJg==" + "version": "0.28.11", + "resolved": "https://registry.npmjs.org/@cosmjs/utils/-/utils-0.28.11.tgz", + "integrity": "sha512-FXVEr7Pg6MX9VbY5NemuKbtFVabSlUlArWIV+R74FQg5LIuSa+0QkxSpNldCuOLBEU4/GlrzybT4uEl338vSzg==" }, "@dabh/diagnostics": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.2.tgz", - "integrity": "sha512-+A1YivoVDNNVCdfozHSR8v/jyuuLTMXwjWuxPFlFlUapXoGc+Gj9mDlTDDfrwl7rXCl2tNZ0kE8sIBO6YOn96Q==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", + "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", "requires": { "colorspace": "1.1.x", "enabled": "2.0.x", @@ -3845,15 +3614,20 @@ } }, "@exodus/schemasafe": { - "version": "1.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@exodus/schemasafe/-/schemasafe-1.0.0-rc.3.tgz", - "integrity": "sha512-GoXw0U2Qaa33m3eUcxuHnHpNvHjNlLo0gtV091XBpaRINaB4X6FGCG5XKxSFNFiPpugUDqNruHzaqpTdDm4AOg==" + "version": "1.0.0-rc.6", + "resolved": "https://registry.npmjs.org/@exodus/schemasafe/-/schemasafe-1.0.0-rc.6.tgz", + "integrity": "sha512-dDnQizD94EdBwEj/fh3zPRa/HWCS9O5au2PuHhZBbuM3xWHxuaKzPBOEWze7Nn0xW68MIpZ7Xdyn1CoCpjKCuQ==" }, "@jsdevtools/ono": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==" }, + "@noble/hashes": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.1.2.tgz", + "integrity": "sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA==" + }, "@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -3931,26 +3705,52 @@ "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=" }, + "@sinonjs/commons": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", + "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/fake-timers": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", + "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", + "requires": { + "@sinonjs/commons": "^1.7.0" + } + }, + "@sinonjs/samsam": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-5.3.1.tgz", + "integrity": "sha512-1Hc0b1TtyfBu8ixF/tpfSHTVWKwCBLY4QJbkgnE7HcwyvT2xArDxb4K7dMgqRm3szI+LJbzmW/s4xxEhv6hwDg==", + "requires": { + "@sinonjs/commons": "^1.6.0", + "lodash.get": "^4.4.2", + "type-detect": "^4.0.8" + } + }, + "@sinonjs/text-encoding": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", + "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==" + }, "@types/long": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==" }, "@types/node": { - "version": "13.13.45", - "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.45.tgz", - "integrity": "sha512-703YTEp8AwQeapI0PTXDOj+Bs/mtdV/k9VcTP7z/de+lx6XjFMKdB+JhKnK+6PZ5za7omgZ3V6qm/dNkMj/Zow==" + "version": "13.13.52", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.52.tgz", + "integrity": "sha512-s3nugnZumCC//n4moGGe6tkNMyYEdaDBitVjwPxXmR5lnMG5dHePinH2EdxkG3Rh1ghFHHixAG4NJhpJW1rthQ==" }, "@types/object-hash": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/@types/object-hash/-/object-hash-1.3.4.tgz", "integrity": "sha512-xFdpkAkikBgqBdG9vIlsqffDV8GpvnPEzs0IUtr1v3BEB97ijsFQ4RXVbUZwjFThhB4MDSTUfvmxUD5PGx0wXA==" }, - "@types/prettier": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-1.19.1.tgz", - "integrity": "sha512-5qOlnZscTn4xxM5MeGXAMOsIOIKIbh9e85zJWfBRVPlRMEVawzoPhINYbRGkBZCI8LxvBe7tJCdWiarA99OZfQ==" - }, "@types/swagger-schema-official": { "version": "2.0.21", "resolved": "https://registry.npmjs.org/@types/swagger-schema-official/-/swagger-schema-official-2.0.21.tgz", @@ -3964,10 +3764,21 @@ "debug": "4" } }, + "ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "ansi-styles": { "version": "4.3.0", @@ -3989,6 +3800,35 @@ "requires": { "delegates": "^1.0.0", "readable-stream": "^2.0.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, "argparse": { @@ -4007,9 +3847,9 @@ "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==" }, "async": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", - "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==" + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", + "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==" }, "at-least-node": { "version": "1.0.0", @@ -4017,11 +3857,11 @@ "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" }, "axios": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", - "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", "requires": { - "follow-redirects": "^1.10.0" + "follow-redirects": "^1.14.0" } }, "base64-js": { @@ -4039,24 +3879,6 @@ "resolved": "https://registry.npmjs.org/bintrees/-/bintrees-1.0.1.tgz", "integrity": "sha1-DmVcm5wkNeqraL9AJyJtK1WjRSQ=" }, - "bip39": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/bip39/-/bip39-3.0.3.tgz", - "integrity": "sha512-P0dKrz4g0V0BjXfx7d9QNkJ/Txcz/k+hM9TnjqjUaXtuOfAvxXSw2rJw8DX0e3ZPwnK/IgDxoRqf0bvoVCqbMg==", - "requires": { - "@types/node": "11.11.6", - "create-hash": "^1.1.0", - "pbkdf2": "^3.0.9", - "randombytes": "^2.0.1" - }, - "dependencies": { - "@types/node": { - "version": "11.11.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-11.11.6.tgz", - "integrity": "sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ==" - } - } - }, "bl": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", @@ -4065,18 +3887,6 @@ "buffer": "^5.5.0", "inherits": "^2.0.4", "readable-stream": "^3.4.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } } }, "bn.js": { @@ -4125,15 +3935,6 @@ "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, "cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", @@ -4142,6 +3943,36 @@ "string-width": "^4.2.0", "strip-ansi": "^6.0.0", "wrap-ansi": "^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } } }, "code-point-at": { @@ -4150,12 +3981,12 @@ "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, "color": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/color/-/color-3.0.0.tgz", - "integrity": "sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", "requires": { - "color-convert": "^1.9.1", - "color-string": "^1.5.2" + "color-convert": "^1.9.3", + "color-string": "^1.6.0" }, "dependencies": { "color-convert": { @@ -4187,32 +4018,27 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "color-string": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.5.tgz", - "integrity": "sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.0.tgz", + "integrity": "sha512-9Mrz2AQLefkH1UvASKj6v6hj/7eWgjnT/cVsR8CumieLoT+g900exWeNogqtweI8dxloXN9BDQTYro1oWu/5CQ==", "requires": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" } }, - "colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==" - }, "colorspace": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.2.tgz", - "integrity": "sha512-vt+OoIP2d76xLhjwbBaucYlNSpPsrJWPlBTtwCpQKIu6/CSMutyzX93O/Do0qzpH3YoHEes8YEFXyZ797rEhzQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", + "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", "requires": { - "color": "3.0.x", + "color": "^3.1.3", "text-hex": "1.0.x" } }, "commander": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", - "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==" + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.1.0.tgz", + "integrity": "sha512-pRxBna3MJe6HKnBGsDyMv8ETbptw3axEdYHoqNh7gu5oDcew8fs0xnivZGm06Ogk8zGAJ9VX+OPEr2GXEQK4dg==" }, "console-control-strings": { "version": "1.1.0", @@ -4220,33 +4046,17 @@ "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" }, "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "cosmjs-types": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cosmjs-types/-/cosmjs-types-0.4.1.tgz", + "integrity": "sha512-I7E/cHkIgoJzMNQdFF0YVqPlaTqrqKHrskuSTIqlEyxfB5Lf3WKCajSXVK2yHOfOFfSux/RxEdpMzw/eO4DIog==", "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" + "long": "^4.0.0", + "protobufjs": "~6.11.2" } }, "dataloader": { @@ -4260,13 +4070,6 @@ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { "ms": "2.1.2" - }, - "dependencies": { - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } } }, "decompress-response": { @@ -4288,11 +4091,12 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" }, "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", "requires": { - "object-keys": "^1.0.12" + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" } }, "delegates": { @@ -4305,6 +4109,11 @@ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==" + }, "dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -4383,9 +4192,9 @@ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" }, "eta": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/eta/-/eta-1.12.1.tgz", - "integrity": "sha512-H8npoci2J/7XiPnVcCVulBSPsTNGvGaINyMjQDU8AFqp9LGsEYS88g2CiU+d01Sg44WtX7o4nb8wUJ9vnI+tiA==" + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/eta/-/eta-1.12.3.tgz", + "integrity": "sha512-qHixwbDLtekO/d51Yr4glcaUJCIjGVJyTzuqV4GPlgZo1YpgOKG+avQynErZIYrfM6JIJdtiG2Kox8tbb+DoGg==" }, "expand-template": { "version": "2.0.3", @@ -4415,9 +4224,9 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" }, "fast-safe-stringify": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", - "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==" + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.4.tgz", + "integrity": "sha512-mNlGUdKOeGNleyrmgbKYtbnCr9KZkZXU7eM89JRo8vY10f7Ul1Fbj07hUBW3N4fC0xM+fmfFfa2zM7mIizhpNQ==" }, "fastq": { "version": "1.13.0", @@ -4428,9 +4237,9 @@ } }, "fecha": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.1.tgz", - "integrity": "sha512-MMMQ0ludy/nBs1/o0zVOiKTpG7qMbonKUzjJgQFEuvq6INZ1OraKPRAWkBq5vlKLOUMpmNYG1JoN3oDPUQ9m3Q==" + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.2.tgz", + "integrity": "sha512-5rOQWkBVz3FnYWTi/ELZmq4CoK1Pb+xKNZWuJRsOwo0+8DrP43CrWJtyLVvb5U7z7ggE5llahfDbLjaVNzXVJQ==" }, "fill-range": { "version": "7.0.1", @@ -4446,9 +4255,9 @@ "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" }, "follow-redirects": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.2.tgz", - "integrity": "sha512-6mPTgLxYm3r6Bkkg0vNM0HTjfGrOEtsfbhagQvbxDEsEkpNhw582upBaoRZylzen6krEmxXJgt9Ju6HiI4O7BA==" + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", + "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==" }, "from2": { "version": "2.3.0", @@ -4457,6 +4266,35 @@ "requires": { "inherits": "^2.0.1", "readable-stream": "^2.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, "fs-constants": { @@ -4493,39 +4331,6 @@ "string-width": "^1.0.1", "strip-ansi": "^3.0.1", "wide-align": "^1.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" - } - } } }, "get-caller-file": { @@ -4533,6 +4338,16 @@ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, "github-from-package": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", @@ -4568,9 +4383,9 @@ } }, "graceful-fs": { - "version": "4.2.9", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", - "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" }, "has": { "version": "1.0.3", @@ -4585,38 +4400,24 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, + "has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "requires": { + "get-intrinsic": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, "has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" }, - "hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "requires": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - } - } - }, "hash.js": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", @@ -4637,14 +4438,14 @@ } }, "http2-client": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/http2-client/-/http2-client-1.3.3.tgz", - "integrity": "sha512-nUxLymWQ9pzkzTmir24p2RtsgruLmhje7lH3hLX1IpwvyTg77fW+1brenPPP3USAR+rQ36p5sTA/x7sjCJVkAA==" + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/http2-client/-/http2-client-1.3.5.tgz", + "integrity": "sha512-EC2utToWl4RKfs5zd36Mxq7nzHHBuomZboI0yYL6Y0RmBgT7Sgkq4rQ0ezFTYoIsSs7Tm9SJe+o2FcAg6GBhGA==" }, "https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "requires": { "agent-base": "6", "debug": "4" @@ -4685,9 +4486,9 @@ "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" }, "is-core-module": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", - "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", + "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", "requires": { "has": "^1.0.3" } @@ -4698,9 +4499,12 @@ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" }, "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } }, "is-glob": { "version": "4.0.3", @@ -4716,9 +4520,9 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" }, "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" }, "isarray": { "version": "1.0.0", @@ -4731,37 +4535,32 @@ "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==", "requires": {} }, - "js-sha3": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", - "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" - }, - "js-sha512": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/js-sha512/-/js-sha512-0.8.0.tgz", - "integrity": "sha512-PWsmefG6Jkodqt+ePTvBZCSMFgN7Clckjd0O7su3I0+BW2QWUTJNzjktHsztGLhncP2h8mcF9V9Y2Ha59pAViQ==" - }, "js-yaml": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.0.0.tgz", - "integrity": "sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "requires": { "argparse": "^2.0.1" } }, "json-rpc-2.0": { - "version": "0.2.16", - "resolved": "https://registry.npmjs.org/json-rpc-2.0/-/json-rpc-2.0-0.2.16.tgz", - "integrity": "sha512-nXKBcNZxkoeyKpotT/T3tciv+e7EQb13nuDRLD2tff8Vs39VpPTOvL0BOXM3mN5QE10BlVEq5LDSV344m4zpeg==" + "version": "0.2.19", + "resolved": "https://registry.npmjs.org/json-rpc-2.0/-/json-rpc-2.0-0.2.19.tgz", + "integrity": "sha512-tegZKneDQjWintJS5Zlw8xNvJK0/xq4sct2M5AgfFmcCJFMjvrLgk1noH7OPfFgEQ+ScueuWdaGfikCPr+qBtg==" }, "json-schema-ref-parser": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/json-schema-ref-parser/-/json-schema-ref-parser-9.0.7.tgz", - "integrity": "sha512-uxU9Ix+MVszvCTvBucQiIcNEny3oAEFg7EQHSZw2bquCCuqUqEPEczIdv/Uqo1Zv4/wDPZqOI+ulrMk1ncMtjQ==", + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/json-schema-ref-parser/-/json-schema-ref-parser-9.0.9.tgz", + "integrity": "sha512-qcP2lmGy+JUoQJ4DOQeLaZDqH9qSkeGCK3suKWxJXS82dg728Mn3j97azDMaOUmJAN4uCq91LdPx4K7E8F1a7Q==", "requires": { - "@apidevtools/json-schema-ref-parser": "9.0.7" + "@apidevtools/json-schema-ref-parser": "9.0.9" } }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, "jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", @@ -4771,6 +4570,11 @@ "universalify": "^2.0.0" } }, + "just-extend": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", + "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==" + }, "kuler": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", @@ -4786,14 +4590,14 @@ } }, "libsodium": { - "version": "0.7.9", - "resolved": "https://registry.npmjs.org/libsodium/-/libsodium-0.7.9.tgz", - "integrity": "sha512-gfeADtR4D/CM0oRUviKBViMGXZDgnFdMKMzHsvBdqLBHd9ySi6EtYnmuhHVDDYgYpAO8eU8hEY+F8vIUAPh08A==" + "version": "0.7.10", + "resolved": "https://registry.npmjs.org/libsodium/-/libsodium-0.7.10.tgz", + "integrity": "sha512-eY+z7hDrDKxkAK+QKZVNv92A5KYkxfvIshtBJkmg5TSiCnYqZP3i9OO9whE79Pwgm4jGaoHgkM4ao/b9Cyu4zQ==" }, "libsodium-wrappers": { - "version": "0.7.9", - "resolved": "https://registry.npmjs.org/libsodium-wrappers/-/libsodium-wrappers-0.7.9.tgz", - "integrity": "sha512-9HaAeBGk1nKTRFRHkt7nzxqCvnkWTjn1pdjKgcUnZxj0FyOP4CnhgFhMdrFfgNsukijBGyBLpP2m2uKT1vuWhQ==", + "version": "0.7.10", + "resolved": "https://registry.npmjs.org/libsodium-wrappers/-/libsodium-wrappers-0.7.10.tgz", + "integrity": "sha512-pO3F1Q9NPLB/MWIhehim42b/Fwb30JNScCNh8TcQ/kIc+qGLQch8ag8wb0keK3EP5kbGakk1H8Wwo7v+36rNQg==", "requires": { "libsodium": "^0.7.0" } @@ -4813,15 +4617,20 @@ "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" }, + "lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==" + }, "logform": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/logform/-/logform-2.2.0.tgz", - "integrity": "sha512-N0qPlqfypFx7UHNn4B3lzS/b0uLqt2hmuoa+PpuXNYgozdJYAyauF5Ky0BWVjrxDlMWiT3qN4zPq3vVAfZy7Yg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.4.0.tgz", + "integrity": "sha512-CPSJw4ftjf517EhXZGGvTHHkYobo7ZCc0kvwUoOYcjfR2UVrI66RHj8MCrfAdEitdmFqbu2BYdYs8FHHZSb6iw==", "requires": { - "colors": "^1.2.1", - "fast-safe-stringify": "^2.0.4", + "@colors/colors": "1.5.0", "fecha": "^4.2.0", "ms": "^2.1.1", + "safe-stable-stringify": "^2.3.1", "triple-beam": "^1.3.0" } }, @@ -4846,16 +4655,6 @@ "semver": "^6.0.0" } }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, "merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -4886,9 +4685,9 @@ "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" }, "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" }, "mkdirp-classic": { "version": "0.5.3", @@ -4896,9 +4695,9 @@ "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" }, "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "multistream": { "version": "4.1.0", @@ -4907,30 +4706,30 @@ "requires": { "once": "^1.4.0", "readable-stream": "^3.6.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } } }, "nanoid": { - "version": "3.1.20", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz", - "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==" + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.2.tgz", + "integrity": "sha512-CuHBogktKwpm5g2sRgv83jEy2ijFzBwMoYA60orPDR7ynsLijJDqgsi4RDGj3OJpy3Ieb+LYwiRmIOGyytgITA==" }, "napi-build-utils": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" }, + "nise": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/nise/-/nise-4.1.0.tgz", + "integrity": "sha512-eQMEmGN/8arp0xsvGoQ+B1qvSkR73B1nWSCh7nOt5neMCtwcQVYQGdzQMhcNscktTsWB54xnlSQFzOAPJD8nXA==", + "requires": { + "@sinonjs/commons": "^1.7.0", + "@sinonjs/fake-timers": "^6.0.0", + "@sinonjs/text-encoding": "^0.7.1", + "just-extend": "^4.0.2", + "path-to-regexp": "^1.7.0" + } + }, "node-abi": { "version": "2.30.1", "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.30.1.tgz", @@ -4992,12 +4791,19 @@ "integrity": "sha512-pJTS2+T0oGIwgjGpw7sIRU8RQMcUoKCDWFLdBqKB2BNmGpbBMH2sdqAaOXUg8OzonZHU0L7vfJu1mJFEiYDWOQ==", "requires": { "fast-safe-stringify": "^2.0.7" + }, + "dependencies": { + "fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" + } } }, "oas-linter": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/oas-linter/-/oas-linter-3.2.1.tgz", - "integrity": "sha512-e5G6bbq3Nrfxm+SDPR5AiZ6n2smVUmhLA1OgI2/Bl8e2ywfWsKw/yuqrwiXXiNHb1wdM/GyPMX6QjCGJODlaaA==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/oas-linter/-/oas-linter-3.2.2.tgz", + "integrity": "sha512-KEGjPDVoU5K6swgo9hJVA/qYGlwfbFx+Kg2QB/kd7rzV5N8N5Mg6PlsoCMohVnQmo+pzJap/F610qTodKzecGQ==", "requires": { "@exodus/schemasafe": "^1.0.0-rc.2", "should": "^13.2.1", @@ -5005,15 +4811,64 @@ } }, "oas-resolver": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/oas-resolver/-/oas-resolver-2.5.4.tgz", - "integrity": "sha512-1vIj5Wkjmi+kZj5sFamt95LkuXoalmoKUohtaUQoCQZjLfPFaY8uZ7nw6IZaWuE6eLON2b6xrXhxD4hiTdYl0g==", + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/oas-resolver/-/oas-resolver-2.5.6.tgz", + "integrity": "sha512-Yx5PWQNZomfEhPPOphFbZKi9W93CocQj18NlD2Pa4GWZzdZpSJvYwoiuurRI7m3SpcChrnO08hkuQDL3FGsVFQ==", "requires": { "node-fetch-h2": "^2.3.0", "oas-kit-common": "^1.0.8", - "reftools": "^1.1.8", + "reftools": "^1.1.9", "yaml": "^1.10.0", - "yargs": "^16.1.1" + "yargs": "^17.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "yargs": { + "version": "17.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.4.1.tgz", + "integrity": "sha512-WSZD9jgobAg3ZKuCQZSa3g9QOJeCCqLoLAykiWgmXnDo9EPnn4RPf5qVTtzgOx66o6/oqhcA5tHtJXpG8pMt3g==", + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.0.0" + } + }, + "yargs-parser": { + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz", + "integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==" + } } }, "oas-schema-walker": { @@ -5022,16 +4877,16 @@ "integrity": "sha512-2yucenq1a9YPmeNExoUa9Qwrt9RFkjqaMAA1X+U7sbb0AqBeTIdMHky9SQQ6iN94bO5NW0W4TRYXerG+BdAvAQ==" }, "oas-validator": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/oas-validator/-/oas-validator-5.0.5.tgz", - "integrity": "sha512-d10yy6xlhRTh6np44k2U0gm5M66pioYTllH8J1ZTj+WSY3cpTvU+Dt51iWOT85HJqyGHo0RZKXF3u/NGQWDFgg==", + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/oas-validator/-/oas-validator-5.0.8.tgz", + "integrity": "sha512-cu20/HE5N5HKqVygs3dt94eYJfBi0TsZvPVXDhbXQHiEityDN+RROTleefoKRKKJ9dFAF2JBkDHgvWj0sjKGmw==", "requires": { "call-me-maybe": "^1.0.1", "oas-kit-common": "^1.0.8", - "oas-linter": "^3.2.1", - "oas-resolver": "^2.5.4", + "oas-linter": "^3.2.2", + "oas-resolver": "^2.5.6", "oas-schema-walker": "^1.1.5", - "reftools": "^1.1.8", + "reftools": "^1.1.9", "should": "^13.2.1", "yaml": "^1.10.0" } @@ -5068,9 +4923,10 @@ } }, "openapi-types": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-1.3.5.tgz", - "integrity": "sha512-11oi4zYorsgvg5yBarZplAqbpev5HkuVNPlZaPTknPDzAynq+lnJdXAmruGWP0s+dNYZS7bjM+xrTpJw7184Fg==" + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-11.0.0.tgz", + "integrity": "sha512-GB+QO6o1hAtKsb8tP3/FTD5jpkdKrf42L4Gel9UySngMurzr+Q9pO+dtnmySQCzoCEfJr39IH6bveEn71xNcVg==", + "peer": true }, "optionator": { "version": "0.8.3", @@ -5091,39 +4947,42 @@ "integrity": "sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==" }, "pako": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pako/-/pako-2.0.3.tgz", - "integrity": "sha512-WjR1hOeg+kki3ZIOjaf4b5WVcay1jaliKSYiEaB1XzwhMQZJxRdQRv0V31EKBYlxb4T7SK3hjfc/jxyU64BoSw==" + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pako/-/pako-2.0.4.tgz", + "integrity": "sha512-v8tweI900AUkZN6heMU/4Uy4cXRc2AYNRggVmTR+dEncawDJgCdLMximOVA2p4qO57WMynangsfGRb5WD6L1Bg==" }, "path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, + "path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "requires": { + "isarray": "0.0.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + } + } + }, "path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" }, - "pbkdf2": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, "picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" }, "pkg": { - "version": "git+ssh://git@github.com/vercel/pkg.git#edfcc7b139d667d6be0e46f4101e917ca9c154bd", + "version": "git+ssh://git@github.com/vercel/pkg.git#8cd98af1ad7ab74df40fa9ffd5e6decdfb298969", "from": "pkg@github:vercel/pkg#main", "requires": { "@babel/parser": "7.16.2", @@ -5135,7 +4994,7 @@ "into-stream": "^6.0.0", "minimist": "^1.2.5", "multistream": "^4.1.0", - "pkg-fetch": "3.2.6", + "pkg-fetch": "3.3.0", "prebuild-install": "6.1.4", "progress": "^2.0.3", "resolve": "^1.20.0", @@ -5144,9 +5003,9 @@ } }, "pkg-fetch": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/pkg-fetch/-/pkg-fetch-3.2.6.tgz", - "integrity": "sha512-Q8fx6SIT022g0cdSE4Axv/xpfHeltspo2gg1KsWRinLQZOTRRAtOOaEFghA1F3jJ8FVsh8hGrL/Pb6Ea5XHIFw==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/pkg-fetch/-/pkg-fetch-3.3.0.tgz", + "integrity": "sha512-xJnIZ1KP+8rNN+VLafwu4tEeV4m8IkFBDdCFqmAJz9K1aiXEtbARmdbEe6HlXWGSVuShSHjFXpfkKRkDBQ5kiA==", "requires": { "chalk": "^4.1.2", "fs-extra": "^9.1.0", @@ -5156,16 +5015,6 @@ "semver": "^7.3.5", "tar-fs": "^2.1.1", "yargs": "^16.2.0" - }, - "dependencies": { - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "requires": { - "lru-cache": "^6.0.0" - } - } } }, "prebuild-install": { @@ -5194,9 +5043,9 @@ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" }, "prettier": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.2.1.tgz", - "integrity": "sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q==" + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.6.2.tgz", + "integrity": "sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew==" }, "process-nextick-args": { "version": "2.0.1", @@ -5217,9 +5066,9 @@ } }, "protobufjs": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.10.2.tgz", - "integrity": "sha512-27yj+04uF6ya9l+qfpH187aqEzfCF4+Uit0I9ZBQVqK09hk/SQzKa2MUqUpXaVa7LOFRg1TSSr3lVxGOk6c0SQ==", + "version": "6.11.3", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.3.tgz", + "integrity": "sha512-xL96WDdCZYdU7Slin569tFX712BxsxslWwAfAhCYjQKGTq7dAU91Lomy6nLLhh/dyGhk/YH4TwTSRxTzhuHyZg==", "requires": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", @@ -5232,7 +5081,7 @@ "@protobufjs/pool": "^1.1.0", "@protobufjs/utf8": "^1.1.0", "@types/long": "^4.0.1", - "@types/node": "^13.7.0", + "@types/node": ">=13.7.0", "long": "^4.0.0" } }, @@ -5255,14 +5104,6 @@ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "requires": { - "safe-buffer": "^5.1.0" - } - }, "rc": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", @@ -5275,17 +5116,13 @@ } }, "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" } }, "readonly-date": { @@ -5294,9 +5131,9 @@ "integrity": "sha512-tMKIV7hlk0h4mO3JTmmVuIlJVXjKk3Sep9Bf5OH0O+758ruuVkUy2J9SttDLm91IEX/WHlXPSpxMGjPj4beMIQ==" }, "reftools": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/reftools/-/reftools-1.1.8.tgz", - "integrity": "sha512-Yvz9NH8uFHzD/AXX82Li1GdAP6FzDBxEZw+njerNBBQv/XHihqsWAjNfXtaq4QD2l4TEZVnp4UbktdYSegAM3g==" + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/reftools/-/reftools-1.1.9.tgz", + "integrity": "sha512-OVede/NQE13xBQ+ob5CKd5KyeJYU2YInb1bmV4nRoOfquZPkAkxuOXicSe1PvqIuZZ4kD13sPKBbR7UFDmli6w==" }, "require-directory": { "version": "2.1.1", @@ -5309,12 +5146,13 @@ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" }, "resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", + "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", "requires": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" } }, "reusify": { @@ -5322,15 +5160,6 @@ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, "run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -5340,29 +5169,28 @@ } }, "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "safe-stable-stringify": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.3.1.tgz", + "integrity": "sha512-kYBSfT+troD9cDA85VDnHZ1rpHC50O0g1e6WlGHVCz/g+JS+9WKLj+XwFYyR8UbrZN8ll9HUpDAAddY58MGisg==" }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "requires": { + "lru-cache": "^6.0.0" + } }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, "should": { "version": "13.2.3", "resolved": "https://registry.npmjs.org/should/-/should-13.2.3.tgz", @@ -5439,6 +5267,19 @@ "is-arrayish": "^0.3.1" } }, + "sinon": { + "version": "9.2.4", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-9.2.4.tgz", + "integrity": "sha512-zljcULZQsJxVra28qIAL6ow1Z9tpattkCTEJR4RBP3TGc00FcttsP5pK284Nas5WjMZU5Yzy3kAIp3B3KRf5Yg==", + "requires": { + "@sinonjs/commons": "^1.8.1", + "@sinonjs/fake-timers": "^6.0.1", + "@sinonjs/samsam": "^5.3.1", + "diff": "^4.0.2", + "nise": "^4.0.4", + "supports-color": "^7.1.0" + } + }, "slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -5452,6 +5293,13 @@ "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", "is-fullwidth-code-point": "^3.0.0" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + } } }, "source-map": { @@ -5460,11 +5308,6 @@ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "optional": true }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" - }, "stack-trace": { "version": "0.0.10", "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", @@ -5487,21 +5330,21 @@ } }, "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" + "strip-ansi": "^6.0.1" } }, "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "requires": { - "ansi-regex": "^5.0.0" + "ansi-regex": "^5.0.1" } }, "strip-json-comments": { @@ -5517,46 +5360,32 @@ "has-flag": "^4.0.0" } }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, "swagger-combine": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/swagger-combine/-/swagger-combine-1.3.0.tgz", - "integrity": "sha512-3L/UA3iwQUh2DZZF8xuMXHM7ERilLIro7v49zJV4DhmTs/KyaW/+tsVkHGoMKR00/YnrF1lasRm1E9A5fsq/TQ==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/swagger-combine/-/swagger-combine-1.4.0.tgz", + "integrity": "sha512-nVQPzSGixSJ6U3BSTBYswIbamumNCz1ZXPqnCrXYz6BHlSeOtfGKuyZ+sAWtpOepUFuOu93x+VOIzAxLKK6xYw==", "requires": { "call-me-maybe": "^1.0.1", - "js-yaml": "^3.13.1", - "json-schema-ref-parser": "^9.0.1", - "lodash": "^4.17.15", + "js-yaml": "^4.1.0", + "json-schema-ref-parser": "^9.0.9", + "lodash": "^4.17.21", "minimist": "^1.2.5", - "swagger-parser": "^9.0.1", + "swagger-parser": "^10.0.3", "traverse": "^0.6.6", "url-join": "^4.0.1" - }, - "dependencies": { - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - } } }, "swagger-parser": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/swagger-parser/-/swagger-parser-9.0.1.tgz", - "integrity": "sha512-oxOHUaeNetO9ChhTJm2fD+48DbGbLD09ZEOwPOWEqcW8J6zmjWxutXtSuOiXsoRgDWvORYlImbwM21Pn+EiuvQ==", + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/swagger-parser/-/swagger-parser-10.0.3.tgz", + "integrity": "sha512-nF7oMeL4KypldrQhac8RyHerJeGPD1p2xDh900GPvc+Nk7nWP6jX2FcC7WmkinMoAmoO774+AFXcWsW8gMWEIg==", "requires": { - "@apidevtools/swagger-parser": "9.0.1" + "@apidevtools/swagger-parser": "10.0.3" } }, "swagger-schema-official": { @@ -5581,24 +5410,80 @@ "swagger-schema-official": "2.0.0-bab6bed", "swagger2openapi": "^7.0.5", "typescript": "^4.1.3" + }, + "dependencies": { + "commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==" + } } }, "swagger2openapi": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/swagger2openapi/-/swagger2openapi-7.0.5.tgz", - "integrity": "sha512-Hzxse+VTX0u8xBgYJ665EjO6BfvW2PN9Yv+yIjBDm6ga9jl83+4CEdCCpznH+ILr5MS8bIIXB+XcQUM3u25w4g==", + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/swagger2openapi/-/swagger2openapi-7.0.8.tgz", + "integrity": "sha512-upi/0ZGkYgEcLeGieoz8gT74oWHA0E7JivX7aN9mAf+Tc7BQoRBvnIGHoPDw+f9TXTW4s6kGYCZJtauP6OYp7g==", "requires": { "call-me-maybe": "^1.0.1", "node-fetch": "^2.6.1", "node-fetch-h2": "^2.3.0", "node-readfiles": "^0.2.0", "oas-kit-common": "^1.0.8", - "oas-resolver": "^2.5.4", + "oas-resolver": "^2.5.6", "oas-schema-walker": "^1.1.5", - "oas-validator": "^5.0.5", - "reftools": "^1.1.8", + "oas-validator": "^5.0.8", + "reftools": "^1.1.9", "yaml": "^1.10.0", - "yargs": "^16.1.1" + "yargs": "^17.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "yargs": { + "version": "17.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.4.1.tgz", + "integrity": "sha512-WSZD9jgobAg3ZKuCQZSa3g9QOJeCCqLoLAykiWgmXnDo9EPnn4RPf5qVTtzgOx66o6/oqhcA5tHtJXpG8pMt3g==", + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.0.0" + } + }, + "yargs-parser": { + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz", + "integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==" + } } }, "symbol-observable": { @@ -5607,32 +5492,15 @@ "integrity": "sha512-sQV7phh2WCYAn81oAkakC5qjq2Ml0g8ozqz03wOGnx9dDlG1de6yrF+0RAzSJD8fPUow3PTSMf2SAbOGxb93BA==" }, "table": { - "version": "6.0.7", - "resolved": "https://registry.npmjs.org/table/-/table-6.0.7.tgz", - "integrity": "sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g==", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.0.tgz", + "integrity": "sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==", "requires": { - "ajv": "^7.0.2", - "lodash": "^4.17.20", + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", "slice-ansi": "^4.0.0", - "string-width": "^4.2.0" - }, - "dependencies": { - "ajv": { - "version": "7.2.4", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-7.2.4.tgz", - "integrity": "sha512-nBeQgg/ZZA3u3SYxyaDvpvDtgZ/EZPF547ARgZBrG9Bhu1vKDwAIjtIf+sDtJUKa2zOcEbmRLBRSyMraS/Oy1A==", - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - } + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" } }, "tar-fs": { @@ -5656,18 +5524,6 @@ "fs-constants": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^3.1.1" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } } }, "tdigest": { @@ -5712,33 +5568,33 @@ "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" }, "ts-poet": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/ts-poet/-/ts-poet-4.5.0.tgz", - "integrity": "sha512-Vs2Zsiz3zf5qdFulFTIEpaLdgWeHXKh+4pv+ycVqEh+ZuUOVGrN0i9lbxVx7DB1FBogExytz3OuaBMJfWffpSQ==", + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/ts-poet/-/ts-poet-4.11.0.tgz", + "integrity": "sha512-OaXnCKsRs0yrc0O7LFhnq/US2DB4Wd313cS+qjG2XMksZ74pF/jvMHkJdURXJiAo4kSahL2N4e8JOdwUjOMNdw==", "requires": { - "@types/prettier": "^1.19.0", "lodash": "^4.17.15", - "prettier": "^2.0.2" + "prettier": "^2.5.1" } }, "ts-proto": { - "version": "1.68.0", - "resolved": "https://registry.npmjs.org/ts-proto/-/ts-proto-1.68.0.tgz", - "integrity": "sha512-FTl/IeM3Y0fXwtrdl6mmTaZXMVwutI6+nKyjK0/ziQtd1THPt8DQtzYdTSNouewRin/SovlTkfSXZzNTxsWRog==", + "version": "1.110.4", + "resolved": "https://registry.npmjs.org/ts-proto/-/ts-proto-1.110.4.tgz", + "integrity": "sha512-conMr8adLW8nnnacTyU6aAuAz+TOGjjXc56V5J9J8eeTXzl18R0+85oZ8CVx4Kf6/cHLALgGKmeHhPPIOrwy6Q==", "requires": { "@types/object-hash": "^1.3.0", "dataloader": "^1.4.0", "object-hash": "^1.3.1", "protobufjs": "^6.8.8", - "ts-poet": "^4.5.0", - "ts-proto-descriptors": "^1.2.0" + "ts-poet": "^4.11.0", + "ts-proto-descriptors": "1.6.0" } }, "ts-proto-descriptors": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/ts-proto-descriptors/-/ts-proto-descriptors-1.2.0.tgz", - "integrity": "sha512-0t2WITzCiQ/3H6zPuFrFFOj2jhH6xZNu7agS7aKecKrz7tjRMW9VrmlBlJXslTTC3K7/4phV4qlsP5fOfLxuDg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ts-proto-descriptors/-/ts-proto-descriptors-1.6.0.tgz", + "integrity": "sha512-Vrhue2Ti99us/o76mGy28nF3W/Uanl1/8detyJw2yyRwiBC5yxy+hEZqQ/ZX2PbZ1vyCpJ51A9L4PnCCnkBMTQ==", "requires": { + "long": "^4.0.0", "protobufjs": "^6.8.8" } }, @@ -5763,21 +5619,21 @@ "prelude-ls": "~1.1.2" } }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" + }, "typescript": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.4.tgz", - "integrity": "sha512-V+evlYHZnQkaz8TRBuxTA92yZBPotr5H+WhQ7bD3hZUndx5tGOa1fuCgeSjxAzM1RiN5IzvadIXTVefuuwZCRg==" + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz", + "integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==" }, "universalify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" }, - "unorm": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.6.0.tgz", - "integrity": "sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==" - }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -5797,9 +5653,9 @@ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "validator": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-12.2.0.tgz", - "integrity": "sha512-jJfE/DW6tIK1Ek8nCfNFqt8Wb3nzMoAbocBF6/Icgg1ZFSBpObdnwVY2jQj6qUqzhx5jc71fpvBWyLGO7Xl+nQ==" + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", + "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==" }, "webidl-conversions": { "version": "3.0.1", @@ -5837,27 +5693,16 @@ "stack-trace": "0.0.x", "triple-beam": "^1.3.0", "winston-transport": "^4.4.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } } }, "winston-transport": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.4.0.tgz", - "integrity": "sha512-Lc7/p3GtqtqPBYYtS6KCN3c77/2QCev51DvcJKbkFPQNoj1sinkGwLGFDxkXY9J6p9+EPnYs+D90uwbnaiURTw==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.5.0.tgz", + "integrity": "sha512-YpZzcUzBedhlTAfJg6vJDlyEai/IFMIVcaEZZyl3UXIl4gmqRpU7AE89AHLkbzLUsv0NVmw7ts+iztqKxxPW1Q==", "requires": { - "readable-stream": "^2.3.7", - "triple-beam": "^1.2.0" + "logform": "^2.3.2", + "readable-stream": "^3.6.0", + "triple-beam": "^1.3.0" } }, "word-wrap": { @@ -5873,6 +5718,36 @@ "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } } }, "wrappy": { @@ -5881,9 +5756,9 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "ws": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.2.tgz", - "integrity": "sha512-lkF7AWRicoB9mAgjeKbGqVUekLnSNO4VjKVnuPHpQeOxZOErX6BPXwJk70nFslRCEEA8EVW7ZjKwXaP9N+1sKQ==", + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", "requires": {} }, "xstream": { @@ -5896,9 +5771,9 @@ } }, "y18n": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.5.tgz", - "integrity": "sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg==" + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" }, "yallist": { "version": "4.0.0", @@ -5906,9 +5781,9 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "yaml": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz", - "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==" + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" }, "yargs": { "version": "16.2.0", @@ -5922,22 +5797,52 @@ "string-width": "^4.2.0", "y18n": "^5.0.5", "yargs-parser": "^20.2.2" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } } }, "yargs-parser": { - "version": "20.2.6", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.6.tgz", - "integrity": "sha512-AP1+fQIWSM/sMiET8fyayjx/J+JmTPt2Mr0FkrgqB4todtfa53sOsrSAcIrJRD5XS20bKUwaDIuMkWKCEiQLKA==" + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==" }, "z-schema": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-4.2.3.tgz", - "integrity": "sha512-zkvK/9TC6p38IwcrbnT3ul9in1UX4cm1y/VZSs4GHKIiDCrlafc+YQBgQBUdDXLAoZHf2qvQ7gJJOo6yT1LH6A==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.3.tgz", + "integrity": "sha512-sGvEcBOTNum68x9jCpCVGPFJ6mWnkD0YxOcddDlJHRx3tKdB2q8pCHExMVZo/AV/6geuVJXG7hljDaWG8+5GDw==", "requires": { - "commander": "^2.7.1", + "commander": "^2.20.3", "lodash.get": "^4.4.2", "lodash.isequal": "^4.5.0", - "validator": "^12.0.0" + "validator": "^13.7.0" }, "dependencies": { "commander": { diff --git a/scripts/data/gen-nodetime/package.json b/scripts/data/gen-nodetime/package.json index c0f5d732ed..90e91e00b0 100644 --- a/scripts/data/gen-nodetime/package.json +++ b/scripts/data/gen-nodetime/package.json @@ -7,17 +7,18 @@ "build": "pkg --public-packages \"*\" --public --no-bytecode -c package.json -o nodetime nodetime" }, "dependencies": { - "@confio/relayer": "0.2.0", - "@cosmjs/crypto": "0.25.0", - "@cosmjs/launchpad": "0.25.0", - "@cosmjs/proto-signing": "0.25.0", - "@cosmjs/stargate": "0.25.0", - "@cosmjs/tendermint-rpc": "0.25.0", + "@confio/relayer": "0.5.1", + "@cosmjs/crypto": "0.28.11", + "@cosmjs/encoding": "0.28.11", + "@cosmjs/proto-signing": "0.28.11", + "@cosmjs/stargate": "0.28.11", + "@cosmjs/tendermint-rpc": "0.28.11", "js-yaml": "^4.0.0", "json-rpc-2.0": "^0.2.16", "long": "^4.0.0", "pkg": "github:vercel/pkg#main", "protobufjs": "^6.10.2", + "sinon": "^9.2.4", "swagger-combine": "^1.3.0", "swagger-typescript-api": "^5.1.7", "ts-proto": "^1.68.0" @@ -43,4 +44,3 @@ "typescript": "^4.2.4" } } - diff --git a/scripts/data/gen-nodetime/src/relayer/lib/relayer.ts b/scripts/data/gen-nodetime/src/relayer/lib/relayer.ts index 7a8720e691..f97901d01e 100644 --- a/scripts/data/gen-nodetime/src/relayer/lib/relayer.ts +++ b/scripts/data/gen-nodetime/src/relayer/lib/relayer.ts @@ -10,26 +10,12 @@ import {orderFromJSON} from "@confio/relayer/build/codec/ibc/core/channel/v1/cha // local imports. import ConsoleLogger from './logger'; -const calcGasLimits = (limit: number) => ({ - initClient: 150000, - updateClient: 600000, - initConnection: 150000, - connectionHandshake: limit, - initChannel: 150000, - channelHandshake: limit, - receivePacket: limit, - ackPacket: limit, - timeoutPacket: limit, - transfer: 180000 -}); - type Chain = { id: string; account: string, address_prefix: string; rpc_address: string; gas_price: string; - gas_limit: number; client_id: string; }; @@ -62,7 +48,7 @@ export default class Relayer { ]: [Path, Chain, Chain, string, string]): Promise<Path> { const srcClient = await Relayer.getIBCClient(srcChain, srcKey); const dstClient = await Relayer.getIBCClient(dstChain, dstKey); - const link = await this.create(srcClient, dstClient, srcChain.client_id, dstChain.client_id); + const link = await Relayer.create(srcClient, dstClient, srcChain.client_id, dstChain.client_id); const channels = await link.createChannel( 'A', @@ -132,13 +118,12 @@ export default class Relayer { account.address, { prefix: chain.address_prefix, - gasPrice: chainGP, - gasLimits: calcGasLimits(chain.gas_limit) + gasPrice: chainGP } ); } - public async create( + private static async create( nodeA: IbcClient, nodeB: IbcClient, clientA: string,