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, ¶ms); 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, ¶ms); 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 }