web3 6.20.2__py3-none-any.whl → 7.0.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.
Files changed (270) hide show
  1. ens/__init__.py +13 -2
  2. ens/_normalization.py +2 -17
  3. ens/async_ens.py +33 -21
  4. ens/base_ens.py +3 -1
  5. ens/ens.py +16 -11
  6. ens/exceptions.py +16 -29
  7. ens/specs/nf.json +1 -1
  8. ens/specs/normalization_spec.json +1 -1
  9. ens/utils.py +52 -63
  10. web3/__init__.py +20 -24
  11. web3/_utils/abi.py +115 -271
  12. web3/_utils/async_transactions.py +7 -4
  13. web3/_utils/batching.py +217 -0
  14. web3/_utils/blocks.py +6 -2
  15. web3/_utils/caching.py +128 -5
  16. web3/_utils/compat/__init__.py +2 -3
  17. web3/_utils/contract_sources/compile_contracts.py +1 -1
  18. web3/_utils/contract_sources/contract_data/arrays_contract.py +3 -3
  19. web3/_utils/contract_sources/contract_data/bytes_contracts.py +5 -5
  20. web3/_utils/contract_sources/contract_data/constructor_contracts.py +7 -7
  21. web3/_utils/contract_sources/contract_data/contract_caller_tester.py +3 -3
  22. web3/_utils/contract_sources/contract_data/emitter_contract.py +3 -3
  23. web3/_utils/contract_sources/contract_data/event_contracts.py +5 -5
  24. web3/_utils/contract_sources/contract_data/extended_resolver.py +3 -3
  25. web3/_utils/contract_sources/contract_data/fallback_function_contract.py +3 -3
  26. web3/_utils/contract_sources/contract_data/function_name_tester_contract.py +3 -3
  27. web3/_utils/contract_sources/contract_data/math_contract.py +3 -3
  28. web3/_utils/contract_sources/contract_data/offchain_lookup.py +3 -3
  29. web3/_utils/contract_sources/contract_data/offchain_resolver.py +3 -3
  30. web3/_utils/contract_sources/contract_data/panic_errors_contract.py +3 -3
  31. web3/_utils/contract_sources/contract_data/payable_tester.py +3 -3
  32. web3/_utils/contract_sources/contract_data/receive_function_contracts.py +5 -5
  33. web3/_utils/contract_sources/contract_data/reflector_contracts.py +3 -3
  34. web3/_utils/contract_sources/contract_data/revert_contract.py +3 -3
  35. web3/_utils/contract_sources/contract_data/simple_resolver.py +3 -3
  36. web3/_utils/contract_sources/contract_data/storage_contract.py +3 -3
  37. web3/_utils/contract_sources/contract_data/string_contract.py +3 -3
  38. web3/_utils/contract_sources/contract_data/tuple_contracts.py +5 -5
  39. web3/_utils/contracts.py +130 -236
  40. web3/_utils/datatypes.py +5 -1
  41. web3/_utils/decorators.py +13 -23
  42. web3/_utils/empty.py +1 -1
  43. web3/_utils/encoding.py +16 -12
  44. web3/_utils/ens.py +2 -1
  45. web3/_utils/error_formatters_utils.py +5 -3
  46. web3/_utils/events.py +66 -69
  47. web3/_utils/fee_utils.py +1 -3
  48. web3/_utils/filters.py +24 -22
  49. web3/_utils/formatters.py +2 -2
  50. web3/_utils/http.py +5 -3
  51. web3/_utils/http_session_manager.py +303 -0
  52. web3/_utils/math.py +14 -15
  53. web3/_utils/method_formatters.py +34 -36
  54. web3/_utils/module.py +2 -1
  55. web3/_utils/module_testing/__init__.py +0 -3
  56. web3/_utils/module_testing/eth_module.py +695 -643
  57. web3/_utils/module_testing/module_testing_utils.py +61 -34
  58. web3/_utils/module_testing/persistent_connection_provider.py +56 -25
  59. web3/_utils/module_testing/utils.py +258 -0
  60. web3/_utils/module_testing/web3_module.py +438 -17
  61. web3/_utils/normalizers.py +13 -11
  62. web3/_utils/rpc_abi.py +5 -32
  63. web3/_utils/threads.py +8 -7
  64. web3/_utils/transactions.py +14 -12
  65. web3/_utils/type_conversion.py +5 -1
  66. web3/_utils/validation.py +17 -17
  67. web3/auto/gethdev.py +7 -2
  68. web3/beacon/__init__.py +6 -1
  69. web3/beacon/async_beacon.py +9 -5
  70. web3/beacon/{main.py → beacon.py} +7 -5
  71. web3/contract/__init__.py +7 -0
  72. web3/contract/async_contract.py +47 -46
  73. web3/contract/base_contract.py +183 -158
  74. web3/contract/contract.py +49 -43
  75. web3/contract/utils.py +203 -59
  76. web3/datastructures.py +79 -31
  77. web3/eth/__init__.py +7 -0
  78. web3/eth/async_eth.py +39 -51
  79. web3/eth/base_eth.py +17 -10
  80. web3/eth/eth.py +30 -68
  81. web3/exceptions.py +108 -82
  82. web3/gas_strategies/time_based.py +8 -6
  83. web3/geth.py +1 -254
  84. web3/main.py +75 -122
  85. web3/manager.py +316 -146
  86. web3/method.py +38 -31
  87. web3/middleware/__init__.py +67 -89
  88. web3/middleware/attrdict.py +36 -49
  89. web3/middleware/base.py +174 -0
  90. web3/middleware/buffered_gas_estimate.py +20 -21
  91. web3/middleware/filter.py +157 -117
  92. web3/middleware/formatting.py +124 -108
  93. web3/middleware/gas_price_strategy.py +20 -32
  94. web3/middleware/names.py +29 -26
  95. web3/middleware/proof_of_authority.py +68 -0
  96. web3/middleware/pythonic.py +2 -2
  97. web3/middleware/signing.py +74 -89
  98. web3/middleware/stalecheck.py +52 -79
  99. web3/middleware/validation.py +5 -13
  100. web3/module.py +54 -10
  101. web3/providers/__init__.py +10 -6
  102. web3/providers/async_base.py +117 -39
  103. web3/providers/auto.py +3 -3
  104. web3/providers/base.py +89 -33
  105. web3/providers/eth_tester/__init__.py +5 -0
  106. web3/providers/eth_tester/defaults.py +1 -64
  107. web3/providers/eth_tester/main.py +99 -31
  108. web3/providers/eth_tester/middleware.py +45 -73
  109. web3/providers/ipc.py +42 -46
  110. web3/providers/{websocket/websocket.py → legacy_websocket.py} +32 -7
  111. web3/providers/persistent/__init__.py +22 -0
  112. web3/providers/persistent/async_ipc.py +153 -0
  113. web3/providers/{persistent.py → persistent/persistent.py} +106 -25
  114. web3/providers/persistent/persistent_connection.py +84 -0
  115. web3/providers/{websocket → persistent}/request_processor.py +94 -32
  116. web3/providers/persistent/utils.py +43 -0
  117. web3/providers/{websocket/websocket_v2.py → persistent/websocket.py} +29 -28
  118. web3/providers/rpc/__init__.py +11 -0
  119. web3/providers/rpc/async_rpc.py +171 -0
  120. web3/providers/rpc/rpc.py +179 -0
  121. web3/providers/rpc/utils.py +92 -0
  122. web3/testing.py +4 -4
  123. web3/tools/benchmark/main.py +22 -22
  124. web3/tools/benchmark/node.py +2 -8
  125. web3/tools/benchmark/reporting.py +2 -2
  126. web3/tools/benchmark/utils.py +1 -1
  127. web3/tracing.py +9 -5
  128. web3/types.py +30 -107
  129. web3/utils/__init__.py +58 -5
  130. web3/utils/abi.py +575 -10
  131. web3/utils/async_exception_handling.py +19 -7
  132. web3/utils/caching.py +32 -13
  133. web3/utils/exception_handling.py +7 -5
  134. {web3-6.20.2.dist-info → web3-7.0.0.dist-info}/LICENSE +1 -1
  135. web3-7.0.0.dist-info/METADATA +112 -0
  136. web3-7.0.0.dist-info/RECORD +167 -0
  137. {web3-6.20.2.dist-info → web3-7.0.0.dist-info}/WHEEL +1 -1
  138. {web3-6.20.2.dist-info → web3-7.0.0.dist-info}/top_level.txt +0 -1
  139. ethpm/__init__.py +0 -20
  140. ethpm/_utils/__init__.py +0 -0
  141. ethpm/_utils/backend.py +0 -93
  142. ethpm/_utils/cache.py +0 -44
  143. ethpm/_utils/chains.py +0 -119
  144. ethpm/_utils/contract.py +0 -35
  145. ethpm/_utils/deployments.py +0 -145
  146. ethpm/_utils/ipfs.py +0 -116
  147. ethpm/_utils/protobuf/__init__.py +0 -0
  148. ethpm/_utils/protobuf/ipfs_file_pb2.py +0 -33
  149. ethpm/_utils/registry.py +0 -29
  150. ethpm/assets/__init__.py +0 -0
  151. ethpm/assets/ens/v3.json +0 -1
  152. ethpm/assets/escrow/with_bytecode_v3.json +0 -1
  153. ethpm/assets/ipfs_file.proto +0 -32
  154. ethpm/assets/owned/output_v3.json +0 -1
  155. ethpm/assets/owned/with_contract_type_v3.json +0 -1
  156. ethpm/assets/registry/contracts/Authority.sol +0 -156
  157. ethpm/assets/registry/contracts/IndexedOrderedSetLib.sol +0 -106
  158. ethpm/assets/registry/contracts/PackageDB.sol +0 -225
  159. ethpm/assets/registry/contracts/PackageRegistry.sol +0 -361
  160. ethpm/assets/registry/contracts/PackageRegistryInterface.sol +0 -97
  161. ethpm/assets/registry/contracts/ReleaseDB.sol +0 -309
  162. ethpm/assets/registry/contracts/ReleaseValidator.sol +0 -152
  163. ethpm/assets/registry/solc_input.json +0 -1
  164. ethpm/assets/registry/solc_output.json +0 -1
  165. ethpm/assets/registry/v3.json +0 -1
  166. ethpm/assets/safe-math-lib/v3-strict-no-deployments.json +0 -1
  167. ethpm/assets/simple-registry/contracts/Ownable.sol +0 -63
  168. ethpm/assets/simple-registry/contracts/PackageRegistry.sol +0 -373
  169. ethpm/assets/simple-registry/contracts/PackageRegistryInterface.sol +0 -96
  170. ethpm/assets/simple-registry/solc_input.json +0 -33
  171. ethpm/assets/simple-registry/solc_output.json +0 -1
  172. ethpm/assets/simple-registry/v3.json +0 -1
  173. ethpm/assets/standard-token/output_v3.json +0 -1
  174. ethpm/assets/standard-token/with_bytecode_v3.json +0 -1
  175. ethpm/assets/vyper_registry/0.1.0.json +0 -1
  176. ethpm/assets/vyper_registry/registry.vy +0 -216
  177. ethpm/assets/vyper_registry/registry_with_delete.vy +0 -244
  178. ethpm/backends/__init__.py +0 -0
  179. ethpm/backends/base.py +0 -43
  180. ethpm/backends/http.py +0 -108
  181. ethpm/backends/ipfs.py +0 -219
  182. ethpm/backends/registry.py +0 -154
  183. ethpm/constants.py +0 -17
  184. ethpm/contract.py +0 -187
  185. ethpm/dependencies.py +0 -58
  186. ethpm/deployments.py +0 -80
  187. ethpm/ethpm-spec/examples/escrow/1.0.0-pretty.json +0 -146
  188. ethpm/ethpm-spec/examples/escrow/1.0.0.json +0 -1
  189. ethpm/ethpm-spec/examples/escrow/contracts/Escrow.sol +0 -32
  190. ethpm/ethpm-spec/examples/escrow/contracts/SafeSendLib.sol +0 -20
  191. ethpm/ethpm-spec/examples/escrow/v3-pretty.json +0 -171
  192. ethpm/ethpm-spec/examples/escrow/v3.json +0 -1
  193. ethpm/ethpm-spec/examples/owned/1.0.0-pretty.json +0 -21
  194. ethpm/ethpm-spec/examples/owned/1.0.0.json +0 -1
  195. ethpm/ethpm-spec/examples/owned/contracts/Owned.sol +0 -12
  196. ethpm/ethpm-spec/examples/owned/v3-pretty.json +0 -27
  197. ethpm/ethpm-spec/examples/owned/v3.json +0 -1
  198. ethpm/ethpm-spec/examples/piper-coin/1.0.0-pretty.json +0 -31
  199. ethpm/ethpm-spec/examples/piper-coin/1.0.0.json +0 -1
  200. ethpm/ethpm-spec/examples/piper-coin/v3-pretty.json +0 -21
  201. ethpm/ethpm-spec/examples/piper-coin/v3.json +0 -1
  202. ethpm/ethpm-spec/examples/safe-math-lib/1.0.0-pretty.json +0 -85
  203. ethpm/ethpm-spec/examples/safe-math-lib/1.0.0.json +0 -1
  204. ethpm/ethpm-spec/examples/safe-math-lib/contracts/SafeMathLib.sol +0 -24
  205. ethpm/ethpm-spec/examples/safe-math-lib/v3-pretty.json +0 -117
  206. ethpm/ethpm-spec/examples/safe-math-lib/v3.json +0 -1
  207. ethpm/ethpm-spec/examples/standard-token/1.0.0-pretty.json +0 -55
  208. ethpm/ethpm-spec/examples/standard-token/1.0.0.json +0 -1
  209. ethpm/ethpm-spec/examples/standard-token/contracts/AbstractToken.sol +0 -20
  210. ethpm/ethpm-spec/examples/standard-token/contracts/StandardToken.sol +0 -84
  211. ethpm/ethpm-spec/examples/standard-token/v3-pretty.json +0 -460
  212. ethpm/ethpm-spec/examples/standard-token/v3.json +0 -1
  213. ethpm/ethpm-spec/examples/transferable/1.0.0-pretty.json +0 -21
  214. ethpm/ethpm-spec/examples/transferable/1.0.0.json +0 -1
  215. ethpm/ethpm-spec/examples/transferable/contracts/Transferable.sol +0 -14
  216. ethpm/ethpm-spec/examples/transferable/v3-pretty.json +0 -27
  217. ethpm/ethpm-spec/examples/transferable/v3.json +0 -1
  218. ethpm/ethpm-spec/examples/wallet/1.0.0-pretty.json +0 -120
  219. ethpm/ethpm-spec/examples/wallet/1.0.0.json +0 -1
  220. ethpm/ethpm-spec/examples/wallet/contracts/Wallet.sol +0 -41
  221. ethpm/ethpm-spec/examples/wallet/v3-pretty.json +0 -181
  222. ethpm/ethpm-spec/examples/wallet/v3.json +0 -1
  223. ethpm/ethpm-spec/examples/wallet-with-send/1.0.0-pretty.json +0 -135
  224. ethpm/ethpm-spec/examples/wallet-with-send/1.0.0.json +0 -1
  225. ethpm/ethpm-spec/examples/wallet-with-send/contracts/WalletWithSend.sol +0 -18
  226. ethpm/ethpm-spec/examples/wallet-with-send/v3-pretty.json +0 -207
  227. ethpm/ethpm-spec/examples/wallet-with-send/v3.json +0 -1
  228. ethpm/ethpm-spec/spec/package.spec.json +0 -379
  229. ethpm/ethpm-spec/spec/v3.spec.json +0 -483
  230. ethpm/exceptions.py +0 -68
  231. ethpm/package.py +0 -438
  232. ethpm/tools/__init__.py +0 -4
  233. ethpm/tools/builder.py +0 -930
  234. ethpm/tools/checker.py +0 -312
  235. ethpm/tools/get_manifest.py +0 -19
  236. ethpm/uri.py +0 -141
  237. ethpm/validation/__init__.py +0 -0
  238. ethpm/validation/manifest.py +0 -146
  239. ethpm/validation/misc.py +0 -39
  240. ethpm/validation/package.py +0 -80
  241. ethpm/validation/uri.py +0 -163
  242. web3/_utils/contract_sources/contract_data/address_reflector.py +0 -29
  243. web3/_utils/miner.py +0 -88
  244. web3/_utils/module_testing/go_ethereum_personal_module.py +0 -323
  245. web3/_utils/request.py +0 -265
  246. web3/middleware/abi.py +0 -11
  247. web3/middleware/async_cache.py +0 -99
  248. web3/middleware/cache.py +0 -374
  249. web3/middleware/exception_handling.py +0 -49
  250. web3/middleware/exception_retry_request.py +0 -188
  251. web3/middleware/fixture.py +0 -190
  252. web3/middleware/geth_poa.py +0 -81
  253. web3/middleware/normalize_request_parameters.py +0 -11
  254. web3/middleware/simulate_unmined_transaction.py +0 -43
  255. web3/pm.py +0 -602
  256. web3/providers/async_rpc.py +0 -99
  257. web3/providers/rpc.py +0 -98
  258. web3/providers/websocket/__init__.py +0 -11
  259. web3/providers/websocket/websocket_connection.py +0 -42
  260. web3/tools/__init__.py +0 -4
  261. web3/tools/pytest_ethereum/__init__.py +0 -0
  262. web3/tools/pytest_ethereum/_utils.py +0 -145
  263. web3/tools/pytest_ethereum/deployer.py +0 -48
  264. web3/tools/pytest_ethereum/exceptions.py +0 -22
  265. web3/tools/pytest_ethereum/linker.py +0 -128
  266. web3/tools/pytest_ethereum/plugins.py +0 -33
  267. web3-6.20.2.dist-info/METADATA +0 -103
  268. web3-6.20.2.dist-info/RECORD +0 -283
  269. web3-6.20.2.dist-info/entry_points.txt +0 -2
  270. /web3/_utils/{function_identifiers.py → abi_element_identifiers.py} +0 -0
web3/_utils/request.py DELETED
@@ -1,265 +0,0 @@
1
- import asyncio
2
- from concurrent.futures import (
3
- ThreadPoolExecutor,
4
- )
5
- import logging
6
- import os
7
- import threading
8
- from typing import (
9
- Any,
10
- Dict,
11
- List,
12
- Optional,
13
- Union,
14
- )
15
-
16
- from aiohttp import (
17
- ClientResponse,
18
- ClientSession,
19
- ClientTimeout,
20
- )
21
- from eth_typing import (
22
- URI,
23
- )
24
- import requests
25
-
26
- from web3._utils.async_caching import (
27
- async_lock,
28
- )
29
- from web3._utils.caching import (
30
- generate_cache_key,
31
- )
32
- from web3.utils.caching import (
33
- SimpleCache,
34
- )
35
-
36
- logger = logging.getLogger(__name__)
37
-
38
- DEFAULT_TIMEOUT = 10
39
-
40
-
41
- def get_default_http_endpoint() -> URI:
42
- return URI(os.environ.get("WEB3_HTTP_PROVIDER_URI", "http://localhost:8545"))
43
-
44
-
45
- _session_cache = SimpleCache()
46
- _session_cache_lock = threading.Lock()
47
-
48
-
49
- def cache_and_return_session(
50
- endpoint_uri: URI, session: requests.Session = None
51
- ) -> requests.Session:
52
- # cache key should have a unique thread identifier
53
- cache_key = generate_cache_key(f"{threading.get_ident()}:{endpoint_uri}")
54
-
55
- cached_session = _session_cache.get_cache_entry(cache_key)
56
- if cached_session is not None:
57
- # If read from cache yields a session, no need to lock; return the session.
58
- # Sync is a bit simpler in this way since a `requests.Session` doesn't really
59
- # "close" in the same way that an async `ClientSession` does. When "closed", it
60
- # still uses http / https adapters successfully if a request is made.
61
- return cached_session
62
-
63
- if session is None:
64
- session = requests.Session()
65
-
66
- with _session_cache_lock:
67
- cached_session, evicted_items = _session_cache.cache(cache_key, session)
68
- logger.debug(f"Session cached: {endpoint_uri}, {cached_session}")
69
-
70
- if evicted_items is not None:
71
- evicted_sessions = evicted_items.values()
72
- for evicted_session in evicted_sessions:
73
- logger.debug(
74
- f"Session cache full. Session evicted from cache: {evicted_session}",
75
- )
76
- threading.Timer(
77
- DEFAULT_TIMEOUT + 0.1,
78
- _close_evicted_sessions,
79
- args=[evicted_sessions],
80
- ).start()
81
-
82
- return cached_session
83
-
84
-
85
- def get_response_from_get_request(
86
- endpoint_uri: URI, *args: Any, **kwargs: Any
87
- ) -> requests.Response:
88
- kwargs.setdefault("timeout", DEFAULT_TIMEOUT)
89
- session = cache_and_return_session(endpoint_uri)
90
- response = session.get(endpoint_uri, *args, **kwargs)
91
- return response
92
-
93
-
94
- def json_make_get_request(
95
- endpoint_uri: URI, *args: Any, **kwargs: Any
96
- ) -> Dict[str, Any]:
97
- response = get_response_from_get_request(endpoint_uri, *args, **kwargs)
98
- response.raise_for_status()
99
- return response.json()
100
-
101
-
102
- def get_response_from_post_request(
103
- endpoint_uri: URI, *args: Any, **kwargs: Any
104
- ) -> requests.Response:
105
- kwargs.setdefault("timeout", DEFAULT_TIMEOUT)
106
- session = cache_and_return_session(endpoint_uri)
107
- response = session.post(endpoint_uri, *args, **kwargs)
108
- return response
109
-
110
-
111
- def make_post_request(
112
- endpoint_uri: URI, data: Union[bytes, Dict[str, Any]], *args: Any, **kwargs: Any
113
- ) -> bytes:
114
- response = get_response_from_post_request(endpoint_uri, data=data, *args, **kwargs)
115
- response.raise_for_status()
116
- return response.content
117
-
118
-
119
- def _close_evicted_sessions(evicted_sessions: List[requests.Session]) -> None:
120
- for evicted_session in evicted_sessions:
121
- evicted_session.close()
122
- logger.debug(f"Closed evicted session: {evicted_session}")
123
-
124
-
125
- # --- async --- #
126
-
127
-
128
- _async_session_cache = SimpleCache()
129
- _async_session_cache_lock = threading.Lock()
130
- _async_session_pool = ThreadPoolExecutor(max_workers=1)
131
-
132
-
133
- async def async_cache_and_return_session(
134
- endpoint_uri: URI,
135
- session: Optional[ClientSession] = None,
136
- ) -> ClientSession:
137
- # cache key should have a unique thread identifier
138
- cache_key = generate_cache_key(f"{threading.get_ident()}:{endpoint_uri}")
139
-
140
- evicted_items = None
141
- async with async_lock(_async_session_pool, _async_session_cache_lock):
142
- if cache_key not in _async_session_cache:
143
- if session is None:
144
- session = ClientSession(raise_for_status=True)
145
-
146
- cached_session, evicted_items = _async_session_cache.cache(
147
- cache_key, session
148
- )
149
- logger.debug(f"Async session cached: {endpoint_uri}, {cached_session}")
150
-
151
- else:
152
- # get the cached session
153
- cached_session = _async_session_cache.get_cache_entry(cache_key)
154
- session_is_closed = cached_session.closed
155
- session_loop_is_closed = cached_session._loop.is_closed()
156
-
157
- warning = (
158
- "Async session was closed"
159
- if session_is_closed
160
- else (
161
- "Loop was closed for async session"
162
- if session_loop_is_closed
163
- else None
164
- )
165
- )
166
- if warning:
167
- logger.debug(
168
- f"{warning}: {endpoint_uri}, {cached_session}. "
169
- f"Creating and caching a new async session for uri."
170
- )
171
-
172
- _async_session_cache._data.pop(cache_key)
173
- if not session_is_closed:
174
- # if loop was closed but not the session, close the session
175
- await cached_session.close()
176
- logger.debug(
177
- f"Async session closed and evicted from cache: {cached_session}"
178
- )
179
-
180
- # replace stale session with a new session at the cache key
181
- _session = ClientSession(raise_for_status=True)
182
- cached_session, evicted_items = _async_session_cache.cache(
183
- cache_key, _session
184
- )
185
- logger.debug(f"Async session cached: {endpoint_uri}, {cached_session}")
186
-
187
- if evicted_items is not None:
188
- # At this point the evicted sessions are already popped out of the cache and
189
- # just stored in the `evicted_sessions` dict. So we can kick off a future task
190
- # to close them and it should be safe to pop out of the lock here.
191
- evicted_sessions = evicted_items.values()
192
- for evicted_session in evicted_sessions:
193
- logger.debug(
194
- "Async session cache full. Session evicted from cache: "
195
- f"{evicted_session}",
196
- )
197
- # Kick off a future task, in a separate thread, to close the evicted
198
- # sessions. In the case that the cache filled very quickly and some
199
- # sessions have been evicted before their original request has been made,
200
- # we set the timer to a bit more than the `DEFAULT_TIMEOUT` for a call. This
201
- # should make it so that any call from an evicted session can still be made
202
- # before the session is closed.
203
- threading.Timer(
204
- DEFAULT_TIMEOUT + 0.1,
205
- _async_close_evicted_sessions,
206
- args=[evicted_sessions],
207
- ).start()
208
-
209
- return cached_session
210
-
211
-
212
- async def async_get_response_from_get_request(
213
- endpoint_uri: URI, *args: Any, **kwargs: Any
214
- ) -> ClientResponse:
215
- kwargs.setdefault("timeout", ClientTimeout(DEFAULT_TIMEOUT))
216
- session = await async_cache_and_return_session(endpoint_uri)
217
- response = await session.get(endpoint_uri, *args, **kwargs)
218
- return response
219
-
220
-
221
- async def async_json_make_get_request(
222
- endpoint_uri: URI, *args: Any, **kwargs: Any
223
- ) -> Dict[str, Any]:
224
- response = await async_get_response_from_get_request(endpoint_uri, *args, **kwargs)
225
- response.raise_for_status()
226
- return await response.json()
227
-
228
-
229
- async def async_get_response_from_post_request(
230
- endpoint_uri: URI, *args: Any, **kwargs: Any
231
- ) -> ClientResponse:
232
- kwargs.setdefault("timeout", ClientTimeout(DEFAULT_TIMEOUT))
233
- session = await async_cache_and_return_session(endpoint_uri)
234
- response = await session.post(endpoint_uri, *args, **kwargs)
235
- return response
236
-
237
-
238
- async def async_make_post_request(
239
- endpoint_uri: URI, data: Union[bytes, Dict[str, Any]], *args: Any, **kwargs: Any
240
- ) -> bytes:
241
- response = await async_get_response_from_post_request(
242
- endpoint_uri, data=data, *args, **kwargs
243
- )
244
- response.raise_for_status()
245
- return await response.read()
246
-
247
-
248
- async def async_get_json_from_client_response(
249
- response: ClientResponse,
250
- ) -> Dict[str, Any]:
251
- return await response.json()
252
-
253
-
254
- def _async_close_evicted_sessions(evicted_sessions: List[ClientSession]) -> None:
255
- loop = asyncio.new_event_loop()
256
-
257
- for evicted_session in evicted_sessions:
258
- loop.run_until_complete(evicted_session.close())
259
- logger.debug(f"Closed evicted async session: {evicted_session}")
260
-
261
- if any(not evicted_session.closed for evicted_session in evicted_sessions):
262
- logger.warning(
263
- f"Some evicted async sessions were not properly closed: {evicted_sessions}"
264
- )
265
- loop.close()
web3/middleware/abi.py DELETED
@@ -1,11 +0,0 @@
1
- from web3._utils.method_formatters import (
2
- ABI_REQUEST_FORMATTERS,
3
- )
4
-
5
- from .formatting import (
6
- construct_formatting_middleware,
7
- )
8
-
9
- abi_middleware = construct_formatting_middleware(
10
- request_formatters=ABI_REQUEST_FORMATTERS
11
- )
@@ -1,99 +0,0 @@
1
- from concurrent.futures import (
2
- ThreadPoolExecutor,
3
- )
4
- import threading
5
- from typing import (
6
- TYPE_CHECKING,
7
- Any,
8
- Callable,
9
- Collection,
10
- )
11
-
12
- from web3._utils.async_caching import (
13
- async_lock,
14
- )
15
- from web3._utils.caching import (
16
- generate_cache_key,
17
- )
18
- from web3.middleware.cache import (
19
- SIMPLE_CACHE_RPC_WHITELIST,
20
- _should_cache_response,
21
- )
22
- from web3.types import (
23
- AsyncMiddleware,
24
- AsyncMiddlewareCoroutine,
25
- Middleware,
26
- RPCEndpoint,
27
- RPCResponse,
28
- )
29
- from web3.utils.caching import (
30
- SimpleCache,
31
- )
32
-
33
- if TYPE_CHECKING:
34
- from web3 import ( # noqa: F401
35
- AsyncWeb3,
36
- Web3,
37
- )
38
-
39
- _async_request_thread_pool = ThreadPoolExecutor()
40
-
41
-
42
- async def async_construct_simple_cache_middleware(
43
- cache: SimpleCache = None,
44
- rpc_whitelist: Collection[RPCEndpoint] = SIMPLE_CACHE_RPC_WHITELIST,
45
- should_cache_fn: Callable[
46
- [RPCEndpoint, Any, RPCResponse], bool
47
- ] = _should_cache_response,
48
- ) -> AsyncMiddleware:
49
- """
50
- Constructs a middleware which caches responses based on the request
51
- ``method`` and ``params``
52
-
53
- :param cache: A ``SimpleCache`` class.
54
- :param rpc_whitelist: A set of RPC methods which may have their responses cached.
55
- :param should_cache_fn: A callable which accepts ``method`` ``params`` and
56
- ``response`` and returns a boolean as to whether the response should be
57
- cached.
58
- """
59
-
60
- async def async_simple_cache_middleware(
61
- make_request: Callable[[RPCEndpoint, Any], Any], _async_w3: "AsyncWeb3"
62
- ) -> AsyncMiddlewareCoroutine:
63
- lock = threading.Lock()
64
-
65
- # It's not imperative that we define ``_cache`` here rather than in
66
- # ``async_construct_simple_cache_middleware``. Due to the nature of async,
67
- # construction is awaited and doesn't happen at import. This means separate
68
- # instances would still get unique caches. However, to keep the code consistent
69
- # with the synchronous version, and provide less ambiguity, we define it
70
- # similarly to the synchronous version here.
71
- _cache = cache if cache else SimpleCache(256)
72
-
73
- async def middleware(method: RPCEndpoint, params: Any) -> RPCResponse:
74
- if method in rpc_whitelist:
75
- cache_key = generate_cache_key(
76
- f"{threading.get_ident()}:{(method, params)}"
77
- )
78
- cached_request = _cache.get_cache_entry(cache_key)
79
- if cached_request is not None:
80
- return cached_request
81
-
82
- response = await make_request(method, params)
83
- if should_cache_fn(method, params, response):
84
- async with async_lock(_async_request_thread_pool, lock):
85
- _cache.cache(cache_key, response)
86
- return response
87
- else:
88
- return await make_request(method, params)
89
-
90
- return middleware
91
-
92
- return async_simple_cache_middleware
93
-
94
-
95
- async def _async_simple_cache_middleware(
96
- make_request: Callable[[RPCEndpoint, Any], Any], async_w3: "AsyncWeb3"
97
- ) -> Middleware:
98
- middleware = await async_construct_simple_cache_middleware()
99
- return await middleware(make_request, async_w3)