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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7ed16071f92b2708bab3c5f2b6bedcb059879ab4
4
- data.tar.gz: 6cf07c4bab76d4c13f27b352c1851615afe63229
3
+ metadata.gz: d626fc55825195bcbd6c57406598ed66ed9ebeaf
4
+ data.tar.gz: b1e82a84328bf2fcf4366ccf7995a156f5a09b43
5
5
  SHA512:
6
- metadata.gz: 99cb55b14f28c53ba6704c6ec442ed6e5e6b73272ebb96c65cc83bbb892c1d561fa77c50ecbc26f98b16b407431717360203877d20c616da7574e1b5e85638b4
7
- data.tar.gz: 7998c7a665b64577ca2833cf191237ddaa4e29e604e497ebb403c8897e0a56b28b0d46d4725af777720421a99a7eecd734c758d98b2eed69f1f50d3994dd190e
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
- Beacause 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:
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
@@ -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
 
@@ -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 int_to_bytes(chain_code), message
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 int_to_bytes(chain_code), message
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.to_ripemd160
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
 
@@ -1,3 +1,3 @@
1
1
  module MoneyTree
2
- VERSION = "0.8.8"
2
+ VERSION = "0.8.9"
3
3
  end
@@ -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 :EC_POINT_free, [:pointer], :int
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
- EC_POINT_free(sum_point)
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.should == 64
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.should == 66
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.should == "5eae5375fb5f7a0ea650566363befa2830ef441bdcb19198adf318faee86d64b"
18
- address.public_key.key.should == "022dfc2557a007c93092c2915f11e8aa70c4f399a6753e2e908330014091580e4b"
19
- address.to_s.should == "13uVqa35BMo4mYq9LiZrXVzoz9EFZ6aoXe"
20
- address.private_key.to_s.should == "KzPkwAXJ4wtXHnbamTaJqoMrzwCUUJaqhUxnqYhnZvZH6KhgmDPK"
21
- address.public_key.to_s.should == "13uVqa35BMo4mYq9LiZrXVzoz9EFZ6aoXe"
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.should == "5eae5375fb5f7a0ea650566363befa2830ef441bdcb19198adf318faee86d64b"
27
- address.public_key.key.should == "022dfc2557a007c93092c2915f11e8aa70c4f399a6753e2e908330014091580e4b"
28
- address.to_s.should == "13uVqa35BMo4mYq9LiZrXVzoz9EFZ6aoXe"
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.should == "5eae5375fb5f7a0ea650566363befa2830ef441bdcb19198adf318faee86d64b"
34
- address.public_key.key.should == "022dfc2557a007c93092c2915f11e8aa70c4f399a6753e2e908330014091580e4b"
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.should == "13uVqa35BMo4mYq9LiZrXVzoz9EFZ6aoXe"
45
- @address.public_key.to_s.should == "13uVqa35BMo4mYq9LiZrXVzoz9EFZ6aoXe"
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.should == "KzPkwAXJ4wtXHnbamTaJqoMrzwCUUJaqhUxnqYhnZvZH6KhgmDPK"
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).should include(@address.to_s[0])
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.should == 32
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.should respond_to(:seed_hex)
17
- @master.seed_hex.size.should == 64
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).should include(@master.to_address[0])
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].should == 'c'
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].should == '9'
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).should == "tprv"
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).should == "tpub"
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).should == 'tprv8ZgxMBicQKsPcuN7bfUZqq78UEYapr3Tzmc9NcDXw8BnBJ47dZYr6SusnfYj7vbAYP9CP8ZiD5aVBTUo1yU5QP56mepKVvuEbu8KZQXMKNE'
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).should include(node.public_key.to_s[0])
54
- node.to_serialized_address.should == 'tpubD6NzVbkrYhZ4YA8aUE9bBZTSyHJibBqwDny5urfwDdJc4W8od3y3Ebzy6CqsYn9CCC5P5VQ7CeZYpnT1kX3RPVPysU2rFRvYSj8BCoYYNqT'
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).should include(subnode.public_key.to_s[0])
61
- subnode.to_serialized_address(:private).slice(0,4).should == 'tprv'
62
- subnode.to_serialized_address.slice(0,4).should == 'tpub'
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).should include(subnode.public_key.to_s[0])
69
- subnode.to_serialized_address.slice(0,4).should == 'tpub'
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.should == 0
81
+ expect(@master.index).to eql(0)
82
82
  end
83
83
 
84
84
  it "is private" do
85
- @master.is_private?.should == true
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.should == 0
89
+ expect(@master.depth).to eql(0)
90
90
  end
