scale_rb 0.1.3 → 0.1.5

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: f83289d7a27bca72fe9e21e43f2b06ff29e191e47b9e1397cb96ea1adf6ee6c0
4
+ data.tar.gz: a1e77aaffcbc32aa795cb9cd57303f71a3fc1477c42e2540034d9060dc88a415
5
5
  SHA512:
6
- metadata.gz: 50ee90afbb3f5a9b27676912608dfa8de48bac33e8e19f1e21ee5db8f2aa1cf4c21f95cfca27e3bc6220481312bb57254004a8f219f6b6d1be94b295c47ffd68
7
- data.tar.gz: 7cdedc298adc696bb5a3df76c63710c13863a86d4c066f7a9fe2767bd349cb7f71ed4f26490faa3a77abb8022144102396b407f6ce02e9d8d10c8029f754a451
6
+ metadata.gz: 26a88e5148bd175700d992542ea490dfd97b298b24dd8a6955fa24e276c12a8018b914c9c2f321b59cce4d8be24ceda7674814a83495a6079bebef43f8407d7a
7
+ data.tar.gz: 74e818ab1e4d56caac4b78de0e15545b53e86361a5557fa72eae7e8310dec0b09a101590551e5b6d5b218d41c690e6eaea6221a84a93a14c904620724390aaf0
data/.gitignore CHANGED
@@ -6,6 +6,7 @@
6
6
  /pkg/
7
7
  /spec/reports/
8
8
  /tmp/
9
+ /.idea/
9
10
 
10
11
  # rspec failure tracking
11
12
  .rspec_status
data/Gemfile.lock CHANGED
@@ -1,14 +1,14 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- scale_rb (0.1.3)
5
- blake2b_rs (~> 0.1.2)
4
+ scale_rb (0.1.5)
5
+ blake2b_rs (~> 0.1.4)
6
6
  xxhash
7
7
 
8
8
  GEM
9
9
  remote: https://rubygems.org/
10
10
  specs:
11
- blake2b_rs (0.1.3)
11
+ blake2b_rs (0.1.4)
12
12
  ffi (~> 1.0)
13
13
  thermite (~> 0)
14
14
  diff-lcs (1.5.0)
data/README.md CHANGED
@@ -2,6 +2,9 @@
2
2
 
3
3
  *WARNING: UNDER DEVELOPMENT*
4
4
 
5
+ * Only support metadata v14.
6
+ * Http & WebSocket client helper. No Client in this repo.
7
+
5
8
  ## Installation
6
9
 
7
10
  Add this line to your application's Gemfile:
data/exe/metadata CHANGED
@@ -6,7 +6,7 @@ require 'json'
6
6
  require 'optparse'
7
7
 
8
8
  def print_metadata(url, at = nil)
9
- puts JSON.pretty_generate(Substrate::Client.get_metadata(url, at))
9
+ puts JSON.pretty_generate(HttpClient.get_metadata(url, at))
10
10
  end
11
11
 
12
12
  # ./bin/metadata http://g2.dev.darwinia.network:2234 -b 0x23ebddd6519aaf1b7fc916c3709af13d7a4010943fb53038406581171000a58e
@@ -31,10 +31,10 @@ else
31
31
  block_hash = @options[:block]
32
32
  else
33
33
  block_number = @options[:block].to_i
34
- block_hash = Substrate::RPC.chain_getBlockHash url, block_number
34
+ block_hash = HttpClient.chain_getBlockHash url, block_number
35
35
  end
36
36
  else
37
- block_hash = Substrate::RPC.chain_getBlockHash url
37
+ block_hash = HttpClient.chain_getBlockHash url
38
38
  end
39
39
 
40
40
  print_metadata url, block_hash
