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, &params)
    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, &params)
    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  }