91
91
 
92
92
  it "generates master node (Master)" do
93
- @master.to_identifier.should == "3442193e1bb70916e914552172cd4e2dbc9df811"
94
- @master.to_fingerprint.should == "3442193e"
95
- @master.to_address.should == "15mKKb2eos1hWa6tisdPwwDC1a5J1y9nma"
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.should == "e8f32e723decf4051aefac8e2c93c9c5b214313817cdb01a1494b917c8436b35"
100
- @master.private_key.to_wif.should == "L52XzL2cMkHxqxBXRyEpnPQZGUs3uKiL3R11XbAdHigRzDozKZeW"
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.should == "0339a36013301597daef41fbe593a02cc513d0b55527ec2df1050e2e8ff49c85c2"
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.should == "873dff81c02f525623fd1fe5167eac3a55a049de3d314bb42ee227ffed37d508"
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).should == "0488ade4000000000000000000873dff81c02f525623fd1fe5167eac3a55a049de3d314bb42ee227ffed37d50800e8f32e723decf4051aefac8e2c93c9c5b214313817cdb01a1494b917c8436b35"
113
- @master.to_serialized_address(:private).should == "xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi"
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.should == "0488b21e000000000000000000873dff81c02f525623fd1fe5167eac3a55a049de3d314bb42ee227ffed37d5080339a36013301597daef41fbe593a02cc513d0b55527ec2df1050e2e8ff49c85c2"
118
- @master.to_serialized_address.should == "xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8"
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.should == 2147483648
128
+ expect(@node.index).to eql(2147483648)
129
129
  end
130
130
 
131
131
  it "is private" do
132
- @node.is_private?.should == true
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.should == 1
136
+ expect(@node.depth).to eql(1)
137
137
  end
138
138
 
139
139
  it "generates subnode" do
140
- @node.to_identifier.should == "5c1bd648ed23aa5fd50ba52b2457c11e9e80a6a7"
141
- @node.to_fingerprint.should == "5c1bd648"
142
- @node.to_address.should == "19Q2WoS5hSS6T8GjhK8KZLMgmWaq4neXrh"
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.should == "edb2e14f9ee77d26dd93b4ecede8d16ed408ce149b6cd80b0715a2d911a0afea"
147
- @node.private_key.to_wif.should == "L5BmPijJjrKbiUfG4zbiFKNqkvuJ8usooJmzuD7Z8dkRoTThYnAT"
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.should == "035a784662a4a20a65bf6aab9ae98a6c068a81c52e4b032c0fb5400c706cfccc56"
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.should == "47fdacbd0f1097043b78c63c20c34ef4ed9a111d980047ad16282c7ae6236141"
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).should == "0488ade4013442193e8000000047fdacbd0f1097043b78c63c20c34ef4ed9a111d980047ad16282c7ae623614100edb2e14f9ee77d26dd93b4ecede8d16ed408ce149b6cd80b0715a2d911a0afea"
160
- @node.to_serialized_address(:private).should == "xprv9uHRZZhk6KAJC1avXpDAp4MDc3sQKNxDiPvvkX8Br5ngLNv1TxvUxt4cV1rGL5hj6KCesnDYUhd7oWgT11eZG7XnxHrnYeSvkzY7d2bhkJ7"
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.should == "0488b21e013442193e8000000047fdacbd0f1097043b78c63c20c34ef4ed9a111d980047ad16282c7ae6236141035a784662a4a20a65bf6aab9ae98a6c068a81c52e4b032c0fb5400c706cfccc56"
165
- @node.to_serialized_address.should == "xpub68Gmy5EdvgibQVfPdqkBBCHxA5htiqg55crXYuXoQRKfDBFA1WEjWgP6LHhwBZeNK1VTsfTFUHCdrfp1bgwQ9xv5ski8PX9rL2dZXvgGDnw"
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.should == 2147483648
175
+ expect(@node.index).to eql(2147483648)
176
176
  end
177
177
 
178
178
  it "is private" do
179
- @node.is_private?.should == true
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.should == 1
183
+ expect(@node.depth).to eql(1)
184
184
  end
185
185
 
186
186
  it "generates subnode" do
