github.com/KiraCore/sekai@v0.3.43/x/gov/keeper/grpc_query.go (about) 1 package keeper 2 3 import ( 4 "context" 5 "fmt" 6 7 "github.com/cosmos/cosmos-sdk/store/prefix" 8 sdk "github.com/cosmos/cosmos-sdk/types" 9 "google.golang.org/grpc/codes" 10 "google.golang.org/grpc/status" 11 12 appparams "github.com/KiraCore/sekai/app/params" 13 kiratypes "github.com/KiraCore/sekai/types" 14 "github.com/KiraCore/sekai/x/gov/types" 15 stakingtypes "github.com/KiraCore/sekai/x/staking/types" 16 sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" 17 "github.com/cosmos/cosmos-sdk/types/query" 18 ) 19 20 var _ types.QueryServer = Keeper{} 21 22 func (k Keeper) PollsVotesByPollId(goCtx context.Context, request *types.QueryPollsVotesByPollId) (*types.QueryPollsVotesByPollIdResponse, error) { 23 ctx := sdk.UnwrapSDKContext(goCtx) 24 votes := k.GetPollVotes(ctx, request.PollId) 25 26 return &types.QueryPollsVotesByPollIdResponse{ 27 Votes: votes, 28 }, nil 29 } 30 31 // AllRoles return all roles registered 32 func (k Keeper) AllRoles(goCtx context.Context, request *types.AllRolesRequest) (*types.AllRolesResponse, error) { 33 ctx := sdk.UnwrapSDKContext(goCtx) 34 roles := k.GetAllRoles(ctx) 35 roleQueries := []types.RoleQuery{} 36 for _, role := range roles { 37 permissions, _ := k.GetPermissionsForRole(ctx, uint64(role.Id)) 38 roleQueries = append(roleQueries, types.RoleQuery{ 39 Id: role.Id, 40 Sid: role.Sid, 41 Description: role.Description, 42 Permissions: &permissions, 43 }) 44 } 45 46 return &types.AllRolesResponse{ 47 Roles: roleQueries, 48 }, nil 49 } 50 51 // PollsListByAddress return polls associated to an address 52 func (k Keeper) PollsListByAddress(goCtx context.Context, request *types.QueryPollsListByAddress) (*types.QueryPollsListByAddressResponse, error) { 53 ctx := sdk.UnwrapSDKContext(goCtx) 54 polls, err := k.GetPollsByAddress(ctx, request.Creator) 55 56 if err != nil { 57 return nil, err 58 } 59 60 return &types.QueryPollsListByAddressResponse{ 61 Polls: polls, 62 }, nil 63 } 64 65 // RolesByAddress return roles associated to an address 66 func (k Keeper) RolesByAddress(goCtx context.Context, request *types.RolesByAddressRequest) (*types.RolesByAddressResponse, error) { 67 addr, err := sdk.AccAddressFromBech32(request.Addr) 68 if err != nil { 69 return nil, err 70 } 71 actor, found := k.GetNetworkActorByAddress(sdk.UnwrapSDKContext(goCtx), addr) 72 if !found { 73 return nil, stakingtypes.ErrNetworkActorNotFound 74 } 75 76 return &types.RolesByAddressResponse{ 77 RoleIds: actor.Roles, 78 }, nil 79 } 80 81 // CouncilorByAddress return councilor object associated to an address 82 func (k Keeper) CouncilorByAddress(goCtx context.Context, request *types.CouncilorByAddressRequest) (*types.CouncilorResponse, error) { 83 addr, err := sdk.AccAddressFromBech32(request.Addr) 84 if err != nil { 85 return nil, err 86 } 87 councilor, found := k.GetCouncilor(sdk.UnwrapSDKContext(goCtx), addr) 88 if !found { 89 return nil, types.ErrCouncilorNotFound 90 } 91 92 return &types.CouncilorResponse{Councilor: councilor}, nil 93 } 94 95 // CouncilorByMoniker return councilor object named moniker 96 func (k Keeper) CouncilorByMoniker(goCtx context.Context, request *types.CouncilorByMonikerRequest) (*types.CouncilorResponse, error) { 97 councilor, found := k.GetCouncilorByMoniker(sdk.UnwrapSDKContext(goCtx), request.Moniker) 98 if !found { 99 return nil, types.ErrCouncilorNotFound 100 } 101 102 return &types.CouncilorResponse{Councilor: councilor}, nil 103 } 104 105 // PermissionsByAddress returns permissions associated to an address 106 func (k Keeper) PermissionsByAddress(goCtx context.Context, request *types.PermissionsByAddressRequest) (*types.PermissionsResponse, error) { 107 ctx := sdk.UnwrapSDKContext(goCtx) 108 addr, err := sdk.AccAddressFromBech32(request.Addr) 109 if err != nil { 110 return nil, err 111 } 112 networkActor, found := k.GetNetworkActorByAddress(ctx, addr) 113 if !found { 114 return nil, stakingtypes.ErrNetworkActorNotFound 115 } 116 117 return &types.PermissionsResponse{Permissions: networkActor.Permissions}, nil 118 } 119 120 // NetworkProperties return global network properties 121 func (k Keeper) NetworkProperties(goCtx context.Context, request *types.NetworkPropertiesRequest) (*types.NetworkPropertiesResponse, error) { 122 ctx := sdk.UnwrapSDKContext(goCtx) 123 124 networkProperties := k.GetNetworkProperties(ctx) 125 return &types.NetworkPropertiesResponse{Properties: networkProperties}, nil 126 } 127 128 // CustomPrefixes return default denom and bech32 prefix 129 func (k Keeper) CustomPrefixes(goCtx context.Context, request *types.QueryCustomPrefixesRequest) (*types.QueryCustomPrefixesResponse, error) { 130 return &types.QueryCustomPrefixesResponse{ 131 DefaultDenom: appparams.DefaultDenom, 132 Bech32Prefix: appparams.AccountAddressPrefix, 133 }, nil 134 } 135 136 func (k Keeper) Role(goCtx context.Context, request *types.RoleRequest) (*types.RoleResponse, error) { 137 ctx := sdk.UnwrapSDKContext(goCtx) 138 roleId, err := k.GetRoleIdFromIdentifierString(ctx, request.Identifier) 139 if err != nil { 140 return nil, err 141 } 142 role, err := k.GetRole(ctx, uint64(roleId)) 143 if err != nil { 144 return nil, err 145 } 146 147 permissions, found := k.GetPermissionsForRole(ctx, uint64(role.Id)) 148 if !found { 149 return nil, types.ErrRoleDoesNotExist 150 } 151 152 return &types.RoleResponse{Role: &types.RoleQuery{ 153 Id: role.Id, 154 Sid: role.Sid, 155 Description: role.Description, 156 Permissions: &permissions, 157 }}, nil 158 } 159 160 // ExecutionFee returns execution fee associated to a specific message type 161 func (k Keeper) ExecutionFee(goCtx context.Context, request *types.ExecutionFeeRequest) (*types.ExecutionFeeResponse, error) { 162 ctx := sdk.UnwrapSDKContext(goCtx) 163 fee := k.GetExecutionFee(ctx, request.TransactionType) 164 if fee == nil { 165 return nil, sdkerrors.Wrap(types.ErrFeeNotExist, fmt.Sprintf("fee does not exist for %s", request.TransactionType)) 166 } 167 return &types.ExecutionFeeResponse{Fee: fee}, nil 168 } 169 170 // ExecutionFee returns execution fee associated to a specific message type 171 func (k Keeper) AllExecutionFees(goCtx context.Context, request *types.AllExecutionFeesRequest) (*types.AllExecutionFeesResponse, error) { 172 ctx := sdk.UnwrapSDKContext(goCtx) 173 fees := k.GetExecutionFees(ctx) 174 175 txTypes := []string{} 176 for txType := range kiratypes.MsgFuncIDMapping { 177 txTypes = append(txTypes, txType) 178 } 179 180 return &types.AllExecutionFeesResponse{ 181 Fees: fees, 182 TxTypes: txTypes, 183 }, nil 184 } 185 186 // PoorNetworkMessages queries poor network messages 187 func (k Keeper) PoorNetworkMessages(goCtx context.Context, request *types.PoorNetworkMessagesRequest) (*types.PoorNetworkMessagesResponse, error) { 188 ctx := sdk.UnwrapSDKContext(goCtx) 189 msg := k.GetPoorNetworkMessages(ctx) 190 return &types.PoorNetworkMessagesResponse{Messages: msg.Messages}, nil 191 } 192 193 // Proposal returns a proposal by id 194 func (k Keeper) Proposal(goCtx context.Context, request *types.QueryProposalRequest) (*types.QueryProposalResponse, error) { 195 ctx := sdk.UnwrapSDKContext(goCtx) 196 proposal, found := k.GetProposal(ctx, request.ProposalId) 197 if found == false { 198 return nil, sdkerrors.Wrap(types.ErrGettingProposals, fmt.Sprintf("proposal does not exist for %d", request.ProposalId)) 199 } 200 votes := k.GetProposalVotes(ctx, request.ProposalId) 201 return &types.QueryProposalResponse{ 202 Proposal: proposal, 203 Votes: votes, 204 }, nil 205 } 206 207 // Proposals query proposals by querying params with pagination 208 func (k Keeper) Proposals(goCtx context.Context, request *types.QueryProposalsRequest) (*types.QueryProposalsResponse, error) { 209 c := sdk.UnwrapSDKContext(goCtx) 210 if request == nil { 211 err := status.Error(codes.InvalidArgument, "empty request") 212 return nil, sdkerrors.Wrap(types.ErrGettingProposals, fmt.Sprintf("error getting proposals: %s", err.Error())) 213 } 214 215 store := c.KVStore(k.storeKey) 216 217 var proposals []types.Proposal 218 var pageRes *query.PageResponse 219 var err error 220 221 proposalsStore := prefix.NewStore(store, ProposalsPrefix) 222 223 onResult := func(key []byte, value []byte, accumulate bool) (bool, error) { 224 var proposal types.Proposal 225 err := k.cdc.Unmarshal(value, &proposal) 226 if err != nil { 227 return false, err 228 } 229 if request.Voter != "" { 230 voter, err := sdk.AccAddressFromBech32(request.Voter) 231 if err != nil { 232 return false, err 233 } 234 235 _, found := k.GetVote(c, proposal.ProposalId, voter) 236 if !found { 237 return false, nil 238 } 239 } 240 if accumulate { 241 proposals = append(proposals, proposal) 242 } 243 return true, nil 244 } 245 246 // we set maximum limit for safety of iteration 247 if request.Pagination != nil && request.Pagination.Limit > kiratypes.PageIterationLimit { 248 request.Pagination.Limit = kiratypes.PageIterationLimit 249 } 250 251 pageRes, err = query.FilteredPaginate(proposalsStore, request.Pagination, onResult) 252 253 if err != nil { 254 return nil, sdkerrors.Wrap(types.ErrGettingProposals, fmt.Sprintf("error getting proposals: %s", err.Error())) 255 } 256 257 res := types.QueryProposalsResponse{ 258 Proposals: proposals, 259 Pagination: pageRes, 260 } 261 262 return &res, nil 263 } 264 265 // WhitelistedProposalVoters returns whitelisted voters for a proposal for tracking 266 func (k Keeper) WhitelistedProposalVoters(goCtx context.Context, request *types.QueryWhitelistedProposalVotersRequest) (*types.QueryWhitelistedProposalVotersResponse, error) { 267 ctx := sdk.UnwrapSDKContext(goCtx) 268 proposal, found := k.GetProposal(ctx, request.ProposalId) 269 if !found { 270 return nil, sdkerrors.Wrap(types.ErrGettingProposals, fmt.Sprintf("proposal does not exist for %d", request.ProposalId)) 271 } 272 273 // dynamic proposal users for spending pool proposals 274 content := proposal.GetContent() 275 if content.VotePermission() == types.PermZero { 276 router := k.GetProposalRouter() 277 addrs := router.AllowedAddressesDynamicProposal(ctx, content) 278 actors := []types.NetworkActor{} 279 for _, addr := range addrs { 280 sdkAddr, err := sdk.AccAddressFromBech32(addr) 281 if err != nil { 282 return nil, err 283 } 284 actor, ok := k.GetNetworkActorByAddress(ctx, sdkAddr) 285 if !ok { 286 actor = types.NetworkActor{ 287 Address: sdkAddr, 288 } 289 } 290 actors = append(actors, actor) 291 } 292 return &types.QueryWhitelistedProposalVotersResponse{Voters: actors}, nil 293 } else { 294 actors := k.GetNetworkActorsByAbsoluteWhitelistPermission(ctx, proposal.GetContent().VotePermission()) 295 return &types.QueryWhitelistedProposalVotersResponse{Voters: actors}, nil 296 } 297 } 298 299 func (k Keeper) actorsCountByPermissions(ctx sdk.Context, perms []types.PermValue) uint64 { 300 count := uint64(0) 301 counted := make(map[string]bool) 302 for _, perm := range perms { 303 actors := k.GetNetworkActorsByAbsoluteWhitelistPermission(ctx, perm) 304 for _, actor := range actors { 305 if !counted[actor.Address.String()] { 306 counted[actor.Address.String()] = true 307 count++ 308 } 309 } 310 } 311 return count 312 } 313 314 // ProposerVotersCount returns proposer and voters count that can create at least a type of proposal 315 func (k Keeper) ProposerVotersCount(goCtx context.Context, request *types.QueryProposerVotersCountRequest) (*types.QueryProposerVotersCountResponse, error) { 316 ctx := sdk.UnwrapSDKContext(goCtx) 317 318 // TODO: should consider dynamic proposals later where permission is set to PermZero 319 320 proposalPerms := []types.PermValue{ 321 types.PermWhitelistAccountPermissionProposal, 322 types.PermCreateUpsertDataRegistryProposal, 323 types.PermCreateSetNetworkPropertyProposal, 324 types.PermCreateUpsertTokenAliasProposal, 325 types.PermCreateSetPoorNetworkMessagesProposal, 326 types.PermCreateUpsertTokenRateProposal, 327 types.PermCreateUnjailValidatorProposal, 328 types.PermCreateRoleProposal, 329 types.PermCreateTokensWhiteBlackChangeProposal, 330 types.PermCreateResetWholeValidatorRankProposal, 331 types.PermCreateSoftwareUpgradeProposal, 332 types.PermCreateSetProposalDurationProposal, 333 types.PermBlacklistAccountPermissionProposal, 334 types.PermRemoveWhitelistedAccountPermissionProposal, 335 types.PermRemoveBlacklistedAccountPermissionProposal, 336 types.PermWhitelistRolePermissionProposal, 337 types.PermBlacklistRolePermissionProposal, 338 types.PermRemoveWhitelistedRolePermissionProposal, 339 types.PermRemoveBlacklistedRolePermissionProposal, 340 types.PermAssignRoleToAccountProposal, 341 types.PermUnassignRoleFromAccountProposal, 342 types.PermRemoveRoleProposal, 343 types.PermCreateUpsertUBIProposal, 344 types.PermCreateRemoveUBIProposal, 345 } 346 votePerms := []types.PermValue{ 347 types.PermVoteWhitelistAccountPermissionProposal, 348 types.PermVoteUpsertDataRegistryProposal, 349 types.PermVoteSetNetworkPropertyProposal, 350 types.PermVoteUpsertTokenAliasProposal, 351 types.PermVoteSetPoorNetworkMessagesProposal, 352 types.PermVoteUpsertTokenRateProposal, 353 types.PermVoteUnjailValidatorProposal, 354 types.PermVoteCreateRoleProposal, 355 types.PermVoteTokensWhiteBlackChangeProposal, 356 types.PermVoteResetWholeValidatorRankProposal, 357 types.PermVoteSoftwareUpgradeProposal, 358 types.PermVoteSetProposalDurationProposal, 359 types.PermVoteBlacklistAccountPermissionProposal, 360 types.PermVoteRemoveWhitelistedAccountPermissionProposal, 361 types.PermVoteRemoveBlacklistedAccountPermissionProposal, 362 types.PermVoteWhitelistRolePermissionProposal, 363 types.PermVoteBlacklistRolePermissionProposal, 364 types.PermVoteRemoveWhitelistedRolePermissionProposal, 365 types.PermVoteRemoveBlacklistedRolePermissionProposal, 366 types.PermVoteAssignRoleToAccountProposal, 367 types.PermVoteUnassignRoleFromAccountProposal, 368 types.PermVoteRemoveRoleProposal, 369 types.PermVoteUpsertUBIProposal, 370 types.PermVoteRemoveUBIProposal, 371 } 372 373 return &types.QueryProposerVotersCountResponse{ 374 Proposers: k.actorsCountByPermissions(ctx, proposalPerms), 375 Voters: k.actorsCountByPermissions(ctx, votePerms), 376 }, nil 377 } 378 379 // Vote queries voted information based on proposalID, voterAddr. 380 func (k Keeper) Vote(goCtx context.Context, request *types.QueryVoteRequest) (*types.QueryVoteResponse, error) { 381 ctx := sdk.UnwrapSDKContext(goCtx) 382 voter, err := sdk.AccAddressFromBech32(request.Voter) 383 if err != nil { 384 return nil, err 385 } 386 vote, found := k.GetVote(ctx, request.ProposalId, voter) 387 if !found { 388 return &types.QueryVoteResponse{Vote: vote}, sdkerrors.Wrap(types.ErrGettingProposalVotes, fmt.Sprintf("error getting votes for proposal %d, voter %s", request.ProposalId, request.Voter)) 389 } 390 return &types.QueryVoteResponse{Vote: vote}, nil 391 } 392 393 // Votes queries votes of a given proposal. 394 func (k Keeper) Votes(goCtx context.Context, request *types.QueryVotesRequest) (*types.QueryVotesResponse, error) { 395 ctx := sdk.UnwrapSDKContext(goCtx) 396 votes := k.GetProposalVotes(ctx, request.ProposalId) 397 return &types.QueryVotesResponse{Votes: votes}, nil 398 } 399 400 // AllDataReferenceKeys queries all data reference keys with pagination 401 func (k Keeper) AllDataReferenceKeys(goCtx context.Context, request *types.QueryDataReferenceKeysRequest) (*types.QueryDataReferenceKeysResponse, error) { 402 ctx := sdk.UnwrapSDKContext(goCtx) 403 if request == nil { 404 return nil, status.Error(codes.InvalidArgument, "empty request") 405 } 406 407 var keys []string 408 store := ctx.KVStore(k.storeKey) 409 dataReferenceStore := prefix.NewStore(store, DataRegistryPrefix) 410 411 pageRes, err := query.Paginate(dataReferenceStore, request.Pagination, func(key []byte, value []byte) error { 412 keys = append(keys, string(key)) 413 return nil 414 }) 415 416 if err != nil { 417 return &types.QueryDataReferenceKeysResponse{}, err 418 } 419 420 res := types.QueryDataReferenceKeysResponse{ 421 Keys: keys, 422 Pagination: pageRes, 423 } 424 425 return &res, nil 426 } 427 428 // DataReferenceByKey queries data reference by key 429 func (k Keeper) DataReferenceByKey(goCtx context.Context, request *types.QueryDataReferenceRequest) (*types.QueryDataReferenceResponse, error) { 430 ctx := sdk.UnwrapSDKContext(goCtx) 431 if request == nil { 432 return nil, status.Error(codes.InvalidArgument, "empty request") 433 } 434 435 dataReference, ok := k.GetDataRegistryEntry(ctx, request.GetKey()) 436 437 if !ok { 438 return nil, status.Error(codes.NotFound, "not found") 439 } 440 441 res := types.QueryDataReferenceResponse{ 442 Data: &dataReference, 443 } 444 445 return &res, nil 446 } 447 448 // IdentityRecord query identity record by id 449 func (k Keeper) IdentityRecord(goCtx context.Context, request *types.QueryIdentityRecordRequest) (*types.QueryIdentityRecordResponse, error) { 450 ctx := sdk.UnwrapSDKContext(goCtx) 451 if request == nil { 452 return nil, status.Error(codes.InvalidArgument, "empty request") 453 } 454 455 res := types.QueryIdentityRecordResponse{ 456 Record: k.GetIdentityRecordById(ctx, request.Id), 457 } 458 459 return &res, nil 460 } 461 462 // IdentityRecordsByAddress query identity records by creator and keys 463 func (k Keeper) IdentityRecordsByAddress(goCtx context.Context, request *types.QueryIdentityRecordsByAddressRequest) (*types.QueryIdentityRecordsByAddressResponse, error) { 464 ctx := sdk.UnwrapSDKContext(goCtx) 465 if request == nil { 466 return nil, status.Error(codes.InvalidArgument, "empty request") 467 } 468 469 records, err := k.GetIdRecordsByAddressAndKeys(ctx, request.Creator, request.Keys) 470 471 return &types.QueryIdentityRecordsByAddressResponse{ 472 Records: records, 473 }, err 474 } 475 476 // AllIdentityRecords query all identity records 477 func (k Keeper) AllIdentityRecords(goCtx context.Context, request *types.QueryAllIdentityRecordsRequest) (*types.QueryAllIdentityRecordsResponse, error) { 478 ctx := sdk.UnwrapSDKContext(goCtx) 479 if request == nil { 480 return nil, status.Error(codes.InvalidArgument, "empty request") 481 } 482 483 store := ctx.KVStore(k.storeKey) 484 recordStore := prefix.NewStore(store, types.KeyPrefixIdentityRecord) 485 486 records := []types.IdentityRecord{} 487 onResult := func(key []byte, value []byte, accumulate bool) (bool, error) { 488 var record types.IdentityRecord 489 err := k.cdc.Unmarshal(value, &record) 490 if err != nil { 491 return false, err 492 } 493 if accumulate { 494 records = append(records, record) 495 } 496 return true, nil 497 } 498 499 // we set maximum limit for safety of iteration 500 if request.Pagination != nil && request.Pagination.Limit > kiratypes.PageIterationLimit { 501 request.Pagination.Limit = kiratypes.PageIterationLimit 502 } 503 504 pageRes, err := query.FilteredPaginate(recordStore, request.Pagination, onResult) 505 if err != nil { 506 return nil, err 507 } 508 509 res := types.QueryAllIdentityRecordsResponse{ 510 Records: records, 511 Pagination: pageRes, 512 } 513 514 return &res, nil 515 } 516 517 // IdentityRecordVerifyRequest query identity record verify request by id 518 func (k Keeper) IdentityRecordVerifyRequest(goCtx context.Context, request *types.QueryIdentityVerifyRecordRequest) (*types.QueryIdentityVerifyRecordResponse, error) { 519 ctx := sdk.UnwrapSDKContext(goCtx) 520 if request == nil { 521 return nil, status.Error(codes.InvalidArgument, "empty request") 522 } 523 524 res := types.QueryIdentityVerifyRecordResponse{ 525 VerifyRecord: k.GetIdRecordsVerifyRequest(ctx, request.RequestId), 526 } 527 528 return &res, nil 529 } 530 531 // IdentityRecordVerifyRequestsByRequester query identity record verify requests by requester 532 func (k Keeper) IdentityRecordVerifyRequestsByRequester(goCtx context.Context, request *types.QueryIdentityRecordVerifyRequestsByRequester) (*types.QueryIdentityRecordVerifyRequestsByRequesterResponse, error) { 533 ctx := sdk.UnwrapSDKContext(goCtx) 534 if request == nil { 535 return nil, status.Error(codes.InvalidArgument, "empty request") 536 } 537 538 requests := []types.IdentityRecordsVerify{} 539 store := ctx.KVStore(k.storeKey) 540 requestByRequesterStore := prefix.NewStore(store, types.IdRecordVerifyRequestByRequesterPrefix(request.Requester.String())) 541 onResult := func(key []byte, value []byte, accumulate bool) (bool, error) { 542 requestId := sdk.BigEndianToUint64(value) 543 request := k.GetIdRecordsVerifyRequest(ctx, requestId) 544 if request == nil { 545 return false, fmt.Errorf("invalid id available on requests: %d", requestId) 546 } 547 if accumulate { 548 requests = append(requests, *request) 549 } 550 return true, nil 551 } 552 553 // we set maximum limit for safety of iteration 554 if request.Pagination != nil && request.Pagination.Limit > kiratypes.PageIterationLimit { 555 request.Pagination.Limit = kiratypes.PageIterationLimit 556 } 557 558 pageRes, err := query.FilteredPaginate(requestByRequesterStore, request.Pagination, onResult) 559 if err != nil { 560 return nil, err 561 } 562 563 res := types.QueryIdentityRecordVerifyRequestsByRequesterResponse{ 564 VerifyRecords: requests, 565 Pagination: pageRes, 566 } 567 568 return &res, nil 569 } 570 571 // IdentityRecordVerifyRequestsByApprover query identity records verify requests by approver 572 func (k Keeper) IdentityRecordVerifyRequestsByApprover(goCtx context.Context, request *types.QueryIdentityRecordVerifyRequestsByApprover) (*types.QueryIdentityRecordVerifyRequestsByApproverResponse, error) { 573 ctx := sdk.UnwrapSDKContext(goCtx) 574 if request == nil { 575 return nil, status.Error(codes.InvalidArgument, "empty request") 576 } 577 578 requests := []types.IdentityRecordsVerify{} 579 store := ctx.KVStore(k.storeKey) 580 requestByApproverStore := prefix.NewStore(store, types.IdRecordVerifyRequestByApproverPrefix(request.Approver.String())) 581 onResult := func(key []byte, value []byte, accumulate bool) (bool, error) { 582 requestId := sdk.BigEndianToUint64(value) 583 request := k.GetIdRecordsVerifyRequest(ctx, requestId) 584 if request == nil { 585 return false, fmt.Errorf("invalid id available on requests: %d", requestId) 586 } 587 if accumulate { 588 requests = append(requests, *request) 589 } 590 return true, nil 591 } 592 593 // we set maximum limit for safety of iteration 594 if request.Pagination != nil && request.Pagination.Limit > kiratypes.PageIterationLimit { 595 request.Pagination.Limit = kiratypes.PageIterationLimit 596 } 597 598 pageRes, err := query.FilteredPaginate(requestByApproverStore, request.Pagination, onResult) 599 if err != nil { 600 return nil, err 601 } 602 603 res := types.QueryIdentityRecordVerifyRequestsByApproverResponse{ 604 VerifyRecords: requests, 605 Pagination: pageRes, 606 } 607 608 return &res, nil 609 } 610 611 // AllIdentityRecordVerifyRequests query all identity records verify requests 612 func (k Keeper) AllIdentityRecordVerifyRequests(goCtx context.Context, request *types.QueryAllIdentityRecordVerifyRequests) (*types.QueryAllIdentityRecordVerifyRequestsResponse, error) { 613 ctx := sdk.UnwrapSDKContext(goCtx) 614 if request == nil { 615 return nil, status.Error(codes.InvalidArgument, "empty request") 616 } 617 618 requests := []types.IdentityRecordsVerify{} 619 store := ctx.KVStore(k.storeKey) 620 requestStore := prefix.NewStore(store, types.KeyPrefixIdRecordVerifyRequest) 621 onResult := func(key []byte, value []byte, accumulate bool) (bool, error) { 622 request := types.IdentityRecordsVerify{} 623 k.cdc.MustUnmarshal(value, &request) 624 if accumulate { 625 requests = append(requests, request) 626 } 627 return true, nil 628 } 629 630 // we set maximum limit for safety of iteration 631 if request.Pagination != nil && request.Pagination.Limit > kiratypes.PageIterationLimit { 632 request.Pagination.Limit = kiratypes.PageIterationLimit 633 } 634 635 pageRes, err := query.FilteredPaginate(requestStore, request.Pagination, onResult) 636 if err != nil { 637 return nil, err 638 } 639 640 res := types.QueryAllIdentityRecordVerifyRequestsResponse{ 641 VerifyRecords: requests, 642 Pagination: pageRes, 643 } 644 645 return &res, nil 646 } 647 648 // GetAllDataReferenceKeys implements the Query all data reference keys gRPC method 649 func (k Keeper) GetAllDataReferenceKeys(sdkCtx sdk.Context, req *types.QueryDataReferenceKeysRequest) (*types.QueryDataReferenceKeysResponse, error) { 650 if req == nil { 651 return nil, status.Error(codes.InvalidArgument, "empty request") 652 } 653 654 var keys []string 655 store := sdkCtx.KVStore(k.storeKey) 656 dataReferenceStore := prefix.NewStore(store, DataRegistryPrefix) 657 658 pageRes, err := query.Paginate(dataReferenceStore, req.Pagination, func(key []byte, value []byte) error { 659 keys = append(keys, string(key)) 660 return nil 661 }) 662 663 if err != nil { 664 return &types.QueryDataReferenceKeysResponse{}, err 665 } 666 667 res := types.QueryDataReferenceKeysResponse{ 668 Keys: keys, 669 Pagination: pageRes, 670 } 671 672 return &res, nil 673 } 674 675 // GetDataReferenceByKey implements the Query data reference by key gRPC method 676 func (k Keeper) GetDataReferenceByKey(sdkCtx sdk.Context, req *types.QueryDataReferenceRequest) (*types.QueryDataReferenceResponse, error) { 677 if req == nil { 678 return nil, status.Error(codes.InvalidArgument, "empty request") 679 } 680 681 dataReference, ok := k.GetDataRegistryEntry(sdkCtx, req.GetKey()) 682 683 if !ok { 684 return nil, status.Error(codes.NotFound, "not found") 685 } 686 687 res := types.QueryDataReferenceResponse{ 688 Data: &dataReference, 689 } 690 691 return &res, nil 692 } 693 694 // Query all proposal durations 695 func (k Keeper) AllProposalDurations(goCtx context.Context, req *types.QueryAllProposalDurations) (*types.QueryAllProposalDurationsResponse, error) { 696 ctx := sdk.UnwrapSDKContext(goCtx) 697 properties := k.GetNetworkProperties(ctx) 698 allDurations := k.GetAllProposalDurations(ctx) 699 for _, pt := range kiratypes.AllProposalTypes { 700 if allDurations[pt] < properties.MinimumProposalEndTime { 701 allDurations[pt] = properties.MinimumProposalEndTime 702 } 703 } 704 return &types.QueryAllProposalDurationsResponse{ 705 ProposalDurations: allDurations, 706 }, nil 707 } 708 709 // Query single proposal duration 710 func (k Keeper) ProposalDuration(goCtx context.Context, req *types.QueryProposalDuration) (*types.QueryProposalDurationResponse, error) { 711 ctx := sdk.UnwrapSDKContext(goCtx) 712 properties := k.GetNetworkProperties(ctx) 713 duration := k.GetProposalDuration(ctx, req.ProposalType) 714 if duration < properties.MinimumProposalEndTime { 715 duration = properties.MinimumProposalEndTime 716 } 717 return &types.QueryProposalDurationResponse{ 718 Duration: duration, 719 }, nil 720 } 721 722 // Councilors - all councilors (waiting or not), including their corresponding statuses, 723 // ranks & abstenation counters - add sub-query to search by specific KIRA address 724 func (k Keeper) Councilors(goCtx context.Context, req *types.QueryCouncilors) (*types.QueryCouncilorsResponse, error) { 725 ctx := sdk.UnwrapSDKContext(goCtx) 726 727 if req.Address == "" { 728 return &types.QueryCouncilorsResponse{ 729 Councilors: k.GetAllCouncilors(ctx), 730 }, nil 731 } 732 733 addr, err := sdk.AccAddressFromBech32(req.Address) 734 if err != nil { 735 return nil, err 736 } 737 councilor, found := k.GetCouncilor(ctx, addr) 738 if !found { 739 return nil, types.ErrCouncilorNotFound 740 } 741 return &types.QueryCouncilorsResponse{ 742 Councilors: []types.Councilor{councilor}, 743 }, nil 744 } 745 746 // NonCouncilors - list all governance members that are NOT Councilors 747 func (k Keeper) NonCouncilors(goCtx context.Context, req *types.QueryNonCouncilors) (*types.QueryNonCouncilorsResponse, error) { 748 ctx := sdk.UnwrapSDKContext(goCtx) 749 750 networkActorsIterator := k.GetNetworkActorsIterator(ctx) 751 defer networkActorsIterator.Close() 752 networkActors := []types.NetworkActor{} 753 for ; networkActorsIterator.Valid(); networkActorsIterator.Next() { 754 actor := k.GetNetworkActorFromIterator(networkActorsIterator) 755 756 _, found := k.GetCouncilor(ctx, actor.Address) 757 if !found { 758 networkActors = append(networkActors, *actor) 759 } 760 } 761 762 return &types.QueryNonCouncilorsResponse{ 763 NonCouncilors: networkActors, 764 }, nil 765 } 766 767 // AddressesByWhitelistedPermission - list all KIRA addresses by a specific whitelisted permission (address does NOT have to be a Councilor) 768 func (k Keeper) AddressesByWhitelistedPermission(goCtx context.Context, req *types.QueryAddressesByWhitelistedPermission) (*types.QueryAddressesByWhitelistedPermissionResponse, error) { 769 ctx := sdk.UnwrapSDKContext(goCtx) 770 actors := k.GetNetworkActorsByAbsoluteWhitelistPermission(ctx, types.PermValue(req.Permission)) 771 772 addrs := []string{} 773 for _, actor := range actors { 774 addrs = append(addrs, actor.Address.String()) 775 } 776 return &types.QueryAddressesByWhitelistedPermissionResponse{ 777 Addresses: addrs, 778 }, nil 779 } 780 781 // AddressesByBlacklistedPermission - list all KIRA addresses by a specific whitelisted permission (address does NOT have to be a Councilor) 782 func (k Keeper) AddressesByBlacklistedPermission(goCtx context.Context, req *types.QueryAddressesByBlacklistedPermission) (*types.QueryAddressesByBlacklistedPermissionResponse, error) { 783 ctx := sdk.UnwrapSDKContext(goCtx) 784 785 networkActorsIterator := k.GetNetworkActorsIterator(ctx) 786 defer networkActorsIterator.Close() 787 addrs := []string{} 788 for ; networkActorsIterator.Valid(); networkActorsIterator.Next() { 789 actor := k.GetNetworkActorFromIterator(networkActorsIterator) 790 if actor.Permissions.IsBlacklisted(types.PermValue(req.Permission)) { 791 792 addrs = append(addrs, actor.Address.String()) 793 } 794 } 795 796 return &types.QueryAddressesByBlacklistedPermissionResponse{ 797 Addresses: addrs, 798 }, nil 799 } 800 801 // AddressesByWhitelistedRole - list all kira addresses by a specific whitelisted role (address does NOT have to be a Councilor) 802 func (k Keeper) AddressesByWhitelistedRole(goCtx context.Context, req *types.QueryAddressesByWhitelistedRole) (*types.QueryAddressesByWhitelistedRoleResponse, error) { 803 ctx := sdk.UnwrapSDKContext(goCtx) 804 805 addrs := []string{} 806 actorIter := k.GetNetworkActorsByRole(ctx, uint64(req.Role)) 807 for ; actorIter.Valid(); actorIter.Next() { 808 actor := k.GetNetworkActorOrFail(ctx, actorIter.Value()) 809 addrs = append(addrs, actor.Address.String()) 810 } 811 812 return &types.QueryAddressesByWhitelistedRoleResponse{ 813 Addresses: addrs, 814 }, nil 815 }