web3 7.0.0b3__py3-none-any.whl → 7.0.0b4__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 (79) hide show
  1. ens/_normalization.py +1 -3
  2. ens/async_ens.py +12 -9
  3. ens/contract_data.py +2 -2
  4. ens/ens.py +8 -5
  5. ens/exceptions.py +19 -27
  6. ens/specs/nf.json +1 -1
  7. ens/specs/normalization_spec.json +1 -1
  8. ens/utils.py +17 -10
  9. web3/__init__.py +2 -7
  10. web3/_utils/abi.py +30 -29
  11. web3/_utils/async_transactions.py +7 -4
  12. web3/_utils/blocks.py +6 -2
  13. web3/_utils/caching.py +7 -3
  14. web3/_utils/compat/__init__.py +0 -3
  15. web3/_utils/contract_sources/compile_contracts.py +1 -1
  16. web3/_utils/contracts.py +12 -12
  17. web3/_utils/datatypes.py +5 -1
  18. web3/_utils/decorators.py +6 -1
  19. web3/_utils/empty.py +1 -1
  20. web3/_utils/encoding.py +15 -10
  21. web3/_utils/error_formatters_utils.py +5 -3
  22. web3/_utils/events.py +20 -18
  23. web3/_utils/fee_utils.py +2 -4
  24. web3/_utils/filters.py +17 -12
  25. web3/_utils/formatters.py +2 -2
  26. web3/_utils/math.py +3 -2
  27. web3/_utils/method_formatters.py +24 -5
  28. web3/_utils/module.py +2 -1
  29. web3/_utils/module_testing/eth_module.py +62 -69
  30. web3/_utils/module_testing/go_ethereum_personal_module.py +1 -1
  31. web3/_utils/module_testing/module_testing_utils.py +1 -3
  32. web3/_utils/module_testing/utils.py +14 -7
  33. web3/_utils/normalizers.py +3 -3
  34. web3/_utils/request.py +4 -4
  35. web3/_utils/rpc_abi.py +5 -1
  36. web3/_utils/threads.py +8 -7
  37. web3/_utils/transactions.py +14 -12
  38. web3/_utils/type_conversion.py +5 -1
  39. web3/_utils/validation.py +12 -10
  40. web3/contract/async_contract.py +12 -7
  41. web3/contract/base_contract.py +50 -56
  42. web3/contract/contract.py +12 -6
  43. web3/contract/utils.py +11 -6
  44. web3/datastructures.py +22 -12
  45. web3/eth/async_eth.py +33 -28
  46. web3/eth/base_eth.py +7 -3
  47. web3/eth/eth.py +18 -13
  48. web3/exceptions.py +30 -59
  49. web3/gas_strategies/time_based.py +2 -4
  50. web3/geth.py +1 -3
  51. web3/main.py +6 -2
  52. web3/manager.py +7 -5
  53. web3/method.py +13 -5
  54. web3/middleware/base.py +4 -2
  55. web3/middleware/filter.py +27 -17
  56. web3/middleware/formatting.py +6 -3
  57. web3/middleware/names.py +4 -1
  58. web3/middleware/signing.py +6 -2
  59. web3/middleware/stalecheck.py +2 -1
  60. web3/providers/eth_tester/defaults.py +1 -1
  61. web3/providers/eth_tester/main.py +5 -4
  62. web3/providers/eth_tester/middleware.py +10 -1
  63. web3/providers/ipc.py +7 -3
  64. web3/providers/persistent/async_ipc.py +6 -7
  65. web3/providers/persistent/persistent.py +11 -1
  66. web3/providers/persistent/request_processor.py +7 -7
  67. web3/providers/persistent/websocket.py +3 -3
  68. web3/providers/rpc/async_rpc.py +23 -6
  69. web3/providers/rpc/rpc.py +27 -16
  70. web3/testing.py +4 -4
  71. web3/tools/benchmark/main.py +13 -9
  72. web3/tools/benchmark/utils.py +1 -1
  73. web3/tracing.py +9 -5
  74. web3/types.py +19 -22
  75. {web3-7.0.0b3.dist-info → web3-7.0.0b4.dist-info}/METADATA +13 -28
  76. {web3-7.0.0b3.dist-info → web3-7.0.0b4.dist-info}/RECORD +79 -79
  77. {web3-7.0.0b3.dist-info → web3-7.0.0b4.dist-info}/LICENSE +0 -0
  78. {web3-7.0.0b3.dist-info → web3-7.0.0b4.dist-info}/WHEEL +0 -0
  79. {web3-7.0.0b3.dist-info → web3-7.0.0b4.dist-info}/top_level.txt +0 -0
