utxoracle 0.0.3 → 0.1.1

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: 2ac6ef650a940eb64d180a28f6d556acca9310a42d199fa4bceb59e909cb6b2e
4
- data.tar.gz: '0792d9c0e1867d62fcc507a0574c9338577b8468399d26b34124092525dddd8d'
3
+ metadata.gz: 27cdbbaf670f00da5da626ef21a0edeea1f94a046f07a6b7eedf3a6082522f74
4
+ data.tar.gz: 41879792ecb2ca00f62c78316676c800a46dcfb50c735b12ce9ca19bc0e6e025
5
5
  SHA512:
6
- metadata.gz: 528c646c4201da999ca64ef7ea2ddd723a27e4663d7a253a0bc58472af5efc44d17ae28c4482b0bb271c7d87ed4269c165aa7355c6f0364b49cbdf1672b7e4e6
7
- data.tar.gz: a34764d738c7fc67d09d57a9bf142642c2087233fe0fbb9110327ad2153b8d5c737924fab4cb120386f798b4ad4f819102d19f809a41b59b213797f7396c414d
6
+ metadata.gz: 12d274a91721d318f7ba7cfac53fcfb9d3ae0925a62f5645071b409af44bd18dbaf25b6f3107e0c4e5b57c4c195200065b942eb7f436e9be417753f508d7bef1
7
+ data.tar.gz: af8065f8b177b0f57d938e94dba0605974d035d8289a9b6b3bd9de19654deaca0d47cb4d6f7820b7582ec22d6f246cabf927dea5244e0d86e3e49ef09e59fefd
data/.gitignore CHANGED
@@ -55,6 +55,5 @@ build-iPhoneSimulator/
55
55
  # Used by RuboCop. Remote config files pulled in from inherit_from directive.
56
56
  # .rubocop-https?--*
57
57
 
58
- /Gemfile.lock
59
58
  .rspec_status
60
59
  .DS_Store
