github.com/piotrnar/gocoin@v0.0.0-20240512203912-faa0448c5e96/tools/bip39wal/bip39wal.go (about) 1 package main 2 3 import ( 4 "encoding/hex" 5 "fmt" 6 "io/ioutil" 7 "os" 8 "regexp" 9 "strings" 10 11 "github.com/piotrnar/gocoin/lib/btc" 12 "github.com/piotrnar/gocoin/lib/others/bip39" 13 ) 14 15 /* 16 17 This tool provides same functgionality as the Mnemonic Code Converter - https://iancoleman.io/bip39/ 18 19 It only generates 24 words mnemonics, but it can read also 12, 15, 18 and 21 words. 20 21 It only follows BIP32 Derivation Path. 22 23 */ 24 25 func main() { 26 var mnemonic string 27 var er error 28 var seed []byte 29 30 if len(os.Args) > 1 { 31 fmt.Println("Reading mnemonic from file", os.Args[1], "...") 32 seed, er = ioutil.ReadFile(os.Args[1]) 33 if er != nil { 34 println(er.Error()) 35 return 36 } 37 mnemonic = string(seed) 38 re := regexp.MustCompile("[^a-zA-Z]") 39 a := re.ReplaceAll([]byte(mnemonic), []byte(" ")) 40 lns := strings.Split(string(a), " ") 41 mnemonic = "" 42 for _, l := range lns { 43 if l != "" { 44 if mnemonic != "" { 45 mnemonic = mnemonic + " " + l 46 } else { 47 mnemonic = l 48 } 49 } 50 } 51 } else { 52 entropy, _ := bip39.NewEntropy(256) 53 mnemonic, er = bip39.NewMnemonic(entropy) 54 if er != nil { 55 println(er.Error()) 56 return 57 } 58 fmt.Print(mnemonic) 59 return 60 } 61 seed, er = bip39.NewSeedWithErrorChecking(mnemonic, "") 62 if er != nil { 63 println("NewSeedWithErrorChecking: ", er.Error()) 64 return 65 } 66 67 fmt.Println() 68 fmt.Println("BIP39 Seed:") 69 wal := btc.MasterKey(seed, false) 70 fmt.Println(hex.EncodeToString(seed)) 71 72 fmt.Println() 73 fmt.Println("Extended Master Private Key:") 74 fmt.Println("", wal.String()) 75 76 wal.Prefix = btc.PrivateZ 77 fmt.Println() 78 fmt.Println("Extended Master zprv:") 79 fmt.Println("", wal.String()) 80 81 wasad := wal.Child(84 | 0x80000000).Child(0x80000000).Child(0x80000000) // m/84'/0'/0' 82 83 wasad.Prefix = btc.Private 84 fmt.Println() 85 fmt.Println("Extended Account Private Key:") 86 fmt.Println("", wasad.String()) 87 88 wasad.Prefix = btc.PrivateZ 89 fmt.Println() 90 fmt.Println("Extended Account zprv:") 91 fmt.Println("", wasad.String()) 92 93 wasad.Prefix = btc.Private 94 fmt.Println() 95 fmt.Println("Extended Account Public Key:") 96 fmt.Println("", wasad.Pub().String()) 97 98 wasad.Prefix = btc.PrivateZ 99 fmt.Println() 100 fmt.Println("Extended Account zpub:") 101 fmt.Println("", wasad.Pub().String()) 102 103 ch := wasad.Child(0) // 84'/0'/0'/0 104 105 // 84'/0'/0'/0/0 to 84'/0'/0'/0/5 106 fmt.Println() 107 for i := uint32(0); i <= 5; i++ { 108 cc := ch.Child(i) 109 puba := cc.PubAddr() 110 prva := btc.NewPrivateAddr(cc.Key[1:], btc.AddrVerPubkey(false)|0x80 /*private key version*/, true /*comprtessed*/) 111 fmt.Print("84'/0'/0'/0/", i) 112 fmt.Print(" \t") 113 fmt.Print(puba.String()) 114 fmt.Print(" \t") 115 fmt.Print(hex.EncodeToString(puba.Pubkey)) 116 fmt.Print(" \t") 117 fmt.Print(prva.String()) 118 fmt.Println() 119 } 120 121 }