eth 0.5.1 → 0.5.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,75 @@
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
+ require "open3"
16
+
17
+ # Provides the {Eth} module.
18
+ module Eth
19
+
20
+ # Class to create {Solidity} compiler bingings for Ruby.
21
+ class Solidity
22
+
23
+ # Provides a Compiler Error in case the contract does not compile.
24
+ class CompilerError < StandardError; end
25
+
26
+ # Solidity compiler binary path.
27
+ attr_reader :compiler
28
+
29
+ # Instantiates a Solidity `solc` system compiler binding that can be
30
+ # used to compile Solidity contracts.
31
+ def initialize
32
+
33
+ # Currently only supports `solc`.
34
+ solc = get_compiler_path
35
+ raise SystemCallError, "Unable to find the solc compiler path!" if solc.nil?
36
+ @compiler = solc
37
+ end
38
+
39
+ # Use the bound Solidity executable to compile the given contract.
40
+ #
41
+ # @param contract [String] path of the contract to compile.
42
+ # @return [Array] JSON containing the compiled contract and ABI for all contracts.
43
+ def compile(contract)
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
47
+ raise SystemCallError, "Unable to run solc compiler!" if status.exitstatus === 127
48
+ raise CompilerError, error unless status.success?
49
+ json = JSON.parse output
50
+ result = {}
51
+ json["contracts"].each do |key, value|
52
+ _file, name = key.split ":"
53
+ result[name] = {}
54
+ result[name]["abi"] = value["abi"]
55
+ result[name]["bin"] = value["bin"]
56
+ end
57
+ return result
58
+ end
59
+
60
+ private
61
+
62
+ # Tries to find a system executable path for the given compiler binary name.
63
+ def get_compiler_path(name = "solc")
64
+ extensions = [""]
65
+ extensions = ENV["PATHEXT"].split(";") unless ENV["PATHEXT"].nil?
66
+ ENV["PATH"].split(File::PATH_SEPARATOR).each do |path|
67
+ extensions.each do |ext|
68
+ executable = File.join path, "#{name}#{ext}"
69
+ return executable if File.executable? executable and !File.directory? executable
70
+ end
71
+ end
72
+ return nil
73
+ end
74
+ end
75
+ end
@@ -95,6 +95,7 @@ module Eth
95
95
 
96
96
  # ensure sane values for all mandatory fields
97
97
  fields = Tx.validate_params fields
98
+ fields = Tx.validate_eip1559_params fields
98
99
  fields[:access_list] = Tx.sanitize_list fields[:access_list]
99
100
 
100
101
  # ensure gas limit is not too low
@@ -92,6 +92,7 @@ module Eth
92
92
  fields[:data] = Tx.sanitize_data fields[:data]
93
93
 
94
94
  # ensure sane values for all mandatory fields
95
+ fields = Tx.validate_params fields
95
96
  fields = Tx.validate_legacy_params fields
96
97
  fields[:access_list] = Tx.sanitize_list fields[:access_list]
97
98
 
data/lib/eth/tx/legacy.rb CHANGED
@@ -83,6 +83,7 @@ module Eth
83
83
  fields[:data] = Tx.sanitize_data fields[:data]
84
84
 
85
85
  # ensure sane values for all mandatory fields
86
+ fields = Tx.validate_params fields
86
87
  fields = Tx.validate_legacy_params fields
87
88
 
88
89
  # ensure gas limit is not too low
data/lib/eth/tx.rb CHANGED
@@ -69,13 +69,16 @@ module Eth
69
69
  # The zero byte is 0x00.
70
70
  ZERO_BYTE = "\x00".freeze
71
71
 
72
+ # Smart contract transaction gas cost
73
+ CREATE_GAS = 32_000.freeze
74
+
72
75
  # Creates a new transaction of any type for given parameters and chain ID.
73
76
  # Required parameters are (optional in brackets):
74
77
  # - EIP-1559: chain_id, nonce, priority_fee, max_gas_fee, gas_limit(, from, to,
75
78
  # value, data, access_list)
76
79
  # - EIP-2930: chain_id, nonce, gas_price, gas_limit, access_list(, from, to,
77
80
  # value, data)
78
- # - Legacy: nonce, gas_price, gas_lmit(, from, to, value, data)
81
+ # - Legacy: nonce, gas_price, gas_limit(, from, to, value, data)
79
82
  #
80
83
  # @param params [Hash] all necessary transaction fields.
81
84
  # @param chain_id [Integer] the EIP-155 Chain ID (legacy transactions only).
@@ -184,14 +187,12 @@ module Eth
184
187
  return gas
185
188
  end
186
189
 
187
- # Validates the common type-2 transaction fields such as nonce, priority
188
- # fee, max gas fee, gas limit, amount, and access list.
190
+ # Validates the common transaction fields such as nonce, gas limit,
191
+ # amount, and access list.
189
192
  #
190
193
  # @param fields [Hash] the transaction fields.
191
194
  # @return [Hash] the validated transaction fields.
192
195
  # @raise [ParameterError] if nonce is an invalid integer.
193
- # @raise [ParameterError] if priority fee is invalid.
194
- # @raise [ParameterError] if max gas fee is invalid.
195
196
  # @raise [ParameterError] if gas limit is invalid.
196
197
  # @raise [ParameterError] if amount is invalid.
197
198
  # @raise [ParameterError] if access list is invalid.
@@ -199,12 +200,6 @@ module Eth
199
200
  if fields[:nonce].nil? or fields[:nonce] < 0
200
201
  raise ParameterError, "Invalid signer nonce #{fields[:nonce]}!"
201
202
  end
202
- if fields[:priority_fee].nil? or fields[:priority_fee] < 0
203
- raise ParameterError, "Invalid gas priority fee #{fields[:priority_fee]}!"
204
- end
205
- if fields[:max_gas_fee].nil? or fields[:max_gas_fee] < 0
206
- raise ParameterError, "Invalid max gas fee #{fields[:max_gas_fee]}!"
207
- end
208
203
  if fields[:gas_limit].nil? or fields[:gas_limit] < DEFAULT_GAS_LIMIT or fields[:gas_limit] > BLOCK_GAS_LIMIT
209
204
  raise ParameterError, "Invalid gas limit #{fields[:gas_limit]}!"
210
205
  end
@@ -217,32 +212,32 @@ module Eth
217
212
  return fields
218
213
  end
219
214
 
220
- # Validates the common legacy transaction fields such as nonce, gas
221
- # price, gas limit, amount, and access list.
215
+ # Validates the common type-2 transaction fields such as priority
216
+ # fee and max gas fee.
217
+ #
218
+ # @param fields [Hash] the transaction fields.
219
+ # @return [Hash] the validated transaction fields.
220
+ # @raise [ParameterError] if priority fee is invalid.
221
+ # @raise [ParameterError] if max gas fee is invalid.
222
+ def validate_eip1559_params(fields)
223
+ if fields[:priority_fee].nil? or fields[:priority_fee] < 0
224
+ raise ParameterError, "Invalid gas priority fee #{fields[:priority_fee]}!"
225
+ end
226
+ if fields[:max_gas_fee].nil? or fields[:max_gas_fee] < 0
227
+ raise ParameterError, "Invalid max gas fee #{fields[:max_gas_fee]}!"
228
+ end
229
+ return fields
230
+ end
231
+
232
+ # Validates the common legacy transaction fields such as gas price.
222
233
  #
223
234
  # @param fields [Hash] the transaction fields.
224
235
  # @return [Hash] the validated transaction fields.
225
- # @raise [ParameterError] if nonce is an invalid integer.
226
236
  # @raise [ParameterError] if gas price is invalid.
227
- # @raise [ParameterError] if gas limit is invalid.
228
- # @raise [ParameterError] if amount is invalid.
229
- # @raise [ParameterError] if access list is invalid.
230
237
  def validate_legacy_params(fields)
231
- if fields[:nonce].nil? or fields[:nonce] < 0
232
- raise ParameterError, "Invalid signer nonce #{fields[:nonce]}!"
233
- end
234
238
  if fields[:gas_price].nil? or fields[:gas_price] < 0
235
239
  raise ParameterError, "Invalid gas price #{fields[:gas_price]}!"
236
240
  end
237
- if fields[:gas_limit].nil? or fields[:gas_limit] < DEFAULT_GAS_LIMIT or fields[:gas_limit] > BLOCK_GAS_LIMIT
238
- raise ParameterError, "Invalid gas limit #{fields[:gas_limit]}!"
239
- end
240
- unless fields[:value] >= 0
241
- raise ParameterError, "Invalid transaction value #{fields[:value]}!"
242
- end
243
- unless fields[:access_list].nil? or fields[:access_list].is_a? Array
244
- raise ParameterError, "Invalid access list #{fields[:access_list]}!"
245
- end
246
241
  return fields
247
242
  end
248
243
 
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.1".freeze
19
+ VERSION = "0.5.4".freeze
20
20
  end
data/lib/eth.rb CHANGED
@@ -22,6 +22,12 @@ require "eth/api"
22
22
  require "eth/address"
23
23
  require "eth/chain"
24
24
  require "eth/constant"
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"
25
31
  require "eth/client"
26
32
  require "eth/client/http"
27
33
  require "eth/client/ipc"
@@ -29,6 +35,7 @@ require "eth/eip712"
29
35
  require "eth/key"
30
36
  require "eth/rlp"
31
37
  require "eth/signature"
38
+ require "eth/solidity"
32
39
  require "eth/tx"
33
40
  require "eth/unit"
34
41
  require "eth/util"
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.1
4
+ version: 0.5.4
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-01-31 00:00:00.000000000 Z
12
+ date: 2022-05-16 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: keccak
@@ -57,16 +57,22 @@ dependencies:
57
57
  name: openssl
58
58
  requirement: !ruby/object:Gem::Requirement
59
59
  requirements:
60
- - - "~>"
60
+ - - ">="
61
61
  - !ruby/object:Gem::Version
62
62
  version: '2.2'
63
+ - - "<"
64
+ - !ruby/object:Gem::Version
65
+ version: '4.0'
63
66
  type: :runtime
64
67
  prerelease: false
65
68
  version_requirements: !ruby/object:Gem::Requirement
66
69
  requirements:
67
- - - "~>"
70
+ - - ">="
68
71
  - !ruby/object:Gem::Version
69
72
  version: '2.2'
73
+ - - "<"
74
+ - !ruby/object:Gem::Version
75
+ version: '4.0'
70
76
  - !ruby/object:Gem::Dependency
71
77
  name: scrypt
72
78
  requirement: !ruby/object:Gem::Requirement
@@ -104,9 +110,11 @@ files:
104
110
  - Rakefile
105
111
  - bin/console
106
112
  - bin/setup
113
+ - codecov.yml
107
114
  - eth.gemspec
108
115
  - lib/eth.rb
109
116
  - lib/eth/abi.rb
117
+ - lib/eth/abi/event.rb
110
118
  - lib/eth/abi/type.rb
111
119
  - lib/eth/address.rb
112
120
  - lib/eth/api.rb
@@ -115,6 +123,12 @@ files:
115
123
  - lib/eth/client/http.rb
116
124
  - lib/eth/client/ipc.rb
117
125
  - lib/eth/constant.rb
126
+ - lib/eth/contract.rb
127
+ - lib/eth/contract/event.rb
128
+ - lib/eth/contract/function.rb
129
+ - lib/eth/contract/function_input.rb
130
+ - lib/eth/contract/function_output.rb
131
+ - lib/eth/contract/initializer.rb
118
132
  - lib/eth/eip712.rb
119
133
  - lib/eth/key.rb
120
134
  - lib/eth/key/decrypter.rb
@@ -127,6 +141,7 @@ files:
127
141
  - lib/eth/rlp/sedes/binary.rb
128
142
  - lib/eth/rlp/sedes/list.rb
129
143
  - lib/eth/signature.rb
144
+ - lib/eth/solidity.rb
130
145
  - lib/eth/tx.rb
131
146
  - lib/eth/tx/eip1559.rb
132
147
  - lib/eth/tx/eip2930.rb
@@ -161,7 +176,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
161
176
  - !ruby/object:Gem::Version
162
177
  version: '0'
163
178
  requirements: []
164
- rubygems_version: 3.3.5
179
+ rubygems_version: 3.3.8
165
180
  signing_key:
166
181
  specification_version: 4
167
182
  summary: Ruby Ethereum library.