From 1d12cc1e78dc55e534e9ba77b929cf533e301b93 Mon Sep 17 00:00:00 2001 From: bdhimes Date: Thu, 23 Oct 2025 19:11:55 +0200 Subject: [PATCH 1/3] Ensures we exit gracefully if there's an error in connection. --- bittensor_cli/cli.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/bittensor_cli/cli.py b/bittensor_cli/cli.py index 220de3d40..5411b144f 100755 --- a/bittensor_cli/cli.py +++ b/bittensor_cli/cli.py @@ -1331,13 +1331,13 @@ async def _run(): if ( exit_early is True ): # temporarily to handle multiple run commands in one session - try: - if self.subtensor: + if self.subtensor: + try: await self.subtensor.substrate.close() - raise typer.Exit() - except Exception as e: # ensures we always exit cleanly - if not isinstance(e, (typer.Exit, RuntimeError)): - err_console.print(f"An unknown error has occurred: {e}") + except Exception as e: # ensures we always exit cleanly + if not isinstance(e, (typer.Exit, RuntimeError)): + err_console.print(f"An unknown error has occurred: {e}") + raise typer.Exit() return self.event_loop.run_until_complete(_run()) From 39653e17b3b074e2cf0a0af10474494d7b1caf47 Mon Sep 17 00:00:00 2001 From: bdhimes Date: Thu, 23 Oct 2025 19:18:39 +0200 Subject: [PATCH 2/3] Ensure we don't print the extrinsic success message if the extrinsic failed. --- bittensor_cli/src/bittensor/utils.py | 2 +- bittensor_cli/src/commands/stake/move.py | 8 +++----- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/bittensor_cli/src/bittensor/utils.py b/bittensor_cli/src/bittensor/utils.py index 3846dc7b3..f9ade4507 100644 --- a/bittensor_cli/src/bittensor/utils.py +++ b/bittensor_cli/src/bittensor/utils.py @@ -1496,7 +1496,7 @@ async def print_extrinsic_id( Args: extrinsic_receipt: AsyncExtrinsicReceipt object from a successful extrinsic submission. """ - if extrinsic_receipt is None: + if extrinsic_receipt is None or not (await extrinsic_receipt.is_success): return substrate = extrinsic_receipt.substrate ext_id = await extrinsic_receipt.get_extrinsic_identifier() diff --git a/bittensor_cli/src/commands/stake/move.py b/bittensor_cli/src/commands/stake/move.py index 53587a577..c986b859a 100644 --- a/bittensor_cli/src/commands/stake/move.py +++ b/bittensor_cli/src/commands/stake/move.py @@ -566,7 +566,6 @@ async def move_stake( response = await subtensor.substrate.submit_extrinsic( extrinsic, wait_for_inclusion=True, wait_for_finalization=False ) - await print_extrinsic_id(response) ext_id = await response.get_extrinsic_identifier() if not prompt: @@ -580,6 +579,7 @@ async def move_stake( ) return False, "" else: + await print_extrinsic_id(response) console.print( ":white_heavy_check_mark: [dark_sea_green3]Stake moved.[/dark_sea_green3]" ) @@ -755,7 +755,6 @@ async def transfer_stake( extrinsic, wait_for_inclusion=True, wait_for_finalization=False ) ext_id = await response.get_extrinsic_identifier() - await print_extrinsic_id(extrinsic) if not prompt: console.print(":white_heavy_check_mark: [green]Sent[/green]") @@ -767,7 +766,7 @@ async def transfer_stake( f"{format_error_message(await response.error_message)}" ) return False, "" - + await print_extrinsic_id(extrinsic) # Get and display new stake balances new_stake, new_dest_stake = await asyncio.gather( subtensor.get_stake( @@ -933,7 +932,6 @@ async def swap_stake( wait_for_finalization=wait_for_finalization, ) ext_id = await response.get_extrinsic_identifier() - await print_extrinsic_id(response) if not prompt: console.print(":white_heavy_check_mark: [green]Sent[/green]") @@ -945,7 +943,7 @@ async def swap_stake( f"{format_error_message(await response.error_message)}" ) return False, "" - + await print_extrinsic_id(response) # Get and display new stake balances new_stake, new_dest_stake = await asyncio.gather( subtensor.get_stake( From fceada915b34d7fd5a58c60490103eaf50dbfb7d Mon Sep 17 00:00:00 2001 From: bdhimes Date: Thu, 23 Oct 2025 20:30:36 +0200 Subject: [PATCH 3/3] Only raise typer.Exit on exception occurring --- bittensor_cli/cli.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/bittensor_cli/cli.py b/bittensor_cli/cli.py index 5411b144f..facf58224 100755 --- a/bittensor_cli/cli.py +++ b/bittensor_cli/cli.py @@ -1302,6 +1302,7 @@ def _run_command(self, cmd: Coroutine, exit_early: bool = True): async def _run(): initiated = False + exception_occurred = False try: if self.subtensor: await self.subtensor.substrate.initialize() @@ -1311,6 +1312,7 @@ async def _run(): except (ConnectionRefusedError, ssl.SSLError, InvalidHandshake): err_console.print(f"Unable to connect to the chain: {self.subtensor}") verbose_console.print(traceback.format_exc()) + exception_occurred = True except ( ConnectionClosed, SubstrateRequestException, @@ -1322,9 +1324,11 @@ async def _run(): elif isinstance(e, RuntimeError): pass # Temporarily to handle loop bound issues verbose_console.print(traceback.format_exc()) + exception_occurred = True except Exception as e: err_console.print(f"An unknown error has occurred: {e}") verbose_console.print(traceback.format_exc()) + exception_occurred = True finally: if initiated is False: asyncio.create_task(cmd).cancel() @@ -1337,7 +1341,8 @@ async def _run(): except Exception as e: # ensures we always exit cleanly if not isinstance(e, (typer.Exit, RuntimeError)): err_console.print(f"An unknown error has occurred: {e}") - raise typer.Exit() + if exception_occurred: + raise typer.Exit() return self.event_loop.run_until_complete(_run())