187
- @node.to_identifier.should == "5c1bd648ed23aa5fd50ba52b2457c11e9e80a6a7"
188
- @node.to_fingerprint.should == "5c1bd648"
189
- @node.to_address.should == "19Q2WoS5hSS6T8GjhK8KZLMgmWaq4neXrh"
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.should be_nil
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.should == "035a784662a4a20a65bf6aab9ae98a6c068a81c52e4b032c0fb5400c706cfccc56"
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.should == "47fdacbd0f1097043b78c63c20c34ef4ed9a111d980047ad16282c7ae6236141"
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
- lambda { @node.to_serialized_hex(:private) }.should raise_error(MoneyTree::Node::PrivatePublicMismatch)
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.should == "0488b21e013442193e8000000047fdacbd0f1097043b78c63c20c34ef4ed9a111d980047ad16282c7ae6236141035a784662a4a20a65bf6aab9ae98a6c068a81c52e4b032c0fb5400c706cfccc56"
210
- @node.to_serialized_address.should == "xpub68Gmy5EdvgibQVfPdqkBBCHxA5htiqg55crXYuXoQRKfDBFA1WEjWgP6LHhwBZeNK1VTsfTFUHCdrfp1bgwQ9xv5ski8PX9rL2dZXvgGDnw"
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.should == 1
220
+ expect(@node.index).to eql(1)
221
221
  end
222
222
 
223
223
  it "is public" do
224
- @node.is_private?.should == false
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.should == 2
228
+ expect(@node.depth).to eql(2)
229
229
  end
230
230
 
231
231
  it "generates subnode" do
232
- @node.to_identifier.should == "bef5a2f9a56a94aab12459f72ad9cf8cf19c7bbe"
233
- @node.to_fingerprint.should == "bef5a2f9"
234
- @node.to_address.should == "1JQheacLPdM5ySCkrZkV66G2ApAXe1mqLj"
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.should == "3c6cb8d0f6a264c91ea8b5030fadaa8e538b020f0a387421a12de9319dc93368"
239
- @node.private_key.to_wif.should == "KyFAjQ5rgrKvhXvNMtFB5PCSKUYD1yyPEe3xr3T34TZSUHycXtMM"
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.should == "03501e454bf00751f24b1b489aa925215d66af2234e3891c3b21a52bedb3cd711c"
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.should == "2a7857631386ba23dacac34180dd1983734e444fdbf774041578e9b6adb37c19"
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).should == "0488ade4025c1bd648000000012a7857631386ba23dacac34180dd1983734e444fdbf774041578e9b6adb37c19003c6cb8d0f6a264c91ea8b5030fadaa8e538b020f0a387421a12de9319dc93368"
252
- @node.to_serialized_address(:private).should == "xprv9wTYmMFdV23N2TdNG573QoEsfRrWKQgWeibmLntzniatZvR9BmLnvSxqu53Kw1UmYPxLgboyZQaXwTCg8MSY3H2EU4pWcQDnRnrVA1xe8fs"
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.should == "0488b21e025c1bd648000000012a7857631386ba23dacac34180dd1983734e444fdbf774041578e9b6adb37c1903501e454bf00751f24b1b489aa925215d66af2234e3891c3b21a52bedb3cd711c"
257
- @node.to_serialized_address.should == "xpub6ASuArnXKPbfEwhqN6e3mwBcDTgzisQN1wXN9BJcM47sSikHjJf3UFHKkNAWbWMiGj7Wf5uMash7SyYq527Hqck2AxYysAA7xmALppuCkwQ"
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.should == 1
267
+ expect(@node.index).to eql(1)
268
268
  end
269
269
 
270
270
  it "is public" do
271
- @node.is_private?.should == false
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.should == 2
275
+ expect(@node.depth).to eql(2)
276
276
  end
277
277
 
278
278
  it "generates subnode" do
279
- @node.to_identifier.should == "bef5a2f9a56a94aab12459f72ad9cf8cf19c7bbe"
280
- @node.to_fingerprint.should == "bef5a2f9"
281
- @node.to_address.should == "1JQheacLPdM5ySCkrZkV66G2ApAXe1mqLj"
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.should be_nil
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.should == "03501e454bf00751f24b1b489aa925215d66af2234e3891c3b21a52bedb3cd711c"
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.should == "2a7857631386ba23dacac34180dd1983734e444fdbf774041578e9b6adb37c19"
293
+ expect(@node.chain_code_hex).to eql("2a7857631386ba23dacac34180dd1983734e444fdbf774041578e9b6adb37c19")
294
294
  end
295
295
 
296
296
  it "generates a serialized private key" do
