github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/x/staking/keeper/querier.go (about) 1 package keeper 2 3 import ( 4 "strings" 5 6 "google.golang.org/grpc/codes" 7 "google.golang.org/grpc/status" 8 9 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/client" 10 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/codec" 11 sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types" 12 sdkerrors "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types/errors" 13 stakingtypes "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/staking/types" 14 abci "github.com/fibonacci-chain/fbc/libs/tendermint/abci/types" 15 "github.com/fibonacci-chain/fbc/libs/tendermint/crypto" 16 "github.com/fibonacci-chain/fbc/x/common" 17 "github.com/fibonacci-chain/fbc/x/staking/types" 18 ) 19 20 // NewQuerier creates a querier for staking REST endpoints 21 func NewQuerier(k Keeper) sdk.Querier { 22 return func(ctx sdk.Context, path []string, req abci.RequestQuery) (res []byte, err error) { 23 switch path[0] { 24 case types.QueryValidators: 25 return queryValidators(ctx, req, k) 26 case types.QueryValidator: 27 return queryValidator(ctx, req, k) 28 case types.QueryPool: 29 return queryPool(ctx, k) 30 case types.QueryParameters: 31 return queryParameters(ctx, k) 32 case types.QueryParams4IBC: 33 return queryParams4IBC(ctx, k) 34 case types.QueryUnbondingDelegation: 35 return queryUndelegation(ctx, req, k) 36 case types.QueryValidatorAllShares: 37 return queryValidatorAllShares(ctx, req, k) 38 case types.QueryAddress: 39 return queryAddress(ctx, k) 40 case types.QueryForAddress: 41 return queryForAddress(ctx, req, k) 42 case types.QueryForAccAddress: 43 return queryForAccAddress(ctx, req) 44 case types.QueryProxy: 45 return queryProxy(ctx, req, k) 46 case types.QueryDelegator: 47 return queryDelegator(ctx, req, k) 48 case types.QueryDelegatorValidators: 49 return queryDelegatorValidators(ctx, req, k) 50 case types.QueryDelegatorValidator: 51 return queryDelegatorValidator(ctx, req, k) 52 case types.QueryHistoricalInfo: 53 return queryHistoricalInfo(ctx, req, k) 54 case types.QueryValidatorDelegations: 55 return queryValidatorDelegations(ctx, req, k) 56 case types.QueryValidatorDelegator: 57 return queryValidatorDelegator(ctx, req, k) 58 59 // required by wallet 60 case types.QueryDelegatorDelegations: 61 return queryDelegatorDelegations(ctx, req, k) 62 case types.QueryUnbondingDelegation2: 63 return queryUndelegation2(ctx, req, k) 64 default: 65 return nil, types.ErrUnknownStakingQueryType() 66 } 67 } 68 } 69 70 func queryDelegator(ctx sdk.Context, req abci.RequestQuery, k Keeper) ([]byte, error) { 71 var params types.QueryDelegatorParams 72 73 if err := types.ModuleCdc.UnmarshalJSON(req.Data, ¶ms); err != nil { 74 return nil, common.ErrUnMarshalJSONFailed(err.Error()) 75 } 76 77 delegator, found := k.GetDelegator(ctx, params.DelegatorAddr) 78 if !found { 79 return nil, types.ErrNoDelegatorExisted(params.DelegatorAddr.String()) 80 } 81 82 res, err := codec.MarshalJSONIndent(types.ModuleCdc, delegator) 83 if err != nil { 84 return nil, common.ErrMarshalJSONFailed(err.Error()) 85 } 86 87 return res, nil 88 } 89 90 func queryDelegatorValidator(ctx sdk.Context, req abci.RequestQuery, k Keeper) ([]byte, error) { 91 var params types.QueryBondsParams 92 err := types.ModuleCdc.UnmarshalJSON(req.Data, ¶ms) 93 if err != nil { 94 return nil, common.ErrUnMarshalJSONFailed(err.Error()) 95 } 96 97 delegator, found := k.GetDelegator(ctx, params.DelegatorAddr) 98 if !found { 99 return nil, types.ErrNoDelegatorExisted(params.DelegatorAddr.String()) 100 } 101 102 foundV := false 103 var validator types.Validator 104 for _, val := range delegator.ValidatorAddresses { 105 if !val.Equals(params.ValidatorAddr) { 106 continue 107 } 108 validator, found = k.GetValidator(ctx, val) 109 if !found { 110 return nil, types.ErrNoValidatorFound(val.String()) 111 } 112 foundV = true 113 break 114 } 115 116 if !foundV { 117 return nil, types.ErrCodeNoDelegatorValidator(params.DelegatorAddr.String(), params.ValidatorAddr.String()) 118 } 119 120 res, err := codec.MarshalJSONIndent(types.ModuleCdc, validator) 121 if err != nil { 122 return nil, common.ErrMarshalJSONFailed(err.Error()) 123 } 124 125 return res, nil 126 } 127 128 func queryValidatorDelegator(ctx sdk.Context, req abci.RequestQuery, k Keeper) ([]byte, error) { 129 var params types.QueryBondsParams 130 err := types.ModuleCdc.UnmarshalJSON(req.Data, ¶ms) 131 if err != nil { 132 return nil, common.ErrUnMarshalJSONFailed(err.Error()) 133 } 134 135 delegator, found := k.GetDelegator(ctx, params.DelegatorAddr) 136 if !found { 137 return nil, types.ErrNoDelegatorExisted(params.DelegatorAddr.String()) 138 } 139 140 find := false 141 for _, val := range delegator.ValidatorAddresses { 142 if val.Equals(params.ValidatorAddr) { 143 find = true 144 break 145 } 146 } 147 148 if !find { 149 return nil, types.ErrCodeNoDelegatorValidator(params.DelegatorAddr.String(), params.ValidatorAddr.String()) 150 } 151 152 res, err := codec.MarshalJSONIndent(types.ModuleCdc, delegator) 153 if err != nil { 154 return nil, common.ErrMarshalJSONFailed(err.Error()) 155 } 156 157 return res, nil 158 } 159 160 func queryDelegatorValidators(ctx sdk.Context, req abci.RequestQuery, k Keeper) ([]byte, error) { 161 var params types.QueryDelegatorParams 162 err := types.ModuleCdc.UnmarshalJSON(req.Data, ¶ms) 163 if err != nil { 164 return nil, common.ErrUnMarshalJSONFailed(err.Error()) 165 } 166 167 delegator, found := k.GetDelegator(ctx, params.DelegatorAddr) 168 if !found { 169 return nil, types.ErrNoDelegatorExisted(params.DelegatorAddr.String()) 170 } 171 172 var validators []types.Validator 173 for _, val := range delegator.ValidatorAddresses { 174 validator, found := k.GetValidator(ctx, val) 175 if !found { 176 return nil, types.ErrNoValidatorFound(val.String()) 177 } 178 validators = append(validators, validator) 179 } 180 181 res, err := codec.MarshalJSONIndent(types.ModuleCdc, validators) 182 if err != nil { 183 return nil, common.ErrMarshalJSONFailed(err.Error()) 184 } 185 186 return res, nil 187 } 188 189 func queryValidatorDelegations(ctx sdk.Context, req abci.RequestQuery, k Keeper) ([]byte, error) { 190 var params types.QueryValidatorParams 191 192 err := types.ModuleCdc.UnmarshalJSON(req.Data, ¶ms) 193 if err != nil { 194 return nil, common.ErrUnMarshalJSONFailed(err.Error()) 195 } 196 197 sharesDelegations := k.GetValidatorAllShares(ctx, params.ValidatorAddr) 198 var delegators []types.Delegator 199 for _, shareDelegator := range sharesDelegations { 200 delegator, found := k.GetDelegator(ctx, shareDelegator.DelAddr) 201 if !found { 202 return nil, types.ErrNoDelegatorExisted(shareDelegator.DelAddr.String()) 203 } 204 delegators = append(delegators, delegator) 205 } 206 207 res, err := codec.MarshalJSONIndent(types.ModuleCdc, delegators) 208 if err != nil { 209 return nil, common.ErrMarshalJSONFailed(err.Error()) 210 } 211 212 return res, nil 213 } 214 215 func queryValidators(ctx sdk.Context, req abci.RequestQuery, k Keeper) ([]byte, error) { 216 var params types.QueryValidatorsParams 217 218 if err := types.ModuleCdc.UnmarshalJSON(req.Data, ¶ms); err != nil { 219 return nil, common.ErrUnMarshalJSONFailed(err.Error()) 220 } 221 222 validators := k.GetAllValidators(ctx) 223 224 var filteredVals []types.Validator 225 if params.Status == "all" { 226 filteredVals = validators 227 } else { 228 filteredVals = make([]types.Validator, 0, len(validators)) 229 for _, val := range validators { 230 if strings.EqualFold(val.GetStatus().String(), params.Status) { 231 filteredVals = append(filteredVals, val) 232 } 233 } 234 235 start, end := client.Paginate(len(filteredVals), params.Page, params.Limit, int(k.GetParams(ctx).MaxValidators)) 236 if start < 0 || end < 0 { 237 filteredVals = []types.Validator{} 238 } else { 239 filteredVals = filteredVals[start:end] 240 } 241 } 242 243 res, err := codec.MarshalJSONIndent(types.ModuleCdc, filteredVals) 244 if err != nil { 245 return nil, common.ErrMarshalJSONFailed(err.Error()) 246 } 247 248 return res, nil 249 } 250 251 func queryValidator(ctx sdk.Context, req abci.RequestQuery, k Keeper) ([]byte, error) { 252 var params types.QueryValidatorParams 253 254 err := types.ModuleCdc.UnmarshalJSON(req.Data, ¶ms) 255 if err != nil { 256 return nil, common.ErrUnMarshalJSONFailed(err.Error()) 257 } 258 259 validator, found := k.GetValidator(ctx, params.ValidatorAddr) 260 if !found { 261 return nil, types.ErrNoValidatorFound(params.ValidatorAddr.String()) 262 } 263 264 res, err := codec.MarshalJSONIndent(types.ModuleCdc, validator) 265 if err != nil { 266 return nil, common.ErrMarshalJSONFailed(err.Error()) 267 } 268 269 return res, nil 270 } 271 272 func queryPool(ctx sdk.Context, k Keeper) ([]byte, error) { 273 bondDenom := k.BondDenom(ctx) 274 bondedPool := k.GetBondedPool(ctx) 275 notBondedPool := k.GetNotBondedPool(ctx) 276 if bondedPool == nil || notBondedPool == nil { 277 return nil, types.ErrBondedPoolOrNotBondedIsNotExist() 278 } 279 280 pool := types.NewPool( 281 notBondedPool.GetCoins().AmountOf(bondDenom), 282 bondedPool.GetCoins().AmountOf(bondDenom), 283 ) 284 285 res, err := codec.MarshalJSONIndent(types.ModuleCdc, pool) 286 if err != nil { 287 return nil, common.ErrMarshalJSONFailed(err.Error()) 288 } 289 290 return res, nil 291 } 292 293 func queryParameters(ctx sdk.Context, k Keeper) ([]byte, error) { 294 params := k.GetParams(ctx) 295 296 res, err := codec.MarshalJSONIndent(types.ModuleCdc, params) 297 if err != nil { 298 return nil, common.ErrMarshalJSONFailed(err.Error()) 299 } 300 301 return res, nil 302 } 303 304 func queryParams4IBC(ctx sdk.Context, k Keeper) ([]byte, error) { 305 params := k.GetParams(ctx) 306 307 //QueryParamsResponse 308 ret := &stakingtypes.QueryParamsResponse{ 309 Params: stakingtypes.IBCParams{ 310 UnbondingTime: params.UnbondingTime, 311 MaxValidators: uint32(params.MaxValidators), 312 MaxEntries: uint32(params.MaxValsToAddShares), 313 HistoricalEntries: params.HistoricalEntries, 314 BondDenom: sdk.DefaultBondDenom, 315 }, 316 } 317 res, err := k.cdcMarshl.GetProtocMarshal().MarshalBinaryBare(ret) 318 if err != nil { 319 return nil, common.ErrMarshalJSONFailed(err.Error()) 320 } 321 322 return res, nil 323 } 324 325 func queryProxy(ctx sdk.Context, req abci.RequestQuery, k Keeper) ([]byte, error) { 326 var params types.QueryDelegatorParams 327 if err := types.ModuleCdc.UnmarshalJSON(req.Data, ¶ms); err != nil { 328 return nil, common.ErrUnMarshalJSONFailed(err.Error()) 329 } 330 331 delAddrs := k.GetDelegatorsByProxy(ctx, params.DelegatorAddr) 332 resp, err := codec.MarshalJSONIndent(types.ModuleCdc, delAddrs) 333 if err != nil { 334 return nil, common.ErrMarshalJSONFailed(err.Error()) 335 } 336 337 return resp, nil 338 } 339 340 func queryValidatorAllShares(ctx sdk.Context, req abci.RequestQuery, k Keeper) ([]byte, error) { 341 var params types.QueryValidatorParams 342 343 if err := types.ModuleCdc.UnmarshalJSON(req.Data, ¶ms); err != nil { 344 return nil, common.ErrUnMarshalJSONFailed(err.Error()) 345 } 346 347 sharesResponses := k.GetValidatorAllShares(ctx, params.ValidatorAddr) 348 resp, err := codec.MarshalJSONIndent(types.ModuleCdc, sharesResponses) 349 if err != nil { 350 return nil, common.ErrMarshalJSONFailed(err.Error()) 351 } 352 353 return resp, nil 354 } 355 356 func queryUndelegation(ctx sdk.Context, req abci.RequestQuery, k Keeper) ([]byte, error) { 357 var params types.QueryDelegatorParams 358 err := types.ModuleCdc.UnmarshalJSON(req.Data, ¶ms) 359 if err != nil { 360 return nil, common.ErrUnMarshalJSONFailed(err.Error()) 361 } 362 363 undelegation, found := k.GetUndelegating(ctx, params.DelegatorAddr) 364 if !found { 365 return nil, types.ErrNoUnbondingDelegation() 366 } 367 368 res, err := codec.MarshalJSONIndent(types.ModuleCdc, undelegation) 369 if err != nil { 370 return nil, common.ErrMarshalJSONFailed(err.Error()) 371 } 372 373 return res, nil 374 } 375 376 func queryAddress(ctx sdk.Context, k Keeper) (res []byte, err error) { 377 378 ovPairs := k.GetOperAndValidatorAddr(ctx) 379 res, errRes := codec.MarshalJSONIndent(types.ModuleCdc, ovPairs) 380 if errRes != nil { 381 return nil, common.ErrMarshalJSONFailed(errRes.Error()) 382 } 383 return res, nil 384 } 385 386 func queryForAddress(ctx sdk.Context, req abci.RequestQuery, k Keeper) (res []byte, err error) { 387 validatorAddr := string(req.Data) 388 if len(validatorAddr) != crypto.AddressSize*2 { 389 return nil, types.ErrBadValidatorAddr() 390 } 391 392 operAddr, found := k.GetOperAddrFromValidatorAddr(ctx, validatorAddr) 393 if !found { 394 return nil, types.ErrNoValidatorFound(validatorAddr) 395 } 396 397 res, errRes := codec.MarshalJSONIndent(types.ModuleCdc, operAddr) 398 if errRes != nil { 399 return nil, common.ErrMarshalJSONFailed(errRes.Error()) 400 } 401 return res, nil 402 } 403 404 func queryForAccAddress(ctx sdk.Context, req abci.RequestQuery) (res []byte, err error) { 405 406 valAddr, errBech32 := sdk.ValAddressFromBech32(string(req.Data)) 407 if errBech32 != nil { 408 return nil, common.ErrCreateAddrFromBech32Failed(errBech32.Error(), errBech32.Error()) 409 } 410 411 accAddr := sdk.AccAddress(valAddr) 412 413 res, errMarshal := codec.MarshalJSONIndent(types.ModuleCdc, accAddr) 414 if errMarshal != nil { 415 return nil, common.ErrMarshalJSONFailed(errMarshal.Error()) 416 } 417 return res, nil 418 } 419 420 func queryUndelegation2(ctx sdk.Context, req abci.RequestQuery, k Keeper) ([]byte, error) { 421 var params types.QueryDelegatorUnbondingDelegationsRequest 422 err := types.ModuleCdc.UnmarshalJSON(req.Data, ¶ms) 423 if err != nil { 424 return nil, common.ErrUnMarshalJSONFailed(err.Error()) 425 } 426 427 if params.DelegatorAddr == "" { 428 return nil, status.Errorf(codes.InvalidArgument, "delegator address cannot be empty") 429 } 430 431 delAddr, err := sdk.AccAddressFromBech32(params.DelegatorAddr) 432 if err != nil { 433 return nil, err 434 } 435 436 un, pageRes, err := k.GetDelegatorUnbondingDelegations(ctx, delAddr, params.Pagination) 437 if nil != err { 438 return nil, err 439 } 440 if un == nil { 441 un = make(stakingtypes.UnbondingDelegations, 0) 442 } 443 marsh := &types.QueryDelegatorUnbondingDelegationsResponse{ 444 UnbondingResponses: un, 445 Pagination: pageRes, 446 } 447 res, err := codec.MarshalJSONIndent(types.ModuleCdc, marsh) 448 if err != nil { 449 return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error()) 450 } 451 452 return res, nil 453 } 454 455 func queryDelegatorDelegations(ctx sdk.Context, req abci.RequestQuery, k Keeper) ([]byte, error) { 456 var params types.QueryDelegatorDelegationsRequest 457 458 err := types.ModuleCdc.UnmarshalJSON(req.Data, ¶ms) 459 if err != nil { 460 return nil, sdkerrors.Wrap(sdkerrors.ErrJSONUnmarshal, err.Error()) 461 } 462 463 delegationResps, err := k.DelegatorDelegations(ctx, ¶ms) 464 if delegationResps == nil { 465 delegationResps = &types.QueryDelegatorDelegationsResponse{} 466 } 467 468 res, err := codec.MarshalJSONIndent(types.ModuleCdc, delegationResps) 469 if err != nil { 470 return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error()) 471 } 472 473 return res, nil 474 } 475 476 func delegationsToDelegationResponses( 477 ctx sdk.Context, k Keeper, delegations stakingtypes.Delegations, 478 ) (stakingtypes.DelegationResponses, error) { 479 480 resp := make(stakingtypes.DelegationResponses, len(delegations)) 481 for i, del := range delegations { 482 delResp, err := delegationToDelegationResponse(ctx, k, del) 483 if err != nil { 484 return nil, err 485 } 486 487 resp[i] = delResp 488 } 489 490 return resp, nil 491 } 492 493 // /// 494 // utils 495 func delegationToDelegationResponse(ctx sdk.Context, k Keeper, del stakingtypes.Delegation) (stakingtypes.DelegationResponse, error) { 496 val, found := k.GetValidator(ctx, del.ValidatorAddress) 497 if !found { 498 return stakingtypes.DelegationResponse{}, stakingtypes.ErrNoValidatorFound 499 } 500 501 return stakingtypes.NewDelegationResp( 502 del.DelegatorAddress, 503 del.ValidatorAddress, 504 del.Shares, 505 sdk.NewCoin(k.BondDenom(ctx), val.TokensFromShares(del.Shares).TruncateInt()), 506 ), nil 507 } 508 509 func DelegationsToDelegationResponses( 510 ctx sdk.Context, k Keeper, delegations stakingtypes.Delegations, 511 ) (stakingtypes.DelegationResponses, error) { 512 resp := make(stakingtypes.DelegationResponses, len(delegations)) 513 514 for i, del := range delegations { 515 delResp, err := DelegationToDelegationResponse(ctx, k, del) 516 if err != nil { 517 return nil, err 518 } 519 520 resp[i] = delResp 521 } 522 523 return resp, nil 524 } 525 526 func DelegationToDelegationResponse(ctx sdk.Context, k Keeper, del stakingtypes.Delegation) (stakingtypes.DelegationResponse, error) { 527 val, found := k.GetValidator(ctx, del.GetValidatorAddr()) 528 if !found { 529 return stakingtypes.DelegationResponse{}, stakingtypes.ErrNoValidatorFound 530 } 531 532 delegatorAddress, err := sdk.AccAddressFromBech32(del.DelegatorAddress.String()) 533 if err != nil { 534 return stakingtypes.DelegationResponse{}, err 535 } 536 537 return stakingtypes.NewDelegationResp( 538 delegatorAddress, 539 del.GetValidatorAddr(), 540 del.Shares, 541 sdk.NewCoin(k.BondDenom(ctx), val.TokensFromShares(del.Shares).TruncateInt()), 542 ), nil 543 } 544 545 func queryHistoricalInfo(ctx sdk.Context, req abci.RequestQuery, k Keeper) ([]byte, error) { 546 var params types.QueryHistoricalInfoParams 547 548 err := types.ModuleCdc.UnmarshalJSON(req.Data, ¶ms) 549 if err != nil { 550 return nil, sdkerrors.Wrap(sdkerrors.ErrJSONUnmarshal, err.Error()) 551 } 552 553 hi, found := k.GetHistoricalInfo(ctx, params.Height) 554 if !found { 555 return nil, types.ErrNoHistoricalInfo 556 } 557 558 res, err := codec.MarshalJSONIndent(types.ModuleCdc, hi) 559 if err != nil { 560 return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error()) 561 } 562 563 return res, nil 564 }