zold 0.19.2 → 0.20.0

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: 32709fc443bc01bdd90a978c9cc7204fd8d6758466a46dbecb5c811bd2a40a12
4
- data.tar.gz: cd4fe030458935e3ec27db1673289d3b1dbdf63989b027ea50bf8f336fcab49f
3
+ metadata.gz: 3cf98ca9682d1320a73b1abcd73b8d7b05e38e36104cf7b9aa70d5c74f182537
4
+ data.tar.gz: 1c63b8e0ce591b4b2082e84a2858ceac34b85c1310f4cd52a209555e8ed55443
5
5
  SHA512:
6
- metadata.gz: c7b3009e694c98f2dd296d888191b2060cd222e19d621bda1cb457941b5167257149d6c9e7c1ea9645cb221b1c8014fc8d7f44574fcbcecd9a731a204ec5c4ba
7
- data.tar.gz: 30a9c25381547e573a6908412465311c7477314d085100d17fe3ca4baa4289e42196fc62bfdd6565998b36b6d773f3c17bd074c9e0dd2d74e4be83f1590ca9a9
6
+ metadata.gz: 17d3f4eaa73d06fc4afa419e7acb6cb5a3570150d877cf185c446b5dc75eae9f339a446a3359ccdbcb96e43cf96f18bc55ad66b972bac21b0d511d4e939e2723
7
+ data.tar.gz: a4167a3fa33a6d64b3a390d11c4fde7aa645e37f60027e0bb27c73ed4a9385fe0b9240ff0525e8ed511613d8f4383e7170bce2272b53ff52401d45dfbb176bf3
data/.rubocop.yml CHANGED
@@ -8,13 +8,15 @@ AllCops:
8
8
  Layout/EmptyLineAfterGuardClause:
9
9
  Enabled: false
10
10
  Metrics/CyclomaticComplexity:
11
- Max: 25
11
+ Max: 30
12
12
  Metrics/MethodLength:
13
13
  Enabled: false
14
14
  Layout/MultilineMethodCallIndentation:
15
15
  Enabled: false
16
16
  Metrics/AbcSize:
17
17
  Enabled: false
18
+ Metrics/BlockNesting:
19
+ Max: 4
18
20
  Metrics/BlockLength:
19
21
  Max: 120
20
22
  Metrics/ClassLength:
@@ -26,7 +28,7 @@ Metrics/ParameterLists:
26
28
  Layout/AlignParameters:
27
29
  Enabled: false
28
30
  Metrics/PerceivedComplexity:
29
- Max: 25
31
+ Max: 30
30
32
  Metrics/LineLength:
31
33
  Max: 120
32
34
  Style/MultilineBlockChain:
data/bin/zold CHANGED
@@ -222,7 +222,7 @@ cmd = lambda do
222
222
  Zold::Diff.new(wallets: wallets, copies: copies, log: log).run(args)
223
223
  when 'merge'
224
224
  require_relative '../lib/zold/commands/merge'
225
- Zold::Merge.new(wallets: wallets, copies: copies, log: log).run(args)
225
+ Zold::Merge.new(wallets: wallets, remotes: remotes, copies: copies, log: log).run(args)
226
226
  when 'propagate'
227
227
  require_relative '../lib/zold/commands/propagate'
228
228
  Zold::Propagate.new(wallets: wallets, log: log).run(args)
data/heroku-run.sh CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/bin/sh
2
2
 
3
- ./bin/zold node --no-colors --trace --dump-errors --skip-oom \
3
+ ./bin/zold node --no-colors --trace --dump-errors \
4
4
  --bind-port=$PORT --port=80 --host=b1.zold.io --threads=0 \
5
5
  --invoice=ML5Ern7m@912ecc24b32dbe74 --never-reboot
@@ -25,6 +25,7 @@ require 'rainbow'
25
25
  require 'backtrace'
26
26
  require_relative 'thread_badge'
27
27
  require_relative 'args'
28
+ require_relative 'pull'
28
29
  require_relative '../age'
29
30
  require_relative '../log'
