github.com/Finschia/finschia-sdk@v0.48.1/x/token/client/cli/tx.go (about)

     1  package cli
     2  
     3  import (
     4  	"fmt"
     5  	"strings"
     6  
     7  	"github.com/spf13/cobra"
     8  
     9  	"github.com/Finschia/finschia-sdk/client"
    10  	"github.com/Finschia/finschia-sdk/client/flags"
    11  	"github.com/Finschia/finschia-sdk/client/tx"
    12  	sdk "github.com/Finschia/finschia-sdk/types"
    13  	sdkerrors "github.com/Finschia/finschia-sdk/types/errors"
    14  	"github.com/Finschia/finschia-sdk/version"
    15  	"github.com/Finschia/finschia-sdk/x/token"
    16  )
    17  
    18  const (
    19  	FlagSupply   = "supply"
    20  	FlagDecimals = "decimals"
    21  	FlagMintable = "mintable"
    22  	FlagMeta     = "meta"
    23  	FlagImageURI = "image-uri"
    24  
    25  	DefaultDecimals = 8
    26  	DefaultSupply   = "1"
    27  )
    28  
    29  // NewTxCmd returns the transaction commands for this module
    30  func NewTxCmd() *cobra.Command {
    31  	txCmd := &cobra.Command{
    32  		Use:                        token.ModuleName,
    33  		Short:                      fmt.Sprintf("%s transactions subcommands", token.ModuleName),
    34  		DisableFlagParsing:         true,
    35  		SuggestionsMinimumDistance: 2,
    36  		RunE:                       client.ValidateCmd,
    37  	}
    38  
    39  	txCmd.AddCommand(
    40  		NewTxCmdSend(),
    41  		NewTxCmdOperatorSend(),
    42  		NewTxCmdAuthorizeOperator(),
    43  		NewTxCmdRevokeOperator(),
    44  		NewTxCmdIssue(),
    45  		NewTxCmdGrantPermission(),
    46  		NewTxCmdRevokePermission(),
    47  		NewTxCmdMint(),
    48  		NewTxCmdBurn(),
    49  		NewTxCmdOperatorBurn(),
    50  		NewTxCmdModify(),
    51  	)
    52  
    53  	return txCmd
    54  }
    55  
    56  func NewTxCmdSend() *cobra.Command {
    57  	cmd := &cobra.Command{
    58  		Use:   "send [contract-id] [from] [to] [amount]",
    59  		Args:  cobra.ExactArgs(4),
    60  		Short: "send tokens",
    61  		Long: strings.TrimSpace(fmt.Sprintf(`
    62  			$ %s tx %s send <contract-id> <from> <to> <amount>`, version.AppName, token.ModuleName),
    63  		),
    64  		RunE: func(cmd *cobra.Command, args []string) error {
    65  			clientCtx, err := client.GetClientTxContext(cmd)
    66  			if err != nil {
    67  				return err
    68  			}
    69  
    70  			amountStr := args[3]
    71  			amount, ok := sdk.NewIntFromString(amountStr)
    72  			if !ok {
    73  				return sdkerrors.ErrInvalidType.Wrapf("failed to set amount: %s", amountStr)
    74  			}
    75  			msg := &token.MsgSend{
    76  				ContractId: args[0],
    77  				From:       args[1],
    78  				To:         args[2],
    79  				Amount:     amount,
    80  			}
    81  			if err := msg.ValidateBasic(); err != nil {
    82  				return err
    83  			}
    84  			return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg)
    85  		},
    86  	}
    87  
    88  	flags.AddTxFlagsToCmd(cmd)
    89  	return cmd
    90  }
    91  
    92  func NewTxCmdOperatorSend() *cobra.Command {
    93  	cmd := &cobra.Command{
    94  		Use:   "operator-send [contract-id] [operator] [from] [to] [amount]",
    95  		Args:  cobra.ExactArgs(5),
    96  		Short: "send tokens by operator",
    97  		Long: strings.TrimSpace(fmt.Sprintf(`
    98  			$ %s tx %s operator-send <contract-id> <operator> <from> <to> <amount>`, version.AppName, token.ModuleName),
    99  		),
   100  		RunE: func(cmd *cobra.Command, args []string) error {
   101  			clientCtx, err := client.GetClientTxContext(cmd)
   102  			if err != nil {
   103  				return err
   104  			}
   105  
   106  			amountStr := args[4]
   107  			amount, ok := sdk.NewIntFromString(amountStr)
   108  			if !ok {
   109  				return sdkerrors.ErrInvalidType.Wrapf("failed to set amount: %s", amountStr)
   110  			}
   111  			msg := token.MsgOperatorSend{
   112  				ContractId: args[0],
   113  				Operator:   args[1],
   114  				From:       args[2],
   115  				To:         args[3],
   116  				Amount:     amount,
   117  			}
   118  			if err := msg.ValidateBasic(); err != nil {
   119  				return err
   120  			}
   121  			return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), &msg)
   122  		},
   123  	}
   124  
   125  	flags.AddTxFlagsToCmd(cmd)
   126  	return cmd
   127  }
   128  
   129  func NewTxCmdAuthorizeOperator() *cobra.Command {
   130  	cmd := &cobra.Command{
   131  		Use:   "authorize-operator [contract-id] [holder] [operator]",
   132  		Args:  cobra.ExactArgs(3),
   133  		Short: "authorize operator to send tokens to a given operator",
   134  		Long: strings.TrimSpace(fmt.Sprintf(`
   135  			$ %s tx %s authorize-operator <contract-id> <holder> <operator>`, version.AppName, token.ModuleName),
   136  		),
   137  		RunE: func(cmd *cobra.Command, args []string) error {
   138  			clientCtx, err := client.GetClientTxContext(cmd)
   139  			if err != nil {
   140  				return err
   141  			}
   142  
   143  			msg := token.MsgAuthorizeOperator{
   144  				ContractId: args[0],
   145  				Holder:     args[1],
   146  				Operator:   args[2],
   147  			}
   148  			if err := msg.ValidateBasic(); err != nil {
   149  				return err
   150  			}
   151  			return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), &msg)
   152  		},
   153  	}
   154  
   155  	flags.AddTxFlagsToCmd(cmd)
   156  	return cmd
   157  }
   158  
   159  func NewTxCmdRevokeOperator() *cobra.Command {
   160  	cmd := &cobra.Command{
   161  		Use:   "revoke-operator [contract-id] [holder] [operator]",
   162  		Args:  cobra.ExactArgs(3),
   163  		Short: "revoke operator to send tokens to a given operator",
   164  		Long: strings.TrimSpace(fmt.Sprintf(`
   165  			$ %s tx %s revoke-operator <contract-id> <holder> <operator>`, version.AppName, token.ModuleName),
   166  		),
   167  		RunE: func(cmd *cobra.Command, args []string) error {
   168  			clientCtx, err := client.GetClientTxContext(cmd)
   169  			if err != nil {
   170  				return err
   171  			}
   172  
   173  			msg := token.MsgRevokeOperator{
   174  				ContractId: args[0],
   175  				Holder:     args[1],
   176  				Operator:   args[2],
   177  			}
   178  			if err := msg.ValidateBasic(); err != nil {
   179  				return err
   180  			}
   181  			return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), &msg)
   182  		},
   183  	}
   184  
   185  	flags.AddTxFlagsToCmd(cmd)
   186  	return cmd
   187  }
   188  
   189  func NewTxCmdIssue() *cobra.Command {
   190  	cmd := &cobra.Command{
   191  		Use:   "issue [owner] [to] [name] [symbol]",
   192  		Args:  cobra.ExactArgs(4),
   193  		Short: "issue token",
   194  		Long: strings.TrimSpace(fmt.Sprintf(`
   195  			$ %s tx %s issue <owner> <to> <name> <symbol>`, version.AppName, token.ModuleName),
   196  		),
   197  		RunE: func(cmd *cobra.Command, args []string) error {
   198  			clientCtx, err := client.GetClientTxContext(cmd)
   199  			if err != nil {
   200  				return err
   201  			}
   202  
   203  			imageURI, err := cmd.Flags().GetString(FlagImageURI)
   204  			if err != nil {
   205  				return err
   206  			}
   207  
   208  			meta, err := cmd.Flags().GetString(FlagMeta)
   209  			if err != nil {
   210  				return err
   211  			}
   212  
   213  			supplyStr, err := cmd.Flags().GetString(FlagSupply)
   214  			if err != nil {
   215  				return err
   216  			}
   217  			supply, ok := sdk.NewIntFromString(supplyStr)
   218  			if !ok {
   219  				return sdkerrors.ErrInvalidType.Wrapf("failed to set supply: %s", supplyStr)
   220  			}
   221  
   222  			mintable, err := cmd.Flags().GetBool(FlagMintable)
   223  			if err != nil {
   224  				return err
   225  			}
   226  
   227  			decimals, err := cmd.Flags().GetInt32(FlagDecimals)
   228  			if err != nil {
   229  				return err
   230  			}
   231  
   232  			msg := token.MsgIssue{
   233  				Owner:    args[0],
   234  				To:       args[1],
   235  				Name:     args[2],
   236  				Symbol:   args[3],
   237  				Uri:      imageURI,
   238  				Meta:     meta,
   239  				Amount:   supply,
   240  				Mintable: mintable,
   241  				Decimals: decimals,
   242  			}
   243  			if err := msg.ValidateBasic(); err != nil {
   244  				return err
   245  			}
   246  			return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), &msg)
   247  		},
   248  	}
   249  
   250  	flags.AddTxFlagsToCmd(cmd)
   251  	cmd.Flags().String(FlagImageURI, "", "set image-uri")
   252  	cmd.Flags().String(FlagMeta, "", "set meta")
   253  	cmd.Flags().String(FlagSupply, DefaultSupply, "initial supply")
   254  	cmd.Flags().Bool(FlagMintable, false, "set mintable")
   255  	cmd.Flags().Int32(FlagDecimals, DefaultDecimals, "set decimals")
   256  
   257  	return cmd
   258  }
   259  
   260  func NewTxCmdGrantPermission() *cobra.Command {
   261  	cmd := &cobra.Command{
   262  		Use:   "grant-permission [contract-id] [granter] [grantee] [permission]",
   263  		Args:  cobra.ExactArgs(4),
   264  		Short: "grant a permission for mint, burn and modify",
   265  		Long: strings.TrimSpace(fmt.Sprintf(`
   266  			$ %s tx %s grant-permission <contract-id> <granter> <grantee> <permission>`, version.AppName, token.ModuleName),
   267  		),
   268  		RunE: func(cmd *cobra.Command, args []string) error {
   269  			clientCtx, err := client.GetClientTxContext(cmd)
   270  			if err != nil {
   271  				return err
   272  			}
   273  
   274  			msg := token.MsgGrantPermission{
   275  				ContractId: args[0],
   276  				From:       args[1],
   277  				To:         args[2],
   278  				Permission: args[3],
   279  			}
   280  			if err := msg.ValidateBasic(); err != nil {
   281  				return err
   282  			}
   283  			return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), &msg)
   284  		},
   285  	}
   286  
   287  	flags.AddTxFlagsToCmd(cmd)
   288  	return cmd
   289  }
   290  
   291  func NewTxCmdRevokePermission() *cobra.Command {
   292  	cmd := &cobra.Command{
   293  		Use:   "revoke-permission [contract-id] [grantee] [permission]",
   294  		Args:  cobra.ExactArgs(3),
   295  		Short: "abandon a permission by a given grantee",
   296  		Long: strings.TrimSpace(fmt.Sprintf(`
   297  			$ %s tx %s revoke-permission <contract-id> <grantee> <permission>`, version.AppName, token.ModuleName),
   298  		),
   299  		RunE: func(cmd *cobra.Command, args []string) error {
   300  			clientCtx, err := client.GetClientTxContext(cmd)
   301  			if err != nil {
   302  				return err
   303  			}
   304  
   305  			msg := token.MsgRevokePermission{
   306  				ContractId: args[0],
   307  				From:       args[1],
   308  				Permission: args[2],
   309  			}
   310  			if err := msg.ValidateBasic(); err != nil {
   311  				return err
   312  			}
   313  			return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), &msg)
   314  		},
   315  	}
   316  
   317  	flags.AddTxFlagsToCmd(cmd)
   318  	return cmd
   319  }
   320  
   321  func NewTxCmdMint() *cobra.Command {
   322  	cmd := &cobra.Command{
   323  		Use:   "mint [contract-id] [grantee] [to] [amount]",
   324  		Args:  cobra.ExactArgs(4),
   325  		Short: "mint tokens",
   326  		Long: strings.TrimSpace(fmt.Sprintf(`
   327  			$ %s tx %s mint <contract-id> <grantee> <to> <amount>`, version.AppName, token.ModuleName),
   328  		),
   329  		RunE: func(cmd *cobra.Command, args []string) error {
   330  			clientCtx, err := client.GetClientTxContext(cmd)
   331  			if err != nil {
   332  				return err
   333  			}
   334  
   335  			amountStr := args[3]
   336  			amount, ok := sdk.NewIntFromString(amountStr)
   337  			if !ok {
   338  				return sdkerrors.ErrInvalidType.Wrapf("failed to set amount: %s", amountStr)
   339  			}
   340  
   341  			msg := token.MsgMint{
   342  				ContractId: args[0],
   343  				From:       args[1],
   344  				To:         args[2],
   345  				Amount:     amount,
   346  			}
   347  			if err := msg.ValidateBasic(); err != nil {
   348  				return err
   349  			}
   350  			return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), &msg)
   351  		},
   352  	}
   353  
   354  	flags.AddTxFlagsToCmd(cmd)
   355  	return cmd
   356  }
   357  
   358  func NewTxCmdBurn() *cobra.Command {
   359  	cmd := &cobra.Command{
   360  		Use:   "burn [contract-id] [from] [amount]",
   361  		Args:  cobra.ExactArgs(3),
   362  		Short: "burn tokens",
   363  		Long: strings.TrimSpace(fmt.Sprintf(`
   364  			$ %s tx %s burn <contract-id> <from> <amount>`, version.AppName, token.ModuleName),
   365  		),
   366  		RunE: func(cmd *cobra.Command, args []string) error {
   367  			clientCtx, err := client.GetClientTxContext(cmd)
   368  			if err != nil {
   369  				return err
   370  			}
   371  
   372  			amountStr := args[2]
   373  			amount, ok := sdk.NewIntFromString(amountStr)
   374  			if !ok {
   375  				return sdkerrors.ErrInvalidType.Wrapf("failed to set amount: %s", amountStr)
   376  			}
   377  
   378  			msg := token.MsgBurn{
   379  				ContractId: args[0],
   380  				From:       args[1],
   381  				Amount:     amount,
   382  			}
   383  			if err := msg.ValidateBasic(); err != nil {
   384  				return err
   385  			}
   386  			return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), &msg)
   387  		},
   388  	}
   389  
   390  	flags.AddTxFlagsToCmd(cmd)
   391  	return cmd
   392  }
   393  
   394  func NewTxCmdOperatorBurn() *cobra.Command {
   395  	cmd := &cobra.Command{
   396  		Use:   "operator-burn [contract-id] [grantee] [from] [amount]",
   397  		Args:  cobra.ExactArgs(4),
   398  		Short: "burn tokens by a given grantee",
   399  		Long: strings.TrimSpace(fmt.Sprintf(`
   400  			$ %s tx %s operator-burn <contract-id> <grantee> <from> <amount>`, version.AppName, token.ModuleName),
   401  		),
   402  		RunE: func(cmd *cobra.Command, args []string) error {
   403  			clientCtx, err := client.GetClientTxContext(cmd)
   404  			if err != nil {
   405  				return err
   406  			}
   407  
   408  			amountStr := args[3]
   409  			amount, ok := sdk.NewIntFromString(amountStr)
   410  			if !ok {
   411  				return sdkerrors.ErrInvalidType.Wrapf("failed to set amount: %s", amountStr)
   412  			}
   413  
   414  			msg := token.MsgOperatorBurn{
   415  				ContractId: args[0],
   416  				Operator:   args[1],
   417  				From:       args[2],
   418  				Amount:     amount,
   419  			}
   420  			if err := msg.ValidateBasic(); err != nil {
   421  				return err
   422  			}
   423  			return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), &msg)
   424  		},
   425  	}
   426  
   427  	flags.AddTxFlagsToCmd(cmd)
   428  	return cmd
   429  }
   430  
   431  func NewTxCmdModify() *cobra.Command {
   432  	cmd := &cobra.Command{
   433  		Use:   "modify [contract-id] [grantee] [key] [value]",
   434  		Args:  cobra.ExactArgs(4),
   435  		Short: "modify token metadata",
   436  		Long: strings.TrimSpace(fmt.Sprintf(`
   437  			$ %s tx %s modify <contract-id> <grantee> <key> <value>`, version.AppName, token.ModuleName),
   438  		),
   439  		RunE: func(cmd *cobra.Command, args []string) error {
   440  			clientCtx, err := client.GetClientTxContext(cmd)
   441  			if err != nil {
   442  				return err
   443  			}
   444  
   445  			change := token.Attribute{Key: args[2], Value: args[3]}
   446  			msg := token.MsgModify{
   447  				ContractId: args[0],
   448  				Owner:      args[1],
   449  				Changes:    []token.Attribute{change},
   450  			}
   451  			if err := msg.ValidateBasic(); err != nil {
   452  				return err
   453  			}
   454  			return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), &msg)
   455  		},
   456  	}
   457  
   458  	flags.AddTxFlagsToCmd(cmd)
   459  	return cmd
   460  }