scale.rb 0.2.12 → 0.2.13

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: fcfbe30b0f6a51793d9e977e362c34b213e04ee040f7d6961cde355b1e6cb8d0
4
- data.tar.gz: 310f9fcab5186b0366e4a12da5790f77bfe81aa148684d1946d3a7f07ef57c60
3
+ metadata.gz: f37a51e33372d5c51aa45cf538fba59a4094becf5c50c40df6a5e2700f0c89a6
4
+ data.tar.gz: 5ff9199c46a0f0a51096b3a1acda708664d71ddb755b93e6c2096534ade5c6a4
5
5
  SHA512:
6
- metadata.gz: 14545046f43e403d84a492905b9aa9928024b0310aa2ae8dca927dd98e9d0b4415dcffa5a3364e85af2e13ef1ef4808fdb704462c8687fcb30336fa631a2ca9f
7
- data.tar.gz: 23224a2ff2578fb4c49a12bc1317ae645fb5a2237f4f8f9f312585a53b849abd78ca455c86c68f9f6c2f22c3e6dd837638e6644245c66e25674b701e39de08e5
6
+ metadata.gz: 2fe1f22eb8928b9986d6a8d2223f023f568c8afbb9e8dc3eea36f45705f540f9324e478b05cb916409303d75c9831622643adaade346134cd22665361989624c
7
+ data.tar.gz: 2cdbadcbf36cc61e04964b76581c41ccf76ca44aa72cf9241b18e73be115f2b183ef863ec32794fd71039fa264404bb56e5eb90d57c5fc243a8caf5f0df98d0f
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- scale.rb (0.2.12)
4
+ scale.rb (0.2.13)
5
5
  activesupport (>= 4.0.0)
6
6
  json (~> 2.3.0)
7
7
  substrate_common.rb (~> 0.1.9)
@@ -50,7 +50,7 @@ GEM
50
50
  xxhash
51
51
  thor (0.19.4)
52
52
  thread_safe (0.3.6)
53
- tzinfo (1.2.7)
53
+ tzinfo (1.2.8)
54
54
  thread_safe (~> 0.1)
55
55
  xxhash (0.4.0)
56
56
  zeitwerk (2.4.1)
@@ -26,21 +26,19 @@ module Scale
26
26
  call_module_index = 0
27
27
  event_module_index = 0
28
28
 
29
- modules.map(&:value).each do |m|
29
+ modules.map(&:value).each_with_index do |m, module_index|
30
30
  if m[:calls]
31
31
  m[:calls].each_with_index do |call, index|
32
- call[:lookup] = "%02x%02x" % [call_module_index, index]
32
+ call[:lookup] = "%02x%02x" % [module_index, index]
33
33
  result.call_index[call[:lookup]] = [m, call]
34
34
  end
35
- call_module_index += 1
36
35
  end
37
36
 
38
37
  if m[:events]
39
38
  m[:events].each_with_index do |event, index|
40
- event[:lookup] = "%02x%02x" % [event_module_index, index]
39
+ event[:lookup] = "%02x%02x" % [module_index, index]
41
40
  result.event_index[event[:lookup]] = [m, event]
42
41
  end
43
- event_module_index += 1
44
42
  end
45
43
  end
46
44
 
@@ -9,6 +9,7 @@ require "singleton"
9
9
  require "scale/base"
10
10
  require "scale/types"
11
11
  require "scale/block"
12
+ require "scale/trie"
12
13
 
13
14
  require "metadata/metadata"
14
15
  require "metadata/metadata_v0"
