From 7f445970ad2005fd61bae9a8bb78efb7bb2632a1 Mon Sep 17 00:00:00 2001 From: fishronsage Date: Mon, 3 Jun 2024 20:36:46 +0800 Subject: [PATCH 1/2] update wait_for_tansaction api to support long poll --- aptos_sdk/async_client.py | 33 ++++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/aptos_sdk/async_client.py b/aptos_sdk/async_client.py index 62b11e3..5f4b348 100644 --- a/aptos_sdk/async_client.py +++ b/aptos_sdk/async_client.py @@ -568,24 +568,31 @@ async def transaction_pending(self, txn_hash: str) -> bool: raise ApiError(response.text, response.status_code) return response.json()["type"] == "pending_transaction" + async def _wait_for_txn(self, txn_hash: str) -> None: + while True: + response = await self._get(endpoint=f"transactions/wait_by_hash/{txn_hash}") + if response.status_code >= 400: + raise ApiError(response.text, response.status_code) + is_pending = response.json()["type"] == "pending_transaction" + if not is_pending: + assert ( + "success" in response.json() and response.json()["success"] + ), f"{response.text} - {txn_hash}" + return + async def wait_for_transaction(self, txn_hash: str) -> None: """ Waits up to the duration specified in client_config for a transaction to move past pending state. """ - - count = 0 - while await self.transaction_pending(txn_hash): - assert ( - count < self.client_config.transaction_wait_in_seconds - ), f"transaction {txn_hash} timed out" - await asyncio.sleep(1) - count += 1 - - response = await self._get(endpoint=f"transactions/by_hash/{txn_hash}") - assert ( - "success" in response.json() and response.json()["success"] - ), f"{response.text} - {txn_hash}" + await asyncio.wait_for( + self._wait_for_txn(txn_hash), + timeout=( + self.client_config.transaction_wait_in_seconds + if self.client_config.transaction_wait_in_seconds + else None + ), + ) async def account_transaction_sequence_number_status( self, address: AccountAddress, sequence_number: int From 4621f585897365f6b36e22e45568977c3f7036c5 Mon Sep 17 00:00:00 2001 From: fishronsage <168002638+fishronsage@users.noreply.github.com> Date: Sat, 14 Sep 2024 00:27:01 +0800 Subject: [PATCH 2/2] Apply suggestions from code review Co-authored-by: David Wolinsky --- aptos_sdk/async_client.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/aptos_sdk/async_client.py b/aptos_sdk/async_client.py index 5f4b348..3f01511 100644 --- a/aptos_sdk/async_client.py +++ b/aptos_sdk/async_client.py @@ -569,16 +569,15 @@ async def transaction_pending(self, txn_hash: str) -> bool: return response.json()["type"] == "pending_transaction" async def _wait_for_txn(self, txn_hash: str) -> None: - while True: + is_pending = True + while is_pending: response = await self._get(endpoint=f"transactions/wait_by_hash/{txn_hash}") if response.status_code >= 400: raise ApiError(response.text, response.status_code) is_pending = response.json()["type"] == "pending_transaction" - if not is_pending: - assert ( - "success" in response.json() and response.json()["success"] - ), f"{response.text} - {txn_hash}" - return + assert ( + "success" in response.json() and response.json()["success"] + ), f"{response.text} - {txn_hash}" async def wait_for_transaction(self, txn_hash: str) -> None: """