eth 0.5.8 → 0.5.10

Sign up to get free protection for your applications and to get access to all the features.
Files changed (53) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/spec.yml +2 -1
  3. data/CHANGELOG.md +32 -0
  4. data/CODE_OF_CONDUCT.md +122 -0
  5. data/CONTRIBUTING.md +61 -0
  6. data/LICENSE.txt +1 -1
  7. data/README.md +6 -2
  8. data/SECURITY.md +24 -0
  9. data/abi/ens_registry.json +436 -0
  10. data/abi/ens_resolver.json +885 -0
  11. data/lib/eth/abi/event.rb +1 -1
  12. data/lib/eth/abi/type.rb +46 -12
  13. data/lib/eth/abi.rb +72 -14
  14. data/lib/eth/address.rb +2 -2
  15. data/lib/eth/api.rb +1 -1
  16. data/lib/eth/chain.rb +19 -7
  17. data/lib/eth/client/http.rb +1 -1
  18. data/lib/eth/client/http_auth.rb +1 -1
  19. data/lib/eth/client/ipc.rb +1 -1
  20. data/lib/eth/client.rb +118 -16
  21. data/lib/eth/constant.rb +1 -1
  22. data/lib/eth/contract/event.rb +1 -1
  23. data/lib/eth/contract/function.rb +2 -2
  24. data/lib/eth/contract/function_input.rb +7 -2
  25. data/lib/eth/contract/function_output.rb +1 -1
  26. data/lib/eth/contract/initializer.rb +1 -1
  27. data/lib/eth/contract.rb +1 -1
  28. data/lib/eth/eip712.rb +2 -2
  29. data/lib/eth/ens/coin_type.rb +50 -0
  30. data/lib/eth/ens/resolver.rb +68 -24
  31. data/lib/eth/ens.rb +28 -0
  32. data/lib/eth/key/decrypter.rb +1 -1
  33. data/lib/eth/key/encrypter.rb +1 -1
  34. data/lib/eth/key.rb +5 -5
  35. data/lib/eth/rlp/decoder.rb +2 -2
  36. data/lib/eth/rlp/encoder.rb +3 -3
  37. data/lib/eth/rlp/sedes/big_endian_int.rb +1 -1
  38. data/lib/eth/rlp/sedes/binary.rb +2 -2
  39. data/lib/eth/rlp/sedes/list.rb +5 -5
  40. data/lib/eth/rlp/sedes.rb +4 -4
  41. data/lib/eth/rlp.rb +1 -1
  42. data/lib/eth/signature.rb +4 -4
  43. data/lib/eth/solidity.rb +5 -3
  44. data/lib/eth/tx/eip1559.rb +3 -3
  45. data/lib/eth/tx/eip2930.rb +3 -3
  46. data/lib/eth/tx/legacy.rb +3 -3
  47. data/lib/eth/tx.rb +5 -5
  48. data/lib/eth/unit.rb +1 -1
  49. data/lib/eth/util.rb +14 -14
  50. data/lib/eth/version.rb +2 -2
  51. data/lib/eth.rb +2 -2
  52. metadata +9 -3
  53. data/abis/ens.json +0 -422
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2016-2022 The Ruby-Eth Contributors
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.is_primitive? serial
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
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2016-2022 The Ruby-Eth Contributors
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.is_sedes?(e)
37
+ if Sedes.sedes?(e)
38
38
  push e
39
- elsif Util.is_list?(e)
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.is_list?(obj)
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.is_list?(serial)
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-2022 The Ruby-Eth Contributors
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 is_sedes? obj.class
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.is_list? obj
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 is_sedes?(obj)
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
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2016-2022 The Ruby-Eth Contributors
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.
data/lib/eth/signature.rb CHANGED
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2016-2022 The Ruby-Eth Contributors
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.is_hex? signature
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.is_ledger? v and !Chain.is_legacy? v
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.is_hex? blob or blob.encoding == Encoding::ASCII_8BIT)
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-2022 The Ruby-Eth Contributors
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
- command = "#{@compiler} --optimize --combined-json bin,abi #{contract}"
46
- output, error, status = Open3.capture3 command
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
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2016-2022 The Ruby-Eth Contributors
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.is_signed? self
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.is_signed? self
261
+ unless Tx.signed? self
262
262
  raise Signature::SignatureError, "Transaction is not signed!"
263
263
  end
264
264
  tx_data = []
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2016-2022 The Ruby-Eth Contributors
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.is_signed? self
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.is_signed? self
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-2022 The Ruby-Eth Contributors
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.is_signed? self
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.is_signed? self
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-2022 The Ruby-Eth Contributors
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.is_hex? data
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.is_hex? data
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.is_hex? value
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 is_signed?(tx)
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
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2016-2022 The Ruby-Eth Contributors
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.
data/lib/eth/util.rb CHANGED
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2016-2022 The Ruby-Eth Contributors
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 is_hex? str
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 is_hex? hex
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 is_prefixed? hex
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 is_prefixed? hex
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 is_hex?(str)
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 is_prefixed?(hex)
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 is_hex? num
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 is_hex? num
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
- is_bytes?(str) ? str : str.b
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 is_bytes?(str)
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 is_primitive?(item)
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 is_list?(item)
186
- !is_primitive?(item) && item.respond_to?(:each)
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-2022 The Ruby-Eth Contributors
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.8".freeze
19
+ VERSION = "0.5.10".freeze
20
20
  end
data/lib/eth.rb CHANGED
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2016-2022 The Ruby-Eth Contributors
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.
@@ -32,5 +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
+ require "eth/ens"
36
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.8
4
+ version: 0.5.10
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-11-30 00:00:00.000000000 Z
12
+ date: 2023-01-02 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: keccak
@@ -105,11 +105,15 @@ files:
105
105
  - ".yardopts"
106
106
  - AUTHORS.txt
107
107
  - CHANGELOG.md
108
+ - CODE_OF_CONDUCT.md
109
+ - CONTRIBUTING.md
108
110
  - Gemfile
109
111
  - LICENSE.txt
110
112
  - README.md
111
113
  - Rakefile
112
- - abis/ens.json
114
+ - SECURITY.md
115
+ - abi/ens_registry.json
116
+ - abi/ens_resolver.json
113
117
  - bin/console
114
118
  - bin/setup
115
119
  - codecov.yml
@@ -133,6 +137,8 @@ files:
133
137
  - lib/eth/contract/function_output.rb
134
138
  - lib/eth/contract/initializer.rb
135
139
  - lib/eth/eip712.rb
140
+ - lib/eth/ens.rb
141
+ - lib/eth/ens/coin_type.rb
136
142
  - lib/eth/ens/resolver.rb
137
143
  - lib/eth/key.rb
138
144
  - lib/eth/key/decrypter.rb