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

     1  package erc20
     2  
     3  import (
     4  	"errors"
     5  	"math/big"
     6  
     7  	callsUtil "github.com/ChainSafe/chainbridge-core/chains/evm/calls"
     8  	"github.com/ChainSafe/chainbridge-core/chains/evm/calls/contracts/erc20"
     9  	"github.com/ChainSafe/chainbridge-core/chains/evm/calls/evmtransaction"
    10  	"github.com/ChainSafe/chainbridge-core/chains/evm/calls/transactor"
    11  	"github.com/ChainSafe/chainbridge-core/chains/evm/cli/initialize"
    12  	"github.com/ChainSafe/chainbridge-core/util"
    13  
    14  	"github.com/ChainSafe/chainbridge-core/chains/evm/cli/flags"
    15  	"github.com/ChainSafe/chainbridge-core/chains/evm/cli/logger"
    16  	"github.com/ethereum/go-ethereum/common"
    17  	"github.com/rs/zerolog/log"
    18  	"github.com/spf13/cobra"
    19  )
    20  
    21  var approveCmd = &cobra.Command{
    22  	Use:   "approve",
    23  	Short: "Approve an ERC20 tokens",
    24  	Long:  "The approve subcommand approves tokens in an ERC20 contract for transfer",
    25  	PreRun: func(cmd *cobra.Command, args []string) {
    26  		logger.LoggerMetadata(cmd.Name(), cmd.Flags())
    27  	},
    28  	PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
    29  		return util.CallPersistentPreRun(cmd, args)
    30  	},
    31  	RunE: func(cmd *cobra.Command, args []string) error {
    32  		c, err := initialize.InitializeClient(url, senderKeyPair)
    33  		if err != nil {
    34  			return err
    35  		}
    36  		t, err := initialize.InitializeTransactor(gasPrice, evmtransaction.NewTransaction, c, prepare)
    37  		if err != nil {
    38  			return err
    39  		}
    40  		return ApproveCmd(cmd, args, erc20.NewERC20Contract(c, Erc20Addr, t))
    41  	},
    42  	Args: func(cmd *cobra.Command, args []string) error {
    43  		err := ValidateApproveFlags(cmd, args)
    44  		if err != nil {
    45  			return err
    46  		}
    47  
    48  		err = ProcessApproveFlags(cmd, args)
    49  		return err
    50  	},
    51  }
    52  
    53  func BindApproveFlags(cmd *cobra.Command) {
    54  	cmd.Flags().StringVar(&Erc20Address, "contract", "", "ERC20 contract address")
    55  	cmd.Flags().StringVar(&Amount, "amount", "", "Amount to grant allowance")
    56  	cmd.Flags().StringVar(&Recipient, "recipient", "", "Recipient address")
    57  	cmd.Flags().Uint64Var(&Decimals, "decimals", 0, "ERC20 token decimals")
    58  	flags.MarkFlagsAsRequired(cmd, "contract", "amount", "recipient", "decimals")
    59  }
    60  
    61  func init() {
    62  	BindApproveFlags(approveCmd)
    63  }
    64  
    65  func ValidateApproveFlags(cmd *cobra.Command, args []string) error {
    66  	if !common.IsHexAddress(Erc20Address) {
    67  		return errors.New("invalid erc20Address address")
    68  	}
    69  	if !common.IsHexAddress(Recipient) {
    70  		return errors.New("invalid minter address")
    71  	}
    72  	return nil
    73  }
    74  
    75  func ProcessApproveFlags(cmd *cobra.Command, args []string) error {
    76  	var err error
    77  
    78  	decimals := big.NewInt(int64(Decimals))
    79  	Erc20Addr = common.HexToAddress(Erc20Address)
    80  	RecipientAddress = common.HexToAddress(Recipient)
    81  	RealAmount, err = callsUtil.UserAmountToWei(Amount, decimals)
    82  	if err != nil {
    83  		return err
    84  	}
    85  
    86  	return nil
    87  }
    88  
    89  func ApproveCmd(cmd *cobra.Command, args []string, contract *erc20.ERC20Contract) error {
    90  	log.Debug().Msgf(`
    91  Approving ERC20
    92  ERC20 address: %s
    93  Recipient address: %s
    94  Amount: %s
    95  Decimals: %v`,
    96  		Erc20Address, Recipient, Amount, Decimals)
    97  
    98  	_, err := contract.ApproveTokens(RecipientAddress, RealAmount, transactor.TransactOptions{GasLimit: gasLimit})
    99  	if err != nil {
   100  		log.Fatal().Err(err)
   101  		return err
   102  	}
   103  	log.Info().Msgf(
   104  		"%s account granted allowance on %v tokens of %s",
   105  		RecipientAddress.String(), Amount, RecipientAddress.String(),
   106  	)
   107  	return nil
   108  }