data/Gemfile.lock ADDED
@@ -0,0 +1,118 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ utxoracle (0.1.1)
5
+ cleanrpc (~> 0.0.2)
6
+ typhoeus (~> 1.4.0)
7
+
8
+ GEM
9
+ remote: https://rubygems.org/
10
+ specs:
11
+ ansi (1.5.0)
12
+ ast (2.4.2)
13
+ cleanrpc (0.0.3)
14
+ coderay (1.1.3)
15
+ diff-lcs (1.5.1)
16
+ docile (1.4.0)
17
+ ethon (0.16.0)
18
+ ffi (>= 1.15.0)
19
+ ffi (1.17.0)
20
+ ffi (1.17.0-aarch64-linux-gnu)
21
+ ffi (1.17.0-aarch64-linux-musl)
22
+ ffi (1.17.0-arm-linux-gnu)
23
+ ffi (1.17.0-arm-linux-musl)
24
+ ffi (1.17.0-arm64-darwin)
25
+ ffi (1.17.0-x86-linux-gnu)
26
+ ffi (1.17.0-x86-linux-musl)
27
+ ffi (1.17.0-x86_64-darwin)
28
+ ffi (1.17.0-x86_64-linux-gnu)
29
+ ffi (1.17.0-x86_64-linux-musl)
30
+ json (2.7.2)
31
+ language_server-protocol (3.17.0.3)
32
+ method_source (1.1.0)
33
+ parallel (1.25.1)
34
+ parser (3.3.3.0)
35
+ ast (~> 2.4.1)
36
+ racc
37
+ pry (0.14.2)
38
+ coderay (~> 1.1)
39
+ method_source (~> 1.0)
40
+ racc (1.8.0)
41
+ rainbow (3.1.1)
42
+ rake (13.2.1)
43
+ regexp_parser (2.9.2)
44
+ rexml (3.3.0)
45
+ strscan
46
+ rspec (3.13.0)
47
+ rspec-core (~> 3.13.0)
48
+ rspec-expectations (~> 3.13.0)
49
+ rspec-mocks (~> 3.13.0)
50
+ rspec-core (3.13.0)
51
+ rspec-support (~> 3.13.0)
52
+ rspec-expectations (3.13.1)
53
+ diff-lcs (>= 1.2.0, < 2.0)
54
+ rspec-support (~> 3.13.0)
55
+ rspec-mocks (3.13.1)
56
+ diff-lcs (>= 1.2.0, < 2.0)
57
+ rspec-support (~> 3.13.0)
58
+ rspec-support (3.13.1)
59
+ rubocop (1.64.1)
60
+ json (~> 2.3)
61
+ language_server-protocol (>= 3.17.0)
62
+ parallel (~> 1.10)
63
+ parser (>= 3.3.0.2)
64
+ rainbow (>= 2.2.2, < 4.0)
65
+ regexp_parser (>= 1.8, < 3.0)
66
+ rexml (>= 3.2.5, < 4.0)
67
+ rubocop-ast (>= 1.31.1, < 2.0)
68
+ ruby-progressbar (~> 1.7)
69
+ unicode-display_width (>= 2.4.0, < 3.0)
70
+ rubocop-ast (1.31.3)
71
+ parser (>= 3.3.1.0)
72
+ rubocop-rspec (3.0.1)
73
+ rubocop (~> 1.61)
74
+ ruby-progressbar (1.13.0)
75
+ simplecov (0.22.0)
76
+ docile (~> 1.1)
77
+ simplecov-html (~> 0.11)
78
+ simplecov_json_formatter (~> 0.1)
79
+ simplecov-console (0.9.1)
80
+ ansi
81
+ simplecov
82
+ terminal-table
83
+ simplecov-html (0.12.3)
84
+ simplecov_json_formatter (0.1.4)
85
+ stackprof (0.2.26)
86
+ strscan (3.1.0)
87
+ terminal-table (3.0.2)
88
+ unicode-display_width (>= 1.1.1, < 3)
89
+ typhoeus (1.4.1)
90
+ ethon (>= 0.9.0)
91
+ unicode-display_width (2.5.0)
92
+
93
+ PLATFORMS
94
+ aarch64-linux-gnu
95
+ aarch64-linux-musl
96
+ arm-linux-gnu
97
+ arm-linux-musl
98
+ arm64-darwin
99
+ ruby
100
+ x86-linux-gnu
101
+ x86-linux-musl
102
+ x86_64-darwin
103
+ x86_64-linux-gnu
104
+ x86_64-linux-musl
105
+
106
+ DEPENDENCIES
107
+ pry
108
+ rake
109
+ rspec
110
+ rubocop
111
+ rubocop-rspec
112
+ simplecov
113
+ simplecov-console
114
+ stackprof
115
+ utxoracle!
116
+
117
+ BUNDLED WITH
118
+ 2.5.7
data/README.md CHANGED
@@ -19,6 +19,7 @@ The purpose of releasing Utxoracle as a Gem is multi-fold:
19
19
  - [Usage](#usage)
20
20
  * [Requiring the gem](#requiring-the-gem)
21
21
  * [Fetching Price](#fetching-price)
22
+ - [Performance](#performance)
22
23
  - [Development](#development)
23
24
  - [Contributing](#contributing)
24
25
  - [License](#license)
@@ -92,6 +93,53 @@ blocks_on_this_day: 165
92
93
  Price Estimate: $27,045
93
94
  ```
94
95
 
96
+ ## Performance
97
+
98
+ Without optimization at the algorithmic/implementation level, UTXOracle.rb is able to compute prices for an entire month in ~10 minutes using native Ruby threads.
99
+
100
+ Results on 3Ghz 6-Core Intel i5
101
+
102
+ For October 2023:
103
+ ```ruby
104
+ $ ./bin/benchmark/run_range aUser aPassword 127.0.0.1 8332 2023-10-01 2023-11-01
105
+ [1] pry(main)> ret.sort
106
+ => [[2023-10-01 00:00:00 -0400, 27364],
107
+ [2023-10-02 00:00:00 -0400, 28345],
108
+ [2023-10-03 00:00:00 -0400, 27696],
109
+ [2023-10-04 00:00:00 -0400, 27712],
110
+ [2023-10-05 00:00:00 -0400, 27725],
111
+ [2023-10-06 00:00:00 -0400, 28021],
112
+ [2023-10-07 00:00:00 -0400, 28311],
113
+ [2023-10-08 00:00:00 -0400, 28308],
114
+ [2023-10-09 00:00:00 -0400, 28000],
115
+ [2023-10-10 00:00:00 -0400, 27708],
116
+ [2023-10-11 00:00:00 -0400, 27373],
117
+ [2023-10-12 00:00:00 -0400, 27045],
118
+ [2023-10-13 00:00:00 -0400, 27058],
119
+ [2023-10-14 00:00:00 -0400, 27077],
120
+ [2023-10-15 00:00:00 -0400, 27093],
121
+ [2023-10-16 00:00:00 -0400, 28357],
122
+ [2023-10-17 00:00:00 -0400, 28664],
123
+ [2023-10-18 00:00:00 -0400, 28658],
124
+ [2023-10-19 00:00:00 -0400, 28690],
125
+ [2023-10-20 00:00:00 -0400, 29704],
126
+ [2023-10-21 00:00:00 -0400, 30034],
127
+ [2023-10-22 00:00:00 -0400, 30333],
128
+ [2023-10-23 00:00:00 -0400, 31069],
129
+ [2023-10-24 00:00:00 -0400, 34468],
130
+ [2023-10-25 00:00:00 -0400, 34858],
131
+ [2023-10-26 00:00:00 -0400, 34484],
132
+ [2023-10-27 00:00:00 -0400, 34114],
133
+ [2023-10-28 00:00:00 -0400, 34438],
134
+ [2023-10-29 00:00:00 -0400, 34841],
135
+ [2023-10-30 00:00:00 -0400, 34840],
136
+ [2023-10-31 00:00:00 -0400, 34829]]
137
+ [2] pry(main)> time
138
+ => #<Benchmark::Tms:0x0000000110ddd310 @cstime=0.0, @cutime=0.0, @label="", @real=643.9174029999995, @stime=87.356026, @total=647.7391030000001, @utime=560.3830770000001>
139
+
140
+ # 643 seconds, or 10.7 minutes.
141
+ ```
142
+
95
143
 
96
144
  ## Development
97
145
 
@@ -124,7 +172,7 @@ rake spec # Run RSpec code examples
124
172
 
125
173
  ## Contributing
126
174
 
127
- Bug reports and pull requests are welcome on GitHub at https://github.com/Carolina-Bitcoin-Project/UTXOracle.
175
+ Bug reports and pull requests are welcome on GitHub at https://github.com/BrantaOps/UTXOracle.
128
176
 
129
177
  ## License
130
178
 
@@ -0,0 +1,39 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ # This is a copy of bin/run but with timing code.
5
+ # Usage:
6
+ #
7
+ # Basic wall clock measurement:
8
+ # $ ./bin/benchmarks/run aUser aPassword 127.0.0.1 8332 2023-10-01
9
+ #
10
+ # With StackProf measurement:
11
+ # ./bin/benchmarks/run aUser aPassword 127.0.0.1 8332 2023-10-01 true
12
+
13
+ require 'bundler/setup'
14
+ require 'utxoracle'
15
+ require 'benchmark'
16
+
17
+ user = ARGV[0]
18
+ password = ARGV[1]
19
+ ip = ARGV[2]
20
+ port = ARGV[3]
21
+ date = ARGV[4]
22
+ profile = ARGV[5]
23
+
24
+ if profile
25
+ require 'stackprof'
26
+ # See https://github.com/tmm1/stackprof#sampling: for :cpu, :wall, :object
27
+ StackProf.run(mode: :wall, out: 'tmp/stackprof-wall.dump', raw: true) do
28
+ provider = Utxoracle::Node.new(user, password, ip, port)
29
+ oracle = Utxoracle::Oracle.new(provider, log = false)
30
+ puts oracle.price(date)
31
+ end
32
+ else
33
+ time = Benchmark.measure do
34
+ provider = Utxoracle::Node.new(user, password, ip, port)
35
+ oracle = Utxoracle::Oracle.new(provider, log = false)
36
+ puts oracle.price(date)
37
+ end
38
+ puts time
39
+ end
@@ -0,0 +1,40 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ # This is a copy of bin/run_range but with timing code.
5
+ # Usage:
6
+ #
7
+ # ./bin/benchmarks/run_range aUser aPassword 127.0.0.1 8332 2023-10-01 2023-10-05
8
+ #
9
+ # Note: Too long of a range will crash the program.
10
+ # Bitcoin Core has limits:
11
+ # https://github.com/bitcoin/bitcoin/blob/c0ddd32bf629bb48426b0651def497ca1a78e6b1/src/httpserver.h#L12-L14
12
+ # for threads, queue and timeout.
13
+ #
14
+ # With default settings, 20 days works fine.
15
+ #
16
+ # To run for a full month, I've found the following settings to work fine:
17
+ #
18
+ # rpcworkqueue=32
19
+ # rpcthreads=16
20
+ # rpctimeout=60
21
+ # Database cache 1024 MiB
22
+
23
+ require 'bundler/setup'
24
+ require 'utxoracle'
25
+ require 'benchmark'
26
+
27
+ user = ARGV[0]
28
+ password = ARGV[1]
29
+ ip = ARGV[2]
30
+ port = ARGV[3]
31
+ start_date = ARGV[4]
32
+ end_date = ARGV[5]
33
+
34
+ time = Benchmark.measure do
35
+ provider = Utxoracle::Node.new(user, password, ip, port)
36
+ batch_oracle = Utxoracle::BatchOracle.new(provider)
37
+ batch_oracle.prices(start_date, end_date)
38
+ end
39
+
40
+ puts time.real
data/bin/run CHANGED
@@ -4,24 +4,12 @@
4
4
  require 'bundler/setup'
5
5
  require 'utxoracle'
6
6
 
7
- user = ARGV[0]
8
- password = ARGV[1]
9
- ip = ARGV[2]
10
- port = ARGV[3]
11
- date = ARGV[4]
12
- profile = ARGV[5]
13
-
14
-
15
- if profile
16
- require 'stackprof'
17
- # See https://github.com/tmm1/stackprof#sampling: for :cpu, :wall, :object
18
- StackProf.run(mode: :wall, out: 'tmp/stackprof-wall.dump', raw: true) do
19
- provider = Utxoracle::Node.new(user, password, ip, port)
20
- oracle = Utxoracle::Oracle.new(provider, log = true)
21
- oracle.price(date)
22
- end
23
- else
24
- provider = Utxoracle::Node.new(user, password, ip, port)
25
- oracle = Utxoracle::Oracle.new(provider, log = true)
26
- oracle.price(date)
27
- end
7
+ user = ARGV[0]
8
+ password = ARGV[1]
9
+ ip = ARGV[2]
10
+ port = ARGV[3]
11
+ date = ARGV[4]
12
+
13
+ provider = Utxoracle::Node.new(user, password, ip, port)
14
+ oracle = Utxoracle::Oracle.new(provider, log = true)
15
+ oracle.price(date)
data/bin/run_range ADDED
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require 'bundler/setup'
5
+ require 'utxoracle'
6
+
7
+ user = ARGV[0]
8
+ password = ARGV[1]
9
+ ip = ARGV[2]
10
+ port = ARGV[3]
11
+ start_date = ARGV[4]
12
+ end_date = ARGV[5]
13
+
14
+ provider = Utxoracle::Node.new(user, password, ip, port)
15
+ batch_oracle = Utxoracle::BatchOracle.new(provider)
16
+ batch_oracle.prices(start_date, end_date)
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Utxoracle
4
+ class BatchOracle
5
+ def initialize(provider, log = false)
6
+ @provider = provider
7
+ @log = log
8
+ end
9
+
10
+ def prices(start_date, end_date)
11
+ formatted_start_date = Time.parse start_date.tr('\n', '')
12
+ formatted_end_date = Time.parse end_date.tr('\n', '')
13
+ ret = {}
14
+
15
+ date = formatted_start_date
16
+ threads = []
17
+
18
+ while date < formatted_end_date
19
+ # Bind `date` to thread scope: https://ruby-doc.org/core-2.0.0/Thread.html#method-c-new
20
+ threads << Thread.new(date) do |t_date|
21
+ oracle = Utxoracle::Oracle.new(@provider, log = @log)
22
+ date_str = t_date.to_s[0..9]
23
+ ret[date_str] = oracle.price(date_str)
24
+ end
25
+
26
+ date += Utxoracle::Oracle::SECONDS_PER_DAY
27
+ end
28
+ threads.each(&:join)
29
+
30
+ puts ret
31
+ ret
32
+ end
33
+ end
34
+ end
@@ -1,8 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'time'
2
4
 
3
5
  module Utxoracle
4
6
  class Oracle
5
- SECONDS_IN_A_DAY = 60 * 60 * 24
7
+ SECONDS_PER_DAY = 86_400
6
8
  FOUR_HOURS = 14_400
7
9
  MAINNET_PORT = 8332
8
10
  TESTNET_PORT = 18_332
@@ -51,7 +53,7 @@ module Utxoracle
51
53
  latest_utc_midnight = Time.new(latest_year, latest_month, latest_day).utc
52
54
 
53
55
  latest_time_in_seconds = blockheader['time']
54
- yesterday_seconds = latest_time_in_seconds - SECONDS_IN_A_DAY
56
+ yesterday_seconds = latest_time_in_seconds - SECONDS_PER_DAY
55
57
  latest_price_day = Time.at(yesterday_seconds).utc
56
58
  latest_price_date = latest_price_day.utc.strftime('%Y-%m-%d')
57
59
 
@@ -59,7 +61,7 @@ module Utxoracle
59
61
  price_day_date_utc = @requested_date
60
62
 
61
63
  seconds_since_price_day = latest_time_in_seconds - price_day_seconds
62
- blocks_ago_estimate = (144 * seconds_since_price_day.to_f / SECONDS_IN_A_DAY.to_f).round
64
+ blocks_ago_estimate = (144 * seconds_since_price_day.to_f / SECONDS_PER_DAY.to_f).round
63
65
  price_day_block_estimate = (block_count - blocks_ago_estimate).to_i
64
66
 
65
67
  block_hash_b = @provider.getblockhash(price_day_block_estimate)
@@ -67,7 +69,7 @@ module Utxoracle
67
69
  time_in_seconds = block_header['time']
68
70
 
69
71
  seconds_difference = time_in_seconds - price_day_seconds
70
- block_jump_estimate = (144.0 * seconds_difference / SECONDS_IN_A_DAY).round
72
+ block_jump_estimate = (144.0 * seconds_difference / SECONDS_PER_DAY).round
71
73
 
72
74
  last_estimate = 0
73
75
  last_last_estimate = 0
@@ -81,7 +83,7 @@ module Utxoracle
81
83
 
82
84
  time_in_seconds = block_header['time']
83
85
  seconds_difference = time_in_seconds - price_day_seconds
84
- block_jump_estimate = (144.0 * seconds_difference / SECONDS_IN_A_DAY).round
86
+ block_jump_estimate = (144.0 * seconds_difference / SECONDS_PER_DAY).round
85
87
  end
86
88
 
87
89
  if time_in_seconds > price_day_seconds
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Utxoracle
2
4
  class Provider
3
5
  def init
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Utxoracle
4
- VERSION = '0.0.3'
4
+ VERSION = '0.1.1'
5
5
  end
data/lib/utxoracle.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative 'utxoracle/version'
4
+ require_relative 'utxoracle/batch_oracle'
4
5
  require_relative 'utxoracle/oracle'
5
6
  require_relative 'utxoracle/providers/mempool'
6
7
  require_relative 'utxoracle/providers/node'
data/utxoracle.gemspec CHANGED
@@ -13,7 +13,7 @@ Gem::Specification.new do |spec|
13
13
 
14
14
  spec.summary = 'Offline price oracle for Bitcoin.'
15
15
  spec.description = 'Offline price oracle for Bitcoin. Offers programmable data providers (Bitcoin node, mempool, etc). Can be used from commandline, or integrated into existing ruby stacks.'
16
- spec.homepage = 'https://github.com/Carolina-Bitcoin-Project/UTXOracle'
16
+ spec.homepage = 'https://github.com/BrantaOps/UTXOracle'
17
17
  spec.license = 'MIT'
18
18
  spec.required_ruby_version = '>= 3.1.0'
19
19
 
@@ -21,8 +21,8 @@ Gem::Specification.new do |spec|
21
21
  spec.bindir = 'bin'
22
22
  spec.require_path = 'lib'
23
23
 
24
- spec.add_dependency 'typhoeus', '~> 1.4.0'
25
24
  spec.add_dependency 'cleanrpc', '~> 0.0.2'
25
+ spec.add_dependency 'typhoeus', '~> 1.4.0'
26
26
 
27
27
  spec.add_development_dependency 'pry'
28
28
  spec.add_development_dependency 'rake'
metadata CHANGED
@@ -1,43 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: utxoracle
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Keith Gardner
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-11-06 00:00:00.000000000 Z
11
+ date: 2024-06-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: typhoeus
14
+ name: cleanrpc
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 1.4.0
19
+ version: 0.0.2
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 1.4.0
26
+ version: 0.0.2
27
27
  - !ruby/object:Gem::Dependency
28
- name: cleanrpc
28
+ name: typhoeus
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 0.0.2
33
+ version: 1.4.0
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 0.0.2
40
+ version: 1.4.0
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: pry
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -161,12 +161,17 @@ files:
161
161
  - ".gitignore"
162
162
  - ".ruby-version"
163
163
  - Gemfile
164
+ - Gemfile.lock
164
165
  - LICENSE
165
166
  - README.md
166
167
  - Rakefile
168
+ - bin/benchmarks/run
169
+ - bin/benchmarks/run_range
167
170
  - bin/console
168
171
  - bin/run
172
+ - bin/run_range
169
173
  - lib/utxoracle.rb
174
+ - lib/utxoracle/batch_oracle.rb
170
175
  - lib/utxoracle/oracle.rb
171
176
  - lib/utxoracle/provider.rb
172
177
  - lib/utxoracle/providers/mempool.rb
@@ -177,7 +182,7 @@ files:
177
182
  - spec/utxoracle/oracle_spec.rb
178
183
  - spec/utxoracle_spec.rb
179
184
  - utxoracle.gemspec
180
- homepage: https://github.com/Carolina-Bitcoin-Project/UTXOracle
185
+ homepage: https://github.com/BrantaOps/UTXOracle
181
186
  licenses:
182
187
  - MIT
183
188
  metadata: {}
@@ -196,7 +201,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
196
201
  - !ruby/object:Gem::Version
197
202
  version: '0'
198
203
  requirements: []
199
- rubygems_version: 3.4.21
204
+ rubygems_version: 3.4.10
200
205
  signing_key:
201
206
  specification_version: 4
202
207
  summary: Offline price oracle for Bitcoin.