297
- lambda { @node.to_serialized_hex(:private) }.should raise_error(MoneyTree::Node::PrivatePublicMismatch)
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.should == "0488b21e025c1bd648000000012a7857631386ba23dacac34180dd1983734e444fdbf774041578e9b6adb37c1903501e454bf00751f24b1b489aa925215d66af2234e3891c3b21a52bedb3cd711c"
302
- @node.to_serialized_address.should == "xpub6ASuArnXKPbfEwhqN6e3mwBcDTgzisQN1wXN9BJcM47sSikHjJf3UFHKkNAWbWMiGj7Wf5uMash7SyYq527Hqck2AxYysAA7xmALppuCkwQ"
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.should == 2
312
+ expect(@node.index).to eql(2)
313
313
  end
314
314
 
315
315
  it "is public" do
316
- @node.is_private?.should == false
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.should == 4
320
+ expect(@node.depth).to eql(4)
321
321
  end
322
322
 
323
323
  it "generates subnode" do
324
- @node.to_identifier.should == "d880d7d893848509a62d8fb74e32148dac68412f"
325
- @node.to_fingerprint.should == "d880d7d8"
326
- @node.to_address.should == "1LjmJcdPnDHhNTUgrWyhLGnRDKxQjoxAgt"
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.should == "0f479245fb19a38a1954c5c7c0ebab2f9bdfd96a17563ef28a6a4b1a2a764ef4"
331
- @node.private_key.to_wif.should == "KwjQsVuMjbCP2Zmr3VaFaStav7NvevwjvvkqrWd5Qmh1XVnCteBR"
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.should == "02e8445082a72f29b75ca48748a914df60622a609cacfce8ed0e35804560741d29"
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.should == "cfb71883f01676f587d023cc53a35bc7f88f724b1f8c2892ac1275ac822a3edd"
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).should == "0488ade404ee7ab90c00000002cfb71883f01676f587d023cc53a35bc7f88f724b1f8c2892ac1275ac822a3edd000f479245fb19a38a1954c5c7c0ebab2f9bdfd96a17563ef28a6a4b1a2a764ef4"
344
- @node.to_serialized_address(:private).should == "xprvA2JDeKCSNNZky6uBCviVfJSKyQ1mDYahRjijr5idH2WwLsEd4Hsb2Tyh8RfQMuPh7f7RtyzTtdrbdqqsunu5Mm3wDvUAKRHSC34sJ7in334"
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.should == "0488b21e04ee7ab90c00000002cfb71883f01676f587d023cc53a35bc7f88f724b1f8c2892ac1275ac822a3edd02e8445082a72f29b75ca48748a914df60622a609cacfce8ed0e35804560741d29"
349
- @node.to_serialized_address.should == "xpub6FHa3pjLCk84BayeJxFW2SP4XRrFd1JYnxeLeU8EqN3vDfZmbqBqaGJAyiLjTAwm6ZLRQUMv1ZACTj37sR62cfN7fe5JnJ7dh8zL4fiyLHV"
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.should == 1000000000
359
+ expect(@node.index).to eql(1000000000)
360
360
  end
361
361
 
362
362
  it "is public" do
363
- @node.is_private?.should == false
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.should == 5
367
+ expect(@node.depth).to eql(5)
368
368
  end
369
369
 
370
370
  it "generates subnode" do
371
- @node.to_identifier.should == "d69aa102255fed74378278c7812701ea641fdf32"
372
- @node.to_fingerprint.should == "d69aa102"
373
- @node.to_address.should == "1LZiqrop2HGR4qrH1ULZPyBpU6AUP49Uam"
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.should == "471b76e389e528d6de6d816857e012c5455051cad6660850e58372a6c3e6e7c8"
378
- @node.private_key.to_wif.should == "Kybw8izYevo5xMh1TK7aUr7jHFCxXS1zv8p3oqFz3o2zFbhRXHYs"
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.should == "022a471424da5e657499d1ff51cb43c47481a03b1e77f951fe64cec9f5a48f7011"
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.should == "c783e67b921d2beb8f6b389cc646d7263b4145701dadd2161548a8b078e65e9e"
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).should == "0488ade405d880d7d83b9aca00c783e67b921d2beb8f6b389cc646d7263b4145701dadd2161548a8b078e65e9e00471b76e389e528d6de6d816857e012c5455051cad6660850e58372a6c3e6e7c8"
391
- @node.to_serialized_address(:private).should == "xprvA41z7zogVVwxVSgdKUHDy1SKmdb533PjDz7J6N6mV6uS3ze1ai8FHa8kmHScGpWmj4WggLyQjgPie1rFSruoUihUZREPSL39UNdE3BBDu76"
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.should == "0488b21e05d880d7d83b9aca00c783e67b921d2beb8f6b389cc646d7263b4145701dadd2161548a8b078e65e9e022a471424da5e657499d1ff51cb43c47481a03b1e77f951fe64cec9f5a48f7011"
396
- @node.to_serialized_address.should == "xpub6H1LXWLaKsWFhvm6RVpEL9P4KfRZSW7abD2ttkWP3SSQvnyA8FSVqNTEcYFgJS2UaFcxupHiYkro49S8yGasTvXEYBVPamhGW6cFJodrTHy"
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.should == 0
410
+ expect(@master.index).to eql(0)
411
411
  end
