web3 7.12.1__py3-none-any.whl → 7.13.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/eth/async_eth.py CHANGED
@@ -720,19 +720,6 @@ class AsyncEth(BaseEth):
720
720
  mungers=[default_root_munger],
721
721
  )
722
722
 
723
- _subscribe_with_args: Method[
724
- Callable[
725
- [
726
- SubscriptionType,
727
- Optional[Union[LogsSubscriptionArg, bool]],
728
- ],
729
- Awaitable[HexStr],
730
- ]
731
- ] = Method(
732
- RPC.eth_subscribe,
733
- mungers=[default_root_munger],
734
- )
735
-
736
723
  async def subscribe(
737
724
  self,
738
725
  subscription_type: SubscriptionType,
@@ -745,6 +732,7 @@ class AsyncEth(BaseEth):
745
732
  handler: Optional[EthSubscriptionHandler] = None,
746
733
  handler_context: Optional[Dict[str, Any]] = None,
747
734
  label: Optional[str] = None,
735
+ parallelize: Optional[bool] = None,
748
736
  ) -> HexStr:
749
737
  if not isinstance(self.w3.provider, PersistentConnectionProvider):
750
738
  raise MethodNotSupported(
@@ -757,6 +745,7 @@ class AsyncEth(BaseEth):
757
745
  handler=handler,
758
746
  handler_context=handler_context or {},
759
747
  label=label,
748
+ parallelize=parallelize,
760
749
  )
761
750
  return await self.w3.subscription_manager.subscribe(sub)
762
751
 
web3/exceptions.py CHANGED
@@ -353,13 +353,20 @@ class PersistentConnectionClosedOK(PersistentConnectionError):
353
353
  """
354
354
 
355
355
 
356
- class SubscriptionProcessingFinished(Web3Exception):
356
+ class SubscriptionProcessingFinished(PersistentConnectionError):
357
357
  """
358
358
  Raised to alert the subscription manager that the processing of subscriptions
359
359
  has finished.
360
360
  """
361
361
 
362
362
 
363
+ class SubscriptionHandlerTaskException(TaskNotRunning):
364
+ """
365
+ Raised to alert the subscription manager that an exception occurred in the
366
+ subscription processing task.
367
+ """
368
+
369
+
363
370
  class Web3RPCError(Web3Exception):
364
371
  """
365
372
  Raised when a JSON-RPC response contains an error field.
web3/manager.py CHANGED
@@ -550,13 +550,10 @@ class RequestManager:
550
550
  else:
551
551
  # if not an active sub, skip processing and continue
552
552
  continue
553
- except TaskNotRunning:
553
+ except TaskNotRunning as e:
554
554
  await asyncio.sleep(0)
555
555
  self._provider._handle_listener_task_exceptions()
556
- self.logger.error(
557
- "Message listener background task has stopped unexpectedly. "
558
- "Stopping message stream."
559
- )
556
+ self.logger.error("Stopping message stream: %s", e.message)
560
557
  return
561
558
 
562
559
  async def _process_response(
@@ -16,6 +16,7 @@ from eth_utils.toolz import (
16
16
  )
17
17
 
18
18
  from web3.exceptions import (
19
+ BadResponseFormat,
19
20
  Web3ValueError,
20
21
  )
21
22
  from web3.middleware.base import (
@@ -77,7 +78,12 @@ def _apply_response_formatters(
77
78
  response, response_type, method_response_formatter(appropriate_response)
78
79
  )
79
80
 
80
- if response.get("result") is not None and method in result_formatters:
81
+ if not isinstance(response, dict):
82
+ raise BadResponseFormat(
83
+ "Malformed response: expected a valid JSON-RPC response object, got: "
84
+ "`{}`".format(response)
85
+ )
86
+ elif response.get("result") is not None and method in result_formatters:
81
87
  return _format_response("result", result_formatters[method])
82
88
  elif (
83
89
  # eth_subscription responses
@@ -164,7 +164,7 @@ class PersistentConnectionProvider(AsyncJSONBaseProvider, ABC):
164
164
  if cache_key != self._send_batch_func_cache[0]:
165
165
 
166
166
  async def send_func(
167
- requests: List[Tuple[RPCEndpoint, Any]]
167
+ requests: List[Tuple[RPCEndpoint, Any]],
168
168
  ) -> List[RPCRequest]:
169
169
  for mw in middleware:
170
170
  initialized = mw(async_w3)
@@ -376,11 +376,12 @@ class PersistentConnectionProvider(AsyncJSONBaseProvider, ABC):
376
376
  ) -> None:
377
377
  # Puts a `TaskNotRunning` in appropriate queues to signal the end of the
378
378
  # listener task to any listeners relying on the queues.
379
+ message = "Message listener task has ended."
379
380
  self._request_processor._subscription_response_queue.put_nowait(
380
- TaskNotRunning(message_listener_task)
381
+ TaskNotRunning(message_listener_task, message=message)
381
382
  )
382
383
  self._request_processor._handler_subscription_queue.put_nowait(
383
- TaskNotRunning(message_listener_task)
384
+ TaskNotRunning(message_listener_task, message=message)
384
385
  )
385
386
 
386
387
  def _raise_stray_errors_from_cache(self) -> None:
@@ -5,6 +5,7 @@ from typing import (
5
5
  Any,
6
6
  List,
7
7
  Sequence,
8
+ Set,
8
9
  Union,
9
10
  cast,
10
11
  overload,
@@ -15,6 +16,7 @@ from eth_typing import (
15
16
  )
16
17
 
17
18
  from web3.exceptions import (
19
+ SubscriptionHandlerTaskException,
18
20
  SubscriptionProcessingFinished,
19
21
  TaskNotRunning,
20
22
  Web3TypeError,
@@ -50,19 +52,26 @@ class SubscriptionManager:
50
52
  logger: logging.Logger = logging.getLogger(
51
53
  "web3.providers.persistent.subscription_manager"
52
54
  )
53
- total_handler_calls: int = 0
54
55
 
55
56
  def __init__(self, w3: "AsyncWeb3") -> None:
56
57
  self._w3 = w3
57
58
  self._provider = cast("PersistentConnectionProvider", w3.provider)
58
59
  self._subscription_container = SubscriptionContainer()
59
60
 
61
+ # parallelize all subscription handler calls
62
+ self.parallelize = False
63
+ self.task_timeout = 1
64
+ # TODO: can remove quotes from type hints once Python 3.8 support is dropped
65
+ self._tasks: Set["asyncio.Task[None]"] = set()
66
+
60
67
  # share the subscription container with the request processor so it can separate
61
68
  # subscriptions into different queues based on ``sub._handler`` presence
62
69
  self._provider._request_processor._subscription_container = (
63
70
  self._subscription_container
64
71
  )
65
72
 
73
+ self.total_handler_calls: int = 0
74
+
66
75
  def _add_subscription(self, subscription: EthSubscription[Any]) -> None:
67
76
  self._subscription_container.add_subscription(subscription)
68
77
 
@@ -86,6 +95,35 @@ class SubscriptionManager:
86
95
  f"labels.\n label: {subscription._label}"
87
96
  )
88
97
 
98
+ # TODO: can remove quotes from type hints once Python 3.8 support is dropped
99
+ def _handler_task_callback(self, task: "asyncio.Task[None]") -> None:
100
+ """
101
+ Callback when a handler task completes. Similar to _message_listener_callback.
102
+ Puts handler exceptions into the queue to be raised in the main loop, else
103
+ removes the task from the set of active tasks.
104
+ """
105
+ if task.done() and not task.cancelled():
106
+ try:
107
+ task.result()
108
+ self._tasks.discard(task)
109
+ except Exception as e:
110
+ self.logger.exception("Subscription handler task raised an exception.")
111
+ self._provider._request_processor._handler_subscription_queue.put_nowait( # noqa: E501
112
+ SubscriptionHandlerTaskException(task, message=str(e))
113
+ )
114
+
115
+ async def _cleanup_remaining_tasks(self) -> None:
116
+ """Cancel and clean up all remaining tasks."""
117
+ if not self._tasks:
118
+ return
119
+
120
+ self.logger.debug("Cleaning up %d remaining tasks...", len(self._tasks))
121
+ for task in self._tasks:
122
+ if not task.done():
123
+ task.cancel()
124
+
125
+ self._tasks.clear()
126
+
89
127
  @property
90
128
  def subscriptions(self) -> List[EthSubscription[Any]]:
91
129
  return self._subscription_container.subscriptions
@@ -281,14 +319,23 @@ class SubscriptionManager:
281
319
  sub_id
282
320
  )
283
321
  if sub:
284
- await sub._handler(
285
- EthSubscriptionContext(
286
- self._w3,
287
- sub,
288
- formatted_sub_response["result"],
289
- **sub._handler_context,
290
- )
322
+ sub_context = EthSubscriptionContext(
323
+ self._w3,
324
+ sub,
325
+ formatted_sub_response["result"],
326
+ **sub._handler_context,
291
327
  )
328
+ if sub.parallelize is True or (
329
+ sub.parallelize is None and self.parallelize
330
+ ):
331
+ # run the handler in a task to allow parallel processing
332
+ task = asyncio.create_task(sub._handler(sub_context))
333
+ self._tasks.add(task)
334
+ task.add_done_callback(self._handler_task_callback)
335
+ else:
336
+ # await the handler in the main loop to ensure order
337
+ await sub._handler(sub_context)
338
+
292
339
  except SubscriptionProcessingFinished:
293
340
  if not run_forever:
294
341
  self.logger.info(
@@ -296,14 +343,20 @@ class SubscriptionManager:
296
343
  "Stopping subscription handling."
297
344
  )
298
345
  break
299
- except TaskNotRunning:
300
- await asyncio.sleep(0)
301
- self._provider._handle_listener_task_exceptions()
346
+ except SubscriptionHandlerTaskException:
302
347
  self.logger.error(
303
- "Message listener background task for the provider has stopped "
304
- "unexpectedly. Stopping subscription handling."
348
+ "An exception occurred in a subscription handler task. "
349
+ "Stopping subscription handling."
305
350
  )
351
+ await self._cleanup_remaining_tasks()
352
+ raise
353
+ except TaskNotRunning as e:
354
+ self.logger.error("Stopping subscription handling: %s", e.message)
355
+ self._provider._handle_listener_task_exceptions()
306
356
  break
307
357
 
308
358
  # no active handler subscriptions, clear the handler subscription queue
309
359
  self._provider._request_processor._reset_handler_subscription_queue()
360
+
361
+ if self._tasks:
362
+ await self._cleanup_remaining_tasks()
@@ -110,11 +110,14 @@ class EthSubscription(Generic[TSubscriptionResult]):
110
110
  handler: Optional[EthSubscriptionHandler] = None,
111
111
  handler_context: Optional[Dict[str, Any]] = None,
112
112
  label: Optional[str] = None,
113
+ parallelize: Optional[bool] = None,
113
114
  ) -> None:
114
115
  self._subscription_params = subscription_params
115
116
  self._handler = handler_wrapper(handler)
116
117
  self._handler_context = handler_context or {}
117
118
  self._label = label
119
+
120
+ self.parallelize = parallelize
118
121
  self.handler_call_count = 0
119
122
 
120
123
  @property
@@ -128,6 +131,7 @@ class EthSubscription(Generic[TSubscriptionResult]):
128
131
  handler: Optional[EthSubscriptionHandler] = None,
129
132
  handler_context: Optional[Dict[str, Any]] = None,
130
133
  label: Optional[str] = None,
134
+ parallelize: Optional[bool] = None,
131
135
  ) -> "EthSubscription[Any]":
132
136
  subscription_type = subscription_params[0]
133
137
  subscription_arg = (
@@ -135,7 +139,10 @@ class EthSubscription(Generic[TSubscriptionResult]):
135
139
  )
136
140
  if subscription_type == "newHeads":
137
141
  return NewHeadsSubscription(
138
- handler=handler, handler_context=handler_context, label=label
142
+ handler=handler,
143
+ handler_context=handler_context,
144
+ label=label,
145
+ parallelize=parallelize,
139
146
  )
140
147
  elif subscription_type == "logs":
141
148
  subscription_arg = subscription_arg or {}
@@ -144,6 +151,7 @@ class EthSubscription(Generic[TSubscriptionResult]):
144
151
  handler=handler,
145
152
  handler_context=handler_context,
146
153
  label=label,
154
+ parallelize=parallelize,
147
155
  )
148
156
  elif subscription_type == "newPendingTransactions":
149
157
  subscription_arg = subscription_arg or False
@@ -152,10 +160,14 @@ class EthSubscription(Generic[TSubscriptionResult]):
152
160
  handler=handler,
153
161
  handler_context=handler_context,
154
162
  label=label,
163
+ parallelize=parallelize,
155
164
  )
156
165
  elif subscription_type == "syncing":
157
166
  return SyncingSubscription(
158
- handler=handler, handler_context=handler_context, label=label
167
+ handler=handler,
168
+ handler_context=handler_context,
169
+ label=label,
170
+ parallelize=parallelize,
159
171
  )
160
172
  else:
161
173
  params = (
@@ -168,6 +180,7 @@ class EthSubscription(Generic[TSubscriptionResult]):
168
180
  handler=handler,
169
181
  handler_context=handler_context,
170
182
  label=label,
183
+ parallelize=parallelize,
171
184
  )
172
185
 
173
186
  @property
@@ -206,6 +219,7 @@ class LogsSubscription(EthSubscription[LogReceipt]):
206
219
  handler: LogsSubscriptionHandler = None,
207
220
  handler_context: Optional[Dict[str, Any]] = None,
208
221
  label: Optional[str] = None,
222
+ parallelize: Optional[bool] = None,
209
223
  ) -> None:
210
224
  self.address = address
211
225
  self.topics = topics
@@ -222,6 +236,7 @@ class LogsSubscription(EthSubscription[LogReceipt]):
222
236
  handler=handler,
223
237
  handler_context=handler_context,
224
238
  label=label,
239
+ parallelize=parallelize,
225
240
  )
226
241
 
227
242
 
@@ -237,12 +252,14 @@ class NewHeadsSubscription(EthSubscription[BlockData]):
237
252
  label: Optional[str] = None,
238
253
  handler: Optional[NewHeadsSubscriptionHandler] = None,
239
254
  handler_context: Optional[Dict[str, Any]] = None,
255
+ parallelize: Optional[bool] = None,
240
256
  ) -> None:
241
257
  super().__init__(
242
258
  subscription_params=("newHeads",),
243
259
  handler=handler,
244
260
  handler_context=handler_context,
245
261
  label=label,
262
+ parallelize=parallelize,
246
263
  )
247
264
 
248
265
 
@@ -261,6 +278,7 @@ class PendingTxSubscription(EthSubscription[Union[HexBytes, TxData]]):
261
278
  label: Optional[str] = None,
262
279
  handler: Optional[PendingTxSubscriptionHandler] = None,
263
280
  handler_context: Optional[Dict[str, Any]] = None,
281
+ parallelize: Optional[bool] = None,
264
282
  ) -> None:
265
283
  self.full_transactions = full_transactions
266
284
  super().__init__(
@@ -268,6 +286,7 @@ class PendingTxSubscription(EthSubscription[Union[HexBytes, TxData]]):
268
286
  handler=handler,
269
287
  handler_context=handler_context,
270
288
  label=label,
289
+ parallelize=parallelize,
271
290
  )
272
291
 
273
292
 
@@ -283,10 +302,12 @@ class SyncingSubscription(EthSubscription[SyncProgress]):
283
302
  label: Optional[str] = None,
284
303
  handler: Optional[SyncingSubscriptionHandler] = None,
285
304
  handler_context: Optional[Dict[str, Any]] = None,
305
+ parallelize: Optional[bool] = None,
286
306
  ) -> None:
287
307
  super().__init__(
288
308
  subscription_params=("syncing",),
289
309
  handler=handler,
290
310
  handler_context=handler_context,
291
311
  label=label,
312
+ parallelize=parallelize,
292
313
  )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: web3
3
- Version: 7.12.1
3
+ Version: 7.13.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
@@ -9,17 +9,16 @@ ens/contract_data.py,sha256=CZa7Uxzq6rT-KonwHHM_wo-5ry0j1DMbikgEaP27Uy8,148602
9
9
  ens/ens.py,sha256=-avaYLLwUAPj8cYxP5fcH5h9aVabG5xuvBkwh5yTbMQ,21722
10
10
  ens/exceptions.py,sha256=5h-t3G-lwYchYe4JgHaxD_a_llh56sS6qzo9Rpa0S0o,2442
11
11
  ens/utils.py,sha256=ql6Kqe_dmbr4K6p0YO5Gr8b9XdfMRLe9dnjNv1mrWYI,9318
12
- ens/specs/.DS_Store,sha256=1lFlJ5EFymdzGAUAaI30vcaaLHt3F1LwpG7xILf9jsM,6148
13
12
  ens/specs/nf.json,sha256=tPXKzdhgu9gqNi0UhKC1kzPqSBgy4yHm5TL19RQHBqU,49038
14
13
  ens/specs/normalization_spec.json,sha256=8mmjBj4OoYCn7pD4P7hqKP_qy6rpYzpyRinSH3CCP9M,3171499
15
14
  web3/__init__.py,sha256=P11QAEV_GYoZq9ij8gDzFx5tKzJY2aMXG-keg2Lg1xs,1277
16
15
  web3/constants.py,sha256=eQLRQVMFPbgpOjjkPTMHkY-syncJuO-sPX5UrCSRjzQ,564
17
16
  web3/datastructures.py,sha256=J5rdpnuS10pKUfPYqcoorkDw-aHHZNrdiW-Bh7dVDwI,11514
18
- web3/exceptions.py,sha256=GMIrWTkYDR0jtvtdOlgl_s6fctTibW4Ytw4So5BY4uE,9584
17
+ web3/exceptions.py,sha256=9qWjvZM-snQTITs8FJbTMnVQygM80ciddwOkSgiioY8,9783
19
18
  web3/geth.py,sha256=xVBZWSksBo2ipesAN9V5hzDc_te7kU8ueicFdvpkSO4,7370
20
19
  web3/logs.py,sha256=ROs-mDMH_ZOecE7hfbWA5yp27G38FbLjX4lO_WtlZxQ,198
21
20
  web3/main.py,sha256=eVdSh7m_iBMf3au0Aj49TZ7NSaRbN1Ccsng9Fuu8dME,16162
22
- web3/manager.py,sha256=hzIrl70WWIupgEbBBQlB11l89uHHU1xCKowKgBngkqU,22689
21
+ web3/manager.py,sha256=jlHJoGdhFFSsZNTbdUXVakchJozxqrN_NPWp1gUSMgs,22588
23
22
  web3/method.py,sha256=BCYend146F5Q149VB2VN11_Z3x8y0lJZH8ShF_VxwV4,8682
24
23
  web3/module.py,sha256=CDlnDrrWzkCJtd3gzHZ972l-6En6IyFEWwB7TXkHHLM,5617
25
24
  web3/net.py,sha256=Y3vPzHWVFkfHEZoJxjDOt4tp5ERmZrMuyi4ZFOLmIeA,1562
@@ -111,7 +110,7 @@ web3/contract/base_contract.py,sha256=vQVcne9luQ35eBheRh1Jc_jXOp2uDxIotKK9O1EQjQ
111
110
  web3/contract/contract.py,sha256=-TJJMjwybZmQo8-DtGhrjIr7TwVXFoiIsdMan1NFgQY,20562
112
111
  web3/contract/utils.py,sha256=QwJFbgojLKRb_7DrwDmXI2acwRk7zMNXHGvH5JaR1NI,18591
113
112
  web3/eth/__init__.py,sha256=qDLxOcHHIzzPD7xzwy6Wcs0lLPQieB7WN0Ax25ctit8,197
114
- web3/eth/async_eth.py,sha256=uuKOTRvI60r5zOj131Mbr28J6N7Tj2Hx4GJESMIoFu8,24759
113
+ web3/eth/async_eth.py,sha256=Uz-0W2rAk8tygbk5xJkffnAA8v-mneYrYsFePViGcTI,24535
115
114
  web3/eth/base_eth.py,sha256=UUH0Fw0HVa_mBEQ_CbCDO01yCVDsj33d8yOv7Oe-QD0,6905
116
115
  web3/eth/eth.py,sha256=zYhotz6GFRVl951oljXHnnlF1GJTgFlgJlA09Soji5k,20806
117
116
  web3/gas_strategies/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -122,7 +121,7 @@ web3/middleware/attrdict.py,sha256=tIoMEZ3BkmEafnwitGY70o0GS9ShfwReDMxkHuvcOwI,2
122
121
  web3/middleware/base.py,sha256=jUY19tw6iiJenDprYqkTeIESd8qPcTvNALP3Vhp86qk,5728
123
122
  web3/middleware/buffered_gas_estimate.py,sha256=EmxUd-uO959UVroPsPKkl7oDa8Tw6N8BQLB6Urng5Eo,1647
124
123
  web3/middleware/filter.py,sha256=I09sSE_q_dhWX5_24KVWhVXZNevwViI7wucJBP4TZl4,22221
125
- web3/middleware/formatting.py,sha256=hqe5XQE1n5Fmj6riJp7i3oIoZkd-4ChQc7UK8f3HB6I,7567
124
+ web3/middleware/formatting.py,sha256=GPbJes2-ECQW5fbHllajGFDd4b58X-sKLef_DSnYA40,7793
126
125
  web3/middleware/gas_price_strategy.py,sha256=ZjZ6pe3z0mDGLZHYoFXp4_fZIePqukljEh9f4mZUyIA,3779
127
126
  web3/middleware/names.py,sha256=OBpsvCmcTItth4TcvUNUvcYmINnudtCHq3n6YO_BkNs,4309
128
127
  web3/middleware/proof_of_authority.py,sha256=0AT4jr5CmTdrvl8Jiy-WYy8IFDYBOEaesgHDwpn0c7M,1429
@@ -142,11 +141,11 @@ web3/providers/eth_tester/main.py,sha256=U19sNDeHs36A4IYQ0HFGyXdZvuXiYvoSMNWVuki
142
141
  web3/providers/eth_tester/middleware.py,sha256=JS-cjGF5BtF43dp-bP7QDv0RWyq1iqwiq81RhTAswjI,13730
143
142
  web3/providers/persistent/__init__.py,sha256=X7tFKJL5BXSwciq5_bRwGRB6bfdWBkIPPWMqCjXIKrA,411
144
143
  web3/providers/persistent/async_ipc.py,sha256=6HDKo9hIXhag3nyTbp6J-ZktPLnG-9iHCduQUGD7raM,5049
145
- web3/providers/persistent/persistent.py,sha256=79TP6mKOhUyxD3KBOEE2OeWido8qumuIl2pIiiPE-0k,19356
144
+ web3/providers/persistent/persistent.py,sha256=tM0Opg5i_oNlW_vmkqnzkAAPww36E5_jhonXDWfhc4Y,19444
146
145
  web3/providers/persistent/persistent_connection.py,sha256=NxxS-KeJhV07agg8CtJvmE-Ff-wLggQYpz4gdgVRDNU,3011
147
146
  web3/providers/persistent/request_processor.py,sha256=QLVn5MiNwDVsO9hsHPlkUH4zW4H74HRK-duPot4H4Yk,14141
148
147
  web3/providers/persistent/subscription_container.py,sha256=yd5pjjz_YnRLuUoxZUxt29Md1VUTemdUIBq8PCJre6Y,1734
149
- web3/providers/persistent/subscription_manager.py,sha256=T42LQzGs4iYvsKqvIqKSMo5OLz5Qpp4YG8sEBOcqV3s,11672
148
+ web3/providers/persistent/subscription_manager.py,sha256=QByJn3qfOT1Lt7L6BMUqNSeu_FajAGZRwLvawSajsic,13956
150
149
  web3/providers/persistent/utils.py,sha256=gfY7w1HB8xuE7OujSrbwWYjQuQ8nzRBoxoL8ESinqWM,1140
151
150
  web3/providers/persistent/websocket.py,sha256=STf31VNdwidMeAeeL1r5f8v3l66xChKkxZpnZzUiYO8,4577
152
151
  web3/providers/rpc/__init__.py,sha256=mObsuwjr7xyHnnRlwzsmbp2JgZdn2NXSSctvpye4AuQ,149
@@ -164,9 +163,9 @@ web3/utils/address.py,sha256=nzPLiWWCG9BqstDeDOcDwEpteJ8im6ywjLHKpd5akhw,1186
164
163
  web3/utils/async_exception_handling.py,sha256=OoKbLNwWcY9dxLCbOfxcQPSB1OxWraNqcw8V0ZX-JaQ,3173
165
164
  web3/utils/caching.py,sha256=miulUjLOjlOfTux8HWBklpRIa6_fVNTVFHIWcbZt27o,2591
166
165
  web3/utils/exception_handling.py,sha256=n-MtO5LNzJDVzHTzO6olzfb2_qEVtVRvink0ixswg-Y,2917
167
- web3/utils/subscriptions.py,sha256=RnqwQL3ekkMyCrbx-jVf6EaEkihyXTbb1LBonBHAJ_g,8617
168
- web3-7.12.1.dist-info/licenses/LICENSE,sha256=ENGC4gSn0kYaC_mlaXOEwCKmA6W7Z9MeSemc5O2k-h0,1095
169
- web3-7.12.1.dist-info/METADATA,sha256=00yj0K9jQg20LN-vIHDfMORXEzT8hQJOrl8VCIGjLq8,5621
170
- web3-7.12.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
171
- web3-7.12.1.dist-info/top_level.txt,sha256=iwupuJh7wgypXrpk_awszyri3TahRr5vxSphNyvt1bU,9
172
- web3-7.12.1.dist-info/RECORD,,
166
+ web3/utils/subscriptions.py,sha256=XF0bN_OjIkweSTQmB0U0nMJrLCeNYYuukoUFiV5skV0,9340
167
+ web3-7.13.0.dist-info/licenses/LICENSE,sha256=ENGC4gSn0kYaC_mlaXOEwCKmA6W7Z9MeSemc5O2k-h0,1095
168
+ web3-7.13.0.dist-info/METADATA,sha256=8-k-l2hjPirh12SotNzYaXchRfwcPo2GJCSLB5gVs3s,5621
169
+ web3-7.13.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
170
+ web3-7.13.0.dist-info/top_level.txt,sha256=iwupuJh7wgypXrpk_awszyri3TahRr5vxSphNyvt1bU,9
171
+ web3-7.13.0.dist-info/RECORD,,
ens/specs/.DS_Store DELETED
Binary file
File without changes