@@ -0,0 +1,121 @@
1
+ module Scale
2
+ module Types
3
+
4
+ class TrieNode
5
+ include SingleValue
6
+ EMPTY = 0
7
+ NIBBLE_PER_BYTE = 2
8
+ BITMAP_LENGTH = 2
9
+ NIBBLE_LENGTH = 16
10
+ NIBBLE_SIZE_BOUND = 65535
11
+
12
+ def self.decode(scale_bytes)
13
+ first = scale_bytes.get_next_bytes(1).first
14
+ if first == EMPTY
15
+ TrieNode.new({})
16
+ else
17
+ v = first & (0b11 << 6)
18
+ decode_size = -> {
19
+ result = first & 255 >> 2
20
+ return result if result < 63
21
+ result -= 1
22
+ while result <= NIBBLE_SIZE_BOUND
23
+ n = scale_bytes.get_next_bytes(1).first
24
+ return (result + n + 1) if n < 255
25
+ result += 255
26
+ end
27
+ return NIBBLE_SIZE_BOUND
28
+ }
29
+
30
+ if v == 0b01 << 6 # leaf
31
+ nibble_count = decode_size.call
32
+ # if nibble_count is odd, the half of first byte of partial is 0
33
+ padding = (nibble_count % NIBBLE_PER_BYTE) != 0
34
+ first_byte_of_partial = scale_bytes.bytes[scale_bytes.offset]
35
+ if padding && (first_byte_of_partial & 0xf0) != 0
36
+ raise "bad format"
37
+ end
38
+
39
+ ### partial decoding
40
+ partial_bytes = scale_bytes.get_next_bytes((nibble_count + (NIBBLE_PER_BYTE - 1)) / NIBBLE_PER_BYTE)
41
+
42
+ ### value
43
+ count = Compact.decode(scale_bytes).value
44
+ value_bytes = scale_bytes.get_next_bytes(count)
45
+
46
+ return TrieNode.new({
47
+ node_type: "leaf",
48
+ partial: {
49
+ hex: partial_bytes.bytes_to_hex,
50
+ padding: padding
51
+ },
52
+ value: value_bytes.bytes_to_hex
53
+ })
54
+ elsif v == 0b10 << 6 || v == 0b11 << 6 # branch without mask || branch with mask
55
+ nibble_count = decode_size.call
56
+
57
+ ### check that the padding is valid (if any)
58
+ # if nibble_count is odd, the half of first byte of partial is 0
59
+ padding = nibble_count % NIBBLE_PER_BYTE != 0
60
+ first_byte_of_partial = scale_bytes.bytes[scale_bytes.offset]
61
+ if padding && (first_byte_of_partial & 0xf0) != 0
62
+ raise "bad format"
63
+ end
64
+
65
+ ### partial decoding
66
+ partial_bytes = scale_bytes.get_next_bytes((nibble_count + (NIBBLE_PER_BYTE - 1)) / NIBBLE_PER_BYTE)
67
+
68
+ ### value decoding
69
+ if v == 0b11 << 6 # has value
70
+ count = Compact.decode(scale_bytes).value
71
+ value_bytes = scale_bytes.get_next_bytes(count)
72
+ end
73
+
74
+ ### children decoding
75
+ children = []
76
+ bitmap = U16.decode(scale_bytes).value
77
+ NIBBLE_LENGTH.times do |i|
78
+ has_child = (bitmap & (1 << i)) != 0
79
+ children[i] = nil
80
+ if has_child
81
+ count = Compact.decode(scale_bytes).value
82
+ if count == 32
83
+ hash = H256.decode(scale_bytes).value
84
+ children[i] = hash
85
+ else
86
+ inline = scale_bytes.get_next_bytes count
87
+ children[i] = inline.bytes_to_hex
88
+ end
89
+ end
90
+ end
91
+ # debug
92
+ # children.each_with_index do |child, i|
93
+ # if child.nil?
94
+ # puts "#{i}: NULL"
95
+ # else
96
+ # puts "#{i}: #{child}"
97
+ # end
98
+ # end
99
+
100
+ result = TrieNode.new({
101
+ node_type: "branch",
102
+ partial: {
103
+ hex: partial_bytes.bytes_to_hex,
104
+ padding: padding
105
+ },
106
+ children: children
107
+ })
108
+
109
+ result[:value] = value_bytes.bytes_to_hex if value_bytes
110
+
111
+ return result
112
+ else
113
+ puts "Not support"
114
+ end
115
+
116
+ end
117
+ end
118
+ end
119
+
120
+ end
121
+ end
@@ -1,3 +1,3 @@
1
1
  module Scale
