bittensor-cli 9.7.0__py3-none-any.whl → 9.8.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,200 @@
1
+ """
2
+ This module provides utilities for managing liquidity positions and price conversions in the Bittensor network. The
3
+ module handles conversions between TAO and Alpha tokens while maintaining precise calculations for liquidity
4
+ provisioning and fee distribution.
5
+ """
6
+
7
+ import math
8
+ from dataclasses import dataclass
9
+ from typing import Any
10
+
11
+ from rich.prompt import IntPrompt, FloatPrompt
12
+
13
+ from bittensor_cli.src.bittensor.balances import Balance, fixed_to_float
14
+ from bittensor_cli.src.bittensor.utils import (
15
+ console,
16
+ )
17
+
18
+ # These three constants are unchangeable at the level of Uniswap math
19
+ MIN_TICK = -887272
20
+ MAX_TICK = 887272
21
+ PRICE_STEP = 1.0001
22
+
23
+
24
+ @dataclass
25
+ class LiquidityPosition:
26
+ id: int
27
+ price_low: Balance # RAO
28
+ price_high: Balance # RAO
29
+ liquidity: Balance # TAO + ALPHA (sqrt by TAO balance * Alpha Balance -> math under the hood)
30
+ fees_tao: Balance # RAO
31
+ fees_alpha: Balance # RAO
32
+ netuid: int
33
+
34
+ def to_token_amounts(
35
+ self, current_subnet_price: Balance
36
+ ) -> tuple[Balance, Balance]:
37
+ """Convert a position to token amounts.
38
+
39
+ Arguments:
40
+ current_subnet_price: current subnet price in Alpha.
41
+
42
+ Returns:
43
+ tuple[int, int]:
44
+ Amount of Alpha in liquidity
45
+ Amount of TAO in liquidity
46
+
47
+ Liquidity is a combination of TAO and Alpha depending on the price of the subnet at the moment.
48
+ """
49
+ sqrt_price_low = math.sqrt(self.price_low)
50
+ sqrt_price_high = math.sqrt(self.price_high)
51
+ sqrt_current_subnet_price = math.sqrt(current_subnet_price)
52
+
53
+ if sqrt_current_subnet_price < sqrt_price_low:
54
+ amount_alpha = self.liquidity * (1 / sqrt_price_low - 1 / sqrt_price_high)
55
+ amount_tao = 0
56
+ elif sqrt_current_subnet_price > sqrt_price_high:
57
+ amount_alpha = 0
58
+ amount_tao = self.liquidity * (sqrt_price_high - sqrt_price_low)
59
+ else:
60
+ amount_alpha = self.liquidity * (
61
+ 1 / sqrt_current_subnet_price - 1 / sqrt_price_high
62
+ )
63
+ amount_tao = self.liquidity * (sqrt_current_subnet_price - sqrt_price_low)
64
+ return Balance.from_rao(int(amount_alpha)).set_unit(
65
+ self.netuid
66
+ ), Balance.from_rao(int(amount_tao))
67
+
68
+
69
+ def price_to_tick(price: float) -> int:
70
+ """Converts a float price to the nearest Uniswap V3 tick index."""
71
+ if price <= 0:
72
+ raise ValueError(f"Price must be positive, got `{price}`.")
73
+
74
+ tick = int(math.log(price) / math.log(PRICE_STEP))
75
+
76
+ if not (MIN_TICK <= tick <= MAX_TICK):
77
+ raise ValueError(
78
+ f"Resulting tick {tick} is out of allowed range ({MIN_TICK} to {MAX_TICK})"
79
+ )
80
+ return tick
81
+
82
+
83
+ def tick_to_price(tick: int) -> float:
84
+ """Convert an integer Uniswap V3 tick index to float price."""
85
+ if not (MIN_TICK <= tick <= MAX_TICK):
86
+ raise ValueError("Tick is out of allowed range")
87
+ return PRICE_STEP**tick
88
+
89
+
90
+ def get_fees(
91
+ current_tick: int,
92
+ tick: dict,
93
+ tick_index: int,
94
+ quote: bool,
95
+ global_fees_tao: float,
96
+ global_fees_alpha: float,
97
+ above: bool,
98
+ ) -> float:
99
+ """Returns the liquidity fee."""
100
+ tick_fee_key = "fees_out_tao" if quote else "fees_out_alpha"
101
+ tick_fee_value = fixed_to_float(tick.get(tick_fee_key))
102
+ global_fee_value = global_fees_tao if quote else global_fees_alpha
103
+
104
+ if above:
105
+ return (
106
+ global_fee_value - tick_fee_value
107
+ if tick_index <= current_tick
108
+ else tick_fee_value
109
+ )
110
+ return (
111
+ tick_fee_value
112
+ if tick_index <= current_tick
113
+ else global_fee_value - tick_fee_value
114
+ )
115
+
116
+
117
+ def get_fees_in_range(
118
+ quote: bool,
119
+ global_fees_tao: float,
120
+ global_fees_alpha: float,
121
+ fees_below_low: float,
122
+ fees_above_high: float,
123
+ ) -> float:
124
+ """Returns the liquidity fee value in a range."""
125
+ global_fees = global_fees_tao if quote else global_fees_alpha
126
+ return global_fees - fees_below_low - fees_above_high
127
+
128
+
129
+ # Calculate fees for a position
130
+ def calculate_fees(
131
+ position: dict[str, Any],
132
+ global_fees_tao: float,
133
+ global_fees_alpha: float,
134
+ tao_fees_below_low: float,
135
+ tao_fees_above_high: float,
136
+ alpha_fees_below_low: float,
137
+ alpha_fees_above_high: float,
138
+ netuid: int,
139
+ ) -> tuple[Balance, Balance]:
140
+ fee_tao_agg = get_fees_in_range(
141
+ quote=True,
142
+ global_fees_tao=global_fees_tao,
143
+ global_fees_alpha=global_fees_alpha,
144
+ fees_below_low=tao_fees_below_low,
145
+ fees_above_high=tao_fees_above_high,
146
+ )
147
+
148
+ fee_alpha_agg = get_fees_in_range(
149
+ quote=False,
150
+ global_fees_tao=global_fees_tao,
151
+ global_fees_alpha=global_fees_alpha,
152
+ fees_below_low=alpha_fees_below_low,
153
+ fees_above_high=alpha_fees_above_high,
154
+ )
155
+
156
+ fee_tao = fee_tao_agg - fixed_to_float(position["fees_tao"])
157
+ fee_alpha = fee_alpha_agg - fixed_to_float(position["fees_alpha"])
158
+ liquidity_frac = position["liquidity"]
159
+
160
+ fee_tao = liquidity_frac * fee_tao
161
+ fee_alpha = liquidity_frac * fee_alpha
162
+
163
+ return Balance.from_rao(int(fee_tao)), Balance.from_rao(int(fee_alpha)).set_unit(
164
+ netuid
165
+ )
166
+
167
+
168
+ def prompt_liquidity(prompt: str, negative_allowed: bool = False) -> Balance:
169
+ """Prompt the user for the amount of liquidity.
170
+
171
+ Arguments:
172
+ prompt: Prompt to display to the user.
173
+ negative_allowed: Whether negative amounts are allowed.
174
+
175
+ Returns:
176
+ Balance converted from input to TAO.
177
+ """
178
+ while True:
179
+ amount = FloatPrompt.ask(prompt)
180
+ try:
181
+ if amount <= 0 and not negative_allowed:
182
+ console.print("[red]Amount must be greater than 0[/red].")
183
+ continue
184
+ return Balance.from_tao(amount)
185
+ except ValueError:
186
+ console.print("[red]Please enter a valid number[/red].")
187
+
188
+
189
+ def prompt_position_id() -> int:
190
+ """Ask the user for the ID of the liquidity position to remove."""
191
+ while True:
192
+ position_id = IntPrompt.ask("Enter the [blue]liquidity position ID[/blue]")
193
+
194
+ try:
195
+ if position_id <= 1:
196
+ console.print("[red]Position ID must be greater than 1[/red].")
197
+ continue
198
+ return position_id
199
+ except ValueError:
200
+ console.print("[red]Please enter a valid number[/red].")
@@ -342,14 +342,14 @@ async def stake_add(
342
342
  # If we are staking safe, add price tolerance
343
343
  if safe_staking:
344
344
  if subnet_info.is_dynamic:
345
- rate = 1 / subnet_info.price.tao or 1
345
+ rate = amount_to_stake.rao / received_amount.rao
346
346
  _rate_with_tolerance = rate * (
347
347
  1 + rate_tolerance
348
348
  ) # Rate only for display
349
349
  rate_with_tolerance = f"{_rate_with_tolerance:.4f}"
350
- price_with_tolerance = subnet_info.price.rao * (
351
- 1 + rate_tolerance
352
- ) # Actual price to pass to extrinsic
350
+ price_with_tolerance = Balance.from_tao(
351
+ _rate_with_tolerance
352
+ ).rao # Actual price to pass to extrinsic
353
353
  else:
354
354
  rate_with_tolerance = "1"
355
355
  price_with_tolerance = Balance.from_rao(1)
@@ -248,13 +248,13 @@ async def unstake(
248
248
  # Additional fields for safe unstaking
249
249
  if safe_staking:
250
250
  if subnet_info.is_dynamic:
251
- rate = subnet_info.price.tao or 1
251
+ rate = received_amount.rao / amount_to_unstake_as_balance.rao
252
252
  rate_with_tolerance = rate * (
253
253
  1 - rate_tolerance
254
254
  ) # Rate only for display
255
- price_with_tolerance = subnet_info.price.rao * (
256
- 1 - rate_tolerance
257
- ) # Actual price to pass to extrinsic
255
+ price_with_tolerance = Balance.from_tao(
256
+ rate_with_tolerance
257
+ ).rao # Actual price to pass to extrinsic
258
258
  else:
259
259
  rate_with_tolerance = 1
260
260
  price_with_tolerance = 1
@@ -140,6 +140,9 @@ async def register_subnetwork_extrinsic(
140
140
  "description": subnet_identity["description"].encode()
141
141
  if subnet_identity.get("description")
142
142
  else b"",
143
+ "logo_url": subnet_identity["logo_url"].encode()
144
+ if subnet_identity.get("logo_url")
145
+ else b"",
143
146
  "additional": subnet_identity["additional"].encode()
144
147
  if subnet_identity.get("additional")
145
148
  else b"",
@@ -2207,6 +2210,7 @@ async def set_identity(
2207
2210
  "subnet_url": subnet_identity.get("subnet_url", ""),
2208
2211
  "discord": subnet_identity.get("discord", ""),
2209
2212
  "description": subnet_identity.get("description", ""),
2213
+ "logo_url": subnet_identity.get("logo_url", ""),
2210
2214
  "additional": subnet_identity.get("additional", ""),
2211
2215
  }
2212
2216
 
@@ -2252,6 +2256,7 @@ async def set_identity(
2252
2256
  "subnet_url",
2253
2257
  "discord",
2254
2258
  "description",
2259
+ "logo_url",
2255
2260
  "additional",
2256
2261
  ]:
2257
2262
  value = getattr(identity, key, None)
@@ -2301,6 +2306,7 @@ async def get_identity(
2301
2306
  "subnet_url",
2302
2307
  "discord",
2303
2308
  "description",
2309
+ "logo_url",
2304
2310
  "additional",
2305
2311
  ]:
2306
2312
  value = getattr(identity, key, None)
@@ -8,7 +8,12 @@ from rich.table import Column, Table
8
8
  from rich.prompt import Confirm
9
9
  from scalecodec import GenericCall
10
10
 
11
- from bittensor_cli.src import HYPERPARAMS, DelegatesDetails, COLOR_PALETTE
11
+ from bittensor_cli.src import (
12
+ HYPERPARAMS,
13
+ HYPERPARAMS_MODULE,
14
+ DelegatesDetails,
15
+ COLOR_PALETTE,
16
+ )
12
17
  from bittensor_cli.src.bittensor.chain_data import decode_account_id
13
18
  from bittensor_cli.src.bittensor.utils import (
14
19
  console,
@@ -18,9 +23,9 @@ from bittensor_cli.src.bittensor.utils import (
18
23
  normalize_hyperparameters,
19
24
  unlock_key,
20
25
  blocks_to_duration,
21
- float_to_u64,
22
- float_to_u16,
23
26
  json_console,
27
+ string_to_u16,
28
+ string_to_u64,
24
29
  )
25
30
 
26
31
  if TYPE_CHECKING:
@@ -31,6 +36,7 @@ if TYPE_CHECKING:
31
36
 
32
37
 
33
38
  # helpers and extrinsics
39
+ DEFAULT_PALLET = "AdminUtils"
34
40
 
35
41
 
36
42
  def allowed_value(
@@ -73,7 +79,7 @@ def allowed_value(
73
79
  return True, value
74
80
 
75
81
 
76
- def string_to_bool(val) -> bool:
82
+ def string_to_bool(val) -> bool | type[ValueError]:
77
83
  try:
78
84
  return {"true": True, "1": True, "0": False, "false": False}[val.lower()]
79
85
  except KeyError:
@@ -81,7 +87,11 @@ def string_to_bool(val) -> bool:
81
87
 
82
88
 
83
89
  def search_metadata(
84
- param_name: str, value: Union[str, bool, float, list[float]], netuid: int, metadata
90
+ param_name: str,
91
+ value: Union[str, bool, float, list[float]],
92
+ netuid: int,
93
+ metadata,
94
+ pallet: str = DEFAULT_PALLET,
85
95
  ) -> tuple[bool, Optional[dict]]:
86
96
  """
87
97
  Searches the substrate metadata AdminUtils pallet for a given parameter name. Crafts a response dict to be used
@@ -92,6 +102,7 @@ def search_metadata(
92
102
  value: the value to set the hyperparameter
93
103
  netuid: the specified netuid
94
104
  metadata: the subtensor.substrate.metadata
105
+ pallet: the name of the module to use for the query. If not set, the default value is DEFAULT_PALLET
95
106
 
96
107
  Returns:
97
108
  (success, dict of call params)
@@ -108,12 +119,12 @@ def search_metadata(
108
119
  except ValueError:
109
120
  return type_converter_with_retry(type_, None, arg_name)
110
121
 
111
- arg_types = {"bool": string_to_bool, "u16": float_to_u16, "u64": float_to_u64}
122
+ arg_types = {"bool": string_to_bool, "u16": string_to_u16, "u64": string_to_u64}
112
123
  arg_type_output = {"bool": "bool", "u16": "float", "u64": "float"}
113
124
 
114
125
  call_crafter = {"netuid": netuid}
115
126
 
116
- pallet = metadata.get_metadata_pallet("AdminUtils")
127
+ pallet = metadata.get_metadata_pallet(pallet)
117
128
  for call in pallet.calls:
118
129
  if call.name == param_name:
119
130
  if "netuid" not in [x.name for x in call.args]:
@@ -135,11 +146,11 @@ def search_metadata(
135
146
  return False, None
136
147
 
137
148
 
138
- def requires_bool(metadata, param_name) -> bool:
149
+ def requires_bool(metadata, param_name, pallet: str = DEFAULT_PALLET) -> bool:
139
150
  """
140
151
  Determines whether a given hyperparam takes a single arg (besides netuid) that is of bool type.
141
152
  """
142
- pallet = metadata.get_metadata_pallet("AdminUtils")
153
+ pallet = metadata.get_metadata_pallet(pallet)
143
154
  for call in pallet.calls:
144
155
  if call.name == param_name:
145
156
  if "netuid" not in [x.name for x in call.args]:
@@ -218,6 +229,8 @@ async def set_hyperparameter_extrinsic(
218
229
 
219
230
  substrate = subtensor.substrate
220
231
  msg_value = value if not arbitrary_extrinsic else call_params
232
+ pallet = HYPERPARAMS_MODULE.get(parameter) or DEFAULT_PALLET
233
+
221
234
  with console.status(
222
235
  f":satellite: Setting hyperparameter [{COLOR_PALETTE['GENERAL']['SUBHEADING']}]{parameter}"
223
236
  f"[/{COLOR_PALETTE['GENERAL']['SUBHEADING']}] to [{COLOR_PALETTE['GENERAL']['SUBHEADING']}]{msg_value}"
@@ -227,16 +240,16 @@ async def set_hyperparameter_extrinsic(
227
240
  ):
228
241
  if not arbitrary_extrinsic:
229
242
  extrinsic_params = await substrate.get_metadata_call_function(
230
- "AdminUtils", extrinsic
243
+ module_name=pallet, call_function_name=extrinsic
231
244
  )
232
245
 
233
246
  # if input value is a list, iterate through the list and assign values
234
247
  if isinstance(value, list):
235
248
  # Ensure that there are enough values for all non-netuid parameters
236
249
  non_netuid_fields = [
237
- param["name"]
250
+ pn_str
238
251
  for param in extrinsic_params["fields"]
239
- if "netuid" not in param["name"]
252
+ if "netuid" not in (pn_str := str(param["name"]))
240
253
  ]
241
254
 
242
255
  if len(value) < len(non_netuid_fields):
@@ -246,12 +259,12 @@ async def set_hyperparameter_extrinsic(
246
259
  return False
247
260
 
248
261
  call_params.update(
249
- {str(name): val for name, val in zip(non_netuid_fields, value)}
262
+ {name: val for name, val in zip(non_netuid_fields, value)}
250
263
  )
251
264
 
252
265
  else:
253
266
  if requires_bool(
254
- substrate.metadata, param_name=extrinsic
267
+ substrate.metadata, param_name=extrinsic, pallet=pallet
255
268
  ) and isinstance(value, str):
256
269
  value = string_to_bool(value)
257
270
  value_argument = extrinsic_params["fields"][
@@ -261,7 +274,7 @@ async def set_hyperparameter_extrinsic(
261
274
 
262
275
  # create extrinsic call
263
276
  call_ = await substrate.compose_call(
264
- call_module="AdminUtils",
277
+ call_module=pallet,
265
278
  call_function=extrinsic,
266
279
  call_params=call_params,
267
280
  )
@@ -2002,11 +2002,12 @@ async def check_swap_status(
2002
2002
  Args:
2003
2003
  subtensor: Connection to the network
2004
2004
  origin_ss58: The SS58 address of the original coldkey
2005
- block_number: Optional block number where the swap was scheduled
2005
+ expected_block_number: Optional block number where the swap was scheduled
2006
+
2006
2007
  """
2007
- scheduled_swaps = await subtensor.get_scheduled_coldkey_swap()
2008
2008
 
2009
2009
  if not origin_ss58:
2010
+ scheduled_swaps = await subtensor.get_scheduled_coldkey_swap()
2010
2011
  if not scheduled_swaps:
2011
2012
  console.print("[yellow]No pending coldkey swaps found.[/yellow]")
2012
2013
  return
@@ -2035,11 +2036,20 @@ async def check_swap_status(
2035
2036
 
2036
2037
  console.print(table)
2037
2038
  console.print(
2038
- "\n[dim]Tip: Check specific swap details by providing the original coldkey SS58 address and the block number.[/dim]"
2039
+ "\n[dim]Tip: Check specific swap details by providing the original coldkey "
2040
+ "SS58 address and the block number.[/dim]"
2039
2041
  )
2040
2042
  return
2041
-
2042
- is_pending = origin_ss58 in scheduled_swaps
2043
+ chain_reported_completion_block, destination_address = await subtensor.query(
2044
+ "SubtensorModule", "ColdkeySwapScheduled", [origin_ss58]
2045
+ )
2046
+ if (
2047
+ chain_reported_completion_block != 0
2048
+ and destination_address != "5C4hrfjw9DjXZTzV3MwzrrAr9P1MJhSrvWGWqi1eSuyUpnhM"
2049
+ ):
2050
+ is_pending = True
2051
+ else:
2052
+ is_pending = False
2043
2053
 
2044
2054
  if not is_pending:
2045
2055
  console.print(
@@ -2052,23 +2062,10 @@ async def check_swap_status(
2052
2062
  )
2053
2063
 
2054
2064
  if expected_block_number is None:
2055
- return
2056
-
2057
- swap_info = await find_coldkey_swap_extrinsic(
2058
- subtensor=subtensor,
2059
- start_block=expected_block_number,
2060
- end_block=expected_block_number,
2061
- wallet_ss58=origin_ss58,
2062
- )
2063
-
2064
- if not swap_info:
2065
- console.print(
2066
- f"[yellow]Warning: Could not find swap extrinsic at block {expected_block_number}[/yellow]"
2067
- )
2068
- return
2065
+ expected_block_number = chain_reported_completion_block
2069
2066
 
2070
2067
  current_block = await subtensor.substrate.get_block_number()
2071
- remaining_blocks = swap_info["execution_block"] - current_block
2068
+ remaining_blocks = expected_block_number - current_block
2072
2069
 
2073
2070
  if remaining_blocks <= 0:
2074
2071
  console.print("[green]Swap period has completed![/green]")
@@ -2076,9 +2073,8 @@ async def check_swap_status(
2076
2073
 
2077
2074
  console.print(
2078
2075
  "\n[green]Coldkey swap details:[/green]"
2079
- f"\nScheduled at block: {swap_info['block_num']}"
2080
2076
  f"\nOriginal address: [{COLORS.G.CK}]{origin_ss58}[/{COLORS.G.CK}]"
2081
- f"\nDestination address: [{COLORS.G.CK}]{swap_info['dest_coldkey']}[/{COLORS.G.CK}]"
2082
- f"\nCompletion block: {swap_info['execution_block']}"
2077
+ f"\nDestination address: [{COLORS.G.CK}]{destination_address}[/{COLORS.G.CK}]"
2078
+ f"\nCompletion block: {chain_reported_completion_block}"
2083
2079
  f"\nTime remaining: {blocks_to_duration(remaining_blocks)}"
2084
2080
  )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bittensor-cli
3
- Version: 9.7.0
3
+ Version: 9.8.0
4
4
  Summary: Bittensor CLI
5
5
  Author: bittensor.com
6
6
  Project-URL: homepage, https://github.com/opentensor/btcli
@@ -1,15 +1,15 @@
1
1
  bittensor_cli/__init__.py,sha256=Lpv4NkbAQgwrfqFOnTMuR_S-fqGdaWCSLhxnFnGTHM0,1232
2
- bittensor_cli/cli.py,sha256=-oG6TmpPkXEusd_QN9E5FrjTnPYTRk_1qw94RTXmm7o,219381
2
+ bittensor_cli/cli.py,sha256=EqkLMdXgIGbr_z-RFju3zfynjl9WlcKtphsN1eLScdM,231299
3
3
  bittensor_cli/doc_generation_helper.py,sha256=GexqjEIKulWg84hpNBEchJ840oOgOi7DWpt447nsdNI,91
4
4
  bittensor_cli/version.py,sha256=dU1xsa3mG5FPdhzvqlzDByNcCHmzcFQH3q1pQr4u76g,720
5
- bittensor_cli/src/__init__.py,sha256=IObs-2kh6V1QJTQwf_A_x8qywA2nU1gthvJzwKSxTrM,33926
5
+ bittensor_cli/src/__init__.py,sha256=zd_S5sddcg9bJKnOadpMgGAGmwUrR8fPQGgYCauzUq8,34129
6
6
  bittensor_cli/src/bittensor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
7
  bittensor_cli/src/bittensor/balances.py,sha256=q5KkxF8wmUguWAFddEKstfDKTxPe5ISHpT6br8x32rc,11148
8
- bittensor_cli/src/bittensor/chain_data.py,sha256=ZVF_R_fEy_747CbCpbgSTBXmqY6sggVAZzciLP7JxsE,41852
8
+ bittensor_cli/src/bittensor/chain_data.py,sha256=_GATOCacWMN2jRurzn3hffJiq_l7AznGRkKePTAflwQ,44420
9
9
  bittensor_cli/src/bittensor/minigraph.py,sha256=BIzmSVLfBYiRAeGD_i1LAC8Cw7zxp38a91SIFEPMqYc,10479
10
10
  bittensor_cli/src/bittensor/networking.py,sha256=pZLMs8YXpZzDMLXWMBb_Bj6TVkm_q9khyY-lnbwVMuE,462
11
- bittensor_cli/src/bittensor/subtensor_interface.py,sha256=9Xy1G9PlwtQt-yFQHj0ynz_JKT9LKvb-v-XJcHf0XgU,59384
12
- bittensor_cli/src/bittensor/utils.py,sha256=s5rxsacPxHwRlDwFDbx9bKRXPdtTIN84Cke19DPPd5g,47394
11
+ bittensor_cli/src/bittensor/subtensor_interface.py,sha256=SVjt6ysW1rx-v0YVYBxfOHGpFT7v7r_ywykQALTgS8E,59912
12
+ bittensor_cli/src/bittensor/utils.py,sha256=cvJZNhcm2tESZ43D1fmBH3Zc1rSe_BvanvhRuN7qL5o,47961
13
13
  bittensor_cli/src/bittensor/extrinsics/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
14
  bittensor_cli/src/bittensor/extrinsics/registration.py,sha256=7ybqpJ7-Z_PTgj4boCOFxgfjMBCHv0JE7MNpJzJmyDc,66360
15
15
  bittensor_cli/src/bittensor/extrinsics/root.py,sha256=C9WPssL2HpNK8u_IFPPr8TrdFgbLPTfkbAYzalfmbRM,19188
@@ -28,21 +28,24 @@ bittensor_cli/src/bittensor/templates/view.css,sha256=OS0V_ixzdTU15FbNzpZW1m7-c6
28
28
  bittensor_cli/src/bittensor/templates/view.j2,sha256=4ux3uyqz34v9VVAX17GezuPESk4z9n5kkd9HbnTsF_Y,1101
29
29
  bittensor_cli/src/bittensor/templates/view.js,sha256=QIPnPp9SuYS9wcl7cwL8nFzd8idiDjNzrDjwwxpiVvY,45076
30
30
  bittensor_cli/src/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
31
- bittensor_cli/src/commands/sudo.py,sha256=JmcUMGPNH849XECnKtZ7dCoqDTDrheKeXGQ9hqTUwds,33404
31
+ bittensor_cli/src/commands/sudo.py,sha256=gyppy15pTPhgUDiQpAKLvftg8ap0CIvRRXpvkHxj0CU,33777
32
32
  bittensor_cli/src/commands/view.py,sha256=9lx6vfOkel8KIefUhDNaBS_j5lNR2djcRFRbK4mbnDE,12535
33
- bittensor_cli/src/commands/wallets.py,sha256=eHMjqzI5_gp9hrgvG2Ll9BnFbSAKJXdJ_GabLPzEUwo,72704
33
+ bittensor_cli/src/commands/wallets.py,sha256=a-WFpZht0EbFRrIncCxVNwai1PNOQa0jAhPE7iFdf_o,72649
34
34
  bittensor_cli/src/commands/weights.py,sha256=BCJm_mlw0pVK4YEZuEMqQBpvvOoB7B1rzdvMeN3uTfM,16503
35
+ bittensor_cli/src/commands/liquidity/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
36
+ bittensor_cli/src/commands/liquidity/liquidity.py,sha256=AXCjBvQb2gakP8n1z81npYkZ_QF5CQy7r82AMtQwXzk,21692
37
+ bittensor_cli/src/commands/liquidity/utils.py,sha256=egfZHnvBMc8ydntAHnU6V5Zyi-wLkomjNuucUj73aZQ,6361
35
38
  bittensor_cli/src/commands/stake/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
36
- bittensor_cli/src/commands/stake/add.py,sha256=JZcjO2rZWlh07F1V4b4xneLBm1zLzKCMW6ylJkc0seI,26866
39
+ bittensor_cli/src/commands/stake/add.py,sha256=hkY2m5lr836h2vrFYUoLPIfQu-mouKP4MJC3gknbtNw,26875
37
40
  bittensor_cli/src/commands/stake/children_hotkeys.py,sha256=lMiV-Z3SGZUEapdy0LRthFLx0RlFK0KVxytE47ybdEc,31746
38
41
  bittensor_cli/src/commands/stake/list.py,sha256=xLHqEflRLg3vmMop92JgAn88oAy4YdhaIGBcHOYgCak,30038
39
42
  bittensor_cli/src/commands/stake/move.py,sha256=AVeo0l4bvGAtjbdzx2Fn7_-jiI28B7LMlJGVZWT6mKg,35881
40
- bittensor_cli/src/commands/stake/remove.py,sha256=AhqYKaQ5pEKTZxZ5R-ojZe-ZBMvaZsSXHlYuvzRGStk,49904
43
+ bittensor_cli/src/commands/stake/remove.py,sha256=MCLH6lKxs5C780zgj7pTViPUI37_FYAYOg7lSEWZ5DA,49929
41
44
  bittensor_cli/src/commands/subnets/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
42
45
  bittensor_cli/src/commands/subnets/price.py,sha256=akXkbilWjQYqTYvtOhXngX_cVkU0Mv-Gl3kjce6dtl0,21490
43
- bittensor_cli/src/commands/subnets/subnets.py,sha256=hPstEqgQJNCCmRRz56nLDF3_iph8EJdqYRTlQDF3At8,93835
44
- bittensor_cli-9.7.0.dist-info/METADATA,sha256=q5KqtuBGvd4LJLn7L_OtaHekYC2RsO-oSk5xH-h6taU,6601
45
- bittensor_cli-9.7.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
46
- bittensor_cli-9.7.0.dist-info/entry_points.txt,sha256=hBTLGLbVxmAKy69XSKaUZvjTCmyEzDGZKq4S8UOto8I,49
47
- bittensor_cli-9.7.0.dist-info/top_level.txt,sha256=DvgvXpmTtI_Q1BbDZMlK90LFcGFCreN1daViEPV2iFw,14
48
- bittensor_cli-9.7.0.dist-info/RECORD,,
46
+ bittensor_cli/src/commands/subnets/subnets.py,sha256=yM74ct5a9xHyD_TdSAmZL6XOtkT6zk6F67VvOe8Ou68,94070
47
+ bittensor_cli-9.8.0.dist-info/METADATA,sha256=YBnymQ2G3z7APWSKK1Lq20uDGQb71QxFIlvtB9r_ZX4,6601
48
+ bittensor_cli-9.8.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
49
+ bittensor_cli-9.8.0.dist-info/entry_points.txt,sha256=hBTLGLbVxmAKy69XSKaUZvjTCmyEzDGZKq4S8UOto8I,49
50
+ bittensor_cli-9.8.0.dist-info/top_level.txt,sha256=DvgvXpmTtI_Q1BbDZMlK90LFcGFCreN1daViEPV2iFw,14
51
+ bittensor_cli-9.8.0.dist-info/RECORD,,