eth 0.5.8 → 0.5.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/spec.yml +1 -1
- data/CHANGELOG.md +14 -0
- data/LICENSE.txt +1 -1
- data/README.md +1 -1
- data/lib/eth/abi/event.rb +1 -1
- data/lib/eth/abi/type.rb +46 -12
- data/lib/eth/abi.rb +72 -14
- data/lib/eth/address.rb +2 -2
- data/lib/eth/api.rb +1 -1
- data/lib/eth/chain.rb +19 -7
- data/lib/eth/client/http.rb +1 -1
- data/lib/eth/client/http_auth.rb +1 -1
- data/lib/eth/client/ipc.rb +1 -1
- data/lib/eth/client.rb +39 -10
- data/lib/eth/constant.rb +1 -1
- data/lib/eth/contract/event.rb +1 -1
- data/lib/eth/contract/function.rb +2 -2
- data/lib/eth/contract/function_input.rb +7 -2
- data/lib/eth/contract/function_output.rb +1 -1
- data/lib/eth/contract/initializer.rb +1 -1
- data/lib/eth/contract.rb +1 -1
- data/lib/eth/eip712.rb +2 -2
- data/lib/eth/ens/resolver.rb +1 -1
- data/lib/eth/key/decrypter.rb +1 -1
- data/lib/eth/key/encrypter.rb +1 -1
- data/lib/eth/key.rb +5 -5
- data/lib/eth/rlp/decoder.rb +2 -2
- data/lib/eth/rlp/encoder.rb +3 -3
- data/lib/eth/rlp/sedes/big_endian_int.rb +1 -1
- data/lib/eth/rlp/sedes/binary.rb +2 -2
- data/lib/eth/rlp/sedes/list.rb +5 -5
- data/lib/eth/rlp/sedes.rb +4 -4
- data/lib/eth/rlp.rb +1 -1
- data/lib/eth/signature.rb +4 -4
- data/lib/eth/solidity.rb +5 -3
- data/lib/eth/tx/eip1559.rb +3 -3
- data/lib/eth/tx/eip2930.rb +3 -3
- data/lib/eth/tx/legacy.rb +3 -3
- data/lib/eth/tx.rb +5 -5
- data/lib/eth/unit.rb +1 -1
- data/lib/eth/util.rb +14 -14
- data/lib/eth/version.rb +2 -2
- data/lib/eth.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b38c43c0d7f3c1403c02e847d02623120bab91260ac0dc841f43719302413e1b
|
4
|
+
data.tar.gz: 41f4086d2911a30869c7cf5c4e63bfff54d618cb16756f5cbebc4f4accb4b26c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 45549c5b9c4deace4df8bbcd34c2e4a02476a4175aa8ea865249bb01983c484d85d67954f3b7e68193b16425e8c83efcd4415cd7c2034730fcd8d0d1a324cf34
|
7
|
+
data.tar.gz: e1dc19f40eaa284ae09faa6fc70d510ae782b1014f95c0b490dfa8ad86dbf6c9f505b47b6c530217258c33279c204ac6be445fd11fe341bcb302492c95d7b69d
|
data/.github/workflows/spec.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,20 @@
|
|
1
1
|
# Change Log
|
2
2
|
All notable changes to this project will be documented in this file.
|
3
3
|
|
4
|
+
## [0.5.8]
|
5
|
+
### Added
|
6
|
+
* Client: ability to manual set nonce of tx for transfer, deploy, transact methods was added. [#169](https://github.com/q9f/eth.rb/pull/169)
|
7
|
+
* Client: ability for call contract methods with specific transaction value was added [#168](https://github.com/q9f/eth.rb/pull/168)
|
8
|
+
* Client: add ENS resolve support [#150](https://github.com/q9f/eth.rb/pull/150)
|
9
|
+
|
10
|
+
### Changed
|
11
|
+
* Client: satisfy yard docs for transfer kwargs [#170](https://github.com/q9f/eth.rb/pull/170)
|
12
|
+
* Client: remove invalid parameters from call_raw method [#166](https://github.com/q9f/eth.rb/pull/166)
|
13
|
+
* Gem: bump required ruby version to 3 [#165](https://github.com/q9f/eth.rb/pull/165)
|
14
|
+
* Build(deps): bump JamesIves/github-pages-deploy-action from 4.4.0 to 4.4.1 [#162](https://github.com/q9f/eth.rb/pull/162)
|
15
|
+
* Gem: bump version to 0.5.8 [#161](https://github.com/q9f/eth.rb/pull/161)
|
16
|
+
* Docs: update changelog [#160](https://github.com/q9f/eth.rb/pull/160)
|
17
|
+
|
4
18
|
## [0.5.7]
|
5
19
|
### Added
|
6
20
|
* Eth/client: add http basic support auth ([#151](https://github.com/q9f/eth.rb/pull/151))
|
data/LICENSE.txt
CHANGED
@@ -187,7 +187,7 @@
|
|
187
187
|
same "printed page" as the copyright notice for easier
|
188
188
|
identification within third-party archives.
|
189
189
|
|
190
|
-
Copyright (c) 2016-
|
190
|
+
Copyright (c) 2016-2023 The Ruby-Eth Contributors
|
191
191
|
|
192
192
|
Licensed under the Apache License, Version 2.0 (the "License");
|
193
193
|
you may not use this file except in compliance with the License.
|
data/README.md
CHANGED
@@ -6,7 +6,7 @@
|
|
6
6
|
|
7
7
|
# Ethereum for Ruby
|
8
8
|
|
9
|
-
[![GitHub Workflow Status](https://img.shields.io/github/workflow/status/q9f/eth.rb/
|
9
|
+
[![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/q9f/eth.rb/spec.yml?branch=main)](https://github.com/q9f/eth.rb/actions)
|
10
10
|
[![GitHub release (latest by date)](https://img.shields.io/github/v/release/q9f/eth.rb)](https://github.com/q9f/eth.rb/releases)
|
11
11
|
[![Gem](https://img.shields.io/gem/v/eth)](https://rubygems.org/gems/eth)
|
12
12
|
[![Gem](https://img.shields.io/gem/dt/eth)](https://rubygems.org/gems/eth)
|
data/lib/eth/abi/event.rb
CHANGED
data/lib/eth/abi/type.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (c) 2016-
|
1
|
+
# Copyright (c) 2016-2023 The Ruby-Eth Contributors
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
@@ -35,18 +35,28 @@ module Eth
|
|
35
35
|
# The dimension attribute, e.g., `[10]` for an array of size 10.
|
36
36
|
attr :dimensions
|
37
37
|
|
38
|
+
# The components of a tuple type.
|
39
|
+
attr :components
|
40
|
+
|
41
|
+
# The name of tuple component.
|
42
|
+
attr :name
|
43
|
+
|
38
44
|
# Create a new Type object for base types, sub types, and dimensions.
|
39
45
|
# Should not be used; use {Type.parse} instead.
|
40
46
|
#
|
41
47
|
# @param base_type [String] the base-type attribute.
|
42
48
|
# @param sub_type [String] the sub-type attribute.
|
43
49
|
# @param dimensions [Array] the dimension attribute.
|
50
|
+
# @param components [Array] the components attribute.
|
51
|
+
# @param component_name [String] the tuple component's name.
|
44
52
|
# @return [Eth::Abi::Type] an ABI type object.
|
45
|
-
def initialize(base_type, sub_type, dimensions)
|
53
|
+
def initialize(base_type, sub_type, dimensions, components = nil, component_name = nil)
|
46
54
|
sub_type = sub_type.to_s
|
47
55
|
@base_type = base_type
|
48
56
|
@sub_type = sub_type
|
49
57
|
@dimensions = dimensions
|
58
|
+
@components = components
|
59
|
+
@name = component_name
|
50
60
|
end
|
51
61
|
|
52
62
|
# Converts the self.parse method into a constructor.
|
@@ -56,9 +66,12 @@ module Eth
|
|
56
66
|
# Creates a new Type upon success (using konstructor).
|
57
67
|
#
|
58
68
|
# @param type [String] a common Solidity type.
|
69
|
+
# @param components [Array] the components attribute.
|
70
|
+
# @param component_name [String] the tuple component's name.
|
59
71
|
# @return [Eth::Abi::Type] a parsed Type object.
|
60
72
|
# @raise [ParseError] if it fails to parse the type.
|
61
|
-
def parse(type)
|
73
|
+
def parse(type, components = nil, component_name = nil)
|
74
|
+
return type if type.is_a?(Type)
|
62
75
|
_, base_type, sub_type, dimension = /([a-z]*)([0-9]*x?[0-9]*)((\[[0-9]*\])*)/.match(type).to_a
|
63
76
|
|
64
77
|
# type dimension can only be numeric
|
@@ -73,6 +86,8 @@ module Eth
|
|
73
86
|
@base_type = base_type
|
74
87
|
@sub_type = sub_type
|
75
88
|
@dimensions = dims.map { |x| x[1...-1].to_i }
|
89
|
+
@components = components.map { |component| Eth::Abi::Type.parse(component["type"], component.dig("components"), component.dig("name")) } unless components.nil?
|
90
|
+
@name = component_name
|
76
91
|
end
|
77
92
|
|
78
93
|
# Creates a new uint256 type used for size.
|
@@ -98,15 +113,13 @@ module Eth
|
|
98
113
|
def size
|
99
114
|
s = nil
|
100
115
|
if dimensions.empty?
|
101
|
-
|
116
|
+
if !(["string", "bytes", "tuple"].include?(base_type) and sub_type.empty?)
|
102
117
|
s = 32
|
118
|
+
elsif base_type == "tuple" && components.none?(&:dynamic?)
|
119
|
+
s = components.sum(&:size)
|
103
120
|
end
|
104
|
-
|
105
|
-
|
106
|
-
unless nested_sub.is_dynamic?
|
107
|
-
s = dimensions.last * nested_sub.size
|
108
|
-
end
|
109
|
-
end
|
121
|
+
elsif dimensions.last != 0 && !nested_sub.dynamic?
|
122
|
+
s = dimensions.last * nested_sub.size
|
110
123
|
end
|
111
124
|
@size ||= s
|
112
125
|
end
|
@@ -114,7 +127,7 @@ module Eth
|
|
114
127
|
# Helpes to determine whether array is of dynamic size.
|
115
128
|
#
|
116
129
|
# @return [Boolean] true if array is of dynamic size.
|
117
|
-
def
|
130
|
+
def dynamic?
|
118
131
|
size.nil?
|
119
132
|
end
|
120
133
|
|
@@ -122,7 +135,24 @@ module Eth
|
|
122
135
|
#
|
123
136
|
# @return [Eth::Abi::Type] nested sub-type.
|
124
137
|
def nested_sub
|
125
|
-
@nested_sub ||= self.class.new(base_type, sub_type, dimensions[0...-1])
|
138
|
+
@nested_sub ||= self.class.new(base_type, sub_type, dimensions[0...-1], components, name)
|
139
|
+
end
|
140
|
+
|
141
|
+
# Allows exporting the type as string.
|
142
|
+
#
|
143
|
+
# @return [String] the type string.
|
144
|
+
def to_s
|
145
|
+
if base_type == "tuple"
|
146
|
+
"(" + components.map(&:to_s).join(",") + ")" + (dimensions.size > 0 ? dimensions.map { |x| "[#{x == 0 ? "" : x}]" }.join : "")
|
147
|
+
elsif dimensions.empty?
|
148
|
+
if %w[string bytes].include?(base_type) && sub_type.empty?
|
149
|
+
base_type
|
150
|
+
else
|
151
|
+
"#{base_type}#{sub_type}"
|
152
|
+
end
|
153
|
+
else
|
154
|
+
"#{base_type}#{sub_type}#{dimensions.map { |x| "[#{x == 0 ? "" : x}]" }.join}"
|
155
|
+
end
|
126
156
|
end
|
127
157
|
|
128
158
|
private
|
@@ -138,6 +168,10 @@ module Eth
|
|
138
168
|
|
139
169
|
# bytes can be no longer than 32 bytes
|
140
170
|
raise ParseError, "Maximum 32 bytes for fixed-length string or bytes" unless sub_type.empty? || sub_type.to_i <= 32
|
171
|
+
when "tuple"
|
172
|
+
|
173
|
+
# tuples can not have any suffix
|
174
|
+
raise ParseError, "Tuple type must have no suffix or numerical suffix" unless sub_type.empty?
|
141
175
|
when "uint", "int"
|
142
176
|
|
143
177
|
# integers must have a numerical suffix
|
data/lib/eth/abi.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (c) 2016-
|
1
|
+
# Copyright (c) 2016-2023 The Ruby-Eth Contributors
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
@@ -45,7 +45,7 @@ module Eth
|
|
45
45
|
def encode(types, args)
|
46
46
|
|
47
47
|
# parse all types
|
48
|
-
parsed_types = types.map { |t| Type.parse(t) }
|
48
|
+
parsed_types = types.map { |t| Type === t ? t : Type.parse(t) }
|
49
49
|
|
50
50
|
# prepare the "head"
|
51
51
|
head_size = (0...args.size)
|
@@ -55,7 +55,7 @@ module Eth
|
|
55
55
|
|
56
56
|
# encode types and arguments
|
57
57
|
args.each_with_index do |arg, i|
|
58
|
-
if parsed_types[i].
|
58
|
+
if parsed_types[i].dynamic?
|
59
59
|
head += encode_type Type.size_type, head_size + tail.size
|
60
60
|
tail += encode_type parsed_types[i], arg
|
61
61
|
else
|
@@ -81,12 +81,16 @@ module Eth
|
|
81
81
|
size = encode_type Type.size_type, arg.size
|
82
82
|
padding = Constant::BYTE_ZERO * (Util.ceil32(arg.size) - arg.size)
|
83
83
|
return "#{size}#{arg}#{padding}"
|
84
|
-
elsif type.
|
85
|
-
|
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)
|
86
90
|
|
87
91
|
# encodes dynamic-sized arrays
|
88
92
|
head, tail = "", ""
|
89
|
-
head += encode_type
|
93
|
+
head += encode_type(Type.size_type, arg.size)
|
90
94
|
nested_sub = type.nested_sub
|
91
95
|
nested_sub_size = type.nested_sub.size
|
92
96
|
|
@@ -102,8 +106,10 @@ module Eth
|
|
102
106
|
offset += total_bytes_length + 32
|
103
107
|
end
|
104
108
|
|
105
|
-
head += encode_type
|
109
|
+
head += encode_type(Type.size_type, offset)
|
106
110
|
end
|
111
|
+
elsif nested_sub.base_type == "tuple" && nested_sub.dynamic?
|
112
|
+
head += encode_struct_offsets(nested_sub, arg)
|
107
113
|
end
|
108
114
|
|
109
115
|
arg.size.times do |i|
|
@@ -145,6 +151,8 @@ module Eth
|
|
145
151
|
return encode_fixed arg, type
|
146
152
|
when "string", "bytes"
|
147
153
|
return encode_bytes arg, type
|
154
|
+
when "tuple"
|
155
|
+
return encode_tuple arg, type
|
148
156
|
when "hash"
|
149
157
|
return encode_hash arg, type
|
150
158
|
when "address"
|
@@ -163,7 +171,7 @@ module Eth
|
|
163
171
|
def decode(types, data)
|
164
172
|
|
165
173
|
# accept hex abi but decode it first
|
166
|
-
data = Util.hex_to_bin data if Util.
|
174
|
+
data = Util.hex_to_bin data if Util.hex? data
|
167
175
|
|
168
176
|
# parse all types
|
169
177
|
parsed_types = types.map { |t| Type.parse(t) }
|
@@ -173,7 +181,7 @@ module Eth
|
|
173
181
|
start_positions = [nil] * types.size + [data.size]
|
174
182
|
pos = 0
|
175
183
|
parsed_types.each_with_index do |t, i|
|
176
|
-
if t.
|
184
|
+
if t.dynamic?
|
177
185
|
|
178
186
|
# record start position for dynamic type
|
179
187
|
start_positions[i] = Util.deserialize_big_endian_to_int(data[pos, 32])
|
@@ -201,7 +209,7 @@ module Eth
|
|
201
209
|
|
202
210
|
# add dynamic types
|
203
211
|
parsed_types.each_with_index do |t, i|
|
204
|
-
if t.
|
212
|
+
if t.dynamic?
|
205
213
|
offset, next_offset = start_positions[i, 2]
|
206
214
|
outputs[i] = data[offset...next_offset]
|
207
215
|
end
|
@@ -225,12 +233,12 @@ module Eth
|
|
225
233
|
|
226
234
|
# decoded strings and bytes
|
227
235
|
return data[0, l]
|
228
|
-
elsif type.
|
236
|
+
elsif type.dynamic?
|
229
237
|
l = Util.deserialize_big_endian_to_int arg[0, 32]
|
230
238
|
nested_sub = type.nested_sub
|
231
239
|
|
232
240
|
# ref https://github.com/ethereum/tests/issues/691
|
233
|
-
raise NotImplementedError, "Decoding dynamic arrays with nested dynamic sub-types is not implemented for ABI." if nested_sub.
|
241
|
+
raise NotImplementedError, "Decoding dynamic arrays with nested dynamic sub-types is not implemented for ABI." if nested_sub.dynamic?
|
234
242
|
|
235
243
|
# decoded dynamic-sized arrays
|
236
244
|
return (0...l).map { |i| decode_type(nested_sub, arg[32 + nested_sub.size * i, nested_sub.size]) }
|
@@ -381,6 +389,56 @@ module Eth
|
|
381
389
|
end
|
382
390
|
end
|
383
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
|
+
|
384
442
|
# Properly encodes hash-strings.
|
385
443
|
def encode_hash(arg, type)
|
386
444
|
size = type.sub_type.to_i
|
@@ -428,8 +486,8 @@ module Eth
|
|
428
486
|
# The ABI encoder needs to be able to determine between a hex `"123"`
|
429
487
|
# and a binary `"123"` string.
|
430
488
|
def handle_hex_string(arg, type)
|
431
|
-
if Util.
|
432
|
-
(arg.size === type.sub_type.to_i * 2 and Util.
|
489
|
+
if Util.prefixed? arg or
|
490
|
+
(arg.size === type.sub_type.to_i * 2 and Util.hex? arg)
|
433
491
|
|
434
492
|
# There is no way telling whether a string is hex or binary with certainty
|
435
493
|
# in Ruby. Therefore, we assume a `0x` prefix to indicate a hex string.
|
data/lib/eth/address.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (c) 2016-
|
1
|
+
# Copyright (c) 2016-2023 The Ruby-Eth Contributors
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
@@ -29,7 +29,7 @@ module Eth
|
|
29
29
|
#
|
30
30
|
# @param address [String] hex string representing an ethereum address.
|
31
31
|
def initialize(address)
|
32
|
-
unless Util.
|
32
|
+
unless Util.hex? address
|
33
33
|
raise CheckSumError, "Unknown address type #{address}!"
|
34
34
|
end
|
35
35
|
@address = Util.prefix_hex address
|
data/lib/eth/api.rb
CHANGED
data/lib/eth/chain.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (c) 2016-
|
1
|
+
# Copyright (c) 2016-2023 The Ruby-Eth Contributors
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
@@ -38,12 +38,18 @@ module Eth
|
|
38
38
|
# Chain ID for POA Network mainnet.
|
39
39
|
POA_NET = 99.freeze
|
40
40
|
|
41
|
-
# Chain ID for Gnosis
|
41
|
+
# Chain ID for xDAI mainnet (now Gnosis Chain).
|
42
42
|
XDAI = 100.freeze
|
43
43
|
|
44
|
-
# Chain ID for
|
44
|
+
# Chain ID for Gnosis mainnet (formerly xDAI).
|
45
|
+
GNOSIS = XDAI.freeze
|
46
|
+
|
47
|
+
# Chain ID for the Matic mainnet (now Polygon).
|
45
48
|
MATIC = 137.freeze
|
46
49
|
|
50
|
+
# Chain ID for the Polygon mainnet (formerly Matic).
|
51
|
+
POLYGON = MATIC.freeze
|
52
|
+
|
47
53
|
# Chain ID for Arbitrum mainnet.
|
48
54
|
ARBITRUM = 42161.freeze
|
49
55
|
|
@@ -86,9 +92,15 @@ module Eth
|
|
86
92
|
# Chain ID for Arbitrum Rinkeby testnet.
|
87
93
|
RINKEBY_ARBITRUM = 421611.freeze
|
88
94
|
|
95
|
+
# Chain ID for Arbitrum Goerli testnet.
|
96
|
+
GOERLI_ARBITRUM = 421613.freeze
|
97
|
+
|
89
98
|
# Chain ID for Sepolia testnet.
|
90
99
|
SEPOLIA = 11155111.freeze
|
91
100
|
|
101
|
+
# Chain ID for Holesovice testnet.
|
102
|
+
HOLESOVICE = 11166111.freeze
|
103
|
+
|
92
104
|
# Chain ID for the geth private network preset.
|
93
105
|
PRIVATE_GETH = 1337.freeze
|
94
106
|
|
@@ -97,7 +109,7 @@ module Eth
|
|
97
109
|
#
|
98
110
|
# @param v [Integer] the signature's `v` value.
|
99
111
|
# @return [Boolean] true if ledger's legacy value.
|
100
|
-
def
|
112
|
+
def ledger?(v)
|
101
113
|
[0, 1].include? v
|
102
114
|
end
|
103
115
|
|
@@ -106,7 +118,7 @@ module Eth
|
|
106
118
|
#
|
107
119
|
# @param v [Integer] the signature's `v` value.
|
108
120
|
# @return [Boolean] true if legacy value.
|
109
|
-
def
|
121
|
+
def legacy?(v)
|
110
122
|
[27, 28].include? v
|
111
123
|
end
|
112
124
|
|
@@ -120,11 +132,11 @@ module Eth
|
|
120
132
|
def to_recovery_id(v, chain_id = ETHEREUM)
|
121
133
|
e = 0 + 2 * chain_id + 35
|
122
134
|
i = 1 + 2 * chain_id + 35
|
123
|
-
if
|
135
|
+
if ledger? v
|
124
136
|
|
125
137
|
# some wallets are using a `v` of 0 or 1 (ledger)
|
126
138
|
return v
|
127
|
-
elsif
|
139
|
+
elsif legacy? v
|
128
140
|
|
129
141
|
# this is the pre-EIP-155 legacy case
|
130
142
|
return v - 27
|
data/lib/eth/client/http.rb
CHANGED
data/lib/eth/client/http_auth.rb
CHANGED
data/lib/eth/client/ipc.rb
CHANGED
data/lib/eth/client.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (c) 2016-
|
1
|
+
# Copyright (c) 2016-2023 The Ruby-Eth Contributors
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
@@ -37,6 +37,9 @@ module Eth
|
|
37
37
|
# The default gas limit for the transaction, defaults to {Tx::DEFAULT_GAS_LIMIT}.
|
38
38
|
attr_accessor :gas_limit
|
39
39
|
|
40
|
+
# A custom error type if a contract interaction fails.
|
41
|
+
class ContractExecutionError < StandardError; end
|
42
|
+
|
40
43
|
# Creates a new RPC-Client, either by providing an HTTP/S host or
|
41
44
|
# an IPC path. Supports basic authentication with username and password.
|
42
45
|
#
|
@@ -345,9 +348,15 @@ module Eth
|
|
345
348
|
#
|
346
349
|
# See {#transact} for params and overloads.
|
347
350
|
#
|
351
|
+
# @raise [Client::ContractExecutionError] if the execution fails.
|
348
352
|
# @return [Object] returns the result of the transaction.
|
349
353
|
def transact_and_wait(contract, function, *args, **kwargs)
|
350
|
-
|
354
|
+
begin
|
355
|
+
hash = wait_for_tx(transact(contract, function, *args, **kwargs))
|
356
|
+
return hash if tx_succeeded? hash
|
357
|
+
rescue IOError => e
|
358
|
+
raise ContractExecutionError, e
|
359
|
+
end
|
351
360
|
end
|
352
361
|
|
353
362
|
# Provides an interface to call `isValidSignature` as per EIP-1271 on a given
|
@@ -362,9 +371,9 @@ module Eth
|
|
362
371
|
# @raise [ArgumentError] in case the contract cannot be called yet.
|
363
372
|
def is_valid_signature(contract, hash, signature, magic = "1626ba7e")
|
364
373
|
raise ArgumentError, "Contract not deployed yet." if contract.address.nil?
|
365
|
-
hash = Util.hex_to_bin hash if Util.
|
366
|
-
signature = Util.hex_to_bin signature if Util.
|
367
|
-
magic = Util.hex_to_bin magic if Util.
|
374
|
+
hash = Util.hex_to_bin hash if Util.hex? hash
|
375
|
+
signature = Util.hex_to_bin signature if Util.hex? signature
|
376
|
+
magic = Util.hex_to_bin magic if Util.hex? magic
|
368
377
|
result = call(contract, "isValidSignature", hash, signature)
|
369
378
|
return result === magic
|
370
379
|
end
|
@@ -377,15 +386,24 @@ module Eth
|
|
377
386
|
@id = 0
|
378
387
|
end
|
379
388
|
|
380
|
-
#
|
389
|
+
# Checks whether a transaction is mined or not.
|
381
390
|
#
|
382
391
|
# @param hash [String] the transaction hash.
|
383
392
|
# @return [Boolean] true if included in a block.
|
384
|
-
def
|
393
|
+
def tx_mined?(hash)
|
385
394
|
mined_tx = eth_get_transaction_by_hash hash
|
386
395
|
!mined_tx.nil? && !mined_tx["result"].nil? && !mined_tx["result"]["blockNumber"].nil?
|
387
396
|
end
|
388
397
|
|
398
|
+
# Checks whether a contract transaction succeeded or not.
|
399
|
+
#
|
400
|
+
# @param hash [String] the transaction hash.
|
401
|
+
# @return [Boolean] true if status is success.
|
402
|
+
def tx_succeeded?(hash)
|
403
|
+
tx_receipt = eth_get_transaction_receipt(hash)
|
404
|
+
!tx_receipt.nil? && !tx_receipt["result"].nil? && tx_receipt["result"]["status"] == "0x1"
|
405
|
+
end
|
406
|
+
|
389
407
|
# Waits for an transaction to be mined by the connected chain.
|
390
408
|
#
|
391
409
|
# @param hash [String] the transaction hash.
|
@@ -397,7 +415,7 @@ module Eth
|
|
397
415
|
retry_rate = 0.1
|
398
416
|
loop do
|
399
417
|
raise Timeout::Error if ((Time.now - start_time) > timeout)
|
400
|
-
return hash if
|
418
|
+
return hash if tx_mined? hash
|
401
419
|
sleep retry_rate
|
402
420
|
end
|
403
421
|
end
|
@@ -430,7 +448,7 @@ module Eth
|
|
430
448
|
|
431
449
|
# Encodes function call payloads.
|
432
450
|
def call_payload(fun, args)
|
433
|
-
types = fun.inputs.map
|
451
|
+
types = fun.inputs.map(&:parsed_type)
|
434
452
|
encoded_str = Util.bin_to_hex(Eth::Abi.encode(types, args))
|
435
453
|
Util.prefix_hex(fun.signature + (encoded_str.empty? ? "0" * 64 : encoded_str))
|
436
454
|
end
|
@@ -460,17 +478,28 @@ module Eth
|
|
460
478
|
@id += 1
|
461
479
|
end
|
462
480
|
|
481
|
+
# expects Hash object
|
482
|
+
def camelize!(params)
|
483
|
+
params.transform_keys! do |k|
|
484
|
+
k = k.to_s.split(/_/).map(&:capitalize).join
|
485
|
+
k[0] = k[0].downcase
|
486
|
+
k.to_sym
|
487
|
+
end
|
488
|
+
end
|
489
|
+
|
463
490
|
# Recursively marshals all request parameters.
|
464
491
|
def marshal(params)
|
492
|
+
params = params.dup
|
465
493
|
if params.is_a? Array
|
466
494
|
return params.map! { |param| marshal(param) }
|
467
495
|
elsif params.is_a? Hash
|
496
|
+
params = camelize!(params)
|
468
497
|
return params.transform_values! { |param| marshal(param) }
|
469
498
|
elsif params.is_a? Numeric
|
470
499
|
return Util.prefix_hex "#{params.to_i.to_s(16)}"
|
471
500
|
elsif params.is_a? Address
|
472
501
|
return params.to_s
|
473
|
-
elsif Util.
|
502
|
+
elsif Util.hex? params
|
474
503
|
return Util.prefix_hex params
|
475
504
|
else
|
476
505
|
return params
|
data/lib/eth/constant.rb
CHANGED
data/lib/eth/contract/event.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (c) 2016-
|
1
|
+
# Copyright (c) 2016-2023 The Ruby-Eth Contributors
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
@@ -43,7 +43,7 @@ module Eth
|
|
43
43
|
# @param inputs [Array<Eth::Contract::FunctionInput>] function input class list.
|
44
44
|
# @return [String] function string.
|
45
45
|
def self.calc_signature(name, inputs)
|
46
|
-
"#{name}(#{inputs.
|
46
|
+
"#{name}(#{inputs.map { |x| x.parsed_type.to_s }.join(",")})"
|
47
47
|
end
|
48
48
|
|
49
49
|
# Encodes a function signature.
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (c) 2016-
|
1
|
+
# Copyright (c) 2016-2023 The Ruby-Eth Contributors
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
@@ -26,7 +26,7 @@ module Eth
|
|
26
26
|
# @param data [Hash] contract abi data.
|
27
27
|
def initialize(data)
|
28
28
|
@raw_type = data["type"]
|
29
|
-
@type = Eth::Abi::Type.parse(data["type"])
|
29
|
+
@type = Eth::Abi::Type.parse(data["type"], data["components"])
|
30
30
|
@name = data["name"]
|
31
31
|
end
|
32
32
|
|
@@ -34,5 +34,10 @@ module Eth
|
|
34
34
|
def type
|
35
35
|
@type.base_type + @type.sub_type + @type.dimensions.map { |dimension| "[#{dimension > 0 ? dimension : ""}]" }.join("")
|
36
36
|
end
|
37
|
+
|
38
|
+
# Returns parsed types.
|
39
|
+
def parsed_type
|
40
|
+
@type
|
41
|
+
end
|
37
42
|
end
|
38
43
|
end
|
data/lib/eth/contract.rb
CHANGED
data/lib/eth/eip712.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (c) 2016-
|
1
|
+
# Copyright (c) 2016-2023 The Ruby-Eth Contributors
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
@@ -149,7 +149,7 @@ module Eth
|
|
149
149
|
# @return [Array] the data in the data structure we want to hash.
|
150
150
|
# @raise [TypedDataError] if the data fails validation.
|
151
151
|
def enforce_typed_data(data)
|
152
|
-
data = JSON.parse data if Util.
|
152
|
+
data = JSON.parse data if Util.hex? data
|
153
153
|
raise TypedDataError, "Data is missing, try again with data." if data.nil? or data.empty?
|
154
154
|
raise TypedDataError, "Data types are missing." if data[:types].nil? or data[:types].empty?
|
155
155
|
raise TypedDataError, "Data primaryType is missing." if data[:primaryType].nil? or data[:primaryType].empty?
|
data/lib/eth/ens/resolver.rb
CHANGED
data/lib/eth/key/decrypter.rb
CHANGED
data/lib/eth/key/encrypter.rb
CHANGED
data/lib/eth/key.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (c) 2016-
|
1
|
+
# Copyright (c) 2016-2023 The Ruby-Eth Contributors
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
@@ -51,7 +51,7 @@ module Eth
|
|
51
51
|
unless priv.nil?
|
52
52
|
|
53
53
|
# Converts hex private keys to binary strings.
|
54
|
-
priv = Util.hex_to_bin priv if Util.
|
54
|
+
priv = Util.hex_to_bin priv if Util.hex? priv
|
55
55
|
|
56
56
|
# Creates a keypair from existing private key data.
|
57
57
|
key = ctx.key_pair_from_private_key priv
|
@@ -74,10 +74,10 @@ module Eth
|
|
74
74
|
compact, recovery_id = context.sign_recoverable(@private_key, blob).compact
|
75
75
|
signature = compact.bytes
|
76
76
|
v = Chain.to_v recovery_id, chain_id
|
77
|
-
|
77
|
+
leading_zero = true
|
78
78
|
[v].pack("N").unpack("C*").each do |byte|
|
79
|
-
|
80
|
-
signature.append byte unless
|
79
|
+
leading_zero = false if byte > 0 and leading_zero
|
80
|
+
signature.append byte unless leading_zero and byte === 0
|
81
81
|
end
|
82
82
|
Util.bin_to_hex signature.pack "c*"
|
83
83
|
end
|
data/lib/eth/rlp/decoder.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (c) 2016-
|
1
|
+
# Copyright (c) 2016-2023 The Ruby-Eth Contributors
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
@@ -31,7 +31,7 @@ module Eth
|
|
31
31
|
# @raise [Eth::Rlp::DecodingError] if the input string does not end after
|
32
32
|
# the root item.
|
33
33
|
def perform(rlp)
|
34
|
-
rlp = Util.hex_to_bin rlp if Util.
|
34
|
+
rlp = Util.hex_to_bin rlp if Util.hex? rlp
|
35
35
|
rlp = Util.str_to_bytes rlp
|
36
36
|
begin
|
37
37
|
item, next_start = consume_item rlp, 0
|
data/lib/eth/rlp/encoder.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (c) 2016-
|
1
|
+
# Copyright (c) 2016-2023 The Ruby-Eth Contributors
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
@@ -41,8 +41,8 @@ module Eth
|
|
41
41
|
# Encodes the raw item.
|
42
42
|
def encode_raw(item)
|
43
43
|
return item if item.instance_of? Rlp::Data
|
44
|
-
return encode_primitive item if Util.
|
45
|
-
return encode_list item if Util.
|
44
|
+
return encode_primitive item if Util.primitive? item
|
45
|
+
return encode_list item if Util.list? item
|
46
46
|
raise EncodingError "Cannot encode object of type #{item.class.name}"
|
47
47
|
end
|
48
48
|
|
data/lib/eth/rlp/sedes/binary.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (c) 2016-
|
1
|
+
# Copyright (c) 2016-2023 The Ruby-Eth Contributors
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
@@ -78,7 +78,7 @@ module Eth
|
|
78
78
|
# @raise [DeserializationError] if provided serial is of wrong type.
|
79
79
|
# @raise [DeserializationError] if provided serial is of wrong length.
|
80
80
|
def deserialize(serial)
|
81
|
-
raise DeserializationError, "Objects of type #{serial.class} cannot be deserialized" unless Util.
|
81
|
+
raise DeserializationError, "Objects of type #{serial.class} cannot be deserialized" unless Util.primitive? serial
|
82
82
|
raise DeserializationError, "#{serial.class} has invalid length" unless valid_length? serial.size
|
83
83
|
serial
|
84
84
|
end
|
data/lib/eth/rlp/sedes/list.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (c) 2016-
|
1
|
+
# Copyright (c) 2016-2023 The Ruby-Eth Contributors
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
@@ -34,9 +34,9 @@ module Eth
|
|
34
34
|
super()
|
35
35
|
@strict = strict
|
36
36
|
elements.each do |e|
|
37
|
-
if Sedes.
|
37
|
+
if Sedes.sedes?(e)
|
38
38
|
push e
|
39
|
-
elsif Util.
|
39
|
+
elsif Util.list?(e)
|
40
40
|
push List.new(elements: e)
|
41
41
|
else
|
42
42
|
raise TypeError, "Instances of List must only contain sedes objects or nested sequences thereof."
|
@@ -51,7 +51,7 @@ module Eth
|
|
51
51
|
# @raise [SerializationError] if provided array is not a sequence.
|
52
52
|
# @raise [SerializationError] if provided array is of wrong length.
|
53
53
|
def serialize(obj)
|
54
|
-
raise SerializationError, "Can only serialize sequences" unless Util.
|
54
|
+
raise SerializationError, "Can only serialize sequences" unless Util.list?(obj)
|
55
55
|
raise SerializationError, "List has wrong length" if (@strict && self.size != obj.size) || self.size < obj.size
|
56
56
|
result = []
|
57
57
|
obj.zip(self).each_with_index do |(element, sedes), i|
|
@@ -67,7 +67,7 @@ module Eth
|
|
67
67
|
# @raise [DeserializationError] if provided serial is not a sequence.
|
68
68
|
# @raise [DeserializationError] if provided serial is of wrong length.
|
69
69
|
def deserialize(serial)
|
70
|
-
raise DeserializationError, "Can only deserialize sequences" unless Util.
|
70
|
+
raise DeserializationError, "Can only deserialize sequences" unless Util.list?(serial)
|
71
71
|
raise DeserializationError, "List has wrong length" if @strict && serial.size != self.size
|
72
72
|
result = []
|
73
73
|
len = [serial.size, self.size].min
|
data/lib/eth/rlp/sedes.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (c) 2016-
|
1
|
+
# Copyright (c) 2016-2023 The Ruby-Eth Contributors
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
@@ -39,10 +39,10 @@ module Eth
|
|
39
39
|
# @param obj [Object] the Ruby object for which to find a sedes object.
|
40
40
|
# @raise [TypeError] if no appropriate sedes could be found.
|
41
41
|
def infer(obj)
|
42
|
-
return obj.class if
|
42
|
+
return obj.class if sedes? obj.class
|
43
43
|
return big_endian_int if obj.is_a?(Integer) && obj >= 0
|
44
44
|
return binary if Binary.valid_type? obj
|
45
|
-
return List.new(elements: obj.map { |item| infer item }) if Util.
|
45
|
+
return List.new(elements: obj.map { |item| infer item }) if Util.list? obj
|
46
46
|
raise TypeError, "Did not find sedes handling type #{obj.class.name}"
|
47
47
|
end
|
48
48
|
|
@@ -50,7 +50,7 @@ module Eth
|
|
50
50
|
#
|
51
51
|
# @param obj [Object] the object to check.
|
52
52
|
# @return [Boolean] true if it's serializable and deserializable.
|
53
|
-
def
|
53
|
+
def sedes?(obj)
|
54
54
|
obj.respond_to?(:serialize) && obj.respond_to?(:deserialize)
|
55
55
|
end
|
56
56
|
|
data/lib/eth/rlp.rb
CHANGED
data/lib/eth/signature.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (c) 2016-
|
1
|
+
# Copyright (c) 2016-2023 The Ruby-Eth Contributors
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
@@ -48,7 +48,7 @@ module Eth
|
|
48
48
|
# @return [String, String, String] the `r`, `s`, and `v` values.
|
49
49
|
# @raise [SignatureError] if signature is of unknown size.
|
50
50
|
def dissect(signature)
|
51
|
-
signature = Util.bin_to_hex signature unless Util.
|
51
|
+
signature = Util.bin_to_hex signature unless Util.hex? signature
|
52
52
|
signature = Util.remove_hex_prefix signature
|
53
53
|
if signature.size < 130
|
54
54
|
raise SignatureError, "Unknown signature length #{signature.size}!"
|
@@ -70,7 +70,7 @@ module Eth
|
|
70
70
|
context = Secp256k1::Context.new
|
71
71
|
r, s, v = dissect signature
|
72
72
|
v = v.to_i(16)
|
73
|
-
if !Chain.
|
73
|
+
if !Chain.ledger? v and !Chain.legacy? v
|
74
74
|
min_v = 2 * chain_id + 35
|
75
75
|
raise SignatureError, "Invalid signature v byte #{v} for chain ID #{chain_id}!" if v < min_v
|
76
76
|
end
|
@@ -126,7 +126,7 @@ module Eth
|
|
126
126
|
|
127
127
|
# recover message from personal_sign
|
128
128
|
recovered_key = personal_recover blob, signature, chain_id
|
129
|
-
elsif blob.instance_of? String and (Util.
|
129
|
+
elsif blob.instance_of? String and (Util.hex? blob or blob.encoding == Encoding::ASCII_8BIT)
|
130
130
|
|
131
131
|
# if nothing else, recover from arbitrary signature
|
132
132
|
recovered_key = recover blob, signature, chain_id
|
data/lib/eth/solidity.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (c) 2016-
|
1
|
+
# Copyright (c) 2016-2023 The Ruby-Eth Contributors
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
@@ -42,8 +42,10 @@ module Eth
|
|
42
42
|
# @return [Array] JSON containing the compiled contract and ABI for all contracts.
|
43
43
|
def compile(contract)
|
44
44
|
raise Errno::ENOENT, "Contract file not found: #{contract}" unless File.exist? contract
|
45
|
-
|
46
|
-
|
45
|
+
flag_opt = "--optimize"
|
46
|
+
flag_json = "--combined-json=bin,abi"
|
47
|
+
path = File.realpath contract
|
48
|
+
output, error, status = Open3.capture3 @compiler, flag_opt, flag_json, path
|
47
49
|
raise SystemCallError, "Unable to run solc compiler!" if status.exitstatus === 127
|
48
50
|
raise CompilerError, error unless status.success?
|
49
51
|
json = JSON.parse output
|
data/lib/eth/tx/eip1559.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (c) 2016-
|
1
|
+
# Copyright (c) 2016-2023 The Ruby-Eth Contributors
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
@@ -231,7 +231,7 @@ module Eth
|
|
231
231
|
# @raise [Signature::SignatureError] if transaction is already signed.
|
232
232
|
# @raise [Signature::SignatureError] if sender address does not match signing key.
|
233
233
|
def sign(key)
|
234
|
-
if Tx.
|
234
|
+
if Tx.signed? self
|
235
235
|
raise Signature::SignatureError, "Transaction is already signed!"
|
236
236
|
end
|
237
237
|
|
@@ -258,7 +258,7 @@ module Eth
|
|
258
258
|
# @return [String] a raw, RLP-encoded EIP-1559 type transaction object.
|
259
259
|
# @raise [Signature::SignatureError] if the transaction is not yet signed.
|
260
260
|
def encoded
|
261
|
-
unless Tx.
|
261
|
+
unless Tx.signed? self
|
262
262
|
raise Signature::SignatureError, "Transaction is not signed!"
|
263
263
|
end
|
264
264
|
tx_data = []
|
data/lib/eth/tx/eip2930.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (c) 2016-
|
1
|
+
# Copyright (c) 2016-2023 The Ruby-Eth Contributors
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
@@ -225,7 +225,7 @@ module Eth
|
|
225
225
|
# @raise [Signature::SignatureError] if transaction is already signed.
|
226
226
|
# @raise [Signature::SignatureError] if sender address does not match signing key.
|
227
227
|
def sign(key)
|
228
|
-
if Tx.
|
228
|
+
if Tx.signed? self
|
229
229
|
raise Signature::SignatureError, "Transaction is already signed!"
|
230
230
|
end
|
231
231
|
|
@@ -252,7 +252,7 @@ module Eth
|
|
252
252
|
# @return [String] a raw, RLP-encoded EIP-2930 type transaction object.
|
253
253
|
# @raise [Signature::SignatureError] if the transaction is not yet signed.
|
254
254
|
def encoded
|
255
|
-
unless Tx.
|
255
|
+
unless Tx.signed? self
|
256
256
|
raise Signature::SignatureError, "Transaction is not signed!"
|
257
257
|
end
|
258
258
|
tx_data = []
|
data/lib/eth/tx/legacy.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (c) 2016-
|
1
|
+
# Copyright (c) 2016-2023 The Ruby-Eth Contributors
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
@@ -205,7 +205,7 @@ module Eth
|
|
205
205
|
# @raise [Signature::SignatureError] if transaction is already signed.
|
206
206
|
# @raise [Signature::SignatureError] if sender address does not match signing key.
|
207
207
|
def sign(key)
|
208
|
-
if Tx.
|
208
|
+
if Tx.signed? self
|
209
209
|
raise Signature::SignatureError, "Transaction is already signed!"
|
210
210
|
end
|
211
211
|
|
@@ -230,7 +230,7 @@ module Eth
|
|
230
230
|
# @return [String] a raw, RLP-encoded legacy transaction.
|
231
231
|
# @raise [Signature::SignatureError] if the transaction is not yet signed.
|
232
232
|
def encoded
|
233
|
-
unless Tx.
|
233
|
+
unless Tx.signed? self
|
234
234
|
raise Signature::SignatureError, "Transaction is not signed!"
|
235
235
|
end
|
236
236
|
tx_data = []
|
data/lib/eth/tx.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (c) 2016-
|
1
|
+
# Copyright (c) 2016-2023 The Ruby-Eth Contributors
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
@@ -164,7 +164,7 @@ module Eth
|
|
164
164
|
def estimate_intrinsic_gas(data = "", list = [])
|
165
165
|
gas = DEFAULT_GAS_LIMIT
|
166
166
|
unless data.nil? or data.empty?
|
167
|
-
data = Util.hex_to_bin data if Util.
|
167
|
+
data = Util.hex_to_bin data if Util.hex? data
|
168
168
|
|
169
169
|
# count zero bytes
|
170
170
|
zero = data.count ZERO_BYTE
|
@@ -288,7 +288,7 @@ module Eth
|
|
288
288
|
data = "" if data.nil?
|
289
289
|
|
290
290
|
# ensure payload to be binary if it's hex, otherwise we'll treat it raw
|
291
|
-
data = Util.hex_to_bin data if Util.
|
291
|
+
data = Util.hex_to_bin data if Util.hex? data
|
292
292
|
return data
|
293
293
|
end
|
294
294
|
|
@@ -305,7 +305,7 @@ module Eth
|
|
305
305
|
|
306
306
|
# recursively check the entire array
|
307
307
|
list[index] = sanitize_list value
|
308
|
-
elsif Util.
|
308
|
+
elsif Util.hex? value
|
309
309
|
|
310
310
|
# only modify if we find a hex value
|
311
311
|
list[index] = Util.hex_to_bin value
|
@@ -317,7 +317,7 @@ module Eth
|
|
317
317
|
# Allows to check wether a transaction is signed already.
|
318
318
|
#
|
319
319
|
# @return [Bool] true if transaction is already signed.
|
320
|
-
def
|
320
|
+
def signed?(tx)
|
321
321
|
!tx.signature_r.nil? and tx.signature_r != 0 and
|
322
322
|
!tx.signature_s.nil? and tx.signature_s != 0
|
323
323
|
end
|
data/lib/eth/unit.rb
CHANGED
data/lib/eth/util.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (c) 2016-
|
1
|
+
# Copyright (c) 2016-2023 The Ruby-Eth Contributors
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
@@ -27,7 +27,7 @@ module Eth
|
|
27
27
|
# @param str [String] the public key to be converted.
|
28
28
|
# @return [Eth::Address] an Ethereum address.
|
29
29
|
def public_key_to_address(str)
|
30
|
-
str = hex_to_bin str if
|
30
|
+
str = hex_to_bin str if hex? str
|
31
31
|
bytes = keccak256(str[1..-1])[-20..-1]
|
32
32
|
Address.new bin_to_prefixed_hex bytes
|
33
33
|
end
|
@@ -59,7 +59,7 @@ module Eth
|
|
59
59
|
def hex_to_bin(hex)
|
60
60
|
raise TypeError, "Value must be an instance of String" unless hex.instance_of? String
|
61
61
|
hex = remove_hex_prefix hex
|
62
|
-
raise TypeError, "Non-hexadecimal digit found" unless
|
62
|
+
raise TypeError, "Non-hexadecimal digit found" unless hex? hex
|
63
63
|
[hex].pack("H*")
|
64
64
|
end
|
65
65
|
|
@@ -68,7 +68,7 @@ module Eth
|
|
68
68
|
# @param hex [String] a hex-string to be prefixed.
|
69
69
|
# @return [String] a prefixed hex-string.
|
70
70
|
def prefix_hex(hex)
|
71
|
-
return hex if
|
71
|
+
return hex if prefixed? hex
|
72
72
|
return "0x#{hex}"
|
73
73
|
end
|
74
74
|
|
@@ -77,7 +77,7 @@ module Eth
|
|
77
77
|
# @param hex [String] a prefixed hex-string.
|
78
78
|
# @return [String] an unprefixed hex-string.
|
79
79
|
def remove_hex_prefix(hex)
|
80
|
-
return hex[2..-1] if
|
80
|
+
return hex[2..-1] if prefixed? hex
|
81
81
|
return hex
|
82
82
|
end
|
83
83
|
|
@@ -93,7 +93,7 @@ module Eth
|
|
93
93
|
#
|
94
94
|
# @param str [String] a string to be checked.
|
95
95
|
# @return [String] a match if true; `nil` if not.
|
96
|
-
def
|
96
|
+
def hex?(str)
|
97
97
|
return false unless str.is_a? String
|
98
98
|
str = remove_hex_prefix str
|
99
99
|
str.match /\A[0-9a-fA-F]*\z/
|
@@ -103,7 +103,7 @@ module Eth
|
|
103
103
|
#
|
104
104
|
# @param hex [String] a string to be checked.
|
105
105
|
# @return [String] a match if true; `nil` if not.
|
106
|
-
def
|
106
|
+
def prefixed?(hex)
|
107
107
|
hex.match /\A0x/
|
108
108
|
end
|
109
109
|
|
@@ -113,7 +113,7 @@ module Eth
|
|
113
113
|
# @return [String] serialized big endian integer string.
|
114
114
|
# @raise [ArgumentError] if unsigned integer is out of bounds.
|
115
115
|
def serialize_int_to_big_endian(num)
|
116
|
-
num = num.to_i(16) if
|
116
|
+
num = num.to_i(16) if hex? num
|
117
117
|
unless num.is_a? Integer and num >= 0 and num <= Constant::UINT_MAX
|
118
118
|
raise ArgumentError, "Integer invalid or out of range: #{num}"
|
119
119
|
end
|
@@ -125,7 +125,7 @@ module Eth
|
|
125
125
|
# @param num [Integer] integer to be converted.
|
126
126
|
# @return [String] packed, big-endian integer string.
|
127
127
|
def int_to_big_endian(num)
|
128
|
-
hex = num.to_s(16) unless
|
128
|
+
hex = num.to_s(16) unless hex? num
|
129
129
|
hex = "0#{hex}" if hex.size.odd?
|
130
130
|
hex_to_bin hex
|
131
131
|
end
|
@@ -151,7 +151,7 @@ module Eth
|
|
151
151
|
# @param str [String] binary string to be converted.
|
152
152
|
# @return [Object] the string bytes.
|
153
153
|
def str_to_bytes(str)
|
154
|
-
|
154
|
+
bytes?(str) ? str : str.b
|
155
155
|
end
|
156
156
|
|
157
157
|
# Converts bytes to a binary string.
|
@@ -166,7 +166,7 @@ module Eth
|
|
166
166
|
#
|
167
167
|
# @param str [String] a string to check.
|
168
168
|
# @return [Boolean] true if it's an ASCII-8bit encoded byte-string.
|
169
|
-
def
|
169
|
+
def bytes?(str)
|
170
170
|
str && str.instance_of?(String) && str.encoding.name == Constant::BINARY_ENCODING
|
171
171
|
end
|
172
172
|
|
@@ -174,7 +174,7 @@ module Eth
|
|
174
174
|
#
|
175
175
|
# @param item [Object] the item to check.
|
176
176
|
# @return [Boolean] true if it's a string primitive.
|
177
|
-
def
|
177
|
+
def primitive?(item)
|
178
178
|
item.instance_of?(String)
|
179
179
|
end
|
180
180
|
|
@@ -182,8 +182,8 @@ module Eth
|
|
182
182
|
#
|
183
183
|
# @param item [Object] the item to check.
|
184
184
|
# @return [Boolean] true if it's a list.
|
185
|
-
def
|
186
|
-
!
|
185
|
+
def list?(item)
|
186
|
+
!primitive?(item) && item.respond_to?(:each)
|
187
187
|
end
|
188
188
|
|
189
189
|
# Ceil and integer to the next multiple of 32 bytes.
|
data/lib/eth/version.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (c) 2016-
|
1
|
+
# Copyright (c) 2016-2023 The Ruby-Eth Contributors
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
@@ -16,5 +16,5 @@
|
|
16
16
|
module Eth
|
17
17
|
|
18
18
|
# Defines the version of the {Eth} module.
|
19
|
-
VERSION = "0.5.
|
19
|
+
VERSION = "0.5.9".freeze
|
20
20
|
end
|
data/lib/eth.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: eth
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Steve Ellis
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: exe
|
11
11
|
cert_chain: []
|
12
|
-
date: 2022-
|
12
|
+
date: 2022-12-21 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: keccak
|
@@ -181,7 +181,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
181
181
|
- !ruby/object:Gem::Version
|
182
182
|
version: '0'
|
183
183
|
requirements: []
|
184
|
-
rubygems_version: 3.
|
184
|
+
rubygems_version: 3.2.32
|
185
185
|
signing_key:
|
186
186
|
specification_version: 4
|
187
187
|
summary: Ruby Ethereum library.
|