money-tree 0.11.1 → 0.11.2

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
  SHA256:
3
- metadata.gz: a817c56d0f39bc09f84b1dd02d9e828a9b3fd4d93500d7f6e9cd4ead322c7355
4
- data.tar.gz: 1e8de14764b5ddf911769e537b99eb4b9f3ce2e91e6dff9ffc2cef923214d156
3
+ metadata.gz: 53b2d866f0baa17b011631e360bda7c118100ce772cb2ce7b681ac03381b5f3e
4
+ data.tar.gz: dc39341115ffc116c132e1f030084eafced123506af17943f19e4c1bd0847841
5
5
  SHA512:
6
- metadata.gz: d2d89e5ffa65f7781a7ff35c830da95614b22e743a24ce5662f4f952dd18685ba9b5a18078fb5bc0a45c1527bb66e32473a5d8453a0a87026e7d5625dbd940d0
7
- data.tar.gz: 1355fe75f77593dec9c191e9c1d91f4a1f5205fe8e6f01600298311a17c070f25002c8ed0889166125b5879ce9b03675e476f2cf64b5a6f03e19b01886a4506f
6
+ metadata.gz: 3d4c68b7ef831c84b48c68e715007dbb16002c7a148c681d5db192216fd4be33f1767dd2a93cab0c09d87722fb7af475aa766e2bf4a561c76302ccf36747c7ca
7
+ data.tar.gz: 3019c78a855717e4d98b2f7f4d7a0458aac6c880fed23e6f81ae74587b9f0c4d2e122357ee95a481bb253b45e71b8f9e9c339cd367c2ccf1fd128131c326a2d7
@@ -0,0 +1,44 @@
1
+ ---
2
+ name: CodeQL
3
+
4
+ on:
5
+ pull_request:
6
+ branches:
7
+ - master
8
+ push:
9
+ branches:
10
+ - master
11
+
12
+ jobs:
13
+ analyze:
14
+ name: Analyze
15
+ runs-on: ubuntu-latest
16
+ permissions:
17
+ actions: read
18
+ contents: read
19
+ security-events: write
20
+ strategy:
21
+ fail-fast: false
22
+ matrix:
23
+ language:
24
+ - ruby
25
+ steps:
26
+ - name: "Checkout repository"
27
+ uses: actions/checkout@v3
28
+ - name: "Initialize CodeQL"
29
+ uses: github/codeql-action/init@v2
30
+ with:
31
+ languages: "${{ matrix.language }}"
32
+ - name: Autobuild
33
+ uses: github/codeql-action/autobuild@v2
34
+ - name: "Perform CodeQL Analysis"
35
+ uses: github/codeql-action/analyze@v2
36
+ - uses: ruby/setup-ruby@v1
37
+ with:
38
+ ruby-version: '3.0'
39
+ bundler-cache: true
40
+ - name: "Run rufo code formatting checks"
41
+ run: |
42
+ gem install rufo
43
+ rufo --check ./lib
44
+ rufo --check ./spec
@@ -0,0 +1,26 @@
1
+ ---
2
+ name: Docs
3
+
4
+ on:
5
+ push:
6
+ branches:
7
+ - master
8
+
9
+ jobs:
10
+ docs:
11
+ runs-on: ubuntu-latest
12
+ steps:
13
+ - uses: actions/checkout@v2
14
+ - uses: ruby/setup-ruby@v1
15
+ with:
16
+ ruby-version: '3.0'
17
+ bundler-cache: true
18
+ - name: Run Yard Doc
19
+ run: |
20
+ gem install yard
21
+ yard doc
22
+ - name: Deploy GH Pages
23
+ uses: JamesIves/github-pages-deploy-action@4.4.1
24
+ with:
25
+ branch: gh-pages
26
+ folder: doc/
@@ -15,8 +15,8 @@ jobs:
15
15
  strategy:
16
16
  fail-fast: false
17
17
  matrix:
18
- os: [ubuntu-latest, macos-latest]
19
- ruby: ['2.7', '3.0']
18
+ os: [ubuntu-22.04, macos-12]
19
+ ruby: ['3.0', '3.1', '3.2']
20
20
  steps:
21
21
  - uses: actions/checkout@v2
22
22
  - uses: ruby/setup-ruby@v1
data/Gemfile CHANGED
@@ -1,16 +1,15 @@
1
1
  source "https://rubygems.org"
2
2
 
3
- gem "openssl", "~> 3.0"
4
- gem "bech32", "~> 1.2"
5
-
6
3
  group :test, :development do
7
4
  gem "bundler", "~> 2.2"
8
5
  gem "codecov", "~> 0.6"
9
6
  gem "pry", "~> 0.14"
10
7
  gem "rake", "~> 13.0"
11
- gem "rdoc", "~> 6.3"
12
- gem "rspec", "~> 3.10"
8
+ gem "rdoc", "~> 6.5"
9
+ gem "rspec", "~> 3.12"
13
10
  gem "rufo", "~> 0.13"
14
11
  gem "simplecov", "~> 0.21"
15
12
  gem "yard", "~> 0.9"
16
13
  end
14
+
15
+ gemspec
data/LICENSE.txt CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2013 Micah Winkelspecht
1
+ Copyright (c) 2013-23 Micah Winkelspecht
2
2
 
3
3
  MIT License
4
4
 
@@ -1 +1 @@
1
- cc59abeb70c300eb32c0562dea582de4d26da71cb3fac9937fb3b88fd7092177c98ccbdf6eba7517c3dbc14b33f15e95bf799a02adfec5c12583cb9179c68bb7
1
+ fdc5329fa932c085d66ae40a7a9d730876b9a68a17932f0cd824c74a0562fafbfdc8fb2a3f92011138854ffbf7422bb8919e042dba46bcb55e11755bcf2bb5fb
@@ -0,0 +1 @@
1
+ eb2346654c00b8506127ac5a2e87a04ebdc2bcde9221fe1f9707c4d1522cc9280206aeca41a3a2a9430db4d8bcef0f7c27e95ef23755b54bcdda991e6886f067
@@ -0,0 +1,14 @@
1
+ openssl_conf = openssl_init
2
+
3
+ [openssl_init]
4
+ providers = provider_sect
5
+
6
+ [provider_sect]
7
+ default = default_sect
8
+ legacy = legacy_sect
9
+
10
+ [default_sect]
11
+ activate = 1
12
+
13
+ [legacy_sect]
14
+ activate = 1
@@ -39,31 +39,38 @@ module MoneyTree
39
39
  class PrivateKey < Key
40
40
  def initialize(opts = {})
41
41
  @options = opts
42
- @ec_key = PKey::EC.new GROUP_NAME
42
+ generate
43
43
  if @options[:key]
44
44
  @raw_key = @options[:key]
45
45
  @key = parse_raw_key
46
46
  import
47
47
  else
48
- generate
49
48
  @key = to_hex
50
49
  end
51
50
  end
52
51
 
53
52
  def generate
54
- ec_key.generate_key
53
+ @ec_key = PKey::EC.generate GROUP_NAME
55
54
  end
56
55
 
57
56
  def import
58
- ec_key.private_key = BN.new(key, 16)
59
- set_public_key
57
+ @ec_key = OpenSSL::PKey::EC.new(data_sequence.to_der)
58
+ end
59
+
60
+ def data_sequence
61
+ OpenSSL::ASN1::Sequence([
62
+ OpenSSL::ASN1::Integer(1),
63
+ OpenSSL::ASN1::OctetString(OpenSSL::BN.new(key, 16).to_s(2)),
64
+ OpenSSL::ASN1::ObjectId(GROUP_NAME, 0, :EXPLICIT),
65
+ OpenSSL::ASN1::BitString(calculate_public_key.to_octet_string(:uncompressed), 1, :EXPLICIT),
66
+ ])
60
67
  end
61
68
 
62
69
  def calculate_public_key(opts = {})
63
70
  opts[:compressed] = true unless opts[:compressed] == false
64
71
  group = ec_key.group
65
72
  group.point_conversion_form = opts[:compressed] ? :compressed : :uncompressed
66
- point = group.generator.mul ec_key.private_key
73
+ point = group.generator.mul OpenSSL::BN.new(key, 16)
67
74
  end
68
75
 
