web3 7.5.0__py3-none-any.whl → 7.6.0__py3-none-any.whl

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.
web3/utils/abi.py CHANGED
@@ -1,6 +1,7 @@
1
1
  import functools
2
2
  from typing import (
3
3
  Any,
4
+ Callable,
4
5
  Dict,
5
6
  List,
6
7
  Optional,
@@ -47,7 +48,6 @@ from eth_utils.toolz import (
47
48
  )
48
49
  from eth_utils.types import (
49
50
  is_list_like,
50
- is_text,
51
51
  )
52
52
  from hexbytes import (
53
53
  HexBytes,
@@ -55,17 +55,21 @@ from hexbytes import (
55
55
 
56
56
  from web3._utils.abi import (
57
57
  filter_by_argument_name,
58
+ filter_by_argument_type,
59
+ get_abi_element_signature,
60
+ get_name_from_abi_element_identifier,
58
61
  )
59
- from web3._utils.abi_element_identifiers import (
60
- FallbackFn,
61
- ReceiveFn,
62
+ from web3._utils.decorators import (
63
+ deprecated_for,
64
+ )
65
+ from web3._utils.validation import (
66
+ validate_abi,
62
67
  )
63
68
  from web3.exceptions import (
64
69
  ABIConstructorNotFound,
65
70
  ABIFallbackNotFound,
66
71
  ABIReceiveNotFound,
67
72
  MismatchedABI,
68
- Web3TypeError,
69
73
  Web3ValidationError,
70
74
  Web3ValueError,
71
75
  )
@@ -81,9 +85,14 @@ from eth_utils.abi import ( # noqa
81
85
  function_abi_to_4byte_selector,
82
86
  get_aligned_abi_inputs,
83
87
  get_normalized_abi_inputs,
88
+ get_abi_input_types,
84
89
  )
85
90
 
86
91
 
92
+ def _filter_by_signature(signature: str, contract_abi: ABI) -> List[ABIElement]:
93
+ return [abi for abi in contract_abi if abi_to_signature(abi) == signature]
94
+
95
+
87
96
  def _filter_by_argument_count(
88
97
  num_arguments: int, contract_abi: ABI
89
98
  ) -> List[ABIElement]:
@@ -98,9 +107,9 @@ def _filter_by_argument_count(
98
107
 
99
108
  def _filter_by_encodability(
100
109
  abi_codec: codec.ABIEncoder,
110
+ args: Sequence[Any],
111
+ kwargs: Dict[str, Any],
101
112
  contract_abi: ABI,
102
- *args: Optional[Sequence[Any]],
103
- **kwargs: Optional[Dict[str, Any]],
104
113
  ) -> List[ABICallable]:
105
114
  return [
106
115
  cast(ABICallable, function_abi)
@@ -158,13 +167,118 @@ def _get_fallback_function_abi(contract_abi: ABI) -> ABIFallback:
158
167
  raise ABIFallbackNotFound("No fallback function was found in the contract ABI.")
159
168
 
160
169
 
170
+ def _get_any_abi_signature_with_name(element_name: str, contract_abi: ABI) -> str:
171
+ """
172
+ Find an ABI identifier signature by element name. A signature identifier is
173
+ returned, "name(arg1Type,arg2Type,...)".
174
+
175
+ This function forces one result to be returned even if multiple are found.
176
+ If multiple ABIs are found and all contain arguments, the first result is returned.
177
+ Otherwise when one of the ABIs has zero arguments, that signature is returned.
178
+ """
179
+ try:
180
+ # search for function abis with the same name
181
+ function_abi = get_abi_element(
182
+ contract_abi, get_name_from_abi_element_identifier(element_name)
183
+ )
184
+ return abi_to_signature(function_abi)
185
+ except MismatchedABI:
186
+ # If all matching functions have arguments, cannot determine which one
187
+ # to use. Instead of an exception, return the first matching function.
188
+ function_abis = filter_abi_by_name(element_name, contract_abi)
189
+ if len(function_abis) > 0 and all(
190
+ len(get_abi_input_types(fn)) > 0 for fn in function_abis
191
+ ):
192
+ return abi_to_signature(function_abis[0])
193
+
194
+ # Use signature for function that does not take arguments
195
+ return str(get_abi_element_signature(element_name))
196
+
197
+
198
+ def _build_abi_input_error(
199
+ abi: ABI,
200
+ num_args: int,
201
+ *args: Any,
202
+ abi_codec: ABICodec,
203
+ **kwargs: Any,
204
+ ) -> str:
205
+ """
206
+ Build a string representation of the ABI input error.
207
+ """
208
+ errors: Dict[str, str] = dict(
209
+ {
210
+ "zero_args": "",
211
+ "invalid_args": "",
212
+ "encoding": "",
213
+ "unexpected_args": "",
214
+ }
215
+ )
216
+
217
+ for abi_element in abi:
218
+ abi_element_input_types = get_abi_input_types(abi_element)
219
+ abi_signature = abi_to_signature(abi_element)
220
+ abi_element_name = get_name_from_abi_element_identifier(abi_signature)
221
+ types: Tuple[str, ...] = tuple()
222
+ aligned_args: Tuple[Any, ...] = tuple()
223
+
224
+ if len(abi_element_input_types) == num_args:
225
+ if num_args == 0:
226
+ if not errors["zero_args"]:
227
+ errors["zero_args"] += (
228
+ "The provided identifier matches multiple elements.\n"
229
+ f"If you meant to call `{abi_element_name}()`, "
230
+ "please specify the full signature.\n"
231
+ )
232
+
233
+ errors["zero_args"] += (
234
+ f" - signature: {abi_to_signature(abi_element)}, "
235
+ f"type: {abi_element['type']}\n"
236
+ )
237
+ else:
238
+ try:
239
+ arguments = get_normalized_abi_inputs(abi_element, *args, **kwargs)
240
+ types, aligned_args = get_aligned_abi_inputs(abi_element, arguments)
241
+ except TypeError as e:
242
+ errors["invalid_args"] += (
243
+ f"Signature: {abi_signature}, type: {abi_element['type']}\n"
244
+ f"Arguments do not match types in `{abi_signature}`.\n"
245
+ f"Error: {e}\n"
246
+ )
247
+
248
+ argument_errors = ""
249
+ for position, (_type, arg) in enumerate(zip(types, aligned_args), start=1):
250
+ if abi_codec.is_encodable(_type, arg):
251
+ argument_errors += f"Argument {position} value `{arg}` is valid.\n"
252
+ else:
253
+ argument_errors += (
254
+ f"Argument {position} value `{arg}` is not compatible with "
255
+ f"type `{_type}`.\n"
256
+ )
257
+
258
+ if argument_errors != "":
259
+ errors["encoding"] += (
260
+ f"Signature: {abi_signature}, type: {abi_element['type']}\n"
261
+ + argument_errors
262
+ )
263
+
264
+ else:
265
+ errors["unexpected_args"] += (
266
+ f"Signature: {abi_signature}, type: {abi_element['type']}\n"
267
+ f"Expected {len(abi_element_input_types)} argument(s) but received "
268
+ f"{num_args} argument(s).\n"
269
+ )
270
+
271
+ return "".join(errors.values())
272
+
273
+
161
274
  def _mismatched_abi_error_diagnosis(
162
275
  abi_element_identifier: ABIElementIdentifier,
163
- matching_function_signatures: Sequence[str],
164
- arg_count_matches: int,
165
- encoding_matches: int,
166
- *args: Optional[Sequence[Any]],
167
- **kwargs: Optional[Dict[str, Any]],
276
+ abi: ABI,
277
+ num_matches: int = 0,
278
+ num_args: int = 0,
279
+ *args: Optional[Any],
280
+ abi_codec: Optional[Any] = None,
281
+ **kwargs: Optional[Any],
168
282
  ) -> str:
169
283
  """
170
284
  Raise a ``MismatchedABI`` when a function ABI lookup results in an error.
@@ -172,32 +286,59 @@ def _mismatched_abi_error_diagnosis(
172
286
  An error may result from multiple functions matching the provided signature and
173
287
  arguments or no functions are identified.
174
288
  """
175
- diagnosis = "\n"
176
- if arg_count_matches == 0:
177
- diagnosis += "Function invocation failed due to improper number of arguments."
178
- elif encoding_matches == 0:
179
- diagnosis += "Function invocation failed due to no matching argument types."
180
- elif encoding_matches > 1:
181
- diagnosis += (
182
- "Ambiguous argument encoding. "
183
- "Provided arguments can be encoded to multiple functions "
184
- "matching this call."
185
- )
289
+ name = get_name_from_abi_element_identifier(abi_element_identifier)
290
+ abis_matching_names = filter_abi_by_name(name, abi)
291
+ abis_matching_arg_count = [
292
+ abi_to_signature(abi)
293
+ for abi in _filter_by_argument_count(num_args, abis_matching_names)
294
+ ]
295
+ num_abis_matching_arg_count = len(abis_matching_arg_count)
186
296
 
187
- collapsed_args = _extract_argument_types(*args)
188
- collapsed_kwargs = dict(
189
- {(k, _extract_argument_types([v])) for k, v in kwargs.items()}
190
- )
297
+ if abi_codec is None:
298
+ abi_codec = ABICodec(default_registry)
191
299
 
192
- return (
193
- f"\nCould not identify the intended function with name "
194
- f"`{abi_element_identifier}`, positional arguments with type(s) "
195
- f"`({collapsed_args})` and keyword arguments with type(s) "
196
- f"`{collapsed_kwargs}`."
197
- f"\nFound {len(matching_function_signatures)} function(s) with the name "
198
- f"`{abi_element_identifier}`: {matching_function_signatures}{diagnosis}"
300
+ error = "ABI Not Found!\n"
301
+ if num_matches == 0 and num_abis_matching_arg_count == 0:
302
+ error += f"No element named `{name}` with {num_args} argument(s).\n"
303
+ elif num_matches > 1 or num_abis_matching_arg_count > 1:
304
+ error += (
305
+ f"Found multiple elements named `{name}` that accept {num_args} "
306
+ "argument(s).\n"
307
+ )
308
+ elif num_abis_matching_arg_count == 1:
309
+ error += (
310
+ f"Found {num_abis_matching_arg_count} element(s) named `{name}` that "
311
+ f"accept {num_args} argument(s).\n"
312
+ "The provided arguments are not valid.\n"
313
+ )
314
+ elif num_matches == 0:
315
+ error += (
316
+ f"Unable to find an element named `{name}` that matches the provided "
317
+ "identifier and argument types.\n"
318
+ )
319
+ arg_types = _extract_argument_types(*args)
320
+ kwarg_types = dict({(k, _extract_argument_types([v])) for k, v in kwargs.items()})
321
+ error += (
322
+ f"Provided argument types: ({arg_types})\n"
323
+ f"Provided keyword argument types: {kwarg_types}\n\n"
199
324
  )
200
325
 
326
+ if abis_matching_names:
327
+ error += (
328
+ f"Tried to find a matching ABI element named `{name}`, but encountered "
329
+ "the following problems:\n"
330
+ )
331
+
332
+ error += _build_abi_input_error(
333
+ abis_matching_names,
334
+ num_args,
335
+ *args,
336
+ abi_codec=abi_codec,
337
+ **kwargs,
338
+ )
339
+
340
+ return f"\n{error}"
341
+
201
342
 
202
343
  def _extract_argument_types(*args: Sequence[Any]) -> str:
203
344
  """
@@ -231,6 +372,102 @@ def _get_argument_readable_type(arg: Any) -> str:
231
372
  return arg.__class__.__name__
232
373
 
233
374
 
375
+ def _build_abi_filters(
376
+ abi_element_identifier: ABIElementIdentifier,
377
+ *args: Optional[Any],
378
+ abi_type: Optional[str] = None,
379
+ argument_names: Optional[Sequence[str]] = None,
380
+ argument_types: Optional[Sequence[str]] = None,
381
+ abi_codec: Optional[Any] = None,
382
+ **kwargs: Optional[Any],
383
+ ) -> List[Callable[..., Sequence[ABIElement]]]:
384
+ """
385
+ Build a list of ABI filters to find an ABI element within a contract ABI. Each
386
+ filter is a partial function that takes a contract ABI and returns a filtered list.
387
+ Each parameter is checked before applying the relevant filter.
388
+
389
+ When the ``abi_element_identifier`` is a function name or signature and no arguments
390
+ are provided, the returned filters include the function name or signature.
391
+
392
+ A function ABI may take arguments and keyword arguments. When the ``args`` and
393
+ ``kwargs`` values are passed, several filters are combined together. Available
394
+ filters include the function name, argument count, argument name, argument type,
395
+ and argument encodability.
396
+
397
+ ``constructor``, ``fallback``, and ``receive`` ABI elements are handled only with a
398
+ filter by type.
399
+ """
400
+ if not isinstance(abi_element_identifier, str):
401
+ abi_element_identifier = get_abi_element_signature(abi_element_identifier)
402
+
403
+ if abi_element_identifier in ["constructor", "fallback", "receive"]:
404
+ return [functools.partial(filter_abi_by_type, abi_element_identifier)]
405
+
406
+ filters: List[Callable[..., Sequence[ABIElement]]] = []
407
+
408
+ if abi_type:
409
+ filters.append(functools.partial(filter_abi_by_type, abi_type))
410
+
411
+ arg_count = 0
412
+ if argument_names:
413
+ arg_count = len(argument_names)
414
+ elif args or kwargs:
415
+ arg_count = len(args) + len(kwargs)
416
+
417
+ if arg_count > 0:
418
+ filters.append(
419
+ functools.partial(
420
+ filter_abi_by_name,
421
+ get_name_from_abi_element_identifier(abi_element_identifier),
422
+ )
423
+ )
424
+ filters.append(functools.partial(_filter_by_argument_count, arg_count))
425
+
426
+ if args or kwargs:
427
+ if abi_codec is None:
428
+ abi_codec = ABICodec(default_registry)
429
+
430
+ filters.append(
431
+ functools.partial(
432
+ _filter_by_encodability,
433
+ abi_codec,
434
+ args,
435
+ kwargs,
436
+ )
437
+ )
438
+
439
+ if argument_names:
440
+ filters.append(functools.partial(filter_by_argument_name, argument_names))
441
+
442
+ if argument_types:
443
+ if arg_count != len(argument_types):
444
+ raise Web3ValidationError(
445
+ "The number of argument names and types must match."
446
+ )
447
+
448
+ filters.append(
449
+ functools.partial(filter_by_argument_type, argument_types)
450
+ )
451
+
452
+ if "(" in abi_element_identifier:
453
+ filters.append(
454
+ functools.partial(_filter_by_signature, abi_element_identifier)
455
+ )
456
+ else:
457
+ filters.append(
458
+ functools.partial(
459
+ filter_abi_by_name,
460
+ get_name_from_abi_element_identifier(abi_element_identifier),
461
+ )
462
+ )
463
+ if "(" in abi_element_identifier:
464
+ filters.append(
465
+ functools.partial(_filter_by_signature, abi_element_identifier)
466
+ )
467
+
468
+ return filters
469
+
470
+
234
471
  def get_abi_element_info(
235
472
  abi: ABI,
236
473
  abi_element_identifier: ABIElementIdentifier,
@@ -306,16 +543,21 @@ def get_abi_element_info(
306
543
  def get_abi_element(
307
544
  abi: ABI,
308
545
  abi_element_identifier: ABIElementIdentifier,
309
- *args: Optional[Sequence[Any]],
546
+ *args: Optional[Any],
310
547
  abi_codec: Optional[Any] = None,
311
- **kwargs: Optional[Dict[str, Any]],
548
+ **kwargs: Optional[Any],
312
549
  ) -> ABIElement:
313
550
  """
314
- Return the interface for an ``ABIElement`` which matches the provided identifier
315
- and arguments.
551
+ Return the interface for an ``ABIElement`` from the ``abi`` that matches the
552
+ provided identifier and arguments.
553
+
554
+ ``abi`` may be a list of all ABI elements in a contract or a subset of elements.
555
+ Passing only functions or events can be useful when names are not deterministic.
556
+ For example, if names overlap between functions and events.
316
557
 
317
- The ABI which matches the provided identifier, named arguments (``args``) and
318
- keyword args (``kwargs``) will be returned.
558
+ The ``ABIElementIdentifier`` value may be a function name, signature, or a
559
+ ``FallbackFn`` or ``ReceiveFn``. When named arguments (``args``) and/or keyword args
560
+ (``kwargs``) are provided, they are included in the search filters.
319
561
 
320
562
  The `abi_codec` may be overridden if custom encoding and decoding is required. The
321
563
  default is used if no codec is provided. More details about customizations are in
@@ -323,7 +565,9 @@ def get_abi_element(
323
565
 
324
566
  :param abi: Contract ABI.
325
567
  :type abi: `ABI`
326
- :param abi_element_identifier: Find an element ABI with matching identifier.
568
+ :param abi_element_identifier: Find an element ABI with matching identifier. The \
569
+ identifier may be a function name, signature, or ``FallbackFn`` or ``ReceiveFn``. \
570
+ A function signature is in the form ``name(arg1Type,arg2Type,...)``.
327
571
  :type abi_element_identifier: `ABIElementIdentifier`
328
572
  :param args: Find an element ABI with matching args.
329
573
  :type args: `Optional[Sequence[Any]]`
@@ -358,55 +602,38 @@ def get_abi_element(
358
602
  'type': 'uint256'}], 'payable': False, 'stateMutability': 'nonpayable', \
359
603
  'type': 'function'}
360
604
  """
605
+ validate_abi(abi)
606
+
361
607
  if abi_codec is None:
362
608
  abi_codec = ABICodec(default_registry)
363
609
 
364
- if abi_element_identifier is FallbackFn or abi_element_identifier == "fallback":
365
- return _get_fallback_function_abi(abi)
366
-
367
- if abi_element_identifier is ReceiveFn or abi_element_identifier == "receive":
368
- return _get_receive_function_abi(abi)
369
-
370
- if abi_element_identifier is None or not is_text(abi_element_identifier):
371
- raise Web3TypeError("Unsupported function identifier")
372
-
373
- filtered_abis_by_name: Sequence[ABIElement]
374
- if abi_element_identifier == "constructor":
375
- filtered_abis_by_name = [_get_constructor_function_abi(abi)]
376
- else:
377
- filtered_abis_by_name = filter_abi_by_name(
378
- cast(str, abi_element_identifier), abi
379
- )
380
-
381
- arg_count = len(args) + len(kwargs)
382
- filtered_abis_by_arg_count = _filter_by_argument_count(
383
- arg_count, filtered_abis_by_name
384
- )
385
-
386
- if not args and not kwargs and len(filtered_abis_by_arg_count) == 1:
387
- return filtered_abis_by_arg_count[0]
388
-
389
- elements_with_encodable_args = _filter_by_encodability(
390
- abi_codec, filtered_abis_by_arg_count, *args, **kwargs
610
+ abi_element_matches: Sequence[ABIElement] = pipe(
611
+ abi,
612
+ *_build_abi_filters(
613
+ abi_element_identifier,
614
+ *args,
615
+ abi_codec=abi_codec,
616
+ **kwargs,
617
+ ),
391
618
  )
392
619
 
393
- if len(elements_with_encodable_args) != 1:
394
- matching_function_signatures = [
395
- abi_to_signature(func) for func in filtered_abis_by_name
396
- ]
620
+ num_matches = len(abi_element_matches)
397
621
 
622
+ # Raise MismatchedABI when more than one found
623
+ if num_matches != 1:
398
624
  error_diagnosis = _mismatched_abi_error_diagnosis(
399
625
  abi_element_identifier,
400
- matching_function_signatures,
401
- len(filtered_abis_by_arg_count),
402
- len(elements_with_encodable_args),
626
+ abi,
627
+ num_matches,
628
+ len(args) + len(kwargs),
403
629
  *args,
630
+ abi_codec=abi_codec,
404
631
  **kwargs,
405
632
  )
406
633
 
407
634
  raise MismatchedABI(error_diagnosis)
408
635
 
409
- return elements_with_encodable_args[0]
636
+ return abi_element_matches[0]
410
637
 
411
638
 
412
639
  def check_if_arguments_can_be_encoded(
@@ -472,12 +699,17 @@ def check_if_arguments_can_be_encoded(
472
699
  )
473
700
 
474
701
 
702
+ @deprecated_for("get_abi_element")
475
703
  def get_event_abi(
476
704
  abi: ABI,
477
705
  event_name: str,
478
706
  argument_names: Optional[Sequence[str]] = None,
479
707
  ) -> ABIEvent:
480
708
  """
709
+ .. warning::
710
+ This function is deprecated. It is unable to distinguish between
711
+ overloaded events. Use ``get_abi_element`` instead.
712
+
481
713
  Find the event interface with the given name and/or arguments.
482
714
 
483
715
  :param abi: Contract ABI.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: web3
3
- Version: 7.5.0
3
+ Version: 7.6.0
4
4
  Summary: web3: A Python library for interacting with Ethereum
5
5
  Home-page: https://github.com/ethereum/web3.py
6
6
  Author: The Ethereum Foundation
@@ -32,7 +32,7 @@ Requires-Dist: pydantic >=2.4.0
32
32
  Requires-Dist: requests >=2.23.0
33
33
  Requires-Dist: typing-extensions >=4.0.1
34
34
  Requires-Dist: types-requests >=2.0.0
35
- Requires-Dist: websockets >=10.0.0
35
+ Requires-Dist: websockets <14.0.0,>=10.0.0
36
36
  Requires-Dist: pyunormalize >=15.0.0
37
37
  Requires-Dist: pywin32 >=223 ; platform_system == "Windows"
38
38
  Provides-Extra: dev
@@ -27,13 +27,13 @@ web3/testing.py,sha256=Ury_-7XSstJ8bkCfdGEi4Cr76QzSfW7v_zfPlDlLJj0,923
27
27
  web3/tracing.py,sha256=ZcOam7t-uEZXyui6Cndv6RYeCZP5jh1TBn2hG8sv17Q,3098
28
28
  web3/types.py,sha256=IKrsUzc-w1nhTQLVW_G43VZJMOxyd_LA1AGPu8DvY-k,13630
29
29
  web3/_utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
30
- web3/_utils/abi.py,sha256=faBdiPgPrS__Nh5tGruGFzLzVwNxoooXVsOeGPgGH4s,25540
30
+ web3/_utils/abi.py,sha256=Y0vIFLEKwiMTdedxRPxVMQ1l-GbRRJia1AP1DqLBvjU,27430
31
31
  web3/_utils/abi_element_identifiers.py,sha256=m305lsvUZk-jkPixT0IJd9P5sXqMvmwlwlLeBgEAnBQ,55
32
32
  web3/_utils/async_caching.py,sha256=2XnaKCHBTTDK6B2R_YZvjJqIRUpbMDIU1uYrq-Lcyp8,486
33
33
  web3/_utils/async_transactions.py,sha256=fodlTP7zpoFhFycWQszJWN0UUAfu5neQTCYJ3eGRCA0,5581
34
34
  web3/_utils/batching.py,sha256=SbFKYFCRTrkFMFNa4HA4DkD_Qbjc6atnebMObyuQeHE,6316
35
35
  web3/_utils/blocks.py,sha256=SZ17qSJuPAH5Dz-eQPGOsZw_QtkG19zvpSYMv6mEDok,2138
36
- web3/_utils/contracts.py,sha256=HKYJKJedf8eO5az-YVybrqfw0K1__9Da5QyLVfqSPVE,10994
36
+ web3/_utils/contracts.py,sha256=KxZGjQi6lqbsTzlZ2bwN_FEqSYyQ__RIK7se5BmgkKg,12081
37
37
  web3/_utils/datatypes.py,sha256=nI0C9XWl46gFj1RpwuoHfVqb4e73wlaerE1LNyMg3oo,1701
38
38
  web3/_utils/decorators.py,sha256=bYIoVL0DjHWU2-KOmg-UYg6rICeThlLVZpH9yM2NT8s,1825
39
39
  web3/_utils/empty.py,sha256=ccgxFk5qm2x2ZeD8b17wX5cCAJPkPFuHrNQNMDslytY,132
@@ -48,15 +48,15 @@ web3/_utils/http.py,sha256=2R3UOeZmwiQGc3ladf78R9AnufbGaTXAntqf-ZQlZPI,230
48
48
  web3/_utils/http_session_manager.py,sha256=Q5K9qJVOAjpO6490McC5kdO4lgjt-c-zxkp0kyDY2pI,11520
49
49
  web3/_utils/hypothesis.py,sha256=4Cm4iOWv-uP9irg_Pv63kYNDYUAGhnUH6fOPWRw3A0g,209
50
50
  web3/_utils/math.py,sha256=4oU5YdbQBXElxK00CxmUZ94ApXFu9QT_TrO0Kho1HTs,1083
51
- web3/_utils/method_formatters.py,sha256=s13BbZ1AjD5O7NJ1dnMcj3i1l2Gr91PrQGvJ_QzJmh0,36858
51
+ web3/_utils/method_formatters.py,sha256=a9VxHy9KnraxT7EddFd_CIS82SIOXKoZ_SmdxGE4K-Y,36902
52
52
  web3/_utils/module.py,sha256=GuVePloTlIBZwFDOjg0zasp53HSJ32umxN1nQhqW-8Y,3175
53
53
  web3/_utils/normalizers.py,sha256=uOaGGgkFXTa5gg6mHgPhP8n035WYpo96xtrvpRPnfNk,7455
54
- web3/_utils/rpc_abi.py,sha256=ZilBhxXock_3EAnkHPdBcdkaVJfu1TFdxru1cS2AG8Y,8472
54
+ web3/_utils/rpc_abi.py,sha256=zsavkWny01UC8DI_DOVWZc7XcHtlmB9XL97sL0ZcIcs,8525
55
55
  web3/_utils/threads.py,sha256=hNlSd_zheQYN0vC1faWWb9_UQxp_UzaM2fI5C8y0kB0,4245
56
56
  web3/_utils/transactions.py,sha256=aWMYWiCM_Qs6kFIRWwLGRqAAwCz5fXU8uXcsFGi_Xqo,9044
57
57
  web3/_utils/type_conversion.py,sha256=s6cg3WDCQIarQLWw_GfctaJjXhS_EcokUNO-S_ccvng,873
58
58
  web3/_utils/utility_methods.py,sha256=7VCpo5ysvPoGjFuDj5gT1Niva2l3BADUvNeJFlL3Yvg,2559
59
- web3/_utils/validation.py,sha256=TYfkiOIT37zvRy1PqvP9lvbdfLmn1HvlBbHvrFifx1A,6351
59
+ web3/_utils/validation.py,sha256=VGRvM6P2um2bmGP8AgIg3WTXCynyOFIXSIxCo4opL5I,6481
60
60
  web3/_utils/windows.py,sha256=IlFUtqYSbUUfFRx60zvEwpiZd080WpOrA4ojm4tmSEE,994
61
61
  web3/_utils/caching/__init__.py,sha256=ri-5UGz5PPuYW9W1c2BX5lUJn1oZuvErbDz5NweiveA,284
62
62
  web3/_utils/caching/caching_utils.py,sha256=Miqhx1Ne9FVlQK8xVKsMzglIanr6vO887Rm5FWB0KGI,11739
@@ -71,7 +71,7 @@ web3/_utils/contract_sources/contract_data/bytes_contracts.py,sha256=jx2zkR9yqRn
71
71
  web3/_utils/contract_sources/contract_data/constructor_contracts.py,sha256=Z0meZqRuvc2eNO_K1OMruRdfMO2Wavf8KE-NSnKtjtQ,6051
72
72
  web3/_utils/contract_sources/contract_data/contract_caller_tester.py,sha256=9oeRnNpdbh2M8hNJTuqcxC3dTs3g-MWOz05fgPuB7dk,6228
73
73
  web3/_utils/contract_sources/contract_data/emitter_contract.py,sha256=skuuQAXTO57HNERqf2FYwyzoL6_1JOjwx0Z2cvdVopc,40861
74
- web3/_utils/contract_sources/contract_data/event_contracts.py,sha256=3sX_Yg5imXinwoD6pbNygYtC5m5tpl0-pMl0gQqb12E,5569
74
+ web3/_utils/contract_sources/contract_data/event_contracts.py,sha256=Sy8gg4GIAcYa41dOfl34fM47YLNKA74C3Ongx-pBAzg,9405
75
75
  web3/_utils/contract_sources/contract_data/extended_resolver.py,sha256=Jq9S24aNGhLaGXXRrcwW6fC9RwthHDcHg_4YDebAwSo,15720
76
76
  web3/_utils/contract_sources/contract_data/fallback_function_contract.py,sha256=W3bnypanJDHbPaxvAglMJb3apK3RAMlU0TtPT5Gqxyg,1649
77
77
  web3/_utils/contract_sources/contract_data/function_name_tester_contract.py,sha256=kshI47e64GdSTV2nLmhkGgeZrH0cbjobs1bekEXdYdE,1894
@@ -88,7 +88,7 @@ web3/_utils/contract_sources/contract_data/storage_contract.py,sha256=fZ-4ho-fbV
88
88
  web3/_utils/contract_sources/contract_data/string_contract.py,sha256=fJHQg_CxzOt7Ojp5Af067M46tyY6CARkzycS0fL6reQ,11228
89
89
  web3/_utils/contract_sources/contract_data/tuple_contracts.py,sha256=PPzVF67kRpeNLXGjUGjpIowGyD3F6fMzqYLuOwXRZbE,23176
90
90
  web3/_utils/module_testing/__init__.py,sha256=Xr_S46cjr0mypD_Y4ZbeF1EJ-XWfNxWUks5ykhzN10c,485
91
- web3/_utils/module_testing/eth_module.py,sha256=Rhb6aq9G6pPVMfShPAAHoFIv_JeA1jvagCfjbLUxk78,187521
91
+ web3/_utils/module_testing/eth_module.py,sha256=NjNFd31GqlMRY9XkHj03z_lkgct2PftZTUlNL4e97ns,187939
92
92
  web3/_utils/module_testing/go_ethereum_admin_module.py,sha256=_c-6SyzZkfAJ-7ySXUpw9FEr4cg-ShRdAGSAHWanCtY,3406
93
93
  web3/_utils/module_testing/go_ethereum_debug_module.py,sha256=BP1UjK-5ewkYMilvW9jtZX5Mc9BGh3QlJWPXqDNWizU,4144
94
94
  web3/_utils/module_testing/go_ethereum_txpool_module.py,sha256=5f8XL8-2x3keyGRaITxMQYl9oQzjgqGn8zobB-j9BPs,1176
@@ -104,14 +104,14 @@ web3/beacon/api_endpoints.py,sha256=0mHrYFYAWHfF9OGzrFdg012L_ocU2nGDXUTU1isOo7o,
104
104
  web3/beacon/async_beacon.py,sha256=CPzvyZnMibSYsoIJVrjd3XvZ9aB0bgQRtCP0X0Ekp0o,8156
105
105
  web3/beacon/beacon.py,sha256=tPA9ABPm6MyzbzutiphkhFzOAxLresmftG5UjWkuNyY,7236
106
106
  web3/contract/__init__.py,sha256=qeZRtTw9xriwoD82w6vePDuPBZ35-CMVdkzViBSH3Qs,293
107
- web3/contract/async_contract.py,sha256=DB4c7Pz0kZtEhwBwWP41swizVFzk_CwxDU80GDD8X2c,21893
108
- web3/contract/base_contract.py,sha256=vVomwlM4zfRSB9BN4ss4y0Rc8Szs4howwVushKrio7U,44025
109
- web3/contract/contract.py,sha256=JqxrJCq5cYGAe50RcabLXjhQab03mmJ0ykQkivYnY_Y,21298
110
- web3/contract/utils.py,sha256=WfheuUshKK6u1dzIL_rYT44Wv1__gFfs2VxSkw_Xxnc,19234
107
+ web3/contract/async_contract.py,sha256=1sKG3bcG5LzIHH8rAAmcJHRFcUnCvW-btjhZ8BRa_jE,26322
108
+ web3/contract/base_contract.py,sha256=CRFfdP8LSxE104Fo4xdCBgBuy3yD6jop2Soddl2onKE,45264
109
+ web3/contract/contract.py,sha256=fcXKrWxDTdT9N6cYLK7MsjnLw-BTNoyYHShb3cJErFk,25699
110
+ web3/contract/utils.py,sha256=RSdurebK9x5IZ_NJEZZbTjPLKKxgxgU6kSDMOu6XqEc,19276
111
111
  web3/eth/__init__.py,sha256=qDLxOcHHIzzPD7xzwy6Wcs0lLPQieB7WN0Ax25ctit8,197
112
- web3/eth/async_eth.py,sha256=elPH3Atkayk3afwepDRP3ibB7EK8MziK0fPikpKCLxI,23176
112
+ web3/eth/async_eth.py,sha256=-onoBLCCYRBg4oZgY8WQWV3CNFFLyKfckIxdLoLkCRc,23432
113
113
  web3/eth/base_eth.py,sha256=UUH0Fw0HVa_mBEQ_CbCDO01yCVDsj33d8yOv7Oe-QD0,6905
114
- web3/eth/eth.py,sha256=6IL3VecOGvKKbRLvr_hBx8gpWPEf-fZHrRVGGYngYmc,19707
114
+ web3/eth/eth.py,sha256=T-YwH-Kks4cPothiR9GyOqMh6MeMTFRmfI7M2TL4NkY,19940
115
115
  web3/gas_strategies/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
116
116
  web3/gas_strategies/rpc.py,sha256=3Va-32jdmHkX7tzQCmh17ms2D6te5zZcqHP1326BdpY,352
117
117
  web3/gas_strategies/time_based.py,sha256=oGk6nBUD4iMC8wl1vzf-nhURaqyPWYdPvNU0C3RIs8g,9071
@@ -135,7 +135,7 @@ web3/providers/base.py,sha256=QtBsOCdYeIBF1d3MzQJG0Vo5LduHgAbdiNDcXs9ZQyo,6425
135
135
  web3/providers/ipc.py,sha256=3kO7GE8IxVqwpqgfLdomn-L_SeYG48Qs94FsvSdG-tI,6444
136
136
  web3/providers/legacy_websocket.py,sha256=6mFEQVlVoc71AyDvPGGt3KQudQKdMxoHvokg6Fb4VOw,4767
137
137
  web3/providers/eth_tester/__init__.py,sha256=UggyBQdeAyjy1awATW1933jkJcpqqaUYUQEFAQnA2o0,163
138
- web3/providers/eth_tester/defaults.py,sha256=9aPe0x2C5wahdGI_rZjiGR3Fe2LbMjKWH9o6eZPuY-Q,12577
138
+ web3/providers/eth_tester/defaults.py,sha256=QQUdqqrkcN1AKW7WEY1A5RiPc_fmlHCLmdgB-5iY7Dc,12622
139
139
  web3/providers/eth_tester/main.py,sha256=U19sNDeHs36A4IYQ0HFGyXdZvuXiYvoSMNWVuki0WwI,7807
140
140
  web3/providers/eth_tester/middleware.py,sha256=3h8q1WBu5CLiBYwonWFeAR_5pUy_vqgiDmi7wOzuorc,12971
141
141
  web3/providers/persistent/__init__.py,sha256=X7tFKJL5BXSwciq5_bRwGRB6bfdWBkIPPWMqCjXIKrA,411
@@ -155,13 +155,13 @@ web3/scripts/parse_pygeth_version.py,sha256=BZjWOsJmYuFbAnFuB1jec9Rl6z0tJJNFFV38
155
155
  web3/scripts/release/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
156
156
  web3/scripts/release/test_package.py,sha256=DH0AryllcF4zfpWSd0NLPSQGHNoC-Qng5WYYbS5_4c8,1534
157
157
  web3/utils/__init__.py,sha256=zwf8bM-Dl2_L9u_cR5K22_krl0vx4QBAANoBssmbDlU,1857
158
- web3/utils/abi.py,sha256=iSBaCW41UxB1q1UHDPwJ1QJbdiuYmTWNu8m6E28DqlY,18672
158
+ web3/utils/abi.py,sha256=D7AomiYzqNszLR3sHaP0ZfGtTGmAgKY3MC6ki0WgN38,27071
159
159
  web3/utils/address.py,sha256=KC_IpEbixSCuMhaW6V2QCyyJTYKYGS9c8QtI9_aH7zQ,967
160
160
  web3/utils/async_exception_handling.py,sha256=OoKbLNwWcY9dxLCbOfxcQPSB1OxWraNqcw8V0ZX-JaQ,3173
161
161
  web3/utils/caching.py,sha256=Rkt5IN8A7YBZYXlCRaWa64FiDhTXsxzTGGQdGBB4Nzw,2514
162
162
  web3/utils/exception_handling.py,sha256=n-MtO5LNzJDVzHTzO6olzfb2_qEVtVRvink0ixswg-Y,2917
163
- web3-7.5.0.dist-info/LICENSE,sha256=ScEyLx1vWrB0ybKiZKKTXm5QhVksHCEUtTp4lwYV45I,1095
164
- web3-7.5.0.dist-info/METADATA,sha256=eO2d-NpcO3F0orh5yam8ZVyXbELVZzWBfLLShYKDlhQ,5368
165
- web3-7.5.0.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
166
- web3-7.5.0.dist-info/top_level.txt,sha256=iwupuJh7wgypXrpk_awszyri3TahRr5vxSphNyvt1bU,9
167
- web3-7.5.0.dist-info/RECORD,,
163
+ web3-7.6.0.dist-info/LICENSE,sha256=ScEyLx1vWrB0ybKiZKKTXm5QhVksHCEUtTp4lwYV45I,1095
164
+ web3-7.6.0.dist-info/METADATA,sha256=V9iF9mKsxvz57FqhU4qRdq8UayI7Km0EDkEWBW6GoXw,5376
165
+ web3-7.6.0.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
166
+ web3-7.6.0.dist-info/top_level.txt,sha256=iwupuJh7wgypXrpk_awszyri3TahRr5vxSphNyvt1bU,9
167
+ web3-7.6.0.dist-info/RECORD,,
File without changes
File without changes