From 52325f884baecffec15062eb74112b8da3c749dd Mon Sep 17 00:00:00 2001 From: Sunny Aggarwal Date: Mon, 22 Oct 2018 17:09:08 -0700 Subject: [PATCH 01/13] 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 bacc8d6aecc4..4f9eb2bc70cb 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 973e2376ff9c..2fac1a27a1f0 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 da690ce2196ae9667d2e495f339de1ddcd59f28b Mon Sep 17 00:00:00 2001 From: Sunny Aggarwal Date: Mon, 22 Oct 2018 17:33:36 -0700 Subject: [PATCH 02/13] LCD route --- client/lcd/lcd_test.go | 7 +++++++ x/stake/client/rest/query.go | 11 +++++++++++ x/stake/client/rest/utils.go | 36 ++++++++++++++++++++++++++++++++++++ x/stake/stake.go | 23 +++++++++++++++++++++++ 4 files changed, 77 insertions(+) diff --git a/client/lcd/lcd_test.go b/client/lcd/lcd_test.go index 92167346d2c1..287b9d240a48 100644 --- a/client/lcd/lcd_test.go +++ b/client/lcd/lcd_test.go @@ -576,10 +576,17 @@ func TestBonding(t *testing.T) { require.Equal(t, uint32(0), resultTx.CheckTx.Code) require.Equal(t, uint32(0), resultTx.DeliverTx.Code) +<<<<<<< HEAD // query delegations, unbondings and redelegations from validator and delegator delegatorDels = getDelegatorDelegations(t, port, addr) require.Len(t, delegatorDels, 1) require.Equal(t, "30.0000000000", delegatorDels[0].GetShares().String()) +======= + redelegation := getRedelegation(t, port, addr, operAddrs[0], operAddrs[1]) + require.Equal(t, "30", redelegation.Balance.Amount.String()) + + summary = getDelegationSummary(t, port, addr) +>>>>>>> LCD route delegatorUbds := getDelegatorUnbondingDelegations(t, port, addr) require.Len(t, delegatorUbds, 1) diff --git a/x/stake/client/rest/query.go b/x/stake/client/rest/query.go index 935c0229f67d..370ad2d0463d 100644 --- a/x/stake/client/rest/query.go +++ b/x/stake/client/rest/query.go @@ -66,6 +66,12 @@ func registerQueryRoutes(cliCtx context.CLIContext, r *mux.Router, cdc *codec.Co unbondingDelegationHandlerFn(cliCtx, cdc), ).Methods("GET") + // Query all redelegations of delegator between 2 validators + r.HandleFunc( + "/stake/delegators/{delegatorAddr}/redelegations/validator_from/{validatorSrcAddr}/validator_to/{validatorDstAddr}", + redelegationHandlerFn(cliCtx, cdc), + ).Methods("GET") + // Get all validators r.HandleFunc( "/stake/validators", @@ -195,6 +201,11 @@ func unbondingDelegationHandlerFn(cliCtx context.CLIContext, cdc *codec.Codec) h return queryBonds(cliCtx, cdc, "custom/stake/unbondingDelegation") } +// HTTP request handler to query an unbonding-delegation +func redelegationHandlerFn(cliCtx context.CLIContext, cdc *codec.Codec) http.HandlerFunc { + return queryRedelegations(cliCtx, cdc, "custom/stake/redelegation") +} + // HTTP request handler to query a delegation func delegationHandlerFn(cliCtx context.CLIContext, cdc *codec.Codec) http.HandlerFunc { return queryBonds(cliCtx, cdc, "custom/stake/delegation") diff --git a/x/stake/client/rest/utils.go b/x/stake/client/rest/utils.go index bb986c31471b..2c8672501490 100644 --- a/x/stake/client/rest/utils.go +++ b/x/stake/client/rest/utils.go @@ -49,6 +49,42 @@ func queryTxs(node rpcclient.Client, cliCtx context.CLIContext, cdc *codec.Codec return tx.FormatTxResults(cdc, res.Txs) } +func queryRedelegations(cliCtx context.CLIContext, cdc *codec.Codec, endpoint string) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + vars := mux.Vars(r) + bech32delegator := vars["delegatorAddr"] + bech32srcValidator := vars["srcValidatorAddr"] + bech32dstValidator := vars["dstValidatorAddr"] + + delegatorAddr, err := sdk.AccAddressFromBech32(bech32delegator) + srcValidatorAddr, err := sdk.ValAddressFromBech32(bech32srcValidator) + dstValidatorAddr, err := sdk.ValAddressFromBech32(bech32dstValidator) + if err != nil { + utils.WriteErrorResponse(w, http.StatusBadRequest, err.Error()) + return + } + + params := stake.QueryRedelegationParams{ + DelegatorAddr: delegatorAddr, + SrcValidatorAddr: srcValidatorAddr, + DstValidatorAddr: dstValidatorAddr, + } + + bz, err := cdc.MarshalJSON(params) + if err != nil { + utils.WriteErrorResponse(w, http.StatusBadRequest, err.Error()) + return + } + + res, err := cliCtx.QueryWithData(endpoint, bz) + if err != nil { + utils.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) + return + } + utils.PostProcessResponse(w, cdc, res, cliCtx.Indent) + } +} + func queryBonds(cliCtx context.CLIContext, cdc *codec.Codec, endpoint string) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) diff --git a/x/stake/stake.go b/x/stake/stake.go index 87087e59c095..df6d551aa84f 100644 --- a/x/stake/stake.go +++ b/x/stake/stake.go @@ -9,6 +9,7 @@ import ( ) type ( +<<<<<<< HEAD Keeper = keeper.Keeper Validator = types.Validator Description = types.Description @@ -27,6 +28,28 @@ type ( QueryDelegatorParams = querier.QueryDelegatorParams QueryValidatorParams = querier.QueryValidatorParams QueryBondsParams = querier.QueryBondsParams +======= + Keeper = keeper.Keeper + Validator = types.Validator + Description = types.Description + Commission = types.Commission + Delegation = types.Delegation + DelegationSummary = types.DelegationSummary + UnbondingDelegation = types.UnbondingDelegation + Redelegation = types.Redelegation + Params = types.Params + Pool = types.Pool + MsgCreateValidator = types.MsgCreateValidator + MsgEditValidator = types.MsgEditValidator + MsgDelegate = types.MsgDelegate + MsgBeginUnbonding = types.MsgBeginUnbonding + MsgBeginRedelegate = types.MsgBeginRedelegate + GenesisState = types.GenesisState + QueryDelegatorParams = querier.QueryDelegatorParams + QueryValidatorParams = querier.QueryValidatorParams + QueryBondsParams = querier.QueryBondsParams + QueryRedelegationParams = querier.QueryRedelegationParams +>>>>>>> LCD route ) var ( From 75feb13a0af0b08fc31830ee16bf27608c06defd Mon Sep 17 00:00:00 2001 From: Sunny Aggarwal Date: Mon, 22 Oct 2018 17:44:52 -0700 Subject: [PATCH 03/13] PENDING --- PENDING.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/PENDING.md b/PENDING.md index 2e93ddea5c01..a805c07b6ab0 100644 --- a/PENDING.md +++ b/PENDING.md @@ -16,11 +16,14 @@ BREAKING CHANGES FEATURES * Gaia REST API (`gaiacli advanced rest-server`) + * [gaia-lite] [\#2182] Added LCD endpoint for querying redelegations * Gaia CLI (`gaiacli`) * Gaia + * [\#2182] [x/stake] Added querier for querying a single redelegation + * SDK * Tendermint From c4ff53b65c225440822d5a2729a1ffdc53f1785a Mon Sep 17 00:00:00 2001 From: Sunny Aggarwal Date: Tue, 23 Oct 2018 12:26:32 -0700 Subject: [PATCH 04/13] use query params --- client/lcd/lcd_test.go | 21 ++++++++---- x/stake/client/rest/query.go | 56 ++++++++++++++++++++++++++++--- x/stake/keeper/delegation_test.go | 4 +-- x/stake/keeper/query_utils.go | 13 +++++-- x/stake/querier/queryable.go | 21 +++++++++--- x/stake/querier/queryable_test.go | 6 ++-- 6 files changed, 98 insertions(+), 23 deletions(-) diff --git a/client/lcd/lcd_test.go b/client/lcd/lcd_test.go index 287b9d240a48..54b44aa29eb5 100644 --- a/client/lcd/lcd_test.go +++ b/client/lcd/lcd_test.go @@ -576,17 +576,14 @@ func TestBonding(t *testing.T) { require.Equal(t, uint32(0), resultTx.CheckTx.Code) require.Equal(t, uint32(0), resultTx.DeliverTx.Code) -<<<<<<< HEAD // query delegations, unbondings and redelegations from validator and delegator delegatorDels = getDelegatorDelegations(t, port, addr) require.Len(t, delegatorDels, 1) require.Equal(t, "30.0000000000", delegatorDels[0].GetShares().String()) -======= - redelegation := getRedelegation(t, port, addr, operAddrs[0], operAddrs[1]) - require.Equal(t, "30", redelegation.Balance.Amount.String()) - summary = getDelegationSummary(t, port, addr) ->>>>>>> LCD route + redelegation := getRedelegations(t, port, addr, operAddrs[0], operAddrs[1]) + require.Len(t, redelegation, 1) + require.Equal(t, "30", redelegation[0].Balance.Amount.String()) delegatorUbds := getDelegatorUnbondingDelegations(t, port, addr) require.Len(t, delegatorUbds, 1) @@ -1000,6 +997,7 @@ func getUndelegation(t *testing.T, port string, delegatorAddr sdk.AccAddress, va return unbond } +<<<<<<< HEAD func getDelegatorDelegations(t *testing.T, port string, delegatorAddr sdk.AccAddress) []stake.Delegation { res, body := Request(t, port, "GET", fmt.Sprintf("/stake/delegators/%s/delegations", delegatorAddr), nil) require.Equal(t, http.StatusOK, res.StatusCode, body) @@ -1010,6 +1008,17 @@ func getDelegatorDelegations(t *testing.T, port string, delegatorAddr sdk.AccAdd require.Nil(t, err) return dels +======= +func getRedelegations(t *testing.T, port string, delegatorAddr sdk.AccAddress, srcValidatorAddr sdk.ValAddress, dstValidatorAddr sdk.ValAddress) []stake.Redelegation { + res, body := Request(t, port, "GET", fmt.Sprintf("/stake/delegators/%s/redelegations?validator_from=%s&validator_to=%s", delegatorAddr, srcValidatorAddr, dstValidatorAddr), nil) + require.Equal(t, http.StatusOK, res.StatusCode, body) + + var redels []stake.Redelegation + err := cdc.UnmarshalJSON([]byte(body), &redels) + require.Nil(t, err) + + return redels +>>>>>>> use query params } func getDelegatorUnbondingDelegations(t *testing.T, port string, delegatorAddr sdk.AccAddress) []stake.UnbondingDelegation { diff --git a/x/stake/client/rest/query.go b/x/stake/client/rest/query.go index 370ad2d0463d..cd3664cd64e2 100644 --- a/x/stake/client/rest/query.go +++ b/x/stake/client/rest/query.go @@ -9,6 +9,7 @@ import ( "github.com/cosmos/cosmos-sdk/client/utils" "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/stake" "github.com/cosmos/cosmos-sdk/x/stake/tags" "github.com/gorilla/mux" @@ -66,9 +67,9 @@ func registerQueryRoutes(cliCtx context.CLIContext, r *mux.Router, cdc *codec.Co unbondingDelegationHandlerFn(cliCtx, cdc), ).Methods("GET") - // Query all redelegations of delegator between 2 validators + // Query all redelegations of delegator r.HandleFunc( - "/stake/delegators/{delegatorAddr}/redelegations/validator_from/{validatorSrcAddr}/validator_to/{validatorDstAddr}", + "/stake/delegators/{delegatorAddr}/redelegations", redelegationHandlerFn(cliCtx, cdc), ).Methods("GET") @@ -201,9 +202,56 @@ func unbondingDelegationHandlerFn(cliCtx context.CLIContext, cdc *codec.Codec) h return queryBonds(cliCtx, cdc, "custom/stake/unbondingDelegation") } -// HTTP request handler to query an unbonding-delegation +// HTTP request handler to query an redelegation func redelegationHandlerFn(cliCtx context.CLIContext, cdc *codec.Codec) http.HandlerFunc { - return queryRedelegations(cliCtx, cdc, "custom/stake/redelegation") + return func(w http.ResponseWriter, r *http.Request) { + vars := mux.Vars(r) + bech32delegator := vars["delegatorAddr"] + + delegatorAddr, err := sdk.AccAddressFromBech32(bech32delegator) + if err != nil { + utils.WriteErrorResponse(w, http.StatusBadRequest, err.Error()) + return + } + + params := stake.QueryRedelegationParams{ + DelegatorAddr: delegatorAddr, + } + + bechSrcVoterAddr := r.URL.Query().Get("validator_from") + bechDstVoterAddr := r.URL.Query().Get("validator_to") + + if len(bechSrcVoterAddr) != 0 { + srcValidatorAddr, err := sdk.ValAddressFromBech32(bechSrcVoterAddr) + if err != nil { + utils.WriteErrorResponse(w, http.StatusBadRequest, err.Error()) + return + } + params.SrcValidatorAddr = srcValidatorAddr + } + + if len(bechDstVoterAddr) != 0 { + dstValidatorAddr, err := sdk.ValAddressFromBech32(bechDstVoterAddr) + if err != nil { + utils.WriteErrorResponse(w, http.StatusBadRequest, err.Error()) + return + } + params.DstValidatorAddr = dstValidatorAddr + } + + bz, err := cdc.MarshalJSON(params) + if err != nil { + utils.WriteErrorResponse(w, http.StatusBadRequest, err.Error()) + return + } + + res, err := cliCtx.QueryWithData("custom/stake/redelegations", bz) + if err != nil { + utils.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) + return + } + utils.PostProcessResponse(w, cdc, res, cliCtx.Indent) + } } // HTTP request handler to query a delegation diff --git a/x/stake/keeper/delegation_test.go b/x/stake/keeper/delegation_test.go index fcf2f42067a1..5433e2d5def6 100644 --- a/x/stake/keeper/delegation_test.go +++ b/x/stake/keeper/delegation_test.go @@ -544,7 +544,7 @@ func TestRedelegation(t *testing.T) { require.Equal(t, 1, len(redelegations)) require.True(t, redelegations[0].Equal(resRed)) - redelegations = keeper.GetAllRedelegations(ctx, addrDels[0]) + redelegations = keeper.GetAllRedelegations(ctx, addrDels[0], nil, nil) require.Equal(t, 1, len(redelegations)) require.True(t, redelegations[0].Equal(resRed)) @@ -577,7 +577,7 @@ func TestRedelegation(t *testing.T) { redelegations = keeper.GetRedelegations(ctx, addrDels[0], 5) require.Equal(t, 0, len(redelegations)) - redelegations = keeper.GetAllRedelegations(ctx, addrDels[0]) + redelegations = keeper.GetAllRedelegations(ctx, addrDels[0], nil, nil) require.Equal(t, 0, len(redelegations)) } diff --git a/x/stake/keeper/query_utils.go b/x/stake/keeper/query_utils.go index c1575cd42121..7ad888fa202e 100644 --- a/x/stake/keeper/query_utils.go +++ b/x/stake/keeper/query_utils.go @@ -85,17 +85,24 @@ func (k Keeper) GetAllUnbondingDelegations(ctx sdk.Context, delegator sdk.AccAdd } // return all redelegations for a delegator -func (k Keeper) GetAllRedelegations(ctx sdk.Context, delegator sdk.AccAddress) (redelegations []types.Redelegation) { +func (k Keeper) GetAllRedelegations(ctx sdk.Context, delegator sdk.AccAddress, srcValAddress, dstValAddress sdk.ValAddress) (redelegations []types.Redelegation) { store := ctx.KVStore(k.storeKey) delegatorPrefixKey := GetREDsKey(delegator) iterator := sdk.KVStorePrefixIterator(store, delegatorPrefixKey) //smallest to largest defer iterator.Close() - i := 0 + srcValFilter := srcValAddress.Empty() || srcValAddress == nil + dstValFilter := dstValAddress.Empty() || dstValAddress == nil + for ; iterator.Valid(); iterator.Next() { redelegation := types.MustUnmarshalRED(k.cdc, iterator.Key(), iterator.Value()) + if !srcValFilter && !(srcValAddress.Equals(redelegation.ValidatorSrcAddr)) { + continue + } + if !dstValFilter && !(dstValAddress.Equals(redelegation.ValidatorDstAddr)) { + continue + } redelegations = append(redelegations, redelegation) - i++ } return redelegations } diff --git a/x/stake/querier/queryable.go b/x/stake/querier/queryable.go index 4f9eb2bc70cb..32e1d9c776a0 100644 --- a/x/stake/querier/queryable.go +++ b/x/stake/querier/queryable.go @@ -292,7 +292,7 @@ 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) { +func queryRedelegations(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) @@ -300,12 +300,23 @@ func queryRedelegation(ctx sdk.Context, cdc *codec.Codec, req abci.RequestQuery, 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) + if params.DelegatorAddr.Empty() { + return []byte{}, types.ErrBadRedelegationAddr(types.DefaultCodespace) + } + + var redels []types.Redelegation + + if !params.SrcValidatorAddr.Empty() && !params.DstValidatorAddr.Empty() { + redel, found := k.GetRedelegation(ctx, params.DelegatorAddr, params.SrcValidatorAddr, params.DstValidatorAddr) + if !found { + return []byte{}, types.ErrNoRedelegation(types.DefaultCodespace) + } + redels = []types.Redelegation{redel} + } else { + redels = k.GetAllRedelegations(ctx, params.DelegatorAddr, params.SrcValidatorAddr, params.DstValidatorAddr) } - res, errRes = codec.MarshalJSONIndent(cdc, redel) + res, errRes = codec.MarshalJSONIndent(cdc, redels) if errRes != nil { return nil, sdk.ErrInternal(sdk.AppendMsgToErr("could not marshal result to JSON", errRes.Error())) } diff --git a/x/stake/querier/queryable_test.go b/x/stake/querier/queryable_test.go index 2fac1a27a1f0..5f19bb16d601 100644 --- a/x/stake/querier/queryable_test.go +++ b/x/stake/querier/queryable_test.go @@ -360,14 +360,14 @@ func TestQueryDelegation(t *testing.T) { Data: bz, } - res, err = queryRedelegation(ctx, cdc, query, keeper) + res, err = queryRedelegations(ctx, cdc, query, keeper) require.Nil(t, err) - var redelRes types.Redelegation + var redelRes []types.Redelegation errRes = cdc.UnmarshalJSON(res, &redelRes) require.Nil(t, errRes) - require.Equal(t, redel, redelRes) + require.Equal(t, redel, redelRes[0]) } func TestQueryRedelegations(t *testing.T) { From 5b5f421b15eeef1dbb8b5f76ed9902e36f767b45 Mon Sep 17 00:00:00 2001 From: Sunny Aggarwal Date: Tue, 23 Oct 2018 13:05:52 -0700 Subject: [PATCH 05/13] rebased and fixed bugs --- client/lcd/lcd_test.go | 39 ++++++++++++++++++------------------ x/stake/querier/queryable.go | 4 ++-- x/stake/stake.go | 22 -------------------- 3 files changed, 21 insertions(+), 44 deletions(-) diff --git a/client/lcd/lcd_test.go b/client/lcd/lcd_test.go index 54b44aa29eb5..9bff4bed6d70 100644 --- a/client/lcd/lcd_test.go +++ b/client/lcd/lcd_test.go @@ -581,7 +581,7 @@ func TestBonding(t *testing.T) { require.Len(t, delegatorDels, 1) require.Equal(t, "30.0000000000", delegatorDels[0].GetShares().String()) - redelegation := getRedelegations(t, port, addr, operAddrs[0], operAddrs[1]) + redelegation := getDelegatorRedelegations(t, port, addr, operAddrs[0], operAddrs[1]) require.Len(t, redelegation, 1) require.Equal(t, "30", redelegation[0].Balance.Amount.String()) @@ -589,7 +589,7 @@ func TestBonding(t *testing.T) { require.Len(t, delegatorUbds, 1) require.Equal(t, "30", delegatorUbds[0].Balance.Amount.String()) - delegatorReds := getDelegatorRedelegations(t, port, addr) + delegatorReds := getDelegatorRedelegations(t, port, addr, nil, nil) require.Len(t, delegatorReds, 1) require.Equal(t, "30", delegatorReds[0].Balance.Amount.String()) @@ -997,7 +997,6 @@ func getUndelegation(t *testing.T, port string, delegatorAddr sdk.AccAddress, va return unbond } -<<<<<<< HEAD func getDelegatorDelegations(t *testing.T, port string, delegatorAddr sdk.AccAddress) []stake.Delegation { res, body := Request(t, port, "GET", fmt.Sprintf("/stake/delegators/%s/delegations", delegatorAddr), nil) require.Equal(t, http.StatusOK, res.StatusCode, body) @@ -1008,17 +1007,6 @@ func getDelegatorDelegations(t *testing.T, port string, delegatorAddr sdk.AccAdd require.Nil(t, err) return dels -======= -func getRedelegations(t *testing.T, port string, delegatorAddr sdk.AccAddress, srcValidatorAddr sdk.ValAddress, dstValidatorAddr sdk.ValAddress) []stake.Redelegation { - res, body := Request(t, port, "GET", fmt.Sprintf("/stake/delegators/%s/redelegations?validator_from=%s&validator_to=%s", delegatorAddr, srcValidatorAddr, dstValidatorAddr), nil) - require.Equal(t, http.StatusOK, res.StatusCode, body) - - var redels []stake.Redelegation - err := cdc.UnmarshalJSON([]byte(body), &redels) - require.Nil(t, err) - - return redels ->>>>>>> use query params } func getDelegatorUnbondingDelegations(t *testing.T, port string, delegatorAddr sdk.AccAddress) []stake.UnbondingDelegation { @@ -1033,16 +1021,27 @@ func getDelegatorUnbondingDelegations(t *testing.T, port string, delegatorAddr s return ubds } -func getDelegatorRedelegations(t *testing.T, port string, delegatorAddr sdk.AccAddress) []stake.Redelegation { - res, body := Request(t, port, "GET", fmt.Sprintf("/stake/delegators/%s/redelegations", delegatorAddr), nil) - require.Equal(t, http.StatusOK, res.StatusCode, body) +func getDelegatorRedelegations(t *testing.T, port string, delegatorAddr sdk.AccAddress, srcValidatorAddr sdk.ValAddress, dstValidatorAddr sdk.ValAddress) []stake.Redelegation { + var res *http.Response + var body string - var reds []stake.Redelegation + if srcValidatorAddr.Empty() && dstValidatorAddr.Empty() { + res, body = Request(t, port, "GET", fmt.Sprintf("/stake/delegators/%s/redelegations", delegatorAddr), nil) + } else if !srcValidatorAddr.Empty() && dstValidatorAddr.Empty() { + res, body = Request(t, port, "GET", fmt.Sprintf("/stake/delegators/%s/redelegations?validator_from=%s", delegatorAddr, srcValidatorAddr), nil) + } else if srcValidatorAddr.Empty() && !dstValidatorAddr.Empty() { + res, body = Request(t, port, "GET", fmt.Sprintf("/stake/delegators/%s/redelegations?validator_to=%s", delegatorAddr, dstValidatorAddr), nil) + } else { + res, body = Request(t, port, "GET", fmt.Sprintf("/stake/delegators/%s/redelegations?validator_from=%s&validator_to=%s", delegatorAddr, srcValidatorAddr, dstValidatorAddr), nil) + } - err := cdc.UnmarshalJSON([]byte(body), &reds) + require.Equal(t, http.StatusOK, res.StatusCode, body) + + var redels []stake.Redelegation + err := cdc.UnmarshalJSON([]byte(body), &redels) require.Nil(t, err) - return reds + return redels } func getBondingTxs(t *testing.T, port string, delegatorAddr sdk.AccAddress, query string) []tx.Info { diff --git a/x/stake/querier/queryable.go b/x/stake/querier/queryable.go index 32e1d9c776a0..a503ecb9b300 100644 --- a/x/stake/querier/queryable.go +++ b/x/stake/querier/queryable.go @@ -197,14 +197,14 @@ func queryDelegatorUnbondingDelegations(ctx sdk.Context, cdc *codec.Codec, req a } func queryDelegatorRedelegations(ctx sdk.Context, cdc *codec.Codec, req abci.RequestQuery, k keep.Keeper) (res []byte, err sdk.Error) { - var params QueryDelegatorParams + var params QueryRedelegationParams errRes := cdc.UnmarshalJSON(req.Data, ¶ms) if errRes != nil { return []byte{}, sdk.ErrUnknownAddress("") } - redelegations := k.GetAllRedelegations(ctx, params.DelegatorAddr) + redelegations := k.GetAllRedelegations(ctx, params.DelegatorAddr, params.SrcValidatorAddr, params.DstValidatorAddr) res, errRes = codec.MarshalJSONIndent(cdc, redelegations) if errRes != nil { diff --git a/x/stake/stake.go b/x/stake/stake.go index df6d551aa84f..65571ccb5b1f 100644 --- a/x/stake/stake.go +++ b/x/stake/stake.go @@ -9,32 +9,11 @@ import ( ) type ( -<<<<<<< HEAD - Keeper = keeper.Keeper - Validator = types.Validator - Description = types.Description - Commission = types.Commission - Delegation = types.Delegation - UnbondingDelegation = types.UnbondingDelegation - Redelegation = types.Redelegation - Params = types.Params - Pool = types.Pool - MsgCreateValidator = types.MsgCreateValidator - MsgEditValidator = types.MsgEditValidator - MsgDelegate = types.MsgDelegate - MsgBeginUnbonding = types.MsgBeginUnbonding - MsgBeginRedelegate = types.MsgBeginRedelegate - GenesisState = types.GenesisState - QueryDelegatorParams = querier.QueryDelegatorParams - QueryValidatorParams = querier.QueryValidatorParams - QueryBondsParams = querier.QueryBondsParams -======= Keeper = keeper.Keeper Validator = types.Validator Description = types.Description Commission = types.Commission Delegation = types.Delegation - DelegationSummary = types.DelegationSummary UnbondingDelegation = types.UnbondingDelegation Redelegation = types.Redelegation Params = types.Params @@ -49,7 +28,6 @@ type ( QueryValidatorParams = querier.QueryValidatorParams QueryBondsParams = querier.QueryBondsParams QueryRedelegationParams = querier.QueryRedelegationParams ->>>>>>> LCD route ) var ( From bfe6994158d23c03622cfc8f99530f8fa906e2e8 Mon Sep 17 00:00:00 2001 From: Sunny Aggarwal Date: Tue, 23 Oct 2018 15:39:13 -0700 Subject: [PATCH 06/13] single endpoint --- client/lcd/lcd_test.go | 39 ++++++++------------ x/stake/client/rest/query.go | 61 +++++++++++-------------------- x/stake/querier/queryable.go | 52 +++----------------------- x/stake/querier/queryable_test.go | 29 ++++++++------- x/stake/stake.go | 3 +- 5 files changed, 60 insertions(+), 124 deletions(-) diff --git a/client/lcd/lcd_test.go b/client/lcd/lcd_test.go index 9bff4bed6d70..6f14ecd29d27 100644 --- a/client/lcd/lcd_test.go +++ b/client/lcd/lcd_test.go @@ -581,7 +581,7 @@ func TestBonding(t *testing.T) { require.Len(t, delegatorDels, 1) require.Equal(t, "30.0000000000", delegatorDels[0].GetShares().String()) - redelegation := getDelegatorRedelegations(t, port, addr, operAddrs[0], operAddrs[1]) + redelegation := getRedelegations(t, port, addr, operAddrs[0], operAddrs[1]) require.Len(t, redelegation, 1) require.Equal(t, "30", redelegation[0].Balance.Amount.String()) @@ -589,7 +589,7 @@ func TestBonding(t *testing.T) { require.Len(t, delegatorUbds, 1) require.Equal(t, "30", delegatorUbds[0].Balance.Amount.String()) - delegatorReds := getDelegatorRedelegations(t, port, addr, nil, nil) + delegatorReds := getRedelegations(t, port, addr, nil, nil) require.Len(t, delegatorReds, 1) require.Equal(t, "30", delegatorReds[0].Balance.Amount.String()) @@ -597,7 +597,7 @@ func TestBonding(t *testing.T) { require.Len(t, validatorUbds, 1) require.Equal(t, "30", validatorUbds[0].Balance.Amount.String()) - validatorReds := getValidatorRedelegations(t, port, operAddrs[0]) + validatorReds := getRedelegations(t, port, nil, operAddrs[0], nil) require.Len(t, validatorReds, 1) require.Equal(t, "30", validatorReds[0].Balance.Amount.String()) @@ -1021,19 +1021,23 @@ func getDelegatorUnbondingDelegations(t *testing.T, port string, delegatorAddr s return ubds } -func getDelegatorRedelegations(t *testing.T, port string, delegatorAddr sdk.AccAddress, srcValidatorAddr sdk.ValAddress, dstValidatorAddr sdk.ValAddress) []stake.Redelegation { +func getRedelegations(t *testing.T, port string, delegatorAddr sdk.AccAddress, srcValidatorAddr sdk.ValAddress, dstValidatorAddr sdk.ValAddress) []stake.Redelegation { var res *http.Response var body string - if srcValidatorAddr.Empty() && dstValidatorAddr.Empty() { - res, body = Request(t, port, "GET", fmt.Sprintf("/stake/delegators/%s/redelegations", delegatorAddr), nil) - } else if !srcValidatorAddr.Empty() && dstValidatorAddr.Empty() { - res, body = Request(t, port, "GET", fmt.Sprintf("/stake/delegators/%s/redelegations?validator_from=%s", delegatorAddr, srcValidatorAddr), nil) - } else if srcValidatorAddr.Empty() && !dstValidatorAddr.Empty() { - res, body = Request(t, port, "GET", fmt.Sprintf("/stake/delegators/%s/redelegations?validator_to=%s", delegatorAddr, dstValidatorAddr), nil) - } else { - res, body = Request(t, port, "GET", fmt.Sprintf("/stake/delegators/%s/redelegations?validator_from=%s&validator_to=%s", delegatorAddr, srcValidatorAddr, dstValidatorAddr), nil) + endpoint := "/stake/redelegations?" + + if !delegatorAddr.Empty() { + endpoint += fmt.Sprintf("delegator=%s&", delegatorAddr) + } + if !srcValidatorAddr.Empty() { + endpoint += fmt.Sprintf("validator_from=%s&", srcValidatorAddr) } + if !dstValidatorAddr.Empty() { + endpoint += fmt.Sprintf("validator_to=%s&", dstValidatorAddr) + } + + res, body = Request(t, port, "GET", endpoint, nil) require.Equal(t, http.StatusOK, res.StatusCode, body) @@ -1232,17 +1236,6 @@ func getValidatorUnbondingDelegations(t *testing.T, port string, validatorAddr s return ubds } -func getValidatorRedelegations(t *testing.T, port string, validatorAddr sdk.ValAddress) []stake.Redelegation { - res, body := Request(t, port, "GET", fmt.Sprintf("/stake/validators/%s/redelegations", validatorAddr.String()), nil) - require.Equal(t, http.StatusOK, res.StatusCode, body) - - var reds []stake.Redelegation - err := cdc.UnmarshalJSON([]byte(body), &reds) - require.Nil(t, err) - - return reds -} - // ============= Governance Module ================ func getProposal(t *testing.T, port string, proposalID uint64) gov.Proposal { diff --git a/x/stake/client/rest/query.go b/x/stake/client/rest/query.go index cd3664cd64e2..bfbab5090f80 100644 --- a/x/stake/client/rest/query.go +++ b/x/stake/client/rest/query.go @@ -33,8 +33,8 @@ func registerQueryRoutes(cliCtx context.CLIContext, r *mux.Router, cdc *codec.Co // Get all redelegations from a delegator r.HandleFunc( - "/stake/delegators/{delegatorAddr}/redelegations", - delegatorRedelegationsHandlerFn(cliCtx, cdc), + "/stake/redelegations", + redelegationsHandlerFn(cliCtx, cdc), ).Methods("GET") // Get all staking txs (i.e msgs) from a delegator @@ -67,10 +67,10 @@ func registerQueryRoutes(cliCtx context.CLIContext, r *mux.Router, cdc *codec.Co unbondingDelegationHandlerFn(cliCtx, cdc), ).Methods("GET") - // Query all redelegations of delegator + // Query redelegations (filters in query params) r.HandleFunc( - "/stake/delegators/{delegatorAddr}/redelegations", - redelegationHandlerFn(cliCtx, cdc), + "/stake/redelegations", + redelegationsHandlerFn(cliCtx, cdc), ).Methods("GET") // Get all validators @@ -91,12 +91,6 @@ func registerQueryRoutes(cliCtx context.CLIContext, r *mux.Router, cdc *codec.Co validatorUnbondingDelegationsHandlerFn(cliCtx, cdc), ).Methods("GET") - // Get all outgoing redelegations from a validator - r.HandleFunc( - "/stake/validators/{validatorAddr}/redelegations", - validatorRedelegationsHandlerFn(cliCtx, cdc), - ).Methods("GET") - // Get the current state of the staking pool r.HandleFunc( "/stake/pool", @@ -121,11 +115,6 @@ func delegatorUnbondingDelegationsHandlerFn(cliCtx context.CLIContext, cdc *code return queryDelegator(cliCtx, cdc, "custom/stake/delegatorUnbondingDelegations") } -// HTTP request handler to query a delegator redelegations -func delegatorRedelegationsHandlerFn(cliCtx context.CLIContext, cdc *codec.Codec) http.HandlerFunc { - return queryDelegator(cliCtx, cdc, "custom/stake/delegatorRedelegations") -} - // HTTP request handler to query all staking txs (msgs) from a delegator func delegatorTxsHandlerFn(cliCtx context.CLIContext, cdc *codec.Codec) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { @@ -202,27 +191,26 @@ func unbondingDelegationHandlerFn(cliCtx context.CLIContext, cdc *codec.Codec) h return queryBonds(cliCtx, cdc, "custom/stake/unbondingDelegation") } -// HTTP request handler to query an redelegation -func redelegationHandlerFn(cliCtx context.CLIContext, cdc *codec.Codec) http.HandlerFunc { +// HTTP request handler to query redelegations +func redelegationsHandlerFn(cliCtx context.CLIContext, cdc *codec.Codec) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { - vars := mux.Vars(r) - bech32delegator := vars["delegatorAddr"] + var params stake.QueryRedelegationParams - delegatorAddr, err := sdk.AccAddressFromBech32(bech32delegator) - if err != nil { - utils.WriteErrorResponse(w, http.StatusBadRequest, err.Error()) - return - } + bechDelegatorAddr := r.URL.Query().Get("delegator") + bechSrcValidatorAddr := r.URL.Query().Get("validator_from") + bechDstValidatorAddr := r.URL.Query().Get("validator_to") - params := stake.QueryRedelegationParams{ - DelegatorAddr: delegatorAddr, + if len(bechDelegatorAddr) != 0 { + delegatorAddr, err := sdk.AccAddressFromBech32(bechDelegatorAddr) + if err != nil { + utils.WriteErrorResponse(w, http.StatusBadRequest, err.Error()) + return + } + params.DelegatorAddr = delegatorAddr } - bechSrcVoterAddr := r.URL.Query().Get("validator_from") - bechDstVoterAddr := r.URL.Query().Get("validator_to") - - if len(bechSrcVoterAddr) != 0 { - srcValidatorAddr, err := sdk.ValAddressFromBech32(bechSrcVoterAddr) + if len(bechSrcValidatorAddr) != 0 { + srcValidatorAddr, err := sdk.ValAddressFromBech32(bechSrcValidatorAddr) if err != nil { utils.WriteErrorResponse(w, http.StatusBadRequest, err.Error()) return @@ -230,8 +218,8 @@ func redelegationHandlerFn(cliCtx context.CLIContext, cdc *codec.Codec) http.Han params.SrcValidatorAddr = srcValidatorAddr } - if len(bechDstVoterAddr) != 0 { - dstValidatorAddr, err := sdk.ValAddressFromBech32(bechDstVoterAddr) + if len(bechDstValidatorAddr) != 0 { + dstValidatorAddr, err := sdk.ValAddressFromBech32(bechDstValidatorAddr) if err != nil { utils.WriteErrorResponse(w, http.StatusBadRequest, err.Error()) return @@ -291,11 +279,6 @@ func validatorUnbondingDelegationsHandlerFn(cliCtx context.CLIContext, cdc *code return queryValidator(cliCtx, cdc, "custom/stake/validatorUnbondingDelegations") } -// HTTP request handler to query all redelegations from a source validator -func validatorRedelegationsHandlerFn(cliCtx context.CLIContext, cdc *codec.Codec) http.HandlerFunc { - return queryValidator(cliCtx, cdc, "custom/stake/validatorRedelegations") -} - // HTTP request handler to query the pool information func poolHandlerFn(cliCtx context.CLIContext, cdc *codec.Codec) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { diff --git a/x/stake/querier/queryable.go b/x/stake/querier/queryable.go index a503ecb9b300..243696e52a81 100644 --- a/x/stake/querier/queryable.go +++ b/x/stake/querier/queryable.go @@ -14,13 +14,11 @@ const ( QueryValidator = "validator" QueryDelegatorDelegations = "delegatorDelegations" QueryDelegatorUnbondingDelegations = "delegatorUnbondingDelegations" - QueryDelegatorRedelegations = "delegatorRedelegations" + QueryRedelegations = "redelegations" QueryValidatorUnbondingDelegations = "validatorUnbondingDelegations" - QueryValidatorRedelegations = "validatorRedelegations" QueryDelegator = "delegator" QueryDelegation = "delegation" QueryUnbondingDelegation = "unbondingDelegation" - QueryRedelegation = "redelegation" QueryDelegatorValidators = "delegatorValidators" QueryDelegatorValidator = "delegatorValidator" QueryPool = "pool" @@ -37,8 +35,6 @@ func NewQuerier(k keep.Keeper, cdc *codec.Codec) sdk.Querier { return queryValidator(ctx, cdc, req, k) case QueryValidatorUnbondingDelegations: return queryValidatorUnbondingDelegations(ctx, cdc, req, k) - case QueryValidatorRedelegations: - return queryValidatorRedelegations(ctx, cdc, req, k) case QueryDelegation: return queryDelegation(ctx, cdc, req, k) case QueryUnbondingDelegation: @@ -47,8 +43,8 @@ func NewQuerier(k keep.Keeper, cdc *codec.Codec) sdk.Querier { return queryDelegatorDelegations(ctx, cdc, req, k) case QueryDelegatorUnbondingDelegations: return queryDelegatorUnbondingDelegations(ctx, cdc, req, k) - case QueryDelegatorRedelegations: - return queryDelegatorRedelegations(ctx, cdc, req, k) + case QueryRedelegations: + return queryRedelegations(ctx, cdc, req, k) case QueryDelegatorValidators: return queryDelegatorValidators(ctx, cdc, req, k) case QueryDelegatorValidator: @@ -145,23 +141,6 @@ func queryValidatorUnbondingDelegations(ctx sdk.Context, cdc *codec.Codec, req a return res, nil } -func queryValidatorRedelegations(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("") - } - - redelegations := k.GetRedelegationsFromValidator(ctx, params.ValidatorAddr) - - res, errRes = codec.MarshalJSONIndent(cdc, redelegations) - if errRes != nil { - return nil, sdk.ErrInternal(sdk.AppendMsgToErr("could not marshal result to JSON", errRes.Error())) - } - return res, nil -} - func queryDelegatorDelegations(ctx sdk.Context, cdc *codec.Codec, req abci.RequestQuery, k keep.Keeper) (res []byte, err sdk.Error) { var params QueryDelegatorParams @@ -196,23 +175,6 @@ func queryDelegatorUnbondingDelegations(ctx sdk.Context, cdc *codec.Codec, req a return res, nil } -func queryDelegatorRedelegations(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.ErrUnknownAddress("") - } - - redelegations := k.GetAllRedelegations(ctx, params.DelegatorAddr, params.SrcValidatorAddr, params.DstValidatorAddr) - - res, errRes = codec.MarshalJSONIndent(cdc, redelegations) - if errRes != nil { - return nil, sdk.ErrInternal(sdk.AppendMsgToErr("could not marshal result to JSON", errRes.Error())) - } - return res, nil -} - func queryDelegatorValidators(ctx sdk.Context, cdc *codec.Codec, req abci.RequestQuery, k keep.Keeper) (res []byte, err sdk.Error) { var params QueryDelegatorParams @@ -300,18 +262,16 @@ func queryRedelegations(ctx sdk.Context, cdc *codec.Codec, req abci.RequestQuery return []byte{}, sdk.ErrUnknownRequest(string(req.Data)) } - if params.DelegatorAddr.Empty() { - return []byte{}, types.ErrBadRedelegationAddr(types.DefaultCodespace) - } - var redels []types.Redelegation - if !params.SrcValidatorAddr.Empty() && !params.DstValidatorAddr.Empty() { + if !params.DelegatorAddr.Empty() && !params.SrcValidatorAddr.Empty() && !params.DstValidatorAddr.Empty() { redel, found := k.GetRedelegation(ctx, params.DelegatorAddr, params.SrcValidatorAddr, params.DstValidatorAddr) if !found { return []byte{}, types.ErrNoRedelegation(types.DefaultCodespace) } redels = []types.Redelegation{redel} + } else if params.DelegatorAddr.Empty() && !params.SrcValidatorAddr.Empty() && params.DstValidatorAddr.Empty() { + redels = k.GetRedelegationsFromValidator(ctx, params.SrcValidatorAddr) } else { redels = k.GetAllRedelegations(ctx, params.DelegatorAddr, params.SrcValidatorAddr, params.DstValidatorAddr) } diff --git a/x/stake/querier/queryable_test.go b/x/stake/querier/queryable_test.go index 5f19bb16d601..bb7c86308279 100644 --- a/x/stake/querier/queryable_test.go +++ b/x/stake/querier/queryable_test.go @@ -93,9 +93,6 @@ func TestNewQuerier(t *testing.T) { _, err = querier(ctx, []string{"validatorUnbondingDelegations"}, query) require.Nil(t, err) - _, err = querier(ctx, []string{"validatorRedelegations"}, query) - require.Nil(t, err) - queryDelParams := newTestDelegatorQuery(addrAcc2) bz, errRes = cdc.MarshalJSON(queryDelParams) require.Nil(t, errRes) @@ -109,10 +106,14 @@ func TestNewQuerier(t *testing.T) { _, err = querier(ctx, []string{"delegatorUnbondingDelegations"}, query) require.Nil(t, err) - _, err = querier(ctx, []string{"delegatorRedelegations"}, query) + _, err = querier(ctx, []string{"delegatorValidators"}, query) require.Nil(t, err) - _, err = querier(ctx, []string{"delegatorValidators"}, query) + bz, errRes = cdc.MarshalJSON(newTestRedelegationQuery(nil, nil, nil)) + require.Nil(t, errRes) + query.Data = bz + + _, err = querier(ctx, []string{"redelegations"}, query) require.Nil(t, err) } @@ -356,7 +357,7 @@ func TestQueryDelegation(t *testing.T) { require.Nil(t, errRes) query = abci.RequestQuery{ - Path: "/custom/stake/redelegation", + Path: "/custom/stake/redelegations", Data: bz, } @@ -390,16 +391,16 @@ func TestQueryRedelegations(t *testing.T) { require.True(t, found) // delegator redelegations - queryDelegatorParams := newTestDelegatorQuery(addrAcc2) - bz, errRes := cdc.MarshalJSON(queryDelegatorParams) + queryRedelegationParams := newTestRedelegationQuery(addrAcc2, nil, nil) + bz, errRes := cdc.MarshalJSON(queryRedelegationParams) require.Nil(t, errRes) query := abci.RequestQuery{ - Path: "/custom/stake/delegatorRedelegations", + Path: "/custom/stake/redelegations", Data: bz, } - res, err := queryDelegatorRedelegations(ctx, cdc, query, keeper) + res, err := queryRedelegations(ctx, cdc, query, keeper) require.Nil(t, err) var redsRes []types.Redelegation @@ -409,16 +410,16 @@ func TestQueryRedelegations(t *testing.T) { require.Equal(t, redelegation, redsRes[0]) // validator redelegations - queryValidatorParams := newTestValidatorQuery(val1.GetOperator()) - bz, errRes = cdc.MarshalJSON(queryValidatorParams) + queryRedelegationParams = newTestRedelegationQuery(nil, val1.GetOperator(), nil) + bz, errRes = cdc.MarshalJSON(queryRedelegationParams) require.Nil(t, errRes) query = abci.RequestQuery{ - Path: "/custom/stake/validatorRedelegations", + Path: "/custom/stake/redelegations", Data: bz, } - res, err = queryValidatorRedelegations(ctx, cdc, query, keeper) + res, err = queryRedelegations(ctx, cdc, query, keeper) require.Nil(t, err) errRes = cdc.UnmarshalJSON(res, &redsRes) diff --git a/x/stake/stake.go b/x/stake/stake.go index 65571ccb5b1f..5c9f26173fcf 100644 --- a/x/stake/stake.go +++ b/x/stake/stake.go @@ -92,12 +92,11 @@ const ( QueryValidators = querier.QueryValidators QueryValidator = querier.QueryValidator QueryValidatorUnbondingDelegations = querier.QueryValidatorUnbondingDelegations - QueryValidatorRedelegations = querier.QueryValidatorRedelegations QueryDelegation = querier.QueryDelegation QueryUnbondingDelegation = querier.QueryUnbondingDelegation QueryDelegatorDelegations = querier.QueryDelegatorDelegations QueryDelegatorUnbondingDelegations = querier.QueryDelegatorUnbondingDelegations - QueryDelegatorRedelegations = querier.QueryDelegatorRedelegations + QueryRedelegations = querier.QueryRedelegations QueryDelegatorValidators = querier.QueryDelegatorValidators QueryDelegatorValidator = querier.QueryDelegatorValidator QueryPool = querier.QueryPool From b60db92f8a3125f94929674efe229db8da0fcac8 Mon Sep 17 00:00:00 2001 From: Sunny Aggarwal Date: Mon, 5 Nov 2018 20:48:32 -0800 Subject: [PATCH 07/13] in progress --- x/stake/keeper/query_utils.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/x/stake/keeper/query_utils.go b/x/stake/keeper/query_utils.go index 7ad888fa202e..699ae8ccff98 100644 --- a/x/stake/keeper/query_utils.go +++ b/x/stake/keeper/query_utils.go @@ -91,15 +91,15 @@ func (k Keeper) GetAllRedelegations(ctx sdk.Context, delegator sdk.AccAddress, s iterator := sdk.KVStorePrefixIterator(store, delegatorPrefixKey) //smallest to largest defer iterator.Close() - srcValFilter := srcValAddress.Empty() || srcValAddress == nil - dstValFilter := dstValAddress.Empty() || dstValAddress == nil + srcValFilter := !(srcValAddress.Empty() || srcValAddress == nil) + dstValFilter := !(dstValAddress.Empty() || dstValAddress == nil) for ; iterator.Valid(); iterator.Next() { redelegation := types.MustUnmarshalRED(k.cdc, iterator.Key(), iterator.Value()) - if !srcValFilter && !(srcValAddress.Equals(redelegation.ValidatorSrcAddr)) { + if srcValFilter && !(srcValAddress.Equals(redelegation.ValidatorSrcAddr)) { continue } - if !dstValFilter && !(dstValAddress.Equals(redelegation.ValidatorDstAddr)) { + if dstValFilter && !(dstValAddress.Equals(redelegation.ValidatorDstAddr)) { continue } redelegations = append(redelegations, redelegation) From 73df9bc59b127c6fc93572358bde6f045aa30d55 Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Fri, 9 Nov 2018 13:14:52 -0800 Subject: [PATCH 08/13] Update x/stake/client/rest/utils.go Co-Authored-By: sunnya97 --- x/stake/client/rest/utils.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/x/stake/client/rest/utils.go b/x/stake/client/rest/utils.go index 2c8672501490..5497064f2077 100644 --- a/x/stake/client/rest/utils.go +++ b/x/stake/client/rest/utils.go @@ -57,6 +57,10 @@ func queryRedelegations(cliCtx context.CLIContext, cdc *codec.Codec, endpoint st bech32dstValidator := vars["dstValidatorAddr"] delegatorAddr, err := sdk.AccAddressFromBech32(bech32delegator) + if err != nil { + utils.WriteErrorResponse(w, http.StatusBadRequest, err.Error()) + return + } srcValidatorAddr, err := sdk.ValAddressFromBech32(bech32srcValidator) dstValidatorAddr, err := sdk.ValAddressFromBech32(bech32dstValidator) if err != nil { From 2285ee9fafc5c044f3e1aa8395f295d75f6fb571 Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Fri, 9 Nov 2018 13:14:59 -0800 Subject: [PATCH 09/13] Update x/stake/client/rest/utils.go Co-Authored-By: sunnya97 --- x/stake/client/rest/utils.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/x/stake/client/rest/utils.go b/x/stake/client/rest/utils.go index 5497064f2077..ea15cbd029fd 100644 --- a/x/stake/client/rest/utils.go +++ b/x/stake/client/rest/utils.go @@ -62,6 +62,10 @@ func queryRedelegations(cliCtx context.CLIContext, cdc *codec.Codec, endpoint st return } srcValidatorAddr, err := sdk.ValAddressFromBech32(bech32srcValidator) + if err != nil { + utils.WriteErrorResponse(w, http.StatusBadRequest, err.Error()) + return + } dstValidatorAddr, err := sdk.ValAddressFromBech32(bech32dstValidator) if err != nil { utils.WriteErrorResponse(w, http.StatusBadRequest, err.Error()) From 9b3a0fb19fb7a288daaeba044bb0eed1d99223ad Mon Sep 17 00:00:00 2001 From: Sunny Aggarwal Date: Fri, 9 Nov 2018 13:22:13 -0800 Subject: [PATCH 10/13] in progress --- x/stake/client/rest/query.go | 6 ------ 1 file changed, 6 deletions(-) diff --git a/x/stake/client/rest/query.go b/x/stake/client/rest/query.go index bfbab5090f80..09738b5d5727 100644 --- a/x/stake/client/rest/query.go +++ b/x/stake/client/rest/query.go @@ -31,12 +31,6 @@ func registerQueryRoutes(cliCtx context.CLIContext, r *mux.Router, cdc *codec.Co delegatorUnbondingDelegationsHandlerFn(cliCtx, cdc), ).Methods("GET") - // Get all redelegations from a delegator - r.HandleFunc( - "/stake/redelegations", - redelegationsHandlerFn(cliCtx, cdc), - ).Methods("GET") - // Get all staking txs (i.e msgs) from a delegator r.HandleFunc( "/stake/delegators/{delegatorAddr}/txs", From a34481535f75aa2b4beff75461985581a66d9ad3 Mon Sep 17 00:00:00 2001 From: Sunny Aggarwal Date: Fri, 9 Nov 2018 13:30:24 -0800 Subject: [PATCH 11/13] swagger.yaml --- client/lcd/swagger-ui/swagger.yaml | 50 ++++++++++-------------------- 1 file changed, 17 insertions(+), 33 deletions(-) diff --git a/client/lcd/swagger-ui/swagger.yaml b/client/lcd/swagger-ui/swagger.yaml index 86b6ec6813fa..26f4c92c1242 100644 --- a/client/lcd/swagger-ui/swagger.yaml +++ b/client/lcd/swagger-ui/swagger.yaml @@ -753,15 +753,25 @@ paths: description: Invalid delegator address 500: description: Internal Server Error - /stake/delegators/{delegatorAddr}/redelegations: + /stake/redelegations: parameters: - - in: path - name: delegatorAddr - description: Bech32 AccAddress of Delegator - required: true - type: string + - in: query + name: delegator + description: Bech32 AccAddress of Delegator + required: false + type: string + - in: query + name: validator_from + description: Bech32 ValAddress of SrcValidator + required: false + type: string + - in: query + name: validator_to + description: Bech32 ValAddress of DstValidator + required: false + type: string get: - summary: Get all redelegations from a delegator + summary: Get all redelegations (filter by query params) tags: - ICS21 produces: @@ -774,8 +784,6 @@ paths: items: type: object "$ref": "#/definitions/Redelegation" - 400: - description: Invalid delegator address 500: description: Internal Server Error /stake/delegators/{delegatorAddr}/validators: @@ -974,30 +982,6 @@ paths: description: Invalid validator address 500: description: Internal Server Error - /stake/validators/{validatorAddr}/redelegations: - parameters: - - in: path - name: validatorAddr - description: Bech32 OperatorAddress of validator - required: true - type: string - get: - summary: Get all outgoing redelegations from a validator - tags: - - ICS21 - produces: - - application/json - responses: - 200: - description: OK - schema: - type: array - items: - $ref: "#/definitions/Redelegation" - 400: - description: Invalid validator address - 500: - description: Internal Server Error /stake/pool: get: summary: Get the current state of the staking pool From fa18461143180e4131c2ef09a1c0c345529d3398 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Thu, 29 Nov 2018 10:41:28 +0100 Subject: [PATCH 12/13] Remove merge artifact from PENDING.md --- PENDING.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/PENDING.md b/PENDING.md index e23ccde17b1b..13810781f3d1 100644 --- a/PENDING.md +++ b/PENDING.md @@ -29,12 +29,9 @@ BREAKING CHANGES FEATURES * Gaia REST API (`gaiacli advanced rest-server`) -<<<<<<< HEAD * [gaia-lite] [\#2182] Added LCD endpoint for querying redelegations -======= * [gov] [\#2479](https://github.com/cosmos/cosmos-sdk/issues/2479) Added governance parameter query REST endpoints. ->>>>>>> develop * Gaia CLI (`gaiacli`) * [gov][cli] [\#2479](https://github.com/cosmos/cosmos-sdk/issues/2479) Added governance From 5fd59ed0490fe221e2d76372e820c666740e9e11 Mon Sep 17 00:00:00 2001 From: Sunny Aggarwal Date: Mon, 17 Dec 2018 22:18:18 +0800 Subject: [PATCH 13/13] fixed merge conflicts --- Makefile | 2 +- client/lcd/test_helpers.go | 39 +++++++++++++++++------------------- cmd/logjack/main.go | 1 + x/stake/client/rest/query.go | 2 -- 4 files changed, 20 insertions(+), 24 deletions(-) diff --git a/Makefile b/Makefile index cfd9cbd61c18..af07d7d071c4 100644 --- a/Makefile +++ b/Makefile @@ -207,7 +207,7 @@ test_cover: test_lint: gometalinter --config=tools/gometalinter.json ./... - !(gometalinter --exclude /usr/lib/go/src/ --exclude client/lcd/statik/statik.go --exclude 'vendor/*' --disable-all --enable='errcheck' --vendor ./... | grep -v "client/") + !(gometalinter --exclude /usr/lib/go/src/ --exclude client/lcd/statik/statik.go --exclude 'vendor/*' --exclude 'cmd/logjack/*' --disable-all --enable='errcheck' --vendor ./... | grep -v "client/") find . -name '*.go' -type f -not -path "./vendor*" -not -path "*.git*" | xargs gofmt -d -s dep status >> /dev/null !(grep -n branch Gopkg.toml) diff --git a/client/lcd/test_helpers.go b/client/lcd/test_helpers.go index 58b8426e5f82..982449ba9664 100644 --- a/client/lcd/test_helpers.go +++ b/client/lcd/test_helpers.go @@ -886,17 +886,26 @@ func getDelegatorUnbondingDelegations(t *testing.T, port string, delegatorAddr s return ubds } -// GET /stake/delegators/{delegatorAddr}/redelegations Get all redelegations from a delegator -func getDelegatorRedelegations(t *testing.T, port string, delegatorAddr sdk.AccAddress) []stake.Redelegation { - res, body := Request(t, port, "GET", fmt.Sprintf("/stake/delegators/%s/redelegations", delegatorAddr), nil) +// GET /stake/redelegations?delegator=0xdeadbeef&validator_from=0xdeadbeef&validator_to=0xdeadbeef& Get redelegations filters by params passed in +func getRedelegations(t *testing.T, port string, delegatorAddr sdk.AccAddress, srcValidatorAddr sdk.ValAddress, dstValidatorAddr sdk.ValAddress) []stake.Redelegation { + var res *http.Response + var body string + endpoint := "/stake/redelegations?" + if !delegatorAddr.Empty() { + endpoint += fmt.Sprintf("delegator=%s&", delegatorAddr) + } + if !srcValidatorAddr.Empty() { + endpoint += fmt.Sprintf("validator_from=%s&", srcValidatorAddr) + } + if !dstValidatorAddr.Empty() { + endpoint += fmt.Sprintf("validator_to=%s&", dstValidatorAddr) + } + res, body = Request(t, port, "GET", endpoint, nil) require.Equal(t, http.StatusOK, res.StatusCode, body) - - var reds []stake.Redelegation - - err := cdc.UnmarshalJSON([]byte(body), &reds) + var redels []stake.Redelegation + err := cdc.UnmarshalJSON([]byte(body), &redels) require.Nil(t, err) - - return reds + return redels } // GET /stake/delegators/{delegatorAddr}/validators Query all validators that a delegator is bonded to @@ -1016,18 +1025,6 @@ func getValidatorUnbondingDelegations(t *testing.T, port string, validatorAddr s return ubds } -// GET /stake/validators/{validatorAddr}/redelegations Get all outgoing redelegations from a validator -func getValidatorRedelegations(t *testing.T, port string, validatorAddr sdk.ValAddress) []stake.Redelegation { - res, body := Request(t, port, "GET", fmt.Sprintf("/stake/validators/%s/redelegations", validatorAddr.String()), nil) - require.Equal(t, http.StatusOK, res.StatusCode, body) - - var reds []stake.Redelegation - err := cdc.UnmarshalJSON([]byte(body), &reds) - require.Nil(t, err) - - return reds -} - // GET /stake/pool Get the current state of the staking pool func getStakePool(t *testing.T, port string) stake.Pool { res, body := Request(t, port, "GET", "/stake/pool", nil) diff --git a/cmd/logjack/main.go b/cmd/logjack/main.go index c724ee4a178f..3857fb15c9a5 100644 --- a/cmd/logjack/main.go +++ b/cmd/logjack/main.go @@ -1,3 +1,4 @@ +// nolint package main import ( diff --git a/x/stake/client/rest/query.go b/x/stake/client/rest/query.go index 4e17460853fe..f24a4f5a1b09 100644 --- a/x/stake/client/rest/query.go +++ b/x/stake/client/rest/query.go @@ -4,8 +4,6 @@ import ( "net/http" "strings" - "github.com/cosmos/cosmos-sdk/x/stake" - "github.com/cosmos/cosmos-sdk/client/context" "github.com/cosmos/cosmos-sdk/client/tx" "github.com/cosmos/cosmos-sdk/client/utils"