feat!: use gov v1 proposals in upgrade cli (#14880)
This commit is contained in:
@@ -3,33 +3,18 @@ package cli
|
||||
import (
|
||||
"cosmossdk.io/x/upgrade/types"
|
||||
"github.com/spf13/pflag"
|
||||
|
||||
"github.com/cosmos/cosmos-sdk/x/gov/client/cli"
|
||||
gov "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1"
|
||||
)
|
||||
|
||||
func parseArgsToContent(fs *pflag.FlagSet, name string) (gov.Content, error) {
|
||||
title, err := fs.GetString(cli.FlagTitle)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
description, err := fs.GetString(cli.FlagDescription) //nolint:staticcheck // we are intentionally using a deprecated flag here.
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
func parsePlan(fs *pflag.FlagSet, name string) (types.Plan, error) {
|
||||
height, err := fs.GetInt64(FlagUpgradeHeight)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
return types.Plan{}, err
|
||||
}
|
||||
|
||||
info, err := fs.GetString(FlagUpgradeInfo)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
return types.Plan{}, err
|
||||
}
|
||||
|
||||
plan := types.Plan{Name: name, Height: height, Info: info}
|
||||
content := types.NewSoftwareUpgradeProposal(title, description, plan)
|
||||
return content, nil
|
||||
return types.Plan{Name: name, Height: height, Info: info}, nil
|
||||
}
|
||||
|
||||
@@ -6,16 +6,12 @@ import (
|
||||
|
||||
"cosmossdk.io/x/upgrade/types"
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
"github.com/cosmos/cosmos-sdk/x/gov/client/cli"
|
||||
)
|
||||
|
||||
func TestParseArgsToContent(t *testing.T) {
|
||||
fs := NewCmdSubmitLegacyUpgradeProposal().Flags()
|
||||
func TestParsePlan(t *testing.T) {
|
||||
fs := NewCmdSubmitUpgradeProposal().Flags()
|
||||
|
||||
proposal := types.SoftwareUpgradeProposal{ //nolint:staticcheck // SA1019: types.SoftwareUpgradeProposal is deprecated: use types.Content instead
|
||||
Title: "proposal title",
|
||||
Description: "proposal description",
|
||||
proposal := types.MsgSoftwareUpgrade{
|
||||
Plan: types.Plan{
|
||||
Name: "plan name",
|
||||
Height: 123456,
|
||||
@@ -23,19 +19,12 @@ func TestParseArgsToContent(t *testing.T) {
|
||||
},
|
||||
}
|
||||
|
||||
fs.Set(cli.FlagTitle, proposal.Title)
|
||||
fs.Set(cli.FlagDescription, proposal.Description) //nolint:staticcheck // SA1019: cli.FlagDescription is deprecated: use cli.FlagProposalDescription instead
|
||||
fs.Set(FlagUpgradeHeight, strconv.FormatInt(proposal.Plan.Height, 10))
|
||||
fs.Set(FlagUpgradeInfo, proposal.Plan.Info)
|
||||
|
||||
content, err := parseArgsToContent(fs, proposal.Plan.Name)
|
||||
p, err := parsePlan(fs, proposal.Plan.Name)
|
||||
require.NoError(t, err)
|
||||
|
||||
p, ok := content.(*types.SoftwareUpgradeProposal) //nolint:staticcheck // SA1019: types.SoftwareUpgradeProposal is deprecated: use types.Content instead
|
||||
require.Equal(t, ok, true)
|
||||
require.Equal(t, p.Title, proposal.Title)
|
||||
require.Equal(t, p.Description, proposal.Description)
|
||||
require.Equal(t, p.Plan.Name, proposal.Plan.Name)
|
||||
require.Equal(t, p.Plan.Height, proposal.Plan.Height)
|
||||
require.Equal(t, p.Plan.Info, proposal.Plan.Info)
|
||||
require.Equal(t, p.Name, proposal.Plan.Name)
|
||||
require.Equal(t, p.Height, proposal.Plan.Height)
|
||||
require.Equal(t, p.Info, proposal.Plan.Info)
|
||||
}
|
||||
|
||||
+70
-58
@@ -1,6 +1,7 @@
|
||||
package cli
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"path/filepath"
|
||||
|
||||
@@ -10,19 +11,19 @@ import (
|
||||
"cosmossdk.io/x/upgrade/types"
|
||||
|
||||
"github.com/cosmos/cosmos-sdk/client"
|
||||
"github.com/cosmos/cosmos-sdk/client/flags"
|
||||
"github.com/cosmos/cosmos-sdk/client/tx"
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
"github.com/cosmos/cosmos-sdk/types/address"
|
||||
"github.com/cosmos/cosmos-sdk/x/gov/client/cli"
|
||||
"github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1"
|
||||
)
|
||||
|
||||
const (
|
||||
// Deprecated: only used for v1beta1 legacy proposals.
|
||||
FlagUpgradeHeight = "upgrade-height"
|
||||
// Deprecated: only used for v1beta1 legacy proposals.
|
||||
FlagUpgradeInfo = "upgrade-info"
|
||||
FlagNoValidate = "no-validate"
|
||||
FlagDaemonName = "daemon-name"
|
||||
FlagUpgradeInfo = "upgrade-info"
|
||||
FlagNoValidate = "no-validate"
|
||||
FlagDaemonName = "daemon-name"
|
||||
FlagAuthority = "authority"
|
||||
)
|
||||
|
||||
// GetTxCmd returns the transaction commands for this module
|
||||
@@ -32,41 +33,53 @@ func GetTxCmd() *cobra.Command {
|
||||
Short: "Upgrade transaction subcommands",
|
||||
}
|
||||
|
||||
cmd.AddCommand(
|
||||
NewCmdSubmitUpgradeProposal(),
|
||||
NewCmdSubmitCancelUpgradeProposal(),
|
||||
)
|
||||
|
||||
return cmd
|
||||
}
|
||||
|
||||
// NewCmdSubmitLegacyUpgradeProposal implements a command handler for submitting a software upgrade proposal transaction.
|
||||
// Deprecated: please use NewCmdSubmitUpgradeProposal instead.
|
||||
func NewCmdSubmitLegacyUpgradeProposal() *cobra.Command {
|
||||
// NewCmdSubmitUpgradeProposal implements a command handler for submitting a software upgrade proposal transaction.
|
||||
func NewCmdSubmitUpgradeProposal() *cobra.Command {
|
||||
cmd := &cobra.Command{
|
||||
Use: "software-upgrade [name] (--upgrade-height [height]) (--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 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/cosmos/cosmos-sdk/tree/main/cosmovisor",
|
||||
"You may include info to reference a binary download link, in a format compatible with: https://docs.cosmos.network/main/tooling/cosmovisor",
|
||||
RunE: func(cmd *cobra.Command, args []string) error {
|
||||
clientCtx, err := client.GetClientTxContext(cmd)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
name := args[0]
|
||||
content, err := parseArgsToContent(cmd.Flags(), name)
|
||||
|
||||
proposal, err := cli.ReadGovPropFlags(clientCtx, cmd.Flags())
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
name := args[0]
|
||||
p, err := parsePlan(cmd.Flags(), name)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
noValidate, err := cmd.Flags().GetBool(FlagNoValidate)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if !noValidate {
|
||||
prop := content.(*types.SoftwareUpgradeProposal) //nolint:staticcheck // we are intentionally using a deprecated proposal type.
|
||||
var daemonName string
|
||||
if daemonName, err = cmd.Flags().GetString(FlagDaemonName); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
var planInfo *plan.Info
|
||||
if planInfo, err = plan.ParseInfo(prop.Plan.Info); err != nil {
|
||||
if planInfo, err = plan.ParseInfo(p.Info); err != nil {
|
||||
return err
|
||||
}
|
||||
if err = planInfo.ValidateFull(daemonName); err != nil {
|
||||
@@ -74,40 +87,44 @@ func NewCmdSubmitLegacyUpgradeProposal() *cobra.Command {
|
||||
}
|
||||
}
|
||||
|
||||
from := clientCtx.GetFromAddress()
|
||||
|
||||
depositStr, err := cmd.Flags().GetString(cli.FlagDeposit)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
deposit, err := sdk.ParseCoinsNormalized(depositStr)
|
||||
if err != nil {
|
||||
return err
|
||||
authority, _ := cmd.Flags().GetString(FlagAuthority)
|
||||
if authority != "" {
|
||||
if _, err = sdk.AccAddressFromBech32(authority); err != nil {
|
||||
return fmt.Errorf("invalid authority address: %w", err)
|
||||
}
|
||||
} else {
|
||||
authority = sdk.AccAddress(address.Module("gov")).String()
|
||||
}
|
||||
|
||||
msg, err := v1beta1.NewMsgSubmitProposal(content, deposit, from)
|
||||
if err != nil {
|
||||
return err
|
||||
if err := proposal.SetMsgs([]sdk.Msg{
|
||||
&types.MsgSoftwareUpgrade{
|
||||
Authority: authority,
|
||||
Plan: p,
|
||||
},
|
||||
}); err != nil {
|
||||
return fmt.Errorf("failed to create cancel upgrade message: %w", err)
|
||||
}
|
||||
|
||||
return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg)
|
||||
return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), proposal)
|
||||
},
|
||||
}
|
||||
|
||||
cmd.Flags().String(cli.FlagTitle, "", "title of proposal")
|
||||
cmd.Flags().String(cli.FlagDescription, "", "description of proposal") //nolint:staticcheck // we are intentionally using a deprecated flag here.
|
||||
cmd.Flags().String(cli.FlagDeposit, "", "deposit of proposal")
|
||||
cmd.Flags().Int64(FlagUpgradeHeight, 0, "The height at which the upgrade must happen")
|
||||
cmd.Flags().String(FlagUpgradeInfo, "", "Info for the upgrade plan such as new version download urls, etc.")
|
||||
cmd.Flags().Bool(FlagNoValidate, false, "Skip validation of the upgrade info")
|
||||
cmd.Flags().String(FlagDaemonName, getDefaultDaemonName(), "The name of the executable being upgraded (for upgrade-info validation). Default is the DAEMON_NAME env var if set, or else this executable")
|
||||
cmd.Flags().String(FlagAuthority, "", "The address of the upgrade module authority (defaults to gov)")
|
||||
|
||||
// add common proposal flags
|
||||
flags.AddTxFlagsToCmd(cmd)
|
||||
cli.AddGovPropFlagsToCmd(cmd)
|
||||
cmd.MarkFlagRequired(cli.FlagTitle)
|
||||
|
||||
return cmd
|
||||
}
|
||||
|
||||
// NewCmdSubmitLegacyCancelUpgradeProposal implements a command handler for submitting a software upgrade cancel proposal transaction.
|
||||
// Deprecated: please use NewCmdSubmitCancelUpgradeProposal instead.
|
||||
func NewCmdSubmitLegacyCancelUpgradeProposal() *cobra.Command {
|
||||
// NewCmdSubmitCancelUpgradeProposal implements a command handler for submitting a software upgrade cancel proposal transaction.
|
||||
func NewCmdSubmitCancelUpgradeProposal() *cobra.Command {
|
||||
cmd := &cobra.Command{
|
||||
Use: "cancel-software-upgrade [flags]",
|
||||
Args: cobra.ExactArgs(0),
|
||||
@@ -118,44 +135,39 @@ func NewCmdSubmitLegacyCancelUpgradeProposal() *cobra.Command {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
from := clientCtx.GetFromAddress()
|
||||
|
||||
depositStr, err := cmd.Flags().GetString(cli.FlagDeposit)
|
||||
proposal, err := cli.ReadGovPropFlags(clientCtx, cmd.Flags())
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
deposit, err := sdk.ParseCoinsNormalized(depositStr)
|
||||
if err != nil {
|
||||
return err
|
||||
authority, _ := cmd.Flags().GetString(FlagAuthority)
|
||||
if authority != "" {
|
||||
if _, err = sdk.AccAddressFromBech32(authority); err != nil {
|
||||
return fmt.Errorf("invalid authority address: %w", err)
|
||||
}
|
||||
} else {
|
||||
authority = sdk.AccAddress(address.Module("gov")).String()
|
||||
}
|
||||
|
||||
title, err := cmd.Flags().GetString(cli.FlagTitle)
|
||||
if err != nil {
|
||||
return err
|
||||
if err := proposal.SetMsgs([]sdk.Msg{
|
||||
&types.MsgCancelUpgrade{
|
||||
Authority: authority,
|
||||
},
|
||||
}); err != nil {
|
||||
return fmt.Errorf("failed to create cancel upgrade message: %w", err)
|
||||
}
|
||||
|
||||
description, err := cmd.Flags().GetString(cli.FlagDescription) //nolint:staticcheck // we are intentionally using a deprecated flag here.
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
content := types.NewCancelSoftwareUpgradeProposal(title, description)
|
||||
|
||||
msg, err := v1beta1.NewMsgSubmitProposal(content, deposit, from)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg)
|
||||
return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), proposal)
|
||||
},
|
||||
}
|
||||
|
||||
cmd.Flags().String(cli.FlagTitle, "", "title of proposal")
|
||||
cmd.Flags().String(cli.FlagDescription, "", "description of proposal") //nolint:staticcheck // we are intentionally using a deprecated flag here.
|
||||
cmd.Flags().String(cli.FlagDeposit, "", "deposit of proposal")
|
||||
cmd.Flags().String(FlagAuthority, "", "The address of the upgrade module authority (defaults to gov)")
|
||||
|
||||
// add common proposal flags
|
||||
flags.AddTxFlagsToCmd(cmd)
|
||||
cli.AddGovPropFlagsToCmd(cmd)
|
||||
cmd.MarkFlagRequired(cli.FlagTitle)
|
||||
cmd.MarkFlagRequired(cli.FlagDescription) //nolint:staticcheck // we are intentionally using a deprecated flag here.
|
||||
|
||||
return cmd
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user