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

     1  package utils
     2  
     3  import (
     4  	"fmt"
     5  	"math/big"
     6  
     7  	"github.com/ChainSafe/chainbridge-core/chains/evm/calls"
     8  	"github.com/ChainSafe/chainbridge-core/chains/evm/calls/evmclient"
     9  
    10  	"github.com/ChainSafe/chainbridge-core/chains/evm/cli/flags"
    11  	"github.com/ChainSafe/chainbridge-core/chains/evm/cli/logger"
    12  	"github.com/ethereum/go-ethereum/common"
    13  	"github.com/ethereum/go-ethereum/common/hexutil"
    14  	"github.com/rs/zerolog/log"
    15  	"github.com/spf13/cobra"
    16  )
    17  
    18  var simulateCmd = &cobra.Command{
    19  	Use:   "simulate",
    20  	Short: "Simulate the invocation of a transaction",
    21  	Long:  "The simulate subcommand simulates a transaction result by simulating invocation; not state-altering",
    22  	PreRun: func(cmd *cobra.Command, args []string) {
    23  		logger.LoggerMetadata(cmd.Name(), cmd.Flags())
    24  	},
    25  	RunE: func(cmd *cobra.Command, args []string) error {
    26  		return SimulateCmd(cmd)
    27  	},
    28  	Args: func(cmd *cobra.Command, args []string) error {
    29  		err := ValidateSimulateFlags(cmd, args)
    30  		if err != nil {
    31  			return err
    32  		}
    33  
    34  		ProcessSimulateFlags(cmd, args)
    35  		return nil
    36  	},
    37  }
    38  
    39  func BindSimulateFlags(cmd *cobra.Command) {
    40  	cmd.Flags().StringVar(&TxHash, "tx-hash", "", "Transaction hash")
    41  	cmd.Flags().StringVar(&BlockNumber, "block-number", "", "Block number")
    42  	cmd.Flags().StringVar(&FromAddress, "from", "", "Address of sender")
    43  	flags.MarkFlagsAsRequired(cmd, "tx-hash", "block-number", "from")
    44  }
    45  
    46  func init() {
    47  	BindSimulateFlags(simulateCmd)
    48  }
    49  
    50  func ValidateSimulateFlags(cmd *cobra.Command, args []string) error {
    51  	_, err := hexutil.Decode(TxHash)
    52  	if err != nil {
    53  		return fmt.Errorf("invalid tx hash %s", TxHash)
    54  	}
    55  	if !common.IsHexAddress(FromAddress) {
    56  		return fmt.Errorf("invalid from address %s", FromAddress)
    57  	}
    58  	return nil
    59  }
    60  
    61  func ProcessSimulateFlags(cmd *cobra.Command, args []string) {
    62  	txHash = common.HexToHash(TxHash)
    63  	fromAddr = common.HexToAddress(FromAddress)
    64  }
    65  
    66  func SimulateCmd(cmd *cobra.Command) error {
    67  	// fetch global flag values
    68  	url, _, _, senderKeyPair, _, err := flags.GlobalFlagValues(cmd)
    69  	if err != nil {
    70  		return fmt.Errorf("could not get global flags: %v", err)
    71  	}
    72  
    73  	// convert string block number to big.Int
    74  	blockNumberBigInt, _ := new(big.Int).SetString(BlockNumber, 10)
    75  
    76  	log.Debug().Msgf(`
    77  Simulating transaction
    78  Tx hash: %s
    79  Block number: %v
    80  From address: %s`,
    81  		TxHash, blockNumberBigInt, FromAddress)
    82  
    83  	ethClient, err := evmclient.NewEVMClient(url, senderKeyPair)
    84  	if err != nil {
    85  		log.Error().Err(fmt.Errorf("eth client intialization error: %v", err))
    86  		return err
    87  	}
    88  	data, err := calls.Simulate(ethClient, blockNumberBigInt, txHash, fromAddr)
    89  	if err != nil {
    90  		log.Error().Err(fmt.Errorf("[utils] simulate transact error: %v", err))
    91  		return err
    92  	}
    93  
    94  	log.Debug().Msgf("data: %s", string(data))
    95  
    96  	return nil
    97  }