412
412
 
413
413
  it "has a depth of 0" do
414
- @master.depth.should == 0
414
+ expect(@master.depth).to eql(0)
415
415
  end
416
416
 
417
417
  it "is private" do
418
- @master.is_private?.should == true
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.should == "bd16bee53961a47d6ad888e29545434a89bdfe95"
423
- @master.to_fingerprint.should == "bd16bee5"
424
- @master.to_address.should == "1JEoxevbLLG8cVqeoGKQiAwoWbNYSUyYjg"
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.should == "4b03d6fc340455b363f51020ad3ecca4f0850280cf436c70c727923f6db46c3e"
429
- @master.private_key.to_wif.should == "KyjXhyHF9wTphBkfpxjL8hkDXDUSbE3tKANT94kXSyh6vn6nKaoy"
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.should == "03cbcaa9c98c877a26977d00825c956a238e8dddfbd322cce4f74b0b5bd6ace4a7"
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.should == "60499f801b896d83179a4374aeb7822aaeaceaa0db1f85ee3e904c4defbd9689"
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).should == "0488ade400000000000000000060499f801b896d83179a4374aeb7822aaeaceaa0db1f85ee3e904c4defbd9689004b03d6fc340455b363f51020ad3ecca4f0850280cf436c70c727923f6db46c3e"
442
- @master.to_serialized_address(:private).should == "xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U"
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.should == "0488b21e00000000000000000060499f801b896d83179a4374aeb7822aaeaceaa0db1f85ee3e904c4defbd968903cbcaa9c98c877a26977d00825c956a238e8dddfbd322cce4f74b0b5bd6ace4a7"
447
- @master.to_serialized_address.should == "xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB"
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.should == 0
464
+ expect(@node.index).to eql(0)
459
465
  end
460
466
 
461
467
  it "has a depth of 1" do
462
- @node.depth.should == 1
468
+ expect(@node.depth).to eql(1)
463
469
  end
464
470
 
465
471
  it "is public" do
466
- @node.is_private?.should == false
472
+ expect(@node.is_private?).to eql(false)
467
473
  end
468
474
 
469
475
  it "generates subnode" do
470
- @node.to_identifier.should == "5a61ff8eb7aaca3010db97ebda76121610b78096"
471
- @node.to_fingerprint.should == "5a61ff8e"
472
- @node.to_address.should == "19EuDJdgfRkwCmRzbzVBHZWQG9QNWhftbZ"
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.should == "abe74a98f6c7eabee0428f53798f0ab8aa1bd37873999041703c742f15ac7e1e"
477
- @node.private_key.to_wif.should == "L2ysLrR6KMSAtx7uPqmYpoTeiRzydXBattRXjXz5GDFPrdfPzKbj"
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.should == "02fc9e5af0ac8d9b3cecfe2a888e2117ba3d089d8585886c9c826b6b22a98d12ea"
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.should == "f0909affaa7ee7abe5dd4e100598d4dc53cd709d5a5c2cac40e7412f232f7c9c"
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).should == "0488ade401bd16bee500000000f0909affaa7ee7abe5dd4e100598d4dc53cd709d5a5c2cac40e7412f232f7c9c00abe74a98f6c7eabee0428f53798f0ab8aa1bd37873999041703c742f15ac7e1e"
490
- @node.to_serialized_address(:private).should == "xprv9vHkqa6EV4sPZHYqZznhT2NPtPCjKuDKGY38FBWLvgaDx45zo9WQRUT3dKYnjwih2yJD9mkrocEZXo1ex8G81dwSM1fwqWpWkeS3v86pgKt"
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.should == "0488b21e01bd16bee500000000f0909affaa7ee7abe5dd4e100598d4dc53cd709d5a5c2cac40e7412f232f7c9c02fc9e5af0ac8d9b3cecfe2a888e2117ba3d089d8585886c9c826b6b22a98d12ea"
495
- @node.to_serialized_address.should == "xpub69H7F5d8KSRgmmdJg2KhpAK8SR3DjMwAdkxj3ZuxV27CprR9LgpeyGmXUbC6wb7ERfvrnKZjXoUmmDznezpbZb7ap6r1D3tgFxHmwMkQTPH"
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.should == 0
512
+ expect(@node.index).to eql(0)
507
513
  end
