From 985aae5575762eb1380611c4c0e9ed206f2b6492 Mon Sep 17 00:00:00 2001 From: Marin Basic Date: Thu, 4 Apr 2019 09:10:56 +0200 Subject: [PATCH 01/47] Return errors instead of panic (#3782) This is related to issue #3741 where fetching data from invalid store, package panic. Modify subspace.go to return errors instead of panic. Also update other packages that import subspace and handle errors. --- .pending/breaking/sdk/3782-Return-errors-i | 1 + baseapp/baseapp.go | 12 +++- cmd/gaia/app/app.go | 33 +++++++---- cmd/gaia/app/export.go | 6 +- cmd/gaia/cmd/gaiadebug/hack.go | 18 +++--- types/abci.go | 4 +- x/bank/keeper.go | 7 ++- x/crisis/params.go | 12 +++- x/distribution/abci_app.go | 4 +- x/gov/endblocker.go | 4 +- x/gov/keeper.go | 42 ++++++++++++-- x/gov/test_common.go | 6 +- x/mint/abci_app.go | 13 ++++- x/mint/genesis.go | 24 +++++--- x/mint/keeper.go | 17 +++--- x/mint/querier.go | 15 ++++- x/mint/querier_test.go | 12 +++- x/mint/test_common.go | 3 +- x/params/keeper_test.go | 28 ++++----- x/params/subspace/subspace.go | 67 ++++++++++++---------- x/slashing/app_test.go | 6 +- x/slashing/keeper_test.go | 6 +- x/slashing/params.go | 42 ++++++++++++-- x/slashing/tick.go | 6 +- x/slashing/tick_test.go | 9 ++- x/staking/app_test.go | 6 +- x/staking/handler.go | 4 +- x/staking/keeper/params.go | 24 ++++++-- 28 files changed, 296 insertions(+), 135 deletions(-) create mode 100644 .pending/breaking/sdk/3782-Return-errors-i diff --git a/.pending/breaking/sdk/3782-Return-errors-i b/.pending/breaking/sdk/3782-Return-errors-i new file mode 100644 index 0000000000..6c717963ce --- /dev/null +++ b/.pending/breaking/sdk/3782-Return-errors-i @@ -0,0 +1 @@ +#3782 Return errors instead of panic diff --git a/baseapp/baseapp.go b/baseapp/baseapp.go index b244a98b77..2b8dfd3e94 100644 --- a/baseapp/baseapp.go +++ b/baseapp/baseapp.go @@ -538,6 +538,7 @@ func (app *BaseApp) validateHeight(req abci.RequestBeginBlock) error { // BeginBlock implements the ABCI application interface. func (app *BaseApp) BeginBlock(req abci.RequestBeginBlock) (res abci.ResponseBeginBlock) { + var err error if app.cms.TracingEnabled() { app.cms.SetTracingContext(sdk.TraceContext( map[string]interface{}{"blockHeight": req.Header.Height}, @@ -572,7 +573,10 @@ func (app *BaseApp) BeginBlock(req abci.RequestBeginBlock) (res abci.ResponseBeg app.deliverState.ctx = app.deliverState.ctx.WithBlockGasMeter(gasMeter) if app.beginBlocker != nil { - res = app.beginBlocker(app.deliverState.ctx, req) + res, err = app.beginBlocker(app.deliverState.ctx, req) + if err != nil { + panic(err) + } } // set the signed validators for addition to context in deliverTx @@ -874,12 +878,16 @@ func (app *BaseApp) runTx(mode runTxMode, txBytes []byte, tx sdk.Tx) (result sdk // EndBlock implements the ABCI interface. func (app *BaseApp) EndBlock(req abci.RequestEndBlock) (res abci.ResponseEndBlock) { + var err error if app.deliverState.ms.TracingEnabled() { app.deliverState.ms = app.deliverState.ms.SetTracingContext(nil).(sdk.CacheMultiStore) } if app.endBlocker != nil { - res = app.endBlocker(app.deliverState.ctx, req) + res, err = app.endBlocker(app.deliverState.ctx, req) + if err != nil { + panic(err) + } } return diff --git a/cmd/gaia/app/app.go b/cmd/gaia/app/app.go index 262115649f..fa64c48d5d 100644 --- a/cmd/gaia/app/app.go +++ b/cmd/gaia/app/app.go @@ -218,30 +218,39 @@ func MakeCodec() *codec.Codec { } // application updates every end block -func (app *GaiaApp) BeginBlocker(ctx sdk.Context, req abci.RequestBeginBlock) abci.ResponseBeginBlock { +func (app *GaiaApp) BeginBlocker(ctx sdk.Context, req abci.RequestBeginBlock) (resp abci.ResponseBeginBlock, err error) { // mint new tokens for the previous block - mint.BeginBlocker(ctx, app.mintKeeper) + err = mint.BeginBlocker(ctx, app.mintKeeper) + if err != nil { + return resp, err + } // distribute rewards for the previous block - distr.BeginBlocker(ctx, req, app.distrKeeper) + err = distr.BeginBlocker(ctx, req, app.distrKeeper) + if err != nil { + return resp, err + } // 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(), - } + resp.Tags, err = slashing.BeginBlocker(ctx, req, app.slashingKeeper) + return resp, err } // application updates every end block // nolint: unparam -func (app *GaiaApp) EndBlocker(ctx sdk.Context, req abci.RequestEndBlock) abci.ResponseEndBlock { - tags := gov.EndBlocker(ctx, app.govKeeper) - validatorUpdates, endBlockerTags := staking.EndBlocker(ctx, app.stakingKeeper) +func (app *GaiaApp) EndBlocker(ctx sdk.Context, req abci.RequestEndBlock) (abci.ResponseEndBlock, error) { + tags, err := gov.EndBlocker(ctx, app.govKeeper) + if err != nil { + return abci.ResponseEndBlock{}, err + } + validatorUpdates, endBlockerTags, err := staking.EndBlocker(ctx, app.stakingKeeper) + if err != nil { + return abci.ResponseEndBlock{}, err + } tags = append(tags, endBlockerTags...) if app.assertInvariantsBlockly { @@ -251,7 +260,7 @@ func (app *GaiaApp) EndBlocker(ctx sdk.Context, req abci.RequestEndBlock) abci.R return abci.ResponseEndBlock{ ValidatorUpdates: validatorUpdates, Tags: tags, - } + }, nil } // initialize store from a genesis state diff --git a/cmd/gaia/app/export.go b/cmd/gaia/app/export.go index 5174c1498a..217d9a1b3d 100644 --- a/cmd/gaia/app/export.go +++ b/cmd/gaia/app/export.go @@ -39,12 +39,16 @@ func (app *GaiaApp) ExportAppStateAndValidators(forZeroHeight bool, jailWhiteLis } app.accountKeeper.IterateAccounts(ctx, appendAccount) + mintGenesisState, err := mint.ExportGenesis(ctx, app.mintKeeper) + if err != nil { + return nil, nil, err + } 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), + mintGenesisState, distr.ExportGenesis(ctx, app.distrKeeper), gov.ExportGenesis(ctx, app.govKeeper), crisis.ExportGenesis(ctx, app.crisisKeeper), diff --git a/cmd/gaia/cmd/gaiadebug/hack.go b/cmd/gaia/cmd/gaiadebug/hack.go index 51927592a4..74346a2d92 100644 --- a/cmd/gaia/cmd/gaiadebug/hack.go +++ b/cmd/gaia/cmd/gaiadebug/hack.go @@ -218,23 +218,23 @@ func MakeCodec() *codec.Codec { } // application updates every end block -func (app *GaiaApp) BeginBlocker(ctx sdk.Context, req abci.RequestBeginBlock) abci.ResponseBeginBlock { - tags := slashing.BeginBlocker(ctx, req, app.slashingKeeper) - - return abci.ResponseBeginBlock{ - Tags: tags.ToKVPairs(), - } +func (app *GaiaApp) BeginBlocker(ctx sdk.Context, req abci.RequestBeginBlock) (resp abci.ResponseBeginBlock, err error) { + resp.Tags, err = slashing.BeginBlocker(ctx, req, app.slashingKeeper) + return resp, err } // application updates every end block // nolint: unparam -func (app *GaiaApp) EndBlocker(ctx sdk.Context, req abci.RequestEndBlock) abci.ResponseEndBlock { - validatorUpdates, tags := staking.EndBlocker(ctx, app.stakingKeeper) +func (app *GaiaApp) EndBlocker(ctx sdk.Context, req abci.RequestEndBlock) (abci.ResponseEndBlock, error) { + validatorUpdates, tags, err := staking.EndBlocker(ctx, app.stakingKeeper) + if err != nil { + return abci.ResponseEndBlock{}, err + } return abci.ResponseEndBlock{ ValidatorUpdates: validatorUpdates, Tags: tags, - } + }, nil } // custom logic for gaia initialization diff --git a/types/abci.go b/types/abci.go index 0646d21e32..bbf2e7225d 100644 --- a/types/abci.go +++ b/types/abci.go @@ -6,10 +6,10 @@ import abci "github.com/tendermint/tendermint/abci/types" type InitChainer func(ctx Context, req abci.RequestInitChain) abci.ResponseInitChain // run code before the transactions in a block -type BeginBlocker func(ctx Context, req abci.RequestBeginBlock) abci.ResponseBeginBlock +type BeginBlocker func(ctx Context, req abci.RequestBeginBlock) (abci.ResponseBeginBlock, error) // run code after the transactions in a block and return updates to the validator set -type EndBlocker func(ctx Context, req abci.RequestEndBlock) abci.ResponseEndBlock +type EndBlocker func(ctx Context, req abci.RequestEndBlock) (abci.ResponseEndBlock, error) // respond to p2p filtering queries from Tendermint type PeerFilter func(info string) abci.ResponseQuery diff --git a/x/bank/keeper.go b/x/bank/keeper.go index c5322ec5c7..cd8bc2c358 100644 --- a/x/bank/keeper.go +++ b/x/bank/keeper.go @@ -168,7 +168,12 @@ func (keeper BaseSendKeeper) GetSendEnabled(ctx sdk.Context) bool { // SetSendEnabled sets the send enabled func (keeper BaseSendKeeper) SetSendEnabled(ctx sdk.Context, enabled bool) { - keeper.paramSpace.Set(ctx, ParamStoreKeySendEnabled, &enabled) + err := keeper.paramSpace.Set(ctx, ParamStoreKeySendEnabled, &enabled) + if err != nil { + // TODO: return error - needs rewrite interfaces + // and handle error on the caller side + // check PR #3782 + } } var _ ViewKeeper = (*BaseViewKeeper)(nil) diff --git a/x/crisis/params.go b/x/crisis/params.go index 14c8a25673..91d68d1bf3 100644 --- a/x/crisis/params.go +++ b/x/crisis/params.go @@ -24,11 +24,19 @@ func ParamKeyTable() params.KeyTable { // GetConstantFee get's the constant fee from the paramSpace func (k Keeper) GetConstantFee(ctx sdk.Context) (constantFee sdk.Coin) { - k.paramSpace.Get(ctx, ParamStoreKeyConstantFee, &constantFee) + if err := k.paramSpace.Get(ctx, ParamStoreKeyConstantFee, &constantFee); err != nil { + // TODO: return error - needs rewrite interfaces + // and handle error on the caller side + // check PR #3782 + } return } // GetConstantFee set's the constant fee in the paramSpace func (k Keeper) SetConstantFee(ctx sdk.Context, constantFee sdk.Coin) { - k.paramSpace.Set(ctx, ParamStoreKeyConstantFee, constantFee) + if err := k.paramSpace.Set(ctx, ParamStoreKeyConstantFee, constantFee); err != nil { + // TODO: return error - needs rewrite interfaces + // and handle error on the caller side + // check PR #3782 + } } diff --git a/x/distribution/abci_app.go b/x/distribution/abci_app.go index 0a2ef5627a..46e2652749 100644 --- a/x/distribution/abci_app.go +++ b/x/distribution/abci_app.go @@ -8,7 +8,7 @@ import ( ) // set the proposer for determining distribution during endblock -func BeginBlocker(ctx sdk.Context, req abci.RequestBeginBlock, k keeper.Keeper) { +func BeginBlocker(ctx sdk.Context, req abci.RequestBeginBlock, k keeper.Keeper) error { // determine the total power signing the block var previousTotalPower, sumPreviousPrecommitPower int64 @@ -29,5 +29,5 @@ func BeginBlocker(ctx sdk.Context, req abci.RequestBeginBlock, k keeper.Keeper) // record the proposer for when we payout on the next block consAddr := sdk.ConsAddress(req.Header.ProposerAddress) k.SetPreviousProposerConsAddr(ctx, consAddr) - + return nil } diff --git a/x/gov/endblocker.go b/x/gov/endblocker.go index 3da7f3a1da..ed08ae6c32 100644 --- a/x/gov/endblocker.go +++ b/x/gov/endblocker.go @@ -8,7 +8,7 @@ import ( ) // Called every block, process inflation, update validator set -func EndBlocker(ctx sdk.Context, keeper Keeper) sdk.Tags { +func EndBlocker(ctx sdk.Context, keeper Keeper) (sdk.Tags, error) { logger := ctx.Logger().With("module", "x/gov") resTags := sdk.NewTags() @@ -78,5 +78,5 @@ func EndBlocker(ctx sdk.Context, keeper Keeper) sdk.Tags { resTags = resTags.AppendTag(tags.ProposalResult, tagValue) } - return resTags + return resTags, nil } diff --git a/x/gov/keeper.go b/x/gov/keeper.go index 46085cf2d9..297915303a 100644 --- a/x/gov/keeper.go +++ b/x/gov/keeper.go @@ -261,34 +261,64 @@ func (keeper Keeper) activateVotingPeriod(ctx sdk.Context, proposal Proposal) { // Returns the current DepositParams from the global param store func (keeper Keeper) GetDepositParams(ctx sdk.Context) DepositParams { var depositParams DepositParams - keeper.paramSpace.Get(ctx, ParamStoreKeyDepositParams, &depositParams) + err := keeper.paramSpace.Get(ctx, ParamStoreKeyDepositParams, &depositParams) + if err != nil { + // TODO: return error - needs rewrite interfaces + // and handle error on the caller side + // check PR #3782 + } return depositParams } // Returns the current VotingParams from the global param store func (keeper Keeper) GetVotingParams(ctx sdk.Context) VotingParams { var votingParams VotingParams - keeper.paramSpace.Get(ctx, ParamStoreKeyVotingParams, &votingParams) + err := keeper.paramSpace.Get(ctx, ParamStoreKeyVotingParams, &votingParams) + if err != nil { + // TODO: return error - needs rewrite interfaces + // and handle error on the caller side + // check PR #3782 + } return votingParams } // Returns the current TallyParam from the global param store func (keeper Keeper) GetTallyParams(ctx sdk.Context) TallyParams { var tallyParams TallyParams - keeper.paramSpace.Get(ctx, ParamStoreKeyTallyParams, &tallyParams) + err := keeper.paramSpace.Get(ctx, ParamStoreKeyTallyParams, &tallyParams) + if err != nil { + // TODO: return error - needs rewrite interfaces + // and handle error on the caller side + // check PR #3782 + } return tallyParams } func (keeper Keeper) setDepositParams(ctx sdk.Context, depositParams DepositParams) { - keeper.paramSpace.Set(ctx, ParamStoreKeyDepositParams, &depositParams) + err := keeper.paramSpace.Set(ctx, ParamStoreKeyDepositParams, &depositParams) + if err != nil { + // TODO: return error - needs rewrite interfaces + // and handle error on the caller side + // check PR #3782 + } } func (keeper Keeper) setVotingParams(ctx sdk.Context, votingParams VotingParams) { - keeper.paramSpace.Set(ctx, ParamStoreKeyVotingParams, &votingParams) + err := keeper.paramSpace.Set(ctx, ParamStoreKeyVotingParams, &votingParams) + if err != nil { + // TODO: return error - needs rewrite interfaces + // and handle error on the caller side + // check PR #3782 + } } func (keeper Keeper) setTallyParams(ctx sdk.Context, tallyParams TallyParams) { - keeper.paramSpace.Set(ctx, ParamStoreKeyTallyParams, &tallyParams) + err := keeper.paramSpace.Set(ctx, ParamStoreKeyTallyParams, &tallyParams) + if err != nil { + // TODO: return error - needs rewrite interfaces + // and handle error on the caller side + // check PR #3782 + } } // Votes diff --git a/x/gov/test_common.go b/x/gov/test_common.go index a14251841d..1703dfcf52 100644 --- a/x/gov/test_common.go +++ b/x/gov/test_common.go @@ -58,11 +58,11 @@ func getMockApp(t *testing.T, numGenAccs int, genState GenesisState, genAccs []a // gov and staking endblocker func getEndBlocker(keeper Keeper) sdk.EndBlocker { - return func(ctx sdk.Context, req abci.RequestEndBlock) abci.ResponseEndBlock { - tags := EndBlocker(ctx, keeper) + return func(ctx sdk.Context, req abci.RequestEndBlock) (abci.ResponseEndBlock, error) { + tags, err := EndBlocker(ctx, keeper) return abci.ResponseEndBlock{ Tags: tags, - } + }, err } } diff --git a/x/mint/abci_app.go b/x/mint/abci_app.go index 5016a464d1..ea998185a4 100644 --- a/x/mint/abci_app.go +++ b/x/mint/abci_app.go @@ -5,11 +5,17 @@ import ( ) // Inflate every block, update inflation parameters once per hour -func BeginBlocker(ctx sdk.Context, k Keeper) { +func BeginBlocker(ctx sdk.Context, k Keeper) error { // fetch stored minter & params - minter := k.GetMinter(ctx) - params := k.GetParams(ctx) + minter, err := k.GetMinter(ctx) + if err != nil { + return err + } + params, err := k.GetParams(ctx) + if err != nil { + return err + } // recalculate inflation rate totalSupply := k.sk.TotalTokens(ctx) @@ -22,5 +28,6 @@ func BeginBlocker(ctx sdk.Context, k Keeper) { mintedCoin := minter.BlockProvision(params) k.fck.AddCollectedFees(ctx, sdk.Coins{mintedCoin}) k.sk.InflateSupply(ctx, mintedCoin.Amount) + return nil } diff --git a/x/mint/genesis.go b/x/mint/genesis.go index 11f96c6f90..0408eb2dfb 100644 --- a/x/mint/genesis.go +++ b/x/mint/genesis.go @@ -29,15 +29,25 @@ func DefaultGenesisState() GenesisState { // new mint genesis func InitGenesis(ctx sdk.Context, keeper Keeper, data GenesisState) { keeper.SetMinter(ctx, data.Minter) - keeper.SetParams(ctx, data.Params) + if err := keeper.SetParams(ctx, data.Params); err != nil { + // TODO: return error - needs rewrite interfaces + // and handle error on the caller side + // check PR #3782 + } } -// ExportGenesis returns a GenesisState for a given context and keeper. -func ExportGenesis(ctx sdk.Context, keeper Keeper) GenesisState { - - minter := keeper.GetMinter(ctx) - params := keeper.GetParams(ctx) - return NewGenesisState(minter, params) +// ExportGenesis returns a GenesisState for a given context and keeper. The +// GenesisState will contain the pool, and validator/delegator distribution info's +func ExportGenesis(ctx sdk.Context, keeper Keeper) (GenesisState, error) { + minter, err := keeper.GetMinter(ctx) + if err != nil { + return GenesisState{}, err + } + params, err := keeper.GetParams(ctx) + if err != nil { + return GenesisState{}, err + } + return NewGenesisState(minter, params), nil } // ValidateGenesis validates the provided genesis state to ensure the diff --git a/x/mint/keeper.go b/x/mint/keeper.go index 42a9f19fba..4b48b02edf 100644 --- a/x/mint/keeper.go +++ b/x/mint/keeper.go @@ -1,6 +1,8 @@ package mint import ( + "errors" + "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/params" @@ -62,11 +64,12 @@ func ParamKeyTable() params.KeyTable { //______________________________________________________________________ // get the minter -func (k Keeper) GetMinter(ctx sdk.Context) (minter Minter) { +func (k Keeper) GetMinter(ctx sdk.Context) (minter Minter, err error) { store := ctx.KVStore(k.storeKey) b := store.Get(minterKey) if b == nil { - panic("Stored fee pool should not have been nil") + err = errors.New("Stored fee pool should not have been nil") + return } k.cdc.MustUnmarshalBinaryLengthPrefixed(b, &minter) return @@ -82,13 +85,13 @@ func (k Keeper) SetMinter(ctx sdk.Context, minter Minter) { //______________________________________________________________________ // get inflation params from the global param store -func (k Keeper) GetParams(ctx sdk.Context) Params { +func (k Keeper) GetParams(ctx sdk.Context) (Params, error) { var params Params - k.paramSpace.Get(ctx, ParamStoreKeyParams, ¶ms) - return params + err := k.paramSpace.Get(ctx, ParamStoreKeyParams, ¶ms) + return params, err } // set inflation params from the global param store -func (k Keeper) SetParams(ctx sdk.Context, params Params) { - k.paramSpace.Set(ctx, ParamStoreKeyParams, ¶ms) +func (k Keeper) SetParams(ctx sdk.Context, params Params) error { + return k.paramSpace.Set(ctx, ParamStoreKeyParams, ¶ms) } diff --git a/x/mint/querier.go b/x/mint/querier.go index 21d35ce15c..c6ab9ef4d5 100644 --- a/x/mint/querier.go +++ b/x/mint/querier.go @@ -35,7 +35,10 @@ func NewQuerier(k Keeper) sdk.Querier { } func queryParams(ctx sdk.Context, k Keeper) ([]byte, sdk.Error) { - params := k.GetParams(ctx) + params, err := k.GetParams(ctx) + if err != nil { + return nil, sdk.ErrInternal(sdk.AppendMsgToErr("failed to get params", err.Error())) + } res, err := codec.MarshalJSONIndent(k.cdc, params) if err != nil { @@ -46,7 +49,10 @@ func queryParams(ctx sdk.Context, k Keeper) ([]byte, sdk.Error) { } func queryInflation(ctx sdk.Context, k Keeper) ([]byte, sdk.Error) { - minter := k.GetMinter(ctx) + minter, err := k.GetMinter(ctx) + if err != nil { + return nil, sdk.ErrInternal(sdk.AppendMsgToErr("failed to get params", err.Error())) + } res, err := codec.MarshalJSONIndent(k.cdc, minter.Inflation) if err != nil { @@ -57,7 +63,10 @@ func queryInflation(ctx sdk.Context, k Keeper) ([]byte, sdk.Error) { } func queryAnnualProvisions(ctx sdk.Context, k Keeper) ([]byte, sdk.Error) { - minter := k.GetMinter(ctx) + minter, err := k.GetMinter(ctx) + if err != nil { + return nil, sdk.ErrInternal(sdk.AppendMsgToErr("failed to get params", err.Error())) + } res, err := codec.MarshalJSONIndent(k.cdc, minter.AnnualProvisions) if err != nil { diff --git a/x/mint/querier_test.go b/x/mint/querier_test.go index e9f3c8d6c6..9bc963e5f4 100644 --- a/x/mint/querier_test.go +++ b/x/mint/querier_test.go @@ -42,7 +42,9 @@ func TestQueryParams(t *testing.T) { err := input.cdc.UnmarshalJSON(res, ¶ms) require.NoError(t, err) - require.Equal(t, input.mintKeeper.GetParams(input.ctx), params) + parm, err := input.mintKeeper.GetParams(input.ctx) + require.NoError(t, err) + require.Equal(t, parm, params) } func TestQueryInflation(t *testing.T) { @@ -56,7 +58,9 @@ func TestQueryInflation(t *testing.T) { err := input.cdc.UnmarshalJSON(res, &inflation) require.NoError(t, err) - require.Equal(t, input.mintKeeper.GetMinter(input.ctx).Inflation, inflation) + parm, err := input.mintKeeper.GetMinter(input.ctx) + require.NoError(t, err) + require.Equal(t, parm.Inflation, inflation) } func TestQueryAnnualProvisions(t *testing.T) { @@ -70,5 +74,7 @@ func TestQueryAnnualProvisions(t *testing.T) { err := input.cdc.UnmarshalJSON(res, &annualProvisions) require.NoError(t, err) - require.Equal(t, input.mintKeeper.GetMinter(input.ctx).AnnualProvisions, annualProvisions) + parm, err := input.mintKeeper.GetMinter(input.ctx) + require.NoError(t, err) + require.Equal(t, parm.AnnualProvisions, annualProvisions) } diff --git a/x/mint/test_common.go b/x/mint/test_common.go index f699acda23..7f83a0862e 100644 --- a/x/mint/test_common.go +++ b/x/mint/test_common.go @@ -68,7 +68,8 @@ func newTestInput(t *testing.T) testInput { ctx := sdk.NewContext(ms, abci.Header{Time: time.Unix(0, 0)}, false, log.NewTMLogger(os.Stdout)) - mintKeeper.SetParams(ctx, DefaultParams()) + err = mintKeeper.SetParams(ctx, DefaultParams()) + require.Nil(t, err) mintKeeper.SetMinter(ctx, DefaultInitialMinter()) return testInput{ctx, cdc, mintKeeper} diff --git a/x/params/keeper_test.go b/x/params/keeper_test.go index 4d20e56ad9..f96081e5fc 100644 --- a/x/params/keeper_test.go +++ b/x/params/keeper_test.go @@ -108,12 +108,12 @@ func TestKeeper(t *testing.T) { // Test invalid space.Get for i, kv := range kvs { var param bool - require.Panics(t, func() { space.Get(ctx, []byte(kv.key), ¶m) }, "invalid space.Get not panics, tc #%d", i) + require.Error(t, space.Get(ctx, []byte(kv.key), ¶m), "invalid space.Get not error, tc #%d", i) } // Test invalid space.Set for i, kv := range kvs { - require.Panics(t, func() { space.Set(ctx, []byte(kv.key), true) }, "invalid space.Set not panics, tc #%d", i) + require.Error(t, space.Set(ctx, []byte(kv.key), true), "invalid space.Set not error, tc #%d", i) } // Test GetSubspace @@ -122,12 +122,12 @@ func TestKeeper(t *testing.T) { gspace, ok := keeper.GetSubspace("test") require.True(t, ok, "cannot retrieve subspace, tc #%d", i) - require.NotPanics(t, func() { gspace.Get(ctx, []byte(kv.key), &gparam) }) - require.NotPanics(t, func() { space.Get(ctx, []byte(kv.key), ¶m) }) + require.NoError(t, gspace.Get(ctx, []byte(kv.key), &gparam)) + require.NoError(t, space.Get(ctx, []byte(kv.key), ¶m)) require.Equal(t, gparam, param, "GetSubspace().Get not equal with space.Get, tc #%d", i) - require.NotPanics(t, func() { gspace.Set(ctx, []byte(kv.key), int64(i)) }) - require.NotPanics(t, func() { space.Get(ctx, []byte(kv.key), ¶m) }) + require.NoError(t, gspace.Set(ctx, []byte(kv.key), int64(i))) + require.NoError(t, space.Get(ctx, []byte(kv.key), ¶m)) require.Equal(t, int64(i), param, "GetSubspace().Set not equal with space.Get, tc #%d", i) } } @@ -184,27 +184,27 @@ func TestSubspace(t *testing.T) { // Test space.Set, space.Modified for i, kv := range kvs { require.False(t, space.Modified(ctx, []byte(kv.key)), "space.Modified returns true before setting, tc #%d", i) - require.NotPanics(t, func() { space.Set(ctx, []byte(kv.key), kv.param) }, "space.Set panics, tc #%d", i) + require.NoError(t, space.Set(ctx, []byte(kv.key), kv.param), "space.Set error, tc #%d", i) require.True(t, space.Modified(ctx, []byte(kv.key)), "space.Modified returns false after setting, tc #%d", i) } // Test space.Get, space.GetIfExists for i, kv := range kvs { - require.NotPanics(t, func() { space.GetIfExists(ctx, []byte("invalid"), kv.ptr) }, "space.GetIfExists panics when no value exists, tc #%d", i) + require.Error(t, space.GetIfExists(ctx, []byte("invalid"), kv.ptr), "space.GetIfExists error when no value exists, tc #%d", i) require.Equal(t, kv.zero, indirect(kv.ptr), "space.GetIfExists unmarshalls when no value exists, tc #%d", i) - require.Panics(t, func() { space.Get(ctx, []byte("invalid"), kv.ptr) }, "invalid space.Get not panics when no value exists, tc #%d", i) + require.Error(t, space.Get(ctx, []byte("invalid"), kv.ptr), "invalid space.Get not error when no value exists, tc #%d", i) require.Equal(t, kv.zero, indirect(kv.ptr), "invalid space.Get unmarshalls when no value exists, tc #%d", i) - require.NotPanics(t, func() { space.GetIfExists(ctx, []byte(kv.key), kv.ptr) }, "space.GetIfExists panics, tc #%d", i) + require.NoError(t, space.GetIfExists(ctx, []byte(kv.key), kv.ptr), "space.GetIfExists error, tc #%d", i) require.Equal(t, kv.param, indirect(kv.ptr), "stored param not equal, tc #%d", i) - require.NotPanics(t, func() { space.Get(ctx, []byte(kv.key), kv.ptr) }, "space.Get panics, tc #%d", i) + require.NoError(t, space.Get(ctx, []byte(kv.key), kv.ptr), "space.Get error, tc #%d", i) require.Equal(t, kv.param, indirect(kv.ptr), "stored param not equal, tc #%d", i) - require.Panics(t, func() { space.Get(ctx, []byte("invalid"), kv.ptr) }, "invalid space.Get not panics when no value exists, tc #%d", i) + require.Error(t, space.Get(ctx, []byte("invalid"), kv.ptr), "invalid space.Get not error when no value exists, tc #%d", i) require.Equal(t, kv.param, indirect(kv.ptr), "invalid space.Get unmarshalls when no value existt, tc #%d", i) - require.Panics(t, func() { space.Get(ctx, []byte(kv.key), nil) }, "invalid space.Get not panics when the pointer is nil, tc #%d", i) - require.Panics(t, func() { space.Get(ctx, []byte(kv.key), new(invalid)) }, "invalid space.Get not panics when the pointer is different type, tc #%d", i) + require.Error(t, space.Get(ctx, []byte(kv.key), nil), "invalid space.Get not error when the pointer is nil, tc #%d", i) + require.Error(t, space.Get(ctx, []byte(kv.key), new(invalid)), "invalid space.Get not error when the pointer is different type, tc #%d", i) } // Test store.Get equals space.Get diff --git a/x/params/subspace/subspace.go b/x/params/subspace/subspace.go index 72cb5f209b..5ffb415709 100644 --- a/x/params/subspace/subspace.go +++ b/x/params/subspace/subspace.go @@ -1,6 +1,7 @@ package subspace import ( + "errors" "reflect" "github.com/cosmos/cosmos-sdk/codec" @@ -90,37 +91,31 @@ func concatKeys(key, subkey []byte) (res []byte) { } // Get parameter from store -func (s Subspace) Get(ctx sdk.Context, key []byte, ptr interface{}) { +func (s Subspace) Get(ctx sdk.Context, key []byte, ptr interface{}) error { store := s.kvStore(ctx) bz := store.Get(key) - err := s.cdc.UnmarshalJSON(bz, ptr) - if err != nil { - panic(err) - } + return s.cdc.UnmarshalJSON(bz, ptr) } // GetIfExists do not modify ptr if the stored parameter is nil -func (s Subspace) GetIfExists(ctx sdk.Context, key []byte, ptr interface{}) { +func (s Subspace) GetIfExists(ctx sdk.Context, key []byte, ptr interface{}) error { store := s.kvStore(ctx) bz := store.Get(key) if bz == nil { - return - } - err := s.cdc.UnmarshalJSON(bz, ptr) - if err != nil { - panic(err) + return errors.New("store key does not exist") } + return s.cdc.UnmarshalJSON(bz, ptr) } // GetWithSubkey returns a parameter with a given key and a subkey. -func (s Subspace) GetWithSubkey(ctx sdk.Context, key, subkey []byte, ptr interface{}) { - s.Get(ctx, concatKeys(key, subkey), ptr) +func (s Subspace) GetWithSubkey(ctx sdk.Context, key, subkey []byte, ptr interface{}) error { + return s.Get(ctx, concatKeys(key, subkey), ptr) } // GetWithSubkeyIfExists returns a parameter with a given key and a subkey but does not // modify ptr if the stored parameter is nil. -func (s Subspace) GetWithSubkeyIfExists(ctx sdk.Context, key, subkey []byte, ptr interface{}) { - s.GetIfExists(ctx, concatKeys(key, subkey), ptr) +func (s Subspace) GetWithSubkeyIfExists(ctx sdk.Context, key, subkey []byte, ptr interface{}) error { + return s.GetIfExists(ctx, concatKeys(key, subkey), ptr) } // Get raw bytes of parameter from store @@ -141,10 +136,10 @@ func (s Subspace) Modified(ctx sdk.Context, key []byte) bool { return tstore.Has(key) } -func (s Subspace) checkType(store sdk.KVStore, key []byte, param interface{}) { +func (s Subspace) checkType(store sdk.KVStore, key []byte, param interface{}) error { attr, ok := s.table.m[string(key)] if !ok { - panic("Parameter not registered") + return errors.New("Parameter not registered") } ty := attr.ty @@ -154,51 +149,61 @@ func (s Subspace) checkType(store sdk.KVStore, key []byte, param interface{}) { } if pty != ty { - panic("Type mismatch with registered table") + return errors.New("Type mismatch with registered table") } + return nil } // Set stores the parameter. It returns error if stored parameter has different type from input. // It also set to the transient store to record change. -func (s Subspace) Set(ctx sdk.Context, key []byte, param interface{}) { +func (s Subspace) Set(ctx sdk.Context, key []byte, param interface{}) error { store := s.kvStore(ctx) - s.checkType(store, key, param) + if err := s.checkType(store, key, param); err != nil { + return err + } bz, err := s.cdc.MarshalJSON(param) if err != nil { - panic(err) + return err } store.Set(key, bz) tstore := s.transientStore(ctx) tstore.Set(key, []byte{}) - + return nil } // SetWithSubkey set a parameter with a key and subkey // Checks parameter type only over the key -func (s Subspace) SetWithSubkey(ctx sdk.Context, key []byte, subkey []byte, param interface{}) { +func (s Subspace) SetWithSubkey(ctx sdk.Context, key []byte, subkey []byte, param interface{}) error { store := s.kvStore(ctx) - s.checkType(store, key, param) + if err := s.checkType(store, key, param); err != nil { + return err + } newkey := concatKeys(key, subkey) bz, err := s.cdc.MarshalJSON(param) if err != nil { - panic(err) + return err } store.Set(newkey, bz) tstore := s.transientStore(ctx) tstore.Set(newkey, []byte{}) + return nil } // Get to ParamSet func (s Subspace) GetParamSet(ctx sdk.Context, ps ParamSet) { for _, pair := range ps.ParamSetPairs() { - s.Get(ctx, pair.Key, pair.Value) + err := s.Get(ctx, pair.Key, pair.Value) + if err != nil { + // TODO: return error - needs rewrite interfaces + // and handle error on the caller side + } } } @@ -210,7 +215,11 @@ func (s Subspace) SetParamSet(ctx sdk.Context, ps ParamSet) { // since SetStruct is meant to be used in InitGenesis // so this method will not be called frequently v := reflect.Indirect(reflect.ValueOf(pair.Value)).Interface() - s.Set(ctx, pair.Key, v) + err := s.Set(ctx, pair.Key, v) + if err != nil { + // TODO: return error - needs rewrite interfaces + // and handle error on the caller side + } } } @@ -225,8 +234,8 @@ type ReadOnlySubspace struct { } // Exposes Get -func (ros ReadOnlySubspace) Get(ctx sdk.Context, key []byte, ptr interface{}) { - ros.s.Get(ctx, key, ptr) +func (ros ReadOnlySubspace) Get(ctx sdk.Context, key []byte, ptr interface{}) error { + return ros.s.Get(ctx, key, ptr) } // Exposes GetRaw diff --git a/x/slashing/app_test.go b/x/slashing/app_test.go index 94d53f5889..31093fd98a 100644 --- a/x/slashing/app_test.go +++ b/x/slashing/app_test.go @@ -47,12 +47,12 @@ func getMockApp(t *testing.T) (*mock.App, staking.Keeper, Keeper) { // staking endblocker func getEndBlocker(keeper staking.Keeper) sdk.EndBlocker { - return func(ctx sdk.Context, req abci.RequestEndBlock) abci.ResponseEndBlock { - validatorUpdates, tags := staking.EndBlocker(ctx, keeper) + return func(ctx sdk.Context, req abci.RequestEndBlock) (abci.ResponseEndBlock, error) { + validatorUpdates, tags, err := staking.EndBlocker(ctx, keeper) return abci.ResponseEndBlock{ ValidatorUpdates: validatorUpdates, Tags: tags, - } + }, err } } diff --git a/x/slashing/keeper_test.go b/x/slashing/keeper_test.go index 7b0bd11745..240c7cb73b 100644 --- a/x/slashing/keeper_test.go +++ b/x/slashing/keeper_test.go @@ -394,7 +394,8 @@ func TestValidatorDippingInAndOut(t *testing.T) { newAmt := sdk.TokensFromTendermintPower(101) got = sh(ctx, NewTestMsgCreateValidator(addrs[1], pks[1], newAmt)) require.True(t, got.IsOK()) - validatorUpdates, _ := staking.EndBlocker(ctx, sk) + validatorUpdates, _, err := staking.EndBlocker(ctx, sk) + require.NoError(t, err) require.Equal(t, 2, len(validatorUpdates)) validator, _ := sk.GetValidator(ctx, addr) require.Equal(t, sdk.Unbonding, validator.Status) @@ -407,7 +408,8 @@ func TestValidatorDippingInAndOut(t *testing.T) { delTokens := sdk.TokensFromTendermintPower(3) got = sh(ctx, newTestMsgDelegate(sdk.AccAddress(addrs[2]), addrs[0], delTokens)) require.True(t, got.IsOK()) - validatorUpdates, _ = staking.EndBlocker(ctx, sk) + validatorUpdates, _, err = staking.EndBlocker(ctx, sk) + require.NoError(t, err) require.Equal(t, 2, len(validatorUpdates)) validator, _ = sk.GetValidator(ctx, addr) require.Equal(t, sdk.Bonded, validator.Status) diff --git a/x/slashing/params.go b/x/slashing/params.go index 5a4f18f167..5dd4ce8346 100644 --- a/x/slashing/params.go +++ b/x/slashing/params.go @@ -88,20 +88,35 @@ func DefaultParams() Params { // MaxEvidenceAge - max age for evidence func (k Keeper) MaxEvidenceAge(ctx sdk.Context) (res time.Duration) { - k.paramspace.Get(ctx, KeyMaxEvidenceAge, &res) + err := k.paramspace.Get(ctx, KeyMaxEvidenceAge, &res) + if err != nil { + // TODO: return error - needs rewrite interfaces + // and handle error on the caller side + // check PR #3782 + } return } // SignedBlocksWindow - sliding window for downtime slashing func (k Keeper) SignedBlocksWindow(ctx sdk.Context) (res int64) { - k.paramspace.Get(ctx, KeySignedBlocksWindow, &res) + err := k.paramspace.Get(ctx, KeySignedBlocksWindow, &res) + if err != nil { + // TODO: return error - needs rewrite interfaces + // and handle error on the caller side + // check PR #3782 + } return } // Downtime slashing threshold func (k Keeper) MinSignedPerWindow(ctx sdk.Context) int64 { var minSignedPerWindow sdk.Dec - k.paramspace.Get(ctx, KeyMinSignedPerWindow, &minSignedPerWindow) + err := k.paramspace.Get(ctx, KeyMinSignedPerWindow, &minSignedPerWindow) + if err != nil { + // TODO: return error - needs rewrite interfaces + // and handle error on the caller side + // check PR #3782 + } signedBlocksWindow := k.SignedBlocksWindow(ctx) // NOTE: RoundInt64 will never panic as minSignedPerWindow is @@ -111,19 +126,34 @@ func (k Keeper) MinSignedPerWindow(ctx sdk.Context) int64 { // Downtime unbond duration func (k Keeper) DowntimeJailDuration(ctx sdk.Context) (res time.Duration) { - k.paramspace.Get(ctx, KeyDowntimeJailDuration, &res) + err := k.paramspace.Get(ctx, KeyDowntimeJailDuration, &res) + if err != nil { + // TODO: return error - needs rewrite interfaces + // and handle error on the caller side + // check PR #3782 + } return } // SlashFractionDoubleSign func (k Keeper) SlashFractionDoubleSign(ctx sdk.Context) (res sdk.Dec) { - k.paramspace.Get(ctx, KeySlashFractionDoubleSign, &res) + err := k.paramspace.Get(ctx, KeySlashFractionDoubleSign, &res) + if err != nil { + // TODO: return error - needs rewrite interfaces + // and handle error on the caller side + // check PR #3782 + } return } // SlashFractionDowntime func (k Keeper) SlashFractionDowntime(ctx sdk.Context) (res sdk.Dec) { - k.paramspace.Get(ctx, KeySlashFractionDowntime, &res) + err := k.paramspace.Get(ctx, KeySlashFractionDowntime, &res) + if err != nil { + // TODO: return error - needs rewrite interfaces + // and handle error on the caller side + // check PR #3782 + } return } diff --git a/x/slashing/tick.go b/x/slashing/tick.go index bd779973f1..ab1606e1a5 100644 --- a/x/slashing/tick.go +++ b/x/slashing/tick.go @@ -10,7 +10,7 @@ import ( ) // slashing begin block functionality -func BeginBlocker(ctx sdk.Context, req abci.RequestBeginBlock, sk Keeper) sdk.Tags { +func BeginBlocker(ctx sdk.Context, req abci.RequestBeginBlock, sk Keeper) (sdk.Tags, error) { // Iterate over all the validators which *should* have signed this block // store whether or not they have actually signed it and slash/unbond any @@ -27,9 +27,9 @@ func BeginBlocker(ctx sdk.Context, req abci.RequestBeginBlock, sk Keeper) sdk.Ta case tmtypes.ABCIEvidenceTypeDuplicateVote: sk.handleDoubleSign(ctx, evidence.Validator.Address, evidence.Height, evidence.Time, evidence.Validator.Power) default: - ctx.Logger().With("module", "x/slashing").Error(fmt.Sprintf("ignored unknown evidence type: %s", evidence.Type)) + return sdk.EmptyTags(), fmt.Errorf("ignored unknown evidence type: %s", evidence.Type) } } - return sdk.EmptyTags() + return sdk.EmptyTags(), nil } diff --git a/x/slashing/tick_test.go b/x/slashing/tick_test.go index cc0e5f13b4..33bd0d1091 100644 --- a/x/slashing/tick_test.go +++ b/x/slashing/tick_test.go @@ -42,7 +42,8 @@ func TestBeginBlocker(t *testing.T) { }}, }, } - BeginBlocker(ctx, req, keeper) + _, err := BeginBlocker(ctx, req, keeper) + require.NoError(t, err) info, found := keeper.getValidatorSigningInfo(ctx, sdk.ConsAddress(pk.Address())) require.True(t, found) @@ -64,7 +65,8 @@ func TestBeginBlocker(t *testing.T) { }}, }, } - BeginBlocker(ctx, req, keeper) + _, err := BeginBlocker(ctx, req, keeper) + require.NoError(t, err) } // for 500 blocks, mark the validator as having not signed @@ -78,7 +80,8 @@ func TestBeginBlocker(t *testing.T) { }}, }, } - BeginBlocker(ctx, req, keeper) + _, err := BeginBlocker(ctx, req, keeper) + require.NoError(t, err) } // end block diff --git a/x/staking/app_test.go b/x/staking/app_test.go index da8c52ea5b..0d5de7c5e7 100644 --- a/x/staking/app_test.go +++ b/x/staking/app_test.go @@ -34,13 +34,13 @@ func getMockApp(t *testing.T) (*mock.App, Keeper) { // getEndBlocker returns a staking endblocker. func getEndBlocker(keeper Keeper) sdk.EndBlocker { - return func(ctx sdk.Context, req abci.RequestEndBlock) abci.ResponseEndBlock { - validatorUpdates, tags := EndBlocker(ctx, keeper) + return func(ctx sdk.Context, req abci.RequestEndBlock) (abci.ResponseEndBlock, error) { + validatorUpdates, tags, err := EndBlocker(ctx, keeper) return abci.ResponseEndBlock{ ValidatorUpdates: validatorUpdates, Tags: tags, - } + }, err } } diff --git a/x/staking/handler.go b/x/staking/handler.go index 7da83cec2e..dc60b1bb84 100644 --- a/x/staking/handler.go +++ b/x/staking/handler.go @@ -34,7 +34,7 @@ func NewHandler(k keeper.Keeper) sdk.Handler { } // Called every block, update validator set -func EndBlocker(ctx sdk.Context, k keeper.Keeper) ([]abci.ValidatorUpdate, sdk.Tags) { +func EndBlocker(ctx sdk.Context, k keeper.Keeper) ([]abci.ValidatorUpdate, sdk.Tags, error) { resTags := sdk.NewTags() // Calculate validator set changes. @@ -83,7 +83,7 @@ func EndBlocker(ctx sdk.Context, k keeper.Keeper) ([]abci.ValidatorUpdate, sdk.T )) } - return validatorUpdates, resTags + return validatorUpdates, resTags, nil } // These functions assume everything has been authenticated, diff --git a/x/staking/keeper/params.go b/x/staking/keeper/params.go index dede56b2c1..27f7774193 100644 --- a/x/staking/keeper/params.go +++ b/x/staking/keeper/params.go @@ -20,26 +20,42 @@ func ParamKeyTable() params.KeyTable { // UnbondingTime func (k Keeper) UnbondingTime(ctx sdk.Context) (res time.Duration) { - k.paramstore.Get(ctx, types.KeyUnbondingTime, &res) + if err := k.paramstore.Get(ctx, types.KeyUnbondingTime, &res); err != nil { + // TODO: return error - needs rewrite interfaces + // and handle error on the caller side + // check PR #3782 + } return } // MaxValidators - Maximum number of validators func (k Keeper) MaxValidators(ctx sdk.Context) (res uint16) { - k.paramstore.Get(ctx, types.KeyMaxValidators, &res) + if err := k.paramstore.Get(ctx, types.KeyMaxValidators, &res); err != nil { + // TODO: return error - needs rewrite interfaces + // and handle error on the caller side + // check PR #3782 + } return } // MaxEntries - Maximum number of simultaneous unbonding // delegations or redelegations (per pair/trio) func (k Keeper) MaxEntries(ctx sdk.Context) (res uint16) { - k.paramstore.Get(ctx, types.KeyMaxEntries, &res) + if err := k.paramstore.Get(ctx, types.KeyMaxEntries, &res); err != nil { + // TODO: return error - needs rewrite interfaces + // and handle error on the caller side + // check PR #3782 + } return } // BondDenom - Bondable coin denomination func (k Keeper) BondDenom(ctx sdk.Context) (res string) { - k.paramstore.Get(ctx, types.KeyBondDenom, &res) + if err := k.paramstore.Get(ctx, types.KeyBondDenom, &res); err != nil { + // TODO: return error - needs rewrite interfaces + // and handle error on the caller side + // check PR #3782 + } return } From 85021d4ca984772cd0c00d67af14348abe841ea7 Mon Sep 17 00:00:00 2001 From: Alessio Treglia Date: Thu, 4 Apr 2019 15:36:39 +0100 Subject: [PATCH 02/47] No packages must depend on cmd/gaia/ (#4048) Preparation work for moving gaia out of the SDK. --- client/config.go | 3 +++ client/config_test.go | 9 ++++---- client/keys/add.go | 5 ++-- client/keys/delete_test.go | 3 ++- client/keys/list.go | 3 ++- client/keys/list_test.go | 3 ++- client/keys/show.go | 1 + client/keys/update_test.go | 3 ++- client/lcd/lcd_test.go | 3 +-- client/lcd/test_helpers.go | 4 ++-- client/tx/utils.go | 3 ++- cmd/gaia/app/app.go | 2 -- cmd/gaia/cli_test/test_helpers.go | 34 +++++++++++++++------------- cmd/gaia/cmd/gaiakeyutil/main.go | 3 ++- cmd/gaia/init/gentx_test.go | 7 +++--- cmd/gaia/init/init_test.go | 9 ++++---- cmd/gaia/init/testnet.go | 6 ++--- cmd/gaia/init/validate_genesis.go | 5 ++-- cmd/sdkch/main.go | 4 ++-- codec/codec.go | 2 +- crypto/amino.go | 2 +- crypto/keys/keybase_test.go | 5 ++-- crypto/keys/mintkey/mintkey.go | 2 +- crypto/keys/mintkey/mintkey_test.go | 5 ++-- crypto/ledger_mock.go | 5 ++-- crypto/ledger_secp256k1.go | 1 + crypto/ledger_test.go | 5 ++-- go.sum | 1 + server/constructors.go | 3 ++- types/address.go | 2 +- types/address_test.go | 3 ++- types/rest/rest.go | 3 ++- x/crisis/handler_test.go | 3 ++- x/mint/client/cli/query.go | 3 ++- x/mint/client/module_client.go | 5 ++-- x/mint/client/rest/query.go | 3 ++- x/mint/client/rest/rest.go | 3 ++- x/mint/querier.go | 3 ++- x/mint/querier_test.go | 3 ++- x/mint/test_common.go | 3 ++- x/simulation/util.go | 3 ++- x/slashing/client/rest/query.go | 6 +++-- x/slashing/client/rest/query_test.go | 3 ++- 43 files changed, 110 insertions(+), 77 deletions(-) diff --git a/client/config.go b/client/config.go index d785093a30..c49a6f9de3 100644 --- a/client/config.go +++ b/client/config.go @@ -16,6 +16,9 @@ import ( const ( flagGet = "get" + + // DefaultKeyPass contains the default key password for genesis transactions + DefaultKeyPass = "12345678" ) var configDefaults = map[string]string{ diff --git a/client/config_test.go b/client/config_test.go index 6263a212ac..1ff3b34f69 100644 --- a/client/config_test.go +++ b/client/config_test.go @@ -1,14 +1,15 @@ package client import ( - "github.com/spf13/viper" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - "github.com/tendermint/tendermint/libs/cli" "io/ioutil" "os" "path/filepath" "testing" + + "github.com/spf13/viper" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "github.com/tendermint/tendermint/libs/cli" ) // For https://github.com/cosmos/cosmos-sdk/issues/3899 diff --git a/client/keys/add.go b/client/keys/add.go index 7ab5ecdb8a..49a275bf6a 100644 --- a/client/keys/add.go +++ b/client/keys/add.go @@ -7,7 +7,6 @@ import ( "sort" "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/cmd/gaia/app" "github.com/cosmos/cosmos-sdk/crypto/keys" sdk "github.com/cosmos/cosmos-sdk/types" @@ -16,7 +15,7 @@ import ( "github.com/spf13/cobra" "github.com/spf13/viper" - bip39 "github.com/cosmos/go-bip39" + "github.com/cosmos/go-bip39" "github.com/tendermint/tendermint/crypto" "github.com/tendermint/tendermint/crypto/multisig" @@ -102,7 +101,7 @@ func runAddCmd(_ *cobra.Command, args []string) error { // we throw this away, so don't enforce args, // we want to get a new random seed phrase quickly kb = keys.NewInMemory() - encryptPassword = app.DefaultKeyPass + encryptPassword = client.DefaultKeyPass } else { kb, err = NewKeyBaseFromHomeFlag() if err != nil { diff --git a/client/keys/delete_test.go b/client/keys/delete_test.go index ad7b5367fd..6fda75cbdd 100644 --- a/client/keys/delete_test.go +++ b/client/keys/delete_test.go @@ -7,11 +7,12 @@ import ( "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/tests" "github.com/spf13/viper" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/tendermint/tendermint/libs/cli" + + "github.com/cosmos/cosmos-sdk/tests" ) func Test_runDeleteCmd(t *testing.T) { diff --git a/client/keys/list.go b/client/keys/list.go index 19873aabb7..2e1ef1938a 100644 --- a/client/keys/list.go +++ b/client/keys/list.go @@ -1,8 +1,9 @@ package keys import ( - "github.com/cosmos/cosmos-sdk/client" "github.com/spf13/cobra" + + "github.com/cosmos/cosmos-sdk/client" ) func listKeysCmd() *cobra.Command { diff --git a/client/keys/list_test.go b/client/keys/list_test.go index 9fdab6a751..fe0ac46341 100644 --- a/client/keys/list_test.go +++ b/client/keys/list_test.go @@ -3,9 +3,10 @@ package keys import ( "testing" - "github.com/cosmos/cosmos-sdk/tests" "github.com/stretchr/testify/assert" + "github.com/cosmos/cosmos-sdk/tests" + "github.com/spf13/viper" "github.com/tendermint/tendermint/libs/cli" diff --git a/client/keys/show.go b/client/keys/show.go index eaa800e11f..131b45f5e7 100644 --- a/client/keys/show.go +++ b/client/keys/show.go @@ -3,6 +3,7 @@ package keys import ( "errors" "fmt" + "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/crypto" diff --git a/client/keys/update_test.go b/client/keys/update_test.go index e1c6784f15..78f3363455 100644 --- a/client/keys/update_test.go +++ b/client/keys/update_test.go @@ -7,10 +7,11 @@ import ( "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/tests" "github.com/spf13/viper" "github.com/tendermint/tendermint/libs/cli" + "github.com/cosmos/cosmos-sdk/tests" + "github.com/stretchr/testify/assert" ) diff --git a/client/lcd/lcd_test.go b/client/lcd/lcd_test.go index 0ead2f3636..580d6eaede 100644 --- a/client/lcd/lcd_test.go +++ b/client/lcd/lcd_test.go @@ -18,7 +18,6 @@ import ( "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/keys" clienttx "github.com/cosmos/cosmos-sdk/client/tx" - "github.com/cosmos/cosmos-sdk/cmd/gaia/app" "github.com/cosmos/cosmos-sdk/crypto/keys/mintkey" "github.com/cosmos/cosmos-sdk/tests" sdk "github.com/cosmos/cosmos-sdk/types" @@ -38,7 +37,7 @@ const ( name2 = "test2" name3 = "test3" memo = "LCD test tx" - pw = app.DefaultKeyPass + pw = client.DefaultKeyPass altPw = "12345678901" ) diff --git a/client/lcd/test_helpers.go b/client/lcd/test_helpers.go index 856efaf95f..127e8992a9 100644 --- a/client/lcd/test_helpers.go +++ b/client/lcd/test_helpers.go @@ -695,7 +695,7 @@ func doTransferWithGas( kb := crkeys.NewInMemory() receiveInfo, _, err := kb.CreateMnemonic( - "receive_address", crkeys.English, gapp.DefaultKeyPass, crkeys.SigningAlgo("secp256k1"), + "receive_address", crkeys.English, client.DefaultKeyPass, crkeys.SigningAlgo("secp256k1"), ) require.Nil(t, err) @@ -742,7 +742,7 @@ func doTransferWithGasAccAuto( acc := getAccount(t, port, addr) receiveInfo, _, err := kb.CreateMnemonic( - "receive_address", crkeys.English, gapp.DefaultKeyPass, crkeys.SigningAlgo("secp256k1"), + "receive_address", crkeys.English, client.DefaultKeyPass, crkeys.SigningAlgo("secp256k1"), ) require.Nil(t, err) diff --git a/client/tx/utils.go b/client/tx/utils.go index 41dfd72e88..b15ac43f86 100644 --- a/client/tx/utils.go +++ b/client/tx/utils.go @@ -6,11 +6,12 @@ import ( "strings" "time" + ctypes "github.com/tendermint/tendermint/rpc/core/types" + "github.com/cosmos/cosmos-sdk/client/context" "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/auth" - ctypes "github.com/tendermint/tendermint/rpc/core/types" ) // SearchTxs performs a search for transactions for a given set of tags via diff --git a/cmd/gaia/app/app.go b/cmd/gaia/app/app.go index fa64c48d5d..24d24ee87b 100644 --- a/cmd/gaia/app/app.go +++ b/cmd/gaia/app/app.go @@ -27,8 +27,6 @@ import ( const ( appName = "GaiaApp" - // DefaultKeyPass contains the default key password for genesis transactions - DefaultKeyPass = "12345678" ) // default home directories for expected binaries diff --git a/cmd/gaia/cli_test/test_helpers.go b/cmd/gaia/cli_test/test_helpers.go index aac07abb27..010fd05d5b 100644 --- a/cmd/gaia/cli_test/test_helpers.go +++ b/cmd/gaia/cli_test/test_helpers.go @@ -10,6 +10,8 @@ import ( "testing" "time" + "github.com/cosmos/cosmos-sdk/client" + "github.com/stretchr/testify/require" cmn "github.com/tendermint/tendermint/libs/common" @@ -177,7 +179,7 @@ func (f *Fixtures) UnsafeResetAll(flags ...string) { // NOTE: GDInit sets the ChainID for the Fixtures instance func (f *Fixtures) GDInit(moniker string, flags ...string) { cmd := fmt.Sprintf("../../../build/gaiad init -o --home=%s %s", f.GDHome, moniker) - _, stderr := tests.ExecuteT(f.T, addFlags(cmd, flags), app.DefaultKeyPass) + _, stderr := tests.ExecuteT(f.T, addFlags(cmd, flags), client.DefaultKeyPass) var chainID string var initRes map[string]json.RawMessage @@ -200,13 +202,13 @@ func (f *Fixtures) AddGenesisAccount(address sdk.AccAddress, coins sdk.Coins, fl // GenTx is gaiad gentx func (f *Fixtures) GenTx(name string, flags ...string) { cmd := fmt.Sprintf("../../../build/gaiad gentx --name=%s --home=%s --home-client=%s", name, f.GDHome, f.GCLIHome) - executeWriteCheckErr(f.T, addFlags(cmd, flags), app.DefaultKeyPass) + executeWriteCheckErr(f.T, addFlags(cmd, flags), client.DefaultKeyPass) } // CollectGenTxs is gaiad collect-gentxs func (f *Fixtures) CollectGenTxs(flags ...string) { cmd := fmt.Sprintf("../../../build/gaiad collect-gentxs --home=%s", f.GDHome) - executeWriteCheckErr(f.T, addFlags(cmd, flags), app.DefaultKeyPass) + executeWriteCheckErr(f.T, addFlags(cmd, flags), client.DefaultKeyPass) } // GDStart runs gaiad start with the appropriate flags and returns a process @@ -245,19 +247,19 @@ func (f *Fixtures) KeysDelete(name string, flags ...string) { // KeysAdd is gaiacli keys add func (f *Fixtures) KeysAdd(name string, flags ...string) { cmd := fmt.Sprintf("../../../build/gaiacli keys add --home=%s %s", f.GCLIHome, name) - executeWriteCheckErr(f.T, addFlags(cmd, flags), app.DefaultKeyPass) + executeWriteCheckErr(f.T, addFlags(cmd, flags), client.DefaultKeyPass) } // KeysAddRecover prepares gaiacli keys add --recover func (f *Fixtures) KeysAddRecover(name, mnemonic string, flags ...string) { cmd := fmt.Sprintf("../../../build/gaiacli keys add --home=%s --recover %s", f.GCLIHome, name) - executeWriteCheckErr(f.T, addFlags(cmd, flags), app.DefaultKeyPass, mnemonic) + executeWriteCheckErr(f.T, addFlags(cmd, flags), client.DefaultKeyPass, mnemonic) } // KeysAddRecoverHDPath prepares gaiacli keys add --recover --account --index func (f *Fixtures) KeysAddRecoverHDPath(name, mnemonic string, account uint32, index uint32, flags ...string) { cmd := fmt.Sprintf("../../../build/gaiacli keys add --home=%s --recover %s --account %d --index %d", f.GCLIHome, name, account, index) - executeWriteCheckErr(f.T, addFlags(cmd, flags), app.DefaultKeyPass, mnemonic) + executeWriteCheckErr(f.T, addFlags(cmd, flags), client.DefaultKeyPass, mnemonic) } // KeysShow is gaiacli keys show @@ -293,7 +295,7 @@ func (f *Fixtures) CLIConfig(key, value string, flags ...string) { // TxSend is gaiacli tx send func (f *Fixtures) TxSend(from string, to sdk.AccAddress, amount sdk.Coin, flags ...string) (bool, string, string) { cmd := fmt.Sprintf("../../../build/gaiacli tx send %s %s %v --from=%s", to, amount, f.Flags(), from) - return executeWriteRetStdStreams(f.T, addFlags(cmd, flags), app.DefaultKeyPass) + return executeWriteRetStdStreams(f.T, addFlags(cmd, flags), client.DefaultKeyPass) } func (f *Fixtures) txSendWithConfirm( @@ -301,25 +303,25 @@ func (f *Fixtures) txSendWithConfirm( ) (bool, string, string) { cmd := fmt.Sprintf("../../../build/gaiacli tx send %s %s %v --from=%s", to, amount, f.Flags(), from) - return executeWriteRetStdStreams(f.T, addFlags(cmd, flags), confirm, app.DefaultKeyPass) + return executeWriteRetStdStreams(f.T, addFlags(cmd, flags), confirm, client.DefaultKeyPass) } // TxSign is gaiacli tx sign func (f *Fixtures) TxSign(signer, fileName string, flags ...string) (bool, string, string) { cmd := fmt.Sprintf("../../../build/gaiacli tx sign %v --from=%s %v", f.Flags(), signer, fileName) - return executeWriteRetStdStreams(f.T, addFlags(cmd, flags), app.DefaultKeyPass) + return executeWriteRetStdStreams(f.T, addFlags(cmd, flags), client.DefaultKeyPass) } // TxBroadcast is gaiacli tx broadcast func (f *Fixtures) TxBroadcast(fileName string, flags ...string) (bool, string, string) { cmd := fmt.Sprintf("../../../build/gaiacli tx broadcast %v %v", f.Flags(), fileName) - return executeWriteRetStdStreams(f.T, addFlags(cmd, flags), app.DefaultKeyPass) + return executeWriteRetStdStreams(f.T, addFlags(cmd, flags), client.DefaultKeyPass) } // TxEncode is gaiacli tx encode func (f *Fixtures) TxEncode(fileName string, flags ...string) (bool, string, string) { cmd := fmt.Sprintf("../../../build/gaiacli tx encode %v %v", f.Flags(), fileName) - return executeWriteRetStdStreams(f.T, addFlags(cmd, flags), app.DefaultKeyPass) + return executeWriteRetStdStreams(f.T, addFlags(cmd, flags), client.DefaultKeyPass) } // TxMultisign is gaiacli tx multisign @@ -341,13 +343,13 @@ func (f *Fixtures) TxStakingCreateValidator(from, consPubKey string, amount sdk. cmd += fmt.Sprintf(" --amount=%v --moniker=%v --commission-rate=%v", amount, from, "0.05") cmd += fmt.Sprintf(" --commission-max-rate=%v --commission-max-change-rate=%v", "0.20", "0.10") cmd += fmt.Sprintf(" --min-self-delegation=%v", "1") - return executeWriteRetStdStreams(f.T, addFlags(cmd, flags), app.DefaultKeyPass) + return executeWriteRetStdStreams(f.T, addFlags(cmd, flags), client.DefaultKeyPass) } // TxStakingUnbond is gaiacli tx staking unbond func (f *Fixtures) TxStakingUnbond(from, shares string, validator sdk.ValAddress, flags ...string) bool { cmd := fmt.Sprintf("../../../build/gaiacli tx staking unbond %s %v --from=%s %v", validator, shares, from, f.Flags()) - return executeWrite(f.T, addFlags(cmd, flags), app.DefaultKeyPass) + return executeWrite(f.T, addFlags(cmd, flags), client.DefaultKeyPass) } //___________________________________________________________________________________ @@ -357,19 +359,19 @@ func (f *Fixtures) TxStakingUnbond(from, shares string, validator sdk.ValAddress func (f *Fixtures) TxGovSubmitProposal(from, typ, title, description string, deposit sdk.Coin, flags ...string) (bool, string, string) { cmd := fmt.Sprintf("../../../build/gaiacli tx gov submit-proposal %v --from=%s --type=%s", f.Flags(), from, typ) cmd += fmt.Sprintf(" --title=%s --description=%s --deposit=%s", title, description, deposit) - return executeWriteRetStdStreams(f.T, addFlags(cmd, flags), app.DefaultKeyPass) + return executeWriteRetStdStreams(f.T, addFlags(cmd, flags), client.DefaultKeyPass) } // TxGovDeposit is gaiacli tx gov deposit func (f *Fixtures) TxGovDeposit(proposalID int, from string, amount sdk.Coin, flags ...string) (bool, string, string) { cmd := fmt.Sprintf("../../../build/gaiacli tx gov deposit %d %s --from=%s %v", proposalID, amount, from, f.Flags()) - return executeWriteRetStdStreams(f.T, addFlags(cmd, flags), app.DefaultKeyPass) + return executeWriteRetStdStreams(f.T, addFlags(cmd, flags), client.DefaultKeyPass) } // TxGovVote is gaiacli tx gov vote func (f *Fixtures) TxGovVote(proposalID int, option gov.VoteOption, from string, flags ...string) (bool, string, string) { cmd := fmt.Sprintf("../../../build/gaiacli tx gov vote %d %s --from=%s %v", proposalID, option, from, f.Flags()) - return executeWriteRetStdStreams(f.T, addFlags(cmd, flags), app.DefaultKeyPass) + return executeWriteRetStdStreams(f.T, addFlags(cmd, flags), client.DefaultKeyPass) } //___________________________________________________________________________________ diff --git a/cmd/gaia/cmd/gaiakeyutil/main.go b/cmd/gaia/cmd/gaiakeyutil/main.go index 46eefc69cc..30aebed3bf 100644 --- a/cmd/gaia/cmd/gaiakeyutil/main.go +++ b/cmd/gaia/cmd/gaiakeyutil/main.go @@ -5,8 +5,9 @@ import ( "fmt" "os" - sdk "github.com/cosmos/cosmos-sdk/types" "github.com/tendermint/tendermint/libs/bech32" + + sdk "github.com/cosmos/cosmos-sdk/types" ) var bech32Prefixes = []string{ diff --git a/cmd/gaia/init/gentx_test.go b/cmd/gaia/init/gentx_test.go index d99a562fc0..b83088b140 100644 --- a/cmd/gaia/init/gentx_test.go +++ b/cmd/gaia/init/gentx_test.go @@ -3,15 +3,16 @@ 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" + + "github.com/cosmos/cosmos-sdk/server" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/staking/client/cli" ) func Test_prepareFlagsForTxCreateValidator(t *testing.T) { diff --git a/cmd/gaia/init/init_test.go b/cmd/gaia/init/init_test.go index 39975bb296..abfc343d17 100644 --- a/cmd/gaia/init/init_test.go +++ b/cmd/gaia/init/init_test.go @@ -8,16 +8,17 @@ import ( "testing" "time" - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/cmd/gaia/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" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/cmd/gaia/app" + "github.com/cosmos/cosmos-sdk/server" + "github.com/cosmos/cosmos-sdk/server/mock" ) func TestInitCmd(t *testing.T) { diff --git a/cmd/gaia/init/testnet.go b/cmd/gaia/init/testnet.go index fc59827a6c..334286335a 100644 --- a/cmd/gaia/init/testnet.go +++ b/cmd/gaia/init/testnet.go @@ -157,7 +157,7 @@ func initTestnet(config *tmconfig.Config, cdc *codec.Codec) error { buf := client.BufferStdin() prompt := fmt.Sprintf( - "Password for account '%s' (default %s):", nodeDirName, app.DefaultKeyPass, + "Password for account '%s' (default %s):", nodeDirName, client.DefaultKeyPass, ) keyPass, err := client.GetPassword(prompt, buf) @@ -169,7 +169,7 @@ func initTestnet(config *tmconfig.Config, cdc *codec.Codec) error { } if keyPass == "" { - keyPass = app.DefaultKeyPass + keyPass = client.DefaultKeyPass } addr, secret, err := server.GenerateSaveCoinKey(clientDir, nodeDirName, keyPass, true) @@ -217,7 +217,7 @@ func initTestnet(config *tmconfig.Config, cdc *codec.Codec) error { 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) + signedTx, err := txBldr.SignStdTx(nodeDirName, client.DefaultKeyPass, tx, false) if err != nil { _ = os.RemoveAll(outDir) return err diff --git a/cmd/gaia/init/validate_genesis.go b/cmd/gaia/init/validate_genesis.go index eb0eaa3a2e..e98fdbedad 100644 --- a/cmd/gaia/init/validate_genesis.go +++ b/cmd/gaia/init/validate_genesis.go @@ -4,11 +4,12 @@ import ( "fmt" "os" + "github.com/spf13/cobra" + "github.com/tendermint/tendermint/types" + "github.com/cosmos/cosmos-sdk/cmd/gaia/app" "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/server" - "github.com/spf13/cobra" - "github.com/tendermint/tendermint/types" ) // Validate genesis command takes diff --git a/cmd/sdkch/main.go b/cmd/sdkch/main.go index df3a781453..d199bc454d 100644 --- a/cmd/sdkch/main.go +++ b/cmd/sdkch/main.go @@ -198,8 +198,8 @@ func generateChangelog(version string) { } func pruneEmptyDirectories() { - for sectionDir, _ := range sections { - for stanzaDir, _ := range stanzas { + for sectionDir := range sections { + for stanzaDir := range stanzas { mustPruneDirIfEmpty(filepath.Join(entriesDir, sectionDir, stanzaDir)) } mustPruneDirIfEmpty(filepath.Join(entriesDir, sectionDir)) diff --git a/codec/codec.go b/codec/codec.go index 175eb89c13..21e0b69778 100644 --- a/codec/codec.go +++ b/codec/codec.go @@ -5,7 +5,7 @@ import ( "encoding/json" amino "github.com/tendermint/go-amino" - "github.com/tendermint/tendermint/crypto/encoding/amino" + cryptoAmino "github.com/tendermint/tendermint/crypto/encoding/amino" ) // amino codec to marshal/unmarshal diff --git a/crypto/amino.go b/crypto/amino.go index 3a12c96815..327f8090d9 100644 --- a/crypto/amino.go +++ b/crypto/amino.go @@ -2,7 +2,7 @@ package crypto import ( "github.com/tendermint/go-amino" - "github.com/tendermint/tendermint/crypto/encoding/amino" + cryptoAmino "github.com/tendermint/tendermint/crypto/encoding/amino" ) var cdc = amino.NewCodec() diff --git a/crypto/keys/keybase_test.go b/crypto/keys/keybase_test.go index 09829e1dd8..e5613e302e 100644 --- a/crypto/keys/keybase_test.go +++ b/crypto/keys/keybase_test.go @@ -7,11 +7,12 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "github.com/tendermint/tendermint/crypto" + "github.com/tendermint/tendermint/crypto/ed25519" + "github.com/cosmos/cosmos-sdk/crypto/keys/hd" "github.com/cosmos/cosmos-sdk/crypto/keys/mintkey" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/tendermint/tendermint/crypto" - "github.com/tendermint/tendermint/crypto/ed25519" ) func init() { diff --git a/crypto/keys/mintkey/mintkey.go b/crypto/keys/mintkey/mintkey.go index 11743013a5..4806bcc4dd 100644 --- a/crypto/keys/mintkey/mintkey.go +++ b/crypto/keys/mintkey/mintkey.go @@ -8,7 +8,7 @@ import ( "github.com/tendermint/tendermint/crypto" "github.com/tendermint/tendermint/crypto/armor" - "github.com/tendermint/tendermint/crypto/encoding/amino" + cryptoAmino "github.com/tendermint/tendermint/crypto/encoding/amino" "github.com/tendermint/tendermint/crypto/xsalsa20symmetric" cmn "github.com/tendermint/tendermint/libs/common" diff --git a/crypto/keys/mintkey/mintkey_test.go b/crypto/keys/mintkey/mintkey_test.go index 86df52366c..b4ce4d6a0f 100644 --- a/crypto/keys/mintkey/mintkey_test.go +++ b/crypto/keys/mintkey/mintkey_test.go @@ -3,11 +3,12 @@ package mintkey_test import ( "testing" - "github.com/cosmos/cosmos-sdk/crypto/keys" - "github.com/cosmos/cosmos-sdk/crypto/keys/mintkey" "github.com/stretchr/testify/require" cryptoAmino "github.com/tendermint/tendermint/crypto/encoding/amino" "github.com/tendermint/tendermint/crypto/secp256k1" + + "github.com/cosmos/cosmos-sdk/crypto/keys" + "github.com/cosmos/cosmos-sdk/crypto/keys/mintkey" ) func TestArmorUnarmorPrivKey(t *testing.T) { diff --git a/crypto/ledger_mock.go b/crypto/ledger_mock.go index 75e6941da1..b9f1048cf5 100644 --- a/crypto/ledger_mock.go +++ b/crypto/ledger_mock.go @@ -6,12 +6,13 @@ import ( "fmt" "github.com/btcsuite/btcd/btcec" - "github.com/cosmos/cosmos-sdk/crypto/keys/hd" - "github.com/cosmos/cosmos-sdk/tests" bip39 "github.com/cosmos/go-bip39" "github.com/pkg/errors" secp256k1 "github.com/tendermint/btcd/btcec" "github.com/tendermint/tendermint/crypto" + + "github.com/cosmos/cosmos-sdk/crypto/keys/hd" + "github.com/cosmos/cosmos-sdk/tests" ) // If ledger support (build tag) has been enabled, which implies a CGO dependency, diff --git a/crypto/ledger_secp256k1.go b/crypto/ledger_secp256k1.go index fae0c1569b..84ddf46578 100644 --- a/crypto/ledger_secp256k1.go +++ b/crypto/ledger_secp256k1.go @@ -5,6 +5,7 @@ import ( "os" "github.com/btcsuite/btcd/btcec" + "github.com/cosmos/cosmos-sdk/crypto/keys/hd" "github.com/cosmos/cosmos-sdk/types" diff --git a/crypto/ledger_test.go b/crypto/ledger_test.go index ea2bc9681c..faa3fd6797 100644 --- a/crypto/ledger_test.go +++ b/crypto/ledger_test.go @@ -7,11 +7,12 @@ import ( "github.com/cosmos/cosmos-sdk/tests" tmcrypto "github.com/tendermint/tendermint/crypto" - "github.com/tendermint/tendermint/crypto/encoding/amino" + cryptoAmino "github.com/tendermint/tendermint/crypto/encoding/amino" + + "github.com/stretchr/testify/require" "github.com/cosmos/cosmos-sdk/crypto/keys/hd" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/stretchr/testify/require" ) func TestLedgerErrorHandling(t *testing.T) { diff --git a/go.sum b/go.sum index fea25091b8..0c92764b3d 100644 --- a/go.sum +++ b/go.sum @@ -24,6 +24,7 @@ github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVa github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= +github.com/client9/misspell v0.3.4 h1:ta993UF76GwbvJcIo3Y68y/M3WxlpEHPWIGDkJYwzJI= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= 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= diff --git a/server/constructors.go b/server/constructors.go index ac087d6577..939bba9548 100644 --- a/server/constructors.go +++ b/server/constructors.go @@ -6,11 +6,12 @@ import ( "os" "path/filepath" - sdk "github.com/cosmos/cosmos-sdk/types" abci "github.com/tendermint/tendermint/abci/types" dbm "github.com/tendermint/tendermint/libs/db" "github.com/tendermint/tendermint/libs/log" tmtypes "github.com/tendermint/tendermint/types" + + sdk "github.com/cosmos/cosmos-sdk/types" ) type ( diff --git a/types/address.go b/types/address.go index 05a18ecab7..d62f947af1 100644 --- a/types/address.go +++ b/types/address.go @@ -9,7 +9,7 @@ import ( "strings" "github.com/tendermint/tendermint/crypto" - "github.com/tendermint/tendermint/crypto/encoding/amino" + cryptoAmino "github.com/tendermint/tendermint/crypto/encoding/amino" "github.com/tendermint/tendermint/libs/bech32" ) diff --git a/types/address_test.go b/types/address_test.go index 129f002a1b..754d3e754c 100644 --- a/types/address_test.go +++ b/types/address_test.go @@ -7,9 +7,10 @@ import ( "strings" - "github.com/cosmos/cosmos-sdk/types" "github.com/stretchr/testify/require" "github.com/tendermint/tendermint/crypto/ed25519" + + "github.com/cosmos/cosmos-sdk/types" ) var invalidStrs = []string{ diff --git a/types/rest/rest.go b/types/rest/rest.go index 20fcef3fc7..71549584da 100644 --- a/types/rest/rest.go +++ b/types/rest/rest.go @@ -5,13 +5,14 @@ package rest import ( "errors" "fmt" - "github.com/tendermint/tendermint/types" "io/ioutil" "net/http" "net/url" "strconv" "strings" + "github.com/tendermint/tendermint/types" + "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" ) diff --git a/x/crisis/handler_test.go b/x/crisis/handler_test.go index 1f0aa6d147..84c3d5c455 100644 --- a/x/crisis/handler_test.go +++ b/x/crisis/handler_test.go @@ -5,10 +5,11 @@ import ( "fmt" "testing" + "github.com/stretchr/testify/require" + sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/auth" distr "github.com/cosmos/cosmos-sdk/x/distribution" - "github.com/stretchr/testify/require" ) var ( diff --git a/x/mint/client/cli/query.go b/x/mint/client/cli/query.go index 4980240730..65bde6adeb 100644 --- a/x/mint/client/cli/query.go +++ b/x/mint/client/cli/query.go @@ -3,11 +3,12 @@ package cli import ( "fmt" + "github.com/spf13/cobra" + "github.com/cosmos/cosmos-sdk/client/context" "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/mint" - "github.com/spf13/cobra" ) // GetCmdQueryParams implements a command to return the current minting diff --git a/x/mint/client/module_client.go b/x/mint/client/module_client.go index 96f6c00fdf..0b023f7925 100644 --- a/x/mint/client/module_client.go +++ b/x/mint/client/module_client.go @@ -1,11 +1,12 @@ package clientpackage import ( + "github.com/spf13/cobra" + "github.com/tendermint/go-amino" + "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/x/mint" "github.com/cosmos/cosmos-sdk/x/mint/client/cli" - "github.com/spf13/cobra" - "github.com/tendermint/go-amino" ) // ModuleClient exports all CLI client functionality from the minting module. diff --git a/x/mint/client/rest/query.go b/x/mint/client/rest/query.go index 9bc436a6d5..2d3cd4a0fe 100644 --- a/x/mint/client/rest/query.go +++ b/x/mint/client/rest/query.go @@ -4,11 +4,12 @@ import ( "fmt" "net/http" + "github.com/gorilla/mux" + "github.com/cosmos/cosmos-sdk/client/context" "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/types/rest" "github.com/cosmos/cosmos-sdk/x/mint" - "github.com/gorilla/mux" ) func registerQueryRoutes(cliCtx context.CLIContext, r *mux.Router, cdc *codec.Codec) { diff --git a/x/mint/client/rest/rest.go b/x/mint/client/rest/rest.go index cedfa72c74..82a1afdd18 100644 --- a/x/mint/client/rest/rest.go +++ b/x/mint/client/rest/rest.go @@ -1,9 +1,10 @@ package rest import ( + "github.com/gorilla/mux" + "github.com/cosmos/cosmos-sdk/client/context" "github.com/cosmos/cosmos-sdk/codec" - "github.com/gorilla/mux" ) // RegisterRoutes registers minting module REST handlers on the provided router. diff --git a/x/mint/querier.go b/x/mint/querier.go index c6ab9ef4d5..e70142cac8 100644 --- a/x/mint/querier.go +++ b/x/mint/querier.go @@ -3,9 +3,10 @@ package mint import ( "fmt" + abci "github.com/tendermint/tendermint/abci/types" + "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" - abci "github.com/tendermint/tendermint/abci/types" ) // Query endpoints supported by the minting querier diff --git a/x/mint/querier_test.go b/x/mint/querier_test.go index 9bc963e5f4..f0478c61bf 100644 --- a/x/mint/querier_test.go +++ b/x/mint/querier_test.go @@ -3,9 +3,10 @@ package mint import ( "testing" - sdk "github.com/cosmos/cosmos-sdk/types" "github.com/stretchr/testify/require" + sdk "github.com/cosmos/cosmos-sdk/types" + abci "github.com/tendermint/tendermint/abci/types" ) diff --git a/x/mint/test_common.go b/x/mint/test_common.go index 7f83a0862e..768391755d 100644 --- a/x/mint/test_common.go +++ b/x/mint/test_common.go @@ -10,6 +10,8 @@ import ( "github.com/stretchr/testify/require" + dbm "github.com/tendermint/tendermint/libs/db" + "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/store" sdk "github.com/cosmos/cosmos-sdk/types" @@ -17,7 +19,6 @@ import ( "github.com/cosmos/cosmos-sdk/x/bank" "github.com/cosmos/cosmos-sdk/x/params" "github.com/cosmos/cosmos-sdk/x/staking" - dbm "github.com/tendermint/tendermint/libs/db" ) type testInput struct { diff --git a/x/simulation/util.go b/x/simulation/util.go index 14df0f6c64..3dc75c4390 100644 --- a/x/simulation/util.go +++ b/x/simulation/util.go @@ -5,9 +5,10 @@ import ( "math/rand" "testing" + abci "github.com/tendermint/tendermint/abci/types" + "github.com/cosmos/cosmos-sdk/baseapp" sdk "github.com/cosmos/cosmos-sdk/types" - abci "github.com/tendermint/tendermint/abci/types" ) // assertAll asserts the all invariants against application state diff --git a/x/slashing/client/rest/query.go b/x/slashing/client/rest/query.go index 3c4afdd00e..1785770d99 100644 --- a/x/slashing/client/rest/query.go +++ b/x/slashing/client/rest/query.go @@ -2,14 +2,16 @@ package rest import ( "fmt" + "net/http" + + "github.com/gorilla/mux" + "github.com/cosmos/cosmos-sdk/client/context" "github.com/cosmos/cosmos-sdk/client/rpc" "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/rest" "github.com/cosmos/cosmos-sdk/x/slashing" - "github.com/gorilla/mux" - "net/http" ) func registerQueryRoutes(cliCtx context.CLIContext, r *mux.Router, cdc *codec.Codec) { diff --git a/x/slashing/client/rest/query_test.go b/x/slashing/client/rest/query_test.go index ad177c23b5..62afaef0de 100644 --- a/x/slashing/client/rest/query_test.go +++ b/x/slashing/client/rest/query_test.go @@ -1,8 +1,9 @@ package rest import ( - "github.com/stretchr/testify/require" "testing" + + "github.com/stretchr/testify/require" ) func TestAdjustPagination(t *testing.T) { From 055d2193017953cdf2a015f1f81045b8781de0e4 Mon Sep 17 00:00:00 2001 From: Frank Yang Date: Thu, 4 Apr 2019 22:38:02 +0800 Subject: [PATCH 03/47] Add `GO111MODULE=on` to environment. (#4042) --- .pending/improvements/gaia/4042-Add-description | 1 + docs/gaia/installation.md | 1 + docs/translations/cn/gaia/installation.md | 1 + docs/translations/kr/gaia/installation.md | 1 + scripts/install/install_sdk_arm.sh | 2 +- scripts/install/install_sdk_ubuntu.sh | 2 +- 6 files changed, 6 insertions(+), 2 deletions(-) create mode 100644 .pending/improvements/gaia/4042-Add-description diff --git a/.pending/improvements/gaia/4042-Add-description b/.pending/improvements/gaia/4042-Add-description new file mode 100644 index 0000000000..03ed9cc618 --- /dev/null +++ b/.pending/improvements/gaia/4042-Add-description @@ -0,0 +1 @@ +#4042 Update docs and scripts to include the correct `GO111MODULE=on` environment variable. diff --git a/docs/gaia/installation.md b/docs/gaia/installation.md index 20e5ffa44a..a3ce834ac0 100644 --- a/docs/gaia/installation.md +++ b/docs/gaia/installation.md @@ -11,6 +11,7 @@ mkdir -p $HOME/go/bin echo "export GOPATH=$HOME/go" >> ~/.bash_profile echo "export GOBIN=\$GOPATH/bin" >> ~/.bash_profile echo "export PATH=\$PATH:\$GOBIN" >> ~/.bash_profile +echo "export GO111MODULE=on" >> ~/.bash_profile source ~/.bash_profile ``` diff --git a/docs/translations/cn/gaia/installation.md b/docs/translations/cn/gaia/installation.md index 932ae6a52e..4c92fa2beb 100644 --- a/docs/translations/cn/gaia/installation.md +++ b/docs/translations/cn/gaia/installation.md @@ -11,6 +11,7 @@ mkdir -p $HOME/go/bin echo "export GOPATH=$HOME/go" >> ~/.bash_profile echo "export GOBIN=\$GOPATH/bin" >> ~/.bash_profile echo "export PATH=\$PATH:\$GOBIN" >> ~/.bash_profile +echo "export GO111MODULE=on" >> ~/.bash_profile source ~/.bash_profile ``` diff --git a/docs/translations/kr/gaia/installation.md b/docs/translations/kr/gaia/installation.md index 5cfba9dea8..da390e18b5 100755 --- a/docs/translations/kr/gaia/installation.md +++ b/docs/translations/kr/gaia/installation.md @@ -11,6 +11,7 @@ mkdir -p $HOME/go/bin echo "export GOPATH=$HOME/go" >> ~/.bash_profile echo "export GOBIN=\$GOPATH/bin" >> ~/.bash_profile echo "export PATH=\$PATH:\$GOBIN" >> ~/.bash_profile +echo "export GO111MODULE=on" >> ~/.bash_profile source ~/.bash_profile ``` diff --git a/scripts/install/install_sdk_arm.sh b/scripts/install/install_sdk_arm.sh index ef9e56ece0..ca00860918 100644 --- a/scripts/install/install_sdk_arm.sh +++ b/scripts/install/install_sdk_arm.sh @@ -22,7 +22,7 @@ echo "export PATH=\$PATH:/usr/local/go/bin" >> ~/.profile mkdir go echo "export GOPATH=$HOME/go" >> ~/.profile echo "export PATH=\$PATH:\$GOPATH/bin" >> ~/.profile - +echo "export GO111MODULE=on" >> ~/.profile source ~/.profile # get the code and move into repo diff --git a/scripts/install/install_sdk_ubuntu.sh b/scripts/install/install_sdk_ubuntu.sh index 079eed8312..dfd1e921a4 100644 --- a/scripts/install/install_sdk_ubuntu.sh +++ b/scripts/install/install_sdk_ubuntu.sh @@ -25,7 +25,7 @@ echo "export PATH=\$PATH:/usr/local/go/bin" >> ~/.profile mkdir go echo "export GOPATH=$HOME/go" >> ~/.profile echo "export PATH=\$PATH:\$GOPATH/bin" >> ~/.profile - +echo "export GO111MODULE=on" >> ~/.profile source ~/.profile # get the code and move into repo From cec3065a365f03b86bc629ccb6b275ff5846fdeb Mon Sep 17 00:00:00 2001 From: frog power 4000 Date: Fri, 5 Apr 2019 16:20:58 -0400 Subject: [PATCH 04/47] Revert "Return errors instead of panic (#3782)" (#4054) This reverts commit 985aae5575762eb1380611c4c0e9ed206f2b6492. --- .pending/breaking/sdk/3782-Return-errors-i | 1 - baseapp/baseapp.go | 12 +--- cmd/gaia/app/app.go | 33 ++++------- cmd/gaia/app/export.go | 6 +- cmd/gaia/cmd/gaiadebug/hack.go | 18 +++--- types/abci.go | 4 +- x/bank/keeper.go | 7 +-- x/crisis/params.go | 12 +--- x/distribution/abci_app.go | 4 +- x/gov/endblocker.go | 4 +- x/gov/keeper.go | 42 ++------------ x/gov/test_common.go | 6 +- x/mint/abci_app.go | 13 +---- x/mint/genesis.go | 24 +++----- x/mint/keeper.go | 17 +++--- x/mint/querier.go | 15 +---- x/mint/querier_test.go | 12 +--- x/mint/test_common.go | 3 +- x/params/keeper_test.go | 28 ++++----- x/params/subspace/subspace.go | 67 ++++++++++------------ x/slashing/app_test.go | 6 +- x/slashing/keeper_test.go | 6 +- x/slashing/params.go | 42 ++------------ x/slashing/tick.go | 6 +- x/slashing/tick_test.go | 9 +-- x/staking/app_test.go | 6 +- x/staking/handler.go | 4 +- x/staking/keeper/params.go | 24 ++------ 28 files changed, 135 insertions(+), 296 deletions(-) delete mode 100644 .pending/breaking/sdk/3782-Return-errors-i diff --git a/.pending/breaking/sdk/3782-Return-errors-i b/.pending/breaking/sdk/3782-Return-errors-i deleted file mode 100644 index 6c717963ce..0000000000 --- a/.pending/breaking/sdk/3782-Return-errors-i +++ /dev/null @@ -1 +0,0 @@ -#3782 Return errors instead of panic diff --git a/baseapp/baseapp.go b/baseapp/baseapp.go index 2b8dfd3e94..b244a98b77 100644 --- a/baseapp/baseapp.go +++ b/baseapp/baseapp.go @@ -538,7 +538,6 @@ func (app *BaseApp) validateHeight(req abci.RequestBeginBlock) error { // BeginBlock implements the ABCI application interface. func (app *BaseApp) BeginBlock(req abci.RequestBeginBlock) (res abci.ResponseBeginBlock) { - var err error if app.cms.TracingEnabled() { app.cms.SetTracingContext(sdk.TraceContext( map[string]interface{}{"blockHeight": req.Header.Height}, @@ -573,10 +572,7 @@ func (app *BaseApp) BeginBlock(req abci.RequestBeginBlock) (res abci.ResponseBeg app.deliverState.ctx = app.deliverState.ctx.WithBlockGasMeter(gasMeter) if app.beginBlocker != nil { - res, err = app.beginBlocker(app.deliverState.ctx, req) - if err != nil { - panic(err) - } + res = app.beginBlocker(app.deliverState.ctx, req) } // set the signed validators for addition to context in deliverTx @@ -878,16 +874,12 @@ func (app *BaseApp) runTx(mode runTxMode, txBytes []byte, tx sdk.Tx) (result sdk // EndBlock implements the ABCI interface. func (app *BaseApp) EndBlock(req abci.RequestEndBlock) (res abci.ResponseEndBlock) { - var err error if app.deliverState.ms.TracingEnabled() { app.deliverState.ms = app.deliverState.ms.SetTracingContext(nil).(sdk.CacheMultiStore) } if app.endBlocker != nil { - res, err = app.endBlocker(app.deliverState.ctx, req) - if err != nil { - panic(err) - } + res = app.endBlocker(app.deliverState.ctx, req) } return diff --git a/cmd/gaia/app/app.go b/cmd/gaia/app/app.go index 24d24ee87b..a856094728 100644 --- a/cmd/gaia/app/app.go +++ b/cmd/gaia/app/app.go @@ -216,39 +216,30 @@ func MakeCodec() *codec.Codec { } // application updates every end block -func (app *GaiaApp) BeginBlocker(ctx sdk.Context, req abci.RequestBeginBlock) (resp abci.ResponseBeginBlock, err error) { +func (app *GaiaApp) BeginBlocker(ctx sdk.Context, req abci.RequestBeginBlock) abci.ResponseBeginBlock { // mint new tokens for the previous block - err = mint.BeginBlocker(ctx, app.mintKeeper) - if err != nil { - return resp, err - } + mint.BeginBlocker(ctx, app.mintKeeper) // distribute rewards for the previous block - err = distr.BeginBlocker(ctx, req, app.distrKeeper) - if err != nil { - return resp, err - } + 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. - resp.Tags, err = slashing.BeginBlocker(ctx, req, app.slashingKeeper) - return resp, err + tags := slashing.BeginBlocker(ctx, req, app.slashingKeeper) + + return abci.ResponseBeginBlock{ + Tags: tags.ToKVPairs(), + } } // application updates every end block // nolint: unparam -func (app *GaiaApp) EndBlocker(ctx sdk.Context, req abci.RequestEndBlock) (abci.ResponseEndBlock, error) { - tags, err := gov.EndBlocker(ctx, app.govKeeper) - if err != nil { - return abci.ResponseEndBlock{}, err - } - validatorUpdates, endBlockerTags, err := staking.EndBlocker(ctx, app.stakingKeeper) - if err != nil { - return abci.ResponseEndBlock{}, err - } +func (app *GaiaApp) EndBlocker(ctx sdk.Context, req abci.RequestEndBlock) abci.ResponseEndBlock { + tags := gov.EndBlocker(ctx, app.govKeeper) + validatorUpdates, endBlockerTags := staking.EndBlocker(ctx, app.stakingKeeper) tags = append(tags, endBlockerTags...) if app.assertInvariantsBlockly { @@ -258,7 +249,7 @@ func (app *GaiaApp) EndBlocker(ctx sdk.Context, req abci.RequestEndBlock) (abci. return abci.ResponseEndBlock{ ValidatorUpdates: validatorUpdates, Tags: tags, - }, nil + } } // initialize store from a genesis state diff --git a/cmd/gaia/app/export.go b/cmd/gaia/app/export.go index 217d9a1b3d..5174c1498a 100644 --- a/cmd/gaia/app/export.go +++ b/cmd/gaia/app/export.go @@ -39,16 +39,12 @@ func (app *GaiaApp) ExportAppStateAndValidators(forZeroHeight bool, jailWhiteLis } app.accountKeeper.IterateAccounts(ctx, appendAccount) - mintGenesisState, err := mint.ExportGenesis(ctx, app.mintKeeper) - if err != nil { - return nil, nil, err - } genState := NewGenesisState( accounts, auth.ExportGenesis(ctx, app.accountKeeper, app.feeCollectionKeeper), bank.ExportGenesis(ctx, app.bankKeeper), staking.ExportGenesis(ctx, app.stakingKeeper), - mintGenesisState, + mint.ExportGenesis(ctx, app.mintKeeper), distr.ExportGenesis(ctx, app.distrKeeper), gov.ExportGenesis(ctx, app.govKeeper), crisis.ExportGenesis(ctx, app.crisisKeeper), diff --git a/cmd/gaia/cmd/gaiadebug/hack.go b/cmd/gaia/cmd/gaiadebug/hack.go index 74346a2d92..51927592a4 100644 --- a/cmd/gaia/cmd/gaiadebug/hack.go +++ b/cmd/gaia/cmd/gaiadebug/hack.go @@ -218,23 +218,23 @@ func MakeCodec() *codec.Codec { } // application updates every end block -func (app *GaiaApp) BeginBlocker(ctx sdk.Context, req abci.RequestBeginBlock) (resp abci.ResponseBeginBlock, err error) { - resp.Tags, err = slashing.BeginBlocker(ctx, req, app.slashingKeeper) - return resp, err +func (app *GaiaApp) BeginBlocker(ctx sdk.Context, req abci.RequestBeginBlock) abci.ResponseBeginBlock { + tags := slashing.BeginBlocker(ctx, req, app.slashingKeeper) + + return abci.ResponseBeginBlock{ + Tags: tags.ToKVPairs(), + } } // application updates every end block // nolint: unparam -func (app *GaiaApp) EndBlocker(ctx sdk.Context, req abci.RequestEndBlock) (abci.ResponseEndBlock, error) { - validatorUpdates, tags, err := staking.EndBlocker(ctx, app.stakingKeeper) - if err != nil { - return abci.ResponseEndBlock{}, err - } +func (app *GaiaApp) EndBlocker(ctx sdk.Context, req abci.RequestEndBlock) abci.ResponseEndBlock { + validatorUpdates, tags := staking.EndBlocker(ctx, app.stakingKeeper) return abci.ResponseEndBlock{ ValidatorUpdates: validatorUpdates, Tags: tags, - }, nil + } } // custom logic for gaia initialization diff --git a/types/abci.go b/types/abci.go index bbf2e7225d..0646d21e32 100644 --- a/types/abci.go +++ b/types/abci.go @@ -6,10 +6,10 @@ import abci "github.com/tendermint/tendermint/abci/types" type InitChainer func(ctx Context, req abci.RequestInitChain) abci.ResponseInitChain // run code before the transactions in a block -type BeginBlocker func(ctx Context, req abci.RequestBeginBlock) (abci.ResponseBeginBlock, error) +type BeginBlocker func(ctx Context, req abci.RequestBeginBlock) abci.ResponseBeginBlock // run code after the transactions in a block and return updates to the validator set -type EndBlocker func(ctx Context, req abci.RequestEndBlock) (abci.ResponseEndBlock, error) +type EndBlocker func(ctx Context, req abci.RequestEndBlock) abci.ResponseEndBlock // respond to p2p filtering queries from Tendermint type PeerFilter func(info string) abci.ResponseQuery diff --git a/x/bank/keeper.go b/x/bank/keeper.go index cd8bc2c358..c5322ec5c7 100644 --- a/x/bank/keeper.go +++ b/x/bank/keeper.go @@ -168,12 +168,7 @@ func (keeper BaseSendKeeper) GetSendEnabled(ctx sdk.Context) bool { // SetSendEnabled sets the send enabled func (keeper BaseSendKeeper) SetSendEnabled(ctx sdk.Context, enabled bool) { - err := keeper.paramSpace.Set(ctx, ParamStoreKeySendEnabled, &enabled) - if err != nil { - // TODO: return error - needs rewrite interfaces - // and handle error on the caller side - // check PR #3782 - } + keeper.paramSpace.Set(ctx, ParamStoreKeySendEnabled, &enabled) } var _ ViewKeeper = (*BaseViewKeeper)(nil) diff --git a/x/crisis/params.go b/x/crisis/params.go index 91d68d1bf3..14c8a25673 100644 --- a/x/crisis/params.go +++ b/x/crisis/params.go @@ -24,19 +24,11 @@ func ParamKeyTable() params.KeyTable { // GetConstantFee get's the constant fee from the paramSpace func (k Keeper) GetConstantFee(ctx sdk.Context) (constantFee sdk.Coin) { - if err := k.paramSpace.Get(ctx, ParamStoreKeyConstantFee, &constantFee); err != nil { - // TODO: return error - needs rewrite interfaces - // and handle error on the caller side - // check PR #3782 - } + k.paramSpace.Get(ctx, ParamStoreKeyConstantFee, &constantFee) return } // GetConstantFee set's the constant fee in the paramSpace func (k Keeper) SetConstantFee(ctx sdk.Context, constantFee sdk.Coin) { - if err := k.paramSpace.Set(ctx, ParamStoreKeyConstantFee, constantFee); err != nil { - // TODO: return error - needs rewrite interfaces - // and handle error on the caller side - // check PR #3782 - } + k.paramSpace.Set(ctx, ParamStoreKeyConstantFee, constantFee) } diff --git a/x/distribution/abci_app.go b/x/distribution/abci_app.go index 46e2652749..0a2ef5627a 100644 --- a/x/distribution/abci_app.go +++ b/x/distribution/abci_app.go @@ -8,7 +8,7 @@ import ( ) // set the proposer for determining distribution during endblock -func BeginBlocker(ctx sdk.Context, req abci.RequestBeginBlock, k keeper.Keeper) error { +func BeginBlocker(ctx sdk.Context, req abci.RequestBeginBlock, k keeper.Keeper) { // determine the total power signing the block var previousTotalPower, sumPreviousPrecommitPower int64 @@ -29,5 +29,5 @@ func BeginBlocker(ctx sdk.Context, req abci.RequestBeginBlock, k keeper.Keeper) // record the proposer for when we payout on the next block consAddr := sdk.ConsAddress(req.Header.ProposerAddress) k.SetPreviousProposerConsAddr(ctx, consAddr) - return nil + } diff --git a/x/gov/endblocker.go b/x/gov/endblocker.go index ed08ae6c32..3da7f3a1da 100644 --- a/x/gov/endblocker.go +++ b/x/gov/endblocker.go @@ -8,7 +8,7 @@ import ( ) // Called every block, process inflation, update validator set -func EndBlocker(ctx sdk.Context, keeper Keeper) (sdk.Tags, error) { +func EndBlocker(ctx sdk.Context, keeper Keeper) sdk.Tags { logger := ctx.Logger().With("module", "x/gov") resTags := sdk.NewTags() @@ -78,5 +78,5 @@ func EndBlocker(ctx sdk.Context, keeper Keeper) (sdk.Tags, error) { resTags = resTags.AppendTag(tags.ProposalResult, tagValue) } - return resTags, nil + return resTags } diff --git a/x/gov/keeper.go b/x/gov/keeper.go index 297915303a..46085cf2d9 100644 --- a/x/gov/keeper.go +++ b/x/gov/keeper.go @@ -261,64 +261,34 @@ func (keeper Keeper) activateVotingPeriod(ctx sdk.Context, proposal Proposal) { // Returns the current DepositParams from the global param store func (keeper Keeper) GetDepositParams(ctx sdk.Context) DepositParams { var depositParams DepositParams - err := keeper.paramSpace.Get(ctx, ParamStoreKeyDepositParams, &depositParams) - if err != nil { - // TODO: return error - needs rewrite interfaces - // and handle error on the caller side - // check PR #3782 - } + keeper.paramSpace.Get(ctx, ParamStoreKeyDepositParams, &depositParams) return depositParams } // Returns the current VotingParams from the global param store func (keeper Keeper) GetVotingParams(ctx sdk.Context) VotingParams { var votingParams VotingParams - err := keeper.paramSpace.Get(ctx, ParamStoreKeyVotingParams, &votingParams) - if err != nil { - // TODO: return error - needs rewrite interfaces - // and handle error on the caller side - // check PR #3782 - } + keeper.paramSpace.Get(ctx, ParamStoreKeyVotingParams, &votingParams) return votingParams } // Returns the current TallyParam from the global param store func (keeper Keeper) GetTallyParams(ctx sdk.Context) TallyParams { var tallyParams TallyParams - err := keeper.paramSpace.Get(ctx, ParamStoreKeyTallyParams, &tallyParams) - if err != nil { - // TODO: return error - needs rewrite interfaces - // and handle error on the caller side - // check PR #3782 - } + keeper.paramSpace.Get(ctx, ParamStoreKeyTallyParams, &tallyParams) return tallyParams } func (keeper Keeper) setDepositParams(ctx sdk.Context, depositParams DepositParams) { - err := keeper.paramSpace.Set(ctx, ParamStoreKeyDepositParams, &depositParams) - if err != nil { - // TODO: return error - needs rewrite interfaces - // and handle error on the caller side - // check PR #3782 - } + keeper.paramSpace.Set(ctx, ParamStoreKeyDepositParams, &depositParams) } func (keeper Keeper) setVotingParams(ctx sdk.Context, votingParams VotingParams) { - err := keeper.paramSpace.Set(ctx, ParamStoreKeyVotingParams, &votingParams) - if err != nil { - // TODO: return error - needs rewrite interfaces - // and handle error on the caller side - // check PR #3782 - } + keeper.paramSpace.Set(ctx, ParamStoreKeyVotingParams, &votingParams) } func (keeper Keeper) setTallyParams(ctx sdk.Context, tallyParams TallyParams) { - err := keeper.paramSpace.Set(ctx, ParamStoreKeyTallyParams, &tallyParams) - if err != nil { - // TODO: return error - needs rewrite interfaces - // and handle error on the caller side - // check PR #3782 - } + keeper.paramSpace.Set(ctx, ParamStoreKeyTallyParams, &tallyParams) } // Votes diff --git a/x/gov/test_common.go b/x/gov/test_common.go index 1703dfcf52..a14251841d 100644 --- a/x/gov/test_common.go +++ b/x/gov/test_common.go @@ -58,11 +58,11 @@ func getMockApp(t *testing.T, numGenAccs int, genState GenesisState, genAccs []a // gov and staking endblocker func getEndBlocker(keeper Keeper) sdk.EndBlocker { - return func(ctx sdk.Context, req abci.RequestEndBlock) (abci.ResponseEndBlock, error) { - tags, err := EndBlocker(ctx, keeper) + return func(ctx sdk.Context, req abci.RequestEndBlock) abci.ResponseEndBlock { + tags := EndBlocker(ctx, keeper) return abci.ResponseEndBlock{ Tags: tags, - }, err + } } } diff --git a/x/mint/abci_app.go b/x/mint/abci_app.go index ea998185a4..5016a464d1 100644 --- a/x/mint/abci_app.go +++ b/x/mint/abci_app.go @@ -5,17 +5,11 @@ import ( ) // Inflate every block, update inflation parameters once per hour -func BeginBlocker(ctx sdk.Context, k Keeper) error { +func BeginBlocker(ctx sdk.Context, k Keeper) { // fetch stored minter & params - minter, err := k.GetMinter(ctx) - if err != nil { - return err - } - params, err := k.GetParams(ctx) - if err != nil { - return err - } + minter := k.GetMinter(ctx) + params := k.GetParams(ctx) // recalculate inflation rate totalSupply := k.sk.TotalTokens(ctx) @@ -28,6 +22,5 @@ func BeginBlocker(ctx sdk.Context, k Keeper) error { mintedCoin := minter.BlockProvision(params) k.fck.AddCollectedFees(ctx, sdk.Coins{mintedCoin}) k.sk.InflateSupply(ctx, mintedCoin.Amount) - return nil } diff --git a/x/mint/genesis.go b/x/mint/genesis.go index 0408eb2dfb..11f96c6f90 100644 --- a/x/mint/genesis.go +++ b/x/mint/genesis.go @@ -29,25 +29,15 @@ func DefaultGenesisState() GenesisState { // new mint genesis func InitGenesis(ctx sdk.Context, keeper Keeper, data GenesisState) { keeper.SetMinter(ctx, data.Minter) - if err := keeper.SetParams(ctx, data.Params); err != nil { - // TODO: return error - needs rewrite interfaces - // and handle error on the caller side - // check PR #3782 - } + keeper.SetParams(ctx, data.Params) } -// ExportGenesis returns a GenesisState for a given context and keeper. The -// GenesisState will contain the pool, and validator/delegator distribution info's -func ExportGenesis(ctx sdk.Context, keeper Keeper) (GenesisState, error) { - minter, err := keeper.GetMinter(ctx) - if err != nil { - return GenesisState{}, err - } - params, err := keeper.GetParams(ctx) - if err != nil { - return GenesisState{}, err - } - return NewGenesisState(minter, params), nil +// ExportGenesis returns a GenesisState for a given context and keeper. +func ExportGenesis(ctx sdk.Context, keeper Keeper) GenesisState { + + minter := keeper.GetMinter(ctx) + params := keeper.GetParams(ctx) + return NewGenesisState(minter, params) } // ValidateGenesis validates the provided genesis state to ensure the diff --git a/x/mint/keeper.go b/x/mint/keeper.go index 4b48b02edf..42a9f19fba 100644 --- a/x/mint/keeper.go +++ b/x/mint/keeper.go @@ -1,8 +1,6 @@ package mint import ( - "errors" - "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/params" @@ -64,12 +62,11 @@ func ParamKeyTable() params.KeyTable { //______________________________________________________________________ // get the minter -func (k Keeper) GetMinter(ctx sdk.Context) (minter Minter, err error) { +func (k Keeper) GetMinter(ctx sdk.Context) (minter Minter) { store := ctx.KVStore(k.storeKey) b := store.Get(minterKey) if b == nil { - err = errors.New("Stored fee pool should not have been nil") - return + panic("Stored fee pool should not have been nil") } k.cdc.MustUnmarshalBinaryLengthPrefixed(b, &minter) return @@ -85,13 +82,13 @@ func (k Keeper) SetMinter(ctx sdk.Context, minter Minter) { //______________________________________________________________________ // get inflation params from the global param store -func (k Keeper) GetParams(ctx sdk.Context) (Params, error) { +func (k Keeper) GetParams(ctx sdk.Context) Params { var params Params - err := k.paramSpace.Get(ctx, ParamStoreKeyParams, ¶ms) - return params, err + k.paramSpace.Get(ctx, ParamStoreKeyParams, ¶ms) + return params } // set inflation params from the global param store -func (k Keeper) SetParams(ctx sdk.Context, params Params) error { - return k.paramSpace.Set(ctx, ParamStoreKeyParams, ¶ms) +func (k Keeper) SetParams(ctx sdk.Context, params Params) { + k.paramSpace.Set(ctx, ParamStoreKeyParams, ¶ms) } diff --git a/x/mint/querier.go b/x/mint/querier.go index e70142cac8..4de3fdeeb5 100644 --- a/x/mint/querier.go +++ b/x/mint/querier.go @@ -36,10 +36,7 @@ func NewQuerier(k Keeper) sdk.Querier { } func queryParams(ctx sdk.Context, k Keeper) ([]byte, sdk.Error) { - params, err := k.GetParams(ctx) - if err != nil { - return nil, sdk.ErrInternal(sdk.AppendMsgToErr("failed to get params", err.Error())) - } + params := k.GetParams(ctx) res, err := codec.MarshalJSONIndent(k.cdc, params) if err != nil { @@ -50,10 +47,7 @@ func queryParams(ctx sdk.Context, k Keeper) ([]byte, sdk.Error) { } func queryInflation(ctx sdk.Context, k Keeper) ([]byte, sdk.Error) { - minter, err := k.GetMinter(ctx) - if err != nil { - return nil, sdk.ErrInternal(sdk.AppendMsgToErr("failed to get params", err.Error())) - } + minter := k.GetMinter(ctx) res, err := codec.MarshalJSONIndent(k.cdc, minter.Inflation) if err != nil { @@ -64,10 +58,7 @@ func queryInflation(ctx sdk.Context, k Keeper) ([]byte, sdk.Error) { } func queryAnnualProvisions(ctx sdk.Context, k Keeper) ([]byte, sdk.Error) { - minter, err := k.GetMinter(ctx) - if err != nil { - return nil, sdk.ErrInternal(sdk.AppendMsgToErr("failed to get params", err.Error())) - } + minter := k.GetMinter(ctx) res, err := codec.MarshalJSONIndent(k.cdc, minter.AnnualProvisions) if err != nil { diff --git a/x/mint/querier_test.go b/x/mint/querier_test.go index f0478c61bf..7a73853d0a 100644 --- a/x/mint/querier_test.go +++ b/x/mint/querier_test.go @@ -43,9 +43,7 @@ func TestQueryParams(t *testing.T) { err := input.cdc.UnmarshalJSON(res, ¶ms) require.NoError(t, err) - parm, err := input.mintKeeper.GetParams(input.ctx) - require.NoError(t, err) - require.Equal(t, parm, params) + require.Equal(t, input.mintKeeper.GetParams(input.ctx), params) } func TestQueryInflation(t *testing.T) { @@ -59,9 +57,7 @@ func TestQueryInflation(t *testing.T) { err := input.cdc.UnmarshalJSON(res, &inflation) require.NoError(t, err) - parm, err := input.mintKeeper.GetMinter(input.ctx) - require.NoError(t, err) - require.Equal(t, parm.Inflation, inflation) + require.Equal(t, input.mintKeeper.GetMinter(input.ctx).Inflation, inflation) } func TestQueryAnnualProvisions(t *testing.T) { @@ -75,7 +71,5 @@ func TestQueryAnnualProvisions(t *testing.T) { err := input.cdc.UnmarshalJSON(res, &annualProvisions) require.NoError(t, err) - parm, err := input.mintKeeper.GetMinter(input.ctx) - require.NoError(t, err) - require.Equal(t, parm.AnnualProvisions, annualProvisions) + require.Equal(t, input.mintKeeper.GetMinter(input.ctx).AnnualProvisions, annualProvisions) } diff --git a/x/mint/test_common.go b/x/mint/test_common.go index 768391755d..f2bec95157 100644 --- a/x/mint/test_common.go +++ b/x/mint/test_common.go @@ -69,8 +69,7 @@ func newTestInput(t *testing.T) testInput { ctx := sdk.NewContext(ms, abci.Header{Time: time.Unix(0, 0)}, false, log.NewTMLogger(os.Stdout)) - err = mintKeeper.SetParams(ctx, DefaultParams()) - require.Nil(t, err) + mintKeeper.SetParams(ctx, DefaultParams()) mintKeeper.SetMinter(ctx, DefaultInitialMinter()) return testInput{ctx, cdc, mintKeeper} diff --git a/x/params/keeper_test.go b/x/params/keeper_test.go index f96081e5fc..4d20e56ad9 100644 --- a/x/params/keeper_test.go +++ b/x/params/keeper_test.go @@ -108,12 +108,12 @@ func TestKeeper(t *testing.T) { // Test invalid space.Get for i, kv := range kvs { var param bool - require.Error(t, space.Get(ctx, []byte(kv.key), ¶m), "invalid space.Get not error, tc #%d", i) + require.Panics(t, func() { space.Get(ctx, []byte(kv.key), ¶m) }, "invalid space.Get not panics, tc #%d", i) } // Test invalid space.Set for i, kv := range kvs { - require.Error(t, space.Set(ctx, []byte(kv.key), true), "invalid space.Set not error, tc #%d", i) + require.Panics(t, func() { space.Set(ctx, []byte(kv.key), true) }, "invalid space.Set not panics, tc #%d", i) } // Test GetSubspace @@ -122,12 +122,12 @@ func TestKeeper(t *testing.T) { gspace, ok := keeper.GetSubspace("test") require.True(t, ok, "cannot retrieve subspace, tc #%d", i) - require.NoError(t, gspace.Get(ctx, []byte(kv.key), &gparam)) - require.NoError(t, space.Get(ctx, []byte(kv.key), ¶m)) + require.NotPanics(t, func() { gspace.Get(ctx, []byte(kv.key), &gparam) }) + require.NotPanics(t, func() { space.Get(ctx, []byte(kv.key), ¶m) }) require.Equal(t, gparam, param, "GetSubspace().Get not equal with space.Get, tc #%d", i) - require.NoError(t, gspace.Set(ctx, []byte(kv.key), int64(i))) - require.NoError(t, space.Get(ctx, []byte(kv.key), ¶m)) + require.NotPanics(t, func() { gspace.Set(ctx, []byte(kv.key), int64(i)) }) + require.NotPanics(t, func() { space.Get(ctx, []byte(kv.key), ¶m) }) require.Equal(t, int64(i), param, "GetSubspace().Set not equal with space.Get, tc #%d", i) } } @@ -184,27 +184,27 @@ func TestSubspace(t *testing.T) { // Test space.Set, space.Modified for i, kv := range kvs { require.False(t, space.Modified(ctx, []byte(kv.key)), "space.Modified returns true before setting, tc #%d", i) - require.NoError(t, space.Set(ctx, []byte(kv.key), kv.param), "space.Set error, tc #%d", i) + require.NotPanics(t, func() { space.Set(ctx, []byte(kv.key), kv.param) }, "space.Set panics, tc #%d", i) require.True(t, space.Modified(ctx, []byte(kv.key)), "space.Modified returns false after setting, tc #%d", i) } // Test space.Get, space.GetIfExists for i, kv := range kvs { - require.Error(t, space.GetIfExists(ctx, []byte("invalid"), kv.ptr), "space.GetIfExists error when no value exists, tc #%d", i) + require.NotPanics(t, func() { space.GetIfExists(ctx, []byte("invalid"), kv.ptr) }, "space.GetIfExists panics when no value exists, tc #%d", i) require.Equal(t, kv.zero, indirect(kv.ptr), "space.GetIfExists unmarshalls when no value exists, tc #%d", i) - require.Error(t, space.Get(ctx, []byte("invalid"), kv.ptr), "invalid space.Get not error when no value exists, tc #%d", i) + require.Panics(t, func() { space.Get(ctx, []byte("invalid"), kv.ptr) }, "invalid space.Get not panics when no value exists, tc #%d", i) require.Equal(t, kv.zero, indirect(kv.ptr), "invalid space.Get unmarshalls when no value exists, tc #%d", i) - require.NoError(t, space.GetIfExists(ctx, []byte(kv.key), kv.ptr), "space.GetIfExists error, tc #%d", i) + require.NotPanics(t, func() { space.GetIfExists(ctx, []byte(kv.key), kv.ptr) }, "space.GetIfExists panics, tc #%d", i) require.Equal(t, kv.param, indirect(kv.ptr), "stored param not equal, tc #%d", i) - require.NoError(t, space.Get(ctx, []byte(kv.key), kv.ptr), "space.Get error, tc #%d", i) + require.NotPanics(t, func() { space.Get(ctx, []byte(kv.key), kv.ptr) }, "space.Get panics, tc #%d", i) require.Equal(t, kv.param, indirect(kv.ptr), "stored param not equal, tc #%d", i) - require.Error(t, space.Get(ctx, []byte("invalid"), kv.ptr), "invalid space.Get not error when no value exists, tc #%d", i) + require.Panics(t, func() { space.Get(ctx, []byte("invalid"), kv.ptr) }, "invalid space.Get not panics when no value exists, tc #%d", i) require.Equal(t, kv.param, indirect(kv.ptr), "invalid space.Get unmarshalls when no value existt, tc #%d", i) - require.Error(t, space.Get(ctx, []byte(kv.key), nil), "invalid space.Get not error when the pointer is nil, tc #%d", i) - require.Error(t, space.Get(ctx, []byte(kv.key), new(invalid)), "invalid space.Get not error when the pointer is different type, tc #%d", i) + require.Panics(t, func() { space.Get(ctx, []byte(kv.key), nil) }, "invalid space.Get not panics when the pointer is nil, tc #%d", i) + require.Panics(t, func() { space.Get(ctx, []byte(kv.key), new(invalid)) }, "invalid space.Get not panics when the pointer is different type, tc #%d", i) } // Test store.Get equals space.Get diff --git a/x/params/subspace/subspace.go b/x/params/subspace/subspace.go index 5ffb415709..72cb5f209b 100644 --- a/x/params/subspace/subspace.go +++ b/x/params/subspace/subspace.go @@ -1,7 +1,6 @@ package subspace import ( - "errors" "reflect" "github.com/cosmos/cosmos-sdk/codec" @@ -91,31 +90,37 @@ func concatKeys(key, subkey []byte) (res []byte) { } // Get parameter from store -func (s Subspace) Get(ctx sdk.Context, key []byte, ptr interface{}) error { +func (s Subspace) Get(ctx sdk.Context, key []byte, ptr interface{}) { store := s.kvStore(ctx) bz := store.Get(key) - return s.cdc.UnmarshalJSON(bz, ptr) + err := s.cdc.UnmarshalJSON(bz, ptr) + if err != nil { + panic(err) + } } // GetIfExists do not modify ptr if the stored parameter is nil -func (s Subspace) GetIfExists(ctx sdk.Context, key []byte, ptr interface{}) error { +func (s Subspace) GetIfExists(ctx sdk.Context, key []byte, ptr interface{}) { store := s.kvStore(ctx) bz := store.Get(key) if bz == nil { - return errors.New("store key does not exist") + return + } + err := s.cdc.UnmarshalJSON(bz, ptr) + if err != nil { + panic(err) } - return s.cdc.UnmarshalJSON(bz, ptr) } // GetWithSubkey returns a parameter with a given key and a subkey. -func (s Subspace) GetWithSubkey(ctx sdk.Context, key, subkey []byte, ptr interface{}) error { - return s.Get(ctx, concatKeys(key, subkey), ptr) +func (s Subspace) GetWithSubkey(ctx sdk.Context, key, subkey []byte, ptr interface{}) { + s.Get(ctx, concatKeys(key, subkey), ptr) } // GetWithSubkeyIfExists returns a parameter with a given key and a subkey but does not // modify ptr if the stored parameter is nil. -func (s Subspace) GetWithSubkeyIfExists(ctx sdk.Context, key, subkey []byte, ptr interface{}) error { - return s.GetIfExists(ctx, concatKeys(key, subkey), ptr) +func (s Subspace) GetWithSubkeyIfExists(ctx sdk.Context, key, subkey []byte, ptr interface{}) { + s.GetIfExists(ctx, concatKeys(key, subkey), ptr) } // Get raw bytes of parameter from store @@ -136,10 +141,10 @@ func (s Subspace) Modified(ctx sdk.Context, key []byte) bool { return tstore.Has(key) } -func (s Subspace) checkType(store sdk.KVStore, key []byte, param interface{}) error { +func (s Subspace) checkType(store sdk.KVStore, key []byte, param interface{}) { attr, ok := s.table.m[string(key)] if !ok { - return errors.New("Parameter not registered") + panic("Parameter not registered") } ty := attr.ty @@ -149,61 +154,51 @@ func (s Subspace) checkType(store sdk.KVStore, key []byte, param interface{}) er } if pty != ty { - return errors.New("Type mismatch with registered table") + panic("Type mismatch with registered table") } - return nil } // Set stores the parameter. It returns error if stored parameter has different type from input. // It also set to the transient store to record change. -func (s Subspace) Set(ctx sdk.Context, key []byte, param interface{}) error { +func (s Subspace) Set(ctx sdk.Context, key []byte, param interface{}) { store := s.kvStore(ctx) - if err := s.checkType(store, key, param); err != nil { - return err - } + s.checkType(store, key, param) bz, err := s.cdc.MarshalJSON(param) if err != nil { - return err + panic(err) } store.Set(key, bz) tstore := s.transientStore(ctx) tstore.Set(key, []byte{}) - return nil + } // SetWithSubkey set a parameter with a key and subkey // Checks parameter type only over the key -func (s Subspace) SetWithSubkey(ctx sdk.Context, key []byte, subkey []byte, param interface{}) error { +func (s Subspace) SetWithSubkey(ctx sdk.Context, key []byte, subkey []byte, param interface{}) { store := s.kvStore(ctx) - if err := s.checkType(store, key, param); err != nil { - return err - } + s.checkType(store, key, param) newkey := concatKeys(key, subkey) bz, err := s.cdc.MarshalJSON(param) if err != nil { - return err + panic(err) } store.Set(newkey, bz) tstore := s.transientStore(ctx) tstore.Set(newkey, []byte{}) - return nil } // Get to ParamSet func (s Subspace) GetParamSet(ctx sdk.Context, ps ParamSet) { for _, pair := range ps.ParamSetPairs() { - err := s.Get(ctx, pair.Key, pair.Value) - if err != nil { - // TODO: return error - needs rewrite interfaces - // and handle error on the caller side - } + s.Get(ctx, pair.Key, pair.Value) } } @@ -215,11 +210,7 @@ func (s Subspace) SetParamSet(ctx sdk.Context, ps ParamSet) { // since SetStruct is meant to be used in InitGenesis // so this method will not be called frequently v := reflect.Indirect(reflect.ValueOf(pair.Value)).Interface() - err := s.Set(ctx, pair.Key, v) - if err != nil { - // TODO: return error - needs rewrite interfaces - // and handle error on the caller side - } + s.Set(ctx, pair.Key, v) } } @@ -234,8 +225,8 @@ type ReadOnlySubspace struct { } // Exposes Get -func (ros ReadOnlySubspace) Get(ctx sdk.Context, key []byte, ptr interface{}) error { - return ros.s.Get(ctx, key, ptr) +func (ros ReadOnlySubspace) Get(ctx sdk.Context, key []byte, ptr interface{}) { + ros.s.Get(ctx, key, ptr) } // Exposes GetRaw diff --git a/x/slashing/app_test.go b/x/slashing/app_test.go index 31093fd98a..94d53f5889 100644 --- a/x/slashing/app_test.go +++ b/x/slashing/app_test.go @@ -47,12 +47,12 @@ func getMockApp(t *testing.T) (*mock.App, staking.Keeper, Keeper) { // staking endblocker func getEndBlocker(keeper staking.Keeper) sdk.EndBlocker { - return func(ctx sdk.Context, req abci.RequestEndBlock) (abci.ResponseEndBlock, error) { - validatorUpdates, tags, err := staking.EndBlocker(ctx, keeper) + return func(ctx sdk.Context, req abci.RequestEndBlock) abci.ResponseEndBlock { + validatorUpdates, tags := staking.EndBlocker(ctx, keeper) return abci.ResponseEndBlock{ ValidatorUpdates: validatorUpdates, Tags: tags, - }, err + } } } diff --git a/x/slashing/keeper_test.go b/x/slashing/keeper_test.go index 240c7cb73b..7b0bd11745 100644 --- a/x/slashing/keeper_test.go +++ b/x/slashing/keeper_test.go @@ -394,8 +394,7 @@ func TestValidatorDippingInAndOut(t *testing.T) { newAmt := sdk.TokensFromTendermintPower(101) got = sh(ctx, NewTestMsgCreateValidator(addrs[1], pks[1], newAmt)) require.True(t, got.IsOK()) - validatorUpdates, _, err := staking.EndBlocker(ctx, sk) - require.NoError(t, err) + validatorUpdates, _ := staking.EndBlocker(ctx, sk) require.Equal(t, 2, len(validatorUpdates)) validator, _ := sk.GetValidator(ctx, addr) require.Equal(t, sdk.Unbonding, validator.Status) @@ -408,8 +407,7 @@ func TestValidatorDippingInAndOut(t *testing.T) { delTokens := sdk.TokensFromTendermintPower(3) got = sh(ctx, newTestMsgDelegate(sdk.AccAddress(addrs[2]), addrs[0], delTokens)) require.True(t, got.IsOK()) - validatorUpdates, _, err = staking.EndBlocker(ctx, sk) - require.NoError(t, err) + validatorUpdates, _ = staking.EndBlocker(ctx, sk) require.Equal(t, 2, len(validatorUpdates)) validator, _ = sk.GetValidator(ctx, addr) require.Equal(t, sdk.Bonded, validator.Status) diff --git a/x/slashing/params.go b/x/slashing/params.go index 5dd4ce8346..5a4f18f167 100644 --- a/x/slashing/params.go +++ b/x/slashing/params.go @@ -88,35 +88,20 @@ func DefaultParams() Params { // MaxEvidenceAge - max age for evidence func (k Keeper) MaxEvidenceAge(ctx sdk.Context) (res time.Duration) { - err := k.paramspace.Get(ctx, KeyMaxEvidenceAge, &res) - if err != nil { - // TODO: return error - needs rewrite interfaces - // and handle error on the caller side - // check PR #3782 - } + k.paramspace.Get(ctx, KeyMaxEvidenceAge, &res) return } // SignedBlocksWindow - sliding window for downtime slashing func (k Keeper) SignedBlocksWindow(ctx sdk.Context) (res int64) { - err := k.paramspace.Get(ctx, KeySignedBlocksWindow, &res) - if err != nil { - // TODO: return error - needs rewrite interfaces - // and handle error on the caller side - // check PR #3782 - } + k.paramspace.Get(ctx, KeySignedBlocksWindow, &res) return } // Downtime slashing threshold func (k Keeper) MinSignedPerWindow(ctx sdk.Context) int64 { var minSignedPerWindow sdk.Dec - err := k.paramspace.Get(ctx, KeyMinSignedPerWindow, &minSignedPerWindow) - if err != nil { - // TODO: return error - needs rewrite interfaces - // and handle error on the caller side - // check PR #3782 - } + k.paramspace.Get(ctx, KeyMinSignedPerWindow, &minSignedPerWindow) signedBlocksWindow := k.SignedBlocksWindow(ctx) // NOTE: RoundInt64 will never panic as minSignedPerWindow is @@ -126,34 +111,19 @@ func (k Keeper) MinSignedPerWindow(ctx sdk.Context) int64 { // Downtime unbond duration func (k Keeper) DowntimeJailDuration(ctx sdk.Context) (res time.Duration) { - err := k.paramspace.Get(ctx, KeyDowntimeJailDuration, &res) - if err != nil { - // TODO: return error - needs rewrite interfaces - // and handle error on the caller side - // check PR #3782 - } + k.paramspace.Get(ctx, KeyDowntimeJailDuration, &res) return } // SlashFractionDoubleSign func (k Keeper) SlashFractionDoubleSign(ctx sdk.Context) (res sdk.Dec) { - err := k.paramspace.Get(ctx, KeySlashFractionDoubleSign, &res) - if err != nil { - // TODO: return error - needs rewrite interfaces - // and handle error on the caller side - // check PR #3782 - } + k.paramspace.Get(ctx, KeySlashFractionDoubleSign, &res) return } // SlashFractionDowntime func (k Keeper) SlashFractionDowntime(ctx sdk.Context) (res sdk.Dec) { - err := k.paramspace.Get(ctx, KeySlashFractionDowntime, &res) - if err != nil { - // TODO: return error - needs rewrite interfaces - // and handle error on the caller side - // check PR #3782 - } + k.paramspace.Get(ctx, KeySlashFractionDowntime, &res) return } diff --git a/x/slashing/tick.go b/x/slashing/tick.go index ab1606e1a5..bd779973f1 100644 --- a/x/slashing/tick.go +++ b/x/slashing/tick.go @@ -10,7 +10,7 @@ import ( ) // slashing begin block functionality -func BeginBlocker(ctx sdk.Context, req abci.RequestBeginBlock, sk Keeper) (sdk.Tags, error) { +func BeginBlocker(ctx sdk.Context, req abci.RequestBeginBlock, sk Keeper) sdk.Tags { // Iterate over all the validators which *should* have signed this block // store whether or not they have actually signed it and slash/unbond any @@ -27,9 +27,9 @@ func BeginBlocker(ctx sdk.Context, req abci.RequestBeginBlock, sk Keeper) (sdk.T case tmtypes.ABCIEvidenceTypeDuplicateVote: sk.handleDoubleSign(ctx, evidence.Validator.Address, evidence.Height, evidence.Time, evidence.Validator.Power) default: - return sdk.EmptyTags(), fmt.Errorf("ignored unknown evidence type: %s", evidence.Type) + ctx.Logger().With("module", "x/slashing").Error(fmt.Sprintf("ignored unknown evidence type: %s", evidence.Type)) } } - return sdk.EmptyTags(), nil + return sdk.EmptyTags() } diff --git a/x/slashing/tick_test.go b/x/slashing/tick_test.go index 33bd0d1091..cc0e5f13b4 100644 --- a/x/slashing/tick_test.go +++ b/x/slashing/tick_test.go @@ -42,8 +42,7 @@ func TestBeginBlocker(t *testing.T) { }}, }, } - _, err := BeginBlocker(ctx, req, keeper) - require.NoError(t, err) + BeginBlocker(ctx, req, keeper) info, found := keeper.getValidatorSigningInfo(ctx, sdk.ConsAddress(pk.Address())) require.True(t, found) @@ -65,8 +64,7 @@ func TestBeginBlocker(t *testing.T) { }}, }, } - _, err := BeginBlocker(ctx, req, keeper) - require.NoError(t, err) + BeginBlocker(ctx, req, keeper) } // for 500 blocks, mark the validator as having not signed @@ -80,8 +78,7 @@ func TestBeginBlocker(t *testing.T) { }}, }, } - _, err := BeginBlocker(ctx, req, keeper) - require.NoError(t, err) + BeginBlocker(ctx, req, keeper) } // end block diff --git a/x/staking/app_test.go b/x/staking/app_test.go index 0d5de7c5e7..da8c52ea5b 100644 --- a/x/staking/app_test.go +++ b/x/staking/app_test.go @@ -34,13 +34,13 @@ func getMockApp(t *testing.T) (*mock.App, Keeper) { // getEndBlocker returns a staking endblocker. func getEndBlocker(keeper Keeper) sdk.EndBlocker { - return func(ctx sdk.Context, req abci.RequestEndBlock) (abci.ResponseEndBlock, error) { - validatorUpdates, tags, err := EndBlocker(ctx, keeper) + return func(ctx sdk.Context, req abci.RequestEndBlock) abci.ResponseEndBlock { + validatorUpdates, tags := EndBlocker(ctx, keeper) return abci.ResponseEndBlock{ ValidatorUpdates: validatorUpdates, Tags: tags, - }, err + } } } diff --git a/x/staking/handler.go b/x/staking/handler.go index dc60b1bb84..7da83cec2e 100644 --- a/x/staking/handler.go +++ b/x/staking/handler.go @@ -34,7 +34,7 @@ func NewHandler(k keeper.Keeper) sdk.Handler { } // Called every block, update validator set -func EndBlocker(ctx sdk.Context, k keeper.Keeper) ([]abci.ValidatorUpdate, sdk.Tags, error) { +func EndBlocker(ctx sdk.Context, k keeper.Keeper) ([]abci.ValidatorUpdate, sdk.Tags) { resTags := sdk.NewTags() // Calculate validator set changes. @@ -83,7 +83,7 @@ func EndBlocker(ctx sdk.Context, k keeper.Keeper) ([]abci.ValidatorUpdate, sdk.T )) } - return validatorUpdates, resTags, nil + return validatorUpdates, resTags } // These functions assume everything has been authenticated, diff --git a/x/staking/keeper/params.go b/x/staking/keeper/params.go index 27f7774193..dede56b2c1 100644 --- a/x/staking/keeper/params.go +++ b/x/staking/keeper/params.go @@ -20,42 +20,26 @@ func ParamKeyTable() params.KeyTable { // UnbondingTime func (k Keeper) UnbondingTime(ctx sdk.Context) (res time.Duration) { - if err := k.paramstore.Get(ctx, types.KeyUnbondingTime, &res); err != nil { - // TODO: return error - needs rewrite interfaces - // and handle error on the caller side - // check PR #3782 - } + k.paramstore.Get(ctx, types.KeyUnbondingTime, &res) return } // MaxValidators - Maximum number of validators func (k Keeper) MaxValidators(ctx sdk.Context) (res uint16) { - if err := k.paramstore.Get(ctx, types.KeyMaxValidators, &res); err != nil { - // TODO: return error - needs rewrite interfaces - // and handle error on the caller side - // check PR #3782 - } + k.paramstore.Get(ctx, types.KeyMaxValidators, &res) return } // MaxEntries - Maximum number of simultaneous unbonding // delegations or redelegations (per pair/trio) func (k Keeper) MaxEntries(ctx sdk.Context) (res uint16) { - if err := k.paramstore.Get(ctx, types.KeyMaxEntries, &res); err != nil { - // TODO: return error - needs rewrite interfaces - // and handle error on the caller side - // check PR #3782 - } + k.paramstore.Get(ctx, types.KeyMaxEntries, &res) return } // BondDenom - Bondable coin denomination func (k Keeper) BondDenom(ctx sdk.Context) (res string) { - if err := k.paramstore.Get(ctx, types.KeyBondDenom, &res); err != nil { - // TODO: return error - needs rewrite interfaces - // and handle error on the caller side - // check PR #3782 - } + k.paramstore.Get(ctx, types.KeyBondDenom, &res) return } From 9e7440a92c14187b05a3064864899f708a507d82 Mon Sep 17 00:00:00 2001 From: Frank Yang Date: Mon, 8 Apr 2019 23:00:17 +0800 Subject: [PATCH 05/47] Merge PR #4064: Remove dep/vendor from documentation and version cmd * Remove `dep` and `vendor` from documentation * Replace vendor with go.sum hash in version command --- .../improvements/gaia/4064-Remove-dep-and- | 1 + Makefile | 6 ++--- .../running-the-application.md | 1 - docs/gaia/installation.md | 2 +- docs/translations/cn/gaia/installation.md | 4 ++-- scripts/install/install_sdk_arm.sh | 1 - scripts/install/install_sdk_bsd.sh | 1 - scripts/install/install_sdk_ubuntu.sh | 1 - version/version.go | 24 +++++++++---------- 9 files changed, 18 insertions(+), 23 deletions(-) create mode 100644 .pending/improvements/gaia/4064-Remove-dep-and- diff --git a/.pending/improvements/gaia/4064-Remove-dep-and- b/.pending/improvements/gaia/4064-Remove-dep-and- new file mode 100644 index 0000000000..3792deb540 --- /dev/null +++ b/.pending/improvements/gaia/4064-Remove-dep-and- @@ -0,0 +1 @@ +#4064 Remove `dep` and `vendor` from `doc` and `version`. \ No newline at end of file diff --git a/Makefile b/Makefile index 456f19cddf..e539499dad 100644 --- a/Makefile +++ b/Makefile @@ -48,7 +48,7 @@ ldflags = -X github.com/cosmos/cosmos-sdk/version.Version=$(VERSION) \ -X "github.com/cosmos/cosmos-sdk/version.BuildTags=$(build_tags)" ifneq ($(GOSUM),) -ldflags += -X github.com/cosmos/cosmos-sdk/version.VendorDirHash=$(shell $(GOSUM) go.sum) +ldflags += -X github.com/cosmos/cosmos-sdk/version.GoSumHash=$(shell $(GOSUM) go.sum) endif ifeq ($(WITH_CLEVELDB),yes) @@ -121,8 +121,6 @@ draw_deps: tools clean: rm -rf snapcraft-local.yaml build/ -distclean: clean - rm -rf vendor/ ######################################## ### Documentation @@ -264,7 +262,7 @@ snapcraft-local.yaml: snapcraft-local.yaml.in # To avoid unintended conflicts with file names, always add to .PHONY # unless there is a reason not to. # https://www.gnu.org/software/make/manual/html_node/Phony-Targets.html -.PHONY: install install_debug dist clean distclean \ +.PHONY: install install_debug dist clean \ draw_deps test test_cli test_unit \ test_cover lint benchmark devdoc_init devdoc devdoc_save devdoc_update \ build-linux build-docker-gaiadnode localnet-start localnet-stop \ diff --git a/docs/_attic/sdk/sdk-by-examples/simple-governance/running-the-application.md b/docs/_attic/sdk/sdk-by-examples/simple-governance/running-the-application.md index 3a057054d4..e4acea3411 100644 --- a/docs/_attic/sdk/sdk-by-examples/simple-governance/running-the-application.md +++ b/docs/_attic/sdk/sdk-by-examples/simple-governance/running-the-application.md @@ -7,7 +7,6 @@ Once you have finallized your application, install it using `go get`. The follow ```bash go get github.com//cosmos-sdk cd $GOPATH/src/github.com//cosmos-sdk -make get_vendor_deps make install make install_examples ``` diff --git a/docs/gaia/installation.md b/docs/gaia/installation.md index a3ce834ac0..4bdd2954f9 100644 --- a/docs/gaia/installation.md +++ b/docs/gaia/installation.md @@ -51,7 +51,7 @@ $ gaiacli version --long ``` cosmos-sdk: 0.33.0 git commit: 7b4104aced52aa5b59a96c28b5ebeea7877fc4f0 -vendor hash: 5db0df3e24cf10545c84f462a24ddc61882aa58f +go.sum hash: d156153bd5e128fec3868eca9a1397a63a864edb5cfa0ac486db1b574b8eecfe build tags: netgo ledger go version go1.12 linux/amd64 ``` diff --git a/docs/translations/cn/gaia/installation.md b/docs/translations/cn/gaia/installation.md index 4c92fa2beb..6a6214eeba 100644 --- a/docs/translations/cn/gaia/installation.md +++ b/docs/translations/cn/gaia/installation.md @@ -49,7 +49,7 @@ $ gaiacli version --long ``` cosmos-sdk: 0.33.0 git commit: 7b4104aced52aa5b59a96c28b5ebeea7877fc4f0 -vendor hash: 5db0df3e24cf10545c84f462a24ddc61882aa58f +go.sum hash: d156153bd5e128fec3868eca9a1397a63a864edb5cfa0ac486db1b574b8eecfe build tags: netgo ledger go version go1.12 linux/amd64 ``` @@ -64,4 +64,4 @@ build tags指定了可执行程序具有的特殊特性。 | ledger | 支持Ledger设备(硬件钱包) | ### 接下来 -然后你可以选择 加入公共测试网 或是 创建私有测试网。 \ No newline at end of file +然后你可以选择 加入公共测试网 或是 创建私有测试网。 diff --git a/scripts/install/install_sdk_arm.sh b/scripts/install/install_sdk_arm.sh index ca00860918..d00f5fe16d 100644 --- a/scripts/install/install_sdk_arm.sh +++ b/scripts/install/install_sdk_arm.sh @@ -32,7 +32,6 @@ cd $GOPATH/src/$REPO # build & install master git checkout $BRANCH LEDGER_ENABLED=false make tools -LEDGER_ENABLED=false make get_vendor_deps LEDGER_ENABLED=false make install source ~/.profile diff --git a/scripts/install/install_sdk_bsd.sh b/scripts/install/install_sdk_bsd.sh index 4784addc3e..1db4062511 100644 --- a/scripts/install/install_sdk_bsd.sh +++ b/scripts/install/install_sdk_bsd.sh @@ -48,6 +48,5 @@ cd $GOPATH/src/$REPO # build & install master git checkout $BRANCH gmake tools -gmake get_vendor_deps gmake install gmake install_examples diff --git a/scripts/install/install_sdk_ubuntu.sh b/scripts/install/install_sdk_ubuntu.sh index dfd1e921a4..2f62fe4156 100644 --- a/scripts/install/install_sdk_ubuntu.sh +++ b/scripts/install/install_sdk_ubuntu.sh @@ -35,7 +35,6 @@ cd $GOPATH/src/$REPO # build & install master git checkout $BRANCH LEDGER_ENABLED=false make tools -LEDGER_ENABLED=false make get_vendor_deps LEDGER_ENABLED=false make install source ~/.profile diff --git a/version/version.go b/version/version.go index 0b2c09985a..aad02d1904 100644 --- a/version/version.go +++ b/version/version.go @@ -8,33 +8,33 @@ import ( // Variables set by build flags var ( - Commit = "" - Version = "" - VendorDirHash = "" - BuildTags = "" + Commit = "" + Version = "" + GoSumHash = "" + BuildTags = "" ) type versionInfo struct { - CosmosSDK string `json:"cosmos_sdk"` - GitCommit string `json:"commit"` - VendorDirHash string `json:"vendor_hash"` - BuildTags string `json:"build_tags"` - GoVersion string `json:"go"` + CosmosSDK string `json:"cosmos_sdk"` + GitCommit string `json:"commit"` + GoSumHash string `json:"gosum_hash"` + BuildTags string `json:"build_tags"` + GoVersion string `json:"go"` } func (v versionInfo) String() string { return fmt.Sprintf(`cosmos-sdk: %s git commit: %s -vendor hash: %s +go.sum hash: %s build tags: %s -%s`, v.CosmosSDK, v.GitCommit, v.VendorDirHash, v.BuildTags, v.GoVersion) +%s`, v.CosmosSDK, v.GitCommit, v.GoSumHash, v.BuildTags, v.GoVersion) } func newVersionInfo() versionInfo { return versionInfo{ Version, Commit, - VendorDirHash, + GoSumHash, BuildTags, fmt.Sprintf("go version %s %s/%s\n", runtime.Version(), runtime.GOOS, runtime.GOARCH)} } From fbc6bdae18245d1603050e911030fe449a7db210 Mon Sep 17 00:00:00 2001 From: Alessio Treglia Date: Mon, 8 Apr 2019 18:54:45 +0100 Subject: [PATCH 06/47] gaiad: ExportGenesisFile() incorrectly overwrites genesis (#4063) ExportGenesisFile() overwrites all non-gaia related sections of the genesis.json file as it always creates a new one from scratch. Remove cmd/gaia/init.LoadGenesisDoc() in favor of tendermint's types.GenesisDocFromFile(). Closes: #4066 --- .../improvements/gaia/4062-Remove-cmd-gaia | 1 + cmd/gaia/cli_test/cli_test.go | 16 +++++++++++ cmd/gaia/cli_test/test_helpers.go | 4 +-- cmd/gaia/init/collect.go | 8 +++--- cmd/gaia/init/genesis_accts.go | 6 ++-- cmd/gaia/init/gentx.go | 3 +- cmd/gaia/init/init.go | 18 +++++++++++- cmd/gaia/init/testnet.go | 4 +-- cmd/gaia/init/utils.go | 27 +----------------- cmd/gaia/init/utils_test.go | 28 ------------------- cmd/gaia/init/validate_genesis.go | 4 +-- 11 files changed, 51 insertions(+), 68 deletions(-) create mode 100644 .pending/improvements/gaia/4062-Remove-cmd-gaia diff --git a/.pending/improvements/gaia/4062-Remove-cmd-gaia b/.pending/improvements/gaia/4062-Remove-cmd-gaia new file mode 100644 index 0000000000..b0d5e7c9ec --- /dev/null +++ b/.pending/improvements/gaia/4062-Remove-cmd-gaia @@ -0,0 +1 @@ +#4066 Fix 'ExportGenesisFile() incorrectly overwrites genesis' diff --git a/cmd/gaia/cli_test/cli_test.go b/cmd/gaia/cli_test/cli_test.go index b71d6c1c2c..a245e9e515 100644 --- a/cmd/gaia/cli_test/cli_test.go +++ b/cmd/gaia/cli_test/cli_test.go @@ -15,6 +15,7 @@ import ( "time" "github.com/tendermint/tendermint/crypto/ed25519" + tmtypes "github.com/tendermint/tendermint/types" "github.com/stretchr/testify/require" @@ -992,6 +993,7 @@ trust-node = true func TestGaiadCollectGentxs(t *testing.T) { t.Parallel() + var customMaxBytes, customMaxGas int64 = 99999999, 1234567 f := NewFixtures(t) // Initialise temporary directories @@ -1011,6 +1013,15 @@ func TestGaiadCollectGentxs(t *testing.T) { // Run init f.GDInit(keyFoo) + // Customise genesis.json + + genFile := f.GenesisFile() + genDoc, err := tmtypes.GenesisDocFromFile(genFile) + require.NoError(t, err) + genDoc.ConsensusParams.Block.MaxBytes = customMaxBytes + genDoc.ConsensusParams.Block.MaxGas = customMaxGas + genDoc.SaveAs(genFile) + // Add account to genesis.json f.AddGenesisAccount(f.KeyAddress(keyFoo), startCoins) @@ -1020,6 +1031,11 @@ func TestGaiadCollectGentxs(t *testing.T) { // Collect gentxs from a custom directory f.CollectGenTxs(fmt.Sprintf("--gentx-dir=%s", gentxDir)) + genDoc, err = tmtypes.GenesisDocFromFile(genFile) + require.NoError(t, err) + require.Equal(t, genDoc.ConsensusParams.Block.MaxBytes, customMaxBytes) + require.Equal(t, genDoc.ConsensusParams.Block.MaxGas, customMaxGas) + f.Cleanup(gentxDir) } diff --git a/cmd/gaia/cli_test/test_helpers.go b/cmd/gaia/cli_test/test_helpers.go index 010fd05d5b..656c2f80a6 100644 --- a/cmd/gaia/cli_test/test_helpers.go +++ b/cmd/gaia/cli_test/test_helpers.go @@ -15,10 +15,10 @@ import ( "github.com/stretchr/testify/require" cmn "github.com/tendermint/tendermint/libs/common" + tmtypes "github.com/tendermint/tendermint/types" clientkeys "github.com/cosmos/cosmos-sdk/client/keys" "github.com/cosmos/cosmos-sdk/cmd/gaia/app" - appInit "github.com/cosmos/cosmos-sdk/cmd/gaia/init" "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/crypto/keys" "github.com/cosmos/cosmos-sdk/server" @@ -98,7 +98,7 @@ func (f Fixtures) GenesisFile() string { // GenesisFile returns the application's genesis state func (f Fixtures) GenesisState() app.GenesisState { cdc := codec.New() - genDoc, err := appInit.LoadGenesisDoc(cdc, f.GenesisFile()) + genDoc, err := tmtypes.GenesisDocFromFile(f.GenesisFile()) require.NoError(f.T, err) var appState app.GenesisState diff --git a/cmd/gaia/init/collect.go b/cmd/gaia/init/collect.go index 8586394868..0ad58252d9 100644 --- a/cmd/gaia/init/collect.go +++ b/cmd/gaia/init/collect.go @@ -46,7 +46,7 @@ func CollectGenTxsCmd(ctx *server.Context, cdc *codec.Codec) *cobra.Command { return err } - genDoc, err := LoadGenesisDoc(cdc, config.GenesisFile()) + genDoc, err := types.GenesisDocFromFile(config.GenesisFile()) if err != nil { return err } @@ -59,7 +59,7 @@ func CollectGenTxsCmd(ctx *server.Context, cdc *codec.Codec) *cobra.Command { 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) + appMessage, err := genAppStateFromConfig(cdc, config, initCfg, *genDoc) if err != nil { return err } @@ -82,7 +82,6 @@ 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 @@ -116,7 +115,8 @@ func genAppStateFromConfig( return } - err = ExportGenesisFile(genFile, initCfg.ChainID, nil, appState) + genDoc.AppState = appState + err = ExportGenesisFile(&genDoc, config.GenesisFile()) return } diff --git a/cmd/gaia/init/genesis_accts.go b/cmd/gaia/init/genesis_accts.go index 5aa73dae94..79748f1ea0 100644 --- a/cmd/gaia/init/genesis_accts.go +++ b/cmd/gaia/init/genesis_accts.go @@ -7,6 +7,7 @@ import ( "github.com/spf13/viper" "github.com/tendermint/tendermint/libs/cli" "github.com/tendermint/tendermint/libs/common" + tmtypes "github.com/tendermint/tendermint/types" "github.com/cosmos/cosmos-sdk/client/keys" "github.com/cosmos/cosmos-sdk/cmd/gaia/app" @@ -58,7 +59,7 @@ func AddGenesisAccountCmd(ctx *server.Context, cdc *codec.Codec) *cobra.Command return fmt.Errorf("%s does not exist, run `gaiad init` first", genFile) } - genDoc, err := LoadGenesisDoc(cdc, genFile) + genDoc, err := tmtypes.GenesisDocFromFile(genFile) if err != nil { return err } @@ -78,7 +79,8 @@ func AddGenesisAccountCmd(ctx *server.Context, cdc *codec.Codec) *cobra.Command return err } - return ExportGenesisFile(genFile, genDoc.ChainID, nil, appStateJSON) + genDoc.AppState = appStateJSON + return ExportGenesisFile(genDoc, genFile) }, } diff --git a/cmd/gaia/init/gentx.go b/cmd/gaia/init/gentx.go index 970c77e0d8..b873cd88b5 100644 --- a/cmd/gaia/init/gentx.go +++ b/cmd/gaia/init/gentx.go @@ -17,6 +17,7 @@ import ( "github.com/tendermint/tendermint/crypto" tmcli "github.com/tendermint/tendermint/libs/cli" "github.com/tendermint/tendermint/libs/common" + tmtypes "github.com/tendermint/tendermint/types" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/context" @@ -79,7 +80,7 @@ following delegation and commission default parameters: "the tx's memo field will be unset") } - genDoc, err := LoadGenesisDoc(cdc, config.GenesisFile()) + genDoc, err := tmtypes.GenesisDocFromFile(config.GenesisFile()) if err != nil { return err } diff --git a/cmd/gaia/init/init.go b/cmd/gaia/init/init.go index 506557d3f6..b539c86323 100644 --- a/cmd/gaia/init/init.go +++ b/cmd/gaia/init/init.go @@ -11,6 +11,7 @@ import ( cfg "github.com/tendermint/tendermint/config" "github.com/tendermint/tendermint/libs/cli" "github.com/tendermint/tendermint/libs/common" + "github.com/tendermint/tendermint/types" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/cmd/gaia/app" @@ -76,7 +77,22 @@ func InitCmd(ctx *server.Context, cdc *codec.Codec) *cobra.Command { // nolint: return err } - if err = ExportGenesisFile(genFile, chainID, nil, appState); err != nil { + genDoc := &types.GenesisDoc{} + if _, err := os.Stat(genFile); err != nil { + if !os.IsNotExist(err) { + return err + } + } else { + genDoc, err = types.GenesisDocFromFile(genFile) + if err != nil { + return err + } + } + + genDoc.ChainID = chainID + genDoc.Validators = nil + genDoc.AppState = appState + if err = ExportGenesisFile(genDoc, genFile); err != nil { return err } diff --git a/cmd/gaia/init/testnet.go b/cmd/gaia/init/testnet.go index 334286335a..670dbc8013 100644 --- a/cmd/gaia/init/testnet.go +++ b/cmd/gaia/init/testnet.go @@ -306,12 +306,12 @@ func collectGenFiles( nodeID, valPubKey := nodeIDs[i], valPubKeys[i] initCfg := newInitConfig(chainID, gentxsDir, moniker, nodeID, valPubKey) - genDoc, err := LoadGenesisDoc(cdc, config.GenesisFile()) + genDoc, err := types.GenesisDocFromFile(config.GenesisFile()) if err != nil { return err } - nodeAppState, err := genAppStateFromConfig(cdc, config, initCfg, genDoc) + nodeAppState, err := genAppStateFromConfig(cdc, config, initCfg, *genDoc) if err != nil { return err } diff --git a/cmd/gaia/init/utils.go b/cmd/gaia/init/utils.go index 4e2f2f26f2..ce43781c71 100644 --- a/cmd/gaia/init/utils.go +++ b/cmd/gaia/init/utils.go @@ -3,11 +3,9 @@ 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" @@ -22,16 +20,7 @@ import ( // 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, - } - +func ExportGenesisFile(genDoc *types.GenesisDoc, genFile string) error { if err := genDoc.ValidateAndComplete(); err != nil { return err } @@ -88,20 +77,6 @@ func InitializeNodeValidatorFiles( 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) { diff --git a/cmd/gaia/init/utils_test.go b/cmd/gaia/init/utils_test.go index 3a5a136903..87dfabd4d6 100644 --- a/cmd/gaia/init/utils_test.go +++ b/cmd/gaia/init/utils_test.go @@ -2,13 +2,10 @@ 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" @@ -22,28 +19,3 @@ func TestExportGenesisFileWithTime(t *testing.T) { 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) -} diff --git a/cmd/gaia/init/validate_genesis.go b/cmd/gaia/init/validate_genesis.go index e98fdbedad..0f7303691e 100644 --- a/cmd/gaia/init/validate_genesis.go +++ b/cmd/gaia/init/validate_genesis.go @@ -31,8 +31,8 @@ func ValidateGenesisCmd(ctx *server.Context, cdc *codec.Codec) *cobra.Command { //nolint fmt.Fprintf(os.Stderr, "validating genesis file at %s\n", genesis) - var genDoc types.GenesisDoc - if genDoc, err = LoadGenesisDoc(cdc, genesis); err != nil { + var genDoc *types.GenesisDoc + if genDoc, err = types.GenesisDocFromFile(genesis); err != nil { return fmt.Errorf("Error loading genesis doc from %s: %s", genesis, err.Error()) } From c0a607ce74db52741bd00a4eb663d80b339f7c05 Mon Sep 17 00:00:00 2001 From: Federico Kunze <31522760+fedekunze@users.noreply.github.com> Date: Tue, 9 Apr 2019 00:51:02 +0200 Subject: [PATCH 07/47] fix and cleanup action tags (#4045) Closes: #3966 #3793 --- .pending/bugfixes/sdk/3966-fixed-multiple- | 2 ++ x/slashing/handler.go | 1 - x/slashing/tags/tags.go | 7 ------- x/staking/alias.go | 13 ------------- x/staking/client/rest/query.go | 5 ----- x/staking/handler.go | 19 ++++++++----------- x/staking/tags/tags.go | 4 +--- 7 files changed, 11 insertions(+), 40 deletions(-) create mode 100644 .pending/bugfixes/sdk/3966-fixed-multiple- diff --git a/.pending/bugfixes/sdk/3966-fixed-multiple- b/.pending/bugfixes/sdk/3966-fixed-multiple- new file mode 100644 index 0000000000..8ffae93169 --- /dev/null +++ b/.pending/bugfixes/sdk/3966-fixed-multiple- @@ -0,0 +1,2 @@ +#3966 fixed multiple assigns to action tags +#3793 add delegator tag for MsgCreateValidator and deleted unused moniker and identity tags diff --git a/x/slashing/handler.go b/x/slashing/handler.go index 70a28089d0..b623ac9b4e 100644 --- a/x/slashing/handler.go +++ b/x/slashing/handler.go @@ -61,7 +61,6 @@ func handleMsgUnjail(ctx sdk.Context, msg MsgUnjail, k Keeper) sdk.Result { k.validatorSet.Unjail(ctx, consAddr) tags := sdk.NewTags( - tags.Action, tags.ActionValidatorUnjailed, tags.Validator, msg.ValidatorAddr.String(), ) diff --git a/x/slashing/tags/tags.go b/x/slashing/tags/tags.go index 12c1d616f4..cb92e3cd66 100644 --- a/x/slashing/tags/tags.go +++ b/x/slashing/tags/tags.go @@ -1,13 +1,6 @@ package tags -import ( - sdk "github.com/cosmos/cosmos-sdk/types" -) - // Slashing tags var ( - ActionValidatorUnjailed = "validator-unjailed" - - Action = sdk.TagAction Validator = "validator" ) diff --git a/x/staking/alias.go b/x/staking/alias.go index cee0c7b4c4..cbc20d7dca 100644 --- a/x/staking/alias.go +++ b/x/staking/alias.go @@ -4,7 +4,6 @@ package staking import ( "github.com/cosmos/cosmos-sdk/x/staking/keeper" "github.com/cosmos/cosmos-sdk/x/staking/querier" - "github.com/cosmos/cosmos-sdk/x/staking/tags" "github.com/cosmos/cosmos-sdk/x/staking/types" ) @@ -172,15 +171,3 @@ var ( ErrMinSelfDelegationDecreased = types.ErrMinSelfDelegationDecreased ErrSelfDelegationBelowMinimum = types.ErrSelfDelegationBelowMinimum ) - -var ( - ActionCompleteUnbonding = tags.ActionCompleteUnbonding - ActionCompleteRedelegation = tags.ActionCompleteRedelegation - - TagAction = tags.Action - TagSrcValidator = tags.SrcValidator - TagDstValidator = tags.DstValidator - TagDelegator = tags.Delegator - TagMoniker = tags.Moniker - TagIdentity = tags.Identity -) diff --git a/x/staking/client/rest/query.go b/x/staking/client/rest/query.go index 63fcc6d24b..3f1e9bfd29 100644 --- a/x/staking/client/rest/query.go +++ b/x/staking/client/rest/query.go @@ -9,7 +9,6 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/rest" "github.com/cosmos/cosmos-sdk/x/staking" - "github.com/cosmos/cosmos-sdk/x/staking/tags" "github.com/gorilla/mux" ) @@ -143,16 +142,12 @@ func delegatorTxsHandlerFn(cliCtx context.CLIContext, cdc *codec.Codec) http.Han actions = append(actions, staking.MsgDelegate{}.Type()) case isUnbondTx: actions = append(actions, staking.MsgUndelegate{}.Type()) - actions = append(actions, tags.ActionCompleteUnbonding) case isRedTx: actions = append(actions, staking.MsgBeginRedelegate{}.Type()) - actions = append(actions, tags.ActionCompleteRedelegation) case noQuery: actions = append(actions, staking.MsgDelegate{}.Type()) actions = append(actions, staking.MsgUndelegate{}.Type()) - actions = append(actions, tags.ActionCompleteUnbonding) actions = append(actions, staking.MsgBeginRedelegate{}.Type()) - actions = append(actions, tags.ActionCompleteRedelegation) default: w.WriteHeader(http.StatusNoContent) return diff --git a/x/staking/handler.go b/x/staking/handler.go index 7da83cec2e..6512ac1ba0 100644 --- a/x/staking/handler.go +++ b/x/staking/handler.go @@ -60,7 +60,7 @@ func EndBlocker(ctx sdk.Context, k keeper.Keeper) ([]abci.ValidatorUpdate, sdk.T } resTags.AppendTags(sdk.NewTags( - tags.Action, ActionCompleteUnbonding, + tags.Action, tags.ActionCompleteUnbonding, tags.Delegator, dvPair.DelegatorAddress.String(), tags.SrcValidator, dvPair.ValidatorAddress.String(), )) @@ -144,8 +144,7 @@ func handleMsgCreateValidator(ctx sdk.Context, msg types.MsgCreateValidator, k k tags := sdk.NewTags( tags.DstValidator, msg.ValidatorAddress.String(), - tags.Moniker, msg.Description.Moniker, - tags.Identity, msg.Description.Identity, + tags.Delegator, msg.DelegatorAddress.String(), ) return sdk.Result{ @@ -192,14 +191,12 @@ func handleMsgEditValidator(ctx sdk.Context, msg types.MsgEditValidator, k keepe k.SetValidator(ctx, validator) - tags := sdk.NewTags( + resTags := sdk.NewTags( tags.DstValidator, msg.ValidatorAddress.String(), - tags.Moniker, description.Moniker, - tags.Identity, description.Identity, ) return sdk.Result{ - Tags: tags, + Tags: resTags, } } @@ -218,13 +215,13 @@ func handleMsgDelegate(ctx sdk.Context, msg types.MsgDelegate, k keeper.Keeper) return err.Result() } - tags := sdk.NewTags( + resTags := sdk.NewTags( tags.Delegator, msg.DelegatorAddress.String(), tags.DstValidator, msg.ValidatorAddress.String(), ) return sdk.Result{ - Tags: tags, + Tags: resTags, } } @@ -242,13 +239,13 @@ func handleMsgUndelegate(ctx sdk.Context, msg types.MsgUndelegate, k keeper.Keep } finishTime := types.MsgCdc.MustMarshalBinaryLengthPrefixed(completionTime) - tags := sdk.NewTags( + resTags := sdk.NewTags( tags.Delegator, msg.DelegatorAddress.String(), tags.SrcValidator, msg.ValidatorAddress.String(), tags.EndTime, completionTime.Format(time.RFC3339), ) - return sdk.Result{Data: finishTime, Tags: tags} + return sdk.Result{Data: finishTime, Tags: resTags} } func handleMsgBeginRedelegate(ctx sdk.Context, msg types.MsgBeginRedelegate, k keeper.Keeper) sdk.Result { diff --git a/x/staking/tags/tags.go b/x/staking/tags/tags.go index a99135171e..55be61848e 100644 --- a/x/staking/tags/tags.go +++ b/x/staking/tags/tags.go @@ -1,10 +1,10 @@ -// nolint package tags import ( sdk "github.com/cosmos/cosmos-sdk/types" ) +// staking tags var ( ActionCompleteUnbonding = "complete-unbonding" ActionCompleteRedelegation = "complete-redelegation" @@ -13,7 +13,5 @@ var ( SrcValidator = sdk.TagSrcValidator DstValidator = sdk.TagDstValidator Delegator = sdk.TagDelegator - Moniker = "moniker" - Identity = "identity" EndTime = "end-time" ) From ae2999931b30c9b2a06acfeeba248848bf9b0b5a Mon Sep 17 00:00:00 2001 From: frog power 4000 Date: Mon, 8 Apr 2019 19:55:35 -0400 Subject: [PATCH 08/47] Add interactive mode to sdkch (#4009) --- cmd/sdkch/main.go | 293 +++++++++++++++++++++++++++------------------- 1 file changed, 172 insertions(+), 121 deletions(-) diff --git a/cmd/sdkch/main.go b/cmd/sdkch/main.go index d199bc454d..ad60e6ceda 100644 --- a/cmd/sdkch/main.go +++ b/cmd/sdkch/main.go @@ -7,12 +7,13 @@ import ( "fmt" "io/ioutil" "log" - "math" "os" "os/exec" "path/filepath" "regexp" "strings" + + "github.com/spf13/cobra" ) const ( @@ -26,8 +27,9 @@ var ( progName string verboseLog *log.Logger - entriesDir string - verboseLogging bool + entriesDir string + verboseLogging bool + interactiveMode bool // sections name-title map sections = map[string]string{ @@ -44,22 +46,92 @@ var ( "sdk": "SDK", "tendermint": "Tendermint", } + + // RootCmd represents the base command when called without any subcommands + RootCmd = &cobra.Command{ + Use: "sdkch", + Short: "\nMaintain unreleased changelog entries in a modular fashion.", + } + + // command to add a pending log entry + AddCmd = &cobra.Command{ + Use: "add [section] [stanza] [message]", + Short: "Add an entry file.", + Long: ` +Add an entry file. If message is empty, start the editor to edit the message. + + Sections Stanzas + --- --- + breaking gaia + features gaiacli +improvements gaiarest + bugfixes sdk + tendermint`, + Args: cobra.MaximumNArgs(3), + RunE: func(cmd *cobra.Command, args []string) error { + + if interactiveMode { + return addEntryFileFromConsoleInput() + } + + if len(args) < 2 { + log.Println("must include at least 2 arguments when not in interactive mode") + return nil + } + sectionDir, stanzaDir := args[0], args[1] + err := validateSectionStanzaDirs(sectionDir, stanzaDir) + if err != nil { + return err + } + if len(args) == 3 { + return addSinglelineEntryFile(sectionDir, stanzaDir, strings.TrimSpace(args[2])) + } + return addEntryFile(sectionDir, stanzaDir) + }, + } + + // command to generate the changelog + GenerateCmd = &cobra.Command{ + Use: "generate", + Short: "Generate a changelog in Markdown format and print it to STDOUT. version defaults to UNRELEASED.", + Args: cobra.NoArgs, + RunE: func(cmd *cobra.Command, args []string) error { + version := "UNRELEASED" + if flag.NArg() > 1 { + version = strings.Join(flag.Args()[1:], " ") + } + return generateChangelog(version) + }, + } + + // command to delete empty sub-directories recursively + PruneCmd = &cobra.Command{ + Use: "prune", + Short: "Delete empty sub-directories recursively.", + Args: cobra.NoArgs, + RunE: func(cmd *cobra.Command, args []string) error { + return pruneEmptyDirectories() + }, + } ) func init() { - progName = filepath.Base(os.Args[0]) + RootCmd.AddCommand(AddCmd) + RootCmd.AddCommand(GenerateCmd) + RootCmd.AddCommand(PruneCmd) + cwd, err := os.Getwd() if err != nil { log.Fatal(err) } - flag.StringVar(&entriesDir, "d", filepath.Join(cwd, entriesDirName), "entry files directory") - flag.BoolVar(&verboseLogging, "v", false, "enable verbose logging") - flag.Usage = printUsage - + AddCmd.Flags().BoolVarP(&interactiveMode, "interactive", "i", false, "get the section/stanza/message with interactive CLI prompts") + RootCmd.PersistentFlags().BoolVarP(&verboseLogging, "verbose-logging", "v", false, "enable verbose logging") + RootCmd.PersistentFlags().StringVarP(&entriesDir, "entries-dir", "d", filepath.Join(cwd, entriesDirName), "entry files directory") } func main() { + logPrefix := fmt.Sprintf("%s: ", filepath.Base(progName)) log.SetFlags(0) log.SetPrefix(logPrefix) @@ -70,67 +142,66 @@ func main() { verboseLog.SetPrefix(logPrefix) } - if flag.NArg() < 1 { - errInsufficientArgs() - } - - cmd := flag.Arg(0) - switch cmd { - - case "add": - if flag.NArg() < 3 { - errInsufficientArgs() - } - if flag.NArg() > 4 { - errTooManyArgs() - } - sectionDir, stanzaDir := flag.Arg(1), flag.Arg(2) - validateSectionStanzaDirs(sectionDir, stanzaDir) - if flag.NArg() == 4 { - addSinglelineEntryFile(sectionDir, stanzaDir, strings.TrimSpace(flag.Arg(3))) - return - } - addEntryFile(sectionDir, stanzaDir) - - case "generate": - version := "UNRELEASED" - if flag.NArg() > 1 { - version = strings.Join(flag.Args()[1:], " ") - } - generateChangelog(version) - - case "prune": - pruneEmptyDirectories() - - default: - unknownCommand(cmd) + if err := RootCmd.Execute(); err != nil { + fmt.Println(err) + os.Exit(1) } } -func addSinglelineEntryFile(sectionDir, stanzaDir, message string) { +func addEntryFileFromConsoleInput() error { + + reader := bufio.NewReader(os.Stdin) + fmt.Println("Please enter the section (either: \"breaking\", \"features\", \"improvements\", \"bugfixes\")") + sectionDir, _ := reader.ReadString('\n') + sectionDir = strings.TrimSpace(sectionDir) + if _, ok := sections[sectionDir]; !ok { + return errors.New("invalid section, please try again") + } + + fmt.Println("Please enter the stanza (either: \"gaia\", \"gaiacli\", \"gaiarest\", \"sdk\", \"tendermint\")") + stanzaDir, _ := reader.ReadString('\n') + stanzaDir = strings.TrimSpace(stanzaDir) + if _, ok := stanzas[stanzaDir]; !ok { + return errors.New("invalid stanza, please try again") + } + + fmt.Println("Please enter the changelog message (or press enter to write in default $EDITOR)") + message, _ := reader.ReadString('\n') + message = strings.TrimSpace(message) + if message == "" { + return addEntryFile(sectionDir, stanzaDir) + } + + return addSinglelineEntryFile(sectionDir, stanzaDir, message) +} + +func addSinglelineEntryFile(sectionDir, stanzaDir, message string) error { filename := filepath.Join( filepath.Join(entriesDir, sectionDir, stanzaDir), generateFileName(message), ) - writeEntryFile(filename, []byte(message)) + return writeEntryFile(filename, []byte(message)) } -func addEntryFile(sectionDir, stanzaDir string) { - bs := readUserInput() +func addEntryFile(sectionDir, stanzaDir string) error { + bs, err := readUserInputFromEditor() + if err != nil { + return err + } firstLine := strings.TrimSpace(strings.Split(string(bs), "\n")[0]) filename := filepath.Join( filepath.Join(entriesDir, sectionDir, stanzaDir), generateFileName(firstLine), ) - writeEntryFile(filename, bs) + return writeEntryFile(filename, bs) } -var filenameInvalidChars = regexp.MustCompile(`[^a-zA-Z0-9-_]`) - func generateFileName(line string) string { var chunks []string + + filenameInvalidChars := regexp.MustCompile(`[^a-zA-Z0-9-_]`) subsWithInvalidCharsRemoved := strings.Split(filenameInvalidChars.ReplaceAllString(line, " "), " ") for _, sub := range subsWithInvalidCharsRemoved { sub = strings.TrimSpace(sub) @@ -140,17 +211,21 @@ func generateFileName(line string) string { } ret := strings.Join(chunks, "-") - return ret[:int(math.Min(float64(len(ret)), float64(maxEntryFilenameLength)))] + + if len(ret) > maxEntryFilenameLength { + return ret[:maxEntryFilenameLength] + } + return ret } -func directoryContents(dirPath string) []os.FileInfo { +func directoryContents(dirPath string) ([]os.FileInfo, error) { contents, err := ioutil.ReadDir(dirPath) if err != nil && !os.IsNotExist(err) { - log.Fatalf("couldn't read directory %s: %v", dirPath, err) + return nil, fmt.Errorf("couldn't read directory %s: %v", dirPath, err) } if len(contents) == 0 { - return nil + return nil, nil } // Filter out hidden files @@ -164,16 +239,19 @@ func directoryContents(dirPath string) []os.FileInfo { contents[i] = nil } - return newContents + return newContents, nil } -func generateChangelog(version string) { +func generateChangelog(version string) error { fmt.Printf("# %s\n\n", version) for sectionDir, sectionTitle := range sections { sectionTitlePrinted := false for stanzaDir, stanzaTitle := range stanzas { path := filepath.Join(entriesDir, sectionDir, stanzaDir) - files := directoryContents(path) + files, err := directoryContents(path) + if err != nil { + return err + } if len(files) == 0 { continue } @@ -188,22 +266,27 @@ func generateChangelog(version string) { verboseLog.Println("processing", f.Name()) filename := filepath.Join(path, f.Name()) if err := indentAndPrintFile(filename); err != nil { - log.Fatal(err) + return err } } fmt.Println() } } + return nil } -func pruneEmptyDirectories() { +func pruneEmptyDirectories() error { for sectionDir := range sections { for stanzaDir := range stanzas { - mustPruneDirIfEmpty(filepath.Join(entriesDir, sectionDir, stanzaDir)) + err := mustPruneDirIfEmpty(filepath.Join(entriesDir, sectionDir, stanzaDir)) + if err != nil { + return err + } } - mustPruneDirIfEmpty(filepath.Join(entriesDir, sectionDir)) + return mustPruneDirIfEmpty(filepath.Join(entriesDir, sectionDir)) } + return nil } // nolint: errcheck @@ -238,45 +321,47 @@ func indentAndPrintFile(filename string) error { } // nolint: errcheck -func writeEntryFile(filename string, bs []byte) { +func writeEntryFile(filename string, bs []byte) error { if err := os.MkdirAll(filepath.Dir(filename), 0755); err != nil { - log.Fatal(err) + return err } outFile, err := os.OpenFile(filename, os.O_WRONLY|os.O_CREATE|os.O_EXCL, 0644) if err != nil { - log.Fatal(err) + return err } defer outFile.Close() if _, err := outFile.Write(bs); err != nil { - log.Fatal(err) + return err } log.Printf("Unreleased changelog entry written to: %s\n", filename) log.Println("To modify this entry please edit or delete the above file directly.") + return nil } -func validateSectionStanzaDirs(sectionDir, stanzaDir string) { +func validateSectionStanzaDirs(sectionDir, stanzaDir string) error { if _, ok := sections[sectionDir]; !ok { - log.Fatalf("invalid section -- %s", sectionDir) + return fmt.Errorf("invalid section -- %s", sectionDir) } if _, ok := stanzas[stanzaDir]; !ok { - log.Fatalf("invalid stanza -- %s", stanzaDir) + return fmt.Errorf("invalid stanza -- %s", stanzaDir) } + return nil } // nolint: errcheck -func readUserInput() []byte { +func readUserInputFromEditor() ([]byte, error) { tempfilename, err := launchUserEditor() if err != nil { - log.Fatalf("couldn't open an editor: %v", err) + return []byte{}, fmt.Errorf("couldn't open an editor: %v", err) } defer os.Remove(tempfilename) bs, err := ioutil.ReadFile(tempfilename) if err != nil { - log.Fatalf("error: %v", err) + return []byte{}, fmt.Errorf("error: %v", err) } - return bs + return bs, nil } // nolint: errcheck @@ -317,62 +402,28 @@ func launchUserEditor() (string, error) { return "", err } if fileInfo.Size() == 0 { - log.Fatal("aborting due to empty message") + return "", errors.New("aborting due to empty message") } return tempfilename, nil } -func mustPruneDirIfEmpty(path string) { - if contents := directoryContents(path); len(contents) == 0 { - if err := os.Remove(path); err != nil { - if !os.IsNotExist(err) { - log.Fatal(err) - } - return - } - log.Println(path, "removed") +func mustPruneDirIfEmpty(path string) error { + contents, err := directoryContents(path) + if err != nil { + return err } -} - -func printUsage() { - usageText := fmt.Sprintf(`usage: %s [-d directory] [-v] command - -Maintain unreleased changelog entries in a modular fashion. - -Commands: - add [section] [stanza] [message] Add an entry file. If message is empty, start - the editor to edit the message. - generate [version] Generate a changelog in Markdown format and print - it to STDOUT. version defaults to UNRELEASED. - prune Delete empty sub-directories recursively. - - Sections Stanzas - --- --- - breaking gaia - features gaiacli -improvements gaiarest - bugfixes sdk - tendermint -`, progName) - fmt.Fprintf(os.Stderr, "%s\nFlags:\n", usageText) - flag.PrintDefaults() -} - -func errInsufficientArgs() { - log.Println("insufficient arguments") - printUsage() - os.Exit(1) -} - -func errTooManyArgs() { - log.Println("too many arguments") - printUsage() - os.Exit(1) -} - -func unknownCommand(cmd string) { - log.Fatalf("unknown command -- '%s'\nTry '%s -help' for more information.", cmd, progName) + if len(contents) != 0 { + return nil + } + if err := os.Remove(path); err != nil { + if !os.IsNotExist(err) { + return err + } + return nil + } + log.Println(path, "removed") + return nil } // DONTCOVER From 1505c2b2e64fcb15b7049c3b42a182ccb89ef3f8 Mon Sep 17 00:00:00 2001 From: Alessio Treglia Date: Tue, 9 Apr 2019 10:41:00 +0100 Subject: [PATCH 09/47] Move tools to contrib (#4073) Also rename sdkch to clog --- Makefile | 2 +- {scripts => contrib/devtools}/Makefile | 14 +++++++------- {cmd/sdkch => contrib/devtools/clog}/README.md | 0 {cmd/sdkch => contrib/devtools/clog}/main.go | 12 +++++------- {cmd => contrib/devtools}/gosum/main.go | 0 contrib/{ => devtools}/install-golangci-lint.sh | 0 6 files changed, 13 insertions(+), 15 deletions(-) rename {scripts => contrib/devtools}/Makefile (80%) rename {cmd/sdkch => contrib/devtools/clog}/README.md (100%) rename {cmd/sdkch => contrib/devtools/clog}/main.go (97%) rename {cmd => contrib/devtools}/gosum/main.go (100%) rename contrib/{ => devtools}/install-golangci-lint.sh (100%) diff --git a/Makefile b/Makefile index e539499dad..c0fab2f6bb 100644 --- a/Makefile +++ b/Makefile @@ -62,7 +62,7 @@ BUILD_FLAGS := -tags "$(build_tags)" -ldflags '$(ldflags)' all: tools install lint test # The below include contains the tools target. -include scripts/Makefile +include contrib/devtools/Makefile ######################################## ### CI diff --git a/scripts/Makefile b/contrib/devtools/Makefile similarity index 80% rename from scripts/Makefile rename to contrib/devtools/Makefile index d76720d408..e6f3ccc6b4 100644 --- a/scripts/Makefile +++ b/contrib/devtools/Makefile @@ -44,11 +44,11 @@ mkfile_dir := $(shell cd $(shell dirname $(mkfile_path)); pwd) all: tools tools: tools-stamp -tools-stamp: $(GOBIN)/golangci-lint $(GOBIN)/statik $(GOBIN)/goimports $(GOBIN)/gosum $(GOBIN)/sdkch +tools-stamp: $(GOBIN)/golangci-lint $(GOBIN)/statik $(GOBIN)/goimports $(GOBIN)/gosum $(GOBIN)/clog touch $@ -$(GOBIN)/golangci-lint: contrib/install-golangci-lint.sh $(GOBIN)/gosum - bash contrib/install-golangci-lint.sh $(GOBIN) $(GOLANGCI_LINT_VERSION) $(GOLANGCI_LINT_HASHSUM) +$(GOBIN)/golangci-lint: contrib/devtools/install-golangci-lint.sh $(GOBIN)/gosum + bash contrib/devtools/install-golangci-lint.sh $(GOBIN) $(GOLANGCI_LINT_VERSION) $(GOLANGCI_LINT_HASHSUM) $(GOBIN)/statik: $(call go_install,rakyll,statik,v0.1.5) @@ -57,13 +57,13 @@ $(GOBIN)/goimports: go get golang.org/x/tools/cmd/goimports@v0.0.0-20190114222345-bf090417da8b $(GOBIN)/gosum: - go install -mod=readonly ./cmd/gosum/ + go install -mod=readonly ./contrib/devtools/gosum/ -$(GOBIN)/sdkch: - go install -mod=readonly ./cmd/sdkch/ +$(GOBIN)/clog: + go install -mod=readonly ./contrib/devtools/clog/ tools-clean: - cd $(GOBIN) && rm -f golangci-lint statik goimports gosum sdkch + cd $(GOBIN) && rm -f golangci-lint statik goimports gosum clog rm -f tools-stamp .PHONY: all tools tools-clean diff --git a/cmd/sdkch/README.md b/contrib/devtools/clog/README.md similarity index 100% rename from cmd/sdkch/README.md rename to contrib/devtools/clog/README.md diff --git a/cmd/sdkch/main.go b/contrib/devtools/clog/main.go similarity index 97% rename from cmd/sdkch/main.go rename to contrib/devtools/clog/main.go index ad60e6ceda..49107d1cd3 100644 --- a/cmd/sdkch/main.go +++ b/contrib/devtools/clog/main.go @@ -49,16 +49,15 @@ var ( // RootCmd represents the base command when called without any subcommands RootCmd = &cobra.Command{ - Use: "sdkch", - Short: "\nMaintain unreleased changelog entries in a modular fashion.", + Use: "clog", + Short: "Maintain unreleased changelog entries in a modular fashion.", } // command to add a pending log entry AddCmd = &cobra.Command{ Use: "add [section] [stanza] [message]", Short: "Add an entry file.", - Long: ` -Add an entry file. If message is empty, start the editor to edit the message. + Long: `Add an entry file. If message is empty, start the editor to edit the message. Sections Stanzas --- --- @@ -143,8 +142,7 @@ func main() { } if err := RootCmd.Execute(); err != nil { - fmt.Println(err) - os.Exit(1) + log.Fatal(err) } } @@ -381,7 +379,7 @@ func launchUserEditor() (string, error) { "VISUAL or EDITOR variables is set and pointing to a correct editor") } - tempfile, err := ioutil.TempFile("", "sdkch_*") + tempfile, err := ioutil.TempFile("", "clog_*") tempfilename := tempfile.Name() if err != nil { return "", err diff --git a/cmd/gosum/main.go b/contrib/devtools/gosum/main.go similarity index 100% rename from cmd/gosum/main.go rename to contrib/devtools/gosum/main.go diff --git a/contrib/install-golangci-lint.sh b/contrib/devtools/install-golangci-lint.sh similarity index 100% rename from contrib/install-golangci-lint.sh rename to contrib/devtools/install-golangci-lint.sh From 65338f6642a89aed312d356f8194a7062318717a Mon Sep 17 00:00:00 2001 From: wangjj9219 <183318287@qq.com> Date: Tue, 9 Apr 2019 20:46:13 +0800 Subject: [PATCH 10/47] There's no check for chain-id in TxBuilder.SignStdTx #3945 (#3946) Close: #3945 --- .../bugfixes/gaiacli/3945-There-s-no-chec | 1 + x/auth/client/txbuilder/txbuilder.go | 7 +- x/auth/client/txbuilder/txbuilder_test.go | 79 ++++++++++++++++--- 3 files changed, 72 insertions(+), 15 deletions(-) create mode 100644 .pending/bugfixes/gaiacli/3945-There-s-no-chec diff --git a/.pending/bugfixes/gaiacli/3945-There-s-no-chec b/.pending/bugfixes/gaiacli/3945-There-s-no-chec new file mode 100644 index 0000000000..e8ab060541 --- /dev/null +++ b/.pending/bugfixes/gaiacli/3945-There-s-no-chec @@ -0,0 +1 @@ +#3945 There's no check for chain-id in TxBuilder.SignStdTx \ No newline at end of file diff --git a/x/auth/client/txbuilder/txbuilder.go b/x/auth/client/txbuilder/txbuilder.go index 480d8fd416..a118dbbae2 100644 --- a/x/auth/client/txbuilder/txbuilder.go +++ b/x/auth/client/txbuilder/txbuilder.go @@ -178,8 +178,7 @@ func (bldr TxBuilder) WithAccountNumber(accnum uint64) TxBuilder { // set of messages. It returns an error if a fee is supplied but cannot be // parsed. func (bldr TxBuilder) BuildSignMsg(msgs []sdk.Msg) (StdSignMsg, error) { - chainID := bldr.chainID - if chainID == "" { + if bldr.chainID == "" { return StdSignMsg{}, fmt.Errorf("chain ID required but not specified") } @@ -248,6 +247,10 @@ func (bldr TxBuilder) BuildTxForSim(msgs []sdk.Msg) ([]byte, error) { // SignStdTx appends a signature to a StdTx and returns a copy of it. If append // is false, it replaces the signatures already attached with the new signature. func (bldr TxBuilder) SignStdTx(name, passphrase string, stdTx auth.StdTx, appendSig bool) (signedStdTx auth.StdTx, err error) { + if bldr.chainID == "" { + return auth.StdTx{}, fmt.Errorf("chain ID required but not specified") + } + stdSignature, err := MakeSignature(bldr.keybase, name, passphrase, StdSignMsg{ ChainID: bldr.chainID, AccountNumber: bldr.accountNumber, diff --git a/x/auth/client/txbuilder/txbuilder_test.go b/x/auth/client/txbuilder/txbuilder_test.go index 3ae2f71242..4ff4b0cec5 100644 --- a/x/auth/client/txbuilder/txbuilder_test.go +++ b/x/auth/client/txbuilder/txbuilder_test.go @@ -33,12 +33,14 @@ func TestTxBuilderBuild(t *testing.T) { } defaultMsg := []sdk.Msg{sdk.NewTestMsg(addr)} tests := []struct { + name string fields fields msgs []sdk.Msg want StdSignMsg wantErr bool }{ { + "builder with fees", fields{ TxEncoder: auth.DefaultTxEncoder(codec.New()), AccountNumber: 1, @@ -48,7 +50,7 @@ func TestTxBuilderBuild(t *testing.T) { SimulateGas: false, ChainID: "test-chain", Memo: "hello from Voyager 1!", - Fees: sdk.Coins{sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(1))}, + Fees: sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(1))), }, defaultMsg, StdSignMsg{ @@ -62,6 +64,7 @@ func TestTxBuilderBuild(t *testing.T) { false, }, { + "builder with gas prices", fields{ TxEncoder: auth.DefaultTxEncoder(codec.New()), AccountNumber: 1, @@ -84,19 +87,69 @@ func TestTxBuilderBuild(t *testing.T) { }, false, }, + { + "no chain-id supplied", + fields{ + TxEncoder: auth.DefaultTxEncoder(codec.New()), + AccountNumber: 1, + Sequence: 1, + Gas: 200000, + GasAdjustment: 1.1, + SimulateGas: false, + ChainID: "", + Memo: "hello from Voyager 1!", + Fees: sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(1))), + }, + defaultMsg, + StdSignMsg{ + ChainID: "test-chain", + AccountNumber: 1, + Sequence: 1, + Memo: "hello from Voyager 1!", + Msgs: defaultMsg, + Fee: auth.NewStdFee(200000, sdk.Coins{sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(1))}), + }, + true, + }, + { + "builder w/ fees and gas prices", + fields{ + TxEncoder: auth.DefaultTxEncoder(codec.New()), + AccountNumber: 1, + Sequence: 1, + Gas: 200000, + GasAdjustment: 1.1, + SimulateGas: false, + ChainID: "test-chain", + Memo: "hello from Voyager 1!", + Fees: sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(1))), + GasPrices: sdk.DecCoins{sdk.NewDecCoinFromDec(sdk.DefaultBondDenom, sdk.NewDecWithPrec(10000, sdk.Precision))}, + }, + defaultMsg, + StdSignMsg{ + ChainID: "test-chain", + AccountNumber: 1, + Sequence: 1, + Memo: "hello from Voyager 1!", + Msgs: defaultMsg, + Fee: auth.NewStdFee(200000, sdk.Coins{sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(1))}), + }, + true, + }, } - for i, tc := range tests { - bldr := NewTxBuilder( - tc.fields.TxEncoder, tc.fields.AccountNumber, tc.fields.Sequence, - tc.fields.Gas, tc.fields.GasAdjustment, tc.fields.SimulateGas, - tc.fields.ChainID, tc.fields.Memo, tc.fields.Fees, tc.fields.GasPrices, - ) - - got, err := bldr.BuildSignMsg(tc.msgs) - require.Equal(t, tc.wantErr, (err != nil), "TxBuilder.Build() error = %v, wantErr %v, tc %d", err, tc.wantErr, i) - if !reflect.DeepEqual(got, tc.want) { - t.Errorf("TxBuilder.Build() = %v, want %v", got, tc.want) - } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + bldr := NewTxBuilder( + tt.fields.TxEncoder, tt.fields.AccountNumber, tt.fields.Sequence, + tt.fields.Gas, tt.fields.GasAdjustment, tt.fields.SimulateGas, + tt.fields.ChainID, tt.fields.Memo, tt.fields.Fees, tt.fields.GasPrices, + ) + got, err := bldr.BuildSignMsg(tt.msgs) + require.Equal(t, tt.wantErr, (err != nil)) + if err == nil { + require.True(t, reflect.DeepEqual(tt.want, got)) + } + }) } } From d742b9e6ef10852d0b3866a312bf180b05ce5108 Mon Sep 17 00:00:00 2001 From: zxh0 Date: Tue, 9 Apr 2019 20:53:34 +0800 Subject: [PATCH 11/47] Merge PR #4074: Fix Docs Typo --- docs/spec/ibc/overview.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/spec/ibc/overview.md b/docs/spec/ibc/overview.md index 344f69c7d7..faff100c47 100644 --- a/docs/spec/ibc/overview.md +++ b/docs/spec/ibc/overview.md @@ -8,7 +8,7 @@ The IBC protocol creates a mechanism by which two replicated fault-tolerant stat The IBC protocol assumes that multiple applications are running on their own blockchain with their own state and own logic. Communication is achieved over an ordered message queue primitive, allowing the creation of complex inter-chain processes without trusted third parties. -The message packets are not signed by one psuedonymous account, or even multiple, as in multi-signature sidechain implementations. Rather, IBC assigns authorization of the packets to the source blockchain's consensus algorithm, performing light-client style verification on the destination chain. The Byzantine-fault-tolerant properties of the underlying blockchains are preserved: a user transferring assets between two chains using IBC must trust only the consensus algorithms of both chains. +The message packets are not signed by one pseudonymous account, or even multiple, as in multi-signature sidechain implementations. Rather, IBC assigns authorization of the packets to the source blockchain's consensus algorithm, performing light-client style verification on the destination chain. The Byzantine-fault-tolerant properties of the underlying blockchains are preserved: a user transferring assets between two chains using IBC must trust only the consensus algorithms of both chains. In this paper, we define a process of posting block headers and Merkle tree proofs to enable secure verification of individual packets. We then describe how to combine these packets into a messaging queue to guarantee ordered delivery. We then explain how to handle packet receipts (response/error) on the source chain, which enables the creation of asynchronous RPC-like protocols on top of IBC. Finally, we detail some optimizations and how to handle Byzantine blockchains. From 2cd2289a1151e9ad5509c6d7c5831857f60f1683 Mon Sep 17 00:00:00 2001 From: Federico Kunze <31522760+fedekunze@users.noreply.github.com> Date: Tue, 9 Apr 2019 14:55:01 +0200 Subject: [PATCH 12/47] add category tags (#4049) Closes: #3774 --- .pending/breaking/gaiarest/4049-update-tag | 1 + .../improvements/sdk/3774-add-category-tag | 1 + docs/spec/bank/04_tags.md | 19 +++-- docs/spec/crisis/03_tags.md | 11 +-- docs/spec/distribution/06_tags.md | 34 ++++----- docs/spec/governance/04_tags.md | 41 ++++++----- docs/spec/slashing/06_tags.md | 9 +-- docs/spec/staking/06_tags.md | 69 ++++++++++-------- types/tags.go | 1 + x/bank/handler.go | 16 +++-- x/bank/keeper.go | 72 ++++++++++--------- x/bank/keeper_test.go | 10 +-- x/bank/tags.go | 10 --- x/bank/tags/tags.go | 17 +++++ x/crisis/expected_keepers.go | 2 +- x/crisis/handler.go | 2 +- x/distribution/handler.go | 23 +++--- x/distribution/keeper/delegation.go | 2 +- x/distribution/keeper/fee_pool.go | 2 +- x/distribution/keeper/hooks.go | 2 +- x/distribution/keeper/keeper.go | 2 +- x/distribution/keeper/test_common.go | 2 +- x/distribution/tags/tags.go | 4 +- x/distribution/types/expected_keepers.go | 2 +- x/distribution/types/msg.go | 2 +- x/gov/expected_keepers.go | 2 +- x/gov/handler.go | 12 +++- x/gov/keeper.go | 6 +- x/gov/tags/tags.go | 2 + x/ibc/expected_keepers.go | 4 +- x/ibc/handler.go | 4 +- x/ibc/ibc_test.go | 4 +- x/slashing/handler.go | 1 + x/slashing/tags/tags.go | 7 ++ x/slashing/test_common.go | 2 +- x/staking/handler.go | 9 ++- x/staking/keeper/test_common.go | 2 +- x/staking/tags/tags.go | 2 + 38 files changed, 243 insertions(+), 170 deletions(-) create mode 100644 .pending/breaking/gaiarest/4049-update-tag create mode 100644 .pending/improvements/sdk/3774-add-category-tag delete mode 100644 x/bank/tags.go create mode 100644 x/bank/tags/tags.go diff --git a/.pending/breaking/gaiarest/4049-update-tag b/.pending/breaking/gaiarest/4049-update-tag new file mode 100644 index 0000000000..6a200b715b --- /dev/null +++ b/.pending/breaking/gaiarest/4049-update-tag @@ -0,0 +1 @@ +#4049 update tag MsgWithdrawValidatorCommission to match type \ No newline at end of file diff --git a/.pending/improvements/sdk/3774-add-category-tag b/.pending/improvements/sdk/3774-add-category-tag new file mode 100644 index 0000000000..afeb256f63 --- /dev/null +++ b/.pending/improvements/sdk/3774-add-category-tag @@ -0,0 +1 @@ +#3774 add category tag to transactions for ease of filtering diff --git a/docs/spec/bank/04_tags.md b/docs/spec/bank/04_tags.md index 103c598390..0a7f382c2a 100644 --- a/docs/spec/bank/04_tags.md +++ b/docs/spec/bank/04_tags.md @@ -6,7 +6,18 @@ The bank module emits the following events/tags: ### MsgSend -| Key | Value | -|-----------|---------------------------| -| sender | {senderAccountAddress} | -| recipient | {recipientAccountAddress} | +| Key | Value | +|-------------|---------------------------| +| `action` | `send` | +| `category` | `bank` | +| `sender` | {senderAccountAddress} | +| `recipient` | {recipientAccountAddress} | + +### MsgMultiSend + +| Key | Value | +|-------------|---------------------------| +| `action` | `multisend` | +| `category` | `bank` | +| `sender` | {senderAccountAddress} | +| `recipient` | {recipientAccountAddress} | diff --git a/docs/spec/crisis/03_tags.md b/docs/spec/crisis/03_tags.md index f3509bbdac..a6a4a738ca 100644 --- a/docs/spec/crisis/03_tags.md +++ b/docs/spec/crisis/03_tags.md @@ -6,8 +6,9 @@ The crisis module emits the following events/tags: ### MsgVerifyInvariance -| Key | Value | -|-----------|---------------------| -| action | verify_invariant | -| sender | {message-sender} | -| invariant | {invariant-route} | +| Key | Value | +|-------------|--------------------| +| `action` | `verify_invariant` | +| `category` | `crisis` | +| `sender` | {message-sender} | +| `invariant` | {invariant-route} | diff --git a/docs/spec/distribution/06_tags.md b/docs/spec/distribution/06_tags.md index c526ae0c27..418d662ad8 100644 --- a/docs/spec/distribution/06_tags.md +++ b/docs/spec/distribution/06_tags.md @@ -6,25 +6,25 @@ The distribution module emits the following events/tags: ### MsgSetWithdrawAddress -| Key | Value | -|-----------|---------------------------| -| delegator | {delegatorAccountAddress} | - -### MsgWithdrawDelegatorRewardsAll - -| Key | Value | -|-----------|---------------------------| -| delegator | {delegatorAccountAddress} | +| Key | Value | +|-------------|---------------------------| +| `action` | `set_withdraw_address` | +| `category` | `distribution` | +| `delegator` | {delegatorAccountAddress} | ### MsgWithdrawDelegatorReward -| Key | Value | -|------------------|---------------------------| -| delegator | {delegatorAccountAddress} | -| source-validator | {srcOperatorAddress} | +| Key | Value | +|--------------------|-----------------------------| +| `action` | `withdraw_delegator_reward` | +| `category` | `distribution` | +| `delegator` | {delegatorAccountAddress} | +| `source-validator` | {srcOperatorAddress} | -### MsgWithdrawValidatorRewardsAll +### MsgWithdrawValidatorCommission -| Key | Value | -|------------------|----------------------| -| source-validator | {srcOperatorAddress} | +| Key | Value | +|--------------------|---------------------------------| +| `action` | `withdraw_validator_commission` | +| `category` | `distribution` | +| `source-validator` | {srcOperatorAddress} | diff --git a/docs/spec/governance/04_tags.md b/docs/spec/governance/04_tags.md index 6c97a2b49d..a803e248e3 100644 --- a/docs/spec/governance/04_tags.md +++ b/docs/spec/governance/04_tags.md @@ -4,35 +4,38 @@ The governance module emits the following events/tags: ## EndBlocker -| Key | Value | -|-----------------|------------------------------------------------------| -| proposal-result | proposal-passed\|proposal-rejected\|proposal-dropped | +| Key | Value | +|-------------------|------------------------------------------------------------| +| `proposal-result` | `proposal-passed`\|`proposal-rejected`\|`proposal-dropped` | ## Handlers ### MsgSubmitProposal -| Key | Value | -|-------------------------|--------------------------| -| action | proposal-vote | -| proposer | {proposerAccountAddress} | -| proposal-id | {proposalID} | -| voting-period-start [0] | {proposalID} | +| Key | Value | +|---------------------------|--------------------------| +| `action` | `submit_proposal` | +| `category` | `governance` | +| `proposer` | {proposerAccountAddress} | +| `proposal-id` | {proposalID} | +| `voting-period-start` [0] | {proposalID} | * [0] Tag only emitted if the voting period starts during the submission. ### MsgVote -| Key | Value | -|-------------|-----------------------| -| action | proposal-vote | -| voter | {voterAccountAddress} | -| proposal-id | {proposalID} | +| Key | Value | +|---------------|-----------------------| +| `action` | `vote` | +| `category` | `governance` | +| `voter` | {voterAccountAddress} | +| `proposal-id` | {proposalID} | ### MsgDeposit -| Key | Value | -|-------------|---------------------------| -| action | proposal-vote | -| depositor | {depositorAccountAddress} | -| proposal-id | {proposalID} | +| Key | Value | +|---------------|---------------------------| +| `action` | `deposit` | +| `category` | `governance` | +| `depositor` | {depositorAccountAddress} | +| `proposal-id` | {proposalID} | diff --git a/docs/spec/slashing/06_tags.md b/docs/spec/slashing/06_tags.md index a9f2e59d3a..cb4d74bbc1 100644 --- a/docs/spec/slashing/06_tags.md +++ b/docs/spec/slashing/06_tags.md @@ -6,7 +6,8 @@ The slashing module emits the following events/tags: ### MsgUnjail -| Key | Value | -|-----------|----------------------------| -| action | validator-unjailed | -| validator | {validatorOperatorAddress} | +| Key | Value | +|-------------|----------------------------| +| `action` | `unjail` | +| `category` | `slashing` | +| `validator` | {validatorOperatorAddress} | diff --git a/docs/spec/staking/06_tags.md b/docs/spec/staking/06_tags.md index c2efd3b377..32f74364d1 100644 --- a/docs/spec/staking/06_tags.md +++ b/docs/spec/staking/06_tags.md @@ -4,55 +4,62 @@ The staking module emits the following events/tags: ## EndBlocker -| Key | Value | -|-----------------------|-------------------------------------------| -| action | complete-unbonding\|complete-redelegation | -| delegator | {delegatorAccountAddress} | -| source-validator | {srcOperatorAddress} | -| destination-validator | {dstOperatorAddress} | +| Key | Value | +|-------------------------|-----------------------------------------------| +| `action` | `complete-unbonding`\|`complete-redelegation` | +| `category` | `staking` | +| `delegator` | {delegatorAccountAddress} | +| `source-validator` | {srcOperatorAddress} | +| `destination-validator` | {dstOperatorAddress} | ## Handlers ### MsgCreateValidator -| Key | Value | -|-----------------------|----------------------| -| destination-validator | {dstOperatorAddress} | -| moniker | {validatorMoniker} | -| identity | {validatorIdentity} | +| Key | Value | +|-------------------------|----------------------| +| `action` | `create_validator` | +| `category` | `staking` | +| `destination-validator` | {dstOperatorAddress} | ### MsgEditValidator -| Key | Value | -|-----------------------|----------------------| -| destination-validator | {dstOperatorAddress} | -| moniker | {validatorMoniker} | -| identity | {validatorIdentity} | +| Key | Value | +|-------------------------|----------------------| +| `action` | `edit_validator` | +| `category` | `staking` | +| `destination-validator` | {dstOperatorAddress} | ### MsgDelegate -| Key | Value | -|-----------------------|-------------------------------------------| -| delegator | {delegatorAccountAddress} | -| destination-validator | {dstOperatorAddress} | +| Key | Value | +|-------------------------|---------------------------| +| `action` | `delegate` | +| `category` | `staking` | +| `delegator` | {delegatorAccountAddress} | +| `destination-validator` | {dstOperatorAddress} | ### MsgBeginRedelegate -| Key | Value | -|-----------------------|-------------------------------------------| -| delegator | {delegatorAccountAddress} | -| source-validator | {srcOperatorAddress} | -| destination-validator | {dstOperatorAddress} | -| end-time [0] | {delegationFinishTime} | +| Key | Value | +|-------------------------|---------------------------| +| `action` | `begin_redelegate` | +| `category` | `staking` | +| `delegator` | {delegatorAccountAddress} | +| `source-validator` | {srcOperatorAddress} | +| `destination-validator` | {dstOperatorAddress} | +| `end-time` [0] | {delegationFinishTime} | * [0] Time is formatted in the RFC3339 standard ### MsgUndelegate -| Key | Value | -|------------------|---------------------------| -| delegator | {delegatorAccountAddress} | -| source-validator | {srcOperatorAddress} | -| end-time [0] | {delegationFinishTime} | +| Key | Value | +|--------------------|---------------------------| +| `action` | `begin_unbonding` | +| `category` | `staking` | +| `delegator` | {delegatorAccountAddress} | +| `source-validator` | {srcOperatorAddress} | +| `end-time` [0] | {delegationFinishTime} | * [0] Time is formatted in the RFC3339 standard diff --git a/types/tags.go b/types/tags.go index a6726200e5..aa98eddba8 100644 --- a/types/tags.go +++ b/types/tags.go @@ -71,6 +71,7 @@ func MakeTag(k string, v string) Tag { // common tags var ( TagAction = "action" + TagCategory = "category" TagSrcValidator = "source-validator" TagDstValidator = "destination-validator" TagDelegator = "delegator" diff --git a/x/bank/handler.go b/x/bank/handler.go index e587381351..ca8654feb6 100644 --- a/x/bank/handler.go +++ b/x/bank/handler.go @@ -2,6 +2,7 @@ package bank import ( sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/bank/tags" ) // NewHandler returns a handler for "bank" type messages. @@ -24,13 +25,19 @@ func handleMsgSend(ctx sdk.Context, k Keeper, msg MsgSend) sdk.Result { if !k.GetSendEnabled(ctx) { return ErrSendDisabled(k.Codespace()).Result() } - tags, err := k.SendCoins(ctx, msg.FromAddress, msg.ToAddress, msg.Amount) + err := k.SendCoins(ctx, msg.FromAddress, msg.ToAddress, msg.Amount) if err != nil { return err.Result() } + resTags := sdk.NewTags( + tags.Category, tags.TxCategory, + tags.Sender, msg.FromAddress.String(), + tags.Recipient, msg.ToAddress.String(), + ) + return sdk.Result{ - Tags: tags, + Tags: resTags, } } @@ -40,12 +47,13 @@ func handleMsgMultiSend(ctx sdk.Context, k Keeper, msg MsgMultiSend) sdk.Result if !k.GetSendEnabled(ctx) { return ErrSendDisabled(k.Codespace()).Result() } - tags, err := k.InputOutputCoins(ctx, msg.Inputs, msg.Outputs) + resTags, err := k.InputOutputCoins(ctx, msg.Inputs, msg.Outputs) if err != nil { return err.Result() } + resTags = resTags.AppendTag(tags.Category, tags.TxCategory) return sdk.Result{ - Tags: tags, + Tags: resTags, } } diff --git a/x/bank/keeper.go b/x/bank/keeper.go index c5322ec5c7..05a5b3d6e3 100644 --- a/x/bank/keeper.go +++ b/x/bank/keeper.go @@ -6,6 +6,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/auth" + "github.com/cosmos/cosmos-sdk/x/bank/tags" "github.com/cosmos/cosmos-sdk/x/params" ) @@ -17,8 +18,8 @@ type Keeper interface { SendKeeper SetCoins(ctx sdk.Context, addr sdk.AccAddress, amt sdk.Coins) sdk.Error - SubtractCoins(ctx sdk.Context, addr sdk.AccAddress, amt sdk.Coins) (sdk.Coins, sdk.Tags, sdk.Error) - AddCoins(ctx sdk.Context, addr sdk.AccAddress, amt sdk.Coins) (sdk.Coins, sdk.Tags, sdk.Error) + SubtractCoins(ctx sdk.Context, addr sdk.AccAddress, amt sdk.Coins) (sdk.Coins, sdk.Error) + AddCoins(ctx sdk.Context, addr sdk.AccAddress, amt sdk.Coins) (sdk.Coins, sdk.Error) InputOutputCoins(ctx sdk.Context, inputs []Input, outputs []Output) (sdk.Tags, sdk.Error) DelegateCoins(ctx sdk.Context, addr sdk.AccAddress, amt sdk.Coins) (sdk.Tags, sdk.Error) @@ -60,10 +61,10 @@ func (keeper BaseKeeper) SetCoins( // SubtractCoins subtracts amt from the coins at the addr. func (keeper BaseKeeper) SubtractCoins( ctx sdk.Context, addr sdk.AccAddress, amt sdk.Coins, -) (sdk.Coins, sdk.Tags, sdk.Error) { +) (sdk.Coins, sdk.Error) { if !amt.IsValid() { - return nil, nil, sdk.ErrInvalidCoins(amt.String()) + return nil, sdk.ErrInvalidCoins(amt.String()) } return subtractCoins(ctx, keeper.ak, addr, amt) } @@ -71,10 +72,10 @@ func (keeper BaseKeeper) SubtractCoins( // AddCoins adds amt to the coins at the addr. func (keeper BaseKeeper) AddCoins( ctx sdk.Context, addr sdk.AccAddress, amt sdk.Coins, -) (sdk.Coins, sdk.Tags, sdk.Error) { +) (sdk.Coins, sdk.Error) { if !amt.IsValid() { - return nil, nil, sdk.ErrInvalidCoins(amt.String()) + return nil, sdk.ErrInvalidCoins(amt.String()) } return addCoins(ctx, keeper.ak, addr, amt) } @@ -119,7 +120,7 @@ func (keeper BaseKeeper) UndelegateCoins( type SendKeeper interface { ViewKeeper - SendCoins(ctx sdk.Context, fromAddr sdk.AccAddress, toAddr sdk.AccAddress, amt sdk.Coins) (sdk.Tags, sdk.Error) + SendCoins(ctx sdk.Context, fromAddr sdk.AccAddress, toAddr sdk.AccAddress, amt sdk.Coins) sdk.Error GetSendEnabled(ctx sdk.Context) bool SetSendEnabled(ctx sdk.Context, enabled bool) @@ -150,10 +151,10 @@ func NewBaseSendKeeper(ak auth.AccountKeeper, // SendCoins moves coins from one account to another func (keeper BaseSendKeeper) SendCoins( ctx sdk.Context, fromAddr sdk.AccAddress, toAddr sdk.AccAddress, amt sdk.Coins, -) (sdk.Tags, sdk.Error) { +) sdk.Error { if !amt.IsValid() { - return nil, sdk.ErrInvalidCoins(amt.String()) + return sdk.ErrInvalidCoins(amt.String()) } return sendCoins(ctx, keeper.ak, fromAddr, toAddr, amt) } @@ -249,10 +250,10 @@ func setAccount(ctx sdk.Context, ak auth.AccountKeeper, acc auth.Account) { // subtractCoins subtracts amt coins from an account with the given address addr. // // CONTRACT: If the account is a vesting account, the amount has to be spendable. -func subtractCoins(ctx sdk.Context, ak auth.AccountKeeper, addr sdk.AccAddress, amt sdk.Coins) (sdk.Coins, sdk.Tags, sdk.Error) { +func subtractCoins(ctx sdk.Context, ak auth.AccountKeeper, addr sdk.AccAddress, amt sdk.Coins) (sdk.Coins, sdk.Error) { if !amt.IsValid() { - return nil, nil, sdk.ErrInvalidCoins(amt.String()) + return nil, sdk.ErrInvalidCoins(amt.String()) } oldCoins, spendableCoins := sdk.NewCoins(), sdk.NewCoins() @@ -267,59 +268,57 @@ func subtractCoins(ctx sdk.Context, ak auth.AccountKeeper, addr sdk.AccAddress, // So the check here is sufficient instead of subtracting from oldCoins. _, hasNeg := spendableCoins.SafeSub(amt) if hasNeg { - return amt, nil, sdk.ErrInsufficientCoins( + return amt, sdk.ErrInsufficientCoins( fmt.Sprintf("insufficient account funds; %s < %s", spendableCoins, amt), ) } newCoins := oldCoins.Sub(amt) // should not panic as spendable coins was already checked err := setCoins(ctx, ak, addr, newCoins) - tags := sdk.NewTags(TagKeySender, addr.String()) - return newCoins, tags, err + return newCoins, err } // AddCoins adds amt to the coins at the addr. -func addCoins(ctx sdk.Context, am auth.AccountKeeper, addr sdk.AccAddress, amt sdk.Coins) (sdk.Coins, sdk.Tags, sdk.Error) { +func addCoins(ctx sdk.Context, am auth.AccountKeeper, addr sdk.AccAddress, amt sdk.Coins) (sdk.Coins, sdk.Error) { if !amt.IsValid() { - return nil, nil, sdk.ErrInvalidCoins(amt.String()) + return nil, sdk.ErrInvalidCoins(amt.String()) } oldCoins := getCoins(ctx, am, addr) newCoins := oldCoins.Add(amt) if newCoins.IsAnyNegative() { - return amt, nil, sdk.ErrInsufficientCoins( + return amt, sdk.ErrInsufficientCoins( fmt.Sprintf("insufficient account funds; %s < %s", oldCoins, amt), ) } err := setCoins(ctx, am, addr, newCoins) - tags := sdk.NewTags(TagKeyRecipient, addr.String()) - return newCoins, tags, err + return newCoins, err } // SendCoins moves coins from one account to another // Returns ErrInvalidCoins if amt is invalid. -func sendCoins(ctx sdk.Context, am auth.AccountKeeper, fromAddr sdk.AccAddress, toAddr sdk.AccAddress, amt sdk.Coins) (sdk.Tags, sdk.Error) { +func sendCoins(ctx sdk.Context, am auth.AccountKeeper, fromAddr sdk.AccAddress, toAddr sdk.AccAddress, amt sdk.Coins) sdk.Error { // Safety check ensuring that when sending coins the keeper must maintain the if !amt.IsValid() { - return nil, sdk.ErrInvalidCoins(amt.String()) + return sdk.ErrInvalidCoins(amt.String()) } - _, subTags, err := subtractCoins(ctx, am, fromAddr, amt) + _, err := subtractCoins(ctx, am, fromAddr, amt) if err != nil { - return nil, err + return err } - _, addTags, err := addCoins(ctx, am, toAddr, amt) + _, err = addCoins(ctx, am, toAddr, amt) if err != nil { - return nil, err + return err } - return subTags.AppendTags(addTags), nil + return nil } // InputOutputCoins handles a list of inputs and outputs @@ -334,19 +333,24 @@ func inputOutputCoins(ctx sdk.Context, am auth.AccountKeeper, inputs []Input, ou allTags := sdk.EmptyTags() for _, in := range inputs { - _, tags, err := subtractCoins(ctx, am, in.Address, in.Coins) + _, err := subtractCoins(ctx, am, in.Address, in.Coins) if err != nil { return nil, err } - allTags = allTags.AppendTags(tags) + + allTags = allTags.AppendTag( + tags.Sender, in.Address.String(), + ) } for _, out := range outputs { - _, tags, err := addCoins(ctx, am, out.Address, out.Coins) + _, err := addCoins(ctx, am, out.Address, out.Coins) if err != nil { return nil, err } - allTags = allTags.AppendTags(tags) + allTags = allTags.AppendTag( + tags.Recipient, out.Address.String(), + ) } return allTags, nil @@ -381,8 +385,8 @@ func delegateCoins( setAccount(ctx, ak, acc) return sdk.NewTags( - sdk.TagAction, TagActionDelegateCoins, - sdk.TagDelegator, []byte(addr.String()), + sdk.TagAction, tags.ActionDelegateCoins, + sdk.TagDelegator, addr.String(), ), nil } @@ -406,8 +410,8 @@ func undelegateCoins( setAccount(ctx, ak, acc) return sdk.NewTags( - sdk.TagAction, TagActionUndelegateCoins, - sdk.TagDelegator, []byte(addr.String()), + sdk.TagAction, tags.ActionUndelegateCoins, + sdk.TagDelegator, addr.String(), ), nil } diff --git a/x/bank/keeper_test.go b/x/bank/keeper_test.go index ee8e7e6556..28db4a3dcc 100644 --- a/x/bank/keeper_test.go +++ b/x/bank/keeper_test.go @@ -101,7 +101,7 @@ func TestKeeper(t *testing.T) { require.True(t, bankKeeper.GetCoins(ctx, addr).IsEqual(sdk.NewCoins(sdk.NewInt64Coin("foocoin", 10)))) require.True(t, bankKeeper.GetCoins(ctx, addr2).IsEqual(sdk.NewCoins(sdk.NewInt64Coin("foocoin", 5)))) - _, err2 := bankKeeper.SendCoins(ctx, addr, addr2, sdk.NewCoins(sdk.NewInt64Coin("foocoin", 50))) + err2 := bankKeeper.SendCoins(ctx, addr, addr2, sdk.NewCoins(sdk.NewInt64Coin("foocoin", 50))) require.Implements(t, (*sdk.Error)(nil), err2) require.True(t, bankKeeper.GetCoins(ctx, addr).IsEqual(sdk.NewCoins(sdk.NewInt64Coin("foocoin", 10)))) require.True(t, bankKeeper.GetCoins(ctx, addr2).IsEqual(sdk.NewCoins(sdk.NewInt64Coin("foocoin", 5)))) @@ -165,7 +165,7 @@ func TestSendKeeper(t *testing.T) { require.True(t, sendKeeper.GetCoins(ctx, addr).IsEqual(sdk.NewCoins(sdk.NewInt64Coin("foocoin", 10)))) require.True(t, sendKeeper.GetCoins(ctx, addr2).IsEqual(sdk.NewCoins(sdk.NewInt64Coin("foocoin", 5)))) - _, err := sendKeeper.SendCoins(ctx, addr, addr2, sdk.NewCoins(sdk.NewInt64Coin("foocoin", 50))) + err := sendKeeper.SendCoins(ctx, addr, addr2, sdk.NewCoins(sdk.NewInt64Coin("foocoin", 50))) require.Implements(t, (*sdk.Error)(nil), err) require.True(t, sendKeeper.GetCoins(ctx, addr).IsEqual(sdk.NewCoins(sdk.NewInt64Coin("foocoin", 10)))) require.True(t, sendKeeper.GetCoins(ctx, addr2).IsEqual(sdk.NewCoins(sdk.NewInt64Coin("foocoin", 5)))) @@ -178,7 +178,7 @@ func TestSendKeeper(t *testing.T) { // validate coins with invalid denoms or negative values cannot be sent // NOTE: We must use the Coin literal as the constructor does not allow // negative values. - _, err = sendKeeper.SendCoins(ctx, addr, addr2, sdk.Coins{sdk.Coin{"FOOCOIN", sdk.NewInt(-5)}}) + err = sendKeeper.SendCoins(ctx, addr, addr2, sdk.Coins{sdk.Coin{"FOOCOIN", sdk.NewInt(-5)}}) require.Error(t, err) } @@ -226,7 +226,7 @@ func TestVestingAccountSend(t *testing.T) { input.ak.SetAccount(ctx, vacc) // require that no coins be sendable at the beginning of the vesting schedule - _, err := bankKeeper.SendCoins(ctx, addr1, addr2, sendCoins) + err := bankKeeper.SendCoins(ctx, addr1, addr2, sendCoins) require.Error(t, err) // receive some coins @@ -235,7 +235,7 @@ func TestVestingAccountSend(t *testing.T) { // require that all vested coins are spendable plus any received ctx = ctx.WithBlockTime(now.Add(12 * time.Hour)) - _, err = bankKeeper.SendCoins(ctx, addr1, addr2, sendCoins) + err = bankKeeper.SendCoins(ctx, addr1, addr2, sendCoins) vacc = input.ak.GetAccount(ctx, addr1).(*auth.ContinuousVestingAccount) require.NoError(t, err) require.Equal(t, origCoins, vacc.GetCoins()) diff --git a/x/bank/tags.go b/x/bank/tags.go deleted file mode 100644 index 264d893097..0000000000 --- a/x/bank/tags.go +++ /dev/null @@ -1,10 +0,0 @@ -package bank - -// Tag keys and values -var ( - TagActionUndelegateCoins = []byte("undelegateCoins") - TagActionDelegateCoins = []byte("delegateCoins") - - TagKeyRecipient = "recipient" - TagKeySender = "sender" -) diff --git a/x/bank/tags/tags.go b/x/bank/tags/tags.go new file mode 100644 index 0000000000..b458681833 --- /dev/null +++ b/x/bank/tags/tags.go @@ -0,0 +1,17 @@ +package tags + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" +) + +// Tag keys and values +var ( + ActionUndelegateCoins = "undelegateCoins" + ActionDelegateCoins = "delegateCoins" + TxCategory = "bank" + + Action = sdk.TagAction + Category = sdk.TagCategory + Recipient = "recipient" + Sender = "sender" +) diff --git a/x/crisis/expected_keepers.go b/x/crisis/expected_keepers.go index e620bdd3aa..9e505ca4c7 100644 --- a/x/crisis/expected_keepers.go +++ b/x/crisis/expected_keepers.go @@ -16,5 +16,5 @@ type FeeCollectionKeeper interface { // expected bank keeper type BankKeeper interface { - SubtractCoins(ctx sdk.Context, addr sdk.AccAddress, amt sdk.Coins) (sdk.Coins, sdk.Tags, sdk.Error) + SubtractCoins(ctx sdk.Context, addr sdk.AccAddress, amt sdk.Coins) (sdk.Coins, sdk.Error) } diff --git a/x/crisis/handler.go b/x/crisis/handler.go index ae753804d1..0f69dbc27b 100644 --- a/x/crisis/handler.go +++ b/x/crisis/handler.go @@ -26,7 +26,7 @@ func handleMsgVerifyInvariant(ctx sdk.Context, msg MsgVerifyInvariant, k Keeper) // remove the constant fee constantFee := sdk.NewCoins(k.GetConstantFee(ctx)) - _, _, err := k.bankKeeper.SubtractCoins(ctx, msg.Sender, constantFee) + _, err := k.bankKeeper.SubtractCoins(ctx, msg.Sender, constantFee) if err != nil { return err.Result() } diff --git a/x/distribution/handler.go b/x/distribution/handler.go index 081baa869f..782aa02773 100644 --- a/x/distribution/handler.go +++ b/x/distribution/handler.go @@ -32,11 +32,12 @@ func handleMsgModifyWithdrawAddress(ctx sdk.Context, msg types.MsgSetWithdrawAdd return err.Result() } - tags := sdk.NewTags( - tags.Delegator, []byte(msg.DelegatorAddress.String()), + resTags := sdk.NewTags( + tags.Category, tags.TxCategory, + tags.Delegator, msg.DelegatorAddress.String(), ) return sdk.Result{ - Tags: tags, + Tags: resTags, } } @@ -47,12 +48,13 @@ func handleMsgWithdrawDelegatorReward(ctx sdk.Context, msg types.MsgWithdrawDele return err.Result() } - tags := sdk.NewTags( - tags.Delegator, []byte(msg.DelegatorAddress.String()), - tags.Validator, []byte(msg.ValidatorAddress.String()), + resTags := sdk.NewTags( + tags.Category, tags.TxCategory, + tags.Delegator, msg.DelegatorAddress.String(), + tags.Validator, msg.ValidatorAddress.String(), ) return sdk.Result{ - Tags: tags, + Tags: resTags, } } @@ -63,10 +65,11 @@ func handleMsgWithdrawValidatorCommission(ctx sdk.Context, msg types.MsgWithdraw return err.Result() } - tags := sdk.NewTags( - tags.Validator, []byte(msg.ValidatorAddress.String()), + resTags := sdk.NewTags( + tags.Category, tags.TxCategory, + tags.Validator, msg.ValidatorAddress.String(), ) return sdk.Result{ - Tags: tags, + Tags: resTags, } } diff --git a/x/distribution/keeper/delegation.go b/x/distribution/keeper/delegation.go index f6d9bdc280..0bbe091519 100644 --- a/x/distribution/keeper/delegation.go +++ b/x/distribution/keeper/delegation.go @@ -140,7 +140,7 @@ func (k Keeper) withdrawDelegationRewards(ctx sdk.Context, val sdk.Validator, de // add coins to user account if !coins.IsZero() { withdrawAddr := k.GetDelegatorWithdrawAddr(ctx, del.GetDelegatorAddr()) - if _, _, err := k.bankKeeper.AddCoins(ctx, withdrawAddr, coins); err != nil { + if _, err := k.bankKeeper.AddCoins(ctx, withdrawAddr, coins); err != nil { return err } } diff --git a/x/distribution/keeper/fee_pool.go b/x/distribution/keeper/fee_pool.go index d8e6998db5..779a58d139 100644 --- a/x/distribution/keeper/fee_pool.go +++ b/x/distribution/keeper/fee_pool.go @@ -15,7 +15,7 @@ func (k Keeper) DistributeFeePool(ctx sdk.Context, amount sdk.Coins, receiveAddr } feePool.CommunityPool.Sub(sdk.NewDecCoins(amount)) - _, _, err := k.bankKeeper.AddCoins(ctx, receiveAddr, amount) + _, err := k.bankKeeper.AddCoins(ctx, receiveAddr, amount) if err != nil { return err } diff --git a/x/distribution/keeper/hooks.go b/x/distribution/keeper/hooks.go index 1ce7a1fd63..022c8d943c 100644 --- a/x/distribution/keeper/hooks.go +++ b/x/distribution/keeper/hooks.go @@ -46,7 +46,7 @@ func (h Hooks) AfterValidatorRemoved(ctx sdk.Context, _ sdk.ConsAddress, valAddr accAddr := sdk.AccAddress(valAddr) withdrawAddr := h.k.GetDelegatorWithdrawAddr(ctx, accAddr) - if _, _, err := h.k.bankKeeper.AddCoins(ctx, withdrawAddr, coins); err != nil { + if _, err := h.k.bankKeeper.AddCoins(ctx, withdrawAddr, coins); err != nil { panic(err) } } diff --git a/x/distribution/keeper/keeper.go b/x/distribution/keeper/keeper.go index 5741893aa3..2d1439dca0 100644 --- a/x/distribution/keeper/keeper.go +++ b/x/distribution/keeper/keeper.go @@ -89,7 +89,7 @@ func (k Keeper) WithdrawValidatorCommission(ctx sdk.Context, valAddr sdk.ValAddr accAddr := sdk.AccAddress(valAddr) withdrawAddr := k.GetDelegatorWithdrawAddr(ctx, accAddr) - if _, _, err := k.bankKeeper.AddCoins(ctx, withdrawAddr, coins); err != nil { + if _, err := k.bankKeeper.AddCoins(ctx, withdrawAddr, coins); err != nil { return err } } diff --git a/x/distribution/keeper/test_common.go b/x/distribution/keeper/test_common.go index 032cd3dfa3..c21d6a8d2c 100644 --- a/x/distribution/keeper/test_common.go +++ b/x/distribution/keeper/test_common.go @@ -123,7 +123,7 @@ func CreateTestInputAdvanced(t *testing.T, isCheckTx bool, initPower int64, // fill all the addresses with some coins, set the loose pool tokens simultaneously for _, addr := range TestAddrs { pool := sk.GetPool(ctx) - _, _, err := bankKeeper.AddCoins(ctx, addr, sdk.Coins{ + _, err := bankKeeper.AddCoins(ctx, addr, sdk.Coins{ sdk.NewCoin(sk.GetParams(ctx).BondDenom, initCoins), }) require.Nil(t, err) diff --git a/x/distribution/tags/tags.go b/x/distribution/tags/tags.go index 21628daedb..5d9fc070d2 100644 --- a/x/distribution/tags/tags.go +++ b/x/distribution/tags/tags.go @@ -1,4 +1,3 @@ -// nolint package tags import ( @@ -6,6 +5,9 @@ import ( ) var ( + TxCategory = "distribution" + Validator = sdk.TagSrcValidator Delegator = sdk.TagDelegator + Category = sdk.TagCategory ) diff --git a/x/distribution/types/expected_keepers.go b/x/distribution/types/expected_keepers.go index 4c09613290..9d2c6a4e53 100644 --- a/x/distribution/types/expected_keepers.go +++ b/x/distribution/types/expected_keepers.go @@ -20,7 +20,7 @@ type StakingKeeper interface { // expected coin keeper type BankKeeper interface { - AddCoins(ctx sdk.Context, addr sdk.AccAddress, amt sdk.Coins) (sdk.Coins, sdk.Tags, sdk.Error) + AddCoins(ctx sdk.Context, addr sdk.AccAddress, amt sdk.Coins) (sdk.Coins, sdk.Error) } // expected fee collection keeper diff --git a/x/distribution/types/msg.go b/x/distribution/types/msg.go index 2f773d4732..4e39aaedb2 100644 --- a/x/distribution/types/msg.go +++ b/x/distribution/types/msg.go @@ -96,7 +96,7 @@ func NewMsgWithdrawValidatorCommission(valAddr sdk.ValAddress) MsgWithdrawValida } func (msg MsgWithdrawValidatorCommission) Route() string { return ModuleName } -func (msg MsgWithdrawValidatorCommission) Type() string { return "withdraw_validator_rewards_all" } +func (msg MsgWithdrawValidatorCommission) Type() string { return "withdraw_validator_commission" } // Return address that must sign over msg.GetSignBytes() func (msg MsgWithdrawValidatorCommission) GetSigners() []sdk.AccAddress { diff --git a/x/gov/expected_keepers.go b/x/gov/expected_keepers.go index 513c08ca07..bc80bcedcb 100644 --- a/x/gov/expected_keepers.go +++ b/x/gov/expected_keepers.go @@ -7,6 +7,6 @@ type BankKeeper interface { GetCoins(ctx sdk.Context, addr sdk.AccAddress) sdk.Coins // TODO remove once governance doesn't require use of accounts - SendCoins(ctx sdk.Context, fromAddr sdk.AccAddress, toAddr sdk.AccAddress, amt sdk.Coins) (sdk.Tags, sdk.Error) + SendCoins(ctx sdk.Context, fromAddr sdk.AccAddress, toAddr sdk.AccAddress, amt sdk.Coins) sdk.Error SetSendEnabled(ctx sdk.Context, enabled bool) } diff --git a/x/gov/handler.go b/x/gov/handler.go index e51f118951..81592ba38e 100644 --- a/x/gov/handler.go +++ b/x/gov/handler.go @@ -47,8 +47,9 @@ func handleMsgSubmitProposal(ctx sdk.Context, keeper Keeper, msg MsgSubmitPropos } resTags := sdk.NewTags( - tags.Proposer, []byte(msg.Proposer.String()), tags.ProposalID, proposalIDStr, + tags.Category, tags.TxCategory, + tags.Proposer, msg.Proposer.String(), ) if votingStarted { @@ -68,9 +69,11 @@ func handleMsgDeposit(ctx sdk.Context, keeper Keeper, msg MsgDeposit) sdk.Result } proposalIDStr := fmt.Sprintf("%d", msg.ProposalID) + resTags := sdk.NewTags( - tags.Depositor, []byte(msg.Depositor.String()), tags.ProposalID, proposalIDStr, + tags.Category, tags.TxCategory, + tags.Depositor, msg.Depositor.String(), ) if votingStarted { @@ -88,10 +91,13 @@ func handleMsgVote(ctx sdk.Context, keeper Keeper, msg MsgVote) sdk.Result { return err.Result() } + proposalIDStr := fmt.Sprintf("%d", msg.ProposalID) + return sdk.Result{ Tags: sdk.NewTags( + tags.ProposalID, proposalIDStr, + tags.Category, tags.TxCategory, tags.Voter, msg.Voter.String(), - tags.ProposalID, fmt.Sprintf("%d", msg.ProposalID), ), } } diff --git a/x/gov/keeper.go b/x/gov/keeper.go index 46085cf2d9..a2216698bd 100644 --- a/x/gov/keeper.go +++ b/x/gov/keeper.go @@ -382,7 +382,7 @@ func (keeper Keeper) AddDeposit(ctx sdk.Context, proposalID uint64, depositorAdd // Send coins from depositor's account to DepositedCoinsAccAddr account // TODO: Don't use an account for this purpose; it's clumsy and prone to misuse. - _, err := keeper.ck.SendCoins(ctx, depositorAddr, DepositedCoinsAccAddr, depositAmount) + err := keeper.ck.SendCoins(ctx, depositorAddr, DepositedCoinsAccAddr, depositAmount) if err != nil { return err, false } @@ -426,7 +426,7 @@ func (keeper Keeper) RefundDeposits(ctx sdk.Context, proposalID uint64) { deposit := &Deposit{} keeper.cdc.MustUnmarshalBinaryLengthPrefixed(depositsIterator.Value(), deposit) - _, err := keeper.ck.SendCoins(ctx, DepositedCoinsAccAddr, deposit.Depositor, deposit.Amount) + err := keeper.ck.SendCoins(ctx, DepositedCoinsAccAddr, deposit.Depositor, deposit.Amount) if err != nil { panic("should not happen") } @@ -445,7 +445,7 @@ func (keeper Keeper) DeleteDeposits(ctx sdk.Context, proposalID uint64) { keeper.cdc.MustUnmarshalBinaryLengthPrefixed(depositsIterator.Value(), deposit) // TODO: Find a way to do this without using accounts. - _, err := keeper.ck.SendCoins(ctx, DepositedCoinsAccAddr, BurnedDepositCoinsAccAddr, deposit.Amount) + err := keeper.ck.SendCoins(ctx, DepositedCoinsAccAddr, BurnedDepositCoinsAccAddr, deposit.Amount) if err != nil { panic("should not happen") } diff --git a/x/gov/tags/tags.go b/x/gov/tags/tags.go index 6f18b2596b..15e94de7fb 100644 --- a/x/gov/tags/tags.go +++ b/x/gov/tags/tags.go @@ -9,8 +9,10 @@ var ( ActionProposalDropped = "proposal-dropped" ActionProposalPassed = "proposal-passed" ActionProposalRejected = "proposal-rejected" + TxCategory = "governance" Action = sdk.TagAction + Category = sdk.TagCategory Proposer = "proposer" ProposalID = "proposal-id" VotingPeriodStart = "voting-period-start" diff --git a/x/ibc/expected_keepers.go b/x/ibc/expected_keepers.go index f2b65f1624..54b70b4dd8 100644 --- a/x/ibc/expected_keepers.go +++ b/x/ibc/expected_keepers.go @@ -4,6 +4,6 @@ import sdk "github.com/cosmos/cosmos-sdk/types" // expected bank keeper type BankKeeper interface { - AddCoins(ctx sdk.Context, addr sdk.AccAddress, amt sdk.Coins) (sdk.Coins, sdk.Tags, sdk.Error) - SubtractCoins(ctx sdk.Context, addr sdk.AccAddress, amt sdk.Coins) (sdk.Coins, sdk.Tags, sdk.Error) + AddCoins(ctx sdk.Context, addr sdk.AccAddress, amt sdk.Coins) (sdk.Coins, sdk.Error) + SubtractCoins(ctx sdk.Context, addr sdk.AccAddress, amt sdk.Coins) (sdk.Coins, sdk.Error) } diff --git a/x/ibc/handler.go b/x/ibc/handler.go index 7d7bda5759..bdb871ada5 100644 --- a/x/ibc/handler.go +++ b/x/ibc/handler.go @@ -22,7 +22,7 @@ func NewHandler(ibcm Mapper, ck BankKeeper) sdk.Handler { func handleIBCTransferMsg(ctx sdk.Context, ibcm Mapper, ck BankKeeper, msg MsgIBCTransfer) sdk.Result { packet := msg.IBCPacket - _, _, err := ck.SubtractCoins(ctx, packet.SrcAddr, packet.Coins) + _, err := ck.SubtractCoins(ctx, packet.SrcAddr, packet.Coins) if err != nil { return err.Result() } @@ -45,7 +45,7 @@ func handleIBCReceiveMsg(ctx sdk.Context, ibcm Mapper, ck BankKeeper, msg MsgIBC } // XXX Check that packet.Coins is valid and positive (nonzero) - _, _, err := ck.AddCoins(ctx, packet.DestAddr, packet.Coins) + _, err := ck.AddCoins(ctx, packet.DestAddr, packet.Coins) if err != nil { return err.Result() } diff --git a/x/ibc/ibc_test.go b/x/ibc/ibc_test.go index b796b9c63d..286da66fd9 100644 --- a/x/ibc/ibc_test.go +++ b/x/ibc/ibc_test.go @@ -83,7 +83,7 @@ func newAddress() sdk.AccAddress { func getCoins(ck bank.Keeper, ctx sdk.Context, addr sdk.AccAddress) (sdk.Coins, sdk.Error) { zero := sdk.Coins(nil) - coins, _, err := ck.AddCoins(ctx, addr, zero) + coins, err := ck.AddCoins(ctx, addr, zero) return coins, err } @@ -97,7 +97,7 @@ func TestIBC(t *testing.T) { zero := sdk.Coins(nil) mycoins := sdk.Coins{sdk.NewInt64Coin("mycoin", 10)} - coins, _, err := input.bk.AddCoins(ctx, src, mycoins) + coins, err := input.bk.AddCoins(ctx, src, mycoins) require.Nil(t, err) require.Equal(t, mycoins, coins) diff --git a/x/slashing/handler.go b/x/slashing/handler.go index b623ac9b4e..7a04829f75 100644 --- a/x/slashing/handler.go +++ b/x/slashing/handler.go @@ -61,6 +61,7 @@ func handleMsgUnjail(ctx sdk.Context, msg MsgUnjail, k Keeper) sdk.Result { k.validatorSet.Unjail(ctx, consAddr) tags := sdk.NewTags( + tags.Category, tags.TxCategory, tags.Validator, msg.ValidatorAddr.String(), ) diff --git a/x/slashing/tags/tags.go b/x/slashing/tags/tags.go index cb92e3cd66..328324be03 100644 --- a/x/slashing/tags/tags.go +++ b/x/slashing/tags/tags.go @@ -1,6 +1,13 @@ package tags +import ( + sdk "github.com/cosmos/cosmos-sdk/types" +) + // Slashing tags var ( + TxCategory = "slashing" + + Category = sdk.TagCategory Validator = "validator" ) diff --git a/x/slashing/test_common.go b/x/slashing/test_common.go index 13279d614e..19286d23ef 100644 --- a/x/slashing/test_common.go +++ b/x/slashing/test_common.go @@ -81,7 +81,7 @@ func createTestInput(t *testing.T, defaults Params) (sdk.Context, bank.Keeper, s require.Nil(t, err) for _, addr := range addrs { - _, _, err = ck.AddCoins(ctx, sdk.AccAddress(addr), sdk.Coins{ + _, err = ck.AddCoins(ctx, sdk.AccAddress(addr), sdk.Coins{ {sk.GetParams(ctx).BondDenom, initCoins}, }) } diff --git a/x/staking/handler.go b/x/staking/handler.go index 6512ac1ba0..fd8408e27b 100644 --- a/x/staking/handler.go +++ b/x/staking/handler.go @@ -77,6 +77,7 @@ func EndBlocker(ctx sdk.Context, k keeper.Keeper) ([]abci.ValidatorUpdate, sdk.T resTags.AppendTags(sdk.NewTags( tags.Action, tags.ActionCompleteRedelegation, + tags.Category, tags.TxCategory, tags.Delegator, dvvTriplet.DelegatorAddress.String(), tags.SrcValidator, dvvTriplet.ValidatorSrcAddress.String(), tags.DstValidator, dvvTriplet.ValidatorDstAddress.String(), @@ -142,13 +143,14 @@ func handleMsgCreateValidator(ctx sdk.Context, msg types.MsgCreateValidator, k k return err.Result() } - tags := sdk.NewTags( + resTags := sdk.NewTags( + tags.Category, tags.TxCategory, tags.DstValidator, msg.ValidatorAddress.String(), tags.Delegator, msg.DelegatorAddress.String(), ) return sdk.Result{ - Tags: tags, + Tags: resTags, } } @@ -216,6 +218,7 @@ func handleMsgDelegate(ctx sdk.Context, msg types.MsgDelegate, k keeper.Keeper) } resTags := sdk.NewTags( + tags.Category, tags.TxCategory, tags.Delegator, msg.DelegatorAddress.String(), tags.DstValidator, msg.ValidatorAddress.String(), ) @@ -240,6 +243,7 @@ func handleMsgUndelegate(ctx sdk.Context, msg types.MsgUndelegate, k keeper.Keep finishTime := types.MsgCdc.MustMarshalBinaryLengthPrefixed(completionTime) resTags := sdk.NewTags( + tags.Category, tags.TxCategory, tags.Delegator, msg.DelegatorAddress.String(), tags.SrcValidator, msg.ValidatorAddress.String(), tags.EndTime, completionTime.Format(time.RFC3339), @@ -265,6 +269,7 @@ func handleMsgBeginRedelegate(ctx sdk.Context, msg types.MsgBeginRedelegate, k k finishTime := types.MsgCdc.MustMarshalBinaryLengthPrefixed(completionTime) resTags := sdk.NewTags( + tags.Category, tags.TxCategory, tags.Delegator, msg.DelegatorAddress.String(), tags.SrcValidator, msg.ValidatorSrcAddress.String(), tags.DstValidator, msg.ValidatorDstAddress.String(), diff --git a/x/staking/keeper/test_common.go b/x/staking/keeper/test_common.go index 8edbe8e367..9b5c442f12 100644 --- a/x/staking/keeper/test_common.go +++ b/x/staking/keeper/test_common.go @@ -131,7 +131,7 @@ func CreateTestInput(t *testing.T, isCheckTx bool, initPower int64) (sdk.Context pool := keeper.GetPool(ctx) err := error(nil) if !initCoins.IsZero() { - _, _, err = ck.AddCoins(ctx, addr, sdk.Coins{ + _, err = ck.AddCoins(ctx, addr, sdk.Coins{ {keeper.BondDenom(ctx), initCoins}, }) } diff --git a/x/staking/tags/tags.go b/x/staking/tags/tags.go index 55be61848e..442a84ecf5 100644 --- a/x/staking/tags/tags.go +++ b/x/staking/tags/tags.go @@ -8,8 +8,10 @@ import ( var ( ActionCompleteUnbonding = "complete-unbonding" ActionCompleteRedelegation = "complete-redelegation" + TxCategory = "staking" Action = sdk.TagAction + Category = sdk.TagCategory SrcValidator = sdk.TagSrcValidator DstValidator = sdk.TagDstValidator Delegator = sdk.TagDelegator From 02a0e393c54d1cded270de2490ea2cd17b0e610b Mon Sep 17 00:00:00 2001 From: frog power 4000 Date: Tue, 9 Apr 2019 21:34:38 -0400 Subject: [PATCH 13/47] Run missing invariants during simulations (#4080) --- .pending/improvements/gaia/4080-add-missing-inv | 1 + cmd/gaia/app/sim_test.go | 7 +------ x/crisis/keeper.go | 11 +++++++++++ x/simulation/util.go | 16 ++++++++++++++++ 4 files changed, 29 insertions(+), 6 deletions(-) create mode 100644 .pending/improvements/gaia/4080-add-missing-inv diff --git a/.pending/improvements/gaia/4080-add-missing-inv b/.pending/improvements/gaia/4080-add-missing-inv new file mode 100644 index 0000000000..48c8172da0 --- /dev/null +++ b/.pending/improvements/gaia/4080-add-missing-inv @@ -0,0 +1 @@ +#4080 add missing invariants during simulations \ No newline at end of file diff --git a/cmd/gaia/app/sim_test.go b/cmd/gaia/app/sim_test.go index 247cc262a3..7c6a2886de 100644 --- a/cmd/gaia/app/sim_test.go +++ b/cmd/gaia/app/sim_test.go @@ -293,12 +293,7 @@ func testAndRunTxs(app *GaiaApp) []simulation.WeightedOperation { } func invariants(app *GaiaApp) []sdk.Invariant { - return []sdk.Invariant{ - simulation.PeriodicInvariant(bank.NonnegativeBalanceInvariant(app.accountKeeper), period, 0), - simulation.PeriodicInvariant(distr.AllInvariants(app.distrKeeper, app.stakingKeeper), period, 0), - simulation.PeriodicInvariant(staking.AllInvariants(app.stakingKeeper, app.feeCollectionKeeper, - 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. diff --git a/x/crisis/keeper.go b/x/crisis/keeper.go index 8501b08ee0..95c7cf09c1 100644 --- a/x/crisis/keeper.go +++ b/x/crisis/keeper.go @@ -39,3 +39,14 @@ func (k *Keeper) RegisterRoute(moduleName, route string, invar sdk.Invariant) { func (k Keeper) Routes() []InvarRoute { return k.routes } + +// Invariants returns all the registered Crisis keeper invariants. +func (k Keeper) Invariants() []sdk.Invariant { + var invars []sdk.Invariant + for _, route := range k.routes { + invars = append(invars, route.Invar) + } + return invars +} + +// DONTCOVER diff --git a/x/simulation/util.go b/x/simulation/util.go index 3dc75c4390..3badf25a9a 100644 --- a/x/simulation/util.go +++ b/x/simulation/util.go @@ -75,3 +75,19 @@ func PeriodicInvariant(invariant sdk.Invariant, period int, offset int) sdk.Inva return nil } } + +// PeriodicInvariants returns an array of wrapped Invariants. Where each +// invariant function is only executed periodically defined by period and offset. +func PeriodicInvariants(invariants []sdk.Invariant, period int, offset int) []sdk.Invariant { + var outInvariants []sdk.Invariant + for _, invariant := range invariants { + outInvariant := func(ctx sdk.Context) error { + if int(ctx.BlockHeight())%period == offset { + return invariant(ctx) + } + return nil + } + outInvariants = append(outInvariants, outInvariant) + } + return outInvariants +} From eb51a6f84b41c3aa672e872608f28b4998400898 Mon Sep 17 00:00:00 2001 From: Federico Kunze <31522760+fedekunze@users.noreply.github.com> Date: Wed, 10 Apr 2019 14:10:44 +0200 Subject: [PATCH 14/47] remove duplicated account check and test (#4068) --- .../3426-remove-redundant-account-check | 1 + cmd/gaia/cli_test/cli_test.go | 11 ++++++++ x/bank/client/cli/sendtx.go | 11 -------- x/gov/client/cli/tx.go | 25 ++----------------- 4 files changed, 14 insertions(+), 34 deletions(-) create mode 100644 .pending/improvements/gaiacli/3426-remove-redundant-account-check diff --git a/.pending/improvements/gaiacli/3426-remove-redundant-account-check b/.pending/improvements/gaiacli/3426-remove-redundant-account-check new file mode 100644 index 0000000000..adf96e7675 --- /dev/null +++ b/.pending/improvements/gaiacli/3426-remove-redundant-account-check @@ -0,0 +1 @@ +#4068 Remove redundant account check on `gaiacli` diff --git a/cmd/gaia/cli_test/cli_test.go b/cmd/gaia/cli_test/cli_test.go index a245e9e515..1aa52816b7 100644 --- a/cmd/gaia/cli_test/cli_test.go +++ b/cmd/gaia/cli_test/cli_test.go @@ -224,6 +224,17 @@ func TestGaiaCLISend(t *testing.T) { success, _, _ := f.TxSend(keyFoo, barAddr, sdk.NewCoin(denom, sendTokens), "--dry-run") require.True(t, success) + // Test --generate-only + success, stdout, stderr := f.TxSend( + fooAddr.String(), barAddr, sdk.NewCoin(denom, sendTokens), "--generate-only=true", + ) + require.Empty(t, stderr) + require.True(t, success) + msg := unmarshalStdTx(f.T, stdout) + require.NotZero(t, msg.Fee.Gas) + require.Len(t, msg.Msgs, 1) + require.Len(t, msg.GetSignatures(), 0) + // Check state didn't change fooAcc = f.QueryAccount(fooAddr) require.Equal(t, startTokens.Sub(sendTokens), fooAcc.GetCoins().AmountOf(denom)) diff --git a/x/bank/client/cli/sendtx.go b/x/bank/client/cli/sendtx.go index 2f1d45b95a..bfdebb3cda 100644 --- a/x/bank/client/cli/sendtx.go +++ b/x/bank/client/cli/sendtx.go @@ -1,8 +1,6 @@ package cli import ( - "fmt" - "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/context" "github.com/cosmos/cosmos-sdk/client/utils" @@ -47,15 +45,6 @@ func SendTxCmd(cdc *codec.Codec) *cobra.Command { } from := cliCtx.GetFromAddress() - account, err := cliCtx.GetAccount(from) - if err != nil { - return err - } - - // ensure account has enough coins - if !account.GetCoins().IsAllGTE(coins) { - return fmt.Errorf("address %s doesn't have enough coins to pay for this transaction", from) - } // build and sign the transaction, then broadcast to Tendermint msg := bank.NewMsgSend(from, to, coins) diff --git a/x/gov/client/cli/tx.go b/x/gov/client/cli/tx.go index 836c799b0d..b8b4587c3a 100644 --- a/x/gov/client/cli/tx.go +++ b/x/gov/client/cli/tx.go @@ -79,26 +79,15 @@ $ gaiacli gov submit-proposal --title="Test Proposal" --description="My awesome WithCodec(cdc). WithAccountDecoder(cdc) - // Get from address + // Get proposer address from := cliCtx.GetFromAddress() - // Pull associated account - account, err := cliCtx.GetAccount(from) - if err != nil { - return err - } - // Find deposit amount amount, err := sdk.ParseCoins(proposal.Deposit) if err != nil { return err } - // ensure account has enough coins - if !account.GetCoins().IsAllGTE(amount) { - return fmt.Errorf("address %s doesn't have enough coins to pay for this transaction", from) - } - proposalType, err := gov.ProposalTypeFromString(proposal.Type) if err != nil { return err @@ -152,25 +141,15 @@ $ gaiacli tx gov deposit 1 10stake --from mykey return fmt.Errorf("Failed to fetch proposal-id %d: %s", proposalID, err) } + // Get depositor address from := cliCtx.GetFromAddress() - // Fetch associated account - account, err := cliCtx.GetAccount(from) - if err != nil { - return err - } - // Get amount of coins amount, err := sdk.ParseCoins(args[1]) if err != nil { return err } - // ensure account has enough coins - if !account.GetCoins().IsAllGTE(amount) { - return fmt.Errorf("address %s doesn't have enough coins to pay for this transaction", from) - } - msg := gov.NewMsgDeposit(from, proposalID, amount) err = msg.ValidateBasic() if err != nil { From 1bd579dcdb2f8371d5314bf0c27392e290f9bcdb Mon Sep 17 00:00:00 2001 From: Alessio Treglia Date: Wed, 10 Apr 2019 13:11:02 +0100 Subject: [PATCH 15/47] Fix tiny typo (#4085) --- x/mint/client/module_client.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/x/mint/client/module_client.go b/x/mint/client/module_client.go index 0b023f7925..2a9b1b855c 100644 --- a/x/mint/client/module_client.go +++ b/x/mint/client/module_client.go @@ -1,10 +1,10 @@ -package clientpackage +package client import ( "github.com/spf13/cobra" "github.com/tendermint/go-amino" - "github.com/cosmos/cosmos-sdk/client" + sdkclient "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/x/mint" "github.com/cosmos/cosmos-sdk/x/mint/client/cli" ) @@ -27,7 +27,7 @@ func (mc ModuleClient) GetQueryCmd() *cobra.Command { } mintingQueryCmd.AddCommand( - client.GetCommands( + sdkclient.GetCommands( cli.GetCmdQueryParams(mc.cdc), cli.GetCmdQueryInflation(mc.cdc), cli.GetCmdQueryAnnualProvisions(mc.cdc), From fa8e0823f7f245c72fbd5109ef1d3d2983fce482 Mon Sep 17 00:00:00 2001 From: Alexander Bezobchuk Date: Wed, 10 Apr 2019 09:10:44 -0400 Subject: [PATCH 16/47] Merge PR #4077: Update bug report template --- .github/ISSUE_TEMPLATE/bug-report.md | 24 +++++++++++++++-------- .github/ISSUE_TEMPLATE/feature-request.md | 19 +++++++++++------- 2 files changed, 28 insertions(+), 15 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug-report.md b/.github/ISSUE_TEMPLATE/bug-report.md index 7140f56da0..49cd078376 100644 --- a/.github/ISSUE_TEMPLATE/bug-report.md +++ b/.github/ISSUE_TEMPLATE/bug-report.md @@ -8,17 +8,25 @@ about: Create a report to help us squash bugs! v ✰ Thanks for opening an issue! ✰ v Before smashing the submit button please review the template. v Please also ensure that this is not a duplicate issue :) -☺ > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > --> +☺ > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > --> -## Summary of Bug - +## Summary of Bug + + + +## Version + + ## Steps to Reproduce - + + ____ + #### For Admin Use - - [ ] Not duplicate issue - - [ ] Appropriate labels applied - - [ ] Appropriate contributors tagged - - [ ] Contributor assigned/self-assigned + +- [ ] Not duplicate issue +- [ ] Appropriate labels applied +- [ ] Appropriate contributors tagged +- [ ] Contributor assigned/self-assigned diff --git a/.github/ISSUE_TEMPLATE/feature-request.md b/.github/ISSUE_TEMPLATE/feature-request.md index 09fbb26d1c..324ab9a8ab 100644 --- a/.github/ISSUE_TEMPLATE/feature-request.md +++ b/.github/ISSUE_TEMPLATE/feature-request.md @@ -9,23 +9,28 @@ v ✰ Thanks for opening an issue! ✰ v Before smashing the submit button please review the template. v Word of caution: poorly thought-out proposals may be rejected v without deliberation -☺ > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > --> +☺ > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > --> ## Summary - + + ## Problem Definition + ## Proposal - + + ____ + #### For Admin Use - - [ ] Not duplicate issue - - [ ] Appropriate labels applied - - [ ] Appropriate contributors tagged - - [ ] Contributor assigned/self-assigned + +- [ ] Not duplicate issue +- [ ] Appropriate labels applied +- [ ] Appropriate contributors tagged +- [ ] Contributor assigned/self-assigned From eb942520112336cbc99069c5d6b2d9fbf2f70723 Mon Sep 17 00:00:00 2001 From: Alexander Bezobchuk Date: Wed, 10 Apr 2019 11:55:33 -0400 Subject: [PATCH 17/47] Merge PR #4089: Update docs from release/v0.34.0 --- docs/{gaia => cosmos-hub}/README.md | 8 +- .../delegator-guide-cli.md | 74 ++-- docs/{gaia => cosmos-hub}/deploy-testnet.md | 20 +- docs/{gaia => cosmos-hub}/gaiacli.md | 42 +-- .../genesis-state.md} | 0 docs/cosmos-hub/genesis.md | 332 ++++++++++++++++++ docs/{gaia => cosmos-hub}/installation.md | 7 +- docs/{gaia => cosmos-hub}/join-mainnet.md | 34 +- docs/{gaia => cosmos-hub}/join-testnet.md | 6 +- docs/{gaia => cosmos-hub}/keys.md | 0 docs/{gaia => cosmos-hub}/launch/blog-1-cn.md | 0 docs/{gaia => cosmos-hub}/launch/blog-1-en.md | 0 docs/{gaia => cosmos-hub}/launch/blog-1-kr.md | 0 docs/{gaia => cosmos-hub}/launch/blog-2-cn.md | 0 docs/{gaia => cosmos-hub}/launch/blog-2-en.md | 0 docs/{gaia => cosmos-hub}/launch/blog-2-kr.md | 0 docs/{gaia => cosmos-hub}/ledger.md | 4 +- .../validators/overview.md | 0 .../validators/security.md | 6 +- .../validators/validator-faq.md | 0 .../validators/validator-setup.md | 9 +- docs/{gaia => cosmos-hub}/what-is-gaia.md | 0 ...off - The Cosmos Hub Mainnet is Live-CN.md | 63 ---- docs/gaia/launch/blog-3-en.md | 47 --- 24 files changed, 451 insertions(+), 201 deletions(-) rename docs/{gaia => cosmos-hub}/README.md (73%) rename docs/{gaia => cosmos-hub}/delegator-guide-cli.md (93%) rename docs/{gaia => cosmos-hub}/deploy-testnet.md (96%) rename docs/{gaia => cosmos-hub}/gaiacli.md (96%) rename docs/{gaia/genesis.md => cosmos-hub/genesis-state.md} (100%) create mode 100644 docs/cosmos-hub/genesis.md rename docs/{gaia => cosmos-hub}/installation.md (90%) rename docs/{gaia => cosmos-hub}/join-mainnet.md (81%) rename docs/{gaia => cosmos-hub}/join-testnet.md (96%) rename docs/{gaia => cosmos-hub}/keys.md (100%) rename docs/{gaia => cosmos-hub}/launch/blog-1-cn.md (100%) rename docs/{gaia => cosmos-hub}/launch/blog-1-en.md (100%) rename docs/{gaia => cosmos-hub}/launch/blog-1-kr.md (100%) rename docs/{gaia => cosmos-hub}/launch/blog-2-cn.md (100%) rename docs/{gaia => cosmos-hub}/launch/blog-2-en.md (100%) rename docs/{gaia => cosmos-hub}/launch/blog-2-kr.md (100%) rename docs/{gaia => cosmos-hub}/ledger.md (99%) rename docs/{gaia => cosmos-hub}/validators/overview.md (100%) rename docs/{gaia => cosmos-hub}/validators/security.md (95%) rename docs/{gaia => cosmos-hub}/validators/validator-faq.md (100%) rename docs/{gaia => cosmos-hub}/validators/validator-setup.md (94%) rename docs/{gaia => cosmos-hub}/what-is-gaia.md (100%) delete mode 100644 docs/gaia/launch/Blastoff - The Cosmos Hub Mainnet is Live-CN.md delete mode 100644 docs/gaia/launch/blog-3-en.md diff --git a/docs/gaia/README.md b/docs/cosmos-hub/README.md similarity index 73% rename from docs/gaia/README.md rename to docs/cosmos-hub/README.md index eaf21a8238..75a9b31f41 100644 --- a/docs/gaia/README.md +++ b/docs/cosmos-hub/README.md @@ -1,6 +1,6 @@ -# Gaia Documentation +# Cosmos Hub Documentation -Welcome to the `Gaia` docs. `Gaia` is the current name of the Cosmos SDK application for the Cosmos Hub. +Welcome to the documentation of the **Cosmos Hub application: `gaia`**. ## Join the Cosmos Hub Mainnet @@ -12,11 +12,11 @@ Welcome to the `Gaia` docs. `Gaia` is the current name of the Cosmos SDK applica - [Join the testnet](./join-testnet.md) -## Setup your own `gaia` testnet +## Setup Your Own `gaia` Testnet - [Setup your own `gaia` testnet](./deploy-testnet.md) -## Additional resources +## Additional Resources - [Intro to validators](./validators/overview.md) - [Validator FAQ](./validators/validator-faq.md) diff --git a/docs/gaia/delegator-guide-cli.md b/docs/cosmos-hub/delegator-guide-cli.md similarity index 93% rename from docs/gaia/delegator-guide-cli.md rename to docs/cosmos-hub/delegator-guide-cli.md index 12d37ac581..aab15da884 100644 --- a/docs/gaia/delegator-guide-cli.md +++ b/docs/cosmos-hub/delegator-guide-cli.md @@ -27,22 +27,22 @@ of any kind. Please exercise extreme caution! -## Table of contents +## Table of Contents - [Installing `gaiacli`](#installing-gaiacli) - [Cosmos Accounts](#cosmos-accounts) - + [Restoring an account from the fundraiser](#restoring-an-account-from-the-fundraiser) - + [Creating an account](#creating-an-account) -- [Accessing the Cosmos Hub network](#accessing-the-cosmos-hub-network) - + [Running your own full-node](#running-your-own-full-node) - + [Connecting to a remote full-node](#connecting-to-a-remote-full-node) -- [Setting up `gaiacli`](#setting-up-gaiacli) -- [Querying the state](#querying-the-state) + + [Restoring an Account from the Fundraiser](#restoring-an-account-from-the-fundraiser) + + [Creating an Account](#creating-an-account) +- [Accessing the Cosmos Hub Network](#accessing-the-cosmos-hub-network) + + [Running Your Own Full-Node](#running-your-own-full-node) + + [Connecting to a Remote Full-Node](#connecting-to-a-remote-full-node) +- [Setting Up `gaiacli`](#setting-up-gaiacli) +- [Querying the State](#querying-the-state) - [Sending Transactions](#sending-transactions) - + [A note on gas and fees](#a-note-on-gas-and-fees) - + [Bonding Atoms and Withdrawing rewards](#bonding-atoms-and-withdrawing-rewards) + + [A Note on Gas and Fees](#a-note-on-gas-and-fees) + + [Bonding Atoms and Withdrawing Rewards](#bonding-atoms-and-withdrawing-rewards) + [Participating in Governance](#participating-in-governance) - + [Signing transactions from an offline computer](#signing-transactions-from-an-offline-computer) + + [Signing Transactions from an Offline Computer](#signing-transactions-from-an-offline-computer) ## Installing `gaiacli` @@ -109,7 +109,7 @@ The funds stored in an account are controlled by the private key. This private k The address is a public string with a human-readable prefix (e.g. `cosmos10snjt8dmpr5my0h76xj48ty80uzwhraqalu4eg`) that identifies your account. When someone wants to send you funds, they send it to your address. It is computationally infeasible to find the private key associated with a given address. -### Restoring an account from the fundraiser +### Restoring an Account from the Fundraiser ::: tip *NOTE: This section only concerns fundraiser participants* @@ -117,7 +117,7 @@ The address is a public string with a human-readable prefix (e.g. `cosmos10snjt8 If you participated in the fundraiser, you should be in possession of a 12-words mnemonic. Newly generated mnemonics use 24 words, but 12-word mnemonics are also compatible with all the Cosmos tools. -#### On a ledger device +#### On a Ledger Device At the core of a ledger device, there is a mnemonic used to generate accounts on multiple blockchains (including the Cosmos Hub). Usually, you will create a new mnemonic when you initialize your ledger device. However, it is possible to tell the ledger device to use a mnemonic provided by the user instead. Let us go ahead and see how you can input the mnemonic you obtained during the fundraiser as the seed of your ledger device. @@ -138,7 +138,7 @@ Your ledger is now correctly set up with your fundraiser mnemonic! Do not lose t Next, click [here](#using-a-ledger-device) to learn how to generate an account. -#### On a computer +#### On a Computer ::: warning **NOTE: It is more secure to perform this action on an offline computer** @@ -155,11 +155,11 @@ You will be prompted to input a passphrase that is used to encrypt the private k - `` is the name of the account. It is a reference to the account number used to derive the key pair from the mnemonic. You will use this name to identify your account when you want to send a transaction. - You can add the optional `--account` flag to specify the path (`0`, `1`, `2`, ...) you want to use to generate your account. By default, account `0` is generated. -### Creating an account +### Creating an Account To create an account, you just need to have `gaiacli` installed. Before creating it, you need to know where you intend to store and interact with your private keys. The best options are to store them in an offline dedicated computer or a ledger device. Storing them on your regular online computer involves more risk, since anyone who infiltrates your computer through the internet could exfiltrate your private keys and steal your funds. -#### Using a ledger device +#### Using a Ledger Device ::: warning **Only use Ledger devices that you bought factory new or trust fully** @@ -185,7 +185,7 @@ gaiacli keys add --ledger - `` is the name of the account. It is a reference to the account number used to derive the key pair from the mnemonic. You will use this name to identify your account when you want to send a transaction. - You can add the optional `--account` flag to specify the path (`0`, `1`, `2`, ...) you want to use to generate your account. By default, account `0` is generated. -#### Using a computer +#### Using a Computer ::: warning **NOTE: It is more secure to perform this action on an offline computer** @@ -225,7 +225,7 @@ gaiacli keys add --recover --account 1 This command will prompt you to input a passphrase as well as your mnemonic. Change the account number to generate a different account. -## Accessing the Cosmos Hub network +## Accessing the Cosmos Hub Network In order to query the state and send transactions, you need a way to access the network. To do so, you can either run your own full-node, or connect to someone else's. @@ -233,19 +233,19 @@ In order to query the state and send transactions, you need a way to access the **NOTE: Do not share your mnemonic (12 or 24 words) with anyone. The only person who should ever need to know it is you. This is especially important if you are ever approached via email or direct message by someone requesting that you share your mnemonic for any kind of blockchain services or support. No one from Cosmos, the Tendermint team or the Interchain Foundation will ever send an email that asks for you to share any kind of account credentials or your mnemonic."**. ::: -### Running your own full-node +### Running Your Own Full-Node This is the most secure option, but comes with relatively high resource requirements. In order to run your own full-node, you need good bandwidth and at least 1TB of disk space. You will find the tutorial on how to install `gaiad` [here](https://cosmos.network/docs/gaia/installation.html), and the guide to run a full-node [here](https://cosmos.network/docs/gaia/join-mainnet.html). -### Connecting to a remote full-node +### Connecting to a Remote Full-Node If you do not want or cannot run your own node, you can connect to someone else's full-node. You should pick an operator you trust, because a malicious operator could return incorrect query results or censor your transactions. However, they will never be able to steal your funds, as your private keys are stored locally on your computer or ledger device. Possible options of full-node operators include validators, wallet providers or exchanges. In order to connect to the full-node, you will need an address of the following form: `https://77.87.106.33:26657` (*Note: This is a placeholder*). This address has to be communicated by the full-node operator you choose to trust. You will use this address in the [following section](#setting-up-gaiacli). -## Setting up `gaiacli` +## Setting Up `gaiacli` ::: tip **Before setting up `gaiacli`, make sure you have set up a way to [access the Cosmos Hub network](#accessing-the-cosmos-hub-network)** @@ -289,7 +289,7 @@ Finally, let us set the `chain-id` of the blockchain we want to interact with: gaiacli config chain-id cosmoshub-1 ``` -## Querying the state +## Querying the State ::: tip **Before you can bond atoms and withdraw rewards, you need to [set up `gaiacli`](#setting-up-gaiacli)** @@ -340,7 +340,7 @@ For each command, you can use the `-h` or `--help` flag to get more information. On Cosmos Hub mainnet, the accepted denom is `uatom`, where `1atom = 1,000,000uatom` ::: -### A note on gas and fees +### A Note on Gas and Fees Transactions on the Cosmos Hub network need to include a transaction fee in order to be processed. This fee pays for the gas required to run the transaction. The formula is the following: @@ -358,7 +358,7 @@ The transaction `fees` are the product of `gas` and `gasPrice`. As a user, you h For mainnet, the recommended `gas-prices` is `0.025uatom`. ::: -### Bonding Atoms and Withdrawing rewards +### Bonding Atoms and Withdrawing Rewards ::: tip **Before you can bond atoms and withdraw rewards, you need to [set up `gaiacli`](#setting-up-gaiacli) and [create an account](#creating-an-account)** @@ -379,6 +379,14 @@ For mainnet, the recommended `gas-prices` is `0.025uatom`. gaiacli tx staking delegate --from --gas auto --gas-adjustment 1.5 --gas-prices +// Redelegate a certain amount of Atoms from a validator to another +// Can only be used if already bonded to a validator +// Redelegation takes effect immediately, there is no waiting period to redelegate +// After a redelegation, no other redelegation can be made from the account for the next 3 weeks +// ex value for flags: =cosmosvaloper18thamkhnj9wz8pa4nhnp9rldprgant57pk2m8s, =100000000uatom, =0.025uatom + +gaiacli tx staking redelegate --from --gas auto --gas-adjustment 1.5 --gas-prices + // Withdraw all rewards // ex value for flag: =0.025uatom @@ -413,9 +421,9 @@ gaiacli query tx Double check with a block explorer if you interact with the network through a trusted full-node. -## Participating in governance +## Participating in Governance -#### Primer on governance +#### Primer on Governance The Cosmos Hub has a built-in governance system that lets bonded Atom holders vote on proposals. There are three types of proposal: @@ -429,7 +437,7 @@ Once the `deposit` reaches `minDeposit`, the proposal enters the `voting_period` At the end of the voting period, the proposal is accepted if there are more than 50% `Yes` votes (excluding `Abstain ` votes) and less than 33.33% of `NoWithVeto` votes (excluding `Abstain` votes). -#### In practice +#### In Practice ::: tip **Before you can bond atoms and withdraw rewards, you need to [bond Atoms](#bonding-atoms-and-withdrawing-rewards)** @@ -459,7 +467,7 @@ gaiacli tx gov deposit --gas auto --gas-adjustment 1.5 -- gaiacli tx gov vote