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 +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-----
|