508
514
 
509
515
  it "has a depth of 1" do
510
- @node.depth.should == 1
516
+ expect(@node.depth).to eql(1)
511
517
  end
512
518
 
513
519
  it "is public" do
514
- @node.is_private?.should == false
520
+ expect(@node.is_private?).to eql(false)
515
521
  end
516
522
 
517
523
  it "generates subnode" do
518
- @node.to_identifier.should == "5a61ff8eb7aaca3010db97ebda76121610b78096"
519
- @node.to_fingerprint.should == "5a61ff8e"
520
- @node.to_address.should == "19EuDJdgfRkwCmRzbzVBHZWQG9QNWhftbZ"
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.should be_nil
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.should == "02fc9e5af0ac8d9b3cecfe2a888e2117ba3d089d8585886c9c826b6b22a98d12ea"
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.should == "f0909affaa7ee7abe5dd4e100598d4dc53cd709d5a5c2cac40e7412f232f7c9c"
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
- lambda { @node.to_serialized_hex(:private) }.should raise_error(MoneyTree::Node::PrivatePublicMismatch)
537
- lambda { @node.to_serialized_address(:private) }.should raise_error(MoneyTree::Node::PrivatePublicMismatch)
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.should == "0488b21e01bd16bee500000000f0909affaa7ee7abe5dd4e100598d4dc53cd709d5a5c2cac40e7412f232f7c9c02fc9e5af0ac8d9b3cecfe2a888e2117ba3d089d8585886c9c826b6b22a98d12ea"
542
- @node.to_serialized_address.should == "xpub69H7F5d8KSRgmmdJg2KhpAK8SR3DjMwAdkxj3ZuxV27CprR9LgpeyGmXUbC6wb7ERfvrnKZjXoUmmDznezpbZb7ap6r1D3tgFxHmwMkQTPH"
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.should == 4294967295
558
+ expect(@node.index).to eql(4294967295)
553
559
  end
554
560
 
555
561
  it "has a depth of 2" do
556
- @node.depth.should == 2
562
+ expect(@node.depth).to eql(2)
557
563
  end
558
564
 
559
565
  it "is private" do
560
- @node.is_private?.should == true
566
+ expect(@node.is_private?).to eql(true)
561
567
  end
562
568
 
563
569
  it "generates subnode" do
564
- @node.to_identifier.should == "d8ab493736da02f11ed682f88339e720fb0379d1"
565
- @node.to_fingerprint.should == "d8ab4937"
566
- @node.to_address.should == "1Lke9bXGhn5VPrBuXgN12uGUphrttUErmk"
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.should == "877c779ad9687164e9c2f4f0f4ff0340814392330693ce95a58fe18fd52e6e93"
571
- @node.private_key.to_wif.should == "L1m5VpbXmMp57P3knskwhoMTLdhAAaXiHvnGLMribbfwzVRpz2Sr"
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.should == "03c01e7425647bdefa82b12d9bad5e3e6865bee0502694b94ca58b666abc0a5c3b"
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.should == "be17a268474a6bb9c61e1d720cf6215e2a88c5406c4aee7b38547f585c9a37d9"
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).should == "0488ade4025a61ff8effffffffbe17a268474a6bb9c61e1d720cf6215e2a88c5406c4aee7b38547f585c9a37d900877c779ad9687164e9c2f4f0f4ff0340814392330693ce95a58fe18fd52e6e93"
584
- @node.to_serialized_address(:private).should == "xprv9wSp6B7kry3Vj9m1zSnLvN3xH8RdsPP1Mh7fAaR7aRLcQMKTR2vidYEeEg2mUCTAwCd6vnxVrcjfy2kRgVsFawNzmjuHc2YmYRmagcEPdU9"
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.should == "0488b21e025a61ff8effffffffbe17a268474a6bb9c61e1d720cf6215e2a88c5406c4aee7b38547f585c9a37d903c01e7425647bdefa82b12d9bad5e3e6865bee0502694b94ca58b666abc0a5c3b"
589
- @node.to_serialized_address.should == "xpub6ASAVgeehLbnwdqV6UKMHVzgqAG8Gr6riv3Fxxpj8ksbH9ebxaEyBLZ85ySDhKiLDBrQSARLq1uNRts8RuJiHjaDMBU4Zn9h8LZNnBC5y4a"
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.should == 1
605
+ expect(@node.index).to eql(1)
600
606
  end
601
607
 
602
608
  it "has a depth of 3" do
