scale_rb 0.5.1 → 0.5.2

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: 75a96df563f9cf0f827e034820d94316a898c4b3cab693524ee092b116c28146
4
- data.tar.gz: 55201185ee42018db38f922fced2a30230f43f551274bbfd495dc386ac6b440d
3
+ metadata.gz: e8d513edcbe185b4b84fa7e7f9a89f9787e658e79a42aac9843d0d225f5f1ecd
4
+ data.tar.gz: 14ed9841bb41104aa9a064b45f3f170c77f4c8aeb1eddd015d4cc62587c8d0e6
5
5
  SHA512:
6
- metadata.gz: 281c57184f73484c691b0be6076b0fb101428a0d980b3733550d0be25584cef103ff60650a671878ce03480724190308176a5c75b2c0f4faf906c3a7dae1e15b
7
- data.tar.gz: 3be191954b301954da10e579ac326ab3cfe9c98d21d7205580ed1816b5ee1946bf08d8e4f13d4a9db17229aea6bfcac6265d80e11b23d613a33c744aa1890be4
6
+ metadata.gz: 1488b38cb5b710b3f438508c14a6aff777d7374d12c25badbdf05ff8dd745ad64512b4e0dddbcc718a0e344aa518de50b95f9d0594a0e55f15981d7043f85672
7
+ data.tar.gz: 5ee07ecf3b77535a52944ee1f68fb49558f4a0b276727121e029c19e73faff2eb48be6598ea91b82aac0477075c4f76f8b962c9dddd9ecef3a2d1514ae041b24
data/bin/console CHANGED
File without changes
@@ -0,0 +1,84 @@
1
+ require 'scale_rb'
2
+
3
+ client = ScaleRb::HttpClient.new('https://polkadot-rpc.dwellir.com')
4
+ puts format('%20s: %s', 'supported_methods', client.supported_methods.join(', '))
5
+
6
+ block_number = 22_931_689
7
+ puts format('%20s: %d', 'block_number', block_number)
8
+
9
+ block_hash = client.chain_getBlockHash(block_number)
10
+ puts format('%20s: %s', 'block_hash', block_hash)
11
+
12
+ runtime_version = client.state_getRuntimeVersion(block_hash)
13
+ puts format('%20s: %s', 'spec_name', runtime_version[:specName])
14
+ puts format('%20s: %s', 'spec_version', runtime_version[:specVersion])
15
+
16
+ metadata = client.get_metadata(block_hash)
17
+
18
+ ######################################
19
+ # Events
20
+ ######################################
21
+ events = client.get_storage('System', 'Events', block_hash:, metadata:)
22
+ events.each_with_index do |event, index|
23
+ puts format('%20s: %d', 'event index', index)
24
+ puts format('%20s: %s', 'event', event)
25
+ end
26
+
27
+ ######################################
28
+ # Validators
29
+ ######################################
30
+ validators = client.get_storage('Session', 'Validators', block_hash:, metadata:)
31
+ validators.each_with_index do |validator, index|
32
+ puts format('%20s: %d', 'validator index', index)
33
+ puts format('%20s: %s', 'validator', ScaleRb::Utils.u8a_to_hex(validator))
34
+ end
35
+
36
+ ######################################
37
+ # Block
38
+ ######################################
39
+ blockResult = client.chain_getBlock(block_hash)
40
+
41
+ block = blockResult[:block]
42
+ justifications = blockResult[:justifications]
43
+ puts format('%20s: %s', 'justifications', justifications)
44
+
45
+ header = block[:header]
46
+
47
+ parent_hash = header[:parentHash]
48
+ puts format('%20s: %s', 'parent_hash', parent_hash)
49
+
50
+ state_root = header[:stateRoot]
51
+ puts format('%20s: %s', 'state_root', state_root)
52
+
53
+ extrinsics_root = header[:extrinsicsRoot]
54
+ puts format('%20s: %s', 'extrinsics_root', extrinsics_root)
55
+
56
+ digest_logs = header[:digest][:logs]
57
+ pre_runtime_log = nil
58
+ digest_logs.each_with_index do |digest_log, index|
59
+ decoded, = ScaleRb::Codec.decode(
60
+ metadata.digest_item_type_id,
61
+ ScaleRb::Utils.hex_to_u8a(digest_log),
62
+ metadata.registry
63
+ )
64
+ puts format('%20s: %d', 'log index', index)
65
+ puts format('%20s: %s', 'log', decoded)
66
+
67
+ # check if decoded has a key of "PreRuntime"
68
+ pre_runtime_log = decoded[:PreRuntime] if decoded.key?(:PreRuntime)
69
+ end
70
+
71
+ engine = pre_runtime_log[0]
72
+ puts format('%20s: %s', 'engine', ScaleRb::Utils.u8a_to_utf8(engine))
73
+ data = pre_runtime_log[1] # if engine is BABE, data's type is sp_consensus_babe::digests::PreDigest
74
+ authority_index, = ScaleRb::CodecUtils.decode_uint('U32', data[1..]) # we don't need to decode the data, but get the authority_index
75
+ puts format('%20s: %d', 'authority_index', authority_index)
76
+ author = validators[authority_index]
77
+ puts format('%20s: %s', 'author', ScaleRb::Utils.u8a_to_hex(author))
78
+
79
+ extrinsics = block[:extrinsics]
80
+ extrinsics.each_with_index do |extrinsic, index|
81
+ puts format('%20s: %d', 'extrinsic index', index)
82
+ decoded = ScaleRb::ExtrinsicHelper.decode_extrinsic(ScaleRb::Utils.hex_to_u8a(extrinsic), metadata)
83
+ puts format('%20s: %s', 'extrinsic', decoded)
84
+ end
data/exe/metadata CHANGED
@@ -35,5 +35,5 @@ else
35
35
  end
36
36
 
37
37
  metadata = client.get_metadata(block_hash)
38
- puts JSON.pretty_generate(metadata)
38
+ puts metadata.to_json
39
39
  end
@@ -9,7 +9,7 @@ module ScaleRb
9
9
  # "0x05000a1287977578f888bdc1c7627781af1cc000e6ab1300004c31b8d9a798"._to_bytes
10
10
  def self.decode_call(callbytes, metadata)
11
11
  pallet_index = callbytes[0]
12
- pallet = Metadata.get_module_by_index(pallet_index, metadata)
12
+ pallet = metadata.pallet_by_index(pallet_index)
13
13
 
14
14
  # Remove the pallet_index
15
15
  # The callbytes we used below should not contain the pallet index.
@@ -20,7 +20,7 @@ module ScaleRb
20
20
  decoded = Codec.decode(
21
21
  calls_type_id,
22
22
  callbytes_without_pallet_index,
23
- Metadata.build_registry(metadata)
23
+ metadata.build_registry
24
24
  )&.first
25
25
 
26
26
  {
@@ -34,9 +34,9 @@ module ScaleRb
34
34
  # {:pallet_name=>"Deposit", :call_name=>"claim", :call=>:claim]}
35
35
  # {:pallet_name=>"Balances", :call_name=>"transfer", :call=>{:transfer=>{:dest=>[10, 18, 135, 151, 117, 120, 248, 136, 189, 193, 199, 98, 119, 129, 175, 28, 192, 0, 230, 171], :value=>11000000000000000000}}]}
36
36
  def self.encode_call(call, metadata)
37
- calls_type_id = Metadata.get_calls_type_id(call[:pallet_name], metadata)
38
- pallet_index = Metadata.get_module(call[:pallet_name], metadata)._get(:index)
39
- [pallet_index] + Codec.encode(calls_type_id, call[:call], Metadata.build_registry(metadata))
37
+ calls_type_id = metadata.calls_type_id(call[:pallet_name])
38
+ pallet_index = metadata.pallet(call[:pallet_name])[:index]
39
+ [pallet_index] + Codec.encode(calls_type_id, call[:call], metadata.build_registry)
40
40
  end
41
41
  end
42
42
  end
@@ -1,11 +1,11 @@
1
1
  module ScaleRb
2
2
  # This module is used to add extra methods to both the ScaleRb::WsClient ScaleRb::HttpClient
3
- module ClientExt
3
+ module ClientShare
4
4
  # get decoded metadata at block_hash
5
5
  def get_metadata(block_hash = nil)
6
6
  block_hash ||= chain_getHead
7
7
  metadata_hex = state_getMetadata(block_hash)
8
- Metadata.decode_metadata(metadata_hex)
8
+ Metadata::Metadata.from_hex(metadata_hex)
9
9
  end
10
10
 
11
11
  # Get decoded storage at block_hash
@@ -30,6 +30,14 @@ module ScaleRb
30
30
  )
31
31
  end
32
32
 
33
+ def respond_to_missing?(*_args)
34
+ true
35
+ end
36
+
37
+ def method_missing(method, *args)
38
+ request(method.to_s, args)
39
+ end
40
+
33
41
  private
34
42
 
35
43
  def query_storage_at(block_hash, storage_keys, type_id, default, registry)
@@ -134,10 +142,8 @@ module ScaleRb
134
142
  def get_storage2(block_hash, pallet_name, item_name, params, metadata)
135
143
  raise 'Metadata should not be nil' if metadata.nil?
136
144
 
137
- registry = Metadata.build_registry(metadata)
138
- item = Metadata.get_storage_item(
139
- pallet_name, item_name, metadata
140
- )
145
+ registry = metadata.registry
146
+ item = metadata.storage(pallet_name, item_name)
141
147
  raise "No such storage item: `#{pallet_name}`.`#{item_name}`" if item.nil?
142
148
 
143
149
  modifier = item._get(:modifier) # Default | Optional
@@ -4,11 +4,11 @@ require 'uri'
4
4
  require 'net/http'
5
5
  require 'json'
6
6
 
7
- require_relative 'client_ext'
7
+ require_relative 'client_share'
8
8
 
9
9
  module ScaleRb
10
10
  class HttpClient
11
- include ClientExt
11
+ include ClientShare
12
12
  attr_accessor :supported_methods
13
13
 
14
14
  def initialize(url)
@@ -2,7 +2,7 @@ require 'async'
2
2
  require 'async/websocket/client'
3
3
  require 'async/http/endpoint'
4
4
 
5
- require_relative 'client_ext'
5
+ require_relative 'client_share'
6
6
 
7
7
  module ScaleRb
8
8
  class WsClient
@@ -52,7 +52,7 @@ end
52
52
 
53
53
  module ScaleRb
54
54
  class WsClient
55
- include ClientExt
55
+ include ClientShare
56
56
  attr_accessor :supported_methods
57
57
 
58
58
  def initialize(connection)
@@ -19,6 +19,7 @@ module ScaleRb
19
19
  when CompactType then decode_compact(bytes)
20
20
  when ArrayType then decode_array(type, bytes, registry)
21
21
  when SequenceType then decode_sequence(type, bytes, registry)
22
+ when BitSequenceType then decode_bit_sequence(type, bytes)
22
23
  when TupleType then decode_tuple(type, bytes, registry)
23
24
  when StructType then decode_struct(type, bytes, registry)
24
25
  when UnitType then [[], bytes]
@@ -65,6 +66,22 @@ module ScaleRb
65
66
  _decode_types([sequence_type.type] * len, remaining_bytes, registry)
66
67
  end
67
68
 
69
+ __ :decode_bit_sequence, { sequence_type: BitSequenceType, bytes: U8Array }, DecodeResult[TypedArray[Any]]
70
+ def decode_bit_sequence(sequence_type, bytes)
71
+ ScaleRb.logger.debug("Decoding bit sequence: #{sequence_type}, bytes: #{bytes.length} bytes")
72
+
73
+ bit_len, remaining_bytes = decode_compact(bytes)
74
+ byte_len = (bit_len / 8.0).ceil
75
+ the_bytes, remaining_bytes = [remaining_bytes[0...byte_len], remaining_bytes[byte_len..]]
76
+ [
77
+ {
78
+ bytes: the_bytes,
79
+ bit_len: bit_len
80
+ },
81
+ remaining_bytes
82
+ ]
83
+ end
84
+
68
85
  __ :decode_tuple, { tuple_type: TupleType, bytes: U8Array, registry: Registry }, DecodeResult[TypedArray[Any] | Any]
69
86
  def decode_tuple(tuple_type, bytes, registry)
70
87
  ScaleRb.logger.debug("Decoding tuple: #{tuple_type}, bytes: #{bytes.length} bytes")
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ScaleRb
4
+ module ExtrinsicHelper
5
+ class << self
6
+ def decode_extrinsic(bytes, metadata)
7
+ extrinsic_hash = "0x#{Blake2b.hex(bytes, 32)}"
8
+
9
+ _, remaining_bytes = ScaleRb::Codec.decode_compact(bytes)
10
+ meta, remaining_bytes = [remaining_bytes[0], remaining_bytes[1..]]
11
+ signed = (meta & 0x80) == 0x80
12
+ version = (meta & 0x7f)
13
+
14
+ raise "Unsupported version: #{version}" unless version == 4
15
+
16
+ if signed
17
+ # puts "signed"
18
+ signature, remaining_bytes = ScaleRb::Codec.decode(
19
+ metadata.signature_type_id,
20
+ remaining_bytes,
21
+ metadata.registry
22
+ )
23
+ call, = ScaleRb::Codec.decode(
24
+ metadata.runtime_call_type_id,
25
+ remaining_bytes,
26
+ metadata.registry
27
+ )
28
+ {
29
+ version: 4,
30
+ signature: signature,
31
+ call: call,
32
+ extrinsic_hash: extrinsic_hash
33
+ }
34
+ else
35
+ # puts "unsigned"
36
+ call, = ScaleRb::Codec.decode(
37
+ metadata.runtime_call_type_id,
38
+ remaining_bytes,
39
+ metadata.registry
40
+ )
41
+ {
42
+ version: 4,
43
+ call: call,
44
+ extrinsic_hash: extrinsic_hash
45
+ }
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative './registry'
4
-
5
3
  require_relative './metadata_v9'
6
4
  require_relative './metadata_v10'
7
5
  require_relative './metadata_v11'
@@ -13,94 +11,245 @@ require_relative './metadata_v14'
13
11
  # https://github.com/paritytech/frame-metadata/blob/main/frame-metadata/src/lib.rs#L85
14
12
  module ScaleRb
15
13
  module Metadata
16
- class << self
17
- def decode_metadata(hex)
18
- bytes = ScaleRb::Utils.hex_to_u8a(hex)
14
+ class Metadata
15
+ attr_reader :magic_number, :version, :metadata, :registry, :address_type_id, :runtime_call_type_id, :digest_type_id,
16
+ :digest_item_type_id, :event_record_list_type_id, :event_record_type_id, :event_type_id, :signature_type_id
17
+
18
+ # Runtime type ids
19
+ attr_reader :unchecked_extrinsic_type_id
20
+
21
+ def initialize(metadata_prefixed, unchecked_extrinsic_type_id = nil)
22
+ @metadata_prefixed = metadata_prefixed
23
+ @magic_number = @metadata_prefixed[:magicNumber]
24
+ metadata = @metadata_prefixed[:metadata]
25
+ @version = metadata.keys.first
26
+ raise "Unsupported metadata version: #{@version}" unless :V14 == @version
27
+
28
+ @metadata = metadata[@version]
29
+ @registry = ScaleRb::PortableRegistry.new(@metadata.dig(:lookup, :types))
30
+
31
+ # Runtime type ids
32
+ @unchecked_extrinsic_type_id = unchecked_extrinsic_type_id || find_unchecked_extrinsic_type_id
33
+ @address_type_id = find_address_type_id
34
+ @runtime_call_type_id = find_runtime_call_type_id
35
+
36
+ @digest_type_id = find_digest_type_id
37
+ @digest_item_type_id = find_digest_item_type_id
38
+
39
+ @event_record_list_type_id = find_event_record_list_type_id
40
+ @event_record_type_id = find_event_record_type_id
41
+ @event_type_id = find_event_type_id
42
+
43
+ @signature_type_id = build_signature_type_id
44
+ end
45
+
46
+ def self.from_hex(hex)
47
+ metadata_prefixed, = ScaleRb::Codec.decode('MetadataPrefixed', Utils.hex_to_u8a(hex), OldRegistry.new(TYPES))
48
+ Metadata.new(metadata_prefixed)
49
+ end
50
+
51
+ def self.from_json(str)
52
+ metadata_prefixed = JSON.parse(str, symbolize_names: true)
53
+ Metadata.new(metadata_prefixed)
54
+ end
55
+
56
+ def to_json(*_args)
57
+ JSON.pretty_generate(@metadata_prefixed)
58
+ end
59
+
60
+ def pallet(pallet_name)
61
+ @metadata[:pallets].find do |pallet|
62
+ pallet[:name] == pallet_name
63
+ end
64
+ end
65
+
66
+ def pallet_by_index(pallet_index)
67
+ @metadata[:pallets].find do |pallet|
68
+ pallet[:index] == pallet_index
69
+ end
70
+ end
71
+
72
+ def storage(pallet_name, item_name)
73
+ pallet = pallet(pallet_name)
74
+ raise "Pallet `#{pallet_name}` not found" if pallet.nil?
75
+
76
+ pallet.dig(:storage, :items).find do |item|
77
+ item[:name] == item_name
78
+ end
79
+ end
19
80
 
20
- registry = ScaleRb::Metadata::Registry.new TYPES
21
- metadata, = ScaleRb::Codec.decode('MetadataPrefixed', bytes, registry)
22
- metadata
81
+ def error(pallet_index, error_index)
82
+ pallet = pallet_by_index(pallet_index)
83
+ raise "Pallet `#{pallet_index}` not found" if pallet.nil?
84
+
85
+ errors_type_id = pallet.dig(:errors, :type)
86
+ errors_type = @registry[errors_type_id]
87
+ error_variant = errors_type.variants.find do |variant|
88
+ variant.index == error_index
89
+ end
90
+ raise "Error `#{error_index}` not found" if errors_type.nil?
91
+
92
+ [
93
+ pallet[:name], error_variant.name.to_s
94
+ ]
95
+ end
96
+
97
+ #########################################################################
98
+
99
+ # % pallet_call_type :: [String, String] -> SimpleVariant | TupleVariant | StructVariant
100
+ def pallet_call_type(pallet_name, call_name)
101
+ calls_type_id = pallet_calls_type_id(pallet_name)
102
+
103
+ calls_type = @registry[calls_type_id] # #<ScaleRb::Types::VariantType ...>
104
+ raise 'Calls type is not correct' if calls_type.nil?
105
+
106
+ calls_type.variants.find do |variant|
107
+ variant.name.to_s.downcase == call_name.downcase
108
+ end
109
+ end
110
+
111
+ def pallet_call_names(pallet_name)
112
+ calls_type_id = pallet_calls_type_id(pallet_name)
113
+ return [] if calls_type_id.nil?
114
+
115
+ calls_type = @registry[calls_type_id] # #<ScaleRb::Types::VariantType ...>
116
+ raise 'Calls type is not correct' if calls_type.nil?
117
+
118
+ calls_type.variants.map do |variant|
119
+ variant.name.to_s
120
+ end
23
121
  end
24
122
 
25
- def build_registry(metadata_prefixed)
26
- types = ScaleRb::Utils.get(metadata_prefixed, :metadata, :V14, :lookup, :types)
27
- ScaleRb::PortableRegistry.new(types)
123
+ private
124
+
125
+ def find_unchecked_extrinsic_type_id
126
+ @registry.types.each_with_index do |type, index|
127
+ return index if type.path.first == 'sp_runtime' && type.path.last == 'UncheckedExtrinsic'
128
+ end
28
129
  end
29
130
 
30
- def get_module(pallet_name, metadata_prefixed)
31
- metadata = Utils.get(metadata_prefixed, :metadata)
32
- version = metadata.keys.first
33
- raise NotImplementedError, version unless %i[V14].include?(version)
131
+ def find_address_type_id
132
+ @registry[@unchecked_extrinsic_type_id].params.find do |param|
133
+ param.name.downcase == 'address'
134
+ end.type
135
+ end
34
136
 
35
- Metadata.const_get("Metadata#{version.upcase}").get_module(pallet_name, metadata_prefixed)
137
+ def find_runtime_call_type_id
138
+ @registry[@unchecked_extrinsic_type_id].params.find do |param|
139
+ param.name.downcase == 'call'
140
+ end.type
36
141
  end
37
142
 
38
- def get_module_by_index(pallet_index, metadata_prefixed)
39
- metadata = Utils.get(metadata_prefixed, :metadata)
40
- version = metadata.keys.first.to_sym
41
- raise NotImplementedError, version unless %i[V14].include?(version)
143
+ def find_extrinsic_signature_type_id
144
+ @registry[@unchecked_extrinsic_type_id].params.find do |param|
145
+ param.name.downcase == 'signature'
146
+ end.type
147
+ end
42
148
 
43
- Metadata.const_get("Metadata#{version.upcase}").get_module_by_index(pallet_index, metadata_prefixed)
149
+ def find_digest_type_id
150
+ storage_item = storage('System', 'Digest')
151
+ storage_item.dig(:type, :plain)
44
152
  end
45
153
 
46
- def get_storage_item(pallet_name, item_name, metadata_prefixed)
47
- metadata = Utils.get(metadata_prefixed, :metadata)
48
- version = metadata.keys.first.to_sym
49
- raise NotImplementedError, version unless %i[V14].include?(version)
154
+ def find_digest_item_type_id
155
+ # #<ScaleRb::Types::StructType registry=a_portable_registry path=["sp_runtime", "generic", "digest", "Digest"] params=[] fields=[#<ScaleRb::Types::Field name="logs" type=14>]>
156
+ digest_type = @registry[@digest_type_id]
157
+
158
+ field = digest_type.fields.find do |field|
159
+ field.name == 'logs'
160
+ end
161
+ seq = @registry[field.type]
162
+ raise 'Type is not correct' unless seq.is_a?(ScaleRb::Types::SequenceType)
163
+
164
+ seq.type
165
+ end
50
166
 
51
- Metadata.const_get("Metadata#{version.upcase}").get_storage_item(pallet_name, item_name, metadata_prefixed)
167
+ def find_event_record_list_type_id
168
+ storage_item = storage('System', 'Events')
169
+ storage_item.dig(:type, :plain)
52
170
  end
53
171
 
54
- def get_calls_type(pallet_name, metadata_prefixed)
55
- metadata = Utils.get(metadata_prefixed, :metadata)
56
- version = metadata.keys.first.to_sym
57
- raise NotImplementedError, version unless %i[V14].include?(version)
172
+ def find_event_record_type_id
173
+ seq = @registry[@event_record_list_type_id]
174
+ raise 'Type is not correct' unless seq.is_a?(ScaleRb::Types::SequenceType)
58
175
 
59
- Metadata.const_get("Metadata#{version.upcase}").get_calls_type(pallet_name, metadata_prefixed)
176
+ seq.type
60
177
  end
61
178
 
62
- def get_calls_type_id(pallet_name, metadata_prefixed)
63
- metadata = Utils.get(metadata_prefixed, :metadata)
64
- version = metadata.keys.first.to_sym
65
- raise NotImplementedError, version unless %i[V14].include?(version)
179
+ def find_event_type_id
180
+ @registry[@event_record_type_id].fields.find do |field|
181
+ field.name == 'event'
182
+ end.type
183
+ end
184
+
185
+ def build_signature_type_id
186
+ signed_extensions_type = ScaleRb::Types::StructType.new(
187
+ path: ['SignedExtensions'],
188
+ fields: @metadata[:extrinsic][:signedExtensions].map do |signed_extension|
189
+ ScaleRb::Types::Field.new(
190
+ name: signed_extension[:identifier],
191
+ type: signed_extension[:type]
192
+ )
193
+ end,
194
+ registry: @registry
195
+ )
196
+
197
+ signed_extensions_type_id = @registry.add_type(signed_extensions_type)
66
198
 
67
- Metadata.const_get("Metadata#{version.upcase}").get_calls_type_id(pallet_name, metadata_prefixed)
199
+ signature_type = ScaleRb::Types::StructType.new(
200
+ path: ['ExtrinsicSignature'],
201
+ fields: [
202
+ ScaleRb::Types::Field.new(name: 'address', type: @address_type_id),
203
+ ScaleRb::Types::Field.new(name: 'signature', type: find_extrinsic_signature_type_id),
204
+ ScaleRb::Types::Field.new(name: 'signedExtensions', type: signed_extensions_type_id)
205
+ ],
206
+ registry: @registry
207
+ )
208
+
209
+ @registry.add_type(signature_type)
68
210
  end
69
211
 
70
- def get_call_type(pallet_name, call_name, metadata_prefixed)
71
- metadata = Utils.get(metadata_prefixed, :metadata)
72
- version = metadata.keys.first.to_sym
73
- raise NotImplementedError, version unless %i[V14].include?(version)
212
+ # equals to:
213
+ # pallet = pallet(pallet_name)
214
+ # raise "Pallet `#{pallet_name}` not found" if pallet.nil?
215
+ # pallet.dig(:calls, :type)
216
+ def pallet_calls_type_id(pallet_name)
217
+ runtime_call_type = @registry[@runtime_call_type_id]
218
+ v = runtime_call_type.variants.find do |variant|
219
+ variant.name.to_s.downcase == pallet_name.downcase
220
+ end
74
221
 
75
- Metadata.const_get("Metadata#{version.upcase}").get_call_type(pallet_name, call_name, metadata_prefixed)
222
+ v&.tuple&.tuple&.first
76
223
  end
77
224
  end
78
225
 
226
+ #########################################################################
227
+
79
228
  TYPES = {
80
- Type: 'Str',
81
- Bytes: 'Vec<u8>',
82
- MetadataPrefixed: {
83
- magicNumber: 'U32',
84
- metadata: 'Metadata'
229
+ 'Type' => 'Str',
230
+ 'Bytes' => 'Vec<u8>',
231
+ 'MetadataPrefixed' => {
232
+ 'magicNumber' => 'U32',
233
+ 'metadata' => 'Metadata'
85
234
  },
86
- Placeholder: 'Null',
87
- Metadata: {
88
- _enum: {
89
- V0: 'Placeholder',
90
- V1: 'Placeholder',
91
- V2: 'Placeholder',
92
- V3: 'Placeholder',
93
- V4: 'Placeholder',
94
- V5: 'Placeholder',
95
- V6: 'Placeholder',
96
- V7: 'Placeholder',
97
- V8: 'Placeholder',
98
- V9: 'MetadataV9',
99
- V10: 'MetadataV10',
100
- V11: 'MetadataV11',
101
- V12: 'MetadataV12',
102
- V13: 'MetadataV13',
103
- V14: 'MetadataV14'
235
+ 'Placeholder' => 'Null',
236
+ 'Metadata' => {
237
+ '_enum' => {
238
+ 'V0' => 'Placeholder',
239
+ 'V1' => 'Placeholder',
240
+ 'V2' => 'Placeholder',
241
+ 'V3' => 'Placeholder',
242
+ 'V4' => 'Placeholder',
243
+ 'V5' => 'Placeholder',
244
+ 'V6' => 'Placeholder',
245
+ 'V7' => 'Placeholder',
246
+ 'V8' => 'Placeholder',
247
+ 'V9' => 'MetadataV9',
248
+ 'V10' => 'MetadataV10',
249
+ 'V11' => 'MetadataV11',
250
+ 'V12' => 'MetadataV12',
251
+ 'V13' => 'MetadataV13',
252
+ 'V14' => 'MetadataV14'
104
253
  }
105
254
  }
106
255
  }.merge(MetadataV14::TYPES)