github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/libs/cosmos-sdk/x/auth/client/utils/cm40_query.go (about) 1 package utils 2 3 import ( 4 "encoding/hex" 5 "errors" 6 "fmt" 7 "strings" 8 "time" 9 10 codectypes "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/codec/types" 11 12 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/client/context" 13 types "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types/ibc-adapter" 14 ibc_tx "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/auth/ibc-tx" 15 ctypes "github.com/fibonacci-chain/fbc/libs/tendermint/rpc/core/types" 16 ) 17 18 func Query40Tx(cliCtx context.CLIContext, hashHexStr string) (*types.TxResponse, error) { 19 // strip 0x prefix 20 if strings.HasPrefix(hashHexStr, "0x") { 21 hashHexStr = hashHexStr[2:] 22 } 23 24 hash, err := hex.DecodeString(hashHexStr) 25 if err != nil { 26 return nil, err 27 } 28 29 node, err := cliCtx.GetNode() 30 if err != nil { 31 return nil, err 32 } 33 34 resTx, err := node.Tx(hash, !cliCtx.TrustNode) 35 if err != nil { 36 return nil, err 37 } 38 39 resBlocks, err := getBlocksForTxResults(cliCtx, []*ctypes.ResultTx{resTx}) 40 if err != nil { 41 return nil, err 42 } 43 44 out, err := mk40TxResult(cliCtx, resTx, resBlocks[resTx.Height]) 45 if err != nil { 46 return out, err 47 } 48 49 return out, nil 50 } 51 52 func Query40TxsByEvents(cliCtx context.CLIContext, events []string, page, limit int) (*types.SearchTxsResult, error) { 53 if len(events) == 0 { 54 return nil, errors.New("must declare at least one event to search") 55 } 56 57 if page <= 0 { 58 return nil, errors.New("page must greater than 0") 59 } 60 61 if limit <= 0 { 62 return nil, errors.New("limit must greater than 0") 63 } 64 65 // XXX: implement ANY 66 query := strings.Join(events, " AND ") 67 68 node, err := cliCtx.GetNode() 69 if err != nil { 70 return nil, err 71 } 72 73 prove := !cliCtx.TrustNode 74 75 resTxs, err := node.TxSearch(query, prove, page, limit, "") 76 if err != nil { 77 return nil, err 78 } 79 80 if prove { 81 for _, tx := range resTxs.Txs { 82 err := ValidateTxResult(cliCtx, tx) 83 if err != nil { 84 return nil, err 85 } 86 } 87 } 88 89 resBlocks, err := getBlocksForTxResults(cliCtx, resTxs.Txs) 90 if err != nil { 91 return nil, err 92 } 93 94 txs, err := format40TxResults(cliCtx, resTxs.Txs, resBlocks) 95 if err != nil { 96 return nil, err 97 } 98 99 result := types.NewSearchTxsResult(uint64(resTxs.TotalCount), uint64(len(txs)), uint64(page), uint64(limit), txs) 100 101 return result, nil 102 } 103 104 // formatTxResults parses the indexed txs into a slice of TxResponse objects. 105 func format40TxResults(cliCtx context.CLIContext, resTxs []*ctypes.ResultTx, resBlocks map[int64]*ctypes.ResultBlock) ([]*types.TxResponse, error) { 106 var err error 107 out := make([]*types.TxResponse, len(resTxs)) 108 for i := range resTxs { 109 out[i], err = mk40TxResult(cliCtx, resTxs[i], resBlocks[resTxs[i].Height]) 110 if err != nil { 111 return nil, err 112 } 113 } 114 115 return out, nil 116 } 117 118 func mk40TxResult(cliCtx context.CLIContext, resTx *ctypes.ResultTx, resBlock *ctypes.ResultBlock) (*types.TxResponse, error) { 119 txb, err := ibc_tx.CM40TxDecoder(cliCtx.CodecProy.GetProtocMarshal())(resTx.Tx) 120 if nil != err { 121 return nil, err 122 } 123 p, ok := txb.(intoAny) 124 if !ok { 125 return nil, fmt.Errorf("expecting a type implementing intoAny, got: %T", txb) 126 } 127 any := p.AsAny() 128 return types.NewResponseResultTx(resTx, any, resBlock.Block.Time.Format(time.RFC3339)), nil 129 } 130 131 type intoAny interface { 132 AsAny() *codectypes.Any 133 }