github.com/ChainSafe/chainbridge-core@v1.4.2/chains/evm/cli/erc721/deposit.go (about) 1 package erc721 2 3 import ( 4 "fmt" 5 "math/big" 6 "strconv" 7 8 "github.com/ChainSafe/chainbridge-core/chains/evm/calls/contracts/bridge" 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 depositCmd = &cobra.Command{ 22 Use: "deposit", 23 Short: "Deposit an ERC721 token", 24 Long: "The deposit subcommand creates a new ERC721 token deposit on the bridge 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 DepositCmd(cmd, args, bridge.NewBridgeContract(c, BridgeAddr, t)) 41 }, 42 Args: func(cmd *cobra.Command, args []string) error { 43 err := ValidateDepositFlags(cmd, args) 44 if err != nil { 45 return err 46 } 47 48 err = ProcessDepositFlags(cmd, args) 49 return err 50 }, 51 } 52 53 func BindDepositFlags(cmd *cobra.Command) { 54 cmd.Flags().StringVar(&Recipient, "recipient", "", "Recipient address") 55 cmd.Flags().StringVar(&Bridge, "bridge", "", "Bridge contract address") 56 cmd.Flags().StringVar(&DestionationID, "destination", "", "Destination domain ID") 57 cmd.Flags().StringVar(&ResourceID, "resource", "", "Resource ID for transfer") 58 cmd.Flags().StringVar(&Token, "token", "", "ERC721 token ID") 59 cmd.Flags().StringVar(&Metadata, "metadata", "", "ERC721 token metadata") 60 cmd.Flags().StringVar(&Priority, "priority", "none", "Transaction priority speed (default: medium)") 61 flags.MarkFlagsAsRequired(cmd, "recipient", "bridge", "destination", "resource", "token") 62 } 63 64 func init() { 65 BindDepositFlags(depositCmd) 66 } 67 68 func ValidateDepositFlags(cmd *cobra.Command, args []string) error { 69 if !common.IsHexAddress(Recipient) { 70 return fmt.Errorf("invalid recipient address") 71 } 72 if !common.IsHexAddress(Bridge) { 73 return fmt.Errorf("invalid bridge address") 74 } 75 switch Priority { 76 case "none", "slow", "medium", "fast": 77 return nil 78 default: 79 return fmt.Errorf("invalid priority value %s, supported priorities: \"slow|medium|fast\"", Priority) 80 } 81 } 82 83 func ProcessDepositFlags(cmd *cobra.Command, args []string) error { 84 RecipientAddr = common.HexToAddress(Recipient) 85 BridgeAddr = common.HexToAddress(Bridge) 86 87 DestinationID, err = strconv.Atoi(DestionationID) 88 if err != nil { 89 log.Error().Err(fmt.Errorf("destination ID conversion error: %v", err)) 90 return err 91 } 92 93 var ok bool 94 TokenId, ok = big.NewInt(0).SetString(Token, 10) 95 if !ok { 96 return fmt.Errorf("invalid token id value") 97 } 98 99 ResourceId, err = flags.ProcessResourceID(ResourceID) 100 return err 101 } 102 103 func DepositCmd(cmd *cobra.Command, args []string, bridgeContract *bridge.BridgeContract) error { 104 txHash, err := bridgeContract.Erc721Deposit( 105 TokenId, Metadata, RecipientAddr, ResourceId, uint8(DestinationID), transactor.TransactOptions{GasLimit: gasLimit, Priority: transactor.TxPriorities[Priority]}, 106 ) 107 if err != nil { 108 return err 109 } 110 111 log.Info().Msgf( 112 `erc721 deposit hash: %s 113 %s token were transferred to %s from %s`, 114 txHash.Hex(), 115 TokenId.String(), 116 RecipientAddr.Hex(), 117 senderKeyPair.CommonAddress().String(), 118 ) 119 return nil 120 }