github.com/lino-network/lino@v0.6.11/x/account/querier.go (about)

     1  package account
     2  
     3  import (
     4  	"encoding/hex"
     5  	"strconv"
     6  	"strings"
     7  
     8  	wire "github.com/cosmos/cosmos-sdk/codec"
     9  	sdk "github.com/cosmos/cosmos-sdk/types"
    10  	abci "github.com/tendermint/tendermint/abci/types"
    11  	rpcclient "github.com/tendermint/tendermint/rpc/client"
    12  
    13  	linotypes "github.com/lino-network/lino/types"
    14  	"github.com/lino-network/lino/utils"
    15  	"github.com/lino-network/lino/x/account/model"
    16  	"github.com/lino-network/lino/x/account/types"
    17  )
    18  
    19  // creates a querier for account REST endpoints
    20  func NewQuerier(am AccountKeeper) sdk.Querier {
    21  	cdc := wire.New()
    22  	wire.RegisterCrypto(cdc)
    23  	return func(ctx sdk.Context, path []string, req abci.RequestQuery) (res []byte, err sdk.Error) {
    24  		switch path[0] {
    25  		case types.QueryAccountInfo:
    26  			return utils.NewQueryResolver(1, func(args ...string) (interface{}, sdk.Error) {
    27  				return am.GetInfo(ctx, linotypes.AccountKey(args[0]))
    28  			})(ctx, cdc, path)
    29  		case types.QueryAccountBank:
    30  			return utils.NewQueryResolver(1, func(args ...string) (interface{}, sdk.Error) {
    31  				return am.GetBank(ctx, linotypes.AccountKey(args[0]))
    32  			})(ctx, cdc, path)
    33  		case types.QueryAccountBankByAddress:
    34  			return utils.NewQueryResolver(1, func(args ...string) (interface{}, sdk.Error) {
    35  				addr, e := sdk.AccAddressFromBech32(args[0])
    36  				if e != nil {
    37  					return nil, types.ErrQueryFailed()
    38  				}
    39  				return am.GetBankByAddress(ctx, addr)
    40  			})(ctx, cdc, path)
    41  		case types.QueryAccountMeta:
    42  			return utils.NewQueryResolver(1, func(args ...string) (interface{}, sdk.Error) {
    43  				return am.GetMeta(ctx, linotypes.AccountKey(args[0]))
    44  			})(ctx, cdc, path)
    45  		case types.QueryTxAndAccountSequence:
    46  			return queryTxAndSequenceNumber(ctx, cdc, path[1:], req, am)
    47  		case types.QueryPool:
    48  			return utils.NewQueryResolver(1, func(args ...string) (interface{}, sdk.Error) {
    49  				poolname := strings.Join(args, "/")
    50  				return am.GetPool(ctx, linotypes.PoolName(poolname))
    51  			})(ctx, cdc, path)
    52  		case types.QuerySupply:
    53  			return utils.NewQueryResolver(0, func(args ...string) (interface{}, sdk.Error) {
    54  				return am.GetSupply(ctx), nil
    55  			})(ctx, cdc, path)
    56  		default:
    57  			return nil, sdk.ErrUnknownRequest("unknown account query endpoint")
    58  		}
    59  	}
    60  }
    61  
    62  func queryTxAndSequenceNumber(ctx sdk.Context, cdc *wire.Codec, path []string, req abci.RequestQuery, am AccountKeeper) ([]byte, sdk.Error) {
    63  	if err := linotypes.CheckPathContentAndMinLength(path, 2); err != nil {
    64  		return nil, err
    65  	}
    66  	isAddr := false
    67  	var e error
    68  	if len(path) == 3 {
    69  		isAddr, e = strconv.ParseBool(path[2])
    70  		if e != nil {
    71  			return nil, types.ErrQueryFailed()
    72  		}
    73  	}
    74  
    75  	var bank *model.AccountBank
    76  	var err sdk.Error
    77  	if isAddr {
    78  		addr, e := sdk.AccAddressFromBech32(path[0])
    79  		if e != nil {
    80  			return nil, types.ErrQueryFailed()
    81  		}
    82  		bank, err = am.GetBankByAddress(ctx, addr)
    83  		if err != nil {
    84  			return nil, err
    85  		}
    86  	} else {
    87  		bank, err = am.GetBank(ctx, linotypes.AccountKey(path[0]))
    88  		if err != nil {
    89  			return nil, err
    90  		}
    91  	}
    92  
    93  	txAndSeq := model.TxAndSequenceNumber{
    94  		Username: path[0],
    95  		Sequence: bank.Sequence,
    96  	}
    97  
    98  	txHash, decodeFail := hex.DecodeString(path[1])
    99  	if decodeFail != nil {
   100  		return nil, types.ErrQueryFailed()
   101  	}
   102  
   103  	rpc := rpcclient.NewHTTP("http://localhost:26657", "/websocket")
   104  	tx, _ := rpc.Tx(txHash, false)
   105  	if tx != nil {
   106  		txAndSeq.Tx = &model.Transaction{
   107  			Hash:   hex.EncodeToString(tx.Hash),
   108  			Height: tx.Height,
   109  			Tx:     tx.Tx,
   110  			Code:   tx.TxResult.Code,
   111  			Log:    tx.TxResult.Log,
   112  		}
   113  	}
   114  	res, marshalErr := cdc.MarshalJSON(txAndSeq)
   115  	if marshalErr != nil {
   116  		return nil, types.ErrQueryFailed()
   117  	}
   118  	return res, nil
   119  }