eth 0.5.7 → 0.5.8

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 86b3022f82e96aed2d1aad682ad106f3f5efe9488e03ed048e0c5862d30c3284
4
- data.tar.gz: 40cb5224db9e074360586aca07f6421edc47668fa0f5d81728fa7574f0c2a978
3
+ metadata.gz: 8bb2370cb186c41e849c2949bbfcc1cb5cc6b2572064d8abba4631ed3ed3a692
4
+ data.tar.gz: dabde7655f7d8921f05a1cdb5d860981c3ee4cced8e1a7b085482d01b14c24b1
5
5
  SHA512:
6
- metadata.gz: cf5872ec79f0c708a5c05060514b9179279db310b1c0c0682679cd90bcd0998f9ef1a7f8787c298380a252462c5ea33fdc3d44c0bdb5e3c57991515514077b85
7
- data.tar.gz: 4a7adde0050a724270f5779a2fe4fca596202a930ee7e1af1e4493878a21e7102ee75a2d5ce91ac455b016c9c396d6771396e5c890f5dcef7ea220b0eadd2d58
6
+ metadata.gz: 23a6ac9854368723b40fc0e46fed5e7ae90d1691358538f94cf8a9a43c333dc3e002e5d359513914440823501f882608d9e55e7a71a5a19ee88d38a57498a570
7
+ data.tar.gz: 14f5f74ea076a2fbdd5b538521a2b4006e58bf9105e34f0a942560841371f69a48cf80e86c680228ee5253e9483c3d85a857aeea7f48e8f4c1698a0f5ae0236c
@@ -35,7 +35,7 @@ jobs:
35
35
  uses: github/codeql-action/analyze@v2
36
36
  - uses: ruby/setup-ruby@v1
37
37
  with:
38
- ruby-version: '2.7'
38
+ ruby-version: '3.0'
39
39
  bundler-cache: true
40
40
  - name: "Run rufo code formatting checks"
41
41
  run: |
@@ -13,14 +13,14 @@ jobs:
13
13
  - uses: actions/checkout@v3
14
14
  - uses: ruby/setup-ruby@v1
15
15
  with:
16
- ruby-version: '2.7'
16
+ ruby-version: '3.0'
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.4.0
23
+ uses: JamesIves/github-pages-deploy-action@v4.4.1
24
24
  with:
25
25
  branch: gh-pages
26
26
  folder: doc/
@@ -18,8 +18,8 @@ jobs:
18
18
  strategy:
19
19
  fail-fast: false
20
20
  matrix:
21
- os: [ubuntu-latest, macos-latest]
22
- ruby: ['2.7', '3.1']
21
+ os: [ubuntu-22.04, macos-12]
22
+ ruby: ['3.0', '3.1']
23
23
  steps:
24
24
  - uses: actions/checkout@v3
25
25
  - uses: ruby/setup-ruby@v1
data/CHANGELOG.md CHANGED
@@ -1,6 +1,25 @@
1
1
  # Change Log
2
2
  All notable changes to this project will be documented in this file.
3
3
 
4
+ ## [0.5.7]
5
+ ### Added
6
+ * Eth/client: add http basic support auth ([#151](https://github.com/q9f/eth.rb/pull/151))
7
+ * Chore: add polygon chain test case ([#146](https://github.com/q9f/eth.rb/pull/146))
8
+
9
+ ### Changed
10
+ * Docs: add readme header for yard ([#159](https://github.com/q9f/eth.rb/pull/159))
11
+ * Eth/client: fix api documentation ([#158](https://github.com/q9f/eth.rb/pull/158))
12
+ * Eth/client: update default fees ([#157](https://github.com/q9f/eth.rb/pull/157))
13
+ * Docs: move readme usage to wiki ([#156](https://github.com/q9f/eth.rb/pull/156))
14
+ * Eth/signature: fix allowing ledger v values of 0 ([#155](https://github.com/q9f/eth.rb/pull/155))
15
+ * Eth/client: rename http basic to http auth ([#154](https://github.com/q9f/eth.rb/pull/154))
16
+ * Fix Eth:Tx.decode for transaction with s length < 64 chars ([#148](https://github.com/q9f/eth.rb/pull/148))
17
+ * Build(deps): bump JamesIves/github-pages-deploy-action from 4.3.4 to 4.4.0 ([#140](https://github.com/q9f/eth.rb/pull/140))
18
+ * Fixed to return uint256[] correctly when passed as type ([#147](https://github.com/q9f/eth.rb/pull/147))
19
+ * Build(deps): bump JamesIves/github-pages-deploy-action from 4.3.3 to 4.3.4 ([#133](https://github.com/q9f/eth.rb/pull/133))
20
+ * Docs: update CHANGELOG ([#132](https://github.com/q9f/eth.rb/pull/132))
21
+ * Gem: bump version to 0.5.7 ([#131](https://github.com/q9f/eth.rb/pull/131))
22
+
4
23
  ## [0.5.6]
5
24
  ### Added
6
25
  - Eth/client: Add gas limit override option for contract deployments ([#128](https://github.com/q9f/eth.rb/pull/128))
data/Gemfile CHANGED
@@ -7,8 +7,8 @@ group :test, :development do
7
7
  gem "codecov", "~> 0.6"
8
8
  gem "pry", "~> 0.14"
9
9
  gem "rake", "~> 13.0"
10
- gem "rdoc", "~> 6.3"
11
- gem "rspec", "~> 3.10"
10
+ gem "rdoc", "~> 6.4"
11
+ gem "rspec", "~> 3.11"
12
12
  gem "rufo", "~> 0.13"
13
13
  gem "simplecov", "~> 0.21"
14
14
  gem "yard", "~> 0.9"
data/abis/ens.json ADDED
@@ -0,0 +1,422 @@
1
+ [
2
+ {
3
+ "inputs": [
4
+ {
5
+ "internalType": "contract ENS",
6
+ "name": "_old",
7
+ "type": "address"
8
+ }
9
+ ],
10
+ "payable": false,
11
+ "stateMutability": "nonpayable",
12
+ "type": "constructor"
13
+ },
14
+ {
15
+ "anonymous": false,
16
+ "inputs": [
17
+ {
18
+ "indexed": true,
19
+ "internalType": "address",
20
+ "name": "owner",
21
+ "type": "address"
22
+ },
23
+ {
24
+ "indexed": true,
25
+ "internalType": "address",
26
+ "name": "operator",
27
+ "type": "address"
28
+ },
29
+ {
30
+ "indexed": false,
31
+ "internalType": "bool",
32
+ "name": "approved",
33
+ "type": "bool"
34
+ }
35
+ ],
36
+ "name": "ApprovalForAll",
37
+ "type": "event"
38
+ },
39
+ {
40
+ "anonymous": false,
41
+ "inputs": [
42
+ {
43
+ "indexed": true,
44
+ "internalType": "bytes32",
45
+ "name": "node",
46
+ "type": "bytes32"
47
+ },
48
+ {
49
+ "indexed": true,
50
+ "internalType": "bytes32",
51
+ "name": "label",
52
+ "type": "bytes32"
53
+ },
54
+ {
55
+ "indexed": false,
56
+ "internalType": "address",
57
+ "name": "owner",
58
+ "type": "address"
59
+ }
60
+ ],
61
+ "name": "NewOwner",
62
+ "type": "event"
63
+ },
64
+ {
65
+ "anonymous": false,
66
+ "inputs": [
67
+ {
68
+ "indexed": true,
69
+ "internalType": "bytes32",
70
+ "name": "node",
71
+ "type": "bytes32"
72
+ },
73
+ {
74
+ "indexed": false,
75
+ "internalType": "address",
76
+ "name": "resolver",
77
+ "type": "address"
78
+ }
79
+ ],
80
+ "name": "NewResolver",
81
+ "type": "event"
82
+ },
83
+ {
84
+ "anonymous": false,
85
+ "inputs": [
86
+ {
87
+ "indexed": true,
88
+ "internalType": "bytes32",
89
+ "name": "node",
90
+ "type": "bytes32"
91
+ },
92
+ {
93
+ "indexed": false,
94
+ "internalType": "uint64",
95
+ "name": "ttl",
96
+ "type": "uint64"
97
+ }
98
+ ],
99
+ "name": "NewTTL",
100
+ "type": "event"
101
+ },
102
+ {
103
+ "anonymous": false,
104
+ "inputs": [
105
+ {
106
+ "indexed": true,
107
+ "internalType": "bytes32",
108
+ "name": "node",
109
+ "type": "bytes32"
110
+ },
111
+ {
112
+ "indexed": false,
113
+ "internalType": "address",
114
+ "name": "owner",
115
+ "type": "address"
116
+ }
117
+ ],
118
+ "name": "Transfer",
119
+ "type": "event"
120
+ },
121
+ {
122
+ "constant": true,
123
+ "inputs": [
124
+ {
125
+ "internalType": "address",
126
+ "name": "owner",
127
+ "type": "address"
128
+ },
129
+ {
130
+ "internalType": "address",
131
+ "name": "operator",
132
+ "type": "address"
133
+ }
134
+ ],
135
+ "name": "isApprovedForAll",
136
+ "outputs": [
137
+ {
138
+ "internalType": "bool",
139
+ "name": "",
140
+ "type": "bool"
141
+ }
142
+ ],
143
+ "payable": false,
144
+ "stateMutability": "view",
145
+ "type": "function"
146
+ },
147
+ {
148
+ "constant": true,
149
+ "inputs": [],
150
+ "name": "old",
151
+ "outputs": [
152
+ {
153
+ "internalType": "contract ENS",
154
+ "name": "",
155
+ "type": "address"
156
+ }
157
+ ],
158
+ "payable": false,
159
+ "stateMutability": "view",
160
+ "type": "function"
161
+ },
162
+ {
163
+ "constant": true,
164
+ "inputs": [
165
+ {
166
+ "internalType": "bytes32",
167
+ "name": "node",
168
+ "type": "bytes32"
169
+ }
170
+ ],
171
+ "name": "owner",
172
+ "outputs": [
173
+ {
174
+ "internalType": "address",
175
+ "name": "",
176
+ "type": "address"
177
+ }
178
+ ],
179
+ "payable": false,
180
+ "stateMutability": "view",
181
+ "type": "function"
182
+ },
183
+ {
184
+ "constant": true,
185
+ "inputs": [
186
+ {
187
+ "internalType": "bytes32",
188
+ "name": "node",
189
+ "type": "bytes32"
190
+ }
191
+ ],
192
+ "name": "recordExists",
193
+ "outputs": [
194
+ {
195
+ "internalType": "bool",
196
+ "name": "",
197
+ "type": "bool"
198
+ }
199
+ ],
200
+ "payable": false,
201
+ "stateMutability": "view",
202
+ "type": "function"
203
+ },
204
+ {
205
+ "constant": true,
206
+ "inputs": [
207
+ {
208
+ "internalType": "bytes32",
209
+ "name": "node",
210
+ "type": "bytes32"
211
+ }
212
+ ],
213
+ "name": "resolver",
214
+ "outputs": [
215
+ {
216
+ "internalType": "address",
217
+ "name": "",
218
+ "type": "address"
219
+ }
220
+ ],
221
+ "payable": false,
222
+ "stateMutability": "view",
223
+ "type": "function"
224
+ },
225
+ {
226
+ "constant": false,
227
+ "inputs": [
228
+ {
229
+ "internalType": "address",
230
+ "name": "operator",
231
+ "type": "address"
232
+ },
233
+ {
234
+ "internalType": "bool",
235
+ "name": "approved",
236
+ "type": "bool"
237
+ }
238
+ ],
239
+ "name": "setApprovalForAll",
240
+ "outputs": [],
241
+ "payable": false,
242
+ "stateMutability": "nonpayable",
243
+ "type": "function"
244
+ },
245
+ {
246
+ "constant": false,
247
+ "inputs": [
248
+ {
249
+ "internalType": "bytes32",
250
+ "name": "node",
251
+ "type": "bytes32"
252
+ },
253
+ {
254
+ "internalType": "address",
255
+ "name": "owner",
256
+ "type": "address"
257
+ }
258
+ ],
259
+ "name": "setOwner",
260
+ "outputs": [],
261
+ "payable": false,
262
+ "stateMutability": "nonpayable",
263
+ "type": "function"
264
+ },
265
+ {
266
+ "constant": false,
267
+ "inputs": [
268
+ {
269
+ "internalType": "bytes32",
270
+ "name": "node",
271
+ "type": "bytes32"
272
+ },
273
+ {
274
+ "internalType": "address",
275
+ "name": "owner",
276
+ "type": "address"
277
+ },
278
+ {
279
+ "internalType": "address",
280
+ "name": "resolver",
281
+ "type": "address"
282
+ },
283
+ {
284
+ "internalType": "uint64",
285
+ "name": "ttl",
286
+ "type": "uint64"
287
+ }
288
+ ],
289
+ "name": "setRecord",
290
+ "outputs": [],
291
+ "payable": false,
292
+ "stateMutability": "nonpayable",
293
+ "type": "function"
294
+ },
295
+ {
296
+ "constant": false,
297
+ "inputs": [
298
+ {
299
+ "internalType": "bytes32",
300
+ "name": "node",
301
+ "type": "bytes32"
302
+ },
303
+ {
304
+ "internalType": "address",
305
+ "name": "resolver",
306
+ "type": "address"
307
+ }
308
+ ],
309
+ "name": "setResolver",
310
+ "outputs": [],
311
+ "payable": false,
312
+ "stateMutability": "nonpayable",
313
+ "type": "function"
314
+ },
315
+ {
316
+ "constant": false,
317
+ "inputs": [
318
+ {
319
+ "internalType": "bytes32",
320
+ "name": "node",
321
+ "type": "bytes32"
322
+ },
323
+ {
324
+ "internalType": "bytes32",
325
+ "name": "label",
326
+ "type": "bytes32"
327
+ },
328
+ {
329
+ "internalType": "address",
330
+ "name": "owner",
331
+ "type": "address"
332
+ }
333
+ ],
334
+ "name": "setSubnodeOwner",
335
+ "outputs": [
336
+ {
337
+ "internalType": "bytes32",
338
+ "name": "",
339
+ "type": "bytes32"
340
+ }
341
+ ],
342
+ "payable": false,
343
+ "stateMutability": "nonpayable",
344
+ "type": "function"
345
+ },
346
+ {
347
+ "constant": false,
348
+ "inputs": [
349
+ {
350
+ "internalType": "bytes32",
351
+ "name": "node",
352
+ "type": "bytes32"
353
+ },
354
+ {
355
+ "internalType": "bytes32",
356
+ "name": "label",
357
+ "type": "bytes32"
358
+ },
359
+ {
360
+ "internalType": "address",
361
+ "name": "owner",
362
+ "type": "address"
363
+ },
364
+ {
365
+ "internalType": "address",
366
+ "name": "resolver",
367
+ "type": "address"
368
+ },
369
+ {
370
+ "internalType": "uint64",
371
+ "name": "ttl",
372
+ "type": "uint64"
373
+ }
374
+ ],
375
+ "name": "setSubnodeRecord",
376
+ "outputs": [],
377
+ "payable": false,
378
+ "stateMutability": "nonpayable",
379
+ "type": "function"
380
+ },
381
+ {
382
+ "constant": false,
383
+ "inputs": [
384
+ {
385
+ "internalType": "bytes32",
386
+ "name": "node",
387
+ "type": "bytes32"
388
+ },
389
+ {
390
+ "internalType": "uint64",
391
+ "name": "ttl",
392
+ "type": "uint64"
393
+ }
394
+ ],
395
+ "name": "setTTL",
396
+ "outputs": [],
397
+ "payable": false,
398
+ "stateMutability": "nonpayable",
399
+ "type": "function"
400
+ },
401
+ {
402
+ "constant": true,
403
+ "inputs": [
404
+ {
405
+ "internalType": "bytes32",
406
+ "name": "node",
407
+ "type": "bytes32"
408
+ }
409
+ ],
410
+ "name": "ttl",
411
+ "outputs": [
412
+ {
413
+ "internalType": "uint64",
414
+ "name": "",
415
+ "type": "uint64"
416
+ }
417
+ ],
418
+ "payable": false,
419
+ "stateMutability": "view",
420
+ "type": "function"
421
+ }
422
+ ]
data/eth.gemspec CHANGED
@@ -28,11 +28,11 @@ Gem::Specification.new do |spec|
28
28
  spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
29
29
  spec.bindir = "exe"
30
30
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
31
- spec.require_paths = ["lib"]
31
+ spec.require_paths = ["lib", "abis"]
32
32
  spec.test_files = spec.files.grep %r{^(test|spec|features)/}
33
33
 
34
34
  spec.platform = Gem::Platform::RUBY
35
- spec.required_ruby_version = ">= 2.6", "< 4.0"
35
+ spec.required_ruby_version = ">= 2.7", "< 4.0"
36
36
 
37
37
  # keccak for hashing everything in ethereum
38
38
  spec.add_dependency "keccak", "~> 1.3"
data/lib/eth/client.rb CHANGED
@@ -106,8 +106,8 @@ module Eth
106
106
  # See {#transfer} for params and overloads.
107
107
  #
108
108
  # @return [String] the transaction hash once it is mined.
109
- def transfer_and_wait(destination, amount, sender_key = nil, legacy = false)
110
- wait_for_tx(transfer(destination, amount, sender_key, legacy))
109
+ def transfer_and_wait(destination, amount, **kwargs)
110
+ wait_for_tx(transfer(destination, amount, **kwargs))
111
111
  end
112
112
 
113
113
  # Simply transfer Ether to an account without any call data or
@@ -117,19 +117,24 @@ module Eth
117
117
  # **Note**, that many remote providers (e.g., Infura) do not provide
118
118
  # any accounts. Provide a `sender_key` if you experience issues.
119
119
  #
120
- # @param destination [Eth::Address] the destination address.
121
- # @param amount [Integer] the transfer amount in Wei.
122
- # @param sender_key [Eth::Key] the sender private key.
123
- # @param legacy [Boolean] enables legacy transactions (pre-EIP-1559).
120
+ # @overload transfer(destination, amount)
121
+ # @param destination [Eth::Address] the destination address.
122
+ # @param amount [Integer] the transfer amount in Wei.
123
+ # @overload transfer(destination, amount, **kwargs)
124
+ # @param destination [Eth::Address] the destination address.
125
+ # @param amount [Integer] the transfer amount in Wei.
126
+ # @param **sender_key [Eth::Key] the sender private key.
127
+ # @param **legacy [Boolean] enables legacy transactions (pre-EIP-1559).
128
+ # @param **nonce [Integer] optional specific nonce for transaction.
124
129
  # @return [String] the local transaction hash.
125
- def transfer(destination, amount, sender_key = nil, legacy = false)
130
+ def transfer(destination, amount, **kwargs)
126
131
  params = {
127
132
  value: amount,
128
133
  to: destination,
129
134
  gas_limit: gas_limit,
130
135
  chain_id: chain_id,
131
136
  }
132
- if legacy
137
+ if kwargs[:legacy]
133
138
  params.merge!({
134
139
  gas_price: max_fee_per_gas,
135
140
  })
@@ -139,22 +144,22 @@ module Eth
139
144
  max_gas_fee: max_fee_per_gas,
140
145
  })
141
146
  end
142
- unless sender_key.nil?
147
+ unless kwargs[:sender_key].nil?
143
148
 
144
149
  # use the provided key as sender and signer
145
150
  params.merge!({
146
- from: sender_key.address,
147
- nonce: get_nonce(sender_key.address),
151
+ from: kwargs[:sender_key].address,
152
+ nonce: kwargs[:nonce] || get_nonce(kwargs[:sender_key].address),
148
153
  })
149
154
  tx = Eth::Tx.new(params)
150
- tx.sign sender_key
155
+ tx.sign kwargs[:sender_key]
151
156
  return eth_send_raw_transaction(tx.hex)["result"]
152
157
  else
153
158
 
154
159
  # use the default account as sender and external signer
155
160
  params.merge!({
156
161
  from: default_account,
157
- nonce: get_nonce(default_account),
162
+ nonce: kwargs[:nonce] || get_nonce(default_account),
158
163
  })
159
164
  return eth_send_transaction(params)["result"]
160
165
  end
@@ -189,6 +194,7 @@ module Eth
189
194
  # @param **sender_key [Eth::Key] the sender private key.
190
195
  # @param **legacy [Boolean] enables legacy transactions (pre-EIP-1559).
191
196
  # @param **gas_limit [Integer] optional gas limit override for deploying the contract.
197
+ # @param **nonce [Integer] optional specific nonce for transaction.
192
198
  # @return [String] the transaction hash.
193
199
  # @raise [ArgumentError] in case the contract does not have any source.
194
200
  def deploy(contract, *args, **kwargs)
@@ -223,7 +229,7 @@ module Eth
223
229
  # Uses the provided key as sender and signer
224
230
  params.merge!({
225
231
  from: kwargs[:sender_key].address,
226
- nonce: get_nonce(kwargs[:sender_key].address),
232
+ nonce: kwargs[:nonce] || get_nonce(kwargs[:sender_key].address),
227
233
  })
228
234
  tx = Eth::Tx.new(params)
229
235
  tx.sign kwargs[:sender_key]
@@ -232,7 +238,7 @@ module Eth
232
238
  # Uses the default account as sender and external signer
233
239
  params.merge!({
234
240
  from: default_account,
235
- nonce: get_nonce(default_account),
241
+ nonce: kwargs[:nonce] || get_nonce(default_account),
236
242
  })
237
243
  return eth_send_transaction(params)["result"]
238
244
  end
@@ -288,6 +294,8 @@ module Eth
288
294
  # @param **legacy [Boolean] enables legacy transactions (pre-EIP-1559).
289
295
  # @param **address [Eth::Address] contract address.
290
296
  # @param **gas_limit [Integer] optional gas limit override for deploying the contract.
297
+ # @param **nonce [Integer] optional specific nonce for transaction.
298
+ # @param **tx_value [Integer] optional transaction value field filling.
291
299
  # @return [Object] returns the result of the transaction.
292
300
  def transact(contract, function, *args, **kwargs)
293
301
  gas_limit = if kwargs[:gas_limit]
@@ -297,7 +305,7 @@ module Eth
297
305
  end
298
306
  fun = contract.functions.select { |func| func.name == function }[0]
299
307
  params = {
300
- value: 0,
308
+ value: kwargs[:tx_value] || 0,
301
309
  gas_limit: gas_limit,
302
310
  chain_id: chain_id,
303
311
  to: kwargs[:address] || contract.address,
@@ -317,7 +325,7 @@ module Eth
317
325
  # use the provided key as sender and signer
318
326
  params.merge!({
319
327
  from: kwargs[:sender_key].address,
320
- nonce: get_nonce(kwargs[:sender_key].address),
328
+ nonce: kwargs[:nonce] || get_nonce(kwargs[:sender_key].address),
321
329
  })
322
330
  tx = Eth::Tx.new(params)
323
331
  tx.sign kwargs[:sender_key]
@@ -326,7 +334,7 @@ module Eth
326
334
  # use the default account as sender and external signer
327
335
  params.merge!({
328
336
  from: default_account,
329
- nonce: get_nonce(default_account),
337
+ nonce: kwargs[:nonce] || get_nonce(default_account),
330
338
  })
331
339
  return eth_send_transaction(params)["result"]
332
340
  end
@@ -406,39 +414,14 @@ module Eth
406
414
  private
407
415
 
408
416
  # Non-transactional function call called from call().
417
+ # @see https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_call
409
418
  def call_raw(contract, func, *args, **kwargs)
410
- gas_limit = if kwargs[:gas_limit]
411
- kwargs[:gas_limit]
412
- else
413
- Tx.estimate_intrinsic_gas(contract.bin) + Tx::CREATE_GAS
414
- end
415
419
  params = {
416
- gas_limit: gas_limit,
417
- chain_id: chain_id,
418
420
  data: call_payload(func, args),
419
- }
420
- if kwargs[:address] || contract.address
421
- params.merge!({ to: kwargs[:address] || contract.address })
422
- end
423
- if kwargs[:legacy]
424
- params.merge!({
425
- gas_price: max_fee_per_gas,
426
- })
427
- else
428
- params.merge!({
429
- priority_fee: max_priority_fee_per_gas,
430
- max_gas_fee: max_fee_per_gas,
431
- })
432
- end
433
- unless kwargs[:sender_key].nil?
434
- # Uses the provided key as sender and signer
435
- params.merge!({
436
- from: kwargs[:sender_key].address,
437
- nonce: get_nonce(kwargs[:sender_key].address),
438
- })
439
- tx = Eth::Tx.new(params)
440
- tx.sign kwargs[:sender_key]
441
- end
421
+ to: kwargs[:address] || contract.address,
422
+ from: kwargs[:from],
423
+ }.compact
424
+
442
425
  raw_result = eth_call(params)["result"]
443
426
  types = func.outputs.map { |i| i.type }
444
427
  return nil if raw_result == "0x"
@@ -0,0 +1,77 @@
1
+ # Copyright (c) 2016-2022 The Ruby-Eth Contributors
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ # -*- encoding : ascii-8bit -*-
16
+
17
+ # Provides the {Eth} module.
18
+ module Eth
19
+ # Provides ENS specific functionality
20
+ # ref: https://ens.domains
21
+ module Ens
22
+
23
+ # Utility class for resolving ENS names to Ethereum addresses
24
+ class Resolver
25
+
26
+ # The default address for ENS, which applies to most chains
27
+ DEFAULT_ADDRESS = "0x00000000000c2e074ec69a0dfb2997ba6c7d2e1e".freeze
28
+
29
+ # Create an instance of the ENS Resolver
30
+ #
31
+ # @param client [Eth::Client] The client instance
32
+ # @param address [String] The address of the ENS contract
33
+ def initialize(client, address = DEFAULT_ADDRESS)
34
+ @client = client
35
+ @contract = Eth::Contract.from_abi(
36
+ name: "ENS",
37
+ address: address,
38
+ abi: JSON.parse(File.read(File.join(File.dirname(__FILE__), "../../../abis/ens.json"))),
39
+ )
40
+ end
41
+
42
+ # Resolve an ENS name to an address
43
+ #
44
+ # @param ens_name [String] The ENS name, eg: fancy.eth
45
+ # @return [String] The owner address of the name, as a hex string
46
+ def resolve(ens_name)
47
+ @client.call(@contract, "owner", namehash(ens_name))
48
+ end
49
+
50
+ # Generate node for the given domain name
51
+ # See: https://docs.ens.domains/contract-api-reference/name-processing
52
+ #
53
+ # @param ens_name [String] The ENS name, eg: fancy.eth
54
+ # @return [String] The node as a hex string
55
+ def namehash(ens_name)
56
+ node = ("0" * 64)
57
+ name = normalize(ens_name)
58
+ name.split(".").reverse.each do |label|
59
+ hash = Digest::Keccak.new(256).hexdigest(label)
60
+ node = Digest::Keccak.new(256).hexdigest([node + hash].pack("H*"))
61
+ end
62
+ "0x#{node}"
63
+ end
64
+
65
+ # Normalize a string as specified by http://unicode.org/reports/tr46/
66
+ #
67
+ # @param input [String] The input string
68
+ # @return [String] The normalized output string
69
+ def normalize(input)
70
+ # TODO: This is fairly complicated, and there doesn't seem to be a ruby
71
+ # library which can handle it perfectly.
72
+ # https://www.unicode.org/reports/tr46/tr46-27.html
73
+ input.downcase
74
+ end
75
+ end
76
+ end
77
+ end
data/lib/eth/version.rb CHANGED
@@ -16,5 +16,5 @@
16
16
  module Eth
17
17
 
18
18
  # Defines the version of the {Eth} module.
19
- VERSION = "0.5.7".freeze
19
+ VERSION = "0.5.8".freeze
20
20
  end
data/lib/eth.rb CHANGED
@@ -32,4 +32,5 @@ require "eth/solidity"
32
32
  require "eth/tx"
33
33
  require "eth/unit"
34
34
  require "eth/util"
35
+ require "eth/ens/resolver"
35
36
  require "eth/version"
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.7
4
+ version: 0.5.8
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-10-31 00:00:00.000000000 Z
12
+ date: 2022-11-30 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: keccak
@@ -109,6 +109,7 @@ files:
109
109
  - LICENSE.txt
110
110
  - README.md
111
111
  - Rakefile
112
+ - abis/ens.json
112
113
  - bin/console
113
114
  - bin/setup
114
115
  - codecov.yml
@@ -132,6 +133,7 @@ files:
132
133
  - lib/eth/contract/function_output.rb
133
134
  - lib/eth/contract/initializer.rb
134
135
  - lib/eth/eip712.rb
136
+ - lib/eth/ens/resolver.rb
135
137
  - lib/eth/key.rb
136
138
  - lib/eth/key/decrypter.rb
137
139
  - lib/eth/key/encrypter.rb
@@ -164,11 +166,12 @@ post_install_message:
164
166
  rdoc_options: []
165
167
  require_paths:
166
168
  - lib
169
+ - abis
167
170
  required_ruby_version: !ruby/object:Gem::Requirement
168
171
  requirements:
169
172
  - - ">="
170
173
  - !ruby/object:Gem::Version
171
- version: '2.6'
174
+ version: '2.7'
172
175
  - - "<"
173
176
  - !ruby/object:Gem::Version
174
177
  version: '4.0'
@@ -178,7 +181,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
178
181
  - !ruby/object:Gem::Version
179
182
  version: '0'
180
183
  requirements: []
181
- rubygems_version: 3.3.23
184
+ rubygems_version: 3.3.25
182
185
  signing_key:
183
186
  specification_version: 4
184
187
  summary: Ruby Ethereum library.