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  }