scale_rb 0.1.3 → 0.1.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -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,8 +106,10 @@ 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
+ else
112
+ self[key]
111
113
  end
112
114
  end
113
115
  end
@@ -81,37 +81,41 @@ module PortableCodec
81
81
  def decode_composite(composite_type, bytes, registry)
82
82
  fields = composite_type._get(:fields)
83
83
 
84
- type_name_list = fields.map { |f| f._get(:name) }
85
- type_id_list = fields.map { |f| f._get(:type) }
86
-
87
- type_value_list, remaining_bytes = _decode_types(type_id_list, bytes, registry)
88
- [
89
- if type_name_list.all?(&:nil?)
90
- type_value_list
91
- else
92
- [type_name_list.map(&:to_sym), type_value_list].transpose.to_h
93
- end,
94
- remaining_bytes
95
- ]
84
+ # reduce composite level when composite only has one field without name
85
+ if fields.length == 1 && fields.first._get(:name).nil?
86
+ decode(fields.first._get(:type), bytes, registry)
87
+ else
88
+ type_name_list = fields.map { |f| f._get(:name) }
89
+ type_id_list = fields.map { |f| f._get(:type) }
90
+
91
+ type_value_list, remaining_bytes = _decode_types(type_id_list, bytes, registry)
92
+ [
93
+ if type_name_list.all?(&:nil?)
94
+ type_value_list
95
+ else
96
+ [type_name_list.map(&:to_sym), type_value_list].transpose.to_h
97
+ end,
98
+ remaining_bytes
99
+ ]
100
+ end
96
101
  end
97
102
 
98
103
  def decode_variant(variant_type, bytes, registry)
99
104
  variants = variant_type._get(:variants)
100
105
 
101
106
  index = bytes[0]
102
- if index > (variants.length - 1)
103
- raise VariantIndexOutOfRange,
104
- "type: #{variant_type}, index: #{index}, bytes: #{bytes}"
105
- end
107
+ item = variants.find { |v| v._get(:index) == index } # item is an composite
106
108
 
107
- item_variant = variants.find { |v| v._get(:index) == index }
108
- item_name = item_variant._get(:name)
109
- item, remaining_bytes = decode_composite(item_variant, bytes[1..], registry)
109
+ raise VariantIndexOutOfRange, "type: #{variant_type}, index: #{index}, bytes: #{bytes}" if item.nil?
110
110
 
111
- [
112
- item.empty? ? item_name : { item_name.to_sym => item },
113
- remaining_bytes
114
- ]
111
+ item_name = item._get(:name)
112
+ item_fields = item._get(:fields)
113
+ if item_fields.empty?
114
+ [item_name, bytes[1..]]
115
+ else
116
+ item_value, remaining_bytes = decode_composite(item, bytes[1..], registry)
117
+ [{ item_name.to_sym => item_value }, remaining_bytes]
118
+ end
115
119
  end
116
120
 
117
121
  def _decode_types(ids, bytes, registry = {})
@@ -181,18 +185,23 @@ module PortableCodec
181
185
  # or
182
186
  # [value1, value2, ...]
183
187
  def encode_composite(composite_type, value, registry)
184
- values =
185
- if value.instance_of?(Hash)
186
- value.values
187
- elsif value.instance_of?(Array)
188
- value
189
- else
190
- raise CompositeInvalidValue, "value: #{value}, only hash and array"
191
- end
192
-
193
188
  fields = composite_type._get(:fields)
194
- type_id_list = fields.map { |f| f._get(:type) }
195
- _encode_types(type_id_list, values, registry)
189
+ # reduce composite level when composite only has one field without name
190
+ if fields.length == 1 && fields.first._get(:name).nil?
191
+ encode(fields.first._get(:type), value, registry)
192
+ else
193
+ values =
194
+ if value.instance_of?(Hash)
195
+ value.values
196
+ elsif value.instance_of?(Array)
197
+ value
198
+ else
199
+ raise CompositeInvalidValue, "value: #{value}, only hash and array"
200
+ end
201
+
202
+ type_id_list = fields.map { |f| f._get(:type) }
203
+ _encode_types(type_id_list, values, registry)
204
+ end
196
205
  end
197
206
 
198
207
  # value:
@@ -213,11 +222,11 @@ module PortableCodec
213
222
  raise VariantInvalidValue, "type: #{variant_type}, value: #{value}"
214
223
  end
215
224
 
216
- variant = variants.find { |var| var._get(:name) == name }
217
- raise VariantItemNotFound, "type: #{variant_type}, name: #{name}" if variant.nil?
218
- raise VariantInvalidValue, "type: #{variant_type}, v: #{v}" if variant._get(:fields).length != v.length
225
+ item = variants.find { |var| var._get(:name) == name }
226
+ raise VariantItemNotFound, "type: #{variant_type}, name: #{name}" if item.nil?
227
+ raise VariantInvalidValue, "type: #{variant_type}, v: #{v}" if item._get(:fields).length != v.length
219
228
 
220
- ScaleRb.encode_uint('u8', variant._get(:index)) + encode_composite(variant, v, registry)
229
+ ScaleRb.encode_uint('u8', item._get(:index)) + encode_composite(item, v, registry)
221
230
  end
222
231
 
223
232
  def _encode_types(ids, values, registry)
@@ -1,3 +1,3 @@
1
1
  module ScaleRb
2
- VERSION = '0.1.3'
2
+ VERSION = '0.1.5'
3
3
  end
data/lib/scale_rb.rb CHANGED
@@ -9,15 +9,21 @@ 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'
17
22
 
18
23
  # client
19
- require 'substrate/rpc'
20
- require 'substrate/client'
24
+ require 'client/rpc_request_builder'
25
+ require 'client/http_client'
26
+ require 'client/abstract_ws_client'
21
27
 
