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 }