mirror of
https://github.com/0glabs/0g-chain.git
synced 2024-12-26 08:15:19 +00:00
Merge pull request #248 from Kava-Labs/ro-update-sdk-version
update SDK to v0.36
This commit is contained in:
commit
402bfa3d1c
21
Makefile
21
Makefile
@ -1,10 +1,8 @@
|
|||||||
#!/usr/bin/make -f
|
#!/usr/bin/make -f
|
||||||
|
|
||||||
PACKAGES_SIMTEST=$(shell go list ./... | grep '/simulation')
|
VERSION := $(shell echo $(shell git describe --tags) | sed 's/^v//')
|
||||||
VERSION := 0.34.7
|
|
||||||
COMMIT := $(shell git log -1 --format='%H')
|
COMMIT := $(shell git log -1 --format='%H')
|
||||||
LEDGER_ENABLED ?= true
|
LEDGER_ENABLED ?= true
|
||||||
SDK_PACK := $(shell go list -m github.com/cosmos/cosmos-sdk | sed 's/ /\@/g')
|
|
||||||
|
|
||||||
export GO111MODULE = on
|
export GO111MODULE = on
|
||||||
|
|
||||||
@ -63,7 +61,7 @@ ldflags := $(strip $(ldflags))
|
|||||||
BUILD_FLAGS := -tags "$(build_tags)" -ldflags '$(ldflags)'
|
BUILD_FLAGS := -tags "$(build_tags)" -ldflags '$(ldflags)'
|
||||||
|
|
||||||
|
|
||||||
all: install lint check
|
all: install
|
||||||
|
|
||||||
build: go.sum
|
build: go.sum
|
||||||
ifeq ($(OS),Windows_NT)
|
ifeq ($(OS),Windows_NT)
|
||||||
@ -77,29 +75,18 @@ endif
|
|||||||
build-linux: go.sum
|
build-linux: go.sum
|
||||||
LEDGER_ENABLED=false GOOS=linux GOARCH=amd64 $(MAKE) build
|
LEDGER_ENABLED=false GOOS=linux GOARCH=amd64 $(MAKE) build
|
||||||
|
|
||||||
install: go.sum check-ledger
|
install: go.sum
|
||||||
go install -mod=readonly $(BUILD_FLAGS) ./cmd/kvd
|
go install -mod=readonly $(BUILD_FLAGS) ./cmd/kvd
|
||||||
go install -mod=readonly $(BUILD_FLAGS) ./cmd/kvcli
|
go install -mod=readonly $(BUILD_FLAGS) ./cmd/kvcli
|
||||||
|
|
||||||
########################################
|
########################################
|
||||||
### Tools & dependencies
|
### Tools & dependencies
|
||||||
|
|
||||||
go-mod-cache: go.sum
|
|
||||||
@echo "--> Download go modules to local cache"
|
|
||||||
@go mod download
|
|
||||||
|
|
||||||
go.sum: go.mod
|
go.sum: go.mod
|
||||||
@echo "--> Ensure dependencies have not been modified"
|
@echo "--> Ensure dependencies have not been modified"
|
||||||
@go mod verify
|
@go mod verify
|
||||||
|
|
||||||
draw-deps:
|
|
||||||
@# requires brew install graphviz or apt-get install graphviz
|
|
||||||
go get github.com/RobotsAndPencils/goviz
|
|
||||||
@goviz -i ./cmd/gaiad -d 2 | dot -Tpng -o dependency-graph.png
|
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -rf build/
|
rm -rf build/
|
||||||
|
|
||||||
.PHONY: all build-linux install \
|
.PHONY: all build-linux install clean build
|
||||||
go-mod-cache draw-deps clean build \
|
|
||||||
check-ledger
|
|
@ -47,15 +47,15 @@ kvcli keys add <your_wallet_name>
|
|||||||
#### Create a Genesis Transaction
|
#### Create a Genesis Transaction
|
||||||
|
|
||||||
```
|
```
|
||||||
kvd add-genesis-account $(kvcli keys show <your_wallet_name> -a) 1000000000000ukva
|
kvd add-genesis-account $(kvcli keys show <your_wallet_name> -a) 1000000000000ukava
|
||||||
kvd gentx --name <your_wallet_name> --amount 1000000000000ukva --ip <your-public-ip>
|
kvd gentx --name <your_wallet_name> --amount 1000000000000ukava --ip <your-public-ip>
|
||||||
```
|
```
|
||||||
|
|
||||||
A genesis transaction should be written to `$HOME/.kvd/config/gentx/gentx-<gen_tx_hash>.json`
|
A genesis transaction should be written to `$HOME/.kvd/config/gentx/gentx-<gen_tx_hash>.json`
|
||||||
|
|
||||||
#### Submit Genesis Transaction
|
#### Submit Genesis Transaction
|
||||||
|
|
||||||
To be included in the genesis file for testnet one, fork this repo and copy your genesis transaction to the `testnet-1.1/gentx` directory. Submit your fork including your genesis transaction as a PR on this repo [here](https://github.com/Kava-Labs/kava/pulls)
|
To be included in the genesis file for testnet two, fork the [testnets repo](https://github.com/Kava-Labs/kava-testnets) and copy your genesis transaction to the `2000` directory. Submit your fork including your genesis transaction as a PR.
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
|
468
app/app.go
468
app/app.go
@ -1,10 +1,8 @@
|
|||||||
package app
|
package app
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
"io"
|
"io"
|
||||||
"os"
|
"os"
|
||||||
"sort"
|
|
||||||
|
|
||||||
abci "github.com/tendermint/tendermint/abci/types"
|
abci "github.com/tendermint/tendermint/abci/types"
|
||||||
cmn "github.com/tendermint/tendermint/libs/common"
|
cmn "github.com/tendermint/tendermint/libs/common"
|
||||||
@ -14,30 +12,65 @@ import (
|
|||||||
bam "github.com/cosmos/cosmos-sdk/baseapp"
|
bam "github.com/cosmos/cosmos-sdk/baseapp"
|
||||||
"github.com/cosmos/cosmos-sdk/codec"
|
"github.com/cosmos/cosmos-sdk/codec"
|
||||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||||
|
"github.com/cosmos/cosmos-sdk/types/module"
|
||||||
|
"github.com/cosmos/cosmos-sdk/version"
|
||||||
"github.com/cosmos/cosmos-sdk/x/auth"
|
"github.com/cosmos/cosmos-sdk/x/auth"
|
||||||
"github.com/cosmos/cosmos-sdk/x/bank"
|
"github.com/cosmos/cosmos-sdk/x/bank"
|
||||||
"github.com/cosmos/cosmos-sdk/x/crisis"
|
"github.com/cosmos/cosmos-sdk/x/crisis"
|
||||||
distr "github.com/cosmos/cosmos-sdk/x/distribution"
|
distr "github.com/cosmos/cosmos-sdk/x/distribution"
|
||||||
|
distrclient "github.com/cosmos/cosmos-sdk/x/distribution/client"
|
||||||
|
"github.com/cosmos/cosmos-sdk/x/genaccounts"
|
||||||
|
"github.com/cosmos/cosmos-sdk/x/genutil"
|
||||||
"github.com/cosmos/cosmos-sdk/x/gov"
|
"github.com/cosmos/cosmos-sdk/x/gov"
|
||||||
"github.com/cosmos/cosmos-sdk/x/mint"
|
"github.com/cosmos/cosmos-sdk/x/mint"
|
||||||
"github.com/cosmos/cosmos-sdk/x/params"
|
"github.com/cosmos/cosmos-sdk/x/params"
|
||||||
|
paramsclient "github.com/cosmos/cosmos-sdk/x/params/client"
|
||||||
"github.com/cosmos/cosmos-sdk/x/slashing"
|
"github.com/cosmos/cosmos-sdk/x/slashing"
|
||||||
"github.com/cosmos/cosmos-sdk/x/staking"
|
"github.com/cosmos/cosmos-sdk/x/staking"
|
||||||
|
"github.com/cosmos/cosmos-sdk/x/supply"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
appName = "kava"
|
appName = "kava"
|
||||||
// DefaultKeyPass contains the default key password for genesis transactions
|
|
||||||
DefaultKeyPass = "12345678"
|
|
||||||
Bech32MainPrefix = "kava"
|
Bech32MainPrefix = "kava"
|
||||||
)
|
)
|
||||||
|
|
||||||
// default home directories for expected binaries
|
|
||||||
var (
|
var (
|
||||||
|
// default home directories for expected binaries
|
||||||
DefaultCLIHome = os.ExpandEnv("$HOME/.kvcli")
|
DefaultCLIHome = os.ExpandEnv("$HOME/.kvcli")
|
||||||
DefaultNodeHome = os.ExpandEnv("$HOME/.kvd")
|
DefaultNodeHome = os.ExpandEnv("$HOME/.kvd")
|
||||||
|
|
||||||
|
// ModuleBasics manages simple versions of full app modules. It's used for things such as codec registration and genesis file verification.
|
||||||
|
ModuleBasics module.BasicManager
|
||||||
|
|
||||||
|
// module account permissions
|
||||||
|
mAccPerms = map[string][]string{
|
||||||
|
auth.FeeCollectorName: nil,
|
||||||
|
distr.ModuleName: nil,
|
||||||
|
mint.ModuleName: {supply.Minter},
|
||||||
|
staking.BondedPoolName: {supply.Burner, supply.Staking},
|
||||||
|
staking.NotBondedPoolName: {supply.Burner, supply.Staking},
|
||||||
|
gov.ModuleName: {supply.Burner},
|
||||||
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
ModuleBasics = module.NewBasicManager(
|
||||||
|
genaccounts.AppModuleBasic{},
|
||||||
|
genutil.AppModuleBasic{},
|
||||||
|
auth.AppModuleBasic{},
|
||||||
|
bank.AppModuleBasic{},
|
||||||
|
staking.AppModuleBasic{},
|
||||||
|
mint.AppModuleBasic{},
|
||||||
|
distr.AppModuleBasic{},
|
||||||
|
gov.NewAppModuleBasic(paramsclient.ProposalHandler, distrclient.ProposalHandler),
|
||||||
|
params.AppModuleBasic{},
|
||||||
|
crisis.AppModuleBasic{},
|
||||||
|
slashing.AppModuleBasic{},
|
||||||
|
supply.AppModuleBasic{},
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
// Extended ABCI application
|
// Extended ABCI application
|
||||||
type App struct {
|
type App struct {
|
||||||
*bam.BaseApp
|
*bam.BaseApp
|
||||||
@ -46,30 +79,33 @@ type App struct {
|
|||||||
invCheckPeriod uint
|
invCheckPeriod uint
|
||||||
|
|
||||||
// keys to access the substores
|
// keys to access the substores
|
||||||
keyMain *sdk.KVStoreKey
|
keyMain *sdk.KVStoreKey
|
||||||
keyAccount *sdk.KVStoreKey
|
keyAccount *sdk.KVStoreKey
|
||||||
keyStaking *sdk.KVStoreKey
|
keySupply *sdk.KVStoreKey
|
||||||
tkeyStaking *sdk.TransientStoreKey
|
keyStaking *sdk.KVStoreKey
|
||||||
keySlashing *sdk.KVStoreKey
|
tkeyStaking *sdk.TransientStoreKey
|
||||||
keyMint *sdk.KVStoreKey
|
keySlashing *sdk.KVStoreKey
|
||||||
keyDistr *sdk.KVStoreKey
|
keyMint *sdk.KVStoreKey
|
||||||
tkeyDistr *sdk.TransientStoreKey
|
keyDistr *sdk.KVStoreKey
|
||||||
keyGov *sdk.KVStoreKey
|
tkeyDistr *sdk.TransientStoreKey
|
||||||
keyFeeCollection *sdk.KVStoreKey
|
keyGov *sdk.KVStoreKey
|
||||||
keyParams *sdk.KVStoreKey
|
keyParams *sdk.KVStoreKey
|
||||||
tkeyParams *sdk.TransientStoreKey
|
tkeyParams *sdk.TransientStoreKey
|
||||||
|
|
||||||
// Manage getting and setting accounts
|
// keepers from all the modules
|
||||||
accountKeeper auth.AccountKeeper
|
accountKeeper auth.AccountKeeper
|
||||||
feeCollectionKeeper auth.FeeCollectionKeeper
|
bankKeeper bank.Keeper
|
||||||
bankKeeper bank.Keeper
|
supplyKeeper supply.Keeper
|
||||||
stakingKeeper staking.Keeper
|
stakingKeeper staking.Keeper
|
||||||
slashingKeeper slashing.Keeper
|
slashingKeeper slashing.Keeper
|
||||||
mintKeeper mint.Keeper
|
mintKeeper mint.Keeper
|
||||||
distrKeeper distr.Keeper
|
distrKeeper distr.Keeper
|
||||||
govKeeper gov.Keeper
|
govKeeper gov.Keeper
|
||||||
crisisKeeper crisis.Keeper
|
crisisKeeper crisis.Keeper
|
||||||
paramsKeeper params.Keeper
|
paramsKeeper params.Keeper
|
||||||
|
|
||||||
|
// the module manager
|
||||||
|
mm *module.Manager
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewApp returns a reference to an initialized App.
|
// NewApp returns a reference to an initialized App.
|
||||||
@ -81,120 +117,148 @@ func NewApp(logger log.Logger, db dbm.DB, traceStore io.Writer, loadLatest bool,
|
|||||||
|
|
||||||
bApp := bam.NewBaseApp(appName, logger, db, auth.DefaultTxDecoder(cdc), baseAppOptions...)
|
bApp := bam.NewBaseApp(appName, logger, db, auth.DefaultTxDecoder(cdc), baseAppOptions...)
|
||||||
bApp.SetCommitMultiStoreTracer(traceStore)
|
bApp.SetCommitMultiStoreTracer(traceStore)
|
||||||
|
bApp.SetAppVersion(version.Version)
|
||||||
|
|
||||||
var app = &App{
|
var app = &App{
|
||||||
BaseApp: bApp,
|
BaseApp: bApp,
|
||||||
cdc: cdc,
|
cdc: cdc,
|
||||||
invCheckPeriod: invCheckPeriod,
|
invCheckPeriod: invCheckPeriod,
|
||||||
keyMain: sdk.NewKVStoreKey(bam.MainStoreKey),
|
keyMain: sdk.NewKVStoreKey(bam.MainStoreKey),
|
||||||
keyAccount: sdk.NewKVStoreKey(auth.StoreKey),
|
keyAccount: sdk.NewKVStoreKey(auth.StoreKey),
|
||||||
keyStaking: sdk.NewKVStoreKey(staking.StoreKey),
|
keySupply: sdk.NewKVStoreKey(supply.StoreKey),
|
||||||
tkeyStaking: sdk.NewTransientStoreKey(staking.TStoreKey),
|
keyStaking: sdk.NewKVStoreKey(staking.StoreKey),
|
||||||
keyMint: sdk.NewKVStoreKey(mint.StoreKey),
|
tkeyStaking: sdk.NewTransientStoreKey(staking.TStoreKey),
|
||||||
keyDistr: sdk.NewKVStoreKey(distr.StoreKey),
|
keyMint: sdk.NewKVStoreKey(mint.StoreKey),
|
||||||
tkeyDistr: sdk.NewTransientStoreKey(distr.TStoreKey),
|
keyDistr: sdk.NewKVStoreKey(distr.StoreKey),
|
||||||
keySlashing: sdk.NewKVStoreKey(slashing.StoreKey),
|
tkeyDistr: sdk.NewTransientStoreKey(distr.TStoreKey),
|
||||||
keyGov: sdk.NewKVStoreKey(gov.StoreKey),
|
keySlashing: sdk.NewKVStoreKey(slashing.StoreKey),
|
||||||
keyFeeCollection: sdk.NewKVStoreKey(auth.FeeStoreKey),
|
keyGov: sdk.NewKVStoreKey(gov.StoreKey),
|
||||||
keyParams: sdk.NewKVStoreKey(params.StoreKey),
|
keyParams: sdk.NewKVStoreKey(params.StoreKey),
|
||||||
tkeyParams: sdk.NewTransientStoreKey(params.TStoreKey),
|
tkeyParams: sdk.NewTransientStoreKey(params.TStoreKey),
|
||||||
}
|
}
|
||||||
|
|
||||||
app.paramsKeeper = params.NewKeeper(app.cdc, app.keyParams, app.tkeyParams)
|
// init params keeper and subspaces
|
||||||
|
app.paramsKeeper = params.NewKeeper(app.cdc, app.keyParams, app.tkeyParams, params.DefaultCodespace)
|
||||||
|
authSubspace := app.paramsKeeper.Subspace(auth.DefaultParamspace)
|
||||||
|
bankSubspace := app.paramsKeeper.Subspace(bank.DefaultParamspace)
|
||||||
|
stakingSubspace := app.paramsKeeper.Subspace(staking.DefaultParamspace)
|
||||||
|
mintSubspace := app.paramsKeeper.Subspace(mint.DefaultParamspace)
|
||||||
|
distrSubspace := app.paramsKeeper.Subspace(distr.DefaultParamspace)
|
||||||
|
slashingSubspace := app.paramsKeeper.Subspace(slashing.DefaultParamspace)
|
||||||
|
govSubspace := app.paramsKeeper.Subspace(gov.DefaultParamspace)
|
||||||
|
crisisSubspace := app.paramsKeeper.Subspace(crisis.DefaultParamspace)
|
||||||
|
|
||||||
// define the accountKeeper
|
// add keepers
|
||||||
app.accountKeeper = auth.NewAccountKeeper(
|
app.accountKeeper = auth.NewAccountKeeper(
|
||||||
app.cdc,
|
app.cdc,
|
||||||
app.keyAccount,
|
app.keyAccount,
|
||||||
app.paramsKeeper.Subspace(auth.DefaultParamspace),
|
authSubspace,
|
||||||
auth.ProtoBaseAccount,
|
auth.ProtoBaseAccount)
|
||||||
)
|
|
||||||
|
|
||||||
// add handlers
|
|
||||||
app.bankKeeper = bank.NewBaseKeeper(
|
app.bankKeeper = bank.NewBaseKeeper(
|
||||||
app.accountKeeper,
|
app.accountKeeper,
|
||||||
app.paramsKeeper.Subspace(bank.DefaultParamspace),
|
bankSubspace,
|
||||||
bank.DefaultCodespace,
|
bank.DefaultCodespace)
|
||||||
)
|
app.supplyKeeper = supply.NewKeeper(
|
||||||
app.feeCollectionKeeper = auth.NewFeeCollectionKeeper(
|
|
||||||
app.cdc,
|
app.cdc,
|
||||||
app.keyFeeCollection,
|
app.keySupply,
|
||||||
)
|
app.accountKeeper,
|
||||||
|
app.bankKeeper,
|
||||||
|
supply.DefaultCodespace,
|
||||||
|
mAccPerms)
|
||||||
stakingKeeper := staking.NewKeeper(
|
stakingKeeper := staking.NewKeeper(
|
||||||
app.cdc,
|
app.cdc,
|
||||||
app.keyStaking, app.tkeyStaking,
|
app.keyStaking,
|
||||||
app.bankKeeper, app.paramsKeeper.Subspace(staking.DefaultParamspace),
|
app.tkeyStaking,
|
||||||
staking.DefaultCodespace,
|
app.supplyKeeper,
|
||||||
)
|
stakingSubspace,
|
||||||
app.mintKeeper = mint.NewKeeper(app.cdc, app.keyMint,
|
staking.DefaultCodespace)
|
||||||
app.paramsKeeper.Subspace(mint.DefaultParamspace),
|
app.mintKeeper = mint.NewKeeper(
|
||||||
&stakingKeeper, app.feeCollectionKeeper,
|
app.cdc,
|
||||||
)
|
app.keyMint,
|
||||||
|
mintSubspace,
|
||||||
|
&stakingKeeper,
|
||||||
|
app.supplyKeeper,
|
||||||
|
auth.FeeCollectorName)
|
||||||
app.distrKeeper = distr.NewKeeper(
|
app.distrKeeper = distr.NewKeeper(
|
||||||
app.cdc,
|
app.cdc,
|
||||||
app.keyDistr,
|
app.keyDistr,
|
||||||
app.paramsKeeper.Subspace(distr.DefaultParamspace),
|
distrSubspace,
|
||||||
app.bankKeeper, &stakingKeeper, app.feeCollectionKeeper,
|
&stakingKeeper,
|
||||||
|
app.supplyKeeper,
|
||||||
distr.DefaultCodespace,
|
distr.DefaultCodespace,
|
||||||
)
|
auth.FeeCollectorName)
|
||||||
app.slashingKeeper = slashing.NewKeeper(
|
app.slashingKeeper = slashing.NewKeeper(
|
||||||
app.cdc,
|
app.cdc,
|
||||||
app.keySlashing,
|
app.keySlashing,
|
||||||
&stakingKeeper, app.paramsKeeper.Subspace(slashing.DefaultParamspace),
|
&stakingKeeper,
|
||||||
slashing.DefaultCodespace,
|
slashingSubspace,
|
||||||
)
|
slashing.DefaultCodespace)
|
||||||
|
app.crisisKeeper = crisis.NewKeeper(
|
||||||
|
crisisSubspace,
|
||||||
|
invCheckPeriod,
|
||||||
|
app.supplyKeeper,
|
||||||
|
auth.FeeCollectorName)
|
||||||
|
govRouter := gov.NewRouter()
|
||||||
|
govRouter.
|
||||||
|
AddRoute(gov.RouterKey, gov.ProposalHandler).
|
||||||
|
AddRoute(params.RouterKey, params.NewParamChangeProposalHandler(app.paramsKeeper)).
|
||||||
|
AddRoute(distr.RouterKey, distr.NewCommunityPoolSpendProposalHandler(app.distrKeeper))
|
||||||
app.govKeeper = gov.NewKeeper(
|
app.govKeeper = gov.NewKeeper(
|
||||||
app.cdc,
|
app.cdc,
|
||||||
app.keyGov,
|
app.keyGov,
|
||||||
app.paramsKeeper, app.paramsKeeper.Subspace(gov.DefaultParamspace), app.bankKeeper, &stakingKeeper,
|
app.paramsKeeper,
|
||||||
|
govSubspace,
|
||||||
|
app.supplyKeeper,
|
||||||
|
&stakingKeeper,
|
||||||
gov.DefaultCodespace,
|
gov.DefaultCodespace,
|
||||||
)
|
govRouter)
|
||||||
app.crisisKeeper = crisis.NewKeeper(
|
|
||||||
app.paramsKeeper.Subspace(crisis.DefaultParamspace),
|
|
||||||
app.distrKeeper,
|
|
||||||
app.bankKeeper,
|
|
||||||
app.feeCollectionKeeper,
|
|
||||||
)
|
|
||||||
|
|
||||||
// register the staking hooks
|
// register the staking hooks
|
||||||
// NOTE: The stakingKeeper above is passed by reference, so that it can be
|
// NOTE: stakingKeeper above is passed by reference, so that it will contain these hooks
|
||||||
// modified like below:
|
|
||||||
app.stakingKeeper = *stakingKeeper.SetHooks(
|
app.stakingKeeper = *stakingKeeper.SetHooks(
|
||||||
NewStakingHooks(app.distrKeeper.Hooks(), app.slashingKeeper.Hooks()),
|
staking.NewMultiStakingHooks(app.distrKeeper.Hooks(), app.slashingKeeper.Hooks()))
|
||||||
|
|
||||||
|
// create the module manager
|
||||||
|
app.mm = module.NewManager(
|
||||||
|
genaccounts.NewAppModule(app.accountKeeper),
|
||||||
|
genutil.NewAppModule(app.accountKeeper, app.stakingKeeper, app.BaseApp.DeliverTx),
|
||||||
|
auth.NewAppModule(app.accountKeeper),
|
||||||
|
bank.NewAppModule(app.bankKeeper, app.accountKeeper),
|
||||||
|
crisis.NewAppModule(app.crisisKeeper),
|
||||||
|
supply.NewAppModule(app.supplyKeeper, app.accountKeeper),
|
||||||
|
distr.NewAppModule(app.distrKeeper, app.supplyKeeper),
|
||||||
|
gov.NewAppModule(app.govKeeper, app.supplyKeeper),
|
||||||
|
mint.NewAppModule(app.mintKeeper),
|
||||||
|
slashing.NewAppModule(app.slashingKeeper, app.stakingKeeper),
|
||||||
|
staking.NewAppModule(app.stakingKeeper, app.distrKeeper, app.accountKeeper, app.supplyKeeper),
|
||||||
)
|
)
|
||||||
|
|
||||||
// register the crisis routes
|
// During begin block slashing happens after distr.BeginBlocker so that
|
||||||
bank.RegisterInvariants(&app.crisisKeeper, app.accountKeeper)
|
// there is nothing left over in the validator fee pool, so as to keep the
|
||||||
distr.RegisterInvariants(&app.crisisKeeper, app.distrKeeper, app.stakingKeeper)
|
// CanWithdrawInvariant invariant.
|
||||||
staking.RegisterInvariants(&app.crisisKeeper, app.stakingKeeper, app.feeCollectionKeeper, app.distrKeeper, app.accountKeeper)
|
app.mm.SetOrderBeginBlockers(mint.ModuleName, distr.ModuleName, slashing.ModuleName)
|
||||||
|
|
||||||
// register message routes
|
app.mm.SetOrderEndBlockers(gov.ModuleName, staking.ModuleName)
|
||||||
app.Router().
|
|
||||||
AddRoute(bank.RouterKey, bank.NewHandler(app.bankKeeper)).
|
|
||||||
AddRoute(staking.RouterKey, staking.NewHandler(app.stakingKeeper)).
|
|
||||||
AddRoute(distr.RouterKey, distr.NewHandler(app.distrKeeper)).
|
|
||||||
AddRoute(slashing.RouterKey, slashing.NewHandler(app.slashingKeeper)).
|
|
||||||
AddRoute(gov.RouterKey, gov.NewHandler(app.govKeeper)).
|
|
||||||
AddRoute(crisis.RouterKey, crisis.NewHandler(app.crisisKeeper))
|
|
||||||
|
|
||||||
app.QueryRouter().
|
// genutils must occur after staking so that pools are properly
|
||||||
AddRoute(auth.QuerierRoute, auth.NewQuerier(app.accountKeeper)).
|
// initialized with tokens from genesis accounts.
|
||||||
AddRoute(distr.QuerierRoute, distr.NewQuerier(app.distrKeeper)).
|
app.mm.SetOrderInitGenesis(genaccounts.ModuleName, distr.ModuleName,
|
||||||
AddRoute(gov.QuerierRoute, gov.NewQuerier(app.govKeeper)).
|
staking.ModuleName, auth.ModuleName, bank.ModuleName, slashing.ModuleName,
|
||||||
AddRoute(slashing.QuerierRoute, slashing.NewQuerier(app.slashingKeeper, app.cdc)).
|
gov.ModuleName, mint.ModuleName, supply.ModuleName, crisis.ModuleName, genutil.ModuleName)
|
||||||
AddRoute(staking.QuerierRoute, staking.NewQuerier(app.stakingKeeper, app.cdc)).
|
|
||||||
AddRoute(mint.QuerierRoute, mint.NewQuerier(app.mintKeeper))
|
|
||||||
|
|
||||||
// initialize BaseApp
|
app.mm.RegisterInvariants(&app.crisisKeeper)
|
||||||
app.MountStores(app.keyMain, app.keyAccount, app.keyStaking, app.keyMint, app.keyDistr,
|
app.mm.RegisterRoutes(app.Router(), app.QueryRouter())
|
||||||
app.keySlashing, app.keyGov, app.keyFeeCollection, app.keyParams,
|
|
||||||
app.tkeyParams, app.tkeyStaking, app.tkeyDistr,
|
// initialize the app
|
||||||
)
|
app.MountStores(app.keyMain, app.keyAccount, app.keySupply, app.keyStaking,
|
||||||
app.SetInitChainer(app.initChainer)
|
app.keyMint, app.keyDistr, app.keySlashing, app.keyGov, app.keyParams,
|
||||||
|
app.tkeyParams, app.tkeyStaking, app.tkeyDistr)
|
||||||
|
app.SetInitChainer(app.InitChainer)
|
||||||
app.SetBeginBlocker(app.BeginBlocker)
|
app.SetBeginBlocker(app.BeginBlocker)
|
||||||
app.SetAnteHandler(auth.NewAnteHandler(app.accountKeeper, app.feeCollectionKeeper))
|
app.SetAnteHandler(auth.NewAnteHandler(app.accountKeeper, app.supplyKeeper, auth.DefaultSigVerificationGasConsumer))
|
||||||
app.SetEndBlocker(app.EndBlocker)
|
app.SetEndBlocker(app.EndBlocker)
|
||||||
|
|
||||||
|
// load store
|
||||||
if loadLatest {
|
if loadLatest {
|
||||||
err := app.LoadLatestVersion(app.keyMain)
|
err := app.LoadLatestVersion(app.keyMain)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -208,13 +272,7 @@ func NewApp(logger log.Logger, db dbm.DB, traceStore io.Writer, loadLatest bool,
|
|||||||
// custom tx codec
|
// custom tx codec
|
||||||
func MakeCodec() *codec.Codec {
|
func MakeCodec() *codec.Codec {
|
||||||
var cdc = codec.New()
|
var cdc = codec.New()
|
||||||
bank.RegisterCodec(cdc)
|
ModuleBasics.RegisterCodec(cdc)
|
||||||
staking.RegisterCodec(cdc)
|
|
||||||
distr.RegisterCodec(cdc)
|
|
||||||
slashing.RegisterCodec(cdc)
|
|
||||||
gov.RegisterCodec(cdc)
|
|
||||||
auth.RegisterCodec(cdc)
|
|
||||||
crisis.RegisterCodec(cdc)
|
|
||||||
sdk.RegisterCodec(cdc)
|
sdk.RegisterCodec(cdc)
|
||||||
codec.RegisterCrypto(cdc)
|
codec.RegisterCrypto(cdc)
|
||||||
return cdc
|
return cdc
|
||||||
@ -228,128 +286,19 @@ func SetBech32AddressPrefixes(config *sdk.Config) {
|
|||||||
|
|
||||||
// application updates every end block
|
// application updates every end block
|
||||||
func (app *App) BeginBlocker(ctx sdk.Context, req abci.RequestBeginBlock) abci.ResponseBeginBlock {
|
func (app *App) BeginBlocker(ctx sdk.Context, req abci.RequestBeginBlock) abci.ResponseBeginBlock {
|
||||||
// mint new tokens for the previous block
|
return app.mm.BeginBlock(ctx, req)
|
||||||
mint.BeginBlocker(ctx, app.mintKeeper)
|
|
||||||
|
|
||||||
// distribute rewards for the previous block
|
|
||||||
distr.BeginBlocker(ctx, req, app.distrKeeper)
|
|
||||||
|
|
||||||
// slash anyone who double signed.
|
|
||||||
// NOTE: This should happen after distr.BeginBlocker so that
|
|
||||||
// there is nothing left over in the validator fee pool,
|
|
||||||
// so as to keep the CanWithdrawInvariant invariant.
|
|
||||||
// TODO: This should really happen at EndBlocker.
|
|
||||||
tags := slashing.BeginBlocker(ctx, req, app.slashingKeeper)
|
|
||||||
|
|
||||||
return abci.ResponseBeginBlock{
|
|
||||||
Tags: tags.ToKVPairs(),
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// application updates every end block
|
// application updates every end block
|
||||||
// nolint: unparam
|
|
||||||
func (app *App) EndBlocker(ctx sdk.Context, req abci.RequestEndBlock) abci.ResponseEndBlock {
|
func (app *App) EndBlocker(ctx sdk.Context, req abci.RequestEndBlock) abci.ResponseEndBlock {
|
||||||
tags := gov.EndBlocker(ctx, app.govKeeper)
|
return app.mm.EndBlock(ctx, req)
|
||||||
validatorUpdates, endBlockerTags := staking.EndBlocker(ctx, app.stakingKeeper)
|
|
||||||
tags = append(tags, endBlockerTags...)
|
|
||||||
|
|
||||||
if app.invCheckPeriod != 0 && ctx.BlockHeight()%int64(app.invCheckPeriod) == 0 {
|
|
||||||
app.assertRuntimeInvariants()
|
|
||||||
}
|
|
||||||
|
|
||||||
return abci.ResponseEndBlock{
|
|
||||||
ValidatorUpdates: validatorUpdates,
|
|
||||||
Tags: tags,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// initialize store from a genesis state
|
|
||||||
func (app *App) initFromGenesisState(ctx sdk.Context, genesisState GenesisState) []abci.ValidatorUpdate {
|
|
||||||
genesisState.Sanitize()
|
|
||||||
|
|
||||||
// load the accounts
|
|
||||||
for _, gacc := range genesisState.Accounts {
|
|
||||||
acc := gacc.ToAccount()
|
|
||||||
acc = app.accountKeeper.NewAccount(ctx, acc) // set account number
|
|
||||||
app.accountKeeper.SetAccount(ctx, acc)
|
|
||||||
}
|
|
||||||
|
|
||||||
// initialize distribution (must happen before staking)
|
|
||||||
distr.InitGenesis(ctx, app.distrKeeper, genesisState.DistrData)
|
|
||||||
|
|
||||||
// load the initial staking information
|
|
||||||
validators, err := staking.InitGenesis(ctx, app.stakingKeeper, genesisState.StakingData)
|
|
||||||
if err != nil {
|
|
||||||
panic(err) // TODO find a way to do this w/o panics
|
|
||||||
}
|
|
||||||
|
|
||||||
// initialize module-specific stores
|
|
||||||
auth.InitGenesis(ctx, app.accountKeeper, app.feeCollectionKeeper, genesisState.AuthData)
|
|
||||||
bank.InitGenesis(ctx, app.bankKeeper, genesisState.BankData)
|
|
||||||
slashing.InitGenesis(ctx, app.slashingKeeper, genesisState.SlashingData, genesisState.StakingData.Validators.ToSDKValidators())
|
|
||||||
gov.InitGenesis(ctx, app.govKeeper, genesisState.GovData)
|
|
||||||
crisis.InitGenesis(ctx, app.crisisKeeper, genesisState.CrisisData)
|
|
||||||
mint.InitGenesis(ctx, app.mintKeeper, genesisState.MintData)
|
|
||||||
|
|
||||||
// validate genesis state
|
|
||||||
if err := ValidateGenesisState(genesisState); err != nil {
|
|
||||||
panic(err) // TODO find a way to do this w/o panics
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(genesisState.GenTxs) > 0 {
|
|
||||||
for _, genTx := range genesisState.GenTxs {
|
|
||||||
var tx auth.StdTx
|
|
||||||
err = app.cdc.UnmarshalJSON(genTx, &tx)
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
bz := app.cdc.MustMarshalBinaryLengthPrefixed(tx)
|
|
||||||
res := app.BaseApp.DeliverTx(bz)
|
|
||||||
if !res.IsOK() {
|
|
||||||
panic(res.Log)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
validators = app.stakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx)
|
|
||||||
}
|
|
||||||
return validators
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// custom logic for app initialization
|
// custom logic for app initialization
|
||||||
func (app *App) initChainer(ctx sdk.Context, req abci.RequestInitChain) abci.ResponseInitChain {
|
func (app *App) InitChainer(ctx sdk.Context, req abci.RequestInitChain) abci.ResponseInitChain {
|
||||||
stateJSON := req.AppStateBytes
|
|
||||||
// TODO is this now the whole genesis file?
|
|
||||||
|
|
||||||
var genesisState GenesisState
|
var genesisState GenesisState
|
||||||
err := app.cdc.UnmarshalJSON(stateJSON, &genesisState)
|
app.cdc.MustUnmarshalJSON(req.AppStateBytes, &genesisState)
|
||||||
if err != nil {
|
return app.mm.InitGenesis(ctx, genesisState)
|
||||||
panic(err) // TODO https://github.com/cosmos/cosmos-sdk/issues/468
|
|
||||||
// return sdk.ErrGenesisParse("").TraceCause(err, "")
|
|
||||||
}
|
|
||||||
|
|
||||||
validators := app.initFromGenesisState(ctx, genesisState)
|
|
||||||
|
|
||||||
// sanity check
|
|
||||||
if len(req.Validators) > 0 {
|
|
||||||
if len(req.Validators) != len(validators) {
|
|
||||||
panic(fmt.Errorf("len(RequestInitChain.Validators) != len(validators) (%d != %d)",
|
|
||||||
len(req.Validators), len(validators)))
|
|
||||||
}
|
|
||||||
sort.Sort(abci.ValidatorUpdates(req.Validators))
|
|
||||||
sort.Sort(abci.ValidatorUpdates(validators))
|
|
||||||
for i, val := range validators {
|
|
||||||
if !val.Equal(req.Validators[i]) {
|
|
||||||
panic(fmt.Errorf("validators[%d] != req.Validators[%d] ", i, i))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// assert runtime invariants
|
|
||||||
app.assertRuntimeInvariants()
|
|
||||||
|
|
||||||
return abci.ResponseInitChain{
|
|
||||||
Validators: validators,
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// load a particular height
|
// load a particular height
|
||||||
@ -357,59 +306,12 @@ func (app *App) LoadHeight(height int64) error {
|
|||||||
return app.LoadVersion(height, app.keyMain)
|
return app.LoadVersion(height, app.keyMain)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ______________________________________________________________________________________________
|
// ModuleAccountAddrs returns all the app's module account addresses.
|
||||||
|
func (app *App) ModuleAccountAddrs() map[string]bool {
|
||||||
|
modAccAddrs := make(map[string]bool)
|
||||||
|
for acc := range mAccPerms {
|
||||||
|
modAccAddrs[app.supplyKeeper.GetModuleAddress(acc).String()] = true
|
||||||
|
}
|
||||||
|
|
||||||
var _ sdk.StakingHooks = StakingHooks{}
|
return modAccAddrs
|
||||||
|
|
||||||
// StakingHooks contains combined distribution and slashing hooks needed for the
|
|
||||||
// staking module.
|
|
||||||
type StakingHooks struct {
|
|
||||||
dh distr.Hooks
|
|
||||||
sh slashing.Hooks
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewStakingHooks(dh distr.Hooks, sh slashing.Hooks) StakingHooks {
|
|
||||||
return StakingHooks{dh, sh}
|
|
||||||
}
|
|
||||||
|
|
||||||
// nolint
|
|
||||||
func (h StakingHooks) AfterValidatorCreated(ctx sdk.Context, valAddr sdk.ValAddress) {
|
|
||||||
h.dh.AfterValidatorCreated(ctx, valAddr)
|
|
||||||
h.sh.AfterValidatorCreated(ctx, valAddr)
|
|
||||||
}
|
|
||||||
func (h StakingHooks) BeforeValidatorModified(ctx sdk.Context, valAddr sdk.ValAddress) {
|
|
||||||
h.dh.BeforeValidatorModified(ctx, valAddr)
|
|
||||||
h.sh.BeforeValidatorModified(ctx, valAddr)
|
|
||||||
}
|
|
||||||
func (h StakingHooks) AfterValidatorRemoved(ctx sdk.Context, consAddr sdk.ConsAddress, valAddr sdk.ValAddress) {
|
|
||||||
h.dh.AfterValidatorRemoved(ctx, consAddr, valAddr)
|
|
||||||
h.sh.AfterValidatorRemoved(ctx, consAddr, valAddr)
|
|
||||||
}
|
|
||||||
func (h StakingHooks) AfterValidatorBonded(ctx sdk.Context, consAddr sdk.ConsAddress, valAddr sdk.ValAddress) {
|
|
||||||
h.dh.AfterValidatorBonded(ctx, consAddr, valAddr)
|
|
||||||
h.sh.AfterValidatorBonded(ctx, consAddr, valAddr)
|
|
||||||
}
|
|
||||||
func (h StakingHooks) AfterValidatorBeginUnbonding(ctx sdk.Context, consAddr sdk.ConsAddress, valAddr sdk.ValAddress) {
|
|
||||||
h.dh.AfterValidatorBeginUnbonding(ctx, consAddr, valAddr)
|
|
||||||
h.sh.AfterValidatorBeginUnbonding(ctx, consAddr, valAddr)
|
|
||||||
}
|
|
||||||
func (h StakingHooks) BeforeDelegationCreated(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) {
|
|
||||||
h.dh.BeforeDelegationCreated(ctx, delAddr, valAddr)
|
|
||||||
h.sh.BeforeDelegationCreated(ctx, delAddr, valAddr)
|
|
||||||
}
|
|
||||||
func (h StakingHooks) BeforeDelegationSharesModified(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) {
|
|
||||||
h.dh.BeforeDelegationSharesModified(ctx, delAddr, valAddr)
|
|
||||||
h.sh.BeforeDelegationSharesModified(ctx, delAddr, valAddr)
|
|
||||||
}
|
|
||||||
func (h StakingHooks) BeforeDelegationRemoved(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) {
|
|
||||||
h.dh.BeforeDelegationRemoved(ctx, delAddr, valAddr)
|
|
||||||
h.sh.BeforeDelegationRemoved(ctx, delAddr, valAddr)
|
|
||||||
}
|
|
||||||
func (h StakingHooks) AfterDelegationModified(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) {
|
|
||||||
h.dh.AfterDelegationModified(ctx, delAddr, valAddr)
|
|
||||||
h.sh.AfterDelegationModified(ctx, delAddr, valAddr)
|
|
||||||
}
|
|
||||||
func (h StakingHooks) BeforeValidatorSlashed(ctx sdk.Context, valAddr sdk.ValAddress, fraction sdk.Dec) {
|
|
||||||
h.dh.BeforeValidatorSlashed(ctx, valAddr, fraction)
|
|
||||||
h.sh.BeforeValidatorSlashed(ctx, valAddr, fraction)
|
|
||||||
}
|
}
|
||||||
|
@ -4,55 +4,15 @@ import (
|
|||||||
"os"
|
"os"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/cosmos/cosmos-sdk/x/bank"
|
|
||||||
"github.com/cosmos/cosmos-sdk/x/crisis"
|
|
||||||
|
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
"github.com/tendermint/tendermint/libs/db"
|
"github.com/tendermint/tendermint/libs/db"
|
||||||
"github.com/tendermint/tendermint/libs/log"
|
"github.com/tendermint/tendermint/libs/log"
|
||||||
|
|
||||||
"github.com/cosmos/cosmos-sdk/codec"
|
"github.com/cosmos/cosmos-sdk/codec"
|
||||||
"github.com/cosmos/cosmos-sdk/x/auth"
|
|
||||||
distr "github.com/cosmos/cosmos-sdk/x/distribution"
|
|
||||||
"github.com/cosmos/cosmos-sdk/x/gov"
|
|
||||||
"github.com/cosmos/cosmos-sdk/x/mint"
|
|
||||||
"github.com/cosmos/cosmos-sdk/x/slashing"
|
|
||||||
"github.com/cosmos/cosmos-sdk/x/staking"
|
|
||||||
|
|
||||||
abci "github.com/tendermint/tendermint/abci/types"
|
abci "github.com/tendermint/tendermint/abci/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
func setGenesis(app *App, accs ...*auth.BaseAccount) error {
|
|
||||||
genaccs := make([]GenesisAccount, len(accs))
|
|
||||||
for i, acc := range accs {
|
|
||||||
genaccs[i] = NewGenesisAccount(acc)
|
|
||||||
}
|
|
||||||
|
|
||||||
genesisState := NewGenesisState(
|
|
||||||
genaccs,
|
|
||||||
auth.DefaultGenesisState(),
|
|
||||||
bank.DefaultGenesisState(),
|
|
||||||
staking.DefaultGenesisState(),
|
|
||||||
mint.DefaultGenesisState(),
|
|
||||||
distr.DefaultGenesisState(),
|
|
||||||
gov.DefaultGenesisState(),
|
|
||||||
crisis.DefaultGenesisState(),
|
|
||||||
slashing.DefaultGenesisState(),
|
|
||||||
)
|
|
||||||
|
|
||||||
stateBytes, err := codec.MarshalJSONIndent(app.cdc, genesisState)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Initialize the chain
|
|
||||||
vals := []abci.ValidatorUpdate{}
|
|
||||||
app.InitChain(abci.RequestInitChain{Validators: vals, AppStateBytes: stateBytes})
|
|
||||||
app.Commit()
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestExport(t *testing.T) {
|
func TestExport(t *testing.T) {
|
||||||
db := db.NewMemDB()
|
db := db.NewMemDB()
|
||||||
app := NewApp(log.NewTMLogger(log.NewSyncWriter(os.Stdout)), db, nil, true, 0)
|
app := NewApp(log.NewTMLogger(log.NewSyncWriter(os.Stdout)), db, nil, true, 0)
|
||||||
@ -63,3 +23,23 @@ func TestExport(t *testing.T) {
|
|||||||
_, _, err := newApp.ExportAppStateAndValidators(false, []string{})
|
_, _, err := newApp.ExportAppStateAndValidators(false, []string{})
|
||||||
require.NoError(t, err, "ExportAppStateAndValidators should not have an error")
|
require.NoError(t, err, "ExportAppStateAndValidators should not have an error")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func setGenesis(app *App) error {
|
||||||
|
genesisState := NewDefaultGenesisState()
|
||||||
|
|
||||||
|
stateBytes, err := codec.MarshalJSONIndent(app.cdc, genesisState)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Initialize the chain
|
||||||
|
app.InitChain(
|
||||||
|
abci.RequestInitChain{
|
||||||
|
Validators: []abci.ValidatorUpdate{},
|
||||||
|
AppStateBytes: stateBytes,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
app.Commit()
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
@ -1,40 +0,0 @@
|
|||||||
package app
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
|
|
||||||
"github.com/tendermint/tendermint/crypto/secp256k1"
|
|
||||||
|
|
||||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
|
||||||
"github.com/cosmos/cosmos-sdk/x/auth"
|
|
||||||
"github.com/cosmos/cosmos-sdk/x/bank"
|
|
||||||
"github.com/kava-labs/kava/app"
|
|
||||||
)
|
|
||||||
|
|
||||||
// This will fail half the time with the second output being 173
|
|
||||||
// This is due to secp256k1 signatures not being constant size.
|
|
||||||
// nolint: vet
|
|
||||||
func ExampleTxSendSize() {
|
|
||||||
cdc := app.MakeCodec()
|
|
||||||
var gas uint64 = 1
|
|
||||||
|
|
||||||
priv1 := secp256k1.GenPrivKeySecp256k1([]byte{0})
|
|
||||||
addr1 := sdk.AccAddress(priv1.PubKey().Address())
|
|
||||||
priv2 := secp256k1.GenPrivKeySecp256k1([]byte{1})
|
|
||||||
addr2 := sdk.AccAddress(priv2.PubKey().Address())
|
|
||||||
coins := sdk.Coins{sdk.NewCoin("denom", sdk.NewInt(10))}
|
|
||||||
msg1 := bank.MsgMultiSend{
|
|
||||||
Inputs: []bank.Input{bank.NewInput(addr1, coins)},
|
|
||||||
Outputs: []bank.Output{bank.NewOutput(addr2, coins)},
|
|
||||||
}
|
|
||||||
fee := auth.NewStdFee(gas, coins)
|
|
||||||
signBytes := auth.StdSignBytes("example-chain-ID",
|
|
||||||
1, 1, fee, []sdk.Msg{msg1}, "")
|
|
||||||
sig, _ := priv1.Sign(signBytes)
|
|
||||||
sigs := []auth.StdSignature{{nil, sig}}
|
|
||||||
tx := auth.NewStdTx([]sdk.Msg{msg1}, fee, sigs, "")
|
|
||||||
fmt.Println(len(cdc.MustMarshalBinaryBare([]sdk.Msg{msg1})))
|
|
||||||
fmt.Println(len(cdc.MustMarshalBinaryBare(tx)))
|
|
||||||
// output: 80
|
|
||||||
// 169
|
|
||||||
}
|
|
@ -9,12 +9,6 @@ import (
|
|||||||
|
|
||||||
"github.com/cosmos/cosmos-sdk/codec"
|
"github.com/cosmos/cosmos-sdk/codec"
|
||||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||||
"github.com/cosmos/cosmos-sdk/x/auth"
|
|
||||||
"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/gov"
|
|
||||||
"github.com/cosmos/cosmos-sdk/x/mint"
|
|
||||||
"github.com/cosmos/cosmos-sdk/x/slashing"
|
"github.com/cosmos/cosmos-sdk/x/slashing"
|
||||||
"github.com/cosmos/cosmos-sdk/x/staking"
|
"github.com/cosmos/cosmos-sdk/x/staking"
|
||||||
)
|
)
|
||||||
@ -30,26 +24,8 @@ func (app *App) ExportAppStateAndValidators(forZeroHeight bool, jailWhiteList []
|
|||||||
app.prepForZeroHeightGenesis(ctx, jailWhiteList)
|
app.prepForZeroHeightGenesis(ctx, jailWhiteList)
|
||||||
}
|
}
|
||||||
|
|
||||||
// iterate to get the accounts
|
genState := app.mm.ExportGenesis(ctx)
|
||||||
accounts := []GenesisAccount{}
|
|
||||||
appendAccount := func(acc auth.Account) (stop bool) {
|
|
||||||
account := NewGenesisAccountI(acc)
|
|
||||||
accounts = append(accounts, account)
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
app.accountKeeper.IterateAccounts(ctx, appendAccount)
|
|
||||||
|
|
||||||
genState := NewGenesisState(
|
|
||||||
accounts,
|
|
||||||
auth.ExportGenesis(ctx, app.accountKeeper, app.feeCollectionKeeper),
|
|
||||||
bank.ExportGenesis(ctx, app.bankKeeper),
|
|
||||||
staking.ExportGenesis(ctx, app.stakingKeeper),
|
|
||||||
mint.ExportGenesis(ctx, app.mintKeeper),
|
|
||||||
distr.ExportGenesis(ctx, app.distrKeeper),
|
|
||||||
gov.ExportGenesis(ctx, app.govKeeper),
|
|
||||||
crisis.ExportGenesis(ctx, app.crisisKeeper),
|
|
||||||
slashing.ExportGenesis(ctx, app.slashingKeeper),
|
|
||||||
)
|
|
||||||
appState, err = codec.MarshalJSONIndent(app.cdc, genState)
|
appState, err = codec.MarshalJSONIndent(app.cdc, genState)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
@ -78,12 +54,12 @@ func (app *App) prepForZeroHeightGenesis(ctx sdk.Context, jailWhiteList []string
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Just to be safe, assert the invariants on current state. */
|
/* Just to be safe, assert the invariants on current state. */
|
||||||
app.assertRuntimeInvariantsOnContext(ctx)
|
app.crisisKeeper.AssertInvariants(ctx)
|
||||||
|
|
||||||
/* Handle fee distribution state. */
|
/* Handle fee distribution state. */
|
||||||
|
|
||||||
// withdraw all validator commission
|
// withdraw all validator commission
|
||||||
app.stakingKeeper.IterateValidators(ctx, func(_ int64, val sdk.Validator) (stop bool) {
|
app.stakingKeeper.IterateValidators(ctx, func(_ int64, val staking.ValidatorI) (stop bool) {
|
||||||
_, _ = app.distrKeeper.WithdrawValidatorCommission(ctx, val.GetOperator())
|
_, _ = app.distrKeeper.WithdrawValidatorCommission(ctx, val.GetOperator())
|
||||||
return false
|
return false
|
||||||
})
|
})
|
||||||
@ -105,7 +81,7 @@ func (app *App) prepForZeroHeightGenesis(ctx sdk.Context, jailWhiteList []string
|
|||||||
ctx = ctx.WithBlockHeight(0)
|
ctx = ctx.WithBlockHeight(0)
|
||||||
|
|
||||||
// reinitialize all validators
|
// reinitialize all validators
|
||||||
app.stakingKeeper.IterateValidators(ctx, func(_ int64, val sdk.Validator) (stop bool) {
|
app.stakingKeeper.IterateValidators(ctx, func(_ int64, val staking.ValidatorI) (stop bool) {
|
||||||
|
|
||||||
// donate any unwithdrawn outstanding reward fraction tokens to the community pool
|
// donate any unwithdrawn outstanding reward fraction tokens to the community pool
|
||||||
scraps := app.distrKeeper.GetValidatorOutstandingRewards(ctx, val.GetOperator())
|
scraps := app.distrKeeper.GetValidatorOutstandingRewards(ctx, val.GetOperator())
|
||||||
|
412
app/genesis.go
412
app/genesis.go
@ -2,416 +2,12 @@ package app
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
|
||||||
"fmt"
|
|
||||||
"io/ioutil"
|
|
||||||
"os"
|
|
||||||
"path/filepath"
|
|
||||||
"sort"
|
|
||||||
"strings"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
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/auth"
|
|
||||||
"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/gov"
|
|
||||||
"github.com/cosmos/cosmos-sdk/x/mint"
|
|
||||||
"github.com/cosmos/cosmos-sdk/x/slashing"
|
|
||||||
"github.com/cosmos/cosmos-sdk/x/staking"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
// GenesisState represents the genesis state of the blockchain. It is a map from module names to module genesis states.
|
||||||
// bonded tokens given to genesis validators/accounts
|
type GenesisState map[string]json.RawMessage
|
||||||
freeTokensPerAcc = sdk.TokensFromTendermintPower(150)
|
|
||||||
defaultBondDenom = sdk.DefaultBondDenom
|
|
||||||
)
|
|
||||||
|
|
||||||
// State to Unmarshal
|
// NewDefaultGenesisState generates the default state for the application.
|
||||||
type GenesisState struct {
|
|
||||||
Accounts []GenesisAccount `json:"accounts"`
|
|
||||||
AuthData auth.GenesisState `json:"auth"`
|
|
||||||
BankData bank.GenesisState `json:"bank"`
|
|
||||||
StakingData staking.GenesisState `json:"staking"`
|
|
||||||
MintData mint.GenesisState `json:"mint"`
|
|
||||||
DistrData distr.GenesisState `json:"distr"`
|
|
||||||
GovData gov.GenesisState `json:"gov"`
|
|
||||||
CrisisData crisis.GenesisState `json:"crisis"`
|
|
||||||
SlashingData slashing.GenesisState `json:"slashing"`
|
|
||||||
GenTxs []json.RawMessage `json:"gentxs"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewGenesisState(accounts []GenesisAccount, authData auth.GenesisState,
|
|
||||||
bankData bank.GenesisState,
|
|
||||||
stakingData staking.GenesisState, mintData mint.GenesisState,
|
|
||||||
distrData distr.GenesisState, govData gov.GenesisState, crisisData crisis.GenesisState,
|
|
||||||
slashingData slashing.GenesisState) GenesisState {
|
|
||||||
|
|
||||||
return GenesisState{
|
|
||||||
Accounts: accounts,
|
|
||||||
AuthData: authData,
|
|
||||||
BankData: bankData,
|
|
||||||
StakingData: stakingData,
|
|
||||||
MintData: mintData,
|
|
||||||
DistrData: distrData,
|
|
||||||
GovData: govData,
|
|
||||||
CrisisData: crisisData,
|
|
||||||
SlashingData: slashingData,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sanitize sorts accounts and coin sets.
|
|
||||||
func (gs GenesisState) Sanitize() {
|
|
||||||
sort.Slice(gs.Accounts, func(i, j int) bool {
|
|
||||||
return gs.Accounts[i].AccountNumber < gs.Accounts[j].AccountNumber
|
|
||||||
})
|
|
||||||
|
|
||||||
for _, acc := range gs.Accounts {
|
|
||||||
acc.Coins = acc.Coins.Sort()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// GenesisAccount defines an account initialized at genesis.
|
|
||||||
type GenesisAccount struct {
|
|
||||||
Address sdk.AccAddress `json:"address"`
|
|
||||||
Coins sdk.Coins `json:"coins"`
|
|
||||||
Sequence uint64 `json:"sequence_number"`
|
|
||||||
AccountNumber uint64 `json:"account_number"`
|
|
||||||
|
|
||||||
// vesting account fields
|
|
||||||
OriginalVesting sdk.Coins `json:"original_vesting"` // total vesting coins upon initialization
|
|
||||||
DelegatedFree sdk.Coins `json:"delegated_free"` // delegated vested coins at time of delegation
|
|
||||||
DelegatedVesting sdk.Coins `json:"delegated_vesting"` // delegated vesting coins at time of delegation
|
|
||||||
StartTime int64 `json:"start_time"` // vesting start time (UNIX Epoch time)
|
|
||||||
EndTime int64 `json:"end_time"` // vesting end time (UNIX Epoch time)
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewGenesisAccount(acc *auth.BaseAccount) GenesisAccount {
|
|
||||||
return GenesisAccount{
|
|
||||||
Address: acc.Address,
|
|
||||||
Coins: acc.Coins,
|
|
||||||
AccountNumber: acc.AccountNumber,
|
|
||||||
Sequence: acc.Sequence,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewGenesisAccountI(acc auth.Account) GenesisAccount {
|
|
||||||
gacc := GenesisAccount{
|
|
||||||
Address: acc.GetAddress(),
|
|
||||||
Coins: acc.GetCoins(),
|
|
||||||
AccountNumber: acc.GetAccountNumber(),
|
|
||||||
Sequence: acc.GetSequence(),
|
|
||||||
}
|
|
||||||
|
|
||||||
vacc, ok := acc.(auth.VestingAccount)
|
|
||||||
if ok {
|
|
||||||
gacc.OriginalVesting = vacc.GetOriginalVesting()
|
|
||||||
gacc.DelegatedFree = vacc.GetDelegatedFree()
|
|
||||||
gacc.DelegatedVesting = vacc.GetDelegatedVesting()
|
|
||||||
gacc.StartTime = vacc.GetStartTime()
|
|
||||||
gacc.EndTime = vacc.GetEndTime()
|
|
||||||
}
|
|
||||||
|
|
||||||
return gacc
|
|
||||||
}
|
|
||||||
|
|
||||||
// convert GenesisAccount to auth.BaseAccount
|
|
||||||
func (ga *GenesisAccount) ToAccount() auth.Account {
|
|
||||||
bacc := &auth.BaseAccount{
|
|
||||||
Address: ga.Address,
|
|
||||||
Coins: ga.Coins.Sort(),
|
|
||||||
AccountNumber: ga.AccountNumber,
|
|
||||||
Sequence: ga.Sequence,
|
|
||||||
}
|
|
||||||
|
|
||||||
if !ga.OriginalVesting.IsZero() {
|
|
||||||
baseVestingAcc := &auth.BaseVestingAccount{
|
|
||||||
BaseAccount: bacc,
|
|
||||||
OriginalVesting: ga.OriginalVesting,
|
|
||||||
DelegatedFree: ga.DelegatedFree,
|
|
||||||
DelegatedVesting: ga.DelegatedVesting,
|
|
||||||
EndTime: ga.EndTime,
|
|
||||||
}
|
|
||||||
|
|
||||||
if ga.StartTime != 0 && ga.EndTime != 0 {
|
|
||||||
return &auth.ContinuousVestingAccount{
|
|
||||||
BaseVestingAccount: baseVestingAcc,
|
|
||||||
StartTime: ga.StartTime,
|
|
||||||
}
|
|
||||||
} else if ga.EndTime != 0 {
|
|
||||||
return &auth.DelayedVestingAccount{
|
|
||||||
BaseVestingAccount: baseVestingAcc,
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
panic(fmt.Sprintf("invalid genesis vesting account: %+v", ga))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return bacc
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create the core parameters for genesis initialization for gaia
|
|
||||||
// note that the pubkey input is this machines pubkey
|
|
||||||
func AppGenState(cdc *codec.Codec, genDoc tmtypes.GenesisDoc, appGenTxs []json.RawMessage) (
|
|
||||||
genesisState GenesisState, err error) {
|
|
||||||
|
|
||||||
if err = cdc.UnmarshalJSON(genDoc.AppState, &genesisState); err != nil {
|
|
||||||
return genesisState, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// if there are no gen txs to be processed, return the default empty state
|
|
||||||
if len(appGenTxs) == 0 {
|
|
||||||
return genesisState, errors.New("there must be at least one genesis tx")
|
|
||||||
}
|
|
||||||
|
|
||||||
stakingData := genesisState.StakingData
|
|
||||||
for i, genTx := range appGenTxs {
|
|
||||||
var tx auth.StdTx
|
|
||||||
if err := cdc.UnmarshalJSON(genTx, &tx); err != nil {
|
|
||||||
return genesisState, err
|
|
||||||
}
|
|
||||||
|
|
||||||
msgs := tx.GetMsgs()
|
|
||||||
if len(msgs) != 1 {
|
|
||||||
return genesisState, errors.New(
|
|
||||||
"must provide genesis StdTx with exactly 1 CreateValidator message")
|
|
||||||
}
|
|
||||||
|
|
||||||
if _, ok := msgs[0].(staking.MsgCreateValidator); !ok {
|
|
||||||
return genesisState, fmt.Errorf(
|
|
||||||
"Genesis transaction %v does not contain a MsgCreateValidator", i)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, acc := range genesisState.Accounts {
|
|
||||||
for _, coin := range acc.Coins {
|
|
||||||
if coin.Denom == genesisState.StakingData.Params.BondDenom {
|
|
||||||
stakingData.Pool.NotBondedTokens = stakingData.Pool.NotBondedTokens.
|
|
||||||
Add(coin.Amount) // increase the supply
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
genesisState.StakingData = stakingData
|
|
||||||
genesisState.GenTxs = appGenTxs
|
|
||||||
|
|
||||||
return genesisState, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewDefaultGenesisState generates the default state for gaia.
|
|
||||||
func NewDefaultGenesisState() GenesisState {
|
func NewDefaultGenesisState() GenesisState {
|
||||||
return GenesisState{
|
return ModuleBasics.DefaultGenesis()
|
||||||
Accounts: nil,
|
|
||||||
AuthData: auth.DefaultGenesisState(),
|
|
||||||
BankData: bank.DefaultGenesisState(),
|
|
||||||
StakingData: staking.DefaultGenesisState(),
|
|
||||||
MintData: mint.DefaultGenesisState(),
|
|
||||||
DistrData: distr.DefaultGenesisState(),
|
|
||||||
GovData: gov.DefaultGenesisState(),
|
|
||||||
CrisisData: crisis.DefaultGenesisState(),
|
|
||||||
SlashingData: slashing.DefaultGenesisState(),
|
|
||||||
GenTxs: nil,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ValidateGenesisState ensures that the genesis state obeys the expected invariants
|
|
||||||
// TODO: No validators are both bonded and jailed (#2088)
|
|
||||||
// TODO: Error if there is a duplicate validator (#1708)
|
|
||||||
// TODO: Ensure all state machine parameters are in genesis (#1704)
|
|
||||||
func ValidateGenesisState(genesisState GenesisState) error {
|
|
||||||
if err := validateGenesisStateAccounts(genesisState.Accounts); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// skip stakingData validation as genesis is created from txs
|
|
||||||
if len(genesisState.GenTxs) > 0 {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := auth.ValidateGenesis(genesisState.AuthData); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if err := bank.ValidateGenesis(genesisState.BankData); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if err := staking.ValidateGenesis(genesisState.StakingData); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if err := mint.ValidateGenesis(genesisState.MintData); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if err := distr.ValidateGenesis(genesisState.DistrData); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if err := gov.ValidateGenesis(genesisState.GovData); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if err := crisis.ValidateGenesis(genesisState.CrisisData); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return slashing.ValidateGenesis(genesisState.SlashingData)
|
|
||||||
}
|
|
||||||
|
|
||||||
// validateGenesisStateAccounts performs validation of genesis accounts. It
|
|
||||||
// ensures that there are no duplicate accounts in the genesis state and any
|
|
||||||
// provided vesting accounts are valid.
|
|
||||||
func validateGenesisStateAccounts(accs []GenesisAccount) error {
|
|
||||||
addrMap := make(map[string]bool, len(accs))
|
|
||||||
for _, acc := range accs {
|
|
||||||
addrStr := acc.Address.String()
|
|
||||||
|
|
||||||
// disallow any duplicate accounts
|
|
||||||
if _, ok := addrMap[addrStr]; ok {
|
|
||||||
return fmt.Errorf("duplicate account found in genesis state; address: %s", addrStr)
|
|
||||||
}
|
|
||||||
|
|
||||||
// validate any vesting fields
|
|
||||||
if !acc.OriginalVesting.IsZero() {
|
|
||||||
if acc.EndTime == 0 {
|
|
||||||
return fmt.Errorf("missing end time for vesting account; address: %s", addrStr)
|
|
||||||
}
|
|
||||||
|
|
||||||
if acc.StartTime >= acc.EndTime {
|
|
||||||
return fmt.Errorf(
|
|
||||||
"vesting start time must before end time; address: %s, start: %s, end: %s",
|
|
||||||
addrStr,
|
|
||||||
time.Unix(acc.StartTime, 0).UTC().Format(time.RFC3339),
|
|
||||||
time.Unix(acc.EndTime, 0).UTC().Format(time.RFC3339),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
addrMap[addrStr] = true
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// AppGenState but with JSON
|
|
||||||
func AppGenStateJSON(cdc *codec.Codec, genDoc tmtypes.GenesisDoc, appGenTxs []json.RawMessage) (
|
|
||||||
appState json.RawMessage, err error) {
|
|
||||||
// create the final app state
|
|
||||||
genesisState, err := AppGenState(cdc, genDoc, appGenTxs)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return codec.MarshalJSONIndent(cdc, genesisState)
|
|
||||||
}
|
|
||||||
|
|
||||||
// CollectStdTxs processes and validates application's genesis StdTxs and returns
|
|
||||||
// the list of appGenTxs, and persistent peers required to generate genesis.json.
|
|
||||||
func CollectStdTxs(cdc *codec.Codec, moniker string, genTxsDir string, genDoc tmtypes.GenesisDoc) (
|
|
||||||
appGenTxs []auth.StdTx, persistentPeers string, err error) {
|
|
||||||
|
|
||||||
var fos []os.FileInfo
|
|
||||||
fos, err = ioutil.ReadDir(genTxsDir)
|
|
||||||
if err != nil {
|
|
||||||
return appGenTxs, persistentPeers, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// prepare a map of all accounts in genesis state to then validate
|
|
||||||
// against the validators addresses
|
|
||||||
var appState GenesisState
|
|
||||||
if err := cdc.UnmarshalJSON(genDoc.AppState, &appState); err != nil {
|
|
||||||
return appGenTxs, persistentPeers, err
|
|
||||||
}
|
|
||||||
|
|
||||||
addrMap := make(map[string]GenesisAccount, len(appState.Accounts))
|
|
||||||
for i := 0; i < len(appState.Accounts); i++ {
|
|
||||||
acc := appState.Accounts[i]
|
|
||||||
addrMap[acc.Address.String()] = acc
|
|
||||||
}
|
|
||||||
|
|
||||||
// addresses and IPs (and port) validator server info
|
|
||||||
var addressesIPs []string
|
|
||||||
|
|
||||||
for _, fo := range fos {
|
|
||||||
filename := filepath.Join(genTxsDir, fo.Name())
|
|
||||||
if !fo.IsDir() && (filepath.Ext(filename) != ".json") {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
// get the genStdTx
|
|
||||||
var jsonRawTx []byte
|
|
||||||
if jsonRawTx, err = ioutil.ReadFile(filename); err != nil {
|
|
||||||
return appGenTxs, persistentPeers, err
|
|
||||||
}
|
|
||||||
var genStdTx auth.StdTx
|
|
||||||
if err = cdc.UnmarshalJSON(jsonRawTx, &genStdTx); err != nil {
|
|
||||||
return appGenTxs, persistentPeers, err
|
|
||||||
}
|
|
||||||
appGenTxs = append(appGenTxs, genStdTx)
|
|
||||||
|
|
||||||
// the memo flag is used to store
|
|
||||||
// the ip and node-id, for example this may be:
|
|
||||||
// "528fd3df22b31f4969b05652bfe8f0fe921321d5@192.168.2.37:26656"
|
|
||||||
nodeAddrIP := genStdTx.GetMemo()
|
|
||||||
if len(nodeAddrIP) == 0 {
|
|
||||||
return appGenTxs, persistentPeers, fmt.Errorf(
|
|
||||||
"couldn't find node's address and IP in %s", fo.Name())
|
|
||||||
}
|
|
||||||
|
|
||||||
// genesis transactions must be single-message
|
|
||||||
msgs := genStdTx.GetMsgs()
|
|
||||||
if len(msgs) != 1 {
|
|
||||||
|
|
||||||
return appGenTxs, persistentPeers, errors.New(
|
|
||||||
"each genesis transaction must provide a single genesis message")
|
|
||||||
}
|
|
||||||
|
|
||||||
msg := msgs[0].(staking.MsgCreateValidator)
|
|
||||||
// validate delegator and validator addresses and funds against the accounts in the state
|
|
||||||
delAddr := msg.DelegatorAddress.String()
|
|
||||||
valAddr := sdk.AccAddress(msg.ValidatorAddress).String()
|
|
||||||
|
|
||||||
delAcc, delOk := addrMap[delAddr]
|
|
||||||
_, valOk := addrMap[valAddr]
|
|
||||||
|
|
||||||
accsNotInGenesis := []string{}
|
|
||||||
if !delOk {
|
|
||||||
accsNotInGenesis = append(accsNotInGenesis, delAddr)
|
|
||||||
}
|
|
||||||
if !valOk {
|
|
||||||
accsNotInGenesis = append(accsNotInGenesis, valAddr)
|
|
||||||
}
|
|
||||||
if len(accsNotInGenesis) != 0 {
|
|
||||||
return appGenTxs, persistentPeers, fmt.Errorf(
|
|
||||||
"account(s) %v not in genesis.json: %+v", strings.Join(accsNotInGenesis, " "), addrMap)
|
|
||||||
}
|
|
||||||
|
|
||||||
if delAcc.Coins.AmountOf(msg.Value.Denom).LT(msg.Value.Amount) {
|
|
||||||
return appGenTxs, persistentPeers, fmt.Errorf(
|
|
||||||
"insufficient fund for delegation %v: %v < %v",
|
|
||||||
delAcc.Address, delAcc.Coins.AmountOf(msg.Value.Denom), msg.Value.Amount,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
// exclude itself from persistent peers
|
|
||||||
if msg.Description.Moniker != moniker {
|
|
||||||
addressesIPs = append(addressesIPs, nodeAddrIP)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sort.Strings(addressesIPs)
|
|
||||||
persistentPeers = strings.Join(addressesIPs, ",")
|
|
||||||
|
|
||||||
return appGenTxs, persistentPeers, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewDefaultGenesisAccount(addr sdk.AccAddress) GenesisAccount {
|
|
||||||
accAuth := auth.NewBaseAccountWithAddress(addr)
|
|
||||||
coins := sdk.Coins{
|
|
||||||
sdk.NewCoin("footoken", sdk.NewInt(1000)),
|
|
||||||
sdk.NewCoin(defaultBondDenom, freeTokensPerAcc),
|
|
||||||
}
|
|
||||||
|
|
||||||
coins.Sort()
|
|
||||||
|
|
||||||
accAuth.Coins = coins
|
|
||||||
return NewGenesisAccount(&accAuth)
|
|
||||||
}
|
}
|
||||||
|
@ -1,188 +0,0 @@
|
|||||||
package app
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"testing"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/stretchr/testify/require"
|
|
||||||
|
|
||||||
"github.com/tendermint/tendermint/crypto"
|
|
||||||
"github.com/tendermint/tendermint/crypto/ed25519"
|
|
||||||
"github.com/tendermint/tendermint/crypto/secp256k1"
|
|
||||||
tmtypes "github.com/tendermint/tendermint/types"
|
|
||||||
|
|
||||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
|
||||||
"github.com/cosmos/cosmos-sdk/x/auth"
|
|
||||||
"github.com/cosmos/cosmos-sdk/x/staking"
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
pk1 = ed25519.GenPrivKey().PubKey()
|
|
||||||
pk2 = ed25519.GenPrivKey().PubKey()
|
|
||||||
pk3 = ed25519.GenPrivKey().PubKey()
|
|
||||||
addr1 = sdk.ValAddress(pk1.Address())
|
|
||||||
addr2 = sdk.ValAddress(pk2.Address())
|
|
||||||
addr3 = sdk.ValAddress(pk3.Address())
|
|
||||||
|
|
||||||
emptyAddr sdk.ValAddress
|
|
||||||
emptyPubkey crypto.PubKey
|
|
||||||
)
|
|
||||||
|
|
||||||
func makeGenesisState(t *testing.T, genTxs []auth.StdTx) GenesisState {
|
|
||||||
// start with the default staking genesis state
|
|
||||||
appState := NewDefaultGenesisState()
|
|
||||||
stakingData := appState.StakingData
|
|
||||||
genAccs := make([]GenesisAccount, len(genTxs))
|
|
||||||
|
|
||||||
for i, genTx := range genTxs {
|
|
||||||
msgs := genTx.GetMsgs()
|
|
||||||
require.Equal(t, 1, len(msgs))
|
|
||||||
msg := msgs[0].(staking.MsgCreateValidator)
|
|
||||||
|
|
||||||
acc := auth.NewBaseAccountWithAddress(sdk.AccAddress(msg.ValidatorAddress))
|
|
||||||
acc.Coins = sdk.NewCoins(sdk.NewInt64Coin(defaultBondDenom, 150))
|
|
||||||
genAccs[i] = NewGenesisAccount(&acc)
|
|
||||||
stakingData.Pool.NotBondedTokens = stakingData.Pool.NotBondedTokens.Add(sdk.NewInt(150)) // increase the supply
|
|
||||||
}
|
|
||||||
|
|
||||||
// create the final app state
|
|
||||||
appState.Accounts = genAccs
|
|
||||||
return appState
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestToAccount(t *testing.T) {
|
|
||||||
priv := ed25519.GenPrivKey()
|
|
||||||
addr := sdk.AccAddress(priv.PubKey().Address())
|
|
||||||
authAcc := auth.NewBaseAccountWithAddress(addr)
|
|
||||||
authAcc.SetCoins(sdk.NewCoins(sdk.NewInt64Coin(defaultBondDenom, 150)))
|
|
||||||
genAcc := NewGenesisAccount(&authAcc)
|
|
||||||
acc := genAcc.ToAccount()
|
|
||||||
require.IsType(t, &auth.BaseAccount{}, acc)
|
|
||||||
require.Equal(t, &authAcc, acc.(*auth.BaseAccount))
|
|
||||||
|
|
||||||
vacc := auth.NewContinuousVestingAccount(
|
|
||||||
&authAcc, time.Now().Unix(), time.Now().Add(24*time.Hour).Unix(),
|
|
||||||
)
|
|
||||||
genAcc = NewGenesisAccountI(vacc)
|
|
||||||
acc = genAcc.ToAccount()
|
|
||||||
require.IsType(t, &auth.ContinuousVestingAccount{}, acc)
|
|
||||||
require.Equal(t, vacc, acc.(*auth.ContinuousVestingAccount))
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestAppGenTx(t *testing.T) {
|
|
||||||
cdc := MakeCodec()
|
|
||||||
_ = cdc
|
|
||||||
|
|
||||||
//TODO test that key overwrite flags work / no overwrites if set off
|
|
||||||
//TODO test validator created has provided pubkey
|
|
||||||
//TODO test the account created has the correct pubkey
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestAppGenState(t *testing.T) {
|
|
||||||
cdc := MakeCodec()
|
|
||||||
_ = cdc
|
|
||||||
var genDoc tmtypes.GenesisDoc
|
|
||||||
|
|
||||||
// test unmarshalling error
|
|
||||||
_, err := AppGenState(cdc, genDoc, []json.RawMessage{})
|
|
||||||
require.Error(t, err)
|
|
||||||
|
|
||||||
appState := makeGenesisState(t, []auth.StdTx{})
|
|
||||||
genDoc.AppState, err = json.Marshal(appState)
|
|
||||||
require.NoError(t, err)
|
|
||||||
|
|
||||||
// test validation error
|
|
||||||
_, err = AppGenState(cdc, genDoc, []json.RawMessage{})
|
|
||||||
require.Error(t, err)
|
|
||||||
|
|
||||||
// TODO test must provide at least genesis transaction
|
|
||||||
// TODO test with both one and two genesis transactions:
|
|
||||||
// TODO correct: genesis account created, canididates created, pool token variance
|
|
||||||
}
|
|
||||||
|
|
||||||
func makeMsg(name string, pk crypto.PubKey) auth.StdTx {
|
|
||||||
desc := staking.NewDescription(name, "", "", "")
|
|
||||||
comm := staking.CommissionMsg{}
|
|
||||||
msg := staking.NewMsgCreateValidator(sdk.ValAddress(pk.Address()), pk, sdk.NewInt64Coin(defaultBondDenom,
|
|
||||||
50), desc, comm, sdk.OneInt())
|
|
||||||
return auth.NewStdTx([]sdk.Msg{msg}, auth.StdFee{}, nil, "")
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestGenesisValidation(t *testing.T) {
|
|
||||||
genTxs := []auth.StdTx{makeMsg("test-0", pk1), makeMsg("test-1", pk2)}
|
|
||||||
dupGenTxs := []auth.StdTx{makeMsg("test-0", pk1), makeMsg("test-1", pk1)}
|
|
||||||
|
|
||||||
// require duplicate accounts fails validation
|
|
||||||
genesisState := makeGenesisState(t, dupGenTxs)
|
|
||||||
err := ValidateGenesisState(genesisState)
|
|
||||||
require.Error(t, err)
|
|
||||||
|
|
||||||
// require invalid vesting account fails validation (invalid end time)
|
|
||||||
genesisState = makeGenesisState(t, genTxs)
|
|
||||||
genesisState.Accounts[0].OriginalVesting = genesisState.Accounts[0].Coins
|
|
||||||
err = ValidateGenesisState(genesisState)
|
|
||||||
require.Error(t, err)
|
|
||||||
genesisState.Accounts[0].StartTime = 1548888000
|
|
||||||
genesisState.Accounts[0].EndTime = 1548775410
|
|
||||||
err = ValidateGenesisState(genesisState)
|
|
||||||
require.Error(t, err)
|
|
||||||
|
|
||||||
// require bonded + jailed validator fails validation
|
|
||||||
genesisState = makeGenesisState(t, genTxs)
|
|
||||||
val1 := staking.NewValidator(addr1, pk1, staking.NewDescription("test #2", "", "", ""))
|
|
||||||
val1.Jailed = true
|
|
||||||
val1.Status = sdk.Bonded
|
|
||||||
genesisState.StakingData.Validators = append(genesisState.StakingData.Validators, val1)
|
|
||||||
err = ValidateGenesisState(genesisState)
|
|
||||||
require.Error(t, err)
|
|
||||||
|
|
||||||
// require duplicate validator fails validation
|
|
||||||
val1.Jailed = false
|
|
||||||
genesisState = makeGenesisState(t, genTxs)
|
|
||||||
val2 := staking.NewValidator(addr1, pk1, staking.NewDescription("test #3", "", "", ""))
|
|
||||||
genesisState.StakingData.Validators = append(genesisState.StakingData.Validators, val1)
|
|
||||||
genesisState.StakingData.Validators = append(genesisState.StakingData.Validators, val2)
|
|
||||||
err = ValidateGenesisState(genesisState)
|
|
||||||
require.Error(t, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestNewDefaultGenesisAccount(t *testing.T) {
|
|
||||||
addr := secp256k1.GenPrivKeySecp256k1([]byte("")).PubKey().Address()
|
|
||||||
acc := NewDefaultGenesisAccount(sdk.AccAddress(addr))
|
|
||||||
require.Equal(t, sdk.NewInt(1000), acc.Coins.AmountOf("footoken"))
|
|
||||||
require.Equal(t, sdk.TokensFromTendermintPower(150), acc.Coins.AmountOf(defaultBondDenom))
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestGenesisStateSanitize(t *testing.T) {
|
|
||||||
genesisState := makeGenesisState(t, nil)
|
|
||||||
require.Nil(t, ValidateGenesisState(genesisState))
|
|
||||||
|
|
||||||
addr1 := sdk.AccAddress(ed25519.GenPrivKey().PubKey().Address())
|
|
||||||
authAcc1 := auth.NewBaseAccountWithAddress(addr1)
|
|
||||||
authAcc1.SetCoins(sdk.Coins{
|
|
||||||
sdk.NewInt64Coin("bcoin", 150),
|
|
||||||
sdk.NewInt64Coin("acoin", 150),
|
|
||||||
})
|
|
||||||
authAcc1.SetAccountNumber(1)
|
|
||||||
genAcc1 := NewGenesisAccount(&authAcc1)
|
|
||||||
|
|
||||||
addr2 := sdk.AccAddress(ed25519.GenPrivKey().PubKey().Address())
|
|
||||||
authAcc2 := auth.NewBaseAccountWithAddress(addr2)
|
|
||||||
authAcc2.SetCoins(sdk.Coins{
|
|
||||||
sdk.NewInt64Coin("acoin", 150),
|
|
||||||
sdk.NewInt64Coin("bcoin", 150),
|
|
||||||
})
|
|
||||||
genAcc2 := NewGenesisAccount(&authAcc2)
|
|
||||||
|
|
||||||
genesisState.Accounts = []GenesisAccount{genAcc1, genAcc2}
|
|
||||||
require.True(t, genesisState.Accounts[0].AccountNumber > genesisState.Accounts[1].AccountNumber)
|
|
||||||
require.Equal(t, genesisState.Accounts[0].Coins[0].Denom, "bcoin")
|
|
||||||
require.Equal(t, genesisState.Accounts[0].Coins[1].Denom, "acoin")
|
|
||||||
require.Equal(t, genesisState.Accounts[1].Address, addr2)
|
|
||||||
genesisState.Sanitize()
|
|
||||||
require.False(t, genesisState.Accounts[0].AccountNumber > genesisState.Accounts[1].AccountNumber)
|
|
||||||
require.Equal(t, genesisState.Accounts[1].Address, addr1)
|
|
||||||
require.Equal(t, genesisState.Accounts[1].Coins[0].Denom, "acoin")
|
|
||||||
require.Equal(t, genesisState.Accounts[1].Coins[1].Denom, "bcoin")
|
|
||||||
}
|
|
@ -1,31 +0,0 @@
|
|||||||
package app
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
abci "github.com/tendermint/tendermint/abci/types"
|
|
||||||
|
|
||||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
|
||||||
)
|
|
||||||
|
|
||||||
func (app *App) assertRuntimeInvariants() {
|
|
||||||
ctx := app.NewContext(false, abci.Header{Height: app.LastBlockHeight() + 1})
|
|
||||||
app.assertRuntimeInvariantsOnContext(ctx)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (app *App) assertRuntimeInvariantsOnContext(ctx sdk.Context) {
|
|
||||||
start := time.Now()
|
|
||||||
invarRoutes := app.crisisKeeper.Routes()
|
|
||||||
for _, ir := range invarRoutes {
|
|
||||||
if err := ir.Invar(ctx); err != nil {
|
|
||||||
panic(fmt.Errorf("invariant broken: %s\n"+
|
|
||||||
"\tCRITICAL please submit the following transaction:\n"+
|
|
||||||
"\t\t kvcli tx crisis invariant-broken %v %v", err, ir.ModuleName, ir.Route))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
end := time.Now()
|
|
||||||
diff := end.Sub(start)
|
|
||||||
app.BaseApp.Logger().With("module", "invariants").Info(
|
|
||||||
"Asserted all invariants", "duration", diff, "height", app.LastBlockHeight())
|
|
||||||
}
|
|
658
app/sim_test.go
658
app/sim_test.go
@ -4,6 +4,7 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"io"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
"os"
|
"os"
|
||||||
@ -13,43 +14,63 @@ import (
|
|||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
|
|
||||||
abci "github.com/tendermint/tendermint/abci/types"
|
abci "github.com/tendermint/tendermint/abci/types"
|
||||||
"github.com/tendermint/tendermint/crypto/secp256k1"
|
|
||||||
dbm "github.com/tendermint/tendermint/libs/db"
|
dbm "github.com/tendermint/tendermint/libs/db"
|
||||||
"github.com/tendermint/tendermint/libs/log"
|
"github.com/tendermint/tendermint/libs/log"
|
||||||
tmtypes "github.com/tendermint/tendermint/types"
|
|
||||||
|
|
||||||
"github.com/cosmos/cosmos-sdk/baseapp"
|
"github.com/cosmos/cosmos-sdk/baseapp"
|
||||||
|
"github.com/cosmos/cosmos-sdk/simapp" // TODO replace with types from app/genesis.go ?
|
||||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||||
"github.com/cosmos/cosmos-sdk/x/auth"
|
|
||||||
authsim "github.com/cosmos/cosmos-sdk/x/auth/simulation"
|
authsim "github.com/cosmos/cosmos-sdk/x/auth/simulation"
|
||||||
"github.com/cosmos/cosmos-sdk/x/bank"
|
"github.com/cosmos/cosmos-sdk/x/bank"
|
||||||
banksim "github.com/cosmos/cosmos-sdk/x/bank/simulation"
|
|
||||||
distr "github.com/cosmos/cosmos-sdk/x/distribution"
|
|
||||||
distrsim "github.com/cosmos/cosmos-sdk/x/distribution/simulation"
|
distrsim "github.com/cosmos/cosmos-sdk/x/distribution/simulation"
|
||||||
"github.com/cosmos/cosmos-sdk/x/gov"
|
|
||||||
govsim "github.com/cosmos/cosmos-sdk/x/gov/simulation"
|
govsim "github.com/cosmos/cosmos-sdk/x/gov/simulation"
|
||||||
"github.com/cosmos/cosmos-sdk/x/mint"
|
paramsim "github.com/cosmos/cosmos-sdk/x/params/simulation"
|
||||||
"github.com/cosmos/cosmos-sdk/x/simulation"
|
"github.com/cosmos/cosmos-sdk/x/simulation"
|
||||||
"github.com/cosmos/cosmos-sdk/x/slashing"
|
|
||||||
slashingsim "github.com/cosmos/cosmos-sdk/x/slashing/simulation"
|
slashingsim "github.com/cosmos/cosmos-sdk/x/slashing/simulation"
|
||||||
"github.com/cosmos/cosmos-sdk/x/staking"
|
"github.com/cosmos/cosmos-sdk/x/staking"
|
||||||
stakingsim "github.com/cosmos/cosmos-sdk/x/staking/simulation"
|
stakingsim "github.com/cosmos/cosmos-sdk/x/staking/simulation"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// Simulation parameter constants
|
||||||
|
const (
|
||||||
|
StakePerAccount = "stake_per_account"
|
||||||
|
InitiallyBondedValidators = "initially_bonded_validators"
|
||||||
|
OpWeightDeductFee = "op_weight_deduct_fee"
|
||||||
|
OpWeightMsgSend = "op_weight_msg_send"
|
||||||
|
OpWeightSingleInputMsgMultiSend = "op_weight_single_input_msg_multisend"
|
||||||
|
OpWeightMsgSetWithdrawAddress = "op_weight_msg_set_withdraw_address"
|
||||||
|
OpWeightMsgWithdrawDelegationReward = "op_weight_msg_withdraw_delegation_reward"
|
||||||
|
OpWeightMsgWithdrawValidatorCommission = "op_weight_msg_withdraw_validator_commission"
|
||||||
|
OpWeightSubmitVotingSlashingTextProposal = "op_weight_submit_voting_slashing_text_proposal"
|
||||||
|
OpWeightSubmitVotingSlashingCommunitySpendProposal = "op_weight_submit_voting_slashing_community_spend_proposal"
|
||||||
|
OpWeightSubmitVotingSlashingParamChangeProposal = "op_weight_submit_voting_slashing_param_change_proposal"
|
||||||
|
OpWeightMsgDeposit = "op_weight_msg_deposit"
|
||||||
|
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"
|
||||||
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
genesisFile string
|
genesisFile string
|
||||||
seed int64
|
paramsFile string
|
||||||
numBlocks int
|
seed int64
|
||||||
blockSize int
|
numBlocks int
|
||||||
enabled bool
|
blockSize int
|
||||||
verbose bool
|
enabled bool
|
||||||
lean bool
|
verbose bool
|
||||||
commit bool
|
lean bool
|
||||||
period int
|
commit bool
|
||||||
|
period int
|
||||||
|
onOperation bool // TODO Remove in favor of binary search for invariant violation
|
||||||
|
allInvariants bool
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
flag.StringVar(&genesisFile, "SimulationGenesis", "", "custom simulation genesis file")
|
flag.StringVar(&genesisFile, "SimulationGenesis", "", "custom simulation genesis file; cannot be used with params file")
|
||||||
|
flag.StringVar(¶msFile, "SimulationParams", "", "custom simulation params file which overrides any random params; cannot be used with genesis")
|
||||||
flag.Int64Var(&seed, "SimulationSeed", 42, "simulation random seed")
|
flag.Int64Var(&seed, "SimulationSeed", 42, "simulation random seed")
|
||||||
flag.IntVar(&numBlocks, "SimulationNumBlocks", 500, "number of blocks")
|
flag.IntVar(&numBlocks, "SimulationNumBlocks", 500, "number of blocks")
|
||||||
flag.IntVar(&blockSize, "SimulationBlockSize", 200, "operations per block")
|
flag.IntVar(&blockSize, "SimulationBlockSize", 200, "operations per block")
|
||||||
@ -58,207 +79,95 @@ func init() {
|
|||||||
flag.BoolVar(&lean, "SimulationLean", false, "lean simulation log output")
|
flag.BoolVar(&lean, "SimulationLean", false, "lean simulation log output")
|
||||||
flag.BoolVar(&commit, "SimulationCommit", false, "have the simulation commit")
|
flag.BoolVar(&commit, "SimulationCommit", false, "have the simulation commit")
|
||||||
flag.IntVar(&period, "SimulationPeriod", 1, "run slow invariants only once every period assertions")
|
flag.IntVar(&period, "SimulationPeriod", 1, "run slow invariants only once every period assertions")
|
||||||
|
flag.BoolVar(&onOperation, "SimulateEveryOperation", false, "run slow invariants every operation")
|
||||||
|
flag.BoolVar(&allInvariants, "PrintAllInvariants", false, "print all invariants if a broken invariant is found")
|
||||||
}
|
}
|
||||||
|
|
||||||
// helper function for populating input for SimulateFromSeed
|
// helper function for populating input for SimulateFromSeed
|
||||||
func getSimulateFromSeedInput(tb testing.TB, app *App) (
|
func getSimulateFromSeedInput(tb testing.TB, w io.Writer, app *App) (
|
||||||
testing.TB, *baseapp.BaseApp, simulation.AppStateFn, int64,
|
testing.TB, io.Writer, *baseapp.BaseApp, simulation.AppStateFn, int64,
|
||||||
simulation.WeightedOperations, sdk.Invariants, int, int, bool, bool) {
|
simulation.WeightedOperations, sdk.Invariants, int, int, bool, bool, bool, bool, map[string]bool,
|
||||||
|
) {
|
||||||
|
|
||||||
return tb, app.BaseApp, appStateFn, seed,
|
return tb, w, app.BaseApp, appStateFn, seed,
|
||||||
testAndRunTxs(app), invariants(app), numBlocks, blockSize, commit, lean
|
testAndRunTxs(app), invariants(app), numBlocks, blockSize, commit,
|
||||||
|
lean, onOperation, allInvariants, app.ModuleAccountAddrs()
|
||||||
}
|
}
|
||||||
|
|
||||||
func appStateFromGenesisFileFn(r *rand.Rand, accs []simulation.Account, genesisTimestamp time.Time) (json.RawMessage, []simulation.Account, string) {
|
func appStateFn(
|
||||||
var genesis tmtypes.GenesisDoc
|
r *rand.Rand, accs []simulation.Account, genesisTimestamp time.Time,
|
||||||
|
) (appState json.RawMessage, simAccs []simulation.Account, chainID string) {
|
||||||
|
|
||||||
cdc := MakeCodec()
|
cdc := MakeCodec()
|
||||||
bytes, err := ioutil.ReadFile(genesisFile)
|
|
||||||
if err != nil {
|
switch {
|
||||||
panic(err)
|
case paramsFile != "" && genesisFile != "":
|
||||||
|
panic("cannot provide both a genesis file and a params file")
|
||||||
|
|
||||||
|
case genesisFile != "":
|
||||||
|
appState, simAccs, chainID = simapp.AppStateFromGenesisFileFn(r, accs, genesisTimestamp)
|
||||||
|
|
||||||
|
case paramsFile != "":
|
||||||
|
appParams := make(simulation.AppParams)
|
||||||
|
bz, err := ioutil.ReadFile(paramsFile)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
cdc.MustUnmarshalJSON(bz, &appParams)
|
||||||
|
appState, simAccs, chainID = appStateRandomizedFn(r, accs, genesisTimestamp, appParams)
|
||||||
|
|
||||||
|
default:
|
||||||
|
appParams := make(simulation.AppParams)
|
||||||
|
appState, simAccs, chainID = appStateRandomizedFn(r, accs, genesisTimestamp, appParams)
|
||||||
}
|
}
|
||||||
cdc.MustUnmarshalJSON(bytes, &genesis)
|
|
||||||
var appState GenesisState
|
return appState, simAccs, chainID
|
||||||
cdc.MustUnmarshalJSON(genesis.AppState, &appState)
|
|
||||||
var newAccs []simulation.Account
|
|
||||||
for _, acc := range appState.Accounts {
|
|
||||||
// Pick a random private key, since we don't know the actual key
|
|
||||||
// This should be fine as it's only used for mock Tendermint validators
|
|
||||||
// and these keys are never actually used to sign by mock Tendermint.
|
|
||||||
privkeySeed := make([]byte, 15)
|
|
||||||
r.Read(privkeySeed)
|
|
||||||
privKey := secp256k1.GenPrivKeySecp256k1(privkeySeed)
|
|
||||||
newAccs = append(newAccs, simulation.Account{privKey, privKey.PubKey(), acc.Address})
|
|
||||||
}
|
|
||||||
return genesis.AppState, newAccs, genesis.ChainID
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func appStateRandomizedFn(r *rand.Rand, accs []simulation.Account, genesisTimestamp time.Time) (json.RawMessage, []simulation.Account, string) {
|
// TODO refactor out random initialization code to the modules
|
||||||
|
func appStateRandomizedFn(
|
||||||
|
r *rand.Rand, accs []simulation.Account, genesisTimestamp time.Time, appParams simulation.AppParams,
|
||||||
|
) (json.RawMessage, []simulation.Account, string) {
|
||||||
|
|
||||||
var genesisAccounts []GenesisAccount
|
cdc := MakeCodec()
|
||||||
|
genesisState := simapp.NewDefaultGenesisState()
|
||||||
|
|
||||||
|
var (
|
||||||
|
amount int64
|
||||||
|
numInitiallyBonded int64
|
||||||
|
)
|
||||||
|
|
||||||
|
appParams.GetOrGenerate(cdc, StakePerAccount, &amount, r,
|
||||||
|
func(r *rand.Rand) { amount = int64(r.Intn(1e12)) })
|
||||||
|
appParams.GetOrGenerate(cdc, InitiallyBondedValidators, &amount, r,
|
||||||
|
func(r *rand.Rand) { numInitiallyBonded = int64(r.Intn(250)) })
|
||||||
|
|
||||||
amount := int64(r.Intn(1e12))
|
|
||||||
numInitiallyBonded := int64(r.Intn(250))
|
|
||||||
numAccs := int64(len(accs))
|
numAccs := int64(len(accs))
|
||||||
if numInitiallyBonded > numAccs {
|
if numInitiallyBonded > numAccs {
|
||||||
numInitiallyBonded = numAccs
|
numInitiallyBonded = numAccs
|
||||||
}
|
}
|
||||||
fmt.Printf("Selected randomly generated parameters for simulated genesis:\n"+
|
|
||||||
"\t{amount of stake per account: %v, initially bonded validators: %v}\n",
|
|
||||||
amount, numInitiallyBonded)
|
|
||||||
|
|
||||||
// randomly generate some genesis accounts
|
fmt.Printf(
|
||||||
for i, acc := range accs {
|
`Selected randomly generated parameters for simulated genesis:
|
||||||
coins := sdk.Coins{sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(amount))}
|
{
|
||||||
bacc := auth.NewBaseAccountWithAddress(acc.Address)
|
stake_per_account: "%v",
|
||||||
bacc.SetCoins(coins)
|
initially_bonded_validators: "%v"
|
||||||
|
}
|
||||||
|
`, amount, numInitiallyBonded,
|
||||||
|
)
|
||||||
|
|
||||||
var gacc GenesisAccount
|
simapp.GenGenesisAccounts(cdc, r, accs, genesisTimestamp, amount, numInitiallyBonded, genesisState)
|
||||||
|
simapp.GenAuthGenesisState(cdc, r, appParams, genesisState)
|
||||||
|
simapp.GenBankGenesisState(cdc, r, appParams, genesisState)
|
||||||
|
simapp.GenSupplyGenesisState(cdc, amount, numInitiallyBonded, int64(len(accs)), genesisState)
|
||||||
|
simapp.GenGovGenesisState(cdc, r, appParams, genesisState)
|
||||||
|
simapp.GenMintGenesisState(cdc, r, appParams, genesisState)
|
||||||
|
simapp.GenDistrGenesisState(cdc, r, appParams, genesisState)
|
||||||
|
stakingGen := simapp.GenStakingGenesisState(cdc, r, accs, amount, numAccs, numInitiallyBonded, appParams, genesisState)
|
||||||
|
simapp.GenSlashingGenesisState(cdc, r, stakingGen, appParams, genesisState)
|
||||||
|
|
||||||
// Only consider making a vesting account once the initial bonded validator
|
appState, err := MakeCodec().MarshalJSON(genesisState)
|
||||||
// set is exhausted due to needing to track DelegatedVesting.
|
|
||||||
if int64(i) > numInitiallyBonded && r.Intn(100) < 50 {
|
|
||||||
var (
|
|
||||||
vacc auth.VestingAccount
|
|
||||||
endTime int64
|
|
||||||
)
|
|
||||||
|
|
||||||
startTime := genesisTimestamp.Unix()
|
|
||||||
|
|
||||||
// Allow for some vesting accounts to vest very quickly while others very
|
|
||||||
// slowly.
|
|
||||||
if r.Intn(100) < 50 {
|
|
||||||
endTime = int64(simulation.RandIntBetween(r, int(startTime), int(startTime+(60*60*24*30))))
|
|
||||||
} else {
|
|
||||||
endTime = int64(simulation.RandIntBetween(r, int(startTime), int(startTime+(60*60*12))))
|
|
||||||
}
|
|
||||||
|
|
||||||
if startTime == endTime {
|
|
||||||
endTime += 1
|
|
||||||
}
|
|
||||||
|
|
||||||
if r.Intn(100) < 50 {
|
|
||||||
vacc = auth.NewContinuousVestingAccount(&bacc, startTime, endTime)
|
|
||||||
} else {
|
|
||||||
vacc = auth.NewDelayedVestingAccount(&bacc, endTime)
|
|
||||||
}
|
|
||||||
|
|
||||||
gacc = NewGenesisAccountI(vacc)
|
|
||||||
} else {
|
|
||||||
gacc = NewGenesisAccount(&bacc)
|
|
||||||
}
|
|
||||||
|
|
||||||
genesisAccounts = append(genesisAccounts, gacc)
|
|
||||||
}
|
|
||||||
|
|
||||||
authGenesis := auth.GenesisState{
|
|
||||||
Params: auth.Params{
|
|
||||||
MaxMemoCharacters: uint64(simulation.RandIntBetween(r, 100, 200)),
|
|
||||||
TxSigLimit: uint64(r.Intn(7) + 1),
|
|
||||||
TxSizeCostPerByte: uint64(simulation.RandIntBetween(r, 5, 15)),
|
|
||||||
SigVerifyCostED25519: uint64(simulation.RandIntBetween(r, 500, 1000)),
|
|
||||||
SigVerifyCostSecp256k1: uint64(simulation.RandIntBetween(r, 500, 1000)),
|
|
||||||
},
|
|
||||||
}
|
|
||||||
fmt.Printf("Selected randomly generated auth parameters:\n\t%+v\n", authGenesis)
|
|
||||||
|
|
||||||
bankGenesis := bank.NewGenesisState(r.Int63n(2) == 0)
|
|
||||||
fmt.Printf("Selected randomly generated bank parameters:\n\t%+v\n", bankGenesis)
|
|
||||||
|
|
||||||
// Random genesis states
|
|
||||||
vp := time.Duration(r.Intn(2*172800)) * time.Second
|
|
||||||
govGenesis := gov.GenesisState{
|
|
||||||
StartingProposalID: uint64(r.Intn(100)),
|
|
||||||
DepositParams: gov.DepositParams{
|
|
||||||
MinDeposit: sdk.Coins{sdk.NewInt64Coin(sdk.DefaultBondDenom, int64(r.Intn(1e3)))},
|
|
||||||
MaxDepositPeriod: vp,
|
|
||||||
},
|
|
||||||
VotingParams: gov.VotingParams{
|
|
||||||
VotingPeriod: vp,
|
|
||||||
},
|
|
||||||
TallyParams: gov.TallyParams{
|
|
||||||
Quorum: sdk.NewDecWithPrec(334, 3),
|
|
||||||
Threshold: sdk.NewDecWithPrec(5, 1),
|
|
||||||
Veto: sdk.NewDecWithPrec(334, 3),
|
|
||||||
},
|
|
||||||
}
|
|
||||||
fmt.Printf("Selected randomly generated governance parameters:\n\t%+v\n", govGenesis)
|
|
||||||
|
|
||||||
stakingGenesis := staking.GenesisState{
|
|
||||||
Pool: staking.InitialPool(),
|
|
||||||
Params: staking.Params{
|
|
||||||
UnbondingTime: time.Duration(simulation.RandIntBetween(r, 60, 60*60*24*3*2)) * time.Second,
|
|
||||||
MaxValidators: uint16(r.Intn(250) + 1),
|
|
||||||
BondDenom: sdk.DefaultBondDenom,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
fmt.Printf("Selected randomly generated staking parameters:\n\t%+v\n", stakingGenesis)
|
|
||||||
|
|
||||||
slashingGenesis := slashing.GenesisState{
|
|
||||||
Params: slashing.Params{
|
|
||||||
MaxEvidenceAge: stakingGenesis.Params.UnbondingTime,
|
|
||||||
SignedBlocksWindow: int64(simulation.RandIntBetween(r, 10, 1000)),
|
|
||||||
MinSignedPerWindow: sdk.NewDecWithPrec(int64(r.Intn(10)), 1),
|
|
||||||
DowntimeJailDuration: time.Duration(simulation.RandIntBetween(r, 60, 60*60*24)) * time.Second,
|
|
||||||
SlashFractionDoubleSign: sdk.NewDec(1).Quo(sdk.NewDec(int64(r.Intn(50) + 1))),
|
|
||||||
SlashFractionDowntime: sdk.NewDec(1).Quo(sdk.NewDec(int64(r.Intn(200) + 1))),
|
|
||||||
},
|
|
||||||
}
|
|
||||||
fmt.Printf("Selected randomly generated slashing parameters:\n\t%+v\n", slashingGenesis)
|
|
||||||
|
|
||||||
mintGenesis := mint.GenesisState{
|
|
||||||
Minter: mint.InitialMinter(
|
|
||||||
sdk.NewDecWithPrec(int64(r.Intn(99)), 2)),
|
|
||||||
Params: mint.NewParams(
|
|
||||||
sdk.DefaultBondDenom,
|
|
||||||
sdk.NewDecWithPrec(int64(r.Intn(99)), 2),
|
|
||||||
sdk.NewDecWithPrec(20, 2),
|
|
||||||
sdk.NewDecWithPrec(7, 2),
|
|
||||||
sdk.NewDecWithPrec(67, 2),
|
|
||||||
uint64(60*60*8766/5)),
|
|
||||||
}
|
|
||||||
fmt.Printf("Selected randomly generated minting parameters:\n\t%+v\n", mintGenesis)
|
|
||||||
|
|
||||||
var validators []staking.Validator
|
|
||||||
var delegations []staking.Delegation
|
|
||||||
|
|
||||||
valAddrs := make([]sdk.ValAddress, numInitiallyBonded)
|
|
||||||
for i := 0; i < int(numInitiallyBonded); i++ {
|
|
||||||
valAddr := sdk.ValAddress(accs[i].Address)
|
|
||||||
valAddrs[i] = valAddr
|
|
||||||
|
|
||||||
validator := staking.NewValidator(valAddr, accs[i].PubKey, staking.Description{})
|
|
||||||
validator.Tokens = sdk.NewInt(amount)
|
|
||||||
validator.DelegatorShares = sdk.NewDec(amount)
|
|
||||||
delegation := staking.Delegation{accs[i].Address, valAddr, sdk.NewDec(amount)}
|
|
||||||
validators = append(validators, validator)
|
|
||||||
delegations = append(delegations, delegation)
|
|
||||||
}
|
|
||||||
|
|
||||||
stakingGenesis.Pool.NotBondedTokens = sdk.NewInt((amount * numAccs) + (numInitiallyBonded * amount))
|
|
||||||
stakingGenesis.Validators = validators
|
|
||||||
stakingGenesis.Delegations = delegations
|
|
||||||
|
|
||||||
distrGenesis := distr.GenesisState{
|
|
||||||
FeePool: distr.InitialFeePool(),
|
|
||||||
CommunityTax: sdk.NewDecWithPrec(1, 2).Add(sdk.NewDecWithPrec(int64(r.Intn(30)), 2)),
|
|
||||||
BaseProposerReward: sdk.NewDecWithPrec(1, 2).Add(sdk.NewDecWithPrec(int64(r.Intn(30)), 2)),
|
|
||||||
BonusProposerReward: sdk.NewDecWithPrec(1, 2).Add(sdk.NewDecWithPrec(int64(r.Intn(30)), 2)),
|
|
||||||
}
|
|
||||||
fmt.Printf("Selected randomly generated distribution parameters:\n\t%+v\n", distrGenesis)
|
|
||||||
|
|
||||||
genesis := GenesisState{
|
|
||||||
Accounts: genesisAccounts,
|
|
||||||
AuthData: authGenesis,
|
|
||||||
BankData: bankGenesis,
|
|
||||||
StakingData: stakingGenesis,
|
|
||||||
MintData: mintGenesis,
|
|
||||||
DistrData: distrGenesis,
|
|
||||||
SlashingData: slashingGenesis,
|
|
||||||
GovData: govGenesis,
|
|
||||||
}
|
|
||||||
|
|
||||||
// Marshal genesis
|
|
||||||
appState, err := MakeCodec().MarshalJSON(genesis)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
@ -266,39 +175,206 @@ func appStateRandomizedFn(r *rand.Rand, accs []simulation.Account, genesisTimest
|
|||||||
return appState, accs, "simulation"
|
return appState, accs, "simulation"
|
||||||
}
|
}
|
||||||
|
|
||||||
func appStateFn(r *rand.Rand, accs []simulation.Account, genesisTimestamp time.Time) (json.RawMessage, []simulation.Account, string) {
|
|
||||||
if genesisFile != "" {
|
|
||||||
return appStateFromGenesisFileFn(r, accs, genesisTimestamp)
|
|
||||||
}
|
|
||||||
return appStateRandomizedFn(r, accs, genesisTimestamp)
|
|
||||||
}
|
|
||||||
|
|
||||||
func testAndRunTxs(app *App) []simulation.WeightedOperation {
|
func testAndRunTxs(app *App) []simulation.WeightedOperation {
|
||||||
|
cdc := MakeCodec()
|
||||||
|
ap := make(simulation.AppParams)
|
||||||
|
|
||||||
|
if paramsFile != "" {
|
||||||
|
bz, err := ioutil.ReadFile(paramsFile)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
cdc.MustUnmarshalJSON(bz, &ap)
|
||||||
|
}
|
||||||
|
|
||||||
return []simulation.WeightedOperation{
|
return []simulation.WeightedOperation{
|
||||||
{5, authsim.SimulateDeductFee(app.accountKeeper, app.feeCollectionKeeper)},
|
{
|
||||||
{100, banksim.SimulateMsgSend(app.accountKeeper, app.bankKeeper)},
|
func(_ *rand.Rand) int {
|
||||||
{10, banksim.SimulateSingleInputMsgMultiSend(app.accountKeeper, app.bankKeeper)},
|
var v int
|
||||||
{50, distrsim.SimulateMsgSetWithdrawAddress(app.accountKeeper, app.distrKeeper)},
|
ap.GetOrGenerate(cdc, OpWeightDeductFee, &v, nil,
|
||||||
{50, distrsim.SimulateMsgWithdrawDelegatorReward(app.accountKeeper, app.distrKeeper)},
|
func(_ *rand.Rand) {
|
||||||
{50, distrsim.SimulateMsgWithdrawValidatorCommission(app.accountKeeper, app.distrKeeper)},
|
v = 5
|
||||||
{5, govsim.SimulateSubmittingVotingAndSlashingForProposal(app.govKeeper)},
|
})
|
||||||
{100, govsim.SimulateMsgDeposit(app.govKeeper)},
|
return v
|
||||||
{100, stakingsim.SimulateMsgCreateValidator(app.accountKeeper, app.stakingKeeper)},
|
}(nil),
|
||||||
{5, stakingsim.SimulateMsgEditValidator(app.stakingKeeper)},
|
authsim.SimulateDeductFee(app.accountKeeper, app.supplyKeeper),
|
||||||
{100, stakingsim.SimulateMsgDelegate(app.accountKeeper, app.stakingKeeper)},
|
},
|
||||||
{100, stakingsim.SimulateMsgUndelegate(app.accountKeeper, app.stakingKeeper)},
|
{
|
||||||
{100, stakingsim.SimulateMsgBeginRedelegate(app.accountKeeper, app.stakingKeeper)},
|
func(_ *rand.Rand) int {
|
||||||
{100, slashingsim.SimulateMsgUnjail(app.slashingKeeper)},
|
var v int
|
||||||
|
ap.GetOrGenerate(cdc, OpWeightMsgSend, &v, nil,
|
||||||
|
func(_ *rand.Rand) {
|
||||||
|
v = 100
|
||||||
|
})
|
||||||
|
return v
|
||||||
|
}(nil),
|
||||||
|
bank.SimulateMsgSend(app.accountKeeper, app.bankKeeper),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
func(_ *rand.Rand) int {
|
||||||
|
var v int
|
||||||
|
ap.GetOrGenerate(cdc, OpWeightSingleInputMsgMultiSend, &v, nil,
|
||||||
|
func(_ *rand.Rand) {
|
||||||
|
v = 10
|
||||||
|
})
|
||||||
|
return v
|
||||||
|
}(nil),
|
||||||
|
bank.SimulateSingleInputMsgMultiSend(app.accountKeeper, app.bankKeeper),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
func(_ *rand.Rand) int {
|
||||||
|
var v int
|
||||||
|
ap.GetOrGenerate(cdc, OpWeightMsgSetWithdrawAddress, &v, nil,
|
||||||
|
func(_ *rand.Rand) {
|
||||||
|
v = 50
|
||||||
|
})
|
||||||
|
return v
|
||||||
|
}(nil),
|
||||||
|
distrsim.SimulateMsgSetWithdrawAddress(app.accountKeeper, app.distrKeeper),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
func(_ *rand.Rand) int {
|
||||||
|
var v int
|
||||||
|
ap.GetOrGenerate(cdc, OpWeightMsgWithdrawDelegationReward, &v, nil,
|
||||||
|
func(_ *rand.Rand) {
|
||||||
|
v = 50
|
||||||
|
})
|
||||||
|
return v
|
||||||
|
}(nil),
|
||||||
|
distrsim.SimulateMsgWithdrawDelegatorReward(app.accountKeeper, app.distrKeeper),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
func(_ *rand.Rand) int {
|
||||||
|
var v int
|
||||||
|
ap.GetOrGenerate(cdc, OpWeightMsgWithdrawValidatorCommission, &v, nil,
|
||||||
|
func(_ *rand.Rand) {
|
||||||
|
v = 50
|
||||||
|
})
|
||||||
|
return v
|
||||||
|
}(nil),
|
||||||
|
distrsim.SimulateMsgWithdrawValidatorCommission(app.accountKeeper, app.distrKeeper),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
func(_ *rand.Rand) int {
|
||||||
|
var v int
|
||||||
|
ap.GetOrGenerate(cdc, OpWeightSubmitVotingSlashingTextProposal, &v, nil,
|
||||||
|
func(_ *rand.Rand) {
|
||||||
|
v = 5
|
||||||
|
})
|
||||||
|
return v
|
||||||
|
}(nil),
|
||||||
|
govsim.SimulateSubmittingVotingAndSlashingForProposal(app.govKeeper, govsim.SimulateTextProposalContent),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
func(_ *rand.Rand) int {
|
||||||
|
var v int
|
||||||
|
ap.GetOrGenerate(cdc, OpWeightSubmitVotingSlashingCommunitySpendProposal, &v, nil,
|
||||||
|
func(_ *rand.Rand) {
|
||||||
|
v = 5
|
||||||
|
})
|
||||||
|
return v
|
||||||
|
}(nil),
|
||||||
|
govsim.SimulateSubmittingVotingAndSlashingForProposal(app.govKeeper, distrsim.SimulateCommunityPoolSpendProposalContent(app.distrKeeper)),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
func(_ *rand.Rand) int {
|
||||||
|
var v int
|
||||||
|
ap.GetOrGenerate(cdc, OpWeightSubmitVotingSlashingParamChangeProposal, &v, nil,
|
||||||
|
func(_ *rand.Rand) {
|
||||||
|
v = 5
|
||||||
|
})
|
||||||
|
return v
|
||||||
|
}(nil),
|
||||||
|
govsim.SimulateSubmittingVotingAndSlashingForProposal(app.govKeeper, paramsim.SimulateParamChangeProposalContent),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
func(_ *rand.Rand) int {
|
||||||
|
var v int
|
||||||
|
ap.GetOrGenerate(cdc, OpWeightMsgDeposit, &v, nil,
|
||||||
|
func(_ *rand.Rand) {
|
||||||
|
v = 100
|
||||||
|
})
|
||||||
|
return v
|
||||||
|
}(nil),
|
||||||
|
govsim.SimulateMsgDeposit(app.govKeeper),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
func(_ *rand.Rand) int {
|
||||||
|
var v int
|
||||||
|
ap.GetOrGenerate(cdc, OpWeightMsgCreateValidator, &v, nil,
|
||||||
|
func(_ *rand.Rand) {
|
||||||
|
v = 100
|
||||||
|
})
|
||||||
|
return v
|
||||||
|
}(nil),
|
||||||
|
stakingsim.SimulateMsgCreateValidator(app.accountKeeper, app.stakingKeeper),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
func(_ *rand.Rand) int {
|
||||||
|
var v int
|
||||||
|
ap.GetOrGenerate(cdc, OpWeightMsgEditValidator, &v, nil,
|
||||||
|
func(_ *rand.Rand) {
|
||||||
|
v = 5
|
||||||
|
})
|
||||||
|
return v
|
||||||
|
}(nil),
|
||||||
|
stakingsim.SimulateMsgEditValidator(app.stakingKeeper),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
func(_ *rand.Rand) int {
|
||||||
|
var v int
|
||||||
|
ap.GetOrGenerate(cdc, OpWeightMsgDelegate, &v, nil,
|
||||||
|
func(_ *rand.Rand) {
|
||||||
|
v = 100
|
||||||
|
})
|
||||||
|
return v
|
||||||
|
}(nil),
|
||||||
|
stakingsim.SimulateMsgDelegate(app.accountKeeper, app.stakingKeeper),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
func(_ *rand.Rand) int {
|
||||||
|
var v int
|
||||||
|
ap.GetOrGenerate(cdc, OpWeightMsgUndelegate, &v, nil,
|
||||||
|
func(_ *rand.Rand) {
|
||||||
|
v = 100
|
||||||
|
})
|
||||||
|
return v
|
||||||
|
}(nil),
|
||||||
|
stakingsim.SimulateMsgUndelegate(app.accountKeeper, app.stakingKeeper),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
func(_ *rand.Rand) int {
|
||||||
|
var v int
|
||||||
|
ap.GetOrGenerate(cdc, OpWeightMsgBeginRedelegate, &v, nil,
|
||||||
|
func(_ *rand.Rand) {
|
||||||
|
v = 100
|
||||||
|
})
|
||||||
|
return v
|
||||||
|
}(nil),
|
||||||
|
stakingsim.SimulateMsgBeginRedelegate(app.accountKeeper, app.stakingKeeper),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
func(_ *rand.Rand) int {
|
||||||
|
var v int
|
||||||
|
ap.GetOrGenerate(cdc, OpWeightMsgUnjail, &v, nil,
|
||||||
|
func(_ *rand.Rand) {
|
||||||
|
v = 100
|
||||||
|
})
|
||||||
|
return v
|
||||||
|
}(nil),
|
||||||
|
slashingsim.SimulateMsgUnjail(app.slashingKeeper),
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func invariants(app *App) []sdk.Invariant {
|
func invariants(app *App) []sdk.Invariant {
|
||||||
return []sdk.Invariant{
|
// TODO: fix PeriodicInvariants, it doesn't seem to call individual invariants for a period of 1
|
||||||
simulation.PeriodicInvariant(bank.NonnegativeBalanceInvariant(app.accountKeeper), period, 0),
|
// Ref: https://github.com/cosmos/cosmos-sdk/issues/4631
|
||||||
simulation.PeriodicInvariant(distr.AllInvariants(app.distrKeeper, app.stakingKeeper), period, 0),
|
if period == 1 {
|
||||||
simulation.PeriodicInvariant(staking.AllInvariants(app.stakingKeeper, app.feeCollectionKeeper,
|
return app.crisisKeeper.Invariants()
|
||||||
app.distrKeeper, app.accountKeeper), period, 0),
|
|
||||||
}
|
}
|
||||||
|
return simulation.PeriodicInvariants(app.crisisKeeper.Invariants(), period, 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Pass this in as an option to use a dbStoreAdapter instead of an IAVLStore for simulation speed.
|
// Pass this in as an option to use a dbStoreAdapter instead of an IAVLStore for simulation speed.
|
||||||
@ -307,13 +383,13 @@ func fauxMerkleModeOpt(bapp *baseapp.BaseApp) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Profile with:
|
// Profile with:
|
||||||
// /usr/local/go/bin/go test -benchmem -run=^$ github.com/cosmos/cosmos-sdk/cmd/gaia/app -bench ^BenchmarkFullGaiaSimulation$ -SimulationCommit=true -cpuprofile cpu.out
|
// /usr/local/go/bin/go test -benchmem -run=^$ github.com/cosmos/cosmos-sdk/GaiaApp -bench ^BenchmarkFullAppSimulation$ -SimulationCommit=true -cpuprofile cpu.out
|
||||||
func BenchmarkFullGaiaSimulation(b *testing.B) {
|
// TODO does this work
|
||||||
// Setup Gaia application
|
func BenchmarkFullAppSimulation(b *testing.B) {
|
||||||
logger := log.NewNopLogger()
|
logger := log.NewNopLogger()
|
||||||
|
|
||||||
var db dbm.DB
|
var db dbm.DB
|
||||||
dir, _ := ioutil.TempDir("", "goleveldb-gaia-sim")
|
dir, _ := ioutil.TempDir("", "goleveldb-app-sim")
|
||||||
db, _ = sdk.NewLevelDB("Simulation", dir)
|
db, _ = sdk.NewLevelDB("Simulation", dir)
|
||||||
defer func() {
|
defer func() {
|
||||||
db.Close()
|
db.Close()
|
||||||
@ -323,7 +399,7 @@ func BenchmarkFullGaiaSimulation(b *testing.B) {
|
|||||||
|
|
||||||
// Run randomized simulation
|
// Run randomized simulation
|
||||||
// TODO parameterize numbers, save for a later PR
|
// TODO parameterize numbers, save for a later PR
|
||||||
_, err := simulation.SimulateFromSeed(getSimulateFromSeedInput(b, app))
|
_, err := simulation.SimulateFromSeed(getSimulateFromSeedInput(b, os.Stdout, app))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println(err)
|
fmt.Println(err)
|
||||||
b.Fail()
|
b.Fail()
|
||||||
@ -335,30 +411,33 @@ func BenchmarkFullGaiaSimulation(b *testing.B) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestFullGaiaSimulation(t *testing.T) {
|
func TestFullAppSimulation(t *testing.T) {
|
||||||
if !enabled {
|
if !enabled {
|
||||||
t.Skip("Skipping Gaia simulation")
|
t.Skip("Skipping application simulation")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Setup Gaia application
|
|
||||||
var logger log.Logger
|
var logger log.Logger
|
||||||
|
|
||||||
if verbose {
|
if verbose {
|
||||||
logger = log.TestingLogger()
|
logger = log.TestingLogger()
|
||||||
} else {
|
} else {
|
||||||
logger = log.NewNopLogger()
|
logger = log.NewNopLogger()
|
||||||
}
|
}
|
||||||
|
|
||||||
var db dbm.DB
|
var db dbm.DB
|
||||||
dir, _ := ioutil.TempDir("", "goleveldb-gaia-sim")
|
dir, _ := ioutil.TempDir("", "goleveldb-app-sim")
|
||||||
db, _ = sdk.NewLevelDB("Simulation", dir)
|
db, _ = sdk.NewLevelDB("Simulation", dir)
|
||||||
|
|
||||||
defer func() {
|
defer func() {
|
||||||
db.Close()
|
db.Close()
|
||||||
os.RemoveAll(dir)
|
os.RemoveAll(dir)
|
||||||
}()
|
}()
|
||||||
|
|
||||||
app := NewApp(logger, db, nil, true, 0, fauxMerkleModeOpt)
|
app := NewApp(logger, db, nil, true, 0, fauxMerkleModeOpt)
|
||||||
require.Equal(t, "kava", app.Name())
|
require.Equal(t, "kava", app.Name())
|
||||||
|
|
||||||
// Run randomized simulation
|
// Run randomized simulation
|
||||||
_, err := simulation.SimulateFromSeed(getSimulateFromSeedInput(t, app))
|
_, err := simulation.SimulateFromSeed(getSimulateFromSeedInput(t, os.Stdout, app))
|
||||||
if commit {
|
if commit {
|
||||||
// for memdb:
|
// for memdb:
|
||||||
// fmt.Println("Database Size", db.Stats()["database.size"])
|
// fmt.Println("Database Size", db.Stats()["database.size"])
|
||||||
@ -366,33 +445,36 @@ func TestFullGaiaSimulation(t *testing.T) {
|
|||||||
fmt.Println(db.Stats()["leveldb.stats"])
|
fmt.Println(db.Stats()["leveldb.stats"])
|
||||||
fmt.Println("GoLevelDB cached block size", db.Stats()["leveldb.cachedblock"])
|
fmt.Println("GoLevelDB cached block size", db.Stats()["leveldb.cachedblock"])
|
||||||
}
|
}
|
||||||
|
|
||||||
require.Nil(t, err)
|
require.Nil(t, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestGaiaImportExport(t *testing.T) {
|
func TestAppImportExport(t *testing.T) {
|
||||||
if !enabled {
|
if !enabled {
|
||||||
t.Skip("Skipping Gaia import/export simulation")
|
t.Skip("Skipping application import/export simulation")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Setup Gaia application
|
|
||||||
var logger log.Logger
|
var logger log.Logger
|
||||||
if verbose {
|
if verbose {
|
||||||
logger = log.TestingLogger()
|
logger = log.TestingLogger()
|
||||||
} else {
|
} else {
|
||||||
logger = log.NewNopLogger()
|
logger = log.NewNopLogger()
|
||||||
}
|
}
|
||||||
|
|
||||||
var db dbm.DB
|
var db dbm.DB
|
||||||
dir, _ := ioutil.TempDir("", "goleveldb-gaia-sim")
|
dir, _ := ioutil.TempDir("", "goleveldb-app-sim")
|
||||||
db, _ = sdk.NewLevelDB("Simulation", dir)
|
db, _ = sdk.NewLevelDB("Simulation", dir)
|
||||||
|
|
||||||
defer func() {
|
defer func() {
|
||||||
db.Close()
|
db.Close()
|
||||||
os.RemoveAll(dir)
|
os.RemoveAll(dir)
|
||||||
}()
|
}()
|
||||||
|
|
||||||
app := NewApp(logger, db, nil, true, 0, fauxMerkleModeOpt)
|
app := NewApp(logger, db, nil, true, 0, fauxMerkleModeOpt)
|
||||||
require.Equal(t, "kava", app.Name())
|
require.Equal(t, "kava", app.Name())
|
||||||
|
|
||||||
// Run randomized simulation
|
// Run randomized simulation
|
||||||
_, err := simulation.SimulateFromSeed(getSimulateFromSeedInput(t, app))
|
_, err := simulation.SimulateFromSeed(getSimulateFromSeedInput(t, os.Stdout, app))
|
||||||
|
|
||||||
if commit {
|
if commit {
|
||||||
// for memdb:
|
// for memdb:
|
||||||
@ -401,37 +483,43 @@ func TestGaiaImportExport(t *testing.T) {
|
|||||||
fmt.Println(db.Stats()["leveldb.stats"])
|
fmt.Println(db.Stats()["leveldb.stats"])
|
||||||
fmt.Println("GoLevelDB cached block size", db.Stats()["leveldb.cachedblock"])
|
fmt.Println("GoLevelDB cached block size", db.Stats()["leveldb.cachedblock"])
|
||||||
}
|
}
|
||||||
require.Nil(t, err)
|
|
||||||
|
|
||||||
|
require.Nil(t, err)
|
||||||
fmt.Printf("Exporting genesis...\n")
|
fmt.Printf("Exporting genesis...\n")
|
||||||
|
|
||||||
appState, _, err := app.ExportAppStateAndValidators(false, []string{})
|
appState, _, err := app.ExportAppStateAndValidators(false, []string{})
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
fmt.Printf("Importing genesis...\n")
|
fmt.Printf("Importing genesis...\n")
|
||||||
|
|
||||||
newDir, _ := ioutil.TempDir("", "goleveldb-gaia-sim-2")
|
newDir, _ := ioutil.TempDir("", "goleveldb-app-sim-2")
|
||||||
newDB, _ := sdk.NewLevelDB("Simulation-2", dir)
|
newDB, _ := sdk.NewLevelDB("Simulation-2", dir)
|
||||||
|
|
||||||
defer func() {
|
defer func() {
|
||||||
newDB.Close()
|
newDB.Close()
|
||||||
os.RemoveAll(newDir)
|
os.RemoveAll(newDir)
|
||||||
}()
|
}()
|
||||||
|
|
||||||
newApp := NewApp(log.NewNopLogger(), newDB, nil, true, 0, fauxMerkleModeOpt)
|
newApp := NewApp(log.NewNopLogger(), newDB, nil, true, 0, fauxMerkleModeOpt)
|
||||||
require.Equal(t, "kava", newApp.Name())
|
require.Equal(t, "kava", newApp.Name())
|
||||||
var genesisState GenesisState
|
|
||||||
|
var genesisState simapp.GenesisState
|
||||||
err = app.cdc.UnmarshalJSON(appState, &genesisState)
|
err = app.cdc.UnmarshalJSON(appState, &genesisState)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
ctxB := newApp.NewContext(true, abci.Header{})
|
ctxB := newApp.NewContext(true, abci.Header{})
|
||||||
newApp.initFromGenesisState(ctxB, genesisState)
|
newApp.mm.InitGenesis(ctxB, genesisState)
|
||||||
|
|
||||||
fmt.Printf("Comparing stores...\n")
|
fmt.Printf("Comparing stores...\n")
|
||||||
ctxA := app.NewContext(true, abci.Header{})
|
ctxA := app.NewContext(true, abci.Header{})
|
||||||
|
|
||||||
type StoreKeysPrefixes struct {
|
type StoreKeysPrefixes struct {
|
||||||
A sdk.StoreKey
|
A sdk.StoreKey
|
||||||
B sdk.StoreKey
|
B sdk.StoreKey
|
||||||
Prefixes [][]byte
|
Prefixes [][]byte
|
||||||
}
|
}
|
||||||
|
|
||||||
storeKeysPrefixes := []StoreKeysPrefixes{
|
storeKeysPrefixes := []StoreKeysPrefixes{
|
||||||
{app.keyMain, newApp.keyMain, [][]byte{}},
|
{app.keyMain, newApp.keyMain, [][]byte{}},
|
||||||
{app.keyAccount, newApp.keyAccount, [][]byte{}},
|
{app.keyAccount, newApp.keyAccount, [][]byte{}},
|
||||||
@ -440,10 +528,11 @@ func TestGaiaImportExport(t *testing.T) {
|
|||||||
{app.keySlashing, newApp.keySlashing, [][]byte{}},
|
{app.keySlashing, newApp.keySlashing, [][]byte{}},
|
||||||
{app.keyMint, newApp.keyMint, [][]byte{}},
|
{app.keyMint, newApp.keyMint, [][]byte{}},
|
||||||
{app.keyDistr, newApp.keyDistr, [][]byte{}},
|
{app.keyDistr, newApp.keyDistr, [][]byte{}},
|
||||||
{app.keyFeeCollection, newApp.keyFeeCollection, [][]byte{}},
|
{app.keySupply, newApp.keySupply, [][]byte{}},
|
||||||
{app.keyParams, newApp.keyParams, [][]byte{}},
|
{app.keyParams, newApp.keyParams, [][]byte{}},
|
||||||
{app.keyGov, newApp.keyGov, [][]byte{}},
|
{app.keyGov, newApp.keyGov, [][]byte{}},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, storeKeysPrefix := range storeKeysPrefixes {
|
for _, storeKeysPrefix := range storeKeysPrefixes {
|
||||||
storeKeyA := storeKeysPrefix.A
|
storeKeyA := storeKeysPrefix.A
|
||||||
storeKeyB := storeKeysPrefix.B
|
storeKeyB := storeKeysPrefix.B
|
||||||
@ -452,37 +541,36 @@ func TestGaiaImportExport(t *testing.T) {
|
|||||||
storeB := ctxB.KVStore(storeKeyB)
|
storeB := ctxB.KVStore(storeKeyB)
|
||||||
kvA, kvB, count, equal := sdk.DiffKVStores(storeA, storeB, prefixes)
|
kvA, kvB, count, equal := sdk.DiffKVStores(storeA, storeB, prefixes)
|
||||||
fmt.Printf("Compared %d key/value pairs between %s and %s\n", count, storeKeyA, storeKeyB)
|
fmt.Printf("Compared %d key/value pairs between %s and %s\n", count, storeKeyA, storeKeyB)
|
||||||
require.True(t, equal,
|
require.True(t, equal, simapp.GetSimulationLog(storeKeyA.Name(), app.cdc, newApp.cdc, kvA, kvB))
|
||||||
"unequal stores: %s / %s:\nstore A %X => %X\nstore B %X => %X",
|
|
||||||
storeKeyA, storeKeyB, kvA.Key, kvA.Value, kvB.Key, kvB.Value,
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestGaiaSimulationAfterImport(t *testing.T) {
|
func TestAppSimulationAfterImport(t *testing.T) {
|
||||||
if !enabled {
|
if !enabled {
|
||||||
t.Skip("Skipping Gaia simulation after import")
|
t.Skip("Skipping application simulation after import")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Setup Gaia application
|
|
||||||
var logger log.Logger
|
var logger log.Logger
|
||||||
if verbose {
|
if verbose {
|
||||||
logger = log.TestingLogger()
|
logger = log.TestingLogger()
|
||||||
} else {
|
} else {
|
||||||
logger = log.NewNopLogger()
|
logger = log.NewNopLogger()
|
||||||
}
|
}
|
||||||
dir, _ := ioutil.TempDir("", "goleveldb-gaia-sim")
|
|
||||||
|
dir, _ := ioutil.TempDir("", "goleveldb-app-sim")
|
||||||
db, _ := sdk.NewLevelDB("Simulation", dir)
|
db, _ := sdk.NewLevelDB("Simulation", dir)
|
||||||
|
|
||||||
defer func() {
|
defer func() {
|
||||||
db.Close()
|
db.Close()
|
||||||
os.RemoveAll(dir)
|
os.RemoveAll(dir)
|
||||||
}()
|
}()
|
||||||
|
|
||||||
app := NewApp(logger, db, nil, true, 0, fauxMerkleModeOpt)
|
app := NewApp(logger, db, nil, true, 0, fauxMerkleModeOpt)
|
||||||
require.Equal(t, "kava", app.Name())
|
require.Equal(t, "kava", app.Name())
|
||||||
|
|
||||||
// Run randomized simulation
|
// Run randomized simulation
|
||||||
stopEarly, err := simulation.SimulateFromSeed(getSimulateFromSeedInput(t, app))
|
stopEarly, err := simulation.SimulateFromSeed(getSimulateFromSeedInput(t, os.Stdout, app))
|
||||||
|
|
||||||
if commit {
|
if commit {
|
||||||
// for memdb:
|
// for memdb:
|
||||||
@ -491,6 +579,7 @@ func TestGaiaSimulationAfterImport(t *testing.T) {
|
|||||||
fmt.Println(db.Stats()["leveldb.stats"])
|
fmt.Println(db.Stats()["leveldb.stats"])
|
||||||
fmt.Println("GoLevelDB cached block size", db.Stats()["leveldb.cachedblock"])
|
fmt.Println("GoLevelDB cached block size", db.Stats()["leveldb.cachedblock"])
|
||||||
}
|
}
|
||||||
|
|
||||||
require.Nil(t, err)
|
require.Nil(t, err)
|
||||||
|
|
||||||
if stopEarly {
|
if stopEarly {
|
||||||
@ -508,12 +597,14 @@ func TestGaiaSimulationAfterImport(t *testing.T) {
|
|||||||
|
|
||||||
fmt.Printf("Importing genesis...\n")
|
fmt.Printf("Importing genesis...\n")
|
||||||
|
|
||||||
newDir, _ := ioutil.TempDir("", "goleveldb-gaia-sim-2")
|
newDir, _ := ioutil.TempDir("", "goleveldb-app-sim-2")
|
||||||
newDB, _ := sdk.NewLevelDB("Simulation-2", dir)
|
newDB, _ := sdk.NewLevelDB("Simulation-2", dir)
|
||||||
|
|
||||||
defer func() {
|
defer func() {
|
||||||
newDB.Close()
|
newDB.Close()
|
||||||
os.RemoveAll(newDir)
|
os.RemoveAll(newDir)
|
||||||
}()
|
}()
|
||||||
|
|
||||||
newApp := NewApp(log.NewNopLogger(), newDB, nil, true, 0, fauxMerkleModeOpt)
|
newApp := NewApp(log.NewNopLogger(), newDB, nil, true, 0, fauxMerkleModeOpt)
|
||||||
require.Equal(t, "kava", newApp.Name())
|
require.Equal(t, "kava", newApp.Name())
|
||||||
newApp.InitChain(abci.RequestInitChain{
|
newApp.InitChain(abci.RequestInitChain{
|
||||||
@ -521,16 +612,15 @@ func TestGaiaSimulationAfterImport(t *testing.T) {
|
|||||||
})
|
})
|
||||||
|
|
||||||
// Run randomized simulation on imported app
|
// Run randomized simulation on imported app
|
||||||
_, err = simulation.SimulateFromSeed(getSimulateFromSeedInput(t, newApp))
|
_, err = simulation.SimulateFromSeed(getSimulateFromSeedInput(t, os.Stdout, newApp))
|
||||||
require.Nil(t, err)
|
require.Nil(t, err)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Make another test for the fuzzer itself, which just has noOp txs
|
// TODO: Make another test for the fuzzer itself, which just has noOp txs
|
||||||
// and doesn't depend on gaia
|
// and doesn't depend on the application.
|
||||||
func TestAppStateDeterminism(t *testing.T) {
|
func TestAppStateDeterminism(t *testing.T) {
|
||||||
if !enabled {
|
if !enabled {
|
||||||
t.Skip("Skipping Gaia simulation")
|
t.Skip("Skipping application simulation")
|
||||||
}
|
}
|
||||||
|
|
||||||
numSeeds := 3
|
numSeeds := 3
|
||||||
@ -544,21 +634,65 @@ func TestAppStateDeterminism(t *testing.T) {
|
|||||||
db := dbm.NewMemDB()
|
db := dbm.NewMemDB()
|
||||||
app := NewApp(logger, db, nil, true, 0)
|
app := NewApp(logger, db, nil, true, 0)
|
||||||
|
|
||||||
// Run randomized simulation
|
// run randomized simulation
|
||||||
simulation.SimulateFromSeed(
|
simulation.SimulateFromSeed(
|
||||||
t, app.BaseApp, appStateFn, seed,
|
t, os.Stdout, app.BaseApp, appStateFn, seed,
|
||||||
testAndRunTxs(app),
|
testAndRunTxs(app),
|
||||||
[]sdk.Invariant{},
|
[]sdk.Invariant{},
|
||||||
50,
|
50,
|
||||||
100,
|
100,
|
||||||
true,
|
true,
|
||||||
false,
|
false,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
app.ModuleAccountAddrs(),
|
||||||
)
|
)
|
||||||
|
|
||||||
appHash := app.LastCommitID().Hash
|
appHash := app.LastCommitID().Hash
|
||||||
appHashList[j] = appHash
|
appHashList[j] = appHash
|
||||||
}
|
}
|
||||||
|
|
||||||
for k := 1; k < numTimesToRunPerSeed; k++ {
|
for k := 1; k < numTimesToRunPerSeed; k++ {
|
||||||
require.Equal(t, appHashList[0], appHashList[k], "appHash list: %v", appHashList)
|
require.Equal(t, appHashList[0], appHashList[k], "appHash list: %v", appHashList)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func BenchmarkInvariants(b *testing.B) {
|
||||||
|
logger := log.NewNopLogger()
|
||||||
|
dir, _ := ioutil.TempDir("", "goleveldb-app-invariant-bench")
|
||||||
|
db, _ := sdk.NewLevelDB("simulation", dir)
|
||||||
|
|
||||||
|
defer func() {
|
||||||
|
db.Close()
|
||||||
|
os.RemoveAll(dir)
|
||||||
|
}()
|
||||||
|
|
||||||
|
app := NewApp(logger, db, nil, true, 0)
|
||||||
|
|
||||||
|
// 2. Run parameterized simulation (w/o invariants)
|
||||||
|
_, err := simulation.SimulateFromSeed(
|
||||||
|
b, ioutil.Discard, app.BaseApp, appStateFn, seed, testAndRunTxs(app),
|
||||||
|
[]sdk.Invariant{}, numBlocks, blockSize, commit, lean, onOperation, false,
|
||||||
|
app.ModuleAccountAddrs(),
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
b.FailNow()
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx := app.NewContext(true, abci.Header{Height: app.LastBlockHeight() + 1})
|
||||||
|
|
||||||
|
// 3. Benchmark each invariant separately
|
||||||
|
//
|
||||||
|
// NOTE: We use the crisis keeper as it has all the invariants registered with
|
||||||
|
// their respective metadata which makes it useful for testing/benchmarking.
|
||||||
|
for _, cr := range app.crisisKeeper.Routes() {
|
||||||
|
b.Run(fmt.Sprintf("%s/%s", cr.ModuleName, cr.Route), func(b *testing.B) {
|
||||||
|
if res, stop := cr.Invar(ctx); stop {
|
||||||
|
fmt.Printf("broken invariant at block %d of %d\n%s", ctx.BlockHeight()-1, numBlocks, res)
|
||||||
|
b.FailNow()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -5,8 +5,6 @@ import (
|
|||||||
"os"
|
"os"
|
||||||
"path"
|
"path"
|
||||||
|
|
||||||
"github.com/cosmos/cosmos-sdk/x/mint"
|
|
||||||
|
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
"github.com/spf13/viper"
|
"github.com/spf13/viper"
|
||||||
|
|
||||||
@ -17,32 +15,15 @@ import (
|
|||||||
"github.com/cosmos/cosmos-sdk/client/keys"
|
"github.com/cosmos/cosmos-sdk/client/keys"
|
||||||
"github.com/cosmos/cosmos-sdk/client/lcd"
|
"github.com/cosmos/cosmos-sdk/client/lcd"
|
||||||
"github.com/cosmos/cosmos-sdk/client/rpc"
|
"github.com/cosmos/cosmos-sdk/client/rpc"
|
||||||
"github.com/cosmos/cosmos-sdk/client/tx"
|
|
||||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||||
"github.com/cosmos/cosmos-sdk/version"
|
"github.com/cosmos/cosmos-sdk/version"
|
||||||
"github.com/kava-labs/kava/app"
|
"github.com/cosmos/cosmos-sdk/x/auth"
|
||||||
|
|
||||||
at "github.com/cosmos/cosmos-sdk/x/auth"
|
|
||||||
auth "github.com/cosmos/cosmos-sdk/x/auth/client/rest"
|
|
||||||
bank "github.com/cosmos/cosmos-sdk/x/bank/client/rest"
|
|
||||||
dist "github.com/cosmos/cosmos-sdk/x/distribution/client/rest"
|
|
||||||
gv "github.com/cosmos/cosmos-sdk/x/gov"
|
|
||||||
gov "github.com/cosmos/cosmos-sdk/x/gov/client/rest"
|
|
||||||
mintrest "github.com/cosmos/cosmos-sdk/x/mint/client/rest"
|
|
||||||
sl "github.com/cosmos/cosmos-sdk/x/slashing"
|
|
||||||
slashing "github.com/cosmos/cosmos-sdk/x/slashing/client/rest"
|
|
||||||
st "github.com/cosmos/cosmos-sdk/x/staking"
|
|
||||||
staking "github.com/cosmos/cosmos-sdk/x/staking/client/rest"
|
|
||||||
|
|
||||||
authcmd "github.com/cosmos/cosmos-sdk/x/auth/client/cli"
|
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"
|
bankcmd "github.com/cosmos/cosmos-sdk/x/bank/client/cli"
|
||||||
crisisclient "github.com/cosmos/cosmos-sdk/x/crisis/client"
|
|
||||||
distcmd "github.com/cosmos/cosmos-sdk/x/distribution"
|
"github.com/kava-labs/kava/app"
|
||||||
distClient "github.com/cosmos/cosmos-sdk/x/distribution/client"
|
|
||||||
govClient "github.com/cosmos/cosmos-sdk/x/gov/client"
|
|
||||||
mintclient "github.com/cosmos/cosmos-sdk/x/mint/client"
|
|
||||||
slashingclient "github.com/cosmos/cosmos-sdk/x/slashing/client"
|
|
||||||
stakingclient "github.com/cosmos/cosmos-sdk/x/staking/client"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
@ -61,17 +42,6 @@ func main() {
|
|||||||
// the below functions and eliminate global vars, like we do
|
// the below functions and eliminate global vars, like we do
|
||||||
// with the cdc
|
// with the cdc
|
||||||
|
|
||||||
// Module clients hold cli commnads (tx,query) and lcd routes
|
|
||||||
// TODO: Make the lcd command take a list of ModuleClient
|
|
||||||
mc := []sdk.ModuleClients{
|
|
||||||
govClient.NewModuleClient(gv.StoreKey, cdc),
|
|
||||||
distClient.NewModuleClient(distcmd.StoreKey, cdc),
|
|
||||||
stakingclient.NewModuleClient(st.StoreKey, cdc),
|
|
||||||
mintclient.NewModuleClient(mint.StoreKey, cdc),
|
|
||||||
slashingclient.NewModuleClient(sl.StoreKey, cdc),
|
|
||||||
crisisclient.NewModuleClient(sl.StoreKey, cdc),
|
|
||||||
}
|
|
||||||
|
|
||||||
rootCmd := &cobra.Command{
|
rootCmd := &cobra.Command{
|
||||||
Use: "kvcli",
|
Use: "kvcli",
|
||||||
Short: "Command line interface for interacting with kvd",
|
Short: "Command line interface for interacting with kvd",
|
||||||
@ -87,19 +57,19 @@ func main() {
|
|||||||
rootCmd.AddCommand(
|
rootCmd.AddCommand(
|
||||||
rpc.StatusCommand(),
|
rpc.StatusCommand(),
|
||||||
client.ConfigCmd(app.DefaultCLIHome),
|
client.ConfigCmd(app.DefaultCLIHome),
|
||||||
queryCmd(cdc, mc),
|
queryCmd(cdc),
|
||||||
txCmd(cdc, mc),
|
txCmd(cdc),
|
||||||
client.LineBreak,
|
client.LineBreak,
|
||||||
lcd.ServeCommand(cdc, registerRoutes),
|
lcd.ServeCommand(cdc, registerRoutes),
|
||||||
client.LineBreak,
|
client.LineBreak,
|
||||||
keys.Commands(),
|
keys.Commands(),
|
||||||
client.LineBreak,
|
client.LineBreak,
|
||||||
version.VersionCmd,
|
version.Cmd,
|
||||||
client.NewCompletionCmd(rootCmd, true),
|
client.NewCompletionCmd(rootCmd, true),
|
||||||
)
|
)
|
||||||
|
|
||||||
// Add flags and prefix all env exposed with GA
|
// Add flags and prefix all env exposed with KA
|
||||||
executor := cli.PrepareMainCmd(rootCmd, "GA", app.DefaultCLIHome)
|
executor := cli.PrepareMainCmd(rootCmd, "KA", app.DefaultCLIHome)
|
||||||
|
|
||||||
err := executor.Execute()
|
err := executor.Execute()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -108,7 +78,7 @@ func main() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func queryCmd(cdc *amino.Codec, mc []sdk.ModuleClients) *cobra.Command {
|
func queryCmd(cdc *amino.Codec) *cobra.Command {
|
||||||
queryCmd := &cobra.Command{
|
queryCmd := &cobra.Command{
|
||||||
Use: "query",
|
Use: "query",
|
||||||
Aliases: []string{"q"},
|
Aliases: []string{"q"},
|
||||||
@ -116,25 +86,22 @@ func queryCmd(cdc *amino.Codec, mc []sdk.ModuleClients) *cobra.Command {
|
|||||||
}
|
}
|
||||||
|
|
||||||
queryCmd.AddCommand(
|
queryCmd.AddCommand(
|
||||||
|
authcmd.GetAccountCmd(cdc),
|
||||||
|
client.LineBreak,
|
||||||
rpc.ValidatorCommand(cdc),
|
rpc.ValidatorCommand(cdc),
|
||||||
rpc.BlockCommand(),
|
rpc.BlockCommand(),
|
||||||
tx.SearchTxCmd(cdc),
|
authcmd.QueryTxsByEventsCmd(cdc),
|
||||||
tx.QueryTxCmd(cdc),
|
authcmd.QueryTxCmd(cdc),
|
||||||
client.LineBreak,
|
client.LineBreak,
|
||||||
authcmd.GetAccountCmd(at.StoreKey, cdc),
|
|
||||||
)
|
)
|
||||||
|
|
||||||
for _, m := range mc {
|
// add modules' query commands
|
||||||
mQueryCmd := m.GetQueryCmd()
|
app.ModuleBasics.AddQueryCommands(queryCmd, cdc)
|
||||||
if mQueryCmd != nil {
|
|
||||||
queryCmd.AddCommand(mQueryCmd)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return queryCmd
|
return queryCmd
|
||||||
}
|
}
|
||||||
|
|
||||||
func txCmd(cdc *amino.Codec, mc []sdk.ModuleClients) *cobra.Command {
|
func txCmd(cdc *amino.Codec) *cobra.Command {
|
||||||
txCmd := &cobra.Command{
|
txCmd := &cobra.Command{
|
||||||
Use: "tx",
|
Use: "tx",
|
||||||
Short: "Transactions subcommands",
|
Short: "Transactions subcommands",
|
||||||
@ -145,40 +112,42 @@ func txCmd(cdc *amino.Codec, mc []sdk.ModuleClients) *cobra.Command {
|
|||||||
client.LineBreak,
|
client.LineBreak,
|
||||||
authcmd.GetSignCommand(cdc),
|
authcmd.GetSignCommand(cdc),
|
||||||
authcmd.GetMultiSignCommand(cdc),
|
authcmd.GetMultiSignCommand(cdc),
|
||||||
tx.GetBroadcastCommand(cdc),
|
client.LineBreak,
|
||||||
tx.GetEncodeCommand(cdc),
|
authcmd.GetBroadcastCommand(cdc),
|
||||||
|
authcmd.GetEncodeCommand(cdc),
|
||||||
client.LineBreak,
|
client.LineBreak,
|
||||||
)
|
)
|
||||||
|
|
||||||
for _, m := range mc {
|
// add modules' tx commands
|
||||||
txCmd.AddCommand(m.GetTxCmd())
|
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
|
return txCmd
|
||||||
}
|
}
|
||||||
|
|
||||||
// registerRoutes registers the routes from the different modules for the LCD.
|
// 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) {
|
func registerRoutes(rs *lcd.RestServer) {
|
||||||
rpc.RegisterRoutes(rs.CliCtx, rs.Mux)
|
client.RegisterRoutes(rs.CliCtx, rs.Mux)
|
||||||
tx.RegisterRoutes(rs.CliCtx, rs.Mux, rs.Cdc)
|
authrest.RegisterTxRoutes(rs.CliCtx, rs.Mux)
|
||||||
auth.RegisterRoutes(rs.CliCtx, rs.Mux, rs.Cdc, at.StoreKey)
|
app.ModuleBasics.RegisterRESTRoutes(rs.CliCtx, rs.Mux)
|
||||||
bank.RegisterRoutes(rs.CliCtx, rs.Mux, rs.Cdc, rs.KeyBase)
|
|
||||||
dist.RegisterRoutes(rs.CliCtx, rs.Mux, rs.Cdc, distcmd.StoreKey)
|
|
||||||
staking.RegisterRoutes(rs.CliCtx, rs.Mux, rs.Cdc, rs.KeyBase)
|
|
||||||
slashing.RegisterRoutes(rs.CliCtx, rs.Mux, rs.Cdc, rs.KeyBase)
|
|
||||||
gov.RegisterRoutes(rs.CliCtx, rs.Mux, rs.Cdc)
|
|
||||||
mintrest.RegisterRoutes(rs.CliCtx, rs.Mux, rs.Cdc)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// initConfig reads in and sets options from a config file (if one exists)
|
||||||
func initConfig(cmd *cobra.Command) error {
|
func initConfig(cmd *cobra.Command) error {
|
||||||
home, err := cmd.PersistentFlags().GetString(cli.HomeFlag)
|
home, err := cmd.PersistentFlags().GetString(cli.HomeFlag)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
cfgFile := path.Join(home, "config", "config.toml")
|
cfgFile := path.Join(home, "config", "config.toml")
|
||||||
|
|
||||||
if _, err := os.Stat(cfgFile); err == nil {
|
if _, err := os.Stat(cfgFile); err == nil {
|
||||||
viper.SetConfigFile(cfgFile)
|
viper.SetConfigFile(cfgFile)
|
||||||
|
|
||||||
|
@ -18,8 +18,12 @@ import (
|
|||||||
"github.com/cosmos/cosmos-sdk/server"
|
"github.com/cosmos/cosmos-sdk/server"
|
||||||
"github.com/cosmos/cosmos-sdk/store"
|
"github.com/cosmos/cosmos-sdk/store"
|
||||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||||
|
"github.com/cosmos/cosmos-sdk/x/genaccounts"
|
||||||
|
genaccscli "github.com/cosmos/cosmos-sdk/x/genaccounts/client/cli"
|
||||||
|
genutilcli "github.com/cosmos/cosmos-sdk/x/genutil/client/cli"
|
||||||
|
"github.com/cosmos/cosmos-sdk/x/staking"
|
||||||
|
|
||||||
"github.com/kava-labs/kava/app"
|
"github.com/kava-labs/kava/app"
|
||||||
initPkg "github.com/kava-labs/kava/init"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// kvd custom flags
|
// kvd custom flags
|
||||||
@ -42,23 +46,29 @@ func main() {
|
|||||||
PersistentPreRunE: server.PersistentPreRunEFn(ctx),
|
PersistentPreRunE: server.PersistentPreRunEFn(ctx),
|
||||||
}
|
}
|
||||||
|
|
||||||
rootCmd.AddCommand(initPkg.InitCmd(ctx, cdc))
|
rootCmd.AddCommand(genutilcli.InitCmd(ctx, cdc, app.ModuleBasics, app.DefaultNodeHome))
|
||||||
rootCmd.AddCommand(initPkg.CollectGenTxsCmd(ctx, cdc))
|
rootCmd.AddCommand(genutilcli.CollectGenTxsCmd(ctx, cdc, genaccounts.AppModuleBasic{}, app.DefaultNodeHome))
|
||||||
rootCmd.AddCommand(initPkg.TestnetFilesCmd(ctx, cdc))
|
rootCmd.AddCommand(genutilcli.MigrateGenesisCmd(ctx, cdc))
|
||||||
rootCmd.AddCommand(initPkg.GenTxCmd(ctx, cdc))
|
rootCmd.AddCommand(genutilcli.GenTxCmd(
|
||||||
rootCmd.AddCommand(initPkg.AddGenesisAccountCmd(ctx, cdc))
|
ctx,
|
||||||
rootCmd.AddCommand(initPkg.ValidateGenesisCmd(ctx, cdc))
|
cdc,
|
||||||
|
app.ModuleBasics,
|
||||||
|
staking.AppModuleBasic{},
|
||||||
|
genaccounts.AppModuleBasic{},
|
||||||
|
app.DefaultNodeHome,
|
||||||
|
app.DefaultCLIHome))
|
||||||
|
rootCmd.AddCommand(genutilcli.ValidateGenesisCmd(ctx, cdc, app.ModuleBasics))
|
||||||
|
rootCmd.AddCommand(genaccscli.AddGenesisAccountCmd(ctx, cdc, app.DefaultNodeHome, app.DefaultCLIHome))
|
||||||
rootCmd.AddCommand(client.NewCompletionCmd(rootCmd, true))
|
rootCmd.AddCommand(client.NewCompletionCmd(rootCmd, true))
|
||||||
|
|
||||||
server.AddCommands(ctx, cdc, rootCmd, newApp, exportAppStateAndTMValidators)
|
server.AddCommands(ctx, cdc, rootCmd, newApp, exportAppStateAndTMValidators)
|
||||||
|
|
||||||
// prepare and add flags
|
// prepare and add flags
|
||||||
executor := cli.PrepareBaseCmd(rootCmd, "GA", app.DefaultNodeHome)
|
executor := cli.PrepareBaseCmd(rootCmd, "KA", app.DefaultNodeHome)
|
||||||
rootCmd.PersistentFlags().UintVar(&invCheckPeriod, flagInvCheckPeriod,
|
rootCmd.PersistentFlags().UintVar(&invCheckPeriod, flagInvCheckPeriod,
|
||||||
0, "Assert registered invariants every N blocks")
|
0, "Assert registered invariants every N blocks")
|
||||||
err := executor.Execute()
|
err := executor.Execute()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// handle with #870
|
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -68,6 +78,7 @@ func newApp(logger log.Logger, db dbm.DB, traceStore io.Writer) abci.Application
|
|||||||
logger, db, traceStore, true, invCheckPeriod,
|
logger, db, traceStore, true, invCheckPeriod,
|
||||||
baseapp.SetPruning(store.NewPruningOptionsFromString(viper.GetString("pruning"))),
|
baseapp.SetPruning(store.NewPruningOptionsFromString(viper.GetString("pruning"))),
|
||||||
baseapp.SetMinGasPrices(viper.GetString(server.FlagMinGasPrices)),
|
baseapp.SetMinGasPrices(viper.GetString(server.FlagMinGasPrices)),
|
||||||
|
baseapp.SetHaltHeight(uint64(viper.GetInt(server.FlagHaltHeight))),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -76,13 +87,13 @@ func exportAppStateAndTMValidators(
|
|||||||
) (json.RawMessage, []tmtypes.GenesisValidator, error) {
|
) (json.RawMessage, []tmtypes.GenesisValidator, error) {
|
||||||
|
|
||||||
if height != -1 {
|
if height != -1 {
|
||||||
gApp := app.NewApp(logger, db, traceStore, false, uint(1))
|
tempApp := app.NewApp(logger, db, traceStore, false, uint(1))
|
||||||
err := gApp.LoadHeight(height)
|
err := tempApp.LoadHeight(height)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
return gApp.ExportAppStateAndValidators(forZeroHeight, jailWhiteList)
|
return tempApp.ExportAppStateAndValidators(forZeroHeight, jailWhiteList)
|
||||||
}
|
}
|
||||||
gApp := app.NewApp(logger, db, traceStore, true, uint(1))
|
tempApp := app.NewApp(logger, db, traceStore, true, uint(1))
|
||||||
return gApp.ExportAppStateAndValidators(forZeroHeight, jailWhiteList)
|
return tempApp.ExportAppStateAndValidators(forZeroHeight, jailWhiteList)
|
||||||
}
|
}
|
||||||
|
13
go.mod
13
go.mod
@ -3,13 +3,10 @@ module github.com/kava-labs/kava
|
|||||||
go 1.12
|
go 1.12
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/cosmos/cosmos-sdk v0.34.7
|
github.com/cosmos/cosmos-sdk v0.36.0-rc1
|
||||||
github.com/rakyll/statik v0.1.4
|
github.com/spf13/cobra v0.0.5
|
||||||
github.com/spf13/cobra v0.0.3
|
github.com/spf13/viper v1.4.0
|
||||||
github.com/spf13/viper v1.0.3
|
|
||||||
github.com/stretchr/testify v1.3.0
|
github.com/stretchr/testify v1.3.0
|
||||||
github.com/tendermint/go-amino v0.14.1
|
github.com/tendermint/go-amino v0.15.0
|
||||||
github.com/tendermint/tendermint v0.31.5
|
github.com/tendermint/tendermint v0.32.1
|
||||||
)
|
)
|
||||||
|
|
||||||
replace golang.org/x/crypto => github.com/tendermint/crypto v0.0.0-20180820045704-3764759f34a5
|
|
||||||
|
113
go.sum
113
go.sum
@ -1,7 +1,8 @@
|
|||||||
bou.ke/monkey v1.0.1/go.mod h1:FgHuK96Rv2Nlf+0u1OOVDpCMdsWyOFmeeketDHE7LIg=
|
|
||||||
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
||||||
|
github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
|
||||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||||
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
|
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
|
||||||
|
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/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g=
|
||||||
github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII=
|
github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII=
|
||||||
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
||||||
@ -11,16 +12,15 @@ github.com/bartekn/go-bip39 v0.0.0-20171116152956-a05967ea095d h1:1aAija9gr0Hyv4
|
|||||||
github.com/bartekn/go-bip39 v0.0.0-20171116152956-a05967ea095d/go.mod h1:icNx/6QdFblhsEjZehARqbNumymUT/ydwlLojFdv7Sk=
|
github.com/bartekn/go-bip39 v0.0.0-20171116152956-a05967ea095d/go.mod h1:icNx/6QdFblhsEjZehARqbNumymUT/ydwlLojFdv7Sk=
|
||||||
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973 h1:xJ4a3vCFaGF/jqvzLMYoU8P317H5OQ+Via4RmuPwCS0=
|
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973 h1:xJ4a3vCFaGF/jqvzLMYoU8P317H5OQ+Via4RmuPwCS0=
|
||||||
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
|
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
|
||||||
|
github.com/beorn7/perks v1.0.0 h1:HWo1m869IqiPhD389kmkxeTalrjNbbJTC8LXupb+sl0=
|
||||||
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
|
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
|
||||||
github.com/bgentry/speakeasy v0.1.0 h1:ByYyxL9InA1OWqxJqqp2A5pYHUrCiAL6K3J+LKSsQkY=
|
github.com/bgentry/speakeasy v0.1.0 h1:ByYyxL9InA1OWqxJqqp2A5pYHUrCiAL6K3J+LKSsQkY=
|
||||||
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
|
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
|
||||||
github.com/btcsuite/btcd v0.0.0-20190115013929-ed77733ec07d h1:xG8Pj6Y6J760xwETNmMzmlt38QSwz0BLp1cZ09g27uw=
|
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.0.0-20190115013929-ed77733ec07d/go.mod h1:d3C0AkH6BRcvO8T0UEPu53cnw4IbV63x1bEjildYhO0=
|
||||||
github.com/btcsuite/btcd v0.0.0-20190523000118-16327141da8c/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI=
|
|
||||||
github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA=
|
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 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-20180706230648-ab6388e0c60a/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg=
|
||||||
github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg=
|
|
||||||
github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg=
|
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/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/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc=
|
||||||
@ -34,13 +34,10 @@ github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8Nz
|
|||||||
github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
|
github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
|
||||||
github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/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-20180928190104-399ea9e2e55f/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.28.2-0.20190606154315-3180e68c7b57/go.mod h1:MvaJDmjgAK7X1rTnpk8+c6tUFfIZ++iuNCp2sUWzprM=
|
github.com/cosmos/cosmos-sdk v0.36.0-rc1 h1:hgSXNeVwNYxD0+O9DxRrxJcir9Z7Q5zreLV6G7GrjYA=
|
||||||
github.com/cosmos/cosmos-sdk v0.34.7 h1:S6yMldhrAMB/SDMsR2Hvz05tpUpQQGCHf0INXAZ7VW0=
|
github.com/cosmos/cosmos-sdk v0.36.0-rc1/go.mod h1:UV765S3m9sxCg8rYaBr4XgeHZl2UP6y++Coz9mLlYFc=
|
||||||
github.com/cosmos/cosmos-sdk v0.34.7/go.mod h1:ruF+G4D7hRf34uzZQvf/SIja9fsIThU5D7GirwTMQ9I=
|
|
||||||
github.com/cosmos/cosmos-sdk v0.35.0 h1:EPeie1aKHwnXtTzKggvabG7aAPN+DDmju2xquvjFwao=
|
|
||||||
github.com/cosmos/go-bip39 v0.0.0-20180618194314-52158e4697b8 h1:Iwin12wRQtyZhH6FV3ykFcdGNlYEzoeR0jN8Vn+JWsI=
|
github.com/cosmos/go-bip39 v0.0.0-20180618194314-52158e4697b8 h1:Iwin12wRQtyZhH6FV3ykFcdGNlYEzoeR0jN8Vn+JWsI=
|
||||||
github.com/cosmos/go-bip39 v0.0.0-20180618194314-52158e4697b8/go.mod h1:tSxLoYXyBmiFeKpvmq4dzayMdCjCnu8uqmCysIGBT2Y=
|
github.com/cosmos/go-bip39 v0.0.0-20180618194314-52158e4697b8/go.mod h1:tSxLoYXyBmiFeKpvmq4dzayMdCjCnu8uqmCysIGBT2Y=
|
||||||
github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d/go.mod h1:tSxLoYXyBmiFeKpvmq4dzayMdCjCnu8uqmCysIGBT2Y=
|
|
||||||
github.com/cosmos/ledger-cosmos-go v0.10.3 h1:Qhi5yTR5Pg1CaTpd00pxlGwNl4sFRdtK1J96OTjeFFc=
|
github.com/cosmos/ledger-cosmos-go v0.10.3 h1:Qhi5yTR5Pg1CaTpd00pxlGwNl4sFRdtK1J96OTjeFFc=
|
||||||
github.com/cosmos/ledger-cosmos-go v0.10.3/go.mod h1:J8//BsAGTo3OC/vDLjMRFLW6q0WAaXvHnVc7ZmE8iUY=
|
github.com/cosmos/ledger-cosmos-go v0.10.3/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 h1:Nnao/dLwaVTk1Q5U9THldpUMMXU94BOTWPddSmVB6pI=
|
||||||
@ -52,25 +49,38 @@ 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/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
|
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
|
||||||
github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
|
github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
|
||||||
|
github.com/etcd-io/bbolt v1.3.2/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw=
|
||||||
|
github.com/etcd-io/bbolt v1.3.3 h1:gSJmxrs37LgTqR/oyJBWok6k6SvXEUerFTbltIhXkBM=
|
||||||
|
github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw=
|
||||||
|
github.com/fortytw2/leaktest v1.2.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g=
|
||||||
|
github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw=
|
||||||
github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g=
|
github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g=
|
||||||
github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I=
|
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/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
|
||||||
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
|
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
|
||||||
|
github.com/go-kit/kit v0.6.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
|
||||||
github.com/go-kit/kit v0.8.0 h1:Wz+5lgoB0kkuqLEc6NVmwRknTKP6dTGbSqvhZtBI/j0=
|
github.com/go-kit/kit v0.8.0 h1:Wz+5lgoB0kkuqLEc6NVmwRknTKP6dTGbSqvhZtBI/j0=
|
||||||
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
|
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
|
||||||
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
|
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
|
||||||
github.com/go-logfmt/logfmt v0.4.0 h1:MP4Eh7ZCb31lleYCFuwm0oe4/YGak+5l1vA2NOE80nA=
|
github.com/go-logfmt/logfmt v0.4.0 h1:MP4Eh7ZCb31lleYCFuwm0oe4/YGak+5l1vA2NOE80nA=
|
||||||
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
|
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
|
||||||
|
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/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
|
||||||
github.com/gogo/protobuf v1.1.1 h1:72R+M5VuhED/KujmZVcIquuo8mBgX4oVda//DQb3PXo=
|
github.com/gogo/protobuf v1.1.1 h1:72R+M5VuhED/KujmZVcIquuo8mBgX4oVda//DQb3PXo=
|
||||||
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
||||||
|
github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE=
|
||||||
github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
|
github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
|
||||||
|
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58=
|
||||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
||||||
github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||||
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||||
|
github.com/golang/mock v1.3.1-0.20190508161146-9fa652df1129 h1:tT8iWCYw4uOem71yYA3htfH+LNopJvcqZQshm56G5L4=
|
||||||
|
github.com/golang/mock v1.3.1-0.20190508161146-9fa652df1129/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
|
||||||
github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM=
|
github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM=
|
||||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
|
github.com/golang/protobuf v1.3.0 h1:kbxbvI4Un1LUWKxufD+BiE6AEExYYgkQLQmLFqA1LFk=
|
||||||
github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0=
|
github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0=
|
||||||
|
github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg=
|
||||||
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
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 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4=
|
||||||
@ -79,10 +89,11 @@ github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ
|
|||||||
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
||||||
github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf h1:+RRA9JqSOZFfKrOeqr2z77+8R2RKyh8PG66dcu1V0ck=
|
github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf h1:+RRA9JqSOZFfKrOeqr2z77+8R2RKyh8PG66dcu1V0ck=
|
||||||
github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI=
|
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/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||||
github.com/gorilla/mux v1.7.0 h1:tOSd0UKHQd6urX6ApfOn4XdBMY6Sh1MfxV3kmaazO+U=
|
github.com/gorilla/mux v1.7.0 h1:tOSd0UKHQd6urX6ApfOn4XdBMY6Sh1MfxV3kmaazO+U=
|
||||||
github.com/gorilla/mux v1.7.0/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
|
github.com/gorilla/mux v1.7.0/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
|
||||||
github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
|
github.com/gorilla/websocket v1.2.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
|
||||||
github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q=
|
github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q=
|
||||||
github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
|
github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
|
||||||
github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
|
github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
|
||||||
@ -90,9 +101,13 @@ github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgf
|
|||||||
github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
|
github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
|
||||||
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
|
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/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
|
||||||
|
github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
|
||||||
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
|
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
|
||||||
|
github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
|
||||||
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
|
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
|
||||||
github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
|
github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
|
||||||
|
github.com/jmhodges/levigo v0.0.0-20161115193449-c42d9e0ca023/go.mod h1:Q6Qx+uH3RAqyK4rFQroq9RL7mdkABMcfhEI+nNuzMJQ=
|
||||||
|
github.com/jmhodges/levigo v1.0.0 h1:q5EC36kV79HWeTBWsod3mG11EgStG3qArTKcvlksN1U=
|
||||||
github.com/jmhodges/levigo v1.0.0/go.mod h1:Q6Qx+uH3RAqyK4rFQroq9RL7mdkABMcfhEI+nNuzMJQ=
|
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/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/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ=
|
||||||
@ -101,16 +116,15 @@ github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvW
|
|||||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
||||||
github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4=
|
github.com/kkdai/bstream 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/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 h1:T+h1c/A9Gawja4Y9mFVWj2vyii2bbUNDw3kt9VxK2EY=
|
||||||
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
|
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
|
||||||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
||||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||||
github.com/magiconair/properties v1.8.0 h1:LLgXmsheXeRoUOBOjtwPQCWIYqM/LU1ayDtDePerRcY=
|
github.com/magiconair/properties v1.8.0 h1:LLgXmsheXeRoUOBOjtwPQCWIYqM/LU1ayDtDePerRcY=
|
||||||
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
|
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
|
||||||
github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
|
|
||||||
github.com/mattn/go-isatty v0.0.6 h1:SrwhHcpV4nWrMGdNcC2kXpMfcBVYGDuTArqyhocJgvA=
|
github.com/mattn/go-isatty v0.0.6 h1:SrwhHcpV4nWrMGdNcC2kXpMfcBVYGDuTArqyhocJgvA=
|
||||||
github.com/mattn/go-isatty v0.0.6/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
|
github.com/mattn/go-isatty v0.0.6/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
|
||||||
github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
|
|
||||||
github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
|
github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
|
||||||
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
|
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
|
||||||
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
||||||
@ -119,19 +133,12 @@ github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh
|
|||||||
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
|
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
|
||||||
github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
|
github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
|
||||||
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
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.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||||
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.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
|
||||||
github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
|
|
||||||
github.com/otiai10/copy v0.0.0-20180813032824-7e9a647135a1/go.mod h1:pXzZSDlN+HPzSdyIBnKNN9ptD9Hx7iZMWIJPTwo4FPE=
|
|
||||||
github.com/otiai10/copy v1.0.1/go.mod h1:8bMCJrAqOtN/d9oyh5HR7HhLQMvcGMpGdwRDYsfOCHc=
|
|
||||||
github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE=
|
|
||||||
github.com/otiai10/curr v0.0.0-20190513014714-f5a3d24e5776/go.mod h1:3HNVkVOU7vZeFXocWuvtcS0XSFLcf2XUSDHkq9t1jU4=
|
|
||||||
github.com/otiai10/mint v1.2.3/go.mod h1:YnfyPNhBvnY8bW4SGQHCs/aAFhkgySlMZbrF5U0bOVw=
|
|
||||||
github.com/otiai10/mint v1.2.4/go.mod h1:d+b7n/0R3tdyUYYylALXpWQ/kTN+QobSq/4SRGBkR3M=
|
|
||||||
github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc=
|
github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc=
|
||||||
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
|
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
|
||||||
github.com/pelletier/go-toml v1.4.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUruD3k1mMwo=
|
|
||||||
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
|
github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
|
||||||
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
@ -140,29 +147,29 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN
|
|||||||
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
|
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
|
||||||
github.com/prometheus/client_golang v0.9.2 h1:awm861/B8OKDd2I/6o1dy3ra4BamzKhYOiGItCeZ740=
|
github.com/prometheus/client_golang v0.9.2 h1:awm861/B8OKDd2I/6o1dy3ra4BamzKhYOiGItCeZ740=
|
||||||
github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM=
|
github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM=
|
||||||
|
github.com/prometheus/client_golang v0.9.3 h1:9iH4JKXLzFbOAdtqv/a+j8aewx2Y8lAjAydhbaScPF8=
|
||||||
github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso=
|
github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso=
|
||||||
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
|
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
|
||||||
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90 h1:S/YWwWx/RA8rT8tKFRuGUZhuA90OyIBpPCXkcbwU8DE=
|
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90 h1:S/YWwWx/RA8rT8tKFRuGUZhuA90OyIBpPCXkcbwU8DE=
|
||||||
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||||
|
github.com/prometheus/common v0.0.0-20181020173914-7e9e6cabbd39/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
|
||||||
github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
|
github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
|
||||||
github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
|
github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
|
||||||
github.com/prometheus/common v0.2.0 h1:kUZDBDTdBVBYBj5Tmh2NZLlF60mfjA27rM34b+cVwNU=
|
github.com/prometheus/common v0.2.0 h1:kUZDBDTdBVBYBj5Tmh2NZLlF60mfjA27rM34b+cVwNU=
|
||||||
github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
|
github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
|
||||||
|
github.com/prometheus/common v0.4.0 h1:7etb9YClo3a6HjLzfl6rIQaU+FDfi0VSX39io3aQ+DM=
|
||||||
github.com/prometheus/common v0.4.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/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
||||||
github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
||||||
github.com/prometheus/procfs v0.0.0-20190227231451-bbced9601137 h1:3l8oligPtjd4JuM+OZ+U8sjtwFGJs98cdWsqs6QZRWs=
|
github.com/prometheus/procfs v0.0.0-20190227231451-bbced9601137 h1:3l8oligPtjd4JuM+OZ+U8sjtwFGJs98cdWsqs6QZRWs=
|
||||||
github.com/prometheus/procfs v0.0.0-20190227231451-bbced9601137/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
|
github.com/prometheus/procfs v0.0.0-20190227231451-bbced9601137/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
|
||||||
|
github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084 h1:sofwID9zm4tzrgykg80hfFph1mryUeLRsUfoocVVmRY=
|
||||||
github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
|
github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
|
||||||
github.com/prometheus/procfs v0.0.0-20190523193104-a7aeb8df3389/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
|
|
||||||
github.com/prometheus/tsdb v0.7.1/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.4 h1:zCS/YQCxfo/fQjCtGVGIyWGFnRbQ18Y55mhS3XPE+Oo=
|
github.com/rakyll/statik v0.1.4 h1:zCS/YQCxfo/fQjCtGVGIyWGFnRbQ18Y55mhS3XPE+Oo=
|
||||||
github.com/rakyll/statik v0.1.4/go.mod h1:OEi9wJV/fMUAGx1eNjq75DKDsJVuEv1U0oYdX6GX8Zs=
|
github.com/rakyll/statik v0.1.4/go.mod h1:OEi9wJV/fMUAGx1eNjq75DKDsJVuEv1U0oYdX6GX8Zs=
|
||||||
github.com/rakyll/statik v0.1.6/go.mod h1:OEi9wJV/fMUAGx1eNjq75DKDsJVuEv1U0oYdX6GX8Zs=
|
|
||||||
github.com/rcrowley/go-metrics v0.0.0-20180503174638-e2704e165165 h1:nkcn14uNmFEuGCb2mBZbBb24RdNRL08b/wb+xBOYpuk=
|
github.com/rcrowley/go-metrics v0.0.0-20180503174638-e2704e165165 h1:nkcn14uNmFEuGCb2mBZbBb24RdNRL08b/wb+xBOYpuk=
|
||||||
github.com/rcrowley/go-metrics v0.0.0-20180503174638-e2704e165165/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
|
github.com/rcrowley/go-metrics v0.0.0-20180503174638-e2704e165165/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
|
||||||
github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
|
|
||||||
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
|
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
|
||||||
github.com/rs/cors v1.6.0 h1:G9tHG9lebljV9mfp9SNPDL36nCDxmo3zTlAf1YgvzmI=
|
github.com/rs/cors v1.6.0 h1:G9tHG9lebljV9mfp9SNPDL36nCDxmo3zTlAf1YgvzmI=
|
||||||
github.com/rs/cors v1.6.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU=
|
github.com/rs/cors v1.6.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU=
|
||||||
@ -173,41 +180,42 @@ github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasO
|
|||||||
github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
|
github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
|
||||||
github.com/spf13/afero v1.2.1 h1:qgMbHoJbPbw579P+1zVY+6n4nIFuIchaIjzZ/I/Yq8M=
|
github.com/spf13/afero v1.2.1 h1:qgMbHoJbPbw579P+1zVY+6n4nIFuIchaIjzZ/I/Yq8M=
|
||||||
github.com/spf13/afero v1.2.1/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk=
|
github.com/spf13/afero v1.2.1/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk=
|
||||||
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 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8=
|
||||||
github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
|
github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
|
||||||
github.com/spf13/cobra v0.0.3 h1:ZlrZ4XsMRm04Fr5pSFxBgfND2EBVa1nLpiy1stUsX/8=
|
github.com/spf13/cobra v0.0.1/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
|
||||||
github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
|
github.com/spf13/cobra v0.0.5 h1:f0B+LkLX6DtmRH1isoNA9VTtNUK9K8xYd28JNNfOv/s=
|
||||||
github.com/spf13/cobra v0.0.4/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU=
|
github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU=
|
||||||
github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
|
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 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk=
|
||||||
github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo=
|
github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo=
|
||||||
github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg=
|
github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg=
|
||||||
github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
|
github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
|
||||||
github.com/spf13/viper v1.0.3 h1:z5LPUc2iz8VLT5Cw1UyrESG6FUUnOGecYGY08BLKSuc=
|
github.com/spf13/viper v1.0.0/go.mod h1:A8kyI5cUJhb8N+3pkfONlcEcZbueH6nhAm0Fq7SrnBM=
|
||||||
github.com/spf13/viper v1.0.3/go.mod h1:A8kyI5cUJhb8N+3pkfONlcEcZbueH6nhAm0Fq7SrnBM=
|
github.com/spf13/viper v1.3.2 h1:VUFqw5KcqRf7i70GOzW7N+Q7+gxVBkSSqiXB12+JQ4M=
|
||||||
github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s=
|
github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s=
|
||||||
|
github.com/spf13/viper v1.4.0 h1:yXHLWeravcrgGyFSyCgdYpXQ9dR9c/WED3pg1RhxqEU=
|
||||||
github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE=
|
github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE=
|
||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
||||||
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
|
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
|
||||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||||
github.com/syndtr/goleveldb v0.0.0-20180708030551-c4c61651e9e3 h1:sAlSBRDl4psFR3ysKXRSE8ss6Mt90+ma1zRTroTNBJA=
|
github.com/syndtr/goleveldb v0.0.0-20181105012736-f9080354173f/go.mod h1:Z4AUp2Km+PwemOoO/VB5AOx9XSsIItzFjoJlOSiYmn0=
|
||||||
github.com/syndtr/goleveldb v0.0.0-20180708030551-c4c61651e9e3/go.mod h1:Z4AUp2Km+PwemOoO/VB5AOx9XSsIItzFjoJlOSiYmn0=
|
github.com/syndtr/goleveldb v1.0.1-0.20190318030020-c3a204f8e965 h1:1oFLiOyVl+W7bnBzGhf7BbIv9loSFQcieWWYIjLqcAw=
|
||||||
github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ=
|
github.com/syndtr/goleveldb v1.0.1-0.20190318030020-c3a204f8e965/go.mod h1:9OrXJhf154huy1nPWmuSrkgjPUtUNhA+Zmy+6AESzuA=
|
||||||
github.com/tendermint/btcd v0.1.1 h1:0VcxPfflS2zZ3RiOAHkBiFUcPvbtRj5O7zHmcJWHV7s=
|
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/btcd v0.1.1/go.mod h1:DC6/m53jtQzr/NFmMNEu0rxf18/ktVoVtMrnDD5pN+U=
|
||||||
github.com/tendermint/crypto v0.0.0-20180820045704-3764759f34a5 h1:u8i49c+BxloX3XQ55cvzFNXplizZP/q00i+IlttUjAU=
|
github.com/tendermint/crypto v0.0.0-20180820045704-3764759f34a5 h1:u8i49c+BxloX3XQ55cvzFNXplizZP/q00i+IlttUjAU=
|
||||||
github.com/tendermint/crypto v0.0.0-20180820045704-3764759f34a5/go.mod h1:z4YtwM70uOnk8h0pjJYlj3zdYwi9l03By6iAIF5j/Pk=
|
github.com/tendermint/crypto v0.0.0-20180820045704-3764759f34a5/go.mod h1:z4YtwM70uOnk8h0pjJYlj3zdYwi9l03By6iAIF5j/Pk=
|
||||||
github.com/tendermint/go-amino v0.14.1 h1:o2WudxNfdLNBwMyl2dqOJxiro5rfrEaU0Ugs6offJMk=
|
github.com/tendermint/go-amino v0.14.1 h1:o2WudxNfdLNBwMyl2dqOJxiro5rfrEaU0Ugs6offJMk=
|
||||||
github.com/tendermint/go-amino v0.14.1/go.mod h1:i/UKE5Uocn+argJJBb12qTZsCDBcAYMbR92AaJVmKso=
|
github.com/tendermint/go-amino v0.14.1/go.mod h1:i/UKE5Uocn+argJJBb12qTZsCDBcAYMbR92AaJVmKso=
|
||||||
|
github.com/tendermint/go-amino v0.15.0 h1:TC4e66P59W7ML9+bxio17CPKnxW3nKIRAYskntMAoRk=
|
||||||
github.com/tendermint/go-amino v0.15.0/go.mod h1:TQU0M1i/ImAo+tYpZi73AU3V/dKeCoMC9Sphe2ZwGME=
|
github.com/tendermint/go-amino v0.15.0/go.mod h1:TQU0M1i/ImAo+tYpZi73AU3V/dKeCoMC9Sphe2ZwGME=
|
||||||
github.com/tendermint/iavl v0.12.1 h1:JDfyhM/Hhrumu1CL1Nxrypm8sNTPYqmeHo1IZLiJoXM=
|
github.com/tendermint/iavl v0.12.3-0.20190712145259-c834d3192b52 h1:l3qTzz8KkhZZSeLTJGqh0+iONjGM/tS5vvbunXjAmnA=
|
||||||
github.com/tendermint/iavl v0.12.1/go.mod h1:EoKMMv++tDOL5qKKVnoIqtVPshRrEPeJ0WsgDOLAauM=
|
github.com/tendermint/iavl v0.12.3-0.20190712145259-c834d3192b52/go.mod h1:A9IoWRVTibyXXlfZztHy52RloI85QOrIcsE9dyQh+DY=
|
||||||
github.com/tendermint/iavl v0.12.2/go.mod h1:EoKMMv++tDOL5qKKVnoIqtVPshRrEPeJ0WsgDOLAauM=
|
github.com/tendermint/tendermint v0.31.7/go.mod h1:ymcPyWblXCplCPQjbOYbrF1fWnpslATMVqiGgWbZrlc=
|
||||||
github.com/tendermint/tendermint v0.31.5 h1:vTet8tCq3B9/J9Yo11dNZ8pOB7NtSy++bVSfkP4KzR4=
|
github.com/tendermint/tendermint v0.32.1 h1:J8ddXMbCmG6GZjdCl/N1wgdXDU9uO91J2Y5CA9xYfGo=
|
||||||
github.com/tendermint/tendermint v0.31.5/go.mod h1:ymcPyWblXCplCPQjbOYbrF1fWnpslATMVqiGgWbZrlc=
|
github.com/tendermint/tendermint v0.32.1/go.mod h1:jmPDAKuNkev9793/ivn/fTBnfpA9mGBww8MPRNPNxnU=
|
||||||
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
|
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
|
||||||
github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=
|
github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=
|
||||||
github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0=
|
github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0=
|
||||||
@ -216,31 +224,38 @@ github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:
|
|||||||
github.com/zondax/hid v0.9.0 h1:eiT3P6vNxAEVxXMw66eZUAAnU2zD33JBkfG/EnfAKl8=
|
github.com/zondax/hid v0.9.0 h1:eiT3P6vNxAEVxXMw66eZUAAnU2zD33JBkfG/EnfAKl8=
|
||||||
github.com/zondax/hid v0.9.0/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM=
|
github.com/zondax/hid v0.9.0/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM=
|
||||||
go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
|
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.uber.org/atomic v1.4.0/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/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
|
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
|
||||||
go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
|
go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
|
||||||
golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||||
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793 h1:u+LnwYTOOW7Ukr/fppxEb1Nwz0AtPflrblfvUudpo+I=
|
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793 h1:u+LnwYTOOW7Ukr/fppxEb1Nwz0AtPflrblfvUudpo+I=
|
||||||
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
golang.org/x/crypto v0.0.0-20181126093934-9eb0be3963ea/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||||
|
golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||||
|
golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M=
|
||||||
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
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-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||||
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-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-20180906233101-161cd47e91fd/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-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20181201002055-351d144fa1fc h1:a3CU5tJYVj92DY2LaA1kUkrsqD5/3mLDhx2NcNqyW+0=
|
golang.org/x/net v0.0.0-20181201002055-351d144fa1fc h1:a3CU5tJYVj92DY2LaA1kUkrsqD5/3mLDhx2NcNqyW+0=
|
||||||
golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/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-20181220203305-927f97764cc3/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 h1:oWX7TPOiFAMXLq8o0ikBYfCJVlRHBcsciT5bXOrH628=
|
||||||
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
|
golang.org/x/net v0.0.0-20190522155817-f3200d17e092 h1:4QSRKanuywn15aTZvI/mIDEgPQpswuFndXpOj3rKEco=
|
||||||
golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
|
golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
|
||||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
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-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-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-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU=
|
||||||
|
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/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-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-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
@ -250,30 +265,32 @@ golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5h
|
|||||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/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-20190222072716-a9d3bda3a223 h1:DH4skfRX4EBpamg7iV4ZlCpblAHI6s6TDM39bFZumv8=
|
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223 h1:DH4skfRX4EBpamg7iV4ZlCpblAHI6s6TDM39bFZumv8=
|
||||||
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20190527104216-9cd6430ef91e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
|
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
|
||||||
golang.org/x/text v0.3.0/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/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
|
||||||
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/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-20180221164845-07fd8470d635/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-20190114222345-bf090417da8b/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-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||||
|
golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
||||||
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
||||||
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
|
||||||
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8 h1:Nw54tB0rB7hY/N0NQvRW8DG4Yk3Q6T9cu9RcFQDu1tc=
|
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8 h1:Nw54tB0rB7hY/N0NQvRW8DG4Yk3Q6T9cu9RcFQDu1tc=
|
||||||
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
||||||
google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
||||||
google.golang.org/genproto v0.0.0-20190522204451-c2c4e71fbf69/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s=
|
google.golang.org/genproto v0.0.0-20181029155118-b69ba1387ce2 h1:67iHsV9djwGdZpdZNbLuQj6FOzCaZe3w+vhLjn5AcFA=
|
||||||
|
google.golang.org/genproto v0.0.0-20181029155118-b69ba1387ce2/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
||||||
|
google.golang.org/grpc v1.13.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
|
||||||
google.golang.org/grpc v1.19.0 h1:cfg4PD8YEdSFnm7qLV4++93WcmhH2nIUhMjhdCvl3j8=
|
google.golang.org/grpc v1.19.0 h1:cfg4PD8YEdSFnm7qLV4++93WcmhH2nIUhMjhdCvl3j8=
|
||||||
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
||||||
|
google.golang.org/grpc v1.21.0 h1:G+97AoqBnmZIT91cLG/EkCoK9NSelj64P8bOHHNmGn0=
|
||||||
google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
|
google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
|
||||||
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
|
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
|
||||||
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
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-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4=
|
||||||
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
|
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
|
||||||
gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
|
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/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
|
||||||
gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
|
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.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
|
145
init/collect.go
145
init/collect.go
@ -1,145 +0,0 @@
|
|||||||
package init
|
|
||||||
|
|
||||||
// DONTCOVER
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"path/filepath"
|
|
||||||
|
|
||||||
"github.com/spf13/cobra"
|
|
||||||
"github.com/spf13/viper"
|
|
||||||
cfg "github.com/tendermint/tendermint/config"
|
|
||||||
"github.com/tendermint/tendermint/crypto"
|
|
||||||
"github.com/tendermint/tendermint/libs/cli"
|
|
||||||
"github.com/tendermint/tendermint/types"
|
|
||||||
|
|
||||||
"github.com/cosmos/cosmos-sdk/client"
|
|
||||||
"github.com/kava-labs/kava/app"
|
|
||||||
"github.com/cosmos/cosmos-sdk/codec"
|
|
||||||
"github.com/cosmos/cosmos-sdk/server"
|
|
||||||
"github.com/cosmos/cosmos-sdk/x/auth"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
flagGenTxDir = "gentx-dir"
|
|
||||||
)
|
|
||||||
|
|
||||||
type initConfig struct {
|
|
||||||
ChainID string
|
|
||||||
GenTxsDir string
|
|
||||||
Name string
|
|
||||||
NodeID string
|
|
||||||
ValPubKey crypto.PubKey
|
|
||||||
}
|
|
||||||
|
|
||||||
// nolint
|
|
||||||
func CollectGenTxsCmd(ctx *server.Context, cdc *codec.Codec) *cobra.Command {
|
|
||||||
cmd := &cobra.Command{
|
|
||||||
Use: "collect-gentxs",
|
|
||||||
Short: "Collect genesis txs and output a genesis.json file",
|
|
||||||
RunE: func(_ *cobra.Command, _ []string) error {
|
|
||||||
config := ctx.Config
|
|
||||||
config.SetRoot(viper.GetString(cli.HomeFlag))
|
|
||||||
name := viper.GetString(client.FlagName)
|
|
||||||
nodeID, valPubKey, err := InitializeNodeValidatorFiles(config)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
genDoc, err := LoadGenesisDoc(cdc, config.GenesisFile())
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
genTxsDir := viper.GetString(flagGenTxDir)
|
|
||||||
if genTxsDir == "" {
|
|
||||||
genTxsDir = filepath.Join(config.RootDir, "config", "gentx")
|
|
||||||
}
|
|
||||||
|
|
||||||
toPrint := newPrintInfo(config.Moniker, genDoc.ChainID, nodeID, genTxsDir, json.RawMessage(""))
|
|
||||||
initCfg := newInitConfig(genDoc.ChainID, genTxsDir, name, nodeID, valPubKey)
|
|
||||||
|
|
||||||
appMessage, err := genAppStateFromConfig(cdc, config, initCfg, genDoc)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
toPrint.AppMessage = appMessage
|
|
||||||
|
|
||||||
// print out some key information
|
|
||||||
return displayInfo(cdc, toPrint)
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
cmd.Flags().String(cli.HomeFlag, app.DefaultNodeHome, "node's home directory")
|
|
||||||
cmd.Flags().String(flagGenTxDir, "",
|
|
||||||
"override default \"gentx\" directory from which collect and execute "+
|
|
||||||
"genesis transactions; default [--home]/config/gentx/")
|
|
||||||
return cmd
|
|
||||||
}
|
|
||||||
|
|
||||||
func genAppStateFromConfig(
|
|
||||||
cdc *codec.Codec, config *cfg.Config, initCfg initConfig, genDoc types.GenesisDoc,
|
|
||||||
) (appState json.RawMessage, err error) {
|
|
||||||
|
|
||||||
genFile := config.GenesisFile()
|
|
||||||
var (
|
|
||||||
appGenTxs []auth.StdTx
|
|
||||||
persistentPeers string
|
|
||||||
genTxs []json.RawMessage
|
|
||||||
jsonRawTx json.RawMessage
|
|
||||||
)
|
|
||||||
|
|
||||||
// process genesis transactions, else create default genesis.json
|
|
||||||
appGenTxs, persistentPeers, err = app.CollectStdTxs(
|
|
||||||
cdc, config.Moniker, initCfg.GenTxsDir, genDoc,
|
|
||||||
)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
genTxs = make([]json.RawMessage, len(appGenTxs))
|
|
||||||
config.P2P.PersistentPeers = persistentPeers
|
|
||||||
|
|
||||||
for i, stdTx := range appGenTxs {
|
|
||||||
jsonRawTx, err = cdc.MarshalJSON(stdTx)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
genTxs[i] = jsonRawTx
|
|
||||||
}
|
|
||||||
|
|
||||||
cfg.WriteConfigFile(filepath.Join(config.RootDir, "config", "config.toml"), config)
|
|
||||||
|
|
||||||
appState, err = app.AppGenStateJSON(cdc, genDoc, genTxs)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
err = ExportGenesisFile(genFile, initCfg.ChainID, nil, appState)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func newInitConfig(chainID, genTxsDir, name, nodeID string,
|
|
||||||
valPubKey crypto.PubKey) initConfig {
|
|
||||||
|
|
||||||
return initConfig{
|
|
||||||
ChainID: chainID,
|
|
||||||
GenTxsDir: genTxsDir,
|
|
||||||
Name: name,
|
|
||||||
NodeID: nodeID,
|
|
||||||
ValPubKey: valPubKey,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func newPrintInfo(moniker, chainID, nodeID, genTxsDir string,
|
|
||||||
appMessage json.RawMessage) printInfo {
|
|
||||||
|
|
||||||
return printInfo{
|
|
||||||
Moniker: moniker,
|
|
||||||
ChainID: chainID,
|
|
||||||
NodeID: nodeID,
|
|
||||||
GenTxsDir: genTxsDir,
|
|
||||||
AppMessage: appMessage,
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,141 +0,0 @@
|
|||||||
package init
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
|
|
||||||
"github.com/spf13/cobra"
|
|
||||||
"github.com/spf13/viper"
|
|
||||||
"github.com/tendermint/tendermint/libs/cli"
|
|
||||||
"github.com/tendermint/tendermint/libs/common"
|
|
||||||
|
|
||||||
"github.com/cosmos/cosmos-sdk/client/keys"
|
|
||||||
"github.com/cosmos/cosmos-sdk/codec"
|
|
||||||
"github.com/cosmos/cosmos-sdk/server"
|
|
||||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
|
||||||
"github.com/cosmos/cosmos-sdk/x/auth"
|
|
||||||
"github.com/kava-labs/kava/app"
|
|
||||||
)
|
|
||||||
|
|
||||||
// AddGenesisAccountCmd returns add-genesis-account cobra Command.
|
|
||||||
func AddGenesisAccountCmd(ctx *server.Context, cdc *codec.Codec) *cobra.Command {
|
|
||||||
cmd := &cobra.Command{
|
|
||||||
Use: "add-genesis-account [address_or_key_name] [coin][,[coin]]",
|
|
||||||
Short: "Add genesis account to genesis.json",
|
|
||||||
Args: cobra.ExactArgs(2),
|
|
||||||
RunE: func(_ *cobra.Command, args []string) error {
|
|
||||||
config := ctx.Config
|
|
||||||
config.SetRoot(viper.GetString(cli.HomeFlag))
|
|
||||||
|
|
||||||
addr, err := sdk.AccAddressFromBech32(args[0])
|
|
||||||
if err != nil {
|
|
||||||
kb, err := keys.NewKeyBaseFromDir(viper.GetString(flagClientHome))
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
info, err := kb.Get(args[0])
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
addr = info.GetAddress()
|
|
||||||
}
|
|
||||||
|
|
||||||
coins, err := sdk.ParseCoins(args[1])
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
vestingStart := viper.GetInt64(flagVestingStart)
|
|
||||||
vestingEnd := viper.GetInt64(flagVestingEnd)
|
|
||||||
vestingAmt, err := sdk.ParseCoins(viper.GetString(flagVestingAmt))
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
genFile := config.GenesisFile()
|
|
||||||
if !common.FileExists(genFile) {
|
|
||||||
return fmt.Errorf("%s does not exist, run `kvd init` first", genFile)
|
|
||||||
}
|
|
||||||
|
|
||||||
genDoc, err := LoadGenesisDoc(cdc, genFile)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
var appState app.GenesisState
|
|
||||||
if err = cdc.UnmarshalJSON(genDoc.AppState, &appState); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
appState, err = addGenesisAccount(cdc, appState, addr, coins, vestingAmt, vestingStart, vestingEnd)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
appStateJSON, err := cdc.MarshalJSON(appState)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return ExportGenesisFile(genFile, genDoc.ChainID, nil, appStateJSON)
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
cmd.Flags().String(cli.HomeFlag, app.DefaultNodeHome, "node's home directory")
|
|
||||||
cmd.Flags().String(flagClientHome, app.DefaultCLIHome, "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 addGenesisAccount(
|
|
||||||
cdc *codec.Codec, appState app.GenesisState, addr sdk.AccAddress,
|
|
||||||
coins, vestingAmt sdk.Coins, vestingStart, vestingEnd int64,
|
|
||||||
) (app.GenesisState, error) {
|
|
||||||
|
|
||||||
for _, stateAcc := range appState.Accounts {
|
|
||||||
if stateAcc.Address.Equals(addr) {
|
|
||||||
return appState, fmt.Errorf("the application state already contains account %v", addr)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
acc := auth.NewBaseAccountWithAddress(addr)
|
|
||||||
acc.Coins = coins
|
|
||||||
|
|
||||||
if !vestingAmt.IsZero() {
|
|
||||||
var vacc auth.VestingAccount
|
|
||||||
|
|
||||||
bvacc := &auth.BaseVestingAccount{
|
|
||||||
BaseAccount: &acc,
|
|
||||||
OriginalVesting: vestingAmt,
|
|
||||||
EndTime: vestingEnd,
|
|
||||||
}
|
|
||||||
|
|
||||||
if bvacc.OriginalVesting.IsAllGT(acc.Coins) {
|
|
||||||
return appState, fmt.Errorf("vesting amount cannot be greater than total amount")
|
|
||||||
}
|
|
||||||
if vestingStart >= vestingEnd {
|
|
||||||
return appState, fmt.Errorf("vesting start time must before end time")
|
|
||||||
}
|
|
||||||
|
|
||||||
if vestingStart != 0 {
|
|
||||||
vacc = &auth.ContinuousVestingAccount{
|
|
||||||
BaseVestingAccount: bvacc,
|
|
||||||
StartTime: vestingStart,
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
vacc = &auth.DelayedVestingAccount{
|
|
||||||
BaseVestingAccount: bvacc,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
appState.Accounts = append(appState.Accounts, app.NewGenesisAccountI(vacc))
|
|
||||||
} else {
|
|
||||||
appState.Accounts = append(appState.Accounts, app.NewGenesisAccount(&acc))
|
|
||||||
}
|
|
||||||
|
|
||||||
return appState, nil
|
|
||||||
}
|
|
@ -1,88 +0,0 @@
|
|||||||
package init
|
|
||||||
|
|
||||||
import (
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/stretchr/testify/require"
|
|
||||||
"github.com/tendermint/tendermint/crypto/secp256k1"
|
|
||||||
|
|
||||||
"github.com/kava-labs/kava/app"
|
|
||||||
"github.com/cosmos/cosmos-sdk/codec"
|
|
||||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestAddGenesisAccount(t *testing.T) {
|
|
||||||
cdc := codec.New()
|
|
||||||
addr1 := sdk.AccAddress(secp256k1.GenPrivKey().PubKey().Address())
|
|
||||||
type args struct {
|
|
||||||
appState app.GenesisState
|
|
||||||
addr sdk.AccAddress
|
|
||||||
coins sdk.Coins
|
|
||||||
vestingAmt sdk.Coins
|
|
||||||
vestingStart int64
|
|
||||||
vestingEnd int64
|
|
||||||
}
|
|
||||||
tests := []struct {
|
|
||||||
name string
|
|
||||||
args args
|
|
||||||
wantErr bool
|
|
||||||
}{
|
|
||||||
{
|
|
||||||
"valid account",
|
|
||||||
args{
|
|
||||||
app.GenesisState{},
|
|
||||||
addr1,
|
|
||||||
sdk.NewCoins(),
|
|
||||||
sdk.NewCoins(),
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
},
|
|
||||||
false,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"dup account",
|
|
||||||
args{
|
|
||||||
app.GenesisState{Accounts: []app.GenesisAccount{{Address: addr1}}},
|
|
||||||
addr1,
|
|
||||||
sdk.NewCoins(),
|
|
||||||
sdk.NewCoins(),
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
},
|
|
||||||
true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"invalid vesting amount",
|
|
||||||
args{
|
|
||||||
app.GenesisState{},
|
|
||||||
addr1,
|
|
||||||
sdk.NewCoins(sdk.NewInt64Coin("stake", 50)),
|
|
||||||
sdk.NewCoins(sdk.NewInt64Coin("stake", 100)),
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
},
|
|
||||||
true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"invalid vesting times",
|
|
||||||
args{
|
|
||||||
app.GenesisState{},
|
|
||||||
addr1,
|
|
||||||
sdk.NewCoins(sdk.NewInt64Coin("stake", 50)),
|
|
||||||
sdk.NewCoins(sdk.NewInt64Coin("stake", 50)),
|
|
||||||
1654668078,
|
|
||||||
1554668078,
|
|
||||||
},
|
|
||||||
true,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
for _, tt := range tests {
|
|
||||||
t.Run(tt.name, func(t *testing.T) {
|
|
||||||
_, err := addGenesisAccount(
|
|
||||||
cdc, tt.args.appState, tt.args.addr, tt.args.coins,
|
|
||||||
tt.args.vestingAmt, tt.args.vestingStart, tt.args.vestingEnd,
|
|
||||||
)
|
|
||||||
require.Equal(t, tt.wantErr, (err != nil))
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
312
init/gentx.go
312
init/gentx.go
@ -1,312 +0,0 @@
|
|||||||
package init
|
|
||||||
|
|
||||||
// DONTCOVER
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"fmt"
|
|
||||||
"io"
|
|
||||||
"io/ioutil"
|
|
||||||
"os"
|
|
||||||
"path/filepath"
|
|
||||||
|
|
||||||
"github.com/spf13/cobra"
|
|
||||||
"github.com/spf13/viper"
|
|
||||||
|
|
||||||
cfg "github.com/tendermint/tendermint/config"
|
|
||||||
"github.com/tendermint/tendermint/crypto"
|
|
||||||
tmcli "github.com/tendermint/tendermint/libs/cli"
|
|
||||||
"github.com/tendermint/tendermint/libs/common"
|
|
||||||
|
|
||||||
"github.com/cosmos/cosmos-sdk/client"
|
|
||||||
"github.com/cosmos/cosmos-sdk/client/context"
|
|
||||||
"github.com/cosmos/cosmos-sdk/client/keys"
|
|
||||||
"github.com/cosmos/cosmos-sdk/client/utils"
|
|
||||||
"github.com/cosmos/cosmos-sdk/codec"
|
|
||||||
kbkeys "github.com/cosmos/cosmos-sdk/crypto/keys"
|
|
||||||
"github.com/cosmos/cosmos-sdk/server"
|
|
||||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
|
||||||
"github.com/cosmos/cosmos-sdk/x/auth"
|
|
||||||
authtxb "github.com/cosmos/cosmos-sdk/x/auth/client/txbuilder"
|
|
||||||
"github.com/cosmos/cosmos-sdk/x/staking/client/cli"
|
|
||||||
"github.com/kava-labs/kava/app"
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
defaultTokens = sdk.TokensFromTendermintPower(100)
|
|
||||||
defaultAmount = defaultTokens.String() + sdk.DefaultBondDenom
|
|
||||||
defaultCommissionRate = "0.1"
|
|
||||||
defaultCommissionMaxRate = "0.2"
|
|
||||||
defaultCommissionMaxChangeRate = "0.01"
|
|
||||||
defaultMinSelfDelegation = "1"
|
|
||||||
)
|
|
||||||
|
|
||||||
// GenTxCmd builds the kvd gentx command.
|
|
||||||
// nolint: errcheck
|
|
||||||
func GenTxCmd(ctx *server.Context, cdc *codec.Codec) *cobra.Command {
|
|
||||||
cmd := &cobra.Command{
|
|
||||||
Use: "gentx",
|
|
||||||
Short: "Generate a genesis tx carrying a self delegation",
|
|
||||||
Args: cobra.NoArgs,
|
|
||||||
Long: fmt.Sprintf(`This command is an alias of the 'kvd tx create-validator' command'.
|
|
||||||
|
|
||||||
It creates a genesis piece carrying a self delegation with the
|
|
||||||
following delegation and commission default parameters:
|
|
||||||
|
|
||||||
delegation amount: %s
|
|
||||||
commission rate: %s
|
|
||||||
commission max rate: %s
|
|
||||||
commission max change rate: %s
|
|
||||||
minimum self delegation: %s
|
|
||||||
`, defaultAmount, defaultCommissionRate, defaultCommissionMaxRate, defaultCommissionMaxChangeRate, defaultMinSelfDelegation),
|
|
||||||
RunE: func(cmd *cobra.Command, args []string) error {
|
|
||||||
|
|
||||||
config := ctx.Config
|
|
||||||
config.SetRoot(viper.GetString(tmcli.HomeFlag))
|
|
||||||
nodeID, valPubKey, err := InitializeNodeValidatorFiles(ctx.Config)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Read --nodeID, if empty take it from priv_validator.json
|
|
||||||
if nodeIDString := viper.GetString(cli.FlagNodeID); nodeIDString != "" {
|
|
||||||
nodeID = nodeIDString
|
|
||||||
}
|
|
||||||
|
|
||||||
ip := viper.GetString(cli.FlagIP)
|
|
||||||
if ip == "" {
|
|
||||||
fmt.Fprintf(os.Stderr, "couldn't retrieve an external IP; "+
|
|
||||||
"the tx's memo field will be unset")
|
|
||||||
}
|
|
||||||
|
|
||||||
genDoc, err := LoadGenesisDoc(cdc, config.GenesisFile())
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
genesisState := app.GenesisState{}
|
|
||||||
if err = cdc.UnmarshalJSON(genDoc.AppState, &genesisState); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if err = app.ValidateGenesisState(genesisState); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
kb, err := keys.NewKeyBaseFromDir(viper.GetString(flagClientHome))
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
name := viper.GetString(client.FlagName)
|
|
||||||
key, err := kb.Get(name)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Read --pubkey, if empty take it from priv_validator.json
|
|
||||||
if valPubKeyString := viper.GetString(cli.FlagPubKey); valPubKeyString != "" {
|
|
||||||
valPubKey, err = sdk.GetConsPubKeyBech32(valPubKeyString)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
website := viper.GetString(cli.FlagWebsite)
|
|
||||||
details := viper.GetString(cli.FlagDetails)
|
|
||||||
identity := viper.GetString(cli.FlagIdentity)
|
|
||||||
|
|
||||||
// Set flags for creating gentx
|
|
||||||
prepareFlagsForTxCreateValidator(config, nodeID, ip, genDoc.ChainID, valPubKey, website, details, identity)
|
|
||||||
|
|
||||||
// Fetch the amount of coins staked
|
|
||||||
amount := viper.GetString(cli.FlagAmount)
|
|
||||||
coins, err := sdk.ParseCoins(amount)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = accountInGenesis(genesisState, key.GetAddress(), coins)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
txBldr := authtxb.NewTxBuilderFromCLI().WithTxEncoder(utils.GetTxEncoder(cdc))
|
|
||||||
cliCtx := context.NewCLIContext().WithCodec(cdc)
|
|
||||||
|
|
||||||
// XXX: Set the generate-only flag here after the CLI context has
|
|
||||||
// been created. This allows the from name/key to be correctly populated.
|
|
||||||
//
|
|
||||||
// TODO: Consider removing the manual setting of generate-only in
|
|
||||||
// favor of a 'gentx' flag in the create-validator command.
|
|
||||||
viper.Set(client.FlagGenerateOnly, true)
|
|
||||||
|
|
||||||
// create a 'create-validator' message
|
|
||||||
txBldr, msg, err := cli.BuildCreateValidatorMsg(cliCtx, txBldr)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
info, err := txBldr.Keybase().Get(name)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if info.GetType() == kbkeys.TypeOffline || info.GetType() == kbkeys.TypeMulti {
|
|
||||||
fmt.Println("Offline key passed in. Use `kvcli tx sign` command to sign:")
|
|
||||||
return utils.PrintUnsignedStdTx(txBldr, cliCtx, []sdk.Msg{msg}, true)
|
|
||||||
}
|
|
||||||
|
|
||||||
// write the unsigned transaction to the buffer
|
|
||||||
w := bytes.NewBuffer([]byte{})
|
|
||||||
cliCtx = cliCtx.WithOutput(w)
|
|
||||||
|
|
||||||
if err = utils.PrintUnsignedStdTx(txBldr, cliCtx, []sdk.Msg{msg}, true); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// read the transaction
|
|
||||||
stdTx, err := readUnsignedGenTxFile(cdc, w)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// sign the transaction and write it to the output file
|
|
||||||
signedTx, err := utils.SignStdTx(txBldr, cliCtx, name, stdTx, false, true)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Fetch output file name
|
|
||||||
outputDocument := viper.GetString(client.FlagOutputDocument)
|
|
||||||
if outputDocument == "" {
|
|
||||||
outputDocument, err = makeOutputFilepath(config.RootDir, nodeID)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := writeSignedGenTx(cdc, outputDocument, signedTx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
fmt.Fprintf(os.Stderr, "Genesis transaction written to %q\n", outputDocument)
|
|
||||||
return nil
|
|
||||||
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
ip, _ := server.ExternalIP()
|
|
||||||
|
|
||||||
cmd.Flags().String(tmcli.HomeFlag, app.DefaultNodeHome, "node's home directory")
|
|
||||||
cmd.Flags().String(flagClientHome, app.DefaultCLIHome, "client's home directory")
|
|
||||||
cmd.Flags().String(client.FlagName, "", "name of private key with which to sign the gentx")
|
|
||||||
cmd.Flags().String(client.FlagOutputDocument, "",
|
|
||||||
"write the genesis transaction JSON document to the given file instead of the default location")
|
|
||||||
cmd.Flags().String(cli.FlagIP, ip, "The node's public IP")
|
|
||||||
cmd.Flags().String(cli.FlagNodeID, "", "The node's NodeID")
|
|
||||||
cmd.Flags().String(cli.FlagWebsite, "", "The validator's (optional) website")
|
|
||||||
cmd.Flags().String(cli.FlagDetails, "", "The validator's (optional) details")
|
|
||||||
cmd.Flags().String(cli.FlagIdentity, "", "The (optional) identity signature (ex. UPort or Keybase)")
|
|
||||||
cmd.Flags().AddFlagSet(cli.FsCommissionCreate)
|
|
||||||
cmd.Flags().AddFlagSet(cli.FsMinSelfDelegation)
|
|
||||||
cmd.Flags().AddFlagSet(cli.FsAmount)
|
|
||||||
cmd.Flags().AddFlagSet(cli.FsPk)
|
|
||||||
cmd.MarkFlagRequired(client.FlagName)
|
|
||||||
return cmd
|
|
||||||
}
|
|
||||||
|
|
||||||
func accountInGenesis(genesisState app.GenesisState, key sdk.AccAddress, coins sdk.Coins) error {
|
|
||||||
accountIsInGenesis := false
|
|
||||||
bondDenom := genesisState.StakingData.Params.BondDenom
|
|
||||||
|
|
||||||
// Check if the account is in genesis
|
|
||||||
for _, acc := range genesisState.Accounts {
|
|
||||||
// Ensure that account is in genesis
|
|
||||||
if acc.Address.Equals(key) {
|
|
||||||
|
|
||||||
// Ensure account contains enough funds of default bond denom
|
|
||||||
if coins.AmountOf(bondDenom).GT(acc.Coins.AmountOf(bondDenom)) {
|
|
||||||
return fmt.Errorf(
|
|
||||||
"account %v is in genesis, but it only has %v%v available to stake, not %v%v",
|
|
||||||
key.String(), acc.Coins.AmountOf(bondDenom), bondDenom, coins.AmountOf(bondDenom), bondDenom,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
accountIsInGenesis = true
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if accountIsInGenesis {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
return fmt.Errorf("account %s in not in the app_state.accounts array of genesis.json", key)
|
|
||||||
}
|
|
||||||
|
|
||||||
func prepareFlagsForTxCreateValidator(
|
|
||||||
config *cfg.Config, nodeID, ip, chainID string, valPubKey crypto.PubKey, website, details, identity string,
|
|
||||||
) {
|
|
||||||
viper.Set(tmcli.HomeFlag, viper.GetString(flagClientHome))
|
|
||||||
viper.Set(client.FlagChainID, chainID)
|
|
||||||
viper.Set(client.FlagFrom, viper.GetString(client.FlagName))
|
|
||||||
viper.Set(cli.FlagNodeID, nodeID)
|
|
||||||
viper.Set(cli.FlagIP, ip)
|
|
||||||
viper.Set(cli.FlagPubKey, sdk.MustBech32ifyConsPub(valPubKey))
|
|
||||||
viper.Set(cli.FlagMoniker, config.Moniker)
|
|
||||||
viper.Set(cli.FlagWebsite, website)
|
|
||||||
viper.Set(cli.FlagDetails, details)
|
|
||||||
viper.Set(cli.FlagIdentity, identity)
|
|
||||||
|
|
||||||
if config.Moniker == "" {
|
|
||||||
viper.Set(cli.FlagMoniker, viper.GetString(client.FlagName))
|
|
||||||
}
|
|
||||||
if viper.GetString(cli.FlagAmount) == "" {
|
|
||||||
viper.Set(cli.FlagAmount, defaultAmount)
|
|
||||||
}
|
|
||||||
if viper.GetString(cli.FlagCommissionRate) == "" {
|
|
||||||
viper.Set(cli.FlagCommissionRate, defaultCommissionRate)
|
|
||||||
}
|
|
||||||
if viper.GetString(cli.FlagCommissionMaxRate) == "" {
|
|
||||||
viper.Set(cli.FlagCommissionMaxRate, defaultCommissionMaxRate)
|
|
||||||
}
|
|
||||||
if viper.GetString(cli.FlagCommissionMaxChangeRate) == "" {
|
|
||||||
viper.Set(cli.FlagCommissionMaxChangeRate, defaultCommissionMaxChangeRate)
|
|
||||||
}
|
|
||||||
if viper.GetString(cli.FlagMinSelfDelegation) == "" {
|
|
||||||
viper.Set(cli.FlagMinSelfDelegation, defaultMinSelfDelegation)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func makeOutputFilepath(rootDir, nodeID string) (string, error) {
|
|
||||||
writePath := filepath.Join(rootDir, "config", "gentx")
|
|
||||||
if err := common.EnsureDir(writePath, 0700); err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
return filepath.Join(writePath, fmt.Sprintf("gentx-%v.json", nodeID)), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func readUnsignedGenTxFile(cdc *codec.Codec, r io.Reader) (auth.StdTx, error) {
|
|
||||||
var stdTx auth.StdTx
|
|
||||||
bytes, err := ioutil.ReadAll(r)
|
|
||||||
if err != nil {
|
|
||||||
return stdTx, err
|
|
||||||
}
|
|
||||||
err = cdc.UnmarshalJSON(bytes, &stdTx)
|
|
||||||
return stdTx, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// nolint: errcheck
|
|
||||||
func writeSignedGenTx(cdc *codec.Codec, outputDocument string, tx auth.StdTx) error {
|
|
||||||
outputFile, err := os.OpenFile(outputDocument, os.O_CREATE|os.O_EXCL|os.O_WRONLY, 0644)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
defer outputFile.Close()
|
|
||||||
json, err := cdc.MarshalJSON(tx)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
_, err = fmt.Fprintf(outputFile, "%s\n", json)
|
|
||||||
return err
|
|
||||||
}
|
|
@ -1,85 +0,0 @@
|
|||||||
package init
|
|
||||||
|
|
||||||
import (
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/cosmos/cosmos-sdk/server"
|
|
||||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
|
||||||
"github.com/cosmos/cosmos-sdk/x/staking/client/cli"
|
|
||||||
"github.com/spf13/viper"
|
|
||||||
"github.com/stretchr/testify/require"
|
|
||||||
tcmd "github.com/tendermint/tendermint/cmd/tendermint/commands"
|
|
||||||
cfg "github.com/tendermint/tendermint/config"
|
|
||||||
"github.com/tendermint/tendermint/crypto"
|
|
||||||
"github.com/tendermint/tendermint/libs/log"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Test_prepareFlagsForTxCreateValidator(t *testing.T) {
|
|
||||||
defer server.SetupViper(t)()
|
|
||||||
defer setupClientHome(t)()
|
|
||||||
config, err := tcmd.ParseConfig()
|
|
||||||
require.Nil(t, err)
|
|
||||||
logger := log.NewNopLogger()
|
|
||||||
ctx := server.NewContext(config, logger)
|
|
||||||
|
|
||||||
valPubKey, _ := sdk.GetConsPubKeyBech32("cosmosvalconspub1zcjduepq7jsrkl9fgqk0wj3ahmfr8pgxj6vakj2wzn656s8pehh0zhv2w5as5gd80a")
|
|
||||||
|
|
||||||
type args struct {
|
|
||||||
config *cfg.Config
|
|
||||||
nodeID string
|
|
||||||
ip string
|
|
||||||
chainID string
|
|
||||||
valPubKey crypto.PubKey
|
|
||||||
website string
|
|
||||||
details string
|
|
||||||
identity string
|
|
||||||
}
|
|
||||||
|
|
||||||
type extraParams struct {
|
|
||||||
amount string
|
|
||||||
commissionRate string
|
|
||||||
commissionMaxRate string
|
|
||||||
commissionMaxChangeRate string
|
|
||||||
minSelfDelegation string
|
|
||||||
}
|
|
||||||
|
|
||||||
type testcase struct {
|
|
||||||
name string
|
|
||||||
args args
|
|
||||||
}
|
|
||||||
|
|
||||||
runTest := func(t *testing.T, tt testcase, params extraParams) {
|
|
||||||
prepareFlagsForTxCreateValidator(tt.args.config, tt.args.nodeID, tt.args.ip, tt.args.chainID, tt.args.valPubKey, tt.args.website, tt.args.details, tt.args.identity)
|
|
||||||
require.Equal(t, tt.args.website, viper.GetString(cli.FlagWebsite))
|
|
||||||
require.Equal(t, tt.args.details, viper.GetString(cli.FlagDetails))
|
|
||||||
require.Equal(t, tt.args.identity, viper.GetString(cli.FlagIdentity))
|
|
||||||
require.Equal(t, params.amount, viper.GetString(cli.FlagAmount))
|
|
||||||
require.Equal(t, params.commissionRate, viper.GetString(cli.FlagCommissionRate))
|
|
||||||
require.Equal(t, params.commissionMaxRate, viper.GetString(cli.FlagCommissionMaxRate))
|
|
||||||
require.Equal(t, params.commissionMaxChangeRate, viper.GetString(cli.FlagCommissionMaxChangeRate))
|
|
||||||
require.Equal(t, params.minSelfDelegation, viper.GetString(cli.FlagMinSelfDelegation))
|
|
||||||
}
|
|
||||||
|
|
||||||
tests := []testcase{
|
|
||||||
{"No parameters", args{ctx.Config, "X", "0.0.0.0", "chainId", valPubKey, "", "", ""}},
|
|
||||||
{"Optional parameters fed", args{ctx.Config, "X", "0.0.0.0", "chainId", valPubKey, "cosmos.network", "details", "identity"}},
|
|
||||||
}
|
|
||||||
|
|
||||||
defaultParams := extraParams{defaultAmount, defaultCommissionRate, defaultCommissionMaxRate, defaultCommissionMaxChangeRate, defaultMinSelfDelegation}
|
|
||||||
for _, tt := range tests {
|
|
||||||
t.Run(tt.name, func(t *testing.T) {
|
|
||||||
t.Run(tt.name, func(t *testing.T) { runTest(t, tt, defaultParams) })
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
// Override default params
|
|
||||||
params := extraParams{"5stake", "1.0", "1.0", "1.0", "1.0"}
|
|
||||||
viper.Set(cli.FlagAmount, params.amount)
|
|
||||||
viper.Set(cli.FlagCommissionRate, params.commissionRate)
|
|
||||||
viper.Set(cli.FlagCommissionMaxRate, params.commissionMaxRate)
|
|
||||||
viper.Set(cli.FlagCommissionMaxChangeRate, params.commissionMaxChangeRate)
|
|
||||||
viper.Set(cli.FlagMinSelfDelegation, params.minSelfDelegation)
|
|
||||||
for _, tt := range tests {
|
|
||||||
t.Run(tt.name, func(t *testing.T) { runTest(t, tt, params) })
|
|
||||||
}
|
|
||||||
}
|
|
95
init/init.go
95
init/init.go
@ -1,95 +0,0 @@
|
|||||||
package init
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
|
||||||
"os"
|
|
||||||
"path/filepath"
|
|
||||||
|
|
||||||
"github.com/spf13/cobra"
|
|
||||||
"github.com/spf13/viper"
|
|
||||||
cfg "github.com/tendermint/tendermint/config"
|
|
||||||
"github.com/tendermint/tendermint/libs/cli"
|
|
||||||
"github.com/tendermint/tendermint/libs/common"
|
|
||||||
|
|
||||||
"github.com/cosmos/cosmos-sdk/client"
|
|
||||||
"github.com/kava-labs/kava/app"
|
|
||||||
"github.com/cosmos/cosmos-sdk/codec"
|
|
||||||
"github.com/cosmos/cosmos-sdk/server"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
flagOverwrite = "overwrite"
|
|
||||||
flagClientHome = "home-client"
|
|
||||||
flagVestingStart = "vesting-start-time"
|
|
||||||
flagVestingEnd = "vesting-end-time"
|
|
||||||
flagVestingAmt = "vesting-amount"
|
|
||||||
)
|
|
||||||
|
|
||||||
type printInfo struct {
|
|
||||||
Moniker string `json:"moniker"`
|
|
||||||
ChainID string `json:"chain_id"`
|
|
||||||
NodeID string `json:"node_id"`
|
|
||||||
GenTxsDir string `json:"gentxs_dir"`
|
|
||||||
AppMessage json.RawMessage `json:"app_message"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func displayInfo(cdc *codec.Codec, info printInfo) error {
|
|
||||||
out, err := codec.MarshalJSONIndent(cdc, info)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
fmt.Fprintf(os.Stderr, "%s\n", string(out)) // nolint: errcheck
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// InitCmd returns a command that initializes all files needed for Tendermint
|
|
||||||
// and the respective application.
|
|
||||||
func InitCmd(ctx *server.Context, cdc *codec.Codec) *cobra.Command { // nolint: golint
|
|
||||||
cmd := &cobra.Command{
|
|
||||||
Use: "init [moniker]",
|
|
||||||
Short: "Initialize private validator, p2p, genesis, and application configuration files",
|
|
||||||
Long: `Initialize validators's and node's configuration files.`,
|
|
||||||
Args: cobra.ExactArgs(1),
|
|
||||||
RunE: func(_ *cobra.Command, args []string) error {
|
|
||||||
config := ctx.Config
|
|
||||||
config.SetRoot(viper.GetString(cli.HomeFlag))
|
|
||||||
|
|
||||||
chainID := viper.GetString(client.FlagChainID)
|
|
||||||
if chainID == "" {
|
|
||||||
chainID = fmt.Sprintf("test-chain-%v", common.RandStr(6))
|
|
||||||
}
|
|
||||||
|
|
||||||
nodeID, _, err := InitializeNodeValidatorFiles(config)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
config.Moniker = args[0]
|
|
||||||
|
|
||||||
var appState json.RawMessage
|
|
||||||
genFile := config.GenesisFile()
|
|
||||||
|
|
||||||
if appState, err = initializeEmptyGenesis(cdc, genFile, chainID,
|
|
||||||
viper.GetBool(flagOverwrite)); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if err = ExportGenesisFile(genFile, chainID, nil, appState); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
toPrint := newPrintInfo(config.Moniker, chainID, nodeID, "", appState)
|
|
||||||
|
|
||||||
cfg.WriteConfigFile(filepath.Join(config.RootDir, "config", "config.toml"), config)
|
|
||||||
return displayInfo(cdc, toPrint)
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
cmd.Flags().String(cli.HomeFlag, app.DefaultNodeHome, "node's home directory")
|
|
||||||
cmd.Flags().BoolP(flagOverwrite, "o", false, "overwrite the genesis.json file")
|
|
||||||
cmd.Flags().String(client.FlagChainID, "", "genesis file chain-id, if left blank will be randomly created")
|
|
||||||
|
|
||||||
return cmd
|
|
||||||
}
|
|
@ -1,136 +0,0 @@
|
|||||||
package init
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"io"
|
|
||||||
"io/ioutil"
|
|
||||||
"os"
|
|
||||||
"testing"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/cosmos/cosmos-sdk/client"
|
|
||||||
"github.com/kava-labs/kava/app"
|
|
||||||
"github.com/cosmos/cosmos-sdk/server"
|
|
||||||
"github.com/cosmos/cosmos-sdk/server/mock"
|
|
||||||
"github.com/spf13/viper"
|
|
||||||
"github.com/stretchr/testify/require"
|
|
||||||
abciServer "github.com/tendermint/tendermint/abci/server"
|
|
||||||
tcmd "github.com/tendermint/tendermint/cmd/tendermint/commands"
|
|
||||||
"github.com/tendermint/tendermint/libs/cli"
|
|
||||||
"github.com/tendermint/tendermint/libs/log"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestInitCmd(t *testing.T) {
|
|
||||||
defer server.SetupViper(t)()
|
|
||||||
defer setupClientHome(t)()
|
|
||||||
|
|
||||||
logger := log.NewNopLogger()
|
|
||||||
cfg, err := tcmd.ParseConfig()
|
|
||||||
require.Nil(t, err)
|
|
||||||
|
|
||||||
ctx := server.NewContext(cfg, logger)
|
|
||||||
cdc := app.MakeCodec()
|
|
||||||
cmd := InitCmd(ctx, cdc)
|
|
||||||
|
|
||||||
require.NoError(t, cmd.RunE(nil, []string{"kavanode-test"}))
|
|
||||||
}
|
|
||||||
|
|
||||||
func setupClientHome(t *testing.T) func() {
|
|
||||||
clientDir, err := ioutil.TempDir("", "mock-sdk-cmd")
|
|
||||||
require.Nil(t, err)
|
|
||||||
viper.Set(flagClientHome, clientDir)
|
|
||||||
return func() {
|
|
||||||
if err := os.RemoveAll(clientDir); err != nil {
|
|
||||||
// TODO: Handle with #870
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestEmptyState(t *testing.T) {
|
|
||||||
defer server.SetupViper(t)()
|
|
||||||
defer setupClientHome(t)()
|
|
||||||
|
|
||||||
logger := log.NewNopLogger()
|
|
||||||
cfg, err := tcmd.ParseConfig()
|
|
||||||
require.Nil(t, err)
|
|
||||||
|
|
||||||
ctx := server.NewContext(cfg, logger)
|
|
||||||
cdc := app.MakeCodec()
|
|
||||||
|
|
||||||
cmd := InitCmd(ctx, cdc)
|
|
||||||
require.NoError(t, cmd.RunE(nil, []string{"kavanode-test"}))
|
|
||||||
|
|
||||||
old := os.Stdout
|
|
||||||
r, w, _ := os.Pipe()
|
|
||||||
os.Stdout = w
|
|
||||||
cmd = server.ExportCmd(ctx, cdc, nil)
|
|
||||||
|
|
||||||
err = cmd.RunE(nil, nil)
|
|
||||||
require.NoError(t, err)
|
|
||||||
|
|
||||||
outC := make(chan string)
|
|
||||||
go func() {
|
|
||||||
var buf bytes.Buffer
|
|
||||||
io.Copy(&buf, r)
|
|
||||||
outC <- buf.String()
|
|
||||||
}()
|
|
||||||
|
|
||||||
w.Close()
|
|
||||||
os.Stdout = old
|
|
||||||
out := <-outC
|
|
||||||
require.Contains(t, out, "genesis_time")
|
|
||||||
require.Contains(t, out, "chain_id")
|
|
||||||
require.Contains(t, out, "consensus_params")
|
|
||||||
require.Contains(t, out, "validators")
|
|
||||||
require.Contains(t, out, "app_hash")
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestStartStandAlone(t *testing.T) {
|
|
||||||
home, err := ioutil.TempDir("", "mock-sdk-cmd")
|
|
||||||
require.Nil(t, err)
|
|
||||||
defer func() {
|
|
||||||
os.RemoveAll(home)
|
|
||||||
}()
|
|
||||||
viper.Set(cli.HomeFlag, home)
|
|
||||||
defer setupClientHome(t)()
|
|
||||||
|
|
||||||
logger := log.NewNopLogger()
|
|
||||||
cfg, err := tcmd.ParseConfig()
|
|
||||||
require.Nil(t, err)
|
|
||||||
ctx := server.NewContext(cfg, logger)
|
|
||||||
cdc := app.MakeCodec()
|
|
||||||
initCmd := InitCmd(ctx, cdc)
|
|
||||||
require.NoError(t, initCmd.RunE(nil, []string{"kavanode-test"}))
|
|
||||||
|
|
||||||
app, err := mock.NewApp(home, logger)
|
|
||||||
require.Nil(t, err)
|
|
||||||
svrAddr, _, err := server.FreeTCPAddr()
|
|
||||||
require.Nil(t, err)
|
|
||||||
svr, err := abciServer.NewServer(svrAddr, "socket", app)
|
|
||||||
require.Nil(t, err, "error creating listener")
|
|
||||||
svr.SetLogger(logger.With("module", "abci-server"))
|
|
||||||
svr.Start()
|
|
||||||
|
|
||||||
timer := time.NewTimer(time.Duration(2) * time.Second)
|
|
||||||
select {
|
|
||||||
case <-timer.C:
|
|
||||||
svr.Stop()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestInitNodeValidatorFiles(t *testing.T) {
|
|
||||||
home, err := ioutil.TempDir("", "mock-sdk-cmd")
|
|
||||||
require.Nil(t, err)
|
|
||||||
defer func() {
|
|
||||||
os.RemoveAll(home)
|
|
||||||
}()
|
|
||||||
viper.Set(cli.HomeFlag, home)
|
|
||||||
viper.Set(client.FlagName, "moniker")
|
|
||||||
cfg, err := tcmd.ParseConfig()
|
|
||||||
require.Nil(t, err)
|
|
||||||
nodeID, valPubKey, err := InitializeNodeValidatorFiles(cfg)
|
|
||||||
require.Nil(t, err)
|
|
||||||
require.NotEqual(t, "", nodeID)
|
|
||||||
require.NotEqual(t, 0, len(valPubKey.Bytes()))
|
|
||||||
}
|
|
385
init/testnet.go
385
init/testnet.go
@ -1,385 +0,0 @@
|
|||||||
package init
|
|
||||||
|
|
||||||
// DONTCOVER
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
|
||||||
"net"
|
|
||||||
"os"
|
|
||||||
"path/filepath"
|
|
||||||
|
|
||||||
"github.com/cosmos/cosmos-sdk/client/keys"
|
|
||||||
|
|
||||||
"github.com/cosmos/cosmos-sdk/client"
|
|
||||||
"github.com/cosmos/cosmos-sdk/codec"
|
|
||||||
srvconfig "github.com/cosmos/cosmos-sdk/server/config"
|
|
||||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
|
||||||
"github.com/cosmos/cosmos-sdk/x/auth"
|
|
||||||
authtx "github.com/cosmos/cosmos-sdk/x/auth/client/txbuilder"
|
|
||||||
"github.com/cosmos/cosmos-sdk/x/staking"
|
|
||||||
"github.com/kava-labs/kava/app"
|
|
||||||
|
|
||||||
"github.com/spf13/cobra"
|
|
||||||
"github.com/spf13/viper"
|
|
||||||
tmconfig "github.com/tendermint/tendermint/config"
|
|
||||||
"github.com/tendermint/tendermint/crypto"
|
|
||||||
cmn "github.com/tendermint/tendermint/libs/common"
|
|
||||||
"github.com/tendermint/tendermint/types"
|
|
||||||
tmtime "github.com/tendermint/tendermint/types/time"
|
|
||||||
|
|
||||||
"github.com/cosmos/cosmos-sdk/server"
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
flagNodeDirPrefix = "node-dir-prefix"
|
|
||||||
flagNumValidators = "v"
|
|
||||||
flagOutputDir = "output-dir"
|
|
||||||
flagNodeDaemonHome = "node-daemon-home"
|
|
||||||
flagNodeCliHome = "node-cli-home"
|
|
||||||
flagStartingIPAddress = "starting-ip-address"
|
|
||||||
)
|
|
||||||
|
|
||||||
const nodeDirPerm = 0755
|
|
||||||
|
|
||||||
// get cmd to initialize all files for tendermint testnet and application
|
|
||||||
func TestnetFilesCmd(ctx *server.Context, cdc *codec.Codec) *cobra.Command {
|
|
||||||
|
|
||||||
cmd := &cobra.Command{
|
|
||||||
Use: "testnet",
|
|
||||||
Short: "Initialize files for a 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:
|
|
||||||
kvd testnet --v 4 --output-dir ./output --starting-ip-address 192.168.10.2
|
|
||||||
`,
|
|
||||||
RunE: func(_ *cobra.Command, _ []string) error {
|
|
||||||
config := ctx.Config
|
|
||||||
return initTestnet(config, cdc)
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
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, "kvd",
|
|
||||||
"Home directory of the node's daemon configuration",
|
|
||||||
)
|
|
||||||
cmd.Flags().String(flagNodeCliHome, "kvcli",
|
|
||||||
"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(
|
|
||||||
client.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)",
|
|
||||||
)
|
|
||||||
|
|
||||||
return cmd
|
|
||||||
}
|
|
||||||
|
|
||||||
func initTestnet(config *tmconfig.Config, cdc *codec.Codec) error {
|
|
||||||
var chainID string
|
|
||||||
|
|
||||||
outDir := viper.GetString(flagOutputDir)
|
|
||||||
numValidators := viper.GetInt(flagNumValidators)
|
|
||||||
|
|
||||||
chainID = viper.GetString(client.FlagChainID)
|
|
||||||
if chainID == "" {
|
|
||||||
chainID = "chain-" + cmn.RandStr(6)
|
|
||||||
}
|
|
||||||
|
|
||||||
monikers := make([]string, numValidators)
|
|
||||||
nodeIDs := make([]string, numValidators)
|
|
||||||
valPubKeys := make([]crypto.PubKey, numValidators)
|
|
||||||
|
|
||||||
appConfig := srvconfig.DefaultConfig()
|
|
||||||
appConfig.MinGasPrices = viper.GetString(server.FlagMinGasPrices)
|
|
||||||
|
|
||||||
var (
|
|
||||||
accs []app.GenesisAccount
|
|
||||||
genFiles []string
|
|
||||||
)
|
|
||||||
|
|
||||||
// generate private keys, node IDs, and initial transactions
|
|
||||||
for i := 0; i < numValidators; i++ {
|
|
||||||
nodeDirName := fmt.Sprintf("%s%d", viper.GetString(flagNodeDirPrefix), i)
|
|
||||||
nodeDaemonHomeName := viper.GetString(flagNodeDaemonHome)
|
|
||||||
nodeCliHomeName := viper.GetString(flagNodeCliHome)
|
|
||||||
nodeDir := filepath.Join(outDir, nodeDirName, nodeDaemonHomeName)
|
|
||||||
clientDir := filepath.Join(outDir, nodeDirName, nodeCliHomeName)
|
|
||||||
gentxsDir := filepath.Join(outDir, "gentxs")
|
|
||||||
|
|
||||||
config.SetRoot(nodeDir)
|
|
||||||
|
|
||||||
err := os.MkdirAll(filepath.Join(nodeDir, "config"), nodeDirPerm)
|
|
||||||
if err != nil {
|
|
||||||
_ = os.RemoveAll(outDir)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = os.MkdirAll(clientDir, nodeDirPerm)
|
|
||||||
if err != nil {
|
|
||||||
_ = os.RemoveAll(outDir)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
monikers = append(monikers, nodeDirName)
|
|
||||||
config.Moniker = nodeDirName
|
|
||||||
|
|
||||||
ip, err := getIP(i, viper.GetString(flagStartingIPAddress))
|
|
||||||
if err != nil {
|
|
||||||
_ = os.RemoveAll(outDir)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
nodeIDs[i], valPubKeys[i], err = InitializeNodeValidatorFiles(config)
|
|
||||||
if err != nil {
|
|
||||||
_ = os.RemoveAll(outDir)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
memo := fmt.Sprintf("%s@%s:26656", nodeIDs[i], ip)
|
|
||||||
genFiles = append(genFiles, config.GenesisFile())
|
|
||||||
|
|
||||||
buf := client.BufferStdin()
|
|
||||||
prompt := fmt.Sprintf(
|
|
||||||
"Password for account '%s' (default %s):", nodeDirName, app.DefaultKeyPass,
|
|
||||||
)
|
|
||||||
|
|
||||||
keyPass, err := client.GetPassword(prompt, buf)
|
|
||||||
if err != nil && keyPass != "" {
|
|
||||||
// An error was returned that either failed to read the password from
|
|
||||||
// STDIN or the given password is not empty but failed to meet minimum
|
|
||||||
// length requirements.
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if keyPass == "" {
|
|
||||||
keyPass = app.DefaultKeyPass
|
|
||||||
}
|
|
||||||
|
|
||||||
addr, secret, err := server.GenerateSaveCoinKey(clientDir, nodeDirName, keyPass, true)
|
|
||||||
if err != nil {
|
|
||||||
_ = os.RemoveAll(outDir)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
info := map[string]string{"secret": secret}
|
|
||||||
|
|
||||||
cliPrint, err := json.Marshal(info)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// save private key seed words
|
|
||||||
err = writeFile(fmt.Sprintf("%v.json", "key_seed"), clientDir, cliPrint)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
accTokens := sdk.TokensFromTendermintPower(1000)
|
|
||||||
accStakingTokens := sdk.TokensFromTendermintPower(500)
|
|
||||||
accs = append(accs, app.GenesisAccount{
|
|
||||||
Address: addr,
|
|
||||||
Coins: sdk.Coins{
|
|
||||||
sdk.NewCoin(fmt.Sprintf("%stoken", nodeDirName), accTokens),
|
|
||||||
sdk.NewCoin(sdk.DefaultBondDenom, accStakingTokens),
|
|
||||||
},
|
|
||||||
})
|
|
||||||
|
|
||||||
valTokens := sdk.TokensFromTendermintPower(100)
|
|
||||||
msg := staking.NewMsgCreateValidator(
|
|
||||||
sdk.ValAddress(addr),
|
|
||||||
valPubKeys[i],
|
|
||||||
sdk.NewCoin(sdk.DefaultBondDenom, valTokens),
|
|
||||||
staking.NewDescription(nodeDirName, "", "", ""),
|
|
||||||
staking.NewCommissionMsg(sdk.ZeroDec(), sdk.ZeroDec(), sdk.ZeroDec()),
|
|
||||||
sdk.OneInt(),
|
|
||||||
)
|
|
||||||
kb, err := keys.NewKeyBaseFromDir(clientDir)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
tx := auth.NewStdTx([]sdk.Msg{msg}, auth.StdFee{}, []auth.StdSignature{}, memo)
|
|
||||||
txBldr := authtx.NewTxBuilderFromCLI().WithChainID(chainID).WithMemo(memo).WithKeybase(kb)
|
|
||||||
|
|
||||||
signedTx, err := txBldr.SignStdTx(nodeDirName, app.DefaultKeyPass, tx, false)
|
|
||||||
if err != nil {
|
|
||||||
_ = os.RemoveAll(outDir)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
txBytes, err := cdc.MarshalJSON(signedTx)
|
|
||||||
if err != nil {
|
|
||||||
_ = os.RemoveAll(outDir)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// gather gentxs folder
|
|
||||||
err = writeFile(fmt.Sprintf("%v.json", nodeDirName), gentxsDir, txBytes)
|
|
||||||
if err != nil {
|
|
||||||
_ = os.RemoveAll(outDir)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
appConfigFilePath := filepath.Join(nodeDir, "config/kvd.toml")
|
|
||||||
srvconfig.WriteConfigFile(appConfigFilePath, appConfig)
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := initGenFiles(cdc, chainID, accs, genFiles, numValidators); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
err := collectGenFiles(
|
|
||||||
cdc, config, chainID, monikers, nodeIDs, valPubKeys, numValidators,
|
|
||||||
outDir, viper.GetString(flagNodeDirPrefix), viper.GetString(flagNodeDaemonHome),
|
|
||||||
)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
fmt.Printf("Successfully initialized %d node directories\n", numValidators)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func initGenFiles(
|
|
||||||
cdc *codec.Codec, chainID string, accs []app.GenesisAccount,
|
|
||||||
genFiles []string, numValidators int,
|
|
||||||
) error {
|
|
||||||
|
|
||||||
appGenState := app.NewDefaultGenesisState()
|
|
||||||
appGenState.Accounts = accs
|
|
||||||
|
|
||||||
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, outDir, nodeDirPrefix, nodeDaemonHomeName string,
|
|
||||||
) error {
|
|
||||||
|
|
||||||
var appState json.RawMessage
|
|
||||||
genTime := tmtime.Now()
|
|
||||||
|
|
||||||
for i := 0; i < numValidators; i++ {
|
|
||||||
nodeDirName := fmt.Sprintf("%s%d", nodeDirPrefix, i)
|
|
||||||
nodeDir := filepath.Join(outDir, nodeDirName, nodeDaemonHomeName)
|
|
||||||
gentxsDir := filepath.Join(outDir, "gentxs")
|
|
||||||
moniker := monikers[i]
|
|
||||||
config.Moniker = nodeDirName
|
|
||||||
|
|
||||||
config.SetRoot(nodeDir)
|
|
||||||
|
|
||||||
nodeID, valPubKey := nodeIDs[i], valPubKeys[i]
|
|
||||||
initCfg := newInitConfig(chainID, gentxsDir, moniker, nodeID, valPubKey)
|
|
||||||
|
|
||||||
genDoc, err := LoadGenesisDoc(cdc, config.GenesisFile())
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
nodeAppState, err := genAppStateFromConfig(cdc, config, initCfg, genDoc)
|
|
||||||
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
|
|
||||||
err = ExportGenesisFileWithTime(genFile, chainID, nil, appState, genTime)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func getIP(i int, startingIPAddr string) (string, error) {
|
|
||||||
var (
|
|
||||||
ip string
|
|
||||||
err error
|
|
||||||
)
|
|
||||||
|
|
||||||
if len(startingIPAddr) == 0 {
|
|
||||||
ip, err = server.ExternalIP()
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
ip, err = calculateIP(startingIPAddr, i)
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return ip, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func writeFile(name string, dir string, contents []byte) error {
|
|
||||||
writePath := filepath.Join(dir)
|
|
||||||
file := filepath.Join(writePath, name)
|
|
||||||
|
|
||||||
err := cmn.EnsureDir(writePath, 0700)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = cmn.WriteFile(file, contents, 0600)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
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
|
|
||||||
}
|
|
114
init/utils.go
114
init/utils.go
@ -1,114 +0,0 @@
|
|||||||
package init
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
|
||||||
"io/ioutil"
|
|
||||||
"path/filepath"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
amino "github.com/tendermint/go-amino"
|
|
||||||
cfg "github.com/tendermint/tendermint/config"
|
|
||||||
"github.com/tendermint/tendermint/crypto"
|
|
||||||
"github.com/tendermint/tendermint/libs/common"
|
|
||||||
"github.com/tendermint/tendermint/p2p"
|
|
||||||
"github.com/tendermint/tendermint/privval"
|
|
||||||
"github.com/tendermint/tendermint/types"
|
|
||||||
|
|
||||||
"github.com/kava-labs/kava/app"
|
|
||||||
"github.com/cosmos/cosmos-sdk/codec"
|
|
||||||
"github.com/cosmos/cosmos-sdk/server"
|
|
||||||
)
|
|
||||||
|
|
||||||
// ExportGenesisFile creates and writes the genesis configuration to disk. An
|
|
||||||
// error is returned if building or writing the configuration to file fails.
|
|
||||||
func ExportGenesisFile(
|
|
||||||
genFile, chainID string, validators []types.GenesisValidator, appState json.RawMessage,
|
|
||||||
) error {
|
|
||||||
|
|
||||||
genDoc := types.GenesisDoc{
|
|
||||||
ChainID: chainID,
|
|
||||||
Validators: validators,
|
|
||||||
AppState: appState,
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := genDoc.ValidateAndComplete(); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return genDoc.SaveAs(genFile)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ExportGenesisFileWithTime creates and writes the genesis configuration to disk.
|
|
||||||
// An error is returned if building or writing the configuration to file fails.
|
|
||||||
func ExportGenesisFileWithTime(
|
|
||||||
genFile, chainID string, validators []types.GenesisValidator,
|
|
||||||
appState json.RawMessage, genTime time.Time,
|
|
||||||
) error {
|
|
||||||
|
|
||||||
genDoc := types.GenesisDoc{
|
|
||||||
GenesisTime: genTime,
|
|
||||||
ChainID: chainID,
|
|
||||||
Validators: validators,
|
|
||||||
AppState: appState,
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := genDoc.ValidateAndComplete(); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return genDoc.SaveAs(genFile)
|
|
||||||
}
|
|
||||||
|
|
||||||
// InitializeNodeValidatorFiles creates private validator and p2p configuration files.
|
|
||||||
func InitializeNodeValidatorFiles(
|
|
||||||
config *cfg.Config) (nodeID string, valPubKey crypto.PubKey, err error,
|
|
||||||
) {
|
|
||||||
|
|
||||||
nodeKey, err := p2p.LoadOrGenNodeKey(config.NodeKeyFile())
|
|
||||||
if err != nil {
|
|
||||||
return nodeID, valPubKey, err
|
|
||||||
}
|
|
||||||
|
|
||||||
nodeID = string(nodeKey.ID())
|
|
||||||
server.UpgradeOldPrivValFile(config)
|
|
||||||
|
|
||||||
pvKeyFile := config.PrivValidatorKeyFile()
|
|
||||||
if err := common.EnsureDir(filepath.Dir(pvKeyFile), 0777); err != nil {
|
|
||||||
return nodeID, valPubKey, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
pvStateFile := config.PrivValidatorStateFile()
|
|
||||||
if err := common.EnsureDir(filepath.Dir(pvStateFile), 0777); err != nil {
|
|
||||||
return nodeID, valPubKey, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
valPubKey = privval.LoadOrGenFilePV(pvKeyFile, pvStateFile).GetPubKey()
|
|
||||||
|
|
||||||
return nodeID, valPubKey, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// LoadGenesisDoc reads and unmarshals GenesisDoc from the given file.
|
|
||||||
func LoadGenesisDoc(cdc *amino.Codec, genFile string) (genDoc types.GenesisDoc, err error) {
|
|
||||||
genContents, err := ioutil.ReadFile(genFile)
|
|
||||||
if err != nil {
|
|
||||||
return genDoc, err
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := cdc.UnmarshalJSON(genContents, &genDoc); err != nil {
|
|
||||||
return genDoc, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return genDoc, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func initializeEmptyGenesis(
|
|
||||||
cdc *codec.Codec, genFile, chainID string, overwrite bool,
|
|
||||||
) (appState json.RawMessage, err error) {
|
|
||||||
|
|
||||||
if !overwrite && common.FileExists(genFile) {
|
|
||||||
return nil, fmt.Errorf("genesis.json file already exists: %v", genFile)
|
|
||||||
}
|
|
||||||
|
|
||||||
return codec.MarshalJSONIndent(cdc, app.NewDefaultGenesisState())
|
|
||||||
}
|
|
@ -1,49 +0,0 @@
|
|||||||
package init
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
|
||||||
"os"
|
|
||||||
"path/filepath"
|
|
||||||
"testing"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/cosmos/cosmos-sdk/codec"
|
|
||||||
"github.com/cosmos/cosmos-sdk/tests"
|
|
||||||
|
|
||||||
"github.com/stretchr/testify/require"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestExportGenesisFileWithTime(t *testing.T) {
|
|
||||||
t.Parallel()
|
|
||||||
dir, cleanup := tests.NewTestCaseDir(t)
|
|
||||||
defer cleanup()
|
|
||||||
|
|
||||||
fname := filepath.Join(dir, "genesis.json")
|
|
||||||
require.NoError(t, ExportGenesisFileWithTime(fname, "test", nil, json.RawMessage(""), time.Now()))
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestLoadGenesisDoc(t *testing.T) {
|
|
||||||
t.Parallel()
|
|
||||||
dir, cleanup := tests.NewTestCaseDir(t)
|
|
||||||
defer cleanup()
|
|
||||||
|
|
||||||
fname := filepath.Join(dir, "genesis.json")
|
|
||||||
require.NoError(t, ExportGenesisFileWithTime(fname, "test", nil, json.RawMessage(""), time.Now()))
|
|
||||||
|
|
||||||
_, err := LoadGenesisDoc(codec.Cdc, fname)
|
|
||||||
require.NoError(t, err)
|
|
||||||
|
|
||||||
// Non-existing file
|
|
||||||
_, err = LoadGenesisDoc(codec.Cdc, "non-existing-file")
|
|
||||||
require.Error(t, err)
|
|
||||||
|
|
||||||
malformedFilename := filepath.Join(dir, "malformed")
|
|
||||||
malformedFile, err := os.Create(malformedFilename)
|
|
||||||
require.NoError(t, err)
|
|
||||||
fmt.Fprint(malformedFile, "invalidjson")
|
|
||||||
malformedFile.Close()
|
|
||||||
// Non-existing file
|
|
||||||
_, err = LoadGenesisDoc(codec.Cdc, malformedFilename)
|
|
||||||
require.Error(t, err)
|
|
||||||
}
|
|
@ -1,51 +0,0 @@
|
|||||||
package init
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"os"
|
|
||||||
|
|
||||||
"github.com/cosmos/cosmos-sdk/codec"
|
|
||||||
"github.com/cosmos/cosmos-sdk/server"
|
|
||||||
"github.com/kava-labs/kava/app"
|
|
||||||
"github.com/spf13/cobra"
|
|
||||||
"github.com/tendermint/tendermint/types"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Validate genesis command takes
|
|
||||||
func ValidateGenesisCmd(ctx *server.Context, cdc *codec.Codec) *cobra.Command {
|
|
||||||
return &cobra.Command{
|
|
||||||
Use: "validate-genesis [file]",
|
|
||||||
Args: cobra.RangeArgs(0, 1),
|
|
||||||
Short: "validates the genesis file at the default location or at the location passed as an arg",
|
|
||||||
RunE: func(cmd *cobra.Command, args []string) (err error) {
|
|
||||||
|
|
||||||
// Load default if passed no args, otherwise load passed file
|
|
||||||
var genesis string
|
|
||||||
if len(args) == 0 {
|
|
||||||
genesis = ctx.Config.GenesisFile()
|
|
||||||
} else {
|
|
||||||
genesis = args[0]
|
|
||||||
}
|
|
||||||
|
|
||||||
//nolint
|
|
||||||
fmt.Fprintf(os.Stderr, "validating genesis file at %s\n", genesis)
|
|
||||||
|
|
||||||
var genDoc types.GenesisDoc
|
|
||||||
if genDoc, err = LoadGenesisDoc(cdc, genesis); err != nil {
|
|
||||||
return fmt.Errorf("Error loading genesis doc from %s: %s", genesis, err.Error())
|
|
||||||
}
|
|
||||||
|
|
||||||
var genstate app.GenesisState
|
|
||||||
if err = cdc.UnmarshalJSON(genDoc.AppState, &genstate); err != nil {
|
|
||||||
return fmt.Errorf("Error unmarshaling genesis doc %s: %s", genesis, err.Error())
|
|
||||||
}
|
|
||||||
|
|
||||||
if err = app.ValidateGenesisState(genstate); err != nil {
|
|
||||||
return fmt.Errorf("Error validating genesis file %s: %s", genesis, err.Error())
|
|
||||||
}
|
|
||||||
|
|
||||||
fmt.Printf("File at %s is a valid genesis file for kvd\n", genesis)
|
|
||||||
return nil
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user