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 +4 -4
- data/.github/workflows/code.yml +44 -0
- data/.github/workflows/docs.yml +26 -0
- data/.github/workflows/spec.yml +2 -2
- data/Gemfile +4 -5
- data/LICENSE.txt +1 -1
- data/checksum/money-tree-0.11.0.gem.sha512 +1 -1
- data/checksum/money-tree-0.11.1.gem.sha512 +1 -0
- data/config/openssl.conf +14 -0
- data/lib/money-tree/key.rb +13 -6
- data/lib/money-tree/node.rb +28 -13
- data/lib/money-tree/version.rb +1 -1
- data/money-tree.gemspec +4 -1
- data/spec/money-tree/money_tree_spec.rb +2 -2
- data/spec/money-tree/node_spec.rb +127 -0
- data/spec/money-tree/openssl_extensions_spec.rb +2 -2
- metadata +37 -6
- data/certs/mattatgemco.pem +0 -24
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 53b2d866f0baa17b011631e360bda7c118100ce772cb2ce7b681ac03381b5f3e
|
4
|
+
data.tar.gz: dc39341115ffc116c132e1f030084eafced123506af17943f19e4c1bd0847841
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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/
|
data/.github/workflows/spec.yml
CHANGED
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.
|
12
|
-
gem "rspec", "~> 3.
|
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 +1 @@
|
|
1
|
-
|
1
|
+
fdc5329fa932c085d66ae40a7a9d730876b9a68a17932f0cd824c74a0562fafbfdc8fb2a3f92011138854ffbf7422bb8919e042dba46bcb55e11755bcf2bb5fb
|
@@ -0,0 +1 @@
|
|
1
|
+
eb2346654c00b8506127ac5a2e87a04ebdc2bcde9221fe1f9707c4d1522cc9280206aeca41a3a2a9430db4d8bcef0f7c27e95ef23755b54bcdda991e6886f067
|
data/config/openssl.conf
ADDED
data/lib/money-tree/key.rb
CHANGED
@@ -39,31 +39,38 @@ module MoneyTree
|
|
39
39
|
class PrivateKey < Key
|
40
40
|
def initialize(opts = {})
|
41
41
|
@options = opts
|
42
|
-
|
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.
|
53
|
+
@ec_key = PKey::EC.generate GROUP_NAME
|
55
54
|
end
|
56
55
|
|
57
56
|
def import
|
58
|
-
ec_key
|
59
|
-
|
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
|
73
|
+
point = group.generator.mul OpenSSL::BN.new(key, 16)
|
67
74
|
end
|
68
75
|
|
69
76
|
def set_public_key(opts = {})
|
data/lib/money-tree/node.rb
CHANGED
@@ -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 >=
|
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 >=
|
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 >=
|
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
|
214
|
-
|
215
|
-
|
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
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
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!
|
data/lib/money-tree/version.rb
CHANGED
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.
|
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
|
@@ -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.
|
26
|
-
let(:key2) { OpenSSL::PKey::EC.
|
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.
|
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:
|
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.
|
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.
|
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)
|
data/certs/mattatgemco.pem
DELETED
@@ -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-----
|