eth 0.5.11 → 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 +10 -11
- data/CHANGELOG.md +36 -0
- data/lib/eth/abi/decoder.rb +20 -1
- data/lib/eth/abi/encoder.rb +1 -1
- data/lib/eth/abi/event.rb +25 -4
- data/lib/eth/abi/type.rb +9 -1
- data/lib/eth/api.rb +0 -1
- data/lib/eth/client.rb +13 -9
- data/lib/eth/contract/event.rb +16 -2
- data/lib/eth/eip712.rb +5 -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: a6da48b3e3128860af79efba95ded96258dfe87a8bf0a374a44bff060fc2f9c3
|
4
|
+
data.tar.gz: 9ad4cbabd4d5b31419d02b9363cdff915c4e1c61ba95197b42cf2a61ed31ac50
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bbc07ab8bb0fc56f89619037ee16da5eeadb7d0fcde714572bd9b678e8c4da18b70e3fa042207c57195dd7e6e2700ebf5650bf5ca6ddf848da78661a2b8eda16
|
7
|
+
data.tar.gz: 51206666cc4a84bd05d0995ab6b7476699b17cc8bb37d3d78f789cf93116844dd3cd0f4e24360b59d7758d3588cc9fbebbe0504cdf1bd7b8a00a67e3600ac0ad
|
@@ -24,18 +24,18 @@ jobs:
|
|
24
24
|
- ruby
|
25
25
|
steps:
|
26
26
|
- name: "Checkout repository"
|
27
|
-
uses: actions/checkout@
|
27
|
+
uses: actions/checkout@v4
|
28
28
|
- name: "Initialize CodeQL"
|
29
|
-
uses: github/codeql-action/init@
|
29
|
+
uses: github/codeql-action/init@v3
|
30
30
|
with:
|
31
31
|
languages: "${{ matrix.language }}"
|
32
32
|
- name: Autobuild
|
33
|
-
uses: github/codeql-action/autobuild@
|
33
|
+
uses: github/codeql-action/autobuild@v3
|
34
34
|
- name: "Perform CodeQL Analysis"
|
35
|
-
uses: github/codeql-action/analyze@
|
35
|
+
uses: github/codeql-action/analyze@v3
|
36
36
|
- uses: ruby/setup-ruby@v1
|
37
37
|
with:
|
38
|
-
ruby-version: '3.
|
38
|
+
ruby-version: '3.3'
|
39
39
|
bundler-cache: true
|
40
40
|
- name: "Run rufo code formatting checks"
|
41
41
|
run: |
|
data/.github/workflows/docs.yml
CHANGED
@@ -10,17 +10,17 @@ jobs:
|
|
10
10
|
docs:
|
11
11
|
runs-on: ubuntu-latest
|
12
12
|
steps:
|
13
|
-
- uses: actions/checkout@
|
13
|
+
- uses: actions/checkout@v4
|
14
14
|
- uses: ruby/setup-ruby@v1
|
15
15
|
with:
|
16
|
-
ruby-version: '3.
|
16
|
+
ruby-version: '3.3'
|
17
17
|
bundler-cache: true
|
18
18
|
- name: Run Yard Doc
|
19
19
|
run: |
|
20
20
|
gem install yard
|
21
21
|
yard doc
|
22
22
|
- name: Deploy GH Pages
|
23
|
-
uses: JamesIves/github-pages-deploy-action@v4.
|
23
|
+
uses: JamesIves/github-pages-deploy-action@v4.6.1
|
24
24
|
with:
|
25
25
|
branch: gh-pages
|
26
26
|
folder: doc/
|
data/.github/workflows/spec.yml
CHANGED
@@ -18,10 +18,10 @@ jobs:
|
|
18
18
|
strategy:
|
19
19
|
fail-fast: false
|
20
20
|
matrix:
|
21
|
-
os: [ubuntu-
|
22
|
-
ruby: ['3.
|
21
|
+
os: [ubuntu-latest, macos-latest]
|
22
|
+
ruby: ['3.1', '3.2', '3.3']
|
23
23
|
steps:
|
24
|
-
- uses: actions/checkout@
|
24
|
+
- uses: actions/checkout@v4
|
25
25
|
- uses: ruby/setup-ruby@v1
|
26
26
|
with:
|
27
27
|
ruby-version: ${{ matrix.ruby }}
|
@@ -37,15 +37,10 @@ jobs:
|
|
37
37
|
sudo apt-get update
|
38
38
|
sudo apt-get install ethereum solc libyaml-dev
|
39
39
|
if: startsWith(matrix.os, 'Ubuntu')
|
40
|
-
- name: Patch Geth # https://github.com/ethereum/go-ethereum/pull/27360
|
41
|
-
run: |
|
42
|
-
git clone https://github.com/q9f/go-ethereum.git -b q9f/params/shanghai
|
43
|
-
pushd go-ethereum/
|
44
|
-
make geth
|
45
|
-
popd
|
46
40
|
- name: Run Geth
|
47
41
|
run: |
|
48
|
-
|
42
|
+
geth --dev --http --ipcpath /tmp/geth.ipc &
|
43
|
+
disown &
|
49
44
|
- name: Gem Dependencies
|
50
45
|
run: |
|
51
46
|
git submodule update --init
|
@@ -54,5 +49,9 @@ jobs:
|
|
54
49
|
run: |
|
55
50
|
bundle exec rspec
|
56
51
|
env:
|
57
|
-
COVERAGE: true
|
58
52
|
INFURA_TOKEN: ${{ secrets.INFURA_TOKEN }}
|
53
|
+
- name: Upload coverage to Codecov
|
54
|
+
uses: codecov/codecov-action@v4
|
55
|
+
with:
|
56
|
+
fail_ci_if_error: false
|
57
|
+
token: ${{ secrets.CODECOV_TOKEN }}
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,42 @@
|
|
1
1
|
# Change Log
|
2
2
|
All notable changes to this project will be documented in this file.
|
3
3
|
|
4
|
+
## [0.5.12]
|
5
|
+
### Added
|
6
|
+
### Changed
|
7
|
+
|
8
|
+
## [0.5.11]
|
9
|
+
### Added
|
10
|
+
* Eth/abi: allow encoding address types [#242](https://github.com/q9f/eth.rb/pull/242)
|
11
|
+
* Eth/solidity: enable --via-ir [#232](https://github.com/q9f/eth.rb/pull/232)
|
12
|
+
* Checking userinfo with the uri method [#233](https://github.com/q9f/eth.rb/pull/233)
|
13
|
+
* Eth/abi: add abicoder gem tests collection [#218](https://github.com/q9f/eth.rb/pull/218)
|
14
|
+
* Manual default_account [#215](https://github.com/q9f/eth.rb/pull/215)
|
15
|
+
* Add moonbeam networks in [#209](https://github.com/q9f/eth.rb/pull/209)
|
16
|
+
|
17
|
+
### Changed
|
18
|
+
* Spec: run rufo [#245](https://github.com/q9f/eth.rb/pull/245)
|
19
|
+
* Fix the decoding of unsigned transactions [#243](https://github.com/q9f/eth.rb/pull/243)
|
20
|
+
* Build(deps): bump JamesIves/github-pages-deploy-action from 4.4.2 to 4.4.3 [#244](https://github.com/q9f/eth.rb/pull/244)
|
21
|
+
* Build(deps): bump JamesIves/github-pages-deploy-action from 4.4.1 to 4.4.2 [#240](https://github.com/q9f/eth.rb/pull/240)
|
22
|
+
* Eth/tx: update tx initcode cost for shanghai [#237](https://github.com/q9f/eth.rb/pull/237)
|
23
|
+
* Eth/client: remove default gas limit attribute [#235](https://github.com/q9f/eth.rb/pull/235)
|
24
|
+
* Docs: minor fixups [#229](https://github.com/q9f/eth.rb/pull/229)
|
25
|
+
* Eth/contract: ensure contract name is title case [#228](https://github.com/q9f/eth.rb/pull/228)
|
26
|
+
* Deps: require forwardable for contracts [#227](https://github.com/q9f/eth.rb/pull/227)
|
27
|
+
* Ens/resolver: remove pending for etc coin type [#219](https://github.com/q9f/eth.rb/pull/219)
|
28
|
+
* Deps: update secp256k1 to 6 [#214](https://github.com/q9f/eth.rb/pull/214)
|
29
|
+
* Eth/solidity: add docs for solc path override [#213](https://github.com/q9f/eth.rb/pull/213)
|
30
|
+
* Manually overwrite solc path [#212](https://github.com/q9f/eth.rb/pull/212)
|
31
|
+
* Abi.decoder handles arrays of string and bytes [#207](https://github.com/q9f/eth.rb/pull/207)
|
32
|
+
* Eth/util: fix compressed public key to address in [#206](https://github.com/q9f/eth.rb/pull/206)
|
33
|
+
* Eth/api: update execution apis to latest spec [#204](https://github.com/q9f/eth.rb/pull/204)
|
34
|
+
* Eth/abi: split abi class into encoder and decoder [#203](https://github.com/q9f/eth.rb/pull/203)
|
35
|
+
* Eth/client: deduplicate code [#202](https://github.com/q9f/eth.rb/pull/202)
|
36
|
+
* Eth/client: rewrite send to send_request [#201](https://github.com/q9f/eth.rb/pull/201)
|
37
|
+
* Docs: update changelog for 0.5.10 [#200](https://github.com/q9f/eth.rb/pull/200)
|
38
|
+
* Tested with Ruby 3.2 [#199](https://github.com/q9f/eth.rb/pull/199)
|
39
|
+
|
4
40
|
## [0.5.10]
|
5
41
|
### Added
|
6
42
|
* Eth/client: add transfer_erc20 function [#197](https://github.com/q9f/eth.rb/pull/197)
|
data/lib/eth/abi/decoder.rb
CHANGED
@@ -51,6 +51,25 @@ module Eth
|
|
51
51
|
type(Type.parse(type.base_type), arg[pointer + 32, Util.ceil32(data_l) + 32])
|
52
52
|
end
|
53
53
|
end
|
54
|
+
elsif type.base_type == "tuple"
|
55
|
+
offset = 0
|
56
|
+
data = {}
|
57
|
+
type.components.each do |c|
|
58
|
+
if c.dynamic?
|
59
|
+
pointer = Util.deserialize_big_endian_to_int arg[offset, 32] # Pointer to the size of the array's element
|
60
|
+
data_len = Util.deserialize_big_endian_to_int arg[pointer, 32] # length of the element
|
61
|
+
|
62
|
+
data[c.name] = type(c, arg[pointer, Util.ceil32(data_len) + 32])
|
63
|
+
# puts data
|
64
|
+
offset += 32
|
65
|
+
else
|
66
|
+
size = c.size
|
67
|
+
data[c.name] = type(c, arg[offset, size])
|
68
|
+
offset += size
|
69
|
+
# puts data
|
70
|
+
end
|
71
|
+
end
|
72
|
+
data
|
54
73
|
elsif type.dynamic?
|
55
74
|
l = Util.deserialize_big_endian_to_int arg[0, 32]
|
56
75
|
nested_sub = type.nested_sub
|
@@ -106,7 +125,7 @@ module Eth
|
|
106
125
|
Util.deserialize_big_endian_to_int data
|
107
126
|
when "int"
|
108
127
|
u = Util.deserialize_big_endian_to_int data
|
109
|
-
i = u >= 2 ** (type.sub_type.to_i - 1) ? (u - 2 **
|
128
|
+
i = u >= 2 ** (type.sub_type.to_i - 1) ? (u - 2 ** 256) : u
|
110
129
|
|
111
130
|
# decoded integer
|
112
131
|
i
|
data/lib/eth/abi/encoder.rb
CHANGED
@@ -138,7 +138,7 @@ module Eth
|
|
138
138
|
real_size = type.sub_type.to_i
|
139
139
|
i = arg.to_i
|
140
140
|
raise ValueOutOfBounds, arg unless i >= -2 ** (real_size - 1) and i < 2 ** (real_size - 1)
|
141
|
-
Util.zpad_int(i % 2 **
|
141
|
+
Util.zpad_int(i % 2 ** 256)
|
142
142
|
end
|
143
143
|
|
144
144
|
# Properly encodes booleans.
|
data/lib/eth/abi/event.rb
CHANGED
@@ -40,10 +40,20 @@ module Eth
|
|
40
40
|
def signature(interface)
|
41
41
|
name = interface.fetch("name")
|
42
42
|
inputs = interface.fetch("inputs", [])
|
43
|
-
types = inputs.map { |i| i
|
43
|
+
types = inputs.map { |i| type(i) }
|
44
44
|
"#{name}(#{types.join(",")})"
|
45
45
|
end
|
46
46
|
|
47
|
+
def type(input)
|
48
|
+
if input["type"] == "tuple"
|
49
|
+
"(#{input["components"].map { |c| type(c) }.join(",")})"
|
50
|
+
elsif input["type"] == "enum"
|
51
|
+
"uint8"
|
52
|
+
else
|
53
|
+
input["type"]
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
47
57
|
# A decoded event log.
|
48
58
|
class LogDescription
|
49
59
|
# The event ABI interface used to decode the log.
|
@@ -116,9 +126,20 @@ module Eth
|
|
116
126
|
def decode_log(inputs, data, topics, anonymous = false)
|
117
127
|
topic_inputs, data_inputs = inputs.partition { |i| i["indexed"] }
|
118
128
|
|
119
|
-
topic_types = topic_inputs.map
|
120
|
-
|
121
|
-
|
129
|
+
topic_types = topic_inputs.map do |i|
|
130
|
+
if i["type"] == "tuple"
|
131
|
+
Type.parse(i["type"], i["components"], i["name"])
|
132
|
+
else
|
133
|
+
i["type"]
|
134
|
+
end
|
135
|
+
end
|
136
|
+
data_types = data_inputs.map do |i|
|
137
|
+
if i["type"] == "tuple"
|
138
|
+
Type.parse(i["type"], i["components"], i["name"])
|
139
|
+
else
|
140
|
+
i["type"]
|
141
|
+
end
|
142
|
+
end
|
122
143
|
# If event is anonymous, all topics are arguments. Otherwise, the first
|
123
144
|
# topic will be the event signature.
|
124
145
|
if anonymous == false
|
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
|
data/lib/eth/api.rb
CHANGED
data/lib/eth/client.rb
CHANGED
@@ -25,7 +25,7 @@ module Eth
|
|
25
25
|
# The connected network's chain ID.
|
26
26
|
attr_reader :chain_id
|
27
27
|
|
28
|
-
# The connected network's client
|
28
|
+
# The connected network's client default account.
|
29
29
|
attr_accessor :default_account
|
30
30
|
|
31
31
|
# The default transaction max priority fee per gas in Wei, defaults to {Tx::DEFAULT_PRIORITY_FEE}.
|
@@ -34,6 +34,9 @@ module Eth
|
|
34
34
|
# The default transaction max fee per gas in Wei, defaults to {Tx::DEFAULT_GAS_PRICE}.
|
35
35
|
attr_accessor :max_fee_per_gas
|
36
36
|
|
37
|
+
# The block number used for archive calls.
|
38
|
+
attr_accessor :block_number
|
39
|
+
|
37
40
|
# A custom error type if a contract interaction fails.
|
38
41
|
class ContractExecutionError < StandardError; end
|
39
42
|
|
@@ -62,15 +65,15 @@ module Eth
|
|
62
65
|
@max_fee_per_gas = Tx::DEFAULT_GAS_PRICE
|
63
66
|
end
|
64
67
|
|
65
|
-
# Gets the default account (
|
68
|
+
# Gets the default account (first account) of the connected client.
|
66
69
|
#
|
67
70
|
# **Note**, that many remote providers (e.g., Infura) do not provide
|
68
71
|
# any accounts.
|
69
72
|
#
|
70
|
-
# @return [Eth::Address] the
|
73
|
+
# @return [Eth::Address] the default account address.
|
71
74
|
def default_account
|
72
75
|
raise ArgumentError, "The default account is not available on remote connections!" unless local? || @default_account
|
73
|
-
@default_account ||= Address.new
|
76
|
+
@default_account ||= Address.new eth_accounts["result"].first
|
74
77
|
end
|
75
78
|
|
76
79
|
# Gets the chain ID of the connected network.
|
@@ -108,7 +111,7 @@ module Eth
|
|
108
111
|
end
|
109
112
|
|
110
113
|
# Simply transfer Ether to an account and waits for it to be mined.
|
111
|
-
# Uses `
|
114
|
+
# Uses `eth_accounts` and external signer if no sender key is
|
112
115
|
# provided.
|
113
116
|
#
|
114
117
|
# See {#transfer} for params and overloads.
|
@@ -119,7 +122,7 @@ module Eth
|
|
119
122
|
end
|
120
123
|
|
121
124
|
# Simply transfer Ether to an account without any call data or
|
122
|
-
# access lists attached. Uses `
|
125
|
+
# access lists attached. Uses `eth_accounts` and external signer
|
123
126
|
# if no sender key is provided.
|
124
127
|
#
|
125
128
|
# **Note**, that many remote providers (e.g., Infura) do not provide
|
@@ -179,7 +182,7 @@ module Eth
|
|
179
182
|
end
|
180
183
|
|
181
184
|
# Deploys a contract and waits for it to be mined. Uses
|
182
|
-
# `
|
185
|
+
# `eth_accounts` or external signer if no sender key is provided.
|
183
186
|
#
|
184
187
|
# See {#deploy} for params and overloads.
|
185
188
|
#
|
@@ -190,7 +193,7 @@ module Eth
|
|
190
193
|
contract.address = Address.new(addr).to_s
|
191
194
|
end
|
192
195
|
|
193
|
-
# Deploys a contract. Uses `
|
196
|
+
# Deploys a contract. Uses `eth_accounts` or external signer
|
194
197
|
# if no sender key is provided.
|
195
198
|
#
|
196
199
|
# **Note**, that many remote providers (e.g., Infura) do not provide
|
@@ -469,7 +472,8 @@ module Eth
|
|
469
472
|
|
470
473
|
# Prepares parameters and sends the command to the client.
|
471
474
|
def send_command(command, args)
|
472
|
-
|
475
|
+
@block_number ||= "latest"
|
476
|
+
args << block_number if ["eth_getBalance", "eth_call"].include? command
|
473
477
|
payload = {
|
474
478
|
jsonrpc: "2.0",
|
475
479
|
method: command,
|
data/lib/eth/contract/event.rb
CHANGED
@@ -26,9 +26,11 @@ module Eth
|
|
26
26
|
# @param data [Hash] contract event data.
|
27
27
|
def initialize(data)
|
28
28
|
@name = data["name"]
|
29
|
-
@input_types = data["inputs"].collect
|
29
|
+
@input_types = data["inputs"].collect do |x|
|
30
|
+
type_name x
|
31
|
+
end
|
30
32
|
@inputs = data["inputs"].collect { |x| x["name"] }
|
31
|
-
@event_string =
|
33
|
+
@event_string = Abi::Event.signature(data)
|
32
34
|
@signature = Digest::Keccak.hexdigest(@event_string, 256)
|
33
35
|
end
|
34
36
|
|
@@ -38,5 +40,17 @@ module Eth
|
|
38
40
|
def set_address(address)
|
39
41
|
@address = address.nil? ? nil : Eth::Address.new(address).address
|
40
42
|
end
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
def type_name(x)
|
47
|
+
type = x["type"]
|
48
|
+
case type
|
49
|
+
when "tuple"
|
50
|
+
"(#{x["components"].collect { |c| type_name(c) }.join(",")})"
|
51
|
+
else
|
52
|
+
type
|
53
|
+
end
|
54
|
+
end
|
41
55
|
end
|
42
56
|
end
|
data/lib/eth/eip712.rb
CHANGED
@@ -114,9 +114,13 @@ module Eth
|
|
114
114
|
value = data[field[:name].to_sym]
|
115
115
|
type = field[:type]
|
116
116
|
raise NotImplementedError, "Arrays currently unimplemented for EIP-712." if type.end_with? "]"
|
117
|
-
if type == "string"
|
117
|
+
if type == "string"
|
118
118
|
encoded_types.push "bytes32"
|
119
119
|
encoded_values.push Util.keccak256 value
|
120
|
+
elsif type == "bytes"
|
121
|
+
encoded_types.push "bytes32"
|
122
|
+
value = Util.hex_to_bin value
|
123
|
+
encoded_values.push Util.keccak256 value
|
120
124
|
elsif !types[type.to_sym].nil?
|
121
125
|
encoded_types.push "bytes32"
|
122
126
|
value = encode_data type, value, types
|
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.12
|
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:
|
12
|
+
date: 2024-06-23 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: forwardable
|
@@ -202,7 +202,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
202
202
|
- !ruby/object:Gem::Version
|
203
203
|
version: '0'
|
204
204
|
requirements: []
|
205
|
-
rubygems_version: 3.
|
205
|
+
rubygems_version: 3.2.32
|
206
206
|
signing_key:
|
207
207
|
specification_version: 4
|
208
208
|
summary: Ruby Ethereum library.
|