From e0a3735bf4837e4b00d3a6ad49f2f2b6c0418e20 Mon Sep 17 00:00:00 2001 From: Hieu Vu <72878483+hieuvubk@users.noreply.github.com> Date: Mon, 17 Jun 2024 15:44:00 +0700 Subject: [PATCH 1/3] add flag for reading mnemonic from file --- client/keys/add.go | 45 +++++++++++++++++++++++++++++++++++++++------ 1 file changed, 39 insertions(+), 6 deletions(-) diff --git a/client/keys/add.go b/client/keys/add.go index e61715f37399..2f7e70a3a1bb 100644 --- a/client/keys/add.go +++ b/client/keys/add.go @@ -7,6 +7,8 @@ import ( "encoding/json" "errors" "fmt" + "io" + "os" "sort" "strings" @@ -38,6 +40,7 @@ const ( flagHDPath = "hd-path" flagPubKeyBase64 = "pubkey-base64" flagIndiscreet = "indiscreet" + flagMnemonicSrc = "source" // DefaultKeyPass contains the default key password for genesis transactions DefaultKeyPass = "12345678" @@ -87,6 +90,7 @@ Example: f.Uint32(flagIndex, 0, "Address index number for HD derivation (less than equal 2147483647)") f.String(flags.FlagKeyType, string(hd.Secp256k1Type), "Key signing algorithm to generate keys for") f.Bool(flagIndiscreet, false, "Print seed phrase directly on current terminal (only valid when --no-backup is false)") + f.String(flagMnemonicSrc, "", "lets users pass in the passphrase via a file (only used when flagRecover or flagInteractive was passed)") // support old flags name for backwards compatibility f.SetNormalizeFunc(func(f *pflag.FlagSet, name string) pflag.NormalizedName { @@ -282,19 +286,34 @@ func runAddCmd(ctx client.Context, cmd *cobra.Command, args []string, inBuf *buf var mnemonic, bip39Passphrase string recoverFlag, _ := cmd.Flags().GetBool(flagRecover) + mnemonicSrc, _ := cmd.Flags().GetString(flagMnemonicSrc) if recoverFlag { - mnemonic, err = input.GetString("Enter your bip39 mnemonic", inBuf) - if err != nil { - return err + if mnemonicSrc != "" { + mnemonic, err = readMnemonicFromFile(mnemonicSrc) + if err != nil { + return err + } + } else { + mnemonic, err = input.GetString("Enter your bip39 mnemonic", inBuf) + if err != nil { + return err + } } if !bip39.IsMnemonicValid(mnemonic) { return errors.New("invalid mnemonic") } } else if interactive { - mnemonic, err = input.GetString("Enter your bip39 mnemonic, or hit enter to generate one.", inBuf) - if err != nil { - return err + if mnemonicSrc != "" { + mnemonic, err = readMnemonicFromFile(mnemonicSrc) + if err != nil { + return err + } + } else { + mnemonic, err = input.GetString("Enter your bip39 mnemonic, or hit enter to generate one.", inBuf) + if err != nil { + return err + } } if !bip39.IsMnemonicValid(mnemonic) && mnemonic != "" { @@ -404,3 +423,17 @@ func printCreate(ctx client.Context, cmd *cobra.Command, k *keyring.Record, show return nil } + +func readMnemonicFromFile(filePath string) (string, error) { + file, err := os.Open(filePath) + if err != nil { + return "", err + } + defer file.Close() + + bz, err := io.ReadAll(file) + if err != nil { + return "", err + } + return string(bz), nil +} From e065be760b49913243d2a1c8090c8207a54fe366 Mon Sep 17 00:00:00 2001 From: Hieu Vu <72878483+hieuvubk@users.noreply.github.com> Date: Mon, 17 Jun 2024 16:23:49 +0700 Subject: [PATCH 2/3] add changelog & fix comment --- CHANGELOG.md | 1 + client/keys/add.go | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d63f4ec8fca4..de4e4ffe61e2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -42,6 +42,7 @@ Every module contains its own CHANGELOG.md. Please refer to the module you are i ### Features +* (client) [#20690](https://github.com/cosmos/cosmos-sdk/pull/20690) Import mnemonic from file * (tests) [#20013](https://github.com/cosmos/cosmos-sdk/pull/20013) Introduce system tests to run multi node local testnet in CI * (runtime) [#19953](https://github.com/cosmos/cosmos-sdk/pull/19953) Implement `core/transaction.Service` in runtime. * (client) [#19905](https://github.com/cosmos/cosmos-sdk/pull/19905) Add grpc client config to `client.toml`. diff --git a/client/keys/add.go b/client/keys/add.go index 2f7e70a3a1bb..7cbbfb273ab8 100644 --- a/client/keys/add.go +++ b/client/keys/add.go @@ -90,7 +90,7 @@ Example: f.Uint32(flagIndex, 0, "Address index number for HD derivation (less than equal 2147483647)") f.String(flags.FlagKeyType, string(hd.Secp256k1Type), "Key signing algorithm to generate keys for") f.Bool(flagIndiscreet, false, "Print seed phrase directly on current terminal (only valid when --no-backup is false)") - f.String(flagMnemonicSrc, "", "lets users pass in the passphrase via a file (only used when flagRecover or flagInteractive was passed)") + f.String(flagMnemonicSrc, "", "Import mnemonic from a file (only usable when recover or interactive is passed)") // support old flags name for backwards compatibility f.SetNormalizeFunc(func(f *pflag.FlagSet, name string) pflag.NormalizedName { From e05bfa2d4420e587530eebab0666a76d63d8ede5 Mon Sep 17 00:00:00 2001 From: Hieu Vu <72878483+hieuvubk@users.noreply.github.com> Date: Tue, 18 Jun 2024 14:04:02 +0700 Subject: [PATCH 3/3] example doc --- client/keys/add.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/client/keys/add.go b/client/keys/add.go index 7cbbfb273ab8..ee006231ace2 100644 --- a/client/keys/add.go +++ b/client/keys/add.go @@ -63,6 +63,11 @@ local keystore. Use the --pubkey flag to add arbitrary public keys to the keystore for constructing multisig transactions. +Use the --source flag to import mnemonic from a file in recover or interactive mode. +Example: + + keys add testing --recover --source ./mnemonic.txt + You can create and store a multisig key by passing the list of key names stored in a keyring and the minimum number of signatures required through --multisig-threshold. The keys are sorted by address, unless the flag --nosort is set.