Skip to content

Commit d0deac5

Browse files
Cosmos-HarryHarryjtieri
authoredOct 20, 2023
Harry/wallet init (#1190)
* made a new method "logChannelOpenMessage" to log the newly opened channel into info level * added fields * some changes * recreated issue 1151, added logs * Added new flag to restore all keys based on single mnemonic * minor fixes * some nicks * nicks * made some changes based on the suggestions and mistakes * added a separate test for restore-all * missed a short declaration for res * small nick failing the build * fixed test * added keys list command for techChain and testChain2 as well in the test cmd * nicks --------- Co-authored-by: Harry <harrycosmos@Harrys-MacBook-Pro.local> Co-authored-by: Justin Tieri <37750742+jtieri@users.noreply.github.com>
1 parent cc75c04 commit d0deac5

File tree

3 files changed

+1270
-34
lines changed

3 files changed

+1270
-34
lines changed
 

‎cmd/keys.go

+91-33
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import (
3232
const (
3333
flagCoinType = "coin-type"
3434
flagAlgo = "signing-algorithm"
35+
flagRestoreAll = "restore-all"
3536
defaultCoinType uint32 = sdk.CoinType
3637
)
3738

@@ -148,61 +149,118 @@ func keysRestoreCmd(a *appState) *cobra.Command {
148149
Use: "restore chain_name key_name mnemonic",
149150
Aliases: []string{"r"},
150151
Short: "Restores a mnemonic to the keychain associated with a particular chain",
151-
Args: withUsage(cobra.ExactArgs(3)),
152+
Args: withUsage(cobra.RangeArgs(2, 3)),
152153
Example: strings.TrimSpace(fmt.Sprintf(`
153-
$ %s keys restore ibc-0 testkey "[mnemonic-words]"
154-
$ %s k r cosmoshub faucet-key "[mnemonic-words]"`, appName, appName)),
154+
$ %s keys restore ibc-0 testkey "[mnemonic-words]"
155+
$ %s k r cosmoshub faucet-key "[mnemonic-words]"
156+
$ %s k r demo-key "[mnemonic-words]" --restore-all`, appName, appName, appName)),
155157
RunE: func(cmd *cobra.Command, args []string) error {
156-
keyName := args[1]
157-
158-
chain, ok := a.config.Chains[args[0]]
159-
if !ok {
160-
return errChainNotFound(args[0])
161-
}
162-
163-
if chain.ChainProvider.KeyExists(keyName) {
164-
return errKeyExists(keyName)
165-
}
166158

167159
cmdFlags := cmd.Flags()
168160

169-
coinType, err := cmdFlags.GetInt32(flagCoinType)
161+
restoreAll, err := cmdFlags.GetBool(flagRestoreAll)
170162
if err != nil {
171163
return err
172164
}
173165

174-
if coinType < 0 {
175-
if ccp, ok := chain.ChainProvider.(*cosmos.CosmosProvider); ok && ccp.PCfg.Slip44 != nil {
176-
coinType = int32(*ccp.PCfg.Slip44)
177-
} else {
178-
coinType = int32(defaultCoinType)
166+
if !restoreAll {
167+
168+
keyName := args[1]
169+
chain, ok := a.config.Chains[args[0]]
170+
if !ok {
171+
return errChainNotFound(args[0])
179172
}
180-
}
181173

182-
algo, err := cmdFlags.GetString(flagAlgo)
183-
if err != nil {
184-
return err
185-
}
174+
if chain.ChainProvider.KeyExists(keyName) {
175+
return errKeyExists(keyName)
176+
}
186177

187-
if algo == "" {
188-
if ccp, ok := chain.ChainProvider.(*cosmos.CosmosProvider); ok {
189-
algo = ccp.PCfg.SigningAlgorithm
190-
} else {
191-
algo = string(hd.Secp256k1Type)
178+
coinType, err := cmdFlags.GetInt32(flagCoinType)
179+
if err != nil {
180+
return err
181+
}
182+
183+
if coinType < 0 {
184+
if ccp, ok := chain.ChainProvider.(*cosmos.CosmosProvider); ok && ccp.PCfg.Slip44 != nil {
185+
coinType = int32(*ccp.PCfg.Slip44)
186+
} else {
187+
coinType = int32(defaultCoinType)
188+
}
189+
}
190+
191+
algo, err := cmdFlags.GetString(flagAlgo)
192+
if err != nil {
193+
return err
194+
}
195+
196+
if algo == "" {
197+
if ccp, ok := chain.ChainProvider.(*cosmos.CosmosProvider); ok {
198+
algo = ccp.PCfg.SigningAlgorithm
199+
} else {
200+
algo = string(hd.Secp256k1Type)
201+
}
192202
}
203+
204+
address, err := chain.ChainProvider.RestoreKey(keyName, args[2], uint32(coinType), algo)
205+
if err != nil {
206+
return err
207+
}
208+
fmt.Fprintln(cmd.OutOrStdout(), address)
209+
return nil
210+
193211
}
194212

195-
address, err := chain.ChainProvider.RestoreKey(keyName, args[2], uint32(coinType), algo)
196-
if err != nil {
197-
return err
213+
chains := a.config.Chains
214+
keyName := args[0]
215+
216+
for i, c := range chains {
217+
218+
chain := a.config.Chains[i]
219+
220+
if chain.ChainProvider.KeyExists(keyName) {
221+
return errKeyExists(keyName)
222+
}
223+
224+
coinType, err := cmdFlags.GetInt32(flagCoinType)
225+
if err != nil {
226+
return err
227+
}
228+
229+
if coinType < 0 {
230+
if ccp, ok := c.ChainProvider.(*cosmos.CosmosProvider); ok && ccp.PCfg.Slip44 != nil {
231+
coinType = int32(*ccp.PCfg.Slip44)
232+
} else {
233+
coinType = int32(defaultCoinType)
234+
}
235+
}
236+
237+
algo, err := cmdFlags.GetString(flagAlgo)
238+
if err != nil {
239+
return err
240+
}
241+
242+
if algo == "" {
243+
if ccp, ok := c.ChainProvider.(*cosmos.CosmosProvider); ok {
244+
algo = ccp.PCfg.SigningAlgorithm
245+
} else {
246+
algo = string(hd.Secp256k1Type)
247+
}
248+
}
249+
250+
addresses, err := c.ChainProvider.RestoreKey(keyName, args[1], uint32(coinType), algo)
251+
if err != nil {
252+
return err
253+
}
254+
255+
fmt.Fprintln(cmd.OutOrStdout(), addresses)
198256
}
199257

200-
fmt.Fprintln(cmd.OutOrStdout(), address)
201258
return nil
202259
},
203260
}
204261
cmd.Flags().Int32(flagCoinType, -1, "coin type number for HD derivation")
205262
cmd.Flags().String(flagAlgo, "", "signing algorithm for key (secp256k1, sr25519)")
263+
cmd.Flags().Bool(flagRestoreAll, false, "restores keys for all configured chains with a single mnemonic")
206264

207265
return cmd
208266
}

‎cmd/keys_test.go

+85-1
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@ func TestKeysRestore_Delete(t *testing.T) {
5656
})
5757

5858
// Restore a key with mnemonic to the chain.
59-
6059
res := sys.MustRun(t, "keys", "restore", "testChain", "default", relayertest.ZeroMnemonic)
6160
require.Equal(t, res.Stdout.String(), relayertest.ZeroCosmosAddr+"\n")
6261
require.Empty(t, res.Stderr.String())
@@ -182,3 +181,88 @@ func TestKeysDefaultCoinType(t *testing.T) {
182181
require.Error(t, err, "same key was able to be imported twice")
183182
require.Contains(t, err.Error(), "cannot overwrite key")
184183
}
184+
185+
func TestKeysRestoreAll_Delete(t *testing.T) {
186+
t.Parallel()
187+
188+
sys := relayertest.NewSystem(t)
189+
190+
_ = sys.MustRun(t, "config", "init")
191+
192+
slip44 := 118
193+
194+
sys.MustAddChain(t, "testChain", cmd.ProviderConfigWrapper{
195+
Type: "cosmos",
196+
Value: cosmos.CosmosProviderConfig{
197+
AccountPrefix: "cosmos",
198+
ChainID: "testcosmos",
199+
KeyringBackend: "test",
200+
Timeout: "10s",
201+
Slip44: &slip44,
202+
},
203+
})
204+
sys.MustAddChain(t, "testChain2", cmd.ProviderConfigWrapper{
205+
Type: "cosmos",
206+
Value: cosmos.CosmosProviderConfig{
207+
AccountPrefix: "cosmos",
208+
ChainID: "testcosmos-2",
209+
KeyringBackend: "test",
210+
Timeout: "10s",
211+
Slip44: &slip44,
212+
},
213+
})
214+
sys.MustAddChain(t, "testChain3", cmd.ProviderConfigWrapper{
215+
Type: "cosmos",
216+
Value: cosmos.CosmosProviderConfig{
217+
AccountPrefix: "cosmos",
218+
ChainID: "testcosmos-3",
219+
KeyringBackend: "test",
220+
Timeout: "10s",
221+
Slip44: &slip44,
222+
},
223+
})
224+
225+
// Restore keys for all configured chains with a single mnemonic.
226+
res := sys.MustRun(t, "keys", "restore", "default", relayertest.ZeroMnemonic, "--restore-all")
227+
require.Equal(t, res.Stdout.String(), relayertest.ZeroCosmosAddr+"\n"+relayertest.ZeroCosmosAddr+"\n"+relayertest.ZeroCosmosAddr+"\n")
228+
require.Empty(t, res.Stderr.String())
229+
230+
// Restored key must show up in list.
231+
res = sys.MustRun(t, "keys", "list", "testChain")
232+
require.Equal(t, res.Stdout.String(), "key(default) -> "+relayertest.ZeroCosmosAddr+"\n")
233+
require.Empty(t, res.Stderr.String())
234+
235+
res = sys.MustRun(t, "keys", "list", "testChain2")
236+
require.Equal(t, res.Stdout.String(), "key(default) -> "+relayertest.ZeroCosmosAddr+"\n")
237+
require.Empty(t, res.Stderr.String())
238+
239+
res = sys.MustRun(t, "keys", "list", "testChain3")
240+
require.Equal(t, res.Stdout.String(), "key(default) -> "+relayertest.ZeroCosmosAddr+"\n")
241+
require.Empty(t, res.Stderr.String())
242+
243+
// Deleting the key must succeed.
244+
res = sys.MustRun(t, "keys", "delete", "testChain", "default", "-y")
245+
require.Empty(t, res.Stdout.String())
246+
require.Equal(t, res.Stderr.String(), "key default deleted\n")
247+
248+
res = sys.MustRun(t, "keys", "delete", "testChain2", "default", "-y")
249+
require.Empty(t, res.Stdout.String())
250+
require.Equal(t, res.Stderr.String(), "key default deleted\n")
251+
252+
res = sys.MustRun(t, "keys", "delete", "testChain3", "default", "-y")
253+
require.Empty(t, res.Stdout.String())
254+
require.Equal(t, res.Stderr.String(), "key default deleted\n")
255+
256+
// Listing the keys again gives the no keys warning.
257+
res = sys.MustRun(t, "keys", "list", "testChain")
258+
require.Empty(t, res.Stdout.String())
259+
require.Contains(t, res.Stderr.String(), "no keys found for chain testChain")
260+
261+
res = sys.MustRun(t, "keys", "list", "testChain2")
262+
require.Empty(t, res.Stdout.String())
263+
require.Contains(t, res.Stderr.String(), "no keys found for chain testChain2")
264+
265+
res = sys.MustRun(t, "keys", "list", "testChain3")
266+
require.Empty(t, res.Stdout.String())
267+
require.Contains(t, res.Stderr.String(), "no keys found for chain testChain3")
268+
}

0 commit comments

Comments
 (0)