github.com/iotexproject/iotex-core@v1.14.1-rc1/ioctl/newcmd/action/xrc20.go (about) 1 // Copyright (c) 2022 IoTeX Foundation 2 // This source code is provided 'as is' and no warranties are given as to title or non-infringement, merchantability 3 // or fitness for purpose and, to the extent permitted by law, all liability for your use of the code is disclaimed. 4 // This source code is governed by Apache License 2.0 that can be found in the LICENSE file. 5 6 package action 7 8 import ( 9 "encoding/hex" 10 "fmt" 11 "math/big" 12 "strconv" 13 14 "github.com/iotexproject/iotex-address/address" 15 "github.com/pkg/errors" 16 "github.com/spf13/cobra" 17 18 "github.com/iotexproject/iotex-core/ioctl" 19 "github.com/iotexproject/iotex-core/ioctl/config" 20 "github.com/iotexproject/iotex-core/ioctl/newcmd/alias" 21 "github.com/iotexproject/iotex-core/ioctl/util" 22 ) 23 24 // Multi-language support 25 var ( 26 _xrc20CmdShorts = map[config.Language]string{ 27 config.English: "Support ERC20 standard command-line", 28 config.Chinese: "使ioctl命令行支持ERC20标准", 29 } 30 _xrc20ContractAddressUsage = map[config.Language]string{ 31 config.English: "set contract address", 32 config.Chinese: "设定合约地址", 33 } 34 ) 35 36 // NewXrc20Cmd represent xrc20 standard command-line 37 func NewXrc20Cmd(client ioctl.Client) *cobra.Command { 38 cmd := &cobra.Command{ 39 Use: "xrc20", 40 } 41 cmd.Short, _ = client.SelectTranslation(_xrc20CmdShorts) 42 43 // add sub commands 44 cmd.AddCommand(NewXrc20TransferFromCmd(client)) 45 // TODO cmd.AddCommand(NewXrc20TotalSupply(client)) 46 // TODO cmd.AddCommand(NewXrc20BalanceOf(client)) 47 // TODO cmd.AddCommand(NewXrc20Transfer(client)) 48 // TODO cmd.AddCommand(NewXrc20Approve(client)) 49 // TODO cmd.AddCommand(NewXrc20Allowance(client)) 50 51 client.SetEndpointWithFlag(cmd.PersistentFlags().StringVar) 52 client.SetInsecureWithFlag(cmd.PersistentFlags().BoolVar) 53 54 var ContractAddressFlag string 55 contractAddressUsage, _ := client.SelectTranslation(_xrc20ContractAddressUsage) 56 cmd.PersistentFlags().StringVarP(&ContractAddressFlag, "contract-address", "c", "", contractAddressUsage) 57 if err := cmd.MarkFlagRequired("contract-address"); err != nil { 58 fmt.Printf("failed to set required flag: %v\n", err) 59 } 60 return cmd 61 } 62 63 func xrc20Contract(client ioctl.Client, contractAddr string) (address.Address, error) { 64 addr, err := alias.IOAddress(client, contractAddr) 65 if err != nil { 66 return nil, errors.Wrap(err, "invalid xrc20 address flag") 67 } 68 return addr, nil 69 } 70 71 func amountMessage(rawData, decimal string) string { 72 return fmt.Sprintf("Raw output: %s\nOutput in decimal: %s", rawData, decimal) 73 } 74 75 func parseAmount(client ioctl.Client, cmd *cobra.Command, contract address.Address, amount string) (*big.Int, error) { 76 decimalBytecode, err := hex.DecodeString("313ce567") 77 if err != nil { 78 return nil, errors.Wrap(err, "failed to decode 313ce567") 79 } 80 signer, err := cmd.Flags().GetString(signerFlagLabel) 81 if err != nil { 82 return nil, errors.Wrap(err, "failed to get flag signer") 83 } 84 gasLimit, err := cmd.Flags().GetUint64(gasLimitFlagLabel) 85 if err != nil { 86 return nil, errors.Wrap(err, "failed to get flag gas-limit") 87 } 88 result, err := Read(client, contract, "0", decimalBytecode, signer, gasLimit) 89 if err != nil { 90 return nil, errors.New("failed to read contract") 91 } 92 93 var decimal int64 94 if result != "" { 95 decimal, err = strconv.ParseInt(result, 16, 8) 96 if err != nil { 97 return nil, errors.Wrapf(err, "failed to convert string into int64") 98 } 99 } else { 100 decimal = int64(0) 101 } 102 return util.StringToRau(amount, int(decimal)) 103 }