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.
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