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  }