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.
@@ -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
- _core_version = re.match(r"^\d+\.\d+\.\d+", version).group(0)
7
- _version_split = _core_version.split(".")
8
- __version_info__ = tuple(int(part) for part in _version_split)
9
- _version_int_base = 1000
10
- assert max(__version_info__) < _version_int_base
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
- __version_as_int__: int = sum(
13
- e * (_version_int_base**i) for i, e in enumerate(reversed(__version_info__))
15
+ version_as_int_: int = sum(
16
+ e * (version_int_base**i) for i, e in enumerate(reversed(version_info))
14
17
  )
15
- assert __version_as_int__ < 2**31 # fits in int32
16
- __new_signature_version__ = 360
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.0
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<2.6.0,>=1.13.1; extra == "cuda"
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=Of6WY-3dg4SAg_NcDs1Rn3ZYwZre21dQ1-YsD8pkBwU,213143
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=xtm9qNHg2cYyMpx8mg2YxuglkVUvseiqJg82z4gTrEY,685
5
- bittensor_cli/src/__init__.py,sha256=jaQx65z8fjvsMSSTjSZkHUUYbv8u65AkzNTy6piVtyc,35418
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=CT_uQlJFGqSXMRzsvXu6prt7aDLYEkQFDW-94skSZcM,47588
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=EiZTUiPPRbWi8sDXVn2lVuKS89W8Ky1opeT9RpgIe1E,89534
31
- bittensor_cli-9.3.0.dist-info/METADATA,sha256=OH1bS7MqTR0KR5mn9QJUYXRui9F2QoPHgqYyRp-IKBs,6462
32
- bittensor_cli-9.3.0.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
33
- bittensor_cli-9.3.0.dist-info/entry_points.txt,sha256=hBTLGLbVxmAKy69XSKaUZvjTCmyEzDGZKq4S8UOto8I,49
34
- bittensor_cli-9.3.0.dist-info/top_level.txt,sha256=DvgvXpmTtI_Q1BbDZMlK90LFcGFCreN1daViEPV2iFw,14
35
- bittensor_cli-9.3.0.dist-info/RECORD,,
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,,