30
31
  require_relative '../id'
@@ -40,8 +41,9 @@ module Zold
40
41
  class Merge
41
42
  prepend ThreadBadge
42
43
 
43
- def initialize(wallets:, copies:, log: Log::NULL)
44
+ def initialize(wallets:, remotes:, copies:, log: Log::NULL)
44
45
  @wallets = wallets
46
+ @remotes = remotes
45
47
  @copies = copies
46
48
  @log = log
47
49
  end
@@ -57,6 +59,15 @@ Available options:"
57
59
  o.bool '--skip-propagate',
58
60
  'Don\'t propagate after merge',
59
61
  default: false
62
+ o.bool '--skip-legacy',
63
+ 'Don\'t make legacy transactions (older than 24 hours) immutable',
64
+ default: false
65
+ o.bool '--shallow',
66
+ 'Don\'t try to pull other wallets if their confirmations are required',
67
+ default: false
68
+ o.string '--network',
69
+ 'The name of the network we work in',
70
+ default: 'test'
60
71
  o.bool '--help', 'Print instructions'
61
72
  end
62
73
  mine = Args.new(opts, @log).take || return
@@ -78,6 +89,15 @@ Available options:"
78
89
  cps = cps.all.sort_by { |c| c[:score] }.reverse
79
90
  patch = Patch.new(@wallets, log: @log)
80
91
  score = 0
92
+ unless opts['skip-legacy']
93
+ @wallets.acq(id) do |w|
94
+ if w.exists?
95
+ s = Time.now
96
+ merge_one(opts, patch, w, 'localhost', legacy: true)
97
+ @log.debug("Local legacy copy of #{id} merged in #{Age.new(s)}: #{patch}")
98
+ end
99
+ end
100
+ end
81
101
  cps.each_with_index do |c, idx|
82
102
  wallet = Wallet.new(c[:path])
83
103
  name = "#{c[:name]}/#{idx}/#{c[:score]}"
@@ -86,8 +106,9 @@ Available options:"
86
106
  end
87
107
  @wallets.acq(id) do |w|
88
108
  if w.exists?
109
+ s = Time.now
89
110
  merge_one(opts, patch, w, 'localhost')
90
- @log.debug("Local copy of #{id} merged in #{Age.new(start)}: #{patch}")
111
+ @log.debug("Local copy of #{id} merged in #{Age.new(s)}: #{patch}")
91
112
  else
92
113
  @log.debug("Local copy of #{id} is absent, nothing to merge")
93
114
  end
@@ -103,11 +124,17 @@ into #{@wallets.acq(id, &:mnemo)} in #{Age.new(start, limit: 0.1 + cps.count * 0
103
124
  modified
104
125
  end
105
126
 
106
- def merge_one(opts, patch, wallet, name)
127
+ def merge_one(opts, patch, wallet, name, legacy: false)
107
128
  start = Time.now
108
- @log.debug("Building a patch for #{wallet.id} from remote copy #{name}...")
109
- patch.join(wallet, !opts['no-baseline'])
110
- @log.debug("Copy #{name} of #{wallet.id} merged in #{Age.new(start)}: #{patch}")
129
+ @log.debug("Building a patch for #{wallet.id} from remote copy ##{name} with #{wallet.mnemo}...")
130
+ patch.join(wallet, baseline: !opts['no-baseline'], legacy: legacy) do |id|
131
+ unless opts['shallow']
132
+ Pull.new(wallets: @wallets, remotes: @remotes, copies: @copies, log: @log).run(
133
+ ['pull', id.to_s, "--network=#{opts['network']}", '--shallow']
134
+ )
135
+ end
136
+ end
137
+ @log.debug("Copy ##{name} of #{wallet.id} merged in #{Age.new(start)}: #{patch}")
111
138
  rescue StandardError => e
112
139
  @log.error("Can't merge copy #{name}: #{e.message}")
113
140
  @log.debug(Backtrace.new(e).to_s)
@@ -223,7 +223,7 @@ module Zold
223
223
  end