@@ -15,6 +15,9 @@ from web3._utils.caching import (
15
15
  RequestInformation,
16
16
  generate_cache_key,
17
17
  )
18
+ from web3.exceptions import (
19
+ Web3ValueError,
20
+ )
18
21
  from web3.types import (
19
22
  RPCEndpoint,
20
23
  RPCResponse,
@@ -136,9 +139,9 @@ class RequestProcessor:
136
139
  ) -> RequestInformation:
137
140
  if "method" in response and response["method"] == "eth_subscription":
138
141
  if "params" not in response:
139
- raise ValueError("Subscription response must have params field")
142
+ raise Web3ValueError("Subscription response must have params field")
140
143
  if "subscription" not in response["params"]:
141
- raise ValueError(
144
+ raise Web3ValueError(
142
145
  "Subscription response params must have subscription field"
143
146
  )
144
147
 
@@ -266,7 +269,7 @@ class RequestProcessor:
266
269
  )
267
270
  else:
268
271
  if not cache_key:
269
- raise ValueError(
272
+ raise Web3ValueError(
270
273
  "Must provide cache key when popping a non-subscription response."
271
274
  )
272
275
 
@@ -283,10 +286,7 @@ class RequestProcessor:
283
286
  # request processor class methods
284
287
 
285
288
  def clear_caches(self) -> None:
286
- """
287
- Clear the request processor caches.
288
- """
289
-
289
+ """Clear the request processor caches."""
290
290
  self._request_information_cache.clear()
291
291
  self._request_response_cache.clear()
292
292
  self._subscription_response_queue = asyncio.Queue(
@@ -71,9 +71,9 @@ class WebSocketProvider(PersistentConnectionProvider):
71
71
  # `PersistentConnectionProvider` kwargs can be passed through
72
72
  **kwargs: Any,
73
73
  ) -> None:
74
- self.endpoint_uri = URI(endpoint_uri)
75
- if self.endpoint_uri is None:
76
- self.endpoint_uri = get_default_endpoint()
74
+ self.endpoint_uri = (
75
+ URI(endpoint_uri) if endpoint_uri is not None else get_default_endpoint()
76
+ )
77
77
 
78
78
  if not any(
79
79
  self.endpoint_uri.startswith(prefix)
@@ -20,6 +20,10 @@ from eth_utils import (
20
20
  to_dict,
21
21
  )
22
22
 
23
+ from web3._utils.empty import (
24
+ Empty,
25
+ empty,
26
+ )
23
27
  from web3._utils.http import (
24
28
  construct_user_agent,
25
29
  )
@@ -54,9 +58,9 @@ class AsyncHTTPProvider(AsyncJSONBaseProvider):
54
58
  self,
55
59
  endpoint_uri: Optional[Union[URI, str]] = None,
56
60
  request_kwargs: Optional[Any] = None,
57
- exception_retry_configuration: Optional[
58
- ExceptionRetryConfiguration
59
- ] = ExceptionRetryConfiguration(errors=(ClientError, TimeoutError)),
61
+ exception_retry_configuration: Union[
62
+ ExceptionRetryConfiguration, Empty
63
+ ] = empty,
60
64
  ) -> None:
61
65
  if endpoint_uri is None:
62
66
  self.endpoint_uri = get_default_http_endpoint()
@@ -64,7 +68,7 @@ class AsyncHTTPProvider(AsyncJSONBaseProvider):
64
68
  self.endpoint_uri = URI(endpoint_uri)
65
69
 
66
70
  self._request_kwargs = request_kwargs or {}
67
- self.exception_retry_configuration = exception_retry_configuration
71
+ self._exception_retry_configuration = exception_retry_configuration
68
72
 
69
73
  super().__init__()
70
74
 
@@ -74,12 +78,25 @@ class AsyncHTTPProvider(AsyncJSONBaseProvider):
74
78
  def __str__(self) -> str:
75
79
  return f"RPC connection {self.endpoint_uri}"
76
80
 
81
+ @property
82
+ def exception_retry_configuration(self) -> ExceptionRetryConfiguration:
83
+ if isinstance(self._exception_retry_configuration, Empty):
84
+ self._exception_retry_configuration = ExceptionRetryConfiguration(
85
+ errors=(ClientError, TimeoutError)
86
+ )
87
+ return self._exception_retry_configuration
88
+
89
+ @exception_retry_configuration.setter
90
+ def exception_retry_configuration(
91
+ self, value: Union[ExceptionRetryConfiguration, Empty]
92
+ ) -> None:
93
+ self._exception_retry_configuration = value
94
+
77
95
  @to_dict
78
96
  def get_request_kwargs(self) -> Iterable[Tuple[str, Any]]:
79
97
  if "headers" not in self._request_kwargs:
80
98
  yield "headers", self.get_request_headers()
81
- for key, value in self._request_kwargs.items():
82
- yield key, value
99
+ yield from self._request_kwargs.items()
83
100
 
84
101
  def get_request_headers(self) -> Dict[str, str]:
85
102
  return {
web3/providers/rpc/rpc.py CHANGED
@@ -18,6 +18,10 @@ from eth_utils import (
18
18
  )
19
19
  import requests
20
20
 
21
+ from web3._utils.empty import (
22
+ Empty,
23
+ empty,
24
+ )
21
25
  from web3._utils.http import (
22
26
  construct_user_agent,
23
27
  )
@@ -51,26 +55,16 @@ if TYPE_CHECKING:
51
55
  class HTTPProvider(JSONBaseProvider):
52
56
  logger = logging.getLogger("web3.providers.HTTPProvider")
53
57
  endpoint_uri = None
54
-
55
- _request_args = None
56
58
  _request_kwargs = None
57
59
 
58
- exception_retry_configuration: Optional[ExceptionRetryConfiguration] = None
59
-
60
60
  def __init__(
61
61
  self,
62
62
  endpoint_uri: Optional[Union[URI, str]] = None,
63
63
  request_kwargs: Optional[Any] = None,
64
64
  session: Optional[Any] = None,
65
- exception_retry_configuration: Optional[ExceptionRetryConfiguration] = (
66
- ExceptionRetryConfiguration(
67
- errors=(
68
- ConnectionError,
69
- requests.HTTPError,
70
- requests.Timeout,
71
- )
72
- )
73
- ),
65
+ exception_retry_configuration: Union[
66
+ ExceptionRetryConfiguration, Empty
67
+ ] = empty,
74
68
  ) -> None:
75
69
  if endpoint_uri is None:
76
70
  self.endpoint_uri = get_default_http_endpoint()
@@ -78,7 +72,7 @@ class HTTPProvider(JSONBaseProvider):
78
72
  self.endpoint_uri = URI(endpoint_uri)
79
73
 
80
74
  self._request_kwargs = request_kwargs or {}
81
- self.exception_retry_configuration = exception_retry_configuration
75
+ self._exception_retry_configuration = exception_retry_configuration
82
76
 
83
77
  if session:
84
78
  cache_and_return_session(self.endpoint_uri, session)
@@ -88,12 +82,29 @@ class HTTPProvider(JSONBaseProvider):
88
82
  def __str__(self) -> str:
89
83
  return f"RPC connection {self.endpoint_uri}"
90
84
 
85
+ @property
86
+ def exception_retry_configuration(self) -> ExceptionRetryConfiguration:
87
+ if isinstance(self._exception_retry_configuration, Empty):
88
+ self._exception_retry_configuration = ExceptionRetryConfiguration(
89
+ errors=(
90
+ ConnectionError,
91
+ requests.HTTPError,
92
+ requests.Timeout,
93
+ )
94
+ )
95
+ return self._exception_retry_configuration
96
+
97
+ @exception_retry_configuration.setter
98
+ def exception_retry_configuration(
99
+ self, value: Union[ExceptionRetryConfiguration, Empty]
100
+ ) -> None:
101
+ self._exception_retry_configuration = value
102
+
91
103
  @to_dict
92
104
  def get_request_kwargs(self) -> Iterable[Tuple[str, Any]]:
93
105
  if "headers" not in self._request_kwargs:
94
106
  yield "headers", self.get_request_headers()
95
- for key, value in self._request_kwargs.items():
96
- yield key, value
107
+ yield from self._request_kwargs.items()
97
108
 
98
109
  def get_request_headers(self) -> Dict[str, str]:
99
110
  return {
web3/testing.py CHANGED
@@ -12,21 +12,21 @@ from web3.module import (
12
12
 
13
13
  class Testing(Module):
14
14
  def timeTravel(self, timestamp: int) -> None:
15
- return self.w3.manager.request_blocking(RPC.testing_timeTravel, [timestamp])
15
+ self.w3.manager.request_blocking(RPC.testing_timeTravel, [timestamp])
16
16
 
17
17
  def mine(self, num_blocks: int = 1) -> None:
18
- return self.w3.manager.request_blocking(RPC.evm_mine, [num_blocks])
18
+ self.w3.manager.request_blocking(RPC.evm_mine, [num_blocks])
19
19
 
20
20
  def snapshot(self) -> int:
21
21
  self.last_snapshot_idx = self.w3.manager.request_blocking(RPC.evm_snapshot, [])
22
22
  return self.last_snapshot_idx
23
23
 
24
24
  def reset(self) -> None:
25
- return self.w3.manager.request_blocking(RPC.evm_reset, [])
25
+ self.w3.manager.request_blocking(RPC.evm_reset, [])
26
26
 
27
27
  def revert(self, snapshot_idx: Optional[int] = None) -> None:
28
28
  if snapshot_idx is None:
29
29
  revert_target = self.last_snapshot_idx
30
30
  else:
31
31
  revert_target = snapshot_idx
32
- return self.w3.manager.request_blocking(RPC.evm_revert, [revert_target])
32
+ self.w3.manager.request_blocking(RPC.evm_revert, [revert_target])
@@ -120,20 +120,20 @@ def main(logger: logging.Logger, num_calls: int) -> None:
120
120
  {
121
121
  "name": "eth_gasPrice",
122
122
  "params": {},
123
- "exec": lambda: w3_http.eth.gas_price,
124
- "async_exec": lambda: async_w3_http.eth.gas_price,
123
+ "exec": lambda w3_http=w3_http: w3_http.eth.gas_price,
124
+ "async_exec": lambda async_w3_http=async_w3_http: async_w3_http.eth.gas_price, # noqa: E501
125
125
  },
126
126
  {
127
127
  "name": "eth_sendTransaction",
128
128
  "params": {},
129
- "exec": lambda: w3_http.eth.send_transaction(
129
+ "exec": lambda w3_http=w3_http, coinbase=coinbase: w3_http.eth.send_transaction( # noqa: E501
130
130
  {
131
131
  "to": "0xd3CdA913deB6f67967B99D67aCDFa1712C293601",
132
132
  "from": coinbase,
133
133
  "value": Wei(1),
134
134
  }
135
135
  ),
136
- "async_exec": lambda: async_w3_http.eth.send_transaction(
136
+ "async_exec": lambda async_w3_http=async_w3_http, async_coinbase=async_coinbase: async_w3_http.eth.send_transaction( # noqa: E501
137
137
  {
138
138
  "to": "0xd3CdA913deB6f67967B99D67aCDFa1712C293601",
139
139
  "from": async_coinbase,
@@ -144,18 +144,22 @@ def main(logger: logging.Logger, num_calls: int) -> None:
144
144
  {
145
145
  "name": "eth_blockNumber",
146
146
  "params": {},
147
- "exec": lambda: w3_http.eth.block_number,
148
- "async_exec": lambda: async_w3_http.eth.block_number,
147
+ "exec": lambda w3_http=w3_http: w3_http.eth.block_number,
148
+ "async_exec": lambda async_w3_http=async_w3_http: async_w3_http.eth.block_number, # noqa: E501
149
149
  },
150
150
  {
151
151
  "name": "eth_getBlock",
152
152
  "params": {},
153
- "exec": lambda: w3_http.eth.get_block(1),
154
- "async_exec": lambda: async_w3_http.eth.get_block(1),
153
+ "exec": lambda w3_http=w3_http: w3_http.eth.get_block(1),
154
+ "async_exec": lambda async_w3_http=async_w3_http: async_w3_http.eth.get_block( # noqa: E501
155
+ 1
156
+ ),
155
157
  },
156
158
  ]
157
159
 
158
- def benchmark(method: Dict[str, Any]) -> None:
160
+ def benchmark(
161
+ method: Dict[str, Any], loop: asyncio.AbstractEventLoop = loop
162
+ ) -> None:
159
163
  outcomes: Dict[str, Union[str, float]] = defaultdict(lambda: "N/A")
160
164
  outcomes["name"] = method["name"]
161
165
  outcomes["HTTPProvider"] = sync_benchmark(
@@ -17,7 +17,7 @@ def wait_for_socket(ipc_path: str, timeout: int = 30) -> None:
17
17
  sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
18
18
  sock.connect(ipc_path)
19
19
  sock.settimeout(timeout)
20
- except (FileNotFoundError, socket.error):
20
+ except OSError:
21
21
  time.sleep(0.01)
22
22
  else:
23
23
  break
web3/tracing.py CHANGED
@@ -53,10 +53,10 @@ class Tracing(Module):
53
53
  self._default_block = value
54
54
 
55
55
  def trace_replay_transaction_munger(
56
- self,
57
- block_identifier: Union[_Hash32, BlockIdentifier],
58
- mode: TraceMode = ["trace"],
56
+ self, block_identifier: Union[_Hash32, BlockIdentifier], mode: TraceMode = None
59
57
  ) -> Tuple[Union[BlockIdentifier, _Hash32], TraceMode]:
58
+ if mode is None:
59
+ mode = ["trace"]
60
60
  return (block_identifier, mode)
61
61
 
62
62
  trace_replay_transaction: Method[Callable[..., BlockTrace]] = Method(
@@ -86,9 +86,11 @@ class Tracing(Module):
86
86
  def trace_call_munger(
87
87
  self,
88
88
  transaction: TxParams,
89
- mode: TraceMode = ["trace"],
89
+ mode: TraceMode = None,
90
90
  block_identifier: Optional[BlockIdentifier] = None,
91
91
  ) -> Tuple[TxParams, TraceMode, BlockIdentifier]:
92
+ if mode is None:
93
+ mode = ["trace"]
92
94
  if "from" not in transaction and is_checksum_address(
93
95
  self.w3.eth.default_account
94
96
  ):
@@ -105,8 +107,10 @@ class Tracing(Module):
105
107
  )
106
108
 
107
109
  def trace_transactions_munger(
108
- self, raw_transaction: HexStr, mode: TraceMode = ["trace"]
110
+ self, raw_transaction: HexStr, mode: TraceMode = None
109
111
  ) -> Tuple[HexStr, TraceMode]:
112
+ if mode is None:
113
+ mode = ["trace"]
110
114
  return raw_transaction, mode
111
115
 
112
116
  trace_raw_transaction: Method[Callable[..., BlockTrace]] = Method(
web3/types.py CHANGED
@@ -5,10 +5,12 @@ from typing import (
5
5
  Coroutine,
6
6
  Dict,
7
7
  List,
8
+ Literal,
8
9
  NewType,
9
10
  Optional,
10
11
  Sequence,
11
12
  Type,
13
+ TypedDict,
12
14
  TypeVar,
13
15
  Union,
14
16
  )
@@ -25,9 +27,7 @@ from hexbytes import (
25
27
  )
26
28
 
27
29
  from web3._utils.compat import (
28
- Literal,
29
30
  NotRequired,
30
- TypedDict,
31
31
  )
32
32
  from web3._utils.function_identifiers import (
33
33
  FallbackFn,
@@ -165,6 +165,8 @@ TxData = TypedDict(
165
165
  TxParams = TypedDict(
166
166
  "TxParams",
167
167
  {
168
+ "accessList": AccessList,
169
+ "blobVersionedHashes": Sequence[Union[str, HexStr, bytes, HexBytes]],
168
170
  "chainId": int,
169
171
  "data": Union[bytes, HexStr],
170
172
  # addr or ens
@@ -172,6 +174,7 @@ TxParams = TypedDict(
172
174
  "gas": int,
173
175
  # legacy pricing
174
176
  "gasPrice": Wei,
177
+ "maxFeePerBlobGas": Union[str, Wei],
175
178
  # dynamic fee pricing
176
179
  "maxFeePerGas": Union[str, Wei],
177
180
  "maxPriorityFeePerGas": Union[str, Wei],
@@ -185,15 +188,11 @@ TxParams = TypedDict(
185
188
  )
186
189
 
187
190
 
188
- WithdrawalData = TypedDict(
189
- "WithdrawalData",
190
- {
191
- "index": int,
192
- "validator_index": int,
193
- "address": ChecksumAddress,
194
- "amount": Gwei,
195
- },
196
- )
191
+ class WithdrawalData(TypedDict):
192
+ index: int
193
+ validator_index: int
194
+ address: ChecksumAddress
195
+ amount: Gwei
197
196
 
198
197
 
199
198
  class BlockData(TypedDict, total=False):
@@ -220,6 +219,9 @@ class BlockData(TypedDict, total=False):
220
219
  uncles: Sequence[HexBytes]
221
220
  withdrawals: Sequence[WithdrawalData]
222
221
  withdrawalsRoot: HexBytes
222
+ parentBeaconBlockRoot: HexBytes
223
+ blobGasUsed: int
224
+ excessBlobGas: int
223
225
 
224
226
  # ExtraDataToPOAMiddleware replaces extraData w/ proofOfAuthorityData
225
227
  proofOfAuthorityData: HexBytes
@@ -340,17 +342,12 @@ class FeeHistory(TypedDict):
340
342
  reward: List[List[Wei]]
341
343
 
342
344
 
343
- StateOverrideParams = TypedDict(
344
- "StateOverrideParams",
345
- {
346
- "balance": Optional[Wei],
347
- "nonce": Optional[int],
348
- "code": Optional[Union[bytes, HexStr]],
349
- "state": Optional[Dict[HexStr, HexStr]],
350
- "stateDiff": Optional[Dict[HexStr, HexStr]],
351
- },
352
- total=False,
353
- )
345
+ class StateOverrideParams(TypedDict, total=False):
346
+ balance: Optional[Wei]
347
+ nonce: Optional[int]
348
+ code: Optional[Union[bytes, HexStr]]
349
+ state: Optional[Dict[HexStr, HexStr]]
350
+ stateDiff: Optional[Dict[HexStr, HexStr]]
354
351
 
355
352
 
356
353
  StateOverride = Dict[ChecksumAddress, StateOverrideParams]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: web3
3
- Version: 7.0.0b3
3
+ Version: 7.0.0b4
4
4
  Summary: web3.py
5
5
  Home-page: https://github.com/ethereum/web3.py
6
6
  Author: The Ethereum Foundation
@@ -20,12 +20,12 @@ Requires-Python: >=3.8
20
20
  Description-Content-Type: text/markdown
21
21
  License-File: LICENSE
22
22
  Requires-Dist: aiohttp >=3.7.4.post0
23
- Requires-Dist: eth-abi >=4.0.0
24
- Requires-Dist: eth-account >=0.8.0
23
+ Requires-Dist: eth-abi >=5.0.1
24
+ Requires-Dist: eth-account >=0.12.0
25
25
  Requires-Dist: eth-hash[pycryptodome] >=0.5.1
26
- Requires-Dist: eth-typing >=3.0.0
26
+ Requires-Dist: eth-typing >=4.0.0
27
27
  Requires-Dist: eth-utils >=4.0.0
28
- Requires-Dist: hexbytes <0.4.0,>=0.1.0
28
+ Requires-Dist: hexbytes >=1.2.0
29
29
  Requires-Dist: pydantic >=2.4.0
30
30
  Requires-Dist: requests >=2.16.0
31
31
  Requires-Dist: typing-extensions >=4.0.1
@@ -33,46 +33,31 @@ Requires-Dist: websockets >=10.0.0
33
33
  Requires-Dist: pyunormalize >=15.0.0
34
34
  Requires-Dist: pywin32 >=223 ; platform_system == "Windows"
35
35
  Provides-Extra: dev
36
- Requires-Dist: eth-tester[py-evm] ==v0.10.0-b.3 ; extra == 'dev'
36
+ Requires-Dist: eth-tester[py-evm] <0.12.0b1,>=0.11.0b1 ; extra == 'dev'
37
37
  Requires-Dist: py-geth >=4.1.0 ; extra == 'dev'
38
- Requires-Dist: black >=22.1.0 ; extra == 'dev'
39
- Requires-Dist: blocklint >=0.2.4 ; extra == 'dev'
40
- Requires-Dist: flake8 ==3.8.3 ; extra == 'dev'
41
- Requires-Dist: isort >=5.11.0 ; extra == 'dev'
42
- Requires-Dist: mypy ==1.4.1 ; extra == 'dev'
43
- Requires-Dist: types-setuptools >=57.4.4 ; extra == 'dev'
44
- Requires-Dist: types-requests >=2.26.1 ; extra == 'dev'
45
38
  Requires-Dist: sphinx >=5.3.0 ; extra == 'dev'
46
39
  Requires-Dist: sphinx-rtd-theme >=1.0.0 ; extra == 'dev'
47
40
  Requires-Dist: towncrier <22,>=21 ; extra == 'dev'
41
+ Requires-Dist: build >=0.9.0 ; extra == 'dev'
48
42
  Requires-Dist: bumpversion ; extra == 'dev'
49
43
  Requires-Dist: flaky >=3.7.0 ; extra == 'dev'
50
44
  Requires-Dist: hypothesis >=3.31.2 ; extra == 'dev'
51
- Requires-Dist: pytest >=7.0.0 ; extra == 'dev'
45
+ Requires-Dist: pre-commit >=3.4.0 ; extra == 'dev'
52
46
  Requires-Dist: pytest-asyncio <0.23,>=0.18.1 ; extra == 'dev'
53
47
  Requires-Dist: pytest-mock >=1.10 ; extra == 'dev'
54
48
  Requires-Dist: pytest-watch >=4.2 ; extra == 'dev'
55
49
  Requires-Dist: pytest-xdist >=1.29 ; extra == 'dev'
50
+ Requires-Dist: pytest >=7.0.0 ; extra == 'dev'
56
51
  Requires-Dist: setuptools >=38.6.0 ; extra == 'dev'
57
52
  Requires-Dist: tox >=3.18.0 ; extra == 'dev'
58
53
  Requires-Dist: tqdm >4.32 ; extra == 'dev'
59
54
  Requires-Dist: twine >=1.13 ; extra == 'dev'
60
- Requires-Dist: build >=0.9.0 ; extra == 'dev'
61
- Requires-Dist: importlib-metadata <5.0 ; (python_version < "3.8") and extra == 'dev'
62
55
  Provides-Extra: docs
63
56
  Requires-Dist: sphinx >=5.3.0 ; extra == 'docs'
64
57
  Requires-Dist: sphinx-rtd-theme >=1.0.0 ; extra == 'docs'
65
58
  Requires-Dist: towncrier <22,>=21 ; extra == 'docs'
66
- Provides-Extra: linter
67
- Requires-Dist: black >=22.1.0 ; extra == 'linter'
68
- Requires-Dist: blocklint >=0.2.4 ; extra == 'linter'
69
- Requires-Dist: flake8 ==3.8.3 ; extra == 'linter'
70
- Requires-Dist: isort >=5.11.0 ; extra == 'linter'
71
- Requires-Dist: mypy ==1.4.1 ; extra == 'linter'
72
- Requires-Dist: types-setuptools >=57.4.4 ; extra == 'linter'
73
- Requires-Dist: types-requests >=2.26.1 ; extra == 'linter'
74
59
  Provides-Extra: tester
75
- Requires-Dist: eth-tester[py-evm] ==v0.10.0-b.3 ; extra == 'tester'
60
+ Requires-Dist: eth-tester[py-evm] <0.12.0b1,>=0.11.0b1 ; extra == 'tester'
76
61
  Requires-Dist: py-geth >=4.1.0 ; extra == 'tester'
77
62
 
78
63
  # web3.py
@@ -83,9 +68,9 @@ Requires-Dist: py-geth >=4.1.0 ; extra == 'tester'
83
68
 
84
69
  A Python library for interacting with Ethereum.
85
70
 
86
- - Python 3.8+ support
71
+ - Python 3.8+ support
87
72
 
88
- ---
73
+ ______________________________________________________________________
89
74
 
90
75
  ## Quickstart
91
76
 
@@ -103,6 +88,6 @@ guidelines for [contributing](https://web3py.readthedocs.io/en/latest/contributi
103
88
  then check out issues that are labeled
104
89
  [Good First Issue](https://github.com/ethereum/web3.py/issues?q=is%3Aissue+is%3Aopen+label%3A%22Good+First+Issue%22).
105
90
 
106
- ---
91
+ ______________________________________________________________________
107
92
 
108
93
  #### Questions on implementation or usage? Join the conversation on [discord](https://discord.gg/GHryRvPB84).