bittensor-cli 9.3.0__py3-none-any.whl → 9.4.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 +77 -3
- bittensor_cli/src/__init__.py +440 -440
- bittensor_cli/src/bittensor/utils.py +2 -1
- bittensor_cli/src/commands/subnets/subnets.py +111 -1
- bittensor_cli/version.py +12 -10
- {bittensor_cli-9.3.0.dist-info → bittensor_cli-9.4.0.dist-info}/METADATA +2 -2
- {bittensor_cli-9.3.0.dist-info → bittensor_cli-9.4.0.dist-info}/RECORD +10 -10
- {bittensor_cli-9.3.0.dist-info → bittensor_cli-9.4.0.dist-info}/WHEEL +0 -0
- {bittensor_cli-9.3.0.dist-info → bittensor_cli-9.4.0.dist-info}/entry_points.txt +0 -0
- {bittensor_cli-9.3.0.dist-info → bittensor_cli-9.4.0.dist-info}/top_level.txt +0 -0
@@ -31,6 +31,7 @@ from bittensor_cli.src import defaults, Constants
|
|
31
31
|
|
32
32
|
if TYPE_CHECKING:
|
33
33
|
from bittensor_cli.src.bittensor.chain_data import SubnetHyperparameters
|
34
|
+
from rich.prompt import PromptBase
|
34
35
|
|
35
36
|
console = Console()
|
36
37
|
json_console = Console()
|
@@ -1007,7 +1008,7 @@ def retry_prompt(
|
|
1007
1008
|
rejection_text: str,
|
1008
1009
|
default="",
|
1009
1010
|
show_default=False,
|
1010
|
-
prompt_type=Prompt.ask,
|
1011
|
+
prompt_type: "PromptBase.ask" = Prompt.ask,
|
1011
1012
|
):
|
1012
1013
|
"""
|
1013
1014
|
Allows for asking prompts again if they do not meet a certain criteria (as defined in `rejection`)
|
@@ -10,7 +10,7 @@ from rich.progress import Progress, BarColumn, TextColumn
|
|
10
10
|
from rich.table import Column, Table
|
11
11
|
from rich import box
|
12
12
|
|
13
|
-
from bittensor_cli.src import COLOR_PALETTE
|
13
|
+
from bittensor_cli.src import COLOR_PALETTE, Constants
|
14
14
|
from bittensor_cli.src.bittensor.balances import Balance
|
15
15
|
from bittensor_cli.src.bittensor.extrinsics.registration import (
|
16
16
|
register_extrinsic,
|
@@ -34,6 +34,7 @@ from bittensor_cli.src.bittensor.utils import (
|
|
34
34
|
prompt_for_identity,
|
35
35
|
get_subnet_name,
|
36
36
|
unlock_key,
|
37
|
+
blocks_to_duration,
|
37
38
|
json_console,
|
38
39
|
)
|
39
40
|
|
@@ -2308,3 +2309,112 @@ async def get_identity(
|
|
2308
2309
|
else:
|
2309
2310
|
console.print(table)
|
2310
2311
|
return identity
|
2312
|
+
|
2313
|
+
|
2314
|
+
async def get_start_schedule(
|
2315
|
+
subtensor: "SubtensorInterface",
|
2316
|
+
netuid: int,
|
2317
|
+
) -> None:
|
2318
|
+
"""Fetch and display existing emission schedule information."""
|
2319
|
+
|
2320
|
+
if not await subtensor.subnet_exists(netuid):
|
2321
|
+
print_error(f"Subnet {netuid} does not exist.")
|
2322
|
+
return None
|
2323
|
+
|
2324
|
+
registration_block = await subtensor.query(
|
2325
|
+
module="SubtensorModule",
|
2326
|
+
storage_function="NetworkRegisteredAt",
|
2327
|
+
params=[netuid],
|
2328
|
+
)
|
2329
|
+
min_blocks_to_start = Constants.emission_start_schedule
|
2330
|
+
current_block = await subtensor.substrate.get_block_number()
|
2331
|
+
|
2332
|
+
potential_start_block = registration_block + min_blocks_to_start
|
2333
|
+
if current_block < potential_start_block:
|
2334
|
+
blocks_to_wait = potential_start_block - current_block
|
2335
|
+
time_to_wait = blocks_to_duration(blocks_to_wait)
|
2336
|
+
|
2337
|
+
console.print(
|
2338
|
+
f"[blue]Subnet {netuid}[/blue]:\n"
|
2339
|
+
f"[blue]Registered at:[/blue] {registration_block}\n"
|
2340
|
+
f"[blue]Minimum start block:[/blue] {potential_start_block}\n"
|
2341
|
+
f"[blue]Current block:[/blue] {current_block}\n"
|
2342
|
+
f"[blue]Blocks remaining:[/blue] {blocks_to_wait}\n"
|
2343
|
+
f"[blue]Time to wait:[/blue] {time_to_wait}"
|
2344
|
+
)
|
2345
|
+
else:
|
2346
|
+
console.print(
|
2347
|
+
f"[blue]Subnet {netuid}[/blue]:\n"
|
2348
|
+
f"[blue]Registered at:[/blue] {registration_block}\n"
|
2349
|
+
f"[blue]Current block:[/blue] {current_block}\n"
|
2350
|
+
f"[blue]Minimum start block:[/blue] {potential_start_block}\n"
|
2351
|
+
f"[dark_sea_green3]Emission schedule can be started[/dark_sea_green3]"
|
2352
|
+
)
|
2353
|
+
|
2354
|
+
return
|
2355
|
+
|
2356
|
+
|
2357
|
+
async def start_subnet(
|
2358
|
+
wallet: "Wallet",
|
2359
|
+
subtensor: "SubtensorInterface",
|
2360
|
+
netuid: int,
|
2361
|
+
prompt: bool = False,
|
2362
|
+
) -> bool:
|
2363
|
+
"""Start a subnet's emission schedule"""
|
2364
|
+
|
2365
|
+
if not await subtensor.subnet_exists(netuid):
|
2366
|
+
print_error(f"Subnet {netuid} does not exist.")
|
2367
|
+
return False
|
2368
|
+
|
2369
|
+
subnet_owner = await subtensor.query(
|
2370
|
+
module="SubtensorModule",
|
2371
|
+
storage_function="SubnetOwner",
|
2372
|
+
params=[netuid],
|
2373
|
+
)
|
2374
|
+
if subnet_owner != wallet.coldkeypub.ss58_address:
|
2375
|
+
print_error(":cross_mark: This wallet doesn't own the specified subnet.")
|
2376
|
+
return False
|
2377
|
+
|
2378
|
+
if prompt:
|
2379
|
+
if not Confirm.ask(
|
2380
|
+
f"Are you sure you want to start subnet {netuid}'s emission schedule?"
|
2381
|
+
):
|
2382
|
+
return False
|
2383
|
+
|
2384
|
+
if not unlock_key(wallet).success:
|
2385
|
+
return False
|
2386
|
+
|
2387
|
+
with console.status(
|
2388
|
+
f":satellite: Starting subnet {netuid}'s emission schedule...", spinner="earth"
|
2389
|
+
):
|
2390
|
+
start_call = await subtensor.substrate.compose_call(
|
2391
|
+
call_module="SubtensorModule",
|
2392
|
+
call_function="start_call",
|
2393
|
+
call_params={"netuid": netuid},
|
2394
|
+
)
|
2395
|
+
|
2396
|
+
signed_ext = await subtensor.substrate.create_signed_extrinsic(
|
2397
|
+
call=start_call,
|
2398
|
+
keypair=wallet.coldkey,
|
2399
|
+
)
|
2400
|
+
|
2401
|
+
response = await subtensor.substrate.submit_extrinsic(
|
2402
|
+
extrinsic=signed_ext,
|
2403
|
+
wait_for_inclusion=True,
|
2404
|
+
wait_for_finalization=True,
|
2405
|
+
)
|
2406
|
+
|
2407
|
+
if await response.is_success:
|
2408
|
+
console.print(
|
2409
|
+
f":white_heavy_check_mark: [green]Successfully started subnet {netuid}'s emission schedule.[/green]"
|
2410
|
+
)
|
2411
|
+
return True
|
2412
|
+
else:
|
2413
|
+
error_msg = format_error_message(await response.error_message)
|
2414
|
+
if "FirstEmissionBlockNumberAlreadySet" in error_msg:
|
2415
|
+
console.print(f"[dark_sea_green3]Subnet {netuid} already has an emission schedule.[/dark_sea_green3]")
|
2416
|
+
return True
|
2417
|
+
|
2418
|
+
await get_start_schedule(subtensor, netuid)
|
2419
|
+
print_error(f":cross_mark: Failed to start subnet: {error_msg}")
|
2420
|
+
return False
|
bittensor_cli/version.py
CHANGED
@@ -3,18 +3,20 @@ import re
|
|
3
3
|
|
4
4
|
|
5
5
|
def version_as_int(version):
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
6
|
+
match = re.match(r"^\d+\.\d+\.\d+", version)
|
7
|
+
if not match:
|
8
|
+
raise ValueError(f"Invalid version format: {version}")
|
9
|
+
core_version = match.group(0)
|
10
|
+
version_split = core_version.split(".")
|
11
|
+
version_info = tuple(int(part) for part in version_split)
|
12
|
+
version_int_base = 1000
|
13
|
+
assert max(version_info) < version_int_base
|
11
14
|
|
12
|
-
|
13
|
-
e * (
|
15
|
+
version_as_int_: int = sum(
|
16
|
+
e * (version_int_base**i) for i, e in enumerate(reversed(version_info))
|
14
17
|
)
|
15
|
-
assert
|
16
|
-
|
17
|
-
return __version_as_int__
|
18
|
+
assert version_as_int_ < 2**31 # fits in int32
|
19
|
+
return version_as_int_
|
18
20
|
|
19
21
|
|
20
22
|
__version__ = importlib.metadata.version("bittensor-cli")
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: bittensor-cli
|
3
|
-
Version: 9.
|
3
|
+
Version: 9.4.0
|
4
4
|
Summary: Bittensor CLI
|
5
5
|
Author: bittensor.com
|
6
6
|
Project-URL: homepage, https://github.com/opentensor/btcli
|
@@ -29,7 +29,7 @@ Requires-Dist: plotille>=5.0.0
|
|
29
29
|
Requires-Dist: pywry>=0.6.2
|
30
30
|
Requires-Dist: plotly>=6.0.0
|
31
31
|
Provides-Extra: cuda
|
32
|
-
Requires-Dist: torch<
|
32
|
+
Requires-Dist: torch<3.0,>=1.13.1; extra == "cuda"
|
33
33
|
|
34
34
|
<div align="center">
|
35
35
|
|
@@ -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=4EMdoHWqaf7rDZ-rpaVRpwfHRivd4WA2oFGCxx6hoTU,215699
|
3
3
|
bittensor_cli/doc_generation_helper.py,sha256=GexqjEIKulWg84hpNBEchJ840oOgOi7DWpt447nsdNI,91
|
4
|
-
bittensor_cli/version.py,sha256=
|
5
|
-
bittensor_cli/src/__init__.py,sha256=
|
4
|
+
bittensor_cli/version.py,sha256=dU1xsa3mG5FPdhzvqlzDByNcCHmzcFQH3q1pQr4u76g,720
|
5
|
+
bittensor_cli/src/__init__.py,sha256=XKTcdTy31G6NTJd9KqQmiDBeKbqgqJJcVPg3NbcRQaw,33858
|
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
8
|
bittensor_cli/src/bittensor/chain_data.py,sha256=yOQyPZ472BlfhAfaemdi22qunEGHlVvugRdUeYpZxwQ,41663
|
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
11
|
bittensor_cli/src/bittensor/subtensor_interface.py,sha256=JqbraGNGfEfUFff5ZwQJSzIep2IDfuuyFJzzxCr2NLA,58883
|
12
|
-
bittensor_cli/src/bittensor/utils.py,sha256=
|
12
|
+
bittensor_cli/src/bittensor/utils.py,sha256=L8BW1bjC6X22nQDuq0kghoVGc0MC4Axp7AK8MKqbXBM,47647
|
13
13
|
bittensor_cli/src/bittensor/extrinsics/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
14
14
|
bittensor_cli/src/bittensor/extrinsics/registration.py,sha256=mZt6z8PRK5MaIczLygmVvAUnfl_dl5zDF7ysIFkwHvs,64511
|
15
15
|
bittensor_cli/src/bittensor/extrinsics/root.py,sha256=rVogWhT28NJ1CrVXtbq_Pyi7etB_zTZicbjiHAHLdSs,19214
|
@@ -27,9 +27,9 @@ bittensor_cli/src/commands/stake/move.py,sha256=AVeo0l4bvGAtjbdzx2Fn7_-jiI28B7LM
|
|
27
27
|
bittensor_cli/src/commands/stake/remove.py,sha256=l7TtLK2Z6-TJ5-DEwUzm6HT2GQC-MhKZS9SONS9DKtA,49902
|
28
28
|
bittensor_cli/src/commands/subnets/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
29
29
|
bittensor_cli/src/commands/subnets/price.py,sha256=O8oK12hCtm1asQGx2MR1xtYA9ygkklhFtXvBON4DcGM,30069
|
30
|
-
bittensor_cli/src/commands/subnets/subnets.py,sha256=
|
31
|
-
bittensor_cli-9.
|
32
|
-
bittensor_cli-9.
|
33
|
-
bittensor_cli-9.
|
34
|
-
bittensor_cli-9.
|
35
|
-
bittensor_cli-9.
|
30
|
+
bittensor_cli/src/commands/subnets/subnets.py,sha256=yTQYKOddAtxvL7AUXvJx7Y_tDSZa5QjMrDMwtQOukWM,93353
|
31
|
+
bittensor_cli-9.4.0.dist-info/METADATA,sha256=NYNjeKf3zEhyK6hHK9v6aMX9yYwzwQqLLwtFdIrMi7o,6460
|
32
|
+
bittensor_cli-9.4.0.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
|
33
|
+
bittensor_cli-9.4.0.dist-info/entry_points.txt,sha256=hBTLGLbVxmAKy69XSKaUZvjTCmyEzDGZKq4S8UOto8I,49
|
34
|
+
bittensor_cli-9.4.0.dist-info/top_level.txt,sha256=DvgvXpmTtI_Q1BbDZMlK90LFcGFCreN1daViEPV2iFw,14
|
35
|
+
bittensor_cli-9.4.0.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|