eth 0.5.5 → 0.5.6
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/lib/eth/abi.rb +22 -4
- data/lib/eth/client.rb +21 -5
- data/lib/eth/contract/function.rb +1 -1
- data/lib/eth/contract/function_input.rb +2 -1
- data/lib/eth/signature.rb +1 -1
- data/lib/eth/version.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: aabc7ea4a3cd8e94e91e5e9d3bfb0600960079c72e9f99de61d721cae0a73feb
|
4
|
+
data.tar.gz: 04e28c96e36958ca58cd49e1e6182a17bf5bc56cab28bd0052f8881899250294
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9e7413915597355913492ea5dc22167507ab4d75b3de8783b8c87fb0849e036316f33264053fd166ada749a08215d599197eb4b94d8c954c898aec80bb91f3d7
|
7
|
+
data.tar.gz: c8b0a8c288ffe282edbda04d73dff58baa66e9f50dba1998c2450b775ed27201b988048dcfd3b902ac81d19b6dfe9e73d60d86b0c300df7e0cddc301b14ec13c
|
data/lib/eth/abi.rb
CHANGED
@@ -74,7 +74,7 @@ module Eth
|
|
74
74
|
# @return [String] the encoded type.
|
75
75
|
# @raise [EncodingError] if value does not match type.
|
76
76
|
def encode_type(type, arg)
|
77
|
-
if %w(string bytes).include? type.base_type and type.sub_type.empty?
|
77
|
+
if %w(string bytes).include? type.base_type and type.sub_type.empty? and type.dimensions.empty?
|
78
78
|
raise EncodingError, "Argument must be a String" unless arg.instance_of? String
|
79
79
|
|
80
80
|
# encodes strings and bytes
|
@@ -89,10 +89,24 @@ module Eth
|
|
89
89
|
head += encode_type Type.size_type, arg.size
|
90
90
|
nested_sub = type.nested_sub
|
91
91
|
nested_sub_size = type.nested_sub.size
|
92
|
-
arg.size.times do |i|
|
93
92
|
|
94
|
-
|
95
|
-
|
93
|
+
# calculate offsets
|
94
|
+
if %w(string bytes).include?(type.base_type) && type.sub_type.empty?
|
95
|
+
offset = 0
|
96
|
+
arg.size.times do |i|
|
97
|
+
if i == 0
|
98
|
+
offset = arg.size * 32
|
99
|
+
else
|
100
|
+
number_of_words = ((arg[i - 1].size + 32 - 1) / 32).floor
|
101
|
+
total_bytes_length = number_of_words * 32
|
102
|
+
offset += total_bytes_length + 32
|
103
|
+
end
|
104
|
+
|
105
|
+
head += encode_type Type.size_type, offset
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
arg.size.times do |i|
|
96
110
|
head += encode_type nested_sub, arg[i]
|
97
111
|
end
|
98
112
|
return "#{head}#{tail}"
|
@@ -306,6 +320,7 @@ module Eth
|
|
306
320
|
|
307
321
|
# Properly encodes unsigned integers.
|
308
322
|
def encode_uint(arg, type)
|
323
|
+
raise ArgumentError, "Don't know how to handle this input." unless arg.is_a? Numeric
|
309
324
|
raise ValueOutOfBounds, "Number out of range: #{arg}" if arg > Constant::UINT_MAX or arg < Constant::UINT_MIN
|
310
325
|
real_size = type.sub_type.to_i
|
311
326
|
i = arg.to_i
|
@@ -315,6 +330,7 @@ module Eth
|
|
315
330
|
|
316
331
|
# Properly encodes signed integers.
|
317
332
|
def encode_int(arg, type)
|
333
|
+
raise ArgumentError, "Don't know how to handle this input." unless arg.is_a? Numeric
|
318
334
|
raise ValueOutOfBounds, "Number out of range: #{arg}" if arg > Constant::INT_MAX or arg < Constant::INT_MIN
|
319
335
|
real_size = type.sub_type.to_i
|
320
336
|
i = arg.to_i
|
@@ -330,6 +346,7 @@ module Eth
|
|
330
346
|
|
331
347
|
# Properly encodes unsigned fixed-point numbers.
|
332
348
|
def encode_ufixed(arg, type)
|
349
|
+
raise ArgumentError, "Don't know how to handle this input." unless arg.is_a? Numeric
|
333
350
|
high, low = type.sub_type.split("x").map(&:to_i)
|
334
351
|
raise ValueOutOfBounds, arg unless arg >= 0 and arg < 2 ** high
|
335
352
|
return Util.zpad_int((arg * 2 ** low).to_i)
|
@@ -337,6 +354,7 @@ module Eth
|
|
337
354
|
|
338
355
|
# Properly encodes signed fixed-point numbers.
|
339
356
|
def encode_fixed(arg, type)
|
357
|
+
raise ArgumentError, "Don't know how to handle this input." unless arg.is_a? Numeric
|
340
358
|
high, low = type.sub_type.split("x").map(&:to_i)
|
341
359
|
raise ValueOutOfBounds, arg unless arg >= -2 ** (high - 1) and arg < 2 ** (high - 1)
|
342
360
|
i = (arg * 2 ** low).to_i
|
data/lib/eth/client.rb
CHANGED
@@ -159,6 +159,7 @@ module Eth
|
|
159
159
|
# *args Optional variable constructor parameter list
|
160
160
|
# **sender_key [Eth::Key] the sender private key.
|
161
161
|
# **legacy [Boolean] enables legacy transactions (pre-EIP-1559).
|
162
|
+
# **gas_limit [Integer] optional gas limit override for deploying the contract.
|
162
163
|
# @return [String] the contract address.
|
163
164
|
def deploy_and_wait(contract, *args, **kwargs)
|
164
165
|
hash = wait_for_tx(deploy(contract, *args, **kwargs))
|
@@ -176,16 +177,21 @@ module Eth
|
|
176
177
|
# *args Optional variable constructor parameter list
|
177
178
|
# **sender_key [Eth::Key] the sender private key.
|
178
179
|
# **legacy [Boolean] enables legacy transactions (pre-EIP-1559).
|
180
|
+
# **gas_limit [Integer] optional gas limit override for deploying the contract.
|
179
181
|
# @return [String] the transaction hash.
|
180
182
|
# @raise [ArgumentError] in case the contract does not have any source.
|
181
183
|
def deploy(contract, *args, **kwargs)
|
182
184
|
raise ArgumentError, "Cannot deploy contract without source or binary!" if contract.bin.nil?
|
183
185
|
raise ArgumentError, "Missing contract constructor params!" if contract.constructor_inputs.length != args.length
|
184
|
-
gas_limit = Tx.estimate_intrinsic_gas(contract.bin) + Tx::CREATE_GAS
|
185
186
|
data = contract.bin
|
186
187
|
unless args.empty?
|
187
188
|
data += encode_constructor_params(contract, args)
|
188
189
|
end
|
190
|
+
gas_limit = if kwargs[:gas_limit]
|
191
|
+
kwargs[:gas_limit]
|
192
|
+
else
|
193
|
+
Tx.estimate_intrinsic_gas(data) + Tx::CREATE_GAS
|
194
|
+
end
|
189
195
|
params = {
|
190
196
|
value: 0,
|
191
197
|
gas_limit: gas_limit,
|
@@ -231,12 +237,13 @@ module Eth
|
|
231
237
|
# @param contract [Eth::Contract] subject contract to call.
|
232
238
|
# @param function_name [String] method name to be called.
|
233
239
|
# @param value [Integer|String] function arguments.
|
234
|
-
# @overload call(contract, function_name, value, sender_key, legacy)
|
240
|
+
# @overload call(contract, function_name, value, sender_key, legacy, gas_limit)
|
235
241
|
# @param contract [Eth::Contract] subject contract to call.
|
236
242
|
# @param function_name [String] method name to be called.
|
237
243
|
# @param value [Integer|String] function arguments.
|
238
244
|
# @param sender_key [Eth::Key] the sender private key.
|
239
245
|
# @param legacy [Boolean] enables legacy transactions (pre-EIP-1559).
|
246
|
+
# @param gas_limit [Integer] optional gas limit override for deploying the contract.
|
240
247
|
# @return [Object] returns the result of the call.
|
241
248
|
def call(contract, function_name, *args, **kwargs)
|
242
249
|
func = contract.functions.select { |func| func.name == function_name }[0]
|
@@ -259,16 +266,21 @@ module Eth
|
|
259
266
|
# @param contract [Eth::Contract] subject contract to call.
|
260
267
|
# @param function_name [String] method name to be called.
|
261
268
|
# @param value [Integer|String] function arguments.
|
262
|
-
# @overload transact(contract, function_name, value, sender_key, legacy, address)
|
269
|
+
# @overload transact(contract, function_name, value, sender_key, legacy, address, gas_limit)
|
263
270
|
# @param contract [Eth::Contract] subject contract to call.
|
264
271
|
# @param function_name [String] method name to be called.
|
265
272
|
# @param value [Integer|String] function arguments.
|
266
273
|
# @param sender_key [Eth::Key] the sender private key.
|
267
274
|
# @param legacy [Boolean] enables legacy transactions (pre-EIP-1559).
|
268
275
|
# @param address [String] contract address.
|
276
|
+
# @param gas_limit [Integer] optional gas limit override for deploying the contract.
|
269
277
|
# @return [Object] returns the result of the call.
|
270
278
|
def transact(contract, function_name, *args, **kwargs)
|
271
|
-
gas_limit =
|
279
|
+
gas_limit = if kwargs[:gas_limit]
|
280
|
+
kwargs[:gas_limit]
|
281
|
+
else
|
282
|
+
Tx.estimate_intrinsic_gas(contract.bin) + Tx::CREATE_GAS
|
283
|
+
end
|
272
284
|
fun = contract.functions.select { |func| func.name == function_name }[0]
|
273
285
|
params = {
|
274
286
|
value: 0,
|
@@ -393,7 +405,11 @@ module Eth
|
|
393
405
|
|
394
406
|
# Non-transactional function call called from call().
|
395
407
|
def call_raw(contract, func, *args, **kwargs)
|
396
|
-
gas_limit =
|
408
|
+
gas_limit = if kwargs[:gas_limit]
|
409
|
+
kwargs[:gas_limit]
|
410
|
+
else
|
411
|
+
Tx.estimate_intrinsic_gas(contract.bin) + Tx::CREATE_GAS
|
412
|
+
end
|
397
413
|
params = {
|
398
414
|
gas_limit: gas_limit,
|
399
415
|
chain_id: chain_id,
|
@@ -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.collect { |x| x.
|
46
|
+
"#{name}(#{inputs.collect { |x| x.raw_type }.join(",")})"
|
47
47
|
end
|
48
48
|
|
49
49
|
# Encodes a function signature.
|
@@ -19,12 +19,13 @@ module Eth
|
|
19
19
|
|
20
20
|
# Provide classes for contract function input.
|
21
21
|
class Contract::FunctionInput
|
22
|
-
attr_accessor :type, :name
|
22
|
+
attr_accessor :type, :raw_type, :name
|
23
23
|
|
24
24
|
# Constructor of the {Eth::Contract::FunctionInput} class.
|
25
25
|
#
|
26
26
|
# @param data [Hash] contract abi data.
|
27
27
|
def initialize(data)
|
28
|
+
@raw_type = data["type"]
|
28
29
|
@type = Eth::Abi::Type.parse(data["type"])
|
29
30
|
@name = data["name"]
|
30
31
|
end
|
data/lib/eth/signature.rb
CHANGED
@@ -38,7 +38,7 @@ module Eth
|
|
38
38
|
# @param message [String] the message string to be prefixed.
|
39
39
|
# @return [String] an EIP-191 prefixed string.
|
40
40
|
def prefix_message(message)
|
41
|
-
"#{EIP191_PREFIX_BYTE}Ethereum Signed Message:\n#{message.
|
41
|
+
"#{EIP191_PREFIX_BYTE}Ethereum Signed Message:\n#{message.bytesize}#{message}"
|
42
42
|
end
|
43
43
|
|
44
44
|
# Dissects a signature blob of 65+ bytes into its `r`, `s`, and `v`
|
data/lib/eth/version.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.6
|
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-07-01 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: keccak
|
@@ -177,7 +177,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
177
177
|
- !ruby/object:Gem::Version
|
178
178
|
version: '0'
|
179
179
|
requirements: []
|
180
|
-
rubygems_version: 3.3.
|
180
|
+
rubygems_version: 3.3.15
|
181
181
|
signing_key:
|
182
182
|
specification_version: 4
|
183
183
|
summary: Ruby Ethereum library.
|