scale_rb 0.1.3 → 0.1.4

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
  SHA256:
3
- metadata.gz: 381954b869c210f582d6d119be4efe2b0f41ab4aa783793ee1a8b5b3ae3f37fc
4
- data.tar.gz: 474b9ae37ee03d0112f63892a10b1a7965f73987ec03f28838dc3e050d5f29cd
3
+ metadata.gz: 04c1447c216cac863ad108d269030a8f3d180d1666c2bba347efad2fa7939335
4
+ data.tar.gz: bc3b74a6e4ed311491e0369d2b73ae3ac5ab98d430df311257385503db6b70d7
5
5
  SHA512:
6
- metadata.gz: 50ee90afbb3f5a9b27676912608dfa8de48bac33e8e19f1e21ee5db8f2aa1cf4c21f95cfca27e3bc6220481312bb57254004a8f219f6b6d1be94b295c47ffd68
7
- data.tar.gz: 7cdedc298adc696bb5a3df76c63710c13863a86d4c066f7a9fe2767bd349cb7f71ed4f26490faa3a77abb8022144102396b407f6ce02e9d8d10c8029f754a451
6
+ metadata.gz: fac868163255299dcba6094edbe98daed394ede7130262bebf449befc21cdb921e52f1b0a455ae61d46547fa30d28af6927705ed99ae8b7035025d095527f9d4
7
+ data.tar.gz: 4f9394ab7bb01d73d96e160c4b0c76dae593dd7331e9a276a090e9a7d03060085763c378f5ab0bba5daf64d5bc62b0f4ae0e054d406905c549f8b667d7db7e43
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- scale_rb (0.1.3)
4
+ scale_rb (0.1.4)
5
5
  blake2b_rs (~> 0.1.2)
6
6
  xxhash
7
7
 
data/lib/codec.rb CHANGED
@@ -16,6 +16,22 @@ end
16
16
  # TODO: set, bitvec
17
17
  module ScaleRb
18
18
  class << self
19
+ def type_def?(type)
20
+ type.instance_of?(String) && (
21
+ bytes?(type) ||
22
+ boolean?(type) ||
23
+ string?(type) ||
24
+ compact?(type) ||
25
+ int?(type) ||
26
+ uint?(type) ||
27
+ option?(type) ||
28
+ array?(type) ||
29
+ vec?(type) ||
30
+ tuple?(type)
31
+ ) ||
32
+ type.instance_of?(Hash)
33
+ end
34
+
19
35
  def bytes?(type)
20
36
  type.downcase == 'bytes'
21
37
  end
@@ -25,7 +41,7 @@ module ScaleRb
25
41
  end
26
42
 
27
43
  def string?(type)
28
- type.downcase == 'str' || type.downcase == 'string' || type.downcase == 'text'
44
+ type.downcase == 'str' || type.downcase == 'string' || type.downcase == 'text' || type.downcase == 'type'
29
45
  end
30
46
 
31
47
  def compact?(type)
@@ -97,14 +113,16 @@ end
97
113
  module ScaleRb
98
114
  class << self
99
115
  def _get_final_type_from_registry(registry, type)
100
- mapped_type = registry[type]
101
- if mapped_type.nil?
102
- nil
103
- elsif registry[mapped_type].nil?
104
- mapped_type
105
- else
106
- _get_final_type_from_registry(registry, mapped_type)
107
- end
116
+ raise "Wrong lookup type #{type.class}" if !type.instance_of?(String) && !type.instance_of?(Hash)
117
+
118
+ return if type.instance_of?(Hash)
119
+
120
+ mapped = registry._get(type) # mapped: String(name, type_def) | Hash(type_def: struct, enum) | nil
121
+
122
+ return if mapped.nil?
123
+ return mapped if type_def?(mapped)
124
+
125
+ _get_final_type_from_registry(registry, mapped)
108
126
  end
109
127
 