@@ -0,0 +1,100 @@
1
+ # frozen_string_literal: true
2
+
3
+ class AbstractWsClient
4
+ extend RpcRequestBuilder
5
+ attr_accessor :metadata, :registry
6
+
7
+ def initialize
8
+ @id = 0
9
+ @metadata = nil
10
+ @registry = nil
11
+ @callbacks = {}
12
+ @subscription_callbacks = {}
13
+ end
14
+
15
+ def send_json_rpc(_body)
16
+ raise 'WsClient is a abstract base class for websocket client, please use its sub-class'
17
+ end
18
+
19
+ # changes: [
20
+ # [
21
+ # "0x26aa394eea5630e07c48ae0c9558cef780d41e5e16056765bc8461851072c9d7", # storage key
22
+ # "0x0400000000000000d887690900000000020000" # change
23
+ # ]
24
+ # ]
25
+ def process(resp)
26
+ # handle id
27
+ @callbacks[resp['id']]&.call(resp['id'], resp) if resp['id']
28
+
29
+ # handle storage subscription
30
+ return unless resp['params'] && resp['params']['subscription']
31
+ return unless @metadata && @registry
32
+
33
+ subscription = resp['params']['subscription']
34
+ changes = resp['params']['result']['changes']
35
+ block = resp['params']['result']['block']
36
+ p "block: #{block}"
37
+
38
+ return unless @subscription_callbacks[subscription]
39
+
40
+ pallet_name, item_name, subscription_callback = @subscription_callbacks[subscription]
41
+ storage_item = Metadata.get_storage_item(pallet_name, item_name, @metadata)
42
+ storages = decode_storages(changes.map(&:last), storage_item, registry)
43
+ subscription_callback.call(storages)
44
+ end
45
+
46
+ def get_metadata(callback = nil)
47
+ if callback.nil?
48
+ callback = lambda do |id, resp|
49
+ return unless resp['id'] && resp['result']
50
+ return if resp['id'] != id
51
+
52
+ metadata_hex = resp['result']
53
+ metadata = Metadata.decode_metadata(metadata_hex.strip.to_bytes)
54
+ return unless metadata
55
+
56
+ @metadata = metadata
57
+ @registry = Metadata.build_registry(@metadata)
58
+ end
59
+ end
60
+
61
+ id = bind_id_to(callback)
62
+ body = state_getMetadata(id)
63
+ send_json_rpc(body)
64
+ end
65
+
66
+ def subscribe_storage(pallet_name, item_name, subscription_callback, key = nil, registry = nil)
67
+ callback = create_callback_for_subscribe_storage(pallet_name, item_name, subscription_callback)
68
+ id = bind_id_to(callback)
69
+ body = derived_state_subscribe_storage(id, pallet_name, item_name, key, registry)
70
+ send_json_rpc(body)
71
+ end
72
+
73
+ private
74
+
75
+ def bind_id_to(callback)
76
+ @callbacks[@id] = callback
77
+ old = @id
78
+ @id += 1
79
+ old
80
+ end
81
+
82
+ def decode_storages(datas, storage_item, registry)
83
+ datas.map do |data|
84
+ StorageHelper.decode_storage2(data, storage_item, registry)
85
+ end
86
+ end
87
+
88
+ def create_callback_for_subscribe_storage(pallet_name, item_name, subscription_callback)
89
+ lambda do |id, resp|
90
+ return unless resp['id'] && resp['result']
91
+ return if resp['id'] != id
92
+
93
+ @subscription_callbacks[resp['result']] = [
94
+ pallet_name,
95
+ item_name,
96
+ subscription_callback
97
+ ]
98
+ end
99
+ end
100
+ end
@@ -1,15 +1,49 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module Substrate
4
- module Client
3
+ require 'uri'
4
+ require 'net/http'
5
+ require 'json'
6
+
7
+ module ScaleRb
8
+ module HttpClient
9
+ extend RpcRequestBuilder
10
+
5
11
  class << self
12
+ def request(url, body)
13
+ uri = URI(url)
14
+ req = Net::HTTP::Post.new(uri, 'Content-Type' => 'application/json')
15
+ req.body = body
16
+ http = Net::HTTP.new(uri.host, uri.port)
17
+ http.use_ssl = true if uri.instance_of? URI::HTTPS
18
+ res = http.request(req)
19
+ # puts res unless res.is_a?(Net::HTTPSuccess)
20
+
21
+ result = JSON.parse(res.body)
22
+ raise result['error'] if result['error']
23
+
24
+ result['result']
25
+ end
26
+
27
+ def json_rpc_call(url, method, *params)
28
+ body = build_json_rpc_body(method, params, Time.now.to_i)
29
+ request(url, body)
30
+ end
31
+
32
+ def respond_to_missing?(*_args)
33
+ true
34
+ end
35
+
36
+ def method_missing(method, *args)
37
+ json_rpc_call(args[0], method, *args[1..])
38
+ end
39
+
6
40
  def get_metadata(url, at = nil)
7
- hex = Substrate::RPC.state_getMetadata(url, at)
41
+ hex = state_getMetadata(url, at)
8
42
  Metadata.decode_metadata(hex.strip.to_bytes)
9
43
  end
10
44
 
11
45
  def query_storage_at(url, storage_keys, type_id, default, registry, at = nil)
12
- result = Substrate::RPC.state_queryStorageAt(url, storage_keys, at)
46
+ result = state_queryStorageAt(url, storage_keys, at)
13
47
  result.map do |item|
14
48
  item['changes'].map do |change|
15
49
  storage_key = change[0]
@@ -21,7 +55,7 @@ module Substrate
21
55
  end
22
56
 
23
57
  def get_storage_keys_by_partial_key(url, partial_storage_key, start_key = nil, at = nil)
24
- storage_keys = Substrate::RPC.state_getKeysPaged(url, partial_storage_key, 1000, start_key, at)
58
+ storage_keys = state_getKeysPaged(url, partial_storage_key, 1000, start_key, at)
25
59
  if storage_keys.length == 1000
26
60
  storage_keys + get_storage_keys_by_partial_key(url, partial_storage_key, storage_keys.last, at)
27
61
  else
@@ -43,14 +77,6 @@ module Substrate
43
77
  end.flatten
44
78
  end