224
224
  hungry = Zold::ThreadPool.new('hungry', log: @log)
225
225
  wts = Zold::HungryWallets.new(@wallets, @remotes, @copies, hungry, log: @log, network: opts['network'])
226
- Front.set(:zache, Zache.new)
226
+ Front.set(:zache, Zache.new(dirty: true))
227
227
  Front.set(:wallets, wts)
228
228
  Front.set(:remotes, @remotes)
229
229
  Front.set(:copies, @copies)
@@ -45,7 +45,7 @@ module Zold
45
45
  def run(args = [])
46
46
  Zold::Clean.new(wallets: @wallets, copies: @copies, log: @log).run(args)
47
47
  Zold::Fetch.new(wallets: @wallets, remotes: @remotes, copies: @copies, log: @log).run(args)
48
- Zold::Merge.new(wallets: @wallets, copies: @copies, log: @log).run(args)
48
+ Zold::Merge.new(wallets: @wallets, remotes: @remotes, copies: @copies, log: @log).run(args)
49
49
  end
50
50
  end
51
51
  end
@@ -163,7 +163,13 @@ Available options:"
163
163
  def show
164
164
  @remotes.all.each do |r|
165
165
  score = Rainbow("/#{r[:score]}").color(r[:score].positive? ? :green : :red)
166
- @log.info("#{r[:host]}:#{r[:port]}#{score} #{r[:errors]} errors#{r[:default] ? ' default' : ''}")
166
+ @log.info(
167
+ [
168
+ "#{r[:host]}:#{r[:port]}#{score}",
169
+ r[:errors].positive? ? " #{r[:errors]} errors" : '',
170
+ r[:master] ? ' [master]' : ''
171
+ ].join
172
+ )
167
173
  end
168
174
  end
169
175
 
@@ -77,6 +77,7 @@ Available options:"
77
77
  end
78
78
  @log.info(
79
79
  [
80
+ '',
80
81
  "The balance of #{wallet}: #{balance} (#{balance.to_i} zents)",
81
82
  "Network: #{wallet.network}",
82
83
  "Transactions: #{wallet.txns.count}",
@@ -86,6 +87,11 @@ Available options:"
86
87
  "Digest: #{wallet.digest}"
87
88
  ].join("\n")
88
89
  )
90
+ @log.info(
91
+ "\n" + Copies.new(File.join(@copies, wallet.id)).all.map do |c|
92
+ "##{c[:name]}: #{c[:score]} #{Wallet.new(c[:path]).mnemo}"
93
+ end.join("\n")
94
+ )
89
95
  balance
90
96
  end
91
97
  end
@@ -29,6 +29,9 @@ require 'json'
29
29
  module Zold
30
30
  # JSON page
31
31
  class JsonPage
32
+ # When can't parse the JSON page.
33
+ class CantParse < StandardError; end
34
+
32
35
  def initialize(text, uri = '')
33
36
  raise 'JSON text can\'t be nil' if text.nil?
34
37
  raise 'JSON must be of type String' unless text.is_a?(String)
@@ -37,11 +40,16 @@ module Zold
37
40
  end
38
41
 
39
42
  def to_hash
40
- raise 'JSON is empty, can\'t parse' + (@uri.empty? ? '' : " at #{@uri}") if @text.empty?
43
+ raise CantParse, 'JSON is empty, can\'t parse' + (@uri.empty? ? '' : " at #{@uri}") if @text.empty?
41
44
  JSON.parse(@text)
42
45
  rescue JSON::ParserError => e
43
- raise "Failed to parse JSON #{@uri.empty? ? '' : "at #{@uri}"} (#{e.message}): \
44
- #{@text.inspect.gsub(/^.{200,}$/, '\1...')}"
46
+ raise CantParse, "Failed to parse JSON #{@uri.empty? ? '' : "at #{@uri}"} (#{short(e.message)}): #{short(@text)}"
47
+ end
48
+
49
+ private
50
+
51
+ def short(txt)
52
+ txt.gsub(/^.{128,}$/, '\1...').inspect
45
53
  end
46
54
  end
