eth 0.5.10 → 0.5.12
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/.github/workflows/codeql.yml +5 -5
- data/.github/workflows/docs.yml +3 -3
- data/.github/workflows/spec.yml +8 -4
- data/CHANGELOG.md +52 -0
- data/eth.gemspec +4 -1
- data/lib/eth/abi/decoder.rb +154 -0
- data/lib/eth/abi/encoder.rb +304 -0
- data/lib/eth/abi/event.rb +37 -5
- data/lib/eth/abi/type.rb +10 -2
- data/lib/eth/abi.rb +10 -385
- data/lib/eth/api.rb +45 -52
- data/lib/eth/chain.rb +9 -0
- data/lib/eth/client/http.rb +18 -4
- data/lib/eth/client/ipc.rb +2 -2
- data/lib/eth/client.rb +71 -133
- data/lib/eth/contract/event.rb +16 -2
- data/lib/eth/contract.rb +11 -1
- data/lib/eth/eip712.rb +5 -1
- data/lib/eth/solidity.rb +7 -4
- data/lib/eth/tx/eip1559.rb +10 -5
- data/lib/eth/tx/eip2930.rb +10 -5
- data/lib/eth/tx/legacy.rb +0 -2
- data/lib/eth/tx.rb +9 -2
- data/lib/eth/util.rb +1 -0
- data/lib/eth/version.rb +11 -2
- metadata +21 -6
- data/lib/eth/client/http_auth.rb +0 -73
data/lib/eth/abi/type.rb
CHANGED
@@ -71,7 +71,15 @@ module Eth
|
|
71
71
|
# @return [Eth::Abi::Type] a parsed Type object.
|
72
72
|
# @raise [ParseError] if it fails to parse the type.
|
73
73
|
def parse(type, components = nil, component_name = nil)
|
74
|
-
|
74
|
+
if type.is_a?(Type)
|
75
|
+
@base_type = type.base_type
|
76
|
+
@sub_type = type.sub_type
|
77
|
+
@dimensions = type.dimensions
|
78
|
+
@components = type.components
|
79
|
+
@name = type.name
|
80
|
+
return
|
81
|
+
end
|
82
|
+
|
75
83
|
_, base_type, sub_type, dimension = /([a-z]*)([0-9]*x?[0-9]*)((\[[0-9]*\])*)/.match(type).to_a
|
76
84
|
|
77
85
|
# type dimension can only be numeric
|
@@ -86,7 +94,7 @@ module Eth
|
|
86
94
|
@base_type = base_type
|
87
95
|
@sub_type = sub_type
|
88
96
|
@dimensions = dims.map { |x| x[1...-1].to_i }
|
89
|
-
@components = components.map { |component|
|
97
|
+
@components = components.map { |component| Abi::Type.parse(component["type"], component.dig("components"), component.dig("name")) } unless components.nil?
|
90
98
|
@name = component_name
|
91
99
|
end
|
92
100
|
|
data/lib/eth/abi.rb
CHANGED
@@ -16,9 +16,6 @@
|
|
16
16
|
|
17
17
|
require "konstructor"
|
18
18
|
|
19
|
-
require "eth/abi/event"
|
20
|
-
require "eth/abi/type"
|
21
|
-
|
22
19
|
# Provides the {Eth} module.
|
23
20
|
module Eth
|
24
21
|
|
@@ -56,110 +53,15 @@ module Eth
|
|
56
53
|
# encode types and arguments
|
57
54
|
args.each_with_index do |arg, i|
|
58
55
|
if parsed_types[i].dynamic?
|
59
|
-
head +=
|
60
|
-
tail +=
|
56
|
+
head += Abi::Encoder.type(Type.size_type, head_size + tail.size)
|
57
|
+
tail += Abi::Encoder.type(parsed_types[i], arg)
|
61
58
|
else
|
62
|
-
head +=
|
59
|
+
head += Abi::Encoder.type(parsed_types[i], arg)
|
63
60
|
end
|
64
61
|
end
|
65
62
|
|
66
63
|
# return the encoded ABI blob
|
67
|
-
|
68
|
-
end
|
69
|
-
|
70
|
-
# Encodes a specific value, either static or dynamic.
|
71
|
-
#
|
72
|
-
# @param type [Eth::Abi::Type] type to be encoded.
|
73
|
-
# @param arg [String|Number] value to be encoded.
|
74
|
-
# @return [String] the encoded type.
|
75
|
-
# @raise [EncodingError] if value does not match type.
|
76
|
-
def encode_type(type, arg)
|
77
|
-
if %w(string bytes).include? type.base_type and type.sub_type.empty? and type.dimensions.empty?
|
78
|
-
raise EncodingError, "Argument must be a String" unless arg.instance_of? String
|
79
|
-
|
80
|
-
# encodes strings and bytes
|
81
|
-
size = encode_type Type.size_type, arg.size
|
82
|
-
padding = Constant::BYTE_ZERO * (Util.ceil32(arg.size) - arg.size)
|
83
|
-
return "#{size}#{arg}#{padding}"
|
84
|
-
elsif type.base_type == "tuple" && type.dimensions.size == 1 && type.dimensions[0] != 0
|
85
|
-
result = ""
|
86
|
-
result += encode_struct_offsets(type.nested_sub, arg)
|
87
|
-
result += arg.map { |x| encode_type(type.nested_sub, x) }.join
|
88
|
-
result
|
89
|
-
elsif type.dynamic? && arg.is_a?(Array)
|
90
|
-
|
91
|
-
# encodes dynamic-sized arrays
|
92
|
-
head, tail = "", ""
|
93
|
-
head += encode_type(Type.size_type, arg.size)
|
94
|
-
nested_sub = type.nested_sub
|
95
|
-
nested_sub_size = type.nested_sub.size
|
96
|
-
|
97
|
-
# calculate offsets
|
98
|
-
if %w(string bytes).include?(type.base_type) && type.sub_type.empty?
|
99
|
-
offset = 0
|
100
|
-
arg.size.times do |i|
|
101
|
-
if i == 0
|
102
|
-
offset = arg.size * 32
|
103
|
-
else
|
104
|
-
number_of_words = ((arg[i - 1].size + 32 - 1) / 32).floor
|
105
|
-
total_bytes_length = number_of_words * 32
|
106
|
-
offset += total_bytes_length + 32
|
107
|
-
end
|
108
|
-
|
109
|
-
head += encode_type(Type.size_type, offset)
|
110
|
-
end
|
111
|
-
elsif nested_sub.base_type == "tuple" && nested_sub.dynamic?
|
112
|
-
head += encode_struct_offsets(nested_sub, arg)
|
113
|
-
end
|
114
|
-
|
115
|
-
arg.size.times do |i|
|
116
|
-
head += encode_type nested_sub, arg[i]
|
117
|
-
end
|
118
|
-
return "#{head}#{tail}"
|
119
|
-
else
|
120
|
-
if type.dimensions.empty?
|
121
|
-
|
122
|
-
# encode a primitive type
|
123
|
-
return encode_primitive_type type, arg
|
124
|
-
else
|
125
|
-
|
126
|
-
# encode static-size arrays
|
127
|
-
return arg.map { |x| encode_type(type.nested_sub, x) }.join
|
128
|
-
end
|
129
|
-
end
|
130
|
-
end
|
131
|
-
|
132
|
-
# Encodes primitive types.
|
133
|
-
#
|
134
|
-
# @param type [Eth::Abi::Type] type to be encoded.
|
135
|
-
# @param arg [String|Number] value to be encoded.
|
136
|
-
# @return [String] the encoded primitive type.
|
137
|
-
# @raise [EncodingError] if value does not match type.
|
138
|
-
# @raise [ValueOutOfBounds] if value is out of bounds for type.
|
139
|
-
# @raise [EncodingError] if encoding fails for type.
|
140
|
-
def encode_primitive_type(type, arg)
|
141
|
-
case type.base_type
|
142
|
-
when "uint"
|
143
|
-
return encode_uint arg, type
|
144
|
-
when "bool"
|
145
|
-
return encode_bool arg
|
146
|
-
when "int"
|
147
|
-
return encode_int arg, type
|
148
|
-
when "ureal", "ufixed"
|
149
|
-
return encode_ufixed arg, type
|
150
|
-
when "real", "fixed"
|
151
|
-
return encode_fixed arg, type
|
152
|
-
when "string", "bytes"
|
153
|
-
return encode_bytes arg, type
|
154
|
-
when "tuple"
|
155
|
-
return encode_tuple arg, type
|
156
|
-
when "hash"
|
157
|
-
return encode_hash arg, type
|
158
|
-
when "address"
|
159
|
-
return encode_address arg
|
160
|
-
else
|
161
|
-
raise EncodingError, "Unhandled type: #{type.base_type} #{type.sub_type}"
|
162
|
-
end
|
64
|
+
"#{head}#{tail}"
|
163
65
|
end
|
164
66
|
|
165
67
|
# Decodes Application Binary Interface (ABI) data. It accepts multiple
|
@@ -216,289 +118,12 @@ module Eth
|
|
216
118
|
end
|
217
119
|
|
218
120
|
# return the decoded ABI types and data
|
219
|
-
|
220
|
-
end
|
221
|
-
|
222
|
-
# Decodes a specific value, either static or dynamic.
|
223
|
-
#
|
224
|
-
# @param type [Eth::Abi::Type] type to be decoded.
|
225
|
-
# @param arg [String] encoded type data string.
|
226
|
-
# @return [String] the decoded data for the type.
|
227
|
-
# @raise [DecodingError] if decoding fails for type.
|
228
|
-
def decode_type(type, arg)
|
229
|
-
if %w(string bytes).include?(type.base_type) and type.sub_type.empty?
|
230
|
-
l = Util.deserialize_big_endian_to_int arg[0, 32]
|
231
|
-
data = arg[32..-1]
|
232
|
-
raise DecodingError, "Wrong data size for string/bytes object" unless data.size == Util.ceil32(l)
|
233
|
-
|
234
|
-
# decoded strings and bytes
|
235
|
-
return data[0, l]
|
236
|
-
elsif type.dynamic?
|
237
|
-
l = Util.deserialize_big_endian_to_int arg[0, 32]
|
238
|
-
nested_sub = type.nested_sub
|
239
|
-
|
240
|
-
# ref https://github.com/ethereum/tests/issues/691
|
241
|
-
raise NotImplementedError, "Decoding dynamic arrays with nested dynamic sub-types is not implemented for ABI." if nested_sub.dynamic?
|
242
|
-
|
243
|
-
# decoded dynamic-sized arrays
|
244
|
-
return (0...l).map { |i| decode_type(nested_sub, arg[32 + nested_sub.size * i, nested_sub.size]) }
|
245
|
-
elsif !type.dimensions.empty?
|
246
|
-
l = type.dimensions.last[0]
|
247
|
-
nested_sub = type.nested_sub
|
248
|
-
|
249
|
-
# decoded static-size arrays
|
250
|
-
return (0...l).map { |i| decode_type(nested_sub, arg[nested_sub.size * i, nested_sub.size]) }
|
251
|
-
else
|
252
|
-
|
253
|
-
# decoded primitive types
|
254
|
-
return decode_primitive_type type, arg
|
255
|
-
end
|
256
|
-
end
|
257
|
-
|
258
|
-
# Decodes primitive types.
|
259
|
-
#
|
260
|
-
# @param type [Eth::Abi::Type] type to be decoded.
|
261
|
-
# @param data [String] encoded primitive type data string.
|
262
|
-
# @return [String] the decoded data for the type.
|
263
|
-
# @raise [DecodingError] if decoding fails for type.
|
264
|
-
def decode_primitive_type(type, data)
|
265
|
-
case type.base_type
|
266
|
-
when "address"
|
267
|
-
|
268
|
-
# decoded address with 0x-prefix
|
269
|
-
return "0x#{Util.bin_to_hex data[12..-1]}"
|
270
|
-
when "string", "bytes"
|
271
|
-
if type.sub_type.empty?
|
272
|
-
size = Util.deserialize_big_endian_to_int data[0, 32]
|
273
|
-
|
274
|
-
# decoded dynamic-sized array
|
275
|
-
return data[32..-1][0, size]
|
276
|
-
else
|
277
|
-
|
278
|
-
# decoded static-sized array
|
279
|
-
return data[0, type.sub_type.to_i]
|
280
|
-
end
|
281
|
-
when "hash"
|
282
|
-
|
283
|
-
# decoded hash
|
284
|
-
return data[(32 - type.sub_type.to_i), type.sub_type.to_i]
|
285
|
-
when "uint"
|
286
|
-
|
287
|
-
# decoded unsigned integer
|
288
|
-
return Util.deserialize_big_endian_to_int data
|
289
|
-
when "int"
|
290
|
-
u = Util.deserialize_big_endian_to_int data
|
291
|
-
i = u >= 2 ** (type.sub_type.to_i - 1) ? (u - 2 ** type.sub_type.to_i) : u
|
292
|
-
|
293
|
-
# decoded integer
|
294
|
-
return i
|
295
|
-
when "ureal", "ufixed"
|
296
|
-
high, low = type.sub_type.split("x").map(&:to_i)
|
297
|
-
|
298
|
-
# decoded unsigned fixed point numeric
|
299
|
-
return Util.deserialize_big_endian_to_int(data) * 1.0 / 2 ** low
|
300
|
-
when "real", "fixed"
|
301
|
-
high, low = type.sub_type.split("x").map(&:to_i)
|
302
|
-
u = Util.deserialize_big_endian_to_int data
|
303
|
-
i = u >= 2 ** (high + low - 1) ? (u - 2 ** (high + low)) : u
|
304
|
-
|
305
|
-
# decoded fixed point numeric
|
306
|
-
return i * 1.0 / 2 ** low
|
307
|
-
when "bool"
|
308
|
-
|
309
|
-
# decoded boolean
|
310
|
-
return data[-1] == Constant::BYTE_ONE
|
311
|
-
else
|
312
|
-
raise DecodingError, "Unknown primitive type: #{type.base_type}"
|
313
|
-
end
|
314
|
-
end
|
315
|
-
|
316
|
-
# Build event signature string from ABI interface.
|
317
|
-
#
|
318
|
-
# @param interface [Hash] ABI event interface.
|
319
|
-
# @return [String] interface signature string.
|
320
|
-
def signature(interface)
|
321
|
-
name = interface.fetch("name")
|
322
|
-
inputs = interface.fetch("inputs", [])
|
323
|
-
types = inputs.map { |i| i.fetch("type") }
|
324
|
-
"#{name}(#{types.join(",")})"
|
325
|
-
end
|
326
|
-
|
327
|
-
private
|
328
|
-
|
329
|
-
# Properly encodes unsigned integers.
|
330
|
-
def encode_uint(arg, type)
|
331
|
-
raise ArgumentError, "Don't know how to handle this input." unless arg.is_a? Numeric
|
332
|
-
raise ValueOutOfBounds, "Number out of range: #{arg}" if arg > Constant::UINT_MAX or arg < Constant::UINT_MIN
|
333
|
-
real_size = type.sub_type.to_i
|
334
|
-
i = arg.to_i
|
335
|
-
raise ValueOutOfBounds, arg unless i >= 0 and i < 2 ** real_size
|
336
|
-
return Util.zpad_int i
|
337
|
-
end
|
338
|
-
|
339
|
-
# Properly encodes signed integers.
|
340
|
-
def encode_int(arg, type)
|
341
|
-
raise ArgumentError, "Don't know how to handle this input." unless arg.is_a? Numeric
|
342
|
-
raise ValueOutOfBounds, "Number out of range: #{arg}" if arg > Constant::INT_MAX or arg < Constant::INT_MIN
|
343
|
-
real_size = type.sub_type.to_i
|
344
|
-
i = arg.to_i
|
345
|
-
raise ValueOutOfBounds, arg unless i >= -2 ** (real_size - 1) and i < 2 ** (real_size - 1)
|
346
|
-
return Util.zpad_int(i % 2 ** type.sub_type.to_i)
|
347
|
-
end
|
348
|
-
|
349
|
-
# Properly encodes booleans.
|
350
|
-
def encode_bool(arg)
|
351
|
-
raise EncodingError, "Argument is not bool: #{arg}" unless arg.instance_of? TrueClass or arg.instance_of? FalseClass
|
352
|
-
return Util.zpad_int(arg ? 1 : 0)
|
353
|
-
end
|
354
|
-
|
355
|
-
# Properly encodes unsigned fixed-point numbers.
|
356
|
-
def encode_ufixed(arg, type)
|
357
|
-
raise ArgumentError, "Don't know how to handle this input." unless arg.is_a? Numeric
|
358
|
-
high, low = type.sub_type.split("x").map(&:to_i)
|
359
|
-
raise ValueOutOfBounds, arg unless arg >= 0 and arg < 2 ** high
|
360
|
-
return Util.zpad_int((arg * 2 ** low).to_i)
|
361
|
-
end
|
362
|
-
|
363
|
-
# Properly encodes signed fixed-point numbers.
|
364
|
-
def encode_fixed(arg, type)
|
365
|
-
raise ArgumentError, "Don't know how to handle this input." unless arg.is_a? Numeric
|
366
|
-
high, low = type.sub_type.split("x").map(&:to_i)
|
367
|
-
raise ValueOutOfBounds, arg unless arg >= -2 ** (high - 1) and arg < 2 ** (high - 1)
|
368
|
-
i = (arg * 2 ** low).to_i
|
369
|
-
return Util.zpad_int(i % 2 ** (high + low))
|
370
|
-
end
|
371
|
-
|
372
|
-
# Properly encodes byte-strings.
|
373
|
-
def encode_bytes(arg, type)
|
374
|
-
raise EncodingError, "Expecting String: #{arg}" unless arg.instance_of? String
|
375
|
-
arg = handle_hex_string arg, type
|
376
|
-
|
377
|
-
if type.sub_type.empty?
|
378
|
-
size = Util.zpad_int arg.size
|
379
|
-
padding = Constant::BYTE_ZERO * (Util.ceil32(arg.size) - arg.size)
|
380
|
-
|
381
|
-
# variable length string/bytes
|
382
|
-
return "#{size}#{arg}#{padding}"
|
383
|
-
else
|
384
|
-
raise ValueOutOfBounds, arg unless arg.size <= type.sub_type.to_i
|
385
|
-
padding = Constant::BYTE_ZERO * (32 - arg.size)
|
386
|
-
|
387
|
-
# fixed length string/bytes
|
388
|
-
return "#{arg}#{padding}"
|
389
|
-
end
|
390
|
-
end
|
391
|
-
|
392
|
-
# Properly encodes tuples.
|
393
|
-
def encode_tuple(arg, type)
|
394
|
-
raise EncodingError, "Expecting Hash: #{arg}" unless arg.instance_of? Hash
|
395
|
-
raise EncodingError, "Expecting #{type.components.size} elements: #{arg}" unless arg.size == type.components.size
|
396
|
-
|
397
|
-
static_size = 0
|
398
|
-
type.components.each_with_index do |component, i|
|
399
|
-
if type.components[i].dynamic?
|
400
|
-
static_size += 32
|
401
|
-
else
|
402
|
-
static_size += Util.ceil32(type.components[i].size || 0)
|
403
|
-
end
|
404
|
-
end
|
405
|
-
|
406
|
-
dynamic_offset = static_size
|
407
|
-
offsets_and_static_values = []
|
408
|
-
dynamic_values = []
|
409
|
-
|
410
|
-
type.components.each_with_index do |component, i|
|
411
|
-
component_type = type.components[i]
|
412
|
-
if component_type.dynamic?
|
413
|
-
offsets_and_static_values << encode_type(Type.size_type, dynamic_offset)
|
414
|
-
dynamic_value = encode_type(component_type, arg.is_a?(Array) ? arg[i] : arg[component_type.name])
|
415
|
-
dynamic_values << dynamic_value
|
416
|
-
dynamic_offset += dynamic_value.size
|
417
|
-
else
|
418
|
-
offsets_and_static_values << encode_type(component_type, arg.is_a?(Array) ? arg[i] : arg[component_type.name])
|
419
|
-
end
|
420
|
-
end
|
421
|
-
|
422
|
-
offsets_and_static_values.join + dynamic_values.join
|
423
|
-
end
|
424
|
-
|
425
|
-
# Properly encode struct offsets.
|
426
|
-
def encode_struct_offsets(type, arg)
|
427
|
-
result = ""
|
428
|
-
offset = arg.size
|
429
|
-
tails_encoding = arg.map { |a| encode_type(type, a) }
|
430
|
-
arg.size.times do |i|
|
431
|
-
if i == 0
|
432
|
-
offset *= 32
|
433
|
-
else
|
434
|
-
offset += tails_encoding[i - 1].size
|
435
|
-
end
|
436
|
-
offset_string = encode_type(Type.size_type, offset)
|
437
|
-
result += offset_string
|
438
|
-
end
|
439
|
-
result
|
440
|
-
end
|
441
|
-
|
442
|
-
# Properly encodes hash-strings.
|
443
|
-
def encode_hash(arg, type)
|
444
|
-
size = type.sub_type.to_i
|
445
|
-
raise EncodingError, "Argument too long: #{arg}" unless size > 0 and size <= 32
|
446
|
-
if arg.is_a? Integer
|
447
|
-
|
448
|
-
# hash from integer
|
449
|
-
return Util.zpad_int arg
|
450
|
-
elsif arg.size == size
|
451
|
-
|
452
|
-
# hash from encoded hash
|
453
|
-
return Util.zpad arg, 32
|
454
|
-
elsif arg.size == size * 2
|
455
|
-
|
456
|
-
# hash from hexa-decimal hash
|
457
|
-
return Util.zpad_hex arg
|
458
|
-
else
|
459
|
-
raise EncodingError, "Could not parse hash: #{arg}"
|
460
|
-
end
|
461
|
-
end
|
462
|
-
|
463
|
-
# Properly encodes addresses.
|
464
|
-
def encode_address(arg)
|
465
|
-
if arg.is_a? Integer
|
466
|
-
|
467
|
-
# address from integer
|
468
|
-
return Util.zpad_int arg
|
469
|
-
elsif arg.size == 20
|
470
|
-
|
471
|
-
# address from encoded address
|
472
|
-
return Util.zpad arg, 32
|
473
|
-
elsif arg.size == 40
|
474
|
-
|
475
|
-
# address from hexa-decimal address with 0x prefix
|
476
|
-
return Util.zpad_hex arg
|
477
|
-
elsif arg.size == 42 and arg[0, 2] == "0x"
|
478
|
-
|
479
|
-
# address from hexa-decimal address
|
480
|
-
return Util.zpad_hex arg[2..-1]
|
481
|
-
else
|
482
|
-
raise EncodingError, "Could not parse address: #{arg}"
|
483
|
-
end
|
484
|
-
end
|
485
|
-
|
486
|
-
# The ABI encoder needs to be able to determine between a hex `"123"`
|
487
|
-
# and a binary `"123"` string.
|
488
|
-
def handle_hex_string(arg, type)
|
489
|
-
if Util.prefixed? arg or
|
490
|
-
(arg.size === type.sub_type.to_i * 2 and Util.hex? arg)
|
491
|
-
|
492
|
-
# There is no way telling whether a string is hex or binary with certainty
|
493
|
-
# in Ruby. Therefore, we assume a `0x` prefix to indicate a hex string.
|
494
|
-
# Additionally, if the string size is exactly the double of the expected
|
495
|
-
# binary size, we can assume a hex value.
|
496
|
-
return Util.hex_to_bin arg
|
497
|
-
else
|
498
|
-
|
499
|
-
# Everything else will be assumed binary or raw string.
|
500
|
-
return arg.b
|
501
|
-
end
|
121
|
+
parsed_types.zip(outputs).map { |(type, out)| Abi::Decoder.type(type, out) }
|
502
122
|
end
|
503
123
|
end
|
504
124
|
end
|
125
|
+
|
126
|
+
require "eth/abi/decoder"
|
127
|
+
require "eth/abi/encoder"
|
128
|
+
require "eth/abi/event"
|
129
|
+
require "eth/abi/type"
|
data/lib/eth/api.rb
CHANGED
@@ -18,31 +18,31 @@ module Eth
|
|
18
18
|
# Provides the `Eth::Api` module grouping known RPC commands.
|
19
19
|
module Api
|
20
20
|
|
21
|
-
# Implements the available RPC-APIs provided by Geth version 1.10.
|
21
|
+
# Implements the available RPC-APIs provided by Geth version 1.10.26.
|
22
22
|
COMMANDS = [
|
23
|
+
"account_ecRecover",
|
24
|
+
"account_new",
|
25
|
+
"account_signData",
|
26
|
+
"account_signTransaction",
|
27
|
+
"account_signTypedData",
|
23
28
|
"admin_addPeer",
|
24
29
|
"admin_addTrustedPeer",
|
25
|
-
"admin_clearHistory",
|
26
30
|
"admin_datadir",
|
27
31
|
"admin_exportChain",
|
28
|
-
"admin_getDatadir",
|
29
|
-
"admin_getNodeInfo",
|
30
|
-
"admin_getPeers",
|
31
32
|
"admin_importChain",
|
32
33
|
"admin_nodeInfo",
|
34
|
+
"admin_peerEvents",
|
33
35
|
"admin_peers",
|
34
36
|
"admin_removePeer",
|
35
37
|
"admin_removeTrustedPeer",
|
36
|
-
"admin_sleep",
|
37
|
-
"admin_sleepBlocks",
|
38
38
|
"admin_startHTTP",
|
39
|
-
"admin_startRPC",
|
40
39
|
"admin_startWS",
|
41
40
|
"admin_stopHTTP",
|
42
|
-
"admin_stopRPC",
|
43
41
|
"admin_stopWS",
|
42
|
+
"clef_deriveAccount",
|
43
|
+
"clef_listWallets",
|
44
|
+
"clef_openWallet",
|
44
45
|
"clique_discard",
|
45
|
-
"clique_getProposals",
|
46
46
|
"clique_getSigner",
|
47
47
|
"clique_getSigners",
|
48
48
|
"clique_getSignersAtHash",
|
@@ -51,12 +51,19 @@ module Eth
|
|
51
51
|
"clique_proposals",
|
52
52
|
"clique_propose",
|
53
53
|
"clique_status",
|
54
|
+
"db_getHex",
|
55
|
+
"db_getString",
|
56
|
+
"db_putHex",
|
57
|
+
"db_putString",
|
54
58
|
"debug_accountRange",
|
55
59
|
"debug_backtraceAt",
|
56
60
|
"debug_blockProfile",
|
57
61
|
"debug_chaindbCompact",
|
58
62
|
"debug_chaindbProperty",
|
59
63
|
"debug_cpuProfile",
|
64
|
+
"debug_dbAncient",
|
65
|
+
"debug_dbAncients",
|
66
|
+
"debug_dbGet",
|
60
67
|
"debug_dumpBlock",
|
61
68
|
"debug_freeOSMemory",
|
62
69
|
"debug_freezeClient",
|
@@ -67,6 +74,10 @@ module Eth
|
|
67
74
|
"debug_getHeaderRlp",
|
68
75
|
"debug_getModifiedAccountsByHash",
|
69
76
|
"debug_getModifiedAccountsByNumber",
|
77
|
+
"debug_getRawBlock",
|
78
|
+
"debug_getRawHeader",
|
79
|
+
"debug_getRawReceipts",
|
80
|
+
"debug_getRawTransaction",
|
70
81
|
"debug_goTrace",
|
71
82
|
"debug_intermediateRoots",
|
72
83
|
"debug_memStats",
|
@@ -86,13 +97,14 @@ module Eth
|
|
86
97
|
"debug_stopCPUProfile",
|
87
98
|
"debug_stopGoTrace",
|
88
99
|
"debug_storageRangeAt",
|
89
|
-
"
|
100
|
+
"debug_subscribe",
|
90
101
|
"debug_traceBadBlock",
|
91
102
|
"debug_traceBlock",
|
92
103
|
"debug_traceBlockByHash",
|
93
104
|
"debug_traceBlockByNumber",
|
94
105
|
"debug_traceBlockFromFile",
|
95
106
|
"debug_traceCall",
|
107
|
+
"debug_traceChain",
|
96
108
|
"debug_traceTransaction",
|
97
109
|
"debug_verbosity",
|
98
110
|
"debug_vmodule",
|
@@ -103,79 +115,48 @@ module Eth
|
|
103
115
|
"eth_blockNumber",
|
104
116
|
"eth_call",
|
105
117
|
"eth_chainId",
|
106
|
-
"
|
107
|
-
"
|
108
|
-
"
|
118
|
+
"eth_compileLLL",
|
119
|
+
"eth_compileSerpent",
|
120
|
+
"eth_compileSolidity",
|
109
121
|
"eth_createAccessList",
|
110
|
-
"eth_defaultAccount",
|
111
|
-
"eth_defaultBlock",
|
112
122
|
"eth_estimateGas",
|
113
123
|
"eth_feeHistory",
|
114
|
-
"eth_fillTransaction",
|
115
|
-
"eth_filter",
|
116
124
|
"eth_gasPrice",
|
117
|
-
"eth_getAccounts",
|
118
125
|
"eth_getBalance",
|
119
|
-
"eth_getBlock",
|
120
126
|
"eth_getBlockByHash",
|
121
127
|
"eth_getBlockByNumber",
|
122
|
-
"eth_getBlockNumber",
|
123
|
-
"eth_getBlockTransactionCount",
|
124
128
|
"eth_getBlockTransactionCountByHash",
|
125
129
|
"eth_getBlockTransactionCountByNumber",
|
126
|
-
"eth_getBlockUncleCount",
|
127
130
|
"eth_getCode",
|
128
|
-
"eth_getCoinbase",
|
129
131
|
"eth_getCompilers",
|
130
132
|
"eth_getFilterChanges",
|
131
133
|
"eth_getFilterLogs",
|
132
|
-
"eth_getGasPrice",
|
133
|
-
"eth_getHashrate",
|
134
|
-
"eth_getHeaderByHash",
|
135
|
-
"eth_getHeaderByNumber",
|
136
134
|
"eth_getLogs",
|
137
|
-
"eth_getMaxPriorityFeePerGas",
|
138
|
-
"eth_getMining",
|
139
|
-
"eth_getPendingTransactions",
|
140
135
|
"eth_getProof",
|
141
|
-
"eth_getProtocolVersion",
|
142
|
-
"eth_getRawTransaction",
|
143
|
-
"eth_getRawTransactionFromBlock",
|
144
136
|
"eth_getStorageAt",
|
145
|
-
"eth_getSyncing",
|
146
|
-
"eth_getTransaction",
|
147
137
|
"eth_getTransactionByBlockHashAndIndex",
|
148
138
|
"eth_getTransactionByBlockNumberAndIndex",
|
149
139
|
"eth_getTransactionByHash",
|
150
140
|
"eth_getTransactionCount",
|
151
|
-
"eth_getTransactionFromBlock",
|
152
141
|
"eth_getTransactionReceipt",
|
153
|
-
"
|
142
|
+
"eth_getUncleByBlockHashAndIndex",
|
143
|
+
"eth_getUncleByBlockNumberAndIndex",
|
154
144
|
"eth_getUncleCountByBlockHash",
|
155
145
|
"eth_getUncleCountByBlockNumber",
|
156
146
|
"eth_getWork",
|
157
147
|
"eth_hashrate",
|
158
|
-
"eth_iban",
|
159
|
-
"eth_icapNamereg",
|
160
|
-
"eth_isSyncing",
|
161
148
|
"eth_maxPriorityFeePerGas",
|
162
149
|
"eth_mining",
|
163
|
-
"eth_namereg",
|
164
150
|
"eth_newBlockFilter",
|
165
151
|
"eth_newFilter",
|
166
152
|
"eth_newPendingTransactionFilter",
|
167
|
-
"eth_pendingTransactions",
|
168
153
|
"eth_protocolVersion",
|
169
|
-
"eth_resend",
|
170
|
-
"eth_sendIBANTransaction",
|
171
154
|
"eth_sendRawTransaction",
|
172
155
|
"eth_sendTransaction",
|
173
156
|
"eth_sign",
|
174
157
|
"eth_signTransaction",
|
175
158
|
"eth_submitHashrate",
|
176
|
-
"eth_submitTransaction",
|
177
159
|
"eth_submitWork",
|
178
|
-
"eth_subscribe",
|
179
160
|
"eth_syncing",
|
180
161
|
"eth_uninstallFilter",
|
181
162
|
"eth_unsubscribe",
|
@@ -193,14 +174,17 @@ module Eth
|
|
193
174
|
"miner_setExtra",
|
194
175
|
"miner_setGasLimit",
|
195
176
|
"miner_setGasPrice",
|
177
|
+
"miner_setRecommitInterval",
|
196
178
|
"miner_start",
|
197
179
|
"miner_stop",
|
180
|
+
"net_listening",
|
181
|
+
"net_peerCount",
|
182
|
+
"net_version",
|
198
183
|
"personal_deriveAccount",
|
199
184
|
"personal_ecRecover",
|
200
|
-
"personal_getListAccounts",
|
201
|
-
"personal_getListWallets",
|
202
185
|
"personal_importRawKey",
|
203
186
|
"personal_initializeWallet",
|
187
|
+
"personal_initializeWallets",
|
204
188
|
"personal_listAccounts",
|
205
189
|
"personal_listWallets",
|
206
190
|
"personal_lockAccount",
|
@@ -211,13 +195,22 @@ module Eth
|
|
211
195
|
"personal_signTransaction",
|
212
196
|
"personal_unlockAccount",
|
213
197
|
"personal_unpair",
|
198
|
+
"shh_addToGroup",
|
199
|
+
"shh_getFilterChanges",
|
200
|
+
"shh_getMessages",
|
201
|
+
"shh_hasIdentity",
|
202
|
+
"shh_newFilter",
|
203
|
+
"shh_newGroup",
|
204
|
+
"shh_newIdentity",
|
205
|
+
"shh_post",
|
206
|
+
"shh_uninstallFilter",
|
207
|
+
"shh_version",
|
214
208
|
"txpool_content",
|
215
209
|
"txpool_contentFrom",
|
216
|
-
"txpool_getContent",
|
217
|
-
"txpool_getInspect",
|
218
|
-
"txpool_getStatus",
|
219
210
|
"txpool_inspect",
|
220
211
|
"txpool_status",
|
212
|
+
"web3_clientVersion",
|
213
|
+
"web3_sha3",
|
221
214
|
]
|
222
215
|
end
|
223
216
|
end
|
data/lib/eth/chain.rb
CHANGED
@@ -104,6 +104,15 @@ module Eth
|
|
104
104
|
# Chain ID for the geth private network preset.
|
105
105
|
PRIVATE_GETH = 1337.freeze
|
106
106
|
|
107
|
+
# Chain ID for Moonbase
|
108
|
+
MOONBASE = 1287.freeze
|
109
|
+
|
110
|
+
# Chain ID for Moonriver
|
111
|
+
MOONRIVER = 1285.freeze
|
112
|
+
|
113
|
+
# Chain ID for Moonbeam
|
114
|
+
MOONBEAM = 1284.freeze
|
115
|
+
|
107
116
|
# Indicates wether the given `v` indicates a legacy chain value
|
108
117
|
# used by ledger wallets without EIP-155 replay protection.
|
109
118
|
#
|