voucher 0.2.1 → 0.3.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7e0e46425cb8ed9d96119d8340c8e796bef7564a
4
- data.tar.gz: 9c2df3b2661c1f37b6825c136b43a9d38c0e1e43
3
+ metadata.gz: 2e3b42fe58da21ce169db9f3b3d858c0142f09d5
4
+ data.tar.gz: 6831ffac983b28322d93f7bee4e3ad120b3d4062
5
5
  SHA512:
6
- metadata.gz: 34dfe41945b699d042be48f9e030d7e67a9c0d5918a77697266916bd7dd37cae7447d19a4d9518756270bf098d44ee984ce82a6f5ce3819799e6debcb88d120d
7
- data.tar.gz: 1f9c198371a1ce8819b5e7367c8c9d997376e1d2cf10f2a74c55ed42b91e390bbc378ec89a514e48f23de0dc85ea70290cf565f58a26d541678bbb54e532e859
6
+ metadata.gz: b9227d138f53cba826806f17b8df3eb0e554a27b74df7e9edc32fc34fe29bc20bac154ec4f85f7ea002d679ed5cf85352916264402340fe9f7e2df72b1406b42
7
+ data.tar.gz: 8bd4a9086af7859c614089285661297e4530a5f55f945d25677405fb3b51ca37258f36a0085c50e4d2ba8dd7af29407254c8601c0bcdcf5d4e61b2a146fe36ba
data/.gitignore CHANGED
@@ -6,6 +6,8 @@
6
6
  /pkg/
7
7
  /spec/reports/
8
8
  /tmp/
9
+ .idea/
10
+ vendor/
9
11
 
10
12
  # rspec failure tracking
11
13
  .rspec_status
data/.rubocop.yml CHANGED
@@ -6,6 +6,7 @@ AllCops:
6
6
  - 'exe/*'
7
7
  - 'Gemfile'
8
8
  - 'voucher.gemspec'
9
+ - 'lib/voucher/metrics.rb'
9
10
  - 'Rakefile'
10
11
  TargetRubyVersion: 2.4
11
12
 
data/CHANGELOG.md CHANGED
@@ -4,6 +4,11 @@ All notable changes to this project will be documented in this file.
4
4
  The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
5
5
  and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
6
6
 
7
+ ## [0.3.0] - 2019-04-11
8
+ ### Added:
9
+ - advertisement_id on Segment
10
+ - update validation process
11
+
7
12
  ## [0.2.1] - 2018-10-05
8
13
  ### Fixed:
9
14
  - Gem version
data/Gemfile.lock CHANGED
@@ -1,10 +1,11 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- voucher (0.2.1)
4
+ voucher (0.3.0)
5
5
  activesupport (~> 5.2)
6
6
  ethereum.rb (~> 2.2)
7
7
  hashtastic
8
+ mixlib-config
8
9
  murky_waters
9
10
  thor
10
11
  virtus
@@ -12,7 +13,7 @@ PATH
12
13
  GEM
13
14
  remote: https://rubygems.org/
14
15
  specs:
15
- activesupport (5.2.1)
16
+ activesupport (5.2.3)
16
17
  concurrent-ruby (~> 1.0, >= 1.0.2)
17
18
  i18n (>= 0.7, < 2)
18
19
  minitest (~> 5.1)
@@ -25,7 +26,7 @@ GEM
25
26
  coderay (1.1.2)
26
27
  coercible (1.0.0)
27
28
  descendants_tracker (~> 0.0.1)
28
- concurrent-ruby (1.0.5)
29
+ concurrent-ruby (1.1.5)
29
30
  descendants_tracker (0.0.4)
30
31
  thread_safe (~> 0.3, >= 0.3.1)
31
32
  diff-lcs (1.3)
@@ -37,12 +38,14 @@ GEM
37
38
  hashtastic (0.1.2)
38
39
  activesupport (~> 5.0)
39
40
  digest-sha3 (~> 1.1)
40
- i18n (1.1.0)
41
+ i18n (1.6.0)
41
42
  concurrent-ruby (~> 1.0)
42
43
  ice_nine (0.11.2)
43
44
  jaro_winkler (1.5.1)
44
45
  method_source (0.9.0)
45
46
  minitest (5.11.3)
47
+ mixlib-config (2.2.18)
48
+ tomlrb
46
49
  murky_waters (0.1.4)
