beowulf-ruby-testnet 0.0.1

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,4 @@
1
+ module Beowulf
2
+ VERSION = '0.0.1'
3
+ AGENT_ID = "beowulf/#{VERSION}"
4
+ end
@@ -0,0 +1,212 @@
1
+ require 'bitcoin'
2
+ require 'digest'
3
+ require 'base58'
4
+ require 'json'
5
+
6
+ module Beowulf
7
+ class Wallet
8
+ include ChainConfig
9
+ include Utils
10
+
11
+ def initialize(options = {})
12
+ @name = options[:name] || ''
13
+ @private_key = options[:private_key] || ''
14
+ @public_key = options[:public_key] || ''
15
+ @cipher_keys = options[:cipher_keys] || ''
16
+ @cipher_type = 'aes-256-cbc'
17
+ @salt = options[:salt] || ''
18
+ end
19
+
20
+ def name
21
+ @name
22
+ end
23
+
24
+ def private_key
25
+ @private_key
26
+ end
27
+
28
+ def public_key
29
+ @public_key
30
+ end
31
+
32
+ def gen_keys
33
+ @private_key = gen_priv
34
+ # puts "priv_key:", @private_key
35
+ @public_key = gen_pub
36
+ # puts "pub_key:", @public_key
37
+ end
38
+
39
+ def gen_priv
40
+ rd = SecureRandom.alphanumeric(128)
41
+ # puts "rd:", rd
42
+ seed = @name + "owner" + rd
43
+ # puts "seed:", seed
44
+ bytes = pakStr(seed)
45
+ hashSha256 = Digest::SHA256.digest(bytes)
46
+ # create checksum
47
+ pk = unhexlify('80')
48
+ pk << hashSha256
49
+ chs = Digest::SHA256.digest(pk)
50
+ chs = Digest::SHA256.digest(chs)
51
+ # create private key.
52
+ b58 = pk
53
+ b58 << chs[0..3]
54
+ # puts "gen_priv.b58:", hexlify(b58)
55
+ priv_key = Base58.binary_to_base58(b58, :bitcoin)
56
+ priv_key
57
+ end
58
+
59
+ def gen_pub
60
+ if @private_key.length > 0
61
+ b58 = Base58.base58_to_binary(@private_key, :bitcoin)
62
+ # puts "b58:", hexlify(b58)
63
+ # Get checksum 4-bytes end.
64
+ lb58 = b58.length-4
65
+ chs = b58[lb58..-1]
66
+ # Get raw private key
67
+ hb58 = lb58-1
68
+ tpk = b58[0..hb58]
69
+ # Test checksum private key
70
+ nchs = Digest::SHA256.digest(tpk)
71
+ nchs = Digest::SHA256.digest(nchs)
72
+ achs = hexlify(chs)
73
+ bnchs = hexlify(nchs[0..3])
74
+ if !(achs.eql? bnchs)
75
+ puts achs, bnchs
76
+ puts 'Invalid private key (checksum miss-match)'
77
+ end
78
+ # Create Public Key
79
+ bk = Bitcoin::Key.new(hexlify(tpk[1..-1]), nil, {compressed: true})
80
+ # puts "bk.compressed:", bk.compressed
81
+ public_key_hex = bk.pub
82
+ # puts "public_key_hex.length:", public_key_hex.length
83
+ # puts "public_key_hex:", public_key_hex
84
+ public_key_byte = unhexlify(public_key_hex)
85
+ checksum = OpenSSL::Digest::RIPEMD160.digest(public_key_byte)
86
+ public_key = NETWORKS_BEOWULF_ADDRESS_PREFIX + Base58.binary_to_base58(public_key_byte + checksum[0..3], :bitcoin)
87
+ public_key
88
+ end
89
+ end
90
+
91
+ def save_wallet_file(wallet_path, wallet_filename, password)
92
+ # Validate
93
+ if password == nil || password.length == 0
94
+ puts "Password is not empty."
95
+ end
96
+ if password.length < 8
97
+ puts "Password length >= 8 character."
98
+ end
99
+ if @name == nil || @name.length == 0
100
+ puts "name is not empty."
101
+ end
102
+
103
+ # Encrypt data
104
+ # Create checksum
105
+ @salt = SecureRandom.alphanumeric(16)
106
+ new_password = password + @salt
107
+ # puts "new_password:", new_password
108
+ pw_bytes = pakStr(new_password)
109
+ checksum = Digest::SHA512.digest(pw_bytes)
110
+ chs = hexlify(checksum)
111
+ # puts "chs", chs
112
+ # Create plain_data
113
+ keys = {@public_key => @private_key}
114
+ # puts "keys:", keys
115
+ plain_keys = {"checksum" => chs, "keys" => keys}
116
+ plain_data = JSON.dump(plain_keys)
117
+ # puts "plain_data:", plain_data
118
+
119
+ # Encrypt AES
120
+ msg_encrypt = encrypt(chs, plain_data)
121
+ msg_hex = hexlify(msg_encrypt)
122
+ # puts "msg_hex:", msg_hex
123
+ @cipher_keys = msg_hex
124
+
125
+ # Write file
126
+ file_path = wallet_filename
127
+ if wallet_filename.length == 0
128
+ file_path = @name + "-wallet.json"
129
+ end
130
+ if wallet_path.length > 0
131
+ file_path = File.join(wallet_path, file_path)
132
+ end
133
+ # puts "file_path:", file_path
134
+ # Create data save.
135
+ wallet_data = {"cipher_keys" => @cipher_keys, "cipher_type" => @cipher_type, "salt" => @salt, "name" => @name}
136
+ wallet_json = JSON.dump(wallet_data)
137
+ # puts "wallet_json:", wallet_json
138
+ File.open(file_path, "w") { |file| file.puts wallet_json}
139
+ end
140
+
141
+ # https://gist.github.com/andrekandore/3140554
142
+ def encrypt(key, data)
143
+ block = key[0..31]
144
+ aes = OpenSSL::Cipher.new('AES-256-CBC')
145
+ aes.encrypt
146
+ last = 31 + aes.block_size
147
+ # puts "last:", last
148
+ aes.iv = key[32..last]
149
+ aes.key = block
150
+ final_msg = aes.update(data) + aes.final
151
+ final_msg
152
+ end
153
+
154
+ def read_wallet_file(wallet_path_file, password)
155
+ # puts "wallet_path_file:", wallet_path_file
156
+ # Validate inputs
157
+ if wallet_path_file == nil || wallet_path_file.length == 0
158
+ puts "Path file wallet is not empty."
159
+ end
160
+ if password == nil || password.length == 0
161
+ puts "Password is not empty."
162
+ end
163
+ # Read file wallet
164
+ file = File.read(wallet_path_file)
165
+ wallet_json = JSON.parse(file)
166
+ # puts "wallet_json:", wallet_json
167
+ # Init properties wallet
168
+ @name = wallet_json['name']
169
+ @cipher_keys = wallet_json['cipher_keys']
170
+ # puts "read_wallet_file.cipher_keys:", @cipher_keys
171
+ @salt = wallet_json['salt']
172
+ # Create checksum
173
+ new_password = password + @salt
174
+ # puts "new_password:", new_password
175
+ pw_bytes = pakStr(new_password)
176
+ checksum = Digest::SHA512.digest(pw_bytes)
177
+ chs = hexlify(checksum)
178
+ # puts "chs", chs
179
+ # Decrypt data
180
+ data_byte = unhexlify(@cipher_keys)
181
+ # Decrypt AES
182
+ msg_decrypt = decrypt(chs, data_byte)
183
+ # puts "msg_decrypt:", msg_decrypt
184
+ msg_json = JSON.parse(msg_decrypt)
185
+ # puts "msg_json:", msg_json
186
+ dechs = msg_json['checksum']
187
+ if !(chs.eql? dechs)
188
+ puts "Password wrong."
189
+ end
190
+ keys = msg_json['keys']
191
+ keys.each do |key, value|
192
+ # puts "#{key} is #{value}"
193
+ @public_key = key
194
+ @private_key = value
195
+ end
196
+ end
197
+
198
+ # https://gist.github.com/andrekandore/3140554
199
+ def decrypt(key, data)
200
+ block = key[0..31]
201
+ aes = OpenSSL::Cipher.new('AES-256-CBC')
202
+ aes.decrypt
203
+ last = 31 + aes.block_size
204
+ # puts "last:", last
205
+ aes.iv = key[32..last]
206
+ aes.key = block
207
+ final_msg = aes.update(data) + aes.final
208
+ final_msg
209
+ end
210
+
211
+ end
212
+ end
metadata ADDED
@@ -0,0 +1,463 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: beowulf-ruby-testnet
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - NghiaTC
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2020-02-07 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.0'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 2.0.1
23
+ type: :development
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '2.0'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 2.0.1
33
+ - !ruby/object:Gem::Dependency
34
+ name: rake
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '12.1'
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: 12.1.0
43
+ type: :development
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - "~>"
48
+ - !ruby/object:Gem::Version
49
+ version: '12.1'
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: 12.1.0
53
+ - !ruby/object:Gem::Dependency
54
+ name: minitest
55
+ requirement: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - "~>"
58
+ - !ruby/object:Gem::Version
59
+ version: '5.10'
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: 5.10.3
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: '5.10'
70
+ - - ">="
71
+ - !ruby/object:Gem::Version
72
+ version: 5.10.3
73
+ - !ruby/object:Gem::Dependency
74
+ name: minitest-line
75
+ requirement: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - "~>"
78
+ - !ruby/object:Gem::Version
79
+ version: 0.6.3
80
+ type: :development
81
+ prerelease: false
82
+ version_requirements: !ruby/object:Gem::Requirement
83
+ requirements:
84
+ - - "~>"
85
+ - !ruby/object:Gem::Version
86
+ version: 0.6.3
87
+ - !ruby/object:Gem::Dependency
88
+ name: minitest-proveit
89
+ requirement: !ruby/object:Gem::Requirement
90
+ requirements:
91
+ - - "~>"
92
+ - !ruby/object:Gem::Version
93
+ version: '1.0'
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: 1.0.0
97
+ type: :development
98
+ prerelease: false
99
+ version_requirements: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '1.0'
104
+ - - ">="
105
+ - !ruby/object:Gem::Version
106
+ version: 1.0.0
107
+ - !ruby/object:Gem::Dependency
108
+ name: webmock
109
+ requirement: !ruby/object:Gem::Requirement
110
+ requirements:
111
+ - - "~>"
112
+ - !ruby/object:Gem::Version
113
+ version: '3.6'
114
+ - - ">="
115
+ - !ruby/object:Gem::Version
116
+ version: 3.6.0
117
+ type: :development
118
+ prerelease: false
119
+ version_requirements: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - "~>"
122
+ - !ruby/object:Gem::Version
123
+ version: '3.6'
124
+ - - ">="
125
+ - !ruby/object:Gem::Version
126
+ version: 3.6.0
127
+ - !ruby/object:Gem::Dependency
128
+ name: simplecov
129
+ requirement: !ruby/object:Gem::Requirement
130
+ requirements:
131
+ - - "~>"
132
+ - !ruby/object:Gem::Version
133
+ version: 0.17.0
134
+ type: :development
135
+ prerelease: false
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ requirements:
138
+ - - "~>"
139
+ - !ruby/object:Gem::Version
140
+ version: 0.17.0
141
+ - !ruby/object:Gem::Dependency
142
+ name: vcr
143
+ requirement: !ruby/object:Gem::Requirement
144
+ requirements:
145
+ - - "~>"
146
+ - !ruby/object:Gem::Version
147
+ version: '5.0'
148
+ - - ">="
149
+ - !ruby/object:Gem::Version
150
+ version: 5.0.0
151
+ type: :development
152
+ prerelease: false
153
+ version_requirements: !ruby/object:Gem::Requirement
154
+ requirements:
155
+ - - "~>"
156
+ - !ruby/object:Gem::Version
157
+ version: '5.0'
158
+ - - ">="
159
+ - !ruby/object:Gem::Version
160
+ version: 5.0.0
161
+ - !ruby/object:Gem::Dependency
162
+ name: yard
163
+ requirement: !ruby/object:Gem::Requirement
164
+ requirements:
165
+ - - "~>"
166
+ - !ruby/object:Gem::Version
167
+ version: 0.9.20
168
+ type: :development
169
+ prerelease: false
170
+ version_requirements: !ruby/object:Gem::Requirement
171
+ requirements:
172
+ - - "~>"
173
+ - !ruby/object:Gem::Version
174
+ version: 0.9.20
175
+ - !ruby/object:Gem::Dependency
176
+ name: pry
177
+ requirement: !ruby/object:Gem::Requirement
178
+ requirements:
179
+ - - "~>"
180
+ - !ruby/object:Gem::Version
181
+ version: '0.11'
182
+ - - ">="
183
+ - !ruby/object:Gem::Version
184
+ version: 0.11.3
185
+ type: :development
186
+ prerelease: false
187
+ version_requirements: !ruby/object:Gem::Requirement
188
+ requirements:
189
+ - - "~>"
190
+ - !ruby/object:Gem::Version
191
+ version: '0.11'
192
+ - - ">="
193
+ - !ruby/object:Gem::Version
194
+ version: 0.11.3
195
+ - !ruby/object:Gem::Dependency
196
+ name: rb-readline
197
+ requirement: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - "~>"
200
+ - !ruby/object:Gem::Version
201
+ version: '0.5'
202
+ - - ">="
203
+ - !ruby/object:Gem::Version
204
+ version: 0.5.5
205
+ type: :development
206
+ prerelease: false
207
+ version_requirements: !ruby/object:Gem::Requirement
208
+ requirements:
209
+ - - "~>"
210
+ - !ruby/object:Gem::Version
211
+ version: '0.5'
212
+ - - ">="
213
+ - !ruby/object:Gem::Version
214
+ version: 0.5.5
215
+ - !ruby/object:Gem::Dependency
216
+ name: irb
217
+ requirement: !ruby/object:Gem::Requirement
218
+ requirements:
219
+ - - "~>"
220
+ - !ruby/object:Gem::Version
221
+ version: '1.0'
222
+ - - ">="
223
+ - !ruby/object:Gem::Version
224
+ version: 1.0.0
225
+ type: :development
226
+ prerelease: false
227
+ version_requirements: !ruby/object:Gem::Requirement
228
+ requirements:
229
+ - - "~>"
230
+ - !ruby/object:Gem::Version
231
+ version: '1.0'
232
+ - - ">="
233
+ - !ruby/object:Gem::Version
234
+ version: 1.0.0
235
+ - !ruby/object:Gem::Dependency
236
+ name: net-http-persistent
237
+ requirement: !ruby/object:Gem::Requirement
238
+ requirements:
239
+ - - "~>"
240
+ - !ruby/object:Gem::Version
241
+ version: '2.5'
242
+ - - ">="
243
+ - !ruby/object:Gem::Version
244
+ version: 2.5.2
245
+ type: :runtime
246
+ prerelease: false
247
+ version_requirements: !ruby/object:Gem::Requirement
248
+ requirements:
249
+ - - "~>"
250
+ - !ruby/object:Gem::Version
251
+ version: '2.5'
252
+ - - ">="
253
+ - !ruby/object:Gem::Version
254
+ version: 2.5.2
255
+ - !ruby/object:Gem::Dependency
256
+ name: json
257
+ requirement: !ruby/object:Gem::Requirement
258
+ requirements:
259
+ - - "~>"
260
+ - !ruby/object:Gem::Version
261
+ version: '2.0'
262
+ - - ">="
263
+ - !ruby/object:Gem::Version
264
+ version: 2.0.2
265
+ type: :runtime
266
+ prerelease: false
267
+ version_requirements: !ruby/object:Gem::Requirement
268
+ requirements:
269
+ - - "~>"
270
+ - !ruby/object:Gem::Version
271
+ version: '2.0'
272
+ - - ">="
273
+ - !ruby/object:Gem::Version
274
+ version: 2.0.2
275
+ - !ruby/object:Gem::Dependency
276
+ name: logging
277
+ requirement: !ruby/object:Gem::Requirement
278
+ requirements:
279
+ - - "~>"
280
+ - !ruby/object:Gem::Version
281
+ version: '2.2'
282
+ - - ">="
283
+ - !ruby/object:Gem::Version
284
+ version: 2.2.0
285
+ type: :runtime
286
+ prerelease: false
287
+ version_requirements: !ruby/object:Gem::Requirement
288
+ requirements:
289
+ - - "~>"
290
+ - !ruby/object:Gem::Version
291
+ version: '2.2'
292
+ - - ">="
293
+ - !ruby/object:Gem::Version
294
+ version: 2.2.0
295
+ - !ruby/object:Gem::Dependency
296
+ name: hashie
297
+ requirement: !ruby/object:Gem::Requirement
298
+ requirements:
299
+ - - "~>"
300
+ - !ruby/object:Gem::Version
301
+ version: '3.5'
302
+ - - ">="
303
+ - !ruby/object:Gem::Version
304
+ version: 3.5.5
305
+ type: :runtime
306
+ prerelease: false
307
+ version_requirements: !ruby/object:Gem::Requirement
308
+ requirements:
309
+ - - "~>"
310
+ - !ruby/object:Gem::Version
311
+ version: '3.5'
312
+ - - ">="
313
+ - !ruby/object:Gem::Version
314
+ version: 3.5.5
315
+ - !ruby/object:Gem::Dependency
316
+ name: bitcoin-ruby
317
+ requirement: !ruby/object:Gem::Requirement
318
+ requirements:
319
+ - - "~>"
320
+ - !ruby/object:Gem::Version
321
+ version: '0.0'
322
+ - - ">="
323
+ - !ruby/object:Gem::Version
324
+ version: 0.0.11
325
+ type: :runtime
326
+ prerelease: false
327
+ version_requirements: !ruby/object:Gem::Requirement
328
+ requirements:
329
+ - - "~>"
330
+ - !ruby/object:Gem::Version
331
+ version: '0.0'
332
+ - - ">="
333
+ - !ruby/object:Gem::Version
334
+ version: 0.0.11
335
+ - !ruby/object:Gem::Dependency
336
+ name: ffi
337
+ requirement: !ruby/object:Gem::Requirement
338
+ requirements:
339
+ - - "~>"
340
+ - !ruby/object:Gem::Version
341
+ version: '1.9'
342
+ - - ">="
343
+ - !ruby/object:Gem::Version
344
+ version: 1.9.18
345
+ type: :runtime
346
+ prerelease: false
347
+ version_requirements: !ruby/object:Gem::Requirement
348
+ requirements:
349
+ - - "~>"
350
+ - !ruby/object:Gem::Version
351
+ version: '1.9'
352
+ - - ">="
353
+ - !ruby/object:Gem::Version
354
+ version: 1.9.18
355
+ - !ruby/object:Gem::Dependency
356
+ name: awesome_print
357
+ requirement: !ruby/object:Gem::Requirement
358
+ requirements:
359
+ - - "~>"
360
+ - !ruby/object:Gem::Version
361
+ version: '1.7'
362
+ - - ">="
363
+ - !ruby/object:Gem::Version
364
+ version: 1.7.0
365
+ type: :runtime
366
+ prerelease: false
367
+ version_requirements: !ruby/object:Gem::Requirement
368
+ requirements:
369
+ - - "~>"
370
+ - !ruby/object:Gem::Version
371
+ version: '1.7'
372
+ - - ">="
373
+ - !ruby/object:Gem::Version
374
+ version: 1.7.0
375
+ - !ruby/object:Gem::Dependency
376
+ name: base58
377
+ requirement: !ruby/object:Gem::Requirement
378
+ requirements:
379
+ - - "~>"
380
+ - !ruby/object:Gem::Version
381
+ version: '0.2'
382
+ - - ">="
383
+ - !ruby/object:Gem::Version
384
+ version: 0.2.3
385
+ type: :runtime
386
+ prerelease: false
387
+ version_requirements: !ruby/object:Gem::Requirement
388
+ requirements:
389
+ - - "~>"
390
+ - !ruby/object:Gem::Version
391
+ version: '0.2'
392
+ - - ">="
393
+ - !ruby/object:Gem::Version
394
+ version: 0.2.3
395
+ description: Beowulf-ruby is the official Beowulf library for Ruby.
396
+ email:
397
+ - contact@beowulfchain.com
398
+ executables: []
399
+ extensions: []
400
+ extra_rdoc_files: []
401
+ files:
402
+ - ".gitignore"
403
+ - Gemfile
404
+ - LICENSE
405
+ - README.md
406
+ - Rakefile
407
+ - beowulf.gemspec
408
+ - lib/beowulf.rb
409
+ - lib/beowulf/account_history_api.rb
410
+ - lib/beowulf/api.rb
411
+ - lib/beowulf/base_error.rb
412
+ - lib/beowulf/block_api.rb
413
+ - lib/beowulf/broadcast_operations.json
414
+ - lib/beowulf/chain_config.rb
415
+ - lib/beowulf/condenser_api.rb
416
+ - lib/beowulf/database_api.rb
417
+ - lib/beowulf/error_parser.rb
418
+ - lib/beowulf/logger.rb
419
+ - lib/beowulf/methods.json
420
+ - lib/beowulf/network_broadcast_api.rb
421
+ - lib/beowulf/operation.rb
422
+ - lib/beowulf/operation_ids.rb
423
+ - lib/beowulf/operation_types.rb
424
+ - lib/beowulf/transaction.rb
425
+ - lib/beowulf/type/amount.rb
426
+ - lib/beowulf/type/array.rb
427
+ - lib/beowulf/type/authority.rb
428
+ - lib/beowulf/type/authority_update.rb
429
+ - lib/beowulf/type/future.rb
430
+ - lib/beowulf/type/hash.rb
431
+ - lib/beowulf/type/permission.rb
432
+ - lib/beowulf/type/point_in_time.rb
433
+ - lib/beowulf/type/public_key.rb
434
+ - lib/beowulf/type/serializer.rb
435
+ - lib/beowulf/type/u_int16.rb
436
+ - lib/beowulf/type/u_int32.rb
437
+ - lib/beowulf/utils.rb
438
+ - lib/beowulf/version.rb
439
+ - lib/beowulf/wallet.rb
440
+ homepage: https://github.com/beowulf-foundation/beowulf-ruby
441
+ licenses:
442
+ - MIT
443
+ metadata: {}
444
+ post_install_message:
445
+ rdoc_options: []
446
+ require_paths:
447
+ - lib
448
+ required_ruby_version: !ruby/object:Gem::Requirement
449
+ requirements:
450
+ - - ">="
451
+ - !ruby/object:Gem::Version
452
+ version: '0'
453
+ required_rubygems_version: !ruby/object:Gem::Requirement
454
+ requirements:
455
+ - - ">="
456
+ - !ruby/object:Gem::Version
457
+ version: '0'
458
+ requirements: []
459
+ rubygems_version: 3.1.2
460
+ signing_key:
461
+ specification_version: 4
462
+ summary: Beowulf RPC Ruby Client
463
+ test_files: []