github.com/cosmos/cosmos-sdk@v0.50.10/x/group/keeper/grpc_query.go (about)

     1  package keeper
     2  
     3  import (
     4  	"context"
     5  	"math"
     6  
     7  	"google.golang.org/grpc/codes"
     8  	"google.golang.org/grpc/status"
     9  
    10  	errorsmod "cosmossdk.io/errors"
    11  
    12  	sdk "github.com/cosmos/cosmos-sdk/types"
    13  	"github.com/cosmos/cosmos-sdk/types/query"
    14  	"github.com/cosmos/cosmos-sdk/x/group"
    15  	"github.com/cosmos/cosmos-sdk/x/group/errors"
    16  	"github.com/cosmos/cosmos-sdk/x/group/internal/orm"
    17  )
    18  
    19  var _ group.QueryServer = Keeper{}
    20  
    21  // GroupInfo queries info about a group.
    22  func (k Keeper) GroupInfo(goCtx context.Context, request *group.QueryGroupInfoRequest) (*group.QueryGroupInfoResponse, error) {
    23  	ctx := sdk.UnwrapSDKContext(goCtx)
    24  	groupID := request.GroupId
    25  	groupInfo, err := k.getGroupInfo(ctx, groupID)
    26  	if err != nil {
    27  		return nil, errorsmod.Wrap(err, "group")
    28  	}
    29  
    30  	return &group.QueryGroupInfoResponse{Info: &groupInfo}, nil
    31  }
    32  
    33  // getGroupInfo gets the group info of the given group id.
    34  func (k Keeper) getGroupInfo(ctx sdk.Context, id uint64) (group.GroupInfo, error) {
    35  	var obj group.GroupInfo
    36  	_, err := k.groupTable.GetOne(ctx.KVStore(k.key), id, &obj)
    37  	return obj, err
    38  }
    39  
    40  // GroupPolicyInfo queries info about a group policy.
    41  func (k Keeper) GroupPolicyInfo(goCtx context.Context, request *group.QueryGroupPolicyInfoRequest) (*group.QueryGroupPolicyInfoResponse, error) {
    42  	_, err := k.accKeeper.AddressCodec().StringToBytes(request.Address)
    43  	if err != nil {
    44  		return nil, err
    45  	}
    46  
    47  	ctx := sdk.UnwrapSDKContext(goCtx)
    48  	groupPolicyInfo, err := k.getGroupPolicyInfo(ctx, request.Address)
    49  	if err != nil {
    50  		return nil, errorsmod.Wrap(err, "group policy")
    51  	}
    52  
    53  	return &group.QueryGroupPolicyInfoResponse{Info: &groupPolicyInfo}, nil
    54  }
    55  
    56  // getGroupPolicyInfo gets the group policy info of the given account address.
    57  func (k Keeper) getGroupPolicyInfo(ctx sdk.Context, accountAddress string) (group.GroupPolicyInfo, error) {
    58  	var obj group.GroupPolicyInfo
    59  	return obj, k.groupPolicyTable.GetOne(ctx.KVStore(k.key), orm.PrimaryKey(&group.GroupPolicyInfo{Address: accountAddress}), &obj)
    60  }
    61  
    62  // GroupMembers queries all members of a group.
    63  func (k Keeper) GroupMembers(goCtx context.Context, request *group.QueryGroupMembersRequest) (*group.QueryGroupMembersResponse, error) {
    64  	ctx := sdk.UnwrapSDKContext(goCtx)
    65  	groupID := request.GroupId
    66  	it, err := k.getGroupMembers(ctx, groupID, request.Pagination)
    67  	if err != nil {
    68  		return nil, err
    69  	}
    70  
    71  	var members []*group.GroupMember
    72  	pageRes, err := orm.Paginate(it, request.Pagination, &members)
    73  	if err != nil {
    74  		return nil, err
    75  	}
    76  
    77  	return &group.QueryGroupMembersResponse{
    78  		Members:    members,
    79  		Pagination: pageRes,
    80  	}, nil
    81  }
    82  
    83  // getGroupMembers returns an iterator for the given group id and page request.
    84  func (k Keeper) getGroupMembers(ctx sdk.Context, id uint64, pageRequest *query.PageRequest) (orm.Iterator, error) {
    85  	return k.groupMemberByGroupIndex.GetPaginated(ctx.KVStore(k.key), id, pageRequest)
    86  }
    87  
    88  // GroupsByAdmin queries all groups where a given address is admin.
    89  func (k Keeper) GroupsByAdmin(goCtx context.Context, request *group.QueryGroupsByAdminRequest) (*group.QueryGroupsByAdminResponse, error) {
    90  	ctx := sdk.UnwrapSDKContext(goCtx)
    91  	addr, err := k.accKeeper.AddressCodec().StringToBytes(request.Admin)
    92  	if err != nil {
    93  		return nil, err
    94  	}
    95  	it, err := k.getGroupsByAdmin(ctx, addr, request.Pagination)
    96  	if err != nil {
    97  		return nil, err
    98  	}
    99  
   100  	var groups []*group.GroupInfo
   101  	pageRes, err := orm.Paginate(it, request.Pagination, &groups)
   102  	if err != nil {
   103  		return nil, err
   104  	}
   105  
   106  	return &group.QueryGroupsByAdminResponse{
   107  		Groups:     groups,
   108  		Pagination: pageRes,
   109  	}, nil
   110  }
   111  
   112  // getGroupsByAdmin returns an iterator for the given admin account address and page request.
   113  func (k Keeper) getGroupsByAdmin(ctx sdk.Context, admin sdk.AccAddress, pageRequest *query.PageRequest) (orm.Iterator, error) {
   114  	return k.groupByAdminIndex.GetPaginated(ctx.KVStore(k.key), admin.Bytes(), pageRequest)
   115  }
   116  
   117  // GroupPoliciesByGroup queries all groups policies of a given group.
   118  func (k Keeper) GroupPoliciesByGroup(goCtx context.Context, request *group.QueryGroupPoliciesByGroupRequest) (*group.QueryGroupPoliciesByGroupResponse, error) {
   119  	ctx := sdk.UnwrapSDKContext(goCtx)
   120  	groupID := request.GroupId
   121  	it, err := k.getGroupPoliciesByGroup(ctx, groupID, request.Pagination)
   122  	if err != nil {
   123  		return nil, err
   124  	}
   125  
   126  	var policies []*group.GroupPolicyInfo
   127  	pageRes, err := orm.Paginate(it, request.Pagination, &policies)
   128  	if err != nil {
   129  		return nil, err
   130  	}
   131  
   132  	return &group.QueryGroupPoliciesByGroupResponse{
   133  		GroupPolicies: policies,
   134  		Pagination:    pageRes,
   135  	}, nil
   136  }
   137  
   138  // getGroupPoliciesByGroup returns an iterator for the given group id and page request.
   139  func (k Keeper) getGroupPoliciesByGroup(ctx sdk.Context, id uint64, pageRequest *query.PageRequest) (orm.Iterator, error) {
   140  	return k.groupPolicyByGroupIndex.GetPaginated(ctx.KVStore(k.key), id, pageRequest)
   141  }
   142  
   143  // GroupPoliciesByAdmin queries all groups policies where a given address is
   144  // admin.
   145  func (k Keeper) GroupPoliciesByAdmin(goCtx context.Context, request *group.QueryGroupPoliciesByAdminRequest) (*group.QueryGroupPoliciesByAdminResponse, error) {
   146  	ctx := sdk.UnwrapSDKContext(goCtx)
   147  	addr, err := k.accKeeper.AddressCodec().StringToBytes(request.Admin)
   148  	if err != nil {
   149  		return nil, err
   150  	}
   151  	it, err := k.getGroupPoliciesByAdmin(ctx, addr, request.Pagination)
   152  	if err != nil {
   153  		return nil, err
   154  	}
   155  
   156  	var policies []*group.GroupPolicyInfo
   157  	pageRes, err := orm.Paginate(it, request.Pagination, &policies)
   158  	if err != nil {
   159  		return nil, err
   160  	}
   161  
   162  	return &group.QueryGroupPoliciesByAdminResponse{
   163  		GroupPolicies: policies,
   164  		Pagination:    pageRes,
   165  	}, nil
   166  }
   167  
   168  // getGroupPoliciesByAdmin returns an iterator for the given admin account address and page request.
   169  func (k Keeper) getGroupPoliciesByAdmin(ctx sdk.Context, admin sdk.AccAddress, pageRequest *query.PageRequest) (orm.Iterator, error) {
   170  	return k.groupPolicyByAdminIndex.GetPaginated(ctx.KVStore(k.key), admin.Bytes(), pageRequest)
   171  }
   172  
   173  // Proposal queries a proposal.
   174  func (k Keeper) Proposal(goCtx context.Context, request *group.QueryProposalRequest) (*group.QueryProposalResponse, error) {
   175  	ctx := sdk.UnwrapSDKContext(goCtx)
   176  	proposalID := request.ProposalId
   177  	proposal, err := k.getProposal(ctx, proposalID)
   178  	if err != nil {
   179  		return nil, err
   180  	}
   181  
   182  	return &group.QueryProposalResponse{Proposal: &proposal}, nil
   183  }
   184  
   185  // ProposalsByGroupPolicy queries all proposals of a group policy.
   186  func (k Keeper) ProposalsByGroupPolicy(goCtx context.Context, request *group.QueryProposalsByGroupPolicyRequest) (*group.QueryProposalsByGroupPolicyResponse, error) {
   187  	ctx := sdk.UnwrapSDKContext(goCtx)
   188  	addr, err := k.accKeeper.AddressCodec().StringToBytes(request.Address)
   189  	if err != nil {
   190  		return nil, err
   191  	}
   192  	it, err := k.getProposalsByGroupPolicy(ctx, addr, request.Pagination)
   193  	if err != nil {
   194  		return nil, err
   195  	}
   196  
   197  	var proposals []*group.Proposal
   198  	pageRes, err := orm.Paginate(it, request.Pagination, &proposals)
   199  	if err != nil {
   200  		return nil, err
   201  	}
   202  
   203  	return &group.QueryProposalsByGroupPolicyResponse{
   204  		Proposals:  proposals,
   205  		Pagination: pageRes,
   206  	}, nil
   207  }
   208  
   209  // getProposalsByGroupPolicy returns an iterator for the given account address and page request.
   210  func (k Keeper) getProposalsByGroupPolicy(ctx sdk.Context, account sdk.AccAddress, pageRequest *query.PageRequest) (orm.Iterator, error) {
   211  	return k.proposalByGroupPolicyIndex.GetPaginated(ctx.KVStore(k.key), account.Bytes(), pageRequest)
   212  }
   213  
   214  // getProposal gets the proposal info of the given proposal id.
   215  func (k Keeper) getProposal(ctx sdk.Context, proposalID uint64) (group.Proposal, error) {
   216  	var p group.Proposal
   217  	if _, err := k.proposalTable.GetOne(ctx.KVStore(k.key), proposalID, &p); err != nil {
   218  		return group.Proposal{}, errorsmod.Wrap(err, "load proposal")
   219  	}
   220  	return p, nil
   221  }
   222  
   223  // VoteByProposalVoter queries a vote given a voter and a proposal ID.
   224  func (k Keeper) VoteByProposalVoter(goCtx context.Context, request *group.QueryVoteByProposalVoterRequest) (*group.QueryVoteByProposalVoterResponse, error) {
   225  	ctx := sdk.UnwrapSDKContext(goCtx)
   226  	addr, err := k.accKeeper.AddressCodec().StringToBytes(request.Voter)
   227  	if err != nil {
   228  		return nil, err
   229  	}
   230  	proposalID := request.ProposalId
   231  	vote, err := k.getVote(ctx, proposalID, addr)
   232  	if err != nil {
   233  		return nil, err
   234  	}
   235  	return &group.QueryVoteByProposalVoterResponse{
   236  		Vote: &vote,
   237  	}, nil
   238  }
   239  
   240  // VotesByProposal queries all votes on a proposal.
   241  func (k Keeper) VotesByProposal(goCtx context.Context, request *group.QueryVotesByProposalRequest) (*group.QueryVotesByProposalResponse, error) {
   242  	ctx := sdk.UnwrapSDKContext(goCtx)
   243  	proposalID := request.ProposalId
   244  	it, err := k.getVotesByProposal(ctx, proposalID, request.Pagination)
   245  	if err != nil {
   246  		return nil, err
   247  	}
   248  
   249  	var votes []*group.Vote
   250  	pageRes, err := orm.Paginate(it, request.Pagination, &votes)
   251  	if err != nil {
   252  		return nil, err
   253  	}
   254  
   255  	return &group.QueryVotesByProposalResponse{
   256  		Votes:      votes,
   257  		Pagination: pageRes,
   258  	}, nil
   259  }
   260  
   261  // VotesByVoter queries all votes of a voter.
   262  func (k Keeper) VotesByVoter(goCtx context.Context, request *group.QueryVotesByVoterRequest) (*group.QueryVotesByVoterResponse, error) {
   263  	ctx := sdk.UnwrapSDKContext(goCtx)
   264  	addr, err := k.accKeeper.AddressCodec().StringToBytes(request.Voter)
   265  	if err != nil {
   266  		return nil, err
   267  	}
   268  	it, err := k.getVotesByVoter(ctx, addr, request.Pagination)
   269  	if err != nil {
   270  		return nil, err
   271  	}
   272  
   273  	var votes []*group.Vote
   274  	pageRes, err := orm.Paginate(it, request.Pagination, &votes)
   275  	if err != nil {
   276  		return nil, err
   277  	}
   278  
   279  	return &group.QueryVotesByVoterResponse{
   280  		Votes:      votes,
   281  		Pagination: pageRes,
   282  	}, nil
   283  }
   284  
   285  // GroupsByMember queries all groups where the given address is a member of.
   286  func (k Keeper) GroupsByMember(goCtx context.Context, request *group.QueryGroupsByMemberRequest) (*group.QueryGroupsByMemberResponse, error) {
   287  	if request == nil {
   288  		return nil, status.Errorf(codes.InvalidArgument, "empty request")
   289  	}
   290  
   291  	ctx := sdk.UnwrapSDKContext(goCtx)
   292  	member, err := k.accKeeper.AddressCodec().StringToBytes(request.Address)
   293  	if err != nil {
   294  		return nil, err
   295  	}
   296  
   297  	iter, err := k.groupMemberByMemberIndex.GetPaginated(ctx.KVStore(k.key), member, request.Pagination)
   298  	if err != nil {
   299  		return nil, err
   300  	}
   301  
   302  	var members []*group.GroupMember
   303  	pageRes, err := orm.Paginate(iter, request.Pagination, &members)
   304  	if err != nil {
   305  		return nil, err
   306  	}
   307  
   308  	var groups []*group.GroupInfo
   309  	for _, gm := range members {
   310  		groupInfo, err := k.getGroupInfo(ctx, gm.GroupId)
   311  		if err != nil {
   312  			return nil, err
   313  		}
   314  		groups = append(groups, &groupInfo)
   315  	}
   316  
   317  	return &group.QueryGroupsByMemberResponse{
   318  		Groups:     groups,
   319  		Pagination: pageRes,
   320  	}, nil
   321  }
   322  
   323  // getVote gets the vote info for the given proposal id and voter address.
   324  func (k Keeper) getVote(ctx sdk.Context, proposalID uint64, voter sdk.AccAddress) (group.Vote, error) {
   325  	var v group.Vote
   326  	return v, k.voteTable.GetOne(ctx.KVStore(k.key), orm.PrimaryKey(&group.Vote{ProposalId: proposalID, Voter: voter.String()}), &v)
   327  }
   328  
   329  // getVotesByProposal returns an iterator for the given proposal id and page request.
   330  func (k Keeper) getVotesByProposal(ctx sdk.Context, proposalID uint64, pageRequest *query.PageRequest) (orm.Iterator, error) {
   331  	return k.voteByProposalIndex.GetPaginated(ctx.KVStore(k.key), proposalID, pageRequest)
   332  }
   333  
   334  // getVotesByVoter returns an iterator for the given voter address and page request.
   335  func (k Keeper) getVotesByVoter(ctx sdk.Context, voter sdk.AccAddress, pageRequest *query.PageRequest) (orm.Iterator, error) {
   336  	return k.voteByVoterIndex.GetPaginated(ctx.KVStore(k.key), voter.Bytes(), pageRequest)
   337  }
   338  
   339  // TallyResult computes the live tally result of a proposal.
   340  func (k Keeper) TallyResult(goCtx context.Context, request *group.QueryTallyResultRequest) (*group.QueryTallyResultResponse, error) {
   341  	ctx := sdk.UnwrapSDKContext(goCtx)
   342  	proposalID := request.ProposalId
   343  
   344  	proposal, err := k.getProposal(ctx, proposalID)
   345  	if err != nil {
   346  		return nil, err
   347  	}
   348  
   349  	if proposal.Status == group.PROPOSAL_STATUS_WITHDRAWN || proposal.Status == group.PROPOSAL_STATUS_ABORTED {
   350  		return nil, errorsmod.Wrapf(errors.ErrInvalid, "can't get the tally of a proposal with status %s", proposal.Status)
   351  	}
   352  
   353  	var policyInfo group.GroupPolicyInfo
   354  	if policyInfo, err = k.getGroupPolicyInfo(ctx, proposal.GroupPolicyAddress); err != nil {
   355  		return nil, errorsmod.Wrap(err, "load group policy")
   356  	}
   357  
   358  	tallyResult, err := k.Tally(ctx, proposal, policyInfo.GroupId)
   359  	if err != nil {
   360  		return nil, err
   361  	}
   362  
   363  	return &group.QueryTallyResultResponse{
   364  		Tally: tallyResult,
   365  	}, nil
   366  }
   367  
   368  // Groups returns all the groups present in the state.
   369  func (k Keeper) Groups(goCtx context.Context, request *group.QueryGroupsRequest) (*group.QueryGroupsResponse, error) {
   370  	ctx := sdk.UnwrapSDKContext(goCtx)
   371  
   372  	it, err := k.groupTable.PrefixScan(ctx.KVStore(k.key), 1, math.MaxUint64)
   373  	if err != nil {
   374  		return nil, err
   375  	}
   376  	defer it.Close()
   377  
   378  	var groups []*group.GroupInfo
   379  	pageRes, err := orm.Paginate(it, request.Pagination, &groups)
   380  	if err != nil {
   381  		return nil, err
   382  	}
   383  
   384  	return &group.QueryGroupsResponse{
   385  		Groups:     groups,
   386  		Pagination: pageRes,
   387  	}, nil
   388  }