github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/libs/cosmos-sdk/x/bank/internal/keeper/querier.go (about)

     1  package keeper
     2  
     3  import (
     4  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/codec"
     5  	sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types"
     6  	sdkerrors "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types/errors"
     7  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types/query"
     8  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/bank/internal/types"
     9  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/bank/internal/typesadapter"
    10  	abci "github.com/fibonacci-chain/fbc/libs/tendermint/abci/types"
    11  )
    12  
    13  const (
    14  	// query balance path
    15  	QueryBalance     = "balances"
    16  	GrpcQueryBalance = "grpc_balances"
    17  )
    18  
    19  // NewQuerier returns a new sdk.Keeper instance.
    20  func NewQuerier(k Keeper) sdk.Querier {
    21  	return func(ctx sdk.Context, path []string, req abci.RequestQuery) ([]byte, error) {
    22  		switch path[0] {
    23  		case QueryBalance:
    24  			return queryBalance(ctx, req, k)
    25  		case GrpcQueryBalance:
    26  			return grpcQueryBalanceAdapter(ctx, req, k)
    27  		default:
    28  			return nil, sdkerrors.Wrapf(sdkerrors.ErrUnknownRequest, "unknown query path: %s", path[0])
    29  		}
    30  	}
    31  }
    32  
    33  // queryBalance fetch an account's balance for the supplied height.
    34  // Height and account address are passed as first and second path components respectively.
    35  func queryBalance(ctx sdk.Context, req abci.RequestQuery, k Keeper) ([]byte, error) {
    36  	var ret []byte
    37  	var params types.QueryBalanceParams
    38  	if err := types.ModuleCdc.UnmarshalJSON(req.Data, &params); err != nil {
    39  		return nil, sdkerrors.Wrap(sdkerrors.ErrJSONUnmarshal, err.Error())
    40  	}
    41  	coins := k.GetCoins(ctx, params.Address)
    42  	if coins == nil {
    43  		coins = sdk.NewCoins()
    44  	}
    45  
    46  	bz, err := codec.MarshalJSONIndent(types.ModuleCdc, coins)
    47  	if err != nil {
    48  		return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error())
    49  	}
    50  	ret = bz
    51  
    52  	return ret, nil
    53  }
    54  
    55  func grpcQueryBalanceAdapter(ctx sdk.Context, req abci.RequestQuery, k Keeper) ([]byte, error) {
    56  	bk, ok := k.(*BaseKeeper)
    57  	var ret []byte
    58  	var a sdk.AccAddress
    59  	var er error
    60  	if ok {
    61  		protoReq := typesadapter.QueryAllBalancesRequest{}
    62  		if err := bk.marshal.GetProtocMarshal().UnmarshalBinaryBare(req.Data, &protoReq); nil != err {
    63  			return nil, sdkerrors.Wrap(sdkerrors.ErrJSONUnmarshal, err.Error())
    64  		}
    65  		a, er = sdk.AccAddressFromBech32(protoReq.Address)
    66  		if nil != er {
    67  			return nil, sdkerrors.Wrap(sdkerrors.ErrJSONUnmarshal, er.Error())
    68  		}
    69  		coins := k.GetCoins(ctx, a)
    70  		if coins == nil {
    71  			coins = sdk.NewCoins()
    72  		}
    73  		bs := make(sdk.CoinAdapters, 0)
    74  		for _, c := range coins {
    75  			var ada sdk.CoinAdapter
    76  			if c.Denom == sdk.DefaultBondDenom {
    77  				ada = sdk.CoinAdapter{
    78  					Denom:  sdk.DefaultIbcWei,
    79  					Amount: sdk.NewIntFromBigInt(c.Amount.BigInt()),
    80  				}
    81  			} else {
    82  				ada = sdk.CoinAdapter{
    83  					Denom:  c.Denom,
    84  					Amount: sdk.NewIntFromBigInt(c.Amount.BigInt()),
    85  				}
    86  			}
    87  
    88  			bs = append(bs, ada)
    89  		}
    90  		resp := typesadapter.QueryAllBalancesResponse{
    91  			Balances:   bs,
    92  			Pagination: &query.PageResponse{},
    93  		}
    94  		bz, err := bk.marshal.GetProtocMarshal().MarshalBinaryBare(&resp)
    95  		if err != nil {
    96  			return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error())
    97  		}
    98  		ret = bz
    99  	} else {
   100  		var params types.QueryBalanceParams
   101  		if err := types.ModuleCdc.UnmarshalJSON(req.Data, &params); err != nil {
   102  			return nil, sdkerrors.Wrap(sdkerrors.ErrJSONUnmarshal, err.Error())
   103  		}
   104  		coins := k.GetCoins(ctx, params.Address)
   105  		if coins == nil {
   106  			coins = sdk.NewCoins()
   107  		}
   108  
   109  		bz, err := codec.MarshalJSONIndent(types.ModuleCdc, coins)
   110  		if err != nil {
   111  			return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error())
   112  		}
   113  		ret = bz
   114  	}
   115  
   116  	return ret, nil
   117  }