Skip to content

Commit

Permalink
Remove code duplication in x/auth/client/cli
Browse files Browse the repository at this point in the history
Commands decode-tx and decode were performing the same function.
The command decode-tx is now dropped and replaced by decode.

Closes: #5424
  • Loading branch information
Alessio Treglia committed Dec 18, 2019
1 parent eae10b0 commit 1dec0ec
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 71 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@ if the provided arguments are invalid.
increased significantly due to modular `AnteHandler` support. Increase GasLimit accordingly.
* (rest) [\#5336](https://github.com/cosmos/cosmos-sdk/issues/5336) `MsgEditValidator` uses `description` instead of `Description` as a JSON key.
* (keys) [\#5097](https://github.com/cosmos/cosmos-sdk/pull/5097) Due to the keybase -> keyring transition, keys need to be migrated. See `keys migrate` command for more info.
* (x/auth) [\#5424](https://github.com/cosmos/cosmos-sdk/issues/5424) Drop `decode-tx` command from x/auth/client/cli, duplicate of the `decode` command.

### Features

Expand Down
100 changes: 29 additions & 71 deletions x/auth/client/cli/decode.go
Original file line number Diff line number Diff line change
@@ -1,98 +1,56 @@
package cli

import (
"bytes"
"encoding/base64"
"encoding/hex"
"encoding/json"
"fmt"

"github.com/spf13/cobra"
"github.com/spf13/viper"
"github.com/tendermint/go-amino"

"github.com/cosmos/cosmos-sdk/client"
"github.com/cosmos/cosmos-sdk/client/context"
"github.com/cosmos/cosmos-sdk/codec"
"github.com/cosmos/cosmos-sdk/version"
"github.com/cosmos/cosmos-sdk/x/auth/types"
authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
)

const flagHex = "hex"

// GetDecodeCommand returns the decode command to take Amino-serialized bytes
// and turn it into a JSONified transaction.
func GetDecodeCommand(codec *amino.Codec) *cobra.Command {
cmd := &cobra.Command{
Use: "decode [amino-byte-string]",
Short: "Decode an amino-encoded transaction string",
Short: "Decode an amino-encoded transaction string.",
Args: cobra.ExactArgs(1),
RunE: func(cmd *cobra.Command, args []string) (err error) {
cliCtx := context.NewCLIContext().WithCodec(codec)

txBytes, err := base64.StdEncoding.DecodeString(args[0])
if err != nil {
return err
}

var stdTx authtypes.StdTx
err = cliCtx.Codec.UnmarshalBinaryLengthPrefixed(txBytes, &stdTx)
if err != nil {
return err
}

return cliCtx.PrintOutput(stdTx)
},
RunE: runDecodeTxString(codec),
}

cmd.Flags().BoolP(flagHex, "x", false, "Treat input as hexadecimal instead of base64")
return client.PostCommands(cmd)[0]
}

// GetDecodeTxCmd - returns the command to decode a tx from hex or base64
func GetDecodeTxCmd(cdc *codec.Codec) *cobra.Command {
return &cobra.Command{
Use: "decode-tx [tx]",
Short: "Decode a tx from hex or base64",
Long: fmt.Sprintf(`Decode a tx from hex, base64.
Example:
$ %s tx decode-tx TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0aGlz
`, version.ClientName),
Args: cobra.ExactArgs(1),
RunE: func(cmd *cobra.Command, args []string) error {

txString := args[0]

// try hex, then base64
txBytes, err := hex.DecodeString(txString)
if err != nil {
var err2 error
txBytes, err2 = base64.StdEncoding.DecodeString(txString)
if err2 != nil {
return fmt.Errorf(`expected hex or base64. Got errors:
hex: %v,
base64: %v
`, err, err2)
}
}

var tx = types.StdTx{}

err = cdc.UnmarshalBinaryLengthPrefixed(txBytes, &tx)
if err != nil {
return err
}

bz, err := cdc.MarshalJSON(tx)
if err != nil {
return err
}

buf := bytes.NewBuffer([]byte{})
if err = json.Indent(buf, bz, "", " "); err != nil {
return err
}

fmt.Println(buf.String())
return nil
},
func runDecodeTxString(codec *amino.Codec) func(cmd *cobra.Command, args []string) (err error) {
return func(cmd *cobra.Command, args []string) (err error) {
cmd.SetOut(cmd.OutOrStdout())
cmd.SetErr(cmd.ErrOrStderr())
cliCtx := context.NewCLIContext().WithCodec(codec).WithOutput(cmd.OutOrStdout())
var txBytes []byte

if viper.GetBool(flagHex) {
txBytes, err = hex.DecodeString(args[0])
} else {
txBytes, err = base64.StdEncoding.DecodeString(args[0])
}
if err != nil {
return err
}

var stdTx authtypes.StdTx
err = cliCtx.Codec.UnmarshalBinaryLengthPrefixed(txBytes, &stdTx)
if err != nil {
return err
}

return cliCtx.PrintOutput(stdTx)
}
}

0 comments on commit 1dec0ec

Please sign in to comment.