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 }