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 +4 -4
- data/.gitignore +1 -0
- data/Gemfile.lock +3 -3
- data/README.md +3 -0
- data/exe/metadata +3 -3
- data/lib/client/abstract_ws_client.rb +100 -0
- data/lib/{substrate/client.rb → client/http_client.rb} +47 -27
- data/lib/client/rpc_request_builder.rb +53 -0
- data/lib/codec.rb +27 -9
- data/lib/metadata/metadata.rb +55 -0
- data/lib/metadata/metadata_v10.rb +79 -0
- data/lib/metadata/metadata_v11.rb +85 -0
- data/lib/metadata/metadata_v12.rb +47 -0
- data/lib/metadata/metadata_v13.rb +78 -0
- data/lib/metadata/metadata_v14.rb +176 -0
- data/lib/metadata/metadata_v9.rb +99 -0
- data/lib/monkey_patching.rb +3 -1
- data/lib/portable_codec.rb +47 -38
- data/lib/scale_rb/version.rb +1 -1
- data/lib/scale_rb.rb +10 -4
- data/lib/storage_helper.rb +45 -26
- data/scale_rb.gemspec +1 -1
- metadata +15 -9
- data/lib/metadata.rb +0 -199
- data/lib/metadata_v14.rb +0 -21
- data/lib/substrate/rpc.rb +0 -70
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f83289d7a27bca72fe9e21e43f2b06ff29e191e47b9e1397cb96ea1adf6ee6c0
|
4
|
+
data.tar.gz: a1e77aaffcbc32aa795cb9cd57303f71a3fc1477c42e2540034d9060dc88a415
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 26a88e5148bd175700d992542ea490dfd97b298b24dd8a6955fa24e276c12a8018b914c9c2f321b59cce4d8be24ceda7674814a83495a6079bebef43f8407d7a
|
7
|
+
data.tar.gz: 74e818ab1e4d56caac4b78de0e15545b53e86361a5557fa72eae7e8310dec0b09a101590551e5b6d5b218d41c690e6eaea6221a84a93a14c904620724390aaf0
|
data/.gitignore
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
scale_rb (0.1.
|
5
|
-
blake2b_rs (~> 0.1.
|
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.
|
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
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(
|
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 =
|
34
|
+
block_hash = HttpClient.chain_getBlockHash url, block_number
|
35
35
|
end
|
36
36
|
else
|
37
|
-
block_hash =
|
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
|
-
|
4
|
-
|
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 =
|
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 =
|
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 =
|
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
|
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
|
-
|
95
|
-
|
96
|
-
|
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
|
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
|
-
|
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
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
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
|