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 }