From 80ba1c9bbe246ef0f5310501556076fa2caaa664 Mon Sep 17 00:00:00 2001 From: Benjamin Himes Date: Fri, 29 Nov 2024 12:32:51 +0200 Subject: [PATCH 1/9] Sorted netuids in `btcli r get-weights` --- bittensor_cli/src/commands/root.py | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/bittensor_cli/src/commands/root.py b/bittensor_cli/src/commands/root.py index 0af9c4ebb..1dde73df1 100644 --- a/bittensor_cli/src/commands/root.py +++ b/bittensor_cli/src/commands/root.py @@ -866,11 +866,13 @@ async def get_weights( uid_to_weights[uid][netuid] = normalized_weight rows: list[list[str]] = [] + sorted_netuids: list = list(netuids) + sorted_netuids.sort() for uid in uid_to_weights: row = [str(uid)] uid_weights = uid_to_weights[uid] - for netuid in netuids: + for netuid in sorted_netuids: if netuid in uid_weights: row.append("{:0.2f}%".format(uid_weights[netuid] * 100)) else: @@ -879,24 +881,23 @@ async def get_weights( if not no_cache: db_cols = [("UID", "INTEGER")] - for netuid in netuids: + for netuid in sorted_netuids: db_cols.append((f"_{netuid}", "TEXT")) create_table("rootgetweights", db_cols, rows) - netuids = list(netuids) update_metadata_table( "rootgetweights", - {"rows": json.dumps(rows), "netuids": json.dumps(netuids)}, + {"rows": json.dumps(rows), "netuids": json.dumps(sorted_netuids)}, ) else: metadata = get_metadata_table("rootgetweights") rows = json.loads(metadata["rows"]) - netuids = json.loads(metadata["netuids"]) + sorted_netuids = json.loads(metadata["netuids"]) _min_lim = limit_min_col if limit_min_col is not None else 0 - _max_lim = limit_max_col + 1 if limit_max_col is not None else len(netuids) - _max_lim = min(_max_lim, len(netuids)) + _max_lim = limit_max_col + 1 if limit_max_col is not None else len(sorted_netuids) + _max_lim = min(_max_lim, len(sorted_netuids)) - if _min_lim is not None and _min_lim > len(netuids): + if _min_lim is not None and _min_lim > len(sorted_netuids): err_console.print("Minimum limit greater than number of netuids") return @@ -915,8 +916,7 @@ async def get_weights( style="rgb(50,163,219)", no_wrap=True, ) - netuids = list(netuids) - for netuid in netuids[_min_lim:_max_lim]: + for netuid in sorted_netuids[_min_lim:_max_lim]: table.add_column( f"[white]{netuid}", header_style="overline white", @@ -939,7 +939,7 @@ async def get_weights( else: html_cols = [{"title": "UID", "field": "UID"}] - for netuid in netuids[_min_lim:_max_lim]: + for netuid in sorted_netuids[_min_lim:_max_lim]: html_cols.append({"title": str(netuid), "field": f"_{netuid}"}) render_table( "rootgetweights", From fc48a28a68d8ae876a3c3ddda85c08790fc4a737 Mon Sep 17 00:00:00 2001 From: Benjamin Himes Date: Mon, 2 Dec 2024 15:03:22 +0200 Subject: [PATCH 2/9] Sometimes err_docs is a string. We want to handle this properly. --- bittensor_cli/src/bittensor/utils.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/bittensor_cli/src/bittensor/utils.py b/bittensor_cli/src/bittensor/utils.py index 69d26515a..88cfff7bc 100644 --- a/bittensor_cli/src/bittensor/utils.py +++ b/bittensor_cli/src/bittensor/utils.py @@ -536,7 +536,12 @@ def format_error_message( err_type = error_message.get("type", err_type) err_name = error_message.get("name", err_name) err_docs = error_message.get("docs", [err_description]) - err_description = err_docs[0] if err_docs else err_description + if not err_docs: + err_description = err_description + elif isinstance(err_docs, str): + err_description = err_docs + else: + err_description = err_docs[0] return f"Subtensor returned `{err_name}({err_type})` error. This means: '{err_description}'." From 4f3e351de8a5c7d5774c375f6006fa0be1f98876 Mon Sep 17 00:00:00 2001 From: Benjamin Himes Date: Mon, 2 Dec 2024 18:13:23 +0200 Subject: [PATCH 3/9] Changes hyperparams to list whether they need to be run sudo, and handles this. --- bittensor_cli/src/__init__.py | 53 +++++++++++++++--------------- bittensor_cli/src/commands/sudo.py | 10 ++++-- 2 files changed, 35 insertions(+), 28 deletions(-) diff --git a/bittensor_cli/src/__init__.py b/bittensor_cli/src/__init__.py index a5ca2170a..bba2fdc34 100644 --- a/bittensor_cli/src/__init__.py +++ b/bittensor_cli/src/__init__.py @@ -318,32 +318,33 @@ class WalletValidationTypes(Enum): HYPERPARAMS = { - "rho": "sudo_set_rho", - "kappa": "sudo_set_kappa", - "immunity_period": "sudo_set_immunity_period", - "min_allowed_weights": "sudo_set_min_allowed_weights", - "max_weights_limit": "sudo_set_max_weight_limit", - "tempo": "sudo_set_tempo", - "min_difficulty": "sudo_set_min_difficulty", - "max_difficulty": "sudo_set_max_difficulty", - "weights_version": "sudo_set_weights_version_key", - "weights_rate_limit": "sudo_set_weights_set_rate_limit", - "adjustment_interval": "sudo_set_adjustment_interval", - "activity_cutoff": "sudo_set_activity_cutoff", - "target_regs_per_interval": "sudo_set_target_registrations_per_interval", - "min_burn": "sudo_set_min_burn", - "max_burn": "sudo_set_max_burn", - "bonds_moving_avg": "sudo_set_bonds_moving_average", - "max_regs_per_block": "sudo_set_max_registrations_per_block", - "serving_rate_limit": "sudo_set_serving_rate_limit", - "max_validators": "sudo_set_max_allowed_validators", - "adjustment_alpha": "sudo_set_adjustment_alpha", - "difficulty": "sudo_set_difficulty", - "commit_reveal_weights_interval": "sudo_set_commit_reveal_weights_interval", - "commit_reveal_weights_enabled": "sudo_set_commit_reveal_weights_enabled", - "alpha_values": "sudo_set_alpha_values", - "liquid_alpha_enabled": "sudo_set_liquid_alpha_enabled", - "registration_allowed": "sudo_set_network_registration_allowed", + # btcli name: (subtensor method, sudo bool) + "rho": ("sudo_set_rho", False), + "kappa": ("sudo_set_kappa", False), + "immunity_period": ("sudo_set_immunity_period", False), + "min_allowed_weights": ("sudo_set_min_allowed_weights", False), + "max_weights_limit": ("sudo_set_max_weight_limit", False), + "tempo": ("sudo_set_tempo", True), + "min_difficulty": ("sudo_set_min_difficulty", False), + "max_difficulty": ("sudo_set_max_difficulty", False), + "weights_version": ("sudo_set_weights_version_key", False), + "weights_rate_limit": ("sudo_set_weights_set_rate_limit", False), + "adjustment_interval": ("sudo_set_adjustment_interval", True), + "activity_cutoff": ("sudo_set_activity_cutoff", False), + "target_regs_per_interval": ("sudo_set_target_registrations_per_interval", True), + "min_burn": ("sudo_set_min_burn", False), + "max_burn": ("sudo_set_max_burn", False), + "bonds_moving_avg": ("sudo_set_bonds_moving_average", False), + "max_regs_per_block": ("sudo_set_max_registrations_per_block", True), + "serving_rate_limit": ("sudo_set_serving_rate_limit", False), + "max_validators": ("sudo_set_max_allowed_validators", True), + "adjustment_alpha": ("sudo_set_adjustment_alpha", False), + "difficulty": ("sudo_set_difficulty", False), + "commit_reveal_weights_interval": ("sudo_set_commit_reveal_weights_interval", False), + "commit_reveal_weights_enabled": ("sudo_set_commit_reveal_weights_enabled", False), + "alpha_values": ("sudo_set_alpha_values", False), + "liquid_alpha_enabled": ("sudo_set_liquid_alpha_enabled", False), + "registration_allowed": ("sudo_set_network_registration_allowed", False), } # Help Panels for cli help diff --git a/bittensor_cli/src/commands/sudo.py b/bittensor_cli/src/commands/sudo.py index 5c0057ce1..2be3c0f64 100644 --- a/bittensor_cli/src/commands/sudo.py +++ b/bittensor_cli/src/commands/sudo.py @@ -104,7 +104,7 @@ async def set_hyperparameter_extrinsic( if not unlock_key(wallet).success: return False - extrinsic = HYPERPARAMS.get(parameter) + extrinsic, sudo_ = HYPERPARAMS.get(parameter, ("", False)) if extrinsic is None: err_console.print(":cross_mark: [red]Invalid hyperparameter specified.[/red]") return False @@ -144,11 +144,17 @@ async def set_hyperparameter_extrinsic( call_params[str(value_argument["name"])] = value # create extrinsic call - call = await substrate.compose_call( + call_ = await substrate.compose_call( call_module="AdminUtils", call_function=extrinsic, call_params=call_params, ) + if sudo_: + call = await substrate.compose_call( + call_module="Sudo", call_function="sudo", call_params={"call": call_} + ) + else: + call = call_ success, err_msg = await subtensor.sign_and_send_extrinsic( call, wallet, wait_for_inclusion, wait_for_finalization ) From 3765a7e8c3b037d7e20940213c75ffb4bc2f141c Mon Sep 17 00:00:00 2001 From: Benjamin Himes Date: Tue, 3 Dec 2024 22:07:21 +0200 Subject: [PATCH 4/9] Only show hyperparams during `sudo set` if param name and value are not specified. --- bittensor_cli/cli.py | 12 ++++++------ bittensor_cli/src/__init__.py | 5 ++++- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/bittensor_cli/cli.py b/bittensor_cli/cli.py index 55eb4098e..98d583753 100755 --- a/bittensor_cli/cli.py +++ b/bittensor_cli/cli.py @@ -3884,12 +3884,12 @@ def sudo_set( """ self.verbosity_handler(quiet, verbose) - hyperparams = self._run_command( - sudo.get_hyperparameters(self.initialize_chain(network), netuid) - ) - - if not hyperparams: - raise typer.Exit() + if not param_name and not param_value: + hyperparams = self._run_command( + sudo.get_hyperparameters(self.initialize_chain(network), netuid) + ) + if not hyperparams: + raise typer.Exit() if not param_name: hyperparam_list = [field.name for field in fields(SubnetHyperparameters)] diff --git a/bittensor_cli/src/__init__.py b/bittensor_cli/src/__init__.py index bba2fdc34..0d3e67de5 100644 --- a/bittensor_cli/src/__init__.py +++ b/bittensor_cli/src/__init__.py @@ -340,7 +340,10 @@ class WalletValidationTypes(Enum): "max_validators": ("sudo_set_max_allowed_validators", True), "adjustment_alpha": ("sudo_set_adjustment_alpha", False), "difficulty": ("sudo_set_difficulty", False), - "commit_reveal_weights_interval": ("sudo_set_commit_reveal_weights_interval", False), + "commit_reveal_weights_interval": ( + "sudo_set_commit_reveal_weights_interval", + False, + ), "commit_reveal_weights_enabled": ("sudo_set_commit_reveal_weights_enabled", False), "alpha_values": ("sudo_set_alpha_values", False), "liquid_alpha_enabled": ("sudo_set_liquid_alpha_enabled", False), From abf8a344823ba1363fc40a468a65a29d922cc378 Mon Sep 17 00:00:00 2001 From: Benjamin Himes Date: Tue, 3 Dec 2024 22:07:21 +0200 Subject: [PATCH 5/9] Only show hyperparams during `sudo set` if param name and value are not specified. --- bittensor_cli/cli.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bittensor_cli/cli.py b/bittensor_cli/cli.py index 98d583753..29e095e82 100755 --- a/bittensor_cli/cli.py +++ b/bittensor_cli/cli.py @@ -3884,7 +3884,7 @@ def sudo_set( """ self.verbosity_handler(quiet, verbose) - if not param_name and not param_value: + if not param_name or not param_value: hyperparams = self._run_command( sudo.get_hyperparameters(self.initialize_chain(network), netuid) ) From 0b8782e8f631d125adb37a7779cdd432258213cf Mon Sep 17 00:00:00 2001 From: Benjamin Himes Date: Wed, 4 Dec 2024 18:34:10 +0200 Subject: [PATCH 6/9] Updates the `--help` for `st children set` and `st children revoke`. --- bittensor_cli/cli.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bittensor_cli/cli.py b/bittensor_cli/cli.py index 55eb4098e..e14d6bfe1 100755 --- a/bittensor_cli/cli.py +++ b/bittensor_cli/cli.py @@ -3659,7 +3659,7 @@ def stake_set_children( prompt: bool = Options.prompt, ): """ - Set child hotkeys on specified subnets. + Set child hotkeys on a specified subnet (or all). Overrides currently set children. Users can specify the 'proportion' to delegate to child hotkeys (ss58 address). The sum of proportions cannot be greater than 1. @@ -3744,7 +3744,7 @@ def stake_revoke_children( prompt: bool = Options.prompt, ): """ - Remove all children hotkeys on a specified subnet. + Remove all children hotkeys on a specified subnet (or all). This command is used to remove delegated authority from all child hotkeys, removing their position and influence on the subnet. From f58ffaf45eda920cae845b9033b1fd7add4b78a1 Mon Sep 17 00:00:00 2001 From: Benjamin Himes Date: Fri, 6 Dec 2024 01:12:44 +0200 Subject: [PATCH 7/9] Removes custom error metadata pulling because it pulls the wrong data. --- .../src/bittensor/extrinsics/registration.py | 7 ++-- .../src/bittensor/extrinsics/root.py | 4 +-- .../src/bittensor/extrinsics/transfer.py | 4 +-- .../src/bittensor/subtensor_interface.py | 8 ++--- bittensor_cli/src/bittensor/utils.py | 32 +++---------------- .../src/commands/stake/children_hotkeys.py | 6 ++-- bittensor_cli/src/commands/subnets.py | 2 +- bittensor_cli/src/commands/weights.py | 16 +++------- 8 files changed, 22 insertions(+), 57 deletions(-) diff --git a/bittensor_cli/src/bittensor/extrinsics/registration.py b/bittensor_cli/src/bittensor/extrinsics/registration.py index 84f761a80..fcd52cb87 100644 --- a/bittensor_cli/src/bittensor/extrinsics/registration.py +++ b/bittensor_cli/src/bittensor/extrinsics/registration.py @@ -618,10 +618,7 @@ async def get_neuron_for_pubkey_and_subnet(): if not success: success, err_msg = ( False, - format_error_message( - await response.error_message, - substrate=subtensor.substrate, - ), + format_error_message(await response.error_message), ) # Look error here # https://github.com/opentensor/subtensor/blob/development/pallets/subtensor/src/errors.rs @@ -795,7 +792,7 @@ async def run_faucet_extrinsic( if not await response.is_success: err_console.print( f":cross_mark: [red]Failed[/red]: " - f"{format_error_message(await response.error_message, subtensor.substrate)}" + f"{format_error_message(await response.error_message)}" ) if attempts == max_allowed_attempts: raise MaxAttemptsException diff --git a/bittensor_cli/src/bittensor/extrinsics/root.py b/bittensor_cli/src/bittensor/extrinsics/root.py index 22ed70a04..cdb28fd6e 100644 --- a/bittensor_cli/src/bittensor/extrinsics/root.py +++ b/bittensor_cli/src/bittensor/extrinsics/root.py @@ -486,11 +486,11 @@ async def _do_set_weights(): console.print(":white_heavy_check_mark: [green]Finalized[/green]") return True else: - fmt_err = format_error_message(error_message, subtensor.substrate) + fmt_err = format_error_message(error_message) err_console.print(f":cross_mark: [red]Failed[/red]: {fmt_err}") return False except SubstrateRequestException as e: - fmt_err = format_error_message(e, subtensor.substrate) + fmt_err = format_error_message(e) err_console.print(":cross_mark: [red]Failed[/red]: error:{}".format(fmt_err)) return False diff --git a/bittensor_cli/src/bittensor/extrinsics/transfer.py b/bittensor_cli/src/bittensor/extrinsics/transfer.py index 3ca657cab..127fb4880 100644 --- a/bittensor_cli/src/bittensor/extrinsics/transfer.py +++ b/bittensor_cli/src/bittensor/extrinsics/transfer.py @@ -67,7 +67,7 @@ async def get_transfer_fee() -> Balance: payment_info = {"partialFee": int(2e7)} # assume 0.02 Tao err_console.print( f":cross_mark: [red]Failed to get payment info[/red]:[bold white]\n" - f" {format_error_message(e, subtensor.substrate)}[/bold white]\n" + f" {format_error_message(e)}[/bold white]\n" f" Defaulting to default transfer fee: {payment_info['partialFee']}" ) @@ -104,7 +104,7 @@ async def do_transfer() -> tuple[bool, str, str]: return ( False, "", - format_error_message(await response.error_message, subtensor.substrate), + format_error_message(await response.error_message), ) # Validate destination address. diff --git a/bittensor_cli/src/bittensor/subtensor_interface.py b/bittensor_cli/src/bittensor/subtensor_interface.py index 54ca20b61..8f97e58de 100644 --- a/bittensor_cli/src/bittensor/subtensor_interface.py +++ b/bittensor_cli/src/bittensor/subtensor_interface.py @@ -913,11 +913,9 @@ async def sign_and_send_extrinsic( if await response.is_success: return True, "" else: - return False, format_error_message( - await response.error_message, substrate=self.substrate - ) + return False, format_error_message(await response.error_message) except SubstrateRequestException as e: - return False, format_error_message(e, substrate=self.substrate) + return False, format_error_message(e) async def get_children(self, hotkey, netuid) -> tuple[bool, list, str]: """ @@ -947,7 +945,7 @@ async def get_children(self, hotkey, netuid) -> tuple[bool, list, str]: else: return True, [], "" except SubstrateRequestException as e: - return False, [], format_error_message(e, self.substrate) + return False, [], format_error_message(e) async def get_subnet_hyperparameters( self, netuid: int, block_hash: Optional[str] = None diff --git a/bittensor_cli/src/bittensor/utils.py b/bittensor_cli/src/bittensor/utils.py index 88cfff7bc..71d5e12ac 100644 --- a/bittensor_cli/src/bittensor/utils.py +++ b/bittensor_cli/src/bittensor/utils.py @@ -458,16 +458,13 @@ def get_explorer_url_for_network( return explorer_urls -def format_error_message( - error_message: Union[dict, Exception], substrate: "AsyncSubstrateInterface" -) -> str: +def format_error_message(error_message: Union[dict, Exception]) -> str: """ Formats an error message from the Subtensor error information for use in extrinsics. Args: error_message: A dictionary containing the error information from Subtensor, or a SubstrateRequestException containing dictionary literal args. - substrate: The initialised SubstrateInterface object to use. Returns: str: A formatted error message string. @@ -509,22 +506,8 @@ def format_error_message( err_data = error_message.get("data", "") # subtensor custom error marker - if err_data.startswith("Custom error:") and substrate: - if substrate.metadata: - try: - pallet = substrate.metadata.get_metadata_pallet( - "SubtensorModule" - ) - error_index = int(err_data.split("Custom error:")[-1]) - - error_dict = pallet.errors[error_index].value - err_type = error_dict.get("message", err_type) - err_docs = error_dict.get("docs", []) - err_description = err_docs[0] if err_docs else err_description - except (AttributeError, IndexError): - err_console.print( - "Substrate pallets data unavailable. This is usually caused by an uninitialized substrate." - ) + if err_data.startswith("Custom error:"): + err_description = f"{err_data} | Please consult https://docs.bittensor.com/subtensor-nodes/subtensor-error-messages" else: err_description = err_data @@ -536,14 +519,9 @@ def format_error_message( err_type = error_message.get("type", err_type) err_name = error_message.get("name", err_name) err_docs = error_message.get("docs", [err_description]) - if not err_docs: - err_description = err_description - elif isinstance(err_docs, str): - err_description = err_docs - else: - err_description = err_docs[0] + err_description = err_docs[0] if err_docs else err_description - return f"Subtensor returned `{err_name}({err_type})` error. This means: '{err_description}'." + return f"Subtensor returned `{err_name}({err_type})` error. This means: `{err_description}`." def convert_blocks_to_time(blocks: int, block_time: int = 12) -> tuple[int, int, int]: diff --git a/bittensor_cli/src/commands/stake/children_hotkeys.py b/bittensor_cli/src/commands/stake/children_hotkeys.py index c64d486f6..2f9838907 100644 --- a/bittensor_cli/src/commands/stake/children_hotkeys.py +++ b/bittensor_cli/src/commands/stake/children_hotkeys.py @@ -208,7 +208,7 @@ async def set_childkey_take_extrinsic( except SubstrateRequestException as e: return ( False, - f"Exception occurred while setting childkey take: {format_error_message(e, subtensor.substrate)}", + f"Exception occurred while setting childkey take: {format_error_message(e)}", ) @@ -232,9 +232,7 @@ async def get_childkey_take(subtensor, hotkey: str, netuid: int) -> Optional[int return int(childkey_take_.value) except SubstrateRequestException as e: - err_console.print( - f"Error querying ChildKeys: {format_error_message(e, subtensor.substrate)}" - ) + err_console.print(f"Error querying ChildKeys: {format_error_message(e)}") return None diff --git a/bittensor_cli/src/commands/subnets.py b/bittensor_cli/src/commands/subnets.py index 51ce3708b..39e1231b4 100644 --- a/bittensor_cli/src/commands/subnets.py +++ b/bittensor_cli/src/commands/subnets.py @@ -128,7 +128,7 @@ async def _find_event_attributes_in_extrinsic_receipt( await response.process_events() if not await response.is_success: err_console.print( - f":cross_mark: [red]Failed[/red]: {format_error_message(await response.error_message, substrate)}" + f":cross_mark: [red]Failed[/red]: {format_error_message(await response.error_message)}" ) await asyncio.sleep(0.5) return False diff --git a/bittensor_cli/src/commands/weights.py b/bittensor_cli/src/commands/weights.py index 33988cf94..90d26d434 100644 --- a/bittensor_cli/src/commands/weights.py +++ b/bittensor_cli/src/commands/weights.py @@ -134,9 +134,7 @@ async def commit_weights( try: success, message = await self.do_commit_weights(commit_hash=commit_hash) except SubstrateRequestException as e: - err_console.print( - f"Error committing weights: {format_error_message(e, self.subtensor.substrate)}" - ) + err_console.print(f"Error committing weights: {format_error_message(e)}") # bittensor.logging.error(f"Error committing weights: {e}") success = False message = "No attempt made. Perhaps it is too soon to commit weights!" @@ -257,7 +255,7 @@ async def _do_set_weights(): wait_for_finalization=self.wait_for_finalization, ) except SubstrateRequestException as e: - return False, format_error_message(e, self.subtensor.substrate) + return False, format_error_message(e) # We only wait here if we expect finalization. if not self.wait_for_finalization and not self.wait_for_inclusion: return True, "Not waiting for finalization or inclusion." @@ -266,9 +264,7 @@ async def _do_set_weights(): if await response.is_success: return True, "Successfully set weights." else: - return False, format_error_message( - await response.error_message, self.subtensor.substrate - ) + return False, format_error_message(await response.error_message) with console.status( f":satellite: Setting weights on [white]{self.subtensor.network}[/white] ..." @@ -314,7 +310,7 @@ async def reveal_weights_extrinsic( wait_for_finalization=self.wait_for_finalization, ) except SubstrateRequestException as e: - return False, format_error_message(e, self.subtensor.substrate) + return False, format_error_message(e) if not self.wait_for_finalization and not self.wait_for_inclusion: success, error_message = True, "" @@ -326,9 +322,7 @@ async def reveal_weights_extrinsic( else: success, error_message = ( False, - format_error_message( - await response.error_message, self.subtensor.substrate - ), + format_error_message(await response.error_message), ) if success: From e9ee4ce94ad0228e92dae0fe336ea3d3dc0d0c79 Mon Sep 17 00:00:00 2001 From: ibraheem-opentensor Date: Thu, 5 Dec 2024 15:42:36 -0800 Subject: [PATCH 8/9] Updates bt-decode to 0.4.0 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index c35276f24..4aa89c36e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -17,4 +17,4 @@ substrate-interface~=1.7.9 typer~=0.12 websockets>=14.1 bittensor-wallet>=2.1.3 -bt-decode==0.2.0a0 \ No newline at end of file +bt-decode==0.4.0 \ No newline at end of file From 362b22f4e44bc637725fa2365a6b3194606936c6 Mon Sep 17 00:00:00 2001 From: ibraheem-opentensor Date: Thu, 5 Dec 2024 16:12:31 -0800 Subject: [PATCH 9/9] Bumps version and updates changelog --- CHANGELOG.md | 13 +++++++++++++ bittensor_cli/__init__.py | 2 +- bittensor_cli/cli.py | 2 +- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 034edbd33..dbf44bac9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,18 @@ # Changelog +## 8.4.1 /2024-12-05 + +## What's Changed +* Sometimes err_docs is a string. We want to handle this properly. by @thewhaleking in https://github.com/opentensor/btcli/pull/260 +* Sudo Hyperparams by @thewhaleking in https://github.com/opentensor/btcli/pull/261 +* Sorted netuids in `btcli r get-weights` by @thewhaleking in https://github.com/opentensor/btcli/pull/258 +* Show hyperparams during `sudo set` only sometimes by @thewhaleking in https://github.com/opentensor/btcli/pull/262 +* Update stake children help menu by @thewhaleking in https://github.com/opentensor/btcli/pull/264 +* Updates bt-decode to 0.4.0 by @ibraheem-opentensor in https://github.com/opentensor/btcli/pull/265 +* Backmerge main to staging for 8.4.1 by @ibraheem-opentensor in https://github.com/opentensor/btcli/pull/267 + +**Full Changelog**: https://github.com/opentensor/btcli/compare/v8.4.0...v8.4.1 + ## 8.4.0 /2024-11-27 ## What's Changed diff --git a/bittensor_cli/__init__.py b/bittensor_cli/__init__.py index f2e41a916..f8d1c3ab0 100644 --- a/bittensor_cli/__init__.py +++ b/bittensor_cli/__init__.py @@ -18,6 +18,6 @@ from .cli import CLIManager -__version__ = "8.4.0" +__version__ = "8.4.1" __all__ = ["CLIManager", "__version__"] diff --git a/bittensor_cli/cli.py b/bittensor_cli/cli.py index d09f0b5b6..892d56fa5 100755 --- a/bittensor_cli/cli.py +++ b/bittensor_cli/cli.py @@ -58,7 +58,7 @@ class GitError(Exception): pass -__version__ = "8.4.0" +__version__ = "8.4.1" _core_version = re.match(r"^\d+\.\d+\.\d+", __version__).group(0)