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  }