github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/libs/cosmos-sdk/x/upgrade/client/cli/tx.go (about)

     1  package cli
     2  
     3  import (
     4  	"bufio"
     5  	"fmt"
     6  	"time"
     7  
     8  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/gov/client/cli"
     9  
    10  	"github.com/spf13/cobra"
    11  
    12  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/client/context"
    13  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/codec"
    14  	sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types"
    15  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/auth"
    16  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/auth/client/utils"
    17  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/gov"
    18  	upgrade "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/upgrade/internal/types"
    19  )
    20  
    21  const (
    22  	// TimeFormat specifies ISO UTC format for submitting the time for a new upgrade proposal
    23  	TimeFormat = "2006-01-02T15:04:05Z"
    24  
    25  	FlagUpgradeHeight = "upgrade-height"
    26  	FlagUpgradeTime   = "time"
    27  	FlagUpgradeInfo   = "info"
    28  )
    29  
    30  func parseArgsToContent(cmd *cobra.Command, name string) (gov.Content, error) {
    31  	title, err := cmd.Flags().GetString(cli.FlagTitle)
    32  	if err != nil {
    33  		return nil, err
    34  	}
    35  
    36  	description, err := cmd.Flags().GetString(cli.FlagDescription)
    37  	if err != nil {
    38  		return nil, err
    39  	}
    40  
    41  	height, err := cmd.Flags().GetInt64(FlagUpgradeHeight)
    42  	if err != nil {
    43  		return nil, err
    44  	}
    45  
    46  	timeStr, err := cmd.Flags().GetString(FlagUpgradeTime)
    47  	if err != nil {
    48  		return nil, err
    49  	}
    50  
    51  	if height != 0 && len(timeStr) != 0 {
    52  		return nil, fmt.Errorf("only one of --upgrade-time or --upgrade-height should be specified")
    53  	}
    54  
    55  	var upgradeTime time.Time
    56  	if len(timeStr) != 0 {
    57  		upgradeTime, err = time.Parse(TimeFormat, timeStr)
    58  		if err != nil {
    59  			return nil, err
    60  		}
    61  	}
    62  
    63  	info, err := cmd.Flags().GetString(FlagUpgradeInfo)
    64  	if err != nil {
    65  		return nil, err
    66  	}
    67  
    68  	plan := upgrade.Plan{Name: name, Time: upgradeTime, Height: height, Info: info}
    69  	content := upgrade.NewSoftwareUpgradeProposal(title, description, plan)
    70  	return content, nil
    71  }
    72  
    73  // GetCmdSubmitUpgradeProposal implements a command handler for submitting a software upgrade proposal transaction.
    74  func GetCmdSubmitUpgradeProposal(cdc *codec.Codec) *cobra.Command {
    75  	cmd := &cobra.Command{
    76  		Use:   "software-upgrade [name] (--upgrade-height [height] | --upgrade-time [time]) (--upgrade-info [info]) [flags]",
    77  		Args:  cobra.ExactArgs(1),
    78  		Short: "Submit a software upgrade proposal",
    79  		Long: "Submit a software upgrade along with an initial deposit.\n" +
    80  			"Please specify a unique name and height OR time for the upgrade to take effect.\n" +
    81  			"You may include info to reference a binary download link, in a format compatible with: https://github.com/regen-network/cosmosd",
    82  		RunE: func(cmd *cobra.Command, args []string) error {
    83  			name := args[0]
    84  			content, err := parseArgsToContent(cmd, name)
    85  			if err != nil {
    86  				return err
    87  			}
    88  
    89  			inBuf := bufio.NewReader(cmd.InOrStdin())
    90  			txBldr := auth.NewTxBuilderFromCLI(inBuf).WithTxEncoder(utils.GetTxEncoder(cdc))
    91  			cliCtx := context.NewCLIContextWithInput(inBuf).WithCodec(cdc)
    92  			from := cliCtx.GetFromAddress()
    93  
    94  			depositStr, err := cmd.Flags().GetString(cli.FlagDeposit)
    95  			if err != nil {
    96  				return err
    97  			}
    98  			deposit, err := sdk.ParseCoins(depositStr)
    99  			if err != nil {
   100  				return err
   101  			}
   102  
   103  			msg := gov.NewMsgSubmitProposal(content, deposit, from)
   104  			if err := msg.ValidateBasic(); err != nil {
   105  				return err
   106  			}
   107  			return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg})
   108  		},
   109  	}
   110  
   111  	cmd.Flags().String(cli.FlagTitle, "", "title of proposal")
   112  	cmd.Flags().String(cli.FlagDescription, "", "description of proposal")
   113  	cmd.Flags().String(cli.FlagDeposit, "", "deposit of proposal")
   114  	cmd.Flags().Int64(FlagUpgradeHeight, 0, "The height at which the upgrade must happen (not to be used together with --upgrade-time)")
   115  	cmd.Flags().String(FlagUpgradeTime, "", fmt.Sprintf("The time at which the upgrade must happen (ex. %s) (not to be used together with --upgrade-height)", TimeFormat))
   116  	cmd.Flags().String(FlagUpgradeInfo, "", "Optional info for the planned upgrade such as commit hash, etc.")
   117  
   118  	return cmd
   119  }
   120  
   121  // GetCmdSubmitCancelUpgradeProposal implements a command handler for submitting a software upgrade cancel proposal transaction.
   122  func GetCmdSubmitCancelUpgradeProposal(cdc *codec.Codec) *cobra.Command {
   123  	cmd := &cobra.Command{
   124  		Use:   "cancel-software-upgrade [flags]",
   125  		Args:  cobra.ExactArgs(0),
   126  		Short: "Submit a software upgrade proposal",
   127  		Long:  "Cancel a software upgrade along with an initial deposit.",
   128  		RunE: func(cmd *cobra.Command, args []string) error {
   129  			inBuf := bufio.NewReader(cmd.InOrStdin())
   130  			txBldr := auth.NewTxBuilderFromCLI(inBuf).WithTxEncoder(utils.GetTxEncoder(cdc))
   131  			cliCtx := context.NewCLIContextWithInput(inBuf).WithCodec(cdc)
   132  			from := cliCtx.GetFromAddress()
   133  
   134  			depositStr, err := cmd.Flags().GetString(cli.FlagDeposit)
   135  			if err != nil {
   136  				return err
   137  			}
   138  
   139  			deposit, err := sdk.ParseCoins(depositStr)
   140  			if err != nil {
   141  				return err
   142  			}
   143  
   144  			title, err := cmd.Flags().GetString(cli.FlagTitle)
   145  			if err != nil {
   146  				return err
   147  			}
   148  
   149  			description, err := cmd.Flags().GetString(cli.FlagDescription)
   150  			if err != nil {
   151  				return err
   152  			}
   153  
   154  			content := upgrade.NewCancelSoftwareUpgradeProposal(title, description)
   155  
   156  			msg := gov.NewMsgSubmitProposal(content, deposit, from)
   157  			if err := msg.ValidateBasic(); err != nil {
   158  				return err
   159  			}
   160  
   161  			return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg})
   162  		},
   163  	}
   164  
   165  	cmd.Flags().String(cli.FlagTitle, "", "title of proposal")
   166  	cmd.Flags().String(cli.FlagDescription, "", "description of proposal")
   167  	cmd.Flags().String(cli.FlagDeposit, "", "deposit of proposal")
   168  
   169  	return cmd
   170  }