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  }