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, ¶ms) 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 }