money-tree-openssl 1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,807 @@
1
+ require 'spec_helper'
2
+
3
+ # Test vectors from https://en.bitcoin.it/wiki/BIP_0032_TestVectors
4
+ describe MoneyTree::Master do
5
+ describe "initialize" do
6
+ describe "without a seed" do
7
+ before do
8
+ @master = MoneyTree::Master.new
9
+ end
10
+
11
+ it "generates a random seed 32 bytes long" do
12
+ expect(@master.seed.bytesize).to eql(32)
13
+ end
14
+
15
+ it "exports the seed in hex format" do
16
+ expect(@master).to respond_to(:seed_hex)
17
+ expect(@master.seed_hex.size).to eql(64)
18
+ end
19
+ end
20
+
21
+ context "testnet" do
22
+ before do
23
+ @master = MoneyTree::Master.new network: :bitcoin_testnet
24
+ end
25
+
26
+ it "generates testnet address" do
27
+ expect(%w(m n)).to include(@master.to_address(network: :bitcoin_testnet)[0])
28
+ end
29
+
30
+ it "generates testnet compressed wif" do
31
+ expect(@master.private_key.to_wif(network: :bitcoin_testnet)[0]).to eql('c')
32
+ end
33
+
34
+ it "generates testnet uncompressed wif" do
35
+ expect(@master.private_key.to_wif(compressed: false, network: :bitcoin_testnet)[0]).to eql('9')
36
+ end
37
+
38
+ it "generates testnet serialized private address" do
39
+ expect(@master.to_bip32(:private, network: :bitcoin_testnet).slice(0, 4)).to eql("tprv")
40
+ end
41
+
42
+ it "generates testnet serialized public address" do
43
+ expect(@master.to_bip32(network: :bitcoin_testnet).slice(0, 4)).to eql("tpub")
44
+ end
45
+
46
+ it "imports from testnet serialized private address" do
47
+ node = MoneyTree::Node.from_bip32 'tprv8ZgxMBicQKsPcuN7bfUZqq78UEYapr3Tzmc9NcDXw8BnBJ47dZYr6SusnfYj7vbAYP9CP8ZiD5aVBTUo1yU5QP56mepKVvuEbu8KZQXMKNE'
48
+ expect(node.to_bip32(:private, network: :bitcoin_testnet)).to eql('tprv8ZgxMBicQKsPcuN7bfUZqq78UEYapr3Tzmc9NcDXw8BnBJ47dZYr6SusnfYj7vbAYP9CP8ZiD5aVBTUo1yU5QP56mepKVvuEbu8KZQXMKNE')
49
+ end
50
+
51
+ it "imports from testnet serialized public address" do
52
+ node = MoneyTree::Node.from_bip32 'tpubD6NzVbkrYhZ4YA8aUE9bBZTSyHJibBqwDny5urfwDdJc4W8od3y3Ebzy6CqsYn9CCC5P5VQ7CeZYpnT1kX3RPVPysU2rFRvYSj8BCoYYNqT'
53
+ expect(%w(m n)).to include(node.public_key.to_s(network: :bitcoin_testnet)[0])
54
+ expect(node.to_bip32(network: :bitcoin_testnet)).to eql('tpubD6NzVbkrYhZ4YA8aUE9bBZTSyHJibBqwDny5urfwDdJc4W8od3y3Ebzy6CqsYn9CCC5P5VQ7CeZYpnT1kX3RPVPysU2rFRvYSj8BCoYYNqT')
55
+ end
56
+
57
+ it "generates testnet subnodes from serialized private address" do
58
+ node = MoneyTree::Node.from_bip32 'tprv8ZgxMBicQKsPcuN7bfUZqq78UEYapr3Tzmc9NcDXw8BnBJ47dZYr6SusnfYj7vbAYP9CP8ZiD5aVBTUo1yU5QP56mepKVvuEbu8KZQXMKNE'
59
+ subnode = node.node_for_path('1/1/1')
60
+ expect(%w(m n)).to include(subnode.public_key.to_s(network: :bitcoin_testnet)[0])
61
+ expect(subnode.to_bip32(:private, network: :bitcoin_testnet).slice(0,4)).to eql('tprv')
62
+ expect(subnode.to_bip32(network: :bitcoin_testnet).slice(0,4)).to eql('tpub')
63
+ end
64
+
65
+ it "generates testnet subnodes from serialized public address" do
66
+ node = MoneyTree::Node.from_bip32 'tpubD6NzVbkrYhZ4YA8aUE9bBZTSyHJibBqwDny5urfwDdJc4W8od3y3Ebzy6CqsYn9CCC5P5VQ7CeZYpnT1kX3RPVPysU2rFRvYSj8BCoYYNqT'
67
+ subnode = node.node_for_path('1/1/1')
68
+ expect(%w(m n)).to include(subnode.public_key.to_s(network: :bitcoin_testnet)[0])
69
+ expect(subnode.to_bip32(network: :bitcoin_testnet).slice(0,4)).to eql('tpub')
70
+ end
71
+ end
72
+
73
+ describe "Test vector 1" do
74
+ describe "from a seed" do
75
+ before do
76
+ @master = MoneyTree::Master.new seed_hex: "000102030405060708090a0b0c0d0e0f"
77
+ end
78
+
79
+ describe "m" do
80
+ it "has an index of 0" do
81
+ expect(@master.index).to eql(0)
82
+ end
83
+
84
+ it "is private" do
85
+ expect(@master.is_private?).to eql(true)
86
+ end
87
+
88
+ it "has a depth of 0" do
89
+ expect(@master.depth).to eql(0)
90
+ end
91
+
92
+ it "generates master node (Master)" do
93
+ expect(@master.to_identifier).to eql("3442193e1bb70916e914552172cd4e2dbc9df811")
94
+ expect(@master.to_fingerprint).to eql("3442193e")
95
+ expect(@master.to_address).to eql("15mKKb2eos1hWa6tisdPwwDC1a5J1y9nma")
96
+ end
97
+
98
+ it "generates a secret key" do
99
+ expect(@master.private_key.to_hex).to eql("e8f32e723decf4051aefac8e2c93c9c5b214313817cdb01a1494b917c8436b35")
100
+ expect(@master.private_key.to_wif).to eql("L52XzL2cMkHxqxBXRyEpnPQZGUs3uKiL3R11XbAdHigRzDozKZeW")
101
+ end
102
+
103
+ it "generates a public key" do
104
+ expect(@master.public_key.to_hex).to eql("0339a36013301597daef41fbe593a02cc513d0b55527ec2df1050e2e8ff49c85c2")
105
+ end
106
+
107
+ it "generates a chain code" do
108
+ expect(@master.chain_code_hex).to eql("873dff81c02f525623fd1fe5167eac3a55a049de3d314bb42ee227ffed37d508")
109
+ end
110
+
111
+ it "generates a serialized private key" do
112
+ expect(@master.to_serialized_hex(:private)).to eql("0488ade4000000000000000000873dff81c02f525623fd1fe5167eac3a55a049de3d314bb42ee227ffed37d50800e8f32e723decf4051aefac8e2c93c9c5b214313817cdb01a1494b917c8436b35")
113
+ expect(@master.to_bip32(:private)).to eql("xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi")
114
+ end
115
+
116
+ it "generates a serialized public_key" do
117
+ expect(@master.to_serialized_hex).to eql("0488b21e000000000000000000873dff81c02f525623fd1fe5167eac3a55a049de3d314bb42ee227ffed37d5080339a36013301597daef41fbe593a02cc513d0b55527ec2df1050e2e8ff49c85c2")
118
+ expect(@master.to_bip32).to eql("xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8")
119
+ end
120
+ end
121
+
122
+ describe "m/0p" do
123
+ before do
124
+ @node = @master.node_for_path "m/0p"
125
+ end
126
+
127
+ it "has an index of 2147483648" do
128
+ expect(@node.index).to eql(2147483648)
129
+ end
130
+
131
+ it "is private" do
132
+ expect(@node.is_private?).to eql(true)
133
+ end
134
+
135
+ it "has a depth of 1" do
136
+ expect(@node.depth).to eql(1)
137
+ end
138
+
139
+ it "generates subnode" do
140
+ expect(@node.to_identifier).to eql("5c1bd648ed23aa5fd50ba52b2457c11e9e80a6a7")
141
+ expect(@node.to_fingerprint).to eql("5c1bd648")
142
+ expect(@node.to_address).to eql("19Q2WoS5hSS6T8GjhK8KZLMgmWaq4neXrh")
143
+ end
144
+
145
+ it "generates a private key" do
146
+ expect(@node.private_key.to_hex).to eql("edb2e14f9ee77d26dd93b4ecede8d16ed408ce149b6cd80b0715a2d911a0afea")
147
+ expect(@node.private_key.to_wif).to eql("L5BmPijJjrKbiUfG4zbiFKNqkvuJ8usooJmzuD7Z8dkRoTThYnAT")
148
+ end
149
+
150
+ it "generates a public key" do
151
+ expect(@node.public_key.to_hex).to eql("035a784662a4a20a65bf6aab9ae98a6c068a81c52e4b032c0fb5400c706cfccc56")
152
+ end
153
+
154
+ it "generates a chain code" do
155
+ expect(@node.chain_code_hex).to eql("47fdacbd0f1097043b78c63c20c34ef4ed9a111d980047ad16282c7ae6236141")
156
+ end
157
+
158
+ it "generates a serialized private key" do
159
+ expect(@node.to_serialized_hex(:private)).to eql("0488ade4013442193e8000000047fdacbd0f1097043b78c63c20c34ef4ed9a111d980047ad16282c7ae623614100edb2e14f9ee77d26dd93b4ecede8d16ed408ce149b6cd80b0715a2d911a0afea")
160
+ expect(@node.to_bip32(:private)).to eql("xprv9uHRZZhk6KAJC1avXpDAp4MDc3sQKNxDiPvvkX8Br5ngLNv1TxvUxt4cV1rGL5hj6KCesnDYUhd7oWgT11eZG7XnxHrnYeSvkzY7d2bhkJ7")
161
+ end
162
+
163
+ it "generates a serialized public_key" do
164
+ expect(@node.to_serialized_hex).to eql("0488b21e013442193e8000000047fdacbd0f1097043b78c63c20c34ef4ed9a111d980047ad16282c7ae6236141035a784662a4a20a65bf6aab9ae98a6c068a81c52e4b032c0fb5400c706cfccc56")
165
+ expect(@node.to_bip32).to eql("xpub68Gmy5EdvgibQVfPdqkBBCHxA5htiqg55crXYuXoQRKfDBFA1WEjWgP6LHhwBZeNK1VTsfTFUHCdrfp1bgwQ9xv5ski8PX9rL2dZXvgGDnw")
166
+ end
167
+ end
168
+
169
+ describe "m/0p.pub" do
170
+ before do
171
+ @node = @master.node_for_path "m/0p.pub"
172
+ end
173
+
174
+ it "has an index of 2147483648" do
175
+ expect(@node.index).to eql(2147483648)
176
+ end
177
+
178
+ it "is private" do
179
+ expect(@node.is_private?).to eql(true)
180
+ end
181
+
182
+ it "has a depth of 1" do
183
+ expect(@node.depth).to eql(1)
184
+ end
185
+
186
+ it "generates subnode" do
187
+ expect(@node.to_identifier).to eql("5c1bd648ed23aa5fd50ba52b2457c11e9e80a6a7")
188
+ expect(@node.to_fingerprint).to eql("5c1bd648")
189
+ expect(@node.to_address).to eql("19Q2WoS5hSS6T8GjhK8KZLMgmWaq4neXrh")
190
+ end
191
+
192
+ it "does not generate a private key" do
193
+ expect(@node.private_key).to be_nil
194
+ end
195
+
196
+ it "generates a public key" do
197
+ expect(@node.public_key.to_hex).to eql("035a784662a4a20a65bf6aab9ae98a6c068a81c52e4b032c0fb5400c706cfccc56")
198
+ end
199
+
200
+ it "generates a chain code" do
201
+ expect(@node.chain_code_hex).to eql("47fdacbd0f1097043b78c63c20c34ef4ed9a111d980047ad16282c7ae6236141")
202
+ end
203
+
204
+ it "does not generate a serialized private key" do
205
+ expect { @node.to_serialized_hex(:private) }.to raise_error(MoneyTree::Node::PrivatePublicMismatch)
206
+ end
207
+
208
+ it "generates a serialized public_key" do
209
+ expect(@node.to_serialized_hex).to eql("0488b21e013442193e8000000047fdacbd0f1097043b78c63c20c34ef4ed9a111d980047ad16282c7ae6236141035a784662a4a20a65bf6aab9ae98a6c068a81c52e4b032c0fb5400c706cfccc56")
210
+ expect(@node.to_bip32).to eql("xpub68Gmy5EdvgibQVfPdqkBBCHxA5htiqg55crXYuXoQRKfDBFA1WEjWgP6LHhwBZeNK1VTsfTFUHCdrfp1bgwQ9xv5ski8PX9rL2dZXvgGDnw")
211
+ end
212
+ end
213
+
214
+ describe "m/0'/1" do
215
+ before do
216
+ @node = @master.node_for_path "m/0'/1"
217
+ end
218
+
219
+ it "has an index of 1" do
220
+ expect(@node.index).to eql(1)
221
+ end
222
+
223
+ it "is public" do
224
+ expect(@node.is_private?).to eql(false)
225
+ end
226
+
227
+ it "has a depth of 2" do
228
+ expect(@node.depth).to eql(2)
229
+ end
230
+
231
+ it "generates subnode" do
232
+ expect(@node.to_identifier).to eql("bef5a2f9a56a94aab12459f72ad9cf8cf19c7bbe")
233
+ expect(@node.to_fingerprint).to eql("bef5a2f9")
234
+ expect(@node.to_address).to eql("1JQheacLPdM5ySCkrZkV66G2ApAXe1mqLj")
235
+ end
236
+
237
+ it "generates a private key" do
238
+ expect(@node.private_key.to_hex).to eql("3c6cb8d0f6a264c91ea8b5030fadaa8e538b020f0a387421a12de9319dc93368")
239
+ expect(@node.private_key.to_wif).to eql("KyFAjQ5rgrKvhXvNMtFB5PCSKUYD1yyPEe3xr3T34TZSUHycXtMM")
240
+ end
241
+
242
+ it "generates a public key" do
243
+ expect(@node.public_key.to_hex).to eql("03501e454bf00751f24b1b489aa925215d66af2234e3891c3b21a52bedb3cd711c")
244
+ end
245
+
246
+ it "generates a chain code" do
247
+ expect(@node.chain_code_hex).to eql("2a7857631386ba23dacac34180dd1983734e444fdbf774041578e9b6adb37c19")
248
+ end
249
+
250
+ it "generates a serialized private key" do
251
+ expect(@node.to_serialized_hex(:private)).to eql("0488ade4025c1bd648000000012a7857631386ba23dacac34180dd1983734e444fdbf774041578e9b6adb37c19003c6cb8d0f6a264c91ea8b5030fadaa8e538b020f0a387421a12de9319dc93368")
252
+ expect(@node.to_bip32(:private)).to eql("xprv9wTYmMFdV23N2TdNG573QoEsfRrWKQgWeibmLntzniatZvR9BmLnvSxqu53Kw1UmYPxLgboyZQaXwTCg8MSY3H2EU4pWcQDnRnrVA1xe8fs")
253
+ end
254
+
255
+ it "generates a serialized public_key" do
256
+ expect(@node.to_serialized_hex).to eql("0488b21e025c1bd648000000012a7857631386ba23dacac34180dd1983734e444fdbf774041578e9b6adb37c1903501e454bf00751f24b1b489aa925215d66af2234e3891c3b21a52bedb3cd711c")
257
+ expect(@node.to_bip32).to eql("xpub6ASuArnXKPbfEwhqN6e3mwBcDTgzisQN1wXN9BJcM47sSikHjJf3UFHKkNAWbWMiGj7Wf5uMash7SyYq527Hqck2AxYysAA7xmALppuCkwQ")
258
+ end
259
+ end
260
+
261
+ describe "M/0'/1" do
262
+ before do
263
+ @node = @master.node_for_path "M/0'/1"
264
+ end
265
+
266
+ it "has an index of 1" do
267
+ expect(@node.index).to eql(1)
268
+ end
269
+
270
+ it "is public" do
271
+ expect(@node.is_private?).to eql(false)
272
+ end
273
+
274
+ it "has a depth of 2" do
275
+ expect(@node.depth).to eql(2)
276
+ end
277
+
278
+ it "generates subnode" do
279
+ expect(@node.to_identifier).to eql("bef5a2f9a56a94aab12459f72ad9cf8cf19c7bbe")
280
+ expect(@node.to_fingerprint).to eql("bef5a2f9")
281
+ expect(@node.to_address).to eql("1JQheacLPdM5ySCkrZkV66G2ApAXe1mqLj")
282
+ end
283
+
284
+ it "does not generate a private key" do
285
+ expect(@node.private_key).to be_nil
286
+ end
287
+
288
+ it "generates a public key" do
289
+ expect(@node.public_key.to_hex).to eql("03501e454bf00751f24b1b489aa925215d66af2234e3891c3b21a52bedb3cd711c")
290
+ end
291
+
292
+ it "generates a chain code" do
293
+ expect(@node.chain_code_hex).to eql("2a7857631386ba23dacac34180dd1983734e444fdbf774041578e9b6adb37c19")
294
+ end
295
+
296
+ it "generates a serialized private key" do
297
+ expect { @node.to_serialized_hex(:private) }.to raise_error(MoneyTree::Node::PrivatePublicMismatch)
298
+ end
299
+
300
+ it "generates a serialized public_key" do
301
+ expect(@node.to_serialized_hex).to eql("0488b21e025c1bd648000000012a7857631386ba23dacac34180dd1983734e444fdbf774041578e9b6adb37c1903501e454bf00751f24b1b489aa925215d66af2234e3891c3b21a52bedb3cd711c")
302
+ expect(@node.to_bip32).to eql("xpub6ASuArnXKPbfEwhqN6e3mwBcDTgzisQN1wXN9BJcM47sSikHjJf3UFHKkNAWbWMiGj7Wf5uMash7SyYq527Hqck2AxYysAA7xmALppuCkwQ")
303
+ end
304
+ end
305
+
306
+ describe "m/0'/1/2p/2" do
307
+ before do
308
+ @node = @master.node_for_path "m/0'/1/2p/2"
309
+ end
310
+
311
+ it "has an index of 2" do
312
+ expect(@node.index).to eql(2)
313
+ end
314
+
315
+ it "is public" do
316
+ expect(@node.is_private?).to eql(false)
317
+ end
318
+
319
+ it "has a depth of 4" do
320
+ expect(@node.depth).to eql(4)
321
+ end
322
+
323
+ it "generates subnode" do
324
+ expect(@node.to_identifier).to eql("d880d7d893848509a62d8fb74e32148dac68412f")
325
+ expect(@node.to_fingerprint).to eql("d880d7d8")
326
+ expect(@node.to_address).to eql("1LjmJcdPnDHhNTUgrWyhLGnRDKxQjoxAgt")
327
+ end
328
+
329
+ it "generates a private key" do
330
+ expect(@node.private_key.to_hex).to eql("0f479245fb19a38a1954c5c7c0ebab2f9bdfd96a17563ef28a6a4b1a2a764ef4")
331
+ expect(@node.private_key.to_wif).to eql("KwjQsVuMjbCP2Zmr3VaFaStav7NvevwjvvkqrWd5Qmh1XVnCteBR")
332
+ end
333
+
334
+ it "generates a public key" do
335
+ expect(@node.public_key.to_hex).to eql("02e8445082a72f29b75ca48748a914df60622a609cacfce8ed0e35804560741d29")
336
+ end
337
+
338
+ it "generates a chain code" do
339
+ expect(@node.chain_code_hex).to eql("cfb71883f01676f587d023cc53a35bc7f88f724b1f8c2892ac1275ac822a3edd")
340
+ end
341
+
342
+ it "generates a serialized private key" do
343
+ expect(@node.to_serialized_hex(:private)).to eql("0488ade404ee7ab90c00000002cfb71883f01676f587d023cc53a35bc7f88f724b1f8c2892ac1275ac822a3edd000f479245fb19a38a1954c5c7c0ebab2f9bdfd96a17563ef28a6a4b1a2a764ef4")
344
+ expect(@node.to_bip32(:private)).to eql("xprvA2JDeKCSNNZky6uBCviVfJSKyQ1mDYahRjijr5idH2WwLsEd4Hsb2Tyh8RfQMuPh7f7RtyzTtdrbdqqsunu5Mm3wDvUAKRHSC34sJ7in334")
345
+ end
346
+
347
+ it "generates a serialized public_key" do
348
+ expect(@node.to_serialized_hex).to eql("0488b21e04ee7ab90c00000002cfb71883f01676f587d023cc53a35bc7f88f724b1f8c2892ac1275ac822a3edd02e8445082a72f29b75ca48748a914df60622a609cacfce8ed0e35804560741d29")
349
+ expect(@node.to_bip32).to eql("xpub6FHa3pjLCk84BayeJxFW2SP4XRrFd1JYnxeLeU8EqN3vDfZmbqBqaGJAyiLjTAwm6ZLRQUMv1ZACTj37sR62cfN7fe5JnJ7dh8zL4fiyLHV")
350
+ end
351
+ end
352
+
353
+ describe "m/0'/1/2'/2/1000000000" do
354
+ before do
355
+ @node = @master.node_for_path "m/0'/1/2'/2/1000000000"
356
+ end
357
+
358
+ it "has an index of 1000000000" do
359
+ expect(@node.index).to eql(1000000000)
360
+ end
361
+
362
+ it "is public" do
363
+ expect(@node.is_private?).to eql(false)
364
+ end
365
+
366
+ it "has a depth of 2" do
367
+ expect(@node.depth).to eql(5)
368
+ end
369
+
370
+ it "generates subnode" do
371
+ expect(@node.to_identifier).to eql("d69aa102255fed74378278c7812701ea641fdf32")
372
+ expect(@node.to_fingerprint).to eql("d69aa102")
373
+ expect(@node.to_address).to eql("1LZiqrop2HGR4qrH1ULZPyBpU6AUP49Uam")
374
+ end
375
+
376
+ it "generates a private key" do
377
+ expect(@node.private_key.to_hex).to eql("471b76e389e528d6de6d816857e012c5455051cad6660850e58372a6c3e6e7c8")
378
+ expect(@node.private_key.to_wif).to eql("Kybw8izYevo5xMh1TK7aUr7jHFCxXS1zv8p3oqFz3o2zFbhRXHYs")
379
+ end
380
+
381
+ it "generates a public key" do
382
+ expect(@node.public_key.to_hex).to eql("022a471424da5e657499d1ff51cb43c47481a03b1e77f951fe64cec9f5a48f7011")
383
+ end
384
+
385
+ it "generates a chain code" do
386
+ expect(@node.chain_code_hex).to eql("c783e67b921d2beb8f6b389cc646d7263b4145701dadd2161548a8b078e65e9e")
387
+ end
388
+
389
+ it "generates a serialized private key" do
390
+ expect(@node.to_serialized_hex(:private)).to eql("0488ade405d880d7d83b9aca00c783e67b921d2beb8f6b389cc646d7263b4145701dadd2161548a8b078e65e9e00471b76e389e528d6de6d816857e012c5455051cad6660850e58372a6c3e6e7c8")
391
+ expect(@node.to_bip32(:private)).to eql("xprvA41z7zogVVwxVSgdKUHDy1SKmdb533PjDz7J6N6mV6uS3ze1ai8FHa8kmHScGpWmj4WggLyQjgPie1rFSruoUihUZREPSL39UNdE3BBDu76")
392
+ end
393
+
394
+ it "generates a serialized public_key" do
395
+ expect(@node.to_serialized_hex).to eql("0488b21e05d880d7d83b9aca00c783e67b921d2beb8f6b389cc646d7263b4145701dadd2161548a8b078e65e9e022a471424da5e657499d1ff51cb43c47481a03b1e77f951fe64cec9f5a48f7011")
396
+ expect(@node.to_bip32).to eql("xpub6H1LXWLaKsWFhvm6RVpEL9P4KfRZSW7abD2ttkWP3SSQvnyA8FSVqNTEcYFgJS2UaFcxupHiYkro49S8yGasTvXEYBVPamhGW6cFJodrTHy")
397
+ end
398
+ end
399
+ end
400
+ end
401
+
402
+ describe "Test vector 2" do
403
+ describe "from a seed" do
404
+ before do
405
+ @master = MoneyTree::Master.new seed_hex: "fffcf9f6f3f0edeae7e4e1dedbd8d5d2cfccc9c6c3c0bdbab7b4b1aeaba8a5a29f9c999693908d8a8784817e7b7875726f6c696663605d5a5754514e4b484542"
406
+ end
407
+
408
+ describe "m" do
409
+ it "has an index of 0" do
410
+ expect(@master.index).to eql(0)
411
+ end
412
+
413
+ it "has a depth of 0" do
414
+ expect(@master.depth).to eql(0)
415
+ end
416
+
417
+ it "is private" do
418
+ expect(@master.is_private?).to eql(true)
419
+ end
420
+
421
+ it "generates master node (Master)" do
422
+ expect(@master.to_identifier).to eql("bd16bee53961a47d6ad888e29545434a89bdfe95")
423
+ expect(@master.to_fingerprint).to eql("bd16bee5")
424
+ expect(@master.to_address).to eql("1JEoxevbLLG8cVqeoGKQiAwoWbNYSUyYjg")
425
+ end
426
+
427
+ it "generates compressed and uncompressed addresses" do
428
+ expect(@master.to_address).to eql("1JEoxevbLLG8cVqeoGKQiAwoWbNYSUyYjg")
429
+ expect(@master.to_address(true)).to eql("1JEoxevbLLG8cVqeoGKQiAwoWbNYSUyYjg")
430
+ expect(@master.to_address(false)).to eql("1AEg9dFEw29kMgaN4BNHALu7AzX5XUfzSU")
431
+ end
432
+
433
+ it "generates a secret key" do
434
+ expect(@master.private_key.to_hex).to eql("4b03d6fc340455b363f51020ad3ecca4f0850280cf436c70c727923f6db46c3e")
435
+ expect(@master.private_key.to_wif).to eql("KyjXhyHF9wTphBkfpxjL8hkDXDUSbE3tKANT94kXSyh6vn6nKaoy")
436
+ end
437
+
438
+ it "generates a public key" do
439
+ expect(@master.public_key.to_hex).to eql("03cbcaa9c98c877a26977d00825c956a238e8dddfbd322cce4f74b0b5bd6ace4a7")
440
+ end
441
+
442
+ it "generates a chain code" do
443
+ expect(@master.chain_code_hex).to eql("60499f801b896d83179a4374aeb7822aaeaceaa0db1f85ee3e904c4defbd9689")
444
+ end
445
+
446
+ it "generates a serialized private key" do
447
+ expect(@master.to_serialized_hex(:private)).to eql("0488ade400000000000000000060499f801b896d83179a4374aeb7822aaeaceaa0db1f85ee3e904c4defbd9689004b03d6fc340455b363f51020ad3ecca4f0850280cf436c70c727923f6db46c3e")
448
+ expect(@master.to_bip32(:private)).to eql("xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U")
449
+ end
450
+
451
+ it "generates a serialized public_key" do
452
+ expect(@master.to_serialized_hex).to eql("0488b21e00000000000000000060499f801b896d83179a4374aeb7822aaeaceaa0db1f85ee3e904c4defbd968903cbcaa9c98c877a26977d00825c956a238e8dddfbd322cce4f74b0b5bd6ace4a7")
453
+ expect(@master.to_bip32).to eql("xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB")
454
+ end
455
+ end
456
+
457
+ describe "m/0 (testing imported private key)" do
458
+ before do
459
+ @master = MoneyTree::Master.new private_key: @master.private_key, chain_code: @master.chain_code
460
+ @node = @master.node_for_path "m/0"
461
+ end
462
+
463
+ it "has an index of 0" do
464
+ expect(@node.index).to eql(0)
465
+ end
466
+
467
+ it "has a depth of 1" do
468
+ expect(@node.depth).to eql(1)
469
+ end
470
+
471
+ it "is public" do
472
+ expect(@node.is_private?).to eql(false)
473
+ end
474
+
475
+ it "generates subnode" do
476
+ expect(@node.to_identifier).to eql("5a61ff8eb7aaca3010db97ebda76121610b78096")
477
+ expect(@node.to_fingerprint).to eql("5a61ff8e")
478
+ expect(@node.to_address).to eql("19EuDJdgfRkwCmRzbzVBHZWQG9QNWhftbZ")
479
+ end
480
+
481
+ it "generates a private key" do
482
+ expect(@node.private_key.to_hex).to eql("abe74a98f6c7eabee0428f53798f0ab8aa1bd37873999041703c742f15ac7e1e")
483
+ expect(@node.private_key.to_wif).to eql("L2ysLrR6KMSAtx7uPqmYpoTeiRzydXBattRXjXz5GDFPrdfPzKbj")
484
+ end
485
+
486
+ it "generates a public key" do
487
+ expect(@node.public_key.to_hex).to eql("02fc9e5af0ac8d9b3cecfe2a888e2117ba3d089d8585886c9c826b6b22a98d12ea")
488
+ end
489
+
490
+ it "generates a chain code" do
491
+ expect(@node.chain_code_hex).to eql("f0909affaa7ee7abe5dd4e100598d4dc53cd709d5a5c2cac40e7412f232f7c9c")
492
+ end
493
+
494
+ it "generates a serialized private key" do
495
+ expect(@node.to_serialized_hex(:private)).to eql("0488ade401bd16bee500000000f0909affaa7ee7abe5dd4e100598d4dc53cd709d5a5c2cac40e7412f232f7c9c00abe74a98f6c7eabee0428f53798f0ab8aa1bd37873999041703c742f15ac7e1e")
496
+ expect(@node.to_bip32(:private)).to eql("xprv9vHkqa6EV4sPZHYqZznhT2NPtPCjKuDKGY38FBWLvgaDx45zo9WQRUT3dKYnjwih2yJD9mkrocEZXo1ex8G81dwSM1fwqWpWkeS3v86pgKt")
497
+ end
498
+
499
+ it "generates a serialized public_key" do
500
+ expect(@node.to_serialized_hex).to eql("0488b21e01bd16bee500000000f0909affaa7ee7abe5dd4e100598d4dc53cd709d5a5c2cac40e7412f232f7c9c02fc9e5af0ac8d9b3cecfe2a888e2117ba3d089d8585886c9c826b6b22a98d12ea")
501
+ expect(@node.to_bip32).to eql("xpub69H7F5d8KSRgmmdJg2KhpAK8SR3DjMwAdkxj3ZuxV27CprR9LgpeyGmXUbC6wb7ERfvrnKZjXoUmmDznezpbZb7ap6r1D3tgFxHmwMkQTPH")
502
+ end
503
+ end
504
+
505
+ describe "M/0 (testing import of public key)" do
506
+ before do
507
+ @master = MoneyTree::Master.new public_key: "03cbcaa9c98c877a26977d00825c956a238e8dddfbd322cce4f74b0b5bd6ace4a7", chain_code: @master.chain_code
508
+ @node = @master.node_for_path "M/0"
509
+ end
510
+
511
+ it "has an index of 0" do
512
+ expect(@node.index).to eql(0)
513
+ end
514
+
515
+ it "has a depth of 1" do
516
+ expect(@node.depth).to eql(1)
517
+ end
518
+
519
+ it "is public" do
520
+ expect(@node.is_private?).to eql(false)
521
+ end
522
+
523
+ it "generates subnode" do
524
+ expect(@node.to_identifier).to eql("5a61ff8eb7aaca3010db97ebda76121610b78096")
525
+ expect(@node.to_fingerprint).to eql("5a61ff8e")
526
+ expect(@node.to_address).to eql("19EuDJdgfRkwCmRzbzVBHZWQG9QNWhftbZ")
527
+ end
528
+
529
+ it "does not generate a private key" do
530
+ expect(@node.private_key).to be_nil
531
+ end
532
+
533
+ it "generates a public key" do
534
+ expect(@node.public_key.to_hex).to eql("02fc9e5af0ac8d9b3cecfe2a888e2117ba3d089d8585886c9c826b6b22a98d12ea")
535
+ end
536
+
537
+ it "generates a chain code" do
538
+ expect(@node.chain_code_hex).to eql("f0909affaa7ee7abe5dd4e100598d4dc53cd709d5a5c2cac40e7412f232f7c9c")
539
+ end
540
+
541
+ it "does not generate a serialized private key" do
542
+ expect { @node.to_serialized_hex(:private) }.to raise_error(MoneyTree::Node::PrivatePublicMismatch)
543
+ expect { @node.to_bip32(:private) }.to raise_error(MoneyTree::Node::PrivatePublicMismatch)
544
+ end
545
+
546
+ it "generates a serialized public_key" do
547
+ expect(@node.to_serialized_hex).to eql("0488b21e01bd16bee500000000f0909affaa7ee7abe5dd4e100598d4dc53cd709d5a5c2cac40e7412f232f7c9c02fc9e5af0ac8d9b3cecfe2a888e2117ba3d089d8585886c9c826b6b22a98d12ea")
548
+ expect(@node.to_bip32).to eql("xpub69H7F5d8KSRgmmdJg2KhpAK8SR3DjMwAdkxj3ZuxV27CprR9LgpeyGmXUbC6wb7ERfvrnKZjXoUmmDznezpbZb7ap6r1D3tgFxHmwMkQTPH")
549
+ end
550
+ end
551
+
552
+ describe "m/0/2147483647'" do
553
+ before do
554
+ @node = @master.node_for_path "m/0/2147483647'"
555
+ end
556
+
557
+ it "has an index of 2147483647" do
558
+ expect(@node.index).to eql(4294967295)
559
+ end
560
+
561
+ it "has a depth of 2" do
562
+ expect(@node.depth).to eql(2)
563
+ end
564
+
565
+ it "is private" do
566
+ expect(@node.is_private?).to eql(true)
567
+ end
568
+
569
+ it "generates subnode" do
570
+ expect(@node.to_identifier).to eql("d8ab493736da02f11ed682f88339e720fb0379d1")
571
+ expect(@node.to_fingerprint).to eql("d8ab4937")
572
+ expect(@node.to_address).to eql("1Lke9bXGhn5VPrBuXgN12uGUphrttUErmk")
573
+ end
574
+
575
+ it "generates a private key" do
576
+ expect(@node.private_key.to_hex).to eql("877c779ad9687164e9c2f4f0f4ff0340814392330693ce95a58fe18fd52e6e93")
577
+ expect(@node.private_key.to_wif).to eql("L1m5VpbXmMp57P3knskwhoMTLdhAAaXiHvnGLMribbfwzVRpz2Sr")
578
+ end
579
+
580
+ it "generates a public key" do
581
+ expect(@node.public_key.to_hex).to eql("03c01e7425647bdefa82b12d9bad5e3e6865bee0502694b94ca58b666abc0a5c3b")
582
+ end
583
+
584
+ it "generates a chain code" do
585
+ expect(@node.chain_code_hex).to eql("be17a268474a6bb9c61e1d720cf6215e2a88c5406c4aee7b38547f585c9a37d9")
586
+ end
587
+
588
+ it "generates a serialized private key" do
589
+ expect(@node.to_serialized_hex(:private)).to eql("0488ade4025a61ff8effffffffbe17a268474a6bb9c61e1d720cf6215e2a88c5406c4aee7b38547f585c9a37d900877c779ad9687164e9c2f4f0f4ff0340814392330693ce95a58fe18fd52e6e93")
590
+ expect(@node.to_bip32(:private)).to eql("xprv9wSp6B7kry3Vj9m1zSnLvN3xH8RdsPP1Mh7fAaR7aRLcQMKTR2vidYEeEg2mUCTAwCd6vnxVrcjfy2kRgVsFawNzmjuHc2YmYRmagcEPdU9")
591
+ end
592
+
593
+ it "generates a serialized public_key" do
594
+ expect(@node.to_serialized_hex).to eql("0488b21e025a61ff8effffffffbe17a268474a6bb9c61e1d720cf6215e2a88c5406c4aee7b38547f585c9a37d903c01e7425647bdefa82b12d9bad5e3e6865bee0502694b94ca58b666abc0a5c3b")
595
+ expect(@node.to_bip32).to eql("xpub6ASAVgeehLbnwdqV6UKMHVzgqAG8Gr6riv3Fxxpj8ksbH9ebxaEyBLZ85ySDhKiLDBrQSARLq1uNRts8RuJiHjaDMBU4Zn9h8LZNnBC5y4a")
596
+ end
597
+ end
598
+
599
+ describe "m/0/2147483647'/1" do
600
+ before do
601
+ @node = @master.node_for_path "m/0/2147483647'/1"
602
+ end
603
+
604
+ it "has an index of 1" do
605
+ expect(@node.index).to eql(1)
606
+ end
607
+
608
+ it "has a depth of 3" do
609
+ expect(@node.depth).to eql(3)
610
+ end
611
+
612
+ it "is private" do
613
+ expect(@node.is_private?).to eql(false)
614
+ end
615
+
616
+ it "generates subnode" do
617
+ expect(@node.to_identifier).to eql("78412e3a2296a40de124307b6485bd19833e2e34")
618
+ expect(@node.to_fingerprint).to eql("78412e3a")
619
+ expect(@node.to_address).to eql("1BxrAr2pHpeBheusmd6fHDP2tSLAUa3qsW")
620
+ end
621
+
622
+ it "generates a private key" do
623
+ expect(@node.private_key.to_hex).to eql("704addf544a06e5ee4bea37098463c23613da32020d604506da8c0518e1da4b7")
624
+ expect(@node.private_key.to_wif).to eql("KzyzXnznxSv249b4KuNkBwowaN3akiNeEHy5FWoPCJpStZbEKXN2")
625
+ end
626
+
627
+ it "generates a public key" do
628
+ expect(@node.public_key.to_hex).to eql("03a7d1d856deb74c508e05031f9895dab54626251b3806e16b4bd12e781a7df5b9")
629
+ end
630
+
631
+ it "generates a chain code" do
632
+ expect(@node.chain_code_hex).to eql("f366f48f1ea9f2d1d3fe958c95ca84ea18e4c4ddb9366c336c927eb246fb38cb")
633
+ end
634
+
635
+ it "generates a serialized private key" do
636
+ expect(@node.to_serialized_hex(:private)).to eql("0488ade403d8ab493700000001f366f48f1ea9f2d1d3fe958c95ca84ea18e4c4ddb9366c336c927eb246fb38cb00704addf544a06e5ee4bea37098463c23613da32020d604506da8c0518e1da4b7")
637
+ expect(@node.to_bip32(:private)).to eql("xprv9zFnWC6h2cLgpmSA46vutJzBcfJ8yaJGg8cX1e5StJh45BBciYTRXSd25UEPVuesF9yog62tGAQtHjXajPPdbRCHuWS6T8XA2ECKADdw4Ef")
638
+ end
639
+
640
+ it "generates a serialized public_key" do
641
+ expect(@node.to_serialized_hex).to eql("0488b21e03d8ab493700000001f366f48f1ea9f2d1d3fe958c95ca84ea18e4c4ddb9366c336c927eb246fb38cb03a7d1d856deb74c508e05031f9895dab54626251b3806e16b4bd12e781a7df5b9")
642
+ expect(@node.to_bip32).to eql("xpub6DF8uhdarytz3FWdA8TvFSvvAh8dP3283MY7p2V4SeE2wyWmG5mg5EwVvmdMVCQcoNJxGoWaU9DCWh89LojfZ537wTfunKau47EL2dhHKon")
643
+ end
644
+ end
645
+
646
+ describe "m/0/2147483647p/1/2147483646p" do
647
+ before do
648
+ @node = @master.node_for_path "m/0/2147483647p/1/2147483646p"
649
+ end
650
+
651
+ it "has an index of 4294967294" do
652
+ expect(@node.index).to eql(4294967294)
653
+ end
654
+
655
+ it "has a depth of 4" do
656
+ expect(@node.depth).to eql(4)
657
+ end
658
+
659
+ it "is private" do
660
+ expect(@node.is_private?).to eql(true)
661
+ end
662
+
663
+ it "generates subnode" do
664
+ expect(@node.to_identifier).to eql("31a507b815593dfc51ffc7245ae7e5aee304246e")
665
+ expect(@node.to_fingerprint).to eql("31a507b8")
666
+ expect(@node.to_address).to eql("15XVotxCAV7sRx1PSCkQNsGw3W9jT9A94R")
667
+ end
668
+
669
+ it "generates a private key" do
670
+ expect(@node.private_key.to_hex).to eql("f1c7c871a54a804afe328b4c83a1c33b8e5ff48f5087273f04efa83b247d6a2d")
671
+ expect(@node.private_key.to_wif).to eql("L5KhaMvPYRW1ZoFmRjUtxxPypQ94m6BcDrPhqArhggdaTbbAFJEF")
672
+ end
673
+
674
+ it "generates a public key" do
675
+ expect(@node.public_key.to_hex).to eql("02d2b36900396c9282fa14628566582f206a5dd0bcc8d5e892611806cafb0301f0")
676
+ end
677
+
678
+ it "generates a chain code" do
679
+ expect(@node.chain_code_hex).to eql("637807030d55d01f9a0cb3a7839515d796bd07706386a6eddf06cc29a65a0e29")
680
+ end
681
+
682
+ it "generates a serialized private key" do
683
+ expect(@node.to_serialized_hex(:private)).to eql("0488ade40478412e3afffffffe637807030d55d01f9a0cb3a7839515d796bd07706386a6eddf06cc29a65a0e2900f1c7c871a54a804afe328b4c83a1c33b8e5ff48f5087273f04efa83b247d6a2d")
684
+ expect(@node.to_bip32(:private)).to eql("xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc")
685
+ end
686
+
687
+ it "generates a serialized public_key" do
688
+ expect(@node.to_serialized_hex).to eql("0488b21e0478412e3afffffffe637807030d55d01f9a0cb3a7839515d796bd07706386a6eddf06cc29a65a0e2902d2b36900396c9282fa14628566582f206a5dd0bcc8d5e892611806cafb0301f0")
689
+ expect(@node.to_bip32).to eql("xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL")
690
+ end
691
+ end
692
+
693
+ describe "m/0/2147483647p/1/2147483646p/2" do
694
+ before do
695
+ @node = @master.node_for_path "m/0/2147483647p/1/2147483646p/2"
696
+ end
697
+
698
+ it "has an index of 2" do
699
+ expect(@node.index).to eql(2)
700
+ end
701
+
702
+ it "has a depth of 4" do
703
+ expect(@node.depth).to eql(5)
704
+ end
705
+
706
+ it "is public" do
707
+ expect(@node.is_private?).to eql(false)
708
+ end
709
+
710
+ it "generates subnode" do
711
+ expect(@node.to_identifier).to eql("26132fdbe7bf89cbc64cf8dafa3f9f88b8666220")
712
+ expect(@node.to_fingerprint).to eql("26132fdb")
713
+ expect(@node.to_address).to eql("14UKfRV9ZPUp6ZC9PLhqbRtxdihW9em3xt")
714
+ end
715
+
716
+ it "generates a private key" do
717
+ expect(@node.private_key.to_hex).to eql("bb7d39bdb83ecf58f2fd82b6d918341cbef428661ef01ab97c28a4842125ac23")
718
+ expect(@node.private_key.to_wif).to eql("L3WAYNAZPxx1fr7KCz7GN9nD5qMBnNiqEJNJMU1z9MMaannAt4aK")
719
+ end
720
+
721
+ it "generates a public key" do
722
+ expect(@node.public_key.to_hex).to eql("024d902e1a2fc7a8755ab5b694c575fce742c48d9ff192e63df5193e4c7afe1f9c")
723
+ end
724
+
725
+ it "generates a chain code" do
726
+ expect(@node.chain_code_hex).to eql("9452b549be8cea3ecb7a84bec10dcfd94afe4d129ebfd3b3cb58eedf394ed271")
727
+ end
728
+
729
+ it "generates a serialized private key" do
730
+ expect(@node.to_serialized_hex(:private)).to eql("0488ade40531a507b8000000029452b549be8cea3ecb7a84bec10dcfd94afe4d129ebfd3b3cb58eedf394ed27100bb7d39bdb83ecf58f2fd82b6d918341cbef428661ef01ab97c28a4842125ac23")
731
+ expect(@node.to_bip32(:private)).to eql("xprvA2nrNbFZABcdryreWet9Ea4LvTJcGsqrMzxHx98MMrotbir7yrKCEXw7nadnHM8Dq38EGfSh6dqA9QWTyefMLEcBYJUuekgW4BYPJcr9E7j")
732
+ end
733
+
734
+ it "generates a serialized public_key" do
735
+ expect(@node.to_serialized_hex).to eql("0488b21e0531a507b8000000029452b549be8cea3ecb7a84bec10dcfd94afe4d129ebfd3b3cb58eedf394ed271024d902e1a2fc7a8755ab5b694c575fce742c48d9ff192e63df5193e4c7afe1f9c")
736
+ expect(@node.to_bip32).to eql("xpub6FnCn6nSzZAw5Tw7cgR9bi15UV96gLZhjDstkXXxvCLsUXBGXPdSnLFbdpq8p9HmGsApME5hQTZ3emM2rnY5agb9rXpVGyy3bdW6EEgAtqt")
737
+ end
738
+ end
739
+ end
740
+ end
741
+
742
+ describe "negative index" do
743
+ before do
744
+ @master = MoneyTree::Master.new seed_hex: "000102030405060708090a0b0c0d0e0f"
745
+ @node = @master.node_for_path "m/0'/-1"
746
+ end
747
+
748
+ it "has an index of 1" do
749
+ expect(@node.index).to eql(-1)
750
+ end
751
+
752
+ it "is public" do
753
+ expect(@node.is_private?).to eql(true)
754
+ end
755
+
756
+ it "has a depth of 2" do
757
+ expect(@node.depth).to eql(2)
758
+ end
759
+
760
+ it "generates a serialized private key" do
761
+ expect(@node.to_serialized_hex(:private)).to eql("0488ade4025c1bd648ffffffff0f9ca680ee23c81a305d96b86f811947e65590200b6f74d66ecf83936313a9c900235893db08ad0efc6ae4a1eac5b31a90a7d0906403d139d4d7f3c6796fb42c4e")
762
+ expect(@node.to_bip32(:private)).to eql("xprv9wTYmMFvAM7JHf3RuUidc24a4y2t4gN7aNP5ABreWAqt6BUBcf6xE8RNQxj2vUssYWM8iAZiZi5H1fmKkkpXjtwDCDv1pg8fSfQMk9rhHYt")
763
+ end
764
+
765
+ it "generates a serialized public_key" do
766
+ expect(@node.to_serialized_hex).to eql("0488b21e025c1bd648ffffffff0f9ca680ee23c81a305d96b86f811947e65590200b6f74d66ecf83936313a9c902adb7979a5e99bf8acdfec3680bf482feac9898b28808c22d47db62e98de5d3fa")
767
+ expect(@node.to_bip32).to eql("xpub6ASuArnozifbW97u1WFdyA1JczsNU95xwbJfxaGG4WNrxyoLACRCmvjrGEojsRsoZULf5FyZXv6AWAtce2UErsshvkpjNaT1fP6sMgTZdc1")
768
+ end
769
+ end
770
+
771
+ describe "importing node" do
772
+ describe ".from_bip32(address)" do
773
+ it "imports a valid private node address" do
774
+ @node = MoneyTree::Node.from_bip32 "xprv9uHRZZhk6KAJC1avXpDAp4MDc3sQKNxDiPvvkX8Br5ngLNv1TxvUxt4cV1rGL5hj6KCesnDYUhd7oWgT11eZG7XnxHrnYeSvkzY7d2bhkJ7"
775
+ expect(@node.private_key.to_hex).to eql("edb2e14f9ee77d26dd93b4ecede8d16ed408ce149b6cd80b0715a2d911a0afea")
776
+ expect(@node.index).to eql(2147483648)
777
+ expect(@node.is_private?).to eql(true)
778
+ expect(@node.depth).to eql(1)
779
+ expect(@node.public_key.to_hex).to eql("035a784662a4a20a65bf6aab9ae98a6c068a81c52e4b032c0fb5400c706cfccc56")
780
+ expect(@node.chain_code_hex).to eql("47fdacbd0f1097043b78c63c20c34ef4ed9a111d980047ad16282c7ae6236141")
781
+ expect(@node.parent_fingerprint).to eql("3442193e")
782
+ end
783
+
784
+ it "imports a valid public node address" do
785
+ @node = MoneyTree::Node.from_bip32 "xpub68Gmy5EdvgibQVfPdqkBBCHxA5htiqg55crXYuXoQRKfDBFA1WEjWgP6LHhwBZeNK1VTsfTFUHCdrfp1bgwQ9xv5ski8PX9rL2dZXvgGDnw"
786
+ expect(@node.private_key).to be_nil
787
+ expect(@node.index).to eql(2147483648)
788
+ expect(@node.is_private?).to eql(true)
789
+ expect(@node.depth).to eql(1)
790
+ expect(@node.public_key.to_hex).to eql("035a784662a4a20a65bf6aab9ae98a6c068a81c52e4b032c0fb5400c706cfccc56")
791
+ expect(@node.chain_code_hex).to eql("47fdacbd0f1097043b78c63c20c34ef4ed9a111d980047ad16282c7ae6236141")
792
+ expect(@node.parent_fingerprint).to eql("3442193e")
793
+ end
794
+ end
795
+ end
796
+
797
+ describe "deriving a child node" do
798
+ describe "#node_for_path" do
799
+ it "correctly derives from a node with a chain code represented in 31 bytes" do
800
+ @node = MoneyTree::Node.from_bip32 "tpubD6NzVbkrYhZ4WM42MZZmUZ7LjxyjBf5bGjEeLf9nJnMZqocGJWu94drvpqWsE9jE7k3h22v6gjpPGnqgBrqwGsRYwDXVRfQ2M9dfHbXP5zA"
801
+ @subnode = @node.node_for_path('m/1')
802
+ expect(@subnode.to_bip32(network: :bitcoin_testnet)).to eql("tpubDA7bCxb3Nrcz2ChXyPqXxbG4q5oiAZUHR7wD3LAiXukuxmT65weWw84XYmjhkJTkJEM6LhNWioWTpKEkQp7j2fgVccj3PPc271xHDeMsaTY")
803
+ end
804
+ end
805
+ end
806
+ end
807
+ end