47
55
  end
@@ -78,7 +78,7 @@ module Zold
78
78
  ).run(['fetch', id.to_s, "--ignore-node=#{@address}", "--network=#{@network}", '--quiet-if-absent'])
79
79
  end
80
80
  modified = Merge.new(
81
- wallets: @wallets, copies: copies.root, log: @log
81
+ wallets: @wallets, remotes: @remotes, copies: copies.root, log: @log
82
82
  ).run(['merge', id.to_s, '--no-baseline'])
83
83
  Clean.new(wallets: @wallets, copies: copies.root, log: @log).run(['clean', id.to_s])
84
84
  copies.remove(localhost, Remotes::PORT)
@@ -210,7 +210,8 @@ from #{request.ip} in #{Age.new(@start, limit: 1)}")
210
210
  end,
211
211
  memory: settings.zache.get(:memory, lifetime: 5 * 60) do
212
212
  mem = GetProcessMem.new.bytes.to_i
213
- if mem > settings.opts['oom-limit'] * 1024 * 1024 && !settings.opts['skip-oom']
213
+ if mem > settings.opts['oom-limit'] * 1024 * 1024 &&
214
+ !settings.opts['skip-oom'] && !settings.opts['never-reboot']
214
215
  settings.log.error("We are too big in memory (#{Size.new(mem)}), quitting; use --skip-oom to never quit")
215
216
  Front.stop!
216
217
  end
data/lib/zold/patch.rb CHANGED
@@ -43,7 +43,7 @@ module Zold
43
43
  "#{@txns.count} txns"
44
44
  end
45
45
 
46
- def join(wallet, baseline = true)
46
+ def join(wallet, baseline: true, legacy: false)
47
47
  if @id.nil?
48
48
  @id = wallet.id
49
49
  @key = wallet.key
@@ -68,21 +68,23 @@ module Zold
68
68
  return
69
69
  end
70
70
  wallet.txns.each do |txn|
71
+ next if legacy && (txn.amount.positive? || txn.date > Time.now - 24 * 60 * 60)
71
72
  next if @txns.find { |t| t == txn }
72
73
  if txn.amount.negative?
73
74
  dup = @txns.find { |t| t.id == txn.id && t.amount.negative? }
74
75
  if dup
75
- @log.error("An attempt to overwrite \"#{dup.to_text}\" with \"#{txn.to_text}\" from #{wallet.mnemo}")
76
+ @log.error("An attempt to overwrite existing transaction \"#{dup.to_text}\" \
77
+ with a new one \"#{txn.to_text}\" from #{wallet.mnemo}")
76
78
  next
77
79
  end
78
80
  balance = @txns.map(&:amount).map(&:to_i).inject(&:+).to_i
79
81
  if balance < txn.amount.to_i * -1 && !wallet.root?
