github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/x/wasm/client/cli/gov_tx.go (about)

     1  package cli
     2  
     3  import (
     4  	"bufio"
     5  	"fmt"
     6  	"strconv"
     7  
     8  	clientCtx "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/client/context"
     9  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/codec"
    10  	codectypes "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/codec/types"
    11  	sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types"
    12  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/auth"
    13  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/auth/client/utils"
    14  	govcli "github.com/fibonacci-chain/fbc/x/gov/client/cli"
    15  	govtypes "github.com/fibonacci-chain/fbc/x/gov/types"
    16  	"github.com/fibonacci-chain/fbc/x/wasm/types"
    17  	"github.com/spf13/cobra"
    18  )
    19  
    20  //func ProposalStoreCodeCmd() *cobra.Command {
    21  //	cmd := &cobra.Command{
    22  //		Use:   "wasm-store [wasm file] --title [text] --description [text] --run-as [address]",
    23  //		Short: "Submit a wasm binary proposal",
    24  //		Args:  cobra.ExactArgs(1),
    25  //		RunE: func(cmd *cobra.Command, args []string) error {
    26  //			clientCtx, err := client.GetClientTxContext(cmd)
    27  //			if err != nil {
    28  //				return err
    29  //			}
    30  //
    31  //			src, err := parseStoreCodeArgs(args[0], clientCtx.FromAddress, cmd.Flags())
    32  //			if err != nil {
    33  //				return err
    34  //			}
    35  //			runAs, err := cmd.Flags().GetString(flagRunAs)
    36  //			if err != nil {
    37  //				return fmt.Errorf("run-as: %s", err)
    38  //			}
    39  //			if len(runAs) == 0 {
    40  //				return errors.New("run-as address is required")
    41  //			}
    42  //			proposalTitle, err := cmd.Flags().GetString(cli.FlagTitle)
    43  //			if err != nil {
    44  //				return fmt.Errorf("proposal title: %s", err)
    45  //			}
    46  //			proposalDescr, err := cmd.Flags().GetString(cli.FlagDescription)
    47  //			if err != nil {
    48  //				return fmt.Errorf("proposal description: %s", err)
    49  //			}
    50  //			depositArg, err := cmd.Flags().GetString(cli.FlagDeposit)
    51  //			if err != nil {
    52  //				return err
    53  //			}
    54  //			deposit, err := sdk.ParseCoinsNormalized(depositArg)
    55  //			if err != nil {
    56  //				return err
    57  //			}
    58  //
    59  //			content := types.StoreCodeProposal{
    60  //				Title:                 proposalTitle,
    61  //				Description:           proposalDescr,
    62  //				RunAs:                 runAs,
    63  //				WASMByteCode:          src.WASMByteCode,
    64  //				InstantiatePermission: src.InstantiatePermission,
    65  //			}
    66  //
    67  //			msg, err := govtypes.NewMsgSubmitProposal(&content, deposit, clientCtx.GetFromAddress())
    68  //			if err != nil {
    69  //				return err
    70  //			}
    71  //			if err = msg.ValidateBasic(); err != nil {
    72  //				return err
    73  //			}
    74  //
    75  //			return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg)
    76  //		},
    77  //	}
    78  //
    79  //	cmd.Flags().String(flagRunAs, "", "The address that is stored as code creator")
    80  //	cmd.Flags().String(flagInstantiateByEverybody, "", "Everybody can instantiate a contract from the code, optional")
    81  //	cmd.Flags().String(flagInstantiateNobody, "", "Nobody except the governance process can instantiate a contract from the code, optional")
    82  //	cmd.Flags().String(flagInstantiateByAddress, "", "Only this address can instantiate a contract instance from the code, optional")
    83  //
    84  //	// proposal flags
    85  //	cmd.Flags().String(cli.FlagTitle, "", "Title of proposal")
    86  //	cmd.Flags().String(cli.FlagDescription, "", "Description of proposal")
    87  //	cmd.Flags().String(cli.FlagDeposit, "", "Deposit of proposal")
    88  //	cmd.Flags().String(cli.FlagProposal, "", "Proposal file path (if this path is given, other proposal flags are ignored)")
    89  //	// type values must match the "ProposalHandler" "routes" in cli
    90  //	cmd.Flags().String(flagProposalType, "", "Permission of proposal, types: store-code/instantiate/migrate/update-admin/clear-admin/text/parameter_change/software_upgrade")
    91  //	return cmd
    92  //}
    93  //
    94  //func ProposalInstantiateContractCmd() *cobra.Command {
    95  //	cmd := &cobra.Command{
    96  //		Use:   "instantiate-contract [code_id_int64] [json_encoded_init_args] --label [text] --title [text] --description [text] --run-as [address] --admin [address,optional] --amount [coins,optional]",
    97  //		Short: "Submit an instantiate wasm contract proposal",
    98  //		Args:  cobra.ExactArgs(2),
    99  //		RunE: func(cmd *cobra.Command, args []string) error {
   100  //			clientCtx, err := client.GetClientTxContext(cmd)
   101  //			if err != nil {
   102  //				return err
   103  //			}
   104  //
   105  //			src, err := parseInstantiateArgs(args[0], args[1], clientCtx.FromAddress, cmd.Flags())
   106  //			if err != nil {
   107  //				return err
   108  //			}
   109  //
   110  //			runAs, err := cmd.Flags().GetString(flagRunAs)
   111  //			if err != nil {
   112  //				return fmt.Errorf("run-as: %s", err)
   113  //			}
   114  //			if len(runAs) == 0 {
   115  //				return errors.New("run-as address is required")
   116  //			}
   117  //			proposalTitle, err := cmd.Flags().GetString(cli.FlagTitle)
   118  //			if err != nil {
   119  //				return fmt.Errorf("proposal title: %s", err)
   120  //			}
   121  //			proposalDescr, err := cmd.Flags().GetString(cli.FlagDescription)
   122  //			if err != nil {
   123  //				return fmt.Errorf("proposal description: %s", err)
   124  //			}
   125  //			depositArg, err := cmd.Flags().GetString(cli.FlagDeposit)
   126  //			if err != nil {
   127  //				return err
   128  //			}
   129  //			deposit, err := sdk.ParseCoinsNormalized(depositArg)
   130  //			if err != nil {
   131  //				return err
   132  //			}
   133  //
   134  //			content := types.InstantiateContractProposal{
   135  //				Title:       proposalTitle,
   136  //				Description: proposalDescr,
   137  //				RunAs:       runAs,
   138  //				Admin:       src.Admin,
   139  //				CodeID:      src.CodeID,
   140  //				Label:       src.Label,
   141  //				Msg:         src.Msg,
   142  //				Funds:       src.Funds,
   143  //			}
   144  //
   145  //			msg, err := govtypes.NewMsgSubmitProposal(&content, deposit, clientCtx.GetFromAddress())
   146  //			if err != nil {
   147  //				return err
   148  //			}
   149  //			if err = msg.ValidateBasic(); err != nil {
   150  //				return err
   151  //			}
   152  //
   153  //			return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg)
   154  //		},
   155  //	}
   156  //	cmd.Flags().String(flagAmount, "", "Coins to send to the contract during instantiation")
   157  //	cmd.Flags().String(flagLabel, "", "A human-readable name for this contract in lists")
   158  //	cmd.Flags().String(flagAdmin, "", "Address of an admin")
   159  //	cmd.Flags().String(flagRunAs, "", "The address that pays the init funds. It is the creator of the contract and passed to the contract as sender on proposal execution")
   160  //	cmd.Flags().Bool(flagNoAdmin, false, "You must set this explicitly if you don't want an admin")
   161  //
   162  //	// proposal flags
   163  //	cmd.Flags().String(cli.FlagTitle, "", "Title of proposal")
   164  //	cmd.Flags().String(cli.FlagDescription, "", "Description of proposal")
   165  //	cmd.Flags().String(cli.FlagDeposit, "", "Deposit of proposal")
   166  //	cmd.Flags().String(cli.FlagProposal, "", "Proposal file path (if this path is given, other proposal flags are ignored)")
   167  //	// type values must match the "ProposalHandler" "routes" in cli
   168  //	cmd.Flags().String(flagProposalType, "", "Permission of proposal, types: store-code/instantiate/migrate/update-admin/clear-admin/text/parameter_change/software_upgrade")
   169  //	return cmd
   170  //}
   171  
   172  func ProposalMigrateContractCmd(m *codec.CodecProxy, reg codectypes.InterfaceRegistry) *cobra.Command {
   173  	cmd := &cobra.Command{
   174  		Use:   "migrate-contract [contract_addr_bech32] [new_code_id_int64] [json_encoded_migration_args]",
   175  		Short: "Submit a migrate wasm contract to a new code version proposal",
   176  		Args:  cobra.ExactArgs(3),
   177  		RunE: func(cmd *cobra.Command, args []string) error {
   178  			inBuf := bufio.NewReader(cmd.InOrStdin())
   179  			txBldr := auth.NewTxBuilderFromCLI(inBuf).WithTxEncoder(utils.GetTxEncoder(m.GetCdc()))
   180  			cliCtx := clientCtx.NewCLIContext().WithCodec(m.GetCdc()).WithInterfaceRegistry(reg)
   181  
   182  			src, err := parseMigrateContractArgs(args, cliCtx)
   183  			if err != nil {
   184  				return err
   185  			}
   186  
   187  			proposalTitle, err := cmd.Flags().GetString(govcli.FlagTitle)
   188  			if err != nil {
   189  				return fmt.Errorf("proposal title: %s", err)
   190  			}
   191  			proposalDescr, err := cmd.Flags().GetString(govcli.FlagDescription)
   192  			if err != nil {
   193  				return fmt.Errorf("proposal description: %s", err)
   194  			}
   195  			depositArg, err := cmd.Flags().GetString(govcli.FlagDeposit)
   196  			if err != nil {
   197  				return err
   198  			}
   199  
   200  			deposit, err := sdk.ParseCoinsNormalized(depositArg)
   201  			if err != nil {
   202  				return err
   203  			}
   204  
   205  			content := types.MigrateContractProposal{
   206  				Title:       proposalTitle,
   207  				Description: proposalDescr,
   208  				Contract:    src.Contract,
   209  				CodeID:      src.CodeID,
   210  				Msg:         src.Msg,
   211  			}
   212  
   213  			msg := govtypes.NewMsgSubmitProposal(&content, deposit, cliCtx.GetFromAddress())
   214  			if err = msg.ValidateBasic(); err != nil {
   215  				return err
   216  			}
   217  
   218  			return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg})
   219  		},
   220  	}
   221  
   222  	// proposal flags
   223  	cmd.Flags().String(govcli.FlagTitle, "", "Title of proposal")
   224  	cmd.Flags().String(govcli.FlagDescription, "", "Description of proposal")
   225  	cmd.Flags().String(govcli.FlagDeposit, "", "Deposit of proposal")
   226  	return cmd
   227  }
   228  
   229  //func ProposalExecuteContractCmd() *cobra.Command {
   230  //	cmd := &cobra.Command{
   231  //		Use:   "execute-contract [contract_addr_bech32] [json_encoded_migration_args]",
   232  //		Short: "Submit a execute wasm contract proposal (run by any address)",
   233  //		Args:  cobra.ExactArgs(2),
   234  //		RunE: func(cmd *cobra.Command, args []string) error {
   235  //			clientCtx, err := client.GetClientTxContext(cmd)
   236  //			if err != nil {
   237  //				return err
   238  //			}
   239  //
   240  //			contract := args[0]
   241  //			execMsg := []byte(args[1])
   242  //			amountStr, err := cmd.Flags().GetString(flagAmount)
   243  //			if err != nil {
   244  //				return fmt.Errorf("amount: %s", err)
   245  //			}
   246  //			funds, err := sdk.ParseCoinsNormalized(amountStr)
   247  //			if err != nil {
   248  //				return fmt.Errorf("amount: %s", err)
   249  //			}
   250  //			runAs, err := cmd.Flags().GetString(flagRunAs)
   251  //			if err != nil {
   252  //				return fmt.Errorf("run-as: %s", err)
   253  //			}
   254  //
   255  //			if len(runAs) == 0 {
   256  //				return errors.New("run-as address is required")
   257  //			}
   258  //			proposalTitle, err := cmd.Flags().GetString(cli.FlagTitle)
   259  //			if err != nil {
   260  //				return fmt.Errorf("proposal title: %s", err)
   261  //			}
   262  //			proposalDescr, err := cmd.Flags().GetString(cli.FlagDescription)
   263  //			if err != nil {
   264  //				return fmt.Errorf("proposal description: %s", err)
   265  //			}
   266  //			depositArg, err := cmd.Flags().GetString(cli.FlagDeposit)
   267  //			if err != nil {
   268  //				return err
   269  //			}
   270  //			deposit, err := sdk.ParseCoinsNormalized(depositArg)
   271  //			if err != nil {
   272  //				return err
   273  //			}
   274  //
   275  //			content := types.ExecuteContractProposal{
   276  //				Title:       proposalTitle,
   277  //				Description: proposalDescr,
   278  //				Contract:    contract,
   279  //				Msg:         execMsg,
   280  //				RunAs:       runAs,
   281  //				Funds:       funds,
   282  //			}
   283  //
   284  //			msg, err := govtypes.NewMsgSubmitProposal(&content, deposit, clientCtx.GetFromAddress())
   285  //			if err != nil {
   286  //				return err
   287  //			}
   288  //			if err = msg.ValidateBasic(); err != nil {
   289  //				return err
   290  //			}
   291  //
   292  //			return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg)
   293  //		},
   294  //	}
   295  //	cmd.Flags().String(flagRunAs, "", "The address that is passed as sender to the contract on proposal execution")
   296  //	cmd.Flags().String(flagAmount, "", "Coins to send to the contract during instantiation")
   297  //
   298  //	// proposal flags
   299  //	cmd.Flags().String(cli.FlagTitle, "", "Title of proposal")
   300  //	cmd.Flags().String(cli.FlagDescription, "", "Description of proposal")
   301  //	cmd.Flags().String(cli.FlagDeposit, "", "Deposit of proposal")
   302  //	cmd.Flags().String(cli.FlagProposal, "", "Proposal file path (if this path is given, other proposal flags are ignored)")
   303  //	// type values must match the "ProposalHandler" "routes" in cli
   304  //	cmd.Flags().String(flagProposalType, "", "Permission of proposal, types: store-code/instantiate/migrate/update-admin/clear-admin/text/parameter_change/software_upgrade")
   305  //	return cmd
   306  //}
   307  //
   308  //func ProposalSudoContractCmd() *cobra.Command {
   309  //	cmd := &cobra.Command{
   310  //		Use:   "sudo-contract [contract_addr_bech32] [json_encoded_migration_args]",
   311  //		Short: "Submit a sudo wasm contract proposal (to call privileged commands)",
   312  //		Args:  cobra.ExactArgs(2),
   313  //		RunE: func(cmd *cobra.Command, args []string) error {
   314  //			clientCtx, err := client.GetClientTxContext(cmd)
   315  //			if err != nil {
   316  //				return err
   317  //			}
   318  //
   319  //			contract := args[0]
   320  //			sudoMsg := []byte(args[1])
   321  //
   322  //			proposalTitle, err := cmd.Flags().GetString(cli.FlagTitle)
   323  //			if err != nil {
   324  //				return fmt.Errorf("proposal title: %s", err)
   325  //			}
   326  //			proposalDescr, err := cmd.Flags().GetString(cli.FlagDescription)
   327  //			if err != nil {
   328  //				return fmt.Errorf("proposal description: %s", err)
   329  //			}
   330  //			depositArg, err := cmd.Flags().GetString(cli.FlagDeposit)
   331  //			if err != nil {
   332  //				return err
   333  //			}
   334  //			deposit, err := sdk.ParseCoinsNormalized(depositArg)
   335  //			if err != nil {
   336  //				return err
   337  //			}
   338  //
   339  //			content := types.SudoContractProposal{
   340  //				Title:       proposalTitle,
   341  //				Description: proposalDescr,
   342  //				Contract:    contract,
   343  //				Msg:         sudoMsg,
   344  //			}
   345  //
   346  //			msg, err := govtypes.NewMsgSubmitProposal(&content, deposit, clientCtx.GetFromAddress())
   347  //			if err != nil {
   348  //				return err
   349  //			}
   350  //			if err = msg.ValidateBasic(); err != nil {
   351  //				return err
   352  //			}
   353  //
   354  //			return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg)
   355  //		},
   356  //	}
   357  //
   358  //	// proposal flagsExecute
   359  //	cmd.Flags().String(cli.FlagTitle, "", "Title of proposal")
   360  //	cmd.Flags().String(cli.FlagDescription, "", "Description of proposal")
   361  //	cmd.Flags().String(cli.FlagDeposit, "", "Deposit of proposal")
   362  //	cmd.Flags().String(cli.FlagProposal, "", "Proposal file path (if this path is given, other proposal flags are ignored)")
   363  //	// type values must match the "ProposalHandler" "routes" in cli
   364  //	cmd.Flags().String(flagProposalType, "", "Permission of proposal, types: store-code/instantiate/migrate/update-admin/clear-admin/text/parameter_change/software_upgrade")
   365  //	return cmd
   366  //}
   367  
   368  func ProposalUpdateContractAdminCmd(m *codec.CodecProxy, reg codectypes.InterfaceRegistry) *cobra.Command {
   369  	cmd := &cobra.Command{
   370  		Use:   "set-contract-admin [contract_addr_bech32] [new_admin_addr_bech32]",
   371  		Short: "Submit a new admin for a contract proposal",
   372  		Args:  cobra.ExactArgs(2),
   373  		RunE: func(cmd *cobra.Command, args []string) error {
   374  			inBuf := bufio.NewReader(cmd.InOrStdin())
   375  			txBldr := auth.NewTxBuilderFromCLI(inBuf).WithTxEncoder(utils.GetTxEncoder(m.GetCdc()))
   376  			cliCtx := clientCtx.NewCLIContext().WithCodec(m.GetCdc()).WithInterfaceRegistry(reg)
   377  
   378  			src, err := parseUpdateContractAdminArgs(args, cliCtx)
   379  			if err != nil {
   380  				return err
   381  			}
   382  
   383  			proposalTitle, err := cmd.Flags().GetString(govcli.FlagTitle)
   384  			if err != nil {
   385  				return fmt.Errorf("proposal title: %s", err)
   386  			}
   387  			proposalDescr, err := cmd.Flags().GetString(govcli.FlagDescription)
   388  			if err != nil {
   389  				return fmt.Errorf("proposal description: %s", err)
   390  			}
   391  			depositArg, err := cmd.Flags().GetString(govcli.FlagDeposit)
   392  			if err != nil {
   393  				return fmt.Errorf("deposit: %s", err)
   394  			}
   395  			deposit, err := sdk.ParseCoinsNormalized(depositArg)
   396  			if err != nil {
   397  				return err
   398  			}
   399  
   400  			content := types.UpdateAdminProposal{
   401  				Title:       proposalTitle,
   402  				Description: proposalDescr,
   403  				Contract:    src.Contract,
   404  				NewAdmin:    src.NewAdmin,
   405  			}
   406  
   407  			msg := govtypes.NewMsgSubmitProposal(&content, deposit, cliCtx.GetFromAddress())
   408  			if err = msg.ValidateBasic(); err != nil {
   409  				return err
   410  			}
   411  
   412  			return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg})
   413  		},
   414  	}
   415  	// proposal flags
   416  	cmd.Flags().String(govcli.FlagTitle, "", "Title of proposal")
   417  	cmd.Flags().String(govcli.FlagDescription, "", "Description of proposal")
   418  	cmd.Flags().String(govcli.FlagDeposit, "", "Deposit of proposal")
   419  	return cmd
   420  }
   421  
   422  func ProposalClearContractAdminCmd(m *codec.CodecProxy, reg codectypes.InterfaceRegistry) *cobra.Command {
   423  	cmd := &cobra.Command{
   424  		Use:   "clear-contract-admin [contract_addr_bech32]",
   425  		Short: "Submit a clear admin for a contract to prevent further migrations proposal",
   426  		Args:  cobra.ExactArgs(1),
   427  		RunE: func(cmd *cobra.Command, args []string) error {
   428  			inBuf := bufio.NewReader(cmd.InOrStdin())
   429  			txBldr := auth.NewTxBuilderFromCLI(inBuf).WithTxEncoder(utils.GetTxEncoder(m.GetCdc()))
   430  			cliCtx := clientCtx.NewCLIContext().WithCodec(m.GetCdc()).WithInterfaceRegistry(reg)
   431  			proposalTitle, err := cmd.Flags().GetString(govcli.FlagTitle)
   432  			if err != nil {
   433  				return fmt.Errorf("proposal title: %s", err)
   434  			}
   435  			proposalDescr, err := cmd.Flags().GetString(govcli.FlagDescription)
   436  			if err != nil {
   437  				return fmt.Errorf("proposal description: %s", err)
   438  			}
   439  			depositArg, err := cmd.Flags().GetString(govcli.FlagDeposit)
   440  			if err != nil {
   441  				return fmt.Errorf("deposit: %s", err)
   442  			}
   443  			deposit, err := sdk.ParseCoinsNormalized(depositArg)
   444  			if err != nil {
   445  				return err
   446  			}
   447  
   448  			content := types.ClearAdminProposal{
   449  				Title:       proposalTitle,
   450  				Description: proposalDescr,
   451  				Contract:    args[0],
   452  			}
   453  
   454  			msg := govtypes.NewMsgSubmitProposal(&content, deposit, cliCtx.GetFromAddress())
   455  			if err = msg.ValidateBasic(); err != nil {
   456  				return err
   457  			}
   458  
   459  			return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg})
   460  		},
   461  	}
   462  	// proposal flags
   463  	cmd.Flags().String(govcli.FlagTitle, "", "Title of proposal")
   464  	cmd.Flags().String(govcli.FlagDescription, "", "Description of proposal")
   465  	cmd.Flags().String(govcli.FlagDeposit, "", "Deposit of proposal")
   466  	return cmd
   467  }
   468  
   469  func ProposalPinCodesCmd(m *codec.CodecProxy, reg codectypes.InterfaceRegistry) *cobra.Command {
   470  	cmd := &cobra.Command{
   471  		Use:   "pin-codes [code-ids]",
   472  		Short: "Submit a pin code proposal for pinning a code to cache",
   473  		Args:  cobra.MinimumNArgs(1),
   474  		RunE: func(cmd *cobra.Command, args []string) error {
   475  			inBuf := bufio.NewReader(cmd.InOrStdin())
   476  			txBldr := auth.NewTxBuilderFromCLI(inBuf).WithTxEncoder(utils.GetTxEncoder(m.GetCdc()))
   477  			cliCtx := clientCtx.NewCLIContext().WithCodec(m.GetCdc()).WithInterfaceRegistry(reg)
   478  
   479  			proposalTitle, err := cmd.Flags().GetString(govcli.FlagTitle)
   480  			if err != nil {
   481  				return fmt.Errorf("proposal title: %s", err)
   482  			}
   483  			proposalDescr, err := cmd.Flags().GetString(govcli.FlagDescription)
   484  			if err != nil {
   485  				return fmt.Errorf("proposal description: %s", err)
   486  			}
   487  			depositArg, err := cmd.Flags().GetString(govcli.FlagDeposit)
   488  			if err != nil {
   489  				return fmt.Errorf("deposit: %s", err)
   490  			}
   491  			deposit, err := sdk.ParseCoinsNormalized(depositArg)
   492  			if err != nil {
   493  				return err
   494  			}
   495  			codeIds, err := parsePinCodesArgs(args)
   496  			if err != nil {
   497  				return err
   498  			}
   499  
   500  			content := types.PinCodesProposal{
   501  				Title:       proposalTitle,
   502  				Description: proposalDescr,
   503  				CodeIDs:     codeIds,
   504  			}
   505  
   506  			msg := govtypes.NewMsgSubmitProposal(&content, deposit, cliCtx.GetFromAddress())
   507  			if err = msg.ValidateBasic(); err != nil {
   508  				return err
   509  			}
   510  
   511  			return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg})
   512  		},
   513  	}
   514  	// proposal flags
   515  	cmd.Flags().String(govcli.FlagTitle, "", "Title of proposal")
   516  	cmd.Flags().String(govcli.FlagDescription, "", "Description of proposal")
   517  	cmd.Flags().String(govcli.FlagDeposit, "", "Deposit of proposal")
   518  	return cmd
   519  }
   520  
   521  func parsePinCodesArgs(args []string) ([]uint64, error) {
   522  	codeIDs := make([]uint64, len(args))
   523  	for i, c := range args {
   524  		codeID, err := strconv.ParseUint(c, 10, 64)
   525  		if err != nil {
   526  			return codeIDs, fmt.Errorf("code IDs: %s", err)
   527  		}
   528  		codeIDs[i] = codeID
   529  	}
   530  	return codeIDs, nil
   531  }
   532  
   533  func ProposalUnpinCodesCmd(m *codec.CodecProxy, reg codectypes.InterfaceRegistry) *cobra.Command {
   534  	cmd := &cobra.Command{
   535  		Use:   "unpin-codes [code-ids]",
   536  		Short: "Submit a unpin code proposal for unpinning a code to cache",
   537  		Args:  cobra.MinimumNArgs(1),
   538  		RunE: func(cmd *cobra.Command, args []string) error {
   539  			inBuf := bufio.NewReader(cmd.InOrStdin())
   540  			txBldr := auth.NewTxBuilderFromCLI(inBuf).WithTxEncoder(utils.GetTxEncoder(m.GetCdc()))
   541  			cliCtx := clientCtx.NewCLIContext().WithCodec(m.GetCdc()).WithInterfaceRegistry(reg)
   542  
   543  			proposalTitle, err := cmd.Flags().GetString(govcli.FlagTitle)
   544  			if err != nil {
   545  				return fmt.Errorf("proposal title: %s", err)
   546  			}
   547  			proposalDescr, err := cmd.Flags().GetString(govcli.FlagDescription)
   548  			if err != nil {
   549  				return fmt.Errorf("proposal description: %s", err)
   550  			}
   551  			depositArg, err := cmd.Flags().GetString(govcli.FlagDeposit)
   552  			if err != nil {
   553  				return fmt.Errorf("deposit: %s", err)
   554  			}
   555  			deposit, err := sdk.ParseCoinsNormalized(depositArg)
   556  			if err != nil {
   557  				return err
   558  			}
   559  			codeIds, err := parsePinCodesArgs(args)
   560  			if err != nil {
   561  				return err
   562  			}
   563  
   564  			content := types.UnpinCodesProposal{
   565  				Title:       proposalTitle,
   566  				Description: proposalDescr,
   567  				CodeIDs:     codeIds,
   568  			}
   569  
   570  			msg := govtypes.NewMsgSubmitProposal(&content, deposit, cliCtx.GetFromAddress())
   571  			if err = msg.ValidateBasic(); err != nil {
   572  				return err
   573  			}
   574  
   575  			return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg})
   576  		},
   577  	}
   578  	// proposal flags
   579  	cmd.Flags().String(govcli.FlagTitle, "", "Title of proposal")
   580  	cmd.Flags().String(govcli.FlagDescription, "", "Description of proposal")
   581  	cmd.Flags().String(govcli.FlagDeposit, "", "Deposit of proposal")
   582  	return cmd
   583  }
   584  
   585  //func parseAccessConfig(config string) (types.AccessConfig, error) {
   586  //	switch config {
   587  //	case "nobody":
   588  //		return types.AllowNobody, nil
   589  //	case "everybody":
   590  //		return types.AllowEverybody, nil
   591  //	default:
   592  //		address, err := sdk.AccAddressFromBech32(config)
   593  //		if err != nil {
   594  //			return types.AccessConfig{}, fmt.Errorf("unable to parse address %s", config)
   595  //		}
   596  //		return types.AccessTypeOnlyAddress.With(address), nil
   597  //	}
   598  //}
   599  //
   600  //func parseAccessConfigUpdates(args []string) ([]types.AccessConfigUpdate, error) {
   601  //	updates := make([]types.AccessConfigUpdate, len(args))
   602  //	for i, c := range args {
   603  //		// format: code_id,access_config
   604  //		// access_config: nobody|everybody|address
   605  //		parts := strings.Split(c, ",")
   606  //		if len(parts) != 2 {
   607  //			return nil, fmt.Errorf("invalid format")
   608  //		}
   609  //
   610  //		codeID, err := strconv.ParseUint(parts[0], 10, 64)
   611  //		if err != nil {
   612  //			return nil, fmt.Errorf("invalid code ID: %s", err)
   613  //		}
   614  //
   615  //		accessConfig, err := parseAccessConfig(parts[1])
   616  //		if err != nil {
   617  //			return nil, err
   618  //		}
   619  //		updates[i] = types.AccessConfigUpdate{
   620  //			CodeID:                codeID,
   621  //			InstantiatePermission: accessConfig,
   622  //		}
   623  //	}
   624  //	return updates, nil
   625  //}
   626  //
   627  //func ProposalUpdateInstantiateConfigCmd() *cobra.Command {
   628  //	bech32Prefix := sdk.GetConfig().GetBech32AccountAddrPrefix()
   629  //	cmd := &cobra.Command{
   630  //		Use:   "update-instantiate-config [code-id,permission]...",
   631  //		Short: "Submit an update instantiate config proposal.",
   632  //		Args:  cobra.MinimumNArgs(1),
   633  //		Long: strings.TrimSpace(
   634  //			fmt.Sprintf(`Submit an update instantiate config  proposal for multiple code ids.
   635  //
   636  //Example:
   637  //$ %s tx gov submit-proposal update-instantiate-config 1,nobody 2,everybody 3,%s1l2rsakp388kuv9k8qzq6lrm9taddae7fpx59wm
   638  //`, version.AppName, bech32Prefix)),
   639  //		RunE: func(cmd *cobra.Command, args []string) error {
   640  //			clientCtx, err := client.GetClientTxContext(cmd)
   641  //			if err != nil {
   642  //				return err
   643  //			}
   644  //
   645  //			proposalTitle, err := cmd.Flags().GetString(cli.FlagTitle)
   646  //			if err != nil {
   647  //				return fmt.Errorf("proposal title: %s", err)
   648  //			}
   649  //			proposalDescr, err := cmd.Flags().GetString(cli.FlagDescription)
   650  //			if err != nil {
   651  //				return fmt.Errorf("proposal description: %s", err)
   652  //			}
   653  //			depositArg, err := cmd.Flags().GetString(cli.FlagDeposit)
   654  //			if err != nil {
   655  //				return fmt.Errorf("deposit: %s", err)
   656  //			}
   657  //			deposit, err := sdk.ParseCoinsNormalized(depositArg)
   658  //			if err != nil {
   659  //				return err
   660  //			}
   661  //			updates, err := parseAccessConfigUpdates(args)
   662  //			if err != nil {
   663  //				return err
   664  //			}
   665  //
   666  //			content := types.UpdateInstantiateConfigProposal{
   667  //				Title:               proposalTitle,
   668  //				Description:         proposalDescr,
   669  //				AccessConfigUpdates: updates,
   670  //			}
   671  //			if err := content.ValidateBasic(); err != nil {
   672  //
   673  //			}
   674  //			msg := govtypes.NewMsgSubmitProposal(&content, deposit, clientCtx.GetFromAddress())
   675  //			if err != nil {
   676  //				return err
   677  //			}
   678  //			if err = msg.ValidateBasic(); err != nil {
   679  //				return err
   680  //			}
   681  //
   682  //			return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg)
   683  //		},
   684  //	}
   685  //	// proposal flags
   686  //	cmd.Flags().String(govcli.FlagTitle, "", "Title of proposal")
   687  //	cmd.Flags().String(govcli.FlagDescription, "", "Description of proposal")
   688  //	cmd.Flags().String(govcli.FlagDeposit, "", "Deposit of proposal")
   689  //	cmd.Flags().String(govcli.FlagProposal, "", "Proposal file path (if this path is given, other proposal flags are ignored)")
   690  //	// type values must match the "ProposalHandler" "routes" in cli
   691  //	cmd.Flags().String(flagProposalType, "", "Permission of proposal, types: store-code/instantiate/migrate/update-admin/clear-admin/text/parameter_change/software_upgrade")
   692  //	return cmd
   693  //}