scale_rb 0.5.0 → 0.5.2

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: cb19be98106d9f8331a9be9812f6252c23d6913cbd98cedcae34bf1a464e7b90
4
- data.tar.gz: cff1e034d85f130ed7d149628647f020adb9ffc532d9646bceda054007d6bf14
3
+ metadata.gz: e8d513edcbe185b4b84fa7e7f9a89f9787e658e79a42aac9843d0d225f5f1ecd
4
+ data.tar.gz: 14ed9841bb41104aa9a064b45f3f170c77f4c8aeb1eddd015d4cc62587c8d0e6
5
5
  SHA512:
6
- metadata.gz: de658214901aa13071c6b8d0c1aa94c8db0b2cee3c6c1df3207eb0881399c12215ce6c05a7d89c7da115e279a60fbe4688710e5f3fba827d5bd729afb7275e59
7
- data.tar.gz: 999f5311c1a66933281798c40bbb3b7956e528b3164c264f2a7694fa48c142683e49ff47a185c1e174501b2e8c3b083d2bd513d1e6c37cffff9002d9186908e4
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,95 +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
- ti = registry.use('MetadataPrefixed')
22
- metadata, = ScaleRb::Codec.decode(ti, bytes, registry)
23
- 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
24
121
  end
25
122
 
26
- def build_registry(metadata_prefixed)
27
- types = ScaleRb::Utils.get(metadata_prefixed, :metadata, :V14, :lookup, :types)
28
- 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
29
129
  end
30
130
 
31
- def get_module(pallet_name, metadata_prefixed)
32
- metadata = Utils.get(metadata_prefixed, :metadata)
33
- version = metadata.keys.first
34
- 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
35
136
 
36
- 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
37
141
  end
38
142
 
39
- def get_module_by_index(pallet_index, metadata_prefixed)
40
- metadata = Utils.get(metadata_prefixed, :metadata)
41
- version = metadata.keys.first.to_sym
42
- 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
43
148
 
44
- 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)
45
152
  end
46
153
 
47
- def get_storage_item(pallet_name, item_name, metadata_prefixed)
48
- metadata = Utils.get(metadata_prefixed, :metadata)
49
- version = metadata.keys.first.to_sym
50
- 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
51
166
 
52
- 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)
53
170
  end
54
171
 
55
- def get_calls_type(pallet_name, metadata_prefixed)
56
- metadata = Utils.get(metadata_prefixed, :metadata)
57
- version = metadata.keys.first.to_sym
58
- 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)
59
175
 
60
- Metadata.const_get("Metadata#{version.upcase}").get_calls_type(pallet_name, metadata_prefixed)
176
+ seq.type
61
177
  end
62
178
 
63
- def get_calls_type_id(pallet_name, metadata_prefixed)
64
- metadata = Utils.get(metadata_prefixed, :metadata)
65
- version = metadata.keys.first.to_sym
66
- 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)
67
198
 
68
- 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)
69
210
  end
70
211
 
71
- def get_call_type(pallet_name, call_name, metadata_prefixed)
72
- metadata = Utils.get(metadata_prefixed, :metadata)
73
- version = metadata.keys.first.to_sym
74
- 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
75
221
 
76
- Metadata.const_get("Metadata#{version.upcase}").get_call_type(pallet_name, call_name, metadata_prefixed)
222
+ v&.tuple&.tuple&.first
77
223
  end
78
224
  end
79
225
 
226
+ #########################################################################
227
+
80
228
  TYPES = {
81
- Type: 'Str',
82
- Bytes: 'Vec<u8>',
83
- MetadataPrefixed: {
84
- magicNumber: 'U32',
85
- metadata: 'Metadata'
229
+ 'Type' => 'Str',
230
+ 'Bytes' => 'Vec<u8>',
231
+ 'MetadataPrefixed' => {
232
+ 'magicNumber' => 'U32',
233
+ 'metadata' => 'Metadata'
86
234
  },
87
- Placeholder: 'Null',
88
- Metadata: {
89
- _enum: {
90
- V0: 'Placeholder',
91
- V1: 'Placeholder',
92
- V2: 'Placeholder',
93
- V3: 'Placeholder',
94
- V4: 'Placeholder',
95
- V5: 'Placeholder',
96
- V6: 'Placeholder',
97
- V7: 'Placeholder',
98
- V8: 'Placeholder',
99
- V9: 'MetadataV9',
100
- V10: 'MetadataV10',
101
- V11: 'MetadataV11',
102
- V12: 'MetadataV12',
103
- V13: 'MetadataV13',
104
- 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'
105
253
  }
106
254
  }
107
255
  }.merge(MetadataV14::TYPES)