eth 0.5.4 → 0.5.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/dependabot.yml +18 -0
- data/.github/workflows/codeql.yml +4 -4
- data/.github/workflows/docs.yml +2 -2
- data/.github/workflows/spec.yml +1 -1
- data/CHANGELOG.md +13 -0
- data/lib/eth/abi.rb +20 -0
- data/lib/eth/chain.rb +6 -0
- data/lib/eth/client.rb +37 -25
- data/lib/eth/contract/event.rb +1 -0
- data/lib/eth/contract/function.rb +4 -3
- data/lib/eth/contract/function_input.rb +2 -1
- data/lib/eth/contract/function_output.rb +5 -0
- data/lib/eth/contract/initializer.rb +2 -1
- data/lib/eth/contract.rb +8 -0
- data/lib/eth/version.rb +1 -1
- data/lib/eth.rb +0 -7
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 62da01e731dd3a73a356760ac971250f193142090876e62567d73cbb5664213d
|
4
|
+
data.tar.gz: 8a951b1b585acd7b58dc327f122dbdd4787145fefbe09d71f1aa4d127787e99e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fd1ca2d9f89a545f20cf23a9cff62a83bfe20514b69cb14aac88f08cd101a8bb9e26ba700539259c16d64ee2a3cbae46adf7bedd18b66835785ad701fd515681
|
7
|
+
data.tar.gz: a1f51f0dac47d8ce7a4ccd3df0d3decfdb0847df36a4b16587b5dd9ae217aee7375e952207d00611bcb487647ff152d958d4709ebf8b429ec0235220f45d35bd
|
@@ -0,0 +1,18 @@
|
|
1
|
+
---
|
2
|
+
updates:
|
3
|
+
-
|
4
|
+
directory: /
|
5
|
+
labels:
|
6
|
+
- dependencies
|
7
|
+
package-ecosystem: bundler
|
8
|
+
schedule:
|
9
|
+
interval: weekly
|
10
|
+
versioning-strategy: increase
|
11
|
+
-
|
12
|
+
directory: /
|
13
|
+
labels:
|
14
|
+
- operations
|
15
|
+
package-ecosystem: github-actions
|
16
|
+
schedule:
|
17
|
+
interval: monthly
|
18
|
+
version: 2
|
@@ -24,15 +24,15 @@ jobs:
|
|
24
24
|
- ruby
|
25
25
|
steps:
|
26
26
|
- name: "Checkout repository"
|
27
|
-
uses: actions/checkout@
|
27
|
+
uses: actions/checkout@v3
|
28
28
|
- name: "Initialize CodeQL"
|
29
|
-
uses: github/codeql-action/init@
|
29
|
+
uses: github/codeql-action/init@v2
|
30
30
|
with:
|
31
31
|
languages: "${{ matrix.language }}"
|
32
32
|
- name: Autobuild
|
33
|
-
uses: github/codeql-action/autobuild@
|
33
|
+
uses: github/codeql-action/autobuild@v2
|
34
34
|
- name: "Perform CodeQL Analysis"
|
35
|
-
uses: github/codeql-action/analyze@
|
35
|
+
uses: github/codeql-action/analyze@v2
|
36
36
|
- uses: ruby/setup-ruby@v1
|
37
37
|
with:
|
38
38
|
ruby-version: '2.7'
|
data/.github/workflows/docs.yml
CHANGED
@@ -10,7 +10,7 @@ jobs:
|
|
10
10
|
docs:
|
11
11
|
runs-on: ubuntu-latest
|
12
12
|
steps:
|
13
|
-
- uses: actions/checkout@
|
13
|
+
- uses: actions/checkout@v3
|
14
14
|
- uses: ruby/setup-ruby@v1
|
15
15
|
with:
|
16
16
|
ruby-version: '2.7'
|
@@ -20,7 +20,7 @@ jobs:
|
|
20
20
|
gem install yard
|
21
21
|
yard doc
|
22
22
|
- name: Deploy GH Pages
|
23
|
-
uses: JamesIves/github-pages-deploy-action@
|
23
|
+
uses: JamesIves/github-pages-deploy-action@v4.3.3
|
24
24
|
with:
|
25
25
|
branch: gh-pages
|
26
26
|
folder: doc/
|
data/.github/workflows/spec.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,19 @@
|
|
1
1
|
# Change Log
|
2
2
|
All notable changes to this project will be documented in this file.
|
3
3
|
|
4
|
+
## [0.5.4]
|
5
|
+
### Added
|
6
|
+
- Eth/client: method for eip-1271 ([#80](https://github.com/q9f/eth.rb/pull/80))
|
7
|
+
|
8
|
+
### Changed
|
9
|
+
- Docs: update changelog ([#77](https://github.com/q9f/eth.rb/pull/77))
|
10
|
+
- Gem: bump version to 0.5.4 ([#78](https://github.com/q9f/eth.rb/pull/78))
|
11
|
+
- Ci: bump ruby version to 3.1 on ci ([#79](https://github.com/q9f/eth.rb/pull/79))
|
12
|
+
- Fix typos ([#81](https://github.com/q9f/eth.rb/pull/81))
|
13
|
+
- Eth/contract: allow creating from file, abi, bin ([#83](https://github.com/q9f/eth.rb/pull/83))
|
14
|
+
- Eth/client: fix account requirement for client.call() ([#85](https://github.com/q9f/eth.rb/pull/85))
|
15
|
+
- Add dependency support for openssl 2.2 and greater, including 3.x ([#88](https://github.com/q9f/eth.rb/pull/88))
|
16
|
+
|
4
17
|
## [0.5.3]
|
5
18
|
### Added
|
6
19
|
- Smart contract support ([#68](https://github.com/q9f/eth.rb/pull/68))
|
data/lib/eth/abi.rb
CHANGED
@@ -346,6 +346,8 @@ module Eth
|
|
346
346
|
# Properly encodes byte-strings.
|
347
347
|
def encode_bytes(arg, type)
|
348
348
|
raise EncodingError, "Expecting String: #{arg}" unless arg.instance_of? String
|
349
|
+
arg = handle_hex_string arg, type
|
350
|
+
|
349
351
|
if type.sub_type.empty?
|
350
352
|
size = Util.zpad_int arg.size
|
351
353
|
padding = Constant::BYTE_ZERO * (Util.ceil32(arg.size) - arg.size)
|
@@ -404,5 +406,23 @@ module Eth
|
|
404
406
|
raise EncodingError, "Could not parse address: #{arg}"
|
405
407
|
end
|
406
408
|
end
|
409
|
+
|
410
|
+
# The ABI encoder needs to be able to determine between a hex `"123"`
|
411
|
+
# and a binary `"123"` string.
|
412
|
+
def handle_hex_string(arg, type)
|
413
|
+
if Util.is_prefixed? arg or
|
414
|
+
(arg.size === type.sub_type.to_i * 2 and Util.is_hex? arg)
|
415
|
+
|
416
|
+
# There is no way telling whether a string is hex or binary with certainty
|
417
|
+
# in Ruby. Therefore, we assume a `0x` prefix to indicate a hex string.
|
418
|
+
# Additionally, if the string size is exactly the double of the expected
|
419
|
+
# binary size, we can assume a hex value.
|
420
|
+
return Util.hex_to_bin arg
|
421
|
+
else
|
422
|
+
|
423
|
+
# Everything else will be assumed binary or raw string.
|
424
|
+
return arg.b
|
425
|
+
end
|
426
|
+
end
|
407
427
|
end
|
408
428
|
end
|
data/lib/eth/chain.rb
CHANGED
@@ -41,6 +41,9 @@ module Eth
|
|
41
41
|
# Chain ID for Gnosis mainnet.
|
42
42
|
XDAI = 100.freeze
|
43
43
|
|
44
|
+
# Chain ID for the Polygon Matic mainnet.
|
45
|
+
MATIC = 137.freeze
|
46
|
+
|
44
47
|
# Chain ID for Arbitrum mainnet.
|
45
48
|
ARBITRUM = 42161.freeze
|
46
49
|
|
@@ -77,6 +80,9 @@ module Eth
|
|
77
80
|
# Chain ID for Optimistic Goerli testnet.
|
78
81
|
GOERLI_OPTIMISM = 420.freeze
|
79
82
|
|
83
|
+
# Chain ID for the Polygon Mumbai testnet.
|
84
|
+
MUMBAI = 80001.freeze
|
85
|
+
|
80
86
|
# Chain ID for Arbitrum Rinkeby testnet.
|
81
87
|
RINKEBY_ARBITRUM = 421611.freeze
|
82
88
|
|
data/lib/eth/client.rb
CHANGED
@@ -154,16 +154,14 @@ module Eth
|
|
154
154
|
#
|
155
155
|
# @overload deploy(contract)
|
156
156
|
# @param contract [Eth::Contract] contracts to deploy.
|
157
|
-
# @overload deploy(contract,
|
157
|
+
# @overload deploy(contract, *args, **kwargs)
|
158
158
|
# @param contract [Eth::Contract] contracts to deploy.
|
159
|
-
#
|
160
|
-
#
|
161
|
-
#
|
162
|
-
# @param sender_key [Eth::Key] the sender private key.
|
163
|
-
# @param legacy [Boolean] enables legacy transactions (pre-EIP-1559).
|
159
|
+
# *args Optional variable constructor parameter list
|
160
|
+
# **sender_key [Eth::Key] the sender private key.
|
161
|
+
# **legacy [Boolean] enables legacy transactions (pre-EIP-1559).
|
164
162
|
# @return [String] the contract address.
|
165
|
-
def deploy_and_wait(contract,
|
166
|
-
hash = wait_for_tx(deploy(contract,
|
163
|
+
def deploy_and_wait(contract, *args, **kwargs)
|
164
|
+
hash = wait_for_tx(deploy(contract, *args, **kwargs))
|
167
165
|
addr = eth_get_transaction_receipt(hash)["result"]["contractAddress"]
|
168
166
|
contract.address = Address.new(addr).to_s
|
169
167
|
end
|
@@ -173,25 +171,28 @@ module Eth
|
|
173
171
|
#
|
174
172
|
# @overload deploy(contract)
|
175
173
|
# @param contract [Eth::Contract] contracts to deploy.
|
176
|
-
# @overload deploy(contract,
|
174
|
+
# @overload deploy(contract, *args, **kwargs)
|
177
175
|
# @param contract [Eth::Contract] contracts to deploy.
|
178
|
-
#
|
179
|
-
#
|
180
|
-
#
|
181
|
-
# @param sender_key [Eth::Key] the sender private key.
|
182
|
-
# @param legacy [Boolean] enables legacy transactions (pre-EIP-1559).
|
176
|
+
# *args Optional variable constructor parameter list
|
177
|
+
# **sender_key [Eth::Key] the sender private key.
|
178
|
+
# **legacy [Boolean] enables legacy transactions (pre-EIP-1559).
|
183
179
|
# @return [String] the transaction hash.
|
184
180
|
# @raise [ArgumentError] in case the contract does not have any source.
|
185
|
-
def deploy(contract,
|
181
|
+
def deploy(contract, *args, **kwargs)
|
186
182
|
raise ArgumentError, "Cannot deploy contract without source or binary!" if contract.bin.nil?
|
183
|
+
raise ArgumentError, "Missing contract constructor params!" if contract.constructor_inputs.length != args.length
|
187
184
|
gas_limit = Tx.estimate_intrinsic_gas(contract.bin) + Tx::CREATE_GAS
|
185
|
+
data = contract.bin
|
186
|
+
unless args.empty?
|
187
|
+
data += encode_constructor_params(contract, args)
|
188
|
+
end
|
188
189
|
params = {
|
189
190
|
value: 0,
|
190
191
|
gas_limit: gas_limit,
|
191
192
|
chain_id: chain_id,
|
192
|
-
data:
|
193
|
+
data: data,
|
193
194
|
}
|
194
|
-
if legacy
|
195
|
+
if kwargs[:legacy]
|
195
196
|
params.merge!({
|
196
197
|
gas_price: max_fee_per_gas,
|
197
198
|
})
|
@@ -201,17 +202,17 @@ module Eth
|
|
201
202
|
max_gas_fee: max_fee_per_gas,
|
202
203
|
})
|
203
204
|
end
|
204
|
-
unless sender_key.nil?
|
205
|
-
#
|
205
|
+
unless kwargs[:sender_key].nil?
|
206
|
+
# Uses the provided key as sender and signer
|
206
207
|
params.merge!({
|
207
|
-
from: sender_key.address,
|
208
|
-
nonce: get_nonce(sender_key.address),
|
208
|
+
from: kwargs[:sender_key].address,
|
209
|
+
nonce: get_nonce(kwargs[:sender_key].address),
|
209
210
|
})
|
210
211
|
tx = Eth::Tx.new(params)
|
211
|
-
tx.sign sender_key
|
212
|
+
tx.sign kwargs[:sender_key]
|
212
213
|
return eth_send_raw_transaction(tx.hex)["result"]
|
213
214
|
else
|
214
|
-
#
|
215
|
+
# Uses the default account as sender and external signer
|
215
216
|
params.merge!({
|
216
217
|
from: default_account,
|
217
218
|
nonce: get_nonce(default_account),
|
@@ -241,7 +242,7 @@ module Eth
|
|
241
242
|
func = contract.functions.select { |func| func.name == function_name }[0]
|
242
243
|
raise ArgumentError, "function_name does not exist!" if func.nil?
|
243
244
|
output = call_raw(contract, func, *args, **kwargs)
|
244
|
-
if output
|
245
|
+
if output&.length == 1
|
245
246
|
return output[0]
|
246
247
|
else
|
247
248
|
return output
|
@@ -412,7 +413,7 @@ module Eth
|
|
412
413
|
})
|
413
414
|
end
|
414
415
|
unless kwargs[:sender_key].nil?
|
415
|
-
#
|
416
|
+
# Uses the provided key as sender and signer
|
416
417
|
params.merge!({
|
417
418
|
from: kwargs[:sender_key].address,
|
418
419
|
nonce: get_nonce(kwargs[:sender_key].address),
|
@@ -422,6 +423,7 @@ module Eth
|
|
422
423
|
end
|
423
424
|
raw_result = eth_call(params)["result"]
|
424
425
|
types = func.outputs.map { |i| i.type }
|
426
|
+
return nil if raw_result == "0x"
|
425
427
|
Eth::Abi.decode(types, raw_result)
|
426
428
|
end
|
427
429
|
|
@@ -432,6 +434,12 @@ module Eth
|
|
432
434
|
"0x" + fun.signature + (encoded_str.empty? ? "0" * 64 : encoded_str)
|
433
435
|
end
|
434
436
|
|
437
|
+
# Encodes constructor params
|
438
|
+
def encode_constructor_params(contract, args)
|
439
|
+
types = contract.constructor_inputs.map { |input| input.type }
|
440
|
+
Util.bin_to_hex(Eth::Abi.encode(types, args))
|
441
|
+
end
|
442
|
+
|
435
443
|
# Prepares parameters and sends the command to the client.
|
436
444
|
def send_command(command, args)
|
437
445
|
args << "latest" if ["eth_getBalance", "eth_call"].include? command
|
@@ -469,3 +477,7 @@ module Eth
|
|
469
477
|
end
|
470
478
|
end
|
471
479
|
end
|
480
|
+
|
481
|
+
# Load the client/* libraries
|
482
|
+
require "eth/client/http"
|
483
|
+
require "eth/client/ipc"
|
data/lib/eth/contract/event.rb
CHANGED
@@ -16,6 +16,7 @@
|
|
16
16
|
|
17
17
|
# Provides the {Eth} module.
|
18
18
|
module Eth
|
19
|
+
|
19
20
|
# Provides the methods for smart contract function.
|
20
21
|
class Contract::Function
|
21
22
|
attr_accessor :name, :inputs, :outputs, :signature, :constant, :function_string
|
@@ -36,7 +37,7 @@ module Eth
|
|
36
37
|
@signature = self.class.encoded_function_signature(@function_string)
|
37
38
|
end
|
38
39
|
|
39
|
-
#
|
40
|
+
# Creates function strings.
|
40
41
|
#
|
41
42
|
# @param name [String] function name.
|
42
43
|
# @param inputs [Array<Eth::Contract::FunctionInput>] function input class list.
|
@@ -45,12 +46,12 @@ module Eth
|
|
45
46
|
"#{name}(#{inputs.collect { |x| x.type }.join(",")})"
|
46
47
|
end
|
47
48
|
|
48
|
-
#
|
49
|
+
# Encodes a function signature.
|
49
50
|
#
|
50
51
|
# @param signature [String] function signature.
|
51
52
|
# @return [String] encoded function signature string.
|
52
53
|
def self.encoded_function_signature(signature)
|
53
|
-
|
54
|
+
Util.bin_to_hex Util.keccak256(signature)[0..3]
|
54
55
|
end
|
55
56
|
end
|
56
57
|
end
|
@@ -16,6 +16,7 @@
|
|
16
16
|
|
17
17
|
# Provides the {Eth} module.
|
18
18
|
module Eth
|
19
|
+
|
19
20
|
# Provide classes for contract function input.
|
20
21
|
class Contract::FunctionInput
|
21
22
|
attr_accessor :type, :name
|
@@ -28,7 +29,7 @@ module Eth
|
|
28
29
|
@name = data["name"]
|
29
30
|
end
|
30
31
|
|
31
|
-
# Returns types
|
32
|
+
# Returns complete types with subtypes, e.g., `uint256`.
|
32
33
|
def type
|
33
34
|
@type.base_type + @type.sub_type
|
34
35
|
end
|
@@ -16,15 +16,20 @@
|
|
16
16
|
|
17
17
|
# Provides the {Eth} module.
|
18
18
|
module Eth
|
19
|
+
|
19
20
|
# Provide classes for contract function output.
|
20
21
|
class Contract::FunctionOutput
|
21
22
|
attr_accessor :type, :name
|
22
23
|
|
24
|
+
# Constructor of the {Eth::Contract::FunctionOutput} class.
|
25
|
+
#
|
26
|
+
# @param data [Hash] contract abi data.
|
23
27
|
def initialize(data)
|
24
28
|
@type = Eth::Abi::Type.parse(data["type"])
|
25
29
|
@name = data["name"]
|
26
30
|
end
|
27
31
|
|
32
|
+
# Returns complete types with subtypes, e.g., `uint256`.
|
28
33
|
def type
|
29
34
|
@type.base_type + @type.sub_type
|
30
35
|
end
|
@@ -16,6 +16,7 @@
|
|
16
16
|
|
17
17
|
# Provides the {Eth} module.
|
18
18
|
module Eth
|
19
|
+
|
19
20
|
# Provide classes for contract initializer.
|
20
21
|
class Contract::Initializer
|
21
22
|
attr_accessor :contracts, :file
|
@@ -36,7 +37,7 @@ module Eth
|
|
36
37
|
end
|
37
38
|
end
|
38
39
|
|
39
|
-
#
|
40
|
+
# Builds and returns all contracts.
|
40
41
|
def build_all
|
41
42
|
@contracts.each do |contract|
|
42
43
|
contract.build
|
data/lib/eth/contract.rb
CHANGED
@@ -109,6 +109,7 @@ module Eth
|
|
109
109
|
def_delegators :parent, :events
|
110
110
|
def_delegators :parent, :address, :address=
|
111
111
|
def_delegator :parent, :functions
|
112
|
+
def_delegator :parent, :constructor_inputs
|
112
113
|
define_method :parent do
|
113
114
|
parent
|
114
115
|
end
|
@@ -133,3 +134,10 @@ module Eth
|
|
133
134
|
end
|
134
135
|
end
|
135
136
|
end
|
137
|
+
|
138
|
+
# Load the contract/* libraries
|
139
|
+
require "eth/contract/event"
|
140
|
+
require "eth/contract/function"
|
141
|
+
require "eth/contract/function_input"
|
142
|
+
require "eth/contract/function_output"
|
143
|
+
require "eth/contract/initializer"
|
data/lib/eth/version.rb
CHANGED
data/lib/eth.rb
CHANGED
@@ -23,14 +23,7 @@ require "eth/address"
|
|
23
23
|
require "eth/chain"
|
24
24
|
require "eth/constant"
|
25
25
|
require "eth/contract"
|
26
|
-
require "eth/contract/event"
|
27
|
-
require "eth/contract/function"
|
28
|
-
require "eth/contract/function_input"
|
29
|
-
require "eth/contract/function_output"
|
30
|
-
require "eth/contract/initializer"
|
31
26
|
require "eth/client"
|
32
|
-
require "eth/client/http"
|
33
|
-
require "eth/client/ipc"
|
34
27
|
require "eth/eip712"
|
35
28
|
require "eth/key"
|
36
29
|
require "eth/rlp"
|
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.5
|
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-05-
|
12
|
+
date: 2022-05-30 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: keccak
|
@@ -95,6 +95,7 @@ executables: []
|
|
95
95
|
extensions: []
|
96
96
|
extra_rdoc_files: []
|
97
97
|
files:
|
98
|
+
- ".github/dependabot.yml"
|
98
99
|
- ".github/workflows/codeql.yml"
|
99
100
|
- ".github/workflows/docs.yml"
|
100
101
|
- ".github/workflows/spec.yml"
|