github.com/Finschia/finschia-sdk@v0.48.1/x/gov/keeper/querier.go (about) 1 package keeper 2 3 import ( 4 abci "github.com/tendermint/tendermint/abci/types" 5 6 "github.com/Finschia/finschia-sdk/client" 7 "github.com/Finschia/finschia-sdk/codec" 8 sdk "github.com/Finschia/finschia-sdk/types" 9 sdkerrors "github.com/Finschia/finschia-sdk/types/errors" 10 "github.com/Finschia/finschia-sdk/x/gov/types" 11 ) 12 13 // NewQuerier creates a new gov Querier instance 14 func NewQuerier(keeper Keeper, legacyQuerierCdc *codec.LegacyAmino) sdk.Querier { 15 return func(ctx sdk.Context, path []string, req abci.RequestQuery) ([]byte, error) { 16 switch path[0] { 17 case types.QueryParams: 18 return queryParams(ctx, path[1:], req, keeper, legacyQuerierCdc) 19 20 case types.QueryProposals: 21 return queryProposals(ctx, path[1:], req, keeper, legacyQuerierCdc) 22 23 case types.QueryProposal: 24 return queryProposal(ctx, path[1:], req, keeper, legacyQuerierCdc) 25 26 case types.QueryDeposits: 27 return queryDeposits(ctx, path[1:], req, keeper, legacyQuerierCdc) 28 29 case types.QueryDeposit: 30 return queryDeposit(ctx, path[1:], req, keeper, legacyQuerierCdc) 31 32 case types.QueryVotes: 33 return queryVotes(ctx, path[1:], req, keeper, legacyQuerierCdc) 34 35 case types.QueryVote: 36 return queryVote(ctx, path[1:], req, keeper, legacyQuerierCdc) 37 38 case types.QueryTally: 39 return queryTally(ctx, path[1:], req, keeper, legacyQuerierCdc) 40 41 default: 42 return nil, sdkerrors.Wrapf(sdkerrors.ErrUnknownRequest, "unknown query path: %s", path[0]) 43 } 44 } 45 } 46 47 func queryParams(ctx sdk.Context, path []string, req abci.RequestQuery, keeper Keeper, legacyQuerierCdc *codec.LegacyAmino) ([]byte, error) { 48 switch path[0] { 49 case types.ParamDeposit: 50 bz, err := codec.MarshalJSONIndent(legacyQuerierCdc, keeper.GetDepositParams(ctx)) 51 if err != nil { 52 return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error()) 53 } 54 return bz, nil 55 56 case types.ParamVoting: 57 bz, err := codec.MarshalJSONIndent(legacyQuerierCdc, keeper.GetVotingParams(ctx)) 58 if err != nil { 59 return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error()) 60 } 61 return bz, nil 62 63 case types.ParamTallying: 64 bz, err := codec.MarshalJSONIndent(legacyQuerierCdc, keeper.GetTallyParams(ctx)) 65 if err != nil { 66 return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error()) 67 } 68 return bz, nil 69 70 default: 71 return nil, sdkerrors.Wrapf(sdkerrors.ErrUnknownRequest, "%s is not a valid query request path", req.Path) 72 } 73 } 74 75 // nolint: unparam 76 func queryProposal(ctx sdk.Context, path []string, req abci.RequestQuery, keeper Keeper, legacyQuerierCdc *codec.LegacyAmino) ([]byte, error) { 77 var params types.QueryProposalParams 78 err := legacyQuerierCdc.UnmarshalJSON(req.Data, ¶ms) 79 if err != nil { 80 return nil, sdkerrors.Wrap(sdkerrors.ErrJSONUnmarshal, err.Error()) 81 } 82 83 proposal, ok := keeper.GetProposal(ctx, params.ProposalID) 84 if !ok { 85 return nil, sdkerrors.Wrapf(types.ErrUnknownProposal, "%d", params.ProposalID) 86 } 87 88 bz, err := codec.MarshalJSONIndent(legacyQuerierCdc, proposal) 89 if err != nil { 90 return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error()) 91 } 92 93 return bz, nil 94 } 95 96 // nolint: unparam 97 func queryDeposit(ctx sdk.Context, path []string, req abci.RequestQuery, keeper Keeper, legacyQuerierCdc *codec.LegacyAmino) ([]byte, error) { 98 var params types.QueryDepositParams 99 err := legacyQuerierCdc.UnmarshalJSON(req.Data, ¶ms) 100 if err != nil { 101 return nil, sdkerrors.Wrap(sdkerrors.ErrJSONUnmarshal, err.Error()) 102 } 103 104 deposit, _ := keeper.GetDeposit(ctx, params.ProposalID, params.Depositor) 105 bz, err := codec.MarshalJSONIndent(legacyQuerierCdc, deposit) 106 if err != nil { 107 return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error()) 108 } 109 110 return bz, nil 111 } 112 113 // nolint: unparam 114 func queryVote(ctx sdk.Context, path []string, req abci.RequestQuery, keeper Keeper, legacyQuerierCdc *codec.LegacyAmino) ([]byte, error) { 115 var params types.QueryVoteParams 116 err := legacyQuerierCdc.UnmarshalJSON(req.Data, ¶ms) 117 if err != nil { 118 return nil, sdkerrors.Wrap(sdkerrors.ErrJSONUnmarshal, err.Error()) 119 } 120 121 vote, _ := keeper.GetVote(ctx, params.ProposalID, params.Voter) 122 bz, err := codec.MarshalJSONIndent(legacyQuerierCdc, vote) 123 if err != nil { 124 return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error()) 125 } 126 127 return bz, nil 128 } 129 130 // nolint: unparam 131 func queryDeposits(ctx sdk.Context, path []string, req abci.RequestQuery, keeper Keeper, legacyQuerierCdc *codec.LegacyAmino) ([]byte, error) { 132 var params types.QueryProposalParams 133 err := legacyQuerierCdc.UnmarshalJSON(req.Data, ¶ms) 134 if err != nil { 135 return nil, sdkerrors.Wrap(sdkerrors.ErrJSONUnmarshal, err.Error()) 136 } 137 138 deposits := keeper.GetDeposits(ctx, params.ProposalID) 139 if deposits == nil { 140 deposits = types.Deposits{} 141 } 142 143 bz, err := codec.MarshalJSONIndent(legacyQuerierCdc, deposits) 144 if err != nil { 145 return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error()) 146 } 147 148 return bz, nil 149 } 150 151 // nolint: unparam 152 func queryTally(ctx sdk.Context, path []string, req abci.RequestQuery, keeper Keeper, legacyQuerierCdc *codec.LegacyAmino) ([]byte, error) { 153 var params types.QueryProposalParams 154 err := legacyQuerierCdc.UnmarshalJSON(req.Data, ¶ms) 155 if err != nil { 156 return nil, sdkerrors.Wrap(sdkerrors.ErrJSONUnmarshal, err.Error()) 157 } 158 159 proposalID := params.ProposalID 160 161 proposal, ok := keeper.GetProposal(ctx, proposalID) 162 if !ok { 163 return nil, sdkerrors.Wrapf(types.ErrUnknownProposal, "%d", proposalID) 164 } 165 166 var tallyResult types.TallyResult 167 168 switch { 169 case proposal.Status == types.StatusDepositPeriod: 170 tallyResult = types.EmptyTallyResult() 171 172 case proposal.Status == types.StatusPassed || proposal.Status == types.StatusRejected: 173 tallyResult = proposal.FinalTallyResult 174 175 default: 176 // proposal is in voting period 177 _, _, tallyResult = keeper.Tally(ctx, proposal) 178 } 179 180 bz, err := codec.MarshalJSONIndent(legacyQuerierCdc, tallyResult) 181 if err != nil { 182 return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error()) 183 } 184 185 return bz, nil 186 } 187 188 // nolint: unparam 189 func queryVotes(ctx sdk.Context, path []string, req abci.RequestQuery, keeper Keeper, legacyQuerierCdc *codec.LegacyAmino) ([]byte, error) { 190 var params types.QueryProposalVotesParams 191 err := legacyQuerierCdc.UnmarshalJSON(req.Data, ¶ms) 192 if err != nil { 193 return nil, sdkerrors.Wrap(sdkerrors.ErrJSONUnmarshal, err.Error()) 194 } 195 196 votes := keeper.GetVotes(ctx, params.ProposalID) 197 if votes == nil { 198 votes = types.Votes{} 199 } else { 200 start, end := client.Paginate(len(votes), params.Page, params.Limit, 100) 201 if start < 0 || end < 0 { 202 votes = types.Votes{} 203 } else { 204 votes = votes[start:end] 205 } 206 } 207 208 bz, err := codec.MarshalJSONIndent(legacyQuerierCdc, votes) 209 if err != nil { 210 return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error()) 211 } 212 213 return bz, nil 214 } 215 216 func queryProposals(ctx sdk.Context, _ []string, req abci.RequestQuery, keeper Keeper, legacyQuerierCdc *codec.LegacyAmino) ([]byte, error) { 217 var params types.QueryProposalsParams 218 err := legacyQuerierCdc.UnmarshalJSON(req.Data, ¶ms) 219 if err != nil { 220 return nil, sdkerrors.Wrap(sdkerrors.ErrJSONUnmarshal, err.Error()) 221 } 222 223 proposals := keeper.GetProposalsFiltered(ctx, params) 224 if proposals == nil { 225 proposals = types.Proposals{} 226 } 227 228 bz, err := codec.MarshalJSONIndent(legacyQuerierCdc, proposals) 229 if err != nil { 230 return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error()) 231 } 232 233 return bz, nil 234 }