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 }