22
28
  # get registry from config
23
29
  require 'registry'
@@ -2,37 +2,56 @@
2
2
 
3
3
  module StorageHelper
4
4
  class << self
5
- # params:
6
- # pallet_name: module name
7
- # method_name: storage name
8
- # params: {
9
- # values: values,
10
- # type_ids: type_ids,
11
- # hashers: hashers,
12
- # }
13
- # registry: portable_types_registry
14
- def encode_storage_key(pallet_name, method_name, params = nil, registry = nil)
15
- pallet_method_key = Hasher.twox128(pallet_name) + Hasher.twox128(method_name)
5
+ # key: {
6
+ # value: ,
7
+ # type: ,
8
+ # hashers: []
9
+ # }
10
+ def encode_storage_key(pallet_name, item_name, key = nil, registry = nil)
11
+ storage_key = Hasher.twox128(pallet_name) + Hasher.twox128(item_name)
16
12
 
17
- if params.nil?
18
- pallet_method_key
19
- else
20
- values = params[:values]
21
- type_ids = params[:type_ids]
22
- hashers = params[:hashers]
13
+ if key && registry
14
+
15
+ types, values =
16
+ if key[:hashers].length == 1
17
+ [
18
+ [key[:type]],
19
+ [key[:value]]
20
+ ]
21
+ else
22
+ [
23
+ registry[key[:type]]._get(:def)._get(:tuple),
24
+ key[:value]
25
+ ]
26
+ end
23
27
 
24
- pallet_method_key + PortableCodec._encode_types_with_hashers(type_ids, values, registry, hashers)
28
+ storage_key + PortableCodec._encode_types_with_hashers(types, values, registry, key[:hashers])
29
+ else
30
+ storage_key
25
31
  end
26
32
  end
27
33
 
28
- def build_params(param_values, storage_key_type_id, hashers, registry)
29
- type_ids = registry._get(storage_key_type_id)._get(:def)._get(:tuple)
30
- type_ids = [storage_key_type_id] if type_ids.nil?
31
- {
32
- values: param_values,
33
- type_ids: type_ids,
34
- hashers: hashers
35
- }
34
+ # data: hex string
35
+ # type: portable type id
36
+ # optional: boolean
37
+ # fallback: hex string
38
+ def decode_storage(data, type, optional, fallback, registry)
39
+ data ||= (optional ? nil : fallback)
40
+ PortableCodec.decode(type, data.to_bytes, registry)[0]
41
+ end
42
+
43
+ # storage_item: the storage item from metadata
44
+ def decode_storage2(data, storage_item, registry)
45
+ modifier = storage_item._get(:modifier) # Default | Optional
46
+ fallback = storage_item._get(:fallback)
47
+ type = storage_item._get(:type)._get(:plain) || storage_item._get(:type)._get(:map)._get(:value)
48
+ decode_storage(data, type, modifier == 'Optional', fallback, registry)
49
+ end
50
+
51
+ def decode_storage3(data, pallet_name, item_name, metadata)
52
+ registry = Metadata.build_registry(metadata)
53
+ storage_item = Metadata.get_storage_item(pallet_name, item_name, metadata)
54
+ decode_storage2(data, storage_item, registry)
36
55
  end
37
56
  end
38
57
  end
data/scale_rb.gemspec CHANGED
@@ -26,6 +26,6 @@ Gem::Specification.new do |spec|
26
26
  spec.require_paths = ['lib']
27
27
 
28
28
  # for hashers
29
- spec.add_dependency 'blake2b_rs', '~> 0.1.2'
29
+ spec.add_dependency 'blake2b_rs', '~> 0.1.4'
30
30
  spec.add_dependency 'xxhash'
31
31
  end
metadata CHANGED
@@ -1,14 +1,14 @@
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.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Aki Wu
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-10-13 00:00:00.000000000 Z
11
+ date: 2023-03-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: blake2b_rs
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 0.1.2
19
+ version: 0.1.4
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.1.2
26
+ version: 0.1.4
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: xxhash
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -59,18 +59,24 @@ files:
59
59
  - bin/console
60
60
  - bin/setup
61
61
  - exe/metadata
62
+ - lib/client/abstract_ws_client.rb
63
+ - lib/client/http_client.rb
64
+ - lib/client/rpc_request_builder.rb
62
65
  - lib/codec.rb
63
66
  - lib/hasher.rb
64
- - lib/metadata.rb
65
- - lib/metadata_v14.rb
67
+ - lib/metadata/metadata.rb
68
+ - lib/metadata/metadata_v10.rb
69
+ - lib/metadata/metadata_v11.rb
70
+ - lib/metadata/metadata_v12.rb
71
+ - lib/metadata/metadata_v13.rb
72
+ - lib/metadata/metadata_v14.rb
73
+ - lib/metadata/metadata_v9.rb
66
74
  - lib/monkey_patching.rb
67
75
  - lib/portable_codec.rb
68
76
  - lib/registry.rb
69
77
  - lib/scale_rb.rb
70
78
  - lib/scale_rb/version.rb
71
79
  - lib/storage_helper.rb
72
- - lib/substrate/client.rb
73
- - lib/substrate/rpc.rb
74
80
  - scale_rb.gemspec
75
81
  homepage: https://github.com/wuminzhe/scale_rb
76
82
  licenses:
@@ -93,7 +99,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
93
99
  - !ruby/object:Gem::Version
94
100
  version: '0'
95
101
  requirements: []
96
- rubygems_version: 3.1.4
102
+ rubygems_version: 3.3.7
97
103
  signing_key:
98
104
  specification_version: 4
99
105
  summary: New Ruby SCALE Codec Library