github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/libs/cosmos-sdk/x/staking/keeper/querier_test.go (about)

     1  package keeper
     2  
     3  import (
     4  	"fmt"
     5  	"testing"
     6  
     7  	abci "github.com/fibonacci-chain/fbc/libs/tendermint/abci/types"
     8  	"github.com/stretchr/testify/require"
     9  
    10  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/codec"
    11  	sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types"
    12  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/staking/types"
    13  )
    14  
    15  var (
    16  	addrAcc1, addrAcc2 = Addrs[0], Addrs[1]
    17  	addrVal1, addrVal2 = sdk.ValAddress(Addrs[0]), sdk.ValAddress(Addrs[1])
    18  	pk1, pk2           = PKs[0], PKs[1]
    19  )
    20  
    21  func TestNewQuerier(t *testing.T) {
    22  	cdc := codec.New()
    23  	ctx, _, keeper, _ := CreateTestInput(t, false, 1000)
    24  	// Create Validators
    25  	amts := []sdk.Int{sdk.NewInt(9), sdk.NewInt(8)}
    26  	var validators [2]types.Validator
    27  	for i, amt := range amts {
    28  		validators[i] = types.NewValidator(sdk.ValAddress(Addrs[i]), PKs[i], types.Description{})
    29  		validators[i], _ = validators[i].AddTokensFromDel(amt)
    30  		keeper.SetValidator(ctx, validators[i])
    31  		keeper.SetValidatorByPowerIndex(ctx, validators[i])
    32  	}
    33  
    34  	header := abci.Header{
    35  		ChainID: "HelloChain",
    36  		Height:  5,
    37  	}
    38  	hi := types.NewHistoricalInfo(header, validators[:])
    39  	keeper.SetHistoricalInfo(ctx, 5, hi)
    40  
    41  	query := abci.RequestQuery{
    42  		Path: "",
    43  		Data: []byte{},
    44  	}
    45  
    46  	querier := NewQuerier(keeper)
    47  
    48  	bz, err := querier(ctx, []string{"other"}, query)
    49  	require.Error(t, err)
    50  	require.Nil(t, bz)
    51  
    52  	_, err = querier(ctx, []string{"pool"}, query)
    53  	require.NoError(t, err)
    54  
    55  	_, err = querier(ctx, []string{"parameters"}, query)
    56  	require.NoError(t, err)
    57  
    58  	queryValParams := types.NewQueryValidatorParams(addrVal1)
    59  	bz, errRes := cdc.MarshalJSON(queryValParams)
    60  	require.NoError(t, errRes)
    61  
    62  	query.Path = "/custom/staking/validator"
    63  	query.Data = bz
    64  
    65  	_, err = querier(ctx, []string{"validator"}, query)
    66  	require.NoError(t, err)
    67  
    68  	_, err = querier(ctx, []string{"validatorDelegations"}, query)
    69  	require.NoError(t, err)
    70  
    71  	_, err = querier(ctx, []string{"validatorUnbondingDelegations"}, query)
    72  	require.NoError(t, err)
    73  
    74  	queryDelParams := types.NewQueryDelegatorParams(addrAcc2)
    75  	bz, errRes = cdc.MarshalJSON(queryDelParams)
    76  	require.NoError(t, errRes)
    77  
    78  	query.Path = "/custom/staking/validator"
    79  	query.Data = bz
    80  
    81  	_, err = querier(ctx, []string{"delegatorDelegations"}, query)
    82  	require.NoError(t, err)
    83  
    84  	_, err = querier(ctx, []string{"delegatorUnbondingDelegations"}, query)
    85  	require.NoError(t, err)
    86  
    87  	_, err = querier(ctx, []string{"delegatorValidators"}, query)
    88  	require.NoError(t, err)
    89  
    90  	bz, errRes = cdc.MarshalJSON(types.NewQueryRedelegationParams(nil, nil, nil))
    91  	require.NoError(t, errRes)
    92  	query.Data = bz
    93  
    94  	_, err = querier(ctx, []string{"redelegations"}, query)
    95  	require.NoError(t, err)
    96  
    97  	queryHisParams := types.NewQueryHistoricalInfoParams(5)
    98  	bz, errRes = cdc.MarshalJSON(queryHisParams)
    99  	require.NoError(t, errRes)
   100  
   101  	query.Path = "/custom/staking/historicalInfo"
   102  	query.Data = bz
   103  
   104  	_, err = querier(ctx, []string{"historicalInfo"}, query)
   105  	require.NoError(t, err)
   106  }
   107  
   108  func TestQueryParametersPool(t *testing.T) {
   109  	cdc := codec.New()
   110  	ctx, _, keeper, _ := CreateTestInput(t, false, 1000)
   111  	bondDenom := sdk.DefaultBondDenom
   112  
   113  	res, err := queryParameters(ctx, keeper)
   114  	require.NoError(t, err)
   115  
   116  	var params types.Params
   117  	errRes := cdc.UnmarshalJSON(res, &params)
   118  	require.NoError(t, errRes)
   119  	require.Equal(t, keeper.GetParams(ctx), params)
   120  
   121  	res, err = queryPool(ctx, keeper)
   122  	require.NoError(t, err)
   123  
   124  	var pool types.Pool
   125  	bondedPool := keeper.GetBondedPool(ctx)
   126  	notBondedPool := keeper.GetNotBondedPool(ctx)
   127  	errRes = cdc.UnmarshalJSON(res, &pool)
   128  	require.NoError(t, errRes)
   129  	require.Equal(t, bondedPool.GetCoins().AmountOf(bondDenom), pool.BondedTokens.ToDec())
   130  	require.Equal(t, notBondedPool.GetCoins().AmountOf(bondDenom), pool.NotBondedTokens.ToDec())
   131  }
   132  
   133  func TestQueryValidators(t *testing.T) {
   134  	cdc := codec.New()
   135  	ctx, _, keeper, _ := CreateTestInput(t, false, 10000)
   136  	params := keeper.GetParams(ctx)
   137  
   138  	// Create Validators
   139  	amts := []sdk.Int{sdk.NewInt(9), sdk.NewInt(8), sdk.NewInt(7)}
   140  	status := []sdk.BondStatus{sdk.Bonded, sdk.Unbonded, sdk.Unbonding}
   141  	var validators [3]types.Validator
   142  	for i, amt := range amts {
   143  		validators[i] = types.NewValidator(sdk.ValAddress(Addrs[i]), PKs[i], types.Description{})
   144  		validators[i], _ = validators[i].AddTokensFromDel(amt)
   145  		validators[i] = validators[i].UpdateStatus(status[i])
   146  	}
   147  
   148  	keeper.SetValidator(ctx, validators[0])
   149  	keeper.SetValidator(ctx, validators[1])
   150  	keeper.SetValidator(ctx, validators[2])
   151  
   152  	// Query Validators
   153  	queriedValidators := keeper.GetValidators(ctx, params.MaxValidators)
   154  
   155  	for i, s := range status {
   156  		queryValsParams := types.NewQueryValidatorsParams(1, int(params.MaxValidators), s.String())
   157  		bz, err := cdc.MarshalJSON(queryValsParams)
   158  		require.NoError(t, err)
   159  
   160  		req := abci.RequestQuery{
   161  			Path: fmt.Sprintf("/custom/%s/%s", types.QuerierRoute, types.QueryValidators),
   162  			Data: bz,
   163  		}
   164  
   165  		res, err := queryValidators(ctx, req, keeper)
   166  		require.NoError(t, err)
   167  
   168  		var validatorsResp []types.Validator
   169  		err = cdc.UnmarshalJSON(res, &validatorsResp)
   170  		require.NoError(t, err)
   171  
   172  		require.Equal(t, 1, len(validatorsResp))
   173  		require.ElementsMatch(t, validators[i].OperatorAddress, validatorsResp[0].OperatorAddress)
   174  
   175  	}
   176  
   177  	// Query each validator
   178  	queryParams := types.NewQueryValidatorParams(addrVal1)
   179  	bz, err := cdc.MarshalJSON(queryParams)
   180  	require.NoError(t, err)
   181  
   182  	query := abci.RequestQuery{
   183  		Path: "/custom/staking/validator",
   184  		Data: bz,
   185  	}
   186  	res, err := queryValidator(ctx, query, keeper)
   187  	require.NoError(t, err)
   188  
   189  	var validator types.Validator
   190  	err = cdc.UnmarshalJSON(res, &validator)
   191  	require.NoError(t, err)
   192  
   193  	require.Equal(t, queriedValidators[0], validator)
   194  }
   195  
   196  func TestQueryDelegation(t *testing.T) {
   197  	cdc := codec.New()
   198  	ctx, _, keeper, _ := CreateTestInput(t, false, 10000)
   199  	params := keeper.GetParams(ctx)
   200  
   201  	// Create Validators and Delegation
   202  	val1 := types.NewValidator(addrVal1, pk1, types.Description{})
   203  	keeper.SetValidator(ctx, val1)
   204  	keeper.SetValidatorByPowerIndex(ctx, val1)
   205  
   206  	val2 := types.NewValidator(addrVal2, pk2, types.Description{})
   207  	keeper.SetValidator(ctx, val2)
   208  	keeper.SetValidatorByPowerIndex(ctx, val2)
   209  
   210  	delTokens := sdk.TokensFromConsensusPower(20)
   211  	keeper.Delegate(ctx, addrAcc2, delTokens.ToDec(), sdk.Unbonded, val1, true)
   212  
   213  	// apply TM updates
   214  	keeper.ApplyAndReturnValidatorSetUpdates(ctx)
   215  
   216  	// Query Delegator bonded validators
   217  	queryParams := types.NewQueryDelegatorParams(addrAcc2)
   218  	bz, errRes := cdc.MarshalJSON(queryParams)
   219  	require.NoError(t, errRes)
   220  
   221  	query := abci.RequestQuery{
   222  		Path: "/custom/staking/delegatorValidators",
   223  		Data: bz,
   224  	}
   225  
   226  	delValidators := keeper.GetDelegatorValidators(ctx, addrAcc2, params.MaxValidators)
   227  
   228  	res, err := queryDelegatorValidators(ctx, query, keeper)
   229  	require.NoError(t, err)
   230  
   231  	var validatorsResp []types.Validator
   232  	errRes = cdc.UnmarshalJSON(res, &validatorsResp)
   233  	require.NoError(t, errRes)
   234  
   235  	require.Equal(t, len(delValidators), len(validatorsResp))
   236  	require.ElementsMatch(t, delValidators, validatorsResp)
   237  
   238  	// error unknown request
   239  	query.Data = bz[:len(bz)-1]
   240  
   241  	_, err = queryDelegatorValidators(ctx, query, keeper)
   242  	require.Error(t, err)
   243  
   244  	// Query bonded validator
   245  	queryBondParams := types.NewQueryBondsParams(addrAcc2, addrVal1)
   246  	bz, errRes = cdc.MarshalJSON(queryBondParams)
   247  	require.NoError(t, errRes)
   248  
   249  	query = abci.RequestQuery{
   250  		Path: "/custom/staking/delegatorValidator",
   251  		Data: bz,
   252  	}
   253  
   254  	res, err = queryDelegatorValidator(ctx, query, keeper)
   255  	require.NoError(t, err)
   256  
   257  	var validator types.Validator
   258  	errRes = cdc.UnmarshalJSON(res, &validator)
   259  	require.NoError(t, errRes)
   260  
   261  	require.Equal(t, delValidators[0], validator)
   262  
   263  	// error unknown request
   264  	query.Data = bz[:len(bz)-1]
   265  
   266  	_, err = queryDelegatorValidator(ctx, query, keeper)
   267  	require.Error(t, err)
   268  
   269  	// Query delegation
   270  
   271  	query = abci.RequestQuery{
   272  		Path: "/custom/staking/delegation",
   273  		Data: bz,
   274  	}
   275  
   276  	delegation, found := keeper.GetDelegation(ctx, addrAcc2, addrVal1)
   277  	require.True(t, found)
   278  
   279  	res, err = queryDelegation(ctx, query, keeper)
   280  	require.NoError(t, err)
   281  
   282  	var delegationRes types.DelegationResponse
   283  	errRes = cdc.UnmarshalJSON(res, &delegationRes)
   284  	require.NoError(t, errRes)
   285  
   286  	require.Equal(t, delegation.ValidatorAddress, delegationRes.ValidatorAddress)
   287  	require.Equal(t, delegation.DelegatorAddress, delegationRes.DelegatorAddress)
   288  	require.Equal(t, sdk.NewCoin(sdk.DefaultBondDenom, delegation.Shares.TruncateInt()), delegationRes.Balance)
   289  
   290  	// Query Delegator Delegations
   291  	query = abci.RequestQuery{
   292  		Path: "/custom/staking/delegatorDelegations",
   293  		Data: bz,
   294  	}
   295  
   296  	res, err = queryDelegatorDelegations(ctx, query, keeper)
   297  	require.NoError(t, err)
   298  
   299  	var delegatorDelegations types.DelegationResponses
   300  	errRes = cdc.UnmarshalJSON(res, &delegatorDelegations)
   301  	require.NoError(t, errRes)
   302  	require.Len(t, delegatorDelegations, 1)
   303  	require.Equal(t, delegation.ValidatorAddress, delegatorDelegations[0].ValidatorAddress)
   304  	require.Equal(t, delegation.DelegatorAddress, delegatorDelegations[0].DelegatorAddress)
   305  	require.Equal(t, sdk.NewCoin(sdk.DefaultBondDenom, delegation.Shares.TruncateInt()), delegatorDelegations[0].Balance)
   306  
   307  	// error unknown request
   308  	query.Data = bz[:len(bz)-1]
   309  
   310  	_, err = queryDelegation(ctx, query, keeper)
   311  	require.Error(t, err)
   312  
   313  	// Query validator delegations
   314  
   315  	bz, errRes = cdc.MarshalJSON(types.NewQueryValidatorParams(addrVal1))
   316  	require.NoError(t, errRes)
   317  
   318  	query = abci.RequestQuery{
   319  		Path: "custom/staking/validatorDelegations",
   320  		Data: bz,
   321  	}
   322  
   323  	res, err = queryValidatorDelegations(ctx, query, keeper)
   324  	require.NoError(t, err)
   325  
   326  	var delegationsRes types.DelegationResponses
   327  	errRes = cdc.UnmarshalJSON(res, &delegationsRes)
   328  	require.NoError(t, errRes)
   329  	require.Len(t, delegatorDelegations, 1)
   330  	require.Equal(t, delegation.ValidatorAddress, delegationsRes[0].ValidatorAddress)
   331  	require.Equal(t, delegation.DelegatorAddress, delegationsRes[0].DelegatorAddress)
   332  	require.Equal(t, sdk.NewCoin(sdk.DefaultBondDenom, delegation.Shares.TruncateInt()), delegationsRes[0].Balance)
   333  
   334  	// Query unbonging delegation
   335  	unbondingTokens := sdk.TokensFromConsensusPower(10)
   336  	_, err = keeper.Undelegate(ctx, addrAcc2, val1.OperatorAddress, unbondingTokens.ToDec())
   337  	require.NoError(t, err)
   338  
   339  	queryBondParams = types.NewQueryBondsParams(addrAcc2, addrVal1)
   340  	bz, errRes = cdc.MarshalJSON(queryBondParams)
   341  	require.NoError(t, errRes)
   342  
   343  	query = abci.RequestQuery{
   344  		Path: "/custom/staking/unbondingDelegation",
   345  		Data: bz,
   346  	}
   347  
   348  	unbond, found := keeper.GetUnbondingDelegation(ctx, addrAcc2, addrVal1)
   349  	require.True(t, found)
   350  
   351  	res, err = queryUnbondingDelegation(ctx, query, keeper)
   352  	require.NoError(t, err)
   353  
   354  	var unbondRes types.UnbondingDelegation
   355  	errRes = cdc.UnmarshalJSON(res, &unbondRes)
   356  	require.NoError(t, errRes)
   357  
   358  	require.Equal(t, unbond, unbondRes)
   359  
   360  	// error unknown request
   361  	query.Data = bz[:len(bz)-1]
   362  
   363  	_, err = queryUnbondingDelegation(ctx, query, keeper)
   364  	require.Error(t, err)
   365  
   366  	// Query Delegator Delegations
   367  
   368  	query = abci.RequestQuery{
   369  		Path: "/custom/staking/delegatorUnbondingDelegations",
   370  		Data: bz,
   371  	}
   372  
   373  	res, err = queryDelegatorUnbondingDelegations(ctx, query, keeper)
   374  	require.NoError(t, err)
   375  
   376  	var delegatorUbds []types.UnbondingDelegation
   377  	errRes = cdc.UnmarshalJSON(res, &delegatorUbds)
   378  	require.NoError(t, errRes)
   379  	require.Equal(t, unbond, delegatorUbds[0])
   380  
   381  	// error unknown request
   382  	query.Data = bz[:len(bz)-1]
   383  
   384  	_, err = queryDelegatorUnbondingDelegations(ctx, query, keeper)
   385  	require.Error(t, err)
   386  
   387  	// Query redelegation
   388  	redelegationTokens := sdk.TokensFromConsensusPower(10)
   389  	_, err = keeper.BeginRedelegation(ctx, addrAcc2, val1.OperatorAddress,
   390  		val2.OperatorAddress, redelegationTokens.ToDec())
   391  	require.NoError(t, err)
   392  	redel, found := keeper.GetRedelegation(ctx, addrAcc2, val1.OperatorAddress, val2.OperatorAddress)
   393  	require.True(t, found)
   394  
   395  	bz, errRes = cdc.MarshalJSON(types.NewQueryRedelegationParams(addrAcc2, val1.OperatorAddress, val2.OperatorAddress))
   396  	require.NoError(t, errRes)
   397  
   398  	query = abci.RequestQuery{
   399  		Path: "/custom/staking/redelegations",
   400  		Data: bz,
   401  	}
   402  
   403  	res, err = queryRedelegations(ctx, query, keeper)
   404  	require.NoError(t, err)
   405  
   406  	var redelRes types.RedelegationResponses
   407  	errRes = cdc.UnmarshalJSON(res, &redelRes)
   408  	require.NoError(t, errRes)
   409  	require.Len(t, redelRes, 1)
   410  	require.Equal(t, redel.DelegatorAddress, redelRes[0].DelegatorAddress)
   411  	require.Equal(t, redel.ValidatorSrcAddress, redelRes[0].ValidatorSrcAddress)
   412  	require.Equal(t, redel.ValidatorDstAddress, redelRes[0].ValidatorDstAddress)
   413  	require.Len(t, redel.Entries, len(redelRes[0].Entries))
   414  }
   415  
   416  func TestQueryRedelegations(t *testing.T) {
   417  	cdc := codec.New()
   418  	ctx, _, keeper, _ := CreateTestInput(t, false, 10000)
   419  
   420  	// Create Validators and Delegation
   421  	val1 := types.NewValidator(addrVal1, pk1, types.Description{})
   422  	val2 := types.NewValidator(addrVal2, pk2, types.Description{})
   423  	keeper.SetValidator(ctx, val1)
   424  	keeper.SetValidator(ctx, val2)
   425  
   426  	delAmount := sdk.TokensFromConsensusPower(100)
   427  	keeper.Delegate(ctx, addrAcc2, delAmount.ToDec(), sdk.Unbonded, val1, true)
   428  	_ = keeper.ApplyAndReturnValidatorSetUpdates(ctx)
   429  
   430  	rdAmount := sdk.TokensFromConsensusPower(20)
   431  	keeper.BeginRedelegation(ctx, addrAcc2, val1.GetOperator(), val2.GetOperator(), rdAmount.ToDec())
   432  	keeper.ApplyAndReturnValidatorSetUpdates(ctx)
   433  
   434  	redel, found := keeper.GetRedelegation(ctx, addrAcc2, val1.OperatorAddress, val2.OperatorAddress)
   435  	require.True(t, found)
   436  
   437  	// delegator redelegations
   438  	queryDelegatorParams := types.NewQueryDelegatorParams(addrAcc2)
   439  	bz, errRes := cdc.MarshalJSON(queryDelegatorParams)
   440  	require.NoError(t, errRes)
   441  
   442  	query := abci.RequestQuery{
   443  		Path: "/custom/staking/redelegations",
   444  		Data: bz,
   445  	}
   446  
   447  	res, err := queryRedelegations(ctx, query, keeper)
   448  	require.NoError(t, err)
   449  
   450  	var redelRes types.RedelegationResponses
   451  	errRes = cdc.UnmarshalJSON(res, &redelRes)
   452  	require.NoError(t, errRes)
   453  	require.Len(t, redelRes, 1)
   454  	require.Equal(t, redel.DelegatorAddress, redelRes[0].DelegatorAddress)
   455  	require.Equal(t, redel.ValidatorSrcAddress, redelRes[0].ValidatorSrcAddress)
   456  	require.Equal(t, redel.ValidatorDstAddress, redelRes[0].ValidatorDstAddress)
   457  	require.Len(t, redel.Entries, len(redelRes[0].Entries))
   458  
   459  	// validator redelegations
   460  	queryValidatorParams := types.NewQueryValidatorParams(val1.GetOperator())
   461  	bz, errRes = cdc.MarshalJSON(queryValidatorParams)
   462  	require.NoError(t, errRes)
   463  
   464  	query = abci.RequestQuery{
   465  		Path: "/custom/staking/redelegations",
   466  		Data: bz,
   467  	}
   468  
   469  	res, err = queryRedelegations(ctx, query, keeper)
   470  	require.NoError(t, err)
   471  
   472  	errRes = cdc.UnmarshalJSON(res, &redelRes)
   473  	require.NoError(t, errRes)
   474  	require.Len(t, redelRes, 1)
   475  	require.Equal(t, redel.DelegatorAddress, redelRes[0].DelegatorAddress)
   476  	require.Equal(t, redel.ValidatorSrcAddress, redelRes[0].ValidatorSrcAddress)
   477  	require.Equal(t, redel.ValidatorDstAddress, redelRes[0].ValidatorDstAddress)
   478  	require.Len(t, redel.Entries, len(redelRes[0].Entries))
   479  }
   480  
   481  func TestQueryUnbondingDelegation(t *testing.T) {
   482  	cdc := codec.New()
   483  	ctx, _, keeper, _ := CreateTestInput(t, false, 10000)
   484  
   485  	// Create Validators and Delegation
   486  	val1 := types.NewValidator(addrVal1, pk1, types.Description{})
   487  	keeper.SetValidator(ctx, val1)
   488  
   489  	// delegate
   490  	delAmount := sdk.TokensFromConsensusPower(100)
   491  	_, err := keeper.Delegate(ctx, addrAcc1, delAmount.ToDec(), sdk.Unbonded, val1, true)
   492  	require.NoError(t, err)
   493  	_ = keeper.ApplyAndReturnValidatorSetUpdates(ctx)
   494  
   495  	// undelegate
   496  	undelAmount := sdk.TokensFromConsensusPower(20)
   497  	_, err = keeper.Undelegate(ctx, addrAcc1, val1.GetOperator(), undelAmount.ToDec())
   498  	require.NoError(t, err)
   499  	keeper.ApplyAndReturnValidatorSetUpdates(ctx)
   500  
   501  	_, found := keeper.GetUnbondingDelegation(ctx, addrAcc1, val1.OperatorAddress)
   502  	require.True(t, found)
   503  
   504  	//
   505  	// found: query unbonding delegation by delegator and validator
   506  	//
   507  	queryValidatorParams := types.NewQueryBondsParams(addrAcc1, val1.GetOperator())
   508  	bz, errRes := cdc.MarshalJSON(queryValidatorParams)
   509  	require.NoError(t, errRes)
   510  	query := abci.RequestQuery{
   511  		Path: "/custom/staking/unbondingDelegation",
   512  		Data: bz,
   513  	}
   514  	res, err := queryUnbondingDelegation(ctx, query, keeper)
   515  	require.NoError(t, err)
   516  	require.NotNil(t, res)
   517  	var ubDel types.UnbondingDelegation
   518  	require.NoError(t, cdc.UnmarshalJSON(res, &ubDel))
   519  	require.Equal(t, addrAcc1, ubDel.DelegatorAddress)
   520  	require.Equal(t, val1.OperatorAddress, ubDel.ValidatorAddress)
   521  	require.Equal(t, 1, len(ubDel.Entries))
   522  
   523  	//
   524  	// not found: query unbonding delegation by delegator and validator
   525  	//
   526  	queryValidatorParams = types.NewQueryBondsParams(addrAcc2, val1.GetOperator())
   527  	bz, errRes = cdc.MarshalJSON(queryValidatorParams)
   528  	require.NoError(t, errRes)
   529  	query = abci.RequestQuery{
   530  		Path: "/custom/staking/unbondingDelegation",
   531  		Data: bz,
   532  	}
   533  	_, err = queryUnbondingDelegation(ctx, query, keeper)
   534  	require.Error(t, err)
   535  
   536  	//
   537  	// found: query unbonding delegation by delegator and validator
   538  	//
   539  	queryDelegatorParams := types.NewQueryDelegatorParams(addrAcc1)
   540  	bz, errRes = cdc.MarshalJSON(queryDelegatorParams)
   541  	require.NoError(t, errRes)
   542  	query = abci.RequestQuery{
   543  		Path: "/custom/staking/delegatorUnbondingDelegations",
   544  		Data: bz,
   545  	}
   546  	res, err = queryDelegatorUnbondingDelegations(ctx, query, keeper)
   547  	require.NoError(t, err)
   548  	require.NotNil(t, res)
   549  	var ubDels []types.UnbondingDelegation
   550  	require.NoError(t, cdc.UnmarshalJSON(res, &ubDels))
   551  	require.Equal(t, 1, len(ubDels))
   552  	require.Equal(t, addrAcc1, ubDels[0].DelegatorAddress)
   553  	require.Equal(t, val1.OperatorAddress, ubDels[0].ValidatorAddress)
   554  
   555  	//
   556  	// not found: query unbonding delegation by delegator and validator
   557  	//
   558  	queryDelegatorParams = types.NewQueryDelegatorParams(addrAcc2)
   559  	bz, errRes = cdc.MarshalJSON(queryDelegatorParams)
   560  	require.NoError(t, errRes)
   561  	query = abci.RequestQuery{
   562  		Path: "/custom/staking/delegatorUnbondingDelegations",
   563  		Data: bz,
   564  	}
   565  	res, err = queryDelegatorUnbondingDelegations(ctx, query, keeper)
   566  	require.NoError(t, err)
   567  	require.NotNil(t, res)
   568  	require.NoError(t, cdc.UnmarshalJSON(res, &ubDels))
   569  	require.Equal(t, 0, len(ubDels))
   570  }
   571  
   572  func TestQueryHistoricalInfo(t *testing.T) {
   573  	cdc := codec.New()
   574  	ctx, _, keeper, _ := CreateTestInput(t, false, 10000)
   575  
   576  	// Create Validators and Delegation
   577  	val1 := types.NewValidator(addrVal1, pk1, types.Description{})
   578  	val2 := types.NewValidator(addrVal2, pk2, types.Description{})
   579  	vals := []types.Validator{val1, val2}
   580  	keeper.SetValidator(ctx, val1)
   581  	keeper.SetValidator(ctx, val2)
   582  
   583  	header := abci.Header{
   584  		ChainID: "HelloChain",
   585  		Height:  5,
   586  	}
   587  	hi := types.NewHistoricalInfo(header, vals)
   588  	keeper.SetHistoricalInfo(ctx, 5, hi)
   589  
   590  	queryHistoricalParams := types.NewQueryHistoricalInfoParams(4)
   591  	bz, errRes := cdc.MarshalJSON(queryHistoricalParams)
   592  	require.NoError(t, errRes)
   593  	query := abci.RequestQuery{
   594  		Path: "/custom/staking/historicalInfo",
   595  		Data: bz,
   596  	}
   597  	res, err := queryHistoricalInfo(ctx, query, keeper)
   598  	require.Error(t, err, "Invalid query passed")
   599  	require.Nil(t, res, "Invalid query returned non-nil result")
   600  
   601  	queryHistoricalParams = types.NewQueryHistoricalInfoParams(5)
   602  	bz, errRes = cdc.MarshalJSON(queryHistoricalParams)
   603  	require.NoError(t, errRes)
   604  	query.Data = bz
   605  	res, err = queryHistoricalInfo(ctx, query, keeper)
   606  	require.NoError(t, err, "Valid query passed")
   607  	require.NotNil(t, res, "Valid query returned nil result")
   608  
   609  	var recv types.HistoricalInfo
   610  	require.NoError(t, cdc.UnmarshalJSON(res, &recv))
   611  	require.Equal(t, hi, recv, "HistoricalInfo query returned wrong result")
   612  }