Fix hardened path printing, show 20 addresses after empty

Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
This commit is contained in:
Jakub Sztandera 2020-10-10 22:59:40 +02:00
parent bb6a354b62
commit 753d7b71a9
No known key found for this signature in database
GPG Key ID: 9A9AF56F8B3879BA

View File

@ -29,6 +29,8 @@ var ledgerCmd = &cli.Command{
}, },
} }
const hdHard = 0x80000000
var ledgerListAddressesCmd = &cli.Command{ var ledgerListAddressesCmd = &cli.Command{
Name: "list", Name: "list",
Flags: []cli.Flag{ Flags: []cli.Flag{
@ -57,12 +59,13 @@ var ledgerListAddressesCmd = &cli.Command{
return err return err
} }
for i := 0; i < 20; i++ { end := 20
for i := 0; i < end; i++ {
if err := ctx.Err(); err != nil { if err := ctx.Err(); err != nil {
return err return err
} }
p := []uint32{0x80000000 + 44, 0x80000000 + 461, 0x80000000, 0, uint32(i)} p := []uint32{hdHard | 44, hdHard | 461, hdHard | 0, 0, uint32(i)}
pubk, err := fl.GetPublicKeySECP256K1(p) pubk, err := fl.GetPublicKeySECP256K1(p)
if err != nil { if err != nil {
return err return err
@ -78,6 +81,9 @@ var ledgerListAddressesCmd = &cli.Command{
if err != nil { if err != nil {
return xerrors.Errorf("getting balance: %w", err) return xerrors.Errorf("getting balance: %w", err)
} }
if !b.IsZero() {
end = i + 21 // BIP32 spec, stop after 20 empty addresses
}
fmt.Printf("%s %s %s\n", addr, printHDPath(p), types.FIL(b)) fmt.Printf("%s %s %s\n", addr, printHDPath(p), types.FIL(b))
} else { } else {
@ -108,12 +114,12 @@ func parseHDPath(s string) ([]uint32, error) {
if err != nil { if err != nil {
return nil, err return nil, err
} }
if v >= 0x80000000 { if v >= hdHard {
return nil, fmt.Errorf("path element %s too large", p) return nil, fmt.Errorf("path element %s too large", p)
} }
if hard { if hard {
v += 0x80000000 v += hdHard
} }
out = append(out, uint32(v)) out = append(out, uint32(v))
} }
@ -121,20 +127,20 @@ func parseHDPath(s string) ([]uint32, error) {
} }
func printHDPath(pth []uint32) string { func printHDPath(pth []uint32) string {
s := "m/" s := "m"
for _, p := range pth { for _, p := range pth {
var hard bool s += "/"
if p >= 0x80000000 {
p -= 0x80000000 hard := p&hdHard != 0
} p &^= hdHard // remove hdHard bit
s += fmt.Sprint(p) s += fmt.Sprint(p)
if hard { if hard {
s += "'" s += "'"
} }
s += "/"
} }
return strings.TrimRight(s, "/") return s
} }
var ledgerKeyInfoCmd = &cli.Command{ var ledgerKeyInfoCmd = &cli.Command{
@ -164,6 +170,7 @@ var ledgerKeyInfoCmd = &cli.Command{
if err != nil { if err != nil {
return err return err
} }
if cctx.Bool("verbose") { if cctx.Bool("verbose") {
fmt.Println(addr) fmt.Println(addr)
fmt.Println(pubk) fmt.Println(pubk)