@@ -101,3 +101,76 @@ func TestDeriveSeed(t *testing.T) {
101
101
})
102
102
}
103
103
}
104
+
105
+ func Test_DeriveChildFromPath (t * testing.T ) {
106
+ t .Parallel ()
107
+ tests := map [string ]struct {
108
+ key * ExtendedKey
109
+ path string
110
+ expPriv string
111
+ expPub string
112
+ err error
113
+ }{
114
+ "successful run, 1 level child, should return no errors" : {
115
+ key : func () * ExtendedKey {
116
+ k , err := NewKeyFromString ("xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi" )
117
+ assert .NoError (t , err )
118
+ return k
119
+ }(),
120
+ path : "0/1" ,
121
+ expPriv : "xprv9ww7sMFLzJMzy7bV1qs7nGBxgKYrgcm3HcJvGb4yvNhT9vxXC7eX7WVULzCfxucFEn2TsVvJw25hH9d4mchywguGQCZvRgsiRaTY1HCqN8G" ,
122
+ expPub : "xpub6AvUGrnEpfvJBbfx7sQ89Q8hEMPM65UteqEX4yUbUiES2jHfjexmfJoxCGSwFMZiPBaKQT1RiKWrKfuDV4vpgVs4Xn8PpPTR2i79rwHd4Zr" ,
123
+ err : nil ,
124
+ }, "successful run, 2 level child, should return no errors" : {
125
+ key : func () * ExtendedKey {
126
+ k , err := NewKeyFromString ("xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi" )
127
+ assert .NoError (t , err )
128
+ return k
129
+ }(),
130
+ path : "0/1/100000" ,
131
+ expPriv : "xprv9xrdP7iD2MKJthXr1NiyGJ5KqmD2sLbYYFi49AMq9bXrKJGKBnjx5ivSzXRfLhXxzQNsqCi51oUjniwGemvfAZpzpAGohpzFkat42ohU5bR" ,
132
+ expPub : "xpub6BqyndF6risc7BcK7QFydS24Po3XGoKPuUdewYmShw4qC6bTjL4CdXEvqow6yhsfAtvU8e6kHPNFM2LzeWwKQoJm6hrYttTcxVQrk42WRE3" ,
133
+ err : nil ,
134
+ }, "successful run, 10 level child, should return no errors" : {
135
+ key : func () * ExtendedKey {
136
+ k , err := NewKeyFromString ("xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi" )
137
+ assert .NoError (t , err )
138
+ return k
139
+ }(),
140
+ path : "0/1/1/1/1/1/1/1/1/2147483647" ,
141
+ expPriv : "xprvAD89K3nZjaG8NqELN8Ce2ATWTcRADLH6JTbrXoVJT6eBRbMwbG7J75v3ym4tGC7X3Mih5krQF77pGi6GNdvxfNcr6WqYacHCSa6uzotoAx2" ,
142
+ expPub : "xpub6S7ViZKTZwpRbKJoU9jePJQF1eFecnzwfgXTLBtv1SBAJPh68oRYetEXq1RvGzsYnTzeikfdM5UM3WDrSZxuBrJi5nLpGxsuSE6cDE8pB2o" ,
143
+ err : nil ,
144
+ }, "successful run, 1 level, hardened" : {
145
+ key : func () * ExtendedKey {
146
+ k , err := NewKeyFromString ("xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi" )
147
+ assert .NoError (t , err )
148
+ return k
149
+ }(),
150
+ path : "0/1'" ,
151
+ expPriv : "xprv9ww7sMFVKxty8iXvY7Yn2NyvHZ2CgEoAYXmvf2a4XvkhzBUBmYmaMWyjyAhSxgyKK4zYzbJT6hT4JeGW5fFcNaYsBsBR9a8TxVX1LJQiZ1P" ,
152
+ expPub : "xpub6AvUGrnPALTGMCcPe95nPWveqarh5hX1ukhXTQyg6GHgryoLK65puKJDpTcMBKJKdtXQYVwbK3zMgydcTcf5qpLpJcULu9hKUxx5rzgYhrk" ,
153
+ err : nil ,
154
+ }, "successful run, 3 level, hardened" : {
155
+ key : func () * ExtendedKey {
156
+ k , err := NewKeyFromString ("xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi" )
157
+ assert .NoError (t , err )
158
+ return k
159
+ }(),
160
+ path : "10/1'/1000'/15'" ,
161
+ expPriv : "xprvA1bKm9LnkQbMvUW6kwKDLFapT9V9vTeh9D9VnVSJhRf8KmqQTc9W5YboNYcUUkZLreNq1NmeuPpw8x86C87gGyxyV6jNBV4kztFrPdSWz2t" ,
162
+ expPub : "xpub6EagAesgan9f8xaZrxrDhPXZ1BKeKvNYWS56asqvFmC7CaAZ19TkdLvHDrzubSMiC6tAqTMcumVFkgT2duhZncV3KieshEDHNc4jPWkRMGD" ,
163
+ err : nil ,
164
+ },
165
+ }
166
+ for name , test := range tests {
167
+ t .Run (name , func (t * testing.T ) {
168
+ k , err := test .key .DeriveChildFromPath (test .path )
169
+ assert .NoError (t , err )
170
+ assert .Equal (t , test .expPriv , k .String ())
171
+ pubKey , err := k .Neuter ()
172
+ assert .NoError (t , err )
173
+ assert .Equal (t , test .expPub , pubKey .String ())
174
+ })
175
+ }
176
+ }
0 commit comments