diff --git a/client/utils/utils.go b/client/utils/utils.go index 2d254bf82de4..79427557be96 100644 --- a/client/utils/utils.go +++ b/client/utils/utils.go @@ -101,7 +101,7 @@ func PrintUnsignedStdTx(w io.Writer, txBldr authtxb.TxBuilder, cliCtx context.CL } json, err := txBldr.Codec.MarshalJSON(stdTx) if err == nil { - fmt.Fprintf(w,"%s\n", json) + fmt.Fprintf(w, "%s\n", json) } return } diff --git a/cmd/gaia/init/gentx.go b/cmd/gaia/init/gentx.go index 6d66f2e30688..27551958f4af 100644 --- a/cmd/gaia/init/gentx.go +++ b/cmd/gaia/init/gentx.go @@ -2,24 +2,29 @@ package init import ( "fmt" - "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/context" "github.com/cosmos/cosmos-sdk/client/keys" + "github.com/cosmos/cosmos-sdk/client/utils" + "io/ioutil" + "os" + "path/filepath" + + "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/cmd/gaia/app" "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/server" sdk "github.com/cosmos/cosmos-sdk/types" authcmd "github.com/cosmos/cosmos-sdk/x/auth/client/cli" + authtxb "github.com/cosmos/cosmos-sdk/x/auth/client/txbuilder" "github.com/cosmos/cosmos-sdk/x/stake/client/cli" stakeTypes "github.com/cosmos/cosmos-sdk/x/stake/types" - "github.com/spf13/cobra" - "github.com/spf13/viper" cfg "github.com/tendermint/tendermint/config" "github.com/tendermint/tendermint/crypto" tmcli "github.com/tendermint/tendermint/libs/cli" "github.com/tendermint/tendermint/libs/common" - "io/ioutil" - "os" - "path/filepath" + + "github.com/spf13/cobra" + "github.com/spf13/viper" ) const ( @@ -79,7 +84,14 @@ following delegation and commission default parameters: } // Run gaiad tx create-validator prepareFlagsForTxCreateValidator(config, nodeID, ip, genDoc.ChainID, valPubKey) - createValidatorCmd := cli.GetCmdCreateValidator(cdc) + cliCtx, txBldr, msg, err := cli.BuildCreateValidatorMsg( + context.NewCLIContext().WithCodec(cdc).WithAccountDecoder( + authcmd.GetAccountDecoder(cdc)), + authtxb.NewTxBuilderFromCLI().WithCodec(cdc), + ) + if err != nil { + return err + } w, err := ioutil.TempFile("", "gentx") if err != nil { @@ -87,18 +99,19 @@ following delegation and commission default parameters: } unsignedGenTxFilename := w.Name() defer os.Remove(unsignedGenTxFilename) - os.Stdout = w - if err = createValidatorCmd.RunE(nil, args); err != nil { + + if err := utils.PrintUnsignedStdTx(w, txBldr, cliCtx, []sdk.Msg{msg}, true); err != nil { return err } - w.Close() prepareFlagsForTxSign() signCmd := authcmd.GetSignCommand(cdc, authcmd.GetAccountDecoder(cdc)) - if w, err = prepareOutputFile(config.RootDir, nodeID); err != nil { + + outputDocument, err := makeOutputFilepath(config.RootDir, nodeID) + if err != nil { return err } - os.Stdout = w + viper.Set("output-document", outputDocument) return signCmd.RunE(nil, []string{unsignedGenTxFilename}) }, } @@ -144,11 +157,10 @@ func prepareFlagsForTxSign() { viper.Set("offline", true) } -func prepareOutputFile(rootDir, nodeID string) (w *os.File, err error) { +func makeOutputFilepath(rootDir, nodeID string) (string, error) { writePath := filepath.Join(rootDir, "config", "gentx") - if err = common.EnsureDir(writePath, 0700); err != nil { - return + if err := common.EnsureDir(writePath, 0700); err != nil { + return "", err } - filename := filepath.Join(writePath, fmt.Sprintf("gentx-%v.json", nodeID)) - return os.Create(filename) + return filepath.Join(writePath, fmt.Sprintf("gentx-%v.json", nodeID)), nil } diff --git a/x/auth/client/cli/sign.go b/x/auth/client/cli/sign.go index f4a4548d4157..8d2fa6c4e333 100644 --- a/x/auth/client/cli/sign.go +++ b/x/auth/client/cli/sign.go @@ -5,6 +5,7 @@ import ( "github.com/pkg/errors" "github.com/spf13/viper" "io/ioutil" + "os" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/context" @@ -21,6 +22,7 @@ const ( flagValidateSigs = "validate-signatures" flagOffline = "offline" flagSigOnly = "signature-only" + flagOutfile = "output-document" ) // GetSignCommand returns the sign command @@ -51,6 +53,9 @@ recommended to set such parameters manually.`, cmd.Flags().Bool(flagValidateSigs, false, "Print the addresses that must sign the transaction, "+ "those who have already signed it, and make sure that signatures are in the correct order.") cmd.Flags().Bool(flagOffline, false, "Offline mode. Do not query local cache.") + cmd.Flags().StringP(flagOutfile, "O", "-", + "The document will be written to the given file. If - is used as file, "+ + "document will be printed to standard output") return cmd } @@ -104,7 +109,19 @@ func makeSignCmd(cdc *amino.Codec, decoder auth.AccountDecoder) func(cmd *cobra. if err != nil { return err } - fmt.Printf("%s\n", json) + + if viper.GetString(flagOutfile) == "-" { + fmt.Printf("%s\n", json) + return + } + + fp, err := os.OpenFile( + viper.GetString(flagOutfile), os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0644) + if err != nil { + return err + } + defer fp.Close() + fmt.Fprintf(fp, "%s\n", json) return } } diff --git a/x/stake/client/cli/tx.go b/x/stake/client/cli/tx.go index 90906dd8b71d..373ad9ffd0a1 100644 --- a/x/stake/client/cli/tx.go +++ b/x/stake/client/cli/tx.go @@ -28,63 +28,11 @@ func GetCmdCreateValidator(cdc *codec.Codec) *cobra.Command { WithCodec(cdc). WithAccountDecoder(authcmd.GetAccountDecoder(cdc)) - amounstStr := viper.GetString(FlagAmount) - amount, err := sdk.ParseCoin(amounstStr) + cliCtx, txBldr, msg, err := BuildCreateValidatorMsg(cliCtx, txBldr) if err != nil { return err } - valAddr, err := cliCtx.GetFromAddress() - if err != nil { - return err - } - - pkStr := viper.GetString(FlagPubKey) - pk, err := sdk.GetConsPubKeyBech32(pkStr) - if err != nil { - return err - } - - description := stake.NewDescription( - viper.GetString(FlagMoniker), - viper.GetString(FlagIdentity), - viper.GetString(FlagWebsite), - viper.GetString(FlagDetails), - ) - - // get the initial validator commission parameters - rateStr := viper.GetString(FlagCommissionRate) - maxRateStr := viper.GetString(FlagCommissionMaxRate) - maxChangeRateStr := viper.GetString(FlagCommissionMaxChangeRate) - commissionMsg, err := buildCommissionMsg(rateStr, maxRateStr, maxChangeRateStr) - if err != nil { - return err - } - - var msg sdk.Msg - if viper.GetString(FlagAddressDelegator) != "" { - delAddr, err := sdk.AccAddressFromBech32(viper.GetString(FlagAddressDelegator)) - if err != nil { - return err - } - - msg = stake.NewMsgCreateValidatorOnBehalfOf( - delAddr, sdk.ValAddress(valAddr), pk, amount, description, commissionMsg, - ) - } else { - msg = stake.NewMsgCreateValidator( - sdk.ValAddress(valAddr), pk, amount, description, commissionMsg, - ) - } - - if viper.GetBool(FlagGenesisFormat) { - ip := viper.GetString(FlagIP) - nodeID := viper.GetString(FlagNodeID) - if nodeID != "" && ip != "" { - txBldr = txBldr.WithMemo(fmt.Sprintf("%s@%s:26656", nodeID, ip)) - } - } - if viper.GetBool(FlagGenesisFormat) || cliCtx.GenerateOnly { return utils.PrintUnsignedStdTx(os.Stdout, txBldr, cliCtx, []sdk.Msg{msg}, true) } @@ -306,3 +254,63 @@ func GetCmdUnbond(storeName string, cdc *codec.Codec) *cobra.Command { return cmd } + +func BuildCreateValidatorMsg(cliCtx context.CLIContext, txBldr authtxb.TxBuilder) (context.CLIContext, authtxb.TxBuilder, sdk.Msg, error) { + amounstStr := viper.GetString(FlagAmount) + amount, err := sdk.ParseCoin(amounstStr) + if err != nil { + return cliCtx, txBldr, nil, err + } + + valAddr, err := cliCtx.GetFromAddress() + if err != nil { + return cliCtx, txBldr, nil, err + } + + pkStr := viper.GetString(FlagPubKey) + pk, err := sdk.GetConsPubKeyBech32(pkStr) + if err != nil { + return cliCtx, txBldr, nil, err + } + + description := stake.NewDescription( + viper.GetString(FlagMoniker), + viper.GetString(FlagIdentity), + viper.GetString(FlagWebsite), + viper.GetString(FlagDetails), + ) + + // get the initial validator commission parameters + rateStr := viper.GetString(FlagCommissionRate) + maxRateStr := viper.GetString(FlagCommissionMaxRate) + maxChangeRateStr := viper.GetString(FlagCommissionMaxChangeRate) + commissionMsg, err := buildCommissionMsg(rateStr, maxRateStr, maxChangeRateStr) + if err != nil { + return cliCtx, txBldr, nil, err + } + + var msg sdk.Msg + if viper.GetString(FlagAddressDelegator) != "" { + delAddr, err := sdk.AccAddressFromBech32(viper.GetString(FlagAddressDelegator)) + if err != nil { + return cliCtx, txBldr, nil, err + } + + msg = stake.NewMsgCreateValidatorOnBehalfOf( + delAddr, sdk.ValAddress(valAddr), pk, amount, description, commissionMsg, + ) + } else { + msg = stake.NewMsgCreateValidator( + sdk.ValAddress(valAddr), pk, amount, description, commissionMsg, + ) + } + + if viper.GetBool(FlagGenesisFormat) { + ip := viper.GetString(FlagIP) + nodeID := viper.GetString(FlagNodeID) + if nodeID != "" && ip != "" { + txBldr = txBldr.WithMemo(fmt.Sprintf("%s@%s:26656", nodeID, ip)) + } + } + return cliCtx, txBldr, msg, nil +}