github.com/ChainSafe/chainbridge-core@v1.4.2/chains/evm/cli/erc20/mint.go (about) 1 package erc20 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/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 mintCmd = &cobra.Command{ 22 Use: "mint", 23 Short: "Mint an ERC20 token", 24 Long: "The mint subcommand mints a token on an ERC20 mintable contract", 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 MintCmd(cmd, args, erc20.NewERC20Contract(c, Erc20Addr, t)) 41 }, 42 Args: func(cmd *cobra.Command, args []string) error { 43 err := ValidateMintFlags(cmd, args) 44 if err != nil { 45 return err 46 } 47 48 err = ProcessMintFlags(cmd, args) 49 return err 50 }, 51 } 52 53 func init() { 54 BindMintFlags(mintCmd) 55 } 56 func BindMintFlags(cmd *cobra.Command) { 57 cmd.Flags().StringVar(&Erc20Address, "contract", "", "ERC20 contract address") 58 cmd.Flags().StringVar(&Amount, "amount", "", "Deposit amount") 59 cmd.Flags().Uint64Var(&Decimals, "decimals", 0, "ERC20 token decimals") 60 cmd.Flags().StringVar(&DstAddress, "recipient", "", "Recipient address") 61 flags.MarkFlagsAsRequired(cmd, "contract", "amount", "decimals", "recipient") 62 } 63 64 func ValidateMintFlags(cmd *cobra.Command, args []string) error { 65 if !common.IsHexAddress(Erc20Address) { 66 return fmt.Errorf("invalid ERC20 address %s", Erc20Address) 67 } 68 if !common.IsHexAddress(DstAddress) { 69 return fmt.Errorf("invalid recipient address %s", DstAddress) 70 } 71 return nil 72 } 73 74 func ProcessMintFlags(cmd *cobra.Command, args []string) error { 75 var err error 76 decimals := big.NewInt(int64(Decimals)) 77 Erc20Addr = common.HexToAddress(Erc20Address) 78 79 if !common.IsHexAddress(DstAddress) { 80 dstAddress = senderKeyPair.CommonAddress() 81 } else { 82 dstAddress = common.HexToAddress(DstAddress) 83 } 84 85 RealAmount, err = calls.UserAmountToWei(Amount, decimals) 86 if err != nil { 87 log.Error().Err(err) 88 return err 89 } 90 91 return nil 92 } 93 94 func MintCmd(cmd *cobra.Command, args []string, contract *erc20.ERC20Contract) error { 95 _, err := contract.MintTokens( 96 dstAddress, RealAmount, transactor.TransactOptions{GasLimit: gasLimit}, 97 ) 98 if err != nil { 99 log.Error().Err(err) 100 return err 101 } 102 log.Info().Msgf("%v tokens minted", Amount) 103 return nil 104 }