bittensor-cli 9.7.1__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.
- bittensor_cli/cli.py +339 -23
- bittensor_cli/src/__init__.py +8 -0
- bittensor_cli/src/bittensor/chain_data.py +81 -33
- bittensor_cli/src/bittensor/subtensor_interface.py +33 -15
- bittensor_cli/src/bittensor/utils.py +9 -0
- bittensor_cli/src/commands/liquidity/__init__.py +0 -0
- bittensor_cli/src/commands/liquidity/liquidity.py +628 -0
- bittensor_cli/src/commands/liquidity/utils.py +200 -0
- bittensor_cli/src/commands/stake/add.py +4 -4
- bittensor_cli/src/commands/stake/remove.py +4 -4
- bittensor_cli/src/commands/subnets/subnets.py +6 -0
- bittensor_cli/src/commands/sudo.py +22 -9
- bittensor_cli/src/commands/wallets.py +19 -23
- {bittensor_cli-9.7.1.dist-info → bittensor_cli-9.8.0.dist-info}/METADATA +1 -1
- {bittensor_cli-9.7.1.dist-info → bittensor_cli-9.8.0.dist-info}/RECORD +18 -15
- {bittensor_cli-9.7.1.dist-info → bittensor_cli-9.8.0.dist-info}/WHEEL +0 -0
- {bittensor_cli-9.7.1.dist-info → bittensor_cli-9.8.0.dist-info}/entry_points.txt +0 -0
- {bittensor_cli-9.7.1.dist-info → bittensor_cli-9.8.0.dist-info}/top_level.txt +0 -0
@@ -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 =
|
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 =
|
351
|
-
|
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 =
|
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 =
|
256
|
-
|
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
|
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,
|
@@ -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,
|
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)
|
@@ -113,7 +124,7 @@ def search_metadata(
|
|
113
124
|
|
114
125
|
call_crafter = {"netuid": netuid}
|
115
126
|
|
116
|
-
pallet = metadata.get_metadata_pallet(
|
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(
|
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,7 +240,7 @@ async def set_hyperparameter_extrinsic(
|
|
227
240
|
):
|
228
241
|
if not arbitrary_extrinsic:
|
229
242
|
extrinsic_params = await substrate.get_metadata_call_function(
|
230
|
-
|
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
|
@@ -251,7 +264,7 @@ async def set_hyperparameter_extrinsic(
|
|
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=
|
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
|
-
|
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
|
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
|
-
|
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
|
-
|
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 =
|
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}]{
|
2082
|
-
f"\nCompletion 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,15 +1,15 @@
|
|
1
1
|
bittensor_cli/__init__.py,sha256=Lpv4NkbAQgwrfqFOnTMuR_S-fqGdaWCSLhxnFnGTHM0,1232
|
2
|
-
bittensor_cli/cli.py,sha256
|
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=
|
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=
|
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=
|
12
|
-
bittensor_cli/src/bittensor/utils.py,sha256=
|
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=
|
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=
|
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=
|
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=
|
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=
|
44
|
-
bittensor_cli-9.
|
45
|
-
bittensor_cli-9.
|
46
|
-
bittensor_cli-9.
|
47
|
-
bittensor_cli-9.
|
48
|
-
bittensor_cli-9.
|
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,,
|
File without changes
|
File without changes
|
File without changes
|