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  }