Skip to content

Commit a4c885a

Browse files
committed
feat: extended master key support multi chainnet.
1 parent d48c740 commit a4c885a

File tree

2 files changed

+63
-7
lines changed

2 files changed

+63
-7
lines changed

core/wallet/mnemonic.go

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package wallet
22

33
import (
4+
"errors"
5+
46
"github.com/btcsuite/btcd/btcutil/hdkeychain"
57
"github.com/btcsuite/btcd/chaincfg"
68
"github.com/tyler-smith/go-bip39"
@@ -20,12 +22,33 @@ func IsValidMnemonic(mnemonic string) bool {
2022
return err == nil
2123
}
2224

23-
func ExtendMasterKey(mnemonic string) (string, error) {
25+
// ExtendMasterKey derives a master key from the given mnemonic and chain network identifier.
26+
//
27+
// Parameters:
28+
// - mnemonic: A string representing the mnemonic phrase used to generate the seed.
29+
// - chainnet: The blockchain network, which must be either
30+
// "mainnet", "testnet", "signet", "simnet" or "regtest".
31+
func ExtendMasterKey(mnemonic string, chainnet string) (string, error) {
32+
var net chaincfg.Params
33+
switch chainnet {
34+
case "mainnet", "bitcoin":
35+
net = chaincfg.MainNetParams
36+
case "testnet", "testnet3":
37+
net = chaincfg.TestNet3Params
38+
case "signet":
39+
net = chaincfg.SigNetParams
40+
case "simnet":
41+
net = chaincfg.SimNetParams
42+
case "regtest":
43+
net = chaincfg.RegressionNetParams
44+
default:
45+
return "", errors.New("invalid chainnet")
46+
}
2447
seed, err := bip39.NewSeedWithErrorChecking(mnemonic, "")
2548
if err != nil {
2649
return "", err
2750
}
28-
masterKey, err := hdkeychain.NewMaster(seed, &chaincfg.MainNetParams)
51+
masterKey, err := hdkeychain.NewMaster(seed, &net)
2952
if err != nil {
3053
return "", err
3154
}

core/wallet/mnemonic_test.go

Lines changed: 38 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import (
44
"testing"
55

66
"github.com/ChainSafe/go-schnorrkel"
7-
"github.com/stretchr/testify/require"
87
"github.com/tyler-smith/go-bip39"
98
)
109

@@ -42,8 +41,42 @@ func TestSeed(t *testing.T) {
4241

4342
func TestExtendMasterKey(t *testing.T) {
4443
mn := "unaware oxygen allow method allow property predict various slice travel please priority"
45-
extendedMasterKey, err := ExtendMasterKey(mn)
46-
require.NoError(t, err)
47-
want := "xprv9s21ZrQH143K2gM869SUAeSEGDM81UnyWG2tM7ZygYwN3PkveZmY799G6q7zkQYSQCMn7M7AMpP8Z6etKUoZo8x4hH1WVcKBCMZnVTNM8AD"
48-
require.Equal(t, want, extendedMasterKey)
44+
tests := []struct {
45+
chainnet string
46+
want string
47+
wantErr bool
48+
}{
49+
{
50+
chainnet: "mainnet",
51+
want: "xprv9s21ZrQH143K2gM869SUAeSEGDM81UnyWG2tM7ZygYwN3PkveZmY799G6q7zkQYSQCMn7M7AMpP8Z6etKUoZo8x4hH1WVcKBCMZnVTNM8AD",
52+
},
53+
{
54+
chainnet: "testnet",
55+
want: "tprv8ZgxMBicQKsPdVaekiHyLJ4DaLmLEzpyqox1DXzSAXRqpzW1dw7HctWi21HekmvkmdtZ7SivXAxw1xCdSh9WcCDfDvDp9y3E7TKCw7HgLYY",
56+
},
57+
{
58+
chainnet: "signet",
59+
want: "tprv8ZgxMBicQKsPdVaekiHyLJ4DaLmLEzpyqox1DXzSAXRqpzW1dw7HctWi21HekmvkmdtZ7SivXAxw1xCdSh9WcCDfDvDp9y3E7TKCw7HgLYY",
60+
},
61+
{
62+
chainnet: "simnet",
63+
want: "sprv8Erh3X3hFeKunCPXvMWM8CxiQNctJNqUvhRnS96YnX3xmtgnPGwizprZzoL4ksGqMzmkMy8N4WcP8fb4izjVoxY4MaXPa4DjqjFZYXFdKru",
64+
},
65+
{
66+
chainnet: "regtest",
67+
want: "tprv8ZgxMBicQKsPdVaekiHyLJ4DaLmLEzpyqox1DXzSAXRqpzW1dw7HctWi21HekmvkmdtZ7SivXAxw1xCdSh9WcCDfDvDp9y3E7TKCw7HgLYY",
68+
},
69+
}
70+
for _, tt := range tests {
71+
t.Run(tt.chainnet, func(t *testing.T) {
72+
got, err := ExtendMasterKey(mn, tt.chainnet)
73+
if (err != nil) != tt.wantErr {
74+
t.Errorf("ExtendMasterKey() error = %v, wantErr %v", err, tt.wantErr)
75+
return
76+
}
77+
if got != tt.want {
78+
t.Errorf("ExtendMasterKey() = %v, want %v", got, tt.want)
79+
}
80+
})
81+
}
4982
}

0 commit comments

Comments
 (0)