Skip to content

Commit 7e43eb5

Browse files
authored
Fix NPE with cli gen command. (#3)
* Fix NPE with cli gen command. * Add readme docs for gen command
1 parent 13f4345 commit 7e43eb5

File tree

5 files changed

+99
-23
lines changed

5 files changed

+99
-23
lines changed

README.md

Lines changed: 74 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
## Installation
2-
```
3-
go install github.com/provenance-io/extkey/cmd/extkey@latest
2+
```shell
3+
$ go install github.com/provenance-io/extkey/cmd/extkey@latest
44
```
55

66
# Encoding
77

8-
## Key generation interactive
9-
```
8+
## Key encoding interactive
9+
```shell
1010
# Using interactive mode
11-
▷▷ extkey encode --hrp tp --hd-path "m/44'/1'/0'/420'"
11+
$ extkey encode --hrp tp --hd-path "m/44'/1'/0'/420'"
1212
mnemonic: fly fly comfort
1313
passphrase:
1414
seed: UeItRbah4gE-syrw1EaXVKyg3GKWqfZqOztWNAXfnUME-bMpjp4jT0YxzEBWBA33_QWDAmeFE1I_hNlt2xJJew==
@@ -35,8 +35,8 @@ childKey:
3535
bigInt: "261180551375323774831564216383503265774120811521638640313796615741160982804745"
3636
```
3737

38-
## Key generation with env vars
39-
```
38+
## Key encoding with env vars
39+
```shell
4040
# Using env vars
4141
$ MNEMONIC="fly fly comfort" PASSPHRASE="" extkey encode --hrp tp --hd-path "m/44'/1'/0'/0'"
4242
seed: UeItRbah4gE-syrw1EaXVKyg3GKWqfZqOztWNAXfnUME-bMpjp4jT0YxzEBWBA33_QWDAmeFE1I_hNlt2xJJew==
@@ -66,7 +66,7 @@ childKey:
6666
# Decoding
6767

6868
## Decoding xprv keys
69-
```
69+
```shell
7070
$ extkey decode --hrp tp xprv9zqjpMDofQuSFaF8NsS2Ybq2Xndj9zB5PkKyS16JqWsvP8aQWELPkpBnTh6NUUFHmRqRxVpz3fT8S2ckHSRSQ8EDcS4ZifxwQsjWgJjn5GK
7171
address: tp1ndh7g7xy48k52phkr3p37rnkazmc98zuv8fp38
7272
xkey:
@@ -79,7 +79,7 @@ xkey:
7979
```
8080

8181
## Decoding xpub keys
82-
```
82+
```shell
8383
$ extkey decode --hrp tp xpub6Dq6DrkhVnTjU4KbUty2ujmm5pUDZStvkyFaEPVvPrQuFvuZ3meeJcWGJwjLjb666HDPxVg2SDTMuh6JVfP897z5VJxRoSf82koiPucLPDm
8484
address: tp1ndh7g7xy48k52phkr3p37rnkazmc98zuv8fp38
8585
xkey:
@@ -90,15 +90,77 @@ xkey:
9090
fingerprint: "28508294"
9191
```
9292

93-
# API key generation
93+
# Generating
94+
95+
## Key generation with random seed
96+
```shell
97+
$ extkey gen --hd-path "m/44'/505'/0'/0'/0" --hrp tp
98+
seed: kwDcbPMhZOTRQpCcgtBKXxbtVcEe_4ne5tasLV-JAhlYAbaf13vRMaVANwDZTm4A75snNhI2LTH_T0NVGTYJuQ==
99+
mnemonic: text gown action resource depth toe parrot limit dinosaur frog again march pool another pretty imitate spatial music lecture charge very fiber few ignore
100+
hrp: tp
101+
rootKey:
102+
address: tp1scl32wrzy043ldnz5qyaqn5kpjws2fktce4k7s
103+
privateKey:
104+
base58: xprv9s21ZrQH143K3hoYnZzA9WRAkGK7pJbjDDKf2MjstzMLyH9tUUgRtDWaPCULb6rsnijuqs3FDoXoGsZuzx8it8ZkKuyuqKZH9EghnUBBGtV
105+
bytes: 0488ADE4000000000000000000A54A051BCE830BF6C6A3656C5CA2A4E45D11B44E853FF5019D8DB8F57328B00F00712F6D5E492D9516A0D68E6F1A34068206D93C3E8193D2C2DCA6F9CC3636D3773700F716
106+
bigInt: "51195148534247021627172126139454315055974072071557156386597256238996714345335"
107+
publicKey:
108+
base58: xpub661MyMwAqRbcGBt1tbXAWeMuJJ9cDmKaaSFFpk9VTKtKr5V321zgS1q4EWQUMT7QN4xaXzkWMCzQAQ6Vp6DGtp5MyMQ7cDToY6tzNH91X57
109+
bytes: 0488B21E000000000000000000A54A051BCE830BF6C6A3656C5CA2A4E45D11B44E853FF5019D8DB8F57328B00F03EF7C0C7C458B18A3D5ADEF1EA181271F4DE1191554F0B4BFF95923703FA02DC43C4BC866
110+
bigInt: "455698213730695089965667949209897413589214143496016811921245211286232805420484"
111+
childKey:
112+
address: tp1wy5vf0cem2ec88qvnj5qaeucyf3twrhhfzs7qe
113+
privateKey:
114+
base58: xprvA2vNQscVB7uwrpXTLYXw5ffoRxHrp75Ynwc3LVixemDticLn7BpGDnxXvc2jJEksJuef3bLP3QtKZLYRUPncbBoaBW5SMSjMENCLppnT2te
115+
bytes: 0488ADE40543478CF000000000E63E5C24103358AEB259B1E0926EDED31D6DCF316F16D6A74BB4AAF9ED5D1D610001628A7298303FB55D71174CCF7C8B20D556FCF97A815456B0301A14049BD9E64A4C9357
116+
bigInt: "626419391388641969500024507723796044901451795080364889081030583799756085734"
117+
publicKey:
118+
base58: xpub6FuipP9P1VUF5JbvSa4wSocXyz8MDZoQAAXe8t8aD6ksbQfvej8WmbH1mtypTMgVqxfkPpY94M122qqNhdWPLm1cUq4mDQW9VZeLwbZ2X6C
119+
bytes: 0488B21E0543478CF000000000E63E5C24103358AEB259B1E0926EDED31D6DCF316F16D6A74BB4AAF9ED5D1D6102FE281C136209674387FE584A4A18584D0BB82C2C7B5FF818AE25C713CB3E85790139E4CD
120+
bigInt: "346542509668834358586089346602711884922951328399776737952015035914050934310265"
94121
```
122+
123+
## Key generation with known seed
124+
```shell
125+
$ extkey gen --hd-path "m/44'/505'/0'/0'/0" --hrp tp --seed kwDcbPMhZOTRQpCcgtBKXxbtVcEe_4ne5tasLV-JAhlYAbaf13vRMaVANwDZTm4A75snNhI2LTH_T0NVGTYJuQ==
126+
seed: kwDcbPMhZOTRQpCcgtBKXxbtVcEe_4ne5tasLV-JAhlYAbaf13vRMaVANwDZTm4A75snNhI2LTH_T0NVGTYJuQ==
127+
hrp: tp
128+
rootKey:
129+
address: tp1scl32wrzy043ldnz5qyaqn5kpjws2fktce4k7s
130+
privateKey:
131+
base58: xprv9s21ZrQH143K3hoYnZzA9WRAkGK7pJbjDDKf2MjstzMLyH9tUUgRtDWaPCULb6rsnijuqs3FDoXoGsZuzx8it8ZkKuyuqKZH9EghnUBBGtV
132+
bytes: 0488ADE4000000000000000000A54A051BCE830BF6C6A3656C5CA2A4E45D11B44E853FF5019D8DB8F57328B00F00712F6D5E492D9516A0D68E6F1A34068206D93C3E8193D2C2DCA6F9CC3636D3773700F716
133+
bigInt: "51195148534247021627172126139454315055974072071557156386597256238996714345335"
134+
publicKey:
135+
base58: xpub661MyMwAqRbcGBt1tbXAWeMuJJ9cDmKaaSFFpk9VTKtKr5V321zgS1q4EWQUMT7QN4xaXzkWMCzQAQ6Vp6DGtp5MyMQ7cDToY6tzNH91X57
136+
bytes: 0488B21E000000000000000000A54A051BCE830BF6C6A3656C5CA2A4E45D11B44E853FF5019D8DB8F57328B00F03EF7C0C7C458B18A3D5ADEF1EA181271F4DE1191554F0B4BFF95923703FA02DC43C4BC866
137+
bigInt: "455698213730695089965667949209897413589214143496016811921245211286232805420484"
138+
childKey:
139+
address: tp1wy5vf0cem2ec88qvnj5qaeucyf3twrhhfzs7qe
140+
privateKey:
141+
base58: xprvA2vNQscVB7uwrpXTLYXw5ffoRxHrp75Ynwc3LVixemDticLn7BpGDnxXvc2jJEksJuef3bLP3QtKZLYRUPncbBoaBW5SMSjMENCLppnT2te
142+
bytes: 0488ADE40543478CF000000000E63E5C24103358AEB259B1E0926EDED31D6DCF316F16D6A74BB4AAF9ED5D1D610001628A7298303FB55D71174CCF7C8B20D556FCF97A815456B0301A14049BD9E64A4C9357
143+
bigInt: "626419391388641969500024507723796044901451795080364889081030583799756085734"
144+
publicKey:
145+
base58: xpub6FuipP9P1VUF5JbvSa4wSocXyz8MDZoQAAXe8t8aD6ksbQfvej8WmbH1mtypTMgVqxfkPpY94M122qqNhdWPLm1cUq4mDQW9VZeLwbZ2X6C
146+
bytes: 0488B21E0543478CF000000000E63E5C24103358AEB259B1E0926EDED31D6DCF316F16D6A74BB4AAF9ED5D1D6102FE281C136209674387FE584A4A18584D0BB82C2C7B5FF818AE25C713CB3E85790139E4CD
147+
bigInt: "346542509668834358586089346602711884922951328399776737952015035914050934310265"
148+
```
149+
150+
## Key generation with known mnemonic
151+
```shell
152+
TODO
153+
```
154+
155+
# API key generation
156+
```shell
95157
$ extkey serve
96158
...
97159
[GIN-debug] GET /generate --> github.com/provenance-io/extkey/cmd/extkey/commands.generateKeys (3 handlers)
98160
...
99161
```
100162

101-
```
163+
```shell
102164
$ curl "localhost:9000/generate?hrp=tp" | jq
103165
{
104166
"seed": "UeItRbah4gE-syrw1EaXVKyg3GKWqfZqOztWNAXfnUME-bMpjp4jT0YxzEBWBA33_QWDAmeFE1I_hNlt2xJJew==",
@@ -139,7 +201,7 @@ $ curl "localhost:9000/generate?hrp=tp&seed=UeItRbah4gE-syrw1EaXVKyg3GKWqfZqOztW
139201
```
140202

141203
# Running via docker
142-
```
204+
```shell
143205
# Default listen port is 7000
144206
$ docker run -p 7000:7000 -it provenanceio/extkey
145207

cmd/extkey/commands/encode.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ func encode(path string, formatter Formatter, w io.Writer, hrp, seedB64 string)
6161
if err != nil {
6262
return err
6363
}
64-
key := someKey{
64+
key := SomeKey{
6565
Seed: base64.URLEncoding.EncodeToString(seed),
6666
Mnemonic: "",
6767
Hrp: hrp,

cmd/extkey/commands/flags.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ var hdPath string
2323
var hrp string
2424
var seed string
2525
var laddr string
26+
var mnemonic string
2627

2728
var flagHRP = func(cmd *cobra.Command) {
2829
cmd.PersistentFlags().StringVar(&hrp, "hrp", "", "Human readable prefix")
@@ -45,6 +46,10 @@ var flagLAddr = func(cmd *cobra.Command) {
4546
cmd.PersistentFlags().StringVar(&laddr, "laddr", "0.0.0.0:9000", "The address:port to listen on")
4647
}
4748

49+
// var flagMnemonic = func(cmd *cobra.Command) {
50+
// cmd.PersistentFlags().StringVar(&mnemonic, "mnemonic", "", "The mnemonic to use to generate the seed")
51+
// }
52+
4853
func formatize(format string) (Formatter, error) {
4954
switch format {
5055
case "json":

cmd/extkey/commands/generate.go

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,18 @@ var CmdGenerate = &cobra.Command{
1616
Use: "gen",
1717
RunE: func(cmd *cobra.Command, args []string) error {
1818
hrp := strings.TrimSpace(cmd.Flag("hrp").Value.String())
19+
if hrp == "" {
20+
return fmt.Errorf("--hrp is required")
21+
}
1922
hdPath := strings.TrimSpace(cmd.Flag("hd-path").Value.String())
20-
seed := strings.TrimSpace(cmd.Flag("seed").Value.String())
23+
if hdPath == "" {
24+
return fmt.Errorf("--hd-path is required")
25+
}
26+
var seed string
27+
if cmd.Flag("seed") != nil {
28+
seed = strings.TrimSpace(cmd.Flag("seed").Value.String())
29+
}
30+
2131
formatter, err := formatize(strings.TrimSpace(cmd.Flag("format").Value.String()))
2232
if err != nil {
2333
return err
@@ -27,7 +37,7 @@ var CmdGenerate = &cobra.Command{
2737
}
2838

2939
func init() {
30-
addFlags(CmdGenerate, flagHRP, flagFormat, flagHDPath)
40+
addFlags(CmdGenerate, flagHRP, flagFormat, flagHDPath, flagSeed)
3141
}
3242

3343
func generate(hrp, hdPath, seed string, formatter Formatter, w io.Writer) error {
@@ -51,19 +61,18 @@ func generate(hrp, hdPath, seed string, formatter Formatter, w io.Writer) error
5161
return nil
5262
}
5363

54-
func GenerateExtKey(hrp, hdPath string, seedBz []byte) (someKey, error) {
64+
func GenerateExtKey(hrp, hdPath string, seedBz []byte) (SomeKey, error) {
5565
var seed []byte
5666
var err error
57-
var mnemonic string
5867
if seedBz == nil {
5968
var entropy []byte
6069
entropy, err = bip39.NewEntropy(256)
6170
if err != nil {
62-
return someKey{}, err
71+
return SomeKey{}, err
6372
}
6473
mnemonic, err = bip39.NewMnemonic(entropy)
6574
if err != nil {
66-
return someKey{}, err
75+
return SomeKey{}, err
6776
}
6877
seed = bip39.NewSeed(mnemonic, "")
6978
} else {
@@ -72,9 +81,9 @@ func GenerateExtKey(hrp, hdPath string, seedBz []byte) (someKey, error) {
7281

7382
rootKey, err := bip32.NewMasterKey(seed)
7483
if err != nil {
75-
return someKey{}, err
84+
return SomeKey{}, err
7685
}
77-
key := someKey{
86+
key := SomeKey{
7887
Hrp: hrp,
7988
Seed: base64.URLEncoding.EncodeToString(seed),
8089
Mnemonic: mnemonic,
@@ -83,7 +92,7 @@ func GenerateExtKey(hrp, hdPath string, seedBz []byte) (someKey, error) {
8392
if hdPath != "" {
8493
childKey, err := DeriveChildKey(rootKey, hdPath)
8594
if err != nil {
86-
return someKey{}, err
95+
return SomeKey{}, err
8796
}
8897
key.ChildKey = NewExtKeyData(childKey, hrp)
8998
}

cmd/extkey/commands/keys.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ func DeriveChildKey(parentKey *bip32.Key, path string) (*bip32.Key, error) {
2525
return childKey, nil
2626
}
2727

28-
type someKey struct {
28+
type SomeKey struct {
2929
Seed string `json:"seed,omitempty" yaml:"seed,omitempty"`
3030
Mnemonic string `json:"mnemonic,omitempty" yaml:"mnemonic,omitempty"`
3131
Hrp string `json:"hrp,omitempty" yaml:"hrp,omitempty"`

0 commit comments

Comments
 (0)