github.com/Finschia/finschia-sdk@v0.49.1/x/foundation/keeper/internal/grpc_query.go (about) 1 package internal 2 3 import ( 4 "context" 5 6 "github.com/gogo/protobuf/proto" 7 "google.golang.org/grpc/codes" 8 "google.golang.org/grpc/status" 9 10 codectypes "github.com/Finschia/finschia-sdk/codec/types" 11 "github.com/Finschia/finschia-sdk/store/prefix" 12 sdk "github.com/Finschia/finschia-sdk/types" 13 sdkerrors "github.com/Finschia/finschia-sdk/types/errors" 14 "github.com/Finschia/finschia-sdk/types/query" 15 "github.com/Finschia/finschia-sdk/x/foundation" 16 ) 17 18 type queryServer struct { 19 keeper Keeper 20 } 21 22 func NewQueryServer(keeper Keeper) foundation.QueryServer { 23 return &queryServer{ 24 keeper: keeper, 25 } 26 } 27 28 var _ foundation.QueryServer = (*queryServer)(nil) 29 30 func (s queryServer) Params(c context.Context, req *foundation.QueryParamsRequest) (*foundation.QueryParamsResponse, error) { 31 if req == nil { 32 return nil, status.Error(codes.InvalidArgument, "invalid request") 33 } 34 35 ctx := sdk.UnwrapSDKContext(c) 36 37 return &foundation.QueryParamsResponse{Params: s.keeper.GetParams(ctx)}, nil 38 } 39 40 func (s queryServer) Treasury(c context.Context, req *foundation.QueryTreasuryRequest) (*foundation.QueryTreasuryResponse, error) { 41 if req == nil { 42 return nil, status.Error(codes.InvalidArgument, "invalid request") 43 } 44 45 ctx := sdk.UnwrapSDKContext(c) 46 amount := s.keeper.GetTreasury(ctx) 47 48 return &foundation.QueryTreasuryResponse{Amount: amount}, nil 49 } 50 51 func (s queryServer) FoundationInfo(c context.Context, req *foundation.QueryFoundationInfoRequest) (*foundation.QueryFoundationInfoResponse, error) { 52 if req == nil { 53 return nil, status.Error(codes.InvalidArgument, "invalid request") 54 } 55 56 ctx := sdk.UnwrapSDKContext(c) 57 info := s.keeper.GetFoundationInfo(ctx) 58 59 return &foundation.QueryFoundationInfoResponse{Info: info}, nil 60 } 61 62 func (s queryServer) Member(c context.Context, req *foundation.QueryMemberRequest) (*foundation.QueryMemberResponse, error) { 63 if req == nil { 64 return nil, status.Error(codes.InvalidArgument, "invalid request") 65 } 66 67 ctx := sdk.UnwrapSDKContext(c) 68 addr, err := sdk.AccAddressFromBech32(req.Address) 69 if err != nil { 70 return nil, err 71 } 72 member, err := s.keeper.GetMember(ctx, addr) 73 if err != nil { 74 return nil, err 75 } 76 77 return &foundation.QueryMemberResponse{Member: member}, nil 78 } 79 80 func (s queryServer) Members(c context.Context, req *foundation.QueryMembersRequest) (*foundation.QueryMembersResponse, error) { 81 if req == nil { 82 return nil, status.Error(codes.InvalidArgument, "invalid request") 83 } 84 85 var members []foundation.Member 86 ctx := sdk.UnwrapSDKContext(c) 87 store := ctx.KVStore(s.keeper.storeKey) 88 memberStore := prefix.NewStore(store, memberKeyPrefix) 89 pageRes, err := query.Paginate(memberStore, req.Pagination, func(key, value []byte) error { 90 var member foundation.Member 91 s.keeper.cdc.MustUnmarshal(value, &member) 92 members = append(members, member) 93 return nil 94 }) 95 if err != nil { 96 return nil, err 97 } 98 99 return &foundation.QueryMembersResponse{Members: members, Pagination: pageRes}, nil 100 } 101 102 func (s queryServer) Proposal(c context.Context, req *foundation.QueryProposalRequest) (*foundation.QueryProposalResponse, error) { 103 if req == nil { 104 return nil, status.Error(codes.InvalidArgument, "invalid request") 105 } 106 107 ctx := sdk.UnwrapSDKContext(c) 108 proposal, err := s.keeper.GetProposal(ctx, req.ProposalId) 109 if err != nil { 110 return nil, err 111 } 112 113 return &foundation.QueryProposalResponse{Proposal: proposal}, nil 114 } 115 116 func (s queryServer) Proposals(c context.Context, req *foundation.QueryProposalsRequest) (*foundation.QueryProposalsResponse, error) { 117 if req == nil { 118 return nil, status.Error(codes.InvalidArgument, "invalid request") 119 } 120 121 var proposals []foundation.Proposal 122 ctx := sdk.UnwrapSDKContext(c) 123 store := ctx.KVStore(s.keeper.storeKey) 124 proposalStore := prefix.NewStore(store, proposalKeyPrefix) 125 pageRes, err := query.Paginate(proposalStore, req.Pagination, func(key, value []byte) error { 126 var proposal foundation.Proposal 127 s.keeper.cdc.MustUnmarshal(value, &proposal) 128 proposals = append(proposals, proposal) 129 return nil 130 }) 131 if err != nil { 132 return nil, err 133 } 134 135 return &foundation.QueryProposalsResponse{Proposals: proposals, Pagination: pageRes}, nil 136 } 137 138 func (s queryServer) Vote(c context.Context, req *foundation.QueryVoteRequest) (*foundation.QueryVoteResponse, error) { 139 if req == nil { 140 return nil, status.Error(codes.InvalidArgument, "invalid request") 141 } 142 143 ctx := sdk.UnwrapSDKContext(c) 144 voter, err := sdk.AccAddressFromBech32(req.Voter) 145 if err != nil { 146 return nil, status.Errorf(codes.InvalidArgument, "invalid voter address") 147 } 148 vote, err := s.keeper.GetVote(ctx, req.ProposalId, voter) 149 if err != nil { 150 return nil, err 151 } 152 153 return &foundation.QueryVoteResponse{Vote: vote}, nil 154 } 155 156 func (s queryServer) Votes(c context.Context, req *foundation.QueryVotesRequest) (*foundation.QueryVotesResponse, error) { 157 if req == nil { 158 return nil, status.Error(codes.InvalidArgument, "invalid request") 159 } 160 161 var votes []foundation.Vote 162 ctx := sdk.UnwrapSDKContext(c) 163 store := ctx.KVStore(s.keeper.storeKey) 164 voteStore := prefix.NewStore(store, append(voteKeyPrefix, Uint64ToBytes(req.ProposalId)...)) 165 pageRes, err := query.Paginate(voteStore, req.Pagination, func(key, value []byte) error { 166 var vote foundation.Vote 167 s.keeper.cdc.MustUnmarshal(value, &vote) 168 votes = append(votes, vote) 169 return nil 170 }) 171 if err != nil { 172 return nil, err 173 } 174 175 return &foundation.QueryVotesResponse{Votes: votes, Pagination: pageRes}, nil 176 } 177 178 func (s queryServer) TallyResult(c context.Context, req *foundation.QueryTallyResultRequest) (*foundation.QueryTallyResultResponse, error) { 179 if req == nil { 180 return nil, status.Error(codes.InvalidArgument, "invalid request") 181 } 182 183 ctx := sdk.UnwrapSDKContext(c) 184 proposal, err := s.keeper.GetProposal(ctx, req.ProposalId) 185 if err != nil { 186 return nil, err 187 } 188 189 tally, err := s.keeper.tally(ctx, *proposal) 190 if err != nil { 191 return nil, err 192 } 193 194 return &foundation.QueryTallyResultResponse{Tally: tally}, nil 195 } 196 197 func (s queryServer) Censorships(c context.Context, req *foundation.QueryCensorshipsRequest) (*foundation.QueryCensorshipsResponse, error) { 198 if req == nil { 199 return nil, status.Error(codes.InvalidArgument, "invalid request") 200 } 201 202 var censorships []foundation.Censorship 203 ctx := sdk.UnwrapSDKContext(c) 204 store := ctx.KVStore(s.keeper.storeKey) 205 censorshipStore := prefix.NewStore(store, censorshipKeyPrefix) 206 pageRes, err := query.Paginate(censorshipStore, req.Pagination, func(key, value []byte) error { 207 var censorship foundation.Censorship 208 s.keeper.cdc.MustUnmarshal(value, &censorship) 209 censorships = append(censorships, censorship) 210 return nil 211 }) 212 if err != nil { 213 return nil, err 214 } 215 216 return &foundation.QueryCensorshipsResponse{Censorships: censorships, Pagination: pageRes}, nil 217 } 218 219 func (s queryServer) Grants(c context.Context, req *foundation.QueryGrantsRequest) (*foundation.QueryGrantsResponse, error) { 220 if req == nil { 221 return nil, status.Error(codes.InvalidArgument, "invalid request") 222 } 223 224 grantee, err := sdk.AccAddressFromBech32(req.Grantee) 225 if err != nil { 226 return nil, err 227 } 228 229 ctx := sdk.UnwrapSDKContext(c) 230 store := ctx.KVStore(s.keeper.storeKey) 231 232 if req.MsgTypeUrl != "" { 233 keyPrefix := grantKey(grantee, req.MsgTypeUrl) 234 grantStore := prefix.NewStore(store, keyPrefix) 235 236 var authorizations []*codectypes.Any 237 _, err = query.Paginate(grantStore, req.Pagination, func(key, value []byte) error { 238 var authorization foundation.Authorization 239 if err := s.keeper.cdc.UnmarshalInterface(value, &authorization); err != nil { 240 panic(err) 241 } 242 243 msg, ok := authorization.(proto.Message) 244 if !ok { 245 panic(sdkerrors.ErrInvalidType.Wrapf("can't proto marshal %T", msg)) 246 } 247 any, err := codectypes.NewAnyWithValue(msg) 248 if err != nil { 249 panic(err) 250 } 251 authorizations = append(authorizations, any) 252 253 return nil 254 }) 255 if err != nil { 256 return nil, err 257 } 258 259 return &foundation.QueryGrantsResponse{Authorizations: authorizations}, nil 260 261 } 262 263 keyPrefix := grantKeyPrefixByGrantee(grantee) 264 grantStore := prefix.NewStore(store, keyPrefix) 265 266 var authorizations []*codectypes.Any 267 pageRes, err := query.Paginate(grantStore, req.Pagination, func(key, value []byte) error { 268 var authorization foundation.Authorization 269 if err := s.keeper.cdc.UnmarshalInterface(value, &authorization); err != nil { 270 panic(err) 271 } 272 273 msg, ok := authorization.(proto.Message) 274 if !ok { 275 panic(sdkerrors.ErrInvalidType.Wrapf("can't proto marshal %T", msg)) 276 } 277 any, err := codectypes.NewAnyWithValue(msg) 278 if err != nil { 279 panic(err) 280 } 281 authorizations = append(authorizations, any) 282 283 return nil 284 }) 285 if err != nil { 286 return nil, err 287 } 288 289 return &foundation.QueryGrantsResponse{Authorizations: authorizations, Pagination: pageRes}, nil 290 }