From aaee1e392b4f1f4b08f4a475a343c4c20743ed4f Mon Sep 17 00:00:00 2001 From: Jim Fasarakis-Hilliard Date: Thu, 31 Aug 2023 13:57:42 +0300 Subject: [PATCH] Add cmd for submitting a recover client prop. (#4522) * Add cmd for submitting a recover client prop. * Bump cosmossdk in e2e. * Use govtypes.ModuleName, rename old govtypes to govv1beta1 * Update modules/core/02-client/client/cli/tx.go Co-authored-by: Damian Nolan * Add auth flag. --------- Co-authored-by: Damian Nolan --- e2e/go.mod | 2 + e2e/go.sum | 4 +- modules/core/02-client/client/cli/tx.go | 67 +++++++++++++++++++++++-- 3 files changed, 68 insertions(+), 5 deletions(-) diff --git a/e2e/go.mod b/e2e/go.mod index 11312deda3d..f79d4502cd2 100644 --- a/e2e/go.mod +++ b/e2e/go.mod @@ -248,3 +248,5 @@ replace github.com/cosmos/ibc-go/v7 => ../ replace github.com/syndtr/goleveldb => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 replace github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1 + +replace github.com/cosmos/cosmos-sdk => github.com/cosmos/cosmos-sdk v0.47.5-0.20230828070859-c9144f02dda8 diff --git a/e2e/go.sum b/e2e/go.sum index f9fc5ba1d42..1b5ae7e6c17 100644 --- a/e2e/go.sum +++ b/e2e/go.sum @@ -354,8 +354,8 @@ github.com/cosmos/btcutil v1.0.5 h1:t+ZFcX77LpKtDBhjucvnOH8C2l2ioGsBNEQ3jef8xFk= github.com/cosmos/btcutil v1.0.5/go.mod h1:IyB7iuqZMJlthe2tkIFL33xPyzbFYP0XVdS8P5lUPis= github.com/cosmos/cosmos-proto v1.0.0-beta.2 h1:X3OKvWgK9Gsejo0F1qs5l8Qn6xJV/AzgIWR2wZ8Nua8= github.com/cosmos/cosmos-proto v1.0.0-beta.2/go.mod h1:+XRCLJ14pr5HFEHIUcn51IKXD1Fy3rkEQqt4WqmN4V0= -github.com/cosmos/cosmos-sdk v0.47.4 h1:FVUpEprm58nMmBX4xkRdMDaIG5Nr4yy92HZAfGAw9bg= -github.com/cosmos/cosmos-sdk v0.47.4/go.mod h1:R5n+uM7vguVPFap4pgkdvQCT1nVo/OtPwrlAU40rvok= +github.com/cosmos/cosmos-sdk v0.47.5-0.20230828070859-c9144f02dda8 h1:H4+Ma/eOLsjG3PyK6CLVAup4MfxwzPqUa+02jV2hz08= +github.com/cosmos/cosmos-sdk v0.47.5-0.20230828070859-c9144f02dda8/go.mod h1:EHwCeN9IXonsjKcjpS12MqeStdZvIdxt3VYXhus3G3c= github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d/go.mod h1:tSxLoYXyBmiFeKpvmq4dzayMdCjCnu8uqmCysIGBT2Y= github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= diff --git a/modules/core/02-client/client/cli/tx.go b/modules/core/02-client/client/cli/tx.go index 7966daf7dac..e97ec1dd19b 100644 --- a/modules/core/02-client/client/cli/tx.go +++ b/modules/core/02-client/client/cli/tx.go @@ -12,15 +12,19 @@ import ( "github.com/cosmos/cosmos-sdk/client/tx" "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/address" "github.com/cosmos/cosmos-sdk/version" govcli "github.com/cosmos/cosmos-sdk/x/gov/client/cli" - govtypes "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" + govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" + govv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" "github.com/cosmos/ibc-go/v7/modules/core/exported" ) +const FlagAuthority = "authority" + // NewCreateClientCmd defines the command to create a new IBC light client. func NewCreateClientCmd() *cobra.Command { cmd := &cobra.Command{ @@ -241,6 +245,63 @@ func NewUpgradeClientCmd() *cobra.Command { return cmd } +// NewCmdRecoverClientProposal defines the command to recover an IBC light client +func NewCmdRecoverClientProposal() *cobra.Command { + cmd := &cobra.Command{ + Use: "recover [subject-client-id] [substitute-client-id] [flags]", + Args: cobra.ExactArgs(2), + Short: "recover an IBC client", + Long: "Submit a recover IBC client proposal along with an initial deposit.\n" + + "Please specify a subject client identifier you want to recover..\n" + + "Please specify the substitute client the subject client will be recovered to.", + RunE: func(cmd *cobra.Command, args []string) error { + clientCtx, err := client.GetClientTxContext(cmd) + if err != nil { + return err + } + + proposal, err := govcli.ReadGovPropFlags(clientCtx, cmd.Flags()) + if err != nil { + return err + } + + subjectClientID, substituteClientID := args[0], args[1] + + 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(govtypes.ModuleName)).String() + } + + msg := types.NewMsgRecoverClient(authority, subjectClientID, substituteClientID) + + if err = msg.ValidateBasic(); err != nil { + return err + } + + if err := proposal.SetMsgs([]sdk.Msg{msg}); err != nil { + return fmt.Errorf("failed to create recover client proposal message: %w", err) + } + + return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), proposal) + }, + } + + cmd.Flags().String(FlagAuthority, "", "The address of the client module authority (defaults to gov)") + + flags.AddTxFlagsToCmd(cmd) + govcli.AddGovPropFlagsToCmd(cmd) + err := cmd.MarkFlagRequired(govcli.FlagTitle) + if err != nil { + panic(err) + } + + return cmd +} + // NewCmdSubmitUpdateClientProposal implements a command handler for submitting an update IBC client proposal transaction. func NewCmdSubmitUpdateClientProposal() *cobra.Command { cmd := &cobra.Command{ @@ -282,7 +343,7 @@ func NewCmdSubmitUpdateClientProposal() *cobra.Command { return err } - msg, err := govtypes.NewMsgSubmitProposal(content, deposit, from) + msg, err := govv1beta1.NewMsgSubmitProposal(content, deposit, from) if err != nil { return err } @@ -381,7 +442,7 @@ func NewCmdSubmitUpgradeProposal() *cobra.Command { return err } - msg, err := govtypes.NewMsgSubmitProposal(content, deposit, from) + msg, err := govv1beta1.NewMsgSubmitProposal(content, deposit, from) if err != nil { return err }