From 1216a2bac86ad9ecfdce895c10c26b61e5a884bb Mon Sep 17 00:00:00 2001 From: ibraheem-opentensor Date: Mon, 16 Jun 2025 08:04:36 -0700 Subject: [PATCH 01/13] adds netuid support in swap-hotkey --- bittensor_cli/cli.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/bittensor_cli/cli.py b/bittensor_cli/cli.py index 60d8f4926..ecb936e7d 100755 --- a/bittensor_cli/cli.py +++ b/bittensor_cli/cli.py @@ -1897,6 +1897,8 @@ def wallet_swap_hotkey( wallet_name: Optional[str] = Options.wallet_name, wallet_path: Optional[str] = Options.wallet_path, wallet_hotkey: Optional[str] = Options.wallet_hotkey, + netuid: Optional[int] = Options.netuid_not_req, + all_netuids: bool = Options.all_netuids, network: Optional[list[str]] = Options.network, destination_hotkey_name: Optional[str] = typer.Argument( None, help="Destination hotkey name." @@ -1917,12 +1919,14 @@ def wallet_swap_hotkey( - Make sure that your original key pair (coldkeyA, hotkeyA) is already registered. - Make sure that you use a newly created hotkeyB in this command. A hotkeyB that is already registered cannot be used in this command. + - You can specify the netuid for which you want to swap the hotkey for. If it is not defined, the swap will be initiated for all subnets. - Finally, note that this command requires a fee of 1 TAO for recycling and this fee is taken from your wallet (coldkeyA). EXAMPLE - [green]$[/green] btcli wallet swap_hotkey destination_hotkey_name --wallet-name your_wallet_name --wallet-hotkey original_hotkey + [green]$[/green] btcli wallet swap_hotkey destination_hotkey_name --wallet-name your_wallet_name --wallet-hotkey original_hotkey --netuid 1 """ + netuid = get_optional_netuid(netuid, all_netuids) self.verbosity_handler(quiet, verbose, json_output) original_wallet = self.wallet_ask( wallet_name, @@ -1946,7 +1950,7 @@ def wallet_swap_hotkey( self.initialize_chain(network) return self._run_command( wallets.swap_hotkey( - original_wallet, new_wallet, self.subtensor, prompt, json_output + original_wallet, new_wallet, self.subtensor, netuid, prompt, json_output ) ) From 0f68766fed66f54a0f758c54284ce4a4d1988e61 Mon Sep 17 00:00:00 2001 From: ibraheem-opentensor Date: Mon, 16 Jun 2025 08:05:24 -0700 Subject: [PATCH 02/13] updates swap extrinsic --- .../src/bittensor/extrinsics/registration.py | 69 +++++++++++++++---- bittensor_cli/src/commands/wallets.py | 3 + 2 files changed, 58 insertions(+), 14 deletions(-) diff --git a/bittensor_cli/src/bittensor/extrinsics/registration.py b/bittensor_cli/src/bittensor/extrinsics/registration.py index c230f1134..1e3328964 100644 --- a/bittensor_cli/src/bittensor/extrinsics/registration.py +++ b/bittensor_cli/src/bittensor/extrinsics/registration.py @@ -1611,7 +1611,8 @@ def _update_curr_block( """ Update the current block data with the provided block information and difficulty. - This function updates the current block and its difficulty in a thread-safe manner. It sets the current block + This function updates the current block + and its difficulty in a thread-safe manner. It sets the current block number, hashes the block with the hotkey, updates the current block bytes, and packs the difficulty. :param curr_diff: Shared array to store the current difficulty. @@ -1745,6 +1746,7 @@ async def swap_hotkey_extrinsic( subtensor: "SubtensorInterface", wallet: Wallet, new_wallet: Wallet, + netuid: Optional[int] = None, prompt: bool = False, ) -> bool: """ @@ -1756,37 +1758,76 @@ async def swap_hotkey_extrinsic( netuids_registered = await subtensor.get_netuids_for_hotkey( wallet.hotkey.ss58_address, block_hash=block_hash ) - if not len(netuids_registered) > 0: + netuids_registered_new_hotkey = await subtensor.get_netuids_for_hotkey( + new_wallet.hotkey.ss58_address, block_hash=block_hash + ) + + if netuid is not None and netuid not in netuids_registered: + err_console.print( + f":cross_mark: [red]Failed[/red]: Original hotkey {wallet.hotkey.ss58_address} is not registered on subnet {netuid}" + ) + return False + + elif not len(netuids_registered) > 0: err_console.print( - f"Destination hotkey [dark_orange]{new_wallet.hotkey.ss58_address}[/dark_orange] is not registered. " + f"Original hotkey [dark_orange]{wallet.hotkey.ss58_address}[/dark_orange] is not registered on any subnet. " f"Please register and try again" ) return False + if netuid is not None: + if netuid in netuids_registered_new_hotkey: + err_console.print( + f":cross_mark: [red]Failed[/red]: New hotkey {new_wallet.hotkey.ss58_address} " + f"is already registered on subnet {netuid}" + ) + return False + else: + if len(netuids_registered_new_hotkey) > 0: + err_console.print( + f":cross_mark: [red]Failed[/red]: New hotkey {new_wallet.hotkey.ss58_address} " + f"is already registered on subnet(s) {netuids_registered_new_hotkey}" + ) + return False + if not unlock_key(wallet).success: return False if prompt: # Prompt user for confirmation. - if not Confirm.ask( - f"Do you want to swap [dark_orange]{wallet.name}[/dark_orange] hotkey \n\t" - f"[dark_orange]{wallet.hotkey.ss58_address}[/dark_orange] with hotkey \n\t" - f"[dark_orange]{new_wallet.hotkey.ss58_address}[/dark_orange]\n" - "This operation will cost [bold cyan]1 TAO t (recycled)[/bold cyan]" - ): + if netuid is not None: + confirm_message = ( + f"Do you want to swap [dark_orange]{wallet.name}[/dark_orange] hotkey \n\t" + f"[dark_orange]{wallet.hotkey.ss58_address}[/dark_orange] with hotkey \n\t" + f"[dark_orange]{new_wallet.hotkey.ss58_address}[/dark_orange] on subnet {netuid}\n" + "This operation will cost [bold cyan]1 TAO (recycled)[/bold cyan]" + ) + else: + confirm_message = ( + f"Do you want to swap [dark_orange]{wallet.name}[/dark_orange] hotkey \n\t" + f"[dark_orange]{wallet.hotkey.ss58_address}[/dark_orange] with hotkey \n\t" + f"[dark_orange]{new_wallet.hotkey.ss58_address}[/dark_orange] on all subnets\n" + "This operation will cost [bold cyan]1 TAO (recycled)[/bold cyan]" + ) + + if not Confirm.ask(confirm_message): return False print_verbose( f"Swapping {wallet.name}'s hotkey ({wallet.hotkey.ss58_address}) with " - f"{new_wallet.name}s hotkey ({new_wallet.hotkey.ss58_address})" + f"{new_wallet.name}'s hotkey ({new_wallet.hotkey.ss58_address})" ) with console.status(":satellite: Swapping hotkeys...", spinner="aesthetic"): + call_params = { + "hotkey": wallet.hotkey.ss58_address, + "new_hotkey": new_wallet.hotkey.ss58_address, + } + if netuid is not None: + call_params["netuid"] = netuid + call = await subtensor.substrate.compose_call( call_module="SubtensorModule", call_function="swap_hotkey", - call_params={ - "hotkey": wallet.hotkey.ss58_address, - "new_hotkey": new_wallet.hotkey.ss58_address, - }, + call_params=call_params, ) success, err_msg = await subtensor.sign_and_send_extrinsic(call, wallet) diff --git a/bittensor_cli/src/commands/wallets.py b/bittensor_cli/src/commands/wallets.py index 40ea61218..252fa6aab 100644 --- a/bittensor_cli/src/commands/wallets.py +++ b/bittensor_cli/src/commands/wallets.py @@ -1632,6 +1632,7 @@ async def swap_hotkey( original_wallet: Wallet, new_wallet: Wallet, subtensor: SubtensorInterface, + netuid: Optional[int], prompt: bool, json_output: bool, ): @@ -1640,7 +1641,9 @@ async def swap_hotkey( subtensor, original_wallet, new_wallet, + netuid=netuid, prompt=prompt, + ) if json_output: json_console.print(json.dumps({"success": result})) From 0fc391cc0fe0f48f7098b19799e7ea55780bd7e6 Mon Sep 17 00:00:00 2001 From: ibraheem-opentensor Date: Mon, 16 Jun 2025 08:06:47 -0700 Subject: [PATCH 03/13] ruff --- bittensor_cli/src/commands/wallets.py | 1 - 1 file changed, 1 deletion(-) diff --git a/bittensor_cli/src/commands/wallets.py b/bittensor_cli/src/commands/wallets.py index 252fa6aab..c1c4f4261 100644 --- a/bittensor_cli/src/commands/wallets.py +++ b/bittensor_cli/src/commands/wallets.py @@ -1643,7 +1643,6 @@ async def swap_hotkey( new_wallet, netuid=netuid, prompt=prompt, - ) if json_output: json_console.print(json.dumps({"success": result})) From 3d3657e53b13863696bf07b147c320abb536ee0e Mon Sep 17 00:00:00 2001 From: ibraheem-opentensor Date: Mon, 16 Jun 2025 12:24:39 -0700 Subject: [PATCH 04/13] logo_url params --- bittensor_cli/cli.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/bittensor_cli/cli.py b/bittensor_cli/cli.py index ecb936e7d..18cf5db6d 100755 --- a/bittensor_cli/cli.py +++ b/bittensor_cli/cli.py @@ -5025,6 +5025,9 @@ def subnets_create( description: Optional[str] = typer.Option( None, "--description", help="Description" ), + logo_url: Optional[str] = typer.Option( + None, "--logo-url", help="Logo URL" + ), additional_info: Optional[str] = typer.Option( None, "--additional-info", help="Additional information" ), @@ -5067,6 +5070,7 @@ def subnets_create( subnet_url=subnet_url, discord=discord, description=description, + logo_url=logo_url, additional=additional_info, ) self._run_command( @@ -5190,6 +5194,9 @@ def subnets_set_identity( description: Optional[str] = typer.Option( None, "--description", help="Description" ), + logo_url: Optional[str] = typer.Option( + None, "--logo-url", help="Logo URL" + ), additional_info: Optional[str] = typer.Option( None, "--additional-info", help="Additional information" ), @@ -5241,6 +5248,7 @@ def subnets_set_identity( subnet_url=subnet_url, discord=discord, description=description, + logo_url=logo_url, additional=additional_info, ) From 1fa0491afe60f294eb7a737f5328f3b3d7a41119 Mon Sep 17 00:00:00 2001 From: ibraheem-opentensor Date: Mon, 16 Jun 2025 12:28:27 -0700 Subject: [PATCH 05/13] adds logo_url support --- bittensor_cli/src/bittensor/chain_data.py | 2 ++ bittensor_cli/src/bittensor/utils.py | 8 ++++++++ bittensor_cli/src/commands/subnets/subnets.py | 6 ++++++ 3 files changed, 16 insertions(+) diff --git a/bittensor_cli/src/bittensor/chain_data.py b/bittensor_cli/src/bittensor/chain_data.py index 1f9401ce4..5749ada6f 100644 --- a/bittensor_cli/src/bittensor/chain_data.py +++ b/bittensor_cli/src/bittensor/chain_data.py @@ -630,6 +630,7 @@ class SubnetIdentity(InfoBase): subnet_url: str discord: str description: str + logo_url: str additional: str @classmethod @@ -641,6 +642,7 @@ def _fix_decoded(cls, decoded: dict) -> "SubnetIdentity": subnet_url=bytes(decoded["subnet_url"]).decode(), discord=bytes(decoded["discord"]).decode(), description=bytes(decoded["description"]).decode(), + logo_url=bytes(decoded["logo_url"]).decode(), additional=bytes(decoded["additional"]).decode(), ) diff --git a/bittensor_cli/src/bittensor/utils.py b/bittensor_cli/src/bittensor/utils.py index 31ca5ea61..d7e8da805 100644 --- a/bittensor_cli/src/bittensor/utils.py +++ b/bittensor_cli/src/bittensor/utils.py @@ -1167,6 +1167,7 @@ def prompt_for_subnet_identity( subnet_url: Optional[str], discord: Optional[str], description: Optional[str], + logo_url: Optional[str], additional: Optional[str], ): """ @@ -1227,6 +1228,13 @@ def prompt_for_subnet_identity( lambda x: x and len(x.encode("utf-8")) > 1024, "[red]Error:[/red] Description must be <= 1024 bytes.", ), + ( + "logo_url", + "[blue]Logo URL [dim](optional)[/blue]", + logo_url, + lambda x: x and len(x.encode("utf-8")) > 1024, + "[red]Error:[/red] Logo URL must be <= 1024 bytes.", + ), ( "additional", "[blue]Additional information [dim](optional)[/blue]", diff --git a/bittensor_cli/src/commands/subnets/subnets.py b/bittensor_cli/src/commands/subnets/subnets.py index 99a619d8e..e94402953 100644 --- a/bittensor_cli/src/commands/subnets/subnets.py +++ b/bittensor_cli/src/commands/subnets/subnets.py @@ -140,6 +140,9 @@ async def _find_event_attributes_in_extrinsic_receipt( "description": subnet_identity["description"].encode() if subnet_identity.get("description") else b"", + "logo_url": subnet_identity["logo_url"].encode() + if subnet_identity.get("logo_url") + else b"", "additional": subnet_identity["additional"].encode() if subnet_identity.get("additional") else b"", @@ -2207,6 +2210,7 @@ async def set_identity( "subnet_url": subnet_identity.get("subnet_url", ""), "discord": subnet_identity.get("discord", ""), "description": subnet_identity.get("description", ""), + "logo_url": subnet_identity.get("logo_url", ""), "additional": subnet_identity.get("additional", ""), } @@ -2252,6 +2256,7 @@ async def set_identity( "subnet_url", "discord", "description", + "logo_url", "additional", ]: value = getattr(identity, key, None) @@ -2301,6 +2306,7 @@ async def get_identity( "subnet_url", "discord", "description", + "logo_url", "additional", ]: value = getattr(identity, key, None) From 7dcf37bdd0e37bba9e5a9df2435ede15ce64a6d1 Mon Sep 17 00:00:00 2001 From: ibraheem-opentensor Date: Mon, 16 Jun 2025 12:28:56 -0700 Subject: [PATCH 06/13] updates tests --- tests/e2e_tests/test_staking_sudo.py | 13 ++++++++++--- tests/e2e_tests/test_unstaking.py | 4 ++++ tests/e2e_tests/test_wallet_interactions.py | 6 ++++++ 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/tests/e2e_tests/test_staking_sudo.py b/tests/e2e_tests/test_staking_sudo.py index 0a0984488..5315788ac 100644 --- a/tests/e2e_tests/test_staking_sudo.py +++ b/tests/e2e_tests/test_staking_sudo.py @@ -86,6 +86,8 @@ def test_staking(local_chain, wallet_setup): "A test subnet for e2e testing", "--additional-info", "Created by Alice", + "--logo-url", + "https://testsubnet.com/logo.png", "--no-prompt", "--json-output", ], @@ -121,6 +123,8 @@ def test_staking(local_chain, wallet_setup): "A test subnet for e2e testing", "--additional-info", "Created by Alice", + "--logo-url", + "https://testsubnet.com/logo.png", "--no-prompt", "--json-output", ], @@ -198,6 +202,8 @@ def test_staking(local_chain, wallet_setup): sn_discord := "alice#1234", "--description", sn_description := "A test subnet for e2e testing", + "--logo-url", + sn_logo_url := "https://testsubnet.com/logo.png", "--additional-info", sn_add_info := "Created by Alice", "--json-output", @@ -225,6 +231,7 @@ def test_staking(local_chain, wallet_setup): assert get_identity_output["subnet_url"] == sn_url assert get_identity_output["discord"] == sn_discord assert get_identity_output["description"] == sn_description + assert get_identity_output["logo_url"] == sn_logo_url assert get_identity_output["additional"] == sn_add_info # Start emissions on SNs @@ -508,9 +515,9 @@ def test_staking(local_chain, wallet_setup): ], ) change_yuma3_hyperparam_json = json.loads(change_yuma3_hyperparam.stdout) - assert change_yuma3_hyperparam_json["success"] is True, ( - change_yuma3_hyperparam.stdout - ) + assert ( + change_yuma3_hyperparam_json["success"] is True + ), change_yuma3_hyperparam.stdout changed_yuma3_hyperparam = exec_command_alice( command="sudo", diff --git a/tests/e2e_tests/test_unstaking.py b/tests/e2e_tests/test_unstaking.py index bfbb77e85..e28c54df6 100644 --- a/tests/e2e_tests/test_unstaking.py +++ b/tests/e2e_tests/test_unstaking.py @@ -83,6 +83,8 @@ def test_unstaking(local_chain, wallet_setup): "A test subnet for e2e testing", "--additional-info", "Test subnet", + "--logo-url", + "https://testsubnet.com/logo.png", "--no-prompt", ], ) @@ -115,6 +117,8 @@ def test_unstaking(local_chain, wallet_setup): "A test subnet for e2e testing", "--additional-info", "Test subnet", + "--logo-url", + "https://testsubnet.com/logo.png", "--no-prompt", ], ) diff --git a/tests/e2e_tests/test_wallet_interactions.py b/tests/e2e_tests/test_wallet_interactions.py index 08b2c73c4..cdd22c775 100644 --- a/tests/e2e_tests/test_wallet_interactions.py +++ b/tests/e2e_tests/test_wallet_interactions.py @@ -69,6 +69,8 @@ def test_wallet_overview_inspect(local_chain, wallet_setup): "test#1234", "--description", "A test subnet for e2e testing", + "--logo-url", + "https://testsubnet.com/logo.png", "--additional-info", "Test subnet", "--no-prompt", @@ -388,6 +390,8 @@ def test_wallet_identities(local_chain, wallet_setup): "A test subnet for e2e testing", "--additional-info", "Created by Alice", + "--logo-url", + "https://testsubnet.com/logo.png", "--no-prompt", ], ) @@ -427,6 +431,8 @@ def test_wallet_identities(local_chain, wallet_setup): alice_identity["discord"], "--description", alice_identity["description"], + # "--logo-url", + # alice_identity["logo_url"], "--additional", alice_identity["additional"], "--github", From 4077b98e2a2760fa1a49edd20b2a0f3a2b6842ca Mon Sep 17 00:00:00 2001 From: ibraheem-opentensor Date: Mon, 16 Jun 2025 12:34:49 -0700 Subject: [PATCH 07/13] cleanup --- tests/e2e_tests/test_wallet_interactions.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/e2e_tests/test_wallet_interactions.py b/tests/e2e_tests/test_wallet_interactions.py index cdd22c775..e6a4bb22d 100644 --- a/tests/e2e_tests/test_wallet_interactions.py +++ b/tests/e2e_tests/test_wallet_interactions.py @@ -431,8 +431,6 @@ def test_wallet_identities(local_chain, wallet_setup): alice_identity["discord"], "--description", alice_identity["description"], - # "--logo-url", - # alice_identity["logo_url"], "--additional", alice_identity["additional"], "--github", From 0611641cbbe79bce424f8d4cef47edbcccbe165a Mon Sep 17 00:00:00 2001 From: ibraheem-opentensor Date: Mon, 16 Jun 2025 12:36:23 -0700 Subject: [PATCH 08/13] ruff --- bittensor_cli/cli.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/bittensor_cli/cli.py b/bittensor_cli/cli.py index 18cf5db6d..c92ae2a18 100755 --- a/bittensor_cli/cli.py +++ b/bittensor_cli/cli.py @@ -5025,9 +5025,7 @@ def subnets_create( description: Optional[str] = typer.Option( None, "--description", help="Description" ), - logo_url: Optional[str] = typer.Option( - None, "--logo-url", help="Logo URL" - ), + logo_url: Optional[str] = typer.Option(None, "--logo-url", help="Logo URL"), additional_info: Optional[str] = typer.Option( None, "--additional-info", help="Additional information" ), @@ -5194,9 +5192,7 @@ def subnets_set_identity( description: Optional[str] = typer.Option( None, "--description", help="Description" ), - logo_url: Optional[str] = typer.Option( - None, "--logo-url", help="Logo URL" - ), + logo_url: Optional[str] = typer.Option(None, "--logo-url", help="Logo URL"), additional_info: Optional[str] = typer.Option( None, "--additional-info", help="Additional information" ), From 35b2d44e0171306add7b363f4760aab1f795a581 Mon Sep 17 00:00:00 2001 From: ibraheem-opentensor Date: Mon, 16 Jun 2025 12:40:20 -0700 Subject: [PATCH 09/13] ruff (again) --- tests/e2e_tests/test_staking_sudo.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/e2e_tests/test_staking_sudo.py b/tests/e2e_tests/test_staking_sudo.py index 5315788ac..c880fee4b 100644 --- a/tests/e2e_tests/test_staking_sudo.py +++ b/tests/e2e_tests/test_staking_sudo.py @@ -515,9 +515,9 @@ def test_staking(local_chain, wallet_setup): ], ) change_yuma3_hyperparam_json = json.loads(change_yuma3_hyperparam.stdout) - assert ( - change_yuma3_hyperparam_json["success"] is True - ), change_yuma3_hyperparam.stdout + assert change_yuma3_hyperparam_json["success"] is True, ( + change_yuma3_hyperparam.stdout + ) changed_yuma3_hyperparam = exec_command_alice( command="sudo", From d7a70146c018ffa2ad1e9643dea584fec0acd518 Mon Sep 17 00:00:00 2001 From: ibraheem-opentensor Date: Mon, 16 Jun 2025 12:57:54 -0700 Subject: [PATCH 10/13] update creation test --- tests/e2e_tests/test_wallet_creations.py | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/tests/e2e_tests/test_wallet_creations.py b/tests/e2e_tests/test_wallet_creations.py index 7b573dbba..019cad6b5 100644 --- a/tests/e2e_tests/test_wallet_creations.py +++ b/tests/e2e_tests/test_wallet_creations.py @@ -587,7 +587,13 @@ def test_wallet_balance_all(local_chain, wallet_setup, capfd): result = exec_command( command="wallet", sub_command="balance", - extra_args=["--wallet-path", wallet_path, "--all"], + extra_args=[ + "--wallet-path", + wallet_path, + "--all", + "--chain", + "ws://127.0.0.1:9945", + ], ) output = result.stdout @@ -600,7 +606,14 @@ def test_wallet_balance_all(local_chain, wallet_setup, capfd): json_results = exec_command( "wallet", "balance", - extra_args=["--wallet-path", wallet_path, "--all", "--json-output"], + extra_args=[ + "--wallet-path", + wallet_path, + "--all", + "--json-output", + "--chain", + "ws://127.0.0.1:9945", + ], ) json_results_output = json.loads(json_results.stdout) for wallet_name in wallet_names: From 06153d74bf52c29b9853ed4c57362863729b5422 Mon Sep 17 00:00:00 2001 From: ibraheem-opentensor Date: Mon, 16 Jun 2025 14:35:16 -0700 Subject: [PATCH 11/13] bumps version and changelog --- CHANGELOG.md | 8 ++++++++ pyproject.toml | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6413ce04f..4f646dc19 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## 9.7.0/2025-06-16 + +## What's Changed +* Add `SKIP_PULL` variable for conftest.py by @basfroman in https://github.com/opentensor/btcli/pull/502 +* Feat: Adds netuid support in swap_hotkeys by @ibraheem-abe in https://github.com/opentensor/btcli/pull/505 + +**Full Changelog**: https://github.com/opentensor/btcli/compare/v9.6.0...v9.7.0 + ## 9.6.0/2025-06-12 ## What's Changed diff --git a/pyproject.toml b/pyproject.toml index e680c1e57..fdafdd92f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "bittensor-cli" -version = "9.6.0" +version = "9.7.0" description = "Bittensor CLI" readme = "README.md" authors = [ From 07884c48e44713f275b0cd9fab6f85685fd3f7d4 Mon Sep 17 00:00:00 2001 From: ibraheem-opentensor Date: Mon, 16 Jun 2025 08:05:24 -0700 Subject: [PATCH 12/13] updates swap extrinsic --- bittensor_cli/src/commands/wallets.py | 1 + 1 file changed, 1 insertion(+) diff --git a/bittensor_cli/src/commands/wallets.py b/bittensor_cli/src/commands/wallets.py index c1c4f4261..252fa6aab 100644 --- a/bittensor_cli/src/commands/wallets.py +++ b/bittensor_cli/src/commands/wallets.py @@ -1643,6 +1643,7 @@ async def swap_hotkey( new_wallet, netuid=netuid, prompt=prompt, + ) if json_output: json_console.print(json.dumps({"success": result})) From f6a642479efa269c45bd58bf1069f7053125b91d Mon Sep 17 00:00:00 2001 From: ibraheem-opentensor Date: Mon, 16 Jun 2025 15:02:50 -0700 Subject: [PATCH 13/13] pip --- bittensor_cli/src/commands/wallets.py | 1 - 1 file changed, 1 deletion(-) diff --git a/bittensor_cli/src/commands/wallets.py b/bittensor_cli/src/commands/wallets.py index 252fa6aab..c1c4f4261 100644 --- a/bittensor_cli/src/commands/wallets.py +++ b/bittensor_cli/src/commands/wallets.py @@ -1643,7 +1643,6 @@ async def swap_hotkey( new_wallet, netuid=netuid, prompt=prompt, - ) if json_output: json_console.print(json.dumps({"success": result}))