github.com/Finschia/finschia-sdk@v0.48.1/x/staking/keeper/querier_test.go (about)

     1  package keeper_test
     2  
     3  import (
     4  	"fmt"
     5  	"testing"
     6  
     7  	"github.com/stretchr/testify/require"
     8  	abci "github.com/tendermint/tendermint/abci/types"
     9  	tmproto "github.com/tendermint/tendermint/proto/tendermint/types"
    10  
    11  	"github.com/Finschia/finschia-sdk/codec"
    12  	"github.com/Finschia/finschia-sdk/simapp"
    13  	sdk "github.com/Finschia/finschia-sdk/types"
    14  	"github.com/Finschia/finschia-sdk/x/staking/keeper"
    15  	"github.com/Finschia/finschia-sdk/x/staking/teststaking"
    16  	"github.com/Finschia/finschia-sdk/x/staking/types"
    17  )
    18  
    19  func TestNewQuerier(t *testing.T) {
    20  	cdc, app, ctx := createTestInput()
    21  
    22  	addrs := simapp.AddTestAddrs(app, ctx, 500, sdk.NewInt(10000))
    23  	_, addrAcc2 := addrs[0], addrs[1]
    24  	addrVal1, _ := sdk.ValAddress(addrs[0]), sdk.ValAddress(addrs[1])
    25  
    26  	// Create Validators
    27  	amts := []sdk.Int{sdk.NewInt(9), sdk.NewInt(8)}
    28  	var validators [2]types.Validator
    29  	for i, amt := range amts {
    30  		validators[i] = teststaking.NewValidator(t, sdk.ValAddress(addrs[i]), PKs[i])
    31  		validators[i], _ = validators[i].AddTokensFromDel(amt)
    32  		app.StakingKeeper.SetValidator(ctx, validators[i])
    33  		app.StakingKeeper.SetValidatorByPowerIndex(ctx, validators[i])
    34  	}
    35  
    36  	header := tmproto.Header{
    37  		ChainID: "HelloChain",
    38  		Height:  5,
    39  	}
    40  	hi := types.NewHistoricalInfo(header, validators[:], app.StakingKeeper.PowerReduction(ctx))
    41  	app.StakingKeeper.SetHistoricalInfo(ctx, 5, &hi)
    42  
    43  	query := abci.RequestQuery{
    44  		Path: "",
    45  		Data: []byte{},
    46  	}
    47  
    48  	legacyQuerierCdc := codec.NewAminoCodec(app.LegacyAmino())
    49  	querier := keeper.NewQuerier(app.StakingKeeper, legacyQuerierCdc.LegacyAmino)
    50  
    51  	bz, err := querier(ctx, []string{"other"}, query)
    52  	require.Error(t, err)
    53  	require.Nil(t, bz)
    54  
    55  	_, err = querier(ctx, []string{"pool"}, query)
    56  	require.NoError(t, err)
    57  
    58  	_, err = querier(ctx, []string{"parameters"}, query)
    59  	require.NoError(t, err)
    60  
    61  	queryValParams := types.NewQueryValidatorParams(addrVal1, 0, 0)
    62  	bz, errRes := cdc.MarshalJSON(queryValParams)
    63  	require.NoError(t, errRes)
    64  
    65  	query.Path = "/custom/staking/validator"
    66  	query.Data = bz
    67  
    68  	_, err = querier(ctx, []string{"validator"}, query)
    69  	require.NoError(t, err)
    70  
    71  	_, err = querier(ctx, []string{"validatorDelegations"}, query)
    72  	require.NoError(t, err)
    73  
    74  	_, err = querier(ctx, []string{"validatorUnbondingDelegations"}, query)
    75  	require.NoError(t, err)
    76  
    77  	queryDelParams := types.NewQueryDelegatorParams(addrAcc2)
    78  	bz, errRes = cdc.MarshalJSON(queryDelParams)
    79  	require.NoError(t, errRes)
    80  
    81  	query.Path = "/custom/staking/validator"
    82  	query.Data = bz
    83  
    84  	_, err = querier(ctx, []string{"delegatorDelegations"}, query)
    85  	require.NoError(t, err)
    86  
    87  	_, err = querier(ctx, []string{"delegatorUnbondingDelegations"}, query)
    88  	require.NoError(t, err)
    89  
    90  	_, err = querier(ctx, []string{"delegatorValidators"}, query)
    91  	require.NoError(t, err)
    92  
    93  	bz, errRes = cdc.MarshalJSON(types.NewQueryRedelegationParams(nil, nil, nil))
    94  	require.NoError(t, errRes)
    95  	query.Data = bz
    96  
    97  	_, err = querier(ctx, []string{"redelegations"}, query)
    98  	require.NoError(t, err)
    99  
   100  	queryHisParams := types.QueryHistoricalInfoRequest{Height: 5}
   101  	bz, errRes = cdc.MarshalJSON(queryHisParams)
   102  	require.NoError(t, errRes)
   103  
   104  	query.Path = "/custom/staking/historicalInfo"
   105  	query.Data = bz
   106  
   107  	_, err = querier(ctx, []string{"historicalInfo"}, query)
   108  	require.NoError(t, err)
   109  }
   110  
   111  func TestQueryParametersPool(t *testing.T) {
   112  	cdc, app, ctx := createTestInput()
   113  	legacyQuerierCdc := codec.NewAminoCodec(app.LegacyAmino())
   114  	querier := keeper.NewQuerier(app.StakingKeeper, legacyQuerierCdc.LegacyAmino)
   115  
   116  	bondDenom := sdk.DefaultBondDenom
   117  
   118  	res, err := querier(ctx, []string{types.QueryParameters}, abci.RequestQuery{})
   119  	require.NoError(t, err)
   120  
   121  	var params types.Params
   122  	errRes := cdc.UnmarshalJSON(res, &params)
   123  	require.NoError(t, errRes)
   124  	require.Equal(t, app.StakingKeeper.GetParams(ctx), params)
   125  
   126  	res, err = querier(ctx, []string{types.QueryPool}, abci.RequestQuery{})
   127  	require.NoError(t, err)
   128  
   129  	var pool types.Pool
   130  	bondedPool := app.StakingKeeper.GetBondedPool(ctx)
   131  	notBondedPool := app.StakingKeeper.GetNotBondedPool(ctx)
   132  	require.NoError(t, cdc.UnmarshalJSON(res, &pool))
   133  	require.Equal(t, app.BankKeeper.GetBalance(ctx, notBondedPool.GetAddress(), bondDenom).Amount, pool.NotBondedTokens)
   134  	require.Equal(t, app.BankKeeper.GetBalance(ctx, bondedPool.GetAddress(), bondDenom).Amount, pool.BondedTokens)
   135  }
   136  
   137  func TestQueryValidators(t *testing.T) {
   138  	cdc, app, ctx := createTestInput()
   139  	params := app.StakingKeeper.GetParams(ctx)
   140  	legacyQuerierCdc := codec.NewAminoCodec(app.LegacyAmino())
   141  	querier := keeper.NewQuerier(app.StakingKeeper, legacyQuerierCdc.LegacyAmino)
   142  
   143  	addrs := simapp.AddTestAddrs(app, ctx, 500, app.StakingKeeper.TokensFromConsensusPower(ctx, 10000))
   144  
   145  	// Create Validators
   146  	amts := []sdk.Int{sdk.NewInt(9), sdk.NewInt(8), sdk.NewInt(7)}
   147  	status := []types.BondStatus{types.Bonded, types.Unbonded, types.Unbonding}
   148  	var validators [3]types.Validator
   149  	for i, amt := range amts {
   150  		validators[i] = teststaking.NewValidator(t, sdk.ValAddress(addrs[i]), PKs[i])
   151  		validators[i], _ = validators[i].AddTokensFromDel(amt)
   152  		validators[i] = validators[i].UpdateStatus(status[i])
   153  	}
   154  
   155  	app.StakingKeeper.SetValidator(ctx, validators[0])
   156  	app.StakingKeeper.SetValidator(ctx, validators[1])
   157  	app.StakingKeeper.SetValidator(ctx, validators[2])
   158  
   159  	// Query Validators
   160  	queriedValidators := app.StakingKeeper.GetValidators(ctx, params.MaxValidators)
   161  	require.Len(t, queriedValidators, 3)
   162  
   163  	for i, s := range status {
   164  		queryValsParams := types.NewQueryValidatorsParams(1, int(params.MaxValidators), s.String())
   165  		bz, err := cdc.MarshalJSON(queryValsParams)
   166  		require.NoError(t, err)
   167  
   168  		req := abci.RequestQuery{
   169  			Path: fmt.Sprintf("/custom/%s/%s", types.QuerierRoute, types.QueryValidators),
   170  			Data: bz,
   171  		}
   172  
   173  		res, err := querier(ctx, []string{types.QueryValidators}, req)
   174  		require.NoError(t, err)
   175  
   176  		var validatorsResp []types.Validator
   177  		err = cdc.UnmarshalJSON(res, &validatorsResp)
   178  		require.NoError(t, err)
   179  
   180  		require.Equal(t, 1, len(validatorsResp))
   181  		require.Equal(t, validators[i].OperatorAddress, validatorsResp[0].OperatorAddress)
   182  	}
   183  
   184  	// Query each validator
   185  	for _, validator := range validators {
   186  		queryParams := types.NewQueryValidatorParams(validator.GetOperator(), 0, 0)
   187  		bz, err := cdc.MarshalJSON(queryParams)
   188  		require.NoError(t, err)
   189  
   190  		query := abci.RequestQuery{
   191  			Path: "/custom/staking/validator",
   192  			Data: bz,
   193  		}
   194  		res, err := querier(ctx, []string{types.QueryValidator}, query)
   195  		require.NoError(t, err)
   196  
   197  		var queriedValidator types.Validator
   198  		err = cdc.UnmarshalJSON(res, &queriedValidator)
   199  		require.NoError(t, err)
   200  
   201  		require.True(t, validator.Equal(&queriedValidator))
   202  	}
   203  }
   204  
   205  func TestQueryDelegation(t *testing.T) {
   206  	cdc, app, ctx := createTestInput()
   207  	params := app.StakingKeeper.GetParams(ctx)
   208  	legacyQuerierCdc := codec.NewAminoCodec(app.LegacyAmino())
   209  	querier := keeper.NewQuerier(app.StakingKeeper, legacyQuerierCdc.LegacyAmino)
   210  
   211  	addrs := simapp.AddTestAddrs(app, ctx, 2, app.StakingKeeper.TokensFromConsensusPower(ctx, 10000))
   212  	addrAcc1, addrAcc2 := addrs[0], addrs[1]
   213  	addrVal1, addrVal2 := sdk.ValAddress(addrAcc1), sdk.ValAddress(addrAcc2)
   214  
   215  	pubKeys := simapp.CreateTestPubKeys(2)
   216  	pk1, pk2 := pubKeys[0], pubKeys[1]
   217  
   218  	// Create Validators and Delegation
   219  	val1 := teststaking.NewValidator(t, addrVal1, pk1)
   220  	app.StakingKeeper.SetValidator(ctx, val1)
   221  	app.StakingKeeper.SetValidatorByPowerIndex(ctx, val1)
   222  
   223  	val2 := teststaking.NewValidator(t, addrVal2, pk2)
   224  	app.StakingKeeper.SetValidator(ctx, val2)
   225  	app.StakingKeeper.SetValidatorByPowerIndex(ctx, val2)
   226  
   227  	delTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 20)
   228  	_, err := app.StakingKeeper.Delegate(ctx, addrAcc2, delTokens, types.Unbonded, val1, true)
   229  	require.NoError(t, err)
   230  
   231  	// apply TM updates
   232  	applyValidatorSetUpdates(t, ctx, app.StakingKeeper, -1)
   233  
   234  	// Query Delegator bonded validators
   235  	queryParams := types.NewQueryDelegatorParams(addrAcc2)
   236  	bz, errRes := cdc.MarshalJSON(queryParams)
   237  	require.NoError(t, errRes)
   238  
   239  	query := abci.RequestQuery{
   240  		Path: "/custom/staking/delegatorValidators",
   241  		Data: bz,
   242  	}
   243  
   244  	delValidators := app.StakingKeeper.GetDelegatorValidators(ctx, addrAcc2, params.MaxValidators)
   245  
   246  	res, err := querier(ctx, []string{types.QueryDelegatorValidators}, query)
   247  	require.NoError(t, err)
   248  
   249  	var validatorsResp types.Validators
   250  	errRes = cdc.UnmarshalJSON(res, &validatorsResp)
   251  	require.NoError(t, errRes)
   252  
   253  	require.Equal(t, len(delValidators), len(validatorsResp))
   254  	require.ElementsMatch(t, delValidators, validatorsResp)
   255  
   256  	// error unknown request
   257  	query.Data = bz[:len(bz)-1]
   258  
   259  	_, err = querier(ctx, []string{types.QueryDelegatorValidators}, query)
   260  	require.Error(t, err)
   261  
   262  	// Query bonded validator
   263  	queryBondParams := types.QueryDelegatorValidatorRequest{DelegatorAddr: addrAcc2.String(), ValidatorAddr: addrVal1.String()}
   264  	bz, errRes = cdc.MarshalJSON(queryBondParams)
   265  	require.NoError(t, errRes)
   266  
   267  	query = abci.RequestQuery{
   268  		Path: "/custom/staking/delegatorValidator",
   269  		Data: bz,
   270  	}
   271  
   272  	res, err = querier(ctx, []string{types.QueryDelegatorValidator}, query)
   273  	require.NoError(t, err)
   274  
   275  	var validator types.Validator
   276  	errRes = cdc.UnmarshalJSON(res, &validator)
   277  	require.NoError(t, errRes)
   278  	require.True(t, validator.Equal(&delValidators[0]))
   279  
   280  	// error unknown request
   281  	query.Data = bz[:len(bz)-1]
   282  
   283  	_, err = querier(ctx, []string{types.QueryDelegatorValidator}, query)
   284  	require.Error(t, err)
   285  
   286  	// Query delegation
   287  
   288  	query = abci.RequestQuery{
   289  		Path: "/custom/staking/delegation",
   290  		Data: bz,
   291  	}
   292  
   293  	delegation, found := app.StakingKeeper.GetDelegation(ctx, addrAcc2, addrVal1)
   294  	require.True(t, found)
   295  
   296  	res, err = querier(ctx, []string{types.QueryDelegation}, query)
   297  	require.NoError(t, err)
   298  
   299  	var delegationRes types.DelegationResponse
   300  	errRes = cdc.UnmarshalJSON(res, &delegationRes)
   301  	require.NoError(t, errRes)
   302  
   303  	require.Equal(t, delegation.ValidatorAddress, delegationRes.Delegation.ValidatorAddress)
   304  	require.Equal(t, delegation.DelegatorAddress, delegationRes.Delegation.DelegatorAddress)
   305  	require.Equal(t, sdk.NewCoin(sdk.DefaultBondDenom, delegation.Shares.TruncateInt()), delegationRes.Balance)
   306  
   307  	// Query Delegator Delegations
   308  	query = abci.RequestQuery{
   309  		Path: "/custom/staking/delegatorDelegations",
   310  		Data: bz,
   311  	}
   312  
   313  	res, err = querier(ctx, []string{types.QueryDelegatorDelegations}, query)
   314  	require.NoError(t, err)
   315  
   316  	var delegatorDelegations types.DelegationResponses
   317  	errRes = cdc.UnmarshalJSON(res, &delegatorDelegations)
   318  	require.NoError(t, errRes)
   319  	require.Len(t, delegatorDelegations, 1)
   320  	require.Equal(t, delegation.ValidatorAddress, delegatorDelegations[0].Delegation.ValidatorAddress)
   321  	require.Equal(t, delegation.DelegatorAddress, delegatorDelegations[0].Delegation.DelegatorAddress)
   322  	require.Equal(t, sdk.NewCoin(sdk.DefaultBondDenom, delegation.Shares.TruncateInt()), delegatorDelegations[0].Balance)
   323  
   324  	// error unknown request
   325  	query.Data = bz[:len(bz)-1]
   326  
   327  	_, err = querier(ctx, []string{types.QueryDelegation}, query)
   328  	require.Error(t, err)
   329  
   330  	// Query validator delegations
   331  	bz, errRes = cdc.MarshalJSON(types.NewQueryValidatorParams(addrVal1, 1, 100))
   332  	require.NoError(t, errRes)
   333  
   334  	query = abci.RequestQuery{
   335  		Path: "custom/staking/validatorDelegations",
   336  		Data: bz,
   337  	}
   338  
   339  	res, err = querier(ctx, []string{types.QueryValidatorDelegations}, query)
   340  	require.NoError(t, err)
   341  
   342  	var delegationsRes types.DelegationResponses
   343  	errRes = cdc.UnmarshalJSON(res, &delegationsRes)
   344  	require.NoError(t, errRes)
   345  	require.Len(t, delegatorDelegations, 1)
   346  	require.Equal(t, delegation.ValidatorAddress, delegationsRes[0].Delegation.ValidatorAddress)
   347  	require.Equal(t, delegation.DelegatorAddress, delegationsRes[0].Delegation.DelegatorAddress)
   348  	require.Equal(t, sdk.NewCoin(sdk.DefaultBondDenom, delegation.Shares.TruncateInt()), delegationsRes[0].Balance)
   349  
   350  	// Query unbonding delegation
   351  	unbondingTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 10)
   352  	_, err = app.StakingKeeper.Undelegate(ctx, addrAcc2, val1.GetOperator(), unbondingTokens.ToDec())
   353  	require.NoError(t, err)
   354  
   355  	queryBondParams = types.QueryDelegatorValidatorRequest{DelegatorAddr: addrAcc2.String(), ValidatorAddr: addrVal1.String()}
   356  	bz, errRes = cdc.MarshalJSON(queryBondParams)
   357  	require.NoError(t, errRes)
   358  
   359  	query = abci.RequestQuery{
   360  		Path: "/custom/staking/unbondingDelegation",
   361  		Data: bz,
   362  	}
   363  
   364  	unbond, found := app.StakingKeeper.GetUnbondingDelegation(ctx, addrAcc2, addrVal1)
   365  	require.True(t, found)
   366  
   367  	res, err = querier(ctx, []string{types.QueryUnbondingDelegation}, query)
   368  	require.NoError(t, err)
   369  
   370  	var unbondRes types.UnbondingDelegation
   371  	errRes = cdc.UnmarshalJSON(res, &unbondRes)
   372  	require.NoError(t, errRes)
   373  
   374  	require.Equal(t, unbond, unbondRes)
   375  
   376  	// error unknown request
   377  	query.Data = bz[:len(bz)-1]
   378  
   379  	_, err = querier(ctx, []string{types.QueryUnbondingDelegation}, query)
   380  	require.Error(t, err)
   381  
   382  	// Query Delegator Unbonding Delegations
   383  
   384  	query = abci.RequestQuery{
   385  		Path: "/custom/staking/delegatorUnbondingDelegations",
   386  		Data: bz,
   387  	}
   388  
   389  	res, err = querier(ctx, []string{types.QueryDelegatorUnbondingDelegations}, query)
   390  	require.NoError(t, err)
   391  
   392  	var delegatorUbds []types.UnbondingDelegation
   393  	errRes = cdc.UnmarshalJSON(res, &delegatorUbds)
   394  	require.NoError(t, errRes)
   395  	require.Equal(t, unbond, delegatorUbds[0])
   396  
   397  	// error unknown request
   398  	query.Data = bz[:len(bz)-1]
   399  
   400  	_, err = querier(ctx, []string{types.QueryDelegatorUnbondingDelegations}, query)
   401  	require.Error(t, err)
   402  
   403  	// Query redelegation
   404  	redelegationTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 10)
   405  	_, err = app.StakingKeeper.BeginRedelegation(ctx, addrAcc2, val1.GetOperator(),
   406  		val2.GetOperator(), redelegationTokens.ToDec())
   407  	require.NoError(t, err)
   408  	redel, found := app.StakingKeeper.GetRedelegation(ctx, addrAcc2, val1.GetOperator(), val2.GetOperator())
   409  	require.True(t, found)
   410  
   411  	bz, errRes = cdc.MarshalJSON(types.NewQueryRedelegationParams(addrAcc2, val1.GetOperator(), val2.GetOperator()))
   412  	require.NoError(t, errRes)
   413  
   414  	query = abci.RequestQuery{
   415  		Path: "/custom/staking/redelegations",
   416  		Data: bz,
   417  	}
   418  
   419  	res, err = querier(ctx, []string{types.QueryRedelegations}, query)
   420  	require.NoError(t, err)
   421  
   422  	var redelRes types.RedelegationResponses
   423  	errRes = cdc.UnmarshalJSON(res, &redelRes)
   424  	require.NoError(t, errRes)
   425  	require.Len(t, redelRes, 1)
   426  	require.Equal(t, redel.DelegatorAddress, redelRes[0].Redelegation.DelegatorAddress)
   427  	require.Equal(t, redel.ValidatorSrcAddress, redelRes[0].Redelegation.ValidatorSrcAddress)
   428  	require.Equal(t, redel.ValidatorDstAddress, redelRes[0].Redelegation.ValidatorDstAddress)
   429  	require.Len(t, redel.Entries, len(redelRes[0].Entries))
   430  }
   431  
   432  func TestQueryValidatorDelegations_Pagination(t *testing.T) {
   433  	cases := []struct {
   434  		page            int
   435  		limit           int
   436  		expectedResults int
   437  	}{
   438  		{
   439  			page:            1,
   440  			limit:           75,
   441  			expectedResults: 75,
   442  		},
   443  		{
   444  			page:            2,
   445  			limit:           75,
   446  			expectedResults: 25,
   447  		},
   448  		{
   449  			page:            1,
   450  			limit:           100,
   451  			expectedResults: 100,
   452  		},
   453  	}
   454  
   455  	cdc, app, ctx := createTestInput()
   456  	legacyQuerierCdc := codec.NewAminoCodec(app.LegacyAmino())
   457  	querier := keeper.NewQuerier(app.StakingKeeper, legacyQuerierCdc.LegacyAmino)
   458  
   459  	addrs := simapp.AddTestAddrs(app, ctx, 100, app.StakingKeeper.TokensFromConsensusPower(ctx, 10000))
   460  	pubKeys := simapp.CreateTestPubKeys(1)
   461  
   462  	valAddress := sdk.ValAddress(addrs[0])
   463  
   464  	val1 := teststaking.NewValidator(t, valAddress, pubKeys[0])
   465  	app.StakingKeeper.SetValidator(ctx, val1)
   466  	app.StakingKeeper.SetValidatorByPowerIndex(ctx, val1)
   467  
   468  	// Create Validators and Delegation
   469  	for _, addr := range addrs {
   470  		validator, found := app.StakingKeeper.GetValidator(ctx, valAddress)
   471  		if !found {
   472  			t.Error("expected validator not found")
   473  		}
   474  
   475  		delTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 20)
   476  		_, err := app.StakingKeeper.Delegate(ctx, addr, delTokens, types.Unbonded, validator, true)
   477  		require.NoError(t, err)
   478  	}
   479  
   480  	// apply TM updates
   481  	applyValidatorSetUpdates(t, ctx, app.StakingKeeper, -1)
   482  
   483  	for _, c := range cases {
   484  		// Query Delegator bonded validators
   485  		queryParams := types.NewQueryDelegatorParams(addrs[0])
   486  		bz, errRes := cdc.MarshalJSON(queryParams)
   487  		require.NoError(t, errRes)
   488  
   489  		// Query valAddress delegations
   490  		bz, errRes = cdc.MarshalJSON(types.NewQueryValidatorParams(valAddress, c.page, c.limit))
   491  		require.NoError(t, errRes)
   492  
   493  		query := abci.RequestQuery{
   494  			Path: "custom/staking/validatorDelegations",
   495  			Data: bz,
   496  		}
   497  
   498  		res, err := querier(ctx, []string{types.QueryValidatorDelegations}, query)
   499  		require.NoError(t, err)
   500  
   501  		var delegationsRes types.DelegationResponses
   502  		errRes = cdc.UnmarshalJSON(res, &delegationsRes)
   503  		require.NoError(t, errRes)
   504  		require.Len(t, delegationsRes, c.expectedResults)
   505  	}
   506  
   507  	// Undelegate
   508  	for _, addr := range addrs {
   509  		delTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 20)
   510  		_, err := app.StakingKeeper.Undelegate(ctx, addr, val1.GetOperator(), delTokens.ToDec())
   511  		require.NoError(t, err)
   512  	}
   513  
   514  	// apply TM updates
   515  	applyValidatorSetUpdates(t, ctx, app.StakingKeeper, -1)
   516  
   517  	for _, c := range cases {
   518  		// Query Unbonding delegations with pagination.
   519  		queryParams := types.NewQueryDelegatorParams(addrs[0])
   520  		bz, errRes := cdc.MarshalJSON(queryParams)
   521  		require.NoError(t, errRes)
   522  
   523  		bz, errRes = cdc.MarshalJSON(types.NewQueryValidatorParams(valAddress, c.page, c.limit))
   524  		require.NoError(t, errRes)
   525  		query := abci.RequestQuery{
   526  			Data: bz,
   527  		}
   528  
   529  		unbondingDelegations := types.UnbondingDelegations{}
   530  		res, err := querier(ctx, []string{types.QueryValidatorUnbondingDelegations}, query)
   531  		require.NoError(t, err)
   532  
   533  		errRes = cdc.UnmarshalJSON(res, &unbondingDelegations)
   534  		require.NoError(t, errRes)
   535  		require.Len(t, unbondingDelegations, c.expectedResults)
   536  	}
   537  }
   538  
   539  func TestQueryRedelegations(t *testing.T) {
   540  	cdc, app, ctx := createTestInput()
   541  	legacyQuerierCdc := codec.NewAminoCodec(app.LegacyAmino())
   542  	querier := keeper.NewQuerier(app.StakingKeeper, legacyQuerierCdc.LegacyAmino)
   543  
   544  	addrs := simapp.AddTestAddrs(app, ctx, 2, app.StakingKeeper.TokensFromConsensusPower(ctx, 10000))
   545  	addrAcc1, addrAcc2 := addrs[0], addrs[1]
   546  	addrVal1, addrVal2 := sdk.ValAddress(addrAcc1), sdk.ValAddress(addrAcc2)
   547  
   548  	// Create Validators and Delegation
   549  	val1 := teststaking.NewValidator(t, addrVal1, PKs[0])
   550  	val2 := teststaking.NewValidator(t, addrVal2, PKs[1])
   551  	app.StakingKeeper.SetValidator(ctx, val1)
   552  	app.StakingKeeper.SetValidator(ctx, val2)
   553  
   554  	delAmount := app.StakingKeeper.TokensFromConsensusPower(ctx, 100)
   555  	_, err := app.StakingKeeper.Delegate(ctx, addrAcc2, delAmount, types.Unbonded, val1, true)
   556  	require.NoError(t, err)
   557  	applyValidatorSetUpdates(t, ctx, app.StakingKeeper, -1)
   558  
   559  	rdAmount := app.StakingKeeper.TokensFromConsensusPower(ctx, 20)
   560  	_, err = app.StakingKeeper.BeginRedelegation(ctx, addrAcc2, val1.GetOperator(), val2.GetOperator(), rdAmount.ToDec())
   561  	require.NoError(t, err)
   562  	applyValidatorSetUpdates(t, ctx, app.StakingKeeper, -1)
   563  
   564  	redel, found := app.StakingKeeper.GetRedelegation(ctx, addrAcc2, val1.GetOperator(), val2.GetOperator())
   565  	require.True(t, found)
   566  
   567  	// delegator redelegations
   568  	queryDelegatorParams := types.NewQueryDelegatorParams(addrAcc2)
   569  	bz, errRes := cdc.MarshalJSON(queryDelegatorParams)
   570  	require.NoError(t, errRes)
   571  
   572  	query := abci.RequestQuery{
   573  		Path: "/custom/staking/redelegations",
   574  		Data: bz,
   575  	}
   576  
   577  	res, err := querier(ctx, []string{types.QueryRedelegations}, query)
   578  	require.NoError(t, err)
   579  
   580  	var redelRes types.RedelegationResponses
   581  	errRes = cdc.UnmarshalJSON(res, &redelRes)
   582  	require.NoError(t, errRes)
   583  	require.Len(t, redelRes, 1)
   584  	require.Equal(t, redel.DelegatorAddress, redelRes[0].Redelegation.DelegatorAddress)
   585  	require.Equal(t, redel.ValidatorSrcAddress, redelRes[0].Redelegation.ValidatorSrcAddress)
   586  	require.Equal(t, redel.ValidatorDstAddress, redelRes[0].Redelegation.ValidatorDstAddress)
   587  	require.Len(t, redel.Entries, len(redelRes[0].Entries))
   588  
   589  	// validator redelegations
   590  	queryValidatorParams := types.NewQueryValidatorParams(val1.GetOperator(), 0, 0)
   591  	bz, errRes = cdc.MarshalJSON(queryValidatorParams)
   592  	require.NoError(t, errRes)
   593  
   594  	query = abci.RequestQuery{
   595  		Path: "/custom/staking/redelegations",
   596  		Data: bz,
   597  	}
   598  
   599  	res, err = querier(ctx, []string{types.QueryRedelegations}, query)
   600  	require.NoError(t, err)
   601  
   602  	errRes = cdc.UnmarshalJSON(res, &redelRes)
   603  	require.NoError(t, errRes)
   604  	require.Len(t, redelRes, 1)
   605  	require.Equal(t, redel.DelegatorAddress, redelRes[0].Redelegation.DelegatorAddress)
   606  	require.Equal(t, redel.ValidatorSrcAddress, redelRes[0].Redelegation.ValidatorSrcAddress)
   607  	require.Equal(t, redel.ValidatorDstAddress, redelRes[0].Redelegation.ValidatorDstAddress)
   608  	require.Len(t, redel.Entries, len(redelRes[0].Entries))
   609  }
   610  
   611  func TestQueryUnbondingDelegation(t *testing.T) {
   612  	cdc, app, ctx := createTestInput()
   613  	legacyQuerierCdc := codec.NewAminoCodec(app.LegacyAmino())
   614  	querier := keeper.NewQuerier(app.StakingKeeper, legacyQuerierCdc.LegacyAmino)
   615  
   616  	addrs := simapp.AddTestAddrs(app, ctx, 2, app.StakingKeeper.TokensFromConsensusPower(ctx, 10000))
   617  	addrAcc1, addrAcc2 := addrs[0], addrs[1]
   618  	addrVal1 := sdk.ValAddress(addrAcc1)
   619  
   620  	// Create Validators and Delegation
   621  	val1 := teststaking.NewValidator(t, addrVal1, PKs[0])
   622  	app.StakingKeeper.SetValidator(ctx, val1)
   623  
   624  	// delegate
   625  	delAmount := app.StakingKeeper.TokensFromConsensusPower(ctx, 100)
   626  	_, err := app.StakingKeeper.Delegate(ctx, addrAcc1, delAmount, types.Unbonded, val1, true)
   627  	require.NoError(t, err)
   628  	applyValidatorSetUpdates(t, ctx, app.StakingKeeper, -1)
   629  
   630  	// undelegate
   631  	undelAmount := app.StakingKeeper.TokensFromConsensusPower(ctx, 20)
   632  	_, err = app.StakingKeeper.Undelegate(ctx, addrAcc1, val1.GetOperator(), undelAmount.ToDec())
   633  	require.NoError(t, err)
   634  	applyValidatorSetUpdates(t, ctx, app.StakingKeeper, -1)
   635  
   636  	_, found := app.StakingKeeper.GetUnbondingDelegation(ctx, addrAcc1, val1.GetOperator())
   637  	require.True(t, found)
   638  
   639  	//
   640  	// found: query unbonding delegation by delegator and validator
   641  	//
   642  	queryValidatorParams := types.QueryDelegatorValidatorRequest{DelegatorAddr: addrAcc1.String(), ValidatorAddr: val1.GetOperator().String()}
   643  	bz, errRes := cdc.MarshalJSON(queryValidatorParams)
   644  	require.NoError(t, errRes)
   645  	query := abci.RequestQuery{
   646  		Path: "/custom/staking/unbondingDelegation",
   647  		Data: bz,
   648  	}
   649  	res, err := querier(ctx, []string{types.QueryUnbondingDelegation}, query)
   650  	require.NoError(t, err)
   651  	require.NotNil(t, res)
   652  	var ubDel types.UnbondingDelegation
   653  	require.NoError(t, cdc.UnmarshalJSON(res, &ubDel))
   654  	require.Equal(t, addrAcc1.String(), ubDel.DelegatorAddress)
   655  	require.Equal(t, val1.OperatorAddress, ubDel.ValidatorAddress)
   656  	require.Equal(t, 1, len(ubDel.Entries))
   657  
   658  	//
   659  	// not found: query unbonding delegation by delegator and validator
   660  	//
   661  	queryValidatorParams = types.QueryDelegatorValidatorRequest{DelegatorAddr: addrAcc2.String(), ValidatorAddr: val1.GetOperator().String()}
   662  	bz, errRes = cdc.MarshalJSON(queryValidatorParams)
   663  	require.NoError(t, errRes)
   664  	query = abci.RequestQuery{
   665  		Path: "/custom/staking/unbondingDelegation",
   666  		Data: bz,
   667  	}
   668  	_, err = querier(ctx, []string{types.QueryUnbondingDelegation}, query)
   669  	require.Error(t, err)
   670  
   671  	//
   672  	// found: query unbonding delegation by delegator and validator
   673  	//
   674  	queryDelegatorParams := types.NewQueryDelegatorParams(addrAcc1)
   675  	bz, errRes = cdc.MarshalJSON(queryDelegatorParams)
   676  	require.NoError(t, errRes)
   677  	query = abci.RequestQuery{
   678  		Path: "/custom/staking/delegatorUnbondingDelegations",
   679  		Data: bz,
   680  	}
   681  	res, err = querier(ctx, []string{types.QueryDelegatorUnbondingDelegations}, query)
   682  	require.NoError(t, err)
   683  	require.NotNil(t, res)
   684  	var ubDels []types.UnbondingDelegation
   685  	require.NoError(t, cdc.UnmarshalJSON(res, &ubDels))
   686  	require.Equal(t, 1, len(ubDels))
   687  	require.Equal(t, addrAcc1.String(), ubDels[0].DelegatorAddress)
   688  	require.Equal(t, val1.OperatorAddress, ubDels[0].ValidatorAddress)
   689  
   690  	//
   691  	// not found: query unbonding delegation by delegator and validator
   692  	//
   693  	queryDelegatorParams = types.NewQueryDelegatorParams(addrAcc2)
   694  	bz, errRes = cdc.MarshalJSON(queryDelegatorParams)
   695  	require.NoError(t, errRes)
   696  	query = abci.RequestQuery{
   697  		Path: "/custom/staking/delegatorUnbondingDelegations",
   698  		Data: bz,
   699  	}
   700  	res, err = querier(ctx, []string{types.QueryDelegatorUnbondingDelegations}, query)
   701  	require.NoError(t, err)
   702  	require.NotNil(t, res)
   703  	require.NoError(t, cdc.UnmarshalJSON(res, &ubDels))
   704  	require.Equal(t, 0, len(ubDels))
   705  }
   706  
   707  func TestQueryHistoricalInfo(t *testing.T) {
   708  	cdc, app, ctx := createTestInput()
   709  	legacyQuerierCdc := codec.NewAminoCodec(cdc)
   710  	querier := keeper.NewQuerier(app.StakingKeeper, legacyQuerierCdc.LegacyAmino)
   711  
   712  	addrs := simapp.AddTestAddrs(app, ctx, 2, app.StakingKeeper.TokensFromConsensusPower(ctx, 10000))
   713  	addrAcc1, addrAcc2 := addrs[0], addrs[1]
   714  	addrVal1, addrVal2 := sdk.ValAddress(addrAcc1), sdk.ValAddress(addrAcc2)
   715  
   716  	// Create Validators and Delegation
   717  	val1 := teststaking.NewValidator(t, addrVal1, PKs[0])
   718  	val2 := teststaking.NewValidator(t, addrVal2, PKs[1])
   719  	vals := []types.Validator{val1, val2}
   720  	app.StakingKeeper.SetValidator(ctx, val1)
   721  	app.StakingKeeper.SetValidator(ctx, val2)
   722  
   723  	header := tmproto.Header{
   724  		ChainID: "HelloChain",
   725  		Height:  5,
   726  	}
   727  	hi := types.NewHistoricalInfo(header, vals, app.StakingKeeper.PowerReduction(ctx))
   728  	app.StakingKeeper.SetHistoricalInfo(ctx, 5, &hi)
   729  
   730  	queryHistoricalParams := types.QueryHistoricalInfoRequest{Height: 4}
   731  	bz, errRes := cdc.MarshalJSON(queryHistoricalParams)
   732  	require.NoError(t, errRes)
   733  	query := abci.RequestQuery{
   734  		Path: "/custom/staking/historicalInfo",
   735  		Data: bz,
   736  	}
   737  	res, err := querier(ctx, []string{types.QueryHistoricalInfo}, query)
   738  	require.Error(t, err, "Invalid query passed")
   739  	require.Nil(t, res, "Invalid query returned non-nil result")
   740  
   741  	queryHistoricalParams = types.QueryHistoricalInfoRequest{Height: 5}
   742  	bz, errRes = cdc.MarshalJSON(queryHistoricalParams)
   743  	require.NoError(t, errRes)
   744  	query.Data = bz
   745  	res, err = querier(ctx, []string{types.QueryHistoricalInfo}, query)
   746  	require.NoError(t, err, "Valid query passed")
   747  	require.NotNil(t, res, "Valid query returned nil result")
   748  
   749  	var recv types.HistoricalInfo
   750  	require.NoError(t, cdc.UnmarshalJSON(res, &recv))
   751  	require.Equal(t, hi, recv, "HistoricalInfo query returned wrong result")
   752  }