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  }