github.com/ChainSafe/chainbridge-core@v1.4.2/chains/evm/cli/erc721/approve.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 approveCmd = &cobra.Command{ 21 Use: "approve", 22 Short: "Approve an ERC721 token", 23 Long: "The approve subcommand approves a token in an ERC721 contract for transfer", 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 ApproveCmd(cmd, args, erc721.NewErc721Contract(c, Erc721Addr, t)) 40 }, 41 Args: func(cmd *cobra.Command, args []string) error { 42 err := ValidateApproveFlags(cmd, args) 43 if err != nil { 44 return err 45 } 46 47 err = ProcessApproveFlags(cmd, args) 48 return err 49 }, 50 } 51 52 func BindApproveFlags(cmd *cobra.Command) { 53 cmd.Flags().StringVar(&Erc721Address, "contract", "", "ERC721 contract address") 54 cmd.Flags().StringVar(&Recipient, "recipient", "", "Recipient address") 55 cmd.Flags().StringVar(&Token, "token", "", "ERC721 token ID") 56 flags.MarkFlagsAsRequired(cmd, "contract", "recipient", "token") 57 } 58 59 func init() { 60 BindApproveFlags(approveCmd) 61 } 62 63 func ValidateApproveFlags(cmd *cobra.Command, args []string) error { 64 if !common.IsHexAddress(Erc721Address) { 65 return fmt.Errorf("invalid ERC721 contract address %s", Erc721Address) 66 } 67 if !common.IsHexAddress(Recipient) { 68 return fmt.Errorf("invalid recipient address") 69 } 70 return nil 71 } 72 73 func ProcessApproveFlags(cmd *cobra.Command, args []string) error { 74 RecipientAddr = common.HexToAddress(Recipient) 75 Erc721Addr = common.HexToAddress(Erc721Address) 76 77 var ok bool 78 if TokenId, ok = big.NewInt(0).SetString(Token, 10); !ok { 79 return fmt.Errorf("invalid token id value") 80 } 81 return nil 82 } 83 84 func ApproveCmd(cmd *cobra.Command, args []string, erc721Contract *erc721.ERC721Contract) error { 85 _, err = erc721Contract.Approve( 86 TokenId, RecipientAddr, transactor.TransactOptions{GasLimit: gasLimit}, 87 ) 88 if err != nil { 89 return err 90 } 91 92 log.Info().Msgf("%v token approved", TokenId) 93 return err 94 }