110
128
  def _decode_types(types, bytes, registry)
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Metadata
4
+ class << self
5
+ def decode_metadata(bytes)
6
+ metadata, = ScaleRb.decode('MetadataTop', bytes, TYPES)
7
+ metadata
8
+ end
9
+
10
+ def build_registry(metadata)
11
+ raise ScaleRb::NotImplemented, metadata._get(:metadata).keys.first unless metadata._get(:metadata)._key?(:v14)
12
+
13
+ metadata_v14 = metadata._get(:metadata)._get(:v14)
14
+ MetadataV14.build_registry(metadata_v14)
15
+ end
16
+
17
+ def get_storage_item(pallet_name, item_name, metadata)
18
+ raise ScaleRb::NotImplemented, metadata._get(:metadata).keys.first unless metadata._get(:metadata)._key?(:v14)
19
+
20
+ metadata_v14 = metadata._get(:metadata)._get(:v14)
21
+ MetadataV14.get_storage_item(pallet_name, item_name, metadata_v14)
22
+ end
23
+ end
24
+
25
+ TYPES = {
26
+ 'MetadataTop' => {
27
+ magicNumber: 'U32',
28
+ metadata: 'Metadata'
29
+ },
30
+ 'Metadata' => {
31
+ _enum: {
32
+ v0: 'MetadataV0',
33
+ v1: 'MetadataV1',
34
+ v2: 'MetadataV2',
35
+ v3: 'MetadataV3',
36
+ v4: 'MetadataV4',
37
+ v5: 'MetadataV5',
38
+ v6: 'MetadataV6',
39
+ v7: 'MetadataV7',
40
+ v8: 'MetadataV8',
41
+ v9: 'MetadataV9',
42
+ v10: 'MetadataV10',
43
+ v11: 'MetadataV11',
44
+ v12: 'MetadataV12',
45
+ v13: 'MetadataV13',
46
+ v14: 'MetadataV14'
47
+ }
48
+ }
49
+ }.merge(MetadataV14::TYPES)
50
+ .merge(MetadataV13::TYPES)
51
+ .merge(MetadataV12::TYPES)
52
+ .merge(MetadataV11::TYPES)
53
+ .merge(MetadataV10::TYPES)
54
+ .merge(MetadataV9::TYPES)
55
+ end
@@ -0,0 +1,79 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Metadata
4
+ module MetadataV10
5
+ class << self
6
+ def get_module(module_name, metadata)
7
+ metadata._get(:metadata)._get(:v10)._get(:modules).find do |m|
8
+ m._get(:name) == module_name
9
+ end
10
+ end
11
+
12
+ def get_storage_item(module_name, item_name, metadata)
13
+ modula = get_module(module_name, metadata)
14
+ modula._get(:storage)._get(:items).find do |item|
15
+ item._get(:name) == item_name
16
+ end
17
+ end
18
+ end
19
+
20
+ TYPES = {
21
+ ErrorMetadataV10: 'ErrorMetadataV9',
22
+ EventMetadataV10: 'EventMetadataV9',
23
+ FunctionArgumentMetadataV10: 'FunctionArgumentMetadataV9',
24
+ FunctionMetadataV10: 'FunctionMetadataV9',
25
+ MetadataV10: {
26
+ modules: 'Vec<ModuleMetadataV10>'
27
+ },
28
+ ModuleConstantMetadataV10: 'ModuleConstantMetadataV9',
29
+ ModuleMetadataV10: {
30
+ name: 'Text',
31
+ storage: 'Option<StorageMetadataV10>',
32
+ calls: 'Option<Vec<FunctionMetadataV10>>',
33
+ events: 'Option<Vec<EventMetadataV10>>',
34
+ constants: 'Vec<ModuleConstantMetadataV10>',
35
+ errors: 'Vec<ErrorMetadataV10>'
36
+ },
37
+ StorageEntryModifierV10: 'StorageEntryModifierV9',
38
+ StorageEntryMetadataV10: {
39
+ name: 'Text',
40
+ modifier: 'StorageEntryModifierV10',
41
+ type: 'StorageEntryTypeV10',
42
+ fallback: 'Bytes',
43
+ docs: 'Vec<Text>'
44
+ },
45
+ StorageEntryTypeV10: {
46
+ _enum: {
47
+ Plain: 'Type',
48
+ Map: {
49
+ hasher: 'StorageHasherV10',
50
+ key: 'Type',
51
+ value: 'Type',
52
+ linked: 'bool'
53
+ },
54
+ DoubleMap: {
55
+ hasher: 'StorageHasherV10',
56
+ key1: 'Type',
57
+ key2: 'Type',
58
+ value: 'Type',
59
+ key2Hasher: 'StorageHasherV10'
60
+ }
61
+ }
62
+ },
63
+ StorageMetadataV10: {
64
+ prefix: 'Text',
65
+ items: 'Vec<StorageEntryMetadataV10>'
66
+ },
67
+ StorageHasherV10: {
68
+ _enum: %w[
69
+ Blake2_128
70
+ Blake2_256
71
+ Blake2_128Concat
72
+ Twox128
73
+ Twox256
74
+ Twox64Concat
75
+ ]
76
+ }
77
+ }.freeze
78
+ end
79
+ end
@@ -0,0 +1,85 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Metadata
4
+ module MetadataV11
5
+ class << self
6
+ def get_module(module_name, metadata)
7
+ metadata._get(:metadata)._get(:v11)._get(:modules).find do |m|
8
+ m._get(:name) == module_name
9
+ end
10
+ end
11
+
12
+ def get_storage_item(module_name, item_name, metadata)
13
+ modula = get_module(module_name, metadata)
14
+ modula._get(:storage)._get(:items).find do |item|
15
+ item._get(:name) == item_name
16
+ end
17
+ end
18
+ end
19
+
20
+ TYPES = {
21
+ ErrorMetadataV11: 'ErrorMetadataV10',
22
+ EventMetadataV11: 'EventMetadataV10',
23
+ ExtrinsicMetadataV11: {
24
+ version: 'u8',
25
+ signedExtensions: 'Vec<Text>'
26
+ },
27
+ FunctionArgumentMetadataV11: 'FunctionArgumentMetadataV10',
28
+ FunctionMetadataV11: 'FunctionMetadataV10',
29
+ MetadataV11: {
30
+ modules: 'Vec<ModuleMetadataV11>',
31
+ extrinsic: 'ExtrinsicMetadataV11'
32
+ },
33
+ ModuleConstantMetadataV11: 'ModuleConstantMetadataV10',
34
+ ModuleMetadataV11: {
35
+ name: 'Text',
36
+ storage: 'Option<StorageMetadataV11>',
37
+ calls: 'Option<Vec<FunctionMetadataV11>>',
38
+ events: 'Option<Vec<EventMetadataV11>>',
39
+ constants: 'Vec<ModuleConstantMetadataV11>',
40
+ errors: 'Vec<ErrorMetadataV11>'
41
+ },
42
+ StorageEntryModifierV11: 'StorageEntryModifierV10',
43
+ StorageEntryMetadataV11: {
44
+ name: 'Text',
45
+ modifier: 'StorageEntryModifierV11',
46
+ type: 'StorageEntryTypeV11',
47
+ fallback: 'Bytes',
48
+ docs: 'Vec<Text>'
49
+ },
50
+ StorageEntryTypeV11: {
51
+ _enum: {
52
+ Plain: 'Type',
53
+ Map: {
54
+ hasher: 'StorageHasherV11',
55
+ key: 'Type',
56
+ value: 'Type',
57
+ linked: 'bool'
58
+ },
59
+ DoubleMap: {
60
+ hasher: 'StorageHasherV11',
61
+ key1: 'Type',
62
+ key2: 'Type',
63
+ value: 'Type',
64
+ key2Hasher: 'StorageHasherV11'
65
+ }
66
+ }
67
+ },
68
+ StorageMetadataV11: {
69
+ prefix: 'Text',
70
+ items: 'Vec<StorageEntryMetadataV11>'
71
+ },
72
+ StorageHasherV11: {
73
+ _enum: %w[
74
+ Blake2_128
75
+ Blake2_256
76
+ Blake2_128Concat
77
+ Twox128
78
+ Twox256
79
+ Twox64Concat
80
+ Identity
81
+ ]
82
+ }
83
+ }.freeze
84
+ end
85
+ end
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Metadata
4
+ module MetadataV12
5
+ class << self
6
+ def get_module(module_name, metadata)
7
+ metadata._get(:metadata)._get(:v12)._get(:modules).find do |m|
8
+ m._get(:name) == module_name
9
+ end
10
+ end
11
+
12
+ def get_storage_item(module_name, item_name, metadata)
13
+ modula = get_module(module_name, metadata)
14
+ modula._get(:storage)._get(:items).find do |item|
15
+ item._get(:name) == item_name
16
+ end
17
+ end
18
+ end
19
+
20
+ TYPES = {
21
+ ErrorMetadataV12: 'ErrorMetadataV11',
22
+ EventMetadataV12: 'EventMetadataV11',
23
+ ExtrinsicMetadataV12: 'ExtrinsicMetadataV11',
24
+ FunctionArgumentMetadataV12: 'FunctionArgumentMetadataV11',
25
+ FunctionMetadataV12: 'FunctionMetadataV11',
26
+ MetadataV12: {
27
+ modules: 'Vec<ModuleMetadataV12>',
28
+ extrinsic: 'ExtrinsicMetadataV12'
29
+ },
30
+ ModuleConstantMetadataV12: 'ModuleConstantMetadataV11',
31
+ ModuleMetadataV12: {
32
+ name: 'Text',
33
+ storage: 'Option<StorageMetadataV12>',
34
+ calls: 'Option<Vec<FunctionMetadataV12>>',
35
+ events: 'Option<Vec<EventMetadataV12>>',
36
+ constants: 'Vec<ModuleConstantMetadataV12>',
37
+ errors: 'Vec<ErrorMetadataV12>',
38
+ index: 'u8'
39
+ },
40
+ StorageEntryModifierV12: 'StorageEntryModifierV11',
41
+ StorageEntryMetadataV12: 'StorageEntryMetadataV11',
42
+ StorageEntryTypeV12: 'StorageEntryTypeV11',
43
+ StorageMetadataV12: 'StorageMetadataV11',
44
+ StorageHasherV12: 'StorageHasherV11'
45
+ }.freeze
46
+ end
47
+ end
@@ -0,0 +1,78 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Metadata
4
+ module MetadataV13
5
+ class << self
6
+ def get_module(module_name, metadata)
7
+ metadata._get(:metadata)._get(:v13)._get(:modules).find do |m|
8
+ m._get(:name) == module_name
9
+ end
10
+ end
11
+
12
+ def get_storage_item(module_name, item_name, metadata)
13
+ modula = get_module(module_name, metadata)
14
+ modula._get(:storage)._get(:items).find do |item|
15
+ item._get(:name) == item_name
16
+ end
17
+ end
18
+ end
19
+
20
+ TYPES = {
21
+ MetadataV13: {
22
+ modules: 'Vec<ModuleMetadataV13>',
23
+ extrinsic: 'ExtrinsicMetadataV13'
24
+ },
25
+
26
+ ModuleMetadataV13: {
27
+ name: 'Text',
28
+ storage: 'Option<StorageMetadataV13>',
29
+ calls: 'Option<Vec<FunctionMetadataV13>>',
30
+ events: 'Option<Vec<EventMetadataV13>>',
31
+ constants: 'Vec<ModuleConstantMetadataV13>',
32
+ errors: 'Vec<ErrorMetadataV13>',
33
+ index: 'u8'
34
+ },
35
+ StorageMetadataV13: {
36
+ prefix: 'Text',
37
+ items: 'Vec<StorageEntryMetadataV13>'
38
+ },
39
+ StorageEntryMetadataV13: {
40
+ name: 'Text',
41
+ modifier: 'StorageEntryModifierV13',
42
+ type: 'StorageEntryTypeV13',
43
+ fallback: 'Bytes',
44
+ docs: 'Vec<Text>'
45
+ },
46
+ StorageEntryModifierV13: 'StorageEntryModifierV12',
47
+ StorageEntryTypeV13: {
48
+ _enum: {
49
+ plain: 'Type',
50
+ map: {
51
+ hasher: 'StorageHasherV13',
52
+ key: 'Type',
53
+ value: 'Type',
54
+ linked: 'bool'
55
+ },
56
+ doubleMap: {
57
+ hasher: 'StorageHasherV13',
58
+ key1: 'Type',
59
+ key2: 'Type',
60
+ value: 'Type',
61
+ key2Hasher: 'StorageHasherV13'
62
+ },
63
+ nMap: {
64
+ keyVec: 'Vec<Type>',
65
+ hashers: 'Vec<StorageHasherV13>',
66
+ value: 'Type'
67
+ }
68
+ }
69
+ },
70
+ StorageHasherV13: 'StorageHasherV12',
71
+ FunctionMetadataV13: 'FunctionMetadataV12',
72
+ EventMetadataV13: 'EventMetadataV12',
73
+ ModuleConstantMetadataV13: 'ModuleConstantMetadataV12',
74
+ ErrorMetadataV13: 'ErrorMetadataV12',
75
+ ExtrinsicMetadataV13: 'ExtrinsicMetadataV12'
76
+ }.freeze
77
+ end
78
+ end
@@ -0,0 +1,176 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Metadata
4
+ module MetadataV14
5
+ class << self
6
+ def build_registry(metadata)
7
+ types = metadata._get(:lookup)._get(:types)
8
+ types.map { |type| [type._get(:id), type._get(:type)] }.to_h
9
+ end
10
+
11
+ def get_module(pallet_name, metadata)
12
+ metadata._get(:metadata)._get(:v14)._get(:pallets).find do |p|
13
+ p._get(:name) == pallet_name
14
+ end
15
+ end
16
+
17
+ def get_storage_item(pallet_name, item_name, metadata)
18
+ pallet = get_module(pallet_name, metadata)
19
+ pallet._get(:storage)._get(:items).find do |item|
20
+ item._get(:name) == item_name
21
+ end
22
+ end
23
+ end
24
+
25
+ TYPES = {
26
+ MetadataV14: {
27
+ lookup: 'PortableRegistry',
28
+ pallets: 'Vec<PalletMetadataV14>',
29
+ extrinsic: 'ExtrinsicMetadataV14',
30
+ type: 'SiLookupTypeId'
31
+ },
32
+
33
+ # PortableRegistry begin
34
+ PortableRegistry: {
35
+ types: 'Vec<PortableTypeV14>'
36
+ },
37
+ PortableTypeV14: {
38
+ id: 'Si1LookupTypeId',
39
+ type: 'Si1Type'
40
+ },
41
+ Si1LookupTypeId: 'Compact',
42
+ Si1Type: {
43
+ path: 'Si1Path',
44
+ params: 'Vec<Si1TypeParameter>',
45
+ def: 'Si1TypeDef',
46
+ docs: 'Vec<Text>'
47
+ },
48
+ Si1Path: 'Vec<Text>',
49
+ Si1TypeParameter: {
50
+ name: 'Text',
51
+ type: 'Option<Si1LookupTypeId>'
52
+ },
53
+ Si1TypeDef: {
54
+ _enum: {
55
+ composite: 'Si1TypeDefComposite',
56
+ variant: 'Si1TypeDefVariant',
57
+ sequence: 'Si1TypeDefSequence',
58
+ array: 'Si1TypeDefArray',
59
+ tuple: 'Si1TypeDefTuple',
60
+ primitive: 'Si1TypeDefPrimitive',
61
+ compact: 'Si1TypeDefCompact',
62
+ bitSequence: 'Si1TypeDefBitSequence',
63
+ historicMetaCompat: 'Text' # TODO: sanitize?
64
+ }
65
+ },
66
+ Si1TypeDefComposite: {
67
+ fields: 'Vec<Si1Field>'
68
+ },
69
+ Si1Field: {
70
+ name: 'Option<Text>',
71
+ type: 'Si1LookupTypeId',
72
+ typeName: 'Option<Text>',
73
+ docs: 'Vec<Text>'
74
+ },
75
+ Si1TypeDefVariant: {
76
+ variants: 'Vec<Si1Variant>'
77
+ },
78
+ Si1Variant: {
79
+ name: 'Text',
80
+ fields: 'Vec<Si1Field>',
81
+ index: 'u8',
82
+ docs: 'Vec<Text>'
83
+ },
84
+ Si1TypeDefSequence: {
85
+ type: 'Si1LookupTypeId'
86
+ },
87
+ Si1TypeDefArray: {
88
+ len: 'u32',
89
+ type: 'Si1LookupTypeId'
90
+ },
91
+ Si1TypeDefTuple: 'Vec<Si1LookupTypeId>',
92
+ Si1TypeDefPrimitive: {
93
+ _enum: %w[
94
+ Bool Char Str U8 U16 U32 U64 U128 U256 I8 I16 I32 I64 I128 I256
95
+ ]
96
+ },
97
+ Si1TypeDefCompact: {
98
+ type: 'Si1LookupTypeId'
99
+ },
100
+ Si1TypeDefBitSequence: {
101
+ bitStoreType: 'Si1LookupTypeId',
102
+ bitOrderType: 'Si1LookupTypeId'
103
+ },
104
+ # PortableRegistry end
105
+
106
+ # PalletMetadataV14 begin
107
+ PalletMetadataV14: {
108
+ name: 'Text',
109
+ storage: 'Option<PalletStorageMetadataV14>',
110
+ calls: 'Option<PalletCallMetadataV14>',
111
+ events: 'Option<PalletEventMetadataV14>',
112
+ constants: 'Vec<PalletConstantMetadataV14>',
113
+ errors: 'Option<PalletErrorMetadataV14>',
114
+ index: 'U8'
115
+ },
116
+ PalletStorageMetadataV14: {
117
+ prefix: 'Text',
118
+ items: 'Vec<StorageEntryMetadataV14>'
119
+ },
120
+ StorageEntryMetadataV14: {
121
+ name: 'Text',
122
+ modifier: 'StorageEntryModifierV14',
123
+ type: 'StorageEntryTypeV14',
124
+ fallback: 'Bytes',
125
+ docs: 'Vec<Text>'
126
+ },
127
+ StorageEntryModifierV14: {
128
+ _enum: %w[Optional Default Required]
129
+ },
130
+ StorageEntryTypeV14: {
131
+ _enum: {
132
+ plain: 'SiLookupTypeId',
133
+ map: {
134
+ hashers: 'Vec<StorageHasherV14>',
135
+ key: 'SiLookupTypeId',
136
+ value: 'SiLookupTypeId'
137
+ }
138
+ }
139
+ },
140
+ StorageHasherV14: {
141
+ _enum: %w[Blake2128 Blake2256 Blake2128Concat Twox128 Twox256 Twox64Concat Identity]
142
+ },
143
+ PalletCallMetadataV14: {
144
+ type: 'Si1LookupTypeId'
145
+ },
146
+ PalletEventMetadataV14: {
147
+ type: 'SiLookupTypeId'
148
+ },
149
+ PalletConstantMetadataV14: {
150
+ name: 'Text',
151
+ type: 'SiLookupTypeId',
152
+ value: 'Bytes',
153
+ docs: 'Vec<Text>'
154
+ },
155
+ PalletErrorMetadataV14: {
156
+ type: 'SiLookupTypeId'
157
+ },
158
+ # PalletMetadataV14 end
159
+
160
+ # ExtrinsicMetadataV14 begin
161
+ ExtrinsicMetadataV14: {
162
+ type: 'SiLookupTypeId',
163
+ version: 'u8',
164
+ signedExtensions: 'Vec<SignedExtensionMetadataV14>'
165
+ },
166
+ SignedExtensionMetadataV14: {
167
+ identifier: 'Text',
168
+ type: 'SiLookupTypeId',
169
+ additionalSigned: 'SiLookupTypeId'
170
+ },
171
+ # ExtrinsicMetadataV14 end
172
+
173
+ SiLookupTypeId: 'Compact'
174
+ }.freeze
175
+ end
176
+ end
@@ -0,0 +1,99 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Metadata
4
+ module MetadataV9
5
+ class << self
6
+ def get_module(module_name, metadata)
7
+ metadata._get(:metadata)._get(:v9)._get(:modules).find do |m|
8
+ m._get(:name) == module_name
9
+ end
10
+ end
11
+
12
+ def get_storage_item(module_name, item_name, metadata)
13
+ modula = get_module(module_name, metadata)
14
+ modula._get(:storage)._get(:items).find do |item|
15
+ item._get(:name) == item_name
16
+ end
17
+ end
18
+ end
19
+
20
+ TYPES = {
21
+ ErrorMetadataV9: {
22
+ name: 'Text',
23
+ docs: 'Vec<Text>'
24
+ },
25
+ EventMetadataV9: {
26
+ name: 'Text',
27
+ args: 'Vec<Type>',
28
+ docs: 'Vec<Text>'
29
+ },
30
+ FunctionArgumentMetadataV9: {
31
+ name: 'Text',
32
+ type: 'Type'
33
+ },
34
+ FunctionMetadataV9: {
35
+ name: 'Text',
36
+ args: 'Vec<FunctionArgumentMetadataV9>',
37
+ docs: 'Vec<Text>'
38
+ },
39
+ MetadataV9: {
40
+ modules: 'Vec<ModuleMetadataV9>'
41
+ },
42
+ ModuleConstantMetadataV9: {
43
+ name: 'Text',
44
+ type: 'Type',
45
+ value: 'Bytes',
46
+ docs: 'Vec<Text>'
47
+ },
48
+ ModuleMetadataV9: {
49
+ name: 'Text',
50
+ storage: 'Option<StorageMetadataV9>',
51
+ calls: 'Option<Vec<FunctionMetadataV9>>',
52
+ events: 'Option<Vec<EventMetadataV9>>',
53
+ constants: 'Vec<ModuleConstantMetadataV9>',
54
+ errors: 'Vec<ErrorMetadataV9>'
55
+ },
56
+ StorageEntryMetadataV9: {
57
+ name: 'Text',
58
+ modifier: 'StorageEntryModifierV9',
59
+ type: 'StorageEntryTypeV9',
60
+ fallback: 'Bytes',
61
+ docs: 'Vec<Text>'
62
+ },
63
+ StorageEntryModifierV9: {
64
+ _enum: %w[Optional Default Required]
65
+ },
66
+ StorageEntryTypeV9: {
67
+ _enum: {
68
+ Plain: 'Type',
69
+ Map: {
70
+ hasher: 'StorageHasherV9',
71
+ key: 'Type',
72
+ value: 'Type',
73
+ linked: 'bool'
74
+ },
75
+ DoubleMap: {
76
+ hasher: 'StorageHasherV9',
77
+ key1: 'Type',
78
+ key2: 'Type',
79
+ value: 'Type',
80
+ key2Hasher: 'StorageHasherV9'
81
+ }
82
+ }
83
+ },
84
+ StorageHasherV9: {
85
+ _enum: %w[
86
+ Blake2_128
87
+ Blake2_256
88
+ Twox128
89
+ Twox256
90
+ Twox64Concat
91
+ ]
92
+ },
93
+ StorageMetadataV9: {
94
+ prefix: 'Text',
95
+ items: 'Vec<StorageEntryMetadataV9>'
96
+ }
97
+ }.freeze
98
+ end
99
+ end
@@ -106,7 +106,7 @@ class Hash
106
106
  def _get(key)
107
107
  if key.instance_of?(String)
108
108
  self[key] || self[key.to_sym]
109
- else
109
+ elsif key.instance_of?(Symbol)
110
110
  self[key] || self[key.to_s]
111
111
  end
112
112
  end
@@ -1,3 +1,3 @@
1
1
  module ScaleRb
2
- VERSION = '0.1.3'
2
+ VERSION = '0.1.4'
3
3
  end
data/lib/scale_rb.rb CHANGED
@@ -9,8 +9,13 @@ require 'codec'
9
9
  require 'portable_codec'
10
10
 
11
11
  # metadata types, decoding and helpers
12
- require 'metadata'
13
- require 'metadata_v14'
12
+ require 'metadata/metadata_v9'
13
+ require 'metadata/metadata_v10'
14
+ require 'metadata/metadata_v11'
15
+ require 'metadata/metadata_v12'
16
+ require 'metadata/metadata_v13'
17
+ require 'metadata/metadata_v14'
18
+ require 'metadata/metadata'
14
19
 
15
20
  require 'hasher'
16
21
  require 'storage_helper'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: scale_rb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Aki Wu
@@ -61,8 +61,13 @@ files:
61
61
  - exe/metadata
62
62
  - lib/codec.rb
63
63
  - lib/hasher.rb
64
- - lib/metadata.rb
65
- - lib/metadata_v14.rb
64
+ - lib/metadata/metadata.rb
65
+ - lib/metadata/metadata_v10.rb
66
+ - lib/metadata/metadata_v11.rb
67
+ - lib/metadata/metadata_v12.rb
68
+ - lib/metadata/metadata_v13.rb
69
+ - lib/metadata/metadata_v14.rb
70
+ - lib/metadata/metadata_v9.rb
66
71
  - lib/monkey_patching.rb
67
72
  - lib/portable_codec.rb
68
73
  - lib/registry.rb
data/lib/metadata.rb DELETED
@@ -1,199 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Metadata
4
- class << self
5
- def decode_metadata(bytes)
6
- metadata, = ScaleRb.decode('MetadataTop', bytes, TYPES)
7
- metadata
8
- end
9
-
10
- def build_registry(metadata)
11
- raise ScaleRb::NotImplemented, metadata._get(:metadata).keys.first unless metadata._get(:metadata)._key?(:v14)
12
-
13
- metadata_v14 = metadata._get(:metadata)._get(:v14)
14
- MetadataV14.build_registry(metadata_v14)
15
- end
16
-
17
- def get_storage_item(pallet_name, item_name, metadata)
18
- raise ScaleRb::NotImplemented, metadata._get(:metadata).keys.first unless metadata._get(:metadata)._key?(:v14)
19
-
20
- metadata_v14 = metadata._get(:metadata)._get(:v14)
21
- MetadataV14.get_storage_item(pallet_name, item_name, metadata_v14)
22
- end
23
- end
24
-
25
- TYPES = {
26
- 'MetadataTop' => {
27
- magicNumber: 'U32',
28
- metadata: 'Metadata'
29
- },
30
- 'Metadata' => {
31
- _enum: {
32
- v0: 'MetadataV0',
33
- v1: 'MetadataV1',
34
- v2: 'MetadataV2',
35
- v3: 'MetadataV3',
36
- v4: 'MetadataV4',
37
- v5: 'MetadataV5',
38
- v6: 'MetadataV6',
39
- v7: 'MetadataV7',
40
- v8: 'MetadataV8',
41
- v9: 'MetadataV9',
42
- v10: 'MetadataV10',
43
- v11: 'MetadataV11',
44
- v12: 'MetadataV12',
45
- v13: 'MetadataV13',
46
- v14: 'MetadataV14'
47
- }
48
- },
49
-
50
- 'MetadataV14' => {
51
- lookup: 'PortableRegistry',
52
- pallets: 'Vec<PalletMetadataV14>',
53
- extrinsic: 'ExtrinsicMetadataV14',
54
- type: 'SiLookupTypeId'
55
- },
56
-
57
- # PortableRegistry begin
58
- 'PortableRegistry' => {
59
- types: 'Vec<PortableTypeV14>'
60
- },
61
- 'PortableTypeV14' => {
62
- id: 'Si1LookupTypeId',
63
- type: 'Si1Type'
64
- },
65
- 'Si1LookupTypeId' => 'Compact',
66
- 'Si1Type' => {
67
- path: 'Si1Path',
68
- params: 'Vec<Si1TypeParameter>',
69
- def: 'Si1TypeDef',
70
- docs: 'Vec<Text>'
71
- },
72
- 'Si1Path' => 'Vec<Text>',
73
- 'Si1TypeParameter' => {
74
- name: 'Text',
75
- type: 'Option<Si1LookupTypeId>'
76
- },
77
- 'Si1TypeDef' => {
78
- _enum: {
79
- composite: 'Si1TypeDefComposite',
80
- variant: 'Si1TypeDefVariant',
81
- sequence: 'Si1TypeDefSequence',
82
- array: 'Si1TypeDefArray',
83
- tuple: 'Si1TypeDefTuple',
84
- primitive: 'Si1TypeDefPrimitive',
85
- compact: 'Si1TypeDefCompact',
86
- bitSequence: 'Si1TypeDefBitSequence',
87
- historicMetaCompat: 'Text' # TODO: sanitize?
88
- }
89
- },
90
- 'Si1TypeDefComposite' => {
91
- fields: 'Vec<Si1Field>'
92
- },
93
- 'Si1Field' => {
94
- name: 'Option<Text>',
95
- type: 'Si1LookupTypeId',
96
- typeName: 'Option<Text>',
97
- docs: 'Vec<Text>'
98
- },
99
- 'Si1TypeDefVariant' => {
100
- variants: 'Vec<Si1Variant>'
101
- },
102
- 'Si1Variant' => {
103
- name: 'Text',
104
- fields: 'Vec<Si1Field>',
105
- index: 'u8',
106
- docs: 'Vec<Text>'
107
- },
108
- 'Si1TypeDefSequence' => {
109
- type: 'Si1LookupTypeId'
110
- },
111
- 'Si1TypeDefArray' => {
112
- len: 'u32',
113
- type: 'Si1LookupTypeId'
114
- },
115
- 'Si1TypeDefTuple' => 'Vec<Si1LookupTypeId>',
116
- 'Si1TypeDefPrimitive' => {
117
- _enum: %w[
118
- Bool Char Str U8 U16 U32 U64 U128 U256 I8 I16 I32 I64 I128 I256
119
- ]
120
- },
121
- 'Si1TypeDefCompact' => {
122
- type: 'Si1LookupTypeId'
123
- },
124
- 'Si1TypeDefBitSequence' => {
125
- bitStoreType: 'Si1LookupTypeId',
126
- bitOrderType: 'Si1LookupTypeId'
127
- },
128
- # PortableRegistry end
129
-
130
- # PalletMetadataV14 begin
131
- 'PalletMetadataV14' => {
132
- name: 'Text',
133
- storage: 'Option<PalletStorageMetadataV14>',
134
- calls: 'Option<PalletCallMetadataV14>',
135
- events: 'Option<PalletEventMetadataV14>',
136
- constants: 'Vec<PalletConstantMetadataV14>',
137
- errors: 'Option<PalletErrorMetadataV14>',
138
- index: 'U8'
139
- },
140
- 'PalletStorageMetadataV14' => {
141
- prefix: 'Text',
142
- items: 'Vec<StorageEntryMetadataV14>'
143
- },
144
- 'StorageEntryMetadataV14' => {
145
- name: 'Text',
146
- modifier: 'StorageEntryModifierV14',
147
- type: 'StorageEntryTypeV14',
148
- fallback: 'Bytes',
149
- docs: 'Vec<Text>'
150
- },
151
- 'StorageEntryModifierV14' => {
152
- _enum: %w[Optional Default Required]
153
- },
154
- 'StorageEntryTypeV14' => {
155
- _enum: {
156
- plain: 'SiLookupTypeId',
157
- map: {
158
- hashers: 'Vec<StorageHasherV14>',
159
- key: 'SiLookupTypeId',
160
- value: 'SiLookupTypeId'
161
- }
162
- }
163
- },
164
- 'StorageHasherV14' => {
165
- _enum: %w[Blake2128 Blake2256 Blake2128Concat Twox128 Twox256 Twox64Concat Identity]
166
- },
167
- 'PalletCallMetadataV14' => {
168
- type: 'Si1LookupTypeId'
169
- },
170
- 'PalletEventMetadataV14' => {
171
- type: 'SiLookupTypeId'
172
- },
173
- 'PalletConstantMetadataV14' => {
174
- name: 'Text',
175
- type: 'SiLookupTypeId',
176
- value: 'Bytes',
177
- docs: 'Vec<Text>'
178
- },
179
- 'PalletErrorMetadataV14' => {
180
- type: 'SiLookupTypeId'
181
- },
182
- # PalletMetadataV14 end
183
-
184
- # ExtrinsicMetadataV14 begin
185
- 'ExtrinsicMetadataV14' => {
186
- type: 'SiLookupTypeId',
187
- version: 'u8',
188
- signedExtensions: 'Vec<SignedExtensionMetadataV14>'
189
- },
190
- 'SignedExtensionMetadataV14' => {
191
- identifier: 'Text',
192
- type: 'SiLookupTypeId',
193
- additionalSigned: 'SiLookupTypeId'
194
- },
195
- # ExtrinsicMetadataV14 end
196
-
197
- 'SiLookupTypeId' => 'Compact'
198
- }.freeze
199
- end
data/lib/metadata_v14.rb DELETED
@@ -1,21 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module MetadataV14
4
- class << self
5
- def build_registry(metadata)
6
- types = metadata._get(:lookup)._get(:types)
7
- types.map { |type| [type._get(:id), type._get(:type)] }.to_h
8
- end
9
-
10
- def get_storage_item(pallet_name, item_name, metadata)
11
- pallet =
12
- metadata._get(:pallets).find do |p|
13
- p._get(:name) == pallet_name
14
- end
15
-
16
- pallet._get(:storage)._get(:items).find do |item|
17
- item._get(:name) == item_name
18
- end
19
- end
20
- end
21
- end