money-tree 0.11.1 → 0.11.2

Sign up to get free protection for your applications and to get access to all the features.
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-----