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  }