From d378db3128cd1de472e6bf29bd07b5903b548f14 Mon Sep 17 00:00:00 2001 From: Sunny Aggarwal Date: Mon, 22 Oct 2018 17:09:08 -0700 Subject: [PATCH 01/47] added querier redelegation --- x/stake/querier/queryable.go | 29 ++++++++++++++++++++++++++ x/stake/querier/queryable_test.go | 34 +++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+) diff --git a/x/stake/querier/queryable.go b/x/stake/querier/queryable.go index bacc8d6aec..4f9eb2bc70 100644 --- a/x/stake/querier/queryable.go +++ b/x/stake/querier/queryable.go @@ -20,6 +20,7 @@ const ( QueryDelegator = "delegator" QueryDelegation = "delegation" QueryUnbondingDelegation = "unbondingDelegation" + QueryRedelegation = "redelegation" QueryDelegatorValidators = "delegatorValidators" QueryDelegatorValidator = "delegatorValidator" QueryPool = "pool" @@ -88,6 +89,14 @@ type QueryBondsParams struct { ValidatorAddr sdk.ValAddress } +// defines the params for the following queries: +// - 'custom/stake/redelegation' +type QueryRedelegationParams struct { + DelegatorAddr sdk.AccAddress + SrcValidatorAddr sdk.ValAddress + DstValidatorAddr sdk.ValAddress +} + func queryValidators(ctx sdk.Context, cdc *codec.Codec, k keep.Keeper) (res []byte, err sdk.Error) { stakeParams := k.GetParams(ctx) validators := k.GetValidators(ctx, stakeParams.MaxValidators) @@ -283,6 +292,26 @@ func queryUnbondingDelegation(ctx sdk.Context, cdc *codec.Codec, req abci.Reques return res, nil } +func queryRedelegation(ctx sdk.Context, cdc *codec.Codec, req abci.RequestQuery, k keep.Keeper) (res []byte, err sdk.Error) { + var params QueryRedelegationParams + + errRes := cdc.UnmarshalJSON(req.Data, ¶ms) + if errRes != nil { + return []byte{}, sdk.ErrUnknownRequest(string(req.Data)) + } + + redel, found := k.GetRedelegation(ctx, params.DelegatorAddr, params.SrcValidatorAddr, params.DstValidatorAddr) + if !found { + return []byte{}, types.ErrNoRedelegation(types.DefaultCodespace) + } + + res, errRes = codec.MarshalJSONIndent(cdc, redel) + if errRes != nil { + return nil, sdk.ErrInternal(sdk.AppendMsgToErr("could not marshal result to JSON", errRes.Error())) + } + return res, nil +} + func queryPool(ctx sdk.Context, cdc *codec.Codec, k keep.Keeper) (res []byte, err sdk.Error) { pool := k.GetPool(ctx) diff --git a/x/stake/querier/queryable_test.go b/x/stake/querier/queryable_test.go index 973e2376ff..2fac1a27a1 100644 --- a/x/stake/querier/queryable_test.go +++ b/x/stake/querier/queryable_test.go @@ -36,6 +36,14 @@ func newTestBondQuery(delegatorAddr sdk.AccAddress, validatorAddr sdk.ValAddress } } +func newTestRedelegationQuery(delegatorAddr sdk.AccAddress, srcValidatorAddr sdk.ValAddress, dstValidatorAddr sdk.ValAddress) QueryRedelegationParams { + return QueryRedelegationParams{ + DelegatorAddr: delegatorAddr, + SrcValidatorAddr: srcValidatorAddr, + DstValidatorAddr: dstValidatorAddr, + } +} + func TestNewQuerier(t *testing.T) { cdc := codec.New() ctx, _, keeper := keep.CreateTestInput(t, false, 1000) @@ -189,6 +197,11 @@ func TestQueryDelegation(t *testing.T) { pool := keeper.GetPool(ctx) keeper.SetValidatorByPowerIndex(ctx, val1, pool) + val2 := types.NewValidator(addrVal2, pk2, types.Description{}) + keeper.SetValidator(ctx, val2) + pool = keeper.GetPool(ctx) + keeper.SetValidatorByPowerIndex(ctx, val2, pool) + keeper.Delegate(ctx, addrAcc2, sdk.NewCoin("steak", sdk.NewInt(20)), val1, true) // apply TM updates @@ -334,6 +347,27 @@ func TestQueryDelegation(t *testing.T) { _, err = queryDelegatorUnbondingDelegations(ctx, cdc, query, keeper) require.NotNil(t, err) + + // Query redelegation + redel, err := keeper.BeginRedelegation(ctx, addrAcc2, val1.OperatorAddr, val2.OperatorAddr, sdk.NewDec(10)) + require.Nil(t, err) + + bz, errRes = cdc.MarshalJSON(newTestRedelegationQuery(addrAcc2, val1.OperatorAddr, val2.OperatorAddr)) + require.Nil(t, errRes) + + query = abci.RequestQuery{ + Path: "/custom/stake/redelegation", + Data: bz, + } + + res, err = queryRedelegation(ctx, cdc, query, keeper) + require.Nil(t, err) + + var redelRes types.Redelegation + errRes = cdc.UnmarshalJSON(res, &redelRes) + require.Nil(t, errRes) + + require.Equal(t, redel, redelRes) } func TestQueryRedelegations(t *testing.T) { From 9c6ef3e23c75a6e987173bacf6a9558abd4bc8b2 Mon Sep 17 00:00:00 2001 From: Sunny Aggarwal Date: Tue, 23 Oct 2018 00:42:06 -0700 Subject: [PATCH 02/47] added validatorDelegations querier endpoint --- x/stake/keeper/delegation.go | 17 ++++++++++++++++- x/stake/querier/queryable.go | 21 +++++++++++++++++++++ x/stake/querier/queryable_test.go | 26 ++++++++++++++++++++++++++ 3 files changed, 63 insertions(+), 1 deletion(-) diff --git a/x/stake/keeper/delegation.go b/x/stake/keeper/delegation.go index 97acc24042..9a5a7549da 100644 --- a/x/stake/keeper/delegation.go +++ b/x/stake/keeper/delegation.go @@ -24,7 +24,7 @@ func (k Keeper) GetDelegation(ctx sdk.Context, return delegation, true } -// return all delegations used during genesis dump +// return all delegations to a specific validator. Useful for querier. func (k Keeper) GetAllDelegations(ctx sdk.Context) (delegations []types.Delegation) { store := ctx.KVStore(k.storeKey) iterator := sdk.KVStorePrefixIterator(store, DelegationKey) @@ -37,6 +37,21 @@ func (k Keeper) GetAllDelegations(ctx sdk.Context) (delegations []types.Delegati return delegations } +// return all delegations used during genesis dump +func (k Keeper) GetAllDelegationsToValidator(ctx sdk.Context, valAddr sdk.ValAddress) (delegations []types.Delegation) { + store := ctx.KVStore(k.storeKey) + iterator := sdk.KVStorePrefixIterator(store, DelegationKey) + defer iterator.Close() + + for ; iterator.Valid(); iterator.Next() { + delegation := types.MustUnmarshalDelegation(k.cdc, iterator.Key(), iterator.Value()) + if delegation.GetValidator().Equals(valAddr) { + delegations = append(delegations, delegation) + } + } + return delegations +} + // return a given amount of all the delegations from a delegator func (k Keeper) GetDelegatorDelegations(ctx sdk.Context, delegator sdk.AccAddress, maxRetrieve uint16) (delegations []types.Delegation) { diff --git a/x/stake/querier/queryable.go b/x/stake/querier/queryable.go index 4f9eb2bc70..a963d7ca8a 100644 --- a/x/stake/querier/queryable.go +++ b/x/stake/querier/queryable.go @@ -15,6 +15,7 @@ const ( QueryDelegatorDelegations = "delegatorDelegations" QueryDelegatorUnbondingDelegations = "delegatorUnbondingDelegations" QueryDelegatorRedelegations = "delegatorRedelegations" + QueryValidatorDelegations = "validatorDelegations" QueryValidatorUnbondingDelegations = "validatorUnbondingDelegations" QueryValidatorRedelegations = "validatorRedelegations" QueryDelegator = "delegator" @@ -35,6 +36,8 @@ func NewQuerier(k keep.Keeper, cdc *codec.Codec) sdk.Querier { return queryValidators(ctx, cdc, k) case QueryValidator: return queryValidator(ctx, cdc, req, k) + case QueryValidatorDelegations: + return queryValidatorDelegations(ctx, cdc, req, k) case QueryValidatorUnbondingDelegations: return queryValidatorUnbondingDelegations(ctx, cdc, req, k) case QueryValidatorRedelegations: @@ -74,6 +77,7 @@ type QueryDelegatorParams struct { // defines the params for the following queries: // - 'custom/stake/validator' +// - 'custom/stake/validatorDelegations' // - 'custom/stake/validatorUnbondingDelegations' // - 'custom/stake/validatorRedelegations' type QueryValidatorParams struct { @@ -128,6 +132,23 @@ func queryValidator(ctx sdk.Context, cdc *codec.Codec, req abci.RequestQuery, k return res, nil } +func queryValidatorDelegations(ctx sdk.Context, cdc *codec.Codec, req abci.RequestQuery, k keep.Keeper) (res []byte, err sdk.Error) { + var params QueryValidatorParams + + errRes := cdc.UnmarshalJSON(req.Data, ¶ms) + if errRes != nil { + return []byte{}, sdk.ErrUnknownAddress("") + } + + delegations := k.GetAllDelegationsToValidator(ctx, params.ValidatorAddr) + + res, errRes = codec.MarshalJSONIndent(cdc, delegations) + if errRes != nil { + return nil, sdk.ErrInternal(sdk.AppendMsgToErr("could not marshal result to JSON", errRes.Error())) + } + return res, nil +} + func queryValidatorUnbondingDelegations(ctx sdk.Context, cdc *codec.Codec, req abci.RequestQuery, k keep.Keeper) (res []byte, err sdk.Error) { var params QueryValidatorParams diff --git a/x/stake/querier/queryable_test.go b/x/stake/querier/queryable_test.go index 2fac1a27a1..0f47c60c6a 100644 --- a/x/stake/querier/queryable_test.go +++ b/x/stake/querier/queryable_test.go @@ -90,6 +90,9 @@ func TestNewQuerier(t *testing.T) { _, err = querier(ctx, []string{"validator"}, query) require.Nil(t, err) + _, err = querier(ctx, []string{"validatorDelegations"}, query) + require.Nil(t, err) + _, err = querier(ctx, []string{"validatorUnbondingDelegations"}, query) require.Nil(t, err) @@ -301,9 +304,32 @@ func TestQueryDelegation(t *testing.T) { _, err = queryDelegation(ctx, cdc, query, keeper) require.NotNil(t, err) + // Query validator delegations + + bz, errRes = cdc.MarshalJSON(newTestValidatorQuery(addrVal1)) + require.Nil(t, errRes) + + query = abci.RequestQuery{ + Path: "custom/stake/validatorDelegations", + Data: bz, + } + + res, err = queryValidatorDelegations(ctx, cdc, query, keeper) + require.Nil(t, err) + + var delegationsRes []types.Delegation + errRes = cdc.UnmarshalJSON(res, &delegationsRes) + require.Nil(t, errRes) + + require.Equal(t, delegationsRes[0], delegation) + // Query unbonging delegation keeper.BeginUnbonding(ctx, addrAcc2, val1.OperatorAddr, sdk.NewDec(10)) + queryBondParams = newTestBondQuery(addrAcc2, addrVal1) + bz, errRes = cdc.MarshalJSON(queryBondParams) + require.Nil(t, errRes) + query = abci.RequestQuery{ Path: "/custom/stake/unbondingDelegation", Data: bz, From 2d429731b3f30e9c6bf06ba0c4e26fd7585d273c Mon Sep 17 00:00:00 2001 From: Sunny Aggarwal Date: Tue, 23 Oct 2018 01:25:53 -0700 Subject: [PATCH 03/47] LCD and CLI --- PENDING.md | 2 ++ client/lcd/lcd_test.go | 17 +++++++++++++++- cmd/gaia/cli_test/cli_test.go | 13 ++++++++++++ x/stake/client/cli/query.go | 37 +++++++++++++++++++++++++++++++++++ x/stake/client/rest/query.go | 11 +++++++++++ 5 files changed, 79 insertions(+), 1 deletion(-) diff --git a/PENDING.md b/PENDING.md index 84a08a5abe..ab68635f17 100644 --- a/PENDING.md +++ b/PENDING.md @@ -23,6 +23,7 @@ FEATURES * [cli] [\#2569](https://github.com/cosmos/cosmos-sdk/pull/2569) Add commands to query validator unbondings and redelegations * [cli] [\#2524](https://github.com/cosmos/cosmos-sdk/issues/2524) Add support offline mode to `gaiacli tx sign`. Lookups are not performed if the flag `--offline` is on. * [cli] [\#2558](https://github.com/cosmos/cosmos-sdk/issues/2558) Rename --print-sigs to --validate-signatures. It now performs a complete set of sanity checks and reports to the user. Also added --print-signature-only to print the signature only, not the whole transaction. + * [stake][cli] [\#2027] Add CLI query command for getting all delegations to a specific validator. * Gaia @@ -46,6 +47,7 @@ IMPROVEMENTS - \#2660 [x/mock/simulation] Staking transactions get tested far more frequently - #2610 [x/stake] Block redelegation to and from the same validator - #2652 [x/auth] Add benchmark for get and set account + - \#2027 [x/stake] Add `Querier` for getting all delegations to a specific validator. * Tendermint diff --git a/client/lcd/lcd_test.go b/client/lcd/lcd_test.go index cb25721e89..deb1687b75 100644 --- a/client/lcd/lcd_test.go +++ b/client/lcd/lcd_test.go @@ -538,7 +538,7 @@ func TestBonding(t *testing.T) { require.Equal(t, int64(40), coins.AmountOf(denom).Int64()) - // query validator + // query delegation bond := getDelegation(t, port, addr, operAddrs[0]) require.Equal(t, amt, bond.Shares) @@ -546,6 +546,10 @@ func TestBonding(t *testing.T) { require.Len(t, delegatorDels, 1) require.Equal(t, amt, delegatorDels[0].Shares) + // query all delegations to validator + bonds := getValidatorDelegations(t, port, operAddrs[0]) + require.Len(t, bonds, 2) + bondedValidators := getDelegatorValidators(t, port, addr) require.Len(t, bondedValidators, 1) require.Equal(t, operAddrs[0], bondedValidators[0].OperatorAddr) @@ -1206,6 +1210,17 @@ func getValidator(t *testing.T, port string, validatorAddr sdk.ValAddress) stake return validator } +func getValidatorDelegations(t *testing.T, port string, validatorAddr sdk.ValAddress) []stake.Delegation { + res, body := Request(t, port, "GET", fmt.Sprintf("/stake/validators/%s/delegations", validatorAddr.String()), nil) + require.Equal(t, http.StatusOK, res.StatusCode, body) + + var delegations []stake.Delegation + err := cdc.UnmarshalJSON([]byte(body), &delegations) + require.Nil(t, err) + + return delegations +} + func getValidatorUnbondingDelegations(t *testing.T, port string, validatorAddr sdk.ValAddress) []stake.UnbondingDelegation { res, body := Request(t, port, "GET", fmt.Sprintf("/stake/validators/%s/unbonding_delegations", validatorAddr.String()), nil) require.Equal(t, http.StatusOK, res.StatusCode, body) diff --git a/cmd/gaia/cli_test/cli_test.go b/cmd/gaia/cli_test/cli_test.go index b4791bf126..76b5ad8ebf 100644 --- a/cmd/gaia/cli_test/cli_test.go +++ b/cmd/gaia/cli_test/cli_test.go @@ -268,6 +268,10 @@ func TestGaiaCLICreateValidator(t *testing.T) { require.Equal(t, validator.OperatorAddr, sdk.ValAddress(barAddr)) require.True(sdk.DecEq(t, sdk.NewDec(2), validator.Tokens)) + validatorDelegations := executeGetValidatorDelegations(t, fmt.Sprintf("gaiacli query delegations-to %s --output=json %v", sdk.ValAddress(barAddr), flags)) + require.Len(t, validatorDelegations, 1) + require.NotZero(t, validatorDelegations[0].Shares) + // unbond a single share unbondStr := fmt.Sprintf("gaiacli tx unbond begin %v", flags) unbondStr += fmt.Sprintf(" --from=%s", "bar") @@ -720,6 +724,15 @@ func executeGetValidatorRedelegations(t *testing.T, cmdStr string) []stake.Redel return reds } +func executeGetValidatorDelegations(t *testing.T, cmdStr string) []stake.Delegation { + out, _ := tests.ExecuteT(t, cmdStr, "") + var delegations []stake.Delegation + cdc := app.MakeCodec() + err := cdc.UnmarshalJSON([]byte(out), &delegations) + require.NoError(t, err, "out %v\n, err %v", out, err) + return delegations +} + func executeGetPool(t *testing.T, cmdStr string) stake.Pool { out, _ := tests.ExecuteT(t, cmdStr, "") var pool stake.Pool diff --git a/x/stake/client/cli/query.go b/x/stake/client/cli/query.go index 28d09df8ef..47bcd693a6 100644 --- a/x/stake/client/cli/query.go +++ b/x/stake/client/cli/query.go @@ -290,6 +290,43 @@ func GetCmdQueryDelegations(storeName string, cdc *codec.Codec) *cobra.Command { return cmd } +// GetCmdQueryValidatorDelegations implements the command to query all the +// delegations to a specific validator. +func GetCmdQueryValidatorDelegations(storeName string, cdc *codec.Codec) *cobra.Command { + cmd := &cobra.Command{ + Use: "delegations-to [validator-addr]", + Short: "Query all delegations made to one validator", + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + validatorAddr, err := sdk.ValAddressFromBech32(args[0]) + if err != nil { + return err + } + + params := stake.QueryValidatorParams{ + ValidatorAddr: validatorAddr, + } + + bz, err := cdc.MarshalJSON(params) + if err != nil { + return err + } + + cliCtx := context.NewCLIContext().WithCodec(cdc) + + res, err := cliCtx.QueryWithData("custom/stake/validatorDelegations", bz) + if err != nil { + return err + } + + fmt.Println(string(res)) + return nil + }, + } + + return cmd +} + // GetCmdQueryUnbondingDelegation implements the command to query a single // unbonding-delegation record. func GetCmdQueryUnbondingDelegation(storeName string, cdc *codec.Codec) *cobra.Command { diff --git a/x/stake/client/rest/query.go b/x/stake/client/rest/query.go index 935c0229f6..1c73665a77 100644 --- a/x/stake/client/rest/query.go +++ b/x/stake/client/rest/query.go @@ -78,6 +78,12 @@ func registerQueryRoutes(cliCtx context.CLIContext, r *mux.Router, cdc *codec.Co validatorHandlerFn(cliCtx, cdc), ).Methods("GET") + // Get all delegations to a validator + r.HandleFunc( + "/stake/validators/{validatorAddr}/delegations", + validatorDelegationsHandlerFn(cliCtx, cdc), + ).Methods("GET") + // Get all unbonding delegations from a validator r.HandleFunc( "/stake/validators/{validatorAddr}/unbonding_delegations", @@ -227,6 +233,11 @@ func validatorHandlerFn(cliCtx context.CLIContext, cdc *codec.Codec) http.Handle return queryValidator(cliCtx, cdc, "custom/stake/validator") } +// HTTP request handler to query all unbonding delegations from a validator +func validatorDelegationsHandlerFn(cliCtx context.CLIContext, cdc *codec.Codec) http.HandlerFunc { + return queryValidator(cliCtx, cdc, "custom/stake/validatorDelegations") +} + // HTTP request handler to query all unbonding delegations from a validator func validatorUnbondingDelegationsHandlerFn(cliCtx context.CLIContext, cdc *codec.Codec) http.HandlerFunc { return queryValidator(cliCtx, cdc, "custom/stake/validatorUnbondingDelegations") From f8b030aece9b492f81f09a9c753d2a02a1796e80 Mon Sep 17 00:00:00 2001 From: Sunny Aggarwal Date: Tue, 23 Oct 2018 01:40:53 -0700 Subject: [PATCH 04/47] cli fixes --- cmd/gaia/cmd/gaiacli/main.go | 1 + x/stake/client/cli/query.go | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/cmd/gaia/cmd/gaiacli/main.go b/cmd/gaia/cmd/gaiacli/main.go index 212a670214..a2be558eb2 100644 --- a/cmd/gaia/cmd/gaiacli/main.go +++ b/cmd/gaia/cmd/gaiacli/main.go @@ -84,6 +84,7 @@ func main() { stakecmd.GetCmdQueryRedelegations(storeStake, cdc), stakecmd.GetCmdQueryValidator(storeStake, cdc), stakecmd.GetCmdQueryValidators(storeStake, cdc), + stakecmd.GetCmdQueryValidatorDelegations(queryRouteStake, cdc), stakecmd.GetCmdQueryValidatorUnbondingDelegations(queryRouteStake, cdc), stakecmd.GetCmdQueryValidatorRedelegations(queryRouteStake, cdc), stakecmd.GetCmdQueryParams(storeStake, cdc), diff --git a/x/stake/client/cli/query.go b/x/stake/client/cli/query.go index 47bcd693a6..f6265c2cd5 100644 --- a/x/stake/client/cli/query.go +++ b/x/stake/client/cli/query.go @@ -292,7 +292,7 @@ func GetCmdQueryDelegations(storeName string, cdc *codec.Codec) *cobra.Command { // GetCmdQueryValidatorDelegations implements the command to query all the // delegations to a specific validator. -func GetCmdQueryValidatorDelegations(storeName string, cdc *codec.Codec) *cobra.Command { +func GetCmdQueryValidatorDelegations(queryRoute string, cdc *codec.Codec) *cobra.Command { cmd := &cobra.Command{ Use: "delegations-to [validator-addr]", Short: "Query all delegations made to one validator", @@ -314,7 +314,7 @@ func GetCmdQueryValidatorDelegations(storeName string, cdc *codec.Codec) *cobra. cliCtx := context.NewCLIContext().WithCodec(cdc) - res, err := cliCtx.QueryWithData("custom/stake/validatorDelegations", bz) + res, err := cliCtx.QueryWithData(fmt.Sprintf("custom/%s/validatorDelegations", queryRoute), bz) if err != nil { return err } From eeff8204277b3c23228db51196d1faebb2275956 Mon Sep 17 00:00:00 2001 From: Sunny Aggarwal Date: Tue, 23 Oct 2018 13:25:17 -0700 Subject: [PATCH 05/47] removed redelegation stuff --- x/stake/querier/queryable.go | 29 ----------------------------- x/stake/querier/queryable_test.go | 29 ----------------------------- 2 files changed, 58 deletions(-) diff --git a/x/stake/querier/queryable.go b/x/stake/querier/queryable.go index a963d7ca8a..b17109ce3a 100644 --- a/x/stake/querier/queryable.go +++ b/x/stake/querier/queryable.go @@ -21,7 +21,6 @@ const ( QueryDelegator = "delegator" QueryDelegation = "delegation" QueryUnbondingDelegation = "unbondingDelegation" - QueryRedelegation = "redelegation" QueryDelegatorValidators = "delegatorValidators" QueryDelegatorValidator = "delegatorValidator" QueryPool = "pool" @@ -93,14 +92,6 @@ type QueryBondsParams struct { ValidatorAddr sdk.ValAddress } -// defines the params for the following queries: -// - 'custom/stake/redelegation' -type QueryRedelegationParams struct { - DelegatorAddr sdk.AccAddress - SrcValidatorAddr sdk.ValAddress - DstValidatorAddr sdk.ValAddress -} - func queryValidators(ctx sdk.Context, cdc *codec.Codec, k keep.Keeper) (res []byte, err sdk.Error) { stakeParams := k.GetParams(ctx) validators := k.GetValidators(ctx, stakeParams.MaxValidators) @@ -313,26 +304,6 @@ func queryUnbondingDelegation(ctx sdk.Context, cdc *codec.Codec, req abci.Reques return res, nil } -func queryRedelegation(ctx sdk.Context, cdc *codec.Codec, req abci.RequestQuery, k keep.Keeper) (res []byte, err sdk.Error) { - var params QueryRedelegationParams - - errRes := cdc.UnmarshalJSON(req.Data, ¶ms) - if errRes != nil { - return []byte{}, sdk.ErrUnknownRequest(string(req.Data)) - } - - redel, found := k.GetRedelegation(ctx, params.DelegatorAddr, params.SrcValidatorAddr, params.DstValidatorAddr) - if !found { - return []byte{}, types.ErrNoRedelegation(types.DefaultCodespace) - } - - res, errRes = codec.MarshalJSONIndent(cdc, redel) - if errRes != nil { - return nil, sdk.ErrInternal(sdk.AppendMsgToErr("could not marshal result to JSON", errRes.Error())) - } - return res, nil -} - func queryPool(ctx sdk.Context, cdc *codec.Codec, k keep.Keeper) (res []byte, err sdk.Error) { pool := k.GetPool(ctx) diff --git a/x/stake/querier/queryable_test.go b/x/stake/querier/queryable_test.go index 0f47c60c6a..473b65875f 100644 --- a/x/stake/querier/queryable_test.go +++ b/x/stake/querier/queryable_test.go @@ -36,14 +36,6 @@ func newTestBondQuery(delegatorAddr sdk.AccAddress, validatorAddr sdk.ValAddress } } -func newTestRedelegationQuery(delegatorAddr sdk.AccAddress, srcValidatorAddr sdk.ValAddress, dstValidatorAddr sdk.ValAddress) QueryRedelegationParams { - return QueryRedelegationParams{ - DelegatorAddr: delegatorAddr, - SrcValidatorAddr: srcValidatorAddr, - DstValidatorAddr: dstValidatorAddr, - } -} - func TestNewQuerier(t *testing.T) { cdc := codec.New() ctx, _, keeper := keep.CreateTestInput(t, false, 1000) @@ -373,27 +365,6 @@ func TestQueryDelegation(t *testing.T) { _, err = queryDelegatorUnbondingDelegations(ctx, cdc, query, keeper) require.NotNil(t, err) - - // Query redelegation - redel, err := keeper.BeginRedelegation(ctx, addrAcc2, val1.OperatorAddr, val2.OperatorAddr, sdk.NewDec(10)) - require.Nil(t, err) - - bz, errRes = cdc.MarshalJSON(newTestRedelegationQuery(addrAcc2, val1.OperatorAddr, val2.OperatorAddr)) - require.Nil(t, errRes) - - query = abci.RequestQuery{ - Path: "/custom/stake/redelegation", - Data: bz, - } - - res, err = queryRedelegation(ctx, cdc, query, keeper) - require.Nil(t, err) - - var redelRes types.Redelegation - errRes = cdc.UnmarshalJSON(res, &redelRes) - require.Nil(t, errRes) - - require.Equal(t, redel, redelRes) } func TestQueryRedelegations(t *testing.T) { From 327f7e1673434b07aeed4b0287c4eaa39defdee0 Mon Sep 17 00:00:00 2001 From: Sunny Aggarwal Date: Tue, 23 Oct 2018 13:30:14 -0700 Subject: [PATCH 06/47] address other comments --- x/stake/keeper/delegation.go | 6 +++--- x/stake/querier/queryable.go | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/x/stake/keeper/delegation.go b/x/stake/keeper/delegation.go index 9a5a7549da..8a00652f32 100644 --- a/x/stake/keeper/delegation.go +++ b/x/stake/keeper/delegation.go @@ -24,7 +24,7 @@ func (k Keeper) GetDelegation(ctx sdk.Context, return delegation, true } -// return all delegations to a specific validator. Useful for querier. +// return all delegations used during genesis dump func (k Keeper) GetAllDelegations(ctx sdk.Context) (delegations []types.Delegation) { store := ctx.KVStore(k.storeKey) iterator := sdk.KVStorePrefixIterator(store, DelegationKey) @@ -37,8 +37,8 @@ func (k Keeper) GetAllDelegations(ctx sdk.Context) (delegations []types.Delegati return delegations } -// return all delegations used during genesis dump -func (k Keeper) GetAllDelegationsToValidator(ctx sdk.Context, valAddr sdk.ValAddress) (delegations []types.Delegation) { +// return all delegations to a specific validator. Useful for querier. +func (k Keeper) GetValidatorDelegations(ctx sdk.Context, valAddr sdk.ValAddress) (delegations []types.Delegation) { store := ctx.KVStore(k.storeKey) iterator := sdk.KVStorePrefixIterator(store, DelegationKey) defer iterator.Close() diff --git a/x/stake/querier/queryable.go b/x/stake/querier/queryable.go index b17109ce3a..ec0f78907c 100644 --- a/x/stake/querier/queryable.go +++ b/x/stake/querier/queryable.go @@ -131,7 +131,7 @@ func queryValidatorDelegations(ctx sdk.Context, cdc *codec.Codec, req abci.Reque return []byte{}, sdk.ErrUnknownAddress("") } - delegations := k.GetAllDelegationsToValidator(ctx, params.ValidatorAddr) + delegations := k.GetValidatorDelegations(ctx, params.ValidatorAddr) res, errRes = codec.MarshalJSONIndent(cdc, delegations) if errRes != nil { From 0fc536a4af2bf940d74d74596b49cb57bcf7e41a Mon Sep 17 00:00:00 2001 From: Sunny Aggarwal Date: Tue, 23 Oct 2018 13:42:13 -0700 Subject: [PATCH 07/47] rebased --- x/stake/keeper/delegation.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x/stake/keeper/delegation.go b/x/stake/keeper/delegation.go index 8a00652f32..22c80b0b43 100644 --- a/x/stake/keeper/delegation.go +++ b/x/stake/keeper/delegation.go @@ -45,7 +45,7 @@ func (k Keeper) GetValidatorDelegations(ctx sdk.Context, valAddr sdk.ValAddress) for ; iterator.Valid(); iterator.Next() { delegation := types.MustUnmarshalDelegation(k.cdc, iterator.Key(), iterator.Value()) - if delegation.GetValidator().Equals(valAddr) { + if delegation.GetValidatorAddr().Equals(valAddr) { delegations = append(delegations, delegation) } } From 4c3ac3f512b8e6005e20ce170297bc59955a3351 Mon Sep 17 00:00:00 2001 From: Sunny Aggarwal Date: Sat, 3 Nov 2018 22:53:04 -0700 Subject: [PATCH 08/47] addressed comments --- docs/sdk/clients.md | 7 +++++++ x/stake/keeper/delegation_test.go | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/docs/sdk/clients.md b/docs/sdk/clients.md index 4f0669183f..3c0ca5c501 100644 --- a/docs/sdk/clients.md +++ b/docs/sdk/clients.md @@ -341,6 +341,13 @@ Additionally, as you can get all the outgoing redelegations from a particular va To get previous redelegation(s) status on past blocks, try adding the `--height` flag. +##### Query Delegations To Validator + +You can also query all of the delegations to a particular validator: +```bash + gaiacli query delegations-to +``` + ### Governance Governance is the process from which users in the Cosmos Hub can come to consensus on software upgrades, parameters of the mainnet or on custom text proposals. This is done through voting on proposals, which will be submitted by `Atom` holders on the mainnet. diff --git a/x/stake/keeper/delegation_test.go b/x/stake/keeper/delegation_test.go index fcf2f42067..6612246212 100644 --- a/x/stake/keeper/delegation_test.go +++ b/x/stake/keeper/delegation_test.go @@ -96,6 +96,13 @@ func TestDelegation(t *testing.T) { resVals = keeper.GetDelegatorValidators(ctx, addrDels[1], 4) require.Equal(t, 3, len(resVals)) + resDels := keeper.GetValidatorDelegations(ctx, addrVals[0]) + require.Len(t, resDels, 2) + resDels = keeper.GetValidatorDelegations(ctx, addrVals[1]) + require.Len(t, resDels, 2) + resDels = keeper.GetValidatorDelegations(ctx, addrVals[2]) + require.Len(t, resDels, 2) + for i := 0; i < 3; i++ { resVal, err := keeper.GetDelegatorValidator(ctx, addrDels[0], addrVals[i]) From f0024e1a73f65781ef3745887c25a0dd13533454 Mon Sep 17 00:00:00 2001 From: ValarDragon Date: Sun, 4 Nov 2018 15:52:13 -0800 Subject: [PATCH 09/47] Make the simulator create the new comission rate sensibly --- PENDING.md | 1 + x/stake/simulation/msgs.go | 13 ++++++------- x/stake/types/commission.go | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/PENDING.md b/PENDING.md index 84a08a5abe..cf2eaefd5f 100644 --- a/PENDING.md +++ b/PENDING.md @@ -28,6 +28,7 @@ FEATURES * SDK * (#1336) Mechanism for SDK Users to configure their own Bech32 prefixes instead of using the default cosmos prefixes. + * [simulator] \#2682 MsgEditValidator now looks at the validator's max rate, thus it now succeeds a significant portion of the time * Tendermint diff --git a/x/stake/simulation/msgs.go b/x/stake/simulation/msgs.go index ec2dffd927..dda344ffbd 100644 --- a/x/stake/simulation/msgs.go +++ b/x/stake/simulation/msgs.go @@ -26,11 +26,11 @@ func SimulateMsgCreateValidator(m auth.AccountKeeper, k stake.Keeper) simulation Moniker: simulation.RandStringOfLength(r, 10), } - maxCommission := sdk.NewInt(10) + maxCommission := sdk.NewDecWithPrec(r.Int63n(1000), 3) commission := stake.NewCommissionMsg( - sdk.NewDecWithPrec(simulation.RandomAmount(r, maxCommission).Int64(), 1), - sdk.NewDecWithPrec(simulation.RandomAmount(r, maxCommission).Int64(), 1), - sdk.NewDecWithPrec(simulation.RandomAmount(r, maxCommission).Int64(), 1), + simulation.RandomDecAmount(r, maxCommission), + maxCommission, + simulation.RandomDecAmount(r, maxCommission), ) acc := simulation.RandomAcc(r, accs) @@ -85,11 +85,10 @@ func SimulateMsgEditValidator(k stake.Keeper) simulation.Operation { Details: simulation.RandStringOfLength(r, 10), } - maxCommission := sdk.NewInt(10) - newCommissionRate := sdk.NewDecWithPrec(simulation.RandomAmount(r, maxCommission).Int64(), 1) - val := keeper.RandomValidator(r, k, ctx) address := val.GetOperator() + newCommissionRate := simulation.RandomDecAmount(r, val.Commission.MaxRate) + msg := stake.MsgEditValidator{ Description: description, ValidatorAddr: address, diff --git a/x/stake/types/commission.go b/x/stake/types/commission.go index b76971faa0..730bb67413 100644 --- a/x/stake/types/commission.go +++ b/x/stake/types/commission.go @@ -11,7 +11,7 @@ type ( // Commission defines a commission parameters for a given validator. Commission struct { Rate sdk.Dec `json:"rate"` // the commission rate charged to delegators - MaxRate sdk.Dec `json:"max_rate"` // maximum commission rate which validator can ever charge + MaxRate sdk.Dec `json:"max_rate"` // maximum commission rate which this validator can ever charge MaxChangeRate sdk.Dec `json:"max_change_rate"` // maximum daily increase of the validator commission UpdateTime time.Time `json:"update_time"` // the last time the commission rate was changed } From 37abad4cc3197c817e1f19f76d89c9de5d51a645 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Mon, 5 Nov 2018 11:47:19 +0100 Subject: [PATCH 10/47] 'make format' --- cmd/gaia/app/genesis_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/gaia/app/genesis_test.go b/cmd/gaia/app/genesis_test.go index 6c331856c3..9841fa3f88 100644 --- a/cmd/gaia/app/genesis_test.go +++ b/cmd/gaia/app/genesis_test.go @@ -92,7 +92,7 @@ func makeMsg(name string, pk crypto.PubKey) auth.StdTx { desc := stake.NewDescription(name, "", "", "") comm := stakeTypes.CommissionMsg{} msg := stake.NewMsgCreateValidator(sdk.ValAddress(pk.Address()), pk, sdk.NewInt64Coin(bondDenom, - 50), desc, comm) + 50), desc, comm) return auth.NewStdTx([]sdk.Msg{msg}, auth.StdFee{}, nil, "") } From 080a7818dba4b298cb2f254a98e3986d26010d49 Mon Sep 17 00:00:00 2001 From: Federico Kunze <31522760+fedekunze@users.noreply.github.com> Date: Mon, 5 Nov 2018 16:42:49 -0800 Subject: [PATCH 11/47] Update x/stake/client/rest/query.go Co-Authored-By: sunnya97 --- x/stake/client/rest/query.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x/stake/client/rest/query.go b/x/stake/client/rest/query.go index 1c73665a77..8c669ee662 100644 --- a/x/stake/client/rest/query.go +++ b/x/stake/client/rest/query.go @@ -78,7 +78,7 @@ func registerQueryRoutes(cliCtx context.CLIContext, r *mux.Router, cdc *codec.Co validatorHandlerFn(cliCtx, cdc), ).Methods("GET") - // Get all delegations to a validator + // Get all delegations to a validator r.HandleFunc( "/stake/validators/{validatorAddr}/delegations", validatorDelegationsHandlerFn(cliCtx, cdc), From cc652a36c7983d64b1bb817985f050cf43b89d4c Mon Sep 17 00:00:00 2001 From: Sunny Aggarwal Date: Mon, 5 Nov 2018 16:50:58 -0800 Subject: [PATCH 12/47] addressed fede's comment --- x/stake/keeper/delegation_test.go | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/x/stake/keeper/delegation_test.go b/x/stake/keeper/delegation_test.go index 6612246212..6c037049d6 100644 --- a/x/stake/keeper/delegation_test.go +++ b/x/stake/keeper/delegation_test.go @@ -96,13 +96,6 @@ func TestDelegation(t *testing.T) { resVals = keeper.GetDelegatorValidators(ctx, addrDels[1], 4) require.Equal(t, 3, len(resVals)) - resDels := keeper.GetValidatorDelegations(ctx, addrVals[0]) - require.Len(t, resDels, 2) - resDels = keeper.GetValidatorDelegations(ctx, addrVals[1]) - require.Len(t, resDels, 2) - resDels = keeper.GetValidatorDelegations(ctx, addrVals[2]) - require.Len(t, resDels, 2) - for i := 0; i < 3; i++ { resVal, err := keeper.GetDelegatorValidator(ctx, addrDels[0], addrVals[i]) @@ -112,6 +105,9 @@ func TestDelegation(t *testing.T) { resVal, err = keeper.GetDelegatorValidator(ctx, addrDels[1], addrVals[i]) require.Nil(t, err) require.Equal(t, addrVals[i], resVal.GetOperator()) + + resDels := keeper.GetValidatorDelegations(ctx, addrVals[i]) + require.Len(t, resDels, 2) } // delete a record From 02327e13b6fd260c85d1863f615b637d4bc74c5a Mon Sep 17 00:00:00 2001 From: Greg Szabo Date: Wed, 7 Nov 2018 04:02:18 -0500 Subject: [PATCH 13/47] Makefile OS compatibility update --- Makefile | 42 ++++++++++++++++++++++++------------------ PENDING.md | 1 + 2 files changed, 25 insertions(+), 18 deletions(-) diff --git a/Makefile b/Makefile index af4ea71c98..61ce099767 100644 --- a/Makefile +++ b/Makefile @@ -1,11 +1,9 @@ PACKAGES_NOSIMULATION=$(shell go list ./... | grep -v '/simulation') PACKAGES_SIMTEST=$(shell go list ./... | grep '/simulation') -VERSION := $(shell git describe --tags --long | sed 's/v\(.*\)/\1/') -BUILD_TAGS = netgo ledger +VERSION := $(subst v,,$(shell git describe --tags --long)) +BUILD_TAGS = netgo BUILD_FLAGS = -tags "${BUILD_TAGS}" -ldflags "-X github.com/cosmos/cosmos-sdk/version.Version=${VERSION}" -GCC := $(shell command -v gcc 2> /dev/null) LEDGER_ENABLED ?= true -UNAME_S := $(shell uname -s) GOTOOLS = \ github.com/golang/dep/cmd/dep \ github.com/alecthomas/gometalinter \ @@ -20,23 +18,31 @@ ci: get_tools get_vendor_deps install test_cover test_lint test ######################################## ### Build/Install -check-ledger: +# Add ledger support - Makefile variable changes are out of a target's scope. There is no point in putting this into a target. ifeq ($(LEDGER_ENABLED),true) - ifeq ($(UNAME_S),OpenBSD) - $(info "OpenBSD detected, disabling ledger support (https://github.com/cosmos/cosmos-sdk/issues/1988)") -TMP_BUILD_TAGS := $(BUILD_TAGS) -BUILD_TAGS = $(filter-out ledger, $(TMP_BUILD_TAGS)) - else - ifndef GCC - $(error "gcc not installed for ledger support, please install or set LEDGER_ENABLED to false in the Makefile") - endif - endif -else -TMP_BUILD_TAGS := $(BUILD_TAGS) -BUILD_TAGS = $(filter-out ledger, $(TMP_BUILD_TAGS)) + ifeq ($(OS),Windows_NT) + GCCEXE = $(shell where gcc.exe 2> NUL) + ifeq ($(GCCEXE),) + $(error gcc.exe not installed for ledger support, please install or set LEDGER_ENABLED=false) + else + BUILD_TAGS += ledger + endif + else + UNAME_S = $(shell uname -s) + ifeq ($(UNAME_S),OpenBSD) + $(warning OpenBSD detected, disabling ledger support (https://github.com/cosmos/cosmos-sdk/issues/1988)) + else + GCC = $(shell command -v gcc 2> /dev/null) + ifeq ($(GCC),) + $(error gcc not installed for ledger support, please install or set LEDGER_ENABLED=false) + else + BUILD_TAGS += ledger + endif + endif + endif endif -build: check-ledger update_gaia_lite_docs +build: ifeq ($(OS),Windows_NT) go build $(BUILD_FLAGS) -o build/gaiad.exe ./cmd/gaia/cmd/gaiad go build $(BUILD_FLAGS) -o build/gaiacli.exe ./cmd/gaia/cmd/gaiacli diff --git a/PENDING.md b/PENDING.md index 7a4f32a62b..6b0813c2c1 100644 --- a/PENDING.md +++ b/PENDING.md @@ -41,6 +41,7 @@ IMPROVEMENTS * Gaia - #2637 [x/gov] Switched inactive and active proposal queues to an iterator based queue + - #2672 [Makefile] Updated for better Windows compatibility and ledger support logic * SDK - \#2573 [x/distribution] add accum invariance From 812784c940d88626fbcf52e15e4a8a0896b6e533 Mon Sep 17 00:00:00 2001 From: Aleksandr Bezobchuk Date: Wed, 7 Nov 2018 09:27:20 -0500 Subject: [PATCH 14/47] Cleanup bank keeper --- x/bank/keeper.go | 89 ++++++++++++++++++------------------------------ 1 file changed, 33 insertions(+), 56 deletions(-) diff --git a/x/bank/keeper.go b/x/bank/keeper.go index 67c05d3206..b59af3785f 100644 --- a/x/bank/keeper.go +++ b/x/bank/keeper.go @@ -15,6 +15,11 @@ const ( costAddCoins sdk.Gas = 10 ) +//----------------------------------------------------------------------------- +// Keeper + +var _ Keeper = (*BaseKeeper)(nil) + // Keeper defines a module interface that facilitates the transfer of coins // between accounts. type Keeper interface { @@ -24,32 +29,22 @@ type Keeper interface { AddCoins(ctx sdk.Context, addr sdk.AccAddress, amt sdk.Coins) (sdk.Coins, sdk.Tags, sdk.Error) } -var _ Keeper = (*BaseKeeper)(nil) - // BaseKeeper manages transfers between accounts. It implements the Keeper // interface. type BaseKeeper struct { - am auth.AccountKeeper + BaseSendKeeper + + ak auth.AccountKeeper } // NewBaseKeeper returns a new BaseKeeper -func NewBaseKeeper(am auth.AccountKeeper) BaseKeeper { - return BaseKeeper{am: am} -} - -// GetCoins returns the coins at the addr. -func (keeper BaseKeeper) GetCoins(ctx sdk.Context, addr sdk.AccAddress) sdk.Coins { - return getCoins(ctx, keeper.am, addr) +func NewBaseKeeper(ak auth.AccountKeeper) BaseKeeper { + return BaseKeeper{BaseSendKeeper: NewBaseSendKeeper(ak), ak: ak} } // SetCoins sets the coins at the addr. func (keeper BaseKeeper) SetCoins(ctx sdk.Context, addr sdk.AccAddress, amt sdk.Coins) sdk.Error { - return setCoins(ctx, keeper.am, addr, amt) -} - -// HasCoins returns whether or not an account has at least amt coins. -func (keeper BaseKeeper) HasCoins(ctx sdk.Context, addr sdk.AccAddress, amt sdk.Coins) bool { - return hasCoins(ctx, keeper.am, addr, amt) + return setCoins(ctx, keeper.ak, addr, amt) } // SubtractCoins subtracts amt from the coins at the addr. @@ -57,7 +52,7 @@ func (keeper BaseKeeper) SubtractCoins( ctx sdk.Context, addr sdk.AccAddress, amt sdk.Coins, ) (sdk.Coins, sdk.Tags, sdk.Error) { - return subtractCoins(ctx, keeper.am, addr, amt) + return subtractCoins(ctx, keeper.ak, addr, amt) } // AddCoins adds amt to the coins at the addr. @@ -65,28 +60,17 @@ func (keeper BaseKeeper) AddCoins( ctx sdk.Context, addr sdk.AccAddress, amt sdk.Coins, ) (sdk.Coins, sdk.Tags, sdk.Error) { - return addCoins(ctx, keeper.am, addr, amt) + return addCoins(ctx, keeper.ak, addr, amt) } -// SendCoins moves coins from one account to another -func (keeper BaseKeeper) SendCoins( - ctx sdk.Context, fromAddr sdk.AccAddress, toAddr sdk.AccAddress, amt sdk.Coins, -) (sdk.Tags, sdk.Error) { - - return sendCoins(ctx, keeper.am, fromAddr, toAddr, amt) -} - -// InputOutputCoins handles a list of inputs and outputs -func (keeper BaseKeeper) InputOutputCoins(ctx sdk.Context, inputs []Input, outputs []Output) (sdk.Tags, sdk.Error) { - return inputOutputCoins(ctx, keeper.am, inputs, outputs) -} - -//______________________________________________________________________________________________ +//----------------------------------------------------------------------------- +// Send Keeper // SendKeeper defines a module interface that facilitates the transfer of coins // between accounts without the possibility of creating coins. type SendKeeper interface { ViewKeeper + SendCoins(ctx sdk.Context, fromAddr sdk.AccAddress, toAddr sdk.AccAddress, amt sdk.Coins) (sdk.Tags, sdk.Error) InputOutputCoins(ctx sdk.Context, inputs []Input, outputs []Output) (sdk.Tags, sdk.Error) } @@ -96,22 +80,14 @@ var _ SendKeeper = (*BaseSendKeeper)(nil) // SendKeeper only allows transfers between accounts without the possibility of // creating coins. It implements the SendKeeper interface. type BaseSendKeeper struct { - am auth.AccountKeeper + BaseViewKeeper + + ak auth.AccountKeeper } // NewBaseSendKeeper returns a new BaseSendKeeper. -func NewBaseSendKeeper(am auth.AccountKeeper) BaseSendKeeper { - return BaseSendKeeper{am: am} -} - -// GetCoins returns the coins at the addr. -func (keeper BaseSendKeeper) GetCoins(ctx sdk.Context, addr sdk.AccAddress) sdk.Coins { - return getCoins(ctx, keeper.am, addr) -} - -// HasCoins returns whether or not an account has at least amt coins. -func (keeper BaseSendKeeper) HasCoins(ctx sdk.Context, addr sdk.AccAddress, amt sdk.Coins) bool { - return hasCoins(ctx, keeper.am, addr, amt) +func NewBaseSendKeeper(ak auth.AccountKeeper) BaseSendKeeper { + return BaseSendKeeper{BaseViewKeeper: NewBaseViewKeeper(ak), ak: ak} } // SendCoins moves coins from one account to another @@ -119,7 +95,7 @@ func (keeper BaseSendKeeper) SendCoins( ctx sdk.Context, fromAddr sdk.AccAddress, toAddr sdk.AccAddress, amt sdk.Coins, ) (sdk.Tags, sdk.Error) { - return sendCoins(ctx, keeper.am, fromAddr, toAddr, amt) + return sendCoins(ctx, keeper.ak, fromAddr, toAddr, amt) } // InputOutputCoins handles a list of inputs and outputs @@ -127,10 +103,13 @@ func (keeper BaseSendKeeper) InputOutputCoins( ctx sdk.Context, inputs []Input, outputs []Output, ) (sdk.Tags, sdk.Error) { - return inputOutputCoins(ctx, keeper.am, inputs, outputs) + return inputOutputCoins(ctx, keeper.ak, inputs, outputs) } -//______________________________________________________________________________________________ +//----------------------------------------------------------------------------- +// View Keeper + +var _ ViewKeeper = (*BaseViewKeeper)(nil) // ViewKeeper defines a module interface that facilitates read only access to // account balances. @@ -139,29 +118,27 @@ type ViewKeeper interface { HasCoins(ctx sdk.Context, addr sdk.AccAddress, amt sdk.Coins) bool } -var _ ViewKeeper = (*BaseViewKeeper)(nil) - // BaseViewKeeper implements a read only keeper implementation of ViewKeeper. type BaseViewKeeper struct { - am auth.AccountKeeper + ak auth.AccountKeeper } // NewBaseViewKeeper returns a new BaseViewKeeper. -func NewBaseViewKeeper(am auth.AccountKeeper) BaseViewKeeper { - return BaseViewKeeper{am: am} +func NewBaseViewKeeper(ak auth.AccountKeeper) BaseViewKeeper { + return BaseViewKeeper{ak: ak} } // GetCoins returns the coins at the addr. func (keeper BaseViewKeeper) GetCoins(ctx sdk.Context, addr sdk.AccAddress) sdk.Coins { - return getCoins(ctx, keeper.am, addr) + return getCoins(ctx, keeper.ak, addr) } // HasCoins returns whether or not an account has at least amt coins. func (keeper BaseViewKeeper) HasCoins(ctx sdk.Context, addr sdk.AccAddress, amt sdk.Coins) bool { - return hasCoins(ctx, keeper.am, addr, amt) + return hasCoins(ctx, keeper.ak, addr, amt) } -//______________________________________________________________________________________________ +//----------------------------------------------------------------------------- func getCoins(ctx sdk.Context, am auth.AccountKeeper, addr sdk.AccAddress) sdk.Coins { ctx.GasMeter().ConsumeGas(costGetCoins, "getCoins") From 845dd68de0e0d5163afff5c84b1d7638f7ac58bc Mon Sep 17 00:00:00 2001 From: Aleksandr Bezobchuk Date: Wed, 7 Nov 2018 14:46:09 -0500 Subject: [PATCH 15/47] Address style comments --- x/bank/keeper.go | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/x/bank/keeper.go b/x/bank/keeper.go index b59af3785f..3a33870e14 100644 --- a/x/bank/keeper.go +++ b/x/bank/keeper.go @@ -24,6 +24,7 @@ var _ Keeper = (*BaseKeeper)(nil) // between accounts. 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) @@ -39,7 +40,10 @@ type BaseKeeper struct { // NewBaseKeeper returns a new BaseKeeper func NewBaseKeeper(ak auth.AccountKeeper) BaseKeeper { - return BaseKeeper{BaseSendKeeper: NewBaseSendKeeper(ak), ak: ak} + return BaseKeeper{ + BaseSendKeeper: NewBaseSendKeeper(ak), + ak: ak, + } } // SetCoins sets the coins at the addr. @@ -87,7 +91,10 @@ type BaseSendKeeper struct { // NewBaseSendKeeper returns a new BaseSendKeeper. func NewBaseSendKeeper(ak auth.AccountKeeper) BaseSendKeeper { - return BaseSendKeeper{BaseViewKeeper: NewBaseViewKeeper(ak), ak: ak} + return BaseSendKeeper{ + BaseViewKeeper: NewBaseViewKeeper(ak), + ak: ak, + } } // SendCoins moves coins from one account to another @@ -125,7 +132,9 @@ type BaseViewKeeper struct { // NewBaseViewKeeper returns a new BaseViewKeeper. func NewBaseViewKeeper(ak auth.AccountKeeper) BaseViewKeeper { - return BaseViewKeeper{ak: ak} + return BaseViewKeeper{ + ak: ak, + } } // GetCoins returns the coins at the addr. From d4fb6d4ebe003104722021542a7c3800bda7c69d Mon Sep 17 00:00:00 2001 From: Jack Zampolin Date: Wed, 7 Nov 2018 15:03:00 -0800 Subject: [PATCH 16/47] Reorganize CLI command structure. Fixes #2575 --- client/rpc/root.go | 10 +-- client/rpc/status.go | 3 +- client/tx/root.go | 9 --- cmd/gaia/cmd/gaiacli/main.go | 93 +++------------------------ cmd/gaia/cmd/gaiacli/query.go | 81 +++++++++++++++++++++++ cmd/gaia/cmd/gaiacli/tx.go | 83 ++++++++++++++++++++++++ examples/basecoin/cmd/basecli/main.go | 12 ++-- examples/democoin/cmd/democli/main.go | 13 ++-- 8 files changed, 193 insertions(+), 111 deletions(-) create mode 100644 cmd/gaia/cmd/gaiacli/query.go create mode 100644 cmd/gaia/cmd/gaiacli/tx.go diff --git a/client/rpc/root.go b/client/rpc/root.go index 74c5a69a2e..6ef33e0e3a 100644 --- a/client/rpc/root.go +++ b/client/rpc/root.go @@ -22,15 +22,7 @@ func todoNotImplemented(_ *cobra.Command, _ []string) error { return errors.New("todo: Command not yet implemented") } -// AddCommands adds a number of rpc-related subcommands -func AddCommands(cmd *cobra.Command) { - cmd.AddCommand( - initClientCommand(), - statusCommand(), - ) -} - -func initClientCommand() *cobra.Command { +func InitClientCommand() *cobra.Command { cmd := &cobra.Command{ Use: "init", Short: "Initialize light client", diff --git a/client/rpc/status.go b/client/rpc/status.go index 68716f3a0b..0f81fc9c6f 100644 --- a/client/rpc/status.go +++ b/client/rpc/status.go @@ -14,7 +14,8 @@ import ( ctypes "github.com/tendermint/tendermint/rpc/core/types" ) -func statusCommand() *cobra.Command { +// StatusCommand returns the status of the network +func StatusCommand() *cobra.Command { cmd := &cobra.Command{ Use: "status", Short: "Query remote node for status", diff --git a/client/tx/root.go b/client/tx/root.go index 0f237b5967..5cd7eca0b8 100644 --- a/client/tx/root.go +++ b/client/tx/root.go @@ -2,20 +2,11 @@ package tx import ( "github.com/gorilla/mux" - "github.com/spf13/cobra" "github.com/cosmos/cosmos-sdk/client/context" "github.com/cosmos/cosmos-sdk/codec" ) -// AddCommands adds a number of tx-query related subcommands -func AddCommands(cmd *cobra.Command, cdc *codec.Codec) { - cmd.AddCommand( - SearchTxCmd(cdc), - QueryTxCmd(cdc), - ) -} - // register REST routes func RegisterRoutes(cliCtx context.CLIContext, r *mux.Router, cdc *codec.Codec) { r.HandleFunc("/txs/{hash}", QueryTxRequestHandlerFn(cdc, cliCtx)).Methods("GET") diff --git a/cmd/gaia/cmd/gaiacli/main.go b/cmd/gaia/cmd/gaiacli/main.go index 212a670214..e4ba7ec659 100644 --- a/cmd/gaia/cmd/gaiacli/main.go +++ b/cmd/gaia/cmd/gaiacli/main.go @@ -13,18 +13,10 @@ import ( "github.com/cosmos/cosmos-sdk/client/keys" "github.com/cosmos/cosmos-sdk/client/lcd" "github.com/cosmos/cosmos-sdk/client/rpc" - "github.com/cosmos/cosmos-sdk/client/tx" "github.com/cosmos/cosmos-sdk/cmd/gaia/app" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/version" - authcmd "github.com/cosmos/cosmos-sdk/x/auth/client/cli" - bankcmd "github.com/cosmos/cosmos-sdk/x/bank/client/cli" - distrcmd "github.com/cosmos/cosmos-sdk/x/distribution/client/cli" - govcmd "github.com/cosmos/cosmos-sdk/x/gov/client/cli" - slashingcmd "github.com/cosmos/cosmos-sdk/x/slashing/client/cli" - stakecmd "github.com/cosmos/cosmos-sdk/x/stake/client/cli" - _ "github.com/cosmos/cosmos-sdk/client/lcd/statik" ) @@ -40,7 +32,7 @@ const ( var ( rootCmd = &cobra.Command{ Use: "gaiacli", - Short: "Gaia light-client", + Short: "Command line interface for interacting with gaiad", } ) @@ -57,90 +49,23 @@ func main() { // TODO: setup keybase, viper object, etc. to be passed into // the below functions and eliminate global vars, like we do // with the cdc - rootCmd.AddCommand(client.ConfigCmd()) - // add standard rpc commands - rpc.AddCommands(rootCmd) - - //Add query commands - queryCmd := &cobra.Command{ - Use: "query", - Aliases: []string{"q"}, - Short: "Querying subcommands", - } - queryCmd.AddCommand( - rpc.BlockCommand(), - rpc.ValidatorCommand(), - ) - tx.AddCommands(queryCmd, cdc) - queryCmd.AddCommand(client.LineBreak) - queryCmd.AddCommand(client.GetCommands( - authcmd.GetAccountCmd(storeAcc, cdc, authcmd.GetAccountDecoder(cdc)), - stakecmd.GetCmdQueryDelegation(storeStake, cdc), - stakecmd.GetCmdQueryDelegations(storeStake, cdc), - stakecmd.GetCmdQueryUnbondingDelegation(storeStake, cdc), - stakecmd.GetCmdQueryUnbondingDelegations(storeStake, cdc), - stakecmd.GetCmdQueryRedelegation(storeStake, cdc), - stakecmd.GetCmdQueryRedelegations(storeStake, cdc), - stakecmd.GetCmdQueryValidator(storeStake, cdc), - stakecmd.GetCmdQueryValidators(storeStake, cdc), - stakecmd.GetCmdQueryValidatorUnbondingDelegations(queryRouteStake, cdc), - stakecmd.GetCmdQueryValidatorRedelegations(queryRouteStake, cdc), - stakecmd.GetCmdQueryParams(storeStake, cdc), - stakecmd.GetCmdQueryPool(storeStake, cdc), - govcmd.GetCmdQueryProposal(storeGov, cdc), - govcmd.GetCmdQueryProposals(storeGov, cdc), - govcmd.GetCmdQueryVote(storeGov, cdc), - govcmd.GetCmdQueryVotes(storeGov, cdc), - govcmd.GetCmdQueryDeposit(storeGov, cdc), - govcmd.GetCmdQueryDeposits(storeGov, cdc), - slashingcmd.GetCmdQuerySigningInfo(storeSlashing, cdc), - )...) - - //Add query commands - txCmd := &cobra.Command{ - Use: "tx", - Short: "Transactions subcommands", - } - - //Add auth and bank commands - txCmd.AddCommand( - client.PostCommands( - bankcmd.GetBroadcastCommand(cdc), - authcmd.GetSignCommand(cdc, authcmd.GetAccountDecoder(cdc)), - )...) - txCmd.AddCommand(client.LineBreak) - - txCmd.AddCommand( - client.PostCommands( - stakecmd.GetCmdCreateValidator(cdc), - stakecmd.GetCmdEditValidator(cdc), - stakecmd.GetCmdDelegate(cdc), - stakecmd.GetCmdRedelegate(storeStake, cdc), - stakecmd.GetCmdUnbond(storeStake, cdc), - distrcmd.GetCmdWithdrawRewards(cdc), - distrcmd.GetCmdSetWithdrawAddr(cdc), - govcmd.GetCmdDeposit(cdc), - bankcmd.SendTxCmd(cdc), - govcmd.GetCmdSubmitProposal(cdc), - slashingcmd.GetCmdUnjail(cdc), - govcmd.GetCmdVote(cdc), - )...) + // Consturct Root Command rootCmd.AddCommand( - queryCmd, - txCmd, + rpc.InitClientCommand(), + rpc.StatusCommand(), + client.ConfigCmd(), + queryCmd(cdc), + txCmd(cdc), + client.LineBreak, lcd.ServeCommand(cdc), client.LineBreak, - ) - - // add proxy, version and key info - rootCmd.AddCommand( keys.Commands(), client.LineBreak, version.VersionCmd, ) - // prepare and add flags + // Add flags and prefix all env exposed with GA executor := cli.PrepareMainCmd(rootCmd, "GA", app.DefaultCLIHome) err := initConfig(rootCmd) if err != nil { diff --git a/cmd/gaia/cmd/gaiacli/query.go b/cmd/gaia/cmd/gaiacli/query.go new file mode 100644 index 0000000000..be3138a35a --- /dev/null +++ b/cmd/gaia/cmd/gaiacli/query.go @@ -0,0 +1,81 @@ +package main + +import ( + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/rpc" + "github.com/cosmos/cosmos-sdk/client/tx" + "github.com/spf13/cobra" + + authcmd "github.com/cosmos/cosmos-sdk/x/auth/client/cli" + govcmd "github.com/cosmos/cosmos-sdk/x/gov/client/cli" + slashingcmd "github.com/cosmos/cosmos-sdk/x/slashing/client/cli" + stakecmd "github.com/cosmos/cosmos-sdk/x/stake/client/cli" + amino "github.com/tendermint/go-amino" +) + +func queryCmd(cdc *amino.Codec) *cobra.Command { + //Add query commands + queryCmd := &cobra.Command{ + Use: "query", + Aliases: []string{"q"}, + Short: "Querying subcommands", + } + + // Group staking queries under a subcommand + stakeQueryCmd := &cobra.Command{ + Use: "stake", + Short: "Querying commands for staking module", + } + + stakeQueryCmd.AddCommand(client.GetCommands( + stakecmd.GetCmdQueryDelegation(storeStake, cdc), + stakecmd.GetCmdQueryDelegations(storeStake, cdc), + stakecmd.GetCmdQueryUnbondingDelegation(storeStake, cdc), + stakecmd.GetCmdQueryUnbondingDelegations(storeStake, cdc), + stakecmd.GetCmdQueryRedelegation(storeStake, cdc), + stakecmd.GetCmdQueryRedelegations(storeStake, cdc), + stakecmd.GetCmdQueryValidator(storeStake, cdc), + stakecmd.GetCmdQueryValidators(storeStake, cdc), + stakecmd.GetCmdQueryValidatorUnbondingDelegations(queryRouteStake, cdc), + stakecmd.GetCmdQueryValidatorRedelegations(queryRouteStake, cdc), + stakecmd.GetCmdQueryParams(storeStake, cdc), + stakecmd.GetCmdQueryPool(storeStake, cdc))...) + + // Group gov queries under a subcommand + govQueryCmd := &cobra.Command{ + Use: "gov", + Short: "Querying commands for gov module", + } + + govQueryCmd.AddCommand(client.GetCommands( + govcmd.GetCmdQueryProposal(storeGov, cdc), + govcmd.GetCmdQueryProposals(storeGov, cdc), + govcmd.GetCmdQueryVote(storeGov, cdc), + govcmd.GetCmdQueryVotes(storeGov, cdc), + govcmd.GetCmdQueryDeposit(storeGov, cdc), + govcmd.GetCmdQueryDeposits(storeGov, cdc))...) + + // Group slashing queries under a subcommand + slashingQueryCmd := &cobra.Command{ + Use: "slashing", + Short: "Querying commands for slashing module", + } + + slashingQueryCmd.AddCommand(client.GetCommands( + slashingcmd.GetCmdQuerySigningInfo(storeSlashing, cdc))...) + + // Query commcmmand sturcture + queryCmd.AddCommand( + rpc.BlockCommand(), + rpc.ValidatorCommand(), + tx.SearchTxCmd(cdc), + tx.QueryTxCmd(cdc), + client.LineBreak, + authcmd.GetAccountCmd(storeAcc, cdc, authcmd.GetAccountDecoder(cdc)), + stakeQueryCmd, + govQueryCmd, + slashingQueryCmd, + ) + + return queryCmd +} diff --git a/cmd/gaia/cmd/gaiacli/tx.go b/cmd/gaia/cmd/gaiacli/tx.go new file mode 100644 index 0000000000..892e6ae7c4 --- /dev/null +++ b/cmd/gaia/cmd/gaiacli/tx.go @@ -0,0 +1,83 @@ +package main + +import ( + "github.com/cosmos/cosmos-sdk/client" + "github.com/spf13/cobra" + + authcmd "github.com/cosmos/cosmos-sdk/x/auth/client/cli" + bankcmd "github.com/cosmos/cosmos-sdk/x/bank/client/cli" + distrcmd "github.com/cosmos/cosmos-sdk/x/distribution/client/cli" + govcmd "github.com/cosmos/cosmos-sdk/x/gov/client/cli" + slashingcmd "github.com/cosmos/cosmos-sdk/x/slashing/client/cli" + stakecmd "github.com/cosmos/cosmos-sdk/x/stake/client/cli" + amino "github.com/tendermint/go-amino" +) + +func txCmd(cdc *amino.Codec) *cobra.Command { + //Add transaction generation commands + txCmd := &cobra.Command{ + Use: "tx", + Short: "Transactions subcommands", + } + + stakeTxCmd := &cobra.Command{ + Use: "stake", + Short: "Stake Transactions subcommands", + } + + stakeTxCmd.AddCommand(client.PostCommands( + stakecmd.GetCmdCreateValidator(cdc), + stakecmd.GetCmdEditValidator(cdc), + stakecmd.GetCmdDelegate(cdc), + stakecmd.GetCmdRedelegate(storeStake, cdc), + stakecmd.GetCmdUnbond(storeStake, cdc), + )...) + + distTxCmd := &cobra.Command{ + Use: "dist", + Short: "Distribution Transactions subcommands", + } + + distTxCmd.AddCommand(client.PostCommands( + distrcmd.GetCmdWithdrawRewards(cdc), + distrcmd.GetCmdSetWithdrawAddr(cdc), + )...) + + govTxCmd := &cobra.Command{ + Use: "gov", + Short: "Governance Transactions subcommands", + } + + govTxCmd.AddCommand(client.PostCommands( + govcmd.GetCmdDeposit(cdc), + govcmd.GetCmdVote(cdc), + govcmd.GetCmdSubmitProposal(cdc), + )...) + + slashingTxCmd := &cobra.Command{ + Use: "slashing", + Short: "Slashing Transactions subcommands", + } + + slashingTxCmd.AddCommand(client.PostCommands( + slashingcmd.GetCmdUnjail(cdc), + )...) + + txCmd.AddCommand( + //Add auth and bank commands + client.PostCommands( + bankcmd.SendTxCmd(cdc), + bankcmd.GetBroadcastCommand(cdc), + authcmd.GetSignCommand(cdc, authcmd.GetAccountDecoder(cdc)), + )...) + + txCmd.AddCommand( + client.LineBreak, + stakeTxCmd, + distTxCmd, + govTxCmd, + slashingTxCmd, + ) + + return txCmd +} diff --git a/examples/basecoin/cmd/basecli/main.go b/examples/basecoin/cmd/basecli/main.go index 1732e82eb9..4ebd1bef84 100644 --- a/examples/basecoin/cmd/basecli/main.go +++ b/examples/basecoin/cmd/basecli/main.go @@ -39,10 +39,14 @@ func main() { // with the cdc. // add standard rpc, and tx commands - rpc.AddCommands(rootCmd) - rootCmd.AddCommand(client.LineBreak) - tx.AddCommands(rootCmd, cdc) - rootCmd.AddCommand(client.LineBreak) + rootCmd.AddCommand( + rpc.InitClientCommand(), + rpc.StatusCommand(), + client.LineBreak, + tx.SearchTxCmd(cdc), + tx.QueryTxCmd(cdc), + client.LineBreak, + ) // add query/post commands (custom to binary) rootCmd.AddCommand( diff --git a/examples/democoin/cmd/democli/main.go b/examples/democoin/cmd/democli/main.go index 6bb2da8680..4121fa30b5 100644 --- a/examples/democoin/cmd/democli/main.go +++ b/examples/democoin/cmd/democli/main.go @@ -52,10 +52,15 @@ func main() { // with the cdc // add standard rpc, and tx commands - rpc.AddCommands(rootCmd) - rootCmd.AddCommand(client.LineBreak) - tx.AddCommands(rootCmd, cdc) - rootCmd.AddCommand(client.LineBreak) + + rootCmd.AddCommand( + rpc.InitClientCommand(), + rpc.StatusCommand(), + client.LineBreak, + tx.SearchTxCmd(cdc), + tx.QueryTxCmd(cdc), + client.LineBreak, + ) // add query/post commands (custom to binary) // start with commands common to basecoin From c20e383d7fd970e6ce6101af907dbc1c031ba88a Mon Sep 17 00:00:00 2001 From: Jack Zampolin Date: Wed, 7 Nov 2018 15:35:12 -0800 Subject: [PATCH 17/47] Fix missing flags issue --- cmd/gaia/cmd/gaiacli/query.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/gaia/cmd/gaiacli/query.go b/cmd/gaia/cmd/gaiacli/query.go index be3138a35a..b3d7a43093 100644 --- a/cmd/gaia/cmd/gaiacli/query.go +++ b/cmd/gaia/cmd/gaiacli/query.go @@ -71,7 +71,7 @@ func queryCmd(cdc *amino.Codec) *cobra.Command { tx.SearchTxCmd(cdc), tx.QueryTxCmd(cdc), client.LineBreak, - authcmd.GetAccountCmd(storeAcc, cdc, authcmd.GetAccountDecoder(cdc)), + client.GetCommands(authcmd.GetAccountCmd(storeAcc, cdc, authcmd.GetAccountDecoder(cdc)))[0], stakeQueryCmd, govQueryCmd, slashingQueryCmd, From cade5f552c3a4306368aa25141d5a799aa5a1fed Mon Sep 17 00:00:00 2001 From: Jack Zampolin Date: Wed, 7 Nov 2018 15:38:30 -0800 Subject: [PATCH 18/47] Address linting issues --- client/rpc/root.go | 1 + cmd/gaia/cmd/gaiacli/query.go | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/client/rpc/root.go b/client/rpc/root.go index 6ef33e0e3a..7bdcd8cd84 100644 --- a/client/rpc/root.go +++ b/client/rpc/root.go @@ -22,6 +22,7 @@ func todoNotImplemented(_ *cobra.Command, _ []string) error { return errors.New("todo: Command not yet implemented") } +// InitClientCommand initializes client commands func InitClientCommand() *cobra.Command { cmd := &cobra.Command{ Use: "init", diff --git a/cmd/gaia/cmd/gaiacli/query.go b/cmd/gaia/cmd/gaiacli/query.go index b3d7a43093..91734a8259 100644 --- a/cmd/gaia/cmd/gaiacli/query.go +++ b/cmd/gaia/cmd/gaiacli/query.go @@ -64,7 +64,7 @@ func queryCmd(cdc *amino.Codec) *cobra.Command { slashingQueryCmd.AddCommand(client.GetCommands( slashingcmd.GetCmdQuerySigningInfo(storeSlashing, cdc))...) - // Query commcmmand sturcture + // Query commcmmand structure queryCmd.AddCommand( rpc.BlockCommand(), rpc.ValidatorCommand(), From 0ab5d7639bc93b4d7ab73f8b88d19544aef58aa5 Mon Sep 17 00:00:00 2001 From: Jack Zampolin Date: Wed, 7 Nov 2018 16:42:34 -0800 Subject: [PATCH 19/47] Fix gobash CLI testing --- client/config.go | 21 ++++++++------- cmd/gaia/cli_test/cli_test.go | 49 ++++++++++++++++------------------- 2 files changed, 34 insertions(+), 36 deletions(-) diff --git a/client/config.go b/client/config.go index a1d38a016f..784ae0590b 100644 --- a/client/config.go +++ b/client/config.go @@ -3,20 +3,20 @@ package client import ( "bufio" "fmt" + "io/ioutil" + "os" + "path" + "github.com/cosmos/cosmos-sdk/types" "github.com/mitchellh/go-homedir" "github.com/pelletier/go-toml" "github.com/spf13/cobra" - "io/ioutil" - "os" - "path" ) type cliConfig struct { Home string `toml:"home"` ChainID string `toml:"chain_id"` TrustNode bool `toml:"trust_node"` - Encoding string `toml:"encoding"` Output string `toml:"output"` Node string `toml:"node"` Trace bool `toml:"trace"` @@ -41,23 +41,25 @@ func runConfigCmd(cmd *cobra.Command, args []string) error { } stdin := BufferStdin() + gaiaCLIHome, err := handleGaiaCLIHome(home, stdin) if err != nil { return err } + node, err := handleNode(stdin) if err != nil { return err } + trustNode, err := handleTrustNode(stdin) if err != nil { return err } - encoding := "btc" - output := "text" - var chainID string - chainID, err = types.DefaultChainID() + // var chainID string + chainID, err := types.DefaultChainID() + if err != nil { fmt.Println("Couldn't populate ChainID, so using an empty one.") } @@ -66,8 +68,7 @@ func runConfigCmd(cmd *cobra.Command, args []string) error { Home: gaiaCLIHome, ChainID: chainID, TrustNode: trustNode, - Encoding: encoding, - Output: output, + Output: "text", Node: node, Trace: false, } diff --git a/cmd/gaia/cli_test/cli_test.go b/cmd/gaia/cli_test/cli_test.go index bc9151200c..2d482350a9 100644 --- a/cmd/gaia/cli_test/cli_test.go +++ b/cmd/gaia/cli_test/cli_test.go @@ -236,7 +236,7 @@ func TestGaiaCLICreateValidator(t *testing.T) { initialPool.BondedTokens = initialPool.BondedTokens.Add(sdk.NewDec(100)) // Delegate tx on GaiaAppGenState // create validator - cvStr := fmt.Sprintf("gaiacli tx create-validator %v", flags) + cvStr := fmt.Sprintf("gaiacli tx stake create-validator %v", flags) cvStr += fmt.Sprintf(" --from=%s", "bar") cvStr += fmt.Sprintf(" --pubkey=%s", barCeshPubKey) cvStr += fmt.Sprintf(" --amount=%v", "2steak") @@ -267,12 +267,12 @@ func TestGaiaCLICreateValidator(t *testing.T) { barAcc = executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", barAddr, flags)) require.Equal(t, int64(8), barAcc.GetCoins().AmountOf("steak").Int64(), "%v", barAcc) - validator := executeGetValidator(t, fmt.Sprintf("gaiacli query validator %s --output=json %v", sdk.ValAddress(barAddr), flags)) + validator := executeGetValidator(t, fmt.Sprintf("gaiacli query stake validator %s --output=json %v", sdk.ValAddress(barAddr), flags)) require.Equal(t, validator.OperatorAddr, sdk.ValAddress(barAddr)) require.True(sdk.DecEq(t, sdk.NewDec(2), validator.Tokens)) // unbond a single share - unbondStr := fmt.Sprintf("gaiacli tx unbond begin %v", flags) + unbondStr := fmt.Sprintf("gaiacli tx stake unbond begin %v", flags) unbondStr += fmt.Sprintf(" --from=%s", "bar") unbondStr += fmt.Sprintf(" --validator=%s", sdk.ValAddress(barAddr)) unbondStr += fmt.Sprintf(" --shares-amount=%v", "1") @@ -285,19 +285,19 @@ func TestGaiaCLICreateValidator(t *testing.T) { barAcc = executeGetAccount(t, fmt.Sprintf("gaiacli query account %v %v", barCech, flags)) require.Equal(t, int64(9), barAcc.GetCoins().AmountOf("steak").Int64(), "%v", barAcc) */ - validator = executeGetValidator(t, fmt.Sprintf("gaiacli query validator %s --output=json %v", sdk.ValAddress(barAddr), flags)) + validator = executeGetValidator(t, fmt.Sprintf("gaiacli query stake validator %s --output=json %v", sdk.ValAddress(barAddr), flags)) require.Equal(t, "1.0000000000", validator.Tokens.String()) validatorUbds := executeGetValidatorUnbondingDelegations(t, - fmt.Sprintf("gaiacli query unbonding-delegations-from %s --output=json %v", + fmt.Sprintf("gaiacli query stake unbonding-delegations-from %s --output=json %v", sdk.ValAddress(barAddr), flags)) require.Len(t, validatorUbds, 1) require.Equal(t, "1", validatorUbds[0].Balance.Amount.String()) - params := executeGetParams(t, fmt.Sprintf("gaiacli query parameters --output=json %v", flags)) + params := executeGetParams(t, fmt.Sprintf("gaiacli query stake parameters --output=json %v", flags)) require.True(t, defaultParams.Equal(params)) - pool := executeGetPool(t, fmt.Sprintf("gaiacli query pool --output=json %v", flags)) + pool := executeGetPool(t, fmt.Sprintf("gaiacli query stake pool --output=json %v", flags)) require.Equal(t, initialPool.BondedTokens, pool.BondedTokens) } @@ -317,11 +317,11 @@ func TestGaiaCLISubmitProposal(t *testing.T) { fooAcc := executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", fooAddr, flags)) require.Equal(t, int64(50), fooAcc.GetCoins().AmountOf("steak").Int64()) - proposalsQuery, _ := tests.ExecuteT(t, fmt.Sprintf("gaiacli query proposals %v", flags), "") + proposalsQuery, _ := tests.ExecuteT(t, fmt.Sprintf("gaiacli query gov proposals %v", flags), "") require.Equal(t, "No matching proposals found", proposalsQuery) // submit a test proposal - spStr := fmt.Sprintf("gaiacli tx submit-proposal %v", flags) + spStr := fmt.Sprintf("gaiacli tx gov submit-proposal %v", flags) spStr += fmt.Sprintf(" --from=%s", "foo") spStr += fmt.Sprintf(" --deposit=%s", "5steak") spStr += fmt.Sprintf(" --type=%s", "Text") @@ -348,19 +348,19 @@ func TestGaiaCLISubmitProposal(t *testing.T) { fooAcc = executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", fooAddr, flags)) require.Equal(t, int64(45), fooAcc.GetCoins().AmountOf("steak").Int64()) - proposal1 := executeGetProposal(t, fmt.Sprintf("gaiacli query proposal --proposal-id=1 --output=json %v", flags)) + proposal1 := executeGetProposal(t, fmt.Sprintf("gaiacli query gov proposal --proposal-id=1 --output=json %v", flags)) require.Equal(t, uint64(1), proposal1.GetProposalID()) require.Equal(t, gov.StatusDepositPeriod, proposal1.GetStatus()) - proposalsQuery, _ = tests.ExecuteT(t, fmt.Sprintf("gaiacli query proposals %v", flags), "") + proposalsQuery, _ = tests.ExecuteT(t, fmt.Sprintf("gaiacli query gov proposals %v", flags), "") require.Equal(t, " 1 - Test", proposalsQuery) deposit := executeGetDeposit(t, - fmt.Sprintf("gaiacli query deposit --proposal-id=1 --depositer=%s --output=json %v", + fmt.Sprintf("gaiacli query gov deposit --proposal-id=1 --depositer=%s --output=json %v", fooAddr, flags)) require.Equal(t, int64(5), deposit.Amount.AmountOf("steak").Int64()) - depositStr := fmt.Sprintf("gaiacli tx deposit %v", flags) + depositStr := fmt.Sprintf("gaiacli tx gov deposit %v", flags) depositStr += fmt.Sprintf(" --from=%s", "foo") depositStr += fmt.Sprintf(" --deposit=%s", "10steak") depositStr += fmt.Sprintf(" --proposal-id=%s", "1") @@ -380,22 +380,22 @@ func TestGaiaCLISubmitProposal(t *testing.T) { // test query deposit deposits := executeGetDeposits(t, - fmt.Sprintf("gaiacli query deposits --proposal-id=1 --output=json %v", flags)) + fmt.Sprintf("gaiacli query gov deposits --proposal-id=1 --output=json %v", flags)) require.Len(t, deposits, 1) require.Equal(t, int64(15), deposits[0].Amount.AmountOf("steak").Int64()) deposit = executeGetDeposit(t, - fmt.Sprintf("gaiacli query deposit --proposal-id=1 --depositer=%s --output=json %v", + fmt.Sprintf("gaiacli query gov deposit --proposal-id=1 --depositer=%s --output=json %v", fooAddr, flags)) require.Equal(t, int64(15), deposit.Amount.AmountOf("steak").Int64()) fooAcc = executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", fooAddr, flags)) require.Equal(t, int64(35), fooAcc.GetCoins().AmountOf("steak").Int64()) - proposal1 = executeGetProposal(t, fmt.Sprintf("gaiacli query proposal --proposal-id=1 --output=json %v", flags)) + proposal1 = executeGetProposal(t, fmt.Sprintf("gaiacli query gov proposal --proposal-id=1 --output=json %v", flags)) require.Equal(t, uint64(1), proposal1.GetProposalID()) require.Equal(t, gov.StatusVotingPeriod, proposal1.GetStatus()) - voteStr := fmt.Sprintf("gaiacli tx vote %v", flags) + voteStr := fmt.Sprintf("gaiacli tx gov vote %v", flags) voteStr += fmt.Sprintf(" --from=%s", "foo") voteStr += fmt.Sprintf(" --proposal-id=%s", "1") voteStr += fmt.Sprintf(" --option=%s", "Yes") @@ -413,23 +413,23 @@ func TestGaiaCLISubmitProposal(t *testing.T) { executeWrite(t, voteStr, app.DefaultKeyPass) tests.WaitForNextNBlocksTM(2, port) - vote := executeGetVote(t, fmt.Sprintf("gaiacli query vote --proposal-id=1 --voter=%s --output=json %v", fooAddr, flags)) + vote := executeGetVote(t, fmt.Sprintf("gaiacli query gov vote --proposal-id=1 --voter=%s --output=json %v", fooAddr, flags)) require.Equal(t, uint64(1), vote.ProposalID) require.Equal(t, gov.OptionYes, vote.Option) - votes := executeGetVotes(t, fmt.Sprintf("gaiacli query votes --proposal-id=1 --output=json %v", flags)) + votes := executeGetVotes(t, fmt.Sprintf("gaiacli query gov votes --proposal-id=1 --output=json %v", flags)) require.Len(t, votes, 1) require.Equal(t, uint64(1), votes[0].ProposalID) require.Equal(t, gov.OptionYes, votes[0].Option) - proposalsQuery, _ = tests.ExecuteT(t, fmt.Sprintf("gaiacli query proposals --status=DepositPeriod %v", flags), "") + proposalsQuery, _ = tests.ExecuteT(t, fmt.Sprintf("gaiacli query gov proposals --status=DepositPeriod %v", flags), "") require.Equal(t, "No matching proposals found", proposalsQuery) - proposalsQuery, _ = tests.ExecuteT(t, fmt.Sprintf("gaiacli query proposals --status=VotingPeriod %v", flags), "") + proposalsQuery, _ = tests.ExecuteT(t, fmt.Sprintf("gaiacli query gov proposals --status=VotingPeriod %v", flags), "") require.Equal(t, " 1 - Test", proposalsQuery) // submit a second test proposal - spStr = fmt.Sprintf("gaiacli tx submit-proposal %v", flags) + spStr = fmt.Sprintf("gaiacli tx gov submit-proposal %v", flags) spStr += fmt.Sprintf(" --from=%s", "foo") spStr += fmt.Sprintf(" --deposit=%s", "5steak") spStr += fmt.Sprintf(" --type=%s", "Text") @@ -439,7 +439,7 @@ func TestGaiaCLISubmitProposal(t *testing.T) { executeWrite(t, spStr, app.DefaultKeyPass) tests.WaitForNextNBlocksTM(2, port) - proposalsQuery, _ = tests.ExecuteT(t, fmt.Sprintf("gaiacli query proposals --limit=1 %v", flags), "") + proposalsQuery, _ = tests.ExecuteT(t, fmt.Sprintf("gaiacli query gov proposals --limit=1 %v", flags), "") require.Equal(t, " 2 - Apples", proposalsQuery) } @@ -552,7 +552,6 @@ func TestGaiaCLIConfig(t *testing.T) { config, err := ioutil.ReadFile(path.Join(gaiacliHome, "config", "config.toml")) require.NoError(t, err) expectedConfig := fmt.Sprintf(`chain_id = "%s" -encoding = "btc" home = "%s" node = "%s" output = "text" @@ -570,8 +569,6 @@ trust_node = true executeWrite(t, "gaiacli config", gaiacliHome, node, "y") // ensure it works without an initialized gaiad state - expectedConfig = fmt.Sprintf(`chain_id = "" -encoding = "btc" home = "%s" node = "%s" output = "text" From 1aae086f49da70d70d075a74de6ec77777645c89 Mon Sep 17 00:00:00 2001 From: Jack Zampolin Date: Wed, 7 Nov 2018 16:48:55 -0800 Subject: [PATCH 20/47] Fix typo --- cmd/gaia/cli_test/cli_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/cmd/gaia/cli_test/cli_test.go b/cmd/gaia/cli_test/cli_test.go index 2d482350a9..73331c6ede 100644 --- a/cmd/gaia/cli_test/cli_test.go +++ b/cmd/gaia/cli_test/cli_test.go @@ -569,6 +569,7 @@ trust_node = true executeWrite(t, "gaiacli config", gaiacliHome, node, "y") // ensure it works without an initialized gaiad state + expectedConfig = fmt.Sprintf(`chain_id = "" home = "%s" node = "%s" output = "text" From 74549faac9712b975e29af1e6f5e978bee64653a Mon Sep 17 00:00:00 2001 From: Greg Szabo Date: Wed, 7 Nov 2018 22:42:43 -0500 Subject: [PATCH 21/47] Cross-compiling get_tools Makefile added --- Makefile | 4 ++-- PENDING.md | 2 +- scripts/Makefile | 54 ++++++++++++++++++++++++++++++++++++++++++++ scripts/get_tools.sh | 49 ---------------------------------------- 4 files changed, 57 insertions(+), 52 deletions(-) create mode 100644 scripts/Makefile delete mode 100755 scripts/get_tools.sh diff --git a/Makefile b/Makefile index 61ce099767..687eec1517 100644 --- a/Makefile +++ b/Makefile @@ -107,7 +107,7 @@ check_tools: update_tools: @echo "--> Updating tools to correct version" - ./scripts/get_tools.sh + $(MAKE) -C scripts get_tools update_dev_tools: @echo "--> Downloading linters (this may take awhile)" @@ -116,7 +116,7 @@ update_dev_tools: get_tools: @echo "--> Installing tools" - ./scripts/get_tools.sh + $(MAKE) -C scripts get_tools get_dev_tools: @echo "--> Downloading linters (this may take awhile)" diff --git a/PENDING.md b/PENDING.md index 6b0813c2c1..f0ffa8fcf2 100644 --- a/PENDING.md +++ b/PENDING.md @@ -41,7 +41,7 @@ IMPROVEMENTS * Gaia - #2637 [x/gov] Switched inactive and active proposal queues to an iterator based queue - - #2672 [Makefile] Updated for better Windows compatibility and ledger support logic + - #2672 [Makefile] Updated for better Windows compatibility and ledger support logic, get_tools was rewritten as a cross-compatible Makefile. * SDK - \#2573 [x/distribution] add accum invariance diff --git a/scripts/Makefile b/scripts/Makefile new file mode 100644 index 0000000000..9abc497e45 --- /dev/null +++ b/scripts/Makefile @@ -0,0 +1,54 @@ +### +# Find OS and Go environment +# GO contains the Go binary +# FS contains the OS file separator +### +ifeq ($(OS),Windows_NT) + GO := $(shell where go.exe 2> NUL) + FS := \\ +else + GO := $(shell command -v go 2> /dev/null) + FS := / +endif + +ifeq ($(GO),) + $(error could not find go. Is it in PATH? $(GO)) +endif + +GOPATH ?= $(shell $(GO) env GOPATH) +GITHUBDIR := $(GOPATH)$(FS)src$(FS)github.com + +### +# Functions +### + +go_get = $(if $(findstring Windows_NT,$(OS)),\ +IF NOT EXIST $(GITHUBDIR)$(FS)$(1)$(FS) ( mkdir $(GITHUBDIR)$(FS)$(1) ) else (cd .) &\ +IF NOT EXIST $(GITHUBDIR)$(FS)$(1)$(FS)$(2)$(FS) ( cd $(GITHUBDIR)$(FS)$(1) && git clone https://github.com/$(1)/$(2) ) else (cd .) &\ +,\ +mkdir -p $(GITHUBDIR)$(FS)$(1) &&\ +(test ! -d $(GITHUBDIR)$(FS)$(1)$(FS)$(2) && cd $(GITHUBDIR)$(FS)$(1) && git clone https://github.com/$(1)/$(2)) || true &&\ +)\ +cd $(GITHUBDIR)$(FS)$(1)$(FS)$(2) && git fetch origin && git checkout -q $(3) + +go_install = $(call go_get,$(1),$(2),$(3)) && cd $(GITHUBDIR)$(FS)$(1)$(FS)$(2) && $(GO) install + +### +# get_tools +### +all: get_tools +get_tools: dep gometalinter statik + +dep: + $(call go_get,golang,dep,22125cfaa6ddc71e145b1535d4b7ee9744fefff2) + cd $(GITHUBDIR)$(FS)golang$(FS)dep$(FS)cmd$(FS)dep && $(GO) install + +#v2.0.11 +gometalinter: + $(call go_install,alecthomas,gometalinter,17a7ffa42374937bfecabfb8d2efbd4db0c26741) + +statik: + $(call go_install,rakyll,statik,v0.1.5) + +.PHONY: all get_tools dep gometalinter statik + diff --git a/scripts/get_tools.sh b/scripts/get_tools.sh deleted file mode 100755 index 79ab32deca..0000000000 --- a/scripts/get_tools.sh +++ /dev/null @@ -1,49 +0,0 @@ -#!/usr/bin/env bash -set -e - -# This file downloads all of the binary dependencies we have, and checks out a -# specific git hash. -# -# repos it installs: -# github.com/golang/dep/cmd/dep -# gopkg.in/alecthomas/gometalinter.v2 -# github.com/rakyll/statiik - -## check if GOPATH is set -if [ -z ${GOPATH+x} ]; then - echo "please set GOPATH (https://github.com/golang/go/wiki/SettingGOPATH)" - exit 1 -fi - -mkdir -p "$GOPATH/src/github.com" -cd "$GOPATH/src/github.com" || exit 1 - -installFromGithub() { - repo=$1 - commit=$2 - # optional - subdir=$3 - echo "--> Installing $repo ($commit)..." - if [ ! -d "$repo" ]; then - mkdir -p "$repo" - git clone "https://github.com/$repo.git" "$repo" - fi - if [ ! -z ${subdir+x} ] && [ ! -d "$repo/$subdir" ]; then - echo "ERROR: no such directory $repo/$subdir" - exit 1 - fi - pushd "$repo" && \ - git fetch origin && \ - git checkout -q "$commit" && \ - if [ ! -z ${subdir+x} ]; then cd "$subdir" || exit 1; fi && \ - go install && \ - if [ ! -z ${subdir+x} ]; then cd - || exit 1; fi && \ - popd || exit 1 - echo "--> Done" - echo "" -} - -installFromGithub golang/dep 22125cfaa6ddc71e145b1535d4b7ee9744fefff2 cmd/dep -## gometalinter v2.0.11 -installFromGithub alecthomas/gometalinter 17a7ffa42374937bfecabfb8d2efbd4db0c26741 -installFromGithub rakyll/statik v0.1.5 \ No newline at end of file From 9bbd3e37112b52cb1b4b50cc8a1bdc0221a254e0 Mon Sep 17 00:00:00 2001 From: Greg Szabo Date: Thu, 8 Nov 2018 10:20:14 -0500 Subject: [PATCH 22/47] Removed comment from Makefile as per bez's request --- Makefile | 1 - 1 file changed, 1 deletion(-) diff --git a/Makefile b/Makefile index 687eec1517..62e145738f 100644 --- a/Makefile +++ b/Makefile @@ -18,7 +18,6 @@ ci: get_tools get_vendor_deps install test_cover test_lint test ######################################## ### Build/Install -# Add ledger support - Makefile variable changes are out of a target's scope. There is no point in putting this into a target. ifeq ($(LEDGER_ENABLED),true) ifeq ($(OS),Windows_NT) GCCEXE = $(shell where gcc.exe 2> NUL) From 8f4c7df0336108a849acb1fdb09ed77674db5294 Mon Sep 17 00:00:00 2001 From: Jack Zampolin Date: Thu, 8 Nov 2018 08:24:34 -0800 Subject: [PATCH 23/47] Address PR comments --- client/config.go | 1 - cmd/gaia/cmd/gaiacli/query.go | 6 +++--- cmd/gaia/cmd/gaiacli/tx.go | 8 ++++---- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/client/config.go b/client/config.go index 784ae0590b..b766106387 100644 --- a/client/config.go +++ b/client/config.go @@ -57,7 +57,6 @@ func runConfigCmd(cmd *cobra.Command, args []string) error { return err } - // var chainID string chainID, err := types.DefaultChainID() if err != nil { diff --git a/cmd/gaia/cmd/gaiacli/query.go b/cmd/gaia/cmd/gaiacli/query.go index 91734a8259..051d9427ae 100644 --- a/cmd/gaia/cmd/gaiacli/query.go +++ b/cmd/gaia/cmd/gaiacli/query.go @@ -24,7 +24,7 @@ func queryCmd(cdc *amino.Codec) *cobra.Command { // Group staking queries under a subcommand stakeQueryCmd := &cobra.Command{ Use: "stake", - Short: "Querying commands for staking module", + Short: "Querying commands for the staking module", } stakeQueryCmd.AddCommand(client.GetCommands( @@ -44,7 +44,7 @@ func queryCmd(cdc *amino.Codec) *cobra.Command { // Group gov queries under a subcommand govQueryCmd := &cobra.Command{ Use: "gov", - Short: "Querying commands for gov module", + Short: "Querying commands for the governance module", } govQueryCmd.AddCommand(client.GetCommands( @@ -58,7 +58,7 @@ func queryCmd(cdc *amino.Codec) *cobra.Command { // Group slashing queries under a subcommand slashingQueryCmd := &cobra.Command{ Use: "slashing", - Short: "Querying commands for slashing module", + Short: "Querying commands for the slashing module", } slashingQueryCmd.AddCommand(client.GetCommands( diff --git a/cmd/gaia/cmd/gaiacli/tx.go b/cmd/gaia/cmd/gaiacli/tx.go index 892e6ae7c4..fa0abc4ad8 100644 --- a/cmd/gaia/cmd/gaiacli/tx.go +++ b/cmd/gaia/cmd/gaiacli/tx.go @@ -22,7 +22,7 @@ func txCmd(cdc *amino.Codec) *cobra.Command { stakeTxCmd := &cobra.Command{ Use: "stake", - Short: "Stake Transactions subcommands", + Short: "Staking transaction subcommands", } stakeTxCmd.AddCommand(client.PostCommands( @@ -35,7 +35,7 @@ func txCmd(cdc *amino.Codec) *cobra.Command { distTxCmd := &cobra.Command{ Use: "dist", - Short: "Distribution Transactions subcommands", + Short: "Distribution transactions subcommands", } distTxCmd.AddCommand(client.PostCommands( @@ -45,7 +45,7 @@ func txCmd(cdc *amino.Codec) *cobra.Command { govTxCmd := &cobra.Command{ Use: "gov", - Short: "Governance Transactions subcommands", + Short: "Governance transactions subcommands", } govTxCmd.AddCommand(client.PostCommands( @@ -56,7 +56,7 @@ func txCmd(cdc *amino.Codec) *cobra.Command { slashingTxCmd := &cobra.Command{ Use: "slashing", - Short: "Slashing Transactions subcommands", + Short: "Slashing transactions subcommands", } slashingTxCmd.AddCommand(client.PostCommands( From 0ff12bb57a719d77da60b5ef1455406936e8acea Mon Sep 17 00:00:00 2001 From: Federico Kunze <31522760+fedekunze@users.noreply.github.com> Date: Thu, 8 Nov 2018 08:25:18 -0800 Subject: [PATCH 24/47] Update cmd/gaia/cmd/gaiacli/main.go Co-Authored-By: jackzampolin --- cmd/gaia/cmd/gaiacli/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/gaia/cmd/gaiacli/main.go b/cmd/gaia/cmd/gaiacli/main.go index e4ba7ec659..de99b0fc8f 100644 --- a/cmd/gaia/cmd/gaiacli/main.go +++ b/cmd/gaia/cmd/gaiacli/main.go @@ -50,7 +50,7 @@ func main() { // the below functions and eliminate global vars, like we do // with the cdc - // Consturct Root Command + // Construct Root Command rootCmd.AddCommand( rpc.InitClientCommand(), rpc.StatusCommand(), From 6c261eec66fd1dbd4955becdd46c96cf4d97e9ab Mon Sep 17 00:00:00 2001 From: Jack Zampolin Date: Thu, 8 Nov 2018 13:39:37 -0800 Subject: [PATCH 25/47] PENDING --- PENDING.md | 1 + 1 file changed, 1 insertion(+) diff --git a/PENDING.md b/PENDING.md index 8b2044ea29..26a0ec7769 100644 --- a/PENDING.md +++ b/PENDING.md @@ -5,6 +5,7 @@ BREAKING CHANGES * Gaia REST API (`gaiacli advanced rest-server`) * Gaia CLI (`gaiacli`) + * [cli] [\#2728](https://github.com/cosmos/cosmos-sdk/pull/2728) Seperate `tx` and `query` subcommands by module * Gaia * [gaiad init] \#2602 New genesis workflow From 3bc245e198252ac692f8788c2a76d848dfc28a3c Mon Sep 17 00:00:00 2001 From: zhangzheng Date: Sun, 11 Nov 2018 09:20:30 +0800 Subject: [PATCH 26/47] fix typo I think it might be a spelling mistake --- x/stake/types/params.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x/stake/types/params.go b/x/stake/types/params.go index 699758ace4..88e060f793 100644 --- a/x/stake/types/params.go +++ b/x/stake/types/params.go @@ -69,7 +69,7 @@ func (p Params) HumanReadableString() string { resp := "Params \n" resp += fmt.Sprintf("Unbonding Time: %s\n", p.UnbondingTime) - resp += fmt.Sprintf("Max Validators: %d: \n", p.MaxValidators) + resp += fmt.Sprintf("Max Validators: %d\n", p.MaxValidators) resp += fmt.Sprintf("Bonded Coin Denomination: %s\n", p.BondDenom) return resp } From 811b863677e0944dfad8a6b187cbab9d131c6e95 Mon Sep 17 00:00:00 2001 From: Alexander Bezobchuk Date: Mon, 12 Nov 2018 02:34:50 -0500 Subject: [PATCH 27/47] Use correct Bech32 prefix for show-address command (#2746) * Use consensus address bech32 prefix * Update show-address CLI description --- PENDING.md | 1 + server/tm_cmds.go | 8 ++++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/PENDING.md b/PENDING.md index f3eea20023..1ff6e3ee19 100644 --- a/PENDING.md +++ b/PENDING.md @@ -48,6 +48,7 @@ BUG FIXES * Gaia CLI (`gaiacli`) * Gaia + * [\#2723] Use `cosmosvalcons` Bech32 prefix in `tendermint show-address` * [\#2742](https://github.com/cosmos/cosmos-sdk/issues/2742) Fix time format of TimeoutCommit override * SDK diff --git a/server/tm_cmds.go b/server/tm_cmds.go index 82652bdec5..5aeacf92f3 100644 --- a/server/tm_cmds.go +++ b/server/tm_cmds.go @@ -63,17 +63,17 @@ func ShowValidatorCmd(ctx *Context) *cobra.Command { func ShowAddressCmd(ctx *Context) *cobra.Command { cmd := &cobra.Command{ Use: "show-address", - Short: "Shows this node's tendermint validator address", + Short: "Shows this node's tendermint validator consensus address", RunE: func(cmd *cobra.Command, args []string) error { cfg := ctx.Config privValidator := pvm.LoadOrGenFilePV(cfg.PrivValidatorFile()) - valAddr := (sdk.ValAddress)(privValidator.Address) + valConsAddr := (sdk.ConsAddress)(privValidator.Address) if viper.GetBool(client.FlagJson) { - return printlnJSON(valAddr) + return printlnJSON(valConsAddr) } - fmt.Println(valAddr.String()) + fmt.Println(valConsAddr.String()) return nil }, } From 156370ea9cef39f6d84255fa2b6201425916b53f Mon Sep 17 00:00:00 2001 From: Aleksandr Bezobchuk Date: Mon, 12 Nov 2018 08:15:08 -0500 Subject: [PATCH 28/47] Generate random moniker when missing --- PENDING.md | 1 + cmd/gaia/init/init.go | 12 ++++++++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/PENDING.md b/PENDING.md index 1ff6e3ee19..dd092f5ce1 100644 --- a/PENDING.md +++ b/PENDING.md @@ -34,6 +34,7 @@ IMPROVEMENTS * [\#2749](https://github.com/cosmos/cosmos-sdk/pull/2749) Add --chain-id flag to gaiad testnet * Gaia + * Generate random moniker on `gaiad init` if one was not provided. * SDK - [x/mock/simulation] [\#2720] major cleanup, introduction of helper objects, reorganization diff --git a/cmd/gaia/init/init.go b/cmd/gaia/init/init.go index a297caee23..5536a4fa9c 100644 --- a/cmd/gaia/init/init.go +++ b/cmd/gaia/init/init.go @@ -51,25 +51,32 @@ func InitCmd(ctx *server.Context, cdc *codec.Codec, appInit server.AppInit) *cob RunE: func(_ *cobra.Command, _ []string) error { config := ctx.Config config.SetRoot(viper.GetString(cli.HomeFlag)) + chainID := viper.GetString(client.FlagChainID) if chainID == "" { chainID = fmt.Sprintf("test-chain-%v", common.RandStr(6)) } + nodeID, _, err := InitializeNodeValidatorFiles(config) if err != nil { return err } - if viper.GetString(flagMoniker) != "" { - config.Moniker = viper.GetString(flagMoniker) + moniker := viper.GetString(flagMoniker) + if moniker == "" { + moniker = fmt.Sprintf("node-%v", common.RandStr(6)) } + config.Moniker = moniker + var appState json.RawMessage genFile := config.GenesisFile() + if appState, err = initializeEmptyGenesis(cdc, genFile, chainID, viper.GetBool(flagOverwrite)); err != nil { return err } + if err = ExportGenesisFile(genFile, chainID, nil, appState); err != nil { return err } @@ -91,5 +98,6 @@ func InitCmd(ctx *server.Context, cdc *codec.Codec, appInit server.AppInit) *cob cmd.Flags().BoolP(flagOverwrite, "o", false, "overwrite the genesis.json file") cmd.Flags().String(client.FlagChainID, "", "genesis file chain-id, if left blank will be randomly created") cmd.Flags().String(flagMoniker, "", "set the validator's moniker") + return cmd } From 29bec833f315956bee38f649d99f4956ed562e14 Mon Sep 17 00:00:00 2001 From: Aleksandr Bezobchuk Date: Mon, 12 Nov 2018 08:16:47 -0500 Subject: [PATCH 29/47] Update moniker prefix --- PENDING.md | 2 +- cmd/gaia/init/init.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/PENDING.md b/PENDING.md index dd092f5ce1..73c832c017 100644 --- a/PENDING.md +++ b/PENDING.md @@ -34,7 +34,7 @@ IMPROVEMENTS * [\#2749](https://github.com/cosmos/cosmos-sdk/pull/2749) Add --chain-id flag to gaiad testnet * Gaia - * Generate random moniker on `gaiad init` if one was not provided. + * Generate a random moniker on `gaiad init` if one was not provided. * SDK - [x/mock/simulation] [\#2720] major cleanup, introduction of helper objects, reorganization diff --git a/cmd/gaia/init/init.go b/cmd/gaia/init/init.go index 5536a4fa9c..ece9efb9a6 100644 --- a/cmd/gaia/init/init.go +++ b/cmd/gaia/init/init.go @@ -64,7 +64,7 @@ func InitCmd(ctx *server.Context, cdc *codec.Codec, appInit server.AppInit) *cob moniker := viper.GetString(flagMoniker) if moniker == "" { - moniker = fmt.Sprintf("node-%v", common.RandStr(6)) + moniker = fmt.Sprintf("gaianode-%v", common.RandStr(6)) } config.Moniker = moniker From 08a16672467dc6aaa9c951860434c05f3c98a455 Mon Sep 17 00:00:00 2001 From: Aleksandr Bezobchuk Date: Mon, 12 Nov 2018 08:27:26 -0500 Subject: [PATCH 30/47] Require moniker instead of generating a random one --- PENDING.md | 2 +- cmd/gaia/init/init.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/PENDING.md b/PENDING.md index 73c832c017..bb757f7c0e 100644 --- a/PENDING.md +++ b/PENDING.md @@ -34,7 +34,7 @@ IMPROVEMENTS * [\#2749](https://github.com/cosmos/cosmos-sdk/pull/2749) Add --chain-id flag to gaiad testnet * Gaia - * Generate a random moniker on `gaiad init` if one was not provided. + * Require moniker to be provided on `gaiad init`. * SDK - [x/mock/simulation] [\#2720] major cleanup, introduction of helper objects, reorganization diff --git a/cmd/gaia/init/init.go b/cmd/gaia/init/init.go index ece9efb9a6..852ecc3f89 100644 --- a/cmd/gaia/init/init.go +++ b/cmd/gaia/init/init.go @@ -64,7 +64,7 @@ func InitCmd(ctx *server.Context, cdc *codec.Codec, appInit server.AppInit) *cob moniker := viper.GetString(flagMoniker) if moniker == "" { - moniker = fmt.Sprintf("gaianode-%v", common.RandStr(6)) + return fmt.Errorf("required flag \"%s\" has not been set", flagMoniker) } config.Moniker = moniker From fdad4aa4da1f6bcc8adbb58fe7edaa69178e3fda Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Mon, 12 Nov 2018 08:38:19 -0500 Subject: [PATCH 31/47] update to tendermint v0.26.1 --- Gopkg.lock | 6 +++--- Gopkg.toml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Gopkg.lock b/Gopkg.lock index 9289fd24b5..3aecfa090b 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -434,7 +434,7 @@ version = "v0.11.1" [[projects]] - digest = "1:5b1373b03f39e6f6061cd91f3829100527ebb5f94240c092bf9e5d314b153501" + digest = "1:ba2ba7d6a0853472bdb7a64c4f9c1d5f9cba0eb7aac0b024654104387bf5eb57" name = "github.com/tendermint/tendermint" packages = [ "abci/client", @@ -500,8 +500,8 @@ "version", ] pruneopts = "UT" - revision = "48ab899923c564bbf2fa2f1244c11cb930e28132" - version = "v0.26.1-rc3" + revision = "80d0a362500fea2dd089258319075a54e5d40a2d" + version = "v0.26.1" [[projects]] digest = "1:7886f86064faff6f8d08a3eb0e8c773648ff5a2e27730831e2bfbf07467f6666" diff --git a/Gopkg.toml b/Gopkg.toml index 466fd373fe..90f54c6570 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -36,7 +36,7 @@ [[override]] name = "github.com/tendermint/tendermint" - version = "v0.26.1-rc3" # TODO replace w/ 0.26.1 + version = "v0.26.1" ## deps without releases: From 8c14b1d77ff756db2d34b197018bf351628863e9 Mon Sep 17 00:00:00 2001 From: Aleksandr Bezobchuk Date: Mon, 12 Nov 2018 08:45:05 -0500 Subject: [PATCH 32/47] Fix test coverage --- cmd/gaia/init/init.go | 8 ++------ cmd/gaia/init/init_test.go | 17 ++++++++++++++--- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/cmd/gaia/init/init.go b/cmd/gaia/init/init.go index 852ecc3f89..bb56de1bd6 100644 --- a/cmd/gaia/init/init.go +++ b/cmd/gaia/init/init.go @@ -62,12 +62,7 @@ func InitCmd(ctx *server.Context, cdc *codec.Codec, appInit server.AppInit) *cob return err } - moniker := viper.GetString(flagMoniker) - if moniker == "" { - return fmt.Errorf("required flag \"%s\" has not been set", flagMoniker) - } - - config.Moniker = moniker + config.Moniker = viper.GetString(flagMoniker) var appState json.RawMessage genFile := config.GenesisFile() @@ -94,6 +89,7 @@ func InitCmd(ctx *server.Context, cdc *codec.Codec, appInit server.AppInit) *cob }, } + cmd.MarkFlagRequired(flagMoniker) cmd.Flags().String(cli.HomeFlag, app.DefaultNodeHome, "node's home directory") cmd.Flags().BoolP(flagOverwrite, "o", false, "overwrite the genesis.json file") cmd.Flags().String(client.FlagChainID, "", "genesis file chain-id, if left blank will be randomly created") diff --git a/cmd/gaia/init/init_test.go b/cmd/gaia/init/init_test.go index bd5274c261..d1d9b9ce2d 100644 --- a/cmd/gaia/init/init_test.go +++ b/cmd/gaia/init/init_test.go @@ -2,15 +2,16 @@ package init import ( "bytes" - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/cmd/gaia/app" - "github.com/tendermint/tendermint/libs/cli" "io" "io/ioutil" "os" "testing" "time" + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/cmd/gaia/app" + "github.com/tendermint/tendermint/libs/cli" + "github.com/cosmos/cosmos-sdk/server" "github.com/cosmos/cosmos-sdk/server/mock" "github.com/stretchr/testify/require" @@ -28,12 +29,16 @@ func TestInitCmd(t *testing.T) { logger := log.NewNopLogger() cfg, err := tcmd.ParseConfig() require.Nil(t, err) + ctx := server.NewContext(cfg, logger) cdc := app.MakeCodec() appInit := server.AppInit{ AppGenState: mock.AppGenState, } cmd := InitCmd(ctx, cdc, appInit) + + viper.Set(flagMoniker, "gaianode-test") + err = cmd.RunE(nil, nil) require.NoError(t, err) } @@ -53,14 +58,19 @@ func setupClientHome(t *testing.T) func() { func TestEmptyState(t *testing.T) { defer server.SetupViper(t)() defer setupClientHome(t)() + logger := log.NewNopLogger() cfg, err := tcmd.ParseConfig() require.Nil(t, err) + ctx := server.NewContext(cfg, logger) cdc := app.MakeCodec() appInit := server.AppInit{ AppGenState: mock.AppGenStateEmpty, } + + viper.Set(flagMoniker, "gaianode-test") + cmd := InitCmd(ctx, cdc, appInit) err = cmd.RunE(nil, nil) require.NoError(t, err) @@ -69,6 +79,7 @@ func TestEmptyState(t *testing.T) { r, w, _ := os.Pipe() os.Stdout = w cmd = server.ExportCmd(ctx, cdc, nil) + err = cmd.RunE(nil, nil) require.NoError(t, err) From 2d38a96a6db5d9a90a63b1328012b33e40560b07 Mon Sep 17 00:00:00 2001 From: Jack Zampolin Date: Mon, 12 Nov 2018 09:44:45 -0800 Subject: [PATCH 33/47] Fix date to be cross platform --- scripts/multisim.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/multisim.sh b/scripts/multisim.sh index ff5784e4bf..2376eb3a8f 100755 --- a/scripts/multisim.sh +++ b/scripts/multisim.sh @@ -17,7 +17,7 @@ echo "Using temporary log directory: $tmpdir" sim() { seed=$1 echo "Running full Gaia simulation with seed $seed. This may take awhile!" - file="$tmpdir/gaia-simulation-seed-$seed-date-$(date -Iseconds -u).stdout" + file="$tmpdir/gaia-simulation-seed-$seed-date-$(date -u +"%Y-%m-%dT%H:%M:%S+00:00").stdout" echo "Writing stdout to $file..." go test ./cmd/gaia/app -run TestFullGaiaSimulation -SimulationEnabled=true -SimulationNumBlocks=$blocks \ -SimulationVerbose=true -SimulationCommit=true -SimulationSeed=$seed -v -timeout 24h > $file From 70826495b88df7a9a687bd766e6efe79ff3cc644 Mon Sep 17 00:00:00 2001 From: Alessio Treglia Date: Mon, 12 Nov 2018 18:54:18 +0000 Subject: [PATCH 34/47] Merge PR #2752: Don't hardcode bondable denom --- PENDING.md | 1 + client/lcd/lcd_test.go | 29 +++--- client/lcd/test_helpers.go | 7 +- cmd/gaia/app/genesis.go | 9 +- cmd/gaia/app/sim_test.go | 9 +- cmd/gaia/cli_test/cli_test.go | 91 ++++++++++--------- cmd/gaia/init/gentx.go | 3 +- cmd/gaia/init/testnet.go | 5 +- examples/democoin/x/simplestake/keeper.go | 2 +- .../democoin/x/simplestake/keeper_test.go | 4 +- types/coin_test.go | 8 +- types/utils_test.go | 4 +- x/auth/client/txbuilder/txbuilder_test.go | 5 +- x/gov/endblocker_test.go | 15 +-- x/gov/genesis.go | 3 +- x/gov/keeper_test.go | 9 +- x/gov/msgs_test.go | 19 ++-- x/gov/simulation/msgs.go | 3 +- x/gov/tally_test.go | 25 ++--- x/gov/test_common.go | 3 +- x/mint/params.go | 3 +- x/slashing/app_test.go | 12 ++- x/slashing/test_common.go | 5 +- x/stake/app_test.go | 10 +- x/stake/keeper/delegation_test.go | 4 +- x/stake/querier/queryable_test.go | 4 +- x/stake/simulation/invariants.go | 13 +-- x/stake/test_common.go | 8 +- x/stake/types/msg_test.go | 6 +- x/stake/types/params.go | 5 +- 30 files changed, 178 insertions(+), 146 deletions(-) diff --git a/PENDING.md b/PENDING.md index 1ff6e3ee19..48d5fe0e1f 100644 --- a/PENDING.md +++ b/PENDING.md @@ -9,6 +9,7 @@ BREAKING CHANGES * Gaia * SDK + * [\#2752](https://github.com/cosmos/cosmos-sdk/pull/2752) Don't hardcode bondable denom. * Tendermint diff --git a/client/lcd/lcd_test.go b/client/lcd/lcd_test.go index 92167346d2..9b042832b9 100644 --- a/client/lcd/lcd_test.go +++ b/client/lcd/lcd_test.go @@ -31,6 +31,7 @@ import ( "github.com/cosmos/cosmos-sdk/x/gov" "github.com/cosmos/cosmos-sdk/x/slashing" "github.com/cosmos/cosmos-sdk/x/stake" + stakeTypes "github.com/cosmos/cosmos-sdk/x/stake/types" ) func init() { @@ -265,7 +266,7 @@ func TestCoinSend(t *testing.T) { coins := acc.GetCoins() mycoins := coins[0] - require.Equal(t, "steak", mycoins.Denom) + require.Equal(t, stakeTypes.DefaultBondDenom, mycoins.Denom) require.Equal(t, initialBalance[0].Amount.SubRaw(1), mycoins.Amount) // query receiver @@ -273,7 +274,7 @@ func TestCoinSend(t *testing.T) { coins = acc.GetCoins() mycoins = coins[0] - require.Equal(t, "steak", mycoins.Denom) + require.Equal(t, stakeTypes.DefaultBondDenom, mycoins.Denom) require.Equal(t, int64(1), mycoins.Amount.Int64()) // test failure with too little gas @@ -326,7 +327,7 @@ func DisabledTestIBCTransfer(t *testing.T) { coins := acc.GetCoins() mycoins := coins[0] - require.Equal(t, "steak", mycoins.Denom) + require.Equal(t, stakeTypes.DefaultBondDenom, mycoins.Denom) require.Equal(t, initialBalance[0].Amount.SubRaw(1), mycoins.Amount) // TODO: query ibc egress packet state @@ -514,7 +515,7 @@ func TestValidatorQuery(t *testing.T) { } func TestBonding(t *testing.T) { - name, password, denom := "test", "1234567890", "steak" + name, password, denom := "test", "1234567890", stakeTypes.DefaultBondDenom addr, seed := CreateAddr(t, name, password, GetKeyBase(t)) cleanup, valPubKeys, operAddrs, port := InitializeTestLCD(t, 2, []sdk.AccAddress{addr}) @@ -564,7 +565,7 @@ func TestBonding(t *testing.T) { // sender should have not received any coins as the unbonding has only just begun acc = getAccount(t, port, addr) coins = acc.GetCoins() - require.Equal(t, int64(40), coins.AmountOf("steak").Int64()) + require.Equal(t, int64(40), coins.AmountOf(stakeTypes.DefaultBondDenom).Int64()) unbonding := getUndelegation(t, port, addr, operAddrs[0]) require.Equal(t, "30", unbonding.Balance.Amount.String()) @@ -663,11 +664,11 @@ func TestDeposit(t *testing.T) { // query proposal proposal = getProposal(t, port, proposalID) - require.True(t, proposal.GetTotalDeposit().IsEqual(sdk.Coins{sdk.NewInt64Coin("steak", 10)})) + require.True(t, proposal.GetTotalDeposit().IsEqual(sdk.Coins{sdk.NewInt64Coin(stakeTypes.DefaultBondDenom, 10)})) // query deposit deposit := getDeposit(t, port, proposalID, addr) - require.True(t, deposit.Amount.IsEqual(sdk.Coins{sdk.NewInt64Coin("steak", 10)})) + require.True(t, deposit.Amount.IsEqual(sdk.Coins{sdk.NewInt64Coin(stakeTypes.DefaultBondDenom, 10)})) } func TestVote(t *testing.T) { @@ -861,7 +862,7 @@ func doSendWithGas(t *testing.T, port, seed, name, password string, addr sdk.Acc sequence := acc.GetSequence() chainID := viper.GetString(client.FlagChainID) // send - coinbz, err := cdc.MarshalJSON(sdk.NewInt64Coin("steak", 1)) + coinbz, err := cdc.MarshalJSON(sdk.NewInt64Coin(stakeTypes.DefaultBondDenom, 1)) if err != nil { panic(err) } @@ -947,7 +948,7 @@ func doIBCTransfer(t *testing.T, port, seed, name, password string, addr sdk.Acc "account_number":"%d", "sequence":"%d" } - }`, "steak", name, password, chainID, accnum, sequence)) + }`, stakeTypes.DefaultBondDenom, name, password, chainID, accnum, sequence)) res, body := Request(t, port, "POST", fmt.Sprintf("/ibc/testchain/%s/send", receiveAddr), jsonStr) require.Equal(t, http.StatusOK, res.StatusCode, body) @@ -1096,7 +1097,7 @@ func doDelegate(t *testing.T, port, seed, name, password string, "account_number":"%d", "sequence":"%d" } - }`, delAddr, valAddr, "steak", amount, name, password, chainID, accnum, sequence)) + }`, delAddr, valAddr, stakeTypes.DefaultBondDenom, amount, name, password, chainID, accnum, sequence)) res, body := Request(t, port, "POST", fmt.Sprintf("/stake/delegators/%s/delegations", delAddr), jsonStr) require.Equal(t, http.StatusOK, res.StatusCode, body) @@ -1339,7 +1340,7 @@ func doSubmitProposal(t *testing.T, port, seed, name, password string, proposerA "description": "test", "proposal_type": "Text", "proposer": "%s", - "initial_deposit": [{ "denom": "steak", "amount": "%d" }], + "initial_deposit": [{ "denom": "%s", "amount": "%d" }], "base_req": { "name": "%s", "password": "%s", @@ -1347,7 +1348,7 @@ func doSubmitProposal(t *testing.T, port, seed, name, password string, proposerA "account_number":"%d", "sequence":"%d" } - }`, proposerAddr, amount, name, password, chainID, accnum, sequence)) + }`, proposerAddr, stakeTypes.DefaultBondDenom, amount, name, password, chainID, accnum, sequence)) res, body := Request(t, port, "POST", "/gov/proposals", jsonStr) require.Equal(t, http.StatusOK, res.StatusCode, body) @@ -1369,7 +1370,7 @@ func doDeposit(t *testing.T, port, seed, name, password string, proposerAddr sdk // deposit on proposal jsonStr := []byte(fmt.Sprintf(`{ "depositer": "%s", - "amount": [{ "denom": "steak", "amount": "%d" }], + "amount": [{ "denom": "%s", "amount": "%d" }], "base_req": { "name": "%s", "password": "%s", @@ -1377,7 +1378,7 @@ func doDeposit(t *testing.T, port, seed, name, password string, proposerAddr sdk "account_number":"%d", "sequence": "%d" } - }`, proposerAddr, amount, name, password, chainID, accnum, sequence)) + }`, proposerAddr, stakeTypes.DefaultBondDenom, amount, name, password, chainID, accnum, sequence)) res, body := Request(t, port, "POST", fmt.Sprintf("/gov/proposals/%d/deposits", proposalID), jsonStr) require.Equal(t, http.StatusOK, res.StatusCode, body) diff --git a/client/lcd/test_helpers.go b/client/lcd/test_helpers.go index 39c76865cc..283550a16a 100644 --- a/client/lcd/test_helpers.go +++ b/client/lcd/test_helpers.go @@ -5,6 +5,7 @@ import ( "encoding/json" "fmt" "github.com/cosmos/cosmos-sdk/x/stake" + stakeTypes "github.com/cosmos/cosmos-sdk/x/stake/types" "github.com/tendermint/tendermint/crypto/secp256k1" "io/ioutil" "net" @@ -227,7 +228,7 @@ func InitializeTestLCD( msg := stake.NewMsgCreateValidator( sdk.ValAddress(operAddr), pubKey, - sdk.NewCoin("steak", sdk.NewInt(int64(delegation))), + sdk.NewCoin(stakeTypes.DefaultBondDenom, sdk.NewInt(int64(delegation))), stake.Description{Moniker: fmt.Sprintf("validator-%d", i+1)}, stake.NewCommissionMsg(sdk.ZeroDec(), sdk.ZeroDec(), sdk.ZeroDec()), ) @@ -245,7 +246,7 @@ func InitializeTestLCD( valOperAddrs = append(valOperAddrs, sdk.ValAddress(operAddr)) accAuth := auth.NewBaseAccountWithAddress(sdk.AccAddress(operAddr)) - accAuth.Coins = sdk.Coins{sdk.NewInt64Coin("steak", 150)} + accAuth.Coins = sdk.Coins{sdk.NewInt64Coin(stakeTypes.DefaultBondDenom, 150)} accs = append(accs, gapp.NewGenesisAccount(&accAuth)) } @@ -259,7 +260,7 @@ func InitializeTestLCD( // add some tokens to init accounts for _, addr := range initAddrs { accAuth := auth.NewBaseAccountWithAddress(addr) - accAuth.Coins = sdk.Coins{sdk.NewInt64Coin("steak", 100)} + accAuth.Coins = sdk.Coins{sdk.NewInt64Coin(stakeTypes.DefaultBondDenom, 100)} acc := gapp.NewGenesisAccount(&accAuth) genesisState.Accounts = append(genesisState.Accounts, acc) genesisState.StakeData.Pool.LooseTokens = genesisState.StakeData.Pool.LooseTokens.Add(sdk.NewDec(100)) diff --git a/cmd/gaia/app/genesis.go b/cmd/gaia/app/genesis.go index 38256e4150..e3c869ada1 100644 --- a/cmd/gaia/app/genesis.go +++ b/cmd/gaia/app/genesis.go @@ -19,6 +19,7 @@ import ( "github.com/cosmos/cosmos-sdk/x/mint" "github.com/cosmos/cosmos-sdk/x/slashing" "github.com/cosmos/cosmos-sdk/x/stake" + stakeTypes "github.com/cosmos/cosmos-sdk/x/stake/types" tmtypes "github.com/tendermint/tendermint/types" ) @@ -26,7 +27,7 @@ var ( // bonded tokens given to genesis validators/accounts freeFermionVal = int64(100) freeFermionsAcc = sdk.NewInt(150) - bondDenom = "steak" + bondDenom = stakeTypes.DefaultBondDenom ) // State to Unmarshal @@ -286,9 +287,11 @@ func CollectStdTxs(cdc *codec.Codec, moniker string, genTxsDir string, genDoc tm func NewDefaultGenesisAccount(addr sdk.AccAddress) GenesisAccount { accAuth := auth.NewBaseAccountWithAddress(addr) - accAuth.Coins = []sdk.Coin{ + coins :=sdk.Coins{ {"fooToken", sdk.NewInt(1000)}, - {"steak", freeFermionsAcc}, + {bondDenom, freeFermionsAcc}, } + coins.Sort() + accAuth.Coins = coins return NewGenesisAccount(&accAuth) } diff --git a/cmd/gaia/app/sim_test.go b/cmd/gaia/app/sim_test.go index 60befcc385..e56344554a 100644 --- a/cmd/gaia/app/sim_test.go +++ b/cmd/gaia/app/sim_test.go @@ -29,6 +29,7 @@ import ( slashingsim "github.com/cosmos/cosmos-sdk/x/slashing/simulation" stake "github.com/cosmos/cosmos-sdk/x/stake" stakesim "github.com/cosmos/cosmos-sdk/x/stake/simulation" + stakeTypes "github.com/cosmos/cosmos-sdk/x/stake/types" ) var ( @@ -62,7 +63,7 @@ func appStateFn(r *rand.Rand, accs []simulation.Account) json.RawMessage { // Randomly generate some genesis accounts for _, acc := range accs { - coins := sdk.Coins{sdk.Coin{"steak", sdk.NewInt(amount)}} + coins := sdk.Coins{sdk.Coin{stakeTypes.DefaultBondDenom, sdk.NewInt(amount)}} genesisAccounts = append(genesisAccounts, GenesisAccount{ Address: acc.Address, Coins: coins, @@ -73,7 +74,7 @@ func appStateFn(r *rand.Rand, accs []simulation.Account) json.RawMessage { govGenesis := gov.GenesisState{ StartingProposalID: uint64(r.Intn(100)), DepositParams: gov.DepositParams{ - MinDeposit: sdk.Coins{sdk.NewInt64Coin("steak", int64(r.Intn(1e3)))}, + MinDeposit: sdk.Coins{sdk.NewInt64Coin(stakeTypes.DefaultBondDenom, int64(r.Intn(1e3)))}, MaxDepositPeriod: time.Duration(r.Intn(2*172800)) * time.Second, }, VotingParams: gov.VotingParams{ @@ -91,7 +92,7 @@ func appStateFn(r *rand.Rand, accs []simulation.Account) json.RawMessage { Params: stake.Params{ UnbondingTime: time.Duration(r.Intn(60*60*24*3*2)) * time.Second, MaxValidators: uint16(r.Intn(250)), - BondDenom: "steak", + BondDenom: stakeTypes.DefaultBondDenom, }, } fmt.Printf("Selected randomly generated staking parameters: %+v\n", stakeGenesis) @@ -113,7 +114,7 @@ func appStateFn(r *rand.Rand, accs []simulation.Account) json.RawMessage { Inflation: sdk.NewDecWithPrec(int64(r.Intn(99)), 2), }, Params: mint.Params{ - MintDenom: "steak", + MintDenom: stakeTypes.DefaultBondDenom, InflationRateChange: sdk.NewDecWithPrec(int64(r.Intn(99)), 2), InflationMax: sdk.NewDecWithPrec(20, 2), InflationMin: sdk.NewDecWithPrec(7, 2), diff --git a/cmd/gaia/cli_test/cli_test.go b/cmd/gaia/cli_test/cli_test.go index bc9151200c..07cbbab786 100644 --- a/cmd/gaia/cli_test/cli_test.go +++ b/cmd/gaia/cli_test/cli_test.go @@ -29,6 +29,7 @@ import ( "github.com/cosmos/cosmos-sdk/x/auth" "github.com/cosmos/cosmos-sdk/x/gov" "github.com/cosmos/cosmos-sdk/x/stake" + stakeTypes "github.com/cosmos/cosmos-sdk/x/stake/types" ) var ( @@ -55,10 +56,10 @@ func TestGaiaCLIMinimumFees(t *testing.T) { barAddr, _ := executeGetAddrPK(t, fmt.Sprintf("gaiacli keys show bar --output=json --home=%s", gaiacliHome)) fooAcc := executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", fooAddr, flags)) - require.Equal(t, int64(50), fooAcc.GetCoins().AmountOf("steak").Int64()) + require.Equal(t, int64(50), fooAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64()) success := executeWrite(t, fmt.Sprintf( - "gaiacli tx send %v --amount=10steak --to=%s --from=foo", flags, barAddr), app.DefaultKeyPass) + "gaiacli tx send %v --amount=10%s --to=%s --from=foo", flags, stakeTypes.DefaultBondDenom, barAddr), app.DefaultKeyPass) require.False(t, success) tests.WaitForNextNBlocksTM(2, port) @@ -121,40 +122,40 @@ func TestGaiaCLISend(t *testing.T) { barAddr, _ := executeGetAddrPK(t, fmt.Sprintf("gaiacli keys show bar --output=json --home=%s", gaiacliHome)) fooAcc := executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", fooAddr, flags)) - require.Equal(t, int64(50), fooAcc.GetCoins().AmountOf("steak").Int64()) + require.Equal(t, int64(50), fooAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64()) - executeWrite(t, fmt.Sprintf("gaiacli tx send %v --amount=10steak --to=%s --from=foo", flags, barAddr), app.DefaultKeyPass) + executeWrite(t, fmt.Sprintf("gaiacli tx send %v --amount=10%s --to=%s --from=foo", flags, stakeTypes.DefaultBondDenom, barAddr), app.DefaultKeyPass) tests.WaitForNextNBlocksTM(2, port) barAcc := executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", barAddr, flags)) - require.Equal(t, int64(10), barAcc.GetCoins().AmountOf("steak").Int64()) + require.Equal(t, int64(10), barAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64()) fooAcc = executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", fooAddr, flags)) - require.Equal(t, int64(40), fooAcc.GetCoins().AmountOf("steak").Int64()) + require.Equal(t, int64(40), fooAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64()) // Test --dry-run - success := executeWrite(t, fmt.Sprintf("gaiacli tx send %v --amount=10steak --to=%s --from=foo --dry-run", flags, barAddr), app.DefaultKeyPass) + success := executeWrite(t, fmt.Sprintf("gaiacli tx send %v --amount=10%s --to=%s --from=foo --dry-run", flags, stakeTypes.DefaultBondDenom, barAddr), app.DefaultKeyPass) require.True(t, success) // Check state didn't change fooAcc = executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", fooAddr, flags)) - require.Equal(t, int64(40), fooAcc.GetCoins().AmountOf("steak").Int64()) + require.Equal(t, int64(40), fooAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64()) // test autosequencing - executeWrite(t, fmt.Sprintf("gaiacli tx send %v --amount=10steak --to=%s --from=foo", flags, barAddr), app.DefaultKeyPass) + executeWrite(t, fmt.Sprintf("gaiacli tx send %v --amount=10%s --to=%s --from=foo", flags, stakeTypes.DefaultBondDenom, barAddr), app.DefaultKeyPass) tests.WaitForNextNBlocksTM(2, port) barAcc = executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", barAddr, flags)) - require.Equal(t, int64(20), barAcc.GetCoins().AmountOf("steak").Int64()) + require.Equal(t, int64(20), barAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64()) fooAcc = executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", fooAddr, flags)) - require.Equal(t, int64(30), fooAcc.GetCoins().AmountOf("steak").Int64()) + require.Equal(t, int64(30), fooAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64()) // test memo - executeWrite(t, fmt.Sprintf("gaiacli tx send %v --amount=10steak --to=%s --from=foo --memo 'testmemo'", flags, barAddr), app.DefaultKeyPass) + executeWrite(t, fmt.Sprintf("gaiacli tx send %v --amount=10%s --to=%s --from=foo --memo 'testmemo'", flags, stakeTypes.DefaultBondDenom, barAddr), app.DefaultKeyPass) tests.WaitForNextNBlocksTM(2, port) barAcc = executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", barAddr, flags)) - require.Equal(t, int64(30), barAcc.GetCoins().AmountOf("steak").Int64()) + require.Equal(t, int64(30), barAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64()) fooAcc = executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", fooAddr, flags)) - require.Equal(t, int64(20), fooAcc.GetCoins().AmountOf("steak").Int64()) + require.Equal(t, int64(20), fooAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64()) } func TestGaiaCLIGasAuto(t *testing.T) { @@ -172,26 +173,26 @@ func TestGaiaCLIGasAuto(t *testing.T) { barAddr, _ := executeGetAddrPK(t, fmt.Sprintf("gaiacli keys show bar --output=json --home=%s", gaiacliHome)) fooAcc := executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", fooAddr, flags)) - require.Equal(t, int64(50), fooAcc.GetCoins().AmountOf("steak").Int64()) + require.Equal(t, int64(50), fooAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64()) // Test failure with auto gas disabled and very little gas set by hand - success := executeWrite(t, fmt.Sprintf("gaiacli tx send %v --gas=10 --amount=10steak --to=%s --from=foo", flags, barAddr), app.DefaultKeyPass) + success := executeWrite(t, fmt.Sprintf("gaiacli tx send %v --gas=10 --amount=10%s --to=%s --from=foo", flags, stakeTypes.DefaultBondDenom, barAddr), app.DefaultKeyPass) require.False(t, success) tests.WaitForNextNBlocksTM(2, port) // Check state didn't change fooAcc = executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", fooAddr, flags)) - require.Equal(t, int64(50), fooAcc.GetCoins().AmountOf("steak").Int64()) + require.Equal(t, int64(50), fooAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64()) // Test failure with negative gas - success = executeWrite(t, fmt.Sprintf("gaiacli tx send %v --gas=-100 --amount=10steak --to=%s --from=foo", flags, barAddr), app.DefaultKeyPass) + success = executeWrite(t, fmt.Sprintf("gaiacli tx send %v --gas=-100 --amount=10%s --to=%s --from=foo", flags, stakeTypes.DefaultBondDenom, barAddr), app.DefaultKeyPass) require.False(t, success) // Test failure with 0 gas - success = executeWrite(t, fmt.Sprintf("gaiacli tx send %v --gas=0 --amount=10steak --to=%s --from=foo", flags, barAddr), app.DefaultKeyPass) + success = executeWrite(t, fmt.Sprintf("gaiacli tx send %v --gas=0 --amount=10%s --to=%s --from=foo", flags, stakeTypes.DefaultBondDenom, barAddr), app.DefaultKeyPass) require.False(t, success) // Enable auto gas - success, stdout, _ := executeWriteRetStdStreams(t, fmt.Sprintf("gaiacli tx send %v --json --gas=simulate --amount=10steak --to=%s --from=foo", flags, barAddr), app.DefaultKeyPass) + success, stdout, _ := executeWriteRetStdStreams(t, fmt.Sprintf("gaiacli tx send %v --json --gas=simulate --amount=10%s --to=%s --from=foo", flags, stakeTypes.DefaultBondDenom, barAddr), app.DefaultKeyPass) require.True(t, success) // check that gas wanted == gas used cdc := app.MakeCodec() @@ -205,7 +206,7 @@ func TestGaiaCLIGasAuto(t *testing.T) { tests.WaitForNextNBlocksTM(2, port) // Check state has changed accordingly fooAcc = executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", fooAddr, flags)) - require.Equal(t, int64(40), fooAcc.GetCoins().AmountOf("steak").Int64()) + require.Equal(t, int64(40), fooAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64()) } func TestGaiaCLICreateValidator(t *testing.T) { @@ -223,13 +224,13 @@ func TestGaiaCLICreateValidator(t *testing.T) { barAddr, barPubKey := executeGetAddrPK(t, fmt.Sprintf("gaiacli keys show bar --output=json --home=%s", gaiacliHome)) barCeshPubKey := sdk.MustBech32ifyConsPub(barPubKey) - executeWrite(t, fmt.Sprintf("gaiacli tx send %v --amount=10steak --to=%s --from=foo", flags, barAddr), app.DefaultKeyPass) + executeWrite(t, fmt.Sprintf("gaiacli tx send %v --amount=10%s --to=%s --from=foo", flags, stakeTypes.DefaultBondDenom, barAddr), app.DefaultKeyPass) tests.WaitForNextNBlocksTM(2, port) barAcc := executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", barAddr, flags)) - require.Equal(t, int64(10), barAcc.GetCoins().AmountOf("steak").Int64()) + require.Equal(t, int64(10), barAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64()) fooAcc := executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", fooAddr, flags)) - require.Equal(t, int64(40), fooAcc.GetCoins().AmountOf("steak").Int64()) + require.Equal(t, int64(40), fooAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64()) defaultParams := stake.DefaultParams() initialPool := stake.InitialPool() @@ -239,7 +240,7 @@ func TestGaiaCLICreateValidator(t *testing.T) { cvStr := fmt.Sprintf("gaiacli tx create-validator %v", flags) cvStr += fmt.Sprintf(" --from=%s", "bar") cvStr += fmt.Sprintf(" --pubkey=%s", barCeshPubKey) - cvStr += fmt.Sprintf(" --amount=%v", "2steak") + cvStr += fmt.Sprintf(" --amount=%v", fmt.Sprintf("2%s", stakeTypes.DefaultBondDenom)) cvStr += fmt.Sprintf(" --moniker=%v", "bar-vally") cvStr += fmt.Sprintf(" --commission-rate=%v", "0.05") cvStr += fmt.Sprintf(" --commission-max-rate=%v", "0.20") @@ -265,7 +266,7 @@ func TestGaiaCLICreateValidator(t *testing.T) { tests.WaitForNextNBlocksTM(2, port) barAcc = executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", barAddr, flags)) - require.Equal(t, int64(8), barAcc.GetCoins().AmountOf("steak").Int64(), "%v", barAcc) + require.Equal(t, int64(8), barAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64(), "%v", barAcc) validator := executeGetValidator(t, fmt.Sprintf("gaiacli query validator %s --output=json %v", sdk.ValAddress(barAddr), flags)) require.Equal(t, validator.OperatorAddr, sdk.ValAddress(barAddr)) @@ -283,7 +284,7 @@ func TestGaiaCLICreateValidator(t *testing.T) { /* // this won't be what we expect because we've only started unbonding, haven't completed barAcc = executeGetAccount(t, fmt.Sprintf("gaiacli query account %v %v", barCech, flags)) - require.Equal(t, int64(9), barAcc.GetCoins().AmountOf("steak").Int64(), "%v", barAcc) + require.Equal(t, int64(9), barAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64(), "%v", barAcc) */ validator = executeGetValidator(t, fmt.Sprintf("gaiacli query validator %s --output=json %v", sdk.ValAddress(barAddr), flags)) require.Equal(t, "1.0000000000", validator.Tokens.String()) @@ -315,7 +316,7 @@ func TestGaiaCLISubmitProposal(t *testing.T) { fooAddr, _ := executeGetAddrPK(t, fmt.Sprintf("gaiacli keys show foo --output=json --home=%s", gaiacliHome)) fooAcc := executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", fooAddr, flags)) - require.Equal(t, int64(50), fooAcc.GetCoins().AmountOf("steak").Int64()) + require.Equal(t, int64(50), fooAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64()) proposalsQuery, _ := tests.ExecuteT(t, fmt.Sprintf("gaiacli query proposals %v", flags), "") require.Equal(t, "No matching proposals found", proposalsQuery) @@ -323,7 +324,7 @@ func TestGaiaCLISubmitProposal(t *testing.T) { // submit a test proposal spStr := fmt.Sprintf("gaiacli tx submit-proposal %v", flags) spStr += fmt.Sprintf(" --from=%s", "foo") - spStr += fmt.Sprintf(" --deposit=%s", "5steak") + spStr += fmt.Sprintf(" --deposit=%s", fmt.Sprintf("5%s", stakeTypes.DefaultBondDenom)) spStr += fmt.Sprintf(" --type=%s", "Text") spStr += fmt.Sprintf(" --title=%s", "Test") spStr += fmt.Sprintf(" --description=%s", "test") @@ -346,7 +347,7 @@ func TestGaiaCLISubmitProposal(t *testing.T) { tests.WaitForNextNBlocksTM(2, port) fooAcc = executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", fooAddr, flags)) - require.Equal(t, int64(45), fooAcc.GetCoins().AmountOf("steak").Int64()) + require.Equal(t, int64(45), fooAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64()) proposal1 := executeGetProposal(t, fmt.Sprintf("gaiacli query proposal --proposal-id=1 --output=json %v", flags)) require.Equal(t, uint64(1), proposal1.GetProposalID()) @@ -358,11 +359,11 @@ func TestGaiaCLISubmitProposal(t *testing.T) { deposit := executeGetDeposit(t, fmt.Sprintf("gaiacli query deposit --proposal-id=1 --depositer=%s --output=json %v", fooAddr, flags)) - require.Equal(t, int64(5), deposit.Amount.AmountOf("steak").Int64()) + require.Equal(t, int64(5), deposit.Amount.AmountOf(stakeTypes.DefaultBondDenom).Int64()) depositStr := fmt.Sprintf("gaiacli tx deposit %v", flags) depositStr += fmt.Sprintf(" --from=%s", "foo") - depositStr += fmt.Sprintf(" --deposit=%s", "10steak") + depositStr += fmt.Sprintf(" --deposit=%s", fmt.Sprintf("10%s", stakeTypes.DefaultBondDenom)) depositStr += fmt.Sprintf(" --proposal-id=%s", "1") // Test generate only @@ -382,15 +383,15 @@ func TestGaiaCLISubmitProposal(t *testing.T) { deposits := executeGetDeposits(t, fmt.Sprintf("gaiacli query deposits --proposal-id=1 --output=json %v", flags)) require.Len(t, deposits, 1) - require.Equal(t, int64(15), deposits[0].Amount.AmountOf("steak").Int64()) + require.Equal(t, int64(15), deposits[0].Amount.AmountOf(stakeTypes.DefaultBondDenom).Int64()) deposit = executeGetDeposit(t, fmt.Sprintf("gaiacli query deposit --proposal-id=1 --depositer=%s --output=json %v", fooAddr, flags)) - require.Equal(t, int64(15), deposit.Amount.AmountOf("steak").Int64()) + require.Equal(t, int64(15), deposit.Amount.AmountOf(stakeTypes.DefaultBondDenom).Int64()) fooAcc = executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", fooAddr, flags)) - require.Equal(t, int64(35), fooAcc.GetCoins().AmountOf("steak").Int64()) + require.Equal(t, int64(35), fooAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64()) proposal1 = executeGetProposal(t, fmt.Sprintf("gaiacli query proposal --proposal-id=1 --output=json %v", flags)) require.Equal(t, uint64(1), proposal1.GetProposalID()) require.Equal(t, gov.StatusVotingPeriod, proposal1.GetStatus()) @@ -431,7 +432,7 @@ func TestGaiaCLISubmitProposal(t *testing.T) { // submit a second test proposal spStr = fmt.Sprintf("gaiacli tx submit-proposal %v", flags) spStr += fmt.Sprintf(" --from=%s", "foo") - spStr += fmt.Sprintf(" --deposit=%s", "5steak") + spStr += fmt.Sprintf(" --deposit=%s", fmt.Sprintf("5%s", stakeTypes.DefaultBondDenom)) spStr += fmt.Sprintf(" --type=%s", "Text") spStr += fmt.Sprintf(" --title=%s", "Apples") spStr += fmt.Sprintf(" --description=%s", "test") @@ -460,8 +461,8 @@ func TestGaiaCLISendGenerateSignAndBroadcast(t *testing.T) { // Test generate sendTx with default gas success, stdout, stderr := executeWriteRetStdStreams(t, fmt.Sprintf( - "gaiacli tx send %v --amount=10steak --to=%s --from=foo --generate-only", - flags, barAddr), []string{}...) + "gaiacli tx send %v --amount=10%s --to=%s --from=foo --generate-only", + flags, stakeTypes.DefaultBondDenom, barAddr), []string{}...) require.True(t, success) require.Empty(t, stderr) msg := unmarshalStdTx(t, stdout) @@ -471,8 +472,8 @@ func TestGaiaCLISendGenerateSignAndBroadcast(t *testing.T) { // Test generate sendTx with --gas=$amount success, stdout, stderr = executeWriteRetStdStreams(t, fmt.Sprintf( - "gaiacli tx send %v --amount=10steak --to=%s --from=foo --gas=100 --generate-only", - flags, barAddr), []string{}...) + "gaiacli tx send %v --amount=10%s --to=%s --from=foo --gas=100 --generate-only", + flags, stakeTypes.DefaultBondDenom, barAddr), []string{}...) require.True(t, success) require.Empty(t, stderr) msg = unmarshalStdTx(t, stdout) @@ -482,8 +483,8 @@ func TestGaiaCLISendGenerateSignAndBroadcast(t *testing.T) { // Test generate sendTx, estimate gas success, stdout, stderr = executeWriteRetStdStreams(t, fmt.Sprintf( - "gaiacli tx send %v --amount=10steak --to=%s --from=foo --gas=simulate --generate-only", - flags, barAddr), []string{}...) + "gaiacli tx send %v --amount=10%s --to=%s --from=foo --gas=simulate --generate-only", + flags, stakeTypes.DefaultBondDenom, barAddr), []string{}...) require.True(t, success) require.NotEmpty(t, stderr) msg = unmarshalStdTx(t, stdout) @@ -522,7 +523,7 @@ func TestGaiaCLISendGenerateSignAndBroadcast(t *testing.T) { // Test broadcast fooAcc := executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", fooAddr, flags)) - require.Equal(t, int64(50), fooAcc.GetCoins().AmountOf("steak").Int64()) + require.Equal(t, int64(50), fooAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64()) success, stdout, _ = executeWriteRetStdStreams(t, fmt.Sprintf( "gaiacli tx broadcast %v --json %v", flags, signedTxFile.Name())) @@ -536,9 +537,9 @@ func TestGaiaCLISendGenerateSignAndBroadcast(t *testing.T) { tests.WaitForNextNBlocksTM(2, port) barAcc := executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", barAddr, flags)) - require.Equal(t, int64(10), barAcc.GetCoins().AmountOf("steak").Int64()) + require.Equal(t, int64(10), barAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64()) fooAcc = executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", fooAddr, flags)) - require.Equal(t, int64(40), fooAcc.GetCoins().AmountOf("steak").Int64()) + require.Equal(t, int64(40), fooAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64()) } func TestGaiaCLIConfig(t *testing.T) { diff --git a/cmd/gaia/init/gentx.go b/cmd/gaia/init/gentx.go index 7ed8203754..449eb2b85b 100644 --- a/cmd/gaia/init/gentx.go +++ b/cmd/gaia/init/gentx.go @@ -9,6 +9,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" authcmd "github.com/cosmos/cosmos-sdk/x/auth/client/cli" "github.com/cosmos/cosmos-sdk/x/stake/client/cli" + stakeTypes "github.com/cosmos/cosmos-sdk/x/stake/types" "github.com/spf13/cobra" "github.com/spf13/viper" cfg "github.com/tendermint/tendermint/config" @@ -21,7 +22,7 @@ import ( ) const ( - defaultAmount = "100steak" + defaultAmount = "100" + stakeTypes.DefaultBondDenom defaultCommissionRate = "0.1" defaultCommissionMaxRate = "0.2" defaultCommissionMaxChangeRate = "0.01" diff --git a/cmd/gaia/init/testnet.go b/cmd/gaia/init/testnet.go index 8ca274f78b..b0676515c1 100644 --- a/cmd/gaia/init/testnet.go +++ b/cmd/gaia/init/testnet.go @@ -14,6 +14,7 @@ import ( "github.com/cosmos/cosmos-sdk/x/auth" authtx "github.com/cosmos/cosmos-sdk/x/auth/client/txbuilder" "github.com/cosmos/cosmos-sdk/x/stake" + stakeTypes "github.com/cosmos/cosmos-sdk/x/stake/types" "github.com/cosmos/cosmos-sdk/server" "github.com/spf13/cobra" @@ -180,14 +181,14 @@ func initTestnet(config *cfg.Config, cdc *codec.Codec) error { Address: addr, Coins: sdk.Coins{ sdk.NewInt64Coin(fmt.Sprintf("%sToken", nodeDirName), 1000), - sdk.NewInt64Coin("steak", 150), + sdk.NewInt64Coin(stakeTypes.DefaultBondDenom, 150), }, }) msg := stake.NewMsgCreateValidator( sdk.ValAddress(addr), valPubKeys[i], - sdk.NewInt64Coin("steak", 100), + sdk.NewInt64Coin(stakeTypes.DefaultBondDenom, 100), stake.NewDescription(nodeDirName, "", "", ""), stake.NewCommissionMsg(sdk.ZeroDec(), sdk.ZeroDec(), sdk.ZeroDec()), ) diff --git a/examples/democoin/x/simplestake/keeper.go b/examples/democoin/x/simplestake/keeper.go index 607f61d83c..b757dd66de 100644 --- a/examples/democoin/x/simplestake/keeper.go +++ b/examples/democoin/x/simplestake/keeper.go @@ -8,7 +8,7 @@ import ( "github.com/cosmos/cosmos-sdk/x/bank" ) -const stakingToken = "steak" +const stakingToken = "stake" const moduleName = "simplestake" diff --git a/examples/democoin/x/simplestake/keeper_test.go b/examples/democoin/x/simplestake/keeper_test.go index c3876cf4ad..974cf50e9e 100644 --- a/examples/democoin/x/simplestake/keeper_test.go +++ b/examples/democoin/x/simplestake/keeper_test.go @@ -75,10 +75,10 @@ func TestBonding(t *testing.T) { _, _, err := stakeKeeper.unbondWithoutCoins(ctx, addr) require.Equal(t, err, ErrInvalidUnbond(DefaultCodespace)) - _, err = stakeKeeper.bondWithoutCoins(ctx, addr, pubKey, sdk.NewInt64Coin("steak", 10)) + _, err = stakeKeeper.bondWithoutCoins(ctx, addr, pubKey, sdk.NewInt64Coin("stake", 10)) require.Nil(t, err) - power, err := stakeKeeper.bondWithoutCoins(ctx, addr, pubKey, sdk.NewInt64Coin("steak", 10)) + power, err := stakeKeeper.bondWithoutCoins(ctx, addr, pubKey, sdk.NewInt64Coin("stake", 10)) require.Nil(t, err) require.Equal(t, int64(20), power) diff --git a/types/coin_test.go b/types/coin_test.go index ac9fcb391b..77307f22a5 100644 --- a/types/coin_test.go +++ b/types/coin_test.go @@ -49,8 +49,8 @@ func TestSameDenomAsCoin(t *testing.T) { {NewInt64Coin("A", 1), NewInt64Coin("A", 1), true}, {NewInt64Coin("A", 1), NewInt64Coin("a", 1), false}, {NewInt64Coin("a", 1), NewInt64Coin("b", 1), false}, - {NewInt64Coin("steak", 1), NewInt64Coin("steak", 10), true}, - {NewInt64Coin("steak", -11), NewInt64Coin("steak", 10), true}, + {NewInt64Coin("stake", 1), NewInt64Coin("stake", 10), true}, + {NewInt64Coin("stake", -11), NewInt64Coin("stake", 10), true}, } for tcIndex, tc := range cases { @@ -107,8 +107,8 @@ func TestIsEqualCoin(t *testing.T) { {NewInt64Coin("A", 1), NewInt64Coin("A", 1), true}, {NewInt64Coin("A", 1), NewInt64Coin("a", 1), false}, {NewInt64Coin("a", 1), NewInt64Coin("b", 1), false}, - {NewInt64Coin("steak", 1), NewInt64Coin("steak", 10), false}, - {NewInt64Coin("steak", -11), NewInt64Coin("steak", 10), false}, + {NewInt64Coin("stake", 1), NewInt64Coin("stake", 10), false}, + {NewInt64Coin("stake", -11), NewInt64Coin("stake", 10), false}, } for tcIndex, tc := range cases { diff --git a/types/utils_test.go b/types/utils_test.go index dbdd08c0ab..f3930d1521 100644 --- a/types/utils_test.go +++ b/types/utils_test.go @@ -21,8 +21,8 @@ func TestSortJSON(t *testing.T) { want: "", wantErr: true}, // genesis.json - {unsortedJSON: `{"consensus_params":{"block_size_params":{"max_bytes":22020096,"max_txs":100000,"max_gas":-1},"tx_size_params":{"max_bytes":10240,"max_gas":-1},"block_gossip_params":{"block_part_size_bytes":65536},"evidence_params":{"max_age":100000}},"validators":[{"pub_key":{"type":"AC26791624DE60","value":"c7UMMAbjFuc5GhGPy0E5q5tefy12p9Tq0imXqdrKXwo="},"power":100,"name":""}],"app_hash":"","genesis_time":"2018-05-11T15:52:25.424795506Z","chain_id":"test-chain-Q6VeoW","app_state":{"accounts":[{"address":"718C9C23F98C9642569742ADDD9F9AB9743FBD5D","coins":[{"denom":"Token","amount":1000},{"denom":"steak","amount":50}]}],"stake":{"pool":{"total_supply":50,"bonded_shares":"0","unbonded_shares":"0","bonded_pool":0,"unbonded_pool":0,"inflation_last_time":0,"inflation":"7/100"},"params":{"inflation_rate_change":"13/100","inflation_max":"1/5","inflation_min":"7/100","goal_bonded":"67/100","max_validators":100,"bond_denom":"steak"},"candidates":null,"bonds":null}}}`, - want: `{"app_hash":"","app_state":{"accounts":[{"address":"718C9C23F98C9642569742ADDD9F9AB9743FBD5D","coins":[{"amount":1000,"denom":"Token"},{"amount":50,"denom":"steak"}]}],"stake":{"bonds":null,"candidates":null,"params":{"bond_denom":"steak","goal_bonded":"67/100","inflation_max":"1/5","inflation_min":"7/100","inflation_rate_change":"13/100","max_validators":100},"pool":{"bonded_pool":0,"bonded_shares":"0","inflation":"7/100","inflation_last_time":0,"total_supply":50,"unbonded_pool":0,"unbonded_shares":"0"}}},"chain_id":"test-chain-Q6VeoW","consensus_params":{"block_gossip_params":{"block_part_size_bytes":65536},"block_size_params":{"max_bytes":22020096,"max_gas":-1,"max_txs":100000},"evidence_params":{"max_age":100000},"tx_size_params":{"max_bytes":10240,"max_gas":-1}},"genesis_time":"2018-05-11T15:52:25.424795506Z","validators":[{"name":"","power":100,"pub_key":{"type":"AC26791624DE60","value":"c7UMMAbjFuc5GhGPy0E5q5tefy12p9Tq0imXqdrKXwo="}}]}`, + {unsortedJSON: `{"consensus_params":{"block_size_params":{"max_bytes":22020096,"max_txs":100000,"max_gas":-1},"tx_size_params":{"max_bytes":10240,"max_gas":-1},"block_gossip_params":{"block_part_size_bytes":65536},"evidence_params":{"max_age":100000}},"validators":[{"pub_key":{"type":"AC26791624DE60","value":"c7UMMAbjFuc5GhGPy0E5q5tefy12p9Tq0imXqdrKXwo="},"power":100,"name":""}],"app_hash":"","genesis_time":"2018-05-11T15:52:25.424795506Z","chain_id":"test-chain-Q6VeoW","app_state":{"accounts":[{"address":"718C9C23F98C9642569742ADDD9F9AB9743FBD5D","coins":[{"denom":"Token","amount":1000},{"denom":"stake","amount":50}]}],"stake":{"pool":{"total_supply":50,"bonded_shares":"0","unbonded_shares":"0","bonded_pool":0,"unbonded_pool":0,"inflation_last_time":0,"inflation":"7/100"},"params":{"inflation_rate_change":"13/100","inflation_max":"1/5","inflation_min":"7/100","goal_bonded":"67/100","max_validators":100,"bond_denom":"stake"},"candidates":null,"bonds":null}}}`, + want: `{"app_hash":"","app_state":{"accounts":[{"address":"718C9C23F98C9642569742ADDD9F9AB9743FBD5D","coins":[{"amount":1000,"denom":"Token"},{"amount":50,"denom":"stake"}]}],"stake":{"bonds":null,"candidates":null,"params":{"bond_denom":"stake","goal_bonded":"67/100","inflation_max":"1/5","inflation_min":"7/100","inflation_rate_change":"13/100","max_validators":100},"pool":{"bonded_pool":0,"bonded_shares":"0","inflation":"7/100","inflation_last_time":0,"total_supply":50,"unbonded_pool":0,"unbonded_shares":"0"}}},"chain_id":"test-chain-Q6VeoW","consensus_params":{"block_gossip_params":{"block_part_size_bytes":65536},"block_size_params":{"max_bytes":22020096,"max_gas":-1,"max_txs":100000},"evidence_params":{"max_age":100000},"tx_size_params":{"max_bytes":10240,"max_gas":-1}},"genesis_time":"2018-05-11T15:52:25.424795506Z","validators":[{"name":"","power":100,"pub_key":{"type":"AC26791624DE60","value":"c7UMMAbjFuc5GhGPy0E5q5tefy12p9Tq0imXqdrKXwo="}}]}`, wantErr: false}, // from the TXSpec: {unsortedJSON: `{"chain_id":"test-chain-1","sequence":1,"fee_bytes":{"amount":[{"amount":5,"denom":"photon"}],"gas":10000},"msg_bytes":{"inputs":[{"address":"696E707574","coins":[{"amount":10,"denom":"atom"}]}],"outputs":[{"address":"6F7574707574","coins":[{"amount":10,"denom":"atom"}]}]},"alt_bytes":null}`, diff --git a/x/auth/client/txbuilder/txbuilder_test.go b/x/auth/client/txbuilder/txbuilder_test.go index 996d9b8b1b..3ad2ad4123 100644 --- a/x/auth/client/txbuilder/txbuilder_test.go +++ b/x/auth/client/txbuilder/txbuilder_test.go @@ -10,6 +10,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/auth" "github.com/tendermint/tendermint/crypto/ed25519" + stakeTypes "github.com/cosmos/cosmos-sdk/x/stake/types" ) var ( @@ -46,7 +47,7 @@ func TestTxBuilderBuild(t *testing.T) { SimulateGas: false, ChainID: "test-chain", Memo: "hello", - Fee: "1steak", + Fee: "1" + stakeTypes.DefaultBondDenom, }, defaultMsg, StdSignMsg{ @@ -55,7 +56,7 @@ func TestTxBuilderBuild(t *testing.T) { Sequence: 1, Memo: "hello", Msgs: defaultMsg, - Fee: auth.NewStdFee(100, sdk.NewCoin("steak", sdk.NewInt(1))), + Fee: auth.NewStdFee(100, sdk.NewCoin(stakeTypes.DefaultBondDenom, sdk.NewInt(1))), }, false, }, diff --git a/x/gov/endblocker_test.go b/x/gov/endblocker_test.go index 535cf036a5..47e9037580 100644 --- a/x/gov/endblocker_test.go +++ b/x/gov/endblocker_test.go @@ -7,6 +7,7 @@ import ( "github.com/stretchr/testify/require" sdk "github.com/cosmos/cosmos-sdk/types" + stakeTypes "github.com/cosmos/cosmos-sdk/x/stake/types" abci "github.com/tendermint/tendermint/abci/types" ) @@ -20,7 +21,7 @@ func TestTickExpiredDepositPeriod(t *testing.T) { require.False(t, inactiveQueue.Valid()) inactiveQueue.Close() - newProposalMsg := NewMsgSubmitProposal("Test", "test", ProposalTypeText, addrs[0], sdk.Coins{sdk.NewInt64Coin("steak", 5)}) + newProposalMsg := NewMsgSubmitProposal("Test", "test", ProposalTypeText, addrs[0], sdk.Coins{sdk.NewInt64Coin(stakeTypes.DefaultBondDenom, 5)}) res := govHandler(ctx, newProposalMsg) require.True(t, res.IsOK()) @@ -62,7 +63,7 @@ func TestTickMultipleExpiredDepositPeriod(t *testing.T) { require.False(t, inactiveQueue.Valid()) inactiveQueue.Close() - newProposalMsg := NewMsgSubmitProposal("Test", "test", ProposalTypeText, addrs[0], sdk.Coins{sdk.NewInt64Coin("steak", 5)}) + newProposalMsg := NewMsgSubmitProposal("Test", "test", ProposalTypeText, addrs[0], sdk.Coins{sdk.NewInt64Coin(stakeTypes.DefaultBondDenom, 5)}) res := govHandler(ctx, newProposalMsg) require.True(t, res.IsOK()) @@ -79,7 +80,7 @@ func TestTickMultipleExpiredDepositPeriod(t *testing.T) { require.False(t, inactiveQueue.Valid()) inactiveQueue.Close() - newProposalMsg2 := NewMsgSubmitProposal("Test2", "test2", ProposalTypeText, addrs[1], sdk.Coins{sdk.NewInt64Coin("steak", 5)}) + newProposalMsg2 := NewMsgSubmitProposal("Test2", "test2", ProposalTypeText, addrs[1], sdk.Coins{sdk.NewInt64Coin(stakeTypes.DefaultBondDenom, 5)}) res = govHandler(ctx, newProposalMsg2) require.True(t, res.IsOK()) @@ -121,7 +122,7 @@ func TestTickPassedDepositPeriod(t *testing.T) { require.False(t, activeQueue.Valid()) activeQueue.Close() - newProposalMsg := NewMsgSubmitProposal("Test", "test", ProposalTypeText, addrs[0], sdk.Coins{sdk.NewInt64Coin("steak", 5)}) + newProposalMsg := NewMsgSubmitProposal("Test", "test", ProposalTypeText, addrs[0], sdk.Coins{sdk.NewInt64Coin(stakeTypes.DefaultBondDenom, 5)}) res := govHandler(ctx, newProposalMsg) require.True(t, res.IsOK()) @@ -140,7 +141,7 @@ func TestTickPassedDepositPeriod(t *testing.T) { require.False(t, inactiveQueue.Valid()) inactiveQueue.Close() - newDepositMsg := NewMsgDeposit(addrs[1], proposalID, sdk.Coins{sdk.NewInt64Coin("steak", 5)}) + newDepositMsg := NewMsgDeposit(addrs[1], proposalID, sdk.Coins{sdk.NewInt64Coin(stakeTypes.DefaultBondDenom, 5)}) res = govHandler(ctx, newDepositMsg) require.True(t, res.IsOK()) @@ -163,7 +164,7 @@ func TestTickPassedVotingPeriod(t *testing.T) { require.False(t, activeQueue.Valid()) activeQueue.Close() - newProposalMsg := NewMsgSubmitProposal("Test", "test", ProposalTypeText, addrs[0], sdk.Coins{sdk.NewInt64Coin("steak", 5)}) + newProposalMsg := NewMsgSubmitProposal("Test", "test", ProposalTypeText, addrs[0], sdk.Coins{sdk.NewInt64Coin(stakeTypes.DefaultBondDenom, 5)}) res := govHandler(ctx, newProposalMsg) require.True(t, res.IsOK()) @@ -174,7 +175,7 @@ func TestTickPassedVotingPeriod(t *testing.T) { newHeader.Time = ctx.BlockHeader().Time.Add(time.Duration(1) * time.Second) ctx = ctx.WithBlockHeader(newHeader) - newDepositMsg := NewMsgDeposit(addrs[1], proposalID, sdk.Coins{sdk.NewInt64Coin("steak", 5)}) + newDepositMsg := NewMsgDeposit(addrs[1], proposalID, sdk.Coins{sdk.NewInt64Coin(stakeTypes.DefaultBondDenom, 5)}) res = govHandler(ctx, newDepositMsg) require.True(t, res.IsOK()) diff --git a/x/gov/genesis.go b/x/gov/genesis.go index 1243bf5590..e134a4a78c 100644 --- a/x/gov/genesis.go +++ b/x/gov/genesis.go @@ -4,6 +4,7 @@ import ( "time" sdk "github.com/cosmos/cosmos-sdk/types" + stakeTypes "github.com/cosmos/cosmos-sdk/x/stake/types" ) // GenesisState - all staking state that must be provided at genesis @@ -43,7 +44,7 @@ func DefaultGenesisState() GenesisState { return GenesisState{ StartingProposalID: 1, DepositParams: DepositParams{ - MinDeposit: sdk.Coins{sdk.NewInt64Coin("steak", 10)}, + MinDeposit: sdk.Coins{sdk.NewInt64Coin(stakeTypes.DefaultBondDenom, 10)}, MaxDepositPeriod: time.Duration(172800) * time.Second, }, VotingParams: VotingParams{ diff --git a/x/gov/keeper_test.go b/x/gov/keeper_test.go index 2ff1344b78..23199472ba 100644 --- a/x/gov/keeper_test.go +++ b/x/gov/keeper_test.go @@ -9,6 +9,7 @@ import ( abci "github.com/tendermint/tendermint/abci/types" sdk "github.com/cosmos/cosmos-sdk/types" + stakeTypes "github.com/cosmos/cosmos-sdk/x/stake/types" ) func TestGetSetProposal(t *testing.T) { @@ -69,14 +70,14 @@ func TestDeposits(t *testing.T) { proposal := keeper.NewTextProposal(ctx, "Test", "description", ProposalTypeText) proposalID := proposal.GetProposalID() - fourSteak := sdk.Coins{sdk.NewInt64Coin("steak", 4)} - fiveSteak := sdk.Coins{sdk.NewInt64Coin("steak", 5)} + fourSteak := sdk.Coins{sdk.NewInt64Coin(stakeTypes.DefaultBondDenom, 4)} + fiveSteak := sdk.Coins{sdk.NewInt64Coin(stakeTypes.DefaultBondDenom, 5)} addr0Initial := keeper.ck.GetCoins(ctx, addrs[0]) addr1Initial := keeper.ck.GetCoins(ctx, addrs[1]) - // require.True(t, addr0Initial.IsEqual(sdk.Coins{sdk.NewInt64Coin("steak", 42)})) - require.Equal(t, sdk.Coins{sdk.NewInt64Coin("steak", 42)}, addr0Initial) + // require.True(t, addr0Initial.IsEqual(sdk.Coins{sdk.NewInt64Coin(stakeTypes.DefaultBondDenom, 42)})) + require.Equal(t, sdk.Coins{sdk.NewInt64Coin(stakeTypes.DefaultBondDenom, 42)}, addr0Initial) require.True(t, proposal.GetTotalDeposit().IsEqual(sdk.Coins{})) diff --git a/x/gov/msgs_test.go b/x/gov/msgs_test.go index bdc273dcd6..e488d2abab 100644 --- a/x/gov/msgs_test.go +++ b/x/gov/msgs_test.go @@ -7,16 +7,21 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/mock" + stakeTypes "github.com/cosmos/cosmos-sdk/x/stake/types" ) var ( - coinsPos = sdk.Coins{sdk.NewInt64Coin("steak", 1000)} + coinsPos = sdk.Coins{sdk.NewInt64Coin(stakeTypes.DefaultBondDenom, 1000)} coinsZero = sdk.Coins{} - coinsNeg = sdk.Coins{sdk.NewInt64Coin("steak", -10000)} + coinsNeg = sdk.Coins{sdk.NewInt64Coin(stakeTypes.DefaultBondDenom, -10000)} coinsPosNotAtoms = sdk.Coins{sdk.NewInt64Coin("foo", 10000)} - coinsMulti = sdk.Coins{sdk.NewInt64Coin("foo", 10000), sdk.NewInt64Coin("steak", 1000)} + coinsMulti = sdk.Coins{sdk.NewInt64Coin(stakeTypes.DefaultBondDenom, 1000), sdk.NewInt64Coin("foo", 10000)} ) +func init() { + coinsMulti.Sort() +} + // test ValidateBasic for MsgCreateValidator func TestMsgSubmitProposal(t *testing.T) { _, addrs, _, _ := mock.CreateGenAccounts(1, sdk.Coins{}) @@ -42,9 +47,9 @@ func TestMsgSubmitProposal(t *testing.T) { for i, tc := range tests { msg := NewMsgSubmitProposal(tc.title, tc.description, tc.proposalType, tc.proposerAddr, tc.initialDeposit) if tc.expectPass { - require.Nil(t, msg.ValidateBasic(), "test: %v", i) + require.NoError(t, msg.ValidateBasic(), "test: %v", i) } else { - require.NotNil(t, msg.ValidateBasic(), "test: %v", i) + require.Error(t, msg.ValidateBasic(), "test: %v", i) } } } @@ -68,9 +73,9 @@ func TestMsgDeposit(t *testing.T) { for i, tc := range tests { msg := NewMsgDeposit(tc.depositerAddr, tc.proposalID, tc.depositAmount) if tc.expectPass { - require.Nil(t, msg.ValidateBasic(), "test: %v", i) + require.NoError(t, msg.ValidateBasic(), "test: %v", i) } else { - require.NotNil(t, msg.ValidateBasic(), "test: %v", i) + require.Error(t, msg.ValidateBasic(), "test: %v", i) } } } diff --git a/x/gov/simulation/msgs.go b/x/gov/simulation/msgs.go index 0eadc7febb..d075c86aef 100644 --- a/x/gov/simulation/msgs.go +++ b/x/gov/simulation/msgs.go @@ -11,10 +11,11 @@ import ( "github.com/cosmos/cosmos-sdk/x/gov" "github.com/cosmos/cosmos-sdk/x/mock/simulation" "github.com/cosmos/cosmos-sdk/x/stake" + stakeTypes "github.com/cosmos/cosmos-sdk/x/stake/types" ) const ( - denom = "steak" + denom = stakeTypes.DefaultBondDenom ) // SimulateSubmittingVotingAndSlashingForProposal simulates creating a msg Submit Proposal diff --git a/x/gov/tally_test.go b/x/gov/tally_test.go index 26b32cc93a..b2f6aaf32a 100644 --- a/x/gov/tally_test.go +++ b/x/gov/tally_test.go @@ -11,6 +11,7 @@ import ( "github.com/tendermint/tendermint/crypto/ed25519" "github.com/cosmos/cosmos-sdk/x/stake" + stakeTypes "github.com/cosmos/cosmos-sdk/x/stake/types" ) var ( @@ -25,7 +26,7 @@ func createValidators(t *testing.T, stakeHandler sdk.Handler, ctx sdk.Context, a for i := 0; i < len(addrs); i++ { valCreateMsg := stake.NewMsgCreateValidator( - addrs[i], pubkeys[i], sdk.NewInt64Coin("steak", coinAmt[i]), testDescription, testCommissionMsg, + addrs[i], pubkeys[i], sdk.NewInt64Coin(stakeTypes.DefaultBondDenom, coinAmt[i]), testDescription, testCommissionMsg, ) res := stakeHandler(ctx, valCreateMsg) @@ -289,7 +290,7 @@ func TestTallyDelgatorOverride(t *testing.T) { createValidators(t, stakeHandler, ctx, valAddrs, []int64{5, 6, 7}) stake.EndBlocker(ctx, sk) - delegator1Msg := stake.NewMsgDelegate(addrs[3], sdk.ValAddress(addrs[2]), sdk.NewInt64Coin("steak", 30)) + delegator1Msg := stake.NewMsgDelegate(addrs[3], sdk.ValAddress(addrs[2]), sdk.NewInt64Coin(stakeTypes.DefaultBondDenom, 30)) stakeHandler(ctx, delegator1Msg) proposal := keeper.NewTextProposal(ctx, "Test", "description", ProposalTypeText) @@ -326,7 +327,7 @@ func TestTallyDelgatorInherit(t *testing.T) { createValidators(t, stakeHandler, ctx, valAddrs, []int64{5, 6, 7}) stake.EndBlocker(ctx, sk) - delegator1Msg := stake.NewMsgDelegate(addrs[3], sdk.ValAddress(addrs[2]), sdk.NewInt64Coin("steak", 30)) + delegator1Msg := stake.NewMsgDelegate(addrs[3], sdk.ValAddress(addrs[2]), sdk.NewInt64Coin(stakeTypes.DefaultBondDenom, 30)) stakeHandler(ctx, delegator1Msg) proposal := keeper.NewTextProposal(ctx, "Test", "description", ProposalTypeText) @@ -361,9 +362,9 @@ func TestTallyDelgatorMultipleOverride(t *testing.T) { createValidators(t, stakeHandler, ctx, valAddrs, []int64{5, 6, 7}) stake.EndBlocker(ctx, sk) - delegator1Msg := stake.NewMsgDelegate(addrs[3], sdk.ValAddress(addrs[2]), sdk.NewInt64Coin("steak", 10)) + delegator1Msg := stake.NewMsgDelegate(addrs[3], sdk.ValAddress(addrs[2]), sdk.NewInt64Coin(stakeTypes.DefaultBondDenom, 10)) stakeHandler(ctx, delegator1Msg) - delegator1Msg2 := stake.NewMsgDelegate(addrs[3], sdk.ValAddress(addrs[1]), sdk.NewInt64Coin("steak", 10)) + delegator1Msg2 := stake.NewMsgDelegate(addrs[3], sdk.ValAddress(addrs[1]), sdk.NewInt64Coin(stakeTypes.DefaultBondDenom, 10)) stakeHandler(ctx, delegator1Msg2) proposal := keeper.NewTextProposal(ctx, "Test", "description", ProposalTypeText) @@ -393,24 +394,24 @@ func TestTallyDelgatorMultipleInherit(t *testing.T) { stakeHandler := stake.NewHandler(sk) val1CreateMsg := stake.NewMsgCreateValidator( - sdk.ValAddress(addrs[0]), ed25519.GenPrivKey().PubKey(), sdk.NewInt64Coin("steak", 25), testDescription, testCommissionMsg, + sdk.ValAddress(addrs[0]), ed25519.GenPrivKey().PubKey(), sdk.NewInt64Coin(stakeTypes.DefaultBondDenom, 25), testDescription, testCommissionMsg, ) stakeHandler(ctx, val1CreateMsg) val2CreateMsg := stake.NewMsgCreateValidator( - sdk.ValAddress(addrs[1]), ed25519.GenPrivKey().PubKey(), sdk.NewInt64Coin("steak", 6), testDescription, testCommissionMsg, + sdk.ValAddress(addrs[1]), ed25519.GenPrivKey().PubKey(), sdk.NewInt64Coin(stakeTypes.DefaultBondDenom, 6), testDescription, testCommissionMsg, ) stakeHandler(ctx, val2CreateMsg) val3CreateMsg := stake.NewMsgCreateValidator( - sdk.ValAddress(addrs[2]), ed25519.GenPrivKey().PubKey(), sdk.NewInt64Coin("steak", 7), testDescription, testCommissionMsg, + sdk.ValAddress(addrs[2]), ed25519.GenPrivKey().PubKey(), sdk.NewInt64Coin(stakeTypes.DefaultBondDenom, 7), testDescription, testCommissionMsg, ) stakeHandler(ctx, val3CreateMsg) - delegator1Msg := stake.NewMsgDelegate(addrs[3], sdk.ValAddress(addrs[2]), sdk.NewInt64Coin("steak", 10)) + delegator1Msg := stake.NewMsgDelegate(addrs[3], sdk.ValAddress(addrs[2]), sdk.NewInt64Coin(stakeTypes.DefaultBondDenom, 10)) stakeHandler(ctx, delegator1Msg) - delegator1Msg2 := stake.NewMsgDelegate(addrs[3], sdk.ValAddress(addrs[1]), sdk.NewInt64Coin("steak", 10)) + delegator1Msg2 := stake.NewMsgDelegate(addrs[3], sdk.ValAddress(addrs[1]), sdk.NewInt64Coin(stakeTypes.DefaultBondDenom, 10)) stakeHandler(ctx, delegator1Msg2) stake.EndBlocker(ctx, sk) @@ -447,10 +448,10 @@ func TestTallyJailedValidator(t *testing.T) { createValidators(t, stakeHandler, ctx, valAddrs, []int64{25, 6, 7}) stake.EndBlocker(ctx, sk) - delegator1Msg := stake.NewMsgDelegate(addrs[3], sdk.ValAddress(addrs[2]), sdk.NewInt64Coin("steak", 10)) + delegator1Msg := stake.NewMsgDelegate(addrs[3], sdk.ValAddress(addrs[2]), sdk.NewInt64Coin(stakeTypes.DefaultBondDenom, 10)) stakeHandler(ctx, delegator1Msg) - delegator1Msg2 := stake.NewMsgDelegate(addrs[3], sdk.ValAddress(addrs[1]), sdk.NewInt64Coin("steak", 10)) + delegator1Msg2 := stake.NewMsgDelegate(addrs[3], sdk.ValAddress(addrs[1]), sdk.NewInt64Coin(stakeTypes.DefaultBondDenom, 10)) stakeHandler(ctx, delegator1Msg2) val2, found := sk.GetValidator(ctx, sdk.ValAddress(addrs[1])) diff --git a/x/gov/test_common.go b/x/gov/test_common.go index 82ae30358b..4e0ffd51af 100644 --- a/x/gov/test_common.go +++ b/x/gov/test_common.go @@ -17,6 +17,7 @@ import ( "github.com/cosmos/cosmos-sdk/x/bank" "github.com/cosmos/cosmos-sdk/x/mock" "github.com/cosmos/cosmos-sdk/x/stake" + stakeTypes "github.com/cosmos/cosmos-sdk/x/stake/types" ) // initialize the mock application for this module @@ -44,7 +45,7 @@ func getMockApp(t *testing.T, numGenAccs int) (*mock.App, Keeper, stake.Keeper, require.NoError(t, mapp.CompleteSetup(keyStake, tkeyStake, keyGov, keyGlobalParams, tkeyGlobalParams)) - genAccs, addrs, pubKeys, privKeys := mock.CreateGenAccounts(numGenAccs, sdk.Coins{sdk.NewInt64Coin("steak", 42)}) + genAccs, addrs, pubKeys, privKeys := mock.CreateGenAccounts(numGenAccs, sdk.Coins{sdk.NewInt64Coin(stakeTypes.DefaultBondDenom, 42)}) mock.SetGenesis(mapp, genAccs) diff --git a/x/mint/params.go b/x/mint/params.go index 05edc8fd92..47c9c85480 100644 --- a/x/mint/params.go +++ b/x/mint/params.go @@ -2,6 +2,7 @@ package mint import ( "fmt" + stakeTypes "github.com/cosmos/cosmos-sdk/x/stake/types" sdk "github.com/cosmos/cosmos-sdk/types" ) @@ -18,7 +19,7 @@ type Params struct { // default minting module parameters func DefaultParams() Params { return Params{ - MintDenom: "steak", + MintDenom: stakeTypes.DefaultBondDenom, InflationRateChange: sdk.NewDecWithPrec(13, 2), InflationMax: sdk.NewDecWithPrec(20, 2), InflationMin: sdk.NewDecWithPrec(7, 2), diff --git a/x/slashing/app_test.go b/x/slashing/app_test.go index 6529609ba0..dd96ff51e2 100644 --- a/x/slashing/app_test.go +++ b/x/slashing/app_test.go @@ -3,15 +3,17 @@ package slashing import ( "testing" + "github.com/stretchr/testify/require" + abci "github.com/tendermint/tendermint/abci/types" + "github.com/tendermint/tendermint/crypto/ed25519" + sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/auth" "github.com/cosmos/cosmos-sdk/x/bank" "github.com/cosmos/cosmos-sdk/x/mock" "github.com/cosmos/cosmos-sdk/x/params" "github.com/cosmos/cosmos-sdk/x/stake" - "github.com/stretchr/testify/require" - abci "github.com/tendermint/tendermint/abci/types" - "github.com/tendermint/tendermint/crypto/ed25519" + stakeTypes "github.com/cosmos/cosmos-sdk/x/stake/types" ) var ( @@ -93,8 +95,8 @@ func checkValidatorSigningInfo(t *testing.T, mapp *mock.App, keeper Keeper, func TestSlashingMsgs(t *testing.T) { mapp, stakeKeeper, keeper := getMockApp(t) - genCoin := sdk.NewInt64Coin("steak", 42) - bondCoin := sdk.NewInt64Coin("steak", 10) + genCoin := sdk.NewInt64Coin(stakeTypes.DefaultBondDenom, 42) + bondCoin := sdk.NewInt64Coin(stakeTypes.DefaultBondDenom, 10) acc1 := &auth.BaseAccount{ Address: addr1, diff --git a/x/slashing/test_common.go b/x/slashing/test_common.go index 239ae13d62..72ee58e1b2 100644 --- a/x/slashing/test_common.go +++ b/x/slashing/test_common.go @@ -21,6 +21,7 @@ import ( "github.com/cosmos/cosmos-sdk/x/bank" "github.com/cosmos/cosmos-sdk/x/params" "github.com/cosmos/cosmos-sdk/x/stake" + stakeTypes "github.com/cosmos/cosmos-sdk/x/stake/types" ) // TODO remove dependencies on staking (should only refer to validator set type from sdk) @@ -120,7 +121,7 @@ func NewTestMsgCreateValidator(address sdk.ValAddress, pubKey crypto.PubKey, amt DelegatorAddr: sdk.AccAddress(address), ValidatorAddr: address, PubKey: pubKey, - Delegation: sdk.NewCoin("steak", amt), + Delegation: sdk.NewCoin(stakeTypes.DefaultBondDenom, amt), } } @@ -128,6 +129,6 @@ func newTestMsgDelegate(delAddr sdk.AccAddress, valAddr sdk.ValAddress, delAmoun return stake.MsgDelegate{ DelegatorAddr: delAddr, ValidatorAddr: valAddr, - Delegation: sdk.NewCoin("steak", delAmount), + Delegation: sdk.NewCoin(stakeTypes.DefaultBondDenom, delAmount), } } diff --git a/x/stake/app_test.go b/x/stake/app_test.go index 9a38d2d170..b24018a6ce 100644 --- a/x/stake/app_test.go +++ b/x/stake/app_test.go @@ -3,13 +3,15 @@ package stake import ( "testing" + "github.com/stretchr/testify/require" + abci "github.com/tendermint/tendermint/abci/types" + sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/auth" "github.com/cosmos/cosmos-sdk/x/bank" "github.com/cosmos/cosmos-sdk/x/mock" "github.com/cosmos/cosmos-sdk/x/params" - "github.com/stretchr/testify/require" - abci "github.com/tendermint/tendermint/abci/types" + stakeTypes "github.com/cosmos/cosmos-sdk/x/stake/types" ) // getMockApp returns an initialized mock application for this module. @@ -100,8 +102,8 @@ func checkDelegation( func TestStakeMsgs(t *testing.T) { mApp, keeper := getMockApp(t) - genCoin := sdk.NewInt64Coin("steak", 42) - bondCoin := sdk.NewInt64Coin("steak", 10) + genCoin := sdk.NewInt64Coin(stakeTypes.DefaultBondDenom, 42) + bondCoin := sdk.NewInt64Coin(stakeTypes.DefaultBondDenom, 10) acc1 := &auth.BaseAccount{ Address: addr1, diff --git a/x/stake/keeper/delegation_test.go b/x/stake/keeper/delegation_test.go index fcf2f42067..23dcbc1a6d 100644 --- a/x/stake/keeper/delegation_test.go +++ b/x/stake/keeper/delegation_test.go @@ -139,7 +139,7 @@ func TestUnbondingDelegation(t *testing.T) { ValidatorAddr: addrVals[0], CreationHeight: 0, MinTime: time.Unix(0, 0), - Balance: sdk.NewInt64Coin("steak", 5), + Balance: sdk.NewInt64Coin(types.DefaultBondDenom, 5), } // set and retrieve a record @@ -149,7 +149,7 @@ func TestUnbondingDelegation(t *testing.T) { require.True(t, ubd.Equal(resUnbond)) // modify a records, save, and retrieve - ubd.Balance = sdk.NewInt64Coin("steak", 21) + ubd.Balance = sdk.NewInt64Coin(types.DefaultBondDenom, 21) keeper.SetUnbondingDelegation(ctx, ubd) resUnbonds := keeper.GetUnbondingDelegations(ctx, addrDels[0], 5) diff --git a/x/stake/querier/queryable_test.go b/x/stake/querier/queryable_test.go index 973e2376ff..925eae63f7 100644 --- a/x/stake/querier/queryable_test.go +++ b/x/stake/querier/queryable_test.go @@ -189,7 +189,7 @@ func TestQueryDelegation(t *testing.T) { pool := keeper.GetPool(ctx) keeper.SetValidatorByPowerIndex(ctx, val1, pool) - keeper.Delegate(ctx, addrAcc2, sdk.NewCoin("steak", sdk.NewInt(20)), val1, true) + keeper.Delegate(ctx, addrAcc2, sdk.NewCoin(types.DefaultBondDenom, sdk.NewInt(20)), val1, true) // apply TM updates keeper.ApplyAndReturnValidatorSetUpdates(ctx) @@ -346,7 +346,7 @@ func TestQueryRedelegations(t *testing.T) { keeper.SetValidator(ctx, val1) keeper.SetValidator(ctx, val2) - keeper.Delegate(ctx, addrAcc2, sdk.NewCoin("steak", sdk.NewInt(100)), val1, true) + keeper.Delegate(ctx, addrAcc2, sdk.NewCoin(types.DefaultBondDenom, sdk.NewInt(100)), val1, true) keeper.ApplyAndReturnValidatorSetUpdates(ctx) keeper.BeginRedelegation(ctx, addrAcc2, val1.GetOperator(), val2.GetOperator(), sdk.NewDec(20)) diff --git a/x/stake/simulation/invariants.go b/x/stake/simulation/invariants.go index 819bc8b379..439f40de3b 100644 --- a/x/stake/simulation/invariants.go +++ b/x/stake/simulation/invariants.go @@ -12,6 +12,7 @@ import ( "github.com/cosmos/cosmos-sdk/x/mock/simulation" "github.com/cosmos/cosmos-sdk/x/stake" "github.com/cosmos/cosmos-sdk/x/stake/keeper" + stakeTypes "github.com/cosmos/cosmos-sdk/x/stake/types" abci "github.com/tendermint/tendermint/abci/types" ) @@ -48,7 +49,7 @@ func SupplyInvariants(ck bank.Keeper, k stake.Keeper, loose := sdk.ZeroDec() bonded := sdk.ZeroDec() am.IterateAccounts(ctx, func(acc auth.Account) bool { - loose = loose.Add(sdk.NewDecFromInt(acc.GetCoins().AmountOf("steak"))) + loose = loose.Add(sdk.NewDecFromInt(acc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom))) return false }) k.IterateUnbondingDelegations(ctx, func(_ int64, ubd stake.UnbondingDelegation) bool { @@ -70,19 +71,19 @@ func SupplyInvariants(ck bank.Keeper, k stake.Keeper, feePool := d.GetFeePool(ctx) // add outstanding fees - loose = loose.Add(sdk.NewDecFromInt(f.GetCollectedFees(ctx).AmountOf("steak"))) + loose = loose.Add(sdk.NewDecFromInt(f.GetCollectedFees(ctx).AmountOf(stakeTypes.DefaultBondDenom))) // add community pool - loose = loose.Add(feePool.CommunityPool.AmountOf("steak")) + loose = loose.Add(feePool.CommunityPool.AmountOf(stakeTypes.DefaultBondDenom)) // add validator distribution pool - loose = loose.Add(feePool.ValPool.AmountOf("steak")) + loose = loose.Add(feePool.ValPool.AmountOf(stakeTypes.DefaultBondDenom)) // add validator distribution commission and yet-to-be-withdrawn-by-delegators d.IterateValidatorDistInfos(ctx, func(_ int64, distInfo distribution.ValidatorDistInfo) (stop bool) { - loose = loose.Add(distInfo.DelPool.AmountOf("steak")) - loose = loose.Add(distInfo.ValCommission.AmountOf("steak")) + loose = loose.Add(distInfo.DelPool.AmountOf(stakeTypes.DefaultBondDenom)) + loose = loose.Add(distInfo.ValCommission.AmountOf(stakeTypes.DefaultBondDenom)) return false }, ) diff --git a/x/stake/test_common.go b/x/stake/test_common.go index 49bac0f316..88077d18bc 100644 --- a/x/stake/test_common.go +++ b/x/stake/test_common.go @@ -28,7 +28,7 @@ var ( func NewTestMsgCreateValidator(address sdk.ValAddress, pubKey crypto.PubKey, amt int64) MsgCreateValidator { return types.NewMsgCreateValidator( - address, pubKey, sdk.NewCoin("steak", sdk.NewInt(amt)), Description{}, commissionMsg, + address, pubKey, sdk.NewCoin(types.DefaultBondDenom, sdk.NewInt(amt)), Description{}, commissionMsg, ) } @@ -38,7 +38,7 @@ func NewTestMsgCreateValidatorWithCommission(address sdk.ValAddress, pubKey cryp commission := NewCommissionMsg(commissionRate, sdk.OneDec(), sdk.ZeroDec()) return types.NewMsgCreateValidator( - address, pubKey, sdk.NewCoin("steak", sdk.NewInt(amt)), Description{}, commission, + address, pubKey, sdk.NewCoin(types.DefaultBondDenom, sdk.NewInt(amt)), Description{}, commission, ) } @@ -46,7 +46,7 @@ func NewTestMsgDelegate(delAddr sdk.AccAddress, valAddr sdk.ValAddress, amt int6 return MsgDelegate{ DelegatorAddr: delAddr, ValidatorAddr: valAddr, - Delegation: sdk.NewCoin("steak", sdk.NewInt(amt)), + Delegation: sdk.NewCoin(types.DefaultBondDenom, sdk.NewInt(amt)), } } @@ -57,6 +57,6 @@ func NewTestMsgCreateValidatorOnBehalfOf(delAddr sdk.AccAddress, valAddr sdk.Val DelegatorAddr: delAddr, ValidatorAddr: valAddr, PubKey: valPubKey, - Delegation: sdk.NewCoin("steak", sdk.NewInt(amt)), + Delegation: sdk.NewCoin(types.DefaultBondDenom, sdk.NewInt(amt)), } } diff --git a/x/stake/types/msg_test.go b/x/stake/types/msg_test.go index 7c1800b8e4..7e719f3eef 100644 --- a/x/stake/types/msg_test.go +++ b/x/stake/types/msg_test.go @@ -10,9 +10,9 @@ import ( ) var ( - coinPos = sdk.NewInt64Coin("steak", 1000) - coinZero = sdk.NewInt64Coin("steak", 0) - coinNeg = sdk.NewInt64Coin("steak", -10000) + coinPos = sdk.NewInt64Coin(DefaultBondDenom, 1000) + coinZero = sdk.NewInt64Coin(DefaultBondDenom, 0) + coinNeg = sdk.NewInt64Coin(DefaultBondDenom, -10000) ) // test ValidateBasic for MsgCreateValidator diff --git a/x/stake/types/params.go b/x/stake/types/params.go index 699758ace4..dcd1729828 100644 --- a/x/stake/types/params.go +++ b/x/stake/types/params.go @@ -19,6 +19,9 @@ const ( // if this is 1, the validator set at the end of a block will sign the block after the next. // Constant as this should not change without a hard fork. ValidatorUpdateDelay int64 = 1 + + // Default bondable coin denomination + DefaultBondDenom = "STAKE" ) // nolint - Keys for parameter access @@ -59,7 +62,7 @@ func DefaultParams() Params { return Params{ UnbondingTime: defaultUnbondingTime, MaxValidators: 100, - BondDenom: "steak", + BondDenom: DefaultBondDenom, } } From b7daf23366f34c3efb734e7d444f4a890aa4e491 Mon Sep 17 00:00:00 2001 From: Jack Zampolin Date: Mon, 12 Nov 2018 10:55:24 -0800 Subject: [PATCH 35/47] R4R: Fix unbonding command flow (#2727) --- PENDING.md | 1 + x/stake/client/cli/tx.go | 18 ++---------------- 2 files changed, 3 insertions(+), 16 deletions(-) diff --git a/PENDING.md b/PENDING.md index 48d5fe0e1f..25cf75bc64 100644 --- a/PENDING.md +++ b/PENDING.md @@ -5,6 +5,7 @@ BREAKING CHANGES * Gaia REST API (`gaiacli advanced rest-server`) * Gaia CLI (`gaiacli`) + * [cli] [\#2727](https://github.com/cosmos/cosmos-sdk/pull/2727) Fix unbonding command flow * Gaia diff --git a/x/stake/client/cli/tx.go b/x/stake/client/cli/tx.go index 3b8d8e2009..5064999298 100644 --- a/x/stake/client/cli/tx.go +++ b/x/stake/client/cli/tx.go @@ -2,6 +2,7 @@ package cli import ( "fmt" + "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/context" "github.com/cosmos/cosmos-sdk/client/utils" @@ -284,22 +285,7 @@ func GetCmdBeginRedelegate(storeName string, cdc *codec.Codec) *cobra.Command { func GetCmdUnbond(storeName string, cdc *codec.Codec) *cobra.Command { cmd := &cobra.Command{ Use: "unbond", - Short: "begin or complete unbonding shares from a validator", - } - - cmd.AddCommand( - client.PostCommands( - GetCmdBeginUnbonding(storeName, cdc), - )...) - - return cmd -} - -// GetCmdBeginUnbonding implements the begin unbonding validator command. -func GetCmdBeginUnbonding(storeName string, cdc *codec.Codec) *cobra.Command { - cmd := &cobra.Command{ - Use: "begin", - Short: "begin unbonding", + Short: "unbond shares from a validator", RunE: func(cmd *cobra.Command, args []string) error { txBldr := authtxb.NewTxBuilderFromCLI().WithCodec(cdc) cliCtx := context.NewCLIContext(). From 964123356b3f2bed4f61f68cdc34d01f1b156507 Mon Sep 17 00:00:00 2001 From: Aleksandr Bezobchuk Date: Mon, 12 Nov 2018 15:44:59 -0500 Subject: [PATCH 36/47] Fix required flag --- cmd/gaia/init/init.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/gaia/init/init.go b/cmd/gaia/init/init.go index bb56de1bd6..1f12da6bde 100644 --- a/cmd/gaia/init/init.go +++ b/cmd/gaia/init/init.go @@ -89,11 +89,11 @@ func InitCmd(ctx *server.Context, cdc *codec.Codec, appInit server.AppInit) *cob }, } - cmd.MarkFlagRequired(flagMoniker) cmd.Flags().String(cli.HomeFlag, app.DefaultNodeHome, "node's home directory") cmd.Flags().BoolP(flagOverwrite, "o", false, "overwrite the genesis.json file") cmd.Flags().String(client.FlagChainID, "", "genesis file chain-id, if left blank will be randomly created") cmd.Flags().String(flagMoniker, "", "set the validator's moniker") + cmd.MarkFlagRequired(flagMoniker) return cmd } From 97c0251bf74115cdbb8ae50800ec4ce40540978f Mon Sep 17 00:00:00 2001 From: Jack Zampolin Date: Mon, 12 Nov 2018 13:01:00 -0800 Subject: [PATCH 37/47] Fix redelegation command --- x/stake/client/cli/tx.go | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/x/stake/client/cli/tx.go b/x/stake/client/cli/tx.go index 5064999298..a42fcf6d02 100644 --- a/x/stake/client/cli/tx.go +++ b/x/stake/client/cli/tx.go @@ -211,26 +211,11 @@ func GetCmdDelegate(cdc *codec.Codec) *cobra.Command { return cmd } -// GetCmdRedelegate implements the redelegate validator command. +// GetCmdRedelegate the begin redelegation command. func GetCmdRedelegate(storeName string, cdc *codec.Codec) *cobra.Command { cmd := &cobra.Command{ Use: "redelegate", Short: "redelegate illiquid tokens from one validator to another", - } - - cmd.AddCommand( - client.PostCommands( - GetCmdBeginRedelegate(storeName, cdc), - )...) - - return cmd -} - -// GetCmdBeginRedelegate the begin redelegation command. -func GetCmdBeginRedelegate(storeName string, cdc *codec.Codec) *cobra.Command { - cmd := &cobra.Command{ - Use: "begin", - Short: "begin redelegation", RunE: func(cmd *cobra.Command, args []string) error { txBldr := authtxb.NewTxBuilderFromCLI().WithCodec(cdc) cliCtx := context.NewCLIContext(). From 8be97eec78b3ace76d584a193680b270a75f1787 Mon Sep 17 00:00:00 2001 From: Jack Zampolin Date: Mon, 12 Nov 2018 13:05:47 -0800 Subject: [PATCH 38/47] Add pending entry --- PENDING.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/PENDING.md b/PENDING.md index 5c9b6541e9..9ac7f908a6 100644 --- a/PENDING.md +++ b/PENDING.md @@ -6,6 +6,7 @@ BREAKING CHANGES * Gaia CLI (`gaiacli`) * [cli] [\#2727](https://github.com/cosmos/cosmos-sdk/pull/2727) Fix unbonding command flow + * [cli] [\#2786](https://github.com/cosmos/cosmos-sdk/pull/2786) Fix redelegation command flow * Gaia @@ -53,8 +54,8 @@ BUG FIXES * Gaia * [\#2723] Use `cosmosvalcons` Bech32 prefix in `tendermint show-address` - * [\#2742](https://github.com/cosmos/cosmos-sdk/issues/2742) Fix time format of TimeoutCommit override - + * [\#2742](https://github.com/cosmos/cosmos-sdk/issues/2742) Fix time format of TimeoutCommit override + * SDK * Tendermint From 182f111ddcc5cd72d7ad93fa903afcfd434ef001 Mon Sep 17 00:00:00 2001 From: Federico Kunze Date: Mon, 12 Nov 2018 22:53:43 +0100 Subject: [PATCH 39/47] update swagger.yaml --- client/lcd/swagger-ui/swagger.yaml | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/client/lcd/swagger-ui/swagger.yaml b/client/lcd/swagger-ui/swagger.yaml index 86b6ec6813..b8494a7224 100644 --- a/client/lcd/swagger-ui/swagger.yaml +++ b/client/lcd/swagger-ui/swagger.yaml @@ -950,6 +950,30 @@ paths: description: Invalid validator address 500: description: Internal Server Error + /stake/validators/{validatorAddr}/delegations: + parameters: + - in: path + name: validatorAddr + description: Bech32 OperatorAddress of validator + required: true + type: string + get: + summary: Get all delegations from a validator + tags: + - ICS21 + produces: + - application/json + responses: + 200: + description: OK + schema: + type: array + items: + $ref: "#/definitions/Delegation" + 400: + description: Invalid validator address + 500: + description: Internal Server Error /stake/validators/{validatorAddr}/unbonding_delegations: parameters: - in: path From 7dfeb7d27d2a860d0079f2e18f1e3d1450115a84 Mon Sep 17 00:00:00 2001 From: Federico Kunze Date: Mon, 12 Nov 2018 23:12:25 +0100 Subject: [PATCH 40/47] use newQuery...Params --- x/stake/client/cli/query.go | 12 +++------- x/stake/client/rest/utils.go | 13 +++-------- x/stake/querier/queryable.go | 22 ++++++++++++++++++ x/stake/querier/queryable_test.go | 37 ++++++++----------------------- x/stake/stake.go | 5 ++++- 5 files changed, 41 insertions(+), 48 deletions(-) diff --git a/x/stake/client/cli/query.go b/x/stake/client/cli/query.go index f6265c2cd5..24e4499960 100644 --- a/x/stake/client/cli/query.go +++ b/x/stake/client/cli/query.go @@ -127,9 +127,7 @@ func GetCmdQueryValidatorUnbondingDelegations(queryRoute string, cdc *codec.Code } cliCtx := context.NewCLIContext().WithCodec(cdc) - params := stake.QueryValidatorParams{ - ValidatorAddr: valAddr, - } + params := stake.NewQueryValidatorParams(valAddr) bz, err := cdc.MarshalJSON(params) if err != nil { @@ -164,9 +162,7 @@ func GetCmdQueryValidatorRedelegations(queryRoute string, cdc *codec.Codec) *cob } cliCtx := context.NewCLIContext().WithCodec(cdc) - params := stake.QueryValidatorParams{ - ValidatorAddr: valAddr, - } + params := stake.NewQueryValidatorParams(valAddr) bz, err := cdc.MarshalJSON(params) if err != nil { @@ -303,9 +299,7 @@ func GetCmdQueryValidatorDelegations(queryRoute string, cdc *codec.Codec) *cobra return err } - params := stake.QueryValidatorParams{ - ValidatorAddr: validatorAddr, - } + params := stake.NewQueryValidatorParams(validatorAddr) bz, err := cdc.MarshalJSON(params) if err != nil { diff --git a/x/stake/client/rest/utils.go b/x/stake/client/rest/utils.go index bb986c3147..7f6edc1938 100644 --- a/x/stake/client/rest/utils.go +++ b/x/stake/client/rest/utils.go @@ -62,10 +62,7 @@ func queryBonds(cliCtx context.CLIContext, cdc *codec.Codec, endpoint string) ht return } - params := stake.QueryBondsParams{ - DelegatorAddr: delegatorAddr, - ValidatorAddr: validatorAddr, - } + params := stake.NewQueryBondsParams(delegatorAddr, validatorAddr) bz, err := cdc.MarshalJSON(params) if err != nil { @@ -93,9 +90,7 @@ func queryDelegator(cliCtx context.CLIContext, cdc *codec.Codec, endpoint string return } - params := stake.QueryDelegatorParams{ - DelegatorAddr: delegatorAddr, - } + params := stake.NewQueryDelegatorParams(delegatorAddr) bz, err := cdc.MarshalJSON(params) if err != nil { @@ -123,9 +118,7 @@ func queryValidator(cliCtx context.CLIContext, cdc *codec.Codec, endpoint string return } - params := stake.QueryValidatorParams{ - ValidatorAddr: validatorAddr, - } + params := stake.NewQueryValidatorParams(validatorAddr) bz, err := cdc.MarshalJSON(params) if err != nil { diff --git a/x/stake/querier/queryable.go b/x/stake/querier/queryable.go index ec0f78907c..13ff97ef3f 100644 --- a/x/stake/querier/queryable.go +++ b/x/stake/querier/queryable.go @@ -92,6 +92,28 @@ type QueryBondsParams struct { ValidatorAddr sdk.ValAddress } +// creates a new QueryDelegatorParams +func NewQueryDelegatorParams(delegatorAddr sdk.AccAddress) QueryDelegatorParams { + return QueryDelegatorParams{ + DelegatorAddr: delegatorAddr, + } +} + +// creates a new QueryValidatorParams +func NewQueryValidatorParams(validatorAddr sdk.ValAddress) QueryValidatorParams { + return QueryValidatorParams{ + ValidatorAddr: validatorAddr, + } +} + +// creates a new QueryBondsParams +func NewQueryBondsParams(delegatorAddr sdk.AccAddress, validatorAddr sdk.ValAddress) QueryBondsParams { + return QueryBondsParams{ + DelegatorAddr: delegatorAddr, + ValidatorAddr: validatorAddr, + } +} + func queryValidators(ctx sdk.Context, cdc *codec.Codec, k keep.Keeper) (res []byte, err sdk.Error) { stakeParams := k.GetParams(ctx) validators := k.GetValidators(ctx, stakeParams.MaxValidators) diff --git a/x/stake/querier/queryable_test.go b/x/stake/querier/queryable_test.go index 473b65875f..fc991c7b2d 100644 --- a/x/stake/querier/queryable_test.go +++ b/x/stake/querier/queryable_test.go @@ -17,25 +17,6 @@ var ( pk1, pk2 = keep.PKs[0], keep.PKs[1] ) -func newTestDelegatorQuery(delegatorAddr sdk.AccAddress) QueryDelegatorParams { - return QueryDelegatorParams{ - DelegatorAddr: delegatorAddr, - } -} - -func newTestValidatorQuery(validatorAddr sdk.ValAddress) QueryValidatorParams { - return QueryValidatorParams{ - ValidatorAddr: validatorAddr, - } -} - -func newTestBondQuery(delegatorAddr sdk.AccAddress, validatorAddr sdk.ValAddress) QueryBondsParams { - return QueryBondsParams{ - DelegatorAddr: delegatorAddr, - ValidatorAddr: validatorAddr, - } -} - func TestNewQuerier(t *testing.T) { cdc := codec.New() ctx, _, keeper := keep.CreateTestInput(t, false, 1000) @@ -72,7 +53,7 @@ func TestNewQuerier(t *testing.T) { _, err = querier(ctx, []string{"parameters"}, query) require.Nil(t, err) - queryValParams := newTestValidatorQuery(addrVal1) + queryValParams := NewQueryValidatorParams(addrVal1) bz, errRes := cdc.MarshalJSON(queryValParams) require.Nil(t, errRes) @@ -91,7 +72,7 @@ func TestNewQuerier(t *testing.T) { _, err = querier(ctx, []string{"validatorRedelegations"}, query) require.Nil(t, err) - queryDelParams := newTestDelegatorQuery(addrAcc2) + queryDelParams := NewQueryDelegatorParams(addrAcc2) bz, errRes = cdc.MarshalJSON(queryDelParams) require.Nil(t, errRes) @@ -163,7 +144,7 @@ func TestQueryValidators(t *testing.T) { require.ElementsMatch(t, queriedValidators, validatorsResp) // Query each validator - queryParams := newTestValidatorQuery(addrVal1) + queryParams := NewQueryValidatorParams(addrVal1) bz, errRes := cdc.MarshalJSON(queryParams) require.Nil(t, errRes) @@ -203,7 +184,7 @@ func TestQueryDelegation(t *testing.T) { keeper.ApplyAndReturnValidatorSetUpdates(ctx) // Query Delegator bonded validators - queryParams := newTestDelegatorQuery(addrAcc2) + queryParams := NewQueryDelegatorParams(addrAcc2) bz, errRes := cdc.MarshalJSON(queryParams) require.Nil(t, errRes) @@ -231,7 +212,7 @@ func TestQueryDelegation(t *testing.T) { require.NotNil(t, err) // Query bonded validator - queryBondParams := newTestBondQuery(addrAcc2, addrVal1) + queryBondParams := NewQueryBondsParams(addrAcc2, addrVal1) bz, errRes = cdc.MarshalJSON(queryBondParams) require.Nil(t, errRes) @@ -298,7 +279,7 @@ func TestQueryDelegation(t *testing.T) { // Query validator delegations - bz, errRes = cdc.MarshalJSON(newTestValidatorQuery(addrVal1)) + bz, errRes = cdc.MarshalJSON(NewQueryValidatorParams(addrVal1)) require.Nil(t, errRes) query = abci.RequestQuery{ @@ -318,7 +299,7 @@ func TestQueryDelegation(t *testing.T) { // Query unbonging delegation keeper.BeginUnbonding(ctx, addrAcc2, val1.OperatorAddr, sdk.NewDec(10)) - queryBondParams = newTestBondQuery(addrAcc2, addrVal1) + queryBondParams = NewQueryBondsParams(addrAcc2, addrVal1) bz, errRes = cdc.MarshalJSON(queryBondParams) require.Nil(t, errRes) @@ -387,7 +368,7 @@ func TestQueryRedelegations(t *testing.T) { require.True(t, found) // delegator redelegations - queryDelegatorParams := newTestDelegatorQuery(addrAcc2) + queryDelegatorParams := NewQueryDelegatorParams(addrAcc2) bz, errRes := cdc.MarshalJSON(queryDelegatorParams) require.Nil(t, errRes) @@ -406,7 +387,7 @@ func TestQueryRedelegations(t *testing.T) { require.Equal(t, redelegation, redsRes[0]) // validator redelegations - queryValidatorParams := newTestValidatorQuery(val1.GetOperator()) + queryValidatorParams := NewQueryValidatorParams(val1.GetOperator()) bz, errRes = cdc.MarshalJSON(queryValidatorParams) require.Nil(t, errRes) diff --git a/x/stake/stake.go b/x/stake/stake.go index 87087e59c0..a922d9d72e 100644 --- a/x/stake/stake.go +++ b/x/stake/stake.go @@ -84,7 +84,10 @@ var ( NewMsgBeginUnbonding = types.NewMsgBeginUnbonding NewMsgBeginRedelegate = types.NewMsgBeginRedelegate - NewQuerier = querier.NewQuerier + NewQuerier = querier.NewQuerier + NewQueryDelegatorParams = querier.NewQueryDelegatorParams + NewQueryValidatorParams = querier.NewQueryValidatorParams + NewQueryBondsParams = querier.NewQueryBondsParams ) const ( From e76a18dcecd8e59333b8be7ab8f89e31c52f7d45 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Tue, 13 Nov 2018 13:46:38 +0100 Subject: [PATCH 41/47] Link to issue --- PENDING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PENDING.md b/PENDING.md index a9115c5fdb..71e7c3734d 100644 --- a/PENDING.md +++ b/PENDING.md @@ -37,7 +37,7 @@ IMPROVEMENTS * [\#2749](https://github.com/cosmos/cosmos-sdk/pull/2749) Add --chain-id flag to gaiad testnet * Gaia - * Require moniker to be provided on `gaiad init`. + - #2773 Require moniker to be provided on `gaiad init`. - #2672 [Makefile] Updated for better Windows compatibility and ledger support logic, get_tools was rewritten as a cross-compatible Makefile. * SDK From 17c119dff7cea6175ec3b749f05866a3cee788d2 Mon Sep 17 00:00:00 2001 From: Jack Zampolin Date: Tue, 13 Nov 2018 08:27:42 -0800 Subject: [PATCH 42/47] Fix failing test --- cmd/gaia/cli_test/cli_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/gaia/cli_test/cli_test.go b/cmd/gaia/cli_test/cli_test.go index ae12714e45..f6fb6381ec 100644 --- a/cmd/gaia/cli_test/cli_test.go +++ b/cmd/gaia/cli_test/cli_test.go @@ -392,7 +392,7 @@ func TestGaiaCLISubmitProposal(t *testing.T) { fooAcc = executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", fooAddr, flags)) - require.Equal(t, int64(35), fooAcc.GetCoins().AmountOf("steak").Int64()) + require.Equal(t, int64(35), fooAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64()) proposal1 = executeGetProposal(t, fmt.Sprintf("gaiacli query gov proposal --proposal-id=1 --output=json %v", flags)) require.Equal(t, uint64(1), proposal1.GetProposalID()) require.Equal(t, gov.StatusVotingPeriod, proposal1.GetStatus()) From 4ebe99b00fd20863d54dd33f5d533c6861e624c1 Mon Sep 17 00:00:00 2001 From: Jack Zampolin Date: Tue, 13 Nov 2018 11:10:06 -0800 Subject: [PATCH 43/47] add back in CLI command after rebase --- cmd/gaia/cmd/gaiacli/query.go | 1 + 1 file changed, 1 insertion(+) diff --git a/cmd/gaia/cmd/gaiacli/query.go b/cmd/gaia/cmd/gaiacli/query.go index 051d9427ae..9ba3bca467 100644 --- a/cmd/gaia/cmd/gaiacli/query.go +++ b/cmd/gaia/cmd/gaiacli/query.go @@ -36,6 +36,7 @@ func queryCmd(cdc *amino.Codec) *cobra.Command { stakecmd.GetCmdQueryRedelegations(storeStake, cdc), stakecmd.GetCmdQueryValidator(storeStake, cdc), stakecmd.GetCmdQueryValidators(storeStake, cdc), + stakecmd.GetCmdQueryValidatorDelegations(storeStake, cdc), stakecmd.GetCmdQueryValidatorUnbondingDelegations(queryRouteStake, cdc), stakecmd.GetCmdQueryValidatorRedelegations(queryRouteStake, cdc), stakecmd.GetCmdQueryParams(storeStake, cdc), From f38f57dfb220778f208a6c1e86b4a1934e73e28f Mon Sep 17 00:00:00 2001 From: Jack Zampolin Date: Tue, 13 Nov 2018 11:33:03 -0800 Subject: [PATCH 44/47] Fix CLI tests --- cmd/gaia/cli_test/cli_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/gaia/cli_test/cli_test.go b/cmd/gaia/cli_test/cli_test.go index 76158710a0..9745410089 100644 --- a/cmd/gaia/cli_test/cli_test.go +++ b/cmd/gaia/cli_test/cli_test.go @@ -272,7 +272,7 @@ func TestGaiaCLICreateValidator(t *testing.T) { require.Equal(t, validator.OperatorAddr, sdk.ValAddress(barAddr)) require.True(sdk.DecEq(t, sdk.NewDec(2), validator.Tokens)) - validatorDelegations := executeGetValidatorDelegations(t, fmt.Sprintf("gaiacli query delegations-to %s --output=json %v", sdk.ValAddress(barAddr), flags)) + validatorDelegations := executeGetValidatorDelegations(t, fmt.Sprintf("gaiacli query stake delegations-to %s --output=json %v", sdk.ValAddress(barAddr), flags)) require.Len(t, validatorDelegations, 1) require.NotZero(t, validatorDelegations[0].Shares) From 8c805d4a4780394c68da1fadc25120b5c47be94c Mon Sep 17 00:00:00 2001 From: zramsay Date: Tue, 13 Nov 2018 15:16:20 -0500 Subject: [PATCH 45/47] update to amino 0.14.1 --- Gopkg.lock | 6 +++--- Gopkg.toml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Gopkg.lock b/Gopkg.lock index 3aecfa090b..bcc306edb9 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -418,12 +418,12 @@ revision = "e5840949ff4fff0c56f9b6a541e22b63581ea9df" [[projects]] - digest = "1:10b3a599325740c84a7c81f3f3cb2e1fdb70b3ea01b7fa28495567a2519df431" + digest = "1:ad9c4c1a4e7875330b1f62906f2830f043a23edb5db997e3a5ac5d3e6eadf80a" name = "github.com/tendermint/go-amino" packages = ["."] pruneopts = "UT" - revision = "6dcc6ddc143e116455c94b25c1004c99e0d0ca12" - version = "v0.14.0" + revision = "dc14acf9ef15f85828bfbc561ed9dd9d2a284885" + version = "v0.14.1" [[projects]] digest = "1:9f8c4c93658315a795ffd3e0c943d39f78067dd8382b8d7bcfaf6686b92f3978" diff --git a/Gopkg.toml b/Gopkg.toml index 90f54c6570..f8ffcca054 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -28,7 +28,7 @@ [[override]] name = "github.com/tendermint/go-amino" - version = "v0.14.0" + version = "v0.14.1" [[override]] name = "github.com/tendermint/iavl" From 689d8d09214caf9954fed90029fe6986fe0b5818 Mon Sep 17 00:00:00 2001 From: zramsay Date: Tue, 13 Nov 2018 17:31:32 -0500 Subject: [PATCH 46/47] pending --- PENDING.md | 1 + 1 file changed, 1 insertion(+) diff --git a/PENDING.md b/PENDING.md index f0d74501dd..cf52c43516 100644 --- a/PENDING.md +++ b/PENDING.md @@ -47,6 +47,7 @@ IMPROVEMENTS - [x/mock/simulation] [\#2720] major cleanup, introduction of helper objects, reorganization * Tendermint + - #2796 Update to go-amino 0.14.1 BUG FIXES From d1614ebb7ebe0c5b9ceaa79bb98feabf57c78c35 Mon Sep 17 00:00:00 2001 From: Sunny Aggarwal Date: Tue, 13 Nov 2018 15:45:37 -0800 Subject: [PATCH 47/47] R4R: Query Gov Params (#2576) * gov query params --- PENDING.md | 8 +- client/lcd/lcd_test.go | 47 +++- client/lcd/swagger-ui/swagger.yaml | 79 ++++++- client/lcd/test_helpers.go | 8 +- cmd/gaia/cli_test/cli_test.go | 31 +++ cmd/gaia/cmd/gaiacli/query.go | 1 + docs/spec/governance/README.md | 4 +- docs/spec/governance/state.md | 51 ++--- docs/spec/governance/transactions.md | 76 +++--- examples/democoin/cli_test/cli_test.go | 3 +- x/gov/client/cli/tx.go | 24 ++ x/gov/client/rest/rest.go | 23 +- x/gov/keeper.go | 4 +- x/gov/params.go | 6 +- x/gov/{queryable.go => querier.go} | 34 +++ x/gov/querier_test.go | 306 +++++++++++++++++++++++++ x/gov/test_common.go | 1 + x/mock/app.go | 57 ++++- 18 files changed, 673 insertions(+), 90 deletions(-) rename x/gov/{queryable.go => querier.go} (86%) create mode 100644 x/gov/querier_test.go diff --git a/PENDING.md b/PENDING.md index cf52c43516..5480b77801 100644 --- a/PENDING.md +++ b/PENDING.md @@ -20,11 +20,17 @@ BREAKING CHANGES FEATURES * Gaia REST API (`gaiacli advanced rest-server`) + * [gov] [\#2479](https://github.com/cosmos/cosmos-sdk/issues/2479) Added governance parameter + query REST endpoints. * Gaia CLI (`gaiacli`) - * [stake][cli] [\#2027] Add CLI query command for getting all delegations to a specific validator. + * [gov][cli] [\#2479](https://github.com/cosmos/cosmos-sdk/issues/2479) Added governance + parameter query commands. + * [stake][cli] [\#2027] Add CLI query command for getting all delegations to a specific validator. * Gaia + * [x/gov] [#2479](https://github.com/cosmos/cosmos-sdk/issues/2479) Implemented querier + for getting governance parameters. * SDK * [simulator] \#2682 MsgEditValidator now looks at the validator's max rate, thus it now succeeds a significant portion of the time diff --git a/client/lcd/lcd_test.go b/client/lcd/lcd_test.go index 1f087ec88e..1be908e98b 100644 --- a/client/lcd/lcd_test.go +++ b/client/lcd/lcd_test.go @@ -735,26 +735,33 @@ func TestProposalsQuery(t *testing.T) { cleanup, _, _, port := InitializeTestLCD(t, 1, []sdk.AccAddress{addrs[0], addrs[1]}) defer cleanup() + depositParam := getDepositParam(t, port) + halfMinDeposit := depositParam.MinDeposit.AmountOf(stakeTypes.DefaultBondDenom).Int64() / 2 + getVotingParam(t, port) + getTallyingParam(t, port) + // Addr1 proposes (and deposits) proposals #1 and #2 - resultTx := doSubmitProposal(t, port, seeds[0], names[0], passwords[0], addrs[0], 5) + resultTx := doSubmitProposal(t, port, seeds[0], names[0], passwords[0], addrs[0], halfMinDeposit) var proposalID1 uint64 cdc.MustUnmarshalBinaryLengthPrefixed(resultTx.DeliverTx.GetData(), &proposalID1) tests.WaitForHeight(resultTx.Height+1, port) - resultTx = doSubmitProposal(t, port, seeds[0], names[0], passwords[0], addrs[0], 5) + + resultTx = doSubmitProposal(t, port, seeds[0], names[0], passwords[0], addrs[0], halfMinDeposit) var proposalID2 uint64 cdc.MustUnmarshalBinaryLengthPrefixed(resultTx.DeliverTx.GetData(), &proposalID2) tests.WaitForHeight(resultTx.Height+1, port) // Addr2 proposes (and deposits) proposals #3 - resultTx = doSubmitProposal(t, port, seeds[1], names[1], passwords[1], addrs[1], 5) + resultTx = doSubmitProposal(t, port, seeds[1], names[1], passwords[1], addrs[1], halfMinDeposit) var proposalID3 uint64 cdc.MustUnmarshalBinaryLengthPrefixed(resultTx.DeliverTx.GetData(), &proposalID3) tests.WaitForHeight(resultTx.Height+1, port) // Addr2 deposits on proposals #2 & #3 - resultTx = doDeposit(t, port, seeds[1], names[1], passwords[1], addrs[1], proposalID2, 5) + resultTx = doDeposit(t, port, seeds[1], names[1], passwords[1], addrs[1], proposalID2, halfMinDeposit) tests.WaitForHeight(resultTx.Height+1, port) - resultTx = doDeposit(t, port, seeds[1], names[1], passwords[1], addrs[1], proposalID3, 5) + + resultTx = doDeposit(t, port, seeds[1], names[1], passwords[1], addrs[1], proposalID3, halfMinDeposit) tests.WaitForHeight(resultTx.Height+1, port) // check deposits match proposal and individual deposits @@ -1246,6 +1253,36 @@ func getValidatorRedelegations(t *testing.T, port string, validatorAddr sdk.ValA // ============= Governance Module ================ +func getDepositParam(t *testing.T, port string) gov.DepositParams { + res, body := Request(t, port, "GET", "/gov/parameters/deposit", nil) + require.Equal(t, http.StatusOK, res.StatusCode, body) + + var depositParams gov.DepositParams + err := cdc.UnmarshalJSON([]byte(body), &depositParams) + require.Nil(t, err) + return depositParams +} + +func getVotingParam(t *testing.T, port string) gov.VotingParams { + res, body := Request(t, port, "GET", "/gov/parameters/voting", nil) + require.Equal(t, http.StatusOK, res.StatusCode, body) + + var votingParams gov.VotingParams + err := cdc.UnmarshalJSON([]byte(body), &votingParams) + require.Nil(t, err) + return votingParams +} + +func getTallyingParam(t *testing.T, port string) gov.TallyParams { + res, body := Request(t, port, "GET", "/gov/parameters/tallying", nil) + require.Equal(t, http.StatusOK, res.StatusCode, body) + + var tallyParams gov.TallyParams + err := cdc.UnmarshalJSON([]byte(body), &tallyParams) + require.Nil(t, err) + return tallyParams +} + func getProposal(t *testing.T, port string, proposalID uint64) gov.Proposal { res, body := Request(t, port, "GET", fmt.Sprintf("/gov/proposals/%d", proposalID), nil) require.Equal(t, http.StatusOK, res.StatusCode, body) diff --git a/client/lcd/swagger-ui/swagger.yaml b/client/lcd/swagger-ui/swagger.yaml index b8494a7224..920194ffa4 100644 --- a/client/lcd/swagger-ui/swagger.yaml +++ b/client/lcd/swagger-ui/swagger.yaml @@ -1451,7 +1451,7 @@ paths: /gov/proposals/{proposalId}/votes/{voter}: get: summary: Query vote - description: Query vote information by proposalId and voter address + description: Query vote information by proposal Id and voter address produces: - application/json tags: @@ -1478,6 +1478,83 @@ paths: description: Found no vote 500: description: Internal Server Error + /gov/parameters/deposit: + get: + summary: Query governance deposit parameters + description: Query governance deposit parameters. The max_deposit_period units are in nanoseconds. + produces: + - application/json + tags: + - ICS22 + responses: + 200: + description: OK + schema: + type: object + properties: + min_deposit: + type: array + items: + $ref: "#/definitions/Coin" + max_deposit_period: + type: string + example: "86400000000000" + 400: + description: is not a valid query request path + 404: + description: Found no deposit parameters + 500: + description: Internal Server Error + /gov/parameters/tallying: + get: + summary: Query governance tally parameters + description: Query governance tally parameters + produces: + - application/json + tags: + - ICS22 + responses: + 200: + description: OK + schema: + properties: + threshold: + type: string + example: "0.5000000000" + veto: + type: string + example: "0.3340000000" + governance_penalty: + type: string + example: "0.0100000000" + 400: + description: is not a valid query request path + 404: + description: Found no tally parameters + 500: + description: Internal Server Error + /gov/parameters/voting: + get: + summary: Query governance voting parameters + description: Query governance voting parameters. The voting_period units are in nanoseconds. + produces: + - application/json + tags: + - ICS22 + responses: + 200: + description: OK + schema: + properties: + voting_period: + type: string + example: "86400000000000" + 400: + description: is not a valid query request path + 404: + description: Found no voting parameters + 500: + description: Internal Server Error definitions: CheckTxResult: diff --git a/client/lcd/test_helpers.go b/client/lcd/test_helpers.go index 283550a16a..774fd4d6ad 100644 --- a/client/lcd/test_helpers.go +++ b/client/lcd/test_helpers.go @@ -4,9 +4,7 @@ import ( "bytes" "encoding/json" "fmt" - "github.com/cosmos/cosmos-sdk/x/stake" - stakeTypes "github.com/cosmos/cosmos-sdk/x/stake/types" - "github.com/tendermint/tendermint/crypto/secp256k1" + "io/ioutil" "net" "net/http" @@ -16,6 +14,9 @@ import ( "strings" "testing" + stakeTypes "github.com/cosmos/cosmos-sdk/x/stake/types" + "github.com/tendermint/tendermint/crypto/secp256k1" + "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/keys" gapp "github.com/cosmos/cosmos-sdk/cmd/gaia/app" @@ -25,6 +26,7 @@ import ( "github.com/cosmos/cosmos-sdk/tests" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/auth" + "github.com/cosmos/cosmos-sdk/x/stake" "github.com/spf13/viper" "github.com/stretchr/testify/require" diff --git a/cmd/gaia/cli_test/cli_test.go b/cmd/gaia/cli_test/cli_test.go index 9745410089..874c2a29a4 100644 --- a/cmd/gaia/cli_test/cli_test.go +++ b/cmd/gaia/cli_test/cli_test.go @@ -317,6 +317,10 @@ func TestGaiaCLISubmitProposal(t *testing.T) { tests.WaitForTMStart(port) tests.WaitForNextNBlocksTM(2, port) + executeGetDepositParam(t, fmt.Sprintf("gaiacli query gov param deposit %v", flags)) + executeGetVotingParam(t, fmt.Sprintf("gaiacli query gov param voting %v", flags)) + executeGetTallyingParam(t, fmt.Sprintf("gaiacli query gov param tallying %v", flags)) + fooAddr, _ := executeGetAddrPK(t, fmt.Sprintf("gaiacli keys show foo --output=json --home=%s", gaiacliHome)) fooAcc := executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", fooAddr, flags)) @@ -784,6 +788,33 @@ func executeGetParams(t *testing.T, cmdStr string) stake.Params { //___________________________________________________________________________________ // gov +func executeGetDepositParam(t *testing.T, cmdStr string) gov.DepositParams { + out, _ := tests.ExecuteT(t, cmdStr, "") + var depositParam gov.DepositParams + cdc := app.MakeCodec() + err := cdc.UnmarshalJSON([]byte(out), &depositParam) + require.NoError(t, err, "out %v\n, err %v", out, err) + return depositParam +} + +func executeGetVotingParam(t *testing.T, cmdStr string) gov.VotingParams { + out, _ := tests.ExecuteT(t, cmdStr, "") + var votingParam gov.VotingParams + cdc := app.MakeCodec() + err := cdc.UnmarshalJSON([]byte(out), &votingParam) + require.NoError(t, err, "out %v\n, err %v", out, err) + return votingParam +} + +func executeGetTallyingParam(t *testing.T, cmdStr string) gov.TallyParams { + out, _ := tests.ExecuteT(t, cmdStr, "") + var tallyingParam gov.TallyParams + cdc := app.MakeCodec() + err := cdc.UnmarshalJSON([]byte(out), &tallyingParam) + require.NoError(t, err, "out %v\n, err %v", out, err) + return tallyingParam +} + func executeGetProposal(t *testing.T, cmdStr string) gov.Proposal { out, _ := tests.ExecuteT(t, cmdStr, "") var proposal gov.Proposal diff --git a/cmd/gaia/cmd/gaiacli/query.go b/cmd/gaia/cmd/gaiacli/query.go index 9ba3bca467..3a806d36c2 100644 --- a/cmd/gaia/cmd/gaiacli/query.go +++ b/cmd/gaia/cmd/gaiacli/query.go @@ -53,6 +53,7 @@ func queryCmd(cdc *amino.Codec) *cobra.Command { govcmd.GetCmdQueryProposals(storeGov, cdc), govcmd.GetCmdQueryVote(storeGov, cdc), govcmd.GetCmdQueryVotes(storeGov, cdc), + govcmd.GetCmdQueryParams(storeGov, cdc), govcmd.GetCmdQueryDeposit(storeGov, cdc), govcmd.GetCmdQueryDeposits(storeGov, cdc))...) diff --git a/docs/spec/governance/README.md b/docs/spec/governance/README.md index 0ddbc7cfdc..6cc1edb508 100644 --- a/docs/spec/governance/README.md +++ b/docs/spec/governance/README.md @@ -2,7 +2,7 @@ ## Abstract -This paper specifies the Governance module of the Cosmos-SDK, which was first described in the [Cosmos Whitepaper](https://cosmos.network/about/whitepaper) in June 2016. +This paper specifies the Governance module of the Cosmos-SDK, which was first described in the [Cosmos Whitepaper](https://cosmos.network/about/whitepaper) in June 2016. The module enables Cosmos-SDK based blockchain to support an on-chain governance system. In this system, holders of the native staking token of the chain can vote on proposals on a 1 token 1 vote basis. Next is a list of features the module currently supports: @@ -24,7 +24,7 @@ The following specification uses *Atom* as the native staking token. The module 1. **[Design overview](overview.md)** 2. **Implementation** 1. **[State](state.md)** - 1. Procedures + 1. Parameters 2. Proposals 3. Proposal Processing Queue 2. **[Transactions](transactions.md)** diff --git a/docs/spec/governance/state.md b/docs/spec/governance/state.md index ca130bd4c3..3858ba06b6 100644 --- a/docs/spec/governance/state.md +++ b/docs/spec/governance/state.md @@ -2,36 +2,35 @@ ## State -### Procedures and base types - -`Procedures` define the rule according to which votes are run. There can only -be one active procedure at any given time. If governance wants to change a -procedure, either to modify a value or add/remove a parameter, a new procedure -has to be created and the previous one rendered inactive. +### Parameters and base types +`Parameters` define the rules according to which votes are run. There can only +be one active parameter set at any given time. If governance wants to change a +parameter set, either to modify a value or add/remove a parameter field, a new +parameter set has to be created and the previous one rendered inactive. ```go -type DepositProcedure struct { - MinDeposit sdk.Coins // Minimum deposit for a proposal to enter voting period. - MaxDepositPeriod time.Time // Maximum period for Atom holders to deposit on a proposal. Initial value: 2 months +type DepositParams struct { + MinDeposit sdk.Coins // Minimum deposit for a proposal to enter voting period. + MaxDepositPeriod time.Time // Maximum period for Atom holders to deposit on a proposal. Initial value: 2 months } ``` ```go -type VotingProcedure struct { - VotingPeriod time.Time // Length of the voting period. Initial value: 2 weeks +type VotingParams struct { + VotingPeriod time.Time // Length of the voting period. Initial value: 2 weeks } ``` ```go -type TallyingProcedure struct { - Threshold sdk.Dec // Minimum propotion of Yes votes for proposal to pass. Initial value: 0.5 - Veto sdk.Dec // Minimum proportion of Veto votes to Total votes ratio for proposal to be vetoed. Initial value: 1/3 - GovernancePenalty sdk.Dec // Penalty if validator does not vote +type TallyParams struct { + Threshold sdk.Dec // Minimum proportion of Yes votes for proposal to pass. Initial value: 0.5 + Veto sdk.Dec // Minimum proportion of Veto votes to Total votes ratio for proposal to be vetoed. Initial value: 1/3 + GovernancePenalty sdk.Dec // Penalty if validator does not vote } ``` -Procedures are stored in a global `GlobalParams` KVStore. +Parameters are stored in a global `GlobalParams` KVStore. Additionally, we introduce some basic types: @@ -61,7 +60,7 @@ const ( ProposalStatusActive = 0x2 // MinDeposit is reachhed, participants can vote ProposalStatusAccepted = 0x3 // Proposal has been accepted ProposalStatusRejected = 0x4 // Proposal has been rejected - ProposalStatusClosed. = 0x5 // Proposal never reached MinDeposit + ProposalStatusClosed = 0x5 // Proposal never reached MinDeposit ) ``` @@ -76,7 +75,7 @@ const ( ### ValidatorGovInfo -This type is used in a temp map when tallying +This type is used in a temp map when tallying ```go type ValidatorGovInfo struct { @@ -87,7 +86,7 @@ This type is used in a temp map when tallying ### Proposals -`Proposals` are an item to be voted on. +`Proposals` are an item to be voted on. ```go type Proposal struct { @@ -99,7 +98,7 @@ type Proposal struct { SubmitTime time.Time // Time of the block where TxGovSubmitProposal was included DepositEndTime time.Time // Time that the DepositPeriod of a proposal would expire Submitter sdk.AccAddress // Address of the submitter - + VotingStartTime time.Time // Time of the block where MinDeposit was reached. time.Time{} if MinDeposit is not reached VotingEndTime time.Time // Time of the block that the VotingPeriod for a proposal will end. CurrentStatus ProposalStatus // Current status of the proposal @@ -135,7 +134,7 @@ For pseudocode purposes, here are the two function we will use to read or write ### Proposal Processing Queue **Store:** -* `ProposalProcessingQueue`: A queue `queue[proposalID]` containing all the +* `ProposalProcessingQueue`: A queue `queue[proposalID]` containing all the `ProposalIDs` of proposals that reached `MinDeposit`. Each `EndBlock`, all the proposals that have reached the end of their voting period are processed. To process a finished proposal, the application tallies the votes, compute the votes of @@ -145,8 +144,8 @@ For pseudocode purposes, here are the two function we will use to read or write And the pseudocode for the `ProposalProcessingQueue`: ```go - in EndBlock do - + in EndBlock do + for finishedProposalID in GetAllFinishedProposalIDs(block.Time) proposal = load(Governance, ) // proposal is a const key @@ -171,7 +170,7 @@ And the pseudocode for the `ProposalProcessingQueue`: if (isVal) tmpValMap(voterAddress).Vote = vote - tallyingProcedure = load(GlobalParams, 'TallyingProcedure') + tallyingParam = load(GlobalParams, 'TallyingParam') // Update tally if validator voted they voted for each validator in validators @@ -182,14 +181,14 @@ And the pseudocode for the `ProposalProcessingQueue`: // Check if proposal is accepted or rejected totalNonAbstain := proposal.YesVotes + proposal.NoVotes + proposal.NoWithVetoVotes - if (proposal.Votes.YesVotes/totalNonAbstain > tallyingProcedure.Threshold AND proposal.Votes.NoWithVetoVotes/totalNonAbstain < tallyingProcedure.Veto) + if (proposal.Votes.YesVotes/totalNonAbstain > tallyingParam.Threshold AND proposal.Votes.NoWithVetoVotes/totalNonAbstain < tallyingParam.Veto) // proposal was accepted at the end of the voting period // refund deposits (non-voters already punished) proposal.CurrentStatus = ProposalStatusAccepted for each (amount, depositer) in proposal.Deposits depositer.AtomBalance += amount - else + else // proposal was rejected proposal.CurrentStatus = ProposalStatusRejected diff --git a/docs/spec/governance/transactions.md b/docs/spec/governance/transactions.md index f3636facda..68966bcfc4 100644 --- a/docs/spec/governance/transactions.md +++ b/docs/spec/governance/transactions.md @@ -4,7 +4,7 @@ ### Proposal Submission -Proposals can be submitted by any Atom holder via a `TxGovSubmitProposal` +Proposals can be submitted by any Atom holder via a `TxGovSubmitProposal` transaction. ```go @@ -24,7 +24,7 @@ type TxGovSubmitProposal struct { * If `MinDeposit` is reached: * Push `proposalID` in `ProposalProcessingQueue` -A `TxGovSubmitProposal` transaction can be handled according to the following +A `TxGovSubmitProposal` transaction can be handled according to the following pseudocode. ```go @@ -32,31 +32,31 @@ pseudocode. // Check if TxGovSubmitProposal is valid. If it is, create proposal // upon receiving txGovSubmitProposal from sender do - - if !correctlyFormatted(txGovSubmitProposal) + + if !correctlyFormatted(txGovSubmitProposal) // check if proposal is correctly formatted. Includes fee payment. throw - - initialDeposit = txGovSubmitProposal.InitialDeposit - if (initialDeposit.Atoms <= 0) OR (sender.AtomBalance < initialDeposit.Atoms) + + initialDeposit = txGovSubmitProposal.InitialDeposit + if (initialDeposit.Atoms <= 0) OR (sender.AtomBalance < initialDeposit.Atoms) // InitialDeposit is negative or null OR sender has insufficient funds throw if (txGovSubmitProposal.Type != ProposalTypePlainText) OR (txGovSubmitProposal.Type != ProposalTypeSoftwareUpgrade) - + sender.AtomBalance -= initialDeposit.Atoms - depositProcedure = load(GlobalParams, 'DepositProcedure') - + depositParam = load(GlobalParams, 'DepositParam') + proposalID = generate new proposalID proposal = NewProposal() - + proposal.Title = txGovSubmitProposal.Title proposal.Description = txGovSubmitProposal.Description proposal.Type = txGovSubmitProposal.Type proposal.TotalDeposit = initialDeposit proposal.SubmitTime = - proposal.DepositEndTime = .Add(depositProcedure.MaxDepositPeriod) + proposal.DepositEndTime = .Add(depositParam.MaxDepositPeriod) proposal.Deposits.append({initialDeposit, sender}) proposal.Submitter = sender proposal.YesVotes = 0 @@ -64,15 +64,15 @@ upon receiving txGovSubmitProposal from sender do proposal.NoWithVetoVotes = 0 proposal.AbstainVotes = 0 proposal.CurrentStatus = ProposalStatusOpen - + store(Proposals, , proposal) // Store proposal in Proposals mapping return proposalID ``` ### Deposit -Once a proposal is submitted, if -`Proposal.TotalDeposit < ActiveProcedure.MinDeposit`, Atom holders can send +Once a proposal is submitted, if +`Proposal.TotalDeposit < ActiveParam.MinDeposit`, Atom holders can send `TxGovDeposit` transactions to increase the proposal's deposit. ```go @@ -89,7 +89,7 @@ type TxGovDeposit struct { * If `MinDeposit` is reached: * Push `proposalID` in `ProposalProcessingQueueEnd` -A `TxGovDeposit` transaction has to go through a number of checks to be valid. +A `TxGovDeposit` transaction has to go through a number of checks to be valid. These checks are outlined in the following pseudocode. ```go @@ -98,27 +98,27 @@ These checks are outlined in the following pseudocode. upon receiving txGovDeposit from sender do // check if proposal is correctly formatted. Includes fee payment. - - if !correctlyFormatted(txGovDeposit) + + if !correctlyFormatted(txGovDeposit) throw - + proposal = load(Proposals, ) // proposal is a const key, proposalID is variable - if (proposal == nil) + if (proposal == nil) // There is no proposal for this proposalID throw - + if (txGovDeposit.Deposit.Atoms <= 0) ORĀ (sender.AtomBalance < txGovDeposit.Deposit.Atoms) OR (proposal.CurrentStatus != ProposalStatusOpen) - // deposit is negative or null + // deposit is negative or null // OR sender has insufficient funds // OR proposal is not open for deposit anymore throw - depositProcedure = load(GlobalParams, 'DepositProcedure') + depositParam = load(GlobalParams, 'DepositParam') - if (CurrentBlock >= proposal.SubmitBlock + depositProcedure.MaxDepositPeriod) + if (CurrentBlock >= proposal.SubmitBlock + depositParam.MaxDepositPeriod) proposal.CurrentStatus = ProposalStatusClosed else @@ -127,21 +127,21 @@ upon receiving txGovDeposit from sender do proposal.Deposits.append({txGovVote.Deposit, sender}) proposal.TotalDeposit.Plus(txGovDeposit.Deposit) - - if (proposal.TotalDeposit >= depositProcedure.MinDeposit) + + if (proposal.TotalDeposit >= depositParam.MinDeposit) // MinDeposit is reached, vote opens - + proposal.VotingStartBlock = CurrentBlock proposal.CurrentStatus = ProposalStatusActive - ProposalProcessingQueue.push(txGovDeposit.ProposalID) + ProposalProcessingQueue.push(txGovDeposit.ProposalID) store(Proposals, , proposal) ``` ### Vote -Once `ActiveProcedure.MinDeposit` is reached, voting period starts. From there, -bonded Atom holders are able to send `TxGovVote` transactions to cast their +Once `ActiveParam.MinDeposit` is reached, voting period starts. From there, +bonded Atom holders are able to send `TxGovVote` transactions to cast their vote on the proposal. ```go @@ -157,25 +157,25 @@ vote on the proposal. *Note: Gas cost for this message has to take into account the future tallying of the vote in EndBlocker* -Next is a pseudocode proposal of the way `TxGovVote` transactions are +Next is a pseudocode proposal of the way `TxGovVote` transactions are handled: ```go // PSEUDOCODE // // Check if TxGovVote is valid. If it is, count vote// - + upon receiving txGovVote from sender do - // check if proposal is correctly formatted. Includes fee payment. - - if !correctlyFormatted(txGovDeposit) + // check if proposal is correctly formatted. Includes fee payment. + + if !correctlyFormatted(txGovDeposit) throw - + proposal = load(Proposals, ) - if (proposal == nil) + if (proposal == nil) // There is no proposal for this proposalID throw - + if (proposal.CurrentStatus == ProposalStatusActive) diff --git a/examples/democoin/cli_test/cli_test.go b/examples/democoin/cli_test/cli_test.go index 8df97c987e..9a3cba0df7 100644 --- a/examples/democoin/cli_test/cli_test.go +++ b/examples/democoin/cli_test/cli_test.go @@ -3,10 +3,11 @@ package clitest import ( "encoding/json" "fmt" - "github.com/cosmos/cosmos-sdk/cmd/gaia/app" "os" "testing" + "github.com/cosmos/cosmos-sdk/cmd/gaia/app" + "github.com/cosmos/cosmos-sdk/server" "github.com/cosmos/cosmos-sdk/tests" "github.com/stretchr/testify/require" diff --git a/x/gov/client/cli/tx.go b/x/gov/client/cli/tx.go index 455bd58db5..fc25f5ec4f 100644 --- a/x/gov/client/cli/tx.go +++ b/x/gov/client/cli/tx.go @@ -249,6 +249,30 @@ func GetCmdVote(cdc *codec.Codec) *cobra.Command { return cmd } +// GetCmdQueryProposal implements the query proposal command. +func GetCmdQueryParams(queryRoute string, cdc *codec.Codec) *cobra.Command { + cmd := &cobra.Command{ + Use: "param [param-type]", + Short: "Query the parameters (voting|tallying|deposit) of the governance process", + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + paramType := args[0] + + cliCtx := context.NewCLIContext().WithCodec(cdc) + + res, err := cliCtx.QueryWithData(fmt.Sprintf("custom/%s/params/%s", queryRoute, paramType), nil) + if err != nil { + return err + } + + fmt.Println(string(res)) + return nil + }, + } + + return cmd +} + // GetCmdQueryProposal implements the query proposal command. func GetCmdQueryProposal(queryRoute string, cdc *codec.Codec) *cobra.Command { cmd := &cobra.Command{ diff --git a/x/gov/client/rest/rest.go b/x/gov/client/rest/rest.go index f477f2ff9a..930a39b025 100644 --- a/x/gov/client/rest/rest.go +++ b/x/gov/client/rest/rest.go @@ -18,7 +18,8 @@ import ( // REST Variable names // nolint const ( - RestProposalID = "proposalId" + RestParamsType = "type" + RestProposalID = "proposal-id" RestDepositer = "depositer" RestVoter = "voter" RestProposalStatus = "status" @@ -32,6 +33,11 @@ func RegisterRoutes(cliCtx context.CLIContext, r *mux.Router, cdc *codec.Codec) r.HandleFunc(fmt.Sprintf("/gov/proposals/{%s}/deposits", RestProposalID), depositHandlerFn(cdc, cliCtx)).Methods("POST") r.HandleFunc(fmt.Sprintf("/gov/proposals/{%s}/votes", RestProposalID), voteHandlerFn(cdc, cliCtx)).Methods("POST") + r.HandleFunc( + fmt.Sprintf("/gov/parameters/{%s}", RestParamsType), + queryParamsHandlerFn(cdc, cliCtx), + ).Methods("GET") + r.HandleFunc("/gov/proposals", queryProposalsWithParameterFn(cdc, cliCtx)).Methods("GET") r.HandleFunc(fmt.Sprintf("/gov/proposals/{%s}", RestProposalID), queryProposalHandlerFn(cdc, cliCtx)).Methods("GET") r.HandleFunc(fmt.Sprintf("/gov/proposals/{%s}/deposits", RestProposalID), queryDepositsHandlerFn(cdc, cliCtx)).Methods("GET") @@ -177,6 +183,21 @@ func voteHandlerFn(cdc *codec.Codec, cliCtx context.CLIContext) http.HandlerFunc } } +func queryParamsHandlerFn(cdc *codec.Codec, cliCtx context.CLIContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + vars := mux.Vars(r) + paramType := vars[RestParamsType] + + res, err := cliCtx.QueryWithData(fmt.Sprintf("custom/gov/%s/%s", gov.QueryParams, paramType), nil) + if err != nil { + utils.WriteErrorResponse(w, http.StatusNotFound, err.Error()) + return + } + + utils.PostProcessResponse(w, cdc, res, cliCtx.Indent) + } +} + func queryProposalHandlerFn(cdc *codec.Codec, cliCtx context.CLIContext) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) diff --git a/x/gov/keeper.go b/x/gov/keeper.go index 862db82744..4f370ef531 100644 --- a/x/gov/keeper.go +++ b/x/gov/keeper.go @@ -250,7 +250,7 @@ func (keeper Keeper) GetDepositParams(ctx sdk.Context) DepositParams { return depositParams } -// Returns the current Voting Procedure from the global param store +// Returns the current VotingParams from the global param store // nolint: errcheck func (keeper Keeper) GetVotingParams(ctx sdk.Context) VotingParams { var votingParams VotingParams @@ -258,7 +258,7 @@ func (keeper Keeper) GetVotingParams(ctx sdk.Context) VotingParams { return votingParams } -// Returns the current Tallying Procedure from the global param store +// Returns the current TallyParam from the global param store // nolint: errcheck func (keeper Keeper) GetTallyParams(ctx sdk.Context) TallyParams { var tallyParams TallyParams diff --git a/x/gov/params.go b/x/gov/params.go index 4d8126d141..b9e1efa878 100644 --- a/x/gov/params.go +++ b/x/gov/params.go @@ -6,20 +6,20 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" ) -// Procedure around Deposits for governance +// Param around Deposits for governance type DepositParams struct { MinDeposit sdk.Coins `json:"min_deposit"` // Minimum deposit for a proposal to enter voting period. MaxDepositPeriod time.Duration `json:"max_deposit_period"` // Maximum period for Atom holders to deposit on a proposal. Initial value: 2 months } -// Procedure around Tallying votes in governance +// Param around Tallying votes in governance type TallyParams struct { Threshold sdk.Dec `json:"threshold"` // Minimum propotion of Yes votes for proposal to pass. Initial value: 0.5 Veto sdk.Dec `json:"veto"` // Minimum value of Veto votes to Total votes ratio for proposal to be vetoed. Initial value: 1/3 GovernancePenalty sdk.Dec `json:"governance_penalty"` // Penalty if validator does not vote } -// Procedure around Voting in governance +// Param around Voting in governance type VotingParams struct { VotingPeriod time.Duration `json:"voting_period"` // Length of the voting period. } diff --git a/x/gov/queryable.go b/x/gov/querier.go similarity index 86% rename from x/gov/queryable.go rename to x/gov/querier.go index 3e70d43aa0..171ab469d5 100644 --- a/x/gov/queryable.go +++ b/x/gov/querier.go @@ -1,6 +1,8 @@ package gov import ( + "fmt" + "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" abci "github.com/tendermint/tendermint/abci/types" @@ -8,6 +10,7 @@ import ( // query endpoints supported by the governance Querier const ( + QueryParams = "params" QueryProposals = "proposals" QueryProposal = "proposal" QueryDeposits = "deposits" @@ -15,11 +18,17 @@ const ( QueryVotes = "votes" QueryVote = "vote" QueryTally = "tally" + + ParamDeposit = "deposit" + ParamVoting = "voting" + ParamTallying = "tallying" ) func NewQuerier(keeper Keeper) sdk.Querier { return func(ctx sdk.Context, path []string, req abci.RequestQuery) (res []byte, err sdk.Error) { switch path[0] { + case QueryParams: + return queryParams(ctx, path[1:], req, keeper) case QueryProposals: return queryProposals(ctx, path[1:], req, keeper) case QueryProposal: @@ -40,6 +49,31 @@ func NewQuerier(keeper Keeper) sdk.Querier { } } +func queryParams(ctx sdk.Context, path []string, req abci.RequestQuery, keeper Keeper) (res []byte, err sdk.Error) { + switch path[0] { + case ParamDeposit: + bz, err2 := codec.MarshalJSONIndent(keeper.cdc, keeper.GetDepositParams(ctx)) + if err2 != nil { + return nil, sdk.ErrInternal(sdk.AppendMsgToErr("could not marshal result to JSON", err2.Error())) + } + return bz, nil + case ParamVoting: + bz, err2 := codec.MarshalJSONIndent(keeper.cdc, keeper.GetVotingParams(ctx)) + if err2 != nil { + return nil, sdk.ErrInternal(sdk.AppendMsgToErr("could not marshal result to JSON", err2.Error())) + } + return bz, nil + case ParamTallying: + bz, err2 := codec.MarshalJSONIndent(keeper.cdc, keeper.GetTallyParams(ctx)) + if err2 != nil { + return nil, sdk.ErrInternal(sdk.AppendMsgToErr("could not marshal result to JSON", err2.Error())) + } + return bz, nil + default: + return res, sdk.ErrUnknownRequest(fmt.Sprintf("%s is not a valid query request path", req.Path)) + } +} + // Params for query 'custom/gov/proposal' type QueryProposalParams struct { ProposalID uint64 diff --git a/x/gov/querier_test.go b/x/gov/querier_test.go new file mode 100644 index 0000000000..eee58d2ac1 --- /dev/null +++ b/x/gov/querier_test.go @@ -0,0 +1,306 @@ +package gov + +import ( + "strings" + "testing" + + "github.com/cosmos/cosmos-sdk/codec" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/stretchr/testify/require" + abci "github.com/tendermint/tendermint/abci/types" +) + +func getQueriedParams(t *testing.T, ctx sdk.Context, cdc *codec.Codec, querier sdk.Querier) (DepositParams, VotingParams, TallyParams) { + query := abci.RequestQuery{ + Path: strings.Join([]string{"custom", "gov", QueryParams, ParamDeposit}, "/"), + Data: []byte{}, + } + + bz, err := querier(ctx, []string{QueryParams, ParamDeposit}, query) + require.Nil(t, err) + require.NotNil(t, bz) + + var depositParams DepositParams + err2 := cdc.UnmarshalJSON(bz, &depositParams) + require.Nil(t, err2) + + query = abci.RequestQuery{ + Path: strings.Join([]string{"custom", "gov", QueryParams, ParamVoting}, "/"), + Data: []byte{}, + } + + bz, err = querier(ctx, []string{QueryParams, ParamVoting}, query) + require.Nil(t, err) + require.NotNil(t, bz) + + var votingParams VotingParams + err2 = cdc.UnmarshalJSON(bz, &votingParams) + require.Nil(t, err2) + + query = abci.RequestQuery{ + Path: strings.Join([]string{"custom", "gov", QueryParams, ParamTallying}, "/"), + Data: []byte{}, + } + + bz, err = querier(ctx, []string{QueryParams, ParamTallying}, query) + require.Nil(t, err) + require.NotNil(t, bz) + + var tallyParams TallyParams + err2 = cdc.UnmarshalJSON(bz, &tallyParams) + require.Nil(t, err2) + + return depositParams, votingParams, tallyParams +} + +func getQueriedProposal(t *testing.T, ctx sdk.Context, cdc *codec.Codec, querier sdk.Querier, proposalID uint64) Proposal { + query := abci.RequestQuery{ + Path: strings.Join([]string{"custom", "gov", QueryProposal}, "/"), + Data: cdc.MustMarshalJSON(QueryProposalParams{ + ProposalID: proposalID, + }), + } + + bz, err := querier(ctx, []string{QueryProposal}, query) + require.Nil(t, err) + require.NotNil(t, bz) + + var proposal Proposal + err2 := cdc.UnmarshalJSON(bz, proposal) + require.Nil(t, err2) + return proposal +} + +func getQueriedProposals(t *testing.T, ctx sdk.Context, cdc *codec.Codec, querier sdk.Querier, depositer, voter sdk.AccAddress, status ProposalStatus, limit uint64) []Proposal { + query := abci.RequestQuery{ + Path: strings.Join([]string{"custom", "gov", QueryProposals}, "/"), + Data: cdc.MustMarshalJSON(QueryProposalsParams{ + Voter: voter, + Depositer: depositer, + ProposalStatus: status, + Limit: limit, + }), + } + + bz, err := querier(ctx, []string{QueryProposal}, query) + require.Nil(t, err) + require.NotNil(t, bz) + + var proposals []Proposal + err2 := cdc.UnmarshalJSON(bz, proposals) + require.Nil(t, err2) + return proposals +} + +func getQueriedDeposit(t *testing.T, ctx sdk.Context, cdc *codec.Codec, querier sdk.Querier, proposalID uint64, depositer sdk.AccAddress) Deposit { + query := abci.RequestQuery{ + Path: strings.Join([]string{"custom", "gov", QueryDeposit}, "/"), + Data: cdc.MustMarshalJSON(QueryDepositParams{ + ProposalID: proposalID, + Depositer: depositer, + }), + } + + bz, err := querier(ctx, []string{QueryDeposits}, query) + require.Nil(t, err) + require.NotNil(t, bz) + + var deposit Deposit + err2 := cdc.UnmarshalJSON(bz, deposit) + require.Nil(t, err2) + return deposit +} + +func getQueriedDeposits(t *testing.T, ctx sdk.Context, cdc *codec.Codec, querier sdk.Querier, proposalID uint64) []Deposit { + query := abci.RequestQuery{ + Path: strings.Join([]string{"custom", "gov", QueryDeposits}, "/"), + Data: cdc.MustMarshalJSON(QueryDepositsParams{ + ProposalID: proposalID, + }), + } + + bz, err := querier(ctx, []string{QueryDeposits}, query) + require.Nil(t, err) + require.NotNil(t, bz) + + var deposits []Deposit + err2 := cdc.UnmarshalJSON(bz, &deposits) + require.Nil(t, err2) + return deposits +} + +func getQueriedVote(t *testing.T, ctx sdk.Context, cdc *codec.Codec, querier sdk.Querier, proposalID uint64, voter sdk.AccAddress) Vote { + query := abci.RequestQuery{ + Path: strings.Join([]string{"custom", "gov", QueryVote}, "/"), + Data: cdc.MustMarshalJSON(QueryVoteParams{ + ProposalID: proposalID, + Voter: voter, + }), + } + + bz, err := querier(ctx, []string{QueryVote}, query) + require.Nil(t, err) + require.NotNil(t, bz) + + var vote Vote + err2 := cdc.UnmarshalJSON(bz, &vote) + require.Nil(t, err2) + return vote +} + +func getQueriedVotes(t *testing.T, ctx sdk.Context, cdc *codec.Codec, querier sdk.Querier, proposalID uint64) []Vote { + query := abci.RequestQuery{ + Path: strings.Join([]string{"custom", "gov", QueryVote}, "/"), + Data: cdc.MustMarshalJSON(QueryVotesParams{ + ProposalID: proposalID, + }), + } + + bz, err := querier(ctx, []string{QueryVotes}, query) + require.Nil(t, err) + require.NotNil(t, bz) + + var votes []Vote + err2 := cdc.UnmarshalJSON(bz, &votes) + require.Nil(t, err2) + return votes +} + +func getQueriedTally(t *testing.T, ctx sdk.Context, cdc *codec.Codec, querier sdk.Querier, proposalID uint64) TallyResult { + query := abci.RequestQuery{ + Path: strings.Join([]string{"custom", "gov", QueryTally}, "/"), + Data: cdc.MustMarshalJSON(QueryTallyParams{ + ProposalID: proposalID, + }), + } + + bz, err := querier(ctx, []string{QueryTally}, query) + require.Nil(t, err) + require.NotNil(t, bz) + + var tally TallyResult + err2 := cdc.UnmarshalJSON(bz, &tally) + require.Nil(t, err2) + return tally +} + +func testQueryParams(t *testing.T) { + cdc := codec.New() + mapp, keeper, _, _, _, _ := getMockApp(t, 1000) + querier := NewQuerier(keeper) + ctx := mapp.NewContext(false, abci.Header{}) + + getQueriedParams(t, ctx, cdc, querier) +} + +func testQueries(t *testing.T) { + cdc := codec.New() + mapp, keeper, _, addrs, _, _ := getMockApp(t, 1000) + querier := NewQuerier(keeper) + handler := NewHandler(keeper) + ctx := mapp.NewContext(false, abci.Header{}) + + depositParams, _, _ := getQueriedParams(t, ctx, cdc, querier) + + // addrs[0] proposes (and deposits) proposals #1 and #2 + res := handler(ctx, NewMsgSubmitProposal("title", "description", ProposalTypeText, addrs[0], sdk.Coins{sdk.NewInt64Coin("dummycoin", 1)})) + var proposalID1 uint64 + cdc.MustUnmarshalBinaryLengthPrefixed(res.Data, &proposalID1) + + res = handler(ctx, NewMsgSubmitProposal("title", "description", ProposalTypeText, addrs[0], sdk.Coins{sdk.NewInt64Coin("dummycoin", 1)})) + var proposalID2 uint64 + cdc.MustUnmarshalBinaryLengthPrefixed(res.Data, &proposalID2) + + // addrs[1] proposes (and deposits) proposals #3 + res = handler(ctx, NewMsgSubmitProposal("title", "description", ProposalTypeText, addrs[1], sdk.Coins{sdk.NewInt64Coin("dummycoin", 1)})) + var proposalID3 uint64 + cdc.MustUnmarshalBinaryLengthPrefixed(res.Data, &proposalID3) + + // addrs[1] deposits on proposals #2 & #3 + res = handler(ctx, NewMsgDeposit(addrs[1], proposalID2, depositParams.MinDeposit)) + res = handler(ctx, NewMsgDeposit(addrs[1], proposalID3, depositParams.MinDeposit)) + + // check deposits on proposal1 match individual deposits + deposits := getQueriedDeposits(t, ctx, cdc, querier, proposalID1) + require.Len(t, deposits, 1) + deposit := getQueriedDeposit(t, ctx, cdc, querier, proposalID1, addrs[0]) + require.Equal(t, deposit, deposits[0]) + + // check deposits on proposal2 match individual deposits + deposits = getQueriedDeposits(t, ctx, cdc, querier, proposalID2) + require.Len(t, deposits, 2) + deposit = getQueriedDeposit(t, ctx, cdc, querier, proposalID2, addrs[0]) + require.True(t, deposit.Equals(deposits[0])) + deposit = getQueriedDeposit(t, ctx, cdc, querier, proposalID2, addrs[1]) + require.True(t, deposit.Equals(deposits[1])) + + // check deposits on proposal3 match individual deposits + deposits = getQueriedDeposits(t, ctx, cdc, querier, proposalID3) + require.Len(t, deposits, 1) + deposit = getQueriedDeposit(t, ctx, cdc, querier, proposalID3, addrs[1]) + require.Equal(t, deposit, deposits[0]) + + // Only proposal #1 should be in Deposit Period + proposals := getQueriedProposals(t, ctx, cdc, querier, nil, nil, StatusDepositPeriod, 0) + require.Len(t, proposals, 1) + require.Equal(t, proposalID1, proposals[0].GetProposalID()) + // Only proposals #2 and #3 should be in Voting Period + proposals = getQueriedProposals(t, ctx, cdc, querier, nil, nil, StatusVotingPeriod, 0) + require.Len(t, proposals, 2) + require.Equal(t, proposalID2, proposals[0].GetProposalID()) + require.Equal(t, proposalID3, proposals[1].GetProposalID()) + + // Addrs[0] votes on proposals #2 & #3 + handler(ctx, NewMsgVote(addrs[0], proposalID2, OptionYes)) + handler(ctx, NewMsgVote(addrs[0], proposalID3, OptionYes)) + + // Addrs[1] votes on proposal #3 + handler(ctx, NewMsgVote(addrs[1], proposalID3, OptionYes)) + + // Test query voted by addrs[0] + proposals = getQueriedProposals(t, ctx, cdc, querier, nil, addrs[0], StatusNil, 0) + require.Equal(t, proposalID2, (proposals[0]).GetProposalID()) + require.Equal(t, proposalID3, (proposals[1]).GetProposalID()) + + // Test query votes on Proposal 2 + votes := getQueriedVotes(t, ctx, cdc, querier, proposalID2) + require.Len(t, votes, 1) + require.Equal(t, addrs[0], votes[0].Voter) + vote := getQueriedVote(t, ctx, cdc, querier, proposalID2, addrs[0]) + require.Equal(t, vote, votes[0]) + + // Test query votes on Proposal 3 + votes = getQueriedVotes(t, ctx, cdc, querier, proposalID3) + require.Len(t, votes, 2) + require.True(t, addrs[0].String() == votes[0].Voter.String()) + require.True(t, addrs[1].String() == votes[0].Voter.String()) + + // Test proposals queries with filters + + // Test query all proposals + proposals = getQueriedProposals(t, ctx, cdc, querier, nil, nil, StatusNil, 0) + require.Equal(t, proposalID1, (proposals[0]).GetProposalID()) + require.Equal(t, proposalID2, (proposals[1]).GetProposalID()) + require.Equal(t, proposalID3, (proposals[2]).GetProposalID()) + + // Test query voted by addrs[1] + proposals = getQueriedProposals(t, ctx, cdc, querier, nil, addrs[1], StatusNil, 0) + require.Equal(t, proposalID3, (proposals[0]).GetProposalID()) + + // Test query deposited by addrs[0] + proposals = getQueriedProposals(t, ctx, cdc, querier, addrs[0], nil, StatusNil, 0) + require.Equal(t, proposalID1, (proposals[0]).GetProposalID()) + + // Test query deposited by addr2 + proposals = getQueriedProposals(t, ctx, cdc, querier, addrs[1], nil, StatusNil, 0) + require.Equal(t, proposalID2, (proposals[0]).GetProposalID()) + require.Equal(t, proposalID3, (proposals[1]).GetProposalID()) + + // Test query voted AND deposited by addr1 + proposals = getQueriedProposals(t, ctx, cdc, querier, addrs[0], addrs[0], StatusNil, 0) + require.Equal(t, proposalID2, (proposals[0]).GetProposalID()) + + // Test Tally Query + tally := getQueriedTally(t, ctx, cdc, querier, proposalID2) + require.True(t, !tally.Equals(EmptyTallyResult())) +} diff --git a/x/gov/test_common.go b/x/gov/test_common.go index 4e0ffd51af..a0bc80fc2e 100644 --- a/x/gov/test_common.go +++ b/x/gov/test_common.go @@ -39,6 +39,7 @@ func getMockApp(t *testing.T, numGenAccs int) (*mock.App, Keeper, stake.Keeper, keeper := NewKeeper(mapp.Cdc, keyGov, pk, pk.Subspace("testgov"), ck, sk, DefaultCodespace) mapp.Router().AddRoute("gov", NewHandler(keeper)) + mapp.QueryRouter().AddRoute("gov", NewQuerier(keeper)) mapp.SetEndBlocker(getEndBlocker(keeper)) mapp.SetInitChainer(getInitChainer(mapp, keeper, sk)) diff --git a/x/mock/app.go b/x/mock/app.go index 627434a513..0b7b0ae16b 100644 --- a/x/mock/app.go +++ b/x/mock/app.go @@ -1,9 +1,11 @@ package mock import ( + "bytes" "fmt" "math/rand" "os" + "sort" bam "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/codec" @@ -109,23 +111,64 @@ func (app *App) InitChainer(ctx sdk.Context, _ abci.RequestInitChain) abci.Respo return abci.ResponseInitChain{} } +// Type that combines an Address with the privKey and pubKey to that address +type AddrKeys struct { + Address sdk.AccAddress + PubKey crypto.PubKey + PrivKey crypto.PrivKey +} + +// implement `Interface` in sort package. +type AddrKeysSlice []AddrKeys + +func (b AddrKeysSlice) Len() int { + return len(b) +} + +// Sorts lexographically by Address +func (b AddrKeysSlice) Less(i, j int) bool { + // bytes package already implements Comparable for []byte. + switch bytes.Compare(b[i].Address.Bytes(), b[j].Address.Bytes()) { + case -1: + return true + case 0, 1: + return false + default: + panic("not fail-able with `bytes.Comparable` bounded [-1, 1].") + } +} + +func (b AddrKeysSlice) Swap(i, j int) { + b[j], b[i] = b[i], b[j] +} + // CreateGenAccounts generates genesis accounts loaded with coins, and returns // their addresses, pubkeys, and privkeys. func CreateGenAccounts(numAccs int, genCoins sdk.Coins) (genAccs []auth.Account, addrs []sdk.AccAddress, pubKeys []crypto.PubKey, privKeys []crypto.PrivKey) { + addrKeysSlice := AddrKeysSlice{} + for i := 0; i < numAccs; i++ { privKey := ed25519.GenPrivKey() pubKey := privKey.PubKey() addr := sdk.AccAddress(pubKey.Address()) - genAcc := &auth.BaseAccount{ + addrKeysSlice = append(addrKeysSlice, AddrKeys{ Address: addr, - Coins: genCoins, - } + PubKey: pubKey, + PrivKey: privKey, + }) + } - genAccs = append(genAccs, genAcc) - privKeys = append(privKeys, privKey) - pubKeys = append(pubKeys, pubKey) - addrs = append(addrs, addr) + sort.Sort(addrKeysSlice) + + for i := range addrKeysSlice { + addrs = append(addrs, addrKeysSlice[i].Address) + pubKeys = append(pubKeys, addrKeysSlice[i].PubKey) + privKeys = append(privKeys, addrKeysSlice[i].PrivKey) + genAccs = append(genAccs, &auth.BaseAccount{ + Address: addrKeysSlice[i].Address, + Coins: genCoins, + }) } return