2
- VERSION = "0.2.12".freeze
2
+ VERSION = "0.2.13".freeze
3
3
  end
@@ -0,0 +1,662 @@
1
+ {
2
+ "types": {
3
+ "Address": "AccountId",
4
+ "LookupSource": "AccountId",
5
+ "BalanceLock": {
6
+ "type": "struct",
7
+ "type_mapping": [
8
+ [
9
+ "id",
10
+ "LockIdentifier"
11
+ ],
12
+ [
13
+ "lock_for",
14
+ "LockFor"
15
+ ],
16
+ [
17
+ "lock_reasons",
18
+ "LockReasons"
19
+ ]
20
+ ]
21
+ },
22
+ "LockFor": {
23
+ "type": "enum",
24
+ "type_mapping": [
25
+ [
26
+ "Common",
27
+ "Common"
28
+ ],
29
+ [
30
+ "Staking",
31
+ "StakingLock"
32
+ ]
33
+ ]
34
+ },
35
+ "Common": {
36
+ "type": "struct",
37
+ "type_mapping": [
38
+ [
39
+ "amount",
40
+ "Balance"
41
+ ]
42
+ ]
43
+ },
44
+ "StakingLock": {
45
+ "type": "struct",
46
+ "type_mapping": [
47
+ [
48
+ "staking_amount",
49
+ "Balance"
50
+ ],
51
+ [
52
+ "unbondings",
53
+ "Vec<Unbonding>"
54
+ ]
55
+ ]
56
+ },
57
+ "LockReasons": {
58
+ "type": "enum",
59
+ "type_mapping": [
60
+ [
61
+ "Fee",
62
+ "Null"
63
+ ],
64
+ [
65
+ "Misc",
66
+ "Null"
67
+ ],
68
+ [
69
+ "All",
70
+ "Null"
71
+ ]
72
+ ]
73
+ },
74
+ "Unbonding": {
75
+ "type": "struct",
76
+ "type_mapping": [
77
+ [
78
+ "amount",
79
+ "Balance"
80
+ ],
81
+ [
82
+ "until",
83
+ "BlockNumber"
84
+ ]
85
+ ]
86
+ },
87
+ "AccountData": {
88
+ "type": "struct",
89
+ "type_mapping": [
90
+ [
91
+ "free",
92
+ "Balance"
93
+ ],
94
+ [
95
+ "reserved",
96
+ "Balance"
97
+ ],
98
+ [
99
+ "free_kton",
100
+ "Balance"
101
+ ],
102
+ [
103
+ "reserved_kton",
104
+ "Balance"
105
+ ]
106
+ ]
107
+ },
108
+ "RingBalance": "Balance",
109
+ "KtonBalance": "Balance",
110
+ "TsInMs": "u64",
111
+ "Power": "u32",
112
+ "DepositId": "U256",
113
+ "StakingBalanceT": {
114
+ "type": "enum",
115
+ "type_mapping": [
116
+ [
117
+ "RingBalance",
118
+ "Balance"
119
+ ],
120
+ [
121
+ "KtonBalance",
122
+ "Balance"
123
+ ]
124
+ ]
125
+ },
126
+ "StakingLedgerT": {
127
+ "type": "struct",
128
+ "type_mapping": [
129
+ [
130
+ "stash",
131
+ "AccountId"
132
+ ],
133
+ [
134
+ "active_ring",
135
+ "Compact<Balance>"
136
+ ],
137
+ [
138
+ "active_deposit_ring",
139
+ "Compact<Balance>"
140
+ ],
141
+ [
142
+ "active_kton",
143
+ "Compact<Balance>"
144
+ ],
145
+ [
146
+ "deposit_items",
147
+ "Vec<TimeDepositItem>"
148
+ ],
149
+ [
150
+ "ring_staking_lock",
151
+ "StakingLock"
152
+ ],
153
+ [
154
+ "kton_staking_lock",
155
+ "StakingLock"
156
+ ],
157
+ [
158
+ "claimed_rewards",
159
+ "Vec<EraIndex>"
160
+ ]
161
+ ]
162
+ },
163
+ "TimeDepositItem": {
164
+ "type": "struct",
165
+ "type_mapping": [
166
+ [
167
+ "value",
168
+ "Compact<Balance>"
169
+ ],
170
+ [
171
+ "start_time",
172
+ "Compact<TsInMs>"
173
+ ],
174
+ [
175
+ "expire_time",
176
+ "Compact<TsInMs>"
177
+ ]
178
+ ]
179
+ },
180
+ "ExposureT": {
181
+ "type": "struct",
182
+ "type_mapping": [
183
+ [
184
+ "own_ring_balance",
185
+ "Compact<Balance>"
186
+ ],
187
+ [
188
+ "own_kton_balance",
189
+ "Compact<Balance>"
190
+ ],
191
+ [
192
+ "own_power",
193
+ "Power"
194
+ ],
195
+ [
196
+ "total_power",
197
+ "Power"
198
+ ],
199
+ [
200
+ "others",
201
+ "Vec<IndividualExposure>"
202
+ ]
203
+ ]
204
+ },
205
+ "IndividualExposure": {
206
+ "type": "struct",
207
+ "type_mapping": [
208
+ [
209
+ "who",
210
+ "AccountId"
211
+ ],
212
+ [
213
+ "ring_balance",
214
+ "Compact<Balance>"
215
+ ],
216
+ [
217
+ "kton_balance",
218
+ "Compact<Balance>"
219
+ ],
220
+ [
221
+ "power",
222
+ "Power"
223
+ ]
224
+ ]
225
+ },
226
+ "ElectionResultT": {
227
+ "type": "struct",
228
+ "type_mapping": [
229
+ [
230
+ "elected_stashes",
231
+ "Vec<AccountId>"
232
+ ],
233
+ [
234
+ "exposures",
235
+ "Vec<(AccountId, ExposureT)>"
236
+ ],
237
+ [
238
+ "compute",
239
+ "ElectionCompute"
240
+ ]
241
+ ]
242
+ },
243
+ "RKT": {
244
+ "type": "struct",
245
+ "type_mapping": [
246
+ [
247
+ "r",
248
+ "Balance"
249
+ ],
250
+ [
251
+ "k",
252
+ "Balance"
253
+ ]
254
+ ]
255
+ },
256
+ "SpanRecord": {
257
+ "type": "struct",
258
+ "type_mapping": [
259
+ [
260
+ "slashed",
261
+ "RKT"
262
+ ],
263
+ [
264
+ "paid_out",
265
+ "RKT"
266
+ ]
267
+ ]
268
+ },
269
+ "UnappliedSlash": {
270
+ "type": "struct",
271
+ "type_mapping": [
272
+ [
273
+ "validator",
274
+ "AccountId"
275
+ ],
276
+ [
277
+ "own",
278
+ "RKT"
279
+ ],
280
+ [
281
+ "others",
282
+ "Vec<(AccountId, RKT)>"
283
+ ],
284
+ [
285
+ "reporters",
286
+ "Vec<AccountId>"
287
+ ],
288
+ [
289
+ "payout",
290
+ "RKT"
291
+ ]
292
+ ]
293
+ },
294
+ "TreasuryProposal": {
295
+ "type": "struct",
296
+ "type_mapping": [
297
+ [
298
+ "proposer",
299
+ "AccountId"
300
+ ],
301
+ [
302
+ "beneficiary",
303
+ "AccountId"
304
+ ],
305
+ [
306
+ "ring_value",
307
+ "Balance"
308
+ ],
309
+ [
310
+ "kton_value",
311
+ "Balance"
312
+ ],
313
+ [
314
+ "ring_bond",
315
+ "Balance"
316
+ ],
317
+ [
318
+ "kton_bond",
319
+ "Balance"
320
+ ]
321
+ ]
322
+ },
323
+ "MappedRing": "u128",
324
+ "EthereumTransactionIndex": "(H256, u64)",
325
+ "EthereumBlockNumber": "u64",
326
+ "EthereumHeader": {
327
+ "type": "struct",
328
+ "type_mapping": [
329
+ [
330
+ "parent_hash",
331
+ "H256"
332
+ ],
333
+ [
334
+ "timestamp",
335
+ "u64"
336
+ ],
337
+ [
338
+ "number",
339
+ "EthereumBlockNumber"
340
+ ],
341
+ [
342
+ "author",
343
+ "EthereumAddress"
344
+ ],
345
+ [
346
+ "transactions_root",
347
+ "H256"
348
+ ],
349
+ [
350
+ "uncles_hash",
351
+ "H256"
352
+ ],
353
+ [
354
+ "extra_data",
355
+ "Bytes"
356
+ ],
357
+ [
358
+ "state_root",
359
+ "H256"
360
+ ],
361
+ [
362
+ "receipts_root",
363
+ "H256"
364
+ ],
365
+ [
366
+ "log_bloom",
367
+ "Bloom"
368
+ ],
369
+ [
370
+ "gas_used",
371
+ "U256"
372
+ ],
373
+ [
374
+ "gas_limit",
375
+ "U256"
376
+ ],
377
+ [
378
+ "difficulty",
379
+ "U256"
380
+ ],
381
+ [
382
+ "seal",
383
+ "Vec<Bytes>"
384
+ ],
385
+ [
386
+ "hash",
387
+ "Option<H256>"
388
+ ]
389
+ ]
390
+ },
391
+ "EthereumAddress": "H160",
392
+ "Bloom": "[u8; 256]",
393
+ "H128": "[u8; 16]",
394
+ "EthashProof": {
395
+ "type": "struct",
396
+ "type_mapping": [
397
+ [
398
+ "dag_nodes",
399
+ "(H512, H512)"
400
+ ],
401
+ [
402
+ "proof",
403
+ "Vec<H128>"
404
+ ]
405
+ ]
406
+ },
407
+ "EthereumReceipt": {
408
+ "type": "struct",
409
+ "type_mapping": [
410
+ [
411
+ "gas_used",
412
+ "U256"
413
+ ],
414
+ [
415
+ "log_bloom",
416
+ "Bloom"
417
+ ],
418
+ [
419
+ "logs",
420
+ "Vec<LogEntry>"
421
+ ],
422
+ [
423
+ "outcome",
424
+ "TransactionOutcome"
425
+ ]
426
+ ]
427
+ },
428
+ "EthereumNetworkType": {
429
+ "type": "enum",
430
+ "type_mapping": [
431
+ [
432
+ "Mainnet",
433
+ "Null"
434
+ ],
435
+ [
436
+ "Ropsten",
437
+ "Null"
438
+ ]
439
+ ]
440
+ },
441
+ "RedeemFor": {
442
+ "type": "enum",
443
+ "type_mapping": [
444
+ [
445
+ "Token",
446
+ "Null"
447
+ ],
448
+ [
449
+ "Deposit",
450
+ "Null"
451
+ ]
452
+ ]
453
+ },
454
+ "EthereumReceiptProof": {
455
+ "type": "struct",
456
+ "type_mapping": [
457
+ [
458
+ "index",
459
+ "u64"
460
+ ],
461
+ [
462
+ "proof",
463
+ "Bytes"
464
+ ],
465
+ [
466
+ "header_hash",
467
+ "H256"
468
+ ]
469
+ ]
470
+ },
471
+ "EthereumReceiptProofThing": "(EthereumHeader, EthereumReceiptProof, MMRProof)",
472
+ "MMRProof": {
473
+ "type": "struct",
474
+ "type_mapping": [
475
+ [
476
+ "member_leaf_index",
477
+ "u64"
478
+ ],
479
+ [
480
+ "last_leaf_index",
481
+ "u64"
482
+ ],
483
+ [
484
+ "proof",
485
+ "Vec<H256>"
486
+ ]
487
+ ]
488
+ },
489
+ "EthereumRelayHeaderParcel": {
490
+ "type": "struct",
491
+ "type_mapping": [
492
+ [
493
+ "header",
494
+ "EthereumHeader"
495
+ ],
496
+ [
497
+ "mmr_root",
498
+ "H256"
499
+ ]
500
+ ]
501
+ },
502
+ "EthereumRelayProofs": {
503
+ "type": "struct",
504
+ "type_mapping": [
505
+ [
506
+ "ethash_proof",
507
+ "Vec<EthashProof>"
508
+ ],
509
+ [
510
+ "mmr_proof",
511
+ "Vec<H256>"
512
+ ]
513
+ ]
514
+ },
515
+ "OtherSignature": {
516
+ "type": "enum",
517
+ "type_mapping": [
518
+ [
519
+ "Eth",
520
+ "EcdsaSignature"
521
+ ],
522
+ [
523
+ "Tron",
524
+ "EcdsaSignature"
525
+ ]
526
+ ]
527
+ },
528
+ "EcdsaSignature": "[u8; 65]",
529
+ "OtherAddress": {
530
+ "type": "enum",
531
+ "type_mapping": [
532
+ [
533
+ "Eth",
534
+ "[u8; 20]"
535
+ ],
536
+ [
537
+ "Tron",
538
+ "[u8; 20]"
539
+ ]
540
+ ]
541
+ },
542
+ "AddressT": "[u8; 20]",
543
+ "MerkleMountainRangeRootLog": {
544
+ "type": "struct",
545
+ "type_mapping": [
546
+ [
547
+ "prefix",
548
+ "[u8; 4]"
549
+ ],
550
+ [
551
+ "mmr_root",
552
+ "Hash"
553
+ ]
554
+ ]
555
+ },
556
+ "RelayHeaderId": "EthereumBlockNumber",
557
+ "RelayHeaderParcel": "EthereumRelayHeaderParcel",
558
+ "RelayProofs": "EthereumRelayProofs",
559
+ "RelayAffirmationId": {
560
+ "type": "struct",
561
+ "type_mapping": [
562
+ [
563
+ "game_id",
564
+ "EthereumBlockNumber"
565
+ ],
566
+ [
567
+ "round",
568
+ "u32"
569
+ ],
570
+ [
571
+ "index",
572
+ "u32"
573
+ ]
574
+ ]
575
+ },
576
+ "RelayAffirmationT": {
577
+ "type": "struct",
578
+ "type_mapping": [
579
+ [
580
+ "relayer",
581
+ "AccountId"
582
+ ],
583
+ [
584
+ "relay_header_parcels",
585
+ "EthereumRelayHeaderParcel"
586
+ ],
587
+ [
588
+ "bond",
589
+ "Balance"
590
+ ],
591
+ [
592
+ "maybe_extended_relay_affirmation_id",
593
+ "Option<RelayAffirmationId>"
594
+ ],
595
+ [
596
+ "verified",
597
+ "bool"
598
+ ]
599
+ ]
600
+ },
601
+ "RelayVotingState": {
602
+ "type": "struct",
603
+ "type_mapping": [
604
+ [
605
+ "ayes",
606
+ "Vec<AccountId>"
607
+ ],
608
+ [
609
+ "nays",
610
+ "Vec<AccountId>"
611
+ ]
612
+ ]
613
+ },
614
+ "ProxyType": {
615
+ "type": "enum",
616
+ "type_mapping": [
617
+ [
618
+ "Any",
619
+ "Null"
620
+ ],
621
+ [
622
+ "NonTransfer",
623
+ "Null"
624
+ ],
625
+ [
626
+ "Governance",
627
+ "Null"
628
+ ],
629
+ [
630
+ "Staking",
631
+ "Null"
632
+ ],
633
+ [
634
+ "IdentityJudgement",
635
+ "Null"
636
+ ],
637
+ [
638
+ "EthereumBridge",
639
+ "Null"
640
+ ]
641
+ ]
642
+ },
643
+ "BalancesRuntimeDispatchInfo": {
644
+ "type": "struct",
645
+ "type_mapping": [
646
+ [
647
+ "usable_balance",
648
+ "Balance"
649
+ ]
650
+ ]
651
+ },
652
+ "StakingRuntimeDispatchInfo": {
653
+ "type": "struct",
654
+ "type_mapping": [
655
+ [
656
+ "power",
657
+ "Power"
658
+ ]
659
+ ]
660
+ }
661
+ }
662
+ }