bittensor-cli 8.2.0__py3-none-any.whl → 8.3.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.
@@ -4,10 +4,9 @@ import itertools
4
4
  import os
5
5
  import sys
6
6
  from collections import defaultdict
7
- from concurrent.futures import ProcessPoolExecutor
8
7
  from functools import partial
9
8
  from sys import getsizeof
10
- from typing import Any, Collection, Generator, Optional
9
+ from typing import Collection, Generator, Optional
11
10
 
12
11
  import aiohttp
13
12
  from bittensor_wallet import Wallet
@@ -59,6 +58,13 @@ from bittensor_cli.src.bittensor.utils import (
59
58
  )
60
59
 
61
60
 
61
+ class WalletLike:
62
+ def __init__(self, name=None, hotkey_ss58=None, hotkey_str=None):
63
+ self.name = name
64
+ self.hotkey_ss58 = hotkey_ss58
65
+ self.hotkey_str = hotkey_str
66
+
67
+
62
68
  async def regen_coldkey(
63
69
  wallet: Wallet,
64
70
  mnemonic: Optional[str],
@@ -75,13 +81,21 @@ async def regen_coldkey(
75
81
  with open(json_path, "r") as f:
76
82
  json_str = f.read()
77
83
  try:
78
- wallet.regenerate_coldkey(
84
+ new_wallet = wallet.regenerate_coldkey(
79
85
  mnemonic=mnemonic,
80
86
  seed=seed,
81
87
  json=(json_str, json_password) if all([json_str, json_password]) else None,
82
88
  use_password=use_password,
83
89
  overwrite=False,
84
90
  )
91
+
92
+ if isinstance(new_wallet, Wallet):
93
+ console.print(
94
+ "\n✅ [dark_sea_green]Regenerated coldkey successfully!\n",
95
+ f"[dark_sea_green]Wallet name: ({new_wallet.name}), path: ({new_wallet.path}), coldkey ss58: ({new_wallet.coldkeypub.ss58_address})",
96
+ )
97
+ except ValueError:
98
+ print_error("Mnemonic phrase is invalid")
85
99
  except KeyFileError:
86
100
  print_error("KeyFileError: File is not writable")
87
101
 
@@ -93,11 +107,16 @@ async def regen_coldkey_pub(
93
107
  ):
94
108
  """Creates a new coldkeypub under this wallet."""
95
109
  try:
96
- wallet.regenerate_coldkeypub(
110
+ new_coldkeypub = wallet.regenerate_coldkeypub(
97
111
  ss58_address=ss58_address,
98
112
  public_key=public_key_hex,
99
113
  overwrite=False,
100
114
  )
115
+ if isinstance(new_coldkeypub, Wallet):
116
+ console.print(
117
+ "\n✅ [dark_sea_green]Regenerated coldkeypub successfully!\n",
118
+ f"[dark_sea_green]Wallet name: ({new_coldkeypub.name}), path: ({new_coldkeypub.path}), coldkey ss58: ({new_coldkeypub.coldkeypub.ss58_address})",
119
+ )
101
120
  except KeyFileError:
102
121
  print_error("KeyFileError: File is not writable")
103
122
 
@@ -120,13 +139,20 @@ async def regen_hotkey(
120
139
  json_str = f.read()
121
140
 
122
141
  try:
123
- wallet.regenerate_hotkey(
142
+ new_hotkey = wallet.regenerate_hotkey(
124
143
  mnemonic=mnemonic,
125
144
  seed=seed,
126
145
  json=(json_str, json_password) if all([json_str, json_password]) else None,
127
146
  use_password=use_password,
128
147
  overwrite=False,
129
148
  )
149
+ if isinstance(new_hotkey, Wallet):
150
+ console.print(
151
+ "\n✅ [dark_sea_green]Regenerated hotkey successfully!\n",
152
+ f"[dark_sea_green]Wallet name: ({new_hotkey.name}), path: ({new_hotkey.path}), hotkey ss58: ({new_hotkey.hotkey.ss58_address})",
153
+ )
154
+ except ValueError:
155
+ print_error("Mnemonic phrase is invalid")
130
156
  except KeyFileError:
131
157
  print_error("KeyFileError: File is not writable")
132
158
 
@@ -697,9 +723,11 @@ async def overview(
697
723
  de_registered_neurons.append(de_registered_neuron)
698
724
 
699
725
  # Add this hotkey to the wallets dict
700
- wallet_ = Wallet(name=wallet)
701
- wallet_.hotkey_ss58 = hotkey_addr
702
- wallet.hotkey_str = hotkey_addr[:5] # Max length of 5 characters
726
+ wallet_ = WalletLike(
727
+ name=wallet.name,
728
+ hotkey_ss58=hotkey_addr,
729
+ hotkey_str=hotkey_addr[:5],
730
+ )
703
731
  # Indicates a hotkey not on local machine but exists in stake_info obj on-chain
704
732
  if hotkey_coldkey_to_hotkey_wallet.get(hotkey_addr) is None:
705
733
  hotkey_coldkey_to_hotkey_wallet[hotkey_addr] = {}
@@ -762,8 +790,7 @@ async def overview(
762
790
  if not hotwallet:
763
791
  # Indicates a mismatch between what the chain says the coldkey
764
792
  # is for this hotkey and the local wallet coldkey-hotkey pair
765
- hotwallet = Wallet(name=nn.coldkey[:7])
766
- hotwallet.hotkey_str = nn.hotkey[:7]
793
+ hotwallet = WalletLike(name=nn.coldkey[:7], hotkey_str=nn.hotkey[:7])
767
794
 
768
795
  nn: NeuronInfoLite
769
796
  uid = nn.uid
@@ -1102,7 +1129,7 @@ def _map_hotkey_to_neurons(
1102
1129
 
1103
1130
  async def _fetch_neuron_for_netuid(
1104
1131
  netuid: int, subtensor: SubtensorInterface
1105
- ) -> tuple[int, dict[str, list[ScaleBytes]]]:
1132
+ ) -> tuple[int, Optional[str]]:
1106
1133
  """
1107
1134
  Retrieves all neurons for a specified netuid
1108
1135
 
@@ -1112,18 +1139,13 @@ async def _fetch_neuron_for_netuid(
1112
1139
  :return: the original netuid, and a mapping of the neurons to their NeuronInfoLite objects
1113
1140
  """
1114
1141
 
1115
- async def neurons_lite_for_uid(uid: int) -> dict[Any, Any]:
1116
- call_definition = TYPE_REGISTRY["runtime_api"]["NeuronInfoRuntimeApi"][
1117
- "methods"
1118
- ]["get_neurons_lite"]
1119
- data = await subtensor.encode_params(
1120
- call_definition=call_definition, params=[uid]
1121
- )
1142
+ async def neurons_lite_for_uid(uid: int) -> Optional[str]:
1122
1143
  block_hash = subtensor.substrate.last_block_hash
1123
- hex_bytes_result = await subtensor.substrate.rpc_request(
1124
- method="state_call",
1125
- params=["NeuronInfoRuntimeApi_get_neurons_lite", data, block_hash],
1126
- reuse_block_hash=True,
1144
+ hex_bytes_result = await subtensor.query_runtime_api(
1145
+ runtime_api="NeuronInfoRuntimeApi",
1146
+ method="get_neurons_lite",
1147
+ params=[uid],
1148
+ block_hash=block_hash,
1127
1149
  )
1128
1150
 
1129
1151
  return hex_bytes_result
@@ -1134,7 +1156,7 @@ async def _fetch_neuron_for_netuid(
1134
1156
 
1135
1157
  async def _fetch_all_neurons(
1136
1158
  netuids: list[int], subtensor
1137
- ) -> list[tuple[int, list[ScaleBytes]]]:
1159
+ ) -> list[tuple[int, Optional[str]]]:
1138
1160
  """Retrieves all neurons for each of the specified netuids"""
1139
1161
  return list(
1140
1162
  await asyncio.gather(
@@ -1143,50 +1165,21 @@ async def _fetch_all_neurons(
1143
1165
  )
1144
1166
 
1145
1167
 
1146
- def _partial_decode(args):
1147
- """
1148
- Helper function for passing to ProcessPoolExecutor that decodes scale bytes based on a set return type and
1149
- rpc type registry, passing this back to the Executor with its specified netuid for easier mapping
1150
-
1151
- :param args: (return type, scale bytes object, custom rpc type registry, netuid)
1152
-
1153
- :return: (original netuid, decoded object)
1154
- """
1155
- return_type, as_scale_bytes, custom_rpc_type_registry_, netuid_ = args
1156
- decoded = decode_scale_bytes(return_type, as_scale_bytes, custom_rpc_type_registry_)
1157
- if decoded.startswith("0x"):
1158
- bytes_result = bytes.fromhex(decoded[2:])
1159
- else:
1160
- bytes_result = bytes.fromhex(decoded)
1161
-
1162
- return netuid_, NeuronInfoLite.list_from_vec_u8(bytes_result)
1163
-
1164
-
1165
1168
  def _process_neurons_for_netuids(
1166
- netuids_with_all_neurons_hex_bytes: list[tuple[int, list[ScaleBytes]]],
1169
+ netuids_with_all_neurons_hex_bytes: list[tuple[int, Optional[str]]],
1167
1170
  ) -> list[tuple[int, list[NeuronInfoLite]]]:
1168
1171
  """
1169
- Using multiprocessing to decode a list of hex-bytes neurons with their respective netuid
1172
+ Decode a list of hex-bytes neurons with their respective netuid
1170
1173
 
1171
1174
  :param netuids_with_all_neurons_hex_bytes: netuids with hex-bytes neurons
1172
1175
  :return: netuids mapped to decoded neurons
1173
1176
  """
1174
-
1175
- def make_map(res_):
1176
- netuid_, json_result = res_
1177
- hex_bytes_result = json_result["result"]
1178
- as_scale_bytes = scalecodec.ScaleBytes(hex_bytes_result)
1179
- return [return_type, as_scale_bytes, custom_rpc_type_registry, netuid_]
1180
-
1181
- return_type = TYPE_REGISTRY["runtime_api"]["NeuronInfoRuntimeApi"]["methods"][
1182
- "get_neurons_lite"
1183
- ]["type"]
1184
-
1185
- preprocessed = [make_map(r) for r in netuids_with_all_neurons_hex_bytes]
1186
- with ProcessPoolExecutor() as executor:
1187
- results = list(executor.map(_partial_decode, preprocessed))
1188
-
1189
- all_results = [(netuid, result) for netuid, result in results]
1177
+ all_results = [
1178
+ (netuid, NeuronInfoLite.list_from_vec_u8(bytes.fromhex(result[2:])))
1179
+ if result
1180
+ else (netuid, [])
1181
+ for netuid, result in netuids_with_all_neurons_hex_bytes
1182
+ ]
1190
1183
  return all_results
1191
1184
 
1192
1185
 
@@ -1256,11 +1249,17 @@ async def transfer(
1256
1249
  subtensor: SubtensorInterface,
1257
1250
  destination: str,
1258
1251
  amount: float,
1252
+ transfer_all: bool,
1259
1253
  prompt: bool,
1260
1254
  ):
1261
1255
  """Transfer token of amount to destination."""
1262
1256
  await transfer_extrinsic(
1263
- subtensor, wallet, destination, Balance.from_tao(amount), prompt=prompt
1257
+ subtensor,
1258
+ wallet,
1259
+ destination,
1260
+ Balance.from_tao(amount),
1261
+ transfer_all,
1262
+ prompt=prompt,
1264
1263
  )
1265
1264
 
1266
1265
 
@@ -1414,13 +1413,14 @@ async def faucet(
1414
1413
  output_in_place: bool,
1415
1414
  log_verbose: bool,
1416
1415
  max_successes: int = 3,
1416
+ prompt: bool = True,
1417
1417
  ):
1418
1418
  # TODO: - work out prompts to be passed through the cli
1419
1419
  success = await run_faucet_extrinsic(
1420
1420
  subtensor,
1421
1421
  wallet,
1422
1422
  tpb=threads_per_block,
1423
- prompt=False,
1423
+ prompt=prompt,
1424
1424
  update_interval=update_interval,
1425
1425
  num_processes=processes,
1426
1426
  cuda=use_cuda,
@@ -1619,6 +1619,7 @@ async def set_id(
1619
1619
  try:
1620
1620
  wallet.unlock_coldkey()
1621
1621
  except KeyFileError:
1622
+ err_console.print("Error decrypting coldkey (possibly incorrect password)")
1622
1623
  return False
1623
1624
 
1624
1625
  with console.status(
@@ -378,6 +378,7 @@ async def reveal_weights(
378
378
  weights: list[float],
379
379
  salt: list[int],
380
380
  version: int,
381
+ prompt: bool = True,
381
382
  ) -> None:
382
383
  """Reveal weights for a specific subnet."""
383
384
  uids_ = np.array(
@@ -397,7 +398,7 @@ async def reveal_weights(
397
398
  )
398
399
  # Call the reveal function in the module set_weights from extrinsics package
399
400
  extrinsic = SetWeightsExtrinsic(
400
- subtensor, wallet, netuid, uids_, weights_, list(salt_), version
401
+ subtensor, wallet, netuid, uids_, weights_, list(salt_), version, prompt=prompt
401
402
  )
402
403
  success, message = await extrinsic.reveal(weight_uids, weight_vals)
403
404
 
@@ -415,6 +416,7 @@ async def commit_weights(
415
416
  weights: list[float],
416
417
  salt: list[int],
417
418
  version: int,
419
+ prompt: bool = True,
418
420
  ):
419
421
  """Commits weights and then reveals them for a specific subnet"""
420
422
  uids_ = np.array(
@@ -430,7 +432,7 @@ async def commit_weights(
430
432
  dtype=np.int64,
431
433
  )
432
434
  extrinsic = SetWeightsExtrinsic(
433
- subtensor, wallet, netuid, uids_, weights_, list(salt_), version
435
+ subtensor, wallet, netuid, uids_, weights_, list(salt_), version, prompt=prompt
434
436
  )
435
437
  success, message = await extrinsic.set_weights_extrinsic()
436
438
  if success:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: bittensor-cli
3
- Version: 8.2.0
3
+ Version: 8.3.0
4
4
  Summary: Bittensor CLI
5
5
  Home-page: https://github.com/opentensor/btcli
6
6
  Author: bittensor.com
@@ -0,0 +1,31 @@
1
+ bittensor_cli/__init__.py,sha256=O5T0sSkvfCnlXbdjLguIp-4w1jd6Bmb-TXgQINZD1uo,1217
2
+ bittensor_cli/cli.py,sha256=tMJBqFba9L267Ghl8Af228_MIR8h7nHfYrmN1Tz3xR8,169461
3
+ bittensor_cli/doc_generation_helper.py,sha256=GexqjEIKulWg84hpNBEchJ840oOgOi7DWpt447nsdNI,91
4
+ bittensor_cli/src/__init__.py,sha256=9hFSqapIynZbrjc9YHl2wARkPdk4pV5P5zLSvn-EbqM,11856
5
+ bittensor_cli/src/bittensor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
+ bittensor_cli/src/bittensor/async_substrate_interface.py,sha256=EcvAoQcyDa_Sm8Ne-SNtMm8lUkZmkzDto1VUvqG0rlg,103271
7
+ bittensor_cli/src/bittensor/balances.py,sha256=102mg1iiliLSLx-EocQseWGHiWzRqcBBM-MRoObOdKo,10075
8
+ bittensor_cli/src/bittensor/chain_data.py,sha256=IsHWjmhJbTvud2i3IM1sfmBHP82VxNHC1iFDAtlLgXc,26490
9
+ bittensor_cli/src/bittensor/minigraph.py,sha256=17AjEA75MO7ez_NekOJSaAz6ARjPt99QG_7E1RJ_u_k,8891
10
+ bittensor_cli/src/bittensor/networking.py,sha256=pZLMs8YXpZzDMLXWMBb_Bj6TVkm_q9khyY-lnbwVMuE,462
11
+ bittensor_cli/src/bittensor/subtensor_interface.py,sha256=cwbRhS5qV0Jmref5Qe7rsuDy8ssrRqdObKHvaeGeoOc,43373
12
+ bittensor_cli/src/bittensor/utils.py,sha256=cvtej2aKix_EEU5FBeBCd3vIEZSt44R0dCidny7zyoA,33663
13
+ bittensor_cli/src/bittensor/extrinsics/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
+ bittensor_cli/src/bittensor/extrinsics/registration.py,sha256=xrEdN_gbL6fFNh-tZRwgB-Xpb8fUer1nSd3Xr5f7x9g,59202
15
+ bittensor_cli/src/bittensor/extrinsics/root.py,sha256=RZEQv6QVDAQDjuX_vgjOMsatYvHpA3MW8zueiL6jxlE,19376
16
+ bittensor_cli/src/bittensor/extrinsics/transfer.py,sha256=ZqbUcaGVENFP0nviLj914lJXcQ_bHpUpyudPlrmSCzw,8830
17
+ bittensor_cli/src/bittensor/templates/table.j2,sha256=P2EFiksnO1cQsB8zjK6hVJwUryHTsLslzRE0YtobAV8,10601
18
+ bittensor_cli/src/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
19
+ bittensor_cli/src/commands/root.py,sha256=MiNdEg2SCPYv4Q_8aSgGn_9Giotv-k5JEnwgjrDA09A,62753
20
+ bittensor_cli/src/commands/subnets.py,sha256=0tf3DhdCmvIQA_64gFTfhk9spOA9PHSn4NUsswjbY0U,33445
21
+ bittensor_cli/src/commands/sudo.py,sha256=lpmZBT2xoAcERQNjJN__6nBmFUNcbXFTdNvl3S_T5Cg,8310
22
+ bittensor_cli/src/commands/wallets.py,sha256=lHuChXL9n4esIktENZjffdVnNKaFQaBhtuIHvunqrvs,60286
23
+ bittensor_cli/src/commands/weights.py,sha256=UHakAMTNqRkg_fkiyebbZAT9T3UEf93MmdbFgPSbqUw,16520
24
+ bittensor_cli/src/commands/stake/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
25
+ bittensor_cli/src/commands/stake/children_hotkeys.py,sha256=3FapotpWGbE_i6RELt0Sqlk5Bvao4Sd3tQibLS13nKQ,28667
26
+ bittensor_cli/src/commands/stake/stake.py,sha256=lGLMWdE3RVmYcr57pMwKljQI8vRX3WFRltmXWHdnKy8,56622
27
+ bittensor_cli-8.3.0.dist-info/METADATA,sha256=5SilMKuTyLT2Y6r_zi1Gh3kFJWSzWUQvidQQADezkfs,6788
28
+ bittensor_cli-8.3.0.dist-info/WHEEL,sha256=eOLhNAGa2EW3wWl_TU484h7q1UNgy0JXjjoqKoxAAQc,92
29
+ bittensor_cli-8.3.0.dist-info/entry_points.txt,sha256=hBTLGLbVxmAKy69XSKaUZvjTCmyEzDGZKq4S8UOto8I,49
30
+ bittensor_cli-8.3.0.dist-info/top_level.txt,sha256=DvgvXpmTtI_Q1BbDZMlK90LFcGFCreN1daViEPV2iFw,14
31
+ bittensor_cli-8.3.0.dist-info/RECORD,,
@@ -1,31 +0,0 @@
1
- bittensor_cli/__init__.py,sha256=WH9TS8uqnwvM-2dRi2r81kALhCvyKsT70HQvQkpUXIk,1217
2
- bittensor_cli/cli.py,sha256=jHkl5uLraMOUggbhQLrHZI7yOeMXJ-mnu0TN4bdgZI4,168060
3
- bittensor_cli/doc_generation_helper.py,sha256=GexqjEIKulWg84hpNBEchJ840oOgOi7DWpt447nsdNI,91
4
- bittensor_cli/src/__init__.py,sha256=6LdZwIvoSr6UomZUH_wNFeo7cNPgxl_dZhtdC5asJgA,11746
5
- bittensor_cli/src/bittensor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
- bittensor_cli/src/bittensor/async_substrate_interface.py,sha256=oKsN1dx7awdgicGydXPJLbpqnYxwQkBSvdtDu6Pgkmw,102894
7
- bittensor_cli/src/bittensor/balances.py,sha256=102mg1iiliLSLx-EocQseWGHiWzRqcBBM-MRoObOdKo,10075
8
- bittensor_cli/src/bittensor/chain_data.py,sha256=IsHWjmhJbTvud2i3IM1sfmBHP82VxNHC1iFDAtlLgXc,26490
9
- bittensor_cli/src/bittensor/minigraph.py,sha256=17AjEA75MO7ez_NekOJSaAz6ARjPt99QG_7E1RJ_u_k,8891
10
- bittensor_cli/src/bittensor/networking.py,sha256=pZLMs8YXpZzDMLXWMBb_Bj6TVkm_q9khyY-lnbwVMuE,462
11
- bittensor_cli/src/bittensor/subtensor_interface.py,sha256=65XS6Wy2GqM2v1PIhCZSxtYU_ANvN7svBDVZCTFVVjQ,43378
12
- bittensor_cli/src/bittensor/utils.py,sha256=oBZpLnT_o8rMr333xErJHoaEo6wCA8p2vPVs_PuWIy8,33668
13
- bittensor_cli/src/bittensor/extrinsics/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
- bittensor_cli/src/bittensor/extrinsics/registration.py,sha256=lUg26xkkx7KBC3UzNZl5bl3T9oKldfQ_cCxY5BxrPjQ,58736
15
- bittensor_cli/src/bittensor/extrinsics/root.py,sha256=WTJ5BPVcwb-bO86C6osHsf38V9xGWjxwOrHetYCGT-Y,19208
16
- bittensor_cli/src/bittensor/extrinsics/transfer.py,sha256=HcssjHhEob4k1wJPNPw5ZSkeCK5orifLJ3ib-yPMMqM,8302
17
- bittensor_cli/src/bittensor/templates/table.j2,sha256=P2EFiksnO1cQsB8zjK6hVJwUryHTsLslzRE0YtobAV8,10601
18
- bittensor_cli/src/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
19
- bittensor_cli/src/commands/root.py,sha256=pjpG8aoU7Nl2_luOmsBQrre68PyAs7ai_8RffTw99JM,62333
20
- bittensor_cli/src/commands/subnets.py,sha256=r8ixt5XAhpkBgpRvpmMHYeDr0DcKVMKBBjpZk-qZg6w,33341
21
- bittensor_cli/src/commands/sudo.py,sha256=uRimJ2EDrcanajrvtl_qMM16OOO3HuJvU_N50ePiPAY,8226
22
- bittensor_cli/src/commands/wallets.py,sha256=SaukCL7FJ_jpHgrAAZywXUjqgF7qJ0qGqN4qqEC2iUM,60324
23
- bittensor_cli/src/commands/weights.py,sha256=3BCqVB1-W6BG0U_iOtuUZmFOQ9QngsnXAkBLwCHjK0g,16440
24
- bittensor_cli/src/commands/stake/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
25
- bittensor_cli/src/commands/stake/children_hotkeys.py,sha256=AlELV1ZiZbDuD8hkTpd5WhBs3P8zEF371vjZBgUkLfk,28610
26
- bittensor_cli/src/commands/stake/stake.py,sha256=vql-9f7hlj8DLbFRLAXqEDlx2kxJ9DVo_VInRu2LK1I,56146
27
- bittensor_cli-8.2.0.dist-info/METADATA,sha256=BxV3i4OcFYjcXYMivFJyyMXrqmx7EMSUrNwJayZyPxw,6788
28
- bittensor_cli-8.2.0.dist-info/WHEEL,sha256=eOLhNAGa2EW3wWl_TU484h7q1UNgy0JXjjoqKoxAAQc,92
29
- bittensor_cli-8.2.0.dist-info/entry_points.txt,sha256=hBTLGLbVxmAKy69XSKaUZvjTCmyEzDGZKq4S8UOto8I,49
30
- bittensor_cli-8.2.0.dist-info/top_level.txt,sha256=DvgvXpmTtI_Q1BbDZMlK90LFcGFCreN1daViEPV2iFw,14
31
- bittensor_cli-8.2.0.dist-info/RECORD,,