47
50
  parallel (1.12.1)
48
51
  parser (2.5.1.2)
@@ -75,8 +78,9 @@ GEM
75
78
  ruby-progressbar (~> 1.7)
76
79
  unicode-display_width (~> 1.0, >= 1.0.1)
77
80
  ruby-progressbar (1.10.0)
78
- thor (0.20.0)
81
+ thor (0.20.3)
79
82
  thread_safe (0.3.6)
83
+ tomlrb (1.2.8)
80
84
  tzinfo (1.2.5)
81
85
  thread_safe (~> 0.1)
82
86
  unicode-display_width (1.4.0)
@@ -90,7 +94,7 @@ PLATFORMS
90
94
  ruby
91
95
 
92
96
  DEPENDENCIES
93
- bundler (~> 1.16)
97
+ bundler (~> 2.0)
94
98
  pry (~> 0.11.3)
95
99
  rake (~> 10.0)
96
100
  rspec (~> 3.0)
@@ -98,4 +102,4 @@ DEPENDENCIES
98
102
  voucher!
99
103
 
100
104
  BUNDLED WITH
101
- 1.16.3
105
+ 2.0.1
data/README.md CHANGED
@@ -39,7 +39,7 @@ Embedded in your application
39
39
  ```rb
40
40
  require 'voucher'
41
41
 
42
- Voucher.configure(host: 'http://your.node.url:8545')
42
+ Voucher.configure(host: 'http://localhost:8545')
43
43
  Voucher::Validator.call('segments.json')
44
44
 
45
45
  => true
@@ -60,6 +60,48 @@ After checking out the repo, run `bin/setup` to install dependencies. Then, run
60
60
 
61
61
  To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
62
62
 
63
+ ### Testing
64
+
65
+ #### Test from console
66
+
67
+ In order to test ruby code in interactive console:
68
+
69
+ ```
70
+ $ ./bin/console
71
+ irb(main):002:0> Voucher.configure(host: 'http://52.208.46.161:8549')
72
+ irb(main):002:0> Voucher::Validator.call('./spec/samples/segments.json')
73
+
74
+ ```
75
+
76
+ Notice: by default configuration pointing to your `localhost:8545`.
77
+ When you want to test with ropsten, you need
78
+
79
+ #### Test CLI
80
+
81
+ Just for this test change the version in `version.rb`.
82
+
83
+ ```
84
+ gem uninstall voucher
85
+ gem build voucher.gemspec
86
+ gem install --local voucher-[your-version].gem
87
+
88
+ # check the instalation
89
+ gem list
90
+
91
+ # run CLI test locally
92
+ voucher validate ./spec/samples/segments.json -h http://52.208.46.161:8549
93
+
94
+
95
+ ```
96
+
97
+ #### Run tests
98
+
99
+ ```
100
+ bundle exec rubocop
101
+ bundle exec rspec [file: optional]
102
+
103
+ ```
104
+
63
105
  ## Contributing
64
106
 
65
107
  Bug reports and pull requests are welcome on GitHub at https://github.com/luciditytech/voucher.
data/lib/voucher.rb CHANGED
@@ -9,10 +9,11 @@ require 'pry'
9
9
 
10
10
  require 'voucher/version'
11
11
  require 'voucher/config'
12
+ require 'voucher/metrics'
12
13
  require 'voucher/errors'
13
14
  require 'voucher/model/election'
14
15
  require 'voucher/model/segment'
15
- require 'voucher/election_contract'
16
+ require 'voucher/chain_contract'
16
17
  require 'voucher/segments_reader'
17
18
  require 'voucher/segments_builder'
18
19
  require 'voucher/segments_parser'
@@ -24,11 +25,11 @@ module Voucher
24
25
  end
25
26
 
26
27
  def self.config
27
- @config ||= Config.new
28
+ @config ||= Config
28
29
  end
29
30
 
30
31
  def self.reset
31
- @config = Config.new
32
+ @config = Config
32
33
  end
33
34
 
34
35
  def self.configure(options = {})
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Voucher
4
+ class ChainContract
5
+ attr_reader :contract
6
+
7
+ def initialize(options = {})
8
+ @contract = Ethereum::Contract.create(
9
+ name: options[:name] || 'ChainContractClient',
10
+ address: options[:address],
11
+ abi: options[:abi],
12
+ client: ethereum
13
+ )
14
+
15
+ @roots = {}
16
+ @formatter = Ethereum::Formatter.new
17
+ end
18
+
19
+ def ethereum
20
+ @client ||= Ethereum::HttpClient.new(Config.ethereum_url)
21
+ @client.default_account = Config.default_account
22
+
23
+ @client
24
+ end
25
+
26
+ def winning_hash(block_height, shard)
27
+ @roots[shard] ||= find_root(block_height, shard)
28
+ end
29
+
30
+ private
31
+
32
+ def find_root(block_height, shard)
33
+ root = contract.call.get_block_root(block_height, shard)
34
+
35
+ raise RootHashNotFound.new(block_height, shard) if root.blank?
36
+
37
+ eth_format(root)
38
+ end
39
+
40
+ def eth_format(value)
41
+ hex = @formatter.from_ascii(value)
42
+
43
+ "0x#{hex}"
44
+ end
45
+ end
46
+ end
data/lib/voucher/cli.rb CHANGED
@@ -14,7 +14,7 @@ module Voucher
14
14
  method_option :host, type: :string, aliases: '-h'
15
15
  def validate(segments_file)
16
16
  configure
17
- Voucher::Validator.call(segments_file)
17
+ puts 'Validation SUCCESSFUL!' if Voucher::Validator.call(segments_file)
18
18
  end
19
19
 
20
20
  private
@@ -1,14 +1,22 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module Voucher
4
- class Config
5
- ABI_FILE_NAME = File.join(File.dirname(__FILE__), 'config', 'json', 'election.json')
3
+ require 'mixlib/config'
6
4
 
7
- attr_accessor :ethereum_url, :election_abi
5
+ module Config
6
+ extend Mixlib::Config
7
+ config_strict_mode true
8
8
 
9
- def initialize
10
- @ethereum_url = ENV['ETHEREUM_URL'] || 'http://172.31.80.135:8545'
11
- @election_abi = File.read(ABI_FILE_NAME)
12
- end
13
- end
9
+ ABI_FILE_NAME = File.join(File.dirname(__FILE__), 'config', 'json', 'chain.json')
10
+
11
+ default :ethereum_url, ENV['ETHEREUM_URL'] || 'http://52.208.46.161:8549'
12
+ default :default_account, ENV['DEFAULT_ACCOUNT'] || '0x1B380DC721280DdBD4E0Cbf342Bf2c23A5FEC96A'
13
+ default :chain_abi, File.read(ABI_FILE_NAME)
14
+
15
+ default :metrics, []
16
+ default :aggregated_metric_types, []
17
+ default :non_aggregated_metric_types, []
18
+ default :cost_metrics, []
19
+ default :compound_metrics, {}
20
+ default :compound_metric_types, []
21
+ default :metric_types, []
14
22
  end
@@ -0,0 +1,753 @@
1
+ [
2
+ {
3
+ "constant": true,
4
+ "inputs": [],
5
+ "name": "singleStorage",
6
+ "outputs": [
7
+ {
8
+ "name": "",
9
+ "type": "address"
10
+ }
11
+ ],
12
+ "payable": false,
13
+ "stateMutability": "view",
14
+ "type": "function"
15
+ },
16
+ {
17
+ "constant": false,
18
+ "inputs": [],
19
+ "name": "register",
20
+ "outputs": [
21
+ {
22
+ "name": "",
23
+ "type": "bool"
24
+ }
25
+ ],
26
+ "payable": false,
27
+ "stateMutability": "nonpayable",
28
+ "type": "function"
29
+ },
30
+ {
31
+ "constant": true,
32
+ "inputs": [],
33
+ "name": "isRegistered",
34
+ "outputs": [
35
+ {
36
+ "name": "",
37
+ "type": "bool"
38
+ }
39
+ ],
40
+ "payable": false,
41
+ "stateMutability": "view",
42
+ "type": "function"
43
+ },
44
+ {
45
+ "constant": false,
46
+ "inputs": [
47
+ {
48
+ "name": "_newInstance",
49
+ "type": "address"
50
+ }
51
+ ],
52
+ "name": "unregister",
53
+ "outputs": [],
54
+ "payable": false,
55
+ "stateMutability": "nonpayable",
56
+ "type": "function"
57
+ },
58
+ {
59
+ "constant": true,
60
+ "inputs": [],
61
+ "name": "getAllStorages",
62
+ "outputs": [
63
+ {
64
+ "name": "",
65
+ "type": "address[]"
66
+ }
67
+ ],
68
+ "payable": false,
69
+ "stateMutability": "view",
70
+ "type": "function"
71
+ },
72
+ {
73
+ "constant": false,
74
+ "inputs": [],
75
+ "name": "renounceOwnership",
76
+ "outputs": [],
77
+ "payable": false,
78
+ "stateMutability": "nonpayable",
79
+ "type": "function"
80
+ },
81
+ {
82
+ "constant": true,
83
+ "inputs": [],
84
+ "name": "owner",
85
+ "outputs": [
86
+ {
87
+ "name": "",
88
+ "type": "address"
89
+ }
90
+ ],
91
+ "payable": false,
92
+ "stateMutability": "view",
93
+ "type": "function"
94
+ },
95
+ {
96
+ "constant": true,
97
+ "inputs": [],
98
+ "name": "isOwner",
99
+ "outputs": [
100
+ {
101
+ "name": "",
102
+ "type": "bool"
103
+ }
104
+ ],
105
+ "payable": false,
106
+ "stateMutability": "view",
107
+ "type": "function"
108
+ },
109
+ {
110
+ "constant": true,
111
+ "inputs": [],
112
+ "name": "contractRegistry",
113
+ "outputs": [
114
+ {
115
+ "name": "",
116
+ "type": "address"
117
+ }
118
+ ],
119
+ "payable": false,
120
+ "stateMutability": "view",
121
+ "type": "function"
122
+ },
123
+ {
124
+ "constant": false,
125
+ "inputs": [
126
+ {
127
+ "name": "newOwner",
128
+ "type": "address"
129
+ }
130
+ ],
131
+ "name": "transferOwnership",
132
+ "outputs": [],
133
+ "payable": false,
134
+ "stateMutability": "nonpayable",
135
+ "type": "function"
136
+ },
137
+ {
138
+ "inputs": [
139
+ {
140
+ "name": "_contractRegistry",
141
+ "type": "address"
142
+ },
143
+ {
144
+ "name": "_chainStorage",
145
+ "type": "address"
146
+ }
147
+ ],
148
+ "payable": false,
149
+ "stateMutability": "nonpayable",
150
+ "type": "constructor"
151
+ },
152
+ {
153
+ "anonymous": false,
154
+ "inputs": [
155
+ {
156
+ "indexed": true,
157
+ "name": "previousOwner",
158
+ "type": "address"
159
+ },
160
+ {
161
+ "indexed": true,
162
+ "name": "newOwner",
163
+ "type": "address"
164
+ }
165
+ ],
166
+ "name": "OwnershipTransferred",
167
+ "type": "event"
168
+ },
169
+ {
170
+ "anonymous": false,
171
+ "inputs": [
172
+ {
173
+ "indexed": true,
174
+ "name": "executor",
175
+ "type": "address"
176
+ },
177
+ {
178
+ "indexed": true,
179
+ "name": "newStorageOwner",
180
+ "type": "address"
181
+ }
182
+ ],
183
+ "name": "LogDetachFromStorage",
184
+ "type": "event"
185
+ },
186
+ {
187
+ "anonymous": false,
188
+ "inputs": [
189
+ {
190
+ "indexed": true,
191
+ "name": "storageAddress",
192
+ "type": "address"
193
+ }
194
+ ],
195
+ "name": "LogNewStorage",
196
+ "type": "event"
197
+ },
198
+ {
199
+ "anonymous": false,
200
+ "inputs": [
201
+ {
202
+ "indexed": true,
203
+ "name": "executor",
204
+ "type": "address"
205
+ },
206
+ {
207
+ "indexed": true,
208
+ "name": "registered",
209
+ "type": "address"
210
+ },
211
+ {
212
+ "indexed": false,
213
+ "name": "isRegistered",
214
+ "type": "bool"
215
+ }
216
+ ],
217
+ "name": "LogRegister",
218
+ "type": "event"
219
+ },
220
+ {
221
+ "anonymous": false,
222
+ "inputs": [
223
+ {
224
+ "indexed": false,
225
+ "name": "balance",
226
+ "type": "uint256"
227
+ },
228
+ {
229
+ "indexed": true,
230
+ "name": "balanceReceiver",
231
+ "type": "address"
232
+ }
233
+ ],
234
+ "name": "LogSuicide",
235
+ "type": "event"
236
+ },
237
+ {
238
+ "anonymous": false,
239
+ "inputs": [
240
+ {
241
+ "indexed": true,
242
+ "name": "sender",
243
+ "type": "address"
244
+ },
245
+ {
246
+ "indexed": false,
247
+ "name": "blockHeight",
248
+ "type": "uint256"
249
+ },
250
+ {
251
+ "indexed": false,
252
+ "name": "blindedProposal",
253
+ "type": "bytes32"
254
+ },
255
+ {
256
+ "indexed": false,
257
+ "name": "shard",
258
+ "type": "uint256"
259
+ },
260
+ {
261
+ "indexed": false,
262
+ "name": "balance",
263
+ "type": "uint256"
264
+ }
265
+ ],
266
+ "name": "LogPropose",
267
+ "type": "event"
268
+ },
269
+ {
270
+ "anonymous": false,
271
+ "inputs": [
272
+ {
273
+ "indexed": true,
274
+ "name": "sender",
275
+ "type": "address"
276
+ },
277
+ {
278
+ "indexed": false,
279
+ "name": "blockHeight",
280
+ "type": "uint256"
281
+ },
282
+ {
283
+ "indexed": false,
284
+ "name": "proposal",
285
+ "type": "bytes32"
286
+ }
287
+ ],
288
+ "name": "LogReveal",
289
+ "type": "event"
290
+ },
291
+ {
292
+ "anonymous": false,
293
+ "inputs": [
294
+ {
295
+ "indexed": true,
296
+ "name": "sender",
297
+ "type": "address"
298
+ },
299
+ {
300
+ "indexed": false,
301
+ "name": "blockHeight",
302
+ "type": "uint256"
303
+ },
304
+ {
305
+ "indexed": false,
306
+ "name": "shard",
307
+ "type": "uint256"
308
+ },
309
+ {
310
+ "indexed": false,
311
+ "name": "proposal",
312
+ "type": "bytes32"
313
+ },
314
+ {
315
+ "indexed": false,
316
+ "name": "counts",
317
+ "type": "uint256"
318
+ },
319
+ {
320
+ "indexed": false,
321
+ "name": "balance",
322
+ "type": "uint256"
323
+ },
324
+ {
325
+ "indexed": false,
326
+ "name": "newWinner",
327
+ "type": "bool"
328
+ },
329
+ {
330
+ "indexed": false,
331
+ "name": "totalTokenBalanceForShard",
332
+ "type": "uint256"
333
+ }
334
+ ],
335
+ "name": "LogUpdateCounters",
336
+ "type": "event"
337
+ },
338
+ {
339
+ "constant": true,
340
+ "inputs": [],
341
+ "name": "contractName",
342
+ "outputs": [
343
+ {
344
+ "name": "",
345
+ "type": "bytes32"
346
+ }
347
+ ],
348
+ "payable": false,
349
+ "stateMutability": "view",
350
+ "type": "function"
351
+ },
352
+ {
353
+ "constant": false,
354
+ "inputs": [
355
+ {
356
+ "name": "_blindedProposal",
357
+ "type": "bytes32"
358
+ },
359
+ {
360
+ "name": "_blockHeight",
361
+ "type": "uint256"
362
+ }
363
+ ],
364
+ "name": "propose",
365
+ "outputs": [
366
+ {
367
+ "name": "",
368
+ "type": "bool"
369
+ }
370
+ ],
371
+ "payable": false,
372
+ "stateMutability": "nonpayable",
373
+ "type": "function"
374
+ },
375
+ {
376
+ "constant": false,
377
+ "inputs": [
378
+ {
379
+ "name": "_proposal",
380
+ "type": "bytes32"
381
+ },
382
+ {
383
+ "name": "_secret",
384
+ "type": "bytes32"
385
+ }
386
+ ],
387
+ "name": "reveal",
388
+ "outputs": [
389
+ {
390
+ "name": "",
391
+ "type": "bool"
392
+ }
393
+ ],
394
+ "payable": false,
395
+ "stateMutability": "nonpayable",
396
+ "type": "function"
397
+ },
398
+ {
399
+ "constant": true,
400
+ "inputs": [],
401
+ "name": "getBlockHeight",
402
+ "outputs": [
403
+ {
404
+ "name": "",
405
+ "type": "uint256"
406
+ }
407
+ ],
408
+ "payable": false,
409
+ "stateMutability": "view",
410
+ "type": "function"
411
+ },
412
+ {
413
+ "constant": true,
414
+ "inputs": [
415
+ {
416
+ "name": "_proposal",
417
+ "type": "bytes32"
418
+ },
419
+ {
420
+ "name": "_secret",
421
+ "type": "bytes32"
422
+ }
423
+ ],
424
+ "name": "createProof",
425
+ "outputs": [
426
+ {
427
+ "name": "",
428
+ "type": "bytes32"
429
+ }
430
+ ],
431
+ "payable": false,
432
+ "stateMutability": "pure",
433
+ "type": "function"
434
+ },
435
+ {
436
+ "constant": true,
437
+ "inputs": [
438
+ {
439
+ "name": "_blockHeight",
440
+ "type": "uint256"
441
+ },
442
+ {
443
+ "name": "_shard",
444
+ "type": "uint256"
445
+ }
446
+ ],
447
+ "name": "getBlockRoot",
448
+ "outputs": [
449
+ {
450
+ "name": "",
451
+ "type": "bytes32"
452
+ }
453
+ ],
454
+ "payable": false,
455
+ "stateMutability": "view",
456
+ "type": "function"
457
+ },
458
+ {
459
+ "constant": true,
460
+ "inputs": [
461
+ {
462
+ "name": "_blockHeight",
463
+ "type": "uint256"
464
+ },
465
+ {
466
+ "name": "_voter",
467
+ "type": "address"
468
+ }
469
+ ],
470
+ "name": "getBlockVoter",
471
+ "outputs": [
472
+ {
473
+ "name": "blindedProposal",
474
+ "type": "bytes32"
475
+ },
476
+ {
477
+ "name": "shard",
478
+ "type": "uint256"
479
+ },
480
+ {
481
+ "name": "proposal",
482
+ "type": "bytes32"
483
+ },
484
+ {
485
+ "name": "balance",
486
+ "type": "uint256"
487
+ }
488
+ ],
489
+ "payable": false,
490
+ "stateMutability": "view",
491
+ "type": "function"
492
+ },
493
+ {
494
+ "constant": true,
495
+ "inputs": [
496
+ {
497
+ "name": "_blockHeight",
498
+ "type": "uint256"
499
+ },
500
+ {
501
+ "name": "_shard",
502
+ "type": "uint256"
503
+ }
504
+ ],
505
+ "name": "getBlockMaxVotes",
506
+ "outputs": [
507
+ {
508
+ "name": "",
509
+ "type": "uint256"
510
+ }
511
+ ],
512
+ "payable": false,
513
+ "stateMutability": "view",
514
+ "type": "function"
515
+ },
516
+ {
517
+ "constant": true,
518
+ "inputs": [
519
+ {
520
+ "name": "_blockHeight",
521
+ "type": "uint256"
522
+ },
523
+ {
524
+ "name": "_shard",
525
+ "type": "uint256"
526
+ },
527
+ {
528
+ "name": "_proposal",
529
+ "type": "bytes32"
530
+ }
531
+ ],
532
+ "name": "getBlockCount",
533
+ "outputs": [
534
+ {
535
+ "name": "",
536
+ "type": "uint256"
537
+ }
538
+ ],
539
+ "payable": false,
540
+ "stateMutability": "view",
541
+ "type": "function"
542
+ },
543
+ {
544
+ "constant": true,
545
+ "inputs": [
546
+ {
547
+ "name": "_blockHeight",
548
+ "type": "uint256"
549
+ },
550
+ {
551
+ "name": "_i",
552
+ "type": "uint256"
553
+ }
554
+ ],
555
+ "name": "getBlockAddress",
556
+ "outputs": [
557
+ {
558
+ "name": "",
559
+ "type": "address"
560
+ }
561
+ ],
562
+ "payable": false,
563
+ "stateMutability": "view",
564
+ "type": "function"
565
+ },
566
+ {
567
+ "constant": true,
568
+ "inputs": [
569
+ {
570
+ "name": "_blockHeight",
571
+ "type": "uint256"
572
+ }
573
+ ],
574
+ "name": "getBlockAddressCount",
575
+ "outputs": [
576
+ {
577
+ "name": "",
578
+ "type": "uint256"
579
+ }
580
+ ],
581
+ "payable": false,
582
+ "stateMutability": "view",
583
+ "type": "function"
584
+ },
585
+ {
586
+ "constant": true,
587
+ "inputs": [
588
+ {
589
+ "name": "_blockHeight",
590
+ "type": "uint256"
591
+ },
592
+ {
593
+ "name": "_shard",
594
+ "type": "uint256"
595
+ }
596
+ ],
597
+ "name": "getStakeTokenBalanceFor",
598
+ "outputs": [
599
+ {
600
+ "name": "",
601
+ "type": "uint256"
602
+ }
603
+ ],
604
+ "payable": false,
605
+ "stateMutability": "view",
606
+ "type": "function"
607
+ },
608
+ {
609
+ "constant": true,
610
+ "inputs": [
611
+ {
612
+ "name": "_blockHeight",
613
+ "type": "uint256"
614
+ },
615
+ {
616
+ "name": "_shard",
617
+ "type": "uint256"
618
+ }
619
+ ],
620
+ "name": "isElectionValid",
621
+ "outputs": [
622
+ {
623
+ "name": "",
624
+ "type": "bool"
625
+ }
626
+ ],
627
+ "payable": false,
628
+ "stateMutability": "view",
629
+ "type": "function"
630
+ },
631
+ {
632
+ "constant": false,
633
+ "inputs": [
634
+ {
635
+ "name": "_minimumStakingTokenPercentage",
636
+ "type": "uint8"
637
+ }
638
+ ],
639
+ "name": "updateMinimumStakingTokenPercentage",
640
+ "outputs": [
641
+ {
642
+ "name": "",
643
+ "type": "bool"
644
+ }
645
+ ],
646
+ "payable": false,
647
+ "stateMutability": "nonpayable",
648
+ "type": "function"
649
+ },
650
+ {
651
+ "constant": true,
652
+ "inputs": [],
653
+ "name": "updateMinimumStakingTokenPercentageEnabled",
654
+ "outputs": [
655
+ {
656
+ "name": "",
657
+ "type": "bool"
658
+ }
659
+ ],
660
+ "payable": false,
661
+ "stateMutability": "view",
662
+ "type": "function"
663
+ },
664
+ {
665
+ "constant": true,
666
+ "inputs": [],
667
+ "name": "minimumStakingTokenPercentage",
668
+ "outputs": [
669
+ {
670
+ "name": "",
671
+ "type": "uint8"
672
+ }
673
+ ],
674
+ "payable": false,
675
+ "stateMutability": "view",
676
+ "type": "function"
677
+ },
678
+ {
679
+ "constant": true,
680
+ "inputs": [],
681
+ "name": "blocksPerPhase",
682
+ "outputs": [
683
+ {
684
+ "name": "",
685
+ "type": "uint8"
686
+ }
687
+ ],
688
+ "payable": false,
689
+ "stateMutability": "view",
690
+ "type": "function"
691
+ },
692
+ {
693
+ "constant": true,
694
+ "inputs": [],
695
+ "name": "getCurrentElectionCycleBlock",
696
+ "outputs": [
697
+ {
698
+ "name": "",
699
+ "type": "uint256"
700
+ }
701
+ ],
702
+ "payable": false,
703
+ "stateMutability": "view",
704
+ "type": "function"
705
+ },
706
+ {
707
+ "constant": true,
708
+ "inputs": [],
709
+ "name": "getFirstCycleBlock",
710
+ "outputs": [
711
+ {
712
+ "name": "",
713
+ "type": "uint256"
714
+ }
715
+ ],
716
+ "payable": false,
717
+ "stateMutability": "view",
718
+ "type": "function"
719
+ },
720
+ {
721
+ "constant": true,
722
+ "inputs": [],
723
+ "name": "isProposePhase",
724
+ "outputs": [
725
+ {
726
+ "name": "",
727
+ "type": "bool"
728
+ }
729
+ ],
730
+ "payable": false,
731
+ "stateMutability": "view",
732
+ "type": "function"
733
+ },
734
+ {
735
+ "constant": true,
736
+ "inputs": [
737
+ {
738
+ "name": "_shard",
739
+ "type": "uint256"
740
+ }
741
+ ],
742
+ "name": "initialBlockHeights",
743
+ "outputs": [
744
+ {
745
+ "name": "",
746
+ "type": "uint256"
747
+ }
748
+ ],
749
+ "payable": false,
750
+ "stateMutability": "view",
751
+ "type": "function"
752
+ }
753
+ ]