603
- @node.depth.should == 3
609
+ expect(@node.depth).to eql(3)
604
610
  end
605
611
 
606
612
  it "is private" do
607
- @node.is_private?.should == false
613
+ expect(@node.is_private?).to eql(false)
608
614
  end
609
615
 
610
616
  it "generates subnode" do
611
- @node.to_identifier.should == "78412e3a2296a40de124307b6485bd19833e2e34"
612
- @node.to_fingerprint.should == "78412e3a"
613
- @node.to_address.should == "1BxrAr2pHpeBheusmd6fHDP2tSLAUa3qsW"
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.should == "704addf544a06e5ee4bea37098463c23613da32020d604506da8c0518e1da4b7"
618
- @node.private_key.to_wif.should == "KzyzXnznxSv249b4KuNkBwowaN3akiNeEHy5FWoPCJpStZbEKXN2"
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.should == "03a7d1d856deb74c508e05031f9895dab54626251b3806e16b4bd12e781a7df5b9"
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.should == "f366f48f1ea9f2d1d3fe958c95ca84ea18e4c4ddb9366c336c927eb246fb38cb"
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).should == "0488ade403d8ab493700000001f366f48f1ea9f2d1d3fe958c95ca84ea18e4c4ddb9366c336c927eb246fb38cb00704addf544a06e5ee4bea37098463c23613da32020d604506da8c0518e1da4b7"
631
- @node.to_serialized_address(:private).should == "xprv9zFnWC6h2cLgpmSA46vutJzBcfJ8yaJGg8cX1e5StJh45BBciYTRXSd25UEPVuesF9yog62tGAQtHjXajPPdbRCHuWS6T8XA2ECKADdw4Ef"
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.should == "0488b21e03d8ab493700000001f366f48f1ea9f2d1d3fe958c95ca84ea18e4c4ddb9366c336c927eb246fb38cb03a7d1d856deb74c508e05031f9895dab54626251b3806e16b4bd12e781a7df5b9"
636
- @node.to_serialized_address.should == "xpub6DF8uhdarytz3FWdA8TvFSvvAh8dP3283MY7p2V4SeE2wyWmG5mg5EwVvmdMVCQcoNJxGoWaU9DCWh89LojfZ537wTfunKau47EL2dhHKon"
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.should == 4294967294
652
+ expect(@node.index).to eql(4294967294)
647
653
  end
648
654
 
649
655
  it "has a depth of 4" do
650
- @node.depth.should == 4
656
+ expect(@node.depth).to eql(4)
651
657
  end
652
658
 
653
659
  it "is private" do
654
- @node.is_private?.should == true
660
+ expect(@node.is_private?).to eql(true)
655
661
  end
656
662
 
657
663
  it "generates subnode" do
658
- @node.to_identifier.should == "31a507b815593dfc51ffc7245ae7e5aee304246e"
659
- @node.to_fingerprint.should == "31a507b8"
660
- @node.to_address.should == "15XVotxCAV7sRx1PSCkQNsGw3W9jT9A94R"
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.should == "f1c7c871a54a804afe328b4c83a1c33b8e5ff48f5087273f04efa83b247d6a2d"
665
- @node.private_key.to_wif.should == "L5KhaMvPYRW1ZoFmRjUtxxPypQ94m6BcDrPhqArhggdaTbbAFJEF"
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.should == "02d2b36900396c9282fa14628566582f206a5dd0bcc8d5e892611806cafb0301f0"
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.should == "637807030d55d01f9a0cb3a7839515d796bd07706386a6eddf06cc29a65a0e29"
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).should == "0488ade40478412e3afffffffe637807030d55d01f9a0cb3a7839515d796bd07706386a6eddf06cc29a65a0e2900f1c7c871a54a804afe328b4c83a1c33b8e5ff48f5087273f04efa83b247d6a2d"
678
- @node.to_serialized_address(:private).should == "xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc"
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.should == "0488b21e0478412e3afffffffe637807030d55d01f9a0cb3a7839515d796bd07706386a6eddf06cc29a65a0e2902d2b36900396c9282fa14628566582f206a5dd0bcc8d5e892611806cafb0301f0"
683
- @node.to_serialized_address.should == "xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL"
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.should == 2
699
+ expect(@node.index).to eql(2)
694
700
  end
695
701
 
696
702
  it "has a depth of 4" do
697
- @node.depth.should == 5
703
+ expect(@node.depth).to eql(5)
698
704
  end
699
705
 
700
706
  it "is public" do
701
- @node.is_private?.should == false
707
+ expect(@node.is_private?).to eql(false)
702
708
  end