69
76
  def set_public_key(opts = {})
@@ -11,6 +11,8 @@ module MoneyTree
11
11
  attr_reader :index
12
12
  attr_reader :parent
13
13
 
14
+ PRIVATE_RANGE_LIMIT = 0x80000000
15
+
14
16
  class PublicDerivationFailure < StandardError; end
15
17
  class InvalidKeyForIndex < StandardError; end
16
18
  class ImportError < StandardError; end
@@ -46,7 +48,7 @@ module MoneyTree
46
48
  end
47
49
 
48
50
  def is_private?
49
- index >= 0x80000000 || index < 0
51
+ index >= PRIVATE_RANGE_LIMIT || index < 0
50
52
  end
51
53
 
52
54
  def index_hex(i = index)
@@ -74,7 +76,7 @@ module MoneyTree
74
76
  end
75
77
 
76
78
  def derive_private_key(i = 0)
77
- message = i >= 0x80000000 || i < 0 ? private_derivation_message(i) : public_derivation_message(i)
79
+ message = i >= PRIVATE_RANGE_LIMIT || i < 0 ? private_derivation_message(i) : public_derivation_message(i)
78
80
  hash = hmac_sha512 hex_to_bytes(chain_code_hex), message
79
81
  left_int = left_from_hash(hash)
80
82
  raise InvalidKeyForIndex, "greater than or equal to order" if left_int >= MoneyTree::Key::ORDER # very low probability
@@ -84,8 +86,19 @@ module MoneyTree
84
86
  return child_private_key, child_chain_code
85
87
  end
86
88
 
89
+ def derive_parent_node(parent_key)
90
+ message = parent_key.public_key.to_bytes << i_as_bytes(index)
91
+ hash = hmac_sha512 hex_to_bytes(parent_key.chain_code_hex), message
92
+ priv = (private_key.to_i - left_from_hash(hash)) % MoneyTree::Key::ORDER
93
+ MoneyTree::Node.new(depth: parent_key.depth,
94
+ index: parent_key.index,
95
+ private_key: MoneyTree::PrivateKey.new(key: priv),
96
+ public_key: parent_key.public_key,
97
+ chain_code: parent_key.chain_code)
98
+ end
99
+
87
100
  def derive_public_key(i = 0)
88
- raise PrivatePublicMismatch if i >= 0x80000000
101
+ raise PrivatePublicMismatch if i >= PRIVATE_RANGE_LIMIT
89
102
  message = public_derivation_message(i)
90
103
  hash = hmac_sha512 hex_to_bytes(chain_code_hex), message
91
104
  left_int = left_from_hash(hash)
@@ -210,17 +223,19 @@ module MoneyTree
210
223
  end
211
224
  end
212
225
 
