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 }