github.com/Finschia/finschia-sdk@v0.48.1/x/slashing/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/slashing/types" 11 ) 12 13 // NewQuerier creates a new querier for slashing clients. 14 func NewQuerier(k 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.QueryParameters: 18 return queryParams(ctx, k, legacyQuerierCdc) 19 20 case types.QuerySigningInfo: 21 return querySigningInfo(ctx, req, k, legacyQuerierCdc) 22 23 case types.QuerySigningInfos: 24 return querySigningInfos(ctx, req, k, legacyQuerierCdc) 25 26 default: 27 return nil, sdkerrors.Wrapf(sdkerrors.ErrUnknownRequest, "unknown %s query endpoint: %s", types.ModuleName, path[0]) 28 } 29 } 30 } 31 32 func queryParams(ctx sdk.Context, k Keeper, legacyQuerierCdc *codec.LegacyAmino) ([]byte, error) { 33 params := k.GetParams(ctx) 34 35 res, err := codec.MarshalJSONIndent(legacyQuerierCdc, params) 36 if err != nil { 37 return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error()) 38 } 39 40 return res, nil 41 } 42 43 func querySigningInfo(ctx sdk.Context, req abci.RequestQuery, k Keeper, legacyQuerierCdc *codec.LegacyAmino) ([]byte, error) { 44 var params types.QuerySigningInfoRequest 45 46 err := legacyQuerierCdc.UnmarshalJSON(req.Data, ¶ms) 47 if err != nil { 48 return nil, sdkerrors.Wrap(sdkerrors.ErrJSONUnmarshal, err.Error()) 49 } 50 51 // https://github.com/cosmos/cosmos-sdk/issues/12573 52 // Will be removed, but fix this 53 addr, err := sdk.ConsAddressFromBech32(params.ConsAddress) 54 if err != nil { 55 return nil, sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, err.Error()) 56 } 57 signingInfo, found := k.GetValidatorSigningInfo(ctx, addr) 58 if !found { 59 return nil, sdkerrors.Wrap(types.ErrNoSigningInfoFound, params.ConsAddress) 60 } 61 62 res, err := codec.MarshalJSONIndent(legacyQuerierCdc, signingInfo) 63 if err != nil { 64 return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error()) 65 } 66 67 return res, nil 68 } 69 70 func querySigningInfos(ctx sdk.Context, req abci.RequestQuery, k Keeper, legacyQuerierCdc *codec.LegacyAmino) ([]byte, error) { 71 var params types.QuerySigningInfosParams 72 73 err := legacyQuerierCdc.UnmarshalJSON(req.Data, ¶ms) 74 if err != nil { 75 return nil, sdkerrors.Wrap(sdkerrors.ErrJSONUnmarshal, err.Error()) 76 } 77 78 var signingInfos []types.ValidatorSigningInfo 79 80 k.IterateValidatorSigningInfos(ctx, func(consAddr sdk.ConsAddress, info types.ValidatorSigningInfo) (stop bool) { 81 signingInfos = append(signingInfos, info) 82 return false 83 }) 84 85 start, end := client.Paginate(len(signingInfos), params.Page, params.Limit, int(k.sk.MaxValidators(ctx))) 86 if start < 0 || end < 0 { 87 signingInfos = []types.ValidatorSigningInfo{} 88 } else { 89 signingInfos = signingInfos[start:end] 90 } 91 92 res, err := codec.MarshalJSONIndent(legacyQuerierCdc, signingInfos) 93 if err != nil { 94 return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error()) 95 } 96 97 return res, nil 98 }