45
79
 
46
- # type_id: result type id
47
- def get_storage(url, storage_key, type_id, default, registry, at = nil)
48
- data = Substrate::RPC.state_getStorage(url, storage_key, at) || default
49
- return nil if data.nil?
50
-
51
- PortableCodec.decode(type_id, data.to_bytes, registry)[0]
52
- end
53
-
54
80
  # 1. Plain
55
81
  # key: nil
56
82
  # value: { type: 3, modifier: 'Default', callback: '' }
@@ -78,7 +104,7 @@ module Substrate
78
104
  # },
79
105
  # ..
80
106
  #
81
- def get_storage2(url, pallet_name, item_name, key, value, registry, at = nil)
107
+ def get_storage(url, pallet_name, item_name, key, value, registry, at = nil)
82
108
  # map, but no key's value provided. get all storages under the partial storage key
83
109
  if !key.nil? && key[:value].nil?
84
110
  partial_storage_key = StorageHelper.encode_storage_key(pallet_name, item_name).to_hex
@@ -91,20 +117,13 @@ module Substrate
91
117
  at
92
118
  )
93
119
  else
94
- params = (StorageHelper.build_params(key[:value], key[:type], key[:hashers], registry) unless key.nil?)
95
- storage_key = StorageHelper.encode_storage_key(pallet_name, item_name, params, registry).to_hex
96
- get_storage(
97
- url,
98
- storage_key,
99
- value[:type],
100
- value[:modifier] == 'Default' ? value[:fallback] : nil,
101
- registry,
102
- at
103
- )
120
+ storage_key = StorageHelper.encode_storage_key(pallet_name, item_name, key, registry).to_hex
121
+ data = state_getStorage(url, storage_key, at)
122
+ StorageHelper.decode_storage(data, value[:type], value[:modifier] == 'Optional', value[:fallback], registry)
104
123
  end
105
124
  end
106
125
 
107
- def get_storage3(url, pallet_name, item_name, value_of_key, metadata, at = nil)
126
+ def get_storage2(url, pallet_name, item_name, value_of_key, metadata, at = nil)
108
127
  raise 'metadata should not be nil' if metadata.nil?
109
128
 
110
129
  registry = Metadata.build_registry(metadata)
@@ -116,6 +135,7 @@ module Substrate
116
135
 
117
136
  plain = type._get(:plain)
118
137
  map = type._get(:map)
138
+
119
139
  key, value =
120
140
  if plain
121
141
  [
@@ -130,8 +150,8 @@ module Substrate
130
150
  else
131
151
  raise 'NoSuchStorageType'
132
152
  end
133
- get_storage2(url, pallet_name, item_name, key, value, registry, at)
153
+ get_storage(url, pallet_name, item_name, key, value, registry, at)
134
154
  end
135
155
  end
136
156
  end
137
- end
157
+ end
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'json'
4
+
5
+ module RpcRequestBuilder
6
+ def build_json_rpc_body(method, params, id)
7
+ {
8
+ 'id' => id,
9
+ 'jsonrpc' => '2.0',
10
+ 'method' => method,
11
+ 'params' => params.reject(&:nil?)
12
+ }.to_json
13
+ end
14
+
15
+ def respond_to_missing?(*_args)
16
+ true
17
+ end
18
+
19
+ # example:
20
+ # state_getStorage(1, '0x363a..', 563_868)
21
+ #
22
+ # ==
23
+ #
24
+ # build_json_rpc_body('state_getStorage', ['0x363a..', 563_868], 1)
25
+ def method_missing(method, *args)
26
+ build_json_rpc_body(method, args[1..], args[0])
27
+ end
28
+
29
+ ###################################
30
+ # derived functions
31
+ ###################################
32
+ def derived_state_get_storage(rpc_id, pallet_name, item_name, key = nil, registry = nil)
33
+ storage_key = StorageHelper.encode_storage_key(pallet_name, item_name, key, registry).to_hex
34
+ state_getStorage(rpc_id, [storage_key])
35
+ end
36
+
37
+ def derived_state_subscribe_storage(rpc_id, pallet_name, item_name, key = nil, registry = nil)
38
+ storage_key = StorageHelper.encode_storage_key(pallet_name, item_name, key, registry).to_hex
39
+ state_subscribeStorage(rpc_id, [storage_key])
40
+ end
41
+
42
+ def derived_eth_call(rpc_id, to, data, at = nil)
43
+ eth_call(
44
+ rpc_id,
45
+ [
46
+ {
47
+ 'from' => nil, 'to' => to, 'data' => data
48
+ },
49
+ at
50
+ ]
51
+ )
52
+ end
53
+ end
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
+ version = metadata._get(:metadata).keys.first
19
+ raise ScaleRb::NotImplemented, metadata._get(:metadata).keys.first unless %w[v9 v10 v11 v12 v13 v14].include?(version.to_s)
20
+
21
+ Metadata.const_get("Metadata#{version.upcase}").get_storage_item(pallet_name, item_name, metadata)
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