github.com/ChainSafe/chainbridge-core@v1.4.2/chains/evm/cli/erc721/mint.go (about) 1 package erc721 2 3 import ( 4 "fmt" 5 "math/big" 6 7 "github.com/ChainSafe/chainbridge-core/chains/evm/calls/contracts/erc721" 8 "github.com/ChainSafe/chainbridge-core/chains/evm/calls/evmtransaction" 9 "github.com/ChainSafe/chainbridge-core/chains/evm/cli/initialize" 10 "github.com/ChainSafe/chainbridge-core/util" 11 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/logger" 15 "github.com/ethereum/go-ethereum/common" 16 "github.com/rs/zerolog/log" 17 "github.com/spf13/cobra" 18 ) 19 20 var mintCmd = &cobra.Command{ 21 Use: "mint", 22 Short: "Mint an ERC721 token", 23 Long: "The mint subcommand mints a token on an ERC721 mintable contract", 24 PreRun: func(cmd *cobra.Command, args []string) { 25 logger.LoggerMetadata(cmd.Name(), cmd.Flags()) 26 }, 27 PersistentPreRunE: func(cmd *cobra.Command, args []string) error { 28 return util.CallPersistentPreRun(cmd, args) 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 MintCmd(cmd, args, erc721.NewErc721Contract(c, Erc721Addr, t)) 40 }, 41 Args: func(cmd *cobra.Command, args []string) error { 42 err := ValidateMintFlags(cmd, args) 43 if err != nil { 44 return err 45 } 46 47 err = ProcessMintFlags(cmd, args) 48 return err 49 }, 50 } 51 52 func init() { 53 BindMintFlags(mintCmd) 54 } 55 56 func BindMintFlags(cmd *cobra.Command) { 57 cmd.Flags().StringVar(&Erc721Address, "contract", "", "ERC721 contract address") 58 cmd.Flags().StringVar(&Dst, "recipient", "", "Recipient address") 59 cmd.Flags().StringVar(&Token, "token", "", "ERC721 token ID") 60 cmd.Flags().StringVar(&Metadata, "metadata", "", "ERC721 token metadata") 61 flags.MarkFlagsAsRequired(cmd, "contract", "recipient", "token", "metadata") 62 } 63 64 func ValidateMintFlags(cmd *cobra.Command, args []string) error { 65 if !common.IsHexAddress(Erc721Address) { 66 return fmt.Errorf("invalid ERC721 contract address %s", Erc721Address) 67 } 68 if !common.IsHexAddress(Dst) { 69 return fmt.Errorf("invalid recipient address %s", Dst) 70 } 71 return nil 72 } 73 74 func ProcessMintFlags(cmd *cobra.Command, args []string) error { 75 Erc721Addr = common.HexToAddress(Erc721Address) 76 77 if !common.IsHexAddress(Dst) { 78 DstAddress = senderKeyPair.CommonAddress() 79 } else { 80 DstAddress = common.HexToAddress(Dst) 81 } 82 83 var ok bool 84 if TokenId, ok = big.NewInt(0).SetString(Token, 10); !ok { 85 return fmt.Errorf("invalid token id value") 86 } 87 88 return err 89 } 90 91 func MintCmd(cmd *cobra.Command, args []string, erc721Contract *erc721.ERC721Contract) error { 92 _, err = erc721Contract.Mint( 93 TokenId, Metadata, DstAddress, transactor.TransactOptions{GasLimit: gasLimit}, 94 ) 95 if err != nil { 96 return err 97 } 98 99 log.Info().Msgf("%v token minted", TokenId) 100 return err 101 }