|
24 | 24 | Web3ValidationError,
|
25 | 25 | )
|
26 | 26 | from web3.middleware import (
|
| 27 | + async_construct_error_generator_middleware, |
| 28 | + async_construct_result_generator_middleware, |
| 29 | + construct_error_generator_middleware, |
27 | 30 | construct_result_generator_middleware,
|
28 | 31 | )
|
29 | 32 | from web3.middleware.simulate_unmined_transaction import (
|
|
33 | 36 | RECEIPT_TIMEOUT = 0.2
|
34 | 37 |
|
35 | 38 |
|
| 39 | +def _swap_error_middleware_for_result_middleware_and_return_error( |
| 40 | + w3, result_middleware |
| 41 | +): |
| 42 | + # On the first call, this will be in ``layer=0`` and we will remove this |
| 43 | + # middleware and add the result middleware to layer 0 for the next call. |
| 44 | + w3.middleware_onion.remove("error_middleware") |
| 45 | + w3.middleware_onion.inject(result_middleware, "result_middleware", layer=0) |
| 46 | + return {"code": -32000, "message": "transaction indexing in progress"} |
| 47 | + |
| 48 | + |
36 | 49 | @pytest.mark.parametrize(
|
37 | 50 | "transaction",
|
38 | 51 | (
|
@@ -193,6 +206,28 @@ def test_unmined_transaction_wait_for_receipt(w3):
|
193 | 206 | assert txn_receipt["blockHash"] is not None
|
194 | 207 |
|
195 | 208 |
|
| 209 | +def test_eth_wait_for_transaction_receipt_transaction_indexing_in_progress(w3): |
| 210 | + result_middleware = construct_result_generator_middleware( |
| 211 | + {RPC.eth_getTransactionReceipt: lambda *_: {"status": 1}} |
| 212 | + ) |
| 213 | + error_middleware = construct_error_generator_middleware( |
| 214 | + { |
| 215 | + RPC.eth_getTransactionReceipt: lambda *_: ( |
| 216 | + _swap_error_middleware_for_result_middleware_and_return_error( |
| 217 | + w3, result_middleware |
| 218 | + ) |
| 219 | + ) |
| 220 | + } |
| 221 | + ) |
| 222 | + w3.middleware_onion.inject(error_middleware, "error_middleware", layer=0) |
| 223 | + |
| 224 | + receipt = w3.eth.wait_for_transaction_receipt(f"0x{'00' * 32}") |
| 225 | + assert receipt == {"status": 1} |
| 226 | + |
| 227 | + assert "error_middleware" not in w3.middleware_onion.middlewares |
| 228 | + w3.middleware_onion.remove("result_middleware") |
| 229 | + |
| 230 | + |
196 | 231 | def test_get_transaction_formatters(w3):
|
197 | 232 | non_checksummed_addr = "0xB2930B35844A230F00E51431ACAE96FE543A0347" # all uppercase
|
198 | 233 | unformatted_transaction = {
|
@@ -300,3 +335,30 @@ def test_get_transaction_formatters(w3):
|
300 | 335 |
|
301 | 336 | assert received_tx == expected
|
302 | 337 | w3.middleware_onion.remove("result_middleware")
|
| 338 | + |
| 339 | + |
| 340 | +# --- async --- # |
| 341 | + |
| 342 | + |
| 343 | +@pytest.mark.asyncio |
| 344 | +async def test_async_wait_for_transaction_receipt_transaction_indexing_in_progress( |
| 345 | + async_w3, |
| 346 | +): |
| 347 | + result_middleware = await async_construct_result_generator_middleware( |
| 348 | + {RPC.eth_getTransactionReceipt: lambda *_: {"status": 1}} |
| 349 | + ) |
| 350 | + error_middleware = await async_construct_error_generator_middleware( |
| 351 | + { |
| 352 | + RPC.eth_getTransactionReceipt: lambda *_: ( |
| 353 | + _swap_error_middleware_for_result_middleware_and_return_error( |
| 354 | + async_w3, result_middleware |
| 355 | + ) |
| 356 | + ) |
| 357 | + } |
| 358 | + ) |
| 359 | + async_w3.middleware_onion.inject(error_middleware, "error_middleware", layer=0) |
| 360 | + |
| 361 | + receipt = await async_w3.eth.wait_for_transaction_receipt(f"0x{'00' * 32}") |
| 362 | + assert receipt == {"status": 1} |
| 363 | + |
| 364 | + async_w3.middleware_onion.remove("result_middleware") |
0 commit comments