213
- def parse_index(path_part)
214
- is_prime = %w(p ').include? path_part[-1]
215
- i = path_part.to_i
226
+ def negative?(path_part)
227
+ relative_index = path_part.to_i
228
+ prime_symbol_present = %w(p ').include?(path_part[-1])
229
+ minus_present = path_part[0] == "-"
230
+ private_range = relative_index >= PRIVATE_RANGE_LIMIT
231
+ negative_value = relative_index < 0
232
+ prime_symbol_present || minus_present || private_range || negative_value
233
+ end
216
234
 
217
- i = if i < 0
218
- i
219
- elsif is_prime
220
- i | 0x80000000
221
- else
222
- i & 0x7fffffff
223
- end
235
+ def parse_index(path_part)
236
+ index = path_part.to_i
237
+ return index | PRIVATE_RANGE_LIMIT if negative?(path_part)
238
+ index
224
239
  end
225
240
 
226
241
  def strip_private_info!
@@ -1,3 +1,3 @@
1
1
  module MoneyTree
2
- VERSION = "0.11.1"
2
+ VERSION = "0.11.2"
3
3
  end
data/money-tree.gemspec CHANGED
@@ -26,5 +26,8 @@ Gem::Specification.new do |spec|
26
26
  }.freeze
27
27
 
28
28
  spec.platform = Gem::Platform::RUBY
29
- spec.required_ruby_version = ">= 2.6", "< 4.0"
29
+ spec.required_ruby_version = ">= 2.7", "< 4.0"
30
+
31
+ spec.add_dependency "openssl", "~> 3.1"
32
+ spec.add_dependency "bech32", "~> 1.3"
30
33
  end
@@ -1,9 +1,9 @@
1
1
  require "spec_helper"
2
2
 
3
3
  describe MoneyTree do
4
- it "0.11.1 works" do
4
+ it "0.11.2 works" do
5
5
 
6
6
  # placeholder to set up spec in future
7
- expect(MoneyTree::VERSION).to eq "0.11.1"
7
+ expect(MoneyTree::VERSION).to eq "0.11.2"
8
8
  end
9
9
  end
@@ -121,6 +121,104 @@ describe MoneyTree::Master do
121
121
  end
122
122
  end
123
123
 
124
+ describe "m/2147483648" do
125
+ before do
126
+ @node = @master.node_for_path "m/2147483648"
127
+ end
128
+
129
+ it "has an index of 2147483648" do
130
+ expect(@node.index).to eql(2147483648)
131
+ end
132
+
133
+ it "is private" do
134
+ expect(@node.is_private?).to eql(true)
135
+ end
136
+
137
+ it "has a depth of 1" do
138
+ expect(@node.depth).to eql(1)
139
+ end
140
+
141
+ it "generates subnode" do
142
+ expect(@node.to_identifier).to eql("5c1bd648ed23aa5fd50ba52b2457c11e9e80a6a7")
143
+ expect(@node.to_fingerprint).to eql("5c1bd648")
144
+ expect(@node.to_address).to eql("19Q2WoS5hSS6T8GjhK8KZLMgmWaq4neXrh")
145
+ expect(@node.to_p2wpkh_p2sh).to eql("3AbBmNbPDSzeZKHywDrH3h5v2rL8xGfT7e")
146
+ expect(@node.to_bech32_address).to eql("bc1qtsdavj8dyw49l4gt554jg47pr60gpf48ww2ens")
147
+ end
148
+
149
+ it "generates a private key" do
150
+ expect(@node.private_key.to_hex).to eql("edb2e14f9ee77d26dd93b4ecede8d16ed408ce149b6cd80b0715a2d911a0afea")
151
+ expect(@node.private_key.to_wif).to eql("L5BmPijJjrKbiUfG4zbiFKNqkvuJ8usooJmzuD7Z8dkRoTThYnAT")
152
+ end
153
+
154
+ it "generates a public key" do
155
+ expect(@node.public_key.to_hex).to eql("035a784662a4a20a65bf6aab9ae98a6c068a81c52e4b032c0fb5400c706cfccc56")
156
+ end
157
+
158
+ it "generates a chain code" do
159
+ expect(@node.chain_code_hex).to eql("47fdacbd0f1097043b78c63c20c34ef4ed9a111d980047ad16282c7ae6236141")
160
+ end
161
+
162
+ it "generates a serialized private key" do
163
+ expect(@node.to_serialized_hex(:private)).to eql("0488ade4013442193e8000000047fdacbd0f1097043b78c63c20c34ef4ed9a111d980047ad16282c7ae623614100edb2e14f9ee77d26dd93b4ecede8d16ed408ce149b6cd80b0715a2d911a0afea")
164
+ expect(@node.to_bip32(:private)).to eql("xprv9uHRZZhk6KAJC1avXpDAp4MDc3sQKNxDiPvvkX8Br5ngLNv1TxvUxt4cV1rGL5hj6KCesnDYUhd7oWgT11eZG7XnxHrnYeSvkzY7d2bhkJ7")
165
+ end
166
+
167
+ it "generates a serialized public_key" do
168
+ expect(@node.to_serialized_hex).to eql("0488b21e013442193e8000000047fdacbd0f1097043b78c63c20c34ef4ed9a111d980047ad16282c7ae6236141035a784662a4a20a65bf6aab9ae98a6c068a81c52e4b032c0fb5400c706cfccc56")
169
+ expect(@node.to_bip32).to eql("xpub68Gmy5EdvgibQVfPdqkBBCHxA5htiqg55crXYuXoQRKfDBFA1WEjWgP6LHhwBZeNK1VTsfTFUHCdrfp1bgwQ9xv5ski8PX9rL2dZXvgGDnw")
170
+ end
171
+ end
172
+
173
+ describe "m/-0" do
174
+ before do
175
+ @node = @master.node_for_path "m/-0"
176
+ end
177
+
178
+ it "has an index of 2147483648" do
179
+ expect(@node.index).to eql(2147483648)
180
+ end
181
+
182
+ it "is private" do
183
+ expect(@node.is_private?).to eql(true)
184
+ end
185
+
186
+ it "has a depth of 1" do
187
+ expect(@node.depth).to eql(1)
188
+ end
189
+
190
+ it "generates subnode" do
191
+ expect(@node.to_identifier).to eql("5c1bd648ed23aa5fd50ba52b2457c11e9e80a6a7")
192
+ expect(@node.to_fingerprint).to eql("5c1bd648")
193
+ expect(@node.to_address).to eql("19Q2WoS5hSS6T8GjhK8KZLMgmWaq4neXrh")
194
+ expect(@node.to_p2wpkh_p2sh).to eql("3AbBmNbPDSzeZKHywDrH3h5v2rL8xGfT7e")
195
+ expect(@node.to_bech32_address).to eql("bc1qtsdavj8dyw49l4gt554jg47pr60gpf48ww2ens")
196
+ end
197
+
198
+ it "generates a private key" do
199
+ expect(@node.private_key.to_hex).to eql("edb2e14f9ee77d26dd93b4ecede8d16ed408ce149b6cd80b0715a2d911a0afea")
200
+ expect(@node.private_key.to_wif).to eql("L5BmPijJjrKbiUfG4zbiFKNqkvuJ8usooJmzuD7Z8dkRoTThYnAT")
201
+ end
202
+
203
+ it "generates a public key" do
204
+ expect(@node.public_key.to_hex).to eql("035a784662a4a20a65bf6aab9ae98a6c068a81c52e4b032c0fb5400c706cfccc56")
205
+ end
206
+
207
+ it "generates a chain code" do
208
+ expect(@node.chain_code_hex).to eql("47fdacbd0f1097043b78c63c20c34ef4ed9a111d980047ad16282c7ae6236141")
209
+ end
210
+
211
+ it "generates a serialized private key" do
212
+ expect(@node.to_serialized_hex(:private)).to eql("0488ade4013442193e8000000047fdacbd0f1097043b78c63c20c34ef4ed9a111d980047ad16282c7ae623614100edb2e14f9ee77d26dd93b4ecede8d16ed408ce149b6cd80b0715a2d911a0afea")
213
+ expect(@node.to_bip32(:private)).to eql("xprv9uHRZZhk6KAJC1avXpDAp4MDc3sQKNxDiPvvkX8Br5ngLNv1TxvUxt4cV1rGL5hj6KCesnDYUhd7oWgT11eZG7XnxHrnYeSvkzY7d2bhkJ7")
214
+ end
215
+
216
+ it "generates a serialized public_key" do
217
+ expect(@node.to_serialized_hex).to eql("0488b21e013442193e8000000047fdacbd0f1097043b78c63c20c34ef4ed9a111d980047ad16282c7ae6236141035a784662a4a20a65bf6aab9ae98a6c068a81c52e4b032c0fb5400c706cfccc56")
218
+ expect(@node.to_bip32).to eql("xpub68Gmy5EdvgibQVfPdqkBBCHxA5htiqg55crXYuXoQRKfDBFA1WEjWgP6LHhwBZeNK1VTsfTFUHCdrfp1bgwQ9xv5ski8PX9rL2dZXvgGDnw")
219
+ end
220
+ end
221
+
124
222
  describe "m/0p" do
125
223
  before do
126
224
  @node = @master.node_for_path "m/0p"
@@ -1213,5 +1311,34 @@ describe MoneyTree::Master do
1213
1311
  end
1214
1312
  end
1215
1313
  end
1314
+
1315
+ describe "deriving a parent node" do
1316
+ before do
1317
+ @master = MoneyTree::Master.new seed_hex: "000102030405060708090a0b0c0d0e0f"
1318
+ @node = @master.node_for_path("m/101p")
1319
+ @subnode = @node.node_for_path("1")
1320
+ end
1321
+ context "m/101'/1 -> m/101'" do
1322
+ it "correctly derives from a subnode with priv key to a node knowing it's public key" do
1323
+ node_priv_hex = @node.private_key.to_hex
1324
+ @node.strip_private_info!
1325
+ expect(@subnode.derive_parent_node(@node).private_key.to_hex).to eq(node_priv_hex)
1326
+ end
1327
+ end
1328
+ context "m/101' -> master" do
1329
+ it "unable to derive from a hardened node with priv key to a master node knowing it's public key" do
1330
+ master_priv_hex = @master.private_key.to_hex
1331
+ @master.strip_private_info!
1332
+ expect(@node.derive_parent_node(@master).private_key.to_hex).to_not eq(master_priv_hex)
1333
+ end
1334
+ end
1335
+ context "m/101 -> master" do
1336
+ it "correctly derives from a non-hardened node with priv key to a master node knowing it's public key" do
1337
+ @node = @master.node_for_path("m/101")
1338
+ master_priv_hex = @master.private_key.to_hex
1339
+ expect(@node.derive_parent_node(@master).private_key.to_hex).to eq(master_priv_hex)
1340
+ end
1341
+ end
1342
+ end
1216
1343
  end
1217
1344
  end
@@ -22,8 +22,8 @@ describe MoneyTree::OpenSSLExtensions do
22
22
  include MoneyTree::OpenSSLExtensions
23
23
 
24
24
  context "with inputs" do
25
- let(:key1) { OpenSSL::PKey::EC.new("secp256k1").generate_key }
26
- let(:key2) { OpenSSL::PKey::EC.new("secp256k1").generate_key }
25
+ let(:key1) { OpenSSL::PKey::EC.generate("secp256k1") }
26
+ let(:key2) { OpenSSL::PKey::EC.generate("secp256k1") }
27
27
  let(:point_1) { key1.public_key }
28
28
  let(:point_2) { key2.public_key }
29
29
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: money-tree
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.11.1
4
+ version: 0.11.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Micah Winkelspecht
@@ -9,8 +9,36 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2022-11-03 00:00:00.000000000 Z
13
- dependencies: []
12
+ date: 2023-01-05 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: openssl
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - "~>"
19
+ - !ruby/object:Gem::Version
20
+ version: '3.1'
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - "~>"
26
+ - !ruby/object:Gem::Version
27
+ version: '3.1'
28
+ - !ruby/object:Gem::Dependency
29
+ name: bech32
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - "~>"
33
+ - !ruby/object:Gem::Version
34
+ version: '1.3'
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - "~>"
40
+ - !ruby/object:Gem::Version
41
+ version: '1.3'
14
42
  description: A Ruby Gem implementation of Bitcoin HD Wallets
15
43
  email:
16
44
  - winkelspecht@gmail.com
@@ -20,6 +48,8 @@ extensions: []
20
48
  extra_rdoc_files: []
21
49
  files:
22
50
  - ".github/donation_btc_qr_code.gif"
51
+ - ".github/workflows/code.yml"
52
+ - ".github/workflows/docs.yml"
23
53
  - ".github/workflows/spec.yml"
24
54
  - ".gitignore"
25
55
  - ".rspec"
@@ -27,9 +57,10 @@ files:
27
57
  - LICENSE.txt
28
58
  - README.md
29
59
  - Rakefile
30
- - certs/mattatgemco.pem
31
60
  - checksum/money-tree-0.11.0.gem.sha512
61
+ - checksum/money-tree-0.11.1.gem.sha512
32
62
  - checksum/money-tree-0.9.0.gem.sha512
63
+ - config/openssl.conf
33
64
  - lib/money-tree.rb
34
65
  - lib/money-tree/address.rb
35
66
  - lib/money-tree/key.rb
@@ -63,7 +94,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
63
94
  requirements:
64
95
  - - ">="
65
96
  - !ruby/object:Gem::Version
66
- version: '2.6'
97
+ version: '2.7'
67
98
  - - "<"
68
99
  - !ruby/object:Gem::Version
69
100
  version: '4.0'
@@ -73,7 +104,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
73
104
  - !ruby/object:Gem::Version
74
105
  version: '0'
75
106
  requirements: []
76
- rubygems_version: 3.3.23
107
+ rubygems_version: 3.2.32
77
108
  signing_key:
78
109
  specification_version: 4
79
110
  summary: Bitcoin Hierarchical Deterministic Wallets in Ruby! (Bitcoin standard BIP0032)
@@ -1,24 +0,0 @@
1
- -----BEGIN CERTIFICATE-----
2
- MIIEHDCCAoSgAwIBAgIBATANBgkqhkiG9w0BAQsFADAcMRowGAYDVQQDDBFtYXR0
3
- L0RDPWdlbS9EQz1jbzAeFw0xODA1MzAyMTQwNDZaFw0xOTA1MzAyMTQwNDZaMBwx
4
- GjAYBgNVBAMMEW1hdHQvREM9Z2VtL0RDPWNvMIIBojANBgkqhkiG9w0BAQEFAAOC
5
- AY8AMIIBigKCAYEAxfbjMHFlxA2P+4YWPagKoGAMi4078imgXdFbD3Rloe6cGfYp
6
- IMUQitiHrKi6fhSE0UjXmoP3qnYFddm1enN9zUAFRhHWv7xpINqSqss4PYAb5Anl
7
- RYZu3jromop5aVodi15HUfu5z27MvBm4rAaN/dDRfh/rT2hDbTTh0HmvEaPUDfX6
8
- TyflAttfabFvtY4qsD+ao8tks0DytqyuEWZ0tvQ6upOgHRNNuYDwDZB1T9v2dq2w
9
- 3goJFmOKBMMn7UH8WMjD3HiOuRD4tWhq5xWLjBqjzFlVPlZPgdCNyXeMMnLXER98
10
- NY35cVWFFuqG+kZwy4MFKdE9WFTocLZxLFo0VVTNSpPara9HirbHtIo9jZNuop4S
11
- g4JTf1F8dIWYii3sXoAYZfkl6rHVRP0G/OV5LcTfSS3QkmI5hNltz5FZzc+qI6S1
12
- rTR1ZwTy1rRI3coFY7vDRaFWBoMbbo/DytgCE3+rfbVDxQrJa4aZ0iYDhu8LXEA1
13
- VTtpf1EWYCOsYE1TAgMBAAGjaTBnMAkGA1UdEwQCMAAwCwYDVR0PBAQDAgSwMB0G
14
- A1UdDgQWBBQ6QoDNre7LFgOukH2Cv+RqZyfUzjAWBgNVHREEDzANgQttYXR0QGdl
15
- bS5jbzAWBgNVHRIEDzANgQttYXR0QGdlbS5jbzANBgkqhkiG9w0BAQsFAAOCAYEA
16
- kOxYnOsB+NwHwLc2lHEZ8ubxanq2qIZDhvVQ4M31gwmba43xO7vq0ktFxYRvozs4
17
- 74dQ6bmY2e7njoFgeutyJwxulA+BC71mDQA1s4WsZo7Z2TRgB0GViVqHrzq+jY+M
18
- p9mTHQqKH+2j0P9T4DXSzq4qOaBA3YROAwAzYI9N8MObeWkRt2pZ4zYQrAniP2nd
19
- wzXs/G5lWbbntVcvQOfAAXBipSJ3X5P2EGpUytP9ZpGdezY5HZzuiJFcmCf1CM3t
20
- VX4NZjbJak9gOY0AFD0Aw497sYenm0VBExclOmeRuZLffpWteTTL//utpG3bbFPl
21
- jQ78uzsrexYTYW5IshjfSIf3TZxm50Z45pyOTow5EOP1Nd7OmKOcI8hrLGv5+AlD
22
- hCnomUTUNsM4Rjwl5rzQiIn3ezv6+0tlg4rWJmVTuOGwcHk/oj1In2sPjCqm0pgx
23
- TLnMa8gr6aUpuHR5s2N4ZH0Q2YIsaD6cv7DYXt+G4MRut3njOYHfkqsSVykO6hvr
24
- -----END CERTIFICATE-----