703
709
 
704
710
  it "generates subnode" do
705
- @node.to_identifier.should == "26132fdbe7bf89cbc64cf8dafa3f9f88b8666220"
706
- @node.to_fingerprint.should == "26132fdb"
707
- @node.to_address.should == "14UKfRV9ZPUp6ZC9PLhqbRtxdihW9em3xt"
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.should == "bb7d39bdb83ecf58f2fd82b6d918341cbef428661ef01ab97c28a4842125ac23"
712
- @node.private_key.to_wif.should == "L3WAYNAZPxx1fr7KCz7GN9nD5qMBnNiqEJNJMU1z9MMaannAt4aK"
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.should == "024d902e1a2fc7a8755ab5b694c575fce742c48d9ff192e63df5193e4c7afe1f9c"
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.should == "9452b549be8cea3ecb7a84bec10dcfd94afe4d129ebfd3b3cb58eedf394ed271"
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).should == "0488ade40531a507b8000000029452b549be8cea3ecb7a84bec10dcfd94afe4d129ebfd3b3cb58eedf394ed27100bb7d39bdb83ecf58f2fd82b6d918341cbef428661ef01ab97c28a4842125ac23"
725
- @node.to_serialized_address(:private).should == "xprvA2nrNbFZABcdryreWet9Ea4LvTJcGsqrMzxHx98MMrotbir7yrKCEXw7nadnHM8Dq38EGfSh6dqA9QWTyefMLEcBYJUuekgW4BYPJcr9E7j"
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.should == "0488b21e0531a507b8000000029452b549be8cea3ecb7a84bec10dcfd94afe4d129ebfd3b3cb58eedf394ed271024d902e1a2fc7a8755ab5b694c575fce742c48d9ff192e63df5193e4c7afe1f9c"
730
- @node.to_serialized_address.should == "xpub6FnCn6nSzZAw5Tw7cgR9bi15UV96gLZhjDstkXXxvCLsUXBGXPdSnLFbdpq8p9HmGsApME5hQTZ3emM2rnY5agb9rXpVGyy3bdW6EEgAtqt"
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.should == -1
749
+ expect(@node.index).to eql(-1)
744
750
  end
745
751
 
746
752
  it "is public" do
747
- @node.is_private?.should == true
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.should == 2
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).should == "0488ade4025c1bd648ffffffff0f9ca680ee23c81a305d96b86f811947e65590200b6f74d66ecf83936313a9c900235893db08ad0efc6ae4a1eac5b31a90a7d0906403d139d4d7f3c6796fb42c4e"
756
- @node.to_serialized_address(:private).should == "xprv9wTYmMFvAM7JHf3RuUidc24a4y2t4gN7aNP5ABreWAqt6BUBcf6xE8RNQxj2vUssYWM8iAZiZi5H1fmKkkpXjtwDCDv1pg8fSfQMk9rhHYt"
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.should == "0488b21e025c1bd648ffffffff0f9ca680ee23c81a305d96b86f811947e65590200b6f74d66ecf83936313a9c902adb7979a5e99bf8acdfec3680bf482feac9898b28808c22d47db62e98de5d3fa"
761
- @node.to_serialized_address.should == "xpub6ASuArnozifbW97u1WFdyA1JczsNU95xwbJfxaGG4WNrxyoLACRCmvjrGEojsRsoZULf5FyZXv6AWAtce2UErsshvkpjNaT1fP6sMgTZdc1"
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.should == "edb2e14f9ee77d26dd93b4ecede8d16ed408ce149b6cd80b0715a2d911a0afea"
770
- @node.index.should == 2147483648
771
- @node.is_private?.should == true
772
- @node.depth.should == 1
773
- @node.public_key.to_hex.should == "035a784662a4a20a65bf6aab9ae98a6c068a81c52e4b032c0fb5400c706cfccc56"
774
- @node.chain_code_hex.should == "47fdacbd0f1097043b78c63c20c34ef4ed9a111d980047ad16282c7ae6236141"
775
- @node.parent_fingerprint.should == "3442193e"
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.should be_nil
781
- @node.index.should == 2147483648
782
- @node.is_private?.should == true
783
- @node.depth.should == 1
784
- @node.public_key.to_hex.should == "035a784662a4a20a65bf6aab9ae98a6c068a81c52e4b032c0fb5400c706cfccc56"
785
- @node.chain_code_hex.should == "47fdacbd0f1097043b78c63c20c34ef4ed9a111d980047ad16282c7ae6236141"
786
- @node.parent_fingerprint.should == "3442193e"
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