From 900d3fdcd7ea5837c9b7b7364903d1ca34af6c7f Mon Sep 17 00:00:00 2001 From: Roman Chkhaidze Date: Mon, 6 Oct 2025 18:41:05 -0700 Subject: [PATCH 1/7] update settings.py (`BT_NETWORK` -> `BT_SUBTENSOR_NETWORK`) --- bittensor/core/settings.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/bittensor/core/settings.py b/bittensor/core/settings.py index 29a744f33e..6ff48febbd 100644 --- a/bittensor/core/settings.py +++ b/bittensor/core/settings.py @@ -122,7 +122,7 @@ "subtensor": { "chain_endpoint": os.getenv("BT_SUBTENSOR_CHAIN_ENDPOINT") or DEFAULT_ENDPOINT, - "network": os.getenv("BT_NETWORK") or DEFAULT_NETWORK, + "network": os.getenv("BT_SUBTENSOR_NETWORK") or DEFAULT_NETWORK, "_mock": False, }, "wallet": { @@ -130,6 +130,9 @@ "hotkey": os.getenv("BT_WALLET_HOTKEY") or "default", "path": os.getenv("BT_WALLET_PATH") or str(WALLETS_DIR), }, + "config": False, + "strict": False, + "no_version_checking": False, } ) From 7240ccea90c8831ecbfd8bbad29507a6a0d688e1 Mon Sep 17 00:00:00 2001 From: Roman Chkhaidze Date: Mon, 6 Oct 2025 18:41:38 -0700 Subject: [PATCH 2/7] update config.py (check for `BT_PARSE_CLI_ARGS` added) --- bittensor/core/config.py | 39 ++++++++++++++++++++++----------------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/bittensor/core/config.py b/bittensor/core/config.py index 2fb3d8495b..0d132c369d 100644 --- a/bittensor/core/config.py +++ b/bittensor/core/config.py @@ -20,8 +20,8 @@ import os import sys from copy import deepcopy -from typing import Any, TypeVar, Type, Optional - +from typing import Any, Optional +from bittensor.core.settings import DEFAULTS import yaml from munch import DefaultMunch @@ -51,12 +51,29 @@ def __init__( parser: argparse.ArgumentParser = None, args: Optional[list[str]] = None, strict: bool = False, - default: Any = None, + default: Any = DEFAULTS, ) -> None: - super().__init__(default) + parse_cli = os.getenv("BT_PARSE_CLI_ARGS", "").lower() in ( + "1", + "true", + "yes", + "on", + ) + + # Fallback to defaults if not provided + default = deepcopy(default or DEFAULTS) + + if isinstance(default, DefaultMunch): + # Initialize Munch with defaults (dict-safe) + super().__init__(None, default.toDict()) + else: + # if defaults passed as dict + super().__init__(None, default) + self.__is_set = {} - if parser is None: + # If CLI parsing disabled, stop here + if not parse_cli or parser is None: return self._add_default_arguments(parser) @@ -234,15 +251,3 @@ def _add_default_arguments(self, parser: argparse.ArgumentParser) -> None: except argparse.ArgumentError: # this can fail if argument has already been added. pass - - -T = TypeVar("T", bound="DefaultConfig") - - -class DefaultConfig(Config): - """A Config with a set of default values.""" - - @classmethod - def default(cls: Type[T]) -> T: - """Get default config.""" - raise NotImplementedError("Function default is not implemented.") From 8b6011bce1db4144e9b4281bb70d15025c656c5c Mon Sep 17 00:00:00 2001 From: Roman Chkhaidze Date: Mon, 6 Oct 2025 18:41:48 -0700 Subject: [PATCH 3/7] update MIGRATION.md --- MIGRATION.md | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/MIGRATION.md b/MIGRATION.md index eae73d0174..fa720f6950 100644 --- a/MIGRATION.md +++ b/MIGRATION.md @@ -2,18 +2,12 @@ ## Extrinsics and related 1. ✅ Standardize parameter order across all extrinsics and related calls. Pass extrinsic-specific arguments first (e.g., wallet, hotkey, netuid, amount), followed by optional general flags (e.g., wait_for_inclusion, wait_for_finalization) - 2. ✅ Set `wait_for_inclusion` and `wait_for_finalization` to `True` by default in extrinsics and their related calls. Then we will guarantee the correct/expected extrinsic call response is consistent with the chain response. If the user changes those values, then it is the user's responsibility. 3. ✅ Make the internal logic of extrinsics the same. There are extrinsics that are slightly different in implementation. - 4. ✅ ~~Since SDK is not a responsible tool, try to remove all calculations inside extrinsics that do not affect the result, but are only used in logging. Actually, this should be applied not to extrinsics only but for all codebase.~~ Just improved regarding usage. - 5. ✅ Remove `unstake_all` parameter from `unstake_extrinsic` since we have `unstake_all_extrinsic`which is calles another subtensor function. - 6. ✅ `unstake` and `unstake_multiple` extrinsics should have `safe_unstaking` parameters instead of `safe_staking`. - 7. ✅ Remove `_do*` extrinsic calls and combine them with extrinsic logic. - 8. ✅ ~~`subtensor.get_transfer_fee` calls extrinsic inside the subtensor module. Actually the method could be updated by using `bittensor.core.extrinsics.utils.get_extrinsic_fee`.~~ (`get_transfer_fee` isn't `get_extrinsic_fee`) ## Subtensor @@ -35,15 +29,18 @@ ## Balance 1. ✅ In `bittensor.utils.balance._check_currencies` raise the error instead of `warnings.warn`. -2. ✅ In `bittensor.utils.balance.check_and_convert_to_balance` raise the error instead of `warnings.warn`. -This may seem like a harsh decision at first, but ultimately we will push the community to use Balance and there will be fewer errors in their calculations. Confusion with TAO and Alpha in calculations and display/printing/logging will be eliminated. +2. ✅ In `bittensor.utils.balance.check_and_convert_to_balance` raise the error instead of `warnings.warn`. This may + seem like a harsh decision at first, but ultimately we will push the community to use Balance and there will be fewer + errors in their calculations. Confusion with TAO and Alpha in calculations and display/printing/logging will be + eliminated. ## Common things 1. ✅ Reduce the amount of logging.info or transfer part of logging.info to logging.debug 2. ✅ To be consistent across all SDK regarding local environment variables name: -remove `BT_CHAIN_ENDPOINT` (settings.py :line 124) and use `BT_SUBTENSOR_CHAIN_ENDPOINT` instead of that. -rename this variable in documentation. + - remove `BT_CHAIN_ENDPOINT` (settings.py :line 124) and use `BT_SUBTENSOR_CHAIN_ENDPOINT` instead of that. + rename this variable in documentation. + - rename local env variable`BT_NETWORK` to `BT_SUBTENSOR_NETWORK` 3. ✅ ~~Move `bittensor.utils.get_transfer_fn_params` to `bittensor.core.extrinsics.utils`.~~ it's on the right place. @@ -70,7 +67,7 @@ rename this variable in documentation. 12. ✅ The SDK is dropping support for `Python 3.9` starting with this release. 13. ✅ Remove `Default is` and `Default to` in docstrings bc parameters enough. 14. ✅ `camfairchild`: TODO, but we should have a grab_metadata if we don't already. Maybe don't decode, but can have a call that removes the Raw prefix, and another just doing grab_metadata_raw (no decoding). `get_commitment_metadata` added. -15. Solve the issue when a script using SDK receives the `--config` cli parameter. Disable `argparse` processing by default and enable it only when using SOME? a local environment variable. +15. ✅ Resolve an issue where a script using the SDK receives the `--config` or any other CLI parameters used in the SDK. Disable configuration processing. Use default values ​​instead. 16. Find and process all `TODOs` across the entire code base. If in doubt, discuss each one with the team separately. SDK has 29 TODOs. ## New features @@ -322,3 +319,7 @@ Currently it contains: - [x] `check_and_convert_to_balance` renamed to `check_balance_amount` - [x] `check_balance_amount` raised `BalanceTypeError` error instead of deprecated warning message. - [x] private function `bittensor.utils.balance._check_currencies` raises `BalanceUnitMismatchError` error instead of deprecated warning message. This function is used inside the Balance class to check if units match during various mathematical and logical operations. + + +### ArgParser issue +- to turn on args parser across SDK, the local env variable `BT_PARSE_CLI_ARGS` should be set to on of the values: `1`, `true`, `yes`, `on`. From 7cabbc2a71eaeb8846c549ef210d2706eb320088 Mon Sep 17 00:00:00 2001 From: Roman Chkhaidze Date: Mon, 6 Oct 2025 18:41:54 -0700 Subject: [PATCH 4/7] add tests --- .../test_config_does_not_process_cli_args.py | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 tests/integration_tests/test_config_does_not_process_cli_args.py diff --git a/tests/integration_tests/test_config_does_not_process_cli_args.py b/tests/integration_tests/test_config_does_not_process_cli_args.py new file mode 100644 index 0000000000..235e96901c --- /dev/null +++ b/tests/integration_tests/test_config_does_not_process_cli_args.py @@ -0,0 +1,51 @@ +import argparse +import sys + +import pytest + +import bittensor as bt +from bittensor.core.config import InvalidConfigFile + + +def _config_call(): + """Create a config object from the bt cli args.""" + parser = argparse.ArgumentParser() + bt.Axon.add_args(parser) + bt.Subtensor.add_args(parser) + bt.AsyncSubtensor.add_args(parser) + bt.Wallet.add_args(parser) + bt.logging.add_args(parser) + bt.PriorityThreadPoolExecutor.add_args(parser) + config = bt.Config(parser) + return config + + +TEST_ARGS = [ + "bittensor", + "--config", "path/to/config.yaml", + "--strict", + "--no_version_checking" +] + + +def test_bittensor_cli_parser_enabled(monkeypatch): + """Tests that the bt cli args are processed.""" + monkeypatch.setenv("BT_PARSE_CLI_ARGS", "true") + + monkeypatch.setattr(sys, "argv", TEST_ARGS) + + with pytest.raises(InvalidConfigFile) as error: + _config_call() + + assert "No such file or directory" in str(error) + + +def test_bittensor_cli_parser_disabled(monkeypatch): + """Tests that the bt cli args are not processed.""" + monkeypatch.setattr(sys, "argv", TEST_ARGS) + + config = _config_call() + + assert config.config is False + assert config.strict is False + assert config.no_version_checking is False From 7b0bb63dd7555caf75f32d7df313453d3b6973b9 Mon Sep 17 00:00:00 2001 From: Roman Chkhaidze Date: Mon, 6 Oct 2025 18:54:39 -0700 Subject: [PATCH 5/7] update MIGRATION.md --- MIGRATION.md | 1 + 1 file changed, 1 insertion(+) diff --git a/MIGRATION.md b/MIGRATION.md index fa720f6950..d248ac331b 100644 --- a/MIGRATION.md +++ b/MIGRATION.md @@ -323,3 +323,4 @@ Currently it contains: ### ArgParser issue - to turn on args parser across SDK, the local env variable `BT_PARSE_CLI_ARGS` should be set to on of the values: `1`, `true`, `yes`, `on`. +- `bittensor.core.config.DefaultConfig` class has been deleted (unused). \ No newline at end of file From 7fd5b5954a533e6ae7991e631335a80b139b7174 Mon Sep 17 00:00:00 2001 From: Roman Chkhaidze Date: Mon, 6 Oct 2025 19:42:21 -0700 Subject: [PATCH 6/7] revers logic --- bittensor/core/config.py | 4 ++-- .../test_config_does_not_process_cli_args.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/bittensor/core/config.py b/bittensor/core/config.py index 0d132c369d..2f979e2b65 100644 --- a/bittensor/core/config.py +++ b/bittensor/core/config.py @@ -53,7 +53,7 @@ def __init__( strict: bool = False, default: Any = DEFAULTS, ) -> None: - parse_cli = os.getenv("BT_PARSE_CLI_ARGS", "").lower() in ( + no_parse_cli = os.getenv("BT_NO_PARSE_CLI_ARGS", "").lower() in ( "1", "true", "yes", @@ -73,7 +73,7 @@ def __init__( self.__is_set = {} # If CLI parsing disabled, stop here - if not parse_cli or parser is None: + if no_parse_cli or parser is None: return self._add_default_arguments(parser) diff --git a/tests/integration_tests/test_config_does_not_process_cli_args.py b/tests/integration_tests/test_config_does_not_process_cli_args.py index 235e96901c..63c67a3224 100644 --- a/tests/integration_tests/test_config_does_not_process_cli_args.py +++ b/tests/integration_tests/test_config_does_not_process_cli_args.py @@ -30,7 +30,6 @@ def _config_call(): def test_bittensor_cli_parser_enabled(monkeypatch): """Tests that the bt cli args are processed.""" - monkeypatch.setenv("BT_PARSE_CLI_ARGS", "true") monkeypatch.setattr(sys, "argv", TEST_ARGS) @@ -42,6 +41,7 @@ def test_bittensor_cli_parser_enabled(monkeypatch): def test_bittensor_cli_parser_disabled(monkeypatch): """Tests that the bt cli args are not processed.""" + monkeypatch.setenv("BT_NO_PARSE_CLI_ARGS", "true") monkeypatch.setattr(sys, "argv", TEST_ARGS) config = _config_call() From 13f3eb310af83c9295a37f3fcd960fa9be73e85b Mon Sep 17 00:00:00 2001 From: Roman Chkhaidze Date: Mon, 6 Oct 2025 20:11:43 -0700 Subject: [PATCH 7/7] flaky test --- tests/e2e_tests/test_commit_weights.py | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/tests/e2e_tests/test_commit_weights.py b/tests/e2e_tests/test_commit_weights.py index 9cc7fd7d2a..48e79383fb 100644 --- a/tests/e2e_tests/test_commit_weights.py +++ b/tests/e2e_tests/test_commit_weights.py @@ -298,7 +298,7 @@ def test_commit_weights_uses_next_nonce(subtensor, alice_wallet): Raises: AssertionError: If any of the checks or verifications fail """ - TEMPO_TO_SET = 50 if subtensor.chain.is_fast_blocks() else 20 + TEMPO_TO_SET = 100 if subtensor.chain.is_fast_blocks() else 20 # Create and prepare subnet alice_sn = TestSubnet(subtensor) @@ -422,7 +422,7 @@ async def test_commit_weights_uses_next_nonce_async(async_subtensor, alice_walle Raises: AssertionError: If any of the checks or verifications fail """ - TEMPO_TO_SET = 50 if await async_subtensor.chain.is_fast_blocks() else 20 + TEMPO_TO_SET = 100 if await async_subtensor.chain.is_fast_blocks() else 20 # Create and prepare subnet alice_sn = TestSubnet(async_subtensor) @@ -555,12 +555,21 @@ async def send_commit_(): ) await async_subtensor.wait_for_block(waiting_block) + weight_commits = None + counter = 0 # Query the WeightCommits storage map for all three salts - weight_commits = await async_subtensor.queries.query_module( - module="SubtensorModule", - name="WeightCommits", - params=[alice_sn.netuid, alice_wallet.hotkey.ss58_address], - ) + while not weight_commits or not len(weight_commits) == AMOUNT_OF_COMMIT_WEIGHTS: + weight_commits = await async_subtensor.queries.query_module( + module="SubtensorModule", + name="WeightCommits", + params=[alice_sn.netuid, alice_wallet.hotkey.ss58_address], + ) + await async_subtensor.wait_for_block() + logging.console.info(f"len(weight_commits): {len(weight_commits)}") + counter += 1 + if counter > TEMPO_TO_SET: + break + # Assert that the committed weights are set correctly assert weight_commits.value is not None, "Weight commit not found in storage" commit_hash, commit_block, reveal_block, expire_block = weight_commits.value[0]