scale.rb 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.DS_Store +0 -0
- data/.gitignore +1 -0
- data/Cargo.lock +44 -0
- data/Cargo.toml +11 -0
- data/Dockerfile +2 -1
- data/Gemfile +2 -2
- data/Gemfile.lock +24 -3
- data/Makefile +13 -0
- data/README.md +32 -28
- data/Rakefile +2 -2
- data/bin/console +3 -3
- data/exe/scale +80 -0
- data/lib/metadata/metadata.rb +45 -40
- data/lib/metadata/metadata_v0.rb +206 -0
- data/lib/metadata/metadata_v1.rb +120 -0
- data/lib/metadata/metadata_v10.rb +38 -9
- data/lib/metadata/metadata_v11.rb +51 -0
- data/lib/metadata/metadata_v2.rb +51 -0
- data/lib/metadata/metadata_v3.rb +38 -9
- data/lib/metadata/metadata_v4.rb +126 -0
- data/lib/metadata/metadata_v5.rb +126 -0
- data/lib/metadata/metadata_v6.rb +101 -0
- data/lib/metadata/metadata_v7.rb +47 -18
- data/lib/metadata/metadata_v8.rb +44 -15
- data/lib/metadata/metadata_v9.rb +38 -9
- data/lib/scale.rb +279 -69
- data/lib/scale/base.rb +104 -75
- data/lib/scale/block.rb +115 -0
- data/lib/scale/types.rb +318 -84
- data/lib/scale/version.rb +1 -1
- data/lib/type_registry/darwinia.json +112 -0
- data/lib/type_registry/default.json +842 -0
- data/lib/type_registry/edgeware.json +124 -0
- data/lib/type_registry/joystream.json +49 -0
- data/lib/type_registry/kulupu.json +6 -0
- data/lib/type_registry/kusama.json +186 -0
- data/lib/type_registry/plasm.json +89 -0
- data/lib/type_registry/robonomics.json +39 -0
- data/lib/type_registry/test.json +31 -0
- data/lib/type_registry/westend.json +18 -0
- data/scale.gemspec +18 -15
- data/src/lib.rs +74 -0
- metadata +92 -12
data/lib/scale/types.rb
CHANGED
@@ -17,33 +17,53 @@ module Scale
|
|
17
17
|
end
|
18
18
|
|
19
19
|
def encode
|
20
|
-
|
20
|
+
value === true ? "01" : "00"
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
24
24
|
class U8
|
25
25
|
include FixedWidthUInt
|
26
|
-
|
26
|
+
BYTE_LENGTH = 1
|
27
27
|
end
|
28
28
|
|
29
29
|
class U16
|
30
30
|
include FixedWidthUInt
|
31
|
-
|
31
|
+
BYTE_LENGTH = 2
|
32
32
|
end
|
33
33
|
|
34
34
|
class U32
|
35
35
|
include FixedWidthUInt
|
36
|
-
|
36
|
+
BYTE_LENGTH = 4
|
37
37
|
end
|
38
38
|
|
39
39
|
class U64
|
40
40
|
include FixedWidthUInt
|
41
|
-
|
41
|
+
BYTE_LENGTH = 8
|
42
42
|
end
|
43
43
|
|
44
44
|
class U128
|
45
45
|
include FixedWidthUInt
|
46
|
-
|
46
|
+
BYTE_LENGTH = 16
|
47
|
+
end
|
48
|
+
|
49
|
+
class I8
|
50
|
+
include FixedWidthInt
|
51
|
+
end
|
52
|
+
|
53
|
+
class I16
|
54
|
+
include FixedWidthInt
|
55
|
+
end
|
56
|
+
|
57
|
+
class I32
|
58
|
+
include FixedWidthInt
|
59
|
+
end
|
60
|
+
|
61
|
+
class I64
|
62
|
+
include FixedWidthInt
|
63
|
+
end
|
64
|
+
|
65
|
+
class I128
|
66
|
+
include FixedWidthInt
|
47
67
|
end
|
48
68
|
|
49
69
|
class Compact
|
@@ -51,34 +71,34 @@ module Scale
|
|
51
71
|
|
52
72
|
def self.decode(scale_bytes)
|
53
73
|
first_byte = scale_bytes.get_next_bytes(1)[0]
|
54
|
-
first_byte_in_bin = first_byte.to_s(2).rjust(8,
|
74
|
+
first_byte_in_bin = first_byte.to_s(2).rjust(8, "0")
|
55
75
|
|
56
76
|
mode = first_byte_in_bin[6..7]
|
57
|
-
value =
|
58
|
-
if mode ==
|
77
|
+
value =
|
78
|
+
if mode == "00"
|
59
79
|
first_byte >> 2
|
60
|
-
elsif mode ==
|
80
|
+
elsif mode == "01"
|
61
81
|
second_byte = scale_bytes.get_next_bytes(1)[0]
|
62
82
|
[first_byte, second_byte]
|
63
83
|
.reverse
|
64
|
-
.map { |b| b.to_s(16).rjust(2,
|
84
|
+
.map { |b| b.to_s(16).rjust(2, "0") }
|
65
85
|
.join
|
66
86
|
.to_i(16) >> 2
|
67
|
-
elsif mode ==
|
87
|
+
elsif mode == "10"
|
68
88
|
remaining_bytes = scale_bytes.get_next_bytes(3)
|
69
89
|
([first_byte] + remaining_bytes)
|
70
90
|
.reverse
|
71
|
-
.map { |b| b.to_s(16).rjust(2,
|
91
|
+
.map { |b| b.to_s(16).rjust(2, "0") }
|
72
92
|
.join
|
73
93
|
.to_i(16) >> 2
|
74
94
|
# or like this:
|
75
95
|
# ['02093d00'].pack('H*').unpack('l').first / 4
|
76
|
-
elsif mode ==
|
96
|
+
elsif mode == "11"
|
77
97
|
remaining_length = 4 + (first_byte >> 2)
|
78
98
|
remaining_bytes = scale_bytes.get_next_bytes(remaining_length)
|
79
99
|
remaining_bytes
|
80
100
|
.reverse
|
81
|
-
.map { |b| b.to_s(16).rjust(2,
|
101
|
+
.map { |b| b.to_s(16).rjust(2, "0") }
|
82
102
|
.join
|
83
103
|
.to_i(16)
|
84
104
|
end
|
@@ -87,22 +107,22 @@ module Scale
|
|
87
107
|
end
|
88
108
|
|
89
109
|
def encode
|
90
|
-
if
|
91
|
-
(value << 2).to_s(16).rjust(2,
|
92
|
-
elsif
|
93
|
-
((value << 2) + 1).to_s(16).rjust(4,
|
94
|
-
elsif
|
95
|
-
((value << 2) + 2).to_s(16).rjust(8,
|
96
|
-
elsif
|
97
|
-
value_in_hex =
|
110
|
+
if (value >= 0) && (value <= 63)
|
111
|
+
(value << 2).to_s(16).rjust(2, "0")
|
112
|
+
elsif (value > 63) && (value <= (2**14 - 1))
|
113
|
+
((value << 2) + 1).to_s(16).rjust(4, "0").scan(/.{2}/).reverse.join
|
114
|
+
elsif (value > (2**14 - 1)) && (value <= (2**30 - 1))
|
115
|
+
((value << 2) + 2).to_s(16).rjust(8, "0").scan(/.{2}/).reverse.join
|
116
|
+
elsif value > (2**30 - 1)
|
117
|
+
value_in_hex = value.to_s(16)
|
98
118
|
length = if value_in_hex.length % 2 == 1
|
99
119
|
value_in_hex.length + 1
|
100
120
|
else
|
101
121
|
value_in_hex.length
|
102
122
|
end
|
103
123
|
|
104
|
-
hex = value_in_hex.rjust(length,
|
105
|
-
(((length/2 - 4) << 2) + 3).to_s(16).rjust(2,
|
124
|
+
hex = value_in_hex.rjust(length, "0").scan(/.{2}/).reverse.join
|
125
|
+
(((length/2 - 4) << 2) + 3).to_s(16).rjust(2, "0") + hex
|
106
126
|
end
|
107
127
|
end
|
108
128
|
end
|
@@ -125,11 +145,11 @@ module Scale
|
|
125
145
|
end
|
126
146
|
|
127
147
|
def encode
|
128
|
-
if
|
129
|
-
length = Compact.new((
|
130
|
-
"#{length}#{
|
148
|
+
if value.start_with?("0x")
|
149
|
+
length = Compact.new((value.length - 2)/2).encode
|
150
|
+
"#{length}#{value[2..]}"
|
131
151
|
else
|
132
|
-
bytes =
|
152
|
+
bytes = value.unpack("C*")
|
133
153
|
hex_string = bytes.bytes_to_hex[2..]
|
134
154
|
length = Compact.new(bytes.length).encode
|
135
155
|
"#{length}#{hex_string}"
|
@@ -164,8 +184,8 @@ module Scale
|
|
164
184
|
end
|
165
185
|
|
166
186
|
def encode
|
167
|
-
raise "Format error"
|
168
|
-
|
187
|
+
raise "Format error" unless value.start_with?("0x") || value.length != 42
|
188
|
+
value[2..]
|
169
189
|
end
|
170
190
|
end
|
171
191
|
|
@@ -177,8 +197,8 @@ module Scale
|
|
177
197
|
end
|
178
198
|
|
179
199
|
def encode
|
180
|
-
raise "Format error"
|
181
|
-
|
200
|
+
raise "Format error" unless value.start_with?("0x") || value.length != 66
|
201
|
+
value[2..]
|
182
202
|
end
|
183
203
|
end
|
184
204
|
|
@@ -190,47 +210,56 @@ module Scale
|
|
190
210
|
end
|
191
211
|
|
192
212
|
def encode
|
193
|
-
raise "Format error"
|
194
|
-
|
213
|
+
raise "Format error" unless value.start_with?("0x") || value.length != 130
|
214
|
+
value[2..]
|
195
215
|
end
|
196
216
|
end
|
197
217
|
|
198
218
|
class Address
|
199
219
|
include SingleValue
|
220
|
+
attr_accessor :account_length, :account_index, :account_id, :account_idx
|
221
|
+
|
200
222
|
def self.decode(scale_bytes)
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
value = scale_bytes.get_next_bytes(4).bytes_to_hex
|
208
|
-
elsif prefix == 0xfe
|
209
|
-
value = scale_bytes.get_next_bytes(8).bytes_to_hex
|
223
|
+
account_length = scale_bytes.get_next_bytes(1).first
|
224
|
+
|
225
|
+
if account_length == 0xff # 255
|
226
|
+
account_id = scale_bytes.get_next_bytes(32).bytes_to_hex
|
227
|
+
account_length = account_length.to_s(16)
|
228
|
+
Address.new(account_id)
|
210
229
|
else
|
211
|
-
|
230
|
+
account_index =
|
231
|
+
if account_length == 0xfc
|
232
|
+
scale_bytes.get_next_bytes(2).bytes_to_hex
|
233
|
+
elsif account_length == 0xfd
|
234
|
+
scale_bytes.get_next_bytes(4).bytes_to_hex
|
235
|
+
elsif account_length == 0xfe
|
236
|
+
scale_bytes.get_next_bytes(8).bytes_to_hex
|
237
|
+
else
|
238
|
+
[account_length].bytes_to_hex
|
239
|
+
end
|
240
|
+
# account_idx =
|
241
|
+
account_length = account_length.to_s(16)
|
242
|
+
Address.new(account_index)
|
212
243
|
end
|
213
|
-
|
214
|
-
Address.new(value)
|
215
244
|
end
|
216
245
|
|
217
246
|
def encode(ss58=false, addr_type=42)
|
218
|
-
if
|
247
|
+
if value.start_with?("0x")
|
219
248
|
if ss58 === true
|
220
|
-
::Address.encode(
|
249
|
+
::Address.encode(value, addr_type)
|
221
250
|
else
|
222
|
-
prefix = if
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
"#{prefix}#{
|
251
|
+
prefix = if value.length == 66
|
252
|
+
"ff"
|
253
|
+
elsif value.length == 6
|
254
|
+
"fc"
|
255
|
+
elsif value.length == 10
|
256
|
+
"fd"
|
257
|
+
elsif value.length == 18
|
258
|
+
"fe"
|
259
|
+
else
|
260
|
+
""
|
261
|
+
end
|
262
|
+
"#{prefix}#{value[2..]}"
|
234
263
|
end
|
235
264
|
else
|
236
265
|
raise "Format error"
|
@@ -238,6 +267,8 @@ module Scale
|
|
238
267
|
end
|
239
268
|
end
|
240
269
|
|
270
|
+
class RawAddress < Address; end
|
271
|
+
|
241
272
|
class AccountId < H256; end
|
242
273
|
|
243
274
|
class Balance < U128; end
|
@@ -269,7 +300,7 @@ module Scale
|
|
269
300
|
def self.decode(scale_bytes)
|
270
301
|
value = Compact.decode(scale_bytes).value
|
271
302
|
if value > 10000000000
|
272
|
-
value
|
303
|
+
value /= 1000
|
273
304
|
end
|
274
305
|
|
275
306
|
CompactMoment.new Time.at(seconds_since_epoch_integer).to_datetime
|
@@ -280,26 +311,26 @@ module Scale
|
|
280
311
|
include Struct
|
281
312
|
items(
|
282
313
|
proposal: "Hex",
|
283
|
-
|
314
|
+
registred_by: "AccountId",
|
284
315
|
deposit: "BalanceOf",
|
285
316
|
blockNumber: "BlockNumber"
|
286
317
|
)
|
287
318
|
end
|
288
319
|
|
289
320
|
class RewardDestination
|
290
|
-
include Enum
|
321
|
+
include Enum
|
291
322
|
values "Staked", "Stash", "Controller"
|
292
323
|
end
|
293
324
|
|
294
325
|
class WithdrawReasons
|
295
326
|
include Set
|
296
|
-
|
327
|
+
items(
|
297
328
|
{
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
329
|
+
TransactionPayment: 1,
|
330
|
+
Transfer: 2,
|
331
|
+
Reserve: 4,
|
332
|
+
Fee: 8,
|
333
|
+
Tip: 16
|
303
334
|
}, 1
|
304
335
|
)
|
305
336
|
end
|
@@ -372,7 +403,7 @@ module Scale
|
|
372
403
|
|
373
404
|
class VoteThreshold
|
374
405
|
include Enum
|
375
|
-
values
|
406
|
+
values "SuperMajorityApprove", "SuperMajorityAgainst", "SimpleMajority"
|
376
407
|
end
|
377
408
|
|
378
409
|
class Null
|
@@ -391,7 +422,7 @@ module Scale
|
|
391
422
|
class LockPeriods < U8; end
|
392
423
|
|
393
424
|
class Hash < H256; end
|
394
|
-
|
425
|
+
|
395
426
|
class VoteIndex < U32; end
|
396
427
|
|
397
428
|
class ProposalIndex < U32; end
|
@@ -422,7 +453,7 @@ module Scale
|
|
422
453
|
|
423
454
|
class StorageHasher
|
424
455
|
include Enum
|
425
|
-
values
|
456
|
+
values "Blake2_128", "Blake2_256", "Blake2_128Concat", "Twox128", "Twox256", "Twox64Concat", "Identity"
|
426
457
|
end
|
427
458
|
|
428
459
|
class VoterInfo
|
@@ -459,7 +490,7 @@ module Scale
|
|
459
490
|
end
|
460
491
|
|
461
492
|
class OpaquePeerId < Bytes; end
|
462
|
-
|
493
|
+
|
463
494
|
class OpaqueMultiaddr < Bytes; end
|
464
495
|
|
465
496
|
class SessionKeysSubstrate
|
@@ -478,7 +509,7 @@ module Scale
|
|
478
509
|
babe: "AccountId"
|
479
510
|
)
|
480
511
|
end
|
481
|
-
|
512
|
+
|
482
513
|
class EdgewareKeys
|
483
514
|
include Struct
|
484
515
|
items(
|
@@ -516,35 +547,35 @@ module Scale
|
|
516
547
|
end
|
517
548
|
|
518
549
|
class VecU8Length2
|
519
|
-
include VecU8FixedLength
|
550
|
+
include VecU8FixedLength
|
520
551
|
end
|
521
552
|
|
522
553
|
class VecU8Length3
|
523
|
-
include VecU8FixedLength
|
554
|
+
include VecU8FixedLength
|
524
555
|
end
|
525
556
|
|
526
557
|
class VecU8Length4
|
527
|
-
include VecU8FixedLength
|
558
|
+
include VecU8FixedLength
|
528
559
|
end
|
529
560
|
|
530
561
|
class VecU8Length8
|
531
|
-
include VecU8FixedLength
|
562
|
+
include VecU8FixedLength
|
532
563
|
end
|
533
564
|
|
534
565
|
class VecU8Length16
|
535
|
-
include VecU8FixedLength
|
566
|
+
include VecU8FixedLength
|
536
567
|
end
|
537
568
|
|
538
569
|
class VecU8Length20
|
539
|
-
include VecU8FixedLength
|
570
|
+
include VecU8FixedLength
|
540
571
|
end
|
541
572
|
|
542
573
|
class VecU8Length32
|
543
|
-
include VecU8FixedLength
|
574
|
+
include VecU8FixedLength
|
544
575
|
end
|
545
|
-
|
576
|
+
|
546
577
|
class VecU8Length64
|
547
|
-
include VecU8FixedLength
|
578
|
+
include VecU8FixedLength
|
548
579
|
end
|
549
580
|
|
550
581
|
class BalanceLock
|
@@ -557,5 +588,208 @@ module Scale
|
|
557
588
|
)
|
558
589
|
end
|
559
590
|
|
591
|
+
class EthereumAddress
|
592
|
+
include SingleValue
|
593
|
+
|
594
|
+
def self.decode(scale_bytes)
|
595
|
+
bytes = scale_bytes.get_next_bytes(20)
|
596
|
+
EthereumAddress.new(bytes.bytes_to_hex)
|
597
|
+
end
|
598
|
+
|
599
|
+
def encode
|
600
|
+
if value.start_with?("0x") && value.length == 42
|
601
|
+
value[2..]
|
602
|
+
else
|
603
|
+
raise 'Value should start with "0x" and must be 20 bytes long'
|
604
|
+
end
|
605
|
+
end
|
606
|
+
end
|
607
|
+
|
608
|
+
class EcdsaSignature
|
609
|
+
include SingleValue
|
610
|
+
|
611
|
+
def self.decode(scale_bytes)
|
612
|
+
bytes = scale_bytes.get_next_bytes(65)
|
613
|
+
EcdsaSignature.new(bytes.bytes_to_hex)
|
614
|
+
end
|
615
|
+
|
616
|
+
def encode
|
617
|
+
if value.start_with?("0x") && value.length == 132
|
618
|
+
value[2..]
|
619
|
+
else
|
620
|
+
raise 'Value should start with "0x" and must be 65 bytes long'
|
621
|
+
end
|
622
|
+
end
|
623
|
+
end
|
624
|
+
|
625
|
+
class Bidder
|
626
|
+
include Enum
|
627
|
+
values "NewBidder", "ParaId"
|
628
|
+
end
|
629
|
+
|
630
|
+
class BlockAttestations
|
631
|
+
include Struct
|
632
|
+
items(
|
633
|
+
receipt: "CandidateReceipt",
|
634
|
+
valid: "Vec<AccountId>",
|
635
|
+
invalid: "Vec<AccountId>"
|
636
|
+
)
|
637
|
+
end
|
638
|
+
|
639
|
+
class IncludedBlocks
|
640
|
+
include Struct
|
641
|
+
items(
|
642
|
+
actual_number: "BlockNumber",
|
643
|
+
session: "SessionIndex",
|
644
|
+
random_seed: "H256",
|
645
|
+
active_parachains: "Vec<ParaId>",
|
646
|
+
para_blocks: "Vec<Hash>"
|
647
|
+
)
|
648
|
+
end
|
649
|
+
|
650
|
+
class HeadData < Bytes; end
|
651
|
+
|
652
|
+
class Conviction
|
653
|
+
include Enum
|
654
|
+
values "None", "Locked1x", "Locked2x", "Locked3x", "Locked4x", "Locked5x", "Locked6x"
|
655
|
+
end
|
656
|
+
|
657
|
+
class EraRewards
|
658
|
+
include Struct
|
659
|
+
items(
|
660
|
+
total: "U32",
|
661
|
+
rewards: "Vec<U32>"
|
662
|
+
)
|
663
|
+
end
|
664
|
+
|
665
|
+
class SlashJournalEntry
|
666
|
+
include Struct
|
667
|
+
items(
|
668
|
+
who: "AccountId",
|
669
|
+
amount: "Balance",
|
670
|
+
ownSlash: "Balance"
|
671
|
+
)
|
672
|
+
end
|
673
|
+
|
674
|
+
class UpwardMessage
|
675
|
+
include Struct
|
676
|
+
items(
|
677
|
+
origin: "ParachainDispatchOrigin",
|
678
|
+
data: "Bytes"
|
679
|
+
)
|
680
|
+
end
|
681
|
+
|
682
|
+
class ParachainDispatchOrigin
|
683
|
+
include Enum
|
684
|
+
values "Signed", "Parachain"
|
685
|
+
end
|
686
|
+
|
687
|
+
class StoredState
|
688
|
+
include Enum
|
689
|
+
values "Live", "PendingPause", "Paused", "PendingResume"
|
690
|
+
end
|
691
|
+
|
692
|
+
class Votes
|
693
|
+
include Struct
|
694
|
+
items(
|
695
|
+
index: "ProposalIndex",
|
696
|
+
threshold: "MemberCount",
|
697
|
+
ayes: "Vec<AccountId>",
|
698
|
+
nays: "Vec<AccountId>"
|
699
|
+
)
|
700
|
+
end
|
701
|
+
|
702
|
+
class WinningDataEntry
|
703
|
+
include Struct
|
704
|
+
items(
|
705
|
+
account_id: "AccountId",
|
706
|
+
para_id_of: "ParaIdOf",
|
707
|
+
balance_of: "BalanceOf"
|
708
|
+
)
|
709
|
+
end
|
710
|
+
|
711
|
+
class IdentityType < Bytes; end
|
712
|
+
|
713
|
+
class VoteType
|
714
|
+
include Enum
|
715
|
+
values "Binary", "MultiOption"
|
716
|
+
end
|
717
|
+
|
718
|
+
class VoteOutcome
|
719
|
+
include SingleValue
|
720
|
+
def self.decode(scale_bytes)
|
721
|
+
new(scale_bytes.get_next_bytes(32))
|
722
|
+
end
|
723
|
+
end
|
724
|
+
|
725
|
+
class Identity < Bytes; end
|
726
|
+
|
727
|
+
class ProposalTitle < Bytes; end
|
728
|
+
|
729
|
+
class ProposalContents < Bytes; end
|
730
|
+
|
731
|
+
class ProposalStage
|
732
|
+
include Enum
|
733
|
+
values "PreVoting", "Voting", "Completed"
|
734
|
+
end
|
735
|
+
|
736
|
+
class ProposalCategory
|
737
|
+
include Enum
|
738
|
+
values "Signaling"
|
739
|
+
end
|
740
|
+
|
741
|
+
class VoteStage
|
742
|
+
include Enum
|
743
|
+
values "PreVoting", "Commit", "Voting", "Completed"
|
744
|
+
end
|
745
|
+
|
746
|
+
class TallyType
|
747
|
+
include Enum
|
748
|
+
values "OnePerson", "OneCoin"
|
749
|
+
end
|
750
|
+
|
751
|
+
class Attestation < Bytes; end
|
752
|
+
|
753
|
+
class VecNextAuthority
|
754
|
+
include Vec
|
755
|
+
inner_type "NextAuthority"
|
756
|
+
end
|
757
|
+
|
758
|
+
class BoxProposal
|
759
|
+
include SingleValue
|
760
|
+
|
761
|
+
def self.decode(scale_bytes, metadata, chain_spec)
|
762
|
+
call_index = scale_bytes.get_next_bytes(2).bytes_to_hex[2..]
|
763
|
+
call_module, call = metadata.value.call_index[call_index]
|
764
|
+
|
765
|
+
call_args = call[:args].map do |arg|
|
766
|
+
arg_obj = Scale::Types.get(arg[:type], chain_spec).decode(scale_bytes)
|
767
|
+
{name: arg[:name], type: arg[:type], value: arg_obj.encode, value_raw: arg_obj.value}
|
768
|
+
end
|
769
|
+
|
770
|
+
self.new({
|
771
|
+
call_index: call_index,
|
772
|
+
call_function: call[:name],
|
773
|
+
call_module: call_module[:name],
|
774
|
+
call_args: call_args
|
775
|
+
})
|
776
|
+
end
|
777
|
+
|
778
|
+
def encode
|
779
|
+
value[:call_index] +
|
780
|
+
value[:call_args]
|
781
|
+
.map {|call_arg| call_arg[:value]}
|
782
|
+
.join("")
|
783
|
+
end
|
784
|
+
end
|
785
|
+
|
786
|
+
class ValidatorPrefsLegacy
|
787
|
+
include Struct
|
788
|
+
items(
|
789
|
+
unstake_threshold: "Compact",
|
790
|
+
validator_payment: "Compact"
|
791
|
+
)
|
792
|
+
end
|
793
|
+
|
560
794
|
end
|
561
795
|
end
|