github.com/ChainSafe/chainbridge-core@v1.4.2/chains/evm/cli/utils/hash-list.go (about)

     1  package utils
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"math/big"
     7  	"strconv"
     8  
     9  	"github.com/ChainSafe/chainbridge-core/chains/evm/calls/evmclient"
    10  
    11  	"github.com/ChainSafe/chainbridge-core/chains/evm/cli/flags"
    12  	"github.com/ChainSafe/chainbridge-core/chains/evm/cli/logger"
    13  	"github.com/rs/zerolog/log"
    14  	"github.com/spf13/cobra"
    15  )
    16  
    17  var hashListCmd = &cobra.Command{
    18  	Use:   "hash-list",
    19  	Short: "List tx hashes within N number of blocks",
    20  	Long:  "The hash-list subcommand accepts a starting block to query, loops over N number of blocks past it, then prints this list of blocks to review hashes contained within",
    21  	PreRun: func(cmd *cobra.Command, args []string) {
    22  		logger.LoggerMetadata(cmd.Name(), cmd.Flags())
    23  	},
    24  	RunE: func(cmd *cobra.Command, args []string) error {
    25  		return HashListCmd(cmd, args)
    26  	},
    27  }
    28  
    29  func BindHashListFlags(cmd *cobra.Command) {
    30  	cmd.Flags().StringVar(&BlockNumber, "block-number", "", "Block number to start at")
    31  	cmd.Flags().StringVar(&Blocks, "blocks", "", "Number of blocks past the provided block-number to review")
    32  	flags.MarkFlagsAsRequired(cmd, "block-number", "blocks")
    33  }
    34  
    35  func init() {
    36  	BindHashListFlags(hashListCmd)
    37  }
    38  
    39  func HashListCmd(cmd *cobra.Command, args []string) error {
    40  	// fetch global flag values
    41  	url, _, _, senderKeyPair, _, err := flags.GlobalFlagValues(cmd)
    42  	if err != nil {
    43  		return fmt.Errorf("could not get global flags: %v", err)
    44  	}
    45  
    46  	ethClient, err := evmclient.NewEVMClient(url, senderKeyPair)
    47  	if err != nil {
    48  		log.Error().Err(fmt.Errorf("eth client intialization error: %v", err))
    49  		return err
    50  	}
    51  
    52  	// convert Blocks string to int for looping
    53  	numBlocks, err := strconv.Atoi(Blocks)
    54  	if err != nil {
    55  		log.Error().Err(fmt.Errorf("error converting NumberOfBlocks string -> int: %v", err))
    56  		return err
    57  	}
    58  
    59  	// convert block number to string
    60  	blockNumberBigInt, _ := new(big.Int).SetString(BlockNumber, 10)
    61  
    62  	// loop over blocks provided by user
    63  	// check block by hash
    64  	// see if transaction block data is there
    65  	for i := 0; i < numBlocks; i++ {
    66  		log.Debug().Msgf("Block Number: %v", blockNumberBigInt)
    67  
    68  		// convert string block number to big.Int
    69  		blockNumberBigInt.Add(blockNumberBigInt, big.NewInt(1))
    70  
    71  		block, err := ethClient.BlockByNumber(context.Background(), blockNumberBigInt)
    72  		if err != nil {
    73  			log.Error().Err(fmt.Errorf("block by hash error: %v", err))
    74  
    75  			// will return early and not print debug log if block not found
    76  			// Error: not found
    77  
    78  			return err
    79  		}
    80  
    81  		// loop over all transactions within block
    82  		// add newline for readability
    83  		for _, tx := range block.Body().Transactions {
    84  			log.Debug().Msgf("Tx hashes: %v\n", tx.Hash())
    85  		}
    86  	}
    87  	return nil
    88  }