github.com/KiraCore/sekai@v0.3.43/x/layer2/client/cli/tx.go (about) 1 package cli 2 3 import ( 4 "fmt" 5 "strconv" 6 "strings" 7 8 govtypes "github.com/KiraCore/sekai/x/gov/types" 9 "github.com/KiraCore/sekai/x/layer2/types" 10 "github.com/cosmos/cosmos-sdk/client" 11 "github.com/cosmos/cosmos-sdk/client/flags" 12 "github.com/cosmos/cosmos-sdk/client/tx" 13 sdk "github.com/cosmos/cosmos-sdk/types" 14 "github.com/spf13/cobra" 15 ) 16 17 const ( 18 FlagTitle = "title" 19 FlagDescription = "description" 20 FlagDappName = "dapp-name" 21 FlagDappDescription = "dapp-description" 22 FlagDenom = "denom" 23 FlagWebsite = "website" 24 FlagLogo = "logo" 25 FlagSocial = "social" 26 FlagDocs = "docs" 27 FlagControllerRoles = "controller-roles" 28 FlagControllerAccounts = "controller-accounts" 29 FlagBinaryInfo = "binary-info" 30 FlagLpPoolConfig = "lp-pool-config" 31 FlagIssuranceConfig = "issurance-config" 32 FlagUpdateTimeMax = "update-time-max" 33 FlagExecutorsMin = "executors-min" 34 FlagExecutorsMax = "executors-max" 35 FlagVerifiersMin = "verifiers-min" 36 FlagDappStatus = "dapp-status" 37 FlagBond = "bond" 38 FlagVoteQuorum = "vote-quorum" 39 FlagVotePeriod = "vote-period" 40 FlagVoteEnactment = "vote-enactment" 41 FlagAddr = "addr" 42 FlagAmount = "amount" 43 ) 44 45 // NewTxCmd returns a root CLI command handler for all x/bank transaction commands. 46 func NewTxCmd() *cobra.Command { 47 txCmd := &cobra.Command{ 48 Use: types.ModuleName, 49 Short: "Tokens sub commands", 50 DisableFlagParsing: true, 51 SuggestionsMinimumDistance: 2, 52 RunE: client.ValidateCmd, 53 } 54 55 txCmd.AddCommand( 56 GetTxCreateDappProposalCmd(), 57 GetTxBondDappProposalCmd(), 58 GetTxReclaimDappBondProposalCmd(), 59 GetTxJoinDappVerifierWithBondCmd(), 60 GetTxExitDappCmd(), 61 GetTxExecuteDappTxCmd(), 62 GetTxDenounceLeaderTxCmd(), 63 GetTxTransitionDappCmd(), 64 GetTxApproveDappTransitionCmd(), 65 GetTxRejectDappTransitionCmd(), 66 GetTxProposalJoinDappCmd(), 67 GetTxProposalUpsertDappCmd(), 68 GetTxRedeemDappPoolTxCmd(), 69 GetTxSwapDappPoolTxCmd(), 70 GetTxConvertDappPoolTxCmd(), 71 GetTxPauseDappTxCmd(), 72 GetTxUnPauseDappTxCmd(), 73 GetTxReactivateDappTxCmd(), 74 GetTxTransferDappTxCmd(), 75 GetTxMintCreateFtTxCmd(), 76 GetTxMintCreateNftTxCmd(), 77 GetTxMintIssueTxCmd(), 78 GetTxMintBurnTxCmd(), 79 ) 80 81 return txCmd 82 } 83 84 // GetTxCreateDappProposalCmd implement cli command for MsgCreateDappProposal 85 func GetTxCreateDappProposalCmd() *cobra.Command { 86 cmd := &cobra.Command{ 87 Use: "create-dapp-proposal", 88 Short: "Submit a proposal to launch a dapp", 89 Args: cobra.MinimumNArgs(0), 90 RunE: func(cmd *cobra.Command, args []string) error { 91 clientCtx, err := client.GetClientTxContext(cmd) 92 if err != nil { 93 return err 94 } 95 96 name, err := cmd.Flags().GetString(FlagDappName) 97 if err != nil { 98 return fmt.Errorf("invalid name: %w", err) 99 } 100 denom, err := cmd.Flags().GetString(FlagDenom) 101 if err != nil { 102 return fmt.Errorf("invalid denom: %w", err) 103 } 104 description, err := cmd.Flags().GetString(FlagDappDescription) 105 if err != nil { 106 return fmt.Errorf("invalid description: %w", err) 107 } 108 website, err := cmd.Flags().GetString(FlagWebsite) 109 if err != nil { 110 return fmt.Errorf("invalid website: %w", err) 111 } 112 logo, err := cmd.Flags().GetString(FlagLogo) 113 if err != nil { 114 return fmt.Errorf("invalid logo: %w", err) 115 } 116 social, err := cmd.Flags().GetString(FlagSocial) 117 if err != nil { 118 return fmt.Errorf("invalid social: %w", err) 119 } 120 docs, err := cmd.Flags().GetString(FlagDocs) 121 if err != nil { 122 return fmt.Errorf("invalid docs: %w", err) 123 } 124 bondStr, err := cmd.Flags().GetString(FlagBond) 125 if err != nil { 126 return fmt.Errorf("invalid bonds: %w", err) 127 } 128 bond, err := sdk.ParseCoinNormalized(bondStr) 129 if err != nil { 130 return fmt.Errorf("invalid bonds: %w", err) 131 } 132 133 voteQuorum, err := cmd.Flags().GetUint64(FlagVoteQuorum) 134 if err != nil { 135 return fmt.Errorf("invalid vote quorum: %w", err) 136 } 137 votePeriod, err := cmd.Flags().GetUint64(FlagVotePeriod) 138 if err != nil { 139 return fmt.Errorf("invalid vote period: %w", err) 140 } 141 voteEnactment, err := cmd.Flags().GetUint64(FlagVoteEnactment) 142 if err != nil { 143 return fmt.Errorf("invalid vote period: %w", err) 144 } 145 146 ctrlRolesStr, err := cmd.Flags().GetString(FlagControllerRoles) 147 if err != nil { 148 return fmt.Errorf("invalid controller roles: %w", err) 149 } 150 ctrlAccountsStr, err := cmd.Flags().GetString(FlagControllerAccounts) 151 if err != nil { 152 return fmt.Errorf("invalid controller accounts: %w", err) 153 } 154 155 ctrlRoles, ctrlAccounts, err := parseRolesAccounts(ctrlRolesStr, ctrlAccountsStr) 156 if err != nil { 157 return fmt.Errorf("invalid controller role/accounts: %w", err) 158 } 159 160 issuranceStr, err := cmd.Flags().GetString(FlagIssuranceConfig) 161 if err != nil { 162 return fmt.Errorf("invalid issurance config: %w", err) 163 } 164 issurance := types.IssuranceConfig{} 165 err = clientCtx.Codec.UnmarshalJSON([]byte(issuranceStr), &issurance) 166 if err != nil { 167 return fmt.Errorf("invalid issurance config: %w", err) 168 } 169 170 lpPoolConfigStr, err := cmd.Flags().GetString(FlagLpPoolConfig) 171 if err != nil { 172 return fmt.Errorf("invalid lp pool config: %w", err) 173 } 174 lpPoolConfig := types.LpPoolConfig{} 175 err = clientCtx.Codec.UnmarshalJSON([]byte(lpPoolConfigStr), &lpPoolConfig) 176 if err != nil { 177 return fmt.Errorf("invalid lp pool config: %w", err) 178 } 179 180 binaryInfoStr, err := cmd.Flags().GetString(FlagBinaryInfo) 181 if err != nil { 182 return fmt.Errorf("invalid binaryInfo: %w", err) 183 } 184 binaryInfo := types.BinaryInfo{} 185 err = clientCtx.Codec.UnmarshalJSON([]byte(binaryInfoStr), &binaryInfo) 186 if err != nil { 187 return fmt.Errorf("invalid binaryInfo: %w", err) 188 } 189 190 statusStr, err := cmd.Flags().GetString(FlagDappStatus) 191 if err != nil { 192 return fmt.Errorf("invalid status: %w", err) 193 } 194 195 updateMaxTime, err := cmd.Flags().GetUint64(FlagUpdateTimeMax) 196 if err != nil { 197 return fmt.Errorf("invalid updateMaxTime: %w", err) 198 } 199 executorsMin, err := cmd.Flags().GetUint64(FlagExecutorsMin) 200 if err != nil { 201 return fmt.Errorf("invalid executorsMin: %w", err) 202 } 203 executorsMax, err := cmd.Flags().GetUint64(FlagExecutorsMax) 204 if err != nil { 205 return fmt.Errorf("invalid executorsMax: %w", err) 206 } 207 verifiersMin, err := cmd.Flags().GetUint64(FlagVerifiersMin) 208 if err != nil { 209 return fmt.Errorf("invalid verifiersMin: %w", err) 210 } 211 212 msg := &types.MsgCreateDappProposal{ 213 Sender: clientCtx.GetFromAddress().String(), 214 Bond: bond, 215 Dapp: types.Dapp{ 216 Name: name, 217 Denom: denom, 218 Description: description, 219 Website: website, 220 Logo: logo, 221 Social: social, 222 Docs: docs, 223 Controllers: types.Controllers{ 224 Whitelist: types.AccountRange{ 225 Roles: ctrlRoles, 226 Addresses: ctrlAccounts, 227 }, 228 }, 229 Bin: []types.BinaryInfo{binaryInfo}, 230 Pool: lpPoolConfig, 231 Issurance: issurance, 232 UpdateTimeMax: updateMaxTime, 233 ExecutorsMin: executorsMin, 234 ExecutorsMax: executorsMax, 235 VerifiersMin: verifiersMin, 236 Status: types.DappStatus(types.SessionStatus_value[statusStr]), 237 VoteQuorum: voteQuorum, 238 VotePeriod: votePeriod, 239 VoteEnactment: voteEnactment, 240 }, 241 } 242 243 err = msg.ValidateBasic() 244 if err != nil { 245 return err 246 } 247 248 return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) 249 }, 250 } 251 252 flags.AddTxFlagsToCmd(cmd) 253 _ = cmd.MarkFlagRequired(flags.FlagFrom) 254 255 cmd.Flags().String(FlagDappName, "", "Dapp name") 256 cmd.Flags().String(FlagDenom, "", "Dapp denom") 257 cmd.Flags().String(FlagDappDescription, "", "Dapp description") 258 cmd.Flags().String(FlagWebsite, "", "Dapp website") 259 cmd.Flags().String(FlagLogo, "", "Dapp logo") 260 cmd.Flags().String(FlagSocial, "", "Dapp social") 261 cmd.Flags().String(FlagDocs, "", "Dapp docs") 262 cmd.Flags().String(FlagBond, "", "Initial bond deposit for dapp") 263 cmd.Flags().Uint64(FlagVoteQuorum, 0, "vote quorum of the dapp") 264 cmd.Flags().Uint64(FlagVotePeriod, 0, "vote period of the dapp") 265 cmd.Flags().Uint64(FlagVoteEnactment, 0, "vote enactment of the dapp") 266 cmd.Flags().String(FlagControllerRoles, "", "controller roles on the dapp.") 267 cmd.Flags().String(FlagControllerAccounts, "", "controller accounts on the dapp.") 268 cmd.Flags().String(FlagIssuranceConfig, "{}", "dapp issurance config.") 269 cmd.Flags().String(FlagLpPoolConfig, "{}", "dapp lp config.") 270 cmd.Flags().String(FlagBinaryInfo, "{}", "dapp binary info.") 271 cmd.Flags().String(FlagDappStatus, "{}", "dapp status.") 272 cmd.Flags().Uint64(FlagUpdateTimeMax, 0, "dapp update time max") 273 cmd.Flags().Uint64(FlagExecutorsMin, 0, "dapp executors min") 274 cmd.Flags().Uint64(FlagExecutorsMax, 0, "dapp executors max") 275 cmd.Flags().Uint64(FlagVerifiersMin, 0, "dapp verifiers min") 276 277 return cmd 278 } 279 280 // GetTxBondDappProposalCmd implement cli command for MsgBondDappProposal 281 func GetTxBondDappProposalCmd() *cobra.Command { 282 cmd := &cobra.Command{ 283 Use: "bond-dapp-proposal", 284 Short: "Bond on dapp proposal", 285 Args: cobra.MinimumNArgs(0), 286 RunE: func(cmd *cobra.Command, args []string) error { 287 clientCtx, err := client.GetClientTxContext(cmd) 288 if err != nil { 289 return err 290 } 291 292 name, err := cmd.Flags().GetString(FlagDappName) 293 if err != nil { 294 return fmt.Errorf("invalid name: %w", err) 295 } 296 bondStr, err := cmd.Flags().GetString(FlagBond) 297 if err != nil { 298 return fmt.Errorf("invalid bonds: %w", err) 299 } 300 bond, err := sdk.ParseCoinNormalized(bondStr) 301 if err != nil { 302 return fmt.Errorf("invalid bonds: %w", err) 303 } 304 305 msg := &types.MsgBondDappProposal{ 306 Sender: clientCtx.GetFromAddress().String(), 307 DappName: name, 308 Bond: bond, 309 } 310 311 err = msg.ValidateBasic() 312 if err != nil { 313 return err 314 } 315 316 return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) 317 }, 318 } 319 320 flags.AddTxFlagsToCmd(cmd) 321 _ = cmd.MarkFlagRequired(flags.FlagFrom) 322 323 cmd.Flags().String(FlagDappName, "", "Dapp name") 324 cmd.Flags().String(FlagBond, "", "Initial bond deposit for dapp") 325 326 return cmd 327 } 328 329 // GetTxReclaimDappBondProposalCmd implement cli command for MsgReclaimDappBondProposal 330 func GetTxReclaimDappBondProposalCmd() *cobra.Command { 331 cmd := &cobra.Command{ 332 Use: "reclaim-dapp-proposal", 333 Short: "Reclaim from dapp proposal", 334 Args: cobra.MinimumNArgs(0), 335 RunE: func(cmd *cobra.Command, args []string) error { 336 clientCtx, err := client.GetClientTxContext(cmd) 337 if err != nil { 338 return err 339 } 340 341 name, err := cmd.Flags().GetString(FlagDappName) 342 if err != nil { 343 return fmt.Errorf("invalid name: %w", err) 344 } 345 bondStr, err := cmd.Flags().GetString(FlagBond) 346 if err != nil { 347 return fmt.Errorf("invalid bonds: %w", err) 348 } 349 bond, err := sdk.ParseCoinNormalized(bondStr) 350 if err != nil { 351 return fmt.Errorf("invalid bonds: %w", err) 352 } 353 354 msg := &types.MsgReclaimDappBondProposal{ 355 Sender: clientCtx.GetFromAddress().String(), 356 DappName: name, 357 Bond: bond, 358 } 359 360 err = msg.ValidateBasic() 361 if err != nil { 362 return err 363 } 364 365 return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) 366 }, 367 } 368 369 flags.AddTxFlagsToCmd(cmd) 370 _ = cmd.MarkFlagRequired(flags.FlagFrom) 371 372 cmd.Flags().String(FlagDappName, "", "Dapp name") 373 cmd.Flags().String(FlagBond, "", "Initial bond deposit for dapp") 374 375 return cmd 376 } 377 378 // GetTxJoinDappVerifierWithBondCmd implement cli command for MsgJoinDappVerifierWithBond 379 func GetTxJoinDappVerifierWithBondCmd() *cobra.Command { 380 cmd := &cobra.Command{ 381 Use: "join-dapp-verifier-with-bond [dapp-name] [interx]", 382 Short: "Join dapp verifier with bond", 383 Args: cobra.MinimumNArgs(2), 384 RunE: func(cmd *cobra.Command, args []string) error { 385 clientCtx, err := client.GetClientTxContext(cmd) 386 if err != nil { 387 return err 388 } 389 390 msg := &types.MsgJoinDappVerifierWithBond{ 391 Sender: clientCtx.GetFromAddress().String(), 392 DappName: args[0], 393 Interx: args[1], 394 } 395 396 err = msg.ValidateBasic() 397 if err != nil { 398 return err 399 } 400 401 return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) 402 }, 403 } 404 405 flags.AddTxFlagsToCmd(cmd) 406 _ = cmd.MarkFlagRequired(flags.FlagFrom) 407 408 return cmd 409 } 410 411 // GetTxExitDappCmd implement cli command for MsgExitDapp 412 func GetTxExitDappCmd() *cobra.Command { 413 cmd := &cobra.Command{ 414 Use: "exit-dapp [dapp-name]", 415 Short: "Send request to exit dapp", 416 Args: cobra.MinimumNArgs(1), 417 RunE: func(cmd *cobra.Command, args []string) error { 418 clientCtx, err := client.GetClientTxContext(cmd) 419 if err != nil { 420 return err 421 } 422 423 msg := &types.MsgExitDapp{ 424 Sender: clientCtx.GetFromAddress().String(), 425 DappName: args[0], 426 } 427 428 err = msg.ValidateBasic() 429 if err != nil { 430 return err 431 } 432 433 return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) 434 }, 435 } 436 437 flags.AddTxFlagsToCmd(cmd) 438 _ = cmd.MarkFlagRequired(flags.FlagFrom) 439 440 return cmd 441 } 442 443 // GetTxExecuteDappTxCmd implement cli command for MsgExecuteDappTx 444 func GetTxExecuteDappTxCmd() *cobra.Command { 445 cmd := &cobra.Command{ 446 Use: "execute-dapp-tx [dapp-name] [gateway]", 447 Short: "Send signal to start dapp execution", 448 Args: cobra.MinimumNArgs(2), 449 RunE: func(cmd *cobra.Command, args []string) error { 450 clientCtx, err := client.GetClientTxContext(cmd) 451 if err != nil { 452 return err 453 } 454 455 msg := &types.MsgExecuteDappTx{ 456 Sender: clientCtx.GetFromAddress().String(), 457 DappName: args[0], 458 Gateway: args[1], 459 } 460 461 err = msg.ValidateBasic() 462 if err != nil { 463 return err 464 } 465 466 return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) 467 }, 468 } 469 470 flags.AddTxFlagsToCmd(cmd) 471 _ = cmd.MarkFlagRequired(flags.FlagFrom) 472 473 return cmd 474 } 475 476 // GetTxDenounceLeaderTxCmd implement cli command for MsgDenounceLeaderTx 477 func GetTxDenounceLeaderTxCmd() *cobra.Command { 478 cmd := &cobra.Command{ 479 Use: "denounce-leader [dapp-name] [leader] [denounce-txt] [version]", 480 Short: "Send leader denounce transaction", 481 Args: cobra.MinimumNArgs(4), 482 RunE: func(cmd *cobra.Command, args []string) error { 483 clientCtx, err := client.GetClientTxContext(cmd) 484 if err != nil { 485 return err 486 } 487 488 msg := &types.MsgDenounceLeaderTx{ 489 Sender: clientCtx.GetFromAddress().String(), 490 DappName: args[0], 491 Leader: args[1], 492 DenounceText: args[2], 493 Version: args[3], 494 } 495 496 err = msg.ValidateBasic() 497 if err != nil { 498 return err 499 } 500 501 return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) 502 }, 503 } 504 505 flags.AddTxFlagsToCmd(cmd) 506 _ = cmd.MarkFlagRequired(flags.FlagFrom) 507 508 return cmd 509 } 510 511 // GetTxTransitionDappCmd implement cli command for MsgTransitionDappTx 512 func GetTxTransitionDappCmd() *cobra.Command { 513 cmd := &cobra.Command{ 514 Use: "transition-dapp [dapp-name] [status-hash] [version]", 515 Short: "Send dapp transition message", 516 Args: cobra.MinimumNArgs(3), 517 RunE: func(cmd *cobra.Command, args []string) error { 518 clientCtx, err := client.GetClientTxContext(cmd) 519 if err != nil { 520 return err 521 } 522 523 msg := types.NewMsgTransitionDappTx( 524 clientCtx.GetFromAddress().String(), args[0], args[1], args[2], []sdk.Msg{}, 525 ) 526 err = msg.ValidateBasic() 527 if err != nil { 528 return err 529 } 530 531 return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) 532 }, 533 } 534 535 flags.AddTxFlagsToCmd(cmd) 536 _ = cmd.MarkFlagRequired(flags.FlagFrom) 537 538 return cmd 539 } 540 541 // GetTxApproveDappTransitionCmd implement cli command for MsgApproveDappTransitionTx 542 func GetTxApproveDappTransitionCmd() *cobra.Command { 543 cmd := &cobra.Command{ 544 Use: "approve-dapp-transition [dapp-name] [version]", 545 Short: "Send dapp transition approval message", 546 Args: cobra.MinimumNArgs(2), 547 RunE: func(cmd *cobra.Command, args []string) error { 548 clientCtx, err := client.GetClientTxContext(cmd) 549 if err != nil { 550 return err 551 } 552 553 msg := &types.MsgApproveDappTransitionTx{ 554 Sender: clientCtx.GetFromAddress().String(), 555 DappName: args[0], 556 Version: args[1], 557 } 558 559 err = msg.ValidateBasic() 560 if err != nil { 561 return err 562 } 563 564 return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) 565 }, 566 } 567 568 flags.AddTxFlagsToCmd(cmd) 569 _ = cmd.MarkFlagRequired(flags.FlagFrom) 570 571 return cmd 572 } 573 574 // GetTxRejectDappTransitionCmd implement cli command for MsgRejectDappTransitionTx 575 func GetTxRejectDappTransitionCmd() *cobra.Command { 576 cmd := &cobra.Command{ 577 Use: "reject-dapp-transition [dapp-name] [version]", 578 Short: "Send dapp transition reject message", 579 Args: cobra.MinimumNArgs(2), 580 RunE: func(cmd *cobra.Command, args []string) error { 581 clientCtx, err := client.GetClientTxContext(cmd) 582 if err != nil { 583 return err 584 } 585 586 msg := &types.MsgRejectDappTransitionTx{ 587 Sender: clientCtx.GetFromAddress().String(), 588 DappName: args[0], 589 Version: args[1], 590 } 591 592 err = msg.ValidateBasic() 593 if err != nil { 594 return err 595 } 596 597 return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) 598 }, 599 } 600 601 flags.AddTxFlagsToCmd(cmd) 602 _ = cmd.MarkFlagRequired(flags.FlagFrom) 603 604 return cmd 605 } 606 607 // GetTxProposalJoinDappCmd implement cli command for ProposalJoinDapp 608 func GetTxProposalJoinDappCmd() *cobra.Command { 609 cmd := &cobra.Command{ 610 Use: "proposal-join-dapp [dapp-name] [is-executor] [is-verifier] [interx]", 611 Short: "Create a proposal to join dapp", 612 Args: cobra.ExactArgs(4), 613 RunE: func(cmd *cobra.Command, args []string) error { 614 clientCtx, err := client.GetClientTxContext(cmd) 615 if err != nil { 616 return err 617 } 618 title, err := cmd.Flags().GetString(FlagTitle) 619 if err != nil { 620 return fmt.Errorf("invalid title: %w", err) 621 } 622 description, err := cmd.Flags().GetString(FlagDescription) 623 if err != nil { 624 return fmt.Errorf("invalid description: %w", err) 625 } 626 627 executor, err := strconv.ParseBool(args[1]) 628 if err != nil { 629 return fmt.Errorf("invalid executor flag: %w", err) 630 } 631 632 verifier, err := strconv.ParseBool(args[2]) 633 if err != nil { 634 return fmt.Errorf("invalid verifier flag: %w", err) 635 } 636 637 msg, err := govtypes.NewMsgSubmitProposal( 638 clientCtx.FromAddress, 639 title, 640 description, 641 &types.ProposalJoinDapp{ 642 Sender: clientCtx.GetFromAddress().String(), 643 DappName: args[0], 644 Executor: executor, 645 Verifier: verifier, 646 Interx: args[3], 647 }, 648 ) 649 if err != nil { 650 return err 651 } 652 653 return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) 654 }, 655 } 656 657 cmd.Flags().String(FlagTitle, "", "The title of the proposal.") 658 cmd.MarkFlagRequired(FlagTitle) 659 cmd.Flags().String(FlagDescription, "", "The description of the proposal, it can be a url, some text, etc.") 660 cmd.MarkFlagRequired(FlagDescription) 661 662 flags.AddTxFlagsToCmd(cmd) 663 _ = cmd.MarkFlagRequired(flags.FlagFrom) 664 665 return cmd 666 } 667 668 // GetTxProposalUpsertDappCmd implement cli command for ProposalUpsertDapp 669 func GetTxProposalUpsertDappCmd() *cobra.Command { 670 cmd := &cobra.Command{ 671 Use: "proposal-upsert-dapp", 672 Short: "Create a proposal to upsert dapp", 673 Args: cobra.ExactArgs(0), 674 RunE: func(cmd *cobra.Command, args []string) error { 675 clientCtx, err := client.GetClientTxContext(cmd) 676 if err != nil { 677 return err 678 } 679 title, err := cmd.Flags().GetString(FlagTitle) 680 if err != nil { 681 return fmt.Errorf("invalid title: %w", err) 682 } 683 description, err := cmd.Flags().GetString(FlagDescription) 684 if err != nil { 685 return fmt.Errorf("invalid description: %w", err) 686 } 687 688 name, err := cmd.Flags().GetString(FlagDappName) 689 if err != nil { 690 return fmt.Errorf("invalid name: %w", err) 691 } 692 denom, err := cmd.Flags().GetString(FlagDenom) 693 if err != nil { 694 return fmt.Errorf("invalid denom: %w", err) 695 } 696 dappDescription, err := cmd.Flags().GetString(FlagDappDescription) 697 if err != nil { 698 return fmt.Errorf("invalid description: %w", err) 699 } 700 website, err := cmd.Flags().GetString(FlagWebsite) 701 if err != nil { 702 return fmt.Errorf("invalid website: %w", err) 703 } 704 logo, err := cmd.Flags().GetString(FlagLogo) 705 if err != nil { 706 return fmt.Errorf("invalid logo: %w", err) 707 } 708 social, err := cmd.Flags().GetString(FlagSocial) 709 if err != nil { 710 return fmt.Errorf("invalid social: %w", err) 711 } 712 docs, err := cmd.Flags().GetString(FlagDocs) 713 if err != nil { 714 return fmt.Errorf("invalid docs: %w", err) 715 } 716 717 ctrlRolesStr, err := cmd.Flags().GetString(FlagControllerRoles) 718 if err != nil { 719 return fmt.Errorf("invalid controller roles: %w", err) 720 } 721 ctrlAccountsStr, err := cmd.Flags().GetString(FlagControllerAccounts) 722 if err != nil { 723 return fmt.Errorf("invalid controller accounts: %w", err) 724 } 725 726 ctrlRoles, ctrlAccounts, err := parseRolesAccounts(ctrlRolesStr, ctrlAccountsStr) 727 if err != nil { 728 return fmt.Errorf("invalid controller role/accounts: %w", err) 729 } 730 731 issuranceStr, err := cmd.Flags().GetString(FlagIssuranceConfig) 732 if err != nil { 733 return fmt.Errorf("invalid issurance config: %w", err) 734 } 735 issurance := types.IssuranceConfig{} 736 err = clientCtx.Codec.UnmarshalJSON([]byte(issuranceStr), &issurance) 737 if err != nil { 738 return fmt.Errorf("invalid issurance config: %w", err) 739 } 740 741 lpPoolConfigStr, err := cmd.Flags().GetString(FlagLpPoolConfig) 742 if err != nil { 743 return fmt.Errorf("invalid lp pool config: %w", err) 744 } 745 lpPoolConfig := types.LpPoolConfig{} 746 err = clientCtx.Codec.UnmarshalJSON([]byte(lpPoolConfigStr), &lpPoolConfig) 747 if err != nil { 748 return fmt.Errorf("invalid lp pool config: %w", err) 749 } 750 751 binaryInfoStr, err := cmd.Flags().GetString(FlagBinaryInfo) 752 if err != nil { 753 return fmt.Errorf("invalid binaryInfo: %w", err) 754 } 755 binaryInfo := types.BinaryInfo{} 756 err = clientCtx.Codec.UnmarshalJSON([]byte(binaryInfoStr), &binaryInfo) 757 if err != nil { 758 return fmt.Errorf("invalid binaryInfo: %w", err) 759 } 760 761 statusStr, err := cmd.Flags().GetString(FlagDappStatus) 762 if err != nil { 763 return fmt.Errorf("invalid status: %w", err) 764 } 765 766 updateMaxTime, err := cmd.Flags().GetUint64(FlagUpdateTimeMax) 767 if err != nil { 768 return fmt.Errorf("invalid updateMaxTime: %w", err) 769 } 770 executorsMin, err := cmd.Flags().GetUint64(FlagExecutorsMin) 771 if err != nil { 772 return fmt.Errorf("invalid executorsMin: %w", err) 773 } 774 executorsMax, err := cmd.Flags().GetUint64(FlagExecutorsMax) 775 if err != nil { 776 return fmt.Errorf("invalid executorsMax: %w", err) 777 } 778 verifiersMin, err := cmd.Flags().GetUint64(FlagVerifiersMin) 779 if err != nil { 780 return fmt.Errorf("invalid verifiersMin: %w", err) 781 } 782 voteQuorum, err := cmd.Flags().GetUint64(FlagVoteQuorum) 783 if err != nil { 784 return fmt.Errorf("invalid vote quorum: %w", err) 785 } 786 votePeriod, err := cmd.Flags().GetUint64(FlagVotePeriod) 787 if err != nil { 788 return fmt.Errorf("invalid vote period: %w", err) 789 } 790 voteEnactment, err := cmd.Flags().GetUint64(FlagVoteEnactment) 791 if err != nil { 792 return fmt.Errorf("invalid vote period: %w", err) 793 } 794 795 msg, err := govtypes.NewMsgSubmitProposal( 796 clientCtx.FromAddress, 797 title, 798 description, 799 &types.ProposalUpsertDapp{ 800 Sender: clientCtx.GetFromAddress().String(), 801 Dapp: types.Dapp{ 802 Name: name, 803 Denom: denom, 804 Description: dappDescription, 805 Website: website, 806 Logo: logo, 807 Social: social, 808 Docs: docs, 809 Controllers: types.Controllers{ 810 Whitelist: types.AccountRange{ 811 Roles: ctrlRoles, 812 Addresses: ctrlAccounts, 813 }, 814 }, 815 Bin: []types.BinaryInfo{binaryInfo}, 816 Pool: lpPoolConfig, 817 Issurance: issurance, 818 UpdateTimeMax: updateMaxTime, 819 ExecutorsMin: executorsMin, 820 ExecutorsMax: executorsMax, 821 VerifiersMin: verifiersMin, 822 Status: types.DappStatus(types.SessionStatus_value[statusStr]), 823 VoteQuorum: voteQuorum, 824 VotePeriod: votePeriod, 825 VoteEnactment: voteEnactment, 826 }, 827 }, 828 ) 829 if err != nil { 830 return err 831 } 832 833 return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) 834 }, 835 } 836 837 cmd.Flags().String(FlagTitle, "", "The title of the proposal.") 838 cmd.MarkFlagRequired(FlagTitle) 839 cmd.Flags().String(FlagDescription, "", "The description of the proposal, it can be a url, some text, etc.") 840 cmd.MarkFlagRequired(FlagDescription) 841 842 cmd.Flags().String(FlagDappName, "", "Dapp name") 843 cmd.Flags().String(FlagDenom, "", "Dapp denom") 844 cmd.Flags().String(FlagDappDescription, "", "Dapp description") 845 cmd.Flags().String(FlagWebsite, "", "Dapp website") 846 cmd.Flags().String(FlagLogo, "", "Dapp logo") 847 cmd.Flags().String(FlagSocial, "", "Dapp social") 848 cmd.Flags().String(FlagDocs, "", "Dapp docs") 849 cmd.Flags().String(FlagBond, "", "Initial bond deposit for dapp") 850 cmd.Flags().Uint64(FlagVoteQuorum, 0, "vote quorum of the dapp") 851 cmd.Flags().Uint64(FlagVotePeriod, 0, "vote period of the dapp") 852 cmd.Flags().Uint64(FlagVoteEnactment, 0, "vote enactment of the dapp") 853 cmd.Flags().String(FlagControllerRoles, "", "controller roles on the dapp.") 854 cmd.Flags().String(FlagControllerAccounts, "", "controller accounts on the dapp.") 855 cmd.Flags().String(FlagIssuranceConfig, "{}", "dapp issurance config.") 856 cmd.Flags().String(FlagLpPoolConfig, "{}", "dapp lp config.") 857 cmd.Flags().String(FlagBinaryInfo, "{}", "dapp binary info.") 858 cmd.Flags().String(FlagDappStatus, "{}", "dapp status.") 859 cmd.Flags().Uint64(FlagUpdateTimeMax, 0, "dapp update time max") 860 cmd.Flags().Uint64(FlagExecutorsMin, 0, "dapp executors min") 861 cmd.Flags().Uint64(FlagExecutorsMax, 0, "dapp executors max") 862 cmd.Flags().Uint64(FlagVerifiersMin, 0, "dapp verifiers min") 863 864 flags.AddTxFlagsToCmd(cmd) 865 _ = cmd.MarkFlagRequired(flags.FlagFrom) 866 867 return cmd 868 } 869 870 func parseRolesAccounts(rolesStr, accountsStr string) ([]uint64, []string, error) { 871 roleStrArr := strings.Split(rolesStr, ",") 872 if rolesStr == "" { 873 roleStrArr = []string{} 874 } 875 roles := []uint64{} 876 for _, roleStr := range roleStrArr { 877 role, err := strconv.Atoi(roleStr) 878 if err != nil { 879 return []uint64{}, []string{}, fmt.Errorf("invalid role: %w", err) 880 } 881 roles = append(roles, uint64(role)) 882 } 883 accounts := strings.Split(accountsStr, ",") 884 if accountsStr == "" { 885 accounts = []string{} 886 } 887 return roles, accounts, nil 888 } 889 890 // GetTxRedeemDappPoolTxCmd implement cli command for MsgRedeemDappPoolTx 891 func GetTxRedeemDappPoolTxCmd() *cobra.Command { 892 cmd := &cobra.Command{ 893 Use: "redeem-dapp-pool [dapp-name] [lp-token] [slippage]", 894 Short: "Send redeem dapp pool message", 895 Args: cobra.MinimumNArgs(3), 896 RunE: func(cmd *cobra.Command, args []string) error { 897 clientCtx, err := client.GetClientTxContext(cmd) 898 if err != nil { 899 return err 900 } 901 902 coin, err := sdk.ParseCoinNormalized(args[1]) 903 if err != nil { 904 return err 905 } 906 907 slippage, err := sdk.NewDecFromStr(args[2]) 908 if err != nil { 909 return err 910 } 911 912 msg := &types.MsgRedeemDappPoolTx{ 913 Sender: clientCtx.GetFromAddress().String(), 914 DappName: args[0], 915 LpToken: coin, 916 Slippage: slippage, 917 } 918 919 err = msg.ValidateBasic() 920 if err != nil { 921 return err 922 } 923 924 return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) 925 }, 926 } 927 928 flags.AddTxFlagsToCmd(cmd) 929 _ = cmd.MarkFlagRequired(flags.FlagFrom) 930 931 return cmd 932 } 933 934 // GetTxSwapDappPoolTxCmd implement cli command for MsgSwapDappPoolTx 935 func GetTxSwapDappPoolTxCmd() *cobra.Command { 936 cmd := &cobra.Command{ 937 Use: "swap-dapp-pool [dapp-name] [token] [slippage]", 938 Short: "Send swap dapp pool message", 939 Args: cobra.MinimumNArgs(3), 940 RunE: func(cmd *cobra.Command, args []string) error { 941 clientCtx, err := client.GetClientTxContext(cmd) 942 if err != nil { 943 return err 944 } 945 946 coin, err := sdk.ParseCoinNormalized(args[1]) 947 if err != nil { 948 return err 949 } 950 951 slippage, err := sdk.NewDecFromStr(args[2]) 952 if err != nil { 953 return err 954 } 955 956 msg := &types.MsgSwapDappPoolTx{ 957 Sender: clientCtx.GetFromAddress().String(), 958 DappName: args[0], 959 Token: coin, 960 Slippage: slippage, 961 } 962 963 err = msg.ValidateBasic() 964 if err != nil { 965 return err 966 } 967 968 return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) 969 }, 970 } 971 972 flags.AddTxFlagsToCmd(cmd) 973 _ = cmd.MarkFlagRequired(flags.FlagFrom) 974 975 return cmd 976 } 977 978 // GetTxConvertDappPoolTxCmd implement cli command for MsgConvertDappPoolTx 979 func GetTxConvertDappPoolTxCmd() *cobra.Command { 980 cmd := &cobra.Command{ 981 Use: "convert-dapp-pool [dapp-name] [target-dapp-name] [token] [slippage]", 982 Short: "Send convert dapp pool message", 983 Args: cobra.MinimumNArgs(4), 984 RunE: func(cmd *cobra.Command, args []string) error { 985 clientCtx, err := client.GetClientTxContext(cmd) 986 if err != nil { 987 return err 988 } 989 990 coin, err := sdk.ParseCoinNormalized(args[2]) 991 if err != nil { 992 return err 993 } 994 995 slippage, err := sdk.NewDecFromStr(args[3]) 996 if err != nil { 997 return err 998 } 999 1000 msg := &types.MsgConvertDappPoolTx{ 1001 Sender: clientCtx.GetFromAddress().String(), 1002 DappName: args[0], 1003 TargetDappName: args[1], 1004 LpToken: coin, 1005 Slippage: slippage, 1006 } 1007 1008 err = msg.ValidateBasic() 1009 if err != nil { 1010 return err 1011 } 1012 1013 return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) 1014 }, 1015 } 1016 1017 flags.AddTxFlagsToCmd(cmd) 1018 _ = cmd.MarkFlagRequired(flags.FlagFrom) 1019 1020 return cmd 1021 } 1022 1023 // GetTxPauseDappTxCmd implement cli command for MsgPauseDappTx 1024 func GetTxPauseDappTxCmd() *cobra.Command { 1025 cmd := &cobra.Command{ 1026 Use: "pause-dapp [dapp-name]", 1027 Short: "Send pause dapp message", 1028 Args: cobra.MinimumNArgs(1), 1029 RunE: func(cmd *cobra.Command, args []string) error { 1030 clientCtx, err := client.GetClientTxContext(cmd) 1031 if err != nil { 1032 return err 1033 } 1034 1035 msg := &types.MsgPauseDappTx{ 1036 Sender: clientCtx.GetFromAddress().String(), 1037 DappName: args[0], 1038 } 1039 1040 err = msg.ValidateBasic() 1041 if err != nil { 1042 return err 1043 } 1044 1045 return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) 1046 }, 1047 } 1048 1049 flags.AddTxFlagsToCmd(cmd) 1050 _ = cmd.MarkFlagRequired(flags.FlagFrom) 1051 1052 return cmd 1053 } 1054 1055 // GetTxUnPauseDappTxCmd implement cli command for MsgUnPauseDappTx 1056 func GetTxUnPauseDappTxCmd() *cobra.Command { 1057 cmd := &cobra.Command{ 1058 Use: "unpause-dapp [dapp-name]", 1059 Short: "Send unpause dapp message", 1060 Args: cobra.MinimumNArgs(1), 1061 RunE: func(cmd *cobra.Command, args []string) error { 1062 clientCtx, err := client.GetClientTxContext(cmd) 1063 if err != nil { 1064 return err 1065 } 1066 1067 msg := &types.MsgUnPauseDappTx{ 1068 Sender: clientCtx.GetFromAddress().String(), 1069 DappName: args[0], 1070 } 1071 1072 err = msg.ValidateBasic() 1073 if err != nil { 1074 return err 1075 } 1076 1077 return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) 1078 }, 1079 } 1080 1081 flags.AddTxFlagsToCmd(cmd) 1082 _ = cmd.MarkFlagRequired(flags.FlagFrom) 1083 1084 return cmd 1085 } 1086 1087 // GetTxReactivateDappTxCmd implement cli command for MsgReactivateDappTx 1088 func GetTxReactivateDappTxCmd() *cobra.Command { 1089 cmd := &cobra.Command{ 1090 Use: "reactivate-dapp [dapp-name]", 1091 Short: "Send reactivate dapp message", 1092 Args: cobra.MinimumNArgs(1), 1093 RunE: func(cmd *cobra.Command, args []string) error { 1094 clientCtx, err := client.GetClientTxContext(cmd) 1095 if err != nil { 1096 return err 1097 } 1098 1099 msg := &types.MsgReactivateDappTx{ 1100 Sender: clientCtx.GetFromAddress().String(), 1101 DappName: args[0], 1102 } 1103 1104 err = msg.ValidateBasic() 1105 if err != nil { 1106 return err 1107 } 1108 1109 return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) 1110 }, 1111 } 1112 1113 flags.AddTxFlagsToCmd(cmd) 1114 _ = cmd.MarkFlagRequired(flags.FlagFrom) 1115 1116 return cmd 1117 } 1118 1119 // GetTxTransferDappTxCmd implement cli command for MsgTransferDappTx 1120 func GetTxTransferDappTxCmd() *cobra.Command { 1121 cmd := &cobra.Command{ 1122 Use: "transfer-dapp [request-json]", 1123 Short: "Send transfer dapp message", 1124 Args: cobra.MinimumNArgs(1), 1125 RunE: func(cmd *cobra.Command, args []string) error { 1126 clientCtx, err := client.GetClientTxContext(cmd) 1127 if err != nil { 1128 return err 1129 } 1130 1131 req := types.XAMRequest{} 1132 err = clientCtx.Codec.UnmarshalJSON([]byte(args[0]), &req) 1133 if err != nil { 1134 return err 1135 } 1136 1137 msg := &types.MsgTransferDappTx{ 1138 Sender: clientCtx.GetFromAddress().String(), 1139 Requests: []types.XAMRequest{req}, 1140 } 1141 1142 err = msg.ValidateBasic() 1143 if err != nil { 1144 return err 1145 } 1146 1147 return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) 1148 }, 1149 } 1150 1151 flags.AddTxFlagsToCmd(cmd) 1152 _ = cmd.MarkFlagRequired(flags.FlagFrom) 1153 1154 return cmd 1155 } 1156 1157 // GetTxMintCreateFtTxCmd implement cli command for MsgMintCreateFtTx 1158 func GetTxMintCreateFtTxCmd() *cobra.Command { 1159 cmd := &cobra.Command{ 1160 Use: "mint-create-ft-tx [denom-suffix] [name] [symbol] [icon] [description] [website] [social] [decimals] [cap] [supply] [fee] [owner]", 1161 Short: "Send create fungible token tx message", 1162 Args: cobra.MinimumNArgs(12), 1163 RunE: func(cmd *cobra.Command, args []string) error { 1164 clientCtx, err := client.GetClientTxContext(cmd) 1165 if err != nil { 1166 return err 1167 } 1168 1169 decimals, err := strconv.Atoi(args[7]) 1170 if err != nil { 1171 return err 1172 } 1173 1174 cap, ok := sdk.NewIntFromString(args[8]) 1175 if !ok { 1176 return fmt.Errorf("invalid cap") 1177 } 1178 1179 supply, ok := sdk.NewIntFromString(args[9]) 1180 if !ok { 1181 return fmt.Errorf("invalid supply") 1182 } 1183 1184 fee, ok := sdk.NewIntFromString(args[10]) 1185 if !ok { 1186 return fmt.Errorf("invalid fee") 1187 } 1188 1189 msg := &types.MsgMintCreateFtTx{ 1190 Sender: clientCtx.GetFromAddress().String(), 1191 DenomSuffix: args[0], 1192 Name: args[1], 1193 Symbol: args[2], 1194 Icon: args[3], 1195 Description: args[4], 1196 Website: args[5], 1197 Social: args[6], 1198 Decimals: uint64(decimals), 1199 Cap: cap, 1200 Supply: supply, 1201 Fee: fee, 1202 Owner: args[11], 1203 } 1204 1205 err = msg.ValidateBasic() 1206 if err != nil { 1207 return err 1208 } 1209 1210 return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) 1211 }, 1212 } 1213 1214 flags.AddTxFlagsToCmd(cmd) 1215 _ = cmd.MarkFlagRequired(flags.FlagFrom) 1216 1217 return cmd 1218 } 1219 1220 // GetTxMintCreateNftTxCmd implement cli command for MsgMintCreateNftTx 1221 func GetTxMintCreateNftTxCmd() *cobra.Command { 1222 cmd := &cobra.Command{ 1223 Use: "mint-create-nft-tx [denom-suffix] [name] [symbol] [icon] [description] [website] [social] [decimals] [cap] [supply] [fee] [owner] [metadata] [hash]", 1224 Short: "Send create non-fungible token tx message", 1225 Args: cobra.MinimumNArgs(14), 1226 RunE: func(cmd *cobra.Command, args []string) error { 1227 clientCtx, err := client.GetClientTxContext(cmd) 1228 if err != nil { 1229 return err 1230 } 1231 1232 decimals, err := strconv.Atoi(args[7]) 1233 if err != nil { 1234 return err 1235 } 1236 1237 cap, ok := sdk.NewIntFromString(args[8]) 1238 if !ok { 1239 return fmt.Errorf("invalid cap") 1240 } 1241 1242 supply, ok := sdk.NewIntFromString(args[9]) 1243 if !ok { 1244 return fmt.Errorf("invalid supply") 1245 } 1246 1247 fee, ok := sdk.NewIntFromString(args[10]) 1248 if !ok { 1249 return fmt.Errorf("invalid fee") 1250 } 1251 1252 msg := &types.MsgMintCreateNftTx{ 1253 Sender: clientCtx.GetFromAddress().String(), 1254 DenomSuffix: args[0], 1255 Name: args[1], 1256 Symbol: args[2], 1257 Icon: args[3], 1258 Description: args[4], 1259 Website: args[5], 1260 Social: args[6], 1261 Decimals: uint64(decimals), 1262 Cap: cap, 1263 Supply: supply, 1264 Fee: fee, 1265 Owner: args[11], 1266 Metadata: args[12], 1267 Hash: args[13], 1268 } 1269 1270 err = msg.ValidateBasic() 1271 if err != nil { 1272 return err 1273 } 1274 1275 return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) 1276 }, 1277 } 1278 1279 flags.AddTxFlagsToCmd(cmd) 1280 _ = cmd.MarkFlagRequired(flags.FlagFrom) 1281 1282 return cmd 1283 } 1284 1285 // GetTxMintIssueTxCmd implement cli command for MsgMintIssueTx 1286 func GetTxMintIssueTxCmd() *cobra.Command { 1287 cmd := &cobra.Command{ 1288 Use: "mint-issue-tx [denom] [amount] [receiver]", 1289 Short: "Send mint issue tx message", 1290 Args: cobra.MinimumNArgs(3), 1291 RunE: func(cmd *cobra.Command, args []string) error { 1292 clientCtx, err := client.GetClientTxContext(cmd) 1293 if err != nil { 1294 return err 1295 } 1296 1297 amount, ok := sdk.NewIntFromString(args[1]) 1298 if !ok { 1299 return fmt.Errorf("invalid amount") 1300 } 1301 1302 msg := &types.MsgMintIssueTx{ 1303 Sender: clientCtx.GetFromAddress().String(), 1304 Denom: args[0], 1305 Amount: amount, 1306 Receiver: args[2], 1307 } 1308 1309 err = msg.ValidateBasic() 1310 if err != nil { 1311 return err 1312 } 1313 1314 return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) 1315 }, 1316 } 1317 1318 flags.AddTxFlagsToCmd(cmd) 1319 _ = cmd.MarkFlagRequired(flags.FlagFrom) 1320 1321 return cmd 1322 } 1323 1324 // GetTxMintBurnTxCmd implement cli command for MsgMintBurnTx 1325 func GetTxMintBurnTxCmd() *cobra.Command { 1326 cmd := &cobra.Command{ 1327 Use: "burn-issue-tx [denom] [amount]", 1328 Short: "Send burn issue tx message", 1329 Args: cobra.MinimumNArgs(2), 1330 RunE: func(cmd *cobra.Command, args []string) error { 1331 clientCtx, err := client.GetClientTxContext(cmd) 1332 if err != nil { 1333 return err 1334 } 1335 1336 amount, ok := sdk.NewIntFromString(args[1]) 1337 if !ok { 1338 return fmt.Errorf("invalid amount") 1339 } 1340 1341 msg := &types.MsgMintBurnTx{ 1342 Sender: clientCtx.GetFromAddress().String(), 1343 Denom: args[0], 1344 Amount: amount, 1345 } 1346 1347 err = msg.ValidateBasic() 1348 if err != nil { 1349 return err 1350 } 1351 1352 return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) 1353 }, 1354 } 1355 1356 flags.AddTxFlagsToCmd(cmd) 1357 _ = cmd.MarkFlagRequired(flags.FlagFrom) 1358 1359 return cmd 1360 }