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 }