From e8f435848f6d079cc6a16bbcd94ec62ffee27f03 Mon Sep 17 00:00:00 2001 From: Benjamin Himes Date: Thu, 10 Jul 2025 15:38:37 +0200 Subject: [PATCH 1/7] Updates stake move table with rate applied correctly. --- bittensor_cli/src/commands/stake/move.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/bittensor_cli/src/commands/stake/move.py b/bittensor_cli/src/commands/stake/move.py index 578c9f0a0..5e10e8080 100644 --- a/bittensor_cli/src/commands/stake/move.py +++ b/bittensor_cli/src/commands/stake/move.py @@ -38,8 +38,7 @@ async def display_stake_movement_cross_subnets( if origin_netuid == destination_netuid: subnet = await subtensor.subnet(origin_netuid) - received_amount_tao = subnet.alpha_to_tao(amount_to_move) - received_amount_tao -= stake_fee + received_amount_tao = subnet.alpha_to_tao(amount_to_move - stake_fee) if received_amount_tao < Balance.from_tao(0): print_error("Not enough Alpha to pay the transaction fee.") @@ -60,8 +59,7 @@ async def display_stake_movement_cross_subnets( price_destination = dynamic_destination.price.tao rate = price_origin / (price_destination or 1) - received_amount_tao = dynamic_origin.alpha_to_tao(amount_to_move) - received_amount_tao -= stake_fee + received_amount_tao = dynamic_origin.alpha_to_tao(amount_to_move - stake_fee) received_amount = dynamic_destination.tao_to_alpha(received_amount_tao) received_amount.set_unit(destination_netuid) From da29bd83f26736c24afda3d3a5946462674cd8f0 Mon Sep 17 00:00:00 2001 From: Benjamin Himes Date: Thu, 10 Jul 2025 19:20:01 +0200 Subject: [PATCH 2/7] Ensure stake fee is correctly applied netuid unit --- bittensor_cli/src/bittensor/subtensor_interface.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/bittensor_cli/src/bittensor/subtensor_interface.py b/bittensor_cli/src/bittensor/subtensor_interface.py index e5b5eac12..50fc443c0 100644 --- a/bittensor_cli/src/bittensor/subtensor_interface.py +++ b/bittensor_cli/src/bittensor/subtensor_interface.py @@ -1534,7 +1534,7 @@ async def get_stake_fee( if destination_hotkey_ss58 is not None and destination_netuid is not None: destination = (destination_hotkey_ss58, destination_netuid) - result = await self.query_runtime_api( + result_ = await self.query_runtime_api( runtime_api="StakeInfoRuntimeApi", method="get_stake_fee", params=[ @@ -1546,8 +1546,10 @@ async def get_stake_fee( ], block_hash=block_hash, ) + result = Balance.from_rao(result_) + result.set_unit(origin_netuid) - return Balance.from_rao(result) + return result async def get_scheduled_coldkey_swap( self, From 14aad33be4e730d1c9129b8c947df94b3ffd3898 Mon Sep 17 00:00:00 2001 From: Benjamin Himes Date: Thu, 10 Jul 2025 19:20:10 +0200 Subject: [PATCH 3/7] Improve error message --- bittensor_cli/src/commands/stake/move.py | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/bittensor_cli/src/commands/stake/move.py b/bittensor_cli/src/commands/stake/move.py index 5e10e8080..ede380597 100644 --- a/bittensor_cli/src/commands/stake/move.py +++ b/bittensor_cli/src/commands/stake/move.py @@ -39,12 +39,15 @@ async def display_stake_movement_cross_subnets( if origin_netuid == destination_netuid: subnet = await subtensor.subnet(origin_netuid) received_amount_tao = subnet.alpha_to_tao(amount_to_move - stake_fee) + received_amount = subnet.tao_to_alpha(received_amount_tao) - if received_amount_tao < Balance.from_tao(0): - print_error("Not enough Alpha to pay the transaction fee.") + if received_amount < Balance.from_tao(0).set_unit(destination_netuid): + print_error( + f"Not enough Alpha to pay the transaction fee. The fee is {stake_fee}, " + f"which would set the total received to {received_amount}." + ) raise ValueError - received_amount = subnet.tao_to_alpha(received_amount_tao) price = subnet.price.tao price_str = ( str(float(price)) @@ -63,8 +66,11 @@ async def display_stake_movement_cross_subnets( received_amount = dynamic_destination.tao_to_alpha(received_amount_tao) received_amount.set_unit(destination_netuid) - if received_amount < Balance.from_tao(0): - print_error("Not enough Alpha to pay the transaction fee.") + if received_amount < Balance.from_tao(0).set_unit(destination_netuid): + print_error( + f"Not enough Alpha to pay the transaction fee. The fee is {stake_fee}, " + f"which would set the total received to {received_amount}." + ) raise ValueError price_str = ( From 79bcb7f10fdf64733e93641d56f2ed860eae28b5 Mon Sep 17 00:00:00 2001 From: Benjamin Himes Date: Thu, 10 Jul 2025 22:34:00 +0200 Subject: [PATCH 4/7] Remove `--slippage` alias --- bittensor_cli/cli.py | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/bittensor_cli/cli.py b/bittensor_cli/cli.py index bb1c5126a..fdf7ce2a2 100755 --- a/bittensor_cli/cli.py +++ b/bittensor_cli/cli.py @@ -277,8 +277,6 @@ def edit_help(cls, option_name: str, help_text: str): ) rate_tolerance = typer.Option( None, - "--slippage", - "--slippage-tolerance", "--tolerance", "--rate-tolerance", help="Set the rate tolerance percentage for transactions (default: 0.05 for 5%).", @@ -1257,8 +1255,6 @@ def set_config( ), rate_tolerance: Optional[float] = typer.Option( None, - "--slippage", - "--slippage-tolerance", "--tolerance", help="Set the rate tolerance percentage for transactions (e.g. 0.1 for 0.1%).", ), @@ -1404,9 +1400,7 @@ def del_config( wallet_hotkey: bool = typer.Option(False, *Options.wallet_hotkey.param_decls), network: bool = typer.Option(False, *Options.network.param_decls), use_cache: bool = typer.Option(False, "--cache"), - rate_tolerance: bool = typer.Option( - False, "--slippage", "--slippage-tolerance", "--tolerance" - ), + rate_tolerance: bool = typer.Option(False, "--tolerance"), safe_staking: bool = typer.Option( False, "--safe-staking/--no-safe-staking", "--safe/--unsafe" ), From 20d5d68b0a0f1d093b55100d63f82e4f669a6f8a Mon Sep 17 00:00:00 2001 From: Benjamin Himes Date: Thu, 10 Jul 2025 22:38:57 +0200 Subject: [PATCH 5/7] Fix tests --- bittensor_cli/src/bittensor/subtensor_interface.py | 3 ++- tests/e2e_tests/test_unstaking.py | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/bittensor_cli/src/bittensor/subtensor_interface.py b/bittensor_cli/src/bittensor/subtensor_interface.py index 50fc443c0..4ae3861a1 100644 --- a/bittensor_cli/src/bittensor/subtensor_interface.py +++ b/bittensor_cli/src/bittensor/subtensor_interface.py @@ -1547,7 +1547,8 @@ async def get_stake_fee( block_hash=block_hash, ) result = Balance.from_rao(result_) - result.set_unit(origin_netuid) + if isinstance(origin_netuid, int): + result.set_unit(origin_netuid) return result diff --git a/tests/e2e_tests/test_unstaking.py b/tests/e2e_tests/test_unstaking.py index e28c54df6..68af71087 100644 --- a/tests/e2e_tests/test_unstaking.py +++ b/tests/e2e_tests/test_unstaking.py @@ -231,7 +231,7 @@ def test_unstaking(local_chain, wallet_setup): "144", ], ) - assert "✅ Finalized" in stake_result.stdout + assert "✅ Finalized" in stake_result.stdout, stake_result.stderr stake_list = exec_command_bob( command="stake", From 4e6a49e9eaa11335ba32df0d26ac52dc27041e32 Mon Sep 17 00:00:00 2001 From: Benjamin Himes Date: Thu, 10 Jul 2025 23:12:12 +0200 Subject: [PATCH 6/7] change stake fee calculation --- .../src/bittensor/subtensor_interface.py | 28 +++++-------------- 1 file changed, 7 insertions(+), 21 deletions(-) diff --git a/bittensor_cli/src/bittensor/subtensor_interface.py b/bittensor_cli/src/bittensor/subtensor_interface.py index 4ae3861a1..f5c9768ae 100644 --- a/bittensor_cli/src/bittensor/subtensor_interface.py +++ b/bittensor_cli/src/bittensor/subtensor_interface.py @@ -36,6 +36,7 @@ decode_hex_identity_dict, validate_chain_endpoint, u16_normalized_float, + U16_MAX, ) SubstrateClass = ( @@ -1526,29 +1527,14 @@ async def get_stake_fee( 5. Moving between coldkeys """ - origin = None - if origin_hotkey_ss58 is not None and origin_netuid is not None: - origin = (origin_hotkey_ss58, origin_netuid) + if origin_netuid is None: + origin_netuid = 0 - destination = None - if destination_hotkey_ss58 is not None and destination_netuid is not None: - destination = (destination_hotkey_ss58, destination_netuid) + fee_rate = await self.query("Swap", "FeeRate", [origin_netuid]) + fee = amount * (fee_rate / U16_MAX) - result_ = await self.query_runtime_api( - runtime_api="StakeInfoRuntimeApi", - method="get_stake_fee", - params=[ - origin, - origin_coldkey_ss58, - destination, - destination_coldkey_ss58, - amount, - ], - block_hash=block_hash, - ) - result = Balance.from_rao(result_) - if isinstance(origin_netuid, int): - result.set_unit(origin_netuid) + result = Balance.from_tao(fee) + result.set_unit(origin_netuid) return result From 274ccbf27d5d3c97cdaaf5f5bddc7406f3cf0247 Mon Sep 17 00:00:00 2001 From: Benjamin Himes Date: Thu, 10 Jul 2025 23:33:51 +0200 Subject: [PATCH 7/7] Bumps changelog + version --- CHANGELOG.md | 19 ++++++++++++------- pyproject.toml | 2 +- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b6ba95055..5ed8fe430 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,13 +1,18 @@ # Changelog -## 9.8.2/2025-07-09 +## 9.8.3 /2025-07-10 +* Updates stake move table with rate applied correctly. by @thewhaleking in https://github.com/opentensor/btcli/pull/538 +* change stake fee calculation by @thewhaleking in https://github.com/opentensor/btcli/pull/539 + +**Full Changelog**: https://github.com/opentensor/btcli/compare/v9.8.2...v9.8.3 + +## 9.8.2 /2025-07-09 * Ensure that the fees are shown in alpha, not Tao. by @thewhaleking in https://github.com/opentensor/btcli/pull/530 * remove unused subnet names mapping by @thewhaleking in https://github.com/opentensor/btcli/pull/531 - **Full Changelog**: https://github.com/opentensor/btcli/compare/v9.8.1...v9.8.2 -## 9.8.1/2025-07-08 +## 9.8.1 /2025-07-08 ## What's Changed * Fixed broken type annotation. by @thewhaleking in https://github.com/opentensor/btcli/pull/523 @@ -20,7 +25,7 @@ **Full Changelog**: https://github.com/opentensor/btcli/compare/v9.8.0...v9.8.1 -## 9.8.0/2025-07-07 +## 9.8.0 /2025-07-07 ## What's Changed * Feat/logo urls in subnet identity by @ibraheem-abe in https://github.com/opentensor/btcli/pull/504 @@ -36,7 +41,7 @@ **Full Changelog**: https://github.com/opentensor/btcli/compare/v9.7.1...v9.8.0 -## 9.7.1/2025-06-26 +## 9.7.1 /2025-06-26 ## What's Changed * Convert hyperparams from strings by @thewhaleking in https://github.com/opentensor/btcli/pull/510 @@ -44,7 +49,7 @@ **Full Changelog**: https://github.com/opentensor/btcli/compare/v9.7.0...v9.7.1 -## 9.7.0/2025-06-16 +## 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 @@ -52,7 +57,7 @@ **Full Changelog**: https://github.com/opentensor/btcli/compare/v9.6.0...v9.7.0 -## 9.6.0/2025-06-12 +## 9.6.0 /2025-06-12 ## What's Changed * Allows for staking to multiple netuids in one btcli command by @thewhaleking in https://github.com/opentensor/btcli/pull/481 diff --git a/pyproject.toml b/pyproject.toml index d98e12829..0c011aba9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "bittensor-cli" -version = "9.8.2" +version = "9.8.3" description = "Bittensor CLI" readme = "README.md" authors = [