package main import ( "bufio" "io" "github.com/tendermint/tendermint/crypto" "github.com/cosmos/cosmos-sdk/client/flags" clientkeys "github.com/cosmos/cosmos-sdk/client/keys" "github.com/cosmos/cosmos-sdk/crypto/keyring" sdk "github.com/cosmos/cosmos-sdk/types" emintCrypto "github.com/cosmos/ethermint/crypto" "github.com/spf13/cobra" "github.com/spf13/viper" ) const ( flagDryRun = "dry-run" ) // keyCommands registers a sub-tree of commands to interact with // local private key storage. func keyCommands() *cobra.Command { cmd := &cobra.Command{ Use: "keys", Short: "Add or view local private keys", Long: `Keys allows you to manage your local keystore for tendermint. These keys may be in any format supported by go-crypto and can be used by light-clients, full nodes, or any other application that needs to sign with a private key.`, } addCmd := clientkeys.AddKeyCommand() addCmd.RunE = runAddCmd cmd.AddCommand( clientkeys.MnemonicKeyCommand(), addCmd, clientkeys.ExportKeyCommand(), clientkeys.ImportKeyCommand(), clientkeys.ListKeysCmd(), clientkeys.ShowKeysCmd(), flags.LineBreak, clientkeys.DeleteKeyCommand(), clientkeys.ParseKeyStringCommand(), clientkeys.MigrateCommand(), flags.LineBreak, unsafeExportEthKeyCommand(), ) return cmd } func getKeybase(transient bool, buf io.Reader) (keyring.Keybase, error) { if transient { return keyring.NewInMemory(keyring.WithKeygenFunc(ethermintKeygenFunc)), nil } return keyring.NewKeyring( sdk.KeyringServiceName(), viper.GetString(flags.FlagKeyringBackend), viper.GetString(flags.FlagHome), buf, keyring.WithKeygenFunc(ethermintKeygenFunc)) } func runAddCmd(cmd *cobra.Command, args []string) error { inBuf := bufio.NewReader(cmd.InOrStdin()) kb, err := getKeybase(viper.GetBool(flagDryRun), inBuf) if err != nil { return err } return clientkeys.RunAddCmd(cmd, args, kb, inBuf) } func ethermintKeygenFunc(bz []byte, algo keyring.SigningAlgo) (crypto.PrivKey, error) { return emintCrypto.PrivKeySecp256k1(bz), nil }