money-tree 0.8.8 → 0.8.9
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.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/lib/money-tree/key.rb +3 -0
- data/lib/money-tree/node.rb +8 -7
- data/lib/money-tree/version.rb +1 -1
- data/lib/openssl_extensions.rb +18 -3
- data/spec/lib/money-tree/address_spec.rb +16 -16
- data/spec/lib/money-tree/node_spec.rb +245 -229
- data/spec/lib/money-tree/openssl_extensions_spec.rb +23 -0
- data/spec/lib/money-tree/private_key_spec.rb +19 -19
- data/spec/lib/money-tree/public_key_spec.rb +30 -26
- data/spec/lib/money-tree/support_spec.rb +7 -7
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d626fc55825195bcbd6c57406598ed66ed9ebeaf
|
4
|
+
data.tar.gz: b1e82a84328bf2fcf4366ccf7995a156f5a09b43
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 56e979b90b695673384164ef2c371160ae8d9988b7c9f7b4dcc4f0822c1619fbee7b0c0698605f3edd5fde8cd7f09f88233e83477e6537bb1e50ae60f19d9f22
|
7
|
+
data.tar.gz: 04d26f09a34e7b51cd4f42ff33b7b942a19b4d710f07738b29d5e60c02086e2f4d7ea271139a665f1195ef4bce8ce9264da4cc715bdb2dfcfc8c16903a4e1e09
|
data/README.md
CHANGED
@@ -153,7 +153,7 @@ In HD wallets, chain codes are the mathematical glue that binds a parent node to
|
|
153
153
|
You don't need to worry about chain codes if you are creating or importing from a Master key (it's always the same for all HD wallet master keys), however if you are trying to import a derived child key at some lower depth in the tree, you'll need the chain code. Luckily, whenever we export a node to a wallet file, we encode it in a special format that includes all of the relevant info (including chain code) that we need to reconstruct the node in a single convenient serialized address.
|
154
154
|
|
155
155
|
#### Serialized Addresses
|
156
|
-
|
156
|
+
Because we need multiple pieces of info to reconstruct nodes in a tree, when we're dealing with HD wallets, we pass around a serialized address format that encodes both the key and the chain code. It looks like this:
|
157
157
|
|
158
158
|
```ruby
|
159
159
|
# private key
|
data/lib/money-tree/key.rb
CHANGED
@@ -198,6 +198,9 @@ module MoneyTree
|
|
198
198
|
@group = PKey::EC::Group.new GROUP_NAME
|
199
199
|
@key = parse_raw_key
|
200
200
|
end
|
201
|
+
|
202
|
+
@options[:network] = @network_key # remember for deep clone
|
203
|
+
|
201
204
|
raise ArgumentError, "Must initialize with a MoneyTree::PrivateKey or a public key value" if @key.nil?
|
202
205
|
end
|
203
206
|
|
data/lib/money-tree/node.rb
CHANGED
@@ -84,7 +84,7 @@ module MoneyTree
|
|
84
84
|
|
85
85
|
def derive_private_key(i = 0)
|
86
86
|
message = i >= 0x80000000 || i < 0 ? private_derivation_message(i) : public_derivation_message(i)
|
87
|
-
hash = hmac_sha512
|
87
|
+
hash = hmac_sha512 hex_to_bytes(chain_code_hex), message
|
88
88
|
left_int = left_from_hash(hash)
|
89
89
|
raise InvalidKeyForIndex, 'greater than or equal to order' if left_int >= MoneyTree::Key::ORDER # very low probability
|
90
90
|
child_private_key = (left_int + private_key.to_i) % MoneyTree::Key::ORDER
|
@@ -96,7 +96,7 @@ module MoneyTree
|
|
96
96
|
def derive_public_key(i = 0)
|
97
97
|
raise PrivatePublicMismatch if i >= 0x80000000
|
98
98
|
message = public_derivation_message(i)
|
99
|
-
hash = hmac_sha512
|
99
|
+
hash = hmac_sha512 hex_to_bytes(chain_code_hex), message
|
100
100
|
left_int = left_from_hash(hash)
|
101
101
|
raise InvalidKeyForIndex, 'greater than or equal to order' if left_int >= MoneyTree::Key::ORDER # very low probability
|
102
102
|
factor = BN.new left_int.to_s
|
@@ -129,9 +129,10 @@ module MoneyTree
|
|
129
129
|
raise PrivatePublicMismatch if type.to_sym == :private && private_key.nil?
|
130
130
|
to_serialized_base58 to_serialized_hex(type)
|
131
131
|
end
|
132
|
-
|
133
|
-
def to_identifier
|
134
|
-
public_key.compressed.
|
132
|
+
|
133
|
+
def to_identifier(compressed=true)
|
134
|
+
key = compressed ? public_key.compressed : public_key.uncompressed
|
135
|
+
key.to_ripemd160
|
135
136
|
end
|
136
137
|
|
137
138
|
def to_fingerprint
|
@@ -146,8 +147,8 @@ module MoneyTree
|
|
146
147
|
end
|
147
148
|
end
|
148
149
|
|
149
|
-
def to_address
|
150
|
-
address = network[:address_version] + to_identifier
|
150
|
+
def to_address(compressed=true)
|
151
|
+
address = network[:address_version] + to_identifier(compressed)
|
151
152
|
to_serialized_base58 address
|
152
153
|
end
|
153
154
|
|
data/lib/money-tree/version.rb
CHANGED
data/lib/openssl_extensions.rb
CHANGED
@@ -15,13 +15,14 @@ module MoneyTree
|
|
15
15
|
attach_function :EC_KEY_free, [:pointer], :int
|
16
16
|
attach_function :EC_KEY_get0_group, [:pointer], :pointer
|
17
17
|
attach_function :EC_KEY_new_by_curve_name, [:int], :pointer
|
18
|
-
attach_function :
|
18
|
+
attach_function :EC_POINT_clear_free, [:pointer], :int
|
19
19
|
attach_function :EC_POINT_add, [:pointer, :pointer, :pointer, :pointer, :pointer], :int
|
20
20
|
attach_function :EC_POINT_point2hex, [:pointer, :pointer, :int, :pointer], :string
|
21
21
|
attach_function :EC_POINT_hex2point, [:pointer, :string, :pointer, :pointer], :pointer
|
22
22
|
attach_function :EC_POINT_new, [:pointer], :pointer
|
23
23
|
|
24
24
|
def self.add(point_0, point_1)
|
25
|
+
validate_points(point_0, point_1)
|
25
26
|
eckey = EC_KEY_new_by_curve_name(NID_secp256k1)
|
26
27
|
group = EC_KEY_get0_group(eckey)
|
27
28
|
|
@@ -33,10 +34,24 @@ module MoneyTree
|
|
33
34
|
sum_point = EC_POINT_new(group)
|
34
35
|
success = EC_POINT_add(group, sum_point, point_0_pt, point_1_pt, nil)
|
35
36
|
hex = EC_POINT_point2hex(group, sum_point, POINT_CONVERSION_UNCOMPRESSED, nil)
|
37
|
+
|
36
38
|
EC_KEY_free(eckey)
|
37
|
-
|
39
|
+
EC_POINT_clear_free(sum_point)
|
40
|
+
EC_POINT_clear_free(point_0_pt)
|
41
|
+
EC_POINT_clear_free(point_1_pt)
|
42
|
+
|
38
43
|
hex
|
39
44
|
end
|
45
|
+
|
46
|
+
def self.validate_points(*points)
|
47
|
+
points.each do |point|
|
48
|
+
if !point.is_a?(OpenSSL::PKey::EC::Point)
|
49
|
+
raise ArgumentError, "point must be an OpenSSL::PKey::EC::Point object"
|
50
|
+
elsif point.infinity?
|
51
|
+
raise ArgumentError, "point must not be infinity"
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
40
55
|
end
|
41
56
|
end
|
42
57
|
|
@@ -49,4 +64,4 @@ class OpenSSL::PKey::EC::Point
|
|
49
64
|
self.class.new group, OpenSSL::BN.new(sum_point_hex, 16)
|
50
65
|
end
|
51
66
|
|
52
|
-
end
|
67
|
+
end
|
@@ -4,34 +4,34 @@ describe MoneyTree::Address do
|
|
4
4
|
describe "initialize" do
|
5
5
|
it "generates a private key by default" do
|
6
6
|
address = MoneyTree::Address.new
|
7
|
-
address.private_key.key.length.
|
7
|
+
expect(address.private_key.key.length).to eql(64)
|
8
8
|
end
|
9
9
|
|
10
10
|
it "generates a public key by default" do
|
11
11
|
address = MoneyTree::Address.new
|
12
|
-
address.public_key.key.length.
|
12
|
+
expect(address.public_key.key.length).to eql(66)
|
13
13
|
end
|
14
14
|
|
15
15
|
it "imports a private key in hex form" do
|
16
16
|
address = MoneyTree::Address.new private_key: "5eae5375fb5f7a0ea650566363befa2830ef441bdcb19198adf318faee86d64b"
|
17
|
-
address.private_key.key.
|
18
|
-
address.public_key.key.
|
19
|
-
address.to_s.
|
20
|
-
address.private_key.to_s.
|
21
|
-
address.public_key.to_s.
|
17
|
+
expect(address.private_key.key).to eql("5eae5375fb5f7a0ea650566363befa2830ef441bdcb19198adf318faee86d64b")
|
18
|
+
expect(address.public_key.key).to eql("022dfc2557a007c93092c2915f11e8aa70c4f399a6753e2e908330014091580e4b")
|
19
|
+
expect(address.to_s).to eql("13uVqa35BMo4mYq9LiZrXVzoz9EFZ6aoXe")
|
20
|
+
expect(address.private_key.to_s).to eql("KzPkwAXJ4wtXHnbamTaJqoMrzwCUUJaqhUxnqYhnZvZH6KhgmDPK")
|
21
|
+
expect(address.public_key.to_s).to eql("13uVqa35BMo4mYq9LiZrXVzoz9EFZ6aoXe")
|
22
22
|
end
|
23
23
|
|
24
24
|
it "imports a private key in compressed wif format" do
|
25
25
|
address = MoneyTree::Address.new private_key: "KzPkwAXJ4wtXHnbamTaJqoMrzwCUUJaqhUxnqYhnZvZH6KhgmDPK"
|
26
|
-
address.private_key.key.
|
27
|
-
address.public_key.key.
|
28
|
-
address.to_s.
|
26
|
+
expect(address.private_key.key).to eql("5eae5375fb5f7a0ea650566363befa2830ef441bdcb19198adf318faee86d64b")
|
27
|
+
expect(address.public_key.key).to eql("022dfc2557a007c93092c2915f11e8aa70c4f399a6753e2e908330014091580e4b")
|
28
|
+
expect(address.to_s).to eql("13uVqa35BMo4mYq9LiZrXVzoz9EFZ6aoXe")
|
29
29
|
end
|
30
30
|
|
31
31
|
it "imports a private key in uncompressed wif format" do
|
32
32
|
address = MoneyTree::Address.new private_key: "5JXz5ZyFk31oHVTQxqce7yitCmTAPxBqeGQ4b7H3Aj3L45wUhoa"
|
33
|
-
address.private_key.key.
|
34
|
-
address.public_key.key.
|
33
|
+
expect(address.private_key.key).to eql("5eae5375fb5f7a0ea650566363befa2830ef441bdcb19198adf318faee86d64b")
|
34
|
+
expect(address.public_key.key).to eql("022dfc2557a007c93092c2915f11e8aa70c4f399a6753e2e908330014091580e4b")
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
@@ -41,12 +41,12 @@ describe MoneyTree::Address do
|
|
41
41
|
end
|
42
42
|
|
43
43
|
it "returns compressed base58 public key" do
|
44
|
-
@address.to_s.
|
45
|
-
@address.public_key.to_s.
|
44
|
+
expect(@address.to_s).to eql("13uVqa35BMo4mYq9LiZrXVzoz9EFZ6aoXe")
|
45
|
+
expect(@address.public_key.to_s).to eql("13uVqa35BMo4mYq9LiZrXVzoz9EFZ6aoXe")
|
46
46
|
end
|
47
47
|
|
48
48
|
it "returns compressed WIF private key" do
|
49
|
-
@address.private_key.to_s.
|
49
|
+
expect(@address.private_key.to_s).to eql("KzPkwAXJ4wtXHnbamTaJqoMrzwCUUJaqhUxnqYhnZvZH6KhgmDPK")
|
50
50
|
end
|
51
51
|
end
|
52
52
|
|
@@ -56,7 +56,7 @@ describe MoneyTree::Address do
|
|
56
56
|
end
|
57
57
|
|
58
58
|
it "returns a testnet address" do
|
59
|
-
%w(m n).
|
59
|
+
expect(%w(m n)).to include(@address.to_s[0])
|
60
60
|
end
|
61
61
|
end
|
62
62
|
end
|
@@ -9,12 +9,12 @@ describe MoneyTree::Master do
|
|
9
9
|
end
|
10
10
|
|
11
11
|
it "generates a random seed 32 bytes long" do
|
12
|
-
@master.seed.bytesize.
|
12
|
+
expect(@master.seed.bytesize).to eql(32)
|
13
13
|
end
|
14
14
|
|
15
15
|
it "exports the seed in hex format" do
|
16
|
-
@master.
|
17
|
-
@master.seed_hex.size.
|
16
|
+
expect(@master).to respond_to(:seed_hex)
|
17
|
+
expect(@master.seed_hex.size).to eql(64)
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
@@ -24,49 +24,49 @@ describe MoneyTree::Master do
|
|
24
24
|
end
|
25
25
|
|
26
26
|
it "generates testnet address" do
|
27
|
-
%w(m n).
|
27
|
+
expect(%w(m n)).to include(@master.to_address[0])
|
28
28
|
end
|
29
29
|
|
30
30
|
it "generates testnet compressed wif" do
|
31
|
-
@master.private_key.to_wif[0].
|
31
|
+
expect(@master.private_key.to_wif[0]).to eql('c')
|
32
32
|
end
|
33
33
|
|
34
34
|
it "generates testnet uncompressed wif" do
|
35
|
-
@master.private_key.to_wif(compressed: false)[0].
|
35
|
+
expect(@master.private_key.to_wif(compressed: false)[0]).to eql('9')
|
36
36
|
end
|
37
37
|
|
38
38
|
it "generates testnet serialized private address" do
|
39
|
-
@master.to_serialized_address(:private).slice(0, 4).
|
39
|
+
expect(@master.to_serialized_address(:private).slice(0, 4)).to eql("tprv")
|
40
40
|
end
|
41
41
|
|
42
42
|
it "generates testnet serialized public address" do
|
43
|
-
@master.to_serialized_address.slice(0, 4).
|
43
|
+
expect(@master.to_serialized_address.slice(0, 4)).to eql("tpub")
|
44
44
|
end
|
45
45
|
|
46
46
|
it "imports from testnet serialized private address" do
|
47
47
|
node = MoneyTree::Node.from_serialized_address 'tprv8ZgxMBicQKsPcuN7bfUZqq78UEYapr3Tzmc9NcDXw8BnBJ47dZYr6SusnfYj7vbAYP9CP8ZiD5aVBTUo1yU5QP56mepKVvuEbu8KZQXMKNE'
|
48
|
-
node.to_serialized_address(:private).
|
48
|
+
expect(node.to_serialized_address(:private)).to eql('tprv8ZgxMBicQKsPcuN7bfUZqq78UEYapr3Tzmc9NcDXw8BnBJ47dZYr6SusnfYj7vbAYP9CP8ZiD5aVBTUo1yU5QP56mepKVvuEbu8KZQXMKNE')
|
49
49
|
end
|
50
50
|
|
51
51
|
it "imports from testnet serialized public address" do
|
52
52
|
node = MoneyTree::Node.from_serialized_address 'tpubD6NzVbkrYhZ4YA8aUE9bBZTSyHJibBqwDny5urfwDdJc4W8od3y3Ebzy6CqsYn9CCC5P5VQ7CeZYpnT1kX3RPVPysU2rFRvYSj8BCoYYNqT'
|
53
|
-
%w(m n).
|
54
|
-
node.to_serialized_address.
|
53
|
+
expect(%w(m n)).to include(node.public_key.to_s[0])
|
54
|
+
expect(node.to_serialized_address).to eql('tpubD6NzVbkrYhZ4YA8aUE9bBZTSyHJibBqwDny5urfwDdJc4W8od3y3Ebzy6CqsYn9CCC5P5VQ7CeZYpnT1kX3RPVPysU2rFRvYSj8BCoYYNqT')
|
55
55
|
end
|
56
56
|
|
57
57
|
it "generates testnet subnodes from serialized private address" do
|
58
58
|
node = MoneyTree::Node.from_serialized_address 'tprv8ZgxMBicQKsPcuN7bfUZqq78UEYapr3Tzmc9NcDXw8BnBJ47dZYr6SusnfYj7vbAYP9CP8ZiD5aVBTUo1yU5QP56mepKVvuEbu8KZQXMKNE'
|
59
59
|
subnode = node.node_for_path('1/1/1')
|
60
|
-
%w(m n).
|
61
|
-
subnode.to_serialized_address(:private).slice(0,4).
|
62
|
-
subnode.to_serialized_address.slice(0,4).
|
60
|
+
expect(%w(m n)).to include(subnode.public_key.to_s[0])
|
61
|
+
expect(subnode.to_serialized_address(:private).slice(0,4)).to eql('tprv')
|
62
|
+
expect(subnode.to_serialized_address.slice(0,4)).to eql('tpub')
|
63
63
|
end
|
64
64
|
|
65
65
|
it "generates testnet subnodes from serialized public address" do
|
66
66
|
node = MoneyTree::Node.from_serialized_address 'tpubD6NzVbkrYhZ4YA8aUE9bBZTSyHJibBqwDny5urfwDdJc4W8od3y3Ebzy6CqsYn9CCC5P5VQ7CeZYpnT1kX3RPVPysU2rFRvYSj8BCoYYNqT'
|
67
67
|
subnode = node.node_for_path('1/1/1')
|
68
|
-
%w(m n).
|
69
|
-
subnode.to_serialized_address.slice(0,4).
|
68
|
+
expect(%w(m n)).to include(subnode.public_key.to_s[0])
|
69
|
+
expect(subnode.to_serialized_address.slice(0,4)).to eql('tpub')
|
70
70
|
end
|
71
71
|
end
|
72
72
|
|
@@ -78,44 +78,44 @@ describe MoneyTree::Master do
|
|
78
78
|
|
79
79
|
describe "m" do
|
80
80
|
it "has an index of 0" do
|
81
|
-
@master.index.
|
81
|
+
expect(@master.index).to eql(0)
|
82
82
|
end
|
83
83
|
|
84
84
|
it "is private" do
|
85
|
-
@master.is_private
|
85
|
+
expect(@master.is_private?).to eql(true)
|
86
86
|
end
|
87
87
|
|
88
88
|
it "has a depth of 0" do
|
89
|
-
@master.depth.
|
89
|
+
expect(@master.depth).to eql(0)
|
90
90
|
end
|
91
91
|
|
92
92
|
it "generates master node (Master)" do
|
93
|
-
@master.to_identifier.
|
94
|
-
@master.to_fingerprint.
|
95
|
-
@master.to_address.
|
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
96
|
end
|
97
97
|
|
98
98
|
it "generates a secret key" do
|
99
|
-
@master.private_key.to_hex.
|
100
|
-
@master.private_key.to_wif.
|
99
|
+
expect(@master.private_key.to_hex).to eql("e8f32e723decf4051aefac8e2c93c9c5b214313817cdb01a1494b917c8436b35")
|
100
|
+
expect(@master.private_key.to_wif).to eql("L52XzL2cMkHxqxBXRyEpnPQZGUs3uKiL3R11XbAdHigRzDozKZeW")
|
101
101
|
end
|
102
102
|
|
103
103
|
it "generates a public key" do
|
104
|
-
@master.public_key.to_hex.
|
104
|
+
expect(@master.public_key.to_hex).to eql("0339a36013301597daef41fbe593a02cc513d0b55527ec2df1050e2e8ff49c85c2")
|
105
105
|
end
|
106
106
|
|
107
107
|
it "generates a chain code" do
|
108
|
-
@master.chain_code_hex.
|
108
|
+
expect(@master.chain_code_hex).to eql("873dff81c02f525623fd1fe5167eac3a55a049de3d314bb42ee227ffed37d508")
|
109
109
|
end
|
110
110
|
|
111
111
|
it "generates a serialized private key" do
|
112
|
-
@master.to_serialized_hex(:private).
|
113
|
-
@master.to_serialized_address(:private).
|
112
|
+
expect(@master.to_serialized_hex(:private)).to eql("0488ade4000000000000000000873dff81c02f525623fd1fe5167eac3a55a049de3d314bb42ee227ffed37d50800e8f32e723decf4051aefac8e2c93c9c5b214313817cdb01a1494b917c8436b35")
|
113
|
+
expect(@master.to_serialized_address(:private)).to eql("xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi")
|
114
114
|
end
|
115
115
|
|
116
116
|
it "generates a serialized public_key" do
|
117
|
-
@master.to_serialized_hex.
|
118
|
-
@master.to_serialized_address.
|
117
|
+
expect(@master.to_serialized_hex).to eql("0488b21e000000000000000000873dff81c02f525623fd1fe5167eac3a55a049de3d314bb42ee227ffed37d5080339a36013301597daef41fbe593a02cc513d0b55527ec2df1050e2e8ff49c85c2")
|
118
|
+
expect(@master.to_serialized_address).to eql("xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8")
|
119
119
|
end
|
120
120
|
end
|
121
121
|
|
@@ -125,44 +125,44 @@ describe MoneyTree::Master do
|
|
125
125
|
end
|
126
126
|
|
127
127
|
it "has an index of 2147483648" do
|
128
|
-
@node.index.
|
128
|
+
expect(@node.index).to eql(2147483648)
|
129
129
|
end
|
130
130
|
|
131
131
|
it "is private" do
|
132
|
-
@node.is_private
|
132
|
+
expect(@node.is_private?).to eql(true)
|
133
133
|
end
|
134
134
|
|
135
135
|
it "has a depth of 1" do
|
136
|
-
@node.depth.
|
136
|
+
expect(@node.depth).to eql(1)
|
137
137
|
end
|
138
138
|
|
139
139
|
it "generates subnode" do
|
140
|
-
@node.to_identifier.
|
141
|
-
@node.to_fingerprint.
|
142
|
-
@node.to_address.
|
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
143
|
end
|
144
144
|
|
145
145
|
it "generates a private key" do
|
146
|
-
@node.private_key.to_hex.
|
147
|
-
@node.private_key.to_wif.
|
146
|
+
expect(@node.private_key.to_hex).to eql("edb2e14f9ee77d26dd93b4ecede8d16ed408ce149b6cd80b0715a2d911a0afea")
|
147
|
+
expect(@node.private_key.to_wif).to eql("L5BmPijJjrKbiUfG4zbiFKNqkvuJ8usooJmzuD7Z8dkRoTThYnAT")
|
148
148
|
end
|
149
149
|
|
150
150
|
it "generates a public key" do
|
151
|
-
@node.public_key.to_hex.
|
151
|
+
expect(@node.public_key.to_hex).to eql("035a784662a4a20a65bf6aab9ae98a6c068a81c52e4b032c0fb5400c706cfccc56")
|
152
152
|
end
|
153
153
|
|
154
154
|
it "generates a chain code" do
|
155
|
-
@node.chain_code_hex.
|
155
|
+
expect(@node.chain_code_hex).to eql("47fdacbd0f1097043b78c63c20c34ef4ed9a111d980047ad16282c7ae6236141")
|
156
156
|
end
|
157
157
|
|
158
158
|
it "generates a serialized private key" do
|
159
|
-
@node.to_serialized_hex(:private).
|
160
|
-
@node.to_serialized_address(:private).
|
159
|
+
expect(@node.to_serialized_hex(:private)).to eql("0488ade4013442193e8000000047fdacbd0f1097043b78c63c20c34ef4ed9a111d980047ad16282c7ae623614100edb2e14f9ee77d26dd93b4ecede8d16ed408ce149b6cd80b0715a2d911a0afea")
|
160
|
+
expect(@node.to_serialized_address(:private)).to eql("xprv9uHRZZhk6KAJC1avXpDAp4MDc3sQKNxDiPvvkX8Br5ngLNv1TxvUxt4cV1rGL5hj6KCesnDYUhd7oWgT11eZG7XnxHrnYeSvkzY7d2bhkJ7")
|
161
161
|
end
|
162
162
|
|
163
163
|
it "generates a serialized public_key" do
|
164
|
-
@node.to_serialized_hex.
|
165
|
-
@node.to_serialized_address.
|
164
|
+
expect(@node.to_serialized_hex).to eql("0488b21e013442193e8000000047fdacbd0f1097043b78c63c20c34ef4ed9a111d980047ad16282c7ae6236141035a784662a4a20a65bf6aab9ae98a6c068a81c52e4b032c0fb5400c706cfccc56")
|
165
|
+
expect(@node.to_serialized_address).to eql("xpub68Gmy5EdvgibQVfPdqkBBCHxA5htiqg55crXYuXoQRKfDBFA1WEjWgP6LHhwBZeNK1VTsfTFUHCdrfp1bgwQ9xv5ski8PX9rL2dZXvgGDnw")
|
166
166
|
end
|
167
167
|
end
|
168
168
|
|
@@ -172,42 +172,42 @@ describe MoneyTree::Master do
|
|
172
172
|
end
|
173
173
|
|
174
174
|
it "has an index of 2147483648" do
|
175
|
-
@node.index.
|
175
|
+
expect(@node.index).to eql(2147483648)
|
176
176
|
end
|
177
177
|
|
178
178
|
it "is private" do
|
179
|
-
@node.is_private
|
179
|
+
expect(@node.is_private?).to eql(true)
|
180
180
|
end
|
181
181
|
|
182
182
|
it "has a depth of 1" do
|
183
|
-
@node.depth.
|
183
|
+
expect(@node.depth).to eql(1)
|
184
184
|
end
|
185
185
|
|
186
186
|
it "generates subnode" do
|
187
|
-
@node.to_identifier.
|
188
|
-
@node.to_fingerprint.
|
189
|
-
@node.to_address.
|
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
190
|
end
|
191
191
|
|
192
192
|
it "does not generate a private key" do
|
193
|
-
@node.private_key.
|
193
|
+
expect(@node.private_key).to be_nil
|
194
194
|
end
|
195
195
|
|
196
196
|
it "generates a public key" do
|
197
|
-
@node.public_key.to_hex.
|
197
|
+
expect(@node.public_key.to_hex).to eql("035a784662a4a20a65bf6aab9ae98a6c068a81c52e4b032c0fb5400c706cfccc56")
|
198
198
|
end
|
199
199
|
|
200
200
|
it "generates a chain code" do
|
201
|
-
@node.chain_code_hex.
|
201
|
+
expect(@node.chain_code_hex).to eql("47fdacbd0f1097043b78c63c20c34ef4ed9a111d980047ad16282c7ae6236141")
|
202
202
|
end
|
203
203
|
|
204
204
|
it "does not generate a serialized private key" do
|
205
|
-
|
205
|
+
expect { @node.to_serialized_hex(:private) }.to raise_error(MoneyTree::Node::PrivatePublicMismatch)
|
206
206
|
end
|
207
207
|
|
208
208
|
it "generates a serialized public_key" do
|
209
|
-
@node.to_serialized_hex.
|
210
|
-
@node.to_serialized_address.
|
209
|
+
expect(@node.to_serialized_hex).to eql("0488b21e013442193e8000000047fdacbd0f1097043b78c63c20c34ef4ed9a111d980047ad16282c7ae6236141035a784662a4a20a65bf6aab9ae98a6c068a81c52e4b032c0fb5400c706cfccc56")
|
210
|
+
expect(@node.to_serialized_address).to eql("xpub68Gmy5EdvgibQVfPdqkBBCHxA5htiqg55crXYuXoQRKfDBFA1WEjWgP6LHhwBZeNK1VTsfTFUHCdrfp1bgwQ9xv5ski8PX9rL2dZXvgGDnw")
|
211
211
|
end
|
212
212
|
end
|
213
213
|
|
@@ -217,44 +217,44 @@ describe MoneyTree::Master do
|
|
217
217
|
end
|
218
218
|
|
219
219
|
it "has an index of 1" do
|
220
|
-
@node.index.
|
220
|
+
expect(@node.index).to eql(1)
|
221
221
|
end
|
222
222
|
|
223
223
|
it "is public" do
|
224
|
-
@node.is_private
|
224
|
+
expect(@node.is_private?).to eql(false)
|
225
225
|
end
|
226
226
|
|
227
227
|
it "has a depth of 2" do
|
228
|
-
@node.depth.
|
228
|
+
expect(@node.depth).to eql(2)
|
229
229
|
end
|
230
230
|
|
231
231
|
it "generates subnode" do
|
232
|
-
@node.to_identifier.
|
233
|
-
@node.to_fingerprint.
|
234
|
-
@node.to_address.
|
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
235
|
end
|
236
236
|
|
237
237
|
it "generates a private key" do
|
238
|
-
@node.private_key.to_hex.
|
239
|
-
@node.private_key.to_wif.
|
238
|
+
expect(@node.private_key.to_hex).to eql("3c6cb8d0f6a264c91ea8b5030fadaa8e538b020f0a387421a12de9319dc93368")
|
239
|
+
expect(@node.private_key.to_wif).to eql("KyFAjQ5rgrKvhXvNMtFB5PCSKUYD1yyPEe3xr3T34TZSUHycXtMM")
|
240
240
|
end
|
241
241
|
|
242
242
|
it "generates a public key" do
|
243
|
-
@node.public_key.to_hex.
|
243
|
+
expect(@node.public_key.to_hex).to eql("03501e454bf00751f24b1b489aa925215d66af2234e3891c3b21a52bedb3cd711c")
|
244
244
|
end
|
245
245
|
|
246
246
|
it "generates a chain code" do
|
247
|
-
@node.chain_code_hex.
|
247
|
+
expect(@node.chain_code_hex).to eql("2a7857631386ba23dacac34180dd1983734e444fdbf774041578e9b6adb37c19")
|
248
248
|
end
|
249
249
|
|
250
250
|
it "generates a serialized private key" do
|
251
|
-
@node.to_serialized_hex(:private).
|
252
|
-
@node.to_serialized_address(:private).
|
251
|
+
expect(@node.to_serialized_hex(:private)).to eql("0488ade4025c1bd648000000012a7857631386ba23dacac34180dd1983734e444fdbf774041578e9b6adb37c19003c6cb8d0f6a264c91ea8b5030fadaa8e538b020f0a387421a12de9319dc93368")
|
252
|
+
expect(@node.to_serialized_address(:private)).to eql("xprv9wTYmMFdV23N2TdNG573QoEsfRrWKQgWeibmLntzniatZvR9BmLnvSxqu53Kw1UmYPxLgboyZQaXwTCg8MSY3H2EU4pWcQDnRnrVA1xe8fs")
|
253
253
|
end
|
254
254
|
|
255
255
|
it "generates a serialized public_key" do
|
256
|
-
@node.to_serialized_hex.
|
257
|
-
@node.to_serialized_address.
|
256
|
+
expect(@node.to_serialized_hex).to eql("0488b21e025c1bd648000000012a7857631386ba23dacac34180dd1983734e444fdbf774041578e9b6adb37c1903501e454bf00751f24b1b489aa925215d66af2234e3891c3b21a52bedb3cd711c")
|
257
|
+
expect(@node.to_serialized_address).to eql("xpub6ASuArnXKPbfEwhqN6e3mwBcDTgzisQN1wXN9BJcM47sSikHjJf3UFHKkNAWbWMiGj7Wf5uMash7SyYq527Hqck2AxYysAA7xmALppuCkwQ")
|
258
258
|
end
|
259
259
|
end
|
260
260
|
|
@@ -264,42 +264,42 @@ describe MoneyTree::Master do
|
|
264
264
|
end
|
265
265
|
|
266
266
|
it "has an index of 1" do
|
267
|
-
@node.index.
|
267
|
+
expect(@node.index).to eql(1)
|
268
268
|
end
|
269
269
|
|
270
270
|
it "is public" do
|
271
|
-
@node.is_private
|
271
|
+
expect(@node.is_private?).to eql(false)
|
272
272
|
end
|
273
273
|
|
274
274
|
it "has a depth of 2" do
|
275
|
-
@node.depth.
|
275
|
+
expect(@node.depth).to eql(2)
|
276
276
|
end
|
277
277
|
|
278
278
|
it "generates subnode" do
|
279
|
-
@node.to_identifier.
|
280
|
-
@node.to_fingerprint.
|
281
|
-
@node.to_address.
|
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
282
|
end
|
283
283
|
|
284
284
|
it "does not generate a private key" do
|
285
|
-
@node.private_key.
|
285
|
+
expect(@node.private_key).to be_nil
|
286
286
|
end
|
287
287
|
|
288
288
|
it "generates a public key" do
|
289
|
-
@node.public_key.to_hex.
|
289
|
+
expect(@node.public_key.to_hex).to eql("03501e454bf00751f24b1b489aa925215d66af2234e3891c3b21a52bedb3cd711c")
|
290
290
|
end
|
291
291
|
|
292
292
|
it "generates a chain code" do
|
293
|
-
@node.chain_code_hex.
|
293
|
+
expect(@node.chain_code_hex).to eql("2a7857631386ba23dacac34180dd1983734e444fdbf774041578e9b6adb37c19")
|
294
294
|
end
|
295
295
|
|
296
296
|
it "generates a serialized private key" do
|
297
|
-
|
297
|
+
expect { @node.to_serialized_hex(:private) }.to raise_error(MoneyTree::Node::PrivatePublicMismatch)
|
298
298
|
end
|
299
299
|
|
300
300
|
it "generates a serialized public_key" do
|
301
|
-
@node.to_serialized_hex.
|
302
|
-
@node.to_serialized_address.
|
301
|
+
expect(@node.to_serialized_hex).to eql("0488b21e025c1bd648000000012a7857631386ba23dacac34180dd1983734e444fdbf774041578e9b6adb37c1903501e454bf00751f24b1b489aa925215d66af2234e3891c3b21a52bedb3cd711c")
|
302
|
+
expect(@node.to_serialized_address).to eql("xpub6ASuArnXKPbfEwhqN6e3mwBcDTgzisQN1wXN9BJcM47sSikHjJf3UFHKkNAWbWMiGj7Wf5uMash7SyYq527Hqck2AxYysAA7xmALppuCkwQ")
|
303
303
|
end
|
304
304
|
end
|
305
305
|
|
@@ -309,44 +309,44 @@ describe MoneyTree::Master do
|
|
309
309
|
end
|
310
310
|
|
311
311
|
it "has an index of 2" do
|
312
|
-
@node.index.
|
312
|
+
expect(@node.index).to eql(2)
|
313
313
|
end
|
314
314
|
|
315
315
|
it "is public" do
|
316
|
-
@node.is_private
|
316
|
+
expect(@node.is_private?).to eql(false)
|
317
317
|
end
|
318
318
|
|
319
319
|
it "has a depth of 4" do
|
320
|
-
@node.depth.
|
320
|
+
expect(@node.depth).to eql(4)
|
321
321
|
end
|
322
322
|
|
323
323
|
it "generates subnode" do
|
324
|
-
@node.to_identifier.
|
325
|
-
@node.to_fingerprint.
|
326
|
-
@node.to_address.
|
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
327
|
end
|
328
328
|
|
329
329
|
it "generates a private key" do
|
330
|
-
@node.private_key.to_hex.
|
331
|
-
@node.private_key.to_wif.
|
330
|
+
expect(@node.private_key.to_hex).to eql("0f479245fb19a38a1954c5c7c0ebab2f9bdfd96a17563ef28a6a4b1a2a764ef4")
|
331
|
+
expect(@node.private_key.to_wif).to eql("KwjQsVuMjbCP2Zmr3VaFaStav7NvevwjvvkqrWd5Qmh1XVnCteBR")
|
332
332
|
end
|
333
333
|
|
334
334
|
it "generates a public key" do
|
335
|
-
@node.public_key.to_hex.
|
335
|
+
expect(@node.public_key.to_hex).to eql("02e8445082a72f29b75ca48748a914df60622a609cacfce8ed0e35804560741d29")
|
336
336
|
end
|
337
337
|
|
338
338
|
it "generates a chain code" do
|
339
|
-
@node.chain_code_hex.
|
339
|
+
expect(@node.chain_code_hex).to eql("cfb71883f01676f587d023cc53a35bc7f88f724b1f8c2892ac1275ac822a3edd")
|
340
340
|
end
|
341
341
|
|
342
342
|
it "generates a serialized private key" do
|
343
|
-
@node.to_serialized_hex(:private).
|
344
|
-
@node.to_serialized_address(:private).
|
343
|
+
expect(@node.to_serialized_hex(:private)).to eql("0488ade404ee7ab90c00000002cfb71883f01676f587d023cc53a35bc7f88f724b1f8c2892ac1275ac822a3edd000f479245fb19a38a1954c5c7c0ebab2f9bdfd96a17563ef28a6a4b1a2a764ef4")
|
344
|
+
expect(@node.to_serialized_address(:private)).to eql("xprvA2JDeKCSNNZky6uBCviVfJSKyQ1mDYahRjijr5idH2WwLsEd4Hsb2Tyh8RfQMuPh7f7RtyzTtdrbdqqsunu5Mm3wDvUAKRHSC34sJ7in334")
|
345
345
|
end
|
346
346
|
|
347
347
|
it "generates a serialized public_key" do
|
348
|
-
@node.to_serialized_hex.
|
349
|
-
@node.to_serialized_address.
|
348
|
+
expect(@node.to_serialized_hex).to eql("0488b21e04ee7ab90c00000002cfb71883f01676f587d023cc53a35bc7f88f724b1f8c2892ac1275ac822a3edd02e8445082a72f29b75ca48748a914df60622a609cacfce8ed0e35804560741d29")
|
349
|
+
expect(@node.to_serialized_address).to eql("xpub6FHa3pjLCk84BayeJxFW2SP4XRrFd1JYnxeLeU8EqN3vDfZmbqBqaGJAyiLjTAwm6ZLRQUMv1ZACTj37sR62cfN7fe5JnJ7dh8zL4fiyLHV")
|
350
350
|
end
|
351
351
|
end
|
352
352
|
|
@@ -356,44 +356,44 @@ describe MoneyTree::Master do
|
|
356
356
|
end
|
357
357
|
|
358
358
|
it "has an index of 1000000000" do
|
359
|
-
@node.index.
|
359
|
+
expect(@node.index).to eql(1000000000)
|
360
360
|
end
|
361
361
|
|
362
362
|
it "is public" do
|
363
|
-
@node.is_private
|
363
|
+
expect(@node.is_private?).to eql(false)
|
364
364
|
end
|
365
365
|
|
366
366
|
it "has a depth of 2" do
|
367
|
-
@node.depth.
|
367
|
+
expect(@node.depth).to eql(5)
|
368
368
|
end
|
369
369
|
|
370
370
|
it "generates subnode" do
|
371
|
-
@node.to_identifier.
|
372
|
-
@node.to_fingerprint.
|
373
|
-
@node.to_address.
|
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
374
|
end
|
375
375
|
|
376
376
|
it "generates a private key" do
|
377
|
-
@node.private_key.to_hex.
|
378
|
-
@node.private_key.to_wif.
|
377
|
+
expect(@node.private_key.to_hex).to eql("471b76e389e528d6de6d816857e012c5455051cad6660850e58372a6c3e6e7c8")
|
378
|
+
expect(@node.private_key.to_wif).to eql("Kybw8izYevo5xMh1TK7aUr7jHFCxXS1zv8p3oqFz3o2zFbhRXHYs")
|
379
379
|
end
|
380
380
|
|
381
381
|
it "generates a public key" do
|
382
|
-
@node.public_key.to_hex.
|
382
|
+
expect(@node.public_key.to_hex).to eql("022a471424da5e657499d1ff51cb43c47481a03b1e77f951fe64cec9f5a48f7011")
|
383
383
|
end
|
384
384
|
|
385
385
|
it "generates a chain code" do
|
386
|
-
@node.chain_code_hex.
|
386
|
+
expect(@node.chain_code_hex).to eql("c783e67b921d2beb8f6b389cc646d7263b4145701dadd2161548a8b078e65e9e")
|
387
387
|
end
|
388
388
|
|
389
389
|
it "generates a serialized private key" do
|
390
|
-
@node.to_serialized_hex(:private).
|
391
|
-
@node.to_serialized_address(:private).
|
390
|
+
expect(@node.to_serialized_hex(:private)).to eql("0488ade405d880d7d83b9aca00c783e67b921d2beb8f6b389cc646d7263b4145701dadd2161548a8b078e65e9e00471b76e389e528d6de6d816857e012c5455051cad6660850e58372a6c3e6e7c8")
|
391
|
+
expect(@node.to_serialized_address(:private)).to eql("xprvA41z7zogVVwxVSgdKUHDy1SKmdb533PjDz7J6N6mV6uS3ze1ai8FHa8kmHScGpWmj4WggLyQjgPie1rFSruoUihUZREPSL39UNdE3BBDu76")
|
392
392
|
end
|
393
393
|
|
394
394
|
it "generates a serialized public_key" do
|
395
|
-
@node.to_serialized_hex.
|
396
|
-
@node.to_serialized_address.
|
395
|
+
expect(@node.to_serialized_hex).to eql("0488b21e05d880d7d83b9aca00c783e67b921d2beb8f6b389cc646d7263b4145701dadd2161548a8b078e65e9e022a471424da5e657499d1ff51cb43c47481a03b1e77f951fe64cec9f5a48f7011")
|
396
|
+
expect(@node.to_serialized_address).to eql("xpub6H1LXWLaKsWFhvm6RVpEL9P4KfRZSW7abD2ttkWP3SSQvnyA8FSVqNTEcYFgJS2UaFcxupHiYkro49S8yGasTvXEYBVPamhGW6cFJodrTHy")
|
397
397
|
end
|
398
398
|
end
|
399
399
|
end
|
@@ -407,44 +407,50 @@ describe MoneyTree::Master do
|
|
407
407
|
|
408
408
|
describe "m" do
|
409
409
|
it "has an index of 0" do
|
410
|
-
@master.index.
|
410
|
+
expect(@master.index).to eql(0)
|
411
411
|
end
|
412
412
|
|
413
413
|
it "has a depth of 0" do
|
414
|
-
@master.depth.
|
414
|
+
expect(@master.depth).to eql(0)
|
415
415
|
end
|
416
416
|
|
417
417
|
it "is private" do
|
418
|
-
@master.is_private
|
418
|
+
expect(@master.is_private?).to eql(true)
|
419
419
|
end
|
420
420
|
|
421
421
|
it "generates master node (Master)" do
|
422
|
-
@master.to_identifier.
|
423
|
-
@master.to_fingerprint.
|
424
|
-
@master.to_address.
|
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
425
|
end
|
426
|
-
|
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
|
+
|
427
433
|
it "generates a secret key" do
|
428
|
-
@master.private_key.to_hex.
|
429
|
-
@master.private_key.to_wif.
|
434
|
+
expect(@master.private_key.to_hex).to eql("4b03d6fc340455b363f51020ad3ecca4f0850280cf436c70c727923f6db46c3e")
|
435
|
+
expect(@master.private_key.to_wif).to eql("KyjXhyHF9wTphBkfpxjL8hkDXDUSbE3tKANT94kXSyh6vn6nKaoy")
|
430
436
|
end
|
431
437
|
|
432
438
|
it "generates a public key" do
|
433
|
-
@master.public_key.to_hex.
|
439
|
+
expect(@master.public_key.to_hex).to eql("03cbcaa9c98c877a26977d00825c956a238e8dddfbd322cce4f74b0b5bd6ace4a7")
|
434
440
|
end
|
435
441
|
|
436
442
|
it "generates a chain code" do
|
437
|
-
@master.chain_code_hex.
|
443
|
+
expect(@master.chain_code_hex).to eql("60499f801b896d83179a4374aeb7822aaeaceaa0db1f85ee3e904c4defbd9689")
|
438
444
|
end
|
439
445
|
|
440
446
|
it "generates a serialized private key" do
|
441
|
-
@master.to_serialized_hex(:private).
|
442
|
-
@master.to_serialized_address(:private).
|
447
|
+
expect(@master.to_serialized_hex(:private)).to eql("0488ade400000000000000000060499f801b896d83179a4374aeb7822aaeaceaa0db1f85ee3e904c4defbd9689004b03d6fc340455b363f51020ad3ecca4f0850280cf436c70c727923f6db46c3e")
|
448
|
+
expect(@master.to_serialized_address(:private)).to eql("xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U")
|
443
449
|
end
|
444
450
|
|
445
451
|
it "generates a serialized public_key" do
|
446
|
-
@master.to_serialized_hex.
|
447
|
-
@master.to_serialized_address.
|
452
|
+
expect(@master.to_serialized_hex).to eql("0488b21e00000000000000000060499f801b896d83179a4374aeb7822aaeaceaa0db1f85ee3e904c4defbd968903cbcaa9c98c877a26977d00825c956a238e8dddfbd322cce4f74b0b5bd6ace4a7")
|
453
|
+
expect(@master.to_serialized_address).to eql("xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB")
|
448
454
|
end
|
449
455
|
end
|
450
456
|
|
@@ -455,44 +461,44 @@ describe MoneyTree::Master do
|
|
455
461
|
end
|
456
462
|
|
457
463
|
it "has an index of 0" do
|
458
|
-
@node.index.
|
464
|
+
expect(@node.index).to eql(0)
|
459
465
|
end
|
460
466
|
|
461
467
|
it "has a depth of 1" do
|
462
|
-
@node.depth.
|
468
|
+
expect(@node.depth).to eql(1)
|
463
469
|
end
|
464
470
|
|
465
471
|
it "is public" do
|
466
|
-
@node.is_private
|
472
|
+
expect(@node.is_private?).to eql(false)
|
467
473
|
end
|
468
474
|
|
469
475
|
it "generates subnode" do
|
470
|
-
@node.to_identifier.
|
471
|
-
@node.to_fingerprint.
|
472
|
-
@node.to_address.
|
476
|
+
expect(@node.to_identifier).to eql("5a61ff8eb7aaca3010db97ebda76121610b78096")
|
477
|
+
expect(@node.to_fingerprint).to eql("5a61ff8e")
|
478
|
+
expect(@node.to_address).to eql("19EuDJdgfRkwCmRzbzVBHZWQG9QNWhftbZ")
|
473
479
|
end
|
474
480
|
|
475
481
|
it "generates a private key" do
|
476
|
-
@node.private_key.to_hex.
|
477
|
-
@node.private_key.to_wif.
|
482
|
+
expect(@node.private_key.to_hex).to eql("abe74a98f6c7eabee0428f53798f0ab8aa1bd37873999041703c742f15ac7e1e")
|
483
|
+
expect(@node.private_key.to_wif).to eql("L2ysLrR6KMSAtx7uPqmYpoTeiRzydXBattRXjXz5GDFPrdfPzKbj")
|
478
484
|
end
|
479
485
|
|
480
486
|
it "generates a public key" do
|
481
|
-
@node.public_key.to_hex.
|
487
|
+
expect(@node.public_key.to_hex).to eql("02fc9e5af0ac8d9b3cecfe2a888e2117ba3d089d8585886c9c826b6b22a98d12ea")
|
482
488
|
end
|
483
489
|
|
484
490
|
it "generates a chain code" do
|
485
|
-
@node.chain_code_hex.
|
491
|
+
expect(@node.chain_code_hex).to eql("f0909affaa7ee7abe5dd4e100598d4dc53cd709d5a5c2cac40e7412f232f7c9c")
|
486
492
|
end
|
487
493
|
|
488
494
|
it "generates a serialized private key" do
|
489
|
-
@node.to_serialized_hex(:private).
|
490
|
-
@node.to_serialized_address(:private).
|
495
|
+
expect(@node.to_serialized_hex(:private)).to eql("0488ade401bd16bee500000000f0909affaa7ee7abe5dd4e100598d4dc53cd709d5a5c2cac40e7412f232f7c9c00abe74a98f6c7eabee0428f53798f0ab8aa1bd37873999041703c742f15ac7e1e")
|
496
|
+
expect(@node.to_serialized_address(:private)).to eql("xprv9vHkqa6EV4sPZHYqZznhT2NPtPCjKuDKGY38FBWLvgaDx45zo9WQRUT3dKYnjwih2yJD9mkrocEZXo1ex8G81dwSM1fwqWpWkeS3v86pgKt")
|
491
497
|
end
|
492
498
|
|
493
499
|
it "generates a serialized public_key" do
|
494
|
-
@node.to_serialized_hex.
|
495
|
-
@node.to_serialized_address.
|
500
|
+
expect(@node.to_serialized_hex).to eql("0488b21e01bd16bee500000000f0909affaa7ee7abe5dd4e100598d4dc53cd709d5a5c2cac40e7412f232f7c9c02fc9e5af0ac8d9b3cecfe2a888e2117ba3d089d8585886c9c826b6b22a98d12ea")
|
501
|
+
expect(@node.to_serialized_address).to eql("xpub69H7F5d8KSRgmmdJg2KhpAK8SR3DjMwAdkxj3ZuxV27CprR9LgpeyGmXUbC6wb7ERfvrnKZjXoUmmDznezpbZb7ap6r1D3tgFxHmwMkQTPH")
|
496
502
|
end
|
497
503
|
end
|
498
504
|
|
@@ -503,43 +509,43 @@ describe MoneyTree::Master do
|
|
503
509
|
end
|
504
510
|
|
505
511
|
it "has an index of 0" do
|
506
|
-
@node.index.
|
512
|
+
expect(@node.index).to eql(0)
|
507
513
|
end
|
508
514
|
|
509
515
|
it "has a depth of 1" do
|
510
|
-
@node.depth.
|
516
|
+
expect(@node.depth).to eql(1)
|
511
517
|
end
|
512
518
|
|
513
519
|
it "is public" do
|
514
|
-
@node.is_private
|
520
|
+
expect(@node.is_private?).to eql(false)
|
515
521
|
end
|
516
522
|
|
517
523
|
it "generates subnode" do
|
518
|
-
@node.to_identifier.
|
519
|
-
@node.to_fingerprint.
|
520
|
-
@node.to_address.
|
524
|
+
expect(@node.to_identifier).to eql("5a61ff8eb7aaca3010db97ebda76121610b78096")
|
525
|
+
expect(@node.to_fingerprint).to eql("5a61ff8e")
|
526
|
+
expect(@node.to_address).to eql("19EuDJdgfRkwCmRzbzVBHZWQG9QNWhftbZ")
|
521
527
|
end
|
522
528
|
|
523
529
|
it "does not generate a private key" do
|
524
|
-
@node.private_key.
|
530
|
+
expect(@node.private_key).to be_nil
|
525
531
|
end
|
526
532
|
|
527
533
|
it "generates a public key" do
|
528
|
-
@node.public_key.to_hex.
|
534
|
+
expect(@node.public_key.to_hex).to eql("02fc9e5af0ac8d9b3cecfe2a888e2117ba3d089d8585886c9c826b6b22a98d12ea")
|
529
535
|
end
|
530
536
|
|
531
537
|
it "generates a chain code" do
|
532
|
-
@node.chain_code_hex.
|
538
|
+
expect(@node.chain_code_hex).to eql("f0909affaa7ee7abe5dd4e100598d4dc53cd709d5a5c2cac40e7412f232f7c9c")
|
533
539
|
end
|
534
540
|
|
535
541
|
it "does not generate a serialized private key" do
|
536
|
-
|
537
|
-
|
542
|
+
expect { @node.to_serialized_hex(:private) }.to raise_error(MoneyTree::Node::PrivatePublicMismatch)
|
543
|
+
expect { @node.to_serialized_address(:private) }.to raise_error(MoneyTree::Node::PrivatePublicMismatch)
|
538
544
|
end
|
539
545
|
|
540
546
|
it "generates a serialized public_key" do
|
541
|
-
@node.to_serialized_hex.
|
542
|
-
@node.to_serialized_address.
|
547
|
+
expect(@node.to_serialized_hex).to eql("0488b21e01bd16bee500000000f0909affaa7ee7abe5dd4e100598d4dc53cd709d5a5c2cac40e7412f232f7c9c02fc9e5af0ac8d9b3cecfe2a888e2117ba3d089d8585886c9c826b6b22a98d12ea")
|
548
|
+
expect(@node.to_serialized_address).to eql("xpub69H7F5d8KSRgmmdJg2KhpAK8SR3DjMwAdkxj3ZuxV27CprR9LgpeyGmXUbC6wb7ERfvrnKZjXoUmmDznezpbZb7ap6r1D3tgFxHmwMkQTPH")
|
543
549
|
end
|
544
550
|
end
|
545
551
|
|
@@ -549,44 +555,44 @@ describe MoneyTree::Master do
|
|
549
555
|
end
|
550
556
|
|
551
557
|
it "has an index of 2147483647" do
|
552
|
-
@node.index.
|
558
|
+
expect(@node.index).to eql(4294967295)
|
553
559
|
end
|
554
560
|
|
555
561
|
it "has a depth of 2" do
|
556
|
-
@node.depth.
|
562
|
+
expect(@node.depth).to eql(2)
|
557
563
|
end
|
558
564
|
|
559
565
|
it "is private" do
|
560
|
-
@node.is_private
|
566
|
+
expect(@node.is_private?).to eql(true)
|
561
567
|
end
|
562
568
|
|
563
569
|
it "generates subnode" do
|
564
|
-
@node.to_identifier.
|
565
|
-
@node.to_fingerprint.
|
566
|
-
@node.to_address.
|
570
|
+
expect(@node.to_identifier).to eql("d8ab493736da02f11ed682f88339e720fb0379d1")
|
571
|
+
expect(@node.to_fingerprint).to eql("d8ab4937")
|
572
|
+
expect(@node.to_address).to eql("1Lke9bXGhn5VPrBuXgN12uGUphrttUErmk")
|
567
573
|
end
|
568
574
|
|
569
575
|
it "generates a private key" do
|
570
|
-
@node.private_key.to_hex.
|
571
|
-
@node.private_key.to_wif.
|
576
|
+
expect(@node.private_key.to_hex).to eql("877c779ad9687164e9c2f4f0f4ff0340814392330693ce95a58fe18fd52e6e93")
|
577
|
+
expect(@node.private_key.to_wif).to eql("L1m5VpbXmMp57P3knskwhoMTLdhAAaXiHvnGLMribbfwzVRpz2Sr")
|
572
578
|
end
|
573
579
|
|
574
580
|
it "generates a public key" do
|
575
|
-
@node.public_key.to_hex.
|
581
|
+
expect(@node.public_key.to_hex).to eql("03c01e7425647bdefa82b12d9bad5e3e6865bee0502694b94ca58b666abc0a5c3b")
|
576
582
|
end
|
577
583
|
|
578
584
|
it "generates a chain code" do
|
579
|
-
@node.chain_code_hex.
|
585
|
+
expect(@node.chain_code_hex).to eql("be17a268474a6bb9c61e1d720cf6215e2a88c5406c4aee7b38547f585c9a37d9")
|
580
586
|
end
|
581
587
|
|
582
588
|
it "generates a serialized private key" do
|
583
|
-
@node.to_serialized_hex(:private).
|
584
|
-
@node.to_serialized_address(:private).
|
589
|
+
expect(@node.to_serialized_hex(:private)).to eql("0488ade4025a61ff8effffffffbe17a268474a6bb9c61e1d720cf6215e2a88c5406c4aee7b38547f585c9a37d900877c779ad9687164e9c2f4f0f4ff0340814392330693ce95a58fe18fd52e6e93")
|
590
|
+
expect(@node.to_serialized_address(:private)).to eql("xprv9wSp6B7kry3Vj9m1zSnLvN3xH8RdsPP1Mh7fAaR7aRLcQMKTR2vidYEeEg2mUCTAwCd6vnxVrcjfy2kRgVsFawNzmjuHc2YmYRmagcEPdU9")
|
585
591
|
end
|
586
592
|
|
587
593
|
it "generates a serialized public_key" do
|
588
|
-
@node.to_serialized_hex.
|
589
|
-
@node.to_serialized_address.
|
594
|
+
expect(@node.to_serialized_hex).to eql("0488b21e025a61ff8effffffffbe17a268474a6bb9c61e1d720cf6215e2a88c5406c4aee7b38547f585c9a37d903c01e7425647bdefa82b12d9bad5e3e6865bee0502694b94ca58b666abc0a5c3b")
|
595
|
+
expect(@node.to_serialized_address).to eql("xpub6ASAVgeehLbnwdqV6UKMHVzgqAG8Gr6riv3Fxxpj8ksbH9ebxaEyBLZ85ySDhKiLDBrQSARLq1uNRts8RuJiHjaDMBU4Zn9h8LZNnBC5y4a")
|
590
596
|
end
|
591
597
|
end
|
592
598
|
|
@@ -596,44 +602,44 @@ describe MoneyTree::Master do
|
|
596
602
|
end
|
597
603
|
|
598
604
|
it "has an index of 1" do
|
599
|
-
@node.index.
|
605
|
+
expect(@node.index).to eql(1)
|
600
606
|
end
|
601
607
|
|
602
608
|
it "has a depth of 3" do
|
603
|
-
@node.depth.
|
609
|
+
expect(@node.depth).to eql(3)
|
604
610
|
end
|
605
611
|
|
606
612
|
it "is private" do
|
607
|
-
@node.is_private
|
613
|
+
expect(@node.is_private?).to eql(false)
|
608
614
|
end
|
609
615
|
|
610
616
|
it "generates subnode" do
|
611
|
-
@node.to_identifier.
|
612
|
-
@node.to_fingerprint.
|
613
|
-
@node.to_address.
|
617
|
+
expect(@node.to_identifier).to eql("78412e3a2296a40de124307b6485bd19833e2e34")
|
618
|
+
expect(@node.to_fingerprint).to eql("78412e3a")
|
619
|
+
expect(@node.to_address).to eql("1BxrAr2pHpeBheusmd6fHDP2tSLAUa3qsW")
|
614
620
|
end
|
615
621
|
|
616
622
|
it "generates a private key" do
|
617
|
-
@node.private_key.to_hex.
|
618
|
-
@node.private_key.to_wif.
|
623
|
+
expect(@node.private_key.to_hex).to eql("704addf544a06e5ee4bea37098463c23613da32020d604506da8c0518e1da4b7")
|
624
|
+
expect(@node.private_key.to_wif).to eql("KzyzXnznxSv249b4KuNkBwowaN3akiNeEHy5FWoPCJpStZbEKXN2")
|
619
625
|
end
|
620
626
|
|
621
627
|
it "generates a public key" do
|
622
|
-
@node.public_key.to_hex.
|
628
|
+
expect(@node.public_key.to_hex).to eql("03a7d1d856deb74c508e05031f9895dab54626251b3806e16b4bd12e781a7df5b9")
|
623
629
|
end
|
624
630
|
|
625
631
|
it "generates a chain code" do
|
626
|
-
@node.chain_code_hex.
|
632
|
+
expect(@node.chain_code_hex).to eql("f366f48f1ea9f2d1d3fe958c95ca84ea18e4c4ddb9366c336c927eb246fb38cb")
|
627
633
|
end
|
628
634
|
|
629
635
|
it "generates a serialized private key" do
|
630
|
-
@node.to_serialized_hex(:private).
|
631
|
-
@node.to_serialized_address(:private).
|
636
|
+
expect(@node.to_serialized_hex(:private)).to eql("0488ade403d8ab493700000001f366f48f1ea9f2d1d3fe958c95ca84ea18e4c4ddb9366c336c927eb246fb38cb00704addf544a06e5ee4bea37098463c23613da32020d604506da8c0518e1da4b7")
|
637
|
+
expect(@node.to_serialized_address(:private)).to eql("xprv9zFnWC6h2cLgpmSA46vutJzBcfJ8yaJGg8cX1e5StJh45BBciYTRXSd25UEPVuesF9yog62tGAQtHjXajPPdbRCHuWS6T8XA2ECKADdw4Ef")
|
632
638
|
end
|
633
639
|
|
634
640
|
it "generates a serialized public_key" do
|
635
|
-
@node.to_serialized_hex.
|
636
|
-
@node.to_serialized_address.
|
641
|
+
expect(@node.to_serialized_hex).to eql("0488b21e03d8ab493700000001f366f48f1ea9f2d1d3fe958c95ca84ea18e4c4ddb9366c336c927eb246fb38cb03a7d1d856deb74c508e05031f9895dab54626251b3806e16b4bd12e781a7df5b9")
|
642
|
+
expect(@node.to_serialized_address).to eql("xpub6DF8uhdarytz3FWdA8TvFSvvAh8dP3283MY7p2V4SeE2wyWmG5mg5EwVvmdMVCQcoNJxGoWaU9DCWh89LojfZ537wTfunKau47EL2dhHKon")
|
637
643
|
end
|
638
644
|
end
|
639
645
|
|
@@ -643,44 +649,44 @@ describe MoneyTree::Master do
|
|
643
649
|
end
|
644
650
|
|
645
651
|
it "has an index of 4294967294" do
|
646
|
-
@node.index.
|
652
|
+
expect(@node.index).to eql(4294967294)
|
647
653
|
end
|
648
654
|
|
649
655
|
it "has a depth of 4" do
|
650
|
-
@node.depth.
|
656
|
+
expect(@node.depth).to eql(4)
|
651
657
|
end
|
652
658
|
|
653
659
|
it "is private" do
|
654
|
-
@node.is_private
|
660
|
+
expect(@node.is_private?).to eql(true)
|
655
661
|
end
|
656
662
|
|
657
663
|
it "generates subnode" do
|
658
|
-
@node.to_identifier.
|
659
|
-
@node.to_fingerprint.
|
660
|
-
@node.to_address.
|
664
|
+
expect(@node.to_identifier).to eql("31a507b815593dfc51ffc7245ae7e5aee304246e")
|
665
|
+
expect(@node.to_fingerprint).to eql("31a507b8")
|
666
|
+
expect(@node.to_address).to eql("15XVotxCAV7sRx1PSCkQNsGw3W9jT9A94R")
|
661
667
|
end
|
662
668
|
|
663
669
|
it "generates a private key" do
|
664
|
-
@node.private_key.to_hex.
|
665
|
-
@node.private_key.to_wif.
|
670
|
+
expect(@node.private_key.to_hex).to eql("f1c7c871a54a804afe328b4c83a1c33b8e5ff48f5087273f04efa83b247d6a2d")
|
671
|
+
expect(@node.private_key.to_wif).to eql("L5KhaMvPYRW1ZoFmRjUtxxPypQ94m6BcDrPhqArhggdaTbbAFJEF")
|
666
672
|
end
|
667
673
|
|
668
674
|
it "generates a public key" do
|
669
|
-
@node.public_key.to_hex.
|
675
|
+
expect(@node.public_key.to_hex).to eql("02d2b36900396c9282fa14628566582f206a5dd0bcc8d5e892611806cafb0301f0")
|
670
676
|
end
|
671
677
|
|
672
678
|
it "generates a chain code" do
|
673
|
-
@node.chain_code_hex.
|
679
|
+
expect(@node.chain_code_hex).to eql("637807030d55d01f9a0cb3a7839515d796bd07706386a6eddf06cc29a65a0e29")
|
674
680
|
end
|
675
681
|
|
676
682
|
it "generates a serialized private key" do
|
677
|
-
@node.to_serialized_hex(:private).
|
678
|
-
@node.to_serialized_address(:private).
|
683
|
+
expect(@node.to_serialized_hex(:private)).to eql("0488ade40478412e3afffffffe637807030d55d01f9a0cb3a7839515d796bd07706386a6eddf06cc29a65a0e2900f1c7c871a54a804afe328b4c83a1c33b8e5ff48f5087273f04efa83b247d6a2d")
|
684
|
+
expect(@node.to_serialized_address(:private)).to eql("xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc")
|
679
685
|
end
|
680
686
|
|
681
687
|
it "generates a serialized public_key" do
|
682
|
-
@node.to_serialized_hex.
|
683
|
-
@node.to_serialized_address.
|
688
|
+
expect(@node.to_serialized_hex).to eql("0488b21e0478412e3afffffffe637807030d55d01f9a0cb3a7839515d796bd07706386a6eddf06cc29a65a0e2902d2b36900396c9282fa14628566582f206a5dd0bcc8d5e892611806cafb0301f0")
|
689
|
+
expect(@node.to_serialized_address).to eql("xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL")
|
684
690
|
end
|
685
691
|
end
|
686
692
|
|
@@ -690,44 +696,44 @@ describe MoneyTree::Master do
|
|
690
696
|
end
|
691
697
|
|
692
698
|
it "has an index of 2" do
|
693
|
-
@node.index.
|
699
|
+
expect(@node.index).to eql(2)
|
694
700
|
end
|
695
701
|
|
696
702
|
it "has a depth of 4" do
|
697
|
-
@node.depth.
|
703
|
+
expect(@node.depth).to eql(5)
|
698
704
|
end
|
699
705
|
|
700
706
|
it "is public" do
|
701
|
-
@node.is_private
|
707
|
+
expect(@node.is_private?).to eql(false)
|
702
708
|
end
|
703
709
|
|
704
710
|
it "generates subnode" do
|
705
|
-
@node.to_identifier.
|
706
|
-
@node.to_fingerprint.
|
707
|
-
@node.to_address.
|
711
|
+
expect(@node.to_identifier).to eql("26132fdbe7bf89cbc64cf8dafa3f9f88b8666220")
|
712
|
+
expect(@node.to_fingerprint).to eql("26132fdb")
|
713
|
+
expect(@node.to_address).to eql("14UKfRV9ZPUp6ZC9PLhqbRtxdihW9em3xt")
|
708
714
|
end
|
709
715
|
|
710
716
|
it "generates a private key" do
|
711
|
-
@node.private_key.to_hex.
|
712
|
-
@node.private_key.to_wif.
|
717
|
+
expect(@node.private_key.to_hex).to eql("bb7d39bdb83ecf58f2fd82b6d918341cbef428661ef01ab97c28a4842125ac23")
|
718
|
+
expect(@node.private_key.to_wif).to eql("L3WAYNAZPxx1fr7KCz7GN9nD5qMBnNiqEJNJMU1z9MMaannAt4aK")
|
713
719
|
end
|
714
720
|
|
715
721
|
it "generates a public key" do
|
716
|
-
@node.public_key.to_hex.
|
722
|
+
expect(@node.public_key.to_hex).to eql("024d902e1a2fc7a8755ab5b694c575fce742c48d9ff192e63df5193e4c7afe1f9c")
|
717
723
|
end
|
718
724
|
|
719
725
|
it "generates a chain code" do
|
720
|
-
@node.chain_code_hex.
|
726
|
+
expect(@node.chain_code_hex).to eql("9452b549be8cea3ecb7a84bec10dcfd94afe4d129ebfd3b3cb58eedf394ed271")
|
721
727
|
end
|
722
728
|
|
723
729
|
it "generates a serialized private key" do
|
724
|
-
@node.to_serialized_hex(:private).
|
725
|
-
@node.to_serialized_address(:private).
|
730
|
+
expect(@node.to_serialized_hex(:private)).to eql("0488ade40531a507b8000000029452b549be8cea3ecb7a84bec10dcfd94afe4d129ebfd3b3cb58eedf394ed27100bb7d39bdb83ecf58f2fd82b6d918341cbef428661ef01ab97c28a4842125ac23")
|
731
|
+
expect(@node.to_serialized_address(:private)).to eql("xprvA2nrNbFZABcdryreWet9Ea4LvTJcGsqrMzxHx98MMrotbir7yrKCEXw7nadnHM8Dq38EGfSh6dqA9QWTyefMLEcBYJUuekgW4BYPJcr9E7j")
|
726
732
|
end
|
727
733
|
|
728
734
|
it "generates a serialized public_key" do
|
729
|
-
@node.to_serialized_hex.
|
730
|
-
@node.to_serialized_address.
|
735
|
+
expect(@node.to_serialized_hex).to eql("0488b21e0531a507b8000000029452b549be8cea3ecb7a84bec10dcfd94afe4d129ebfd3b3cb58eedf394ed271024d902e1a2fc7a8755ab5b694c575fce742c48d9ff192e63df5193e4c7afe1f9c")
|
736
|
+
expect(@node.to_serialized_address).to eql("xpub6FnCn6nSzZAw5Tw7cgR9bi15UV96gLZhjDstkXXxvCLsUXBGXPdSnLFbdpq8p9HmGsApME5hQTZ3emM2rnY5agb9rXpVGyy3bdW6EEgAtqt")
|
731
737
|
end
|
732
738
|
end
|
733
739
|
end
|
@@ -740,25 +746,25 @@ describe MoneyTree::Master do
|
|
740
746
|
end
|
741
747
|
|
742
748
|
it "has an index of 1" do
|
743
|
-
@node.index.
|
749
|
+
expect(@node.index).to eql(-1)
|
744
750
|
end
|
745
751
|
|
746
752
|
it "is public" do
|
747
|
-
@node.is_private
|
753
|
+
expect(@node.is_private?).to eql(true)
|
748
754
|
end
|
749
755
|
|
750
756
|
it "has a depth of 2" do
|
751
|
-
@node.depth.
|
757
|
+
expect(@node.depth).to eql(2)
|
752
758
|
end
|
753
759
|
|
754
760
|
it "generates a serialized private key" do
|
755
|
-
@node.to_serialized_hex(:private).
|
756
|
-
@node.to_serialized_address(:private).
|
761
|
+
expect(@node.to_serialized_hex(:private)).to eql("0488ade4025c1bd648ffffffff0f9ca680ee23c81a305d96b86f811947e65590200b6f74d66ecf83936313a9c900235893db08ad0efc6ae4a1eac5b31a90a7d0906403d139d4d7f3c6796fb42c4e")
|
762
|
+
expect(@node.to_serialized_address(:private)).to eql("xprv9wTYmMFvAM7JHf3RuUidc24a4y2t4gN7aNP5ABreWAqt6BUBcf6xE8RNQxj2vUssYWM8iAZiZi5H1fmKkkpXjtwDCDv1pg8fSfQMk9rhHYt")
|
757
763
|
end
|
758
764
|
|
759
765
|
it "generates a serialized public_key" do
|
760
|
-
@node.to_serialized_hex.
|
761
|
-
@node.to_serialized_address.
|
766
|
+
expect(@node.to_serialized_hex).to eql("0488b21e025c1bd648ffffffff0f9ca680ee23c81a305d96b86f811947e65590200b6f74d66ecf83936313a9c902adb7979a5e99bf8acdfec3680bf482feac9898b28808c22d47db62e98de5d3fa")
|
767
|
+
expect(@node.to_serialized_address).to eql("xpub6ASuArnozifbW97u1WFdyA1JczsNU95xwbJfxaGG4WNrxyoLACRCmvjrGEojsRsoZULf5FyZXv6AWAtce2UErsshvkpjNaT1fP6sMgTZdc1")
|
762
768
|
end
|
763
769
|
end
|
764
770
|
|
@@ -766,24 +772,34 @@ describe MoneyTree::Master do
|
|
766
772
|
describe ".from_serialized_address(address)" do
|
767
773
|
it "imports a valid private node address" do
|
768
774
|
@node = MoneyTree::Node.from_serialized_address "xprv9uHRZZhk6KAJC1avXpDAp4MDc3sQKNxDiPvvkX8Br5ngLNv1TxvUxt4cV1rGL5hj6KCesnDYUhd7oWgT11eZG7XnxHrnYeSvkzY7d2bhkJ7"
|
769
|
-
@node.private_key.to_hex.
|
770
|
-
@node.index.
|
771
|
-
@node.is_private
|
772
|
-
@node.depth.
|
773
|
-
@node.public_key.to_hex.
|
774
|
-
@node.chain_code_hex.
|
775
|
-
@node.parent_fingerprint.
|
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")
|
776
782
|
end
|
777
783
|
|
778
784
|
it "imports a valid public node address" do
|
779
785
|
@node = MoneyTree::Node.from_serialized_address "xpub68Gmy5EdvgibQVfPdqkBBCHxA5htiqg55crXYuXoQRKfDBFA1WEjWgP6LHhwBZeNK1VTsfTFUHCdrfp1bgwQ9xv5ski8PX9rL2dZXvgGDnw"
|
780
|
-
@node.private_key.
|
781
|
-
@node.index.
|
782
|
-
@node.is_private
|
783
|
-
@node.depth.
|
784
|
-
@node.public_key.to_hex.
|
785
|
-
@node.chain_code_hex.
|
786
|
-
@node.parent_fingerprint.
|
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_serialized_address "tpubD6NzVbkrYhZ4WM42MZZmUZ7LjxyjBf5bGjEeLf9nJnMZqocGJWu94drvpqWsE9jE7k3h22v6gjpPGnqgBrqwGsRYwDXVRfQ2M9dfHbXP5zA"
|
801
|
+
@subnode = @node.node_for_path('m/1')
|
802
|
+
expect(@subnode.to_serialized_address).to eql("tpubDA7bCxb3Nrcz2ChXyPqXxbG4q5oiAZUHR7wD3LAiXukuxmT65weWw84XYmjhkJTkJEM6LhNWioWTpKEkQp7j2fgVccj3PPc271xHDeMsaTY")
|
787
803
|
end
|
788
804
|
end
|
789
805
|
end
|