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 }