From 5b6c6c8bb005817e78f8e0d3c77e15347664e961 Mon Sep 17 00:00:00 2001 From: Benjamin Himes Date: Fri, 18 Jul 2025 14:29:03 +0200 Subject: [PATCH 1/6] `AsyncSubtensor.get_metagraph_info` was only using the block/hash specified when columns were specified. --- bittensor/core/async_subtensor.py | 1 + 1 file changed, 1 insertion(+) diff --git a/bittensor/core/async_subtensor.py b/bittensor/core/async_subtensor.py index 058bc10314..de18bd1413 100644 --- a/bittensor/core/async_subtensor.py +++ b/bittensor/core/async_subtensor.py @@ -2035,6 +2035,7 @@ async def get_metagraph_info( "SubnetInfoRuntimeApi", "get_metagraph", params=[netuid], + block_hash=block_hash, ) if query.value is None: From 41426a6ecd98aa415cbc6d4512447284c3d84814 Mon Sep 17 00:00:00 2001 From: Benjamin Himes Date: Fri, 18 Jul 2025 15:44:39 +0200 Subject: [PATCH 2/6] Also wrong on subnet_prices --- bittensor/core/subtensor.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bittensor/core/subtensor.py b/bittensor/core/subtensor.py index b64809ee15..76839bdff2 100644 --- a/bittensor/core/subtensor.py +++ b/bittensor/core/subtensor.py @@ -455,7 +455,7 @@ def all_subnets(self, block: Optional[int] = None) -> Optional[list["DynamicInfo method="get_all_dynamic_info", block_hash=block_hash, ) - subnet_prices = self.get_subnet_prices() + subnet_prices = self.get_subnet_prices(block=block) decoded = query.decode() for sn in decoded: sn.update({"price": subnet_prices.get(sn["netuid"], Balance.from_tao(0))}) From a5ddfd4d6c5c56d2f098936e494d640c2a56cf37 Mon Sep 17 00:00:00 2001 From: Benjamin Himes Date: Fri, 18 Jul 2025 15:45:15 +0200 Subject: [PATCH 3/6] Also wrong on async subnet prices --- bittensor/core/async_subtensor.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bittensor/core/async_subtensor.py b/bittensor/core/async_subtensor.py index de18bd1413..c04ea615f3 100644 --- a/bittensor/core/async_subtensor.py +++ b/bittensor/core/async_subtensor.py @@ -814,7 +814,7 @@ async def all_subnets( method="get_all_dynamic_info", block_hash=block_hash, ), - self.get_subnet_prices(), + self.get_subnet_prices(block_hash=block_hash), ) decoded = query.decode() From 51ad4f4239e943a605f910f254861a0403a0e6e9 Mon Sep 17 00:00:00 2001 From: Benjamin Himes Date: Fri, 18 Jul 2025 16:03:23 +0200 Subject: [PATCH 4/6] More missed --- bittensor/core/async_subtensor.py | 43 +++++++++++++++++++++---------- bittensor/core/subtensor.py | 22 +++++++++++----- 2 files changed, 45 insertions(+), 20 deletions(-) diff --git a/bittensor/core/async_subtensor.py b/bittensor/core/async_subtensor.py index c04ea615f3..aa6d8f93f9 100644 --- a/bittensor/core/async_subtensor.py +++ b/bittensor/core/async_subtensor.py @@ -815,12 +815,20 @@ async def all_subnets( block_hash=block_hash, ), self.get_subnet_prices(block_hash=block_hash), + return_exceptions=True, ) decoded = query.decode() - for sn in decoded: - sn.update({"price": subnet_prices.get(sn["netuid"], Balance.from_tao(0))}) + if not isinstance(subnet_prices, SubstrateRequestException): + for sn in decoded: + sn.update( + {"price": subnet_prices.get(sn["netuid"], Balance.from_tao(0))} + ) + else: + logging.warning( + f"Unable to fetch subnet prices for block {block_number}, block hash {block_hash}" + ) return DynamicInfo.list_from_dicts(decoded) async def blocks_since_last_step( @@ -1129,21 +1137,30 @@ async def get_all_subnets_info( Notes: See also: """ - result = await self.query_runtime_api( - runtime_api="SubnetInfoRuntimeApi", - method="get_subnets_info_v2", - params=[], - block=block, - block_hash=block_hash, - reuse_block=reuse_block, + result, prices = await asyncio.gather( + self.query_runtime_api( + runtime_api="SubnetInfoRuntimeApi", + method="get_subnets_info_v2", + params=[], + block=block, + block_hash=block_hash, + reuse_block=reuse_block, + ), + self.get_subnet_prices( + block=block, block_hash=block_hash, reuse_block=reuse_block + ), + return_exceptions=True, ) if not result: return [] - subnets_prices = await self.get_subnet_prices() - - for subnet in result: - subnet.update({"price": subnets_prices.get(subnet["netuid"], 0)}) + if not isinstance(prices, SubstrateRequestException): + for subnet in result: + subnet.update({"price": prices.get(subnet["netuid"], 0)}) + else: + logging.warning( + f"Unable to fetch subnet prices for block {block}, block hash {block_hash}" + ) return SubnetInfo.list_from_dicts(result) diff --git a/bittensor/core/subtensor.py b/bittensor/core/subtensor.py index 76839bdff2..728d9880c4 100644 --- a/bittensor/core/subtensor.py +++ b/bittensor/core/subtensor.py @@ -455,10 +455,16 @@ def all_subnets(self, block: Optional[int] = None) -> Optional[list["DynamicInfo method="get_all_dynamic_info", block_hash=block_hash, ) - subnet_prices = self.get_subnet_prices(block=block) decoded = query.decode() - for sn in decoded: - sn.update({"price": subnet_prices.get(sn["netuid"], Balance.from_tao(0))}) + try: + subnet_prices = self.get_subnet_prices(block=block) + for sn in decoded: + sn.update( + {"price": subnet_prices.get(sn["netuid"], Balance.from_tao(0))} + ) + except SubstrateRequestException: + logging.warning(f"Unable to fetch subnet prices for block {block}") + return DynamicInfo.list_from_dicts(decoded) def blocks_since_last_step( @@ -644,11 +650,13 @@ def get_all_subnets_info(self, block: Optional[int] = None) -> list["SubnetInfo" ) if not result: return [] + try: + subnets_prices = self.get_subnet_prices(block=block) - subnets_prices = self.get_subnet_prices() - - for subnet in result: - subnet.update({"price": subnets_prices.get(subnet["netuid"], 0)}) + for subnet in result: + subnet.update({"price": subnets_prices.get(subnet["netuid"], 0)}) + except SubstrateRequestException: + logging.warning(f"Unable to fetch subnet prices for block {block}") return SubnetInfo.list_from_dicts(result) From 9f47cf6ce805d078fde6e6c03eda4cf6e4aad8d6 Mon Sep 17 00:00:00 2001 From: Benjamin Himes Date: Fri, 18 Jul 2025 16:32:03 +0200 Subject: [PATCH 5/6] PR Suggestions --- bittensor/core/async_subtensor.py | 4 ++-- bittensor/core/subtensor.py | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/bittensor/core/async_subtensor.py b/bittensor/core/async_subtensor.py index aa6d8f93f9..bb46e4ddc9 100644 --- a/bittensor/core/async_subtensor.py +++ b/bittensor/core/async_subtensor.py @@ -827,7 +827,7 @@ async def all_subnets( ) else: logging.warning( - f"Unable to fetch subnet prices for block {block_number}, block hash {block_hash}" + f"Unable to fetch subnet prices for block {block_number}, block hash {block_hash}: {subnet_prices}" ) return DynamicInfo.list_from_dicts(decoded) @@ -1159,7 +1159,7 @@ async def get_all_subnets_info( subnet.update({"price": prices.get(subnet["netuid"], 0)}) else: logging.warning( - f"Unable to fetch subnet prices for block {block}, block hash {block_hash}" + f"Unable to fetch subnet prices for block {block}, block hash {block_hash}: {prices}" ) return SubnetInfo.list_from_dicts(result) diff --git a/bittensor/core/subtensor.py b/bittensor/core/subtensor.py index 728d9880c4..94e9b7dd91 100644 --- a/bittensor/core/subtensor.py +++ b/bittensor/core/subtensor.py @@ -462,8 +462,8 @@ def all_subnets(self, block: Optional[int] = None) -> Optional[list["DynamicInfo sn.update( {"price": subnet_prices.get(sn["netuid"], Balance.from_tao(0))} ) - except SubstrateRequestException: - logging.warning(f"Unable to fetch subnet prices for block {block}") + except SubstrateRequestException as e: + logging.warning(f"Unable to fetch subnet prices for block {block}: {e}") return DynamicInfo.list_from_dicts(decoded) @@ -656,7 +656,7 @@ def get_all_subnets_info(self, block: Optional[int] = None) -> list["SubnetInfo" for subnet in result: subnet.update({"price": subnets_prices.get(subnet["netuid"], 0)}) except SubstrateRequestException: - logging.warning(f"Unable to fetch subnet prices for block {block}") + logging.warning(f"Unable to fetch subnet prices for block {block}: {e}") return SubnetInfo.list_from_dicts(result) From 56ad8b45d0de5c6dc730df9fc941e6b58998a74b Mon Sep 17 00:00:00 2001 From: Benjamin Himes Date: Fri, 18 Jul 2025 16:39:03 +0200 Subject: [PATCH 6/6] Flake --- bittensor/core/subtensor.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bittensor/core/subtensor.py b/bittensor/core/subtensor.py index 94e9b7dd91..b4b35d334a 100644 --- a/bittensor/core/subtensor.py +++ b/bittensor/core/subtensor.py @@ -655,7 +655,7 @@ def get_all_subnets_info(self, block: Optional[int] = None) -> list["SubnetInfo" for subnet in result: subnet.update({"price": subnets_prices.get(subnet["netuid"], 0)}) - except SubstrateRequestException: + except SubstrateRequestException as e: logging.warning(f"Unable to fetch subnet prices for block {block}: {e}") return SubnetInfo.list_from_dicts(result)