80
- @log.error("Transaction ##{txn.id} attempts to make the balance of \
81
- #{wallet.id}/#{Amount.new(zents: balance).to_zld}/#{@txns.size} negative: #{txn.to_text}")
82
+ @log.error("The transaction ##{txn.id} attempts to make the balance of \
83
+ #{wallet.id}/#{Amount.new(zents: balance).to_zld}/#{@txns.size} negative: \"#{txn.to_text}\"")
82
84
  next
83
85
  end
84
86
  unless Signature.new(@network).valid?(@key, wallet.id, txn)
85
- @log.error("Invalid RSA signature at transaction ##{txn.id} of #{wallet.id}: #{txn.to_text}")
87
+ @log.error("Invalid RSA signature at the transaction ##{txn.id} of #{wallet.id}: \"#{txn.to_text}\"")
86
88
  next
87
89
  end
88
90
  else
@@ -100,8 +102,16 @@ module Zold
100
102
  next
101
103
  end
102
104
  unless @wallets.acq(txn.bnf, &:exists?)
103
- @log.error("Paying wallet file is absent: #{txn.to_text}")
104
- next
105
+ if block_given?
106
+ yield(txn.bnf)
107
+ unless @wallets.acq(txn.bnf, &:exists?)
108
+ @log.error("Paying wallet #{txn.bnf} file is absent even after PULL: \"#{txn.to_text}\"")
109
+ next
110
+ end
111
+ else
112
+ @log.error("Paying wallet #{txn.bnf} file is absent and it's a \"shallow\" MERGE: #{txn.to_text}")
113
+ next
114
+ end
105
115
  end
106
116
  unless @wallets.acq(txn.bnf) { |p| p.includes_negative?(txn.id, wallet.id) }
107
117
  @log.error("The beneficiary #{@wallets.acq(txn.bnf, &:mnemo)} of #{@id} \
data/lib/zold/version.rb CHANGED
@@ -25,7 +25,7 @@
25
25
  # Copyright:: Copyright (c) 2018 Yegor Bugayenko
26
26
  # License:: MIT
27
27
  module Zold
28
- VERSION = '0.19.2'
28
+ VERSION = '0.20.0'
29
29
  PROTOCOL = 2
30
30
  REPO = 'zold-io/zold'
31
31
  end
@@ -54,7 +54,7 @@ class TestMerge < Zold::Test
54
54
  copies = home.copies(wallet)
55
55
  copies.add(IO.read(first.path), 'host-1', 80, 5)
56
56
  copies.add(IO.read(second.path), 'host-2', 80, 5)
57
- modified = Zold::Merge.new(wallets: home.wallets, copies: copies.root, log: test_log).run(
57
+ modified = Zold::Merge.new(wallets: home.wallets, remotes: home.remotes, copies: copies.root, log: test_log).run(
58
58
  ['merge', wallet.id.to_s]
59
59
  )
60
60
  assert(1, modified.count)
@@ -75,7 +75,7 @@ class TestMerge < Zold::Test
75
75
  copies = home.copies(wallet)
76
76
  copies.add(IO.read(first.path), 'host-1', 80, 5)
77
77
  copies.add(IO.read(second.path), 'host-2', 80, 5)
78
- modified = Zold::Merge.new(wallets: home.wallets, copies: copies.root, log: test_log).run(
78
+ modified = Zold::Merge.new(wallets: home.wallets, remotes: home.remotes, copies: copies.root, log: test_log).run(
79
79
  ['merge', wallet.id.to_s]
80
80
  )
81
81
  assert(1, modified.count)
@@ -89,7 +89,7 @@ class TestMerge < Zold::Test
89
89
  copies = home.copies(wallet)
90
90
  copies.add(IO.read(wallet.path), 'good-host', 80, 5)
91
91
  copies.add('some garbage', 'bad-host', 80, 5)
92
- modified = Zold::Merge.new(wallets: home.wallets, copies: copies.root, log: test_log).run(
92
+ modified = Zold::Merge.new(wallets: home.wallets, remotes: home.remotes, copies: copies.root, log: test_log).run(
93
93
  ['merge', wallet.id.to_s]
94
94
  )
95
95
  assert(modified.empty?)
@@ -103,7 +103,7 @@ class TestMerge < Zold::Test
103
103
  copies.add(IO.read(wallet.path), 'good-host', 80, 5)
104
104
  key = Zold::Key.new(file: 'fixtures/id_rsa')
105
105
  wallet.sub(Zold::Amount.new(zld: 9.99), "NOPREFIX@#{Zold::Id.new}", key)
106
- Zold::Merge.new(wallets: home.wallets, copies: copies.root, log: test_log).run(
106
+ Zold::Merge.new(wallets: home.wallets, remotes: home.remotes, copies: copies.root, log: test_log).run(
107
107
  ['merge', wallet.id.to_s]
108
108
  )
109
109
  assert(!wallet.balance.zero?)
@@ -118,7 +118,7 @@ class TestMerge < Zold::Test
118
118
  remote.add(Zold::Txn.new(1, Time.now, Zold::Amount.new(zld: 11.0), 'NOPREFIX', Zold::Id.new, 'fake'))
119
119
  copies = home.copies(main)
120
120
  copies.add(IO.read(remote.path), 'fake-host', 80, 0)
121
- Zold::Merge.new(wallets: home.wallets, copies: copies.root, log: test_log).run(
121
+ Zold::Merge.new(wallets: home.wallets, remotes: home.remotes, copies: copies.root, log: test_log).run(
122
122
  ['merge', main.id.to_s, '--no-baseline']
123
123
  )
124
124
  assert_equal(Zold::Amount::ZERO, main.balance)
@@ -130,7 +130,7 @@ class TestMerge < Zold::Test
130
130
  wallet = home.create_wallet
131
131
  key = Zold::Key.new(file: 'fixtures/id_rsa')
132
132
  wallet.sub(Zold::Amount.new(zld: 9.99), "NOPREFIX@#{Zold::Id.new}", key)
133
- Zold::Merge.new(wallets: home.wallets, copies: home.copies.root, log: test_log).run(
133
+ Zold::Merge.new(wallets: home.wallets, remotes: home.remotes, copies: home.copies.root, log: test_log).run(
134
134
  ['merge', wallet.id.to_s, '--no-baseline']
135
135
  )
136
136
  assert_equal(Zold::Amount::ZERO, wallet.balance)
@@ -147,7 +147,8 @@ class TestMerge < Zold::Test
147
147
  FileUtils.cp('fixtures/merge/asserts.rb', dir)
148
148
  wallets = Zold::Wallets.new(dir)
149
149
  copies = File.join(dir, 'copies')
150
- Zold::Merge.new(wallets: wallets, copies: copies, log: test_log).run(
150
+ remotes = Zold::Remotes.new(file: File.join(dir, 'remotes'))
151
+ Zold::Merge.new(wallets: wallets, remotes: remotes, copies: copies, log: test_log).run(
151
152
  %w[merge 0123456789abcdef]
152
153
  )
153
154
  Dir.chdir(dir) do
@@ -34,8 +34,14 @@ class TestJsonPage < Zold::Test
34
34
  end
35
35
 
36
36
  def test_parses_broken_json_page
37
- assert_raises do
37
+ assert_raises Zold::JsonPage::CantParse do
38
38
  Zold::JsonPage.new('not json').to_hash
39
39
  end
40
40
  end
41
+
42
+ def test_parses_empty_page
43
+ assert_raises Zold::JsonPage::CantParse do
44
+ Zold::JsonPage.new('').to_hash
45
+ end
46
+ end
41
47
  end
data/zold.gemspec CHANGED
@@ -61,11 +61,11 @@ and suggests a different architecture for digital wallet maintenance.'
61
61
  s.test_files = s.files.grep(%r{^(test|features)/})
62
62
  s.rdoc_options = ['--charset=UTF-8']
63
63
  s.extra_rdoc_files = ['README.md', 'LICENSE.txt']
64
- s.add_runtime_dependency 'backtrace', '~>0'
64
+ s.add_runtime_dependency 'backtrace', '>=0.3'
65
65
  s.add_runtime_dependency 'concurrent-ruby', '1.1.3'
66
66
  s.add_runtime_dependency 'cucumber', '3.1.2' # has to stay here for Heroku
67
67
  s.add_runtime_dependency 'diffy', '3.2.1'
68
- s.add_runtime_dependency 'futex', '~>0'
68
+ s.add_runtime_dependency 'futex', '>=0.8.1'
69
69
  s.add_runtime_dependency 'get_process_mem', '~>0.2'
70
70
  s.add_runtime_dependency 'json', '2.1.0'
71
71
  s.add_runtime_dependency 'memory_profiler', '0.9.12'
@@ -79,11 +79,11 @@ and suggests a different architecture for digital wallet maintenance.'
79
79
  s.add_runtime_dependency 'slop', '4.6.2'
80
80
  s.add_runtime_dependency 'sys-proctable', '1.2.1'
81
81
  s.add_runtime_dependency 'thin', '1.7.2'
82
- s.add_runtime_dependency 'threads', '~>0'
82
+ s.add_runtime_dependency 'threads', '>=0.3'
83
83
  s.add_runtime_dependency 'typhoeus', '1.3.1'
84
84
  s.add_runtime_dependency 'usagewatch_ext', '0.2.1'
85
- s.add_runtime_dependency 'xcop', '~>0'
86
- s.add_runtime_dependency 'zache', '~>0'
85
+ s.add_runtime_dependency 'xcop', '>=0.6'
86
+ s.add_runtime_dependency 'zache', '>=0.5.3'
87
87
  s.add_runtime_dependency 'zold-score', '0.4.4'
88
88
  s.add_development_dependency 'codecov', '0.1.13'
89
89
  s.add_development_dependency 'minitest', '5.11.3'
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: zold
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.19.2
4
+ version: 0.20.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yegor Bugayenko
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-12-18 00:00:00.000000000 Z
11
+ date: 2018-12-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: backtrace
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '0'
19
+ version: '0.3'
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: '0'
26
+ version: '0.3'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: concurrent-ruby
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -70,16 +70,16 @@ dependencies:
70
70
  name: futex
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - "~>"
73
+ - - ">="
74
74
  - !ruby/object:Gem::Version
75
- version: '0'
75
+ version: 0.8.1
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - "~>"
80
+ - - ">="
81
81
  - !ruby/object:Gem::Version
82
- version: '0'
82
+ version: 0.8.1
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: get_process_mem
85
85
  requirement: !ruby/object:Gem::Requirement
@@ -266,16 +266,16 @@ dependencies:
266
266
  name: threads
267
267
  requirement: !ruby/object:Gem::Requirement
268
268
  requirements:
269
- - - "~>"
269
+ - - ">="
270
270
  - !ruby/object:Gem::Version
271
- version: '0'
271
+ version: '0.3'
272
272
  type: :runtime
273
273
  prerelease: false
274
274
  version_requirements: !ruby/object:Gem::Requirement
275
275
  requirements:
276
- - - "~>"
276
+ - - ">="
277
277
  - !ruby/object:Gem::Version
278
- version: '0'
278
+ version: '0.3'
279
279
  - !ruby/object:Gem::Dependency
280
280
  name: typhoeus
281
281
  requirement: !ruby/object:Gem::Requirement
@@ -308,30 +308,30 @@ dependencies:
308
308
  name: xcop
309
309
  requirement: !ruby/object:Gem::Requirement
310
310
  requirements:
311
- - - "~>"
311
+ - - ">="
312
312
  - !ruby/object:Gem::Version
313
- version: '0'
313
+ version: '0.6'
314
314
  type: :runtime
315
315
  prerelease: false
316
316
  version_requirements: !ruby/object:Gem::Requirement
317
317
  requirements:
318
- - - "~>"
318
+ - - ">="
319
319
  - !ruby/object:Gem::Version
320
- version: '0'
320
+ version: '0.6'
321
321
  - !ruby/object:Gem::Dependency
322
322
  name: zache
323
323
  requirement: !ruby/object:Gem::Requirement
324
324
  requirements:
325
- - - "~>"
325
+ - - ">="
326
326
  - !ruby/object:Gem::Version
327
- version: '0'
327
+ version: 0.5.3
328
328
  type: :runtime
329
329
  prerelease: false
330
330
  version_requirements: !ruby/object:Gem::Requirement
331
331
  requirements:
332
- - - "~>"
332
+ - - ">="
333
333
  - !ruby/object:Gem::Version
334
- version: '0'
334
+ version: 0.5.3
335
335
  - !ruby/object:Gem::Dependency
336
336
  name: zold-score
337
337
  requirement: !ruby/object:Gem::Requirement
@@ -690,7 +690,7 @@ licenses:
690
690
  - MIT
691
691
  metadata: {}
692
692
  post_install_message: |-
693
- Thanks for installing Zold 0.19.2!
693
+ Thanks for installing Zold 0.20.0!
694
694
  Study our White Paper: https://papers.zold.io/wp.pdf
695
695
  Read our blog posts: https://blog.zold.io
696
696
  Try online wallet at: https://wts.zold.io