From 57586aaeb075ea7de06989caec13d944e83b13ba Mon Sep 17 00:00:00 2001 From: taobun Date: Thu, 25 Jun 2020 15:23:10 +0700 Subject: [PATCH] Remove band-consumer from repo --- band-consumer/Dockerfile | 35 - band-consumer/Makefile | 246 ---- band-consumer/README.md | 34 - band-consumer/app/app.go | 408 ------ band-consumer/app/app_test.go | 56 - band-consumer/app/export.go | 168 --- band-consumer/app/genesis.go | 16 - band-consumer/app/params.go | 24 - band-consumer/cmd/bccli/main.go | 178 --- band-consumer/cmd/bcd/genaccounts.go | 181 --- band-consumer/cmd/bcd/main.go | 117 -- band-consumer/cmd/bcd/replay.go | 195 --- band-consumer/cmd/bcd/testnet.go | 389 ------ band-consumer/cmd/contract_tests/main.go | 44 - band-consumer/contrib/devtools/Makefile | 113 -- band-consumer/docker-compose.yml | 68 - band-consumer/go.mod | 22 - band-consumer/go.sum | 764 ----------- band-consumer/lcd_test/helpers.go | 510 -------- band-consumer/lcd_test/helpers_test.go | 1134 ----------------- band-consumer/lcd_test/lcd_test.go | 1113 ---------------- band-consumer/lcd_test/testdata/setup.sh | 27 - band-consumer/lcd_test/testdata/state.tar.gz | Bin 20266 -> 0 bytes band-consumer/scripts/protocgen.sh | 11 - band-consumer/sims.mk | 63 - .../proto/cosmos-proto/cosmos.proto | 10 - .../proto/cosmos-sdk/types/types.proto | 47 - .../proto/cosmos-sdk/x/auth/types/types.proto | 45 - .../x/auth/vesting/types/types.proto | 76 -- .../cosmos-sdk/x/evidence/types/types.proto | 46 - .../cosmos-sdk/x/supply/types/types.proto | 32 - .../third_party/proto/gogoproto/gogo.proto | 145 --- band-consumer/x/consuming/alias.go | 24 - band-consumer/x/consuming/client/cli/query.go | 51 - band-consumer/x/consuming/client/cli/tx.go | 128 -- band-consumer/x/consuming/genesis.go | 38 - band-consumer/x/consuming/handler.go | 58 - band-consumer/x/consuming/keeper/keeper.go | 63 - band-consumer/x/consuming/keeper/querier.go | 41 - band-consumer/x/consuming/module.go | 317 ----- band-consumer/x/consuming/types/codec.go | 23 - band-consumer/x/consuming/types/errors.go | 15 - .../x/consuming/types/expected_keepers.go | 23 - band-consumer/x/consuming/types/key.go | 47 - band-consumer/x/consuming/types/msgs.go | 80 -- 45 files changed, 7225 deletions(-) delete mode 100644 band-consumer/Dockerfile delete mode 100644 band-consumer/Makefile delete mode 100644 band-consumer/README.md delete mode 100644 band-consumer/app/app.go delete mode 100644 band-consumer/app/app_test.go delete mode 100644 band-consumer/app/export.go delete mode 100644 band-consumer/app/genesis.go delete mode 100644 band-consumer/app/params.go delete mode 100644 band-consumer/cmd/bccli/main.go delete mode 100644 band-consumer/cmd/bcd/genaccounts.go delete mode 100644 band-consumer/cmd/bcd/main.go delete mode 100644 band-consumer/cmd/bcd/replay.go delete mode 100644 band-consumer/cmd/bcd/testnet.go delete mode 100644 band-consumer/cmd/contract_tests/main.go delete mode 100644 band-consumer/contrib/devtools/Makefile delete mode 100644 band-consumer/docker-compose.yml delete mode 100644 band-consumer/go.mod delete mode 100644 band-consumer/go.sum delete mode 100644 band-consumer/lcd_test/helpers.go delete mode 100644 band-consumer/lcd_test/helpers_test.go delete mode 100644 band-consumer/lcd_test/lcd_test.go delete mode 100755 band-consumer/lcd_test/testdata/setup.sh delete mode 100644 band-consumer/lcd_test/testdata/state.tar.gz delete mode 100755 band-consumer/scripts/protocgen.sh delete mode 100644 band-consumer/sims.mk delete mode 100644 band-consumer/third_party/proto/cosmos-proto/cosmos.proto delete mode 100644 band-consumer/third_party/proto/cosmos-sdk/types/types.proto delete mode 100644 band-consumer/third_party/proto/cosmos-sdk/x/auth/types/types.proto delete mode 100644 band-consumer/third_party/proto/cosmos-sdk/x/auth/vesting/types/types.proto delete mode 100644 band-consumer/third_party/proto/cosmos-sdk/x/evidence/types/types.proto delete mode 100644 band-consumer/third_party/proto/cosmos-sdk/x/supply/types/types.proto delete mode 100644 band-consumer/third_party/proto/gogoproto/gogo.proto delete mode 100644 band-consumer/x/consuming/alias.go delete mode 100644 band-consumer/x/consuming/client/cli/query.go delete mode 100644 band-consumer/x/consuming/client/cli/tx.go delete mode 100644 band-consumer/x/consuming/genesis.go delete mode 100644 band-consumer/x/consuming/handler.go delete mode 100644 band-consumer/x/consuming/keeper/keeper.go delete mode 100644 band-consumer/x/consuming/keeper/querier.go delete mode 100644 band-consumer/x/consuming/module.go delete mode 100644 band-consumer/x/consuming/types/codec.go delete mode 100644 band-consumer/x/consuming/types/errors.go delete mode 100644 band-consumer/x/consuming/types/expected_keepers.go delete mode 100644 band-consumer/x/consuming/types/key.go delete mode 100644 band-consumer/x/consuming/types/msgs.go diff --git a/band-consumer/Dockerfile b/band-consumer/Dockerfile deleted file mode 100644 index 2312f6b1c3..0000000000 --- a/band-consumer/Dockerfile +++ /dev/null @@ -1,35 +0,0 @@ -# # Simple usage with a mounted data directory: -# # > docker build -t gaia . -# # > docker run -it -p 46657:46657 -p 46656:46656 -v ~/.bcd:/root/.gaiad -v ~/.gaiacli:/root/.gaiacli gaia gaiad init -# # > docker run -it -p 46657:46657 -p 46656:46656 -v ~/.bcd:/root/.gaiad -v ~/.gaiacli:/root/.gaiacli gaia gaiad start -# FROM golang:1.14-alpine AS build-env - -# # Set up dependencies -# ENV PACKAGES curl make git libc-dev bash gcc linux-headers eudev-dev python - -# # Set working directory for the build -# WORKDIR /go/src/github.com/bandprotocol/band-consumer - -# # Add source files -# COPY . ./band-consumer - -# COPY ../chain chain - -# # Install minimum necessary dependencies, build Cosmos SDK, remove packages -# RUN apk add --no-cache $PACKAGES && \ -# make tools && \ -# make install - -# # Final image -# FROM alpine:edge - -# # Install ca-certificates -# RUN apk add --update ca-certificates -# WORKDIR /root - -# # Copy over binaries from the build-env -# COPY --from=build-env /go/bin/bcd /usr/bin/bcd -# COPY --from=build-env /go/bin/bccli /usr/bin/bccli - -# # Run bcd by default, omit entrypoint to ease using container with bccli -# CMD ["bcd"] diff --git a/band-consumer/Makefile b/band-consumer/Makefile deleted file mode 100644 index 2e63d284f7..0000000000 --- a/band-consumer/Makefile +++ /dev/null @@ -1,246 +0,0 @@ -#!/usr/bin/make -f - -PACKAGES_SIMTEST=$(shell go list ./... | grep '/simulation') -VERSION := $(shell echo $(shell git describe --tags) | sed 's/^v//') -COMMIT := $(shell git log -1 --format='%H') -LEDGER_ENABLED ?= true -SDK_PACK := $(shell go list -m github.com/cosmos/cosmos-sdk | sed 's/ /\@/g') -# TEST_DOCKER_REPO=jackzampolin/gaiatest - -export GO111MODULE = on - -# process build tags - -build_tags = netgo -ifeq ($(LEDGER_ENABLED),true) - ifeq ($(OS),Windows_NT) - GCCEXE = $(shell where gcc.exe 2> NUL) - ifeq ($(GCCEXE),) - $(error gcc.exe not installed for ledger support, please install or set LEDGER_ENABLED=false) - else - build_tags += ledger - endif - else - UNAME_S = $(shell uname -s) - ifeq ($(UNAME_S),OpenBSD) - $(warning OpenBSD detected, disabling ledger support (https://github.com/cosmos/cosmos-sdk/issues/1988)) - else - GCC = $(shell command -v gcc 2> /dev/null) - ifeq ($(GCC),) - $(error gcc not installed for ledger support, please install or set LEDGER_ENABLED=false) - else - build_tags += ledger - endif - endif - endif -endif - -ifeq ($(WITH_CLEVELDB),yes) - build_tags += gcc -endif -build_tags += $(BUILD_TAGS) -build_tags := $(strip $(build_tags)) - -whitespace := -whitespace += $(whitespace) -comma := , -build_tags_comma_sep := $(subst $(whitespace),$(comma),$(build_tags)) - -# process linker flags - -ldflags = -X github.com/cosmos/cosmos-sdk/version.Name=band-consumer \ - -X github.com/cosmos/cosmos-sdk/version.ServerName=bcd \ - -X github.com/cosmos/cosmos-sdk/version.ClientName=bccli \ - -X github.com/cosmos/cosmos-sdk/version.Version=$(VERSION) \ - -X github.com/cosmos/cosmos-sdk/version.Commit=$(COMMIT) \ - -X "github.com/cosmos/cosmos-sdk/version.BuildTags=$(build_tags_comma_sep)" - -ifeq ($(WITH_CLEVELDB),yes) - ldflags += -X github.com/cosmos/cosmos-sdk/types.DBBackend=cleveldb -endif -ldflags += $(LDFLAGS) -ldflags := $(strip $(ldflags)) - -BUILD_FLAGS := -tags "$(build_tags)" -ldflags '$(ldflags)' -trimpath - -# The below include contains the tools target. -include contrib/devtools/Makefile - -############################################################################### -### Documentation ### -############################################################################### - -all: install lint test - -build: go.sum -ifeq ($(OS),Windows_NT) - go build -mod=readonly $(BUILD_FLAGS) -o build/bcd.exe ./cmd/bcd - go build -mod=readonly $(BUILD_FLAGS) -o build/bccli.exe ./cmd/bccli -else - go build -mod=readonly $(BUILD_FLAGS) -o build/bcd ./cmd/bcd - go build -mod=readonly $(BUILD_FLAGS) -o build/bccli ./cmd/bccli -endif - -build-linux: go.sum - LEDGER_ENABLED=false GOOS=linux GOARCH=amd64 $(MAKE) build - -build-contract-tests-hooks: -ifeq ($(OS),Windows_NT) - go build -mod=readonly $(BUILD_FLAGS) -o build/contract_tests.exe ./cmd/contract_tests -else - go build -mod=readonly $(BUILD_FLAGS) -o build/contract_tests ./cmd/contract_tests -endif - -install: go.sum - go install $(BUILD_FLAGS) ./cmd/bcd - go install $(BUILD_FLAGS) ./cmd/bccli - -go-mod-cache: go.sum - @echo "--> Download go modules to local cache" - @go mod download - -go.sum: go.mod - @echo "--> Ensure dependencies have not been modified" - @go mod verify - -draw-deps: - @# requires brew install graphviz or apt-get install graphviz - go get github.com/RobotsAndPencils/goviz - @goviz -i ./cmd/bcd -d 2 | dot -Tpng -o dependency-graph.png - -clean: - rm -rf snapcraft-local.yaml build/ - -distclean: clean - rm -rf vendor/ - -############################################################################### -### Devdoc ### -############################################################################### - -build-docs: - @cd docs && \ - while read p; do \ - (git checkout $${p} && npm install && VUEPRESS_BASE="/$${p}/" npm run build) ; \ - mkdir -p ~/output/$${p} ; \ - cp -r .vuepress/dist/* ~/output/$${p}/ ; \ - cp ~/output/$${p}/index.html ~/output ; \ - done < versions ; - -sync-docs: - cd ~/output && \ - echo "role_arn = ${DEPLOYMENT_ROLE_ARN}" >> /root/.aws/config ; \ - echo "CI job = ${CIRCLE_BUILD_URL}" >> version.html ; \ - aws s3 sync . s3://${WEBSITE_BUCKET} --profile terraform --delete ; \ - aws cloudfront create-invalidation --distribution-id ${CF_DISTRIBUTION_ID} --profile terraform --path "/*" ; -.PHONY: sync-docs - - -############################################################################### -### Tests & Simulation ### -############################################################################### - -include sims.mk - -test: test-unit test-build - -test-all: check test-race test-cover - -test-unit: - @VERSION=$(VERSION) go test -mod=readonly -tags='ledger test_ledger_mock' ./... - -test-race: - @VERSION=$(VERSION) go test -mod=readonly -race -tags='ledger test_ledger_mock' ./... - -test-cover: - @go test -mod=readonly -timeout 30m -race -coverprofile=coverage.txt -covermode=atomic -tags='ledger test_ledger_mock' ./... - -test-build: build - @go test -mod=readonly -p 4 `go list ./cli_test/...` -tags=cli_test -v - -benchmark: - @go test -mod=readonly -bench=. ./... - -# test-docker: -# @docker build -f contrib/Dockerfile.test -t ${TEST_DOCKER_REPO}:$(shell git rev-parse --short HEAD) . -# @docker tag ${TEST_DOCKER_REPO}:$(shell git rev-parse --short HEAD) ${TEST_DOCKER_REPO}:$(shell git rev-parse --abbrev-ref HEAD | sed 's#/#_#g') -# @docker tag ${TEST_DOCKER_REPO}:$(shell git rev-parse --short HEAD) ${TEST_DOCKER_REPO}:latest -# @docker push ${TEST_DOCKER_REPO}:$(shell git rev-parse --short HEAD) -# @docker push ${TEST_DOCKER_REPO}:$(shell git rev-parse --abbrev-ref HEAD | sed 's#/#_#g') -# @docker push ${TEST_DOCKER_REPO}:latest - - -############################################################################### -### Linting ### -############################################################################### - -lint: - golangci-lint run - find . -name '*.go' -type f -not -path "./vendor*" -not -path "*.git*" | xargs gofmt -d -s - go mod verify - -format: - find . -name '*.go' -type f -not -path "./vendor*" -not -path "*.git*" -not -path "./client/lcd/statik/statik.go" | xargs gofmt -w -s - find . -name '*.go' -type f -not -path "./vendor*" -not -path "*.git*" -not -path "./client/lcd/statik/statik.go" | xargs misspell -w - find . -name '*.go' -type f -not -path "./vendor*" -not -path "*.git*" -not -path "./client/lcd/statik/statik.go" | xargs goimports -w -local github.com/cosmos/cosmos-sdk - -############################################################################### -### Localnet ### -############################################################################### - -build-docker-bcdnode: - $(MAKE) -C networks/local - -# Run a 4-node testnet locally -localnet-start: build-linux localnet-stop - @if ! [ -f build/node0/bcd/config/genesis.json ]; then docker run --rm -v $(CURDIR)/build:/bcd:Z tendermint/bcdnode testnet --v 4 -o . --starting-ip-address 192.168.10.2 --keyring-backend=test ; fi - docker-compose up -d - -# Stop testnet -localnet-stop: - docker-compose down - -setup-contract-tests-data: - echo 'Prepare data for the contract tests' - rm -rf /tmp/contract_tests ; \ - mkdir /tmp/contract_tests ; \ - cp "${GOPATH}/pkg/mod/${SDK_PACK}/client/lcd/swagger-ui/swagger.yaml" /tmp/contract_tests/swagger.yaml ; \ - ./build/bcd init --home /tmp/contract_tests/.bcd --chain-id lcd contract-tests ; \ - tar -xzf lcd_test/testdata/state.tar.gz -C /tmp/contract_tests/ - -start-bc: setup-contract-tests-data - ./build/bcd --home /tmp/contract_tests/.bcd start & - @sleep 2s - -setup-transactions: start-bc - @bash ./lcd_test/testdata/setup.sh - -run-lcd-contract-tests: - @echo "Running Band-Consumer LCD for contract tests" - ./build/bccli rest-server --laddr tcp://0.0.0.0:8080 --home /tmp/contract_tests/.bccli --node http://localhost:26657 --chain-id lcd --trust-node true - -contract-tests: setup-transactions - @echo "Running Band-Consumer LCD for contract tests" - dredd && pkill bcd - -############################################################################### -### Protobuf ### -############################################################################### - -proto-all: proto-gen proto-lint proto-check-breaking - -proto-gen: - @./scripts/protocgen.sh - -proto-lint: - @buf check lint --error-format=json - -proto-check-breaking: - @buf check breaking --against-input '.git#branch=master' - -.PHONY: proto-all proto-gen proto-lint proto-check-breaking - -.PHONY: all build-linux install install-debug \ - go-mod-cache draw-deps clean build \ - setup-transactions setup-contract-tests-data start-bc run-lcd-contract-tests contract-tests \ - test test-all test-build test-cover test-unit test-race diff --git a/band-consumer/README.md b/band-consumer/README.md deleted file mode 100644 index 0371278189..0000000000 --- a/band-consumer/README.md +++ /dev/null @@ -1,34 +0,0 @@ -# Cosmos Hub -![banner](./docs/images/cosmos-hub-image.jpg) - -[![CircleCI](https://circleci.com/gh/cosmos/gaia/tree/master.svg?style=shield)](https://circleci.com/gh/cosmos/gaia/tree/master) -[![codecov](https://codecov.io/gh/cosmos/gaia/branch/master/graph/badge.svg)](https://codecov.io/gh/cosmos/gaia) -[![Go Report Card](https://goreportcard.com/badge/github.com/cosmos/gaia)](https://goreportcard.com/report/github.com/cosmos/gaia) -[![license](https://img.shields.io/github/license/cosmos/gaia.svg)](https://github.com/cosmos/gaia/blob/master/LICENSE) -[![LoC](https://tokei.rs/b1/github/cosmos/gaia)](https://github.com/cosmos/gaia) -[![GolangCI](https://golangci.com/badges/github.com/cosmos/gaia.svg)](https://golangci.com/r/github.com/cosmos/gaia) -[![riot.im](https://img.shields.io/badge/riot.im-JOIN%20CHAT-green.svg)](https://riot.im/app/#/room/#cosmos-sdk:matrix.org) - -This repository hosts `Gaia`, the first implementation of the Cosmos Hub based on the [Cosmos SDK](https://github.com/cosmos/cosmos-sdk). - -**Note**: Requires [Go 1.13+](https://golang.org/dl/) - -## Cosmos Hub Mainnet - -To run a full-node for the mainnet of the Cosmos Hub, first [install `gaiad`](./docs/gaia-tutorials/installation.md), then follow [the guide](./docs/gaia-tutorials/join-mainnet.md). - -For status updates and genesis file, see the [launch repo](https://github.com/cosmos/launch). - -## Quick Start - -``` -make install -``` - -## Cosmos Hub Archives - -Archives of the Cosmos Hub can be found on this page [here](./docs/resources/archives.md). - -## Disambiguation - -This Cosmos-SDK project is not related to the [React-Cosmos](https://github.com/react-cosmos/react-cosmos) project (yet). Many thanks to Evan Coury and Ovidiu (@skidding) for this Github organization name. As per our agreement, this disambiguation notice will stay here. diff --git a/band-consumer/app/app.go b/band-consumer/app/app.go deleted file mode 100644 index 6f5509305a..0000000000 --- a/band-consumer/app/app.go +++ /dev/null @@ -1,408 +0,0 @@ -package app - -import ( - "io" - "os" - - abci "github.com/tendermint/tendermint/abci/types" - "github.com/tendermint/tendermint/libs/log" - tmos "github.com/tendermint/tendermint/libs/os" - dbm "github.com/tendermint/tm-db" - - "github.com/cosmos/cosmos-sdk/baseapp" - bam "github.com/cosmos/cosmos-sdk/baseapp" - "github.com/cosmos/cosmos-sdk/codec" - codecstd "github.com/cosmos/cosmos-sdk/codec/std" - "github.com/cosmos/cosmos-sdk/simapp" - "github.com/cosmos/cosmos-sdk/std" - 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" - "github.com/cosmos/cosmos-sdk/x/bank" - "github.com/cosmos/cosmos-sdk/x/capability" - "github.com/cosmos/cosmos-sdk/x/crisis" - distr "github.com/cosmos/cosmos-sdk/x/distribution" - "github.com/cosmos/cosmos-sdk/x/evidence" - "github.com/cosmos/cosmos-sdk/x/genutil" - "github.com/cosmos/cosmos-sdk/x/gov" - "github.com/cosmos/cosmos-sdk/x/ibc" - port "github.com/cosmos/cosmos-sdk/x/ibc/05-port" - transfer "github.com/cosmos/cosmos-sdk/x/ibc/20-transfer" - "github.com/cosmos/cosmos-sdk/x/mint" - "github.com/cosmos/cosmos-sdk/x/params" - paramsclient "github.com/cosmos/cosmos-sdk/x/params/client" - paramsproposal "github.com/cosmos/cosmos-sdk/x/params/types/proposal" - "github.com/cosmos/cosmos-sdk/x/slashing" - "github.com/cosmos/cosmos-sdk/x/staking" - "github.com/cosmos/cosmos-sdk/x/upgrade" - upgradeclient "github.com/cosmos/cosmos-sdk/x/upgrade/client" - - "github.com/bandprotocol/band-consumer/x/consuming" -) - -const appName = "BandConsumerApp" - -var ( - // DefaultCLIHome default home directories for bccli - DefaultCLIHome = os.ExpandEnv("$HOME/.bccli") - - // DefaultNodeHome default home directories for bcd - DefaultNodeHome = os.ExpandEnv("$HOME/.bcd") - - // ModuleBasics The module BasicManager is in charge of setting up basic, - // non-dependant module elements, such as codec registration - // and genesis verification. - ModuleBasics = module.NewBasicManager( - genutil.AppModuleBasic{}, - auth.AppModuleBasic{}, - bank.AppModuleBasic{}, - capability.AppModuleBasic{}, - staking.AppModuleBasic{}, - mint.AppModuleBasic{}, - distr.AppModuleBasic{}, - gov.NewAppModuleBasic(paramsclient.ProposalHandler, distr.ProposalHandler, upgradeclient.ProposalHandler), - params.AppModuleBasic{}, - crisis.AppModuleBasic{}, - slashing.AppModuleBasic{}, - ibc.AppModuleBasic{}, - upgrade.AppModuleBasic{}, - evidence.AppModuleBasic{}, - ibc.AppModuleBasic{}, - transfer.AppModuleBasic{}, - consuming.AppModuleBasic{}, - ) - - // module account permissions - maccPerms = map[string][]string{ - auth.FeeCollectorName: nil, - distr.ModuleName: nil, - mint.ModuleName: {auth.Minter}, - staking.BondedPoolName: {auth.Burner, auth.Staking}, - staking.NotBondedPoolName: {auth.Burner, auth.Staking}, - gov.ModuleName: {auth.Burner}, - transfer.GetModuleAccountName(): {auth.Minter, auth.Burner}, - } - - // module accounts that are allowed to receive tokens - allowedReceivingModAcc = map[string]bool{ - distr.ModuleName: true, - } -) - -// Verify app interface at compile time -// var _ simapp.App = (*BandConsumerApp)(nil) - -// BandConsumerApp extended ABCI application -type BandConsumerApp struct { - *bam.BaseApp - cdc *codec.Codec - - invCheckPeriod uint - - // keys to access the substores - keys map[string]*sdk.KVStoreKey - tKeys map[string]*sdk.TransientStoreKey - memKeys map[string]*sdk.MemoryStoreKey - - // subspaces - subspaces map[string]params.Subspace - - // keepers - accountKeeper auth.AccountKeeper - bankKeeper bank.Keeper - stakingKeeper staking.Keeper - capabilityKeeper *capability.Keeper - slashingKeeper slashing.Keeper - mintKeeper mint.Keeper - distrKeeper distr.Keeper - govKeeper gov.Keeper - crisisKeeper crisis.Keeper - paramsKeeper params.Keeper - upgradeKeeper upgrade.Keeper - evidenceKeeper evidence.Keeper - ibcKeeper *ibc.Keeper - transferKeeper transfer.Keeper - consumingKeeper consuming.Keeper - // the module manager - mm *module.Manager - - // simulation manager - // sm *module.SimulationManager -} - -// NewBandConsumerApp returns a reference to an initialized BandConsumerApp. -func NewBandConsumerApp( - logger log.Logger, db dbm.DB, traceStore io.Writer, loadLatest bool, - invCheckPeriod uint, skipUpgradeHeights map[int64]bool, home string, - baseAppOptions ...func(*bam.BaseApp), -) *BandConsumerApp { - - // TODO: Remove cdc in favor of appCodec once all modules are migrated. - cdc := codecstd.MakeCodec(ModuleBasics) - appCodec := codecstd.NewAppCodec(cdc) - - bApp := bam.NewBaseApp(appName, logger, db, auth.DefaultTxDecoder(cdc), baseAppOptions...) - bApp.SetCommitMultiStoreTracer(traceStore) - bApp.SetAppVersion(version.Version) - keys := sdk.NewKVStoreKeys( - auth.StoreKey, bank.StoreKey, staking.StoreKey, - mint.StoreKey, distr.StoreKey, slashing.StoreKey, - gov.StoreKey, params.StoreKey, ibc.StoreKey, transfer.StoreKey, - evidence.StoreKey, upgrade.StoreKey, capability.StoreKey, consuming.StoreKey, - ) - tKeys := sdk.NewTransientStoreKeys(params.TStoreKey) - memKeys := sdk.NewMemoryStoreKeys(capability.MemStoreKey) - - app := &BandConsumerApp{ - BaseApp: bApp, - cdc: cdc, - invCheckPeriod: invCheckPeriod, - keys: keys, - tKeys: tKeys, - memKeys: memKeys, - subspaces: make(map[string]params.Subspace), - } - - // init params keeper and subspaces - app.paramsKeeper = params.NewKeeper(appCodec, keys[params.StoreKey], tKeys[params.TStoreKey]) - app.subspaces[auth.ModuleName] = app.paramsKeeper.Subspace(auth.DefaultParamspace) - app.subspaces[bank.ModuleName] = app.paramsKeeper.Subspace(bank.DefaultParamspace) - app.subspaces[staking.ModuleName] = app.paramsKeeper.Subspace(staking.DefaultParamspace) - app.subspaces[mint.ModuleName] = app.paramsKeeper.Subspace(mint.DefaultParamspace) - app.subspaces[distr.ModuleName] = app.paramsKeeper.Subspace(distr.DefaultParamspace) - app.subspaces[slashing.ModuleName] = app.paramsKeeper.Subspace(slashing.DefaultParamspace) - app.subspaces[gov.ModuleName] = app.paramsKeeper.Subspace(gov.DefaultParamspace).WithKeyTable(gov.ParamKeyTable()) - app.subspaces[crisis.ModuleName] = app.paramsKeeper.Subspace(crisis.DefaultParamspace) - - // set the BaseApp's parameter store - bApp.SetParamStore(app.paramsKeeper.Subspace(baseapp.Paramspace).WithKeyTable(std.ConsensusParamsKeyTable())) - - // add capability keeper and ScopeToModule for ibc module - app.capabilityKeeper = capability.NewKeeper(appCodec, keys[capability.StoreKey], memKeys[capability.MemStoreKey]) - scopedIBCKeeper := app.capabilityKeeper.ScopeToModule(ibc.ModuleName) - - // add keepers - app.accountKeeper = auth.NewAccountKeeper( - appCodec, keys[auth.StoreKey], app.subspaces[auth.ModuleName], auth.ProtoBaseAccount, maccPerms, - ) - app.bankKeeper = bank.NewBaseKeeper( - appCodec, keys[bank.StoreKey], app.accountKeeper, app.subspaces[bank.ModuleName], app.ModuleAccountAddrs(), - ) - stakingKeeper := staking.NewKeeper( - appCodec, keys[staking.StoreKey], app.accountKeeper, app.bankKeeper, app.subspaces[staking.ModuleName], - ) - app.mintKeeper = mint.NewKeeper( - appCodec, keys[mint.StoreKey], app.subspaces[mint.ModuleName], &stakingKeeper, - app.accountKeeper, app.bankKeeper, auth.FeeCollectorName, - ) - app.distrKeeper = distr.NewKeeper( - appCodec, keys[distr.StoreKey], app.subspaces[distr.ModuleName], app.accountKeeper, app.bankKeeper, - &stakingKeeper, auth.FeeCollectorName, app.ModuleAccountAddrs(), - ) - app.slashingKeeper = slashing.NewKeeper( - appCodec, keys[slashing.StoreKey], &stakingKeeper, app.subspaces[slashing.ModuleName], - ) - - app.crisisKeeper = crisis.NewKeeper( - app.subspaces[crisis.ModuleName], invCheckPeriod, app.bankKeeper, auth.FeeCollectorName, - ) - app.upgradeKeeper = upgrade.NewKeeper(skipUpgradeHeights, keys[upgrade.StoreKey], appCodec, home) - - // create evidence keeper with evidence router - evidenceKeeper := evidence.NewKeeper( - appCodec, keys[evidence.StoreKey], &stakingKeeper, app.slashingKeeper, - ) - evidenceRouter := evidence.NewRouter() - - // TODO: register evidence routes - evidenceKeeper.SetRouter(evidenceRouter) - - app.evidenceKeeper = *evidenceKeeper - - // register the proposal types - govRouter := gov.NewRouter() - govRouter.AddRoute(gov.RouterKey, gov.ProposalHandler). - AddRoute(paramsproposal.RouterKey, params.NewParamChangeProposalHandler(app.paramsKeeper)). - AddRoute(distr.RouterKey, distr.NewCommunityPoolSpendProposalHandler(app.distrKeeper)). - AddRoute(upgrade.RouterKey, upgrade.NewSoftwareUpgradeProposalHandler(app.upgradeKeeper)) - app.govKeeper = gov.NewKeeper( - appCodec, keys[gov.StoreKey], app.subspaces[gov.ModuleName], - app.accountKeeper, app.bankKeeper, &stakingKeeper, govRouter, - ) - - scopedTransferKeeper := app.capabilityKeeper.ScopeToModule(transfer.ModuleName) - // create IBC keeper - app.ibcKeeper = ibc.NewKeeper(app.cdc, keys[ibc.StoreKey], stakingKeeper, scopedIBCKeeper) - - // Create Transfer Keepers - app.transferKeeper = transfer.NewKeeper( - app.cdc, keys[transfer.StoreKey], - app.ibcKeeper.ChannelKeeper, &app.ibcKeeper.PortKeeper, - app.accountKeeper, app.bankKeeper, - scopedTransferKeeper, - ) - transferModule := transfer.NewAppModule(app.transferKeeper) - - // Create static IBC router, add transfer route, then set and seal it - ibcRouter := port.NewRouter() - ibcRouter.AddRoute(transfer.ModuleName, transferModule) - scopedConsumingKeeper := app.capabilityKeeper.ScopeToModule(consuming.ModuleName) - - app.consumingKeeper = consuming.NewKeeper( - appCodec, keys[consuming.StoreKey], app.ibcKeeper.ChannelKeeper, scopedConsumingKeeper, &app.ibcKeeper.PortKeeper, - ) - - consumingModule := consuming.NewAppModule(app.consumingKeeper) - ibcRouter.AddRoute(consuming.ModuleName, consumingModule) - app.ibcKeeper.SetRouter(ibcRouter) - // register the staking hooks - // NOTE: stakingKeeper above is passed by reference, so that it will contain these hooks - app.stakingKeeper = *stakingKeeper.SetHooks( - staking.NewMultiStakingHooks(app.distrKeeper.Hooks(), app.slashingKeeper.Hooks()), - ) - - // NOTE: Any module instantiated in the module manager that is later modified - // must be passed by reference here. - app.mm = module.NewManager( - genutil.NewAppModule(app.accountKeeper, app.stakingKeeper, app.BaseApp.DeliverTx), - auth.NewAppModule(appCodec, app.accountKeeper), - bank.NewAppModule(appCodec, app.bankKeeper, app.accountKeeper), - capability.NewAppModule(*app.capabilityKeeper), - crisis.NewAppModule(&app.crisisKeeper), - gov.NewAppModule(appCodec, app.govKeeper, app.accountKeeper, app.bankKeeper), - mint.NewAppModule(appCodec, app.mintKeeper, app.accountKeeper), - slashing.NewAppModule(appCodec, app.slashingKeeper, app.accountKeeper, app.bankKeeper, app.stakingKeeper), - distr.NewAppModule(appCodec, app.distrKeeper, app.accountKeeper, app.bankKeeper, app.stakingKeeper), - staking.NewAppModule(appCodec, app.stakingKeeper, app.accountKeeper, app.bankKeeper), - upgrade.NewAppModule(app.upgradeKeeper), - evidence.NewAppModule(appCodec, app.evidenceKeeper), - ibc.NewAppModule(app.ibcKeeper), - transferModule, - consumingModule, - ) - // During begin block slashing happens after distr.BeginBlocker so that - // there is nothing left over in the validator fee pool, so as to keep the - // CanWithdrawInvariant invariant. - app.mm.SetOrderBeginBlockers( - upgrade.ModuleName, mint.ModuleName, distr.ModuleName, - slashing.ModuleName, staking.ModuleName, ibc.ModuleName, - ) - app.mm.SetOrderEndBlockers(crisis.ModuleName, gov.ModuleName, consuming.ModuleName, staking.ModuleName) - - // NOTE: The genutils module must occur after staking so that pools are - // properly initialized with tokens from genesis accounts. - app.mm.SetOrderInitGenesis( - capability.ModuleName, auth.ModuleName, distr.ModuleName, staking.ModuleName, bank.ModuleName, - slashing.ModuleName, gov.ModuleName, mint.ModuleName, crisis.ModuleName, - ibc.ModuleName, genutil.ModuleName, evidence.ModuleName, consuming.ModuleName, - ) - - app.mm.RegisterInvariants(&app.crisisKeeper) - app.mm.RegisterRoutes(app.Router(), app.QueryRouter()) - - // create the simulation manager and define the order of the modules for deterministic simulations - // - // NOTE: This is not required for apps that don't use the simulator for fuzz testing - // transactions. - // app.sm = module.NewSimulationManager( - // auth.NewAppModule(app.accountKeeper, app.supplyKeeper), - // bank.NewAppModule(app.bankKeeper, app.accountKeeper), - // supply.NewAppModule(app.supplyKeeper, app.bankKeeper, app.accountKeeper), - // gov.NewAppModule(app.govKeeper, app.accountKeeper, app.bankKeeper, app.supplyKeeper), - // mint.NewAppModule(app.mintKeeper, app.supplyKeeper), - // distr.NewAppModule(app.distrKeeper, app.accountKeeper, app.bankKeeper, app.supplyKeeper, app.stakingKeeper), - // staking.NewAppModule(app.stakingKeeper, app.accountKeeper, app.bankKeeper, app.supplyKeeper), - // slashing.NewAppModule(app.slashingKeeper, app.accountKeeper, app.bankKeeper, app.stakingKeeper), - // ) - - // app.sm.RegisterStoreDecoders() - - // initialize stores - app.MountKVStores(keys) - app.MountTransientStores(tKeys) - app.MountMemoryStores(memKeys) - - // initialize BaseApp - app.SetInitChainer(app.InitChainer) - app.SetBeginBlocker(app.BeginBlocker) - app.SetAnteHandler(ante.NewAnteHandler( - app.accountKeeper, app.bankKeeper, *app.ibcKeeper, - ante.DefaultSigVerificationGasConsumer, - )) - app.SetEndBlocker(app.EndBlocker) - - if loadLatest { - if err := app.LoadLatestVersion(); err != nil { - tmos.Exit(err.Error()) - } - } - - // Initialize and seal the capability keeper so all persistent capabilities - // are loaded in-memory and prevent any further modules from creating scoped - // sub-keepers. - // This must be done during creation of baseapp rather than in InitChain so - // that in-memory capabilities get regenerated on app restart - ctx := app.BaseApp.NewContext(true, abci.Header{}) - app.capabilityKeeper.InitializeAndSeal(ctx) - - return app -} - -// Name returns the name of the App -func (app *BandConsumerApp) Name() string { return app.BaseApp.Name() } - -// BeginBlocker application updates every begin block -func (app *BandConsumerApp) BeginBlocker(ctx sdk.Context, req abci.RequestBeginBlock) abci.ResponseBeginBlock { - return app.mm.BeginBlock(ctx, req) -} - -// EndBlocker application updates every end block -func (app *BandConsumerApp) EndBlocker(ctx sdk.Context, req abci.RequestEndBlock) abci.ResponseEndBlock { - return app.mm.EndBlock(ctx, req) -} - -// InitChainer application update at chain initialization -func (app *BandConsumerApp) InitChainer(ctx sdk.Context, req abci.RequestInitChain) abci.ResponseInitChain { - var genesisState simapp.GenesisState - app.cdc.MustUnmarshalJSON(req.AppStateBytes, &genesisState) - - res := app.mm.InitGenesis(ctx, app.cdc, genesisState) - - // Set Historical infos in InitChain to ignore genesis params - stakingParams := staking.DefaultParams() - stakingParams.HistoricalEntries = 1000 - app.stakingKeeper.SetParams(ctx, stakingParams) - - return res -} - -// LoadHeight loads a particular height -func (app *BandConsumerApp) LoadHeight(height int64) error { - return app.LoadVersion(height) -} - -// ModuleAccountAddrs returns all the app's module account addresses. -func (app *BandConsumerApp) ModuleAccountAddrs() map[string]bool { - modAccAddrs := make(map[string]bool) - for acc := range maccPerms { - modAccAddrs[auth.NewModuleAddress(acc).String()] = true - } - - return modAccAddrs -} - -// Codec returns the application's sealed codec. -func (app *BandConsumerApp) Codec() *codec.Codec { - return app.cdc -} - -// GetMaccPerms returns a mapping of the application's module account permissions. -func GetMaccPerms() map[string][]string { - modAccPerms := make(map[string][]string) - for k, v := range maccPerms { - modAccPerms[k] = v - } - return modAccPerms -} diff --git a/band-consumer/app/app_test.go b/band-consumer/app/app_test.go deleted file mode 100644 index 437ee82122..0000000000 --- a/band-consumer/app/app_test.go +++ /dev/null @@ -1,56 +0,0 @@ -package app - -import ( - "os" - "testing" - - "github.com/stretchr/testify/require" - "github.com/tendermint/tendermint/libs/log" - db "github.com/tendermint/tm-db" - - "github.com/cosmos/cosmos-sdk/codec" - "github.com/cosmos/cosmos-sdk/simapp" - - abci "github.com/tendermint/tendermint/abci/types" -) - -func TestBCDExport(t *testing.T) { - db := db.NewMemDB() - bcapp := NewBandConsumerApp(log.NewTMLogger(log.NewSyncWriter(os.Stdout)), db, nil, true, 0, map[int64]bool{}, "") - err := setGenesis(bcapp) - require.NoError(t, err) - - // Making a new app object with the db, so that initchain hasn't been called - newBCapp := NewBandConsumerApp(log.NewTMLogger(log.NewSyncWriter(os.Stdout)), db, nil, true, 0, map[int64]bool{}, "") - _, _, _, err = newBCapp.ExportAppStateAndValidators(false, []string{}) - require.NoError(t, err, "ExportAppStateAndValidators should not have an error") -} - -// ensure that black listed addresses are properly set in bank keeper -func TestBlackListedAddrs(t *testing.T) { - db := db.NewMemDB() - bcapp := NewBandConsumerApp(log.NewTMLogger(log.NewSyncWriter(os.Stdout)), db, nil, true, 0, map[int64]bool{}, "") - - for acc := range maccPerms { - require.Equal(t, !allowedReceivingModAcc[acc], bcapp.bankKeeper.BlacklistedAddr(bcapp.accountKeeper.GetModuleAddress(acc))) - } -} - -func setGenesis(bcapp *BandConsumerApp) error { - genesisState := simapp.NewDefaultGenesisState() - stateBytes, err := codec.MarshalJSONIndent(bcapp.Codec(), genesisState) - if err != nil { - return err - } - - // Initialize the chain - bcapp.InitChain( - abci.RequestInitChain{ - Validators: []abci.ValidatorUpdate{}, - AppStateBytes: stateBytes, - }, - ) - - bcapp.Commit() - return nil -} diff --git a/band-consumer/app/export.go b/band-consumer/app/export.go deleted file mode 100644 index 2e6db6d71d..0000000000 --- a/band-consumer/app/export.go +++ /dev/null @@ -1,168 +0,0 @@ -package app - -import ( - "encoding/json" - "log" - - abci "github.com/tendermint/tendermint/abci/types" - tmtypes "github.com/tendermint/tendermint/types" - - "github.com/cosmos/cosmos-sdk/codec" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/x/slashing" - "github.com/cosmos/cosmos-sdk/x/staking" -) - -// ExportAppStateAndValidators export the state of band-consumer for a genesis file -func (app *BandConsumerApp) ExportAppStateAndValidators(forZeroHeight bool, jailWhiteList []string, -) (appState json.RawMessage, validators []tmtypes.GenesisValidator, cp *abci.ConsensusParams, err error) { - // as if they could withdraw from the start of the next block - ctx := app.NewContext(true, abci.Header{Height: app.LastBlockHeight()}) - - if forZeroHeight { - app.prepForZeroHeightGenesis(ctx, jailWhiteList) - } - - genState := app.mm.ExportGenesis(ctx, app.cdc) - appState, err = codec.MarshalJSONIndent(app.cdc, genState) - if err != nil { - return nil, nil, nil, err - } - validators = staking.WriteValidators(ctx, app.stakingKeeper) - return appState, validators, app.BaseApp.GetConsensusParams(ctx), nil -} - -// prepare for fresh start at zero height -// NOTE zero height genesis is a temporary feature which will be deprecated -// in favour of export at a block height -func (app *BandConsumerApp) prepForZeroHeightGenesis(ctx sdk.Context, jailWhiteList []string) { - applyWhiteList := false - - //Check if there is a whitelist - if len(jailWhiteList) > 0 { - applyWhiteList = true - } - - whiteListMap := make(map[string]bool) - - for _, addr := range jailWhiteList { - _, err := sdk.ValAddressFromBech32(addr) - if err != nil { - log.Fatal(err) - } - whiteListMap[addr] = true - } - - /* Just to be safe, assert the invariants on current state. */ - app.crisisKeeper.AssertInvariants(ctx) - - /* Handle fee distribution state. */ - - // withdraw all validator commission - app.stakingKeeper.IterateValidators(ctx, func(_ int64, val staking.ValidatorI) (stop bool) { - _, err := app.distrKeeper.WithdrawValidatorCommission(ctx, val.GetOperator()) - if err != nil { - log.Fatal(err) - } - return false - }) - - // withdraw all delegator rewards - dels := app.stakingKeeper.GetAllDelegations(ctx) - for _, delegation := range dels { - _, err := app.distrKeeper.WithdrawDelegationRewards(ctx, delegation.DelegatorAddress, delegation.ValidatorAddress) - if err != nil { - log.Fatal(err) - } - } - - // clear validator slash events - app.distrKeeper.DeleteAllValidatorSlashEvents(ctx) - - // clear validator historical rewards - app.distrKeeper.DeleteAllValidatorHistoricalRewards(ctx) - - // set context height to zero - height := ctx.BlockHeight() - ctx = ctx.WithBlockHeight(0) - - // reinitialize all validators - app.stakingKeeper.IterateValidators(ctx, func(_ int64, val staking.ValidatorI) (stop bool) { - - // donate any unwithdrawn outstanding reward fraction tokens to the community pool - scraps := app.distrKeeper.GetValidatorOutstandingRewards(ctx, val.GetOperator()).Rewards - feePool := app.distrKeeper.GetFeePool(ctx) - feePool.CommunityPool = feePool.CommunityPool.Add(scraps...) - app.distrKeeper.SetFeePool(ctx, feePool) - - app.distrKeeper.Hooks().AfterValidatorCreated(ctx, val.GetOperator()) - return false - }) - - // reinitialize all delegations - for _, del := range dels { - app.distrKeeper.Hooks().BeforeDelegationCreated(ctx, del.DelegatorAddress, del.ValidatorAddress) - app.distrKeeper.Hooks().AfterDelegationModified(ctx, del.DelegatorAddress, del.ValidatorAddress) - } - - // reset context height - ctx = ctx.WithBlockHeight(height) - - /* Handle staking state. */ - - // iterate through redelegations, reset creation height - app.stakingKeeper.IterateRedelegations(ctx, func(_ int64, red staking.Redelegation) (stop bool) { - for i := range red.Entries { - red.Entries[i].CreationHeight = 0 - } - app.stakingKeeper.SetRedelegation(ctx, red) - return false - }) - - // iterate through unbonding delegations, reset creation height - app.stakingKeeper.IterateUnbondingDelegations(ctx, func(_ int64, ubd staking.UnbondingDelegation) (stop bool) { - for i := range ubd.Entries { - ubd.Entries[i].CreationHeight = 0 - } - app.stakingKeeper.SetUnbondingDelegation(ctx, ubd) - return false - }) - - // Iterate through validators by power descending, reset bond heights, and - // update bond intra-tx counters. - store := ctx.KVStore(app.keys[staking.StoreKey]) - iter := sdk.KVStoreReversePrefixIterator(store, staking.ValidatorsKey) - counter := int16(0) - - for ; iter.Valid(); iter.Next() { - addr := sdk.ValAddress(iter.Key()[1:]) - validator, found := app.stakingKeeper.GetValidator(ctx, addr) - if !found { - panic("expected validator, not found") - } - - validator.UnbondingHeight = 0 - if applyWhiteList && !whiteListMap[addr.String()] { - validator.Jailed = true - } - - app.stakingKeeper.SetValidator(ctx, validator) - counter++ - } - - iter.Close() - - _ = app.stakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) - - /* Handle slashing state. */ - - // reset start height on signing infos - app.slashingKeeper.IterateValidatorSigningInfos( - ctx, - func(addr sdk.ConsAddress, info slashing.ValidatorSigningInfo) (stop bool) { - info.StartHeight = 0 - app.slashingKeeper.SetValidatorSigningInfo(ctx, addr, info) - return false - }, - ) -} diff --git a/band-consumer/app/genesis.go b/band-consumer/app/genesis.go deleted file mode 100644 index b35cb39c6c..0000000000 --- a/band-consumer/app/genesis.go +++ /dev/null @@ -1,16 +0,0 @@ -package app - -import ( - "encoding/json" - - codecstd "github.com/cosmos/cosmos-sdk/codec/std" -) - -// GenesisState defines a type alias for the Gaia genesis application state. -type GenesisState map[string]json.RawMessage - -// NewDefaultGenesisState generates the default state for the application. -func NewDefaultGenesisState() GenesisState { - cdc := codecstd.MakeCodec(ModuleBasics) - return ModuleBasics.DefaultGenesis(cdc) -} diff --git a/band-consumer/app/params.go b/band-consumer/app/params.go deleted file mode 100644 index c56d333727..0000000000 --- a/band-consumer/app/params.go +++ /dev/null @@ -1,24 +0,0 @@ -package app - -// Simulation parameter constants -const ( - StakePerAccount = "stake_per_account" - InitiallyBondedValidators = "initially_bonded_validators" - OpWeightDeductFee = "op_weight_deduct_fee" - OpWeightMsgSend = "op_weight_msg_send" - OpWeightMsgMultiSend = "op_weight_msg_multisend" - OpWeightMsgSetWithdrawAddress = "op_weight_msg_set_withdraw_address" - OpWeightMsgWithdrawDelegationReward = "op_weight_msg_withdraw_delegation_reward" - OpWeightMsgWithdrawValidatorCommission = "op_weight_msg_withdraw_validator_commission" - OpWeightSubmitTextProposal = "op_weight_submit_text_proposal" - OpWeightSubmitCommunitySpendProposal = "op_weight_submit_community_spend_proposal" - OpWeightSubmitParamChangeProposal = "op_weight_submit_param_change_proposal" - OpWeightMsgDeposit = "op_weight_msg_deposit" - OpWeightMsgVote = "op_weight_msg_vote" - OpWeightMsgCreateValidator = "op_weight_msg_create_validator" - OpWeightMsgEditValidator = "op_weight_msg_edit_validator" - OpWeightMsgDelegate = "op_weight_msg_delegate" - OpWeightMsgUndelegate = "op_weight_msg_undelegate" - OpWeightMsgBeginRedelegate = "op_weight_msg_begin_redelegate" - OpWeightMsgUnjail = "op_weight_msg_unjail" -) diff --git a/band-consumer/cmd/bccli/main.go b/band-consumer/cmd/bccli/main.go deleted file mode 100644 index c0a8be9d7e..0000000000 --- a/band-consumer/cmd/bccli/main.go +++ /dev/null @@ -1,178 +0,0 @@ -package main - -import ( - "fmt" - "os" - "path" - - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/client/flags" - "github.com/cosmos/cosmos-sdk/client/keys" - "github.com/cosmos/cosmos-sdk/client/lcd" - "github.com/cosmos/cosmos-sdk/client/rpc" - codecstd "github.com/cosmos/cosmos-sdk/codec/std" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/version" - "github.com/cosmos/cosmos-sdk/x/auth" - authclient "github.com/cosmos/cosmos-sdk/x/auth/client" - authcmd "github.com/cosmos/cosmos-sdk/x/auth/client/cli" - authrest "github.com/cosmos/cosmos-sdk/x/auth/client/rest" - "github.com/cosmos/cosmos-sdk/x/bank" - bankcmd "github.com/cosmos/cosmos-sdk/x/bank/client/cli" - "github.com/spf13/cobra" - "github.com/spf13/viper" - "github.com/tendermint/go-amino" - "github.com/tendermint/tendermint/libs/cli" - - "github.com/bandprotocol/band-consumer/app" -) - -var ( - cdc = codecstd.MakeCodec(app.ModuleBasics) - appCodec = codecstd.NewAppCodec(cdc) -) - -func init() { - authclient.Codec = appCodec -} - -func main() { - // Configure cobra to sort commands - cobra.EnableCommandSorting = false - - // Read in the configuration file for the sdk - config := sdk.GetConfig() - config.SetBech32PrefixForAccount(sdk.Bech32PrefixAccAddr, sdk.Bech32PrefixAccPub) - config.SetBech32PrefixForValidator(sdk.Bech32PrefixValAddr, sdk.Bech32PrefixValPub) - config.SetBech32PrefixForConsensusNode(sdk.Bech32PrefixConsAddr, sdk.Bech32PrefixConsPub) - config.Seal() - - // TODO: setup keybase, viper object, etc. to be passed into - // the below functions and eliminate global vars, like we do - // with the cdc - - rootCmd := &cobra.Command{ - Use: "bccli", - Short: "Command line interface for interacting with bcd", - } - - // Add --chain-id to persistent flags and mark it required - rootCmd.PersistentFlags().String(flags.FlagChainID, "", "Chain ID of tendermint node") - rootCmd.PersistentPreRunE = func(_ *cobra.Command, _ []string) error { - return initConfig(rootCmd) - } - - // Construct Root Command - rootCmd.AddCommand( - rpc.StatusCommand(), - client.ConfigCmd(app.DefaultCLIHome), - queryCmd(cdc), - txCmd(cdc), - flags.LineBreak, - lcd.ServeCommand(cdc, registerRoutes), - flags.LineBreak, - keys.Commands(), - flags.LineBreak, - version.Cmd, - flags.NewCompletionCmd(rootCmd, true), - ) - - // Add flags and prefix all env exposed with BC - executor := cli.PrepareMainCmd(rootCmd, "BC", app.DefaultCLIHome) - - err := executor.Execute() - if err != nil { - fmt.Printf("Failed executing CLI command: %s, exiting...\n", err) - os.Exit(1) - } -} - -func queryCmd(cdc *amino.Codec) *cobra.Command { - queryCmd := &cobra.Command{ - Use: "query", - Aliases: []string{"q"}, - Short: "Querying subcommands", - } - - queryCmd.AddCommand( - authcmd.GetAccountCmd(cdc), - flags.LineBreak, - rpc.ValidatorCommand(cdc), - rpc.BlockCommand(), - authcmd.QueryTxsByEventsCmd(cdc), - authcmd.QueryTxCmd(cdc), - flags.LineBreak, - ) - - // add modules' query commands - app.ModuleBasics.AddQueryCommands(queryCmd, cdc) - - return queryCmd -} - -func txCmd(cdc *amino.Codec) *cobra.Command { - txCmd := &cobra.Command{ - Use: "tx", - Short: "Transactions subcommands", - } - - txCmd.AddCommand( - bankcmd.SendTxCmd(cdc), - flags.LineBreak, - authcmd.GetSignCommand(cdc), - authcmd.GetMultiSignCommand(cdc), - flags.LineBreak, - authcmd.GetBroadcastCommand(cdc), - authcmd.GetEncodeCommand(cdc), - authcmd.GetDecodeCommand(cdc), - flags.LineBreak, - ) - - // add modules' tx commands - app.ModuleBasics.AddTxCommands(txCmd, cdc) - - // remove auth and bank commands as they're mounted under the root tx command - var cmdsToRemove []*cobra.Command - - for _, cmd := range txCmd.Commands() { - if cmd.Use == auth.ModuleName || cmd.Use == bank.ModuleName { - cmdsToRemove = append(cmdsToRemove, cmd) - } - } - - txCmd.RemoveCommand(cmdsToRemove...) - - return txCmd -} - -// registerRoutes registers the routes from the different modules for the LCD. -// NOTE: details on the routes added for each module are in the module documentation -// NOTE: If making updates here you also need to update the test helper in client/lcd/test_helper.go -func registerRoutes(rs *lcd.RestServer) { - client.RegisterRoutes(rs.CliCtx, rs.Mux) - authrest.RegisterTxRoutes(rs.CliCtx, rs.Mux) - app.ModuleBasics.RegisterRESTRoutes(rs.CliCtx, rs.Mux) -} - -func initConfig(cmd *cobra.Command) error { - home, err := cmd.PersistentFlags().GetString(cli.HomeFlag) - if err != nil { - return err - } - - cfgFile := path.Join(home, "config", "config.toml") - if _, err := os.Stat(cfgFile); err == nil { - viper.SetConfigFile(cfgFile) - - if err := viper.ReadInConfig(); err != nil { - return err - } - } - if err := viper.BindPFlag(flags.FlagChainID, cmd.PersistentFlags().Lookup(flags.FlagChainID)); err != nil { - return err - } - if err := viper.BindPFlag(cli.EncodingFlag, cmd.PersistentFlags().Lookup(cli.EncodingFlag)); err != nil { - return err - } - return viper.BindPFlag(cli.OutputFlag, cmd.PersistentFlags().Lookup(cli.OutputFlag)) -} diff --git a/band-consumer/cmd/bcd/genaccounts.go b/band-consumer/cmd/bcd/genaccounts.go deleted file mode 100644 index 7d815f33fb..0000000000 --- a/band-consumer/cmd/bcd/genaccounts.go +++ /dev/null @@ -1,181 +0,0 @@ -package main - -import ( - "bufio" - "errors" - "fmt" - - "github.com/cosmos/cosmos-sdk/client/flags" - codecstd "github.com/cosmos/cosmos-sdk/codec/std" - "github.com/cosmos/cosmos-sdk/crypto/keyring" - "github.com/cosmos/cosmos-sdk/server" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/x/auth" - authexported "github.com/cosmos/cosmos-sdk/x/auth/exported" - authvesting "github.com/cosmos/cosmos-sdk/x/auth/vesting" - "github.com/cosmos/cosmos-sdk/x/bank" - "github.com/cosmos/cosmos-sdk/x/genutil" - "github.com/spf13/cobra" - "github.com/spf13/viper" - "github.com/tendermint/go-amino" - "github.com/tendermint/tendermint/libs/cli" -) - -const ( - flagClientHome = "home-client" - flagVestingStart = "vesting-start-time" - flagVestingEnd = "vesting-end-time" - flagVestingAmt = "vesting-amount" -) - -// AddGenesisAccountCmd returns add-genesis-account cobra Command. -func AddGenesisAccountCmd( - ctx *server.Context, depCdc *amino.Codec, cdc *codecstd.Codec, defaultNodeHome, defaultClientHome string, -) *cobra.Command { - - cmd := &cobra.Command{ - Use: "add-genesis-account [address_or_key_name] [coin][,[coin]]", - Short: "Add a genesis account to genesis.json", - Long: `Add a genesis account to genesis.json. The provided account must specify -the account address or key name and a list of initial coins. If a key name is given, -the address will be looked up in the local Keybase. The list of initial tokens must -contain valid denominations. Accounts may optionally be supplied with vesting parameters. -`, - Args: cobra.ExactArgs(2), - RunE: func(cmd *cobra.Command, args []string) error { - config := ctx.Config - config.SetRoot(viper.GetString(cli.HomeFlag)) - - addr, err := sdk.AccAddressFromBech32(args[0]) - inBuf := bufio.NewReader(cmd.InOrStdin()) - if err != nil { - // attempt to lookup address from Keybase if no address was provided - kb, err := keyring.New( - sdk.KeyringServiceName(), - viper.GetString(flags.FlagKeyringBackend), - viper.GetString(flagClientHome), - inBuf, - ) - if err != nil { - return err - } - - info, err := kb.Key(args[0]) - if err != nil { - return fmt.Errorf("failed to get address from Keybase: %w", err) - } - - addr = info.GetAddress() - } - - coins, err := sdk.ParseCoins(args[1]) - if err != nil { - return fmt.Errorf("failed to parse coins: %w", err) - } - - vestingStart := viper.GetInt64(flagVestingStart) - vestingEnd := viper.GetInt64(flagVestingEnd) - vestingAmt, err := sdk.ParseCoins(viper.GetString(flagVestingAmt)) - if err != nil { - return fmt.Errorf("failed to parse vesting amount: %w", err) - } - - // create concrete account type based on input parameters - var genAccount authexported.GenesisAccount - - balances := bank.Balance{Address: addr, Coins: coins.Sort()} - baseAccount := auth.NewBaseAccount(addr, nil, 0, 0) - if !vestingAmt.IsZero() { - baseVestingAccount := authvesting.NewBaseVestingAccount(baseAccount, vestingAmt.Sort(), vestingEnd) - - if (balances.Coins.IsZero() && !baseVestingAccount.OriginalVesting.IsZero()) || - baseVestingAccount.OriginalVesting.IsAnyGT(balances.Coins) { - return errors.New("vesting amount cannot be greater than total amount") - } - - switch { - case vestingStart != 0 && vestingEnd != 0: - genAccount = authvesting.NewContinuousVestingAccountRaw(baseVestingAccount, vestingStart) - - case vestingEnd != 0: - genAccount = authvesting.NewDelayedVestingAccountRaw(baseVestingAccount) - - default: - return errors.New("invalid vesting parameters; must supply start and end time or end time") - } - } else { - genAccount = baseAccount - } - - if err := genAccount.Validate(); err != nil { - return fmt.Errorf("failed to validate new genesis account: %w", err) - } - - genFile := config.GenesisFile() - appState, genDoc, err := genutil.GenesisStateFromGenFile(depCdc, genFile) - if err != nil { - return fmt.Errorf("failed to unmarshal genesis state: %w", err) - } - - authGenState := auth.GetGenesisStateFromAppState(cdc, appState) - bankGenState := bank.GetGenesisStateFromAppState(depCdc, appState) - - if authGenState.Accounts.Contains(addr) { - return fmt.Errorf("cannot add account at existing address %s", addr) - } - - if balancesContains(bankGenState.Balances, addr) { - return fmt.Errorf("cannot add account at existing address %s", addr) - } - - balance := bank.Balance{Address: addr, Coins: coins} - - bankGenState.Balances = append(bankGenState.Balances, balance) - bankGenState.Balances = bank.SanitizeGenesisBalances(bankGenState.Balances) - - // Add the new account to the set of genesis accounts and sanitize the - // accounts afterwards. - authGenState.Accounts = append(authGenState.Accounts, genAccount) - authGenState.Accounts = auth.SanitizeGenesisAccounts(authGenState.Accounts) - - authGenStateBz, err := cdc.MarshalJSON(authGenState) - if err != nil { - return fmt.Errorf("failed to marshal auth genesis state: %w", err) - } - - bankGenStateBz, err := cdc.MarshalJSON(bankGenState) - if err != nil { - return fmt.Errorf("failed to marshal bank genesis state: %w", err) - } - - appState[auth.ModuleName] = authGenStateBz - appState[bank.ModuleName] = bankGenStateBz - - appStateJSON, err := cdc.MarshalJSON(appState) - if err != nil { - return fmt.Errorf("failed to marshal application genesis state: %w", err) - } - - genDoc.AppState = appStateJSON - return genutil.ExportGenesisFile(genDoc, genFile) - }, - } - - cmd.Flags().String(cli.HomeFlag, defaultNodeHome, "node's home directory") - cmd.Flags().String(flags.FlagKeyringBackend, flags.DefaultKeyringBackend, "Select keyring's backend (os|file|test)") - cmd.Flags().String(flagClientHome, defaultClientHome, "client's home directory") - cmd.Flags().String(flagVestingAmt, "", "amount of coins for vesting accounts") - cmd.Flags().Uint64(flagVestingStart, 0, "schedule start time (unix epoch) for vesting accounts") - cmd.Flags().Uint64(flagVestingEnd, 0, "schedule end time (unix epoch) for vesting accounts") - - return cmd -} - -func balancesContains(bal []bank.Balance, addr sdk.AccAddress) bool { - for _, b := range bal { - if b.Address.Equals(addr) { - return true - } - } - return false -} diff --git a/band-consumer/cmd/bcd/main.go b/band-consumer/cmd/bcd/main.go deleted file mode 100644 index 6638687712..0000000000 --- a/band-consumer/cmd/bcd/main.go +++ /dev/null @@ -1,117 +0,0 @@ -package main - -import ( - "encoding/json" - "io" - - "github.com/cosmos/cosmos-sdk/baseapp" - "github.com/cosmos/cosmos-sdk/client/debug" - "github.com/cosmos/cosmos-sdk/client/flags" - codecstd "github.com/cosmos/cosmos-sdk/codec/std" - "github.com/cosmos/cosmos-sdk/server" - "github.com/cosmos/cosmos-sdk/store" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/x/bank" - genutilcli "github.com/cosmos/cosmos-sdk/x/genutil/client/cli" - "github.com/cosmos/cosmos-sdk/x/staking" - "github.com/spf13/cobra" - "github.com/spf13/viper" - abci "github.com/tendermint/tendermint/abci/types" - "github.com/tendermint/tendermint/libs/cli" - "github.com/tendermint/tendermint/libs/log" - tmtypes "github.com/tendermint/tendermint/types" - dbm "github.com/tendermint/tm-db" - - "github.com/bandprotocol/band-consumer/app" -) - -const flagInvCheckPeriod = "inv-check-period" - -var invCheckPeriod uint - -func main() { - cdc := codecstd.MakeCodec(app.ModuleBasics) - appCodec := codecstd.NewAppCodec(cdc) - - config := sdk.GetConfig() - config.SetBech32PrefixForAccount(sdk.Bech32PrefixAccAddr, sdk.Bech32PrefixAccPub) - config.SetBech32PrefixForValidator(sdk.Bech32PrefixValAddr, sdk.Bech32PrefixValPub) - config.SetBech32PrefixForConsensusNode(sdk.Bech32PrefixConsAddr, sdk.Bech32PrefixConsPub) - config.Seal() - - ctx := server.NewDefaultContext() - cobra.EnableCommandSorting = false - rootCmd := &cobra.Command{ - Use: "bcd", - Short: "Band-consumer Daemon (server)", - PersistentPreRunE: server.PersistentPreRunEFn(ctx), - } - - rootCmd.AddCommand(genutilcli.InitCmd(ctx, cdc, app.ModuleBasics, app.DefaultNodeHome)) - rootCmd.AddCommand(genutilcli.CollectGenTxsCmd(ctx, cdc, bank.GenesisBalancesIterator{}, app.DefaultNodeHome)) - rootCmd.AddCommand(genutilcli.MigrateGenesisCmd(ctx, cdc)) - rootCmd.AddCommand( - genutilcli.GenTxCmd( - ctx, cdc, app.ModuleBasics, staking.AppModuleBasic{}, - bank.GenesisBalancesIterator{}, app.DefaultNodeHome, app.DefaultCLIHome, - ), - ) - rootCmd.AddCommand(genutilcli.ValidateGenesisCmd(ctx, cdc, app.ModuleBasics)) - rootCmd.AddCommand(AddGenesisAccountCmd(ctx, cdc, appCodec, app.DefaultNodeHome, app.DefaultCLIHome)) - rootCmd.AddCommand(flags.NewCompletionCmd(rootCmd, true)) - rootCmd.AddCommand(testnetCmd(ctx, cdc, app.ModuleBasics, bank.GenesisBalancesIterator{})) - rootCmd.AddCommand(replayCmd()) - rootCmd.AddCommand(debug.Cmd(cdc)) - - server.AddCommands(ctx, cdc, rootCmd, newApp, exportAppStateAndTMValidators) - - // prepare and add flags - executor := cli.PrepareBaseCmd(rootCmd, "GA", app.DefaultNodeHome) - rootCmd.PersistentFlags().UintVar(&invCheckPeriod, flagInvCheckPeriod, - 0, "Assert registered invariants every N blocks") - err := executor.Execute() - if err != nil { - panic(err) - } -} - -func newApp(logger log.Logger, db dbm.DB, traceStore io.Writer) abci.Application { - var cache sdk.MultiStorePersistentCache - - if viper.GetBool(server.FlagInterBlockCache) { - cache = store.NewCommitKVStoreCacheManager() - } - - skipUpgradeHeights := make(map[int64]bool) - for _, h := range viper.GetIntSlice(server.FlagUnsafeSkipUpgrades) { - skipUpgradeHeights[int64(h)] = true - } - - return app.NewBandConsumerApp( - logger, db, traceStore, true, invCheckPeriod, skipUpgradeHeights, - viper.GetString(flags.FlagHome), - baseapp.SetPruning(store.NewPruningOptionsFromString(viper.GetString("pruning"))), - baseapp.SetMinGasPrices(viper.GetString(server.FlagMinGasPrices)), - baseapp.SetHaltHeight(viper.GetUint64(server.FlagHaltHeight)), - baseapp.SetHaltTime(viper.GetUint64(server.FlagHaltTime)), - baseapp.SetInterBlockCache(cache), - ) -} - -func exportAppStateAndTMValidators( - logger log.Logger, db dbm.DB, traceStore io.Writer, height int64, forZeroHeight bool, jailWhiteList []string, -) (json.RawMessage, []tmtypes.GenesisValidator, *abci.ConsensusParams, error) { - - if height != -1 { - bcapp := app.NewBandConsumerApp(logger, db, traceStore, false, uint(1), map[int64]bool{}, "") - err := bcapp.LoadHeight(height) - if err != nil { - return nil, nil, nil, err - } - - return bcapp.ExportAppStateAndValidators(forZeroHeight, jailWhiteList) - } - - bcapp := app.NewBandConsumerApp(logger, db, traceStore, true, uint(1), map[int64]bool{}, "") - return bcapp.ExportAppStateAndValidators(forZeroHeight, jailWhiteList) -} diff --git a/band-consumer/cmd/bcd/replay.go b/band-consumer/cmd/bcd/replay.go deleted file mode 100644 index acc6f4693d..0000000000 --- a/band-consumer/cmd/bcd/replay.go +++ /dev/null @@ -1,195 +0,0 @@ -package main - -import ( - "fmt" - "io" - "os" - "path/filepath" - "time" - - cpm "github.com/otiai10/copy" - "github.com/spf13/cobra" - - abci "github.com/tendermint/tendermint/abci/types" - tmos "github.com/tendermint/tendermint/libs/os" - "github.com/tendermint/tendermint/proxy" - tmsm "github.com/tendermint/tendermint/state" - tmstore "github.com/tendermint/tendermint/store" - tm "github.com/tendermint/tendermint/types" - - "github.com/bandprotocol/band-consumer/app" - - "github.com/cosmos/cosmos-sdk/baseapp" - "github.com/cosmos/cosmos-sdk/server" - "github.com/cosmos/cosmos-sdk/store" - sdk "github.com/cosmos/cosmos-sdk/types" -) - -func replayCmd() *cobra.Command { - return &cobra.Command{ - Use: "replay ", - Short: "Replay band-consumer transactions", - RunE: func(_ *cobra.Command, args []string) error { - return replayTxs(args[0]) - }, - Args: cobra.ExactArgs(1), - } -} - -func replayTxs(rootDir string) error { - - if false { - // Copy the rootDir to a new directory, to preserve the old one. - fmt.Fprintln(os.Stderr, "Copying rootdir over") - oldRootDir := rootDir - - rootDir = oldRootDir + "_replay" - if tmos.FileExists(rootDir) { - tmos.Exit(fmt.Sprintf("temporary copy dir %v already exists", rootDir)) - } - - if err := cpm.Copy(oldRootDir, rootDir); err != nil { - return err - } - } - - configDir := filepath.Join(rootDir, "config") - dataDir := filepath.Join(rootDir, "data") - ctx := server.NewDefaultContext() - - // App DB - // appDB := dbm.NewMemDB() - fmt.Fprintln(os.Stderr, "Opening app database") - appDB, err := sdk.NewLevelDB("application", dataDir) - if err != nil { - return err - } - - // TM DB - // tmDB := dbm.NewMemDB() - fmt.Fprintln(os.Stderr, "Opening tendermint state database") - tmDB, err := sdk.NewLevelDB("state", dataDir) - if err != nil { - return err - } - - // Blockchain DB - fmt.Fprintln(os.Stderr, "Opening blockstore database") - bcDB, err := sdk.NewLevelDB("blockstore", dataDir) - if err != nil { - return err - } - - // TraceStore - var traceStoreWriter io.Writer - var traceStoreDir = filepath.Join(dataDir, "trace.log") - traceStoreWriter, err = os.OpenFile( - traceStoreDir, - os.O_WRONLY|os.O_APPEND|os.O_CREATE, - 0666, - ) - if err != nil { - return err - } - - // Application - fmt.Fprintln(os.Stderr, "Creating application") - bcapp := app.NewBandConsumerApp( - ctx.Logger, appDB, traceStoreWriter, true, uint(1), map[int64]bool{}, "", - baseapp.SetPruning(store.PruneEverything), // nothing - ) - - // Genesis - var genDocPath = filepath.Join(configDir, "genesis.json") - genDoc, err := tm.GenesisDocFromFile(genDocPath) - if err != nil { - return err - } - genState, err := tmsm.MakeGenesisState(genDoc) - if err != nil { - return err - } - // tmsm.SaveState(tmDB, genState) - - cc := proxy.NewLocalClientCreator(bcapp) - proxyApp := proxy.NewAppConns(cc) - err = proxyApp.Start() - if err != nil { - return err - } - defer func() { - err = proxyApp.Stop() - if err != nil { - return - } - }() - - state := tmsm.LoadState(tmDB) - if state.LastBlockHeight == 0 { - // Send InitChain msg - fmt.Fprintln(os.Stderr, "Sending InitChain msg") - validators := tm.TM2PB.ValidatorUpdates(genState.Validators) - csParams := tm.TM2PB.ConsensusParams(genDoc.ConsensusParams) - req := abci.RequestInitChain{ - Time: genDoc.GenesisTime, - ChainId: genDoc.ChainID, - ConsensusParams: csParams, - Validators: validators, - AppStateBytes: genDoc.AppState, - } - res, err := proxyApp.Consensus().InitChainSync(req) - if err != nil { - return err - } - newValidatorz, err := tm.PB2TM.ValidatorUpdates(res.Validators) - if err != nil { - return err - } - newValidators := tm.NewValidatorSet(newValidatorz) - - // Take the genesis state. - state = genState - state.Validators = newValidators - state.NextValidators = newValidators - } - - // Create executor - fmt.Fprintln(os.Stderr, "Creating block executor") - blockExec := tmsm.NewBlockExecutor(tmDB, ctx.Logger, proxyApp.Consensus(), nil, tmsm.MockEvidencePool{}) - - // Create block store - fmt.Fprintln(os.Stderr, "Creating block store") - blockStore := tmstore.NewBlockStore(bcDB) - - tz := []time.Duration{0, 0, 0} - for i := int(state.LastBlockHeight) + 1; ; i++ { - fmt.Fprintln(os.Stderr, "Running block ", i) - t1 := time.Now() - - // Apply block - fmt.Printf("loading and applying block %d\n", i) - blockmeta := blockStore.LoadBlockMeta(int64(i)) - if blockmeta == nil { - fmt.Printf("Couldn't find block meta %d... done?\n", i) - return nil - } - block := blockStore.LoadBlock(int64(i)) - if block == nil { - return fmt.Errorf("couldn't find block %d", i) - } - - t2 := time.Now() - - state, _, err = blockExec.ApplyBlock(state, blockmeta.BlockID, block) - if err != nil { - return err - } - - t3 := time.Now() - tz[0] += t2.Sub(t1) - tz[1] += t3.Sub(t2) - - fmt.Fprintf(os.Stderr, "new app hash: %X\n", state.AppHash) - fmt.Fprintln(os.Stderr, tz) - } -} diff --git a/band-consumer/cmd/bcd/testnet.go b/band-consumer/cmd/bcd/testnet.go deleted file mode 100644 index 57818df418..0000000000 --- a/band-consumer/cmd/bcd/testnet.go +++ /dev/null @@ -1,389 +0,0 @@ -package main - -// DONTCOVER - -import ( - "bufio" - "encoding/json" - "fmt" - "net" - "os" - "path/filepath" - - "github.com/spf13/cobra" - "github.com/spf13/viper" - tmconfig "github.com/tendermint/tendermint/config" - "github.com/tendermint/tendermint/crypto" - tmos "github.com/tendermint/tendermint/libs/os" - tmrand "github.com/tendermint/tendermint/libs/rand" - "github.com/tendermint/tendermint/types" - tmtime "github.com/tendermint/tendermint/types/time" - - "github.com/cosmos/cosmos-sdk/client/flags" - clientkeys "github.com/cosmos/cosmos-sdk/client/keys" - "github.com/cosmos/cosmos-sdk/codec" - "github.com/cosmos/cosmos-sdk/crypto/keyring" - "github.com/cosmos/cosmos-sdk/server" - srvconfig "github.com/cosmos/cosmos-sdk/server/config" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/module" - "github.com/cosmos/cosmos-sdk/x/auth" - authexported "github.com/cosmos/cosmos-sdk/x/auth/exported" - "github.com/cosmos/cosmos-sdk/x/bank" - "github.com/cosmos/cosmos-sdk/x/genutil" - "github.com/cosmos/cosmos-sdk/x/staking" -) - -var ( - flagNodeDirPrefix = "node-dir-prefix" - flagNumValidators = "v" - flagOutputDir = "output-dir" - flagNodeDaemonHome = "node-daemon-home" - flagNodeCLIHome = "node-cli-home" - flagStartingIPAddress = "starting-ip-address" -) - -// get cmd to initialize all files for tendermint testnet and application -func testnetCmd(ctx *server.Context, cdc *codec.Codec, - mbm module.BasicManager, genBalIterator bank.GenesisBalancesIterator, -) *cobra.Command { - - cmd := &cobra.Command{ - Use: "testnet", - Short: "Initialize files for a Gaiad testnet", - Long: `testnet will create "v" number of directories and populate each with -necessary files (private validator, genesis, config, etc.). - -Note, strict routability for addresses is turned off in the config file. - -Example: - gaiad testnet --v 4 --output-dir ./output --starting-ip-address 192.168.10.2 - `, - RunE: func(cmd *cobra.Command, _ []string) error { - config := ctx.Config - - outputDir := viper.GetString(flagOutputDir) - chainID := viper.GetString(flags.FlagChainID) - minGasPrices := viper.GetString(server.FlagMinGasPrices) - nodeDirPrefix := viper.GetString(flagNodeDirPrefix) - nodeDaemonHome := viper.GetString(flagNodeDaemonHome) - nodeCLIHome := viper.GetString(flagNodeCLIHome) - startingIPAddress := viper.GetString(flagStartingIPAddress) - numValidators := viper.GetInt(flagNumValidators) - - return InitTestnet(cmd, config, cdc, mbm, genBalIterator, outputDir, chainID, - minGasPrices, nodeDirPrefix, nodeDaemonHome, nodeCLIHome, startingIPAddress, numValidators) - }, - } - - cmd.Flags().Int(flagNumValidators, 4, - "Number of validators to initialize the testnet with") - cmd.Flags().StringP(flagOutputDir, "o", "./mytestnet", - "Directory to store initialization data for the testnet") - cmd.Flags().String(flagNodeDirPrefix, "node", - "Prefix the directory name for each node with (node results in node0, node1, ...)") - cmd.Flags().String(flagNodeDaemonHome, "gaiad", - "Home directory of the node's daemon configuration") - cmd.Flags().String(flagNodeCLIHome, "gaiacli", - "Home directory of the node's cli configuration") - cmd.Flags().String(flagStartingIPAddress, "192.168.0.1", - "Starting IP address (192.168.0.1 results in persistent peers list ID0@192.168.0.1:46656, ID1@192.168.0.2:46656, ...)") - cmd.Flags().String( - flags.FlagChainID, "", "genesis file chain-id, if left blank will be randomly created") - cmd.Flags().String( - server.FlagMinGasPrices, fmt.Sprintf("0.000006%s", sdk.DefaultBondDenom), - "Minimum gas prices to accept for transactions; All fees in a tx must meet this minimum (e.g. 0.01photino,0.001stake)") - cmd.Flags().String(flags.FlagKeyringBackend, flags.DefaultKeyringBackend, "Select keyring's backend (os|file|test)") - - return cmd -} - -const nodeDirPerm = 0755 - -// Initialize the testnet -func InitTestnet( - cmd *cobra.Command, config *tmconfig.Config, cdc *codec.Codec, - mbm module.BasicManager, genBalIterator bank.GenesisBalancesIterator, - outputDir, chainID, minGasPrices, nodeDirPrefix, nodeDaemonHome, - nodeCLIHome, startingIPAddress string, numValidators int, -) error { - - if chainID == "" { - chainID = "chain-" + tmrand.NewRand().Str(6) - } - - monikers := make([]string, numValidators) - nodeIDs := make([]string, numValidators) - valPubKeys := make([]crypto.PubKey, numValidators) - - gaiaConfig := srvconfig.DefaultConfig() - gaiaConfig.MinGasPrices = minGasPrices - - //nolint:prealloc - var ( - genAccounts []authexported.GenesisAccount - genBalances []bank.Balance - genFiles []string - ) - - inBuf := bufio.NewReader(cmd.InOrStdin()) - // generate private keys, node IDs, and initial transactions - for i := 0; i < numValidators; i++ { - nodeDirName := fmt.Sprintf("%s%d", nodeDirPrefix, i) - nodeDir := filepath.Join(outputDir, nodeDirName, nodeDaemonHome) - clientDir := filepath.Join(outputDir, nodeDirName, nodeCLIHome) - gentxsDir := filepath.Join(outputDir, "gentxs") - - config.SetRoot(nodeDir) - config.RPC.ListenAddress = "tcp://0.0.0.0:26657" - - if err := os.MkdirAll(filepath.Join(nodeDir, "config"), nodeDirPerm); err != nil { - _ = os.RemoveAll(outputDir) - return err - } - - if err := os.MkdirAll(clientDir, nodeDirPerm); err != nil { - _ = os.RemoveAll(outputDir) - return err - } - - monikers = append(monikers, nodeDirName) - config.Moniker = nodeDirName - - ip, err := getIP(i, startingIPAddress) - if err != nil { - _ = os.RemoveAll(outputDir) - return err - } - - nodeIDs[i], valPubKeys[i], err = genutil.InitializeNodeValidatorFiles(config) - if err != nil { - _ = os.RemoveAll(outputDir) - return err - } - - memo := fmt.Sprintf("%s@%s:26656", nodeIDs[i], ip) - genFiles = append(genFiles, config.GenesisFile()) - - kb, err := keyring.New( - sdk.KeyringServiceName(), - viper.GetString(flags.FlagKeyringBackend), - clientDir, - inBuf, - ) - if err != nil { - return err - } - - keyPass := clientkeys.DefaultKeyPass - addr, secret, err := server.GenerateSaveCoinKey(kb, nodeDirName, keyPass, true) - if err != nil { - _ = os.RemoveAll(outputDir) - return err - } - - info := map[string]string{"secret": secret} - - cliPrint, err := json.Marshal(info) - if err != nil { - return err - } - - // save private key seed words - if err := writeFile(fmt.Sprintf("%v.json", "key_seed"), clientDir, cliPrint); err != nil { - return err - } - - accTokens := sdk.TokensFromConsensusPower(1000) - accStakingTokens := sdk.TokensFromConsensusPower(500) - coins := sdk.Coins{ - sdk.NewCoin(fmt.Sprintf("%stoken", nodeDirName), accTokens), - sdk.NewCoin(sdk.DefaultBondDenom, accStakingTokens), - } - - genBalances = append(genBalances, bank.Balance{Address: addr, Coins: coins.Sort()}) - genAccounts = append(genAccounts, auth.NewBaseAccount(addr, nil, 0, 0)) - - valTokens := sdk.TokensFromConsensusPower(100) - msg := staking.NewMsgCreateValidator( - sdk.ValAddress(addr), - valPubKeys[i], - sdk.NewCoin(sdk.DefaultBondDenom, valTokens), - staking.NewDescription(nodeDirName, "", "", "", ""), - staking.NewCommissionRates(sdk.OneDec(), sdk.OneDec(), sdk.OneDec()), - sdk.OneInt(), - ) - - tx := auth.NewStdTx([]sdk.Msg{msg}, auth.StdFee{}, []auth.StdSignature{}, memo) - txBldr := auth.NewTxBuilderFromCLI(inBuf).WithChainID(chainID).WithMemo(memo).WithKeybase(kb) - - signedTx, err := txBldr.SignStdTx(nodeDirName, clientkeys.DefaultKeyPass, tx, false) - if err != nil { - _ = os.RemoveAll(outputDir) - return err - } - - txBytes, err := cdc.MarshalJSON(signedTx) - if err != nil { - _ = os.RemoveAll(outputDir) - return err - } - - // gather gentxs folder - if err := writeFile(fmt.Sprintf("%v.json", nodeDirName), gentxsDir, txBytes); err != nil { - _ = os.RemoveAll(outputDir) - return err - } - - // TODO: Rename config file to server.toml as it's not particular to Gaia - // (REF: https://github.com/cosmos/cosmos-sdk/issues/4125). - gaiaConfigFilePath := filepath.Join(nodeDir, "config/gaiad.toml") - srvconfig.WriteConfigFile(gaiaConfigFilePath, gaiaConfig) - } - - if err := initGenFiles(cdc, mbm, chainID, genAccounts, genBalances, genFiles, numValidators); err != nil { - return err - } - - err := collectGenFiles( - cdc, config, chainID, monikers, nodeIDs, valPubKeys, numValidators, - outputDir, nodeDirPrefix, nodeDaemonHome, genBalIterator, - ) - if err != nil { - return err - } - - cmd.PrintErrf("Successfully initialized %d node directories\n", numValidators) - return nil -} - -func initGenFiles( - cdc *codec.Codec, mbm module.BasicManager, chainID string, - genAccounts []authexported.GenesisAccount, genBalances []bank.Balance, - genFiles []string, numValidators int, -) error { - - appGenState := mbm.DefaultGenesis(cdc) - - // set the accounts in the genesis state - var authGenState auth.GenesisState - cdc.MustUnmarshalJSON(appGenState[auth.ModuleName], &authGenState) - - authGenState.Accounts = genAccounts - appGenState[auth.ModuleName] = cdc.MustMarshalJSON(authGenState) - - // set the balances in the genesis state - var bankGenState bank.GenesisState - cdc.MustUnmarshalJSON(appGenState[bank.ModuleName], &bankGenState) - - bankGenState.Balances = genBalances - appGenState[bank.ModuleName] = cdc.MustMarshalJSON(bankGenState) - - appGenStateJSON, err := codec.MarshalJSONIndent(cdc, appGenState) - if err != nil { - return err - } - - genDoc := types.GenesisDoc{ - ChainID: chainID, - AppState: appGenStateJSON, - Validators: nil, - } - - // generate empty genesis files for each validator and save - for i := 0; i < numValidators; i++ { - if err := genDoc.SaveAs(genFiles[i]); err != nil { - return err - } - } - return nil -} - -func collectGenFiles( - cdc *codec.Codec, config *tmconfig.Config, chainID string, - monikers, nodeIDs []string, valPubKeys []crypto.PubKey, - numValidators int, outputDir, nodeDirPrefix, nodeDaemonHome string, - genBalIterator bank.GenesisBalancesIterator, -) error { - - var appState json.RawMessage - genTime := tmtime.Now() - - for i := 0; i < numValidators; i++ { - nodeDirName := fmt.Sprintf("%s%d", nodeDirPrefix, i) - nodeDir := filepath.Join(outputDir, nodeDirName, nodeDaemonHome) - gentxsDir := filepath.Join(outputDir, "gentxs") - moniker := monikers[i] - config.Moniker = nodeDirName - - config.SetRoot(nodeDir) - - nodeID, valPubKey := nodeIDs[i], valPubKeys[i] - initCfg := genutil.NewInitConfig(chainID, gentxsDir, moniker, nodeID, valPubKey) - - genDoc, err := types.GenesisDocFromFile(config.GenesisFile()) - if err != nil { - return err - } - - nodeAppState, err := genutil.GenAppStateFromConfig(cdc, config, initCfg, *genDoc, genBalIterator) - if err != nil { - return err - } - - if appState == nil { - // set the canonical application state (they should not differ) - appState = nodeAppState - } - - genFile := config.GenesisFile() - - // overwrite each validator's genesis file to have a canonical genesis time - if err := genutil.ExportGenesisFileWithTime(genFile, chainID, nil, appState, genTime); err != nil { - return err - } - } - - return nil -} - -func getIP(i int, startingIPAddr string) (ip string, err error) { - if len(startingIPAddr) == 0 { - ip, err = server.ExternalIP() - if err != nil { - return "", err - } - return ip, nil - } - return calculateIP(startingIPAddr, i) -} - -func calculateIP(ip string, i int) (string, error) { - ipv4 := net.ParseIP(ip).To4() - if ipv4 == nil { - return "", fmt.Errorf("%v: non ipv4 address", ip) - } - - for j := 0; j < i; j++ { - ipv4[3]++ - } - - return ipv4.String(), nil -} - -func writeFile(name string, dir string, contents []byte) error { - writePath := filepath.Join(dir) - file := filepath.Join(writePath, name) - - err := tmos.EnsureDir(writePath, 0700) - if err != nil { - return err - } - - err = tmos.WriteFile(file, contents, 0600) - if err != nil { - return err - } - - return nil -} diff --git a/band-consumer/cmd/contract_tests/main.go b/band-consumer/cmd/contract_tests/main.go deleted file mode 100644 index 4f27b03387..0000000000 --- a/band-consumer/cmd/contract_tests/main.go +++ /dev/null @@ -1,44 +0,0 @@ -package main - -import ( - "fmt" - - "github.com/snikch/goodman/hooks" - "github.com/snikch/goodman/transaction" -) - -func main() { - // This must be compiled beforehand and given to dredd as parameter, in the meantime the server should be running - h := hooks.NewHooks() - server := hooks.NewServer(hooks.NewHooksRunner(h)) - h.BeforeAll(func(t []*transaction.Transaction) { - fmt.Println("Sleep 5 seconds before all modification") - }) - h.BeforeEach(func(t *transaction.Transaction) { - fmt.Println("before each modification") - }) - h.Before("/version > GET", func(t *transaction.Transaction) { - fmt.Println("before version TEST") - }) - h.Before("/node_version > GET", func(t *transaction.Transaction) { - fmt.Println("before node_version TEST") - }) - h.BeforeEachValidation(func(t *transaction.Transaction) { - fmt.Println("before each validation modification") - }) - h.BeforeValidation("/node_version > GET", func(t *transaction.Transaction) { - fmt.Println("before validation node_version TEST") - }) - h.After("/node_version > GET", func(t *transaction.Transaction) { - fmt.Println("after node_version TEST") - }) - h.AfterEach(func(t *transaction.Transaction) { - fmt.Println("after each modification") - }) - h.AfterAll(func(t []*transaction.Transaction) { - fmt.Println("after all modification") - }) - server.Serve() - defer server.Listener.Close() - fmt.Print(h) -} diff --git a/band-consumer/contrib/devtools/Makefile b/band-consumer/contrib/devtools/Makefile deleted file mode 100644 index 4e96f75503..0000000000 --- a/band-consumer/contrib/devtools/Makefile +++ /dev/null @@ -1,113 +0,0 @@ -### -# Find OS and Go environment -# GO contains the Go binary -# FS contains the OS file separator -### -ifeq ($(OS),Windows_NT) - GO := $(shell where go.exe 2> NUL) - FS := \\ -else - GO := $(shell command -v go 2> /dev/null) - FS := / -endif - -ifeq ($(GO),) - $(error could not find go. Is it in PATH? $(GO)) -endif - -GOPATH ?= $(shell $(GO) env GOPATH) -GITHUBDIR := $(GOPATH)$(FS)src$(FS)github.com - -### -# Functions -### - -go_get = $(if $(findstring Windows_NT,$(OS)),\ -IF NOT EXIST $(GITHUBDIR)$(FS)$(1)$(FS) ( mkdir $(GITHUBDIR)$(FS)$(1) ) else (cd .) &\ -IF NOT EXIST $(GITHUBDIR)$(FS)$(1)$(FS)$(2)$(FS) ( cd $(GITHUBDIR)$(FS)$(1) && git clone https://github.com/$(1)/$(2) ) else (cd .) &\ -,\ -mkdir -p $(GITHUBDIR)$(FS)$(1) &&\ -(test ! -d $(GITHUBDIR)$(FS)$(1)$(FS)$(2) && cd $(GITHUBDIR)$(FS)$(1) && git clone https://github.com/$(1)/$(2)) || true &&\ -)\ -cd $(GITHUBDIR)$(FS)$(1)$(FS)$(2) && git fetch origin && git checkout -q $(3) - -go_install = $(call go_get,$(1),$(2),$(3)) && cd $(GITHUBDIR)$(FS)$(1)$(FS)$(2) && $(GO) install - -mkfile_path := $(abspath $(lastword $(MAKEFILE_LIST))) -mkfile_dir := $(shell cd $(shell dirname $(mkfile_path)); pwd) - -############################################################################### -### Tools ### -############################################################################### - -BIN ?= /usr/local/bin -UNAME_S ?= $(shell uname -s) -UNAME_M ?= $(shell uname -m) - -TOOLS_DESTDIR ?= $(GOPATH)/bin -RUNSIM = $(TOOLS_DESTDIR)/runsim - -BUF_VERSION ?= 0.7.0 -PROTOC_VERSION ?= 3.11.2 - -ifeq ($(UNAME_S),Linux) - PROTOC_ZIP ?= protoc-3.11.2-linux-x86_64.zip -endif -ifeq ($(UNAME_S),Darwin) - PROTOC_ZIP ?= protoc-3.11.2-osx-x86_64.zip -endif - -all: tools - -tools: tools-stamp - -tools-stamp: $(RUNSIM) - touch $@ - -# Install the runsim binary with a temporary workaround of entering an outside -# directory as the "go get" command ignores the -mod option and will polute the -# go.{mod, sum} files. -# -# ref: https://github.com/golang/go/issues/30515 -$(RUNSIM): - @echo "Installing runsim..." - @(cd /tmp && go get github.com/cosmos/tools/cmd/runsim@v1.0.0) - -protoc: - @echo "Installing protoc compiler..." - @(cd /tmp; \ - curl -sSOL "https://github.com/protocolbuffers/protobuf/releases/download/v${PROTOC_VERSION}/${PROTOC_ZIP}"; \ - unzip -o ${PROTOC_ZIP} -d /usr/local bin/protoc; \ - unzip -o ${PROTOC_ZIP} -d /usr/local 'include/*'; \ - rm -f ${PROTOC_ZIP}) - -protoc-gen-gocosmos: - @echo "Installing protoc-gen-gocosmos..." - @go install github.com/regen-network/cosmos-proto/protoc-gen-gocosmos - -buf: protoc-gen-buf-check-breaking protoc-gen-buf-check-lint - @echo "Installing buf..." - @(cd /tmp; \ - curl -sSOL "https://github.com/bufbuild/buf/releases/download/v${BUF_VERSION}/buf-${UNAME_S}-${UNAME_M}"; \ - mv buf-${UNAME_S}-${UNAME_M} "${BIN}/buf"; \ - chmod +x "${BIN}/buf") - -protoc-gen-buf-check-breaking: - @echo "Installing protoc-gen-buf-check-breaking..." - @(cd /tmp; \ - curl -sSOL "https://github.com/bufbuild/buf/releases/download/v${BUF_VERSION}/protoc-gen-buf-check-breaking-${UNAME_S}-${UNAME_M}"; \ - mv protoc-gen-buf-check-breaking-${UNAME_S}-${UNAME_M} "${BIN}/protoc-gen-buf-check-breaking"; \ - chmod +x "${BIN}/protoc-gen-buf-check-breaking") - -protoc-gen-buf-check-lint: - @echo "Installing protoc-gen-buf-check-lint..." - @(cd /tmp; \ - curl -sSOL "https://github.com/bufbuild/buf/releases/download/v${BUF_VERSION}/protoc-gen-buf-check-lint-${UNAME_S}-${UNAME_M}"; \ - mv protoc-gen-buf-check-lint-${UNAME_S}-${UNAME_M} "${BIN}/protoc-gen-buf-check-lint"; \ - chmod +x "${BIN}/protoc-gen-buf-check-lint") - -tools-clean: - rm -f $(RUNSIM) - rm -f tools-stamp - -.PHONY: all tools tools-clean protoc buf protoc-gen-buf-check-breaking protoc-gen-buf-check-lint protoc-gen-gocosmos diff --git a/band-consumer/docker-compose.yml b/band-consumer/docker-compose.yml deleted file mode 100644 index a0001416e2..0000000000 --- a/band-consumer/docker-compose.yml +++ /dev/null @@ -1,68 +0,0 @@ -version: '3' - -services: - gaiadnode0: - container_name: gaiadnode0 - image: "tendermint/gaiadnode" - ports: - - "26656-26657:26656-26657" - environment: - - ID=0 - - LOG=${LOG:-gaiad.log} - volumes: - - ./build:/gaiad:Z - networks: - localnet: - ipv4_address: 192.168.10.2 - - gaiadnode1: - container_name: gaiadnode1 - image: "tendermint/gaiadnode" - ports: - - "26659-26660:26656-26657" - environment: - - ID=1 - - LOG=${LOG:-gaiad.log} - volumes: - - ./build:/gaiad:Z - networks: - localnet: - ipv4_address: 192.168.10.3 - - gaiadnode2: - container_name: gaiadnode2 - image: "tendermint/gaiadnode" - environment: - - ID=2 - - LOG=${LOG:-gaiad.log} - ports: - - "26661-26662:26656-26657" - volumes: - - ./build:/gaiad:Z - networks: - localnet: - ipv4_address: 192.168.10.4 - - gaiadnode3: - container_name: gaiadnode3 - image: "tendermint/gaiadnode" - environment: - - ID=3 - - LOG=${LOG:-gaiad.log} - ports: - - "26663-26664:26656-26657" - volumes: - - ./build:/gaiad:Z - networks: - localnet: - ipv4_address: 192.168.10.5 - -networks: - localnet: - driver: bridge - ipam: - driver: default - config: - - - subnet: 192.168.10.0/16 - diff --git a/band-consumer/go.mod b/band-consumer/go.mod deleted file mode 100644 index d5231a367f..0000000000 --- a/band-consumer/go.mod +++ /dev/null @@ -1,22 +0,0 @@ -module github.com/bandprotocol/band-consumer - -go 1.13 - -require ( - github.com/bandprotocol/bandchain/chain v0.0.0-20200413032603-6ae7f6e32df7 - github.com/cosmos/cosmos-sdk v0.34.4-0.20200423152229-f1fdde5d1b18 - github.com/gorilla/mux v1.7.4 - github.com/otiai10/copy v1.1.1 - github.com/pkg/errors v0.9.1 - github.com/snikch/goodman v0.0.0-20171125024755-10e37e294daa - github.com/spf13/cobra v1.0.0 - github.com/spf13/viper v1.6.3 - github.com/stretchr/testify v1.5.1 - github.com/tendermint/go-amino v0.15.1 - github.com/tendermint/tendermint v0.33.4 - github.com/tendermint/tm-db v0.5.1 -) - -replace github.com/bandprotocol/bandchain/chain => ../chain - -replace github.com/keybase/go-keychain => github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 diff --git a/band-consumer/go.sum b/band-consumer/go.sum deleted file mode 100644 index 11010db99b..0000000000 --- a/band-consumer/go.sum +++ /dev/null @@ -1,764 +0,0 @@ -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= -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.4 h1:x0g0zQ9bQKgNsLo0XSXAy1H8Q1RG/td+5OXJt+Ci8b8= -github.com/99designs/keyring v1.1.4/go.mod h1:657DQuMrBZRtuL/voxVyiyb6zpMehlm5vLB9Qwrv904= -github.com/Azure/azure-pipeline-go v0.2.1/go.mod h1:UGSo8XybXnIGZ3epmeBw7Jdz+HiUVpqIlpz/HKHylF4= -github.com/Azure/azure-pipeline-go v0.2.2/go.mod h1:4rQ/NZncSvGqNkkOsNpOU1tgoNuIlp9AfUH5G1tvCHc= -github.com/Azure/azure-storage-blob-go v0.7.0/go.mod h1:f9YQKtsG1nMisotuTPpO0tjNuEjKRYAcJU8/ydDI++4= -github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= -github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= -github.com/Azure/go-autorest/autorest/adal v0.8.0/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc= -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/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/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= -github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= -github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/ChainSafe/go-schnorrkel v0.0.0-20200102211924-4bcbc698314f h1:4O1om+UVU+Hfcihr1timk8YNXHxzZWgCo7ofnrZRApw= -github.com/ChainSafe/go-schnorrkel v0.0.0-20200102211924-4bcbc698314f/go.mod h1:URdX5+vg25ts3aCh8H5IFZybJYKWhJHYMTnf+ULtoC4= -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/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/OneOfOne/xxhash v1.2.5/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q= -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.3/go.mod h1:+jv9Ckb+za/P1ZRg/sulP5Ni1v49daAVERr0H3CuscE= -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 h1:PLSK6pwn8mYdaoaCZEMsXBpBotr4HHn9abU0yMQt0NI= -github.com/Workiva/go-datastructures v1.0.52/go.mod h1:Z+F2Rca0qCsVYDS8z7bAGm8f3UkzuWYS/oBZz5a7VVA= -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/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/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= -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-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= -github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= -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-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= -github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bgentry/speakeasy v0.1.0 h1:ByYyxL9InA1OWqxJqqp2A5pYHUrCiAL6K3J+LKSsQkY= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/btcsuite/btcd v0.0.0-20171128150713-2e60448ffcc6/go.mod h1:Dmm/EzmjnCiweXmzRIAiUWCInVmPgjkzgv5k4tVyXiQ= -github.com/btcsuite/btcd v0.0.0-20190115013929-ed77733ec07d h1:xG8Pj6Y6J760xwETNmMzmlt38QSwz0BLp1cZ09g27uw= -github.com/btcsuite/btcd v0.0.0-20190115013929-ed77733ec07d/go.mod h1:d3C0AkH6BRcvO8T0UEPu53cnw4IbV63x1bEjildYhO0= -github.com/btcsuite/btcd v0.20.1-beta h1:Ik4hyJqN8Jfyv3S4AGBOmyouMsYE3EdYODkMbQjwPGw= -github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= -github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= -github.com/btcsuite/btcutil v0.0.0-20180706230648-ab6388e0c60a h1:RQMUrEILyYJEoAT34XS/kLu40vC0+po/UfxrBBA4qZE= -github.com/btcsuite/btcutil v0.0.0-20180706230648-ab6388e0c60a/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= -github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d h1:yJzD/yFppdVCf6ApMkVy8cUxV0XrxdP9rVf6D87/Mng= -github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= -github.com/btcsuite/btcutil v1.0.2 h1:9iZ1Terx9fMIOtq1VrwdqfsATL9MC2l8ZrUY6YZ2uts= -github.com/btcsuite/btcutil v1.0.2/go.mod h1:j9HUFwoQRsZL3V4n+qG+CUnEGHOarIxfC3Le2Yhbcts= -github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= -github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= -github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= -github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= -github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= -github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= -github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= -github.com/census-instrumentation/opencensus-proto v0.2.1/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.0.1-0.20190104013014-3767db7a7e18/go.mod h1:HD5P3vAIAh+Y2GAxg0PrPN1P8WkepXGpjbUPDHJqqKM= -github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cloudflare/cloudflare-go v0.10.2-0.20190916151808-a80f83b9add9/go.mod h1:1MxXX1Ux4x6mqPmjkUgTP1CdXIBXKX7T+Jk9Gxrmx+U= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/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/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-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/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/cosmos-sdk v0.34.4-0.20200423152229-f1fdde5d1b18 h1:9OjontPURNCXMTCeyBx7uG3R3kAGYITXgjFaNj7qfr4= -github.com/cosmos/cosmos-sdk v0.34.4-0.20200423152229-f1fdde5d1b18/go.mod h1:Kcgs8c2WWtO2Q+KmDogvGRw+sdEqpvHYXFhj/QiAoOg= -github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d h1:49RLWk1j44Xu4fjHb6JFYmeUnDORVwHNkDxaQ0ctCVU= -github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d/go.mod h1:tSxLoYXyBmiFeKpvmq4dzayMdCjCnu8uqmCysIGBT2Y= -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= -github.com/cosmos/ledger-go v0.9.2/go.mod h1:oZJ2hHAZROdlHiwTg4t7kP+GKIIkBT+o6c9QWFanOyI= -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/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= -github.com/danieljoos/wincred v1.0.2 h1:zf4bhty2iLuwgjgpraD2E9UbvO+fe54XXGJbOwe23fU= -github.com/danieljoos/wincred v1.0.2/go.mod h1:SnuYRW9lp1oJrZX/dXJqr0cPK5gYXqx3EJbmjhLdK9U= -github.com/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/denisenkom/go-mssqldb v0.0.0-20191124224453-732737034ffd h1:83Wprp6ROGeiHFAP8WJdI2RoxALQYgdllERc3N5N2DM= -github.com/denisenkom/go-mssqldb v0.0.0-20191124224453-732737034ffd/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -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/docker/docker v1.4.2-0.20180625184442-8e610b2b55bf/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/dop251/goja v0.0.0-20200219165308-d1232e640a87/go.mod h1:Mw6PkjjMXWbTj+nnj4s3QPXq1jaT0s5pC0iFD4+BOAA= -github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/dvsekhvalnov/jose2go v0.0.0-20180829124132-7f401d37b68a h1:mq+R6XEM6lJX5VlLyZIrUSP8tSuJp82xTK89hvBwJbU= -github.com/dvsekhvalnov/jose2go v0.0.0-20180829124132-7f401d37b68a/go.mod h1:7BvyPhdbLxMXIYTFPLsyJRFMsKmOZnQmzh6Gb+uquuM= -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/edsrzf/mmap-go v1.0.0 h1:CEBF7HpRnUCSJgGUb5h1Gm7e3VkmVDrR8lvWVLtrOFw= -github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= -github.com/elastic/gosigar v0.8.1-0.20180330100440-37f05ff46ffa/go.mod h1:cdorVVzy1fhmEqmtgqkoE3bYtCfSCkVyjTyCIo22xvs= -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/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5 h1:Yzb9+7DPaBjB8zlTR87/ElzFsnQfuHnVUVqpZZIcV5Y= -github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5/go.mod h1:a2zkGnVExMxdzMo3M0Hi/3sEU+cWnZpSni0O6/Yb/P0= -github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= -github.com/ethereum/go-ethereum v1.9.13/go.mod h1:qwN9d1GLyDh0N7Ab8bMGd0H9knaji2jOBm2RrMGjXls= -github.com/facebookgo/ensure v0.0.0-20160127193407-b4ab57deab51 h1:0JZ+dUmQeA8IIVUMzysrX4/AKuQwWhV2dYQuPZdvdSQ= -github.com/facebookgo/ensure v0.0.0-20160127193407-b4ab57deab51/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 h1:E2s37DuLxFhQDg5gKsWoLBOB0n+ZW8s599zru8FJ2/Y= -github.com/facebookgo/subset v0.0.0-20150612182917-8dac2c3c4870/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/fjl/memsize v0.0.0-20180418122429-ca190fb6ffbc/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= -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/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= -github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/gibson042/canonicaljson-go v1.0.3 h1:EAyF8L74AWabkyUmrvEFHEt/AGFQeD6RfwbAuf0j1bI= -github.com/gibson042/canonicaljson-go v1.0.3/go.mod h1:DsLpJTThXyGNO+KZlI85C1/KDcImpP67k/RKVjcaEqo= -github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= -github.com/gin-gonic/gin v1.6.2/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= -github.com/go-interpreter/wagon v0.6.0 h1:BBxDxjiJiHgw9EdkYXAWs8NHhwnazZ5P2EWBW5hFNWw= -github.com/go-interpreter/wagon v0.6.0/go.mod h1:5+b/MBYkclRZngKF5s6qrgWxSLgE9F5dFdO1hAueZLc= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.10.0 h1:dXFJfIHVvUcpSgDOV+Ne6t7jXri8Tfv2uOLHUZ2XNuo= -github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= -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 h1:TrB8swr/68K7m9CcGut2g3UOihhbcbiMAYiuTXdEih4= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= -github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= -github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= -github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= -github.com/go-sourcemap/sourcemap v2.1.2+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= -github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= -github.com/go-sql-driver/mysql v1.4.1 h1:g24URVg0OFbNUTx9qqY1IRZ9D9z3iPyi5zKhQZpNwpA= -github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= -github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 h1:ZpnhV/YsD2/4cESfV5+Hoeu/iUR3ruzNvZ+yQfO03a0= -github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= -github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe h1:lXe2qZdvpiX5WZkZR4hgp4KJVfY3nMkvmwbVkpv1rVY= -github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.4.3 h1:GV+pQPG/EUUbkh47niozDcADz6go/dUwhVzdUQHIVRw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -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= -github.com/golang/protobuf v1.3.2-0.20190517061210-b285ee9cfc6c/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0 h1:oOuy+ugB+P/kBdUnG5QaMXSIyJ1q38wWSojYCb3z5VQ= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= -github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/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= -github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -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 h1:A8PeW59pxE9IoFRqBp37U+mSNaQoZ46F1f0f863XSXw= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -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/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= -github.com/gorilla/handlers v1.4.2 h1:0QniY0USkHQ1RGCLfKxeNHK9bkDHGRYGNDFBCS+YARg= -github.com/gorilla/handlers v1.4.2/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= -github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.7.4 h1:VuZ8uybHlWmqV03+zRzdwKL4tUnIp1MAQtp1mIFE1bc= -github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.1-0.20190629185528-ae1634f6a989/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.1 h1:q7AeDBpnBk8AogcD4DSag/Ukw/KV+YhzLj2bP5HvKCM= -github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/graph-gophers/graphql-go v0.0.0-20191115155744-f33e81362277/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -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/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 h1:8N8XWLZelZNibkhM1FuF+3Ad3YIbgirjdMiVA0eUkaM= -github.com/gtank/merlin v0.1.1-0.20191105220539-8318aed1a79f/go.mod h1:T86dnYJhcGOh5BjZFCJWTDeTK7XW8uE+E21Cy/bIQ+s= -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.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= -github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -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/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= -github.com/hashicorp/golang-lru v0.0.0-20160813221303-0a025b7e63ad/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -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/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/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= -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/huin/goupnp v0.0.0-20161224104101-679507af18f3/go.mod h1:MZ2ZmwcBpvOoJ22IJsc7va19ZwoheaBk43rKg12SKag= -github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/influxdata/influxdb v1.2.3-0.20180221223340-01288bdb0883/go.mod h1:qZna6X/4elxqT3yI9iZYdZrWWdeFOOprn86kgg4+IzY= -github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= -github.com/jackpal/go-nat-pmp v1.0.2-0.20160603034137-1fa385a6f458/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= -github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jinzhu/gorm v1.9.12 h1:Drgk1clyWT9t9ERbzHza6Mj/8FY/CqMyVzOiHviMo6Q= -github.com/jinzhu/gorm v1.9.12/go.mod h1:vhTjlKSJUTWNtcbQtrMBFCxy7eXTzeCAzfL5fBZT/Qs= -github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= -github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= -github.com/jinzhu/now v1.0.1 h1:HjfetcXq097iXP0uoPCdnM4Efp5/9MsM0/M+XOTeR3M= -github.com/jinzhu/now v1.0.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= -github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jmhodges/levigo v1.0.0 h1:q5EC36kV79HWeTBWsod3mG11EgStG3qArTKcvlksN1U= -github.com/jmhodges/levigo v1.0.0/go.mod h1:Q6Qx+uH3RAqyK4rFQroq9RL7mdkABMcfhEI+nNuzMJQ= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= -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/karalabe/usb v0.0.0-20190919080040-51dc0efba356/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= -github.com/kisielk/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/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= -github.com/levigross/grequests v0.0.0-20190908174114-253788527a1a/go.mod h1:jVntzcUU+2BtVohZBQmSHWUmh8B55LCNfPhcNCIvvIg= -github.com/lib/pq v1.1.1 h1:sJZmqHoEaY7f+NPP8pgLB/WxulyR3fewgCM2qaSlBb4= -github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -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/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/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 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= -github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -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-ieproxy v0.0.0-20190610004146-91bb50d98149/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= -github.com/mattn/go-ieproxy v0.0.0-20190702010315-6dee0af9227d/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.5-0.20180830101745-3fb116b82035/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -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-shellwords v1.0.10/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= -github.com/mattn/go-sqlite3 v2.0.1+incompatible h1:xQ15muvnzGBHpIpdrNi1DA5x0+TcBZzsIDwmw9uTHzw= -github.com/mattn/go-sqlite3 v2.0.1+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= -github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/mimoo/StrobeGo v0.0.0-20181016162300-f8f6d4d2b643 h1:hLDRPB66XQT/8+wG9WsDpiCvZf1yKO7sz7scAjSlBa0= -github.com/mimoo/StrobeGo v0.0.0-20181016162300-f8f6d4d2b643/go.mod h1:43+3pMjjKimDBf5Kr4ZFNGbLql1zKkbImw+fZbw3geM= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -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/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 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -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/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= -github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= -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/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= -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/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.7.0 h1:WSHQ+IS43OoUrWtD1/bbclrwK8TTH5hzp+umCiuxHgs= -github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.8.0 h1:VkHVNpR4iVnU8XQR6DBm8BqYjN7CRzw+xKUbVVbbW9w= -github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/gomega v1.4.3 h1:RE1xgDvH7imwFD45h+u2SgIfERHlS2yNG4DObb5BSKU= -github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.5.0 h1:izbySO9zDPmjJ8rDjLvkA2zJHIo+HkYXHnf7eN7SSyo= -github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= -github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= -github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= -github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/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/otiai10/copy v1.1.1 h1:PH7IFlRQ6Fv9vYmuXbDRLdgTHoP1w483kPNUP2bskpo= -github.com/otiai10/copy v1.1.1/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw= -github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= -github.com/otiai10/curr v1.0.0 h1:TJIWdbX0B+kpNagQrjgq8bCMrbhiuX73M2XwgtDMoOI= -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 h1:BCmzIS3n71sGfHB5NMNDB3lHYPz8fWSkCAErHed//qc= -github.com/otiai10/mint v1.3.1/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc= -github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pborman/uuid v0.0.0-20170112150404-1b00554d8222/go.mod h1:VyrYX9gd7irzKovcSS6BIIEwPRkP2Wm2m9ufcdFSJ34= -github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml v1.7.0 h1:7utD74fnzVc/cpcyy8sjrlFr5vYpypUixARcHIMIGuI= -github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE= -github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= -github.com/perlin-network/life v0.0.0-20191203030451-05c0e0f7eaea h1:okKoivlkNRRLqXraEtatHfEhW+D71QTwkaj+4n4M2Xc= -github.com/perlin-network/life v0.0.0-20191203030451-05c0e0f7eaea/go.mod h1:3KEU5Dm8MAYWZqity880wOFJ9PhQjyKVZGwAEfc5Q4E= -github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= -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/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= -github.com/prometheus/client_golang v1.5.0 h1:Ctq0iGpCmr3jeP77kbF2UxgvRwzWWz+4Bh9/vJTyg1A= -github.com/prometheus/client_golang v1.5.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= -github.com/prometheus/client_golang v1.5.1 h1:bdHYieyGlH+6OLEk2YQha8THib30KP0/yD0YH9m6xcA= -github.com/prometheus/client_golang v1.5.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= -github.com/prometheus/common v0.9.1 h1:KOMtN28tlbam3/7ZKEYKHhKoJZYYj3gMH4uc62x7X7U= -github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.8 h1:+fpWZdT24pJBiqJdAwYBjPSk+5YmQzYNPYzQsdzLkt8= -github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= -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/rakyll/statik v0.1.7 h1:OF3QCZUuyPxuGEP7B4ypUa7sB/iHtqOTDYZXGM8KOdQ= -github.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc= -github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a h1:9ZKAASQSHhDYGoxY8uLVpewe1GDZ2vu2Tr/vTdVAkFQ= -github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0 h1:MkV+77GLUNo5oJ0jf870itWm3D0Sjh7+Za9gazKc5LQ= -github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/regen-network/cosmos-proto v0.2.2 h1:qAuQxio6lmZ3ghpeSMrhqT+Xq/FkuimzWD8o0YR9Gmo= -github.com/regen-network/cosmos-proto v0.2.2/go.mod h1:4jLYG3Qk6EtkOj3/FK7ziS5+LurpGPzJ41ungpzThcw= -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/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rs/cors v0.0.0-20160617231935-a62a804a8a00/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= -github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= -github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= -github.com/rs/xhandler v0.0.0-20160618193221-ed27b6fd6521/go.mod h1:RvLn4FgxWubrpZHtQLnOf6EwhN2hEMusxZOhcW9H3UQ= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/snikch/goodman v0.0.0-20171125024755-10e37e294daa h1:YJfZp12Z3AFhSBeXOlv4BO55RMwPn2NoQeDsrdWnBtY= -github.com/snikch/goodman v0.0.0-20171125024755-10e37e294daa/go.mod h1:oJyF+mSPHbB5mVY2iO9KV3pTt/QbIkGaO8gQ2WrDbP4= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spaolacci/murmur3 v1.0.1-0.20190317074736-539464a789e9/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.2.2 h1:5jhuqJyZCZf2JRofRvN/nIFgIWNzPa3/Vz8mYylgbWc= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v0.0.6/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= -github.com/spf13/cobra v1.0.0 h1:6m/oheQuQ13N9ks4hubMG6BnvwOeaJrqSPLahSnczz8= -github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= -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= -github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -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.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= -github.com/spf13/viper v1.6.2 h1:7aKfF+e8/k68gda3LOjo5RxiUqddoFxVq4BKBPrxk5E= -github.com/spf13/viper v1.6.2/go.mod h1:t3iDnF5Jlj76alVNuyFBk5oUMCvsrkbvZK0WQdfDi5k= -github.com/spf13/viper v1.6.3 h1:pDDu1OyEDTKzpJwdq4TiuLyMsUgRa/BT5cn5O62NoHs= -github.com/spf13/viper v1.6.3/go.mod h1:jUMtyi0/lB5yZH/FjyGAoH7IMNrIhlBf6pXZmbMDvzw= -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/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/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -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 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/syndtr/goleveldb v1.0.1-0.20190923125748-758128399b1d h1:gZZadD8H+fF+n9CmNhYL1Y0dJB+kLOmKd7FbPJLeGHs= -github.com/syndtr/goleveldb v1.0.1-0.20190923125748-758128399b1d/go.mod h1:9OrXJhf154huy1nPWmuSrkgjPUtUNhA+Zmy+6AESzuA= -github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c h1:g+WoO5jjkqGAzHWCjJB1zZfXPIAaDpzXIEJ0eS6B5Ok= -github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c/go.mod h1:ahpPrc7HpcfEWDQRZEmnXMzHY03mLDYMCxeDzy46i+8= -github.com/tendermint/btcd v0.1.1 h1:0VcxPfflS2zZ3RiOAHkBiFUcPvbtRj5O7zHmcJWHV7s= -github.com/tendermint/btcd v0.1.1/go.mod h1:DC6/m53jtQzr/NFmMNEu0rxf18/ktVoVtMrnDD5pN+U= -github.com/tendermint/crypto v0.0.0-20191022145703-50d29ede1e15 h1:hqAk8riJvK4RMWx1aInLzndwxKalgi5rTqgfXxOxbEI= -github.com/tendermint/crypto v0.0.0-20191022145703-50d29ede1e15/go.mod h1:z4YtwM70uOnk8h0pjJYlj3zdYwi9l03By6iAIF5j/Pk= -github.com/tendermint/go-amino v0.14.1/go.mod h1:i/UKE5Uocn+argJJBb12qTZsCDBcAYMbR92AaJVmKso= -github.com/tendermint/go-amino v0.15.1 h1:D2uk35eT4iTsvJd9jWIetzthE5C0/k2QmMFkCN+4JgQ= -github.com/tendermint/go-amino v0.15.1/go.mod h1:TQU0M1i/ImAo+tYpZi73AU3V/dKeCoMC9Sphe2ZwGME= -github.com/tendermint/iavl v0.13.3 h1:expgBDY1MX+6/3sqrIxGChbTNf9N9aTJ67SH4bPchCs= -github.com/tendermint/iavl v0.13.3/go.mod h1:2lE7GiWdSvc7kvT78ncIKmkOjCnp6JEnSb2O7B9htLw= -github.com/tendermint/tendermint v0.33.2 h1:NzvRMTuXJxqSsFed2J7uHmMU5N1CVzSpfi3nCc882KY= -github.com/tendermint/tendermint v0.33.2/go.mod h1:25DqB7YvV1tN3tHsjWoc2vFtlwICfrub9XO6UBO+4xk= -github.com/tendermint/tendermint v0.33.4 h1:NM3G9618yC5PaaxGrcAySc5ylc1PAANeIx42u2Re/jo= -github.com/tendermint/tendermint v0.33.4/go.mod h1:6NW9DVkvsvqmCY6wbRsOo66qGDhMXglRL70aXajvBEA= -github.com/tendermint/tm-db v0.4.1/go.mod h1:JsJ6qzYkCGiGwm5GHl/H5GLI9XLb6qZX7PRe425dHAY= -github.com/tendermint/tm-db v0.5.1 h1:H9HDq8UEA7Eeg13kdYckkgwwkQLBnJGgX4PgLJRhieY= -github.com/tendermint/tm-db v0.5.1/go.mod h1:g92zWjHpCYlEvQXvy9M168Su8V1IBEeawpXVVBaK4f4= -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/twitchyliquid64/golang-asm v0.0.0-20190126203739-365674df15fc h1:RTUQlKzoZZVG3umWNzOYeFecQLIh+dbxXvJp1zPQJTI= -github.com/twitchyliquid64/golang-asm v0.0.0-20190126203739-365674df15fc/go.mod h1:NoCfSFWosfqMqmmD7hApkirIK9ozpHjxRnRxs1l413A= -github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= -github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -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/vmihailenco/msgpack v4.0.4+incompatible h1:dSLoQfGFAo3F6OoNhwUmLwVgaUXK79GlxNBwueZn0xI= -github.com/vmihailenco/msgpack v4.0.4+incompatible/go.mod h1:fy3FlTQTDXWkZ7Bh6AcGMlsjHatGryHQYUTf1ShIgkk= -github.com/wsddn/go-ecdh v0.0.0-20161211032359-48726bab9208/go.mod h1:IotVbo4F+mw0EzQ08zFqg7pK3FebNXpaMsRy2RT+Ees= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/zondax/hid v0.9.0 h1:eiT3P6vNxAEVxXMw66eZUAAnU2zD33JBkfG/EnfAKl8= -github.com/zondax/hid v0.9.0/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.3 h1:MUGmc65QhB3pIlaQ5bB4LwqSj6GIonVJXpZiaKNyaKk= -go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= -go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= -go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -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/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= -go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= -golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191205180655-e7c4368fe9dd/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413 h1:ULYEB3JvPRE/IfO+9uO7vKV/xzVTO7XPAwm8xbf4w2g= -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-20200311171314-f7b00557c8c4/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200406173513-056763e48d71 h1:DOmugCavvUtnUD114C1Wh+UgTgQZ4pMLzXxi1pSt+/Y= -golang.org/x/crypto v0.0.0-20200406173513-056763e48d71/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -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= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -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= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/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-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e h1:3G+cUijn7XD+S4eJFddp53Pv7+slrESplyjG25HgL+k= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -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/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-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/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= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190306220234-b354f8bf4d9e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190712062909-fae7ac547cb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82 h1:ywK/j/KkyTHcdyYSZNXGjMwgmDSfjglYZ3vStQ/gSCU= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd h1:xhmwyvizuTgC2qz7ZlMluP20uW+C3Rm0FD/WLDX8884= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -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.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/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-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -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-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -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 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= -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.6.0 h1:Tfd7cKwKbFRsI8RMAD3oqqw7JPFRrvFlOsfbgVkjOOw= -google.golang.org/appengine v1.6.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -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-20190307195333-5fe7a883aa19/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-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55 h1:gSJIx1SDwno+2ElGhA4+qG2zF97qiUzTM+rQ0klBOcE= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0 h1:bO/TA4OxCOummhSf10siHuG7vJOiwh7SpRpFZDkOgl4= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.28.1 h1:C1QC6KzgSiLyBabDi87BbjaGreoRgGUF5nOyvfrAZ1k= -google.golang.org/grpc v1.28.1/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -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= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0 h1:qdOKuR/EIArgaWNjetjgTzgVTAZ+S/WXVrq9HW9zimw= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= -gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno= -gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= -gopkg.in/olebedev/go-duktape.v3 v3.0.0-20200316214253-d7b0ff38cac9/go.mod h1:uAJfkITjFhyEEuUfm7bsmCZRbW5WRq8s9EY8HZ6hCns= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/urfave/cli.v1 v1.20.0/go.mod h1:vuBzUtMdQeixQj8LVd+/98pzhxNGQoyuPBlsXHOQNO0= -gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= -honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= -sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= diff --git a/band-consumer/lcd_test/helpers.go b/band-consumer/lcd_test/helpers.go deleted file mode 100644 index 1dd48d20ae..0000000000 --- a/band-consumer/lcd_test/helpers.go +++ /dev/null @@ -1,510 +0,0 @@ -package lcdtest - -import ( - "bytes" - "fmt" - "io/ioutil" - "net" - "os" - "path/filepath" - "sort" - "strings" - - "github.com/cosmos/cosmos-sdk/baseapp" - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/client/flags" - "github.com/cosmos/cosmos-sdk/client/keys" - "github.com/cosmos/cosmos-sdk/client/lcd" - "github.com/cosmos/cosmos-sdk/codec" - codecstd "github.com/cosmos/cosmos-sdk/codec/std" - "github.com/cosmos/cosmos-sdk/crypto/hd" - "github.com/cosmos/cosmos-sdk/crypto/keyring" - "github.com/cosmos/cosmos-sdk/server" - "github.com/cosmos/cosmos-sdk/store" - "github.com/cosmos/cosmos-sdk/tests" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/x/auth" - authclient "github.com/cosmos/cosmos-sdk/x/auth/client" - authrest "github.com/cosmos/cosmos-sdk/x/auth/client/rest" - authexported "github.com/cosmos/cosmos-sdk/x/auth/exported" - "github.com/cosmos/cosmos-sdk/x/bank" - "github.com/cosmos/cosmos-sdk/x/crisis" - distr "github.com/cosmos/cosmos-sdk/x/distribution" - "github.com/cosmos/cosmos-sdk/x/genutil" - "github.com/cosmos/cosmos-sdk/x/mint" - "github.com/cosmos/cosmos-sdk/x/staking" - "github.com/pkg/errors" - "github.com/spf13/viper" - tmcfg "github.com/tendermint/tendermint/config" - "github.com/tendermint/tendermint/crypto" - "github.com/tendermint/tendermint/crypto/ed25519" - "github.com/tendermint/tendermint/crypto/secp256k1" - "github.com/tendermint/tendermint/libs/cli" - "github.com/tendermint/tendermint/libs/log" - nm "github.com/tendermint/tendermint/node" - "github.com/tendermint/tendermint/p2p" - pvm "github.com/tendermint/tendermint/privval" - "github.com/tendermint/tendermint/proxy" - tmrpc "github.com/tendermint/tendermint/rpc/lib/server" - tmtypes "github.com/tendermint/tendermint/types" - dbm "github.com/tendermint/tm-db" - - "github.com/bandprotocol/band-consumer/app" -) - -var ( - cdc = codecstd.MakeCodec(app.ModuleBasics) - appCodec = codecstd.NewAppCodec(cdc) -) - -func init() { - authclient.Codec = appCodec -} - -// TODO: Make InitializeTestLCD safe to call in multiple tests at the same time - -// InitializeLCD starts Tendermint and the LCD in process, listening on -// their respective sockets where nValidators is the total number of validators -// and initAddrs are the accounts to initialize with some stake tokens. It -// returns a cleanup function, a set of validator public keys, and a port. -func InitializeLCD( - nValidators int, initAddrs []sdk.AccAddress, minting bool, portExt ...string, -) (cleanup func(), valConsPubKeys []crypto.PubKey, valOperAddrs []sdk.ValAddress, port string, err error) { - - config, err := GetConfig() - if err != nil { - return - } - config.Consensus.TimeoutCommit = 100 - config.Consensus.SkipTimeoutCommit = false - config.TxIndex.IndexAllKeys = true - - logger := log.NewTMLogger(log.NewSyncWriter(os.Stdout)) - logger = log.NewFilter(logger, log.AllowError()) - - db := dbm.NewMemDB() - bcapp := app.NewBandConsumerApp(logger, db, nil, true, 0, map[int64]bool{}, "", baseapp.SetPruning(store.PruneNothing)) - - genDoc, valConsPubKeys, valOperAddrs, privVal, err := defaultGenesis(config, nValidators, initAddrs, minting) - if err != nil { - return - } - - var listenAddr string - - if len(portExt) == 0 { - listenAddr, port, err = server.FreeTCPAddr() - if err != nil { - return - } - } else { - listenAddr = fmt.Sprintf("tcp://0.0.0.0:%s", portExt[0]) - port = portExt[0] - } - - // XXX: Need to set this so LCD knows the tendermint node address! - viper.Set(flags.FlagNode, config.RPC.ListenAddress) - viper.Set(flags.FlagChainID, genDoc.ChainID) - // TODO Set to false once the upstream Tendermint proof verification issue is fixed. - viper.Set(flags.FlagTrustNode, true) - - node, err := startTM(config, logger, genDoc, privVal, bcapp) - if err != nil { - return - } - - tests.WaitForNextHeightTM(tests.ExtractPortFromAddress(config.RPC.ListenAddress)) - - lcdInstance, err := startLCD(logger, listenAddr, cdc) - if err != nil { - return - } - - tests.WaitForLCDStart(port) - tests.WaitForHeight(1, port) - - cleanup = func() { - logger.Debug("cleaning up LCD initialization") - err = node.Stop() - if err != nil { - logger.Error(err.Error()) - } - - node.Wait() - err = lcdInstance.Close() - if err != nil { - logger.Error(err.Error()) - } - } - - return cleanup, valConsPubKeys, valOperAddrs, port, err -} - -func defaultGenesis(config *tmcfg.Config, nValidators int, initAddrs []sdk.AccAddress, minting bool) ( - genDoc *tmtypes.GenesisDoc, valConsPubKeys []crypto.PubKey, valOperAddrs []sdk.ValAddress, privVal *pvm.FilePV, err error) { - privVal = pvm.LoadOrGenFilePV(config.PrivValidatorKeyFile(), - config.PrivValidatorStateFile()) - privVal.Reset() - - if nValidators < 1 { - err = errors.New("initializeLCD must use at least one validator") - return - } - - genesisFile := config.GenesisFile() - genDoc, err = tmtypes.GenesisDocFromFile(genesisFile) - if err != nil { - return - } - genDoc.Validators = nil - err = genDoc.SaveAs(genesisFile) - if err != nil { - return - } - - // append any additional (non-proposing) validators - //nolint:prealloc - var ( - genTxs []auth.StdTx - genAccounts []authexported.GenesisAccount - genBalances []bank.Balance - ) - - totalSupply := sdk.ZeroInt() - - var pubKey crypto.PubKey - for i := 0; i < nValidators; i++ { - operPrivKey := secp256k1.GenPrivKey() - operAddr := operPrivKey.PubKey().Address() - pubKey, err = privVal.GetPubKey() - if err != nil { - return - } - power := int64(100) - if i > 0 { - pubKey = ed25519.GenPrivKey().PubKey() - power = 1 - } - - startTokens := sdk.TokensFromConsensusPower(power) - - msg := staking.NewMsgCreateValidator( - sdk.ValAddress(operAddr), - pubKey, - sdk.NewCoin(sdk.DefaultBondDenom, startTokens), - staking.NewDescription(fmt.Sprintf("validator-%d", i+1), "", "", "", ""), - staking.NewCommissionRates(sdk.ZeroDec(), sdk.ZeroDec(), sdk.ZeroDec()), - sdk.OneInt(), - ) - - stdSignMsg := auth.StdSignMsg{ - ChainID: genDoc.ChainID, - Msgs: []sdk.Msg{msg}, - } - - var sig []byte - sig, err = operPrivKey.Sign(stdSignMsg.Bytes()) - if err != nil { - return - } - - transaction := auth.NewStdTx([]sdk.Msg{msg}, auth.StdFee{}, []auth.StdSignature{{Signature: sig, PubKey: operPrivKey.PubKey().Bytes()}}, "") - genTxs = append(genTxs, transaction) - valConsPubKeys = append(valConsPubKeys, pubKey) - valOperAddrs = append(valOperAddrs, sdk.ValAddress(operAddr)) - - account := auth.NewBaseAccountWithAddress(sdk.AccAddress(operAddr)) - accTokens := sdk.TokensFromConsensusPower(150) - totalSupply = totalSupply.Add(accTokens) - - coins := sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, accTokens)) - genBalances = append(genBalances, bank.Balance{Address: account.GetAddress(), Coins: coins}) - genAccounts = append(genAccounts, account) - } - - genesisState := app.NewDefaultGenesisState() - genDoc.AppState, err = cdc.MarshalJSON(genesisState) - if err != nil { - return - } - - genesisState, err = genutil.SetGenTxsInAppGenesisState(cdc, genesisState, genTxs) - if err != nil { - return - } - - // add some tokens to init accounts - for _, addr := range initAddrs { - accAuth := auth.NewBaseAccountWithAddress(addr) - accTokens := sdk.TokensFromConsensusPower(100) - totalSupply = totalSupply.Add(accTokens) - - coins := sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, accTokens)) - genBalances = append(genBalances, bank.Balance{Address: accAuth.GetAddress(), Coins: coins}) - genAccounts = append(genAccounts, accAuth) - } - - // auth genesis state: params and genesis accounts - var authGenState auth.GenesisState - cdc.MustUnmarshalJSON(genesisState[auth.ModuleName], &authGenState) - authGenState.Accounts = genAccounts - genesisState[auth.ModuleName] = cdc.MustMarshalJSON(authGenState) - - var bankGenState bank.GenesisState - cdc.MustUnmarshalJSON(genesisState[bank.ModuleName], &bankGenState) - bankGenState.Balances = genBalances - genesisState[bank.ModuleName] = cdc.MustMarshalJSON(bankGenState) - - var stakingData staking.GenesisState - cdc.MustUnmarshalJSON(genesisState[staking.ModuleName], &stakingData) - genesisState[staking.ModuleName] = cdc.MustMarshalJSON(stakingData) - - // distr data - var distrData distr.GenesisState - cdc.MustUnmarshalJSON(genesisState[distr.ModuleName], &distrData) - - commPoolAmt := sdk.NewInt(10) - distrData.FeePool.CommunityPool = sdk.DecCoins{sdk.NewDecCoin(sdk.DefaultBondDenom, commPoolAmt)} - genesisState[distr.ModuleName] = cdc.MustMarshalJSON(distrData) - - // mint genesis (none set within genesisState) - mintData := mint.DefaultGenesisState() - inflationMin := sdk.ZeroDec() - if minting { - inflationMin = sdk.MustNewDecFromStr("0.9") - mintData.Params.InflationMax = sdk.MustNewDecFromStr("1.0") - } else { - mintData.Params.InflationMax = inflationMin - } - - mintData.Minter.Inflation = inflationMin - mintData.Params.InflationMin = inflationMin - genesisState[mint.ModuleName] = cdc.MustMarshalJSON(mintData) - - // initialize crisis data - var crisisData crisis.GenesisState - cdc.MustUnmarshalJSON(genesisState[crisis.ModuleName], &crisisData) - - crisisData.ConstantFee = sdk.NewInt64Coin(sdk.DefaultBondDenom, 1000) - genesisState[crisis.ModuleName] = cdc.MustMarshalJSON(crisisData) - - //// double check inflation is set according to the minting boolean flag - if minting { - if !(mintData.Params.InflationMax.Equal(sdk.MustNewDecFromStr("1.0")) && - mintData.Minter.Inflation.Equal(sdk.MustNewDecFromStr("0.9")) && - mintData.Params.InflationMin.Equal(sdk.MustNewDecFromStr("0.9"))) { - err = errors.New("mint parameters does not correspond to their defaults") - return - } - } else { - if !(mintData.Params.InflationMax.Equal(sdk.ZeroDec()) && - mintData.Minter.Inflation.Equal(sdk.ZeroDec()) && - mintData.Params.InflationMin.Equal(sdk.ZeroDec())) { - err = errors.New("mint parameters not equal to decimal 0") - return - } - } - - appState, err := codec.MarshalJSONIndent(cdc, genesisState) - if err != nil { - return - } - - genDoc.AppState = appState - return genDoc, valConsPubKeys, valOperAddrs, privVal, err -} - -// startTM creates and starts an in-process Tendermint node with memDB and -// in-process ABCI application. It returns the new node or any error that -// occurred. -// -// TODO: Clean up the WAL dir or enable it to be not persistent! -func startTM( - tmcfg *tmcfg.Config, logger log.Logger, genDoc *tmtypes.GenesisDoc, - privVal tmtypes.PrivValidator, app *app.BandConsumerApp, -) (*nm.Node, error) { - - genDocProvider := func() (*tmtypes.GenesisDoc, error) { return genDoc, nil } - dbProvider := func(*nm.DBContext) (dbm.DB, error) { return dbm.NewMemDB(), nil } - nodeKey, err := p2p.LoadOrGenNodeKey(tmcfg.NodeKeyFile()) - if err != nil { - return nil, err - } - node, err := nm.NewNode( - tmcfg, - privVal, - nodeKey, - proxy.NewLocalClientCreator(app), - genDocProvider, - dbProvider, - nm.DefaultMetricsProvider(tmcfg.Instrumentation), - logger.With("module", "node"), - ) - if err != nil { - return nil, err - } - - err = node.Start() - if err != nil { - return nil, err - } - - tests.WaitForRPC(tmcfg.RPC.ListenAddress) - logger.Info("Tendermint running!") - - return node, err -} - -// startLCD starts the LCD. -func startLCD(logger log.Logger, listenAddr string, cdc *codec.Codec) (net.Listener, error) { - rs := lcd.NewRestServer(cdc) - registerRoutes(rs) - listener, err := tmrpc.Listen(listenAddr, tmrpc.DefaultConfig()) - if err != nil { - return nil, err - } - go tmrpc.StartHTTPServer(listener, rs.Mux, logger, tmrpc.DefaultConfig()) //nolint:errcheck - return listener, nil -} - -// NOTE: If making updates here also update cmd/gaia/cmd/gaiacli/main.go -func registerRoutes(rs *lcd.RestServer) { - client.RegisterRoutes(rs.CliCtx, rs.Mux) - authrest.RegisterTxRoutes(rs.CliCtx, rs.Mux) - app.ModuleBasics.RegisterRESTRoutes(rs.CliCtx, rs.Mux) -} - -// CreateAddr adds an address to the key store and returns an address and seed. -// It also requires that the key could be created. -func CreateAddr(name string, kb keyring.Keyring) (sdk.AccAddress, string, error) { - var ( - err error - info keyring.Info - seed string - ) - - info, seed, err = kb.NewMnemonic(name, keyring.English, keys.DefaultKeyPass, hd.Secp256k1) - return sdk.AccAddress(info.GetPubKey().Address()), seed, err -} - -// CreateAddrs adds multiple address to the key store and returns the addresses and associated seeds in lexographical order by address. -// It also requires that the keys could be created. -func CreateAddrs(kb keyring.Keyring, numAddrs int) (addrs []sdk.AccAddress, seeds, names []string, errs []error) { - var ( - err error - info keyring.Info - seed string - ) - - addrSeeds := AddrSeedSlice{} - - for i := 0; i < numAddrs; i++ { - name := fmt.Sprintf("test%d", i) - info, seed, err = kb.NewMnemonic(name, keyring.English, keys.DefaultKeyPass, hd.Secp256k1) - if err != nil { - errs = append(errs, err) - } - addrSeeds = append(addrSeeds, AddrSeed{Address: sdk.AccAddress(info.GetPubKey().Address()), Seed: seed, Name: name}) - } - if len(errs) > 0 { - return - } - - sort.Sort(addrSeeds) - - for i := range addrSeeds { - addrs = append(addrs, addrSeeds[i].Address) - seeds = append(seeds, addrSeeds[i].Seed) - names = append(names, addrSeeds[i].Name) - } - - return addrs, seeds, names, errs -} - -// AddrSeed combines an Address with the mnemonic of the private key to that address -type AddrSeed struct { - Address sdk.AccAddress - Seed string - Name string -} - -// AddrSeedSlice implements `Interface` in sort package. -type AddrSeedSlice []AddrSeed - -func (b AddrSeedSlice) Len() int { - return len(b) -} - -// Less sorts lexicographically by Address -func (b AddrSeedSlice) Less(i, j int) bool { - // bytes package already implements Comparable for []byte. - switch bytes.Compare(b[i].Address.Bytes(), b[j].Address.Bytes()) { - case -1: - return true - case 0, 1: - return false - default: - panic("not fail-able with `bytes.Comparable` bounded [-1, 1].") - } -} - -func (b AddrSeedSlice) Swap(i, j int) { - b[j], b[i] = b[i], b[j] -} - -// InitClientHome initialises client home dir. -func InitClientHome(dir string) string { - var err error - if dir == "" { - dir, err = ioutil.TempDir("", "lcd_test") - if err != nil { - panic(err) - } - } - // TODO: this should be set in NewRestServer - // and pass down the CLIContext to achieve - // parallelism. - viper.Set(cli.HomeFlag, dir) - return dir -} - -// makePathname creates a unique pathname for each test. -func makePathname() (string, error) { - p, err := os.Getwd() - if err != nil { - return "", err - } - - sep := string(filepath.Separator) - return strings.Replace(p, sep, "_", -1), nil -} - -// GetConfig returns a Tendermint config for the test cases. -func GetConfig() (*tmcfg.Config, error) { - pathname, err := makePathname() - if err != nil { - return nil, err - } - config := tmcfg.ResetTestRoot(pathname) - - tmAddr, _, err := server.FreeTCPAddr() - if err != nil { - return nil, err - } - - rcpAddr, _, err := server.FreeTCPAddr() - if err != nil { - return nil, err - } - - grpcAddr, _, err := server.FreeTCPAddr() - if err != nil { - return nil, err - } - - config.P2P.ListenAddress = tmAddr - config.RPC.ListenAddress = rcpAddr - config.RPC.GRPCListenAddress = grpcAddr - - return config, nil -} diff --git a/band-consumer/lcd_test/helpers_test.go b/band-consumer/lcd_test/helpers_test.go deleted file mode 100644 index fe93131b2c..0000000000 --- a/band-consumer/lcd_test/helpers_test.go +++ /dev/null @@ -1,1134 +0,0 @@ -//nolint:unused,deadcode,bodyclose -package lcdtest - -import ( - "bytes" - "encoding/json" - "fmt" - "io/ioutil" - "net/http" - "strings" - "testing" - - "github.com/cosmos/cosmos-sdk/client/flags" - clientkeys "github.com/cosmos/cosmos-sdk/client/keys" - "github.com/cosmos/cosmos-sdk/client/rpc" - "github.com/cosmos/cosmos-sdk/crypto/hd" - "github.com/cosmos/cosmos-sdk/crypto/keyring" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/rest" - "github.com/cosmos/cosmos-sdk/x/auth" - authclient "github.com/cosmos/cosmos-sdk/x/auth/client" - authrest "github.com/cosmos/cosmos-sdk/x/auth/client/rest" - authexported "github.com/cosmos/cosmos-sdk/x/auth/exported" - bankrest "github.com/cosmos/cosmos-sdk/x/bank/client/rest" - distrrest "github.com/cosmos/cosmos-sdk/x/distribution/client/rest" - "github.com/cosmos/cosmos-sdk/x/gov" - govrest "github.com/cosmos/cosmos-sdk/x/gov/client/rest" - gcutils "github.com/cosmos/cosmos-sdk/x/gov/client/utils" - paramscutils "github.com/cosmos/cosmos-sdk/x/params/client/utils" - "github.com/cosmos/cosmos-sdk/x/slashing" - slashingrest "github.com/cosmos/cosmos-sdk/x/slashing/client/rest" - "github.com/cosmos/cosmos-sdk/x/staking" - stakingrest "github.com/cosmos/cosmos-sdk/x/staking/client/rest" - - "github.com/spf13/viper" - "github.com/stretchr/testify/require" - ctypes "github.com/tendermint/tendermint/rpc/core/types" -) - -// Request makes a test LCD test request. It returns a response object and a -// stringified response body. -func Request(t *testing.T, port, method, path string, payload []byte) (*http.Response, string) { - var ( - err error - res *http.Response - ) - url := fmt.Sprintf("http://localhost:%v%v", port, path) - fmt.Printf("REQUEST %s %s\n", method, url) - - req, err := http.NewRequest(method, url, bytes.NewBuffer(payload)) - require.Nil(t, err) - - res, err = http.DefaultClient.Do(req) - require.Nil(t, err) - - output, err := ioutil.ReadAll(res.Body) - res.Body.Close() - require.Nil(t, err) - - return res, string(output) -} - -// ---------------------------------------------------------------------- -// ICS 0 - Tendermint -// ---------------------------------------------------------------------- -// GET /node_info The properties of the connected node -func getNodeInfo(t *testing.T, port string) rpc.NodeInfoResponse { - res, body := Request(t, port, "GET", "/node_info", nil) - require.Equal(t, http.StatusOK, res.StatusCode, body) - - var nodeInfo rpc.NodeInfoResponse - err := cdc.UnmarshalJSON([]byte(body), &nodeInfo) - require.Nil(t, err, "failed parse node info") - - require.NotEqual(t, rpc.NodeInfoResponse{}, nodeInfo, "res: %v", res) - return nodeInfo -} - -// GET /syncing Syncing state of node -func getSyncStatus(t *testing.T, port string, syncing bool) { - res, body := Request(t, port, "GET", "/syncing", nil) - require.Equal(t, http.StatusOK, res.StatusCode, body) - - var syncResp rpc.SyncingResponse - err := cdc.UnmarshalJSON([]byte(body), &syncResp) - require.Nil(t, err, "failed parse syncing info") - - require.Equal(t, syncResp.Syncing, syncing) -} - -// GET /blocks/latest Get the latest block -// GET /blocks/{height} Get a block at a certain height -func getBlock(t *testing.T, port string, height int, expectFail bool) ctypes.ResultBlock { - var url string - if height > 0 { - url = fmt.Sprintf("/blocks/%d", height) - } else { - url = "/blocks/latest" - } - var resultBlock ctypes.ResultBlock - - res, body := Request(t, port, "GET", url, nil) - if expectFail { - require.Equal(t, http.StatusNotFound, res.StatusCode, body) - return resultBlock - } - require.Equal(t, http.StatusOK, res.StatusCode, body) - - err := cdc.UnmarshalJSON([]byte(body), &resultBlock) - require.Nil(t, err, "Couldn't parse block") - - require.NotEqual(t, ctypes.ResultBlock{}, resultBlock) - return resultBlock -} - -func extractResultFromResponse(t *testing.T, body []byte) []byte { - var resp rest.ResponseWithHeight - require.NoError(t, cdc.UnmarshalJSON(body, &resp)) - - return resp.Result -} - -// GET /validatorsets/{height} Get a validator set a certain height -// GET /validatorsets/latest Get the latest validator set -func getValidatorSets(t *testing.T, port string, height int, expectFail bool) rpc.ResultValidatorsOutput { - var url string - if height > 0 { - url = fmt.Sprintf("/validatorsets/%d", height) - } else { - url = "/validatorsets/latest" - } - - var resultVals rpc.ResultValidatorsOutput - res, body := Request(t, port, "GET", url, nil) - - if expectFail { - require.Equal(t, http.StatusNotFound, res.StatusCode, body) - return resultVals - } - - require.Equal(t, http.StatusOK, res.StatusCode, body) - - err := cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &resultVals) - require.Nil(t, err, "Couldn't parse validator set") - - require.NotEqual(t, rpc.ResultValidatorsOutput{}, resultVals) - return resultVals -} - -// GET /txs/{hash} get tx by hash -func getTransaction(t *testing.T, port string, hash string) sdk.TxResponse { - var tx sdk.TxResponse - res, body := getTransactionRequest(t, port, hash) - require.Equal(t, http.StatusOK, res.StatusCode, body) - - err := cdc.UnmarshalJSON([]byte(body), &tx) - require.NoError(t, err) - - return tx -} - -func getTransactionRequest(t *testing.T, port, hash string) (*http.Response, string) { - return Request(t, port, "GET", fmt.Sprintf("/txs/%s", hash), nil) -} - -// POST /txs broadcast txs - -// GET /txs search transactions -func getTransactions(t *testing.T, port string, events ...string) *sdk.SearchTxsResult { - var txs []sdk.TxResponse - result := sdk.NewSearchTxsResult(0, 0, 1, 30, txs) - if len(events) == 0 { - return &result - } - - queryStr := strings.Join(events, "&") - res, body := Request(t, port, "GET", fmt.Sprintf("/txs?%s", queryStr), nil) - require.Equal(t, http.StatusOK, res.StatusCode, body) - - err := cdc.UnmarshalJSON([]byte(body), &result) - require.NoError(t, err) - - return &result -} - -// ---------------------------------------------------------------------- -// ICS 1 - Keys -// ---------------------------------------------------------------------- -// GET /keys List of accounts stored locally -func getKeys(t *testing.T, port string) []keyring.KeyOutput { - res, body := Request(t, port, "GET", "/keys", nil) - require.Equal(t, http.StatusOK, res.StatusCode, body) - var m []keyring.KeyOutput - err := cdc.UnmarshalJSON([]byte(body), &m) - require.Nil(t, err) - - return m -} - -// POST /keys Create a new account locally -func doKeysPost(t *testing.T, port, name, password, mnemonic string, account int, index int) keyring.KeyOutput { - pk := clientkeys.NewAddNewKey(name, password, mnemonic, account, index) - req, err := cdc.MarshalJSON(pk) - require.NoError(t, err) - - res, body := Request(t, port, "POST", "/keys", req) - - require.Equal(t, http.StatusOK, res.StatusCode, body) - var resp keyring.KeyOutput - err = cdc.UnmarshalJSON([]byte(body), &resp) - require.Nil(t, err, body) - - return resp -} - -// GET /auth/accounts/{address} Get the account information on blockchain -func getAccount(t *testing.T, port string, addr sdk.AccAddress) (acc authexported.Account) { - res, body := Request(t, port, "GET", fmt.Sprintf("/auth/accounts/%s", addr.String()), nil) - require.Equal(t, http.StatusOK, res.StatusCode, body) - require.Nil(t, cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &acc)) - - return acc -} - -// GET /bank/balances/{address} Get the account balances -func getBalances(t *testing.T, port string, addr sdk.AccAddress) (balances sdk.Coins) { - res, body := Request(t, port, "GET", fmt.Sprintf("/bank/balances/%s", addr), nil) - require.Equal(t, http.StatusOK, res.StatusCode, body) - require.Nil(t, cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &balances)) - - return balances -} - -// ---------------------------------------------------------------------- -// ICS 20 - Tokens -// ---------------------------------------------------------------------- - -// POST /tx/broadcast Send a signed Tx -func doBroadcast(t *testing.T, port string, tx auth.StdTx) (*http.Response, string) { - txReq := authrest.BroadcastReq{Tx: tx, Mode: "block"} - - req, err := cdc.MarshalJSON(txReq) - require.Nil(t, err) - - return Request(t, port, "POST", "/txs", req) -} - -// doTransfer performs a balance transfer with auto gas calculation. It also signs -// the tx and broadcasts it. -func doTransfer( - t *testing.T, port, name, memo string, addr sdk.AccAddress, fees sdk.Coins, - kb keyring.Keyring, -) (sdk.AccAddress, sdk.TxResponse) { - - resp, body, recvAddr := doTransferWithGas(t, port, name, memo, addr, "", 1.0, false, true, fees, kb) - require.Equal(t, http.StatusOK, resp.StatusCode, body) - - var txResp sdk.TxResponse - err := cdc.UnmarshalJSON([]byte(body), &txResp) - require.NoError(t, err) - - return recvAddr, txResp -} - -// doTransferWithGas performs a balance transfer with a specified gas value. The -// broadcast parameter determines if the tx should only be generated or also -// signed and broadcasted. The sending account's number and sequence are -// determined prior to generating the tx. -func doTransferWithGas( - t *testing.T, port, name, memo string, addr sdk.AccAddress, - gas string, gasAdjustment float64, simulate, broadcast bool, fees sdk.Coins, - kb keyring.Keyring, -) (resp *http.Response, body string, receiveAddr sdk.AccAddress) { - - // create receive address - kb2 := keyring.NewInMemory() - - receiveInfo, _, err := kb2.NewMnemonic( - "receive_address", keyring.English, clientkeys.DefaultKeyPass, hd.Secp256k1, - ) - require.Nil(t, err) - - receiveAddr = sdk.AccAddress(receiveInfo.GetPubKey().Address()) - acc := getAccount(t, port, addr) - accnum := acc.GetAccountNumber() - sequence := acc.GetSequence() - chainID := viper.GetString(flags.FlagChainID) - - from := addr.String() - baseReq := rest.NewBaseReq( - from, memo, chainID, gas, fmt.Sprintf("%f", gasAdjustment), accnum, sequence, fees, nil, simulate, - ) - - sr := bankrest.SendReq{ - Amount: sdk.Coins{sdk.NewInt64Coin(sdk.DefaultBondDenom, 1)}, - BaseReq: baseReq, - } - - req, err := cdc.MarshalJSON(sr) - require.NoError(t, err) - - // generate tx - resp, body = Request(t, port, "POST", fmt.Sprintf("/bank/accounts/%s/transfers", receiveAddr), req) - if !broadcast { - return resp, body, receiveAddr - } - - // sign and broadcast - resp, body = signAndBroadcastGenTx(t, port, name, body, acc, gasAdjustment, simulate, kb) - return resp, body, receiveAddr -} - -// doTransferWithGasAccAuto is similar to doTransferWithGas except that it -// automatically determines the account's number and sequence when generating the -// tx. -func doTransferWithGasAccAuto( - t *testing.T, port, name, memo string, addr sdk.AccAddress, - gas string, gasAdjustment float64, simulate, broadcast bool, fees sdk.Coins, - kb keyring.Keyring, -) (resp *http.Response, body string, receiveAddr sdk.AccAddress) { - - // create receive address - kb2 := keyring.NewInMemory() - acc := getAccount(t, port, addr) - - receiveInfo, _, err := kb2.NewMnemonic( - "receive_address", keyring.English, clientkeys.DefaultKeyPass, hd.Secp256k1, - ) - require.Nil(t, err) - - receiveAddr = sdk.AccAddress(receiveInfo.GetPubKey().Address()) - chainID := viper.GetString(flags.FlagChainID) - - from := addr.String() - baseReq := rest.NewBaseReq( - from, memo, chainID, gas, fmt.Sprintf("%f", gasAdjustment), 0, 0, fees, nil, simulate, - ) - - sr := bankrest.SendReq{ - Amount: sdk.Coins{sdk.NewInt64Coin(sdk.DefaultBondDenom, 1)}, - BaseReq: baseReq, - } - - req, err := cdc.MarshalJSON(sr) - require.NoError(t, err) - - resp, body = Request(t, port, "POST", fmt.Sprintf("/bank/accounts/%s/transfers", receiveAddr), req) - if !broadcast { - return resp, body, receiveAddr - } - - // sign and broadcast - resp, body = signAndBroadcastGenTx(t, port, name, body, acc, gasAdjustment, simulate, kb) - return resp, body, receiveAddr -} - -// signAndBroadcastGenTx accepts a successfully generated unsigned tx, signs it, -// and broadcasts it. -func signAndBroadcastGenTx( - t *testing.T, port, name, genTx string, acc authexported.Account, - gasAdjustment float64, simulate bool, kb keyring.Keyring, -) (resp *http.Response, body string) { - - chainID := viper.GetString(flags.FlagChainID) - - var tx auth.StdTx - err := cdc.UnmarshalJSON([]byte(genTx), &tx) - require.Nil(t, err) - - txbldr := auth.NewTxBuilder( - authclient.GetTxEncoder(cdc), - acc.GetAccountNumber(), - acc.GetSequence(), - tx.Fee.Gas, - gasAdjustment, - simulate, - chainID, - tx.Memo, - tx.Fee.Amount, - nil, - ).WithKeybase(kb) - - signedTx, err := txbldr.SignStdTx(name, clientkeys.DefaultKeyPass, tx, false) - require.NoError(t, err) - - return doBroadcast(t, port, signedTx) -} - -// ---------------------------------------------------------------------- -// ICS 21 - Stake -// ---------------------------------------------------------------------- - -// POST /staking/delegators/{delegatorAddr}/delegations Submit delegation -func doDelegate( - t *testing.T, port, name string, delAddr sdk.AccAddress, - valAddr sdk.ValAddress, amount sdk.Int, fees sdk.Coins, - kb keyring.Keyring, -) sdk.TxResponse { - - acc := getAccount(t, port, delAddr) - accnum := acc.GetAccountNumber() - sequence := acc.GetSequence() - chainID := viper.GetString(flags.FlagChainID) - from := acc.GetAddress().String() - - baseReq := rest.NewBaseReq(from, "", chainID, "", "", accnum, sequence, fees, nil, false) - msg := stakingrest.DelegateRequest{ - BaseReq: baseReq, - DelegatorAddress: delAddr, - ValidatorAddress: valAddr, - Amount: sdk.NewCoin(sdk.DefaultBondDenom, amount), - } - - req, err := cdc.MarshalJSON(msg) - require.NoError(t, err) - - resp, body := Request(t, port, "POST", fmt.Sprintf("/staking/delegators/%s/delegations", delAddr.String()), req) - require.Equal(t, http.StatusOK, resp.StatusCode, body) - - // sign and broadcast - resp, body = signAndBroadcastGenTx(t, port, name, body, acc, flags.DefaultGasAdjustment, false, kb) - require.Equal(t, http.StatusOK, resp.StatusCode, body) - - var txResp sdk.TxResponse - err = cdc.UnmarshalJSON([]byte(body), &txResp) - require.NoError(t, err) - - return txResp -} - -// POST /staking/delegators/{delegatorAddr}/delegations Submit delegation -func doUndelegate( - t *testing.T, port, name string, delAddr sdk.AccAddress, - valAddr sdk.ValAddress, amount sdk.Int, fees sdk.Coins, - kb keyring.Keyring, -) sdk.TxResponse { - - acc := getAccount(t, port, delAddr) - accnum := acc.GetAccountNumber() - sequence := acc.GetSequence() - chainID := viper.GetString(flags.FlagChainID) - from := acc.GetAddress().String() - - baseReq := rest.NewBaseReq(from, "", chainID, "", "", accnum, sequence, fees, nil, false) - msg := stakingrest.UndelegateRequest{ - BaseReq: baseReq, - DelegatorAddress: delAddr, - ValidatorAddress: valAddr, - Amount: sdk.NewCoin(sdk.DefaultBondDenom, amount), - } - - req, err := cdc.MarshalJSON(msg) - require.NoError(t, err) - - resp, body := Request(t, port, "POST", fmt.Sprintf("/staking/delegators/%s/unbonding_delegations", delAddr), req) - require.Equal(t, http.StatusOK, resp.StatusCode, body) - - resp, body = signAndBroadcastGenTx(t, port, name, body, acc, flags.DefaultGasAdjustment, false, kb) - require.Equal(t, http.StatusOK, resp.StatusCode, body) - - var txResp sdk.TxResponse - err = cdc.UnmarshalJSON([]byte(body), &txResp) - require.NoError(t, err) - - return txResp -} - -// POST /staking/delegators/{delegatorAddr}/delegations Submit delegation -func doBeginRedelegation( - t *testing.T, port, name string, delAddr sdk.AccAddress, valSrcAddr, - valDstAddr sdk.ValAddress, amount sdk.Int, fees sdk.Coins, - kb keyring.Keyring, -) sdk.TxResponse { - - acc := getAccount(t, port, delAddr) - accnum := acc.GetAccountNumber() - sequence := acc.GetSequence() - chainID := viper.GetString(flags.FlagChainID) - from := acc.GetAddress().String() - - baseReq := rest.NewBaseReq(from, "", chainID, "", "", accnum, sequence, fees, nil, false) - msg := stakingrest.RedelegateRequest{ - BaseReq: baseReq, - DelegatorAddress: delAddr, - ValidatorSrcAddress: valSrcAddr, - ValidatorDstAddress: valDstAddr, - Amount: sdk.NewCoin(sdk.DefaultBondDenom, amount), - } - - req, err := cdc.MarshalJSON(msg) - require.NoError(t, err) - - resp, body := Request(t, port, "POST", fmt.Sprintf("/staking/delegators/%s/redelegations", delAddr), req) - require.Equal(t, http.StatusOK, resp.StatusCode, body) - - resp, body = signAndBroadcastGenTx(t, port, name, body, acc, flags.DefaultGasAdjustment, false, kb) - require.Equal(t, http.StatusOK, resp.StatusCode, body) - - var txResp sdk.TxResponse - err = cdc.UnmarshalJSON([]byte(body), &txResp) - require.NoError(t, err) - - return txResp -} - -// GET /staking/delegators/{delegatorAddr}/delegations Get all delegations from a delegator -func getDelegatorDelegations(t *testing.T, port string, delegatorAddr sdk.AccAddress) staking.DelegationResponses { - res, body := Request(t, port, "GET", fmt.Sprintf("/staking/delegators/%s/delegations", delegatorAddr), nil) - require.Equal(t, http.StatusOK, res.StatusCode, body) - - var dels staking.DelegationResponses - - err := cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &dels) - require.Nil(t, err) - - return dels -} - -// GET /staking/delegators/{delegatorAddr}/unbonding_delegations Get all unbonding delegations from a delegator -func getDelegatorUnbondingDelegations(t *testing.T, port string, delegatorAddr sdk.AccAddress) []staking.UnbondingDelegation { - res, body := Request(t, port, "GET", fmt.Sprintf("/staking/delegators/%s/unbonding_delegations", delegatorAddr), nil) - require.Equal(t, http.StatusOK, res.StatusCode, body) - - var ubds []staking.UnbondingDelegation - - err := cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &ubds) - require.Nil(t, err) - - return ubds -} - -// GET /staking/redelegations?delegator=0xdeadbeef&validator_from=0xdeadbeef&validator_to=0xdeadbeef& Get redelegations filters by params passed in -func getRedelegations(t *testing.T, port string, delegatorAddr sdk.AccAddress, srcValidatorAddr sdk.ValAddress, dstValidatorAddr sdk.ValAddress) staking.RedelegationResponses { - var res *http.Response - var body string - endpoint := "/staking/redelegations?" - if !delegatorAddr.Empty() { - endpoint += fmt.Sprintf("delegator=%s&", delegatorAddr) - } - if !srcValidatorAddr.Empty() { - endpoint += fmt.Sprintf("validator_from=%s&", srcValidatorAddr) - } - if !dstValidatorAddr.Empty() { - endpoint += fmt.Sprintf("validator_to=%s&", dstValidatorAddr) - } - - res, body = Request(t, port, "GET", endpoint, nil) - require.Equal(t, http.StatusOK, res.StatusCode, body) - - var redels staking.RedelegationResponses - err := cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &redels) - require.Nil(t, err) - - return redels -} - -// GET /staking/delegators/{delegatorAddr}/validators Query all validators that a delegator is bonded to -func getDelegatorValidators(t *testing.T, port string, delegatorAddr sdk.AccAddress) []staking.Validator { - res, body := Request(t, port, "GET", fmt.Sprintf("/staking/delegators/%s/validators", delegatorAddr), nil) - require.Equal(t, http.StatusOK, res.StatusCode, body) - - var bondedValidators []staking.Validator - - err := cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &bondedValidators) - require.Nil(t, err) - - return bondedValidators -} - -// GET /staking/delegators/{delegatorAddr}/validators/{validatorAddr} Query a validator that a delegator is bonded to -func getDelegatorValidator(t *testing.T, port string, delegatorAddr sdk.AccAddress, validatorAddr sdk.ValAddress) staking.Validator { - res, body := Request(t, port, "GET", fmt.Sprintf("/staking/delegators/%s/validators/%s", delegatorAddr, validatorAddr), nil) - require.Equal(t, http.StatusOK, res.StatusCode, body) - - var bondedValidator staking.Validator - err := cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &bondedValidator) - require.Nil(t, err) - - return bondedValidator -} - -// GET /staking/delegators/{delegatorAddr}/txs Get all staking txs (i.e msgs) from a delegator -func getBondingTxs(t *testing.T, port string, delegatorAddr sdk.AccAddress, query string) []sdk.TxResponse { - var res *http.Response - var body string - - if len(query) > 0 { - res, body = Request(t, port, "GET", fmt.Sprintf("/staking/delegators/%s/txs?type=%s", delegatorAddr, query), nil) - } else { - res, body = Request(t, port, "GET", fmt.Sprintf("/staking/delegators/%s/txs", delegatorAddr), nil) - } - require.Equal(t, http.StatusOK, res.StatusCode, body) - - var txs []sdk.TxResponse - - err := cdc.UnmarshalJSON([]byte(body), &txs) - require.Nil(t, err) - - return txs -} - -// GET /staking/delegators/{delegatorAddr}/delegations/{validatorAddr} Query the current delegation between a delegator and a validator -func getDelegation(t *testing.T, port string, delegatorAddr sdk.AccAddress, validatorAddr sdk.ValAddress) staking.DelegationResponse { - res, body := Request(t, port, "GET", fmt.Sprintf("/staking/delegators/%s/delegations/%s", delegatorAddr, validatorAddr), nil) - require.Equal(t, http.StatusOK, res.StatusCode, body) - - var bond staking.DelegationResponse - err := cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &bond) - require.Nil(t, err) - - return bond -} - -// GET /staking/delegators/{delegatorAddr}/unbonding_delegations/{validatorAddr} Query all unbonding delegations between a delegator and a validator -func getUnbondingDelegation(t *testing.T, port string, delegatorAddr sdk.AccAddress, - validatorAddr sdk.ValAddress) staking.UnbondingDelegation { - - res, body := Request(t, port, "GET", - fmt.Sprintf("/staking/delegators/%s/unbonding_delegations/%s", - delegatorAddr, validatorAddr), nil) - - require.Equal(t, http.StatusOK, res.StatusCode, body) - - var unbond staking.UnbondingDelegation - err := cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &unbond) - require.Nil(t, err) - - return unbond -} - -// GET /staking/validators Get all validator candidates -func getValidators(t *testing.T, port string) []staking.Validator { - res, body := Request(t, port, "GET", "/staking/validators", nil) - require.Equal(t, http.StatusOK, res.StatusCode, body) - - var validators []staking.Validator - err := cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &validators) - require.Nil(t, err) - - return validators -} - -// GET /staking/validators/{validatorAddr} Query the information from a single validator -func getValidator(t *testing.T, port string, validatorAddr sdk.ValAddress) staking.Validator { - res, body := Request(t, port, "GET", fmt.Sprintf("/staking/validators/%s", validatorAddr.String()), nil) - require.Equal(t, http.StatusOK, res.StatusCode, body) - - var validator staking.Validator - err := cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &validator) - require.Nil(t, err) - - return validator -} - -// GET /staking/validators/{validatorAddr}/delegations Get all delegations from a validator -func getValidatorDelegations(t *testing.T, port string, validatorAddr sdk.ValAddress) []staking.Delegation { - res, body := Request(t, port, "GET", fmt.Sprintf("/staking/validators/%s/delegations", validatorAddr.String()), nil) - require.Equal(t, http.StatusOK, res.StatusCode, body) - - var delegations []staking.Delegation - err := cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &delegations) - require.Nil(t, err) - - return delegations -} - -// GET /staking/validators/{validatorAddr}/unbonding_delegations Get all unbonding delegations from a validator -func getValidatorUnbondingDelegations(t *testing.T, port string, validatorAddr sdk.ValAddress) []staking.UnbondingDelegation { - res, body := Request(t, port, "GET", fmt.Sprintf("/staking/validators/%s/unbonding_delegations", validatorAddr.String()), nil) - require.Equal(t, http.StatusOK, res.StatusCode, body) - - var ubds []staking.UnbondingDelegation - err := cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &ubds) - require.Nil(t, err) - - return ubds -} - -// ---------------------------------------------------------------------- -// ICS 22 - Gov -// ---------------------------------------------------------------------- -// POST /gov/proposals Submit a proposal -func doSubmitProposal( - t *testing.T, port, name string, proposerAddr sdk.AccAddress, - amount sdk.Int, fees sdk.Coins, - kb keyring.Keyring, -) sdk.TxResponse { - - acc := getAccount(t, port, proposerAddr) - accnum := acc.GetAccountNumber() - sequence := acc.GetSequence() - chainID := viper.GetString(flags.FlagChainID) - from := acc.GetAddress().String() - - baseReq := rest.NewBaseReq(from, "", chainID, "", "", accnum, sequence, fees, nil, false) - pr := govrest.PostProposalReq{ - Title: "Test", - Description: "test", - ProposalType: "Text", - Proposer: proposerAddr, - InitialDeposit: sdk.Coins{sdk.NewCoin(sdk.DefaultBondDenom, amount)}, - BaseReq: baseReq, - } - - req, err := cdc.MarshalJSON(pr) - require.NoError(t, err) - - // submitproposal - resp, body := Request(t, port, "POST", "/gov/proposals", req) - require.Equal(t, http.StatusOK, resp.StatusCode, body) - - resp, body = signAndBroadcastGenTx(t, port, name, body, acc, flags.DefaultGasAdjustment, false, kb) - require.Equal(t, http.StatusOK, resp.StatusCode, body) - - var txResp sdk.TxResponse - err = cdc.UnmarshalJSON([]byte(body), &txResp) - require.NoError(t, err) - - return txResp -} - -func doSubmitParamChangeProposal( - t *testing.T, port, name string, proposerAddr sdk.AccAddress, - amount sdk.Int, fees sdk.Coins, - kb keyring.Keyring, -) sdk.TxResponse { - - acc := getAccount(t, port, proposerAddr) - accnum := acc.GetAccountNumber() - sequence := acc.GetSequence() - chainID := viper.GetString(flags.FlagChainID) - from := acc.GetAddress().String() - - baseReq := rest.NewBaseReq(from, "", chainID, "", "", accnum, sequence, fees, nil, false) - pr := paramscutils.ParamChangeProposalReq{ - BaseReq: baseReq, - Title: "Test", - Description: "test", - Proposer: proposerAddr, - Deposit: sdk.Coins{sdk.NewCoin(sdk.DefaultBondDenom, amount)}, - Changes: paramscutils.ParamChangesJSON{ - paramscutils.NewParamChangeJSON("staking", "MaxValidators", json.RawMessage(`105`)), - }, - } - - req, err := cdc.MarshalJSON(pr) - require.NoError(t, err) - - resp, body := Request(t, port, "POST", "/gov/proposals/param_change", req) - require.Equal(t, http.StatusOK, resp.StatusCode, body) - - resp, body = signAndBroadcastGenTx(t, port, name, body, acc, flags.DefaultGasAdjustment, false, kb) - require.Equal(t, http.StatusOK, resp.StatusCode, body) - - var txResp sdk.TxResponse - err = cdc.UnmarshalJSON([]byte(body), &txResp) - require.NoError(t, err) - - return txResp -} - -func doSubmitCommunityPoolSpendProposal( - t *testing.T, port, name string, proposerAddr sdk.AccAddress, - amount sdk.Int, fees sdk.Coins, - kb keyring.Keyring, -) sdk.TxResponse { - - acc := getAccount(t, port, proposerAddr) - accnum := acc.GetAccountNumber() - sequence := acc.GetSequence() - chainID := viper.GetString(flags.FlagChainID) - from := acc.GetAddress().String() - - baseReq := rest.NewBaseReq(from, "", chainID, "", "", accnum, sequence, fees, nil, false) - pr := distrrest.CommunityPoolSpendProposalReq{ - BaseReq: baseReq, - Title: "Test", - Description: "test", - Proposer: proposerAddr, - Recipient: proposerAddr, - Deposit: sdk.Coins{sdk.NewCoin(sdk.DefaultBondDenom, amount)}, - Amount: sdk.Coins{sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(5))}, - } - - req, err := cdc.MarshalJSON(pr) - require.NoError(t, err) - - resp, body := Request(t, port, "POST", "/gov/proposals/community_pool_spend", req) - require.Equal(t, http.StatusOK, resp.StatusCode, body) - - resp, body = signAndBroadcastGenTx(t, port, name, body, acc, flags.DefaultGasAdjustment, false, kb) - require.Equal(t, http.StatusOK, resp.StatusCode, body) - - var txResp sdk.TxResponse - err = cdc.UnmarshalJSON([]byte(body), &txResp) - require.NoError(t, err) - - return txResp -} - -// GET /gov/proposals Query proposals -func getProposalsAll(t *testing.T, port string) []gov.Proposal { - res, body := Request(t, port, "GET", "/gov/proposals", nil) - require.Equal(t, http.StatusOK, res.StatusCode, body) - - var proposals []gov.Proposal - err := cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &proposals) - require.Nil(t, err) - return proposals -} - -// GET /gov/proposals?depositor=%s Query proposals -func getProposalsFilterDepositor(t *testing.T, port string, depositorAddr sdk.AccAddress) []gov.Proposal { - res, body := Request(t, port, "GET", fmt.Sprintf("/gov/proposals?depositor=%s", depositorAddr), nil) - require.Equal(t, http.StatusOK, res.StatusCode, body) - - var proposals []gov.Proposal - err := cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &proposals) - require.Nil(t, err) - return proposals -} - -// GET /gov/proposals?voter=%s Query proposals -func getProposalsFilterVoter(t *testing.T, port string, voterAddr sdk.AccAddress) []gov.Proposal { - res, body := Request(t, port, "GET", fmt.Sprintf("/gov/proposals?voter=%s", voterAddr), nil) - require.Equal(t, http.StatusOK, res.StatusCode, body) - - var proposals []gov.Proposal - err := cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &proposals) - require.Nil(t, err) - return proposals -} - -// GET /gov/proposals?depositor=%s&voter=%s Query proposals -func getProposalsFilterVoterDepositor(t *testing.T, port string, voterAddr, depositorAddr sdk.AccAddress) []gov.Proposal { - res, body := Request(t, port, "GET", fmt.Sprintf("/gov/proposals?depositor=%s&voter=%s", depositorAddr, voterAddr), nil) - require.Equal(t, http.StatusOK, res.StatusCode, body) - - var proposals []gov.Proposal - err := cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &proposals) - require.Nil(t, err) - return proposals -} - -// GET /gov/proposals?status=%s Query proposals -func getProposalsFilterStatus(t *testing.T, port string, status gov.ProposalStatus) []gov.Proposal { - res, body := Request(t, port, "GET", fmt.Sprintf("/gov/proposals?status=%s", status), nil) - require.Equal(t, http.StatusOK, res.StatusCode, body) - - var proposals []gov.Proposal - err := cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &proposals) - require.Nil(t, err) - return proposals -} - -// POST /gov/proposals/{proposalId}/deposits Deposit tokens to a proposal -func doDeposit( - t *testing.T, port, name string, proposerAddr sdk.AccAddress, - proposalID uint64, amount sdk.Int, fees sdk.Coins, - kb keyring.Keyring, -) sdk.TxResponse { - - acc := getAccount(t, port, proposerAddr) - accnum := acc.GetAccountNumber() - sequence := acc.GetSequence() - chainID := viper.GetString(flags.FlagChainID) - from := acc.GetAddress().String() - - baseReq := rest.NewBaseReq(from, "", chainID, "", "", accnum, sequence, fees, nil, false) - dr := govrest.DepositReq{ - Depositor: proposerAddr, - Amount: sdk.Coins{sdk.NewCoin(sdk.DefaultBondDenom, amount)}, - BaseReq: baseReq, - } - - req, err := cdc.MarshalJSON(dr) - require.NoError(t, err) - - resp, body := Request(t, port, "POST", fmt.Sprintf("/gov/proposals/%d/deposits", proposalID), req) - require.Equal(t, http.StatusOK, resp.StatusCode, body) - - resp, body = signAndBroadcastGenTx(t, port, name, body, acc, flags.DefaultGasAdjustment, false, kb) - require.Equal(t, http.StatusOK, resp.StatusCode, body) - - var txResp sdk.TxResponse - err = cdc.UnmarshalJSON([]byte(body), &txResp) - require.NoError(t, err) - - return txResp -} - -// GET /gov/proposals/{proposalId}/deposits Query deposits -func getDeposits(t *testing.T, port string, proposalID uint64) []gov.Deposit { - res, body := Request(t, port, "GET", fmt.Sprintf("/gov/proposals/%d/deposits", proposalID), nil) - require.Equal(t, http.StatusOK, res.StatusCode, body) - var deposits []gov.Deposit - err := cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &deposits) - require.Nil(t, err) - return deposits -} - -// GET /gov/proposals/{proposalId}/tally Get a proposal's tally result at the current time -func getTally(t *testing.T, port string, proposalID uint64) gov.TallyResult { - res, body := Request(t, port, "GET", fmt.Sprintf("/gov/proposals/%d/tally", proposalID), nil) - require.Equal(t, http.StatusOK, res.StatusCode, body) - - var tally gov.TallyResult - err := cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &tally) - require.Nil(t, err) - - return tally -} - -// POST /gov/proposals/{proposalId}/votes Vote a proposal -func doVote( - t *testing.T, port, name string, proposerAddr sdk.AccAddress, - proposalID uint64, option string, fees sdk.Coins, - kb keyring.Keyring, -) sdk.TxResponse { - - // get the account to get the sequence - acc := getAccount(t, port, proposerAddr) - accnum := acc.GetAccountNumber() - sequence := acc.GetSequence() - chainID := viper.GetString(flags.FlagChainID) - from := acc.GetAddress().String() - - baseReq := rest.NewBaseReq(from, "", chainID, "", "", accnum, sequence, fees, nil, false) - vr := govrest.VoteReq{ - Voter: proposerAddr, - Option: option, - BaseReq: baseReq, - } - - req, err := cdc.MarshalJSON(vr) - require.NoError(t, err) - - resp, body := Request(t, port, "POST", fmt.Sprintf("/gov/proposals/%d/votes", proposalID), req) - require.Equal(t, http.StatusOK, resp.StatusCode, body) - - resp, body = signAndBroadcastGenTx(t, port, name, body, acc, flags.DefaultGasAdjustment, false, kb) - require.Equal(t, http.StatusOK, resp.StatusCode, body) - - var txResp sdk.TxResponse - err = cdc.UnmarshalJSON([]byte(body), &txResp) - require.NoError(t, err) - - return txResp -} - -// GET /gov/proposals/{proposalId}/votes Query voters -func getVotes(t *testing.T, port string, proposalID uint64) []gov.Vote { - res, body := Request(t, port, "GET", fmt.Sprintf("/gov/proposals/%d/votes", proposalID), nil) - require.Equal(t, http.StatusOK, res.StatusCode, body) - var votes []gov.Vote - err := cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &votes) - require.Nil(t, err) - return votes -} - -// GET /gov/proposals/{proposalId} Query a proposal -func getProposal(t *testing.T, port string, proposalID uint64) gov.Proposal { - res, body := Request(t, port, "GET", fmt.Sprintf("/gov/proposals/%d", proposalID), nil) - require.Equal(t, http.StatusOK, res.StatusCode, body) - - var proposal gov.Proposal - err := cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &proposal) - require.Nil(t, err) - - return proposal -} - -// GET /gov/proposals/{proposalId}/deposits/{depositor} Query deposit -func getDeposit(t *testing.T, port string, proposalID uint64, depositorAddr sdk.AccAddress) gov.Deposit { - res, body := Request(t, port, "GET", fmt.Sprintf("/gov/proposals/%d/deposits/%s", proposalID, depositorAddr), nil) - require.Equal(t, http.StatusOK, res.StatusCode, body) - - var deposit gov.Deposit - err := cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &deposit) - require.Nil(t, err) - - return deposit -} - -// GET /gov/proposals/{proposalId}/votes/{voter} Query vote -func getVote(t *testing.T, port string, proposalID uint64, voterAddr sdk.AccAddress) gov.Vote { - res, body := Request(t, port, "GET", fmt.Sprintf("/gov/proposals/%d/votes/%s", proposalID, voterAddr), nil) - require.Equal(t, http.StatusOK, res.StatusCode, body) - - var vote gov.Vote - err := cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &vote) - require.Nil(t, err) - - return vote -} - -// GET /gov/proposals/{proposalId}/proposer -func getProposer(t *testing.T, port string, proposalID uint64) gcutils.Proposer { - res, body := Request(t, port, "GET", fmt.Sprintf("/gov/proposals/%d/proposer", proposalID), nil) - require.Equal(t, http.StatusOK, res.StatusCode, body) - - var proposer gcutils.Proposer - err := cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &proposer) - - require.Nil(t, err) - return proposer -} - -// GET /gov/parameters/deposit Query governance deposit parameters -func getDepositParam(t *testing.T, port string) gov.DepositParams { - res, body := Request(t, port, "GET", "/gov/parameters/deposit", nil) - require.Equal(t, http.StatusOK, res.StatusCode, body) - - var depositParams gov.DepositParams - err := cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &depositParams) - require.Nil(t, err) - - return depositParams -} - -// GET /gov/parameters/tallying Query governance tally parameters -func getTallyingParam(t *testing.T, port string) gov.TallyParams { - res, body := Request(t, port, "GET", "/gov/parameters/tallying", nil) - require.Equal(t, http.StatusOK, res.StatusCode, body) - - var tallyParams gov.TallyParams - err := cdc.UnmarshalJSON([]byte(body), &tallyParams) - require.Nil(t, err) - return tallyParams -} - -// GET /gov/parameters/voting Query governance voting parameters -func getVotingParam(t *testing.T, port string) gov.VotingParams { - res, body := Request(t, port, "GET", "/gov/parameters/voting", nil) - require.Equal(t, http.StatusOK, res.StatusCode, body) - - var votingParams gov.VotingParams - err := cdc.UnmarshalJSON([]byte(body), &votingParams) - require.Nil(t, err) - return votingParams -} - -// ---------------------------------------------------------------------- -// ICS 23 - Slashing -// ---------------------------------------------------------------------- -// GET /slashing/validators/{validatorPubKey}/signing_info Get sign info of given validator -func getSigningInfo(t *testing.T, port string, validatorPubKey string) slashing.ValidatorSigningInfo { - res, body := Request(t, port, "GET", fmt.Sprintf("/slashing/validators/%s/signing_info", validatorPubKey), nil) - require.Equal(t, http.StatusOK, res.StatusCode, body) - - var signingInfo slashing.ValidatorSigningInfo - err := cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &signingInfo) - require.Nil(t, err) - - return signingInfo -} - -// ---------------------------------------------------------------------- -// ICS 23 - SlashingList -// ---------------------------------------------------------------------- -// GET /slashing/signing_infos Get sign info of all validators with pagination -func getSigningInfoList(t *testing.T, port string) []slashing.ValidatorSigningInfo { - res, body := Request(t, port, "GET", "/slashing/signing_infos?page=1&limit=1", nil) - require.Equal(t, http.StatusOK, res.StatusCode, body) - - var signingInfo []slashing.ValidatorSigningInfo - err := cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &signingInfo) - require.Nil(t, err) - - return signingInfo -} - -// TODO: Test this functionality, it is not currently in any of the tests -// POST /slashing/validators/{validatorAddr}/unjail Unjail a jailed validator -func doUnjail( - t *testing.T, port, name string, valAddr sdk.ValAddress, fees sdk.Coins, -) sdk.TxResponse { - - acc := getAccount(t, port, sdk.AccAddress(valAddr.Bytes())) - from := acc.GetAddress().String() - chainID := viper.GetString(flags.FlagChainID) - - baseReq := rest.NewBaseReq(from, "", chainID, "", "", 1, 1, fees, nil, false) - ur := slashingrest.UnjailReq{ - BaseReq: baseReq, - } - req, err := cdc.MarshalJSON(ur) - require.NoError(t, err) - - resp, body := Request(t, port, "POST", fmt.Sprintf("/slashing/validators/%s/unjail", valAddr.String()), req) - require.Equal(t, http.StatusOK, resp.StatusCode, body) - - resp, body = signAndBroadcastGenTx(t, port, name, body, acc, flags.DefaultGasAdjustment, false, nil) - require.Equal(t, http.StatusOK, resp.StatusCode, body) - - var txResp sdk.TxResponse - err = cdc.UnmarshalJSON([]byte(body), &txResp) - require.NoError(t, err) - - return txResp -} - -// ICS24 - fee distribution - -// POST /distribution/delegators/{delgatorAddr}/rewards Withdraw delegator rewards -func doWithdrawDelegatorAllRewards( - t *testing.T, port, name string, delegatorAddr sdk.AccAddress, fees sdk.Coins, -) sdk.TxResponse { - // get the account to get the sequence - acc := getAccount(t, port, delegatorAddr) - accnum := acc.GetAccountNumber() - sequence := acc.GetSequence() - chainID := viper.GetString(flags.FlagChainID) - from := acc.GetAddress().String() - - baseReq := rest.NewBaseReq(from, "", chainID, "", "", accnum, sequence, fees, nil, false) - wr := struct { - BaseReq rest.BaseReq `json:"base_req"` - }{BaseReq: baseReq} - - req := cdc.MustMarshalJSON(wr) - - resp, body := Request(t, port, "POST", fmt.Sprintf("/distribution/delegators/%s/rewards", delegatorAddr), req) - require.Equal(t, http.StatusOK, resp.StatusCode, body) - - resp, body = signAndBroadcastGenTx(t, port, name, body, acc, flags.DefaultGasAdjustment, false, nil) - require.Equal(t, http.StatusOK, resp.StatusCode, body) - - var txResp sdk.TxResponse - err := cdc.UnmarshalJSON([]byte(body), &txResp) - require.NoError(t, err) - - return txResp -} diff --git a/band-consumer/lcd_test/lcd_test.go b/band-consumer/lcd_test/lcd_test.go deleted file mode 100644 index 419beeccd6..0000000000 --- a/band-consumer/lcd_test/lcd_test.go +++ /dev/null @@ -1,1113 +0,0 @@ -//nolint:bodyclose -package lcdtest - -import ( - "encoding/base64" - "encoding/hex" - "encoding/json" - "fmt" - "net/http" - "os" - "strings" - "testing" - "time" - - "github.com/spf13/viper" - "github.com/stretchr/testify/require" - - "github.com/cosmos/cosmos-sdk/client/flags" - mintkey "github.com/cosmos/cosmos-sdk/crypto" - keys "github.com/cosmos/cosmos-sdk/crypto/keyring" - "github.com/cosmos/cosmos-sdk/tests" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/rest" - "github.com/cosmos/cosmos-sdk/version" - "github.com/cosmos/cosmos-sdk/x/auth" - "github.com/cosmos/cosmos-sdk/x/bank" - distrrest "github.com/cosmos/cosmos-sdk/x/distribution/client/rest" - disttypes "github.com/cosmos/cosmos-sdk/x/distribution/types" - "github.com/cosmos/cosmos-sdk/x/gov" - "github.com/cosmos/cosmos-sdk/x/mint" - "github.com/cosmos/cosmos-sdk/x/slashing" -) - -const ( - name1 = "test1" - memo = "LCD test tx" -) - -var fees = sdk.Coins{sdk.NewInt64Coin(sdk.DefaultBondDenom, 5)} - -func init() { - mintkey.BcryptSecurityParameter = 1 - version.Version = os.Getenv("VERSION") -} - -func newKeybase() (keys.Keyring, error) { - return keys.New( - sdk.KeyringServiceName(), - viper.GetString(flags.FlagKeyringBackend), - InitClientHome(""), - nil, - ) -} - -// nolint: errcheck -func TestMain(m *testing.M) { - viper.Set(flags.FlagKeyringBackend, "test") - os.Exit(m.Run()) -} - -func TestNodeStatus(t *testing.T) { - cleanup, _, _, port, err := InitializeLCD(1, []sdk.AccAddress{}, true) - require.NoError(t, err) - defer cleanup() - getNodeInfo(t, port) - getSyncStatus(t, port, false) -} - -func TestBlock(t *testing.T) { - cleanup, _, _, port, err := InitializeLCD(1, []sdk.AccAddress{}, true) - require.NoError(t, err) - defer cleanup() - getBlock(t, port, -1, false) - getBlock(t, port, 2, false) - getBlock(t, port, 100000000, true) -} - -func TestValidators(t *testing.T) { - cleanup, _, _, port, err := InitializeLCD(1, []sdk.AccAddress{}, true) - require.NoError(t, err) - defer cleanup() - resultVals := getValidatorSets(t, port, -1, false) - require.Contains(t, resultVals.Validators[0].Address.String(), "cosmosvalcons") - require.Contains(t, resultVals.Validators[0].PubKey, "cosmosvalconspub") - getValidatorSets(t, port, 2, false) - getValidatorSets(t, port, 10000000, true) -} - -func TestCoinSend(t *testing.T) { - kb, err := newKeybase() - require.NoError(t, err) - addr, _, err := CreateAddr(name1, kb) - require.NoError(t, err) - cleanup, _, _, port, err := InitializeLCD(1, []sdk.AccAddress{addr}, true) - require.NoError(t, err) - defer cleanup() - - bz, err := hex.DecodeString("8FA6AB57AD6870F6B5B2E57735F38F2F30E73CB6") - require.NoError(t, err) - someFakeAddr := sdk.AccAddress(bz) - - // query empty - res, body := Request(t, port, "GET", fmt.Sprintf("/auth/accounts/%s", someFakeAddr), nil) - require.Equal(t, http.StatusOK, res.StatusCode, body) - - initialBalance := getBalances(t, port, addr) - - // create TX - receiveAddr, resultTx := doTransfer(t, port, name1, memo, addr, fees, kb) - tests.WaitForHeight(resultTx.Height+1, port) - - // check if tx was committed - require.Equal(t, uint32(0), resultTx.Code) - - // query sender - coins := getBalances(t, port, addr) - expectedBalance := initialBalance[0].Sub(fees[0]) - - require.Equal(t, sdk.DefaultBondDenom, coins[0].Denom) - require.Equal(t, expectedBalance.Amount.SubRaw(1), coins[0].Amount) - expectedBalance = coins[0] - - // query receiver - coins2 := getBalances(t, port, receiveAddr) - require.Equal(t, sdk.DefaultBondDenom, coins2[0].Denom) - require.Equal(t, int64(1), coins2[0].Amount.Int64()) - - // test failure with too little gas - res, body, _ = doTransferWithGas(t, port, name1, memo, addr, "100", 0, false, true, fees, kb) - require.Equal(t, http.StatusOK, res.StatusCode, body) - require.Nil(t, err) - - // test failure with negative gas - res, body, _ = doTransferWithGas(t, port, name1, memo, addr, "-200", 0, false, false, fees, kb) - require.Equal(t, http.StatusBadRequest, res.StatusCode, body) - - // test failure with negative adjustment - res, body, _ = doTransferWithGas(t, port, name1, memo, addr, "10000", -0.1, true, false, fees, kb) - require.Equal(t, http.StatusBadRequest, res.StatusCode, body) - - // test failure with 0 gas - res, body, _ = doTransferWithGas(t, port, name1, memo, addr, "0", 0, false, true, fees, kb) - require.Equal(t, http.StatusOK, res.StatusCode, body) - - // test failure with wrong adjustment - res, body, _ = doTransferWithGas(t, port, name1, memo, addr, flags.GasFlagAuto, 0.1, false, true, fees, kb) - require.Equal(t, http.StatusOK, res.StatusCode, body) - - // run simulation and test success with estimated gas - res, body, _ = doTransferWithGas(t, port, name1, memo, addr, "10000", 1.0, true, false, fees, kb) - require.Equal(t, http.StatusOK, res.StatusCode, body) - - var gasEstResp rest.GasEstimateResponse - require.Nil(t, cdc.UnmarshalJSON([]byte(body), &gasEstResp)) - require.NotZero(t, gasEstResp.GasEstimate) - - balances := getBalances(t, port, addr) - require.Equal(t, expectedBalance.Amount, balances.AmountOf(sdk.DefaultBondDenom)) - - // run successful tx - gas := fmt.Sprintf("%d", gasEstResp.GasEstimate) - res, body, _ = doTransferWithGas(t, port, name1, memo, addr, gas, 1.0, false, true, fees, kb) - require.Equal(t, http.StatusOK, res.StatusCode, body) - - err = cdc.UnmarshalJSON([]byte(body), &resultTx) - require.Nil(t, err) - - tests.WaitForHeight(resultTx.Height+1, port) - require.Equal(t, uint32(0), resultTx.Code) - - balances = getBalances(t, port, addr) - expectedBalance = expectedBalance.Sub(fees[0]) - require.Equal(t, expectedBalance.Amount.SubRaw(1), balances.AmountOf(sdk.DefaultBondDenom)) -} - -func TestCoinSendAccAuto(t *testing.T) { - kb, err := newKeybase() - require.NoError(t, err) - addr, _, err := CreateAddr(name1, kb) - require.NoError(t, err) - cleanup, _, _, port, err := InitializeLCD(1, []sdk.AccAddress{addr}, true) - require.NoError(t, err) - defer cleanup() - - initialBalance := getBalances(t, port, addr) - - // send a transfer tx without specifying account number and sequence - res, body, _ := doTransferWithGasAccAuto( - t, port, name1, memo, addr, "200000", 1.0, false, true, fees, kb, - ) - require.Equal(t, http.StatusOK, res.StatusCode, body) - - // query sender - coins := getBalances(t, port, addr) - expectedBalance := initialBalance[0].Sub(fees[0]) - - require.Equal(t, sdk.DefaultBondDenom, coins[0].Denom) - require.Equal(t, expectedBalance.Amount.SubRaw(1), coins[0].Amount) -} - -func TestCoinMultiSendGenerateOnly(t *testing.T) { - kb, err := newKeybase() - require.NoError(t, err) - addr, _, err := CreateAddr(name1, kb) - require.NoError(t, err) - cleanup, _, _, port, err := InitializeLCD(1, []sdk.AccAddress{addr}, true) - require.NoError(t, err) - defer cleanup() - - // generate only - res, body, _ := doTransferWithGas(t, port, "", memo, addr, "200000", 1, false, false, fees, kb) - require.Equal(t, http.StatusOK, res.StatusCode, body) - - var stdTx auth.StdTx - require.Nil(t, cdc.UnmarshalJSON([]byte(body), &stdTx)) - require.Equal(t, len(stdTx.Msgs), 1) - require.Equal(t, stdTx.GetMsgs()[0].Route(), bank.RouterKey) - require.Equal(t, stdTx.GetMsgs()[0].GetSigners(), []sdk.AccAddress{addr}) - require.Equal(t, 0, len(stdTx.Signatures)) - require.Equal(t, memo, stdTx.Memo) - require.NotZero(t, stdTx.Fee.Gas) - require.IsType(t, stdTx.GetMsgs()[0], bank.MsgSend{}) - require.Equal(t, addr, stdTx.GetMsgs()[0].(bank.MsgSend).FromAddress) -} - -func TestCoinSendGenerateSignAndBroadcast(t *testing.T) { - kb, err := newKeybase() - require.NoError(t, err) - addr, _, err := CreateAddr(name1, kb) - require.NoError(t, err) - cleanup, _, _, port, err := InitializeLCD(1, []sdk.AccAddress{addr}, true) - require.NoError(t, err) - defer cleanup() - acc := getAccount(t, port, addr) - - // simulate tx - res, body, _ := doTransferWithGas(t, port, name1, memo, addr, flags.GasFlagAuto, 1.0, true, false, fees, kb) - require.Equal(t, http.StatusOK, res.StatusCode, body) - - var gasEstResp rest.GasEstimateResponse - require.Nil(t, cdc.UnmarshalJSON([]byte(body), &gasEstResp)) - require.NotZero(t, gasEstResp.GasEstimate) - - // generate tx - gas := fmt.Sprintf("%d", gasEstResp.GasEstimate) - res, body, _ = doTransferWithGas(t, port, name1, memo, addr, gas, 1, false, false, fees, kb) - require.Equal(t, http.StatusOK, res.StatusCode, body) - - var tx auth.StdTx - require.Nil(t, cdc.UnmarshalJSON([]byte(body), &tx)) - require.Equal(t, len(tx.Msgs), 1) - require.Equal(t, tx.Msgs[0].Route(), bank.RouterKey) - require.Equal(t, tx.Msgs[0].GetSigners(), []sdk.AccAddress{addr}) - require.Equal(t, 0, len(tx.Signatures)) - require.Equal(t, memo, tx.Memo) - require.NotZero(t, tx.Fee.Gas) - - gasEstimate := int64(tx.Fee.Gas) - _, body = signAndBroadcastGenTx(t, port, name1, body, acc, 1.0, false, kb) - - // check if tx was committed - var txResp sdk.TxResponse - require.Nil(t, cdc.UnmarshalJSON([]byte(body), &txResp)) - require.Equal(t, uint32(0), txResp.Code) - require.Equal(t, gasEstimate, txResp.GasWanted) -} - -func TestEncodeTx(t *testing.T) { - kb, err := newKeybase() - require.NoError(t, err) - addr, _, err := CreateAddr(name1, kb) - require.NoError(t, err) - cleanup, _, _, port, err := InitializeLCD(1, []sdk.AccAddress{addr}, true) - require.NoError(t, err) - defer cleanup() - - _, body, _ := doTransferWithGas(t, port, name1, memo, addr, "2", 1, false, false, fees, kb) - var tx auth.StdTx - require.Nil(t, cdc.UnmarshalJSON([]byte(body), &tx)) - - encodedJSON, err := cdc.MarshalJSON(tx) - require.NoError(t, err) - res, body := Request(t, port, "POST", "/txs/encode", encodedJSON) - - // Make sure it came back ok, and that we can decode it back to the transaction - // 200 response. - require.Equal(t, http.StatusOK, res.StatusCode, body) - encodeResp := struct { - Tx string `json:"tx"` - }{} - - require.Nil(t, cdc.UnmarshalJSON([]byte(body), &encodeResp)) - - // verify that the base64 decodes - decodedBytes, err := base64.StdEncoding.DecodeString(encodeResp.Tx) - require.Nil(t, err) - - // check that the transaction decodes as expected - var decodedTx auth.StdTx - require.Nil(t, cdc.UnmarshalBinaryBare(decodedBytes, &decodedTx)) - require.Equal(t, memo, decodedTx.Memo) -} - -func TestTxs(t *testing.T) { - kb, err := newKeybase() - require.NoError(t, err) - addr, _, err := CreateAddr(name1, kb) - require.NoError(t, err) - cleanup, _, _, port, err := InitializeLCD(1, []sdk.AccAddress{addr}, true) - require.NoError(t, err) - defer cleanup() - - var emptyTxs []sdk.TxResponse - txResult := getTransactions(t, port) - require.Equal(t, emptyTxs, txResult.Txs) - - // query empty - txResult = getTransactions(t, port, fmt.Sprintf("message.sender=%s", addr.String())) - require.Equal(t, emptyTxs, txResult.Txs) - - // also tests url decoding - txResult = getTransactions(t, port, fmt.Sprintf("message.sender=%s", addr.String())) - require.Equal(t, emptyTxs, txResult.Txs) - - txResult = getTransactions(t, port, fmt.Sprintf("message.action=submit_proposal&message.sender=%s", addr.String())) - require.Equal(t, emptyTxs, txResult.Txs) - - // create tx - receiveAddr, resultTx := doTransfer(t, port, name1, memo, addr, fees, kb) - tests.WaitForHeight(resultTx.Height+1, port) - - // check if tx is queryable - tx := getTransaction(t, port, resultTx.TxHash) - require.Equal(t, resultTx.TxHash, tx.TxHash) - - // query sender - txResult = getTransactions(t, port, fmt.Sprintf("message.sender=%s", addr.String())) - require.Len(t, txResult.Txs, 1) - require.Equal(t, resultTx.Height, txResult.Txs[0].Height) - - // query recipient - txResult = getTransactions(t, port, fmt.Sprintf("transfer.recipient=%s", receiveAddr.String())) - require.Len(t, txResult.Txs, 1) - require.Equal(t, resultTx.Height, txResult.Txs[0].Height) - - // query transaction that doesn't exist - validTxHash := "9ADBECAAD8DACBEC3F4F535704E7CF715C765BDCEDBEF086AFEAD31BA664FB0B" - res, body := getTransactionRequest(t, port, validTxHash) - require.True(t, strings.Contains(body, validTxHash)) - require.Equal(t, http.StatusNotFound, res.StatusCode) - - // bad query string - res, body = getTransactionRequest(t, port, "badtxhash") - require.True(t, strings.Contains(body, "encoding/hex")) - require.Equal(t, http.StatusInternalServerError, res.StatusCode) -} - -func TestValidatorsQuery(t *testing.T) { - cleanup, valPubKeys, operAddrs, port, err := InitializeLCD(1, []sdk.AccAddress{}, true) - require.NoError(t, err) - defer cleanup() - - require.Equal(t, 1, len(valPubKeys)) - require.Equal(t, 1, len(operAddrs)) - - validators := getValidators(t, port) - require.Equal(t, 1, len(validators), fmt.Sprintf("%+v", validators)) - - // make sure all the validators were found (order unknown because sorted by operator addr) - foundVal := false - - if validators[0].ConsensusPubkey == sdk.MustBech32ifyPubKey(sdk.Bech32PubKeyTypeConsPub, valPubKeys[0]) { - foundVal = true - } - - require.True(t, foundVal, "pk %v, operator %v", operAddrs[0], validators[0].OperatorAddress) -} - -func TestValidatorQuery(t *testing.T) { - cleanup, valPubKeys, operAddrs, port, err := InitializeLCD(1, []sdk.AccAddress{}, true) - require.NoError(t, err) - defer cleanup() - require.Equal(t, 1, len(valPubKeys)) - require.Equal(t, 1, len(operAddrs)) - - validator := getValidator(t, port, operAddrs[0]) - require.Equal(t, validator.OperatorAddress, operAddrs[0], "The returned validator does not hold the correct data") -} - -func TestBonding(t *testing.T) { - kb, err := newKeybase() - require.NoError(t, err) - addr, _, err := CreateAddr(name1, kb) - require.NoError(t, err) - - cleanup, valPubKeys, operAddrs, port, err := InitializeLCD(2, []sdk.AccAddress{addr}, false) - require.NoError(t, err) - tests.WaitForHeight(1, port) - defer cleanup() - - require.Equal(t, 2, len(valPubKeys)) - require.Equal(t, 2, len(operAddrs)) - - amt := sdk.TokensFromConsensusPower(60) - amtDec := amt.ToDec() - validator := getValidator(t, port, operAddrs[0]) - - initialBalance := getBalances(t, port, addr) - - // create bond TX - delTokens := sdk.TokensFromConsensusPower(60) - resultTx := doDelegate(t, port, name1, addr, operAddrs[0], delTokens, fees, kb) - tests.WaitForHeight(resultTx.Height+1, port) - - require.Equal(t, uint32(0), resultTx.Code) - - // query tx - txResult := getTransactions(t, port, - fmt.Sprintf("message.action=delegate&message.sender=%s", addr), - fmt.Sprintf("delegate.validator=%s", operAddrs[0]), - ) - require.Len(t, txResult.Txs, 1) - require.Equal(t, resultTx.Height, txResult.Txs[0].Height) - - // verify balance - coins := getBalances(t, port, addr) - expectedBalance := initialBalance[0].Sub(fees[0]) - require.Equal(t, expectedBalance.Amount.Sub(delTokens).String(), coins.AmountOf(sdk.DefaultBondDenom).String()) - expectedBalance = coins[0] - - // query delegation - bond := getDelegation(t, port, addr, operAddrs[0]) - require.Equal(t, amtDec, bond.Shares) - - delegatorDels := getDelegatorDelegations(t, port, addr) - require.Len(t, delegatorDels, 1) - require.Equal(t, amtDec, delegatorDels[0].Shares) - - // query all delegations to validator - bonds := getValidatorDelegations(t, port, operAddrs[0]) - require.Len(t, bonds, 2) - - bondedValidators := getDelegatorValidators(t, port, addr) - require.Len(t, bondedValidators, 1) - require.Equal(t, operAddrs[0], bondedValidators[0].OperatorAddress) - require.Equal(t, validator.DelegatorShares.Add(amtDec).String(), bondedValidators[0].DelegatorShares.String()) - - bondedValidator := getDelegatorValidator(t, port, addr, operAddrs[0]) - require.Equal(t, operAddrs[0], bondedValidator.OperatorAddress) - - // testing unbonding - unbondingTokens := sdk.TokensFromConsensusPower(30) - resultTx = doUndelegate(t, port, name1, addr, operAddrs[0], unbondingTokens, fees, kb) - tests.WaitForHeight(resultTx.Height+1, port) - - require.Equal(t, uint32(0), resultTx.Code) - - // sender should have not received any coins as the unbonding has only just begun - coins = getBalances(t, port, addr) - expectedBalance = expectedBalance.Sub(fees[0]) - require.True(t, - expectedBalance.Amount.LT(coins.AmountOf(sdk.DefaultBondDenom)) || - expectedBalance.Amount.Equal(coins.AmountOf(sdk.DefaultBondDenom)), - "should get tokens back from automatic withdrawal after an unbonding delegation", - ) - expectedBalance = coins[0] - - // query tx - txResult = getTransactions(t, port, - fmt.Sprintf("message.action=begin_unbonding&message.sender=%s", addr), - fmt.Sprintf("unbond.validator=%s", operAddrs[0]), - ) - require.Len(t, txResult.Txs, 1) - require.Equal(t, resultTx.Height, txResult.Txs[0].Height) - - ubd := getUnbondingDelegation(t, port, addr, operAddrs[0]) - require.Len(t, ubd.Entries, 1) - require.Equal(t, delTokens.QuoRaw(2), ubd.Entries[0].Balance) - - // test redelegation - rdTokens := sdk.TokensFromConsensusPower(30) - resultTx = doBeginRedelegation(t, port, name1, addr, operAddrs[0], operAddrs[1], rdTokens, fees, kb) - require.Equal(t, uint32(0), resultTx.Code) - tests.WaitForHeight(resultTx.Height+1, port) - - // query delegations, unbondings and redelegations from validator and delegator - delegatorDels = getDelegatorDelegations(t, port, addr) - require.Len(t, delegatorDels, 1) - require.Equal(t, operAddrs[1], delegatorDels[0].ValidatorAddress) - - // TODO uncomment once all validators actually sign in the lcd tests - //validator2 := getValidator(t, port, operAddrs[1]) - //delTokensAfterRedelegation := validator2.ShareTokens(delegatorDels[0].GetShares()) - //require.Equal(t, rdTokens.ToDec(), delTokensAfterRedelegation) - - // verify balance after paying fees - expectedBalance = expectedBalance.Sub(fees[0]) - require.True(t, - expectedBalance.Amount.LT(coins.AmountOf(sdk.DefaultBondDenom)) || - expectedBalance.Amount.Equal(coins.AmountOf(sdk.DefaultBondDenom)), - "should get tokens back from automatic withdrawal after an unbonding delegation", - ) - - // query tx - txResult = getTransactions(t, port, - fmt.Sprintf("message.action=begin_redelegate&message.sender=%s", addr), - fmt.Sprintf("redelegate.source_validator=%s", operAddrs[0]), - fmt.Sprintf("redelegate.destination_validator=%s", operAddrs[1]), - ) - require.Len(t, txResult.Txs, 1) - require.Equal(t, resultTx.Height, txResult.Txs[0].Height) - - redelegation := getRedelegations(t, port, addr, operAddrs[0], operAddrs[1]) - require.Len(t, redelegation, 1) - require.Len(t, redelegation[0].Entries, 1) - - delegatorUbds := getDelegatorUnbondingDelegations(t, port, addr) - require.Len(t, delegatorUbds, 1) - require.Len(t, delegatorUbds[0].Entries, 1) - require.Equal(t, rdTokens, delegatorUbds[0].Entries[0].Balance) - - delegatorReds := getRedelegations(t, port, addr, nil, nil) - require.Len(t, delegatorReds, 1) - require.Len(t, delegatorReds[0].Entries, 1) - - validatorUbds := getValidatorUnbondingDelegations(t, port, operAddrs[0]) - require.Len(t, validatorUbds, 1) - require.Len(t, validatorUbds[0].Entries, 1) - require.Equal(t, rdTokens, validatorUbds[0].Entries[0].Balance) - - validatorReds := getRedelegations(t, port, nil, operAddrs[0], nil) - require.Len(t, validatorReds, 1) - require.Len(t, validatorReds[0].Entries, 1) - - // TODO Undonding status not currently implemented - // require.Equal(t, sdk.Unbonding, bondedValidators[0].Status) - - // query txs - txs := getBondingTxs(t, port, addr, "") - require.Len(t, txs, 3, "All Txs found") - - txs = getBondingTxs(t, port, addr, "bond") - require.Len(t, txs, 1, "All bonding txs found") - - txs = getBondingTxs(t, port, addr, "unbond") - require.Len(t, txs, 1, "All unbonding txs found") - - txs = getBondingTxs(t, port, addr, "redelegate") - require.Len(t, txs, 1, "All redelegation txs found") -} - -func TestSubmitProposal(t *testing.T) { - kb, err := newKeybase() - require.NoError(t, err) - addr, _, err := CreateAddr(name1, kb) - require.NoError(t, err) - cleanup, _, _, port, err := InitializeLCD(1, []sdk.AccAddress{addr}, true) - require.NoError(t, err) - defer cleanup() - - initialBalance := getBalances(t, port, addr) - - // create SubmitProposal TX - proposalTokens := sdk.TokensFromConsensusPower(5) - resultTx := doSubmitProposal(t, port, name1, addr, proposalTokens, fees, kb) - tests.WaitForHeight(resultTx.Height+1, port) - - // check if tx was committed - require.Equal(t, uint32(0), resultTx.Code) - - bz, err := hex.DecodeString(resultTx.Data) - require.NoError(t, err) - proposalID := gov.GetProposalIDFromBytes(bz) - - // verify balance - balances := getBalances(t, port, addr) - expectedBalance := initialBalance[0].Sub(fees[0]) - require.Equal(t, expectedBalance.Amount.Sub(proposalTokens), balances.AmountOf(sdk.DefaultBondDenom)) - - // query proposal - proposal := getProposal(t, port, proposalID) - require.Equal(t, "Test", proposal.GetTitle()) - - proposer := getProposer(t, port, proposalID) - require.Equal(t, addr.String(), proposer.Proposer) - require.Equal(t, proposalID, proposer.ProposalID) -} - -func TestSubmitCommunityPoolSpendProposal(t *testing.T) { - kb, err := newKeybase() - require.NoError(t, err) - addr, _, err := CreateAddr(name1, kb) - require.NoError(t, err) - cleanup, _, _, port, err := InitializeLCD(1, []sdk.AccAddress{addr}, true) - require.NoError(t, err) - defer cleanup() - - initialBalance := getBalances(t, port, addr) - - // create proposal tx - proposalTokens := sdk.TokensFromConsensusPower(5) - resultTx := doSubmitCommunityPoolSpendProposal(t, port, name1, addr, proposalTokens, fees, kb) - tests.WaitForHeight(resultTx.Height+1, port) - - // check if tx was committed - require.Equal(t, uint32(0), resultTx.Code) - - bz, err := hex.DecodeString(resultTx.Data) - require.NoError(t, err) - proposalID := gov.GetProposalIDFromBytes(bz) - - // verify balance - balances := getBalances(t, port, addr) - expectedBalance := initialBalance[0].Sub(fees[0]) - require.Equal(t, expectedBalance.Amount.Sub(proposalTokens), balances.AmountOf(sdk.DefaultBondDenom)) - - // query proposal - proposal := getProposal(t, port, proposalID) - require.Equal(t, "Test", proposal.GetTitle()) - - proposer := getProposer(t, port, proposalID) - require.Equal(t, addr.String(), proposer.Proposer) - require.Equal(t, proposalID, proposer.ProposalID) -} - -func TestSubmitParamChangeProposal(t *testing.T) { - kb, err := newKeybase() - require.NoError(t, err) - addr, _, err := CreateAddr(name1, kb) - require.NoError(t, err) - cleanup, _, _, port, err := InitializeLCD(1, []sdk.AccAddress{addr}, true) - require.NoError(t, err) - defer cleanup() - - initialBalance := getBalances(t, port, addr) - - // create proposal tx - proposalTokens := sdk.TokensFromConsensusPower(5) - resultTx := doSubmitParamChangeProposal(t, port, name1, addr, proposalTokens, fees, kb) - tests.WaitForHeight(resultTx.Height+1, port) - - // check if tx was committed - require.Equal(t, uint32(0), resultTx.Code) - - bz, err := hex.DecodeString(resultTx.Data) - require.NoError(t, err) - proposalID := gov.GetProposalIDFromBytes(bz) - - // verify balance - balances := getBalances(t, port, addr) - expectedBalance := initialBalance[0].Sub(fees[0]) - require.Equal(t, expectedBalance.Amount.Sub(proposalTokens), balances.AmountOf(sdk.DefaultBondDenom)) - - // query proposal - proposal := getProposal(t, port, proposalID) - require.Equal(t, "Test", proposal.GetTitle()) - - proposer := getProposer(t, port, proposalID) - require.Equal(t, addr.String(), proposer.Proposer) - require.Equal(t, proposalID, proposer.ProposalID) -} - -func TestDeposit(t *testing.T) { - kb, err := newKeybase() - require.NoError(t, err) - addr, _, err := CreateAddr(name1, kb) - require.NoError(t, err) - cleanup, _, _, port, err := InitializeLCD(1, []sdk.AccAddress{addr}, true) - require.NoError(t, err) - defer cleanup() - - initialBalance := getBalances(t, port, addr) - - // create SubmitProposal TX - proposalTokens := sdk.TokensFromConsensusPower(5) - resultTx := doSubmitProposal(t, port, name1, addr, proposalTokens, fees, kb) - tests.WaitForHeight(resultTx.Height+1, port) - - // check if tx was committed - require.Equal(t, uint32(0), resultTx.Code) - - bz, err := hex.DecodeString(resultTx.Data) - require.NoError(t, err) - proposalID := gov.GetProposalIDFromBytes(bz) - - // verify balance - coins := getBalances(t, port, addr) - expectedBalance := initialBalance[0].Sub(fees[0]) - require.Equal(t, expectedBalance.Amount.Sub(proposalTokens), coins.AmountOf(sdk.DefaultBondDenom)) - expectedBalance = coins[0] - - // query proposal - proposal := getProposal(t, port, proposalID) - require.Equal(t, "Test", proposal.GetTitle()) - - // create SubmitProposal TX - depositTokens := sdk.TokensFromConsensusPower(5) - resultTx = doDeposit(t, port, name1, addr, proposalID, depositTokens, fees, kb) - tests.WaitForHeight(resultTx.Height+1, port) - - // verify balance after deposit and fee - balances := getBalances(t, port, addr) - expectedBalance = expectedBalance.Sub(fees[0]) - require.Equal(t, expectedBalance.Amount.Sub(depositTokens), balances.AmountOf(sdk.DefaultBondDenom)) - - // query tx - txResult := getTransactions(t, port, fmt.Sprintf("message.action=deposit&message.sender=%s", addr)) - require.Len(t, txResult.Txs, 1) - require.Equal(t, resultTx.Height, txResult.Txs[0].Height) - - // query proposal - totalCoins := sdk.Coins{sdk.NewCoin(sdk.DefaultBondDenom, sdk.TokensFromConsensusPower(10))} - proposal = getProposal(t, port, proposalID) - require.True(t, proposal.TotalDeposit.IsEqual(totalCoins)) - - // query deposit - deposit := getDeposit(t, port, proposalID, addr) - require.True(t, deposit.Amount.IsEqual(totalCoins)) -} - -func TestVote(t *testing.T) { - kb, err := newKeybase() - require.NoError(t, err) - addr, _, err := CreateAddr(name1, kb) - require.NoError(t, err) - cleanup, _, operAddrs, port, err := InitializeLCD(1, []sdk.AccAddress{addr}, true) - require.NoError(t, err) - defer cleanup() - - initialBalance := getBalances(t, port, addr) - - // create SubmitProposal TX - proposalTokens := sdk.TokensFromConsensusPower(10) - resultTx := doSubmitProposal(t, port, name1, addr, proposalTokens, fees, kb) - tests.WaitForHeight(resultTx.Height+1, port) - - // check if tx was committed - require.Equal(t, uint32(0), resultTx.Code) - - bz, err := hex.DecodeString(resultTx.Data) - require.NoError(t, err) - proposalID := gov.GetProposalIDFromBytes(bz) - - // verify balance - coins := getBalances(t, port, addr) - expectedBalance := initialBalance[0].Sub(fees[0]) - require.Equal(t, expectedBalance.Amount.Sub(proposalTokens), coins.AmountOf(sdk.DefaultBondDenom)) - expectedBalance = coins[0] - - // query proposal - proposal := getProposal(t, port, proposalID) - require.Equal(t, "Test", proposal.GetTitle()) - require.Equal(t, gov.StatusVotingPeriod, proposal.Status) - - // vote - resultTx = doVote(t, port, name1, addr, proposalID, "Yes", fees, kb) - tests.WaitForHeight(resultTx.Height+1, port) - - // verify balance after vote and fee - coins = getBalances(t, port, addr) - expectedBalance = expectedBalance.Sub(fees[0]) - require.Equal(t, expectedBalance.Amount, coins.AmountOf(sdk.DefaultBondDenom)) - expectedBalance = coins[0] - - // query tx - txResult := getTransactions(t, port, fmt.Sprintf("message.action=vote&message.sender=%s", addr)) - require.Len(t, txResult.Txs, 1) - require.Equal(t, resultTx.Height, txResult.Txs[0].Height) - - vote := getVote(t, port, proposalID, addr) - require.Equal(t, proposalID, vote.ProposalID) - require.Equal(t, gov.OptionYes, vote.Option) - - tally := getTally(t, port, proposalID) - require.Equal(t, sdk.ZeroInt(), tally.Yes, "tally should be 0 as the address is not bonded") - - // create bond TX - delTokens := sdk.TokensFromConsensusPower(60) - resultTx = doDelegate(t, port, name1, addr, operAddrs[0], delTokens, fees, kb) - tests.WaitForHeight(resultTx.Height+1, port) - - // verify balance - coins = getBalances(t, port, addr) - expectedBalance = expectedBalance.Sub(fees[0]) - require.Equal(t, expectedBalance.Amount.Sub(delTokens), coins.AmountOf(sdk.DefaultBondDenom)) - expectedBalance = coins[0] - - tally = getTally(t, port, proposalID) - require.Equal(t, delTokens, tally.Yes, "tally should be equal to the amount delegated") - - // change vote option - resultTx = doVote(t, port, name1, addr, proposalID, "No", fees, kb) - tests.WaitForHeight(resultTx.Height+1, port) - - // verify balance - balances := getBalances(t, port, addr) - expectedBalance = expectedBalance.Sub(fees[0]) - require.Equal(t, expectedBalance.Amount, balances.AmountOf(sdk.DefaultBondDenom)) - - tally = getTally(t, port, proposalID) - require.Equal(t, sdk.ZeroInt(), tally.Yes, "tally should be 0 the user changed the option") - require.Equal(t, delTokens, tally.No, "tally should be equal to the amount delegated") -} - -func TestUnjail(t *testing.T) { - kb, err := newKeybase() - require.NoError(t, err) - addr, _, err := CreateAddr(name1, kb) - require.NoError(t, err) - cleanup, valPubKeys, _, port, err := InitializeLCD(1, []sdk.AccAddress{addr}, true) - require.NoError(t, err) - defer cleanup() - - // NOTE: any less than this and it fails - tests.WaitForHeight(3, port) - pkString, err := sdk.Bech32ifyPubKey(sdk.Bech32PubKeyTypeConsPub, valPubKeys[0]) - require.NoError(t, err) - signingInfo := getSigningInfo(t, port, pkString) - tests.WaitForHeight(4, port) - require.Equal(t, true, signingInfo.IndexOffset > 0) - require.Equal(t, time.Unix(0, 0).UTC(), signingInfo.JailedUntil) - require.Equal(t, true, signingInfo.MissedBlocksCounter == 0) - signingInfoList := getSigningInfoList(t, port) - require.NotZero(t, len(signingInfoList)) -} - -func TestProposalsQuery(t *testing.T) { - kb, err := newKeybase() - require.NoError(t, err) - addrs, _, names, errors := CreateAddrs(kb, 2) - require.Empty(t, errors) - - cleanup, _, _, port, err := InitializeLCD(1, []sdk.AccAddress{addrs[0], addrs[1]}, true) - require.NoError(t, err) - defer cleanup() - - depositParam := getDepositParam(t, port) - halfMinDeposit := depositParam.MinDeposit.AmountOf(sdk.DefaultBondDenom).QuoRaw(2) - getVotingParam(t, port) - getTallyingParam(t, port) - - // Addr1 proposes (and deposits) proposals #1 and #2 - resultTx := doSubmitProposal(t, port, names[0], addrs[0], halfMinDeposit, fees, kb) - bz, err := hex.DecodeString(resultTx.Data) - require.NoError(t, err) - - proposalID1 := gov.GetProposalIDFromBytes(bz) - tests.WaitForHeight(resultTx.Height+1, port) - - resultTx = doSubmitProposal(t, port, names[0], addrs[0], halfMinDeposit, fees, kb) - bz, err = hex.DecodeString(resultTx.Data) - require.NoError(t, err) - - proposalID2 := gov.GetProposalIDFromBytes(bz) - tests.WaitForHeight(resultTx.Height+1, port) - - // Addr2 proposes (and deposits) proposals #3 - resultTx = doSubmitProposal(t, port, names[1], addrs[1], halfMinDeposit, fees, kb) - bz, err = hex.DecodeString(resultTx.Data) - require.NoError(t, err) - - proposalID3 := gov.GetProposalIDFromBytes(bz) - tests.WaitForHeight(resultTx.Height+1, port) - - // Addr2 deposits on proposals #2 & #3 - resultTx = doDeposit(t, port, names[1], addrs[1], proposalID2, halfMinDeposit, fees, kb) - tests.WaitForHeight(resultTx.Height+1, port) - - resultTx = doDeposit(t, port, names[1], addrs[1], proposalID3, halfMinDeposit, fees, kb) - tests.WaitForHeight(resultTx.Height+1, port) - - // check deposits match proposal and individual deposits - deposits := getDeposits(t, port, proposalID1) - require.Len(t, deposits, 1) - deposit := getDeposit(t, port, proposalID1, addrs[0]) - require.Equal(t, deposit, deposits[0]) - - deposits = getDeposits(t, port, proposalID2) - require.Len(t, deposits, 2) - deposit = getDeposit(t, port, proposalID2, addrs[0]) - require.True(t, deposit.Equal(deposits[0])) - deposit = getDeposit(t, port, proposalID2, addrs[1]) - require.True(t, deposit.Equal(deposits[1])) - - deposits = getDeposits(t, port, proposalID3) - require.Len(t, deposits, 1) - deposit = getDeposit(t, port, proposalID3, addrs[1]) - require.Equal(t, deposit, deposits[0]) - - // increasing the amount of the deposit should update the existing one - depositTokens := sdk.TokensFromConsensusPower(1) - resultTx = doDeposit(t, port, names[0], addrs[0], proposalID1, depositTokens, fees, kb) - tests.WaitForHeight(resultTx.Height+1, port) - - deposits = getDeposits(t, port, proposalID1) - require.Len(t, deposits, 1) - - // Only proposals #1 should be in Deposit Period - proposals := getProposalsFilterStatus(t, port, gov.StatusDepositPeriod) - require.Len(t, proposals, 1) - require.Equal(t, proposalID1, proposals[0].ProposalID) - - // Only proposals #2 and #3 should be in Voting Period - proposals = getProposalsFilterStatus(t, port, gov.StatusVotingPeriod) - require.Len(t, proposals, 2) - require.Equal(t, proposalID2, proposals[0].ProposalID) - require.Equal(t, proposalID3, proposals[1].ProposalID) - - // Addr1 votes on proposals #2 & #3 - resultTx = doVote(t, port, names[0], addrs[0], proposalID2, "Yes", fees, kb) - tests.WaitForHeight(resultTx.Height+1, port) - resultTx = doVote(t, port, names[0], addrs[0], proposalID3, "Yes", fees, kb) - tests.WaitForHeight(resultTx.Height+1, port) - - // Addr2 votes on proposal #3 - resultTx = doVote(t, port, names[1], addrs[1], proposalID3, "Yes", fees, kb) - tests.WaitForHeight(resultTx.Height+1, port) - - // Test query all proposals - proposals = getProposalsAll(t, port) - require.Equal(t, proposalID1, (proposals[0]).ProposalID) - require.Equal(t, proposalID2, (proposals[1]).ProposalID) - require.Equal(t, proposalID3, (proposals[2]).ProposalID) - - // Test query deposited by addr1 - proposals = getProposalsFilterDepositor(t, port, addrs[0]) - require.Equal(t, proposalID1, (proposals[0]).ProposalID) - - // Test query deposited by addr2 - proposals = getProposalsFilterDepositor(t, port, addrs[1]) - require.Equal(t, proposalID2, (proposals[0]).ProposalID) - require.Equal(t, proposalID3, (proposals[1]).ProposalID) - - // Test query voted by addr1 - proposals = getProposalsFilterVoter(t, port, addrs[0]) - require.Equal(t, proposalID2, (proposals[0]).ProposalID) - require.Equal(t, proposalID3, (proposals[1]).ProposalID) - - // Test query voted by addr2 - proposals = getProposalsFilterVoter(t, port, addrs[1]) - require.Equal(t, proposalID3, (proposals[0]).ProposalID) - - // Test query voted and deposited by addr1 - proposals = getProposalsFilterVoterDepositor(t, port, addrs[0], addrs[0]) - require.Equal(t, proposalID2, (proposals[0]).ProposalID) - - // Test query votes on Proposal 2 - votes := getVotes(t, port, proposalID2) - require.Len(t, votes, 1) - require.Equal(t, addrs[0], votes[0].Voter) - - // Test query votes on Proposal 3 - votes = getVotes(t, port, proposalID3) - require.Len(t, votes, 2) - require.True(t, addrs[0].String() == votes[0].Voter.String() || addrs[0].String() == votes[1].Voter.String()) - require.True(t, addrs[1].String() == votes[0].Voter.String() || addrs[1].String() == votes[1].Voter.String()) -} - -func TestSlashingGetParams(t *testing.T) { - cleanup, _, _, port, err := InitializeLCD(1, []sdk.AccAddress{}, true) - require.NoError(t, err) - defer cleanup() - - res, body := Request(t, port, "GET", "/slashing/parameters", nil) - require.Equal(t, http.StatusOK, res.StatusCode, body) - - var params slashing.Params - err = cdc.UnmarshalJSON([]byte(body), ¶ms) - require.NoError(t, err) -} - -func TestDistributionGetParams(t *testing.T) { - cleanup, _, _, port, err := InitializeLCD(1, []sdk.AccAddress{}, true) - require.NoError(t, err) - defer cleanup() - - res, body := Request(t, port, "GET", "/distribution/parameters", nil) - require.Equal(t, http.StatusOK, res.StatusCode, body) - require.NoError(t, cdc.UnmarshalJSON([]byte(body), &disttypes.Params{})) -} - -func TestDistributionFlow(t *testing.T) { - kb, err := newKeybase() - require.NoError(t, err) - addr, _, err := CreateAddr(name1, kb) - require.NoError(t, err) - cleanup, _, valAddrs, port, err := InitializeLCD(1, []sdk.AccAddress{addr}, true) - require.NoError(t, err) - defer cleanup() - - valAddr := valAddrs[0] - operAddr := sdk.AccAddress(valAddr) - - var outstanding disttypes.ValidatorOutstandingRewards - res, body := Request(t, port, "GET", fmt.Sprintf("/distribution/validators/%s/outstanding_rewards", valAddr), nil) - require.Equal(t, http.StatusOK, res.StatusCode, body) - require.NoError(t, cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &outstanding)) - - var valDistInfo distrrest.ValidatorDistInfo - res, body = Request(t, port, "GET", "/distribution/validators/"+valAddr.String(), nil) - require.Equal(t, http.StatusOK, res.StatusCode, body) - require.NoError(t, cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &valDistInfo)) - require.Equal(t, valDistInfo.OperatorAddress.String(), sdk.AccAddress(valAddr).String()) - - // Delegate some coins - delTokens := sdk.TokensFromConsensusPower(60) - resultTx := doDelegate(t, port, name1, addr, valAddr, delTokens, fees, kb) - tests.WaitForHeight(resultTx.Height+1, port) - require.Equal(t, uint32(0), resultTx.Code) - - // send some coins - _, resultTx = doTransfer(t, port, name1, memo, addr, fees, kb) - tests.WaitForHeight(resultTx.Height+5, port) - require.Equal(t, uint32(0), resultTx.Code) - - // Query outstanding rewards changed - res, body = Request(t, port, "GET", fmt.Sprintf("/distribution/validators/%s/outstanding_rewards", valAddr), nil) - require.Equal(t, http.StatusOK, res.StatusCode, body) - require.NoError(t, cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &outstanding)) - - // Query validator distribution info - res, body = Request(t, port, "GET", "/distribution/validators/"+valAddr.String(), nil) - require.Equal(t, http.StatusOK, res.StatusCode, body) - - require.NoError(t, cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &valDistInfo)) - - // Query validator's rewards - var rewards sdk.DecCoins - - res, body = Request(t, port, "GET", fmt.Sprintf("/distribution/validators/%s/rewards", valAddr), nil) - require.Equal(t, http.StatusOK, res.StatusCode, body) - require.NoError(t, cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &rewards)) - - // Query self-delegation - res, body = Request(t, port, "GET", fmt.Sprintf("/distribution/delegators/%s/rewards/%s", operAddr, valAddr), nil) - require.Equal(t, http.StatusOK, res.StatusCode, body) - require.NoError(t, cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &rewards)) - - // Query delegation - res, body = Request(t, port, "GET", fmt.Sprintf("/distribution/delegators/%s/rewards/%s", addr, valAddr), nil) - require.Equal(t, http.StatusOK, res.StatusCode, body) - require.NoError(t, cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &rewards)) - - // Query delegator's rewards total - var delRewards disttypes.QueryDelegatorTotalRewardsResponse - res, body = Request(t, port, "GET", fmt.Sprintf("/distribution/delegators/%s/rewards", operAddr), nil) - require.Equal(t, http.StatusOK, res.StatusCode, body) - require.NoError(t, json.Unmarshal(extractResultFromResponse(t, []byte(body)), &delRewards)) - - // Query delegator's withdrawal address - var withdrawAddr string - res, body = Request(t, port, "GET", fmt.Sprintf("/distribution/delegators/%s/withdraw_address", operAddr), nil) - require.Equal(t, http.StatusOK, res.StatusCode, body) - require.NoError(t, cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &withdrawAddr)) - require.Equal(t, operAddr.String(), withdrawAddr) - - // Withdraw delegator's rewards - resultTx = doWithdrawDelegatorAllRewards(t, port, name1, addr, fees) - require.Equal(t, uint32(0), resultTx.Code) -} - -func TestMintingQueries(t *testing.T) { - kb, err := newKeybase() - require.NoError(t, err) - addr, _, err := CreateAddr(name1, kb) - require.NoError(t, err) - cleanup, _, _, port, err := InitializeLCD(1, []sdk.AccAddress{addr}, true) - require.NoError(t, err) - defer cleanup() - - res, body := Request(t, port, "GET", "/minting/parameters", nil) - require.Equal(t, http.StatusOK, res.StatusCode, body) - - var params mint.Params - require.NoError(t, cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), ¶ms)) - - res, body = Request(t, port, "GET", "/minting/inflation", nil) - require.Equal(t, http.StatusOK, res.StatusCode, body) - - var inflation sdk.Dec - require.NoError(t, cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &inflation)) - - res, body = Request(t, port, "GET", "/minting/annual-provisions", nil) - require.Equal(t, http.StatusOK, res.StatusCode, body) - - var annualProvisions sdk.Dec - require.NoError(t, cdc.UnmarshalJSON(extractResultFromResponse(t, []byte(body)), &annualProvisions)) -} - -func TestAccountBalanceQuery(t *testing.T) { - kb, err := newKeybase() - require.NoError(t, err) - addr, _, err := CreateAddr(name1, kb) - require.NoError(t, err) - cleanup, _, _, port, err := InitializeLCD(1, []sdk.AccAddress{addr}, true) - require.NoError(t, err) - defer cleanup() - - bz, err := hex.DecodeString("8FA6AB57AD6870F6B5B2E57735F38F2F30E73CB6") - require.NoError(t, err) - someFakeAddr := sdk.AccAddress(bz) - - // empty account - res, body := Request(t, port, "GET", fmt.Sprintf("/auth/accounts/%s", someFakeAddr), nil) - require.Equal(t, http.StatusOK, res.StatusCode, body) - require.Contains(t, body, `"type":"cosmos-sdk/Account"`) - - // empty account balance - res, body = Request(t, port, "GET", fmt.Sprintf("/bank/balances/%s", someFakeAddr), nil) - require.Equal(t, http.StatusOK, res.StatusCode, body) - require.Contains(t, body, "[]") - -} diff --git a/band-consumer/lcd_test/testdata/setup.sh b/band-consumer/lcd_test/testdata/setup.sh deleted file mode 100755 index 05ee799976..0000000000 --- a/band-consumer/lcd_test/testdata/setup.sh +++ /dev/null @@ -1,27 +0,0 @@ -#!/usr/bin/env bash - -PASSWORD="1234567890" -ADDR="cosmos16xyempempp92x9hyzz9wrgf94r6j9h5f06pxxv" -RECEIVER="cosmos17gx5vwpm0y2k59tw0x00ccug234n56cgltx2w2" -VALIDATOR="cosmosvaloper16xyempempp92x9hyzz9wrgf94r6j9h5f2w4n2l" -AMOUNT="1000000stake" -CHAIN="lcd" -PROPOSALID="2" -HOME="/tmp/contract_tests/.gaiacli" -SWAGGER='/tmp/contract_tests/swagger.yaml' - -# sleeping a whole second between each step is a conservative precaution -# check lcd_test/testdata/state.tar.gz -> .gaiad/config/config.toml precommit_timeout = 500ms -sleep 1s -echo ${PASSWORD} | ./build/gaiacli tx gov submit-proposal --home ${HOME} --from ${ADDR} --chain-id ${CHAIN} --type text --title test --description test_description --deposit 10000stake --yes -sleep 1s -echo ${PASSWORD} | ./build/gaiacli tx gov deposit --home ${HOME} --from ${ADDR} --chain-id ${CHAIN} ${PROPOSALID} 1000000000stake --yes -sleep 1s -echo ${PASSWORD} | ./build/gaiacli tx gov vote --home ${HOME} --from ${ADDR} --yes --chain-id ${CHAIN} ${PROPOSALID} Yes -sleep 1s -HASH=$(echo ${PASSWORD} | ./build/gaiacli tx send --home ${HOME} ${ADDR} ${RECEIVER} ${AMOUNT} --yes --chain-id ${CHAIN} | awk '/txhash.*/{print $2}') -sed -i.bak -e "s/BCBE20E8D46758B96AE5883B792858296AC06E51435490FBDCAE25A72B3CC76B/${HASH}/g" "${SWAGGER}" -echo "Replaced dummy with actual transaction hash ${HASH}" -sleep 1s -echo ${PASSWORD} | ./build/gaiacli tx staking unbond --home ${HOME} --from ${ADDR} ${VALIDATOR} 100stake --yes --chain-id ${CHAIN} - diff --git a/band-consumer/lcd_test/testdata/state.tar.gz b/band-consumer/lcd_test/testdata/state.tar.gz deleted file mode 100644 index 30f0942309381cb7f978a195a01ed66fb1cba9e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20266 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 T|173?+X