money-tree-extended 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+
3
+ describe MoneyTree::OpenSSLExtensions do
4
+ include MoneyTree::OpenSSLExtensions
5
+
6
+ context "with inputs" do
7
+ let(:key1) { OpenSSL::PKey::EC.new("secp256k1").generate_key }
8
+ let(:key2) { OpenSSL::PKey::EC.new("secp256k1").generate_key }
9
+ let(:point_1) { key1.public_key }
10
+ let(:point_2) { key2.public_key }
11
+ let(:point_infinity) { key1.public_key.set_to_infinity! }
12
+
13
+ it "requires valid points" do
14
+ expect { MoneyTree::OpenSSLExtensions.add(0, 0) }.to raise_error(ArgumentError)
15
+ expect { MoneyTree::OpenSSLExtensions.add(nil, nil) }.to raise_error(ArgumentError)
16
+ expect { MoneyTree::OpenSSLExtensions.add(point_1, 0) }.to raise_error(ArgumentError)
17
+ expect { MoneyTree::OpenSSLExtensions.add(0, point_2) }.to raise_error(ArgumentError)
18
+ expect { MoneyTree::OpenSSLExtensions.add(point_infinity, point_2) }.to raise_error(ArgumentError)
19
+ expect { MoneyTree::OpenSSLExtensions.add(point_1, point_2) }.to_not raise_error
20
+ end
21
+ end
22
+
23
+ end
@@ -0,0 +1,121 @@
1
+ require 'spec_helper'
2
+
3
+ describe MoneyTree::PrivateKey do
4
+ before do
5
+ @key = MoneyTree::PrivateKey.new key: "5eae5375fb5f7a0ea650566363befa2830ef441bdcb19198adf318faee86d64b"
6
+ end
7
+
8
+ describe "to_hex" do
9
+ it "has 64 characters" do
10
+ # must always be 64 characters - leading zeroes need to be preserved!
11
+ expect(@key.to_hex.length).to eql(64)
12
+ end
13
+
14
+ it "preserves leading zeros" do
15
+ master = MoneyTree::Master.new seed_hex: "9cf6b6e8451c7d551cb402e2997566e5c7c258543eadb184f9f39322b2e6959b"
16
+ expect(master.node_for_path("m/427").private_key.to_hex.length).to eql(64)
17
+ end
18
+
19
+ it "is a valid hex" do
20
+ expect(@key.to_hex).to eql('5eae5375fb5f7a0ea650566363befa2830ef441bdcb19198adf318faee86d64b' )
21
+ end
22
+ end
23
+
24
+ describe "to_wif" do
25
+ it "is a 52 character base58 key" do
26
+ expect(@key.to_wif.length).to eql(52)
27
+ end
28
+
29
+ it "starts with K or L" do
30
+ expect(%w(K L)).to include(@key.to_wif[0])
31
+ end
32
+
33
+ it "is a valid compressed wif" do
34
+ expect(@key.to_wif).to eql('KzPkwAXJ4wtXHnbamTaJqoMrzwCUUJaqhUxnqYhnZvZH6KhgmDPK' )
35
+ end
36
+ end
37
+
38
+ describe "to_wif(compressed: false)" do
39
+ it "is a 51 character base58 key" do
40
+ expect(@key.to_wif(compressed: false).length).to eql(51)
41
+ end
42
+
43
+ it "starts with 5" do
44
+ expect(@key.to_wif(compressed: false)[0]).to eql('5')
45
+ end
46
+
47
+ it "is valid" do
48
+ expect(@key.to_wif(compressed: false)).to eql('5JXz5ZyFk31oHVTQxqce7yitCmTAPxBqeGQ4b7H3Aj3L45wUhoa')
49
+ end
50
+ end
51
+
52
+ describe "from_wif(wif)" do
53
+ it "returns the key from a wif" do
54
+ expect(@key.from_wif("5HueCGU8rMjxEXxiPuD5BDku4MkFqeZyd4dZ1jvhTVqvbTLvyTJ")).to eql('0c28fca386c7a227600b2fe50b7cae11ec86d3bf1fbe471be89827e19d72aa1d')
55
+ end
56
+
57
+ it "raises an error on bad checksum" do
58
+ expect { @key.from_wif("5HueCGU8rMjxEXxiPuD5BDku4MkFqeZyd4dZ1jvhTVqvbTBADTJ") }.to raise_error(MoneyTree::Key::InvalidWIFFormat)
59
+ end
60
+ end
61
+
62
+ describe "to_base64" do
63
+ it "has 44 characters" do
64
+ expect(@key.to_base64.length).to eql(44)
65
+ end
66
+
67
+ it "is a valid base64" do
68
+ expect(@key.to_base64).to eql('Xq5Tdftfeg6mUFZjY776KDDvRBvcsZGYrfMY+u6G1ks=' )
69
+ end
70
+ end
71
+
72
+ describe "from_base64(base64_key)" do
73
+ it "parses base64 key" do
74
+ @key = MoneyTree::PrivateKey.new(key: "Xq5Tdftfeg6mUFZjY776KDDvRBvcsZGYrfMY+u6G1ks=")
75
+ expect(@key.to_hex).to eql("5eae5375fb5f7a0ea650566363befa2830ef441bdcb19198adf318faee86d64b")
76
+ end
77
+
78
+ it "returns the key from base64 encoding" do
79
+ expect(@key.from_base64("Xq5Tdftfeg6mUFZjY776KDDvRBvcsZGYrfMY+u6G1ks=")).to eql('5eae5375fb5f7a0ea650566363befa2830ef441bdcb19198adf318faee86d64b')
80
+ end
81
+
82
+ it "raises an error on bad encoding" do
83
+ expect { @key.from_base64("Xq5Tdftfeg6mUFZjY776KD&%#BbadBADrfMY+u6G1ks=") }.to raise_error(MoneyTree::Key::InvalidBase64Format)
84
+ end
85
+ end
86
+
87
+ describe "valid?(eckey)" do
88
+ it "checks for a valid key" do
89
+ expect(@key.valid?).to be_truthy
90
+ end
91
+ end
92
+
93
+ describe "parse_raw_key" do
94
+ it "returns error if key is not Bignum, hex, base64, or wif formatted" do
95
+ expect { @key = MoneyTree::PrivateKey.new(key: "Thisisnotakey") }.to raise_error(MoneyTree::Key::KeyFormatNotFound)
96
+ end
97
+
98
+ it "raises an error that can be caught using a standard exception block" do
99
+ exception_raised = false
100
+
101
+ begin
102
+ MoneyTree::PrivateKey.new(key: "Thisisnotakey")
103
+ rescue => ex
104
+ exception_raised = true
105
+ end
106
+ fail unless exception_raised
107
+ end
108
+ end
109
+
110
+ context "testnet" do
111
+ before do
112
+ @key = MoneyTree::PrivateKey.new key: 'cRhes8SBnsF6WizphaRKQKZZfDniDa9Bxcw31yKeEC1KDExhxFgD'
113
+ end
114
+
115
+ describe "to_wif" do
116
+ it "returns same wif" do
117
+ expect(@key.to_wif(network: :bitcoin_testnet)).to eql('cRhes8SBnsF6WizphaRKQKZZfDniDa9Bxcw31yKeEC1KDExhxFgD')
118
+ end
119
+ end
120
+ end
121
+ end
@@ -0,0 +1,187 @@
1
+ require 'spec_helper'
2
+
3
+ describe MoneyTree::PublicKey do
4
+
5
+ describe "with a private key" do
6
+ before do
7
+ @private_key = MoneyTree::PrivateKey.new key: "5eae5375fb5f7a0ea650566363befa2830ef441bdcb19198adf318faee86d64b"
8
+ @key = MoneyTree::PublicKey.new @private_key
9
+ end
10
+
11
+ describe "to_hex(compressed: false)" do
12
+ it "has 65 bytes" do
13
+ expect(@key.uncompressed.to_hex.length).to eql(130)
14
+ end
15
+
16
+ it "is a valid hex" do
17
+ expect(@key.uncompressed.to_hex).to eql('042dfc2557a007c93092c2915f11e8aa70c4f399a6753e2e908330014091580e4b11203096f1a1c5276a73f91b9465357004c2103cc42c63d6d330df589080d2e4' )
18
+ end
19
+ end
20
+
21
+ describe "to_hex" do
22
+ it "has 33 bytes" do
23
+ expect(@key.to_hex.length).to eql(66)
24
+ end
25
+
26
+ it "is a valid compressed hex" do
27
+ expect(@key.to_hex).to eql('022dfc2557a007c93092c2915f11e8aa70c4f399a6753e2e908330014091580e4b' )
28
+ end
29
+ end
30
+
31
+ describe "to_fingerprint" do
32
+ it "returns a valid fingerprint" do
33
+ expect(@key.to_fingerprint).to eql("1fddf42e")
34
+ end
35
+ end
36
+
37
+ describe "to_address(compressed: false)" do
38
+ it "has 34 characters" do
39
+ expect(@key.uncompressed.to_address.length).to eql(34)
40
+ end
41
+
42
+ it "is a valid bitcoin address" do
43
+ expect(@key.uncompressed.to_address).to eql('133bJA2xoVqBUsiR3uSkciMo5r15fLAaZg' )
44
+ end
45
+ end
46
+
47
+ describe "to_compressed_address" do
48
+ it "has 34 characters" do
49
+ expect(@key.to_address.length).to eql(34)
50
+ end
51
+
52
+ it "is a valid compressed bitcoin address" do
53
+ expect(@key.to_address).to eql('13uVqa35BMo4mYq9LiZrXVzoz9EFZ6aoXe' )
54
+ end
55
+ end
56
+ end
57
+
58
+ describe "without a private key" do
59
+ before do
60
+ @key = MoneyTree::PublicKey.new '042dfc2557a007c93092c2915f11e8aa70c4f399a6753e2e908330014091580e4b11203096f1a1c5276a73f91b9465357004c2103cc42c63d6d330df589080d2e4'
61
+ end
62
+
63
+ describe "to_hex(compressed: false)" do
64
+ it "has 65 bytes" do
65
+ expect(@key.uncompressed.to_hex.length).to eql(130)
66
+ end
67
+
68
+ it "is a valid hex" do
69
+ expect(@key.uncompressed.to_hex).to eql('042dfc2557a007c93092c2915f11e8aa70c4f399a6753e2e908330014091580e4b11203096f1a1c5276a73f91b9465357004c2103cc42c63d6d330df589080d2e4' )
70
+ end
71
+ end
72
+
73
+ describe "to_hex" do
74
+ it "has 33 bytes" do
75
+ expect(@key.compressed.to_hex.length).to eql(66)
76
+ end
77
+
78
+ it "is a valid compressed hex" do
79
+ expect(@key.compressed.to_hex).to eql('022dfc2557a007c93092c2915f11e8aa70c4f399a6753e2e908330014091580e4b' )
80
+ end
81
+ end
82
+
83
+ describe "to_fingerprint" do
84
+ it "returns a valid fingerprint" do
85
+ expect(@key.compressed.to_fingerprint).to eql("1fddf42e")
86
+ end
87
+ end
88
+
89
+ describe "to_address(compressed: false)" do
90
+ it "has 34 characters" do
91
+ expect(@key.uncompressed.to_address.length).to eql(34)
92
+ end
93
+
94
+ it "is a valid bitcoin address" do
95
+ expect(@key.uncompressed.to_address).to eql('133bJA2xoVqBUsiR3uSkciMo5r15fLAaZg' )
96
+ end
97
+ end
98
+
99
+ describe "to_compressed_address" do
100
+ it "has 34 characters" do
101
+ expect(@key.compressed.to_address.length).to eql(34)
102
+ end
103
+
104
+ it "is a valid compressed bitcoin address" do
105
+ expect(@key.compressed.to_address).to eql('13uVqa35BMo4mYq9LiZrXVzoz9EFZ6aoXe' )
106
+ end
107
+ end
108
+
109
+ describe "#compression" do
110
+ it "returns current compression setting" do
111
+ @key.compression = :uncompressed
112
+ expect(@key.compression).to eql(:uncompressed)
113
+ @key.compression = :compressed
114
+ expect(@key.compression).to eql(:compressed)
115
+ end
116
+ end
117
+ end
118
+
119
+ describe "with a bad key" do
120
+ it "raises KeyFormatNotFound" do
121
+ expect { @key = MoneyTree::PublicKey.new 'THISISNOTAVALIDKEY' }.to raise_error(MoneyTree::Key::KeyFormatNotFound)
122
+ end
123
+ end
124
+
125
+ describe "recalcuating public key" do
126
+ it "produces same results" do
127
+ results = []
128
+ 100.times do
129
+ results << MoneyTree::PublicKey.new('042dfc2557a007c93092c2915f11e8aa70c4f399a6753e2e908330014091580e4b11203096f1a1c5276a73f91b9465357004c2103cc42c63d6d330df589080d2e4').to_s
130
+ end
131
+ expect(results.uniq.length).to eql(1)
132
+ end
133
+ end
134
+
135
+ describe "#uncompressed" do
136
+ before do
137
+ @key = MoneyTree::PublicKey.new('022dfc2557a007c93092c2915f11e8aa70c4f399a6753e2e908330014091580e4b')
138
+ end
139
+
140
+ it "does not mutate key" do
141
+ before_str = @key.to_s
142
+ @key.uncompressed
143
+ after_str = @key.to_s
144
+ expect(before_str).to eql(after_str)
145
+ end
146
+ end
147
+
148
+ describe "#compressed" do
149
+ before do
150
+ @key = MoneyTree::PublicKey.new('042dfc2557a007c93092c2915f11e8aa70c4f399a6753e2e908330014091580e4b11203096f1a1c5276a73f91b9465357004c2103cc42c63d6d330df589080d2e4')
151
+ end
152
+
153
+ it "does not mutate key" do
154
+ before_str = @key.to_s
155
+ @key.compressed
156
+ after_str = @key.to_s
157
+ expect(before_str).to eql(after_str)
158
+ end
159
+ end
160
+
161
+ context "testnet" do
162
+ context 'with private key' do
163
+ before do
164
+ @private_key = MoneyTree::PrivateKey.new
165
+ @key = MoneyTree::PublicKey.new(@private_key)
166
+ end
167
+
168
+ it "should have an address starting with m or n" do
169
+ expect(%w(m n)).to include(@key.to_s(network: :bitcoin_testnet)[0])
170
+ end
171
+
172
+ it "should have an uncompressed address starting with m or n" do
173
+ expect(%w(m n)).to include(@key.uncompressed.to_s(network: :bitcoin_testnet)[0])
174
+ end
175
+ end
176
+
177
+ context 'without private key' do
178
+ before do
179
+ @key = MoneyTree::PublicKey.new('0297b033ba894611345a0e777861237ef1632370fbd58ebe644eb9f3714e8fe2bc')
180
+ end
181
+
182
+ it "should have an address starting with m or n" do
183
+ expect(%w(m n)).to include(@key.to_s(network: :bitcoin_testnet)[0])
184
+ end
185
+ end
186
+ end
187
+ end
@@ -0,0 +1,32 @@
1
+ require 'spec_helper'
2
+
3
+ describe MoneyTree::Support do
4
+ include MoneyTree::Support
5
+
6
+ describe "sha256(str)" do
7
+ it "properly calculates sha256 hash" do
8
+ expect(sha256("abc", ascii: true)).to eql("ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad")
9
+ expect(sha256("800c28fca386c7a227600b2fe50b7cae11ec86d3bf1fbe471be89827e19d72aa1d")).to eql("8147786c4d15106333bf278d71dadaf1079ef2d2440a4dde37d747ded5403592")
10
+ expect(sha256("8147786c4d15106333bf278d71dadaf1079ef2d2440a4dde37d747ded5403592")).to eql("507a5b8dfed0fc6fe8801743720cedec06aa5c6fca72b07c49964492fb98a714")
11
+ end
12
+ end
13
+
14
+ describe "ripemd160(str)" do
15
+ it "properly calculates ripemd160 hash" do
16
+ expect(ripemd160("abc", ascii: true)).to eql("8eb208f7e05d987a9b044a8e98c6b087f15a0bfc")
17
+ expect(ripemd160("e8026715af68676e0287ec9aa774f8103e4bddd5505b209263a8ff97c6ea29cc")).to eql("166db6510884918f31a9d246404760db8154bf84")
18
+ end
19
+ end
20
+
21
+ describe "hmac_sha512_hex(key, message)" do
22
+ it "properly calculates hmac sha512" do
23
+ expect(hmac_sha512_hex("Jefe", "what do ya want for nothing?")).to eql("164b7a7bfcf819e2e395fbe73b56e0a387bd64222e831fd610270cd7ea2505549758bf75c05a994a6d034f65f8f0e6fdcaeab1a34d4a6b4b636e070a38bce737")
24
+ end
25
+ end
26
+
27
+ describe "hex_to_int" do
28
+ it "converts hex to integer" do
29
+ expect(hex_to_int("abcdef0123456789")).to eql(12379813738877118345)
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,3 @@
1
+ require 'simplecov'
2
+ require 'money-tree'
3
+ require 'pry'
metadata ADDED
@@ -0,0 +1,184 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: money-tree-extended
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.11.0
5
+ platform: ruby
6
+ authors:
7
+ - Micah Winkelspecht
8
+ - Nikhar Ramchunder
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2019-09-10 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: ffi
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ">="
19
+ - !ruby/object:Gem::Version
20
+ version: '0'
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ version: '0'
28
+ - !ruby/object:Gem::Dependency
29
+ name: bundler
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - "~>"
33
+ - !ruby/object:Gem::Version
34
+ version: '1.3'
35
+ type: :development
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - "~>"
40
+ - !ruby/object:Gem::Version
41
+ version: '1.3'
42
+ - !ruby/object:Gem::Dependency
43
+ name: rake
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ type: :development
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ - !ruby/object:Gem::Dependency
57
+ name: rspec
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ - !ruby/object:Gem::Dependency
71
+ name: simplecov
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
84
+ - !ruby/object:Gem::Dependency
85
+ name: coveralls
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
91
+ type: :development
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ version: '0'
98
+ - !ruby/object:Gem::Dependency
99
+ name: pry
100
+ requirement: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - ">="
103
+ - !ruby/object:Gem::Version
104
+ version: '0'
105
+ type: :development
106
+ prerelease: false
107
+ version_requirements: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - ">="
110
+ - !ruby/object:Gem::Version
111
+ version: '0'
112
+ description: A Ruby Gem implementation of Bitcoin HD Wallets (Extended)
113
+ email:
114
+ - winkelspecht@gmail.com
115
+ executables: []
116
+ extensions: []
117
+ extra_rdoc_files: []
118
+ files:
119
+ - ".gitignore"
120
+ - ".idea/$CACHE_FILE$"
121
+ - ".idea/.gitignore"
122
+ - ".idea/.rakeTasks"
123
+ - ".idea/misc.xml"
124
+ - ".idea/modules.xml"
125
+ - ".idea/money-tree.iml"
126
+ - ".idea/vcs.xml"
127
+ - ".rspec"
128
+ - ".simplecov"
129
+ - ".travis.yml"
130
+ - Gemfile
131
+ - LICENSE.txt
132
+ - README.md
133
+ - Rakefile
134
+ - certs/mattatgemco.pem
135
+ - checksum/money-tree-0.9.0.gem.sha512
136
+ - donation_btc_qr_code.gif
137
+ - lib/money-tree.rb
138
+ - lib/money-tree/address.rb
139
+ - lib/money-tree/key.rb
140
+ - lib/money-tree/networks.rb
141
+ - lib/money-tree/node.rb
142
+ - lib/money-tree/support.rb
143
+ - lib/money-tree/version.rb
144
+ - lib/openssl_extensions.rb
145
+ - money-tree.gemspec
146
+ - spec/lib/money-tree/address_spec.rb
147
+ - spec/lib/money-tree/node_spec.rb
148
+ - spec/lib/money-tree/openssl_extensions_spec.rb
149
+ - spec/lib/money-tree/private_key_spec.rb
150
+ - spec/lib/money-tree/public_key_spec.rb
151
+ - spec/lib/money-tree/support_spec.rb
152
+ - spec/spec_helper.rb
153
+ homepage: https://github.com/nikharR/money-tree
154
+ licenses:
155
+ - MIT
156
+ metadata: {}
157
+ post_install_message:
158
+ rdoc_options: []
159
+ require_paths:
160
+ - lib
161
+ required_ruby_version: !ruby/object:Gem::Requirement
162
+ requirements:
163
+ - - ">="
164
+ - !ruby/object:Gem::Version
165
+ version: '0'
166
+ required_rubygems_version: !ruby/object:Gem::Requirement
167
+ requirements:
168
+ - - ">="
169
+ - !ruby/object:Gem::Version
170
+ version: '0'
171
+ requirements: []
172
+ rubyforge_project:
173
+ rubygems_version: 2.7.6
174
+ signing_key:
175
+ specification_version: 4
176
+ summary: Bitcoin Hierarchical Deterministic Wallets in Ruby! (Bitcoin standard BIP0032)
177
+ test_files:
178
+ - spec/lib/money-tree/address_spec.rb
179
+ - spec/lib/money-tree/node_spec.rb
180
+ - spec/lib/money-tree/openssl_extensions_spec.rb
181
+ - spec/lib/money-tree/private_key_spec.rb
182
+ - spec/lib/money-tree/public_key_spec.rb
183
+ - spec/lib/money-tree/support_spec.rb
184
+ - spec/spec_helper.rb