From 1d2440764d09363c992cc471fc3615e9693ce51d Mon Sep 17 00:00:00 2001 From: Roman Chkhaidze Date: Wed, 22 Oct 2025 19:35:56 -0700 Subject: [PATCH 1/4] improve `subtensor.get_liquidity_list` --- bittensor/core/async_subtensor.py | 40 ++++++++++++++++++------------- bittensor/core/subtensor.py | 17 +++++++------ 2 files changed, 33 insertions(+), 24 deletions(-) diff --git a/bittensor/core/async_subtensor.py b/bittensor/core/async_subtensor.py index 50851218a4..1146535f53 100644 --- a/bittensor/core/async_subtensor.py +++ b/bittensor/core/async_subtensor.py @@ -2385,6 +2385,17 @@ async def get_liquidity_list( logging.debug(f"Subnet {netuid} is not active.") return None + positions_response = await self.query_map( + module="Swap", + name="Positions", + params=[netuid, wallet.coldkeypub.ss58_address], + block=block, + block_hash=block_hash, + reuse_block=reuse_block, + ) + if len(positions_response.records) == 0: + return [] + block_hash = await self.determine_block_hash( block=block, block_hash=block_hash, reuse_block=reuse_block ) @@ -2408,25 +2419,20 @@ async def get_liquidity_list( params=[netuid], block_hash=block_hash, ) + ( - (fee_global_tao_query, fee_global_alpha_query, sqrt_price_query), - positions_response, - ) = await asyncio.gather( - self.substrate.query_multi( - [ - fee_global_tao_query_sk, - fee_global_alpha_query_sk, - sqrt_price_query_sk, - ], - block_hash=block_hash, - ), - self.query_map( - module="Swap", - name="Positions", - block=block, - params=[netuid, wallet.coldkeypub.ss58_address], - ), + fee_global_tao_query, + fee_global_alpha_query, + sqrt_price_query, + ) = await self.substrate.query_multi( + storage_keys=[ + fee_global_tao_query_sk, + fee_global_alpha_query_sk, + sqrt_price_query_sk, + ], + block_hash=block_hash, ) + # convert to floats fee_global_tao = fixed_to_float(fee_global_tao_query[1]) fee_global_alpha = fixed_to_float(fee_global_alpha_query[1]) diff --git a/bittensor/core/subtensor.py b/bittensor/core/subtensor.py index 5866624777..ca3340da4d 100644 --- a/bittensor/core/subtensor.py +++ b/bittensor/core/subtensor.py @@ -1615,6 +1615,16 @@ def get_liquidity_list( logging.debug(f"Subnet {netuid} is not active.") return None + # Fetch positions + positions_response = self.query_map( + module="Swap", + name="Positions", + block=block, + params=[netuid, wallet.coldkeypub.ss58_address], + ) + if len(positions_response.records) == 0: + return [] + block_hash = self.determine_block_hash(block) # Fetch global fees and current price @@ -1652,13 +1662,6 @@ def get_liquidity_list( sqrt_price = fixed_to_float(sqrt_price_query[1]) current_tick = price_to_tick(sqrt_price**2) - # Fetch positions - positions_response = self.query_map( - module="Swap", - name="Positions", - block=block, - params=[netuid, wallet.coldkeypub.ss58_address], - ) positions_values: list[tuple[dict, int, int]] = [] positions_storage_keys: list[StorageKey] = [] for _, p in positions_response: From ee02f8be992a541fca8df5f079b73bfab20f7ba3 Mon Sep 17 00:00:00 2001 From: Roman Chkhaidze Date: Wed, 22 Oct 2025 19:36:33 -0700 Subject: [PATCH 2/4] update `test_liquidity` (non functional) --- tests/e2e_tests/test_liquidity.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/e2e_tests/test_liquidity.py b/tests/e2e_tests/test_liquidity.py index e037d81fba..fc539c656f 100644 --- a/tests/e2e_tests/test_liquidity.py +++ b/tests/e2e_tests/test_liquidity.py @@ -5,8 +5,7 @@ from bittensor.utils.liquidity import LiquidityPosition -@pytest.mark.asyncio -async def test_liquidity(local_chain, subtensor, alice_wallet, bob_wallet): +def test_liquidity(subtensor, alice_wallet, bob_wallet): """ Tests the liquidity mechanism From 59133957467852d3ca814034c5c5fea3d3bd2f68 Mon Sep 17 00:00:00 2001 From: Roman Chkhaidze Date: Wed, 22 Oct 2025 20:04:12 -0700 Subject: [PATCH 3/4] add storage_keys --- 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 ca3340da4d..5c9059d149 100644 --- a/bittensor/core/subtensor.py +++ b/bittensor/core/subtensor.py @@ -1648,7 +1648,7 @@ def get_liquidity_list( ) fee_global_tao_query, fee_global_alpha_query, sqrt_price_query = ( self.substrate.query_multi( - [ + storage_keys=[ fee_global_tao_query_sk, fee_global_alpha_query_sk, sqrt_price_query_sk, From 439a2e8136434b7ba21b61c15b5993dfb6a68497 Mon Sep 17 00:00:00 2001 From: Roman Chkhaidze Date: Wed, 22 Oct 2025 20:04:22 -0700 Subject: [PATCH 4/4] fix unit tests --- tests/unit_tests/test_async_subtensor.py | 6 ++++-- tests/unit_tests/test_subtensor.py | 7 +++++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/tests/unit_tests/test_async_subtensor.py b/tests/unit_tests/test_async_subtensor.py index 23b55b8a16..14c71165f3 100644 --- a/tests/unit_tests/test_async_subtensor.py +++ b/tests/unit_tests/test_async_subtensor.py @@ -3662,7 +3662,7 @@ async def test_get_liquidity_list_happy_path(subtensor, fake_wallet, mocker): ], ] - fake_result = mocker.AsyncMock(autospec=list) + fake_result = mocker.AsyncMock(records=fake_positions, autospec=list) fake_result.__aiter__.return_value = iter(fake_positions) mocked_query_map = mocker.AsyncMock(return_value=fake_result) @@ -3682,8 +3682,10 @@ async def test_get_liquidity_list_happy_path(subtensor, fake_wallet, mocker): mocked_query_map.assert_awaited_once_with( module="Swap", name="Positions", - block=None, params=[netuid, fake_wallet.coldkeypub.ss58_address], + block=None, + block_hash=None, + reuse_block=False, ) assert len(result) == len(fake_positions) assert all([isinstance(p, async_subtensor.LiquidityPosition) for p in result]) diff --git a/tests/unit_tests/test_subtensor.py b/tests/unit_tests/test_subtensor.py index d7411e02dc..295400d0aa 100644 --- a/tests/unit_tests/test_subtensor.py +++ b/tests/unit_tests/test_subtensor.py @@ -3868,7 +3868,10 @@ def test_get_liquidity_list_happy_path(subtensor, fake_wallet, mocker): ), ], ] - mocked_query_map = mocker.MagicMock(return_value=fake_positions) + fake_result = mocker.MagicMock(records=fake_positions, autospec=list) + fake_result.__iter__.return_value = iter(fake_positions) + + mocked_query_map = mocker.Mock(return_value=fake_result) mocker.patch.object(subtensor, "query_map", new=mocked_query_map) # Mock storage key creation @@ -3913,8 +3916,8 @@ def test_get_liquidity_list_happy_path(subtensor, fake_wallet, mocker): mocked_query_map.assert_called_once_with( module="Swap", name="Positions", - block=None, params=[netuid, fake_wallet.coldkeypub.ss58_address], + block=None, ) assert mock_query_multi.call_count == 2 # one for fees, one for ticks assert len(result) == len(fake_positions)