2019-11-08 06:40:56 -08:00
package cli
import (
"fmt"
"time"
"github.com/spf13/cobra"
2020-06-01 05:46:03 -07:00
"github.com/cosmos/cosmos-sdk/client"
2020-07-08 15:00:56 -07:00
"github.com/cosmos/cosmos-sdk/client/tx"
2019-11-08 06:40:56 -08:00
sdk "github.com/cosmos/cosmos-sdk/types"
2020-07-08 15:00:56 -07:00
"github.com/cosmos/cosmos-sdk/x/gov/client/cli"
gov "github.com/cosmos/cosmos-sdk/x/gov/types"
2020-02-24 09:14:19 -08:00
"github.com/cosmos/cosmos-sdk/x/upgrade/types"
2019-11-08 06:40:56 -08:00
)
const (
// TimeFormat specifies ISO UTC format for submitting the time for a new upgrade proposal
TimeFormat = "2006-01-02T15:04:05Z"
FlagUpgradeHeight = "upgrade-height"
FlagUpgradeTime = "time"
FlagUpgradeInfo = "info"
)
2020-07-08 15:00:56 -07:00
// GetTxCmd returns the transaction commands for this module
func GetTxCmd ( ) * cobra . Command {
cmd := & cobra . Command {
Use : types . ModuleName ,
Short : "Upgrade transaction subcommands" ,
}
return cmd
}
2020-04-16 12:33:57 -07:00
// NewCmdSubmitUpgradeProposal implements a command handler for submitting a software upgrade proposal transaction.
2020-07-10 07:45:46 -07:00
func NewCmdSubmitUpgradeProposal ( ) * cobra . Command {
2020-04-16 12:33:57 -07:00
cmd := & cobra . Command {
Use : "software-upgrade [name] (--upgrade-height [height] | --upgrade-time [time]) (--upgrade-info [info]) [flags]" ,
Args : cobra . ExactArgs ( 1 ) ,
Short : "Submit a software upgrade proposal" ,
Long : "Submit a software upgrade along with an initial deposit.\n" +
"Please specify a unique name and height OR time for the upgrade to take effect.\n" +
"You may include info to reference a binary download link, in a format compatible with: https://github.com/regen-network/cosmosd" ,
RunE : func ( cmd * cobra . Command , args [ ] string ) error {
2020-07-10 07:45:46 -07:00
clientCtx := client . GetClientContextFromCmd ( cmd )
clientCtx , err := client . ReadTxCommandFlags ( clientCtx , cmd . Flags ( ) )
if err != nil {
return err
}
2020-04-16 12:33:57 -07:00
name := args [ 0 ]
content , err := parseArgsToContent ( cmd , name )
if err != nil {
return err
}
2020-06-01 05:46:03 -07:00
from := clientCtx . GetFromAddress ( )
2020-04-16 12:33:57 -07:00
depositStr , err := cmd . Flags ( ) . GetString ( cli . FlagDeposit )
if err != nil {
return err
}
deposit , err := sdk . ParseCoins ( depositStr )
if err != nil {
return err
}
2020-05-21 14:29:34 -07:00
msg , err := gov . NewMsgSubmitProposal ( content , deposit , from )
2020-04-16 12:33:57 -07:00
if err != nil {
return err
}
if err = msg . ValidateBasic ( ) ; err != nil {
return err
}
2020-07-10 07:45:46 -07:00
return tx . GenerateOrBroadcastTxCLI ( clientCtx , cmd . Flags ( ) , msg )
2020-04-16 12:33:57 -07:00
} ,
}
cmd . Flags ( ) . String ( cli . FlagTitle , "" , "title of proposal" )
cmd . Flags ( ) . String ( cli . FlagDescription , "" , "description of proposal" )
cmd . Flags ( ) . String ( cli . FlagDeposit , "" , "deposit of proposal" )
cmd . Flags ( ) . Int64 ( FlagUpgradeHeight , 0 , "The height at which the upgrade must happen (not to be used together with --upgrade-time)" )
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 ) )
cmd . Flags ( ) . String ( FlagUpgradeInfo , "" , "Optional info for the planned upgrade such as commit hash, etc." )
return cmd
}
// NewCmdSubmitCancelUpgradeProposal implements a command handler for submitting a software upgrade cancel proposal transaction.
2020-07-20 09:42:46 -07:00
func NewCmdSubmitCancelUpgradeProposal ( ) * cobra . Command {
2020-04-16 12:33:57 -07:00
cmd := & cobra . Command {
Use : "cancel-software-upgrade [flags]" ,
Args : cobra . ExactArgs ( 0 ) ,
Short : "Submit a software upgrade proposal" ,
Long : "Cancel a software upgrade along with an initial deposit." ,
RunE : func ( cmd * cobra . Command , args [ ] string ) error {
2020-07-20 09:42:46 -07:00
clientCtx := client . GetClientContextFromCmd ( cmd )
clientCtx , err := client . ReadTxCommandFlags ( clientCtx , cmd . Flags ( ) )
if err != nil {
return err
}
2020-06-01 05:46:03 -07:00
from := clientCtx . GetFromAddress ( )
2020-04-16 12:33:57 -07:00
depositStr , err := cmd . Flags ( ) . GetString ( cli . FlagDeposit )
if err != nil {
return err
}
deposit , err := sdk . ParseCoins ( depositStr )
if err != nil {
return err
}
title , err := cmd . Flags ( ) . GetString ( cli . FlagTitle )
if err != nil {
return err
}
description , err := cmd . Flags ( ) . GetString ( cli . FlagDescription )
if err != nil {
return err
}
content := types . NewCancelSoftwareUpgradeProposal ( title , description )
2020-05-21 14:29:34 -07:00
msg , err := gov . NewMsgSubmitProposal ( content , deposit , from )
2020-04-16 12:33:57 -07:00
if err != nil {
return err
}
if err = msg . ValidateBasic ( ) ; err != nil {
return err
}
2020-07-21 06:54:07 -07:00
return tx . GenerateOrBroadcastTxCLI ( clientCtx , cmd . Flags ( ) , msg )
2020-04-16 12:33:57 -07:00
} ,
}
cmd . Flags ( ) . String ( cli . FlagTitle , "" , "title of proposal" )
cmd . Flags ( ) . String ( cli . FlagDescription , "" , "description of proposal" )
cmd . Flags ( ) . String ( cli . FlagDeposit , "" , "deposit of proposal" )
2020-07-24 10:39:52 -07:00
cmd . MarkFlagRequired ( cli . FlagTitle )
cmd . MarkFlagRequired ( cli . FlagDescription )
2020-04-16 12:33:57 -07:00
return cmd
}
2019-11-08 06:40:56 -08:00
func parseArgsToContent ( cmd * cobra . Command , name string ) ( gov . Content , error ) {
title , err := cmd . Flags ( ) . GetString ( cli . FlagTitle )
if err != nil {
return nil , err
}
description , err := cmd . Flags ( ) . GetString ( cli . FlagDescription )
if err != nil {
return nil , err
}
height , err := cmd . Flags ( ) . GetInt64 ( FlagUpgradeHeight )
if err != nil {
return nil , err
}
timeStr , err := cmd . Flags ( ) . GetString ( FlagUpgradeTime )
if err != nil {
return nil , err
}
if height != 0 && len ( timeStr ) != 0 {
return nil , fmt . Errorf ( "only one of --upgrade-time or --upgrade-height should be specified" )
}
var upgradeTime time . Time
if len ( timeStr ) != 0 {
upgradeTime , err = time . Parse ( TimeFormat , timeStr )
if err != nil {
return nil , err
}
}
info , err := cmd . Flags ( ) . GetString ( FlagUpgradeInfo )
if err != nil {
return nil , err
}
2020-02-24 09:14:19 -08:00
plan := types . Plan { Name : name , Time : upgradeTime , Height : height , Info : info }
content := types . NewSoftwareUpgradeProposal ( title , description , plan )
2019-11-08 06:40:56 -08:00
return content , nil
}