github.com/ChainSafe/chainbridge-core@v1.4.2/chains/evm/cli/account/transfer.go (about) 1 package account 2 3 import ( 4 "bufio" 5 "fmt" 6 "math/big" 7 "os" 8 "strings" 9 10 callsUtil "github.com/ChainSafe/chainbridge-core/chains/evm/calls" 11 "github.com/ChainSafe/chainbridge-core/chains/evm/calls/evmtransaction" 12 "github.com/ChainSafe/chainbridge-core/chains/evm/calls/transactor" 13 "github.com/ChainSafe/chainbridge-core/chains/evm/cli/flags" 14 "github.com/ChainSafe/chainbridge-core/chains/evm/cli/initialize" 15 "github.com/ChainSafe/chainbridge-core/chains/evm/cli/logger" 16 "github.com/ChainSafe/chainbridge-core/util" 17 "github.com/ethereum/go-ethereum/common" 18 "github.com/rs/zerolog/log" 19 "github.com/spf13/cobra" 20 ) 21 22 var transferBaseCurrencyCmd = &cobra.Command{ 23 Use: "transfer", 24 Short: "Transfer base currency", 25 Long: "The transfer subcommand is used to transfer the base currency", 26 PreRun: func(cmd *cobra.Command, args []string) { 27 confirmTransfer(cmd, args) 28 logger.LoggerMetadata(cmd.Name(), cmd.Flags()) 29 }, 30 RunE: func(cmd *cobra.Command, args []string) error { 31 c, err := initialize.InitializeClient(url, senderKeyPair) 32 if err != nil { 33 return err 34 } 35 t, err := initialize.InitializeTransactor(gasPrice, evmtransaction.NewTransaction, c, prepare) 36 if err != nil { 37 return err 38 } 39 return TransferBaseCurrency(cmd, args, t) 40 }, 41 PersistentPreRunE: func(cmd *cobra.Command, args []string) error { 42 return util.CallPersistentPreRun(cmd, args) 43 }, 44 Args: func(cmd *cobra.Command, args []string) error { 45 err := ValidateTransferBaseCurrencyFlags(cmd, args) 46 if err != nil { 47 return err 48 } 49 50 err = ProcessTransferBaseCurrencyFlags(cmd, args) 51 return err 52 }, 53 } 54 55 func BindTransferBaseCurrencyFlags(cmd *cobra.Command) { 56 cmd.Flags().StringVar(&Recipient, "recipient", "", "Recipient address") 57 cmd.Flags().StringVar(&Amount, "amount", "", "Transfer amount") 58 cmd.Flags().Uint64Var(&Decimals, "decimals", 0, "Base token decimals") 59 flags.MarkFlagsAsRequired(cmd, "recipient", "amount", "decimals") 60 } 61 62 func init() { 63 BindTransferBaseCurrencyFlags(transferBaseCurrencyCmd) 64 } 65 func ValidateTransferBaseCurrencyFlags(cmd *cobra.Command, args []string) error { 66 if !common.IsHexAddress(Recipient) { 67 return fmt.Errorf("invalid recipient address %s", Recipient) 68 } 69 return nil 70 } 71 72 func ProcessTransferBaseCurrencyFlags(cmd *cobra.Command, args []string) error { 73 var err error 74 RecipientAddress = common.HexToAddress(Recipient) 75 decimals := big.NewInt(int64(Decimals)) 76 WeiAmount, err = callsUtil.UserAmountToWei(Amount, decimals) 77 return err 78 } 79 func TransferBaseCurrency(cmd *cobra.Command, args []string, t transactor.Transactor) error { 80 hash, err := t.Transact( 81 &RecipientAddress, nil, transactor.TransactOptions{Value: WeiAmount, GasLimit: gasLimit}, 82 ) 83 if err != nil { 84 log.Error().Err(fmt.Errorf("base currency deposit error: %v", err)) 85 return err 86 } 87 log.Debug().Msgf("base currency transaction hash: %s", hash.Hex()) 88 89 log.Info().Msgf("%s tokens were transferred to %s from %s", Amount, RecipientAddress.Hex(), senderKeyPair.CommonAddress().String()) 90 return nil 91 } 92 93 func confirmTransfer(cmd *cobra.Command, args []string) { 94 reader := bufio.NewReader(os.Stdin) 95 for { 96 fmt.Printf("Send transaction %s(%d) to %s (Y/N)?", Amount, Decimals, Recipient) 97 s, _ := reader.ReadString('\n') 98 99 s = strings.ToLower(strings.TrimSuffix(s, "\n")) 100 101 if strings.Compare(s, "n") == 0 { 102 os.Exit(0) 103 } else if strings.Compare(s, "y") == 0 { 104 break 105 } else { 106 continue 107 } 108 } 109 }