web3-eth 0.2.24 → 0.2.25

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 349ba2e58a5171bb47c408e03e48ae0bb412d9df
4
- data.tar.gz: edd6d4cb343b3b9a6fa2517f8b2c3e22c2f2699c
3
+ metadata.gz: 33bd4cdb2606f3062e84ccbc4429052a3dce2def
4
+ data.tar.gz: 1fa19d0bcfde6f6d467f295940353f7250a3c99b
5
5
  SHA512:
6
- metadata.gz: 122feca9cb6d36847433c515955535662b0d0906818d12c158fa3d7e15cbfb45e8cd6b59d9a87d8311a9d6f65f42797c4bc661f9166607d924c2efbfae4f5f06
7
- data.tar.gz: d4bff9d38361237b2b64ef7dabac296edad63badb7197c2a59a3648c73bc37a1b9a356dd5374f0ded4dbc22c1558cf68c1c5bdbad99ffa55e8f5323033b848fd
6
+ metadata.gz: dae87035bfeeaa1b67978281030a052a23f0caf52db741d2b387effff6543dd2d31d99a6bb8155c93ac602457e4d5cbd84c8e35d756364b3b7c28c2463575655
7
+ data.tar.gz: b3fb6aab3c77c4b3362e688b64ef846e08c735fdb50d16842a0c10ac30f931716f94f0caf311a7ccdfe6cc0d4a06d73c451b1fc4609282c8a213f0d84a77bc3a
@@ -192,10 +192,15 @@ module Web3::Eth::Abi
192
192
  end
193
193
  end
194
194
 
195
+
196
+ def min_data_size types
197
+ types.size*32
198
+ end
199
+
195
200
  ##
196
201
  # Decodes multiple arguments using the head/tail mechanism.
197
202
  #
198
- def decode_abi(types, data)
203
+ def decode_abi types, data, raise_errors = false
199
204
  parsed_types = types.map {|t| Type.parse(t) }
200
205
 
201
206
  outputs = [nil] * types.size
@@ -207,8 +212,17 @@ module Web3::Eth::Abi
207
212
  # If a type is static, grab the data directly, otherwise record its
208
213
  # start position
209
214
  if t.dynamic?
215
+
216
+ if raise_errors && pos>data.size-1
217
+ raise DecodingError, "Position out of bounds #{pos}>#{data.size-1}"
218
+ end
219
+
210
220
  start_positions[i] = Utils.big_endian_to_int(data[pos, 32])
211
221
 
222
+ if raise_errors && start_positions[i]>data.size-1
223
+ raise DecodingError, "Start position out of bounds #{start_positions[i]}>#{data.size-1}"
224
+ end
225
+
212
226
  j = i - 1
213
227
  while j >= 0 && start_positions[j].nil?
214
228
  start_positions[j] = start_positions[i]
@@ -230,7 +244,10 @@ module Web3::Eth::Abi
230
244
  j -= 1
231
245
  end
232
246
 
233
- # raise DecodingError, "Not enough data for head" unless pos <= data.size
247
+ if raise_errors && pos > data.size
248
+ raise DecodingError, "Not enough data for head"
249
+ end
250
+
234
251
 
235
252
  parsed_types.each_with_index do |t, i|
236
253
  if t.dynamic?
@@ -241,6 +258,10 @@ module Web3::Eth::Abi
241
258
  end
242
259
  end
243
260
 
261
+ if raise_errors && outputs.include?(nil)
262
+ raise DecodingError, "Not all data can be parsed"
263
+ end
264
+
244
265
  parsed_types.zip(outputs).map {|(type, out)| decode_type(type, out) }
245
266
  end
246
267
  alias :decode :decode_abi
@@ -103,6 +103,52 @@ module Web3
103
103
 
104
104
  end
105
105
 
106
+ class ContractConstructor < ContractMethod
107
+
108
+ def initialize abi
109
+ super abi
110
+ end
111
+
112
+ def parse_method_args transaction
113
+ return [] if input_types.empty?
114
+
115
+ input = transaction.input
116
+
117
+ d = fetch_constructor_data input
118
+ result = (d && !d.empty? && try_parse(d))
119
+
120
+ unless result
121
+ start = input.length-1-min_data_size(input_types)
122
+ while start>=0 && !result
123
+ result = try_parse input, start
124
+ start -= 1
125
+ end
126
+ end
127
+
128
+ result
129
+ end
130
+
131
+ private
132
+
133
+ CONSTRUCTOR_SEQ = /a165627a7a72305820\w{64}0029(\w*)$/
134
+ def fetch_constructor_data input
135
+ data = input[CONSTRUCTOR_SEQ,1]
136
+ while data && (d = data[CONSTRUCTOR_SEQ,1])
137
+ data = d
138
+ end
139
+ data
140
+ end
141
+
142
+ def try_parse input, start = 0
143
+ d = start==0 ? input : input.slice(start, input.length-start-1)
144
+ decode_abi input_types, [d].pack('H*'), true
145
+ rescue Exception => err
146
+ nil
147
+ end
148
+
149
+ end
150
+
151
+
106
152
  attr_reader :web3_rpc, :abi, :functions, :events, :constructor, :functions_by_hash, :events_by_hash
107
153
 
108
154
  def initialize abi, web_rpc = nil
@@ -168,8 +214,7 @@ module Web3
168
214
  @events[method.name] = method
169
215
  @events_by_hash[method.signature_hash] = method
170
216
  when 'constructor'
171
- method = ContractMethod.new(a)
172
- @constructor = method
217
+ @constructor = ContractConstructor.new(a)
173
218
  end
174
219
  }
175
220
  end
@@ -26,9 +26,7 @@ module Web3
26
26
  # suffix # 0xa1 0x65 'b' 'z' 'z' 'r' '0' 0x58 0x20 <32 bytes swarm hash> 0x00 0x29
27
27
  # look http://solidity.readthedocs.io/en/latest/metadata.html for details
28
28
  def call_input_data
29
- if raw_data['creates'] && input
30
- fetch_constructor_data input
31
- elsif input && input.length>10
29
+ if input && input.length>10
32
30
  input[10..input.length]
33
31
  else
34
32
  []
@@ -57,16 +55,6 @@ module Web3
57
55
  wei_to_ether from_hex gasPrice
58
56
  end
59
57
 
60
- private
61
-
62
- CONSTRUCTOR_SEQ = /a165627a7a72305820\w{64}0029(\w*)$/
63
- def fetch_constructor_data input
64
- data = input[CONSTRUCTOR_SEQ,1]
65
- while data && (d = data[CONSTRUCTOR_SEQ,1])
66
- data = d
67
- end
68
- data
69
- end
70
58
 
71
59
  end
72
60
  end
@@ -1,5 +1,5 @@
1
1
  module Web3
2
2
  module Eth
3
- VERSION = "0.2.24"
3
+ VERSION = "0.2.25"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: web3-eth
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.24
4
+ version: 0.2.25
5
5
  platform: ruby
6
6
  authors:
7
7
  - studnev
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-04-02 00:00:00.000000000 Z
11
+ date: 2019-05-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rlp