scale_rb 0.1.7 → 0.1.9

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: 7d53289f0b86d457c262f850a693fd75c8c007fe6fe6fb716241d30897c7f57c
4
- data.tar.gz: 3784af581e51a87e7bdc10d6da633d719189e328f0d373ddfb93f1d120e6a44e
3
+ metadata.gz: a4ecdacacab52152c1db21cd934b452fca391320112c7a8a1c5a8479b4df9946
4
+ data.tar.gz: 637a12f9313b048bcd7e5c77dd34862225db553b0e42f620736aea5c78505a49
5
5
  SHA512:
6
- metadata.gz: a6fa663c9058b64cb9b5f77450cfddf2eac1ddd582ce1c56445d0d255bddd479339b644f95cb436cb53e5e1e46698593dc862e7a6d6e77515ea17798427ec029
7
- data.tar.gz: baf73201617384641f980d6aa8d83650edc483a60969c240c78ef935f22fce267b5084e9de30487a5b4a79bc4333f1b240f00003991ded04e3b32c94bca3df9d
6
+ metadata.gz: 18c6f40b6f41b3fa59a08c93a44b348e94642fe510f695576b164d5b0ad70362bfa0ade33823c422b85b9db55f2f23995598c9990c2a4b7c6e6113cb17b73ba0
7
+ data.tar.gz: bbb523afb3209dfd58827094cc4f1fce4d841fff5bba5b94538a736edac05803fb0dd3624dcedc5d2c068944614f7d43e053528574df402713f56b9ecb03c2ce
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- scale_rb (0.1.7)
4
+ scale_rb (0.1.9)
5
5
  base58
6
6
  blake2b_rs (~> 0.1.4)
7
7
  xxhash
data/lib/address.rb CHANGED
@@ -73,6 +73,8 @@ class Address
73
73
 
74
74
  u8_array.push(*checksum)
75
75
 
76
+ u8_array = u8_array.map { |i| if i.is_a?(String) then i.to_i(16) else i end }
77
+ # u8_array = [42, 202, 122, 179, 154, 86, 153, 242, 157, 207, 38, 115, 170, 163, 73, 75, 72, 81, 26, 186, 224, 220, 60, 101, 15, 243, 152, 246, 95, 229, 225, 18, 56, 0x7e]
76
78
  input = u8_array.pack("C*")
77
79
 
78
80
  Base58.binary_to_base58(input, :bitcoin)
@@ -14,12 +14,86 @@ module Metadata
14
14
  MetadataV14.build_registry(metadata_v14)
15
15
  end
16
16
 
17
+ def get_module(pallet_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_module(pallet_name, metadata)
22
+ end
23
+
24
+ def get_module_by_index(pallet_index, metadata)
25
+ version = metadata._get(:metadata).keys.first
26
+ raise ScaleRb::NotImplemented, metadata._get(:metadata).keys.first unless %w[v9 v10 v11 v12 v13 v14].include?(version.to_s)
27
+
28
+ Metadata.const_get("Metadata#{version.upcase}").get_module_by_index(pallet_index, metadata)
29
+ end
30
+
17
31
  def get_storage_item(pallet_name, item_name, metadata)
18
32
  version = metadata._get(:metadata).keys.first
19
33
  raise ScaleRb::NotImplemented, metadata._get(:metadata).keys.first unless %w[v9 v10 v11 v12 v13 v14].include?(version.to_s)
20
34
 
21
35
  Metadata.const_get("Metadata#{version.upcase}").get_storage_item(pallet_name, item_name, metadata)
22
36
  end
37
+
38
+ def get_calls_type(pallet_name, metadata)
39
+ version = metadata._get(:metadata).keys.first
40
+ raise ScaleRb::NotImplemented, metadata._get(:metadata).keys.first unless %w[v9 v10 v11 v12 v13 v14].include?(version.to_s)
41
+
42
+ Metadata.const_get("Metadata#{version.upcase}").get_calls_type(pallet_name, metadata)
43
+ end
44
+
45
+ def get_calls_type_id(pallet_name, metadata)
46
+ version = metadata._get(:metadata).keys.first
47
+ raise ScaleRb::NotImplemented, metadata._get(:metadata).keys.first unless %w[v9 v10 v11 v12 v13 v14].include?(version.to_s)
48
+
49
+ Metadata.const_get("Metadata#{version.upcase}").get_calls_type_id(pallet_name, metadata)
50
+ end
51
+
52
+ def get_call_type(pallet_name, call_name, metadata)
53
+ version = metadata._get(:metadata).keys.first
54
+ raise ScaleRb::NotImplemented, metadata._get(:metadata).keys.first unless %w[v9 v10 v11 v12 v13 v14].include?(version.to_s)
55
+
56
+ Metadata.const_get("Metadata#{version.upcase}").get_call_type(pallet_name, call_name, metadata)
57
+ end
58
+
59
+ # call examples:
60
+ # {:pallet_name=>"Deposit", :call_name=>"Claim", :call=>["claim", []]}
61
+ # {: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}}, []]}
62
+ def encode_call(call, metadata)
63
+ calls_type_id = get_calls_type_id(call[:pallet_name], metadata)
64
+ pallet_index = get_module(call[:pallet_name], metadata)._get(:index)
65
+ [pallet_index] + PortableCodec.encode(calls_type_id, call[:call].first, build_registry(metadata))
66
+ end
67
+
68
+ # callbytes's structure is: pallet_index + call_index + argsbytes
69
+ #
70
+ # callbytes examples:
71
+ # "0x0901".to_bytes
72
+ # "0x05000a1287977578f888bdc1c7627781af1cc000e6ab1300004c31b8d9a798".to_bytes
73
+ def decode_call(callbytes, metadata)
74
+ pallet_index = callbytes[0]
75
+ pallet = get_module_by_index(pallet_index, metadata)
76
+
77
+ pallet_name = pallet._get(:name)
78
+
79
+ # Remove the pallet_index
80
+ # The callbytes we used below should not contain the pallet index.
81
+ # This is because the pallet index is not part of the call type.
82
+ # Its structure is: call_index + call_args
83
+ callbytes_without_pallet_index = callbytes[1..]
84
+ calls_type_id = pallet._get(:calls)._get(:type)
85
+ decoded = PortableCodec.decode(
86
+ calls_type_id,
87
+ callbytes_without_pallet_index,
88
+ build_registry(metadata)
89
+ )
90
+
91
+ {
92
+ pallet_name: pallet_name,
93
+ call_name: decoded.first.is_a?(String) ? decoded.first.to_camel : decoded.first.keys.first.to_s.to_camel,
94
+ call: decoded
95
+ }
96
+ end
23
97
  end
24
98
 
25
99
  TYPES = {
@@ -14,6 +14,12 @@ module Metadata
14
14
  end
15
15
  end
16
16
 
17
+ def get_module_by_index(pallet_index, metadata)
18
+ metadata._get(:metadata)._get(:v14)._get(:pallets).find do |p|
19
+ p._get(:index) == pallet_index
20
+ end
21
+ end
22
+
17
23
  def get_storage_item(pallet_name, item_name, metadata)
18
24
  pallet = get_module(pallet_name, metadata)
19
25
  raise "Pallet `#{pallet_name}` not found" if pallet.nil?
@@ -21,6 +27,26 @@ module Metadata
21
27
  item._get(:name) == item_name
22
28
  end
23
29
  end
30
+
31
+ def get_calls_type_id(pallet_name, metadata)
32
+ pallet = get_module(pallet_name, metadata)
33
+ raise "Pallet `#{pallet_name}` not found" if pallet.nil?
34
+ pallet._get(:calls)._get(:type)
35
+ end
36
+
37
+ def get_calls_type(pallet_name, metadata)
38
+ type_id = get_calls_type_id(pallet_name, metadata)
39
+ metadata._get(:metadata)._get(:v14)._get(:lookup)._get(:types).find do |type|
40
+ type._get(:id) == type_id
41
+ end
42
+ end
43
+
44
+ def get_call_type(pallet_name, call_name, metadata)
45
+ calls_type = get_calls_type(pallet_name, metadata)
46
+ calls_type._get(:type)._get(:def)._get(:variant)._get(:variants).find do |variant|
47
+ variant._get(:name).downcase == call_name.downcase
48
+ end
49
+ end
24
50
  end
25
51
 
26
52
  TYPES = {
@@ -10,6 +10,15 @@ module PortableCodec
10
10
  class VariantIndexOutOfRange < Error; end
11
11
  class VariantInvalidValue < Error; end
12
12
 
13
+ class << self
14
+ def u256(value)
15
+ bytes = ScaleRb.encode('u256', value)
16
+ bytes.each_slice(8).map do |slice|
17
+ ScaleRb.decode('u64', slice).first
18
+ end
19
+ end
20
+ end
21
+
13
22
  class << self
14
23
  # registry:
15
24
  # {
@@ -103,7 +112,7 @@ module PortableCodec
103
112
  def decode_variant(variant_type, bytes, registry)
104
113
  variants = variant_type._get(:variants)
105
114
 
106
- index = bytes[0]
115
+ index = bytes[0].to_i # TODO: check
107
116
  item = variants.find { |v| v._get(:index) == index } # item is an composite
108
117
 
109
118
  raise VariantIndexOutOfRange, "type: #{variant_type}, index: #{index}, bytes: #{bytes}" if item.nil?
@@ -171,7 +180,7 @@ module PortableCodec
171
180
  def encode_sequence(sequence_type, value, registry)
172
181
  inner_type_id = sequence_type._get(:type)
173
182
  length_bytes = encode_compact(value.length)
174
- length_bytes + _encode_types([inner_type_id] * array.length, value, registry)
183
+ length_bytes + _encode_types([inner_type_id] * value.length, value, registry)
175
184
  end
176
185
 
177
186
  # tuple_type: [type_id1, type_id2, ...]
@@ -230,7 +239,10 @@ module PortableCodec
230
239
 
231
240
  item = variants.find { |var| var._get(:name) == name }
232
241
  raise VariantItemNotFound, "type: #{variant_type}, name: #{name}" if item.nil?
233
- raise VariantInvalidValue, "type: #{variant_type}, v: #{v}" if item._get(:fields).length != v.length
242
+
243
+ # if the variant item has more than one field, the value must be a hash with the same length.
244
+ # if the variant item has only one field, that means the field is a type id point to a composite. TODO: check the type's fields length
245
+ raise VariantFieldsLengthNotMatch, "type: #{variant_type}, \nvalue: #{v}" if item._get(:fields).length > 1 && item._get(:fields).length != v.length
234
246
 
235
247
  ScaleRb.encode_uint('u8', item._get(:index)) + encode_composite(item, v, registry)
236
248
  end
@@ -1,3 +1,3 @@
1
1
  module ScaleRb
2
- VERSION = '0.1.7'
2
+ VERSION = '0.1.9'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: scale_rb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.7
4
+ version: 0.1.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Aki Wu
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-04-04 00:00:00.000000000 Z
11
+ date: 2023-04-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: blake2b_rs