diff --git a/app/src/auto_validator/core/admin.py b/app/src/auto_validator/core/admin.py index 24b12a7..d8a68a6 100644 --- a/app/src/auto_validator/core/admin.py +++ b/app/src/auto_validator/core/admin.py @@ -32,10 +32,9 @@ class UploadedFileAdmin(admin.ModelAdmin): @admin.register(Subnet) class SubnetAdmin(admin.ModelAdmin): list_display = ( - "name", - "description", - "mainnet_id", - "testnet_id", + "codename", + "mainnet_netuid", + "testnet_netuid", "owner_nick", "registered_networks", ) diff --git a/app/src/auto_validator/core/api.py b/app/src/auto_validator/core/api.py index 5acb3aa..cf601d1 100644 --- a/app/src/auto_validator/core/api.py +++ b/app/src/auto_validator/core/api.py @@ -1,6 +1,11 @@ -from rest_framework import mixins, parsers, routers, viewsets +import logging +import pathlib + +from django.conf import settings +from rest_framework import mixins, parsers, routers, status, viewsets from rest_framework.exceptions import AuthenticationFailed from rest_framework.permissions import AllowAny +from rest_framework.response import Response from auto_validator.core.models import Hotkey, Server, UploadedFile, ValidatorInstance from auto_validator.core.serializers import UploadedFileSerializer @@ -8,6 +13,12 @@ from .authentication import HotkeyAuthentication from .utils.bot import trigger_bot_send_message +from .utils.utils import get_dumper_commands + +SUBNETS_CONFIG_PATH = pathlib.Path(settings.LOCAL_SUBNETS_SCRIPTS_PATH) / "subnets.yaml" + +logger = logging.getLogger(__name__) +logger.setLevel(logging.INFO) class FilesViewSet(mixins.CreateModelMixin, mixins.ListModelMixin, viewsets.GenericViewSet): @@ -50,6 +61,24 @@ def perform_create(self, serializer): ) +class DumperCommandsViewSet(viewsets.ViewSet): + parser_classes = [parsers.MultiPartParser] + permission_classes = [AllowAny] + + def list(self, request): + subnet_identifier = request.headers.get("SubnetID") + if not subnet_identifier: + return Response({"error": "SubnetID is required"}, status=status.HTTP_400_BAD_REQUEST) + + dumper_commands = get_dumper_commands(subnet_identifier, SUBNETS_CONFIG_PATH) + if dumper_commands is not None: + logger.info("SubnetID: %s, dumper_commands: %s", subnet_identifier, dumper_commands) + return Response(dumper_commands) + else: + logger.error("SubnetID: %s not found", subnet_identifier) + return Response({"error": "SubnetID not found"}, status=status.HTTP_404_NOT_FOUND) + + class APIRootView(routers.DefaultRouter.APIRootView): description = "api-root" @@ -60,3 +89,4 @@ class APIRouter(routers.DefaultRouter): router = APIRouter() router.register(r"files", FilesViewSet, basename="file") +router.register(r"commands", DumperCommandsViewSet, basename="commands") diff --git a/app/src/auto_validator/core/migrations/0012_rename_hw_requirements_subnet_hardware_description_and_more.py b/app/src/auto_validator/core/migrations/0012_rename_hw_requirements_subnet_hardware_description_and_more.py new file mode 100644 index 0000000..ae16956 --- /dev/null +++ b/app/src/auto_validator/core/migrations/0012_rename_hw_requirements_subnet_hardware_description_and_more.py @@ -0,0 +1,58 @@ +# Generated by Django 4.2.16 on 2024-10-08 01:54 + +import django.contrib.postgres.fields +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ("core", "0011_alter_subnet_hw_requirements"), + ] + + operations = [ + migrations.RenameField( + model_name="subnet", + old_name="hw_requirements", + new_name="hardware_description", + ), + migrations.RenameField( + model_name="subnet", + old_name="mainnet_id", + new_name="mainnet_netuid", + ), + migrations.RenameField( + model_name="subnet", + old_name="maintainers_ids", + new_name="maintainer_discord_ids", + ), + migrations.RenameField( + model_name="subnet", + old_name="owner_id", + new_name="owner_discord_id", + ), + migrations.RenameField( + model_name="subnet", + old_name="testnet_id", + new_name="testnet_netuid", + ), + migrations.AddField( + model_name="subnet", + name="allowed_secrets", + field=django.contrib.postgres.fields.ArrayField( + base_field=models.CharField(max_length=255), + blank=True, + null=True, + size=None, + ), + ), + migrations.AddField( + model_name="subnet", + name="dumper_commands", + field=django.contrib.postgres.fields.ArrayField( + base_field=models.CharField(max_length=255), + blank=True, + null=True, + size=None, + ), + ), + ] diff --git a/app/src/auto_validator/core/models.py b/app/src/auto_validator/core/models.py index 47efd8f..b009055 100644 --- a/app/src/auto_validator/core/models.py +++ b/app/src/auto_validator/core/models.py @@ -49,13 +49,15 @@ class Subnet(models.Model): description = models.TextField(null=True, blank=True) operators = models.ManyToManyField("Operator", related_name="subnets", blank=True) codename = models.CharField(max_length=255, null=True, blank=True) - mainnet_id = models.IntegerField(null=True, blank=True) - testnet_id = models.IntegerField(null=True, blank=True) + mainnet_netuid = models.IntegerField(null=True, blank=True) + testnet_netuid = models.IntegerField(null=True, blank=True) owner_nick = models.CharField(max_length=255, null=True, blank=True) - owner_id = models.CharField(max_length=255, null=True, blank=True) - maintainers_ids = ArrayField(models.CharField(max_length=255), null=True, blank=True) + owner_discord_id = models.CharField(max_length=255, null=True, blank=True) + maintainer_discord_ids = ArrayField(models.CharField(max_length=255), null=True, blank=True) github_repo = models.CharField(max_length=255, null=True, blank=True) - hw_requirements = models.TextField(max_length=4095, null=True, blank=True) + hardware_description = models.TextField(max_length=4095, null=True, blank=True) + allowed_secrets = ArrayField(models.CharField(max_length=255), null=True, blank=True) + dumper_commands = ArrayField(models.CharField(max_length=255), null=True, blank=True) def registered_networks(self): mainnet_slots = self.slots.filter( diff --git a/app/src/auto_validator/core/tasks.py b/app/src/auto_validator/core/tasks.py index 4548f1c..c9a495f 100644 --- a/app/src/auto_validator/core/tasks.py +++ b/app/src/auto_validator/core/tasks.py @@ -1,13 +1,20 @@ -import bittensor as bt +import os +import shutil + +import bittensor as bt # type: ignore import structlog -from celery import shared_task -from celery.utils.log import get_task_logger +from celery import shared_task # type: ignore +from celery.utils.log import get_task_logger # type: ignore from django.conf import settings +from git import GitCommandError, Repo from auto_validator.celery import app from .models import SubnetSlot, ValidatorInstance +GITHUB_SUBNETS_SCRIPTS_PATH = settings.GITHUB_SUBNETS_SCRIPTS_PATH +LOCAL_SUBNETS_SCRIPTS_PATH = settings.LOCAL_SUBNETS_SCRIPTS_PATH + logger = structlog.wrap_logger(get_task_logger(__name__)) @@ -53,3 +60,26 @@ def update_validator_status_for_slot(slot_id): def fetch_last_updated_from_metagraph(metagraph, public_key): return metagraph.last_update[metagraph.hotkeys.index(public_key)] + + +@app.task +def schedule_fetch_subnet_scripts(): + fetch_subnet_scripts.delay() + + +@shared_task +def fetch_subnet_scripts(): + logger.info("Fetching subnet scripts") + try: + # Clone the subnet scripts repository using GitPython + if os.path.exists(LOCAL_SUBNETS_SCRIPTS_PATH): + # If the directory already exists, remove it + shutil.rmtree(LOCAL_SUBNETS_SCRIPTS_PATH) + + Repo.clone_from(GITHUB_SUBNETS_SCRIPTS_PATH, LOCAL_SUBNETS_SCRIPTS_PATH) + except GitCommandError as e: + logger.error(f"Error while cloning the repository: {e}") + return + + logger.info("Successfully fetched subnet scripts") + return diff --git a/app/src/auto_validator/core/tests/conftest.py b/app/src/auto_validator/core/tests/conftest.py index 80c2bb8..529b483 100644 --- a/app/src/auto_validator/core/tests/conftest.py +++ b/app/src/auto_validator/core/tests/conftest.py @@ -1,7 +1,6 @@ from collections.abc import Generator import bittensor as bt -import pexpect import pytest from rest_framework.authtoken.models import Token from rest_framework.test import APIClient @@ -86,42 +85,11 @@ def __eq__(self, other): def wallet(): coldkey_name = "auto-validator7" hotkey_name = "testhotkey7" - command1 = f"btcli wallet new_coldkey --wallet.name {coldkey_name}" - command2 = f"btcli wallet new_hotkey --wallet.name {coldkey_name} --wallet.hotkey {hotkey_name}" - has_coldkey = False - has_hotkey = False - password = "your_password_here" - - try: - wallet = bt.wallet(name=coldkey_name, hotkey=hotkey_name) - wallet.coldkeypub # make sure wallet has coldkey file, if not, it will raise an exception - has_coldkey = True - wallet.hotkey # make sure wallet has hotkey file, if not, it will raise an exception - has_hotkey = True - except bt.KeyFileError: - if not has_coldkey: - process = pexpect.spawn(command1, timeout=30) - try: - process.expect("Specify password for key encryption:") - process.sendline(password) - - process.expect("Retype your password:") - process.sendline(password) - - process.expect(pexpect.EOF) - except pexpect.TIMEOUT: - print("Timeout occurred while creating coldkey.") - finally: - process.close() - - if not has_hotkey: - process = pexpect.spawn(command2, timeout=30) - try: - process.expect(pexpect.EOF) - except pexpect.TIMEOUT: - print("Timeout occurred while creating hotkey.") - finally: - process.close() - wallet = bt.wallet(name=coldkey_name, hotkey=hotkey_name) + + wallet = bt.Wallet(name=coldkey_name, hotkey=hotkey_name, path=".bittensor/wallets") + if not wallet.coldkey_file.exists_on_device(): + wallet.create_new_coldkey(overwrite=True, use_password=False) + if not wallet.hotkey_file.exists_on_device(): + wallet.create_new_hotkey(overwrite=True, use_password=False) return wallet diff --git a/app/src/auto_validator/core/utils/childhotkey.py b/app/src/auto_validator/core/utils/childhotkey.py new file mode 100644 index 0000000..ee86b49 --- /dev/null +++ b/app/src/auto_validator/core/utils/childhotkey.py @@ -0,0 +1,99 @@ +import logging +import sys +from io import StringIO + +from bittensor import Wallet +from bittensor_cli import CLIManager + +from ..models import Hotkey + + +class ChildHotkey: + def __init__( + self, parent_wallet_name: str, parent_hotkey_name: str, parent_wallet_path: str = "~/.bittensor/wallets" + ): + self.logger = logging.getLogger(__name__) + self.parent_wallet_name = parent_wallet_name + self.parent_hotkey_name = parent_hotkey_name + self.parent_wallet_path = parent_wallet_path + + def connect_to_parent_wallet(self): + self.parent_wallet = Wallet(name=self.parent_wallet_name, hotkey=self.parent_hotkey_name) + if not self.parent_wallet.coldkey_file.exists_on_device(): + raise ValueError("Coldkey file for parent wallet %s not found.", self.parent_wallet_name) + if not self.parent_wallet.hotkey_file.exists_on_device(): + raise ValueError("Hotkey file for parent wallet %s not found.", self.parent_wallet_name) + + def __enter__(self): + self.connect_to_parent_wallet() + return self + + def create_new_child_hotkey( + self, + network: str, + netuid: int, + child_wallet_name: str, + child_hotkey_name: str, + proportion: float = 1, + ) -> str: + child_wallet = Wallet(name=child_wallet_name, hotkey=child_hotkey_name) + if not child_wallet.coldkey_file.exists_on_device(): + child_wallet.create_new_coldkey(overwrite=False, use_password=False) + if not child_wallet.hotkey_file.exists_on_device(): + child_wallet.create_new_hotkey(overwrite=False, use_password=False) + + cli_manager = CLIManager() + sys.stdin = StringIO("y\n") + cli_manager.stake_set_children( + wallet_name=self.parent_wallet_name, + wallet_hotkey=self.parent_hotkey_name, + wallet_path=self.parent_wallet_path, + network=network, + netuid=netuid, + all_netuids=False, + children=[child_wallet.hotkey.ss58_address], + proportions=[proportion], + quiet=True, + verbose=False, + wait_for_finalization=True, + wait_for_inclusion=True, + ) + sys.stdin = sys.__stdin__ + Hotkey.objects.create(hotkey=child_wallet.hotkey.ss58_address) + return child_wallet.hotkey.ss58_address + + def get_child_hotkeys(self, network: str, netuid: int): + cli_manager = CLIManager() + result = cli_manager.stake_get_children( + wallet_name=self.parent_wallet_name, + wallet_hotkey=self.parent_hotkey_name, + wallet_path=self.parent_wallet_path, + network=network, + netuid=netuid, + all_netuids=False, + quiet=True, + verbose=False, + ) + return result + + def revoke_child_hotkeys( + self, + network: str, + netuid: int, + ) -> bool: + cli_manager = CLIManager() + sys.stdin = StringIO("y\n") + cli_manager.stake_revoke_children( + wallet_name=self.parent_wallet_name, + wallet_hotkey=self.parent_hotkey_name, + wallet_path=self.parent_wallet_path, + network=network, + netuid=netuid, + all_netuids=False, + quiet=True, + verbose=False, + wait_for_finalization=True, + wait_for_inclusion=True, + ) + sys.stdin = sys.__stdin__ + return True diff --git a/app/src/auto_validator/core/utils/generate_env.py b/app/src/auto_validator/core/utils/generate_env.py new file mode 100644 index 0000000..41650ac --- /dev/null +++ b/app/src/auto_validator/core/utils/generate_env.py @@ -0,0 +1,21 @@ +import json +import sys + + +def generate_env(env_template_path, pre_config_path, env_path): + with open(env_template_path) as env_template_file: + env_template = env_template_file.read() + with open(pre_config_path) as pre_config_file: + pre_config = json.load(pre_config_file) + + with open(env_path, "w") as env_file: + env_file.write(f"{env_template}\n") + for key, value in pre_config.items(): + env_file.write(f"{key}={value}\n") + + +if __name__ == "__main__": + env_template_path = sys.argv[1] + pre_config_path = sys.argv[2] + env_path = sys.argv[3] + generate_env(env_template_path, pre_config_path, env_path) diff --git a/app/src/auto_validator/core/utils/ssh.py b/app/src/auto_validator/core/utils/ssh.py new file mode 100644 index 0000000..ede32a4 --- /dev/null +++ b/app/src/auto_validator/core/utils/ssh.py @@ -0,0 +1,83 @@ +import logging +import os + +import paramiko # type: ignore +from scp import SCPClient, SCPException # type: ignore + + +class SSH_Manager: + def __init__(self, host: str, username: str, key_filename: str, passphrase: str, port: int = 22): + self.host = host + self.port = port + self.username = username + self.key_filename = key_filename + self.passphrase = passphrase + self.logger = logging.getLogger(__name__) + + def connect(self) -> bool: + try: + self.client = paramiko.SSHClient() + self.client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) + self.client.connect( + self.host, + port=self.port, + username=self.username, + key_filename=self.key_filename, + passphrase=self.passphrase, + ) + except Exception as e: + self.logger.exception("SSH Execute Command Error: %s", e) + return False + return True + + def execute_command(self, command: str) -> str: + _, stdout, stderr = self.client.exec_command(command) + stdout.channel.recv_exit_status() + error_output = stderr.read().decode("utf-8") + if error_output: + self.logger.error("Command: %s failed with error: %s", command, error_output) + raise Exception(f"Command: {command} failed with error: {error_output}") + self.logger.info("Command: %s executed successfully", command) + return stdout.read().decode("utf-8") + + def close(self): + self.client.close() + + def __enter__(self): + self.connect() + return self + + def __exit__(self, type, value, traceback): + self.close() + + def copy_files_to_remote(self, local_files: list, remote_path: str) -> None: + # Check if the remote path exists, if not, create it + if remote_path.endswith("/"): + self.execute_command(f"mkdir -p {remote_path}") + else: + remote_dir = os.path.dirname(remote_path) + self.execute_command(f"mkdir -p {remote_dir}") + + self.logger.info(f"{local_files} will be copied to {remote_path}") + + if self.client.get_transport() is None or not self.client.get_transport().is_active(): + raise Exception("SSH connection is not open") + + # Ensure local_files is a list + if isinstance(local_files, str): + local_files = [local_files] + + with SCPClient(self.client.get_transport()) as scp: + try: + for local_file in local_files: + scp.put(local_file, remote_path) + # If remote_path is a file, we only need to copy one file + if not remote_path.endswith("/"): + break + self.logger.info("Files copied to remote server successfully") + except SCPException as e: + self.logger.exception("SCP Error: %s", e) + raise SCPException("SCP Error: %s", e) + except OSError as e: + self.logger.exception("IOError: %s", e) + raise OSError("IOError: %s", e) diff --git a/app/src/auto_validator/core/utils/utils.py b/app/src/auto_validator/core/utils/utils.py index 88a9a50..3c39dd7 100644 --- a/app/src/auto_validator/core/utils/utils.py +++ b/app/src/auto_validator/core/utils/utils.py @@ -1,26 +1,51 @@ +import csv import difflib import json +import os +import bittensor as bt # type: ignore import requests -from django.conf import settings -from django.shortcuts import redirect, render +import yaml +from django.conf import settings # type: ignore +from django.http.response import HttpResponse, HttpResponseRedirect # type: ignore +from django.shortcuts import redirect, render # type: ignore from ..models import Subnet +from .ssh import SSH_Manager -GITHUB_URL = settings.SUBNETS_INFO_GITHUB_URL +GITHUB_SUBNETS_CONFIG_PATH = settings.GITHUB_SUBNETS_CONFIG_PATH +LOCAL_SUBNETS_CONFIG_PATH = settings.LOCAL_SUBNETS_CONFIG_PATH +GITHUB_SUBNETS_SCRIPTS_PATH = settings.GITHUB_SUBNETS_SCRIPTS_PATH +LOCAL_SUBNETS_SCRIPTS_PATH = settings.LOCAL_SUBNETS_SCRIPTS_PATH -def fetch_and_compare_subnets(request): - response = requests.get(GITHUB_URL, timeout=30) +GITHUB_VALIDATORS_CONFIG_PATH = settings.GITHUB_VALIDATORS_CONFIG_PATH +LOCAL_VALIDATORS_CONFIG_PATH = settings.LOCAL_VALIDATORS_CONFIG_PATH + +BITTENSOR_WALLET_PATH = settings.BITTENSOR_WALLET_PATH +BITTENSOR_WALLET_NAME = settings.BITTENSOR_WALLET_NAME +BITTENSOR_HOTKEY_NAME = settings.BITTENSOR_HOTKEY_NAME +VALIDATOR_SECRET_VALUE_TYPES = settings.VALIDATOR_SECRET_VALUE_TYPES +MAINNET_CHAIN_ENDPOINT = settings.MAINNET_CHAIN_ENDPOINT +TESTNET_CHAIN_ENDPOINT = settings.TESTNET_CHAIN_ENDPOINT + + +def fetch_and_compare_subnets(request: requests.Request) -> requests.Response | HttpResponse | HttpResponseRedirect: + response = requests.get(GITHUB_SUBNETS_CONFIG_PATH, timeout=30) if response.status_code != 200: return render(request, "admin/sync_error.html", {"error": "Failed to fetch data from GitHub."}) - github_data = response.json() + github_data = yaml.safe_load(response.text) db_data = list(Subnet.objects.values()) - - github_data = [subnet for subnet in github_data.values()] + github_data_list = [] + for codename, subnet in github_data.items(): + subnet["codename"] = codename + subnet.pop("bittensor_id", None) + subnet.pop("twitter", None) + github_data_list.append(subnet) + # github_data = [for codename, subnet in github_data.items()] db_data = [{k: v for k, v in subnet.items() if k != "id"} for subnet in db_data] - github_data_str = json.dumps(github_data, indent=2, sort_keys=True) + github_data_str = json.dumps(github_data_list, indent=2, sort_keys=True) db_data_str = json.dumps(db_data, indent=2, sort_keys=True) diff = difflib.unified_diff( @@ -29,7 +54,7 @@ def fetch_and_compare_subnets(request): diff_str = "\n".join(diff) if request.method == "POST": - new_data = list(github_data) + new_data = github_data_list for subnet_data in new_data: subnet, created = Subnet.objects.update_or_create( codename=subnet_data.get("codename"), defaults=subnet_data @@ -46,10 +71,126 @@ def fetch_and_compare_subnets(request): ) -def get_user_ip(request): +def get_user_ip(request: requests.Request) -> str: ip_address = request.META.get("HTTP_X_FORWARDED_FOR") if ip_address: ip_address = ip_address.split(",")[0] else: ip_address = request.META.get("REMOTE_ADDR") return ip_address + + +def generate_pre_config_file( + subnet_codename: str, blockchain: str, netuid: int, remote_ip_address: str, yaml_file_path: str, csv_file_path: str +): + yaml_file_path = os.path.expanduser(yaml_file_path) + csv_file_path = os.path.expanduser(csv_file_path) + pre_config_path = os.path.expanduser(f"{LOCAL_SUBNETS_SCRIPTS_PATH}/{subnet_codename}/pre_config.json") + with open(yaml_file_path) as file: + data = yaml.safe_load(file) + if subnet_codename not in data: + raise ValueError("Subnet codename %s not found in YAML file.", subnet_codename) + allowed_secrets = data[subnet_codename].get("allowed_secrets", []) + + secrets = {} + with open(csv_file_path) as csv_file: + reader = csv.DictReader(csv_file) + for row in reader: + if row["SECRET_KEYS"] in allowed_secrets: + if row["SECRET_VALUES"] == VALIDATOR_SECRET_VALUE_TYPES.get("RANDOM"): + secrets[row["SECRET_KEYS"]] = os.urandom(32).hex() + elif row["SECRET_VALUES"] == VALIDATOR_SECRET_VALUE_TYPES.get("HOTKEY_SS58_ADDRESS"): + secrets[row["SECRET_KEYS"]] = bt.Wallet( + name=BITTENSOR_WALLET_NAME, hotkey=BITTENSOR_HOTKEY_NAME + ).hotkey.ss58_address + elif row["SECRET_VALUES"] == VALIDATOR_SECRET_VALUE_TYPES.get("IP_ADDRESS"): + secrets[row["SECRET_KEYS"]] = remote_ip_address + else: + secrets[row["SECRET_KEYS"]] = row["SECRET_VALUES"] + secrets["SUBNET_CODENAME"] = subnet_codename + secrets["BITTENSOR_NETWORK"] = "finney" if blockchain == "mainnet" else "test" + secrets["BITTENSOR_CHAIN_ENDPOINT"] = MAINNET_CHAIN_ENDPOINT if blockchain == "mainnet" else TESTNET_CHAIN_ENDPOINT + secrets["BITTENSOR_NETUID"] = netuid + + with open(pre_config_path, "w") as file: + json.dump(secrets, file, indent=4) + + return pre_config_path + + +def install_validator_on_remote_server( + subnet_codename: str, + blockchain: str, + netuid: int, + ssh_ip_address: str, + ssh_user: str, + ssh_key_path: str, + ssh_passphrase: str, +): + subnet_config_file_path = LOCAL_SUBNETS_SCRIPTS_PATH / "subnets.yaml" + csv_file_path = os.path.abspath("../../secrets.csv") + + local_hotkey_path = BITTENSOR_WALLET_PATH / BITTENSOR_WALLET_NAME / "hotkeys" / BITTENSOR_HOTKEY_NAME + local_coldkeypub_path = BITTENSOR_WALLET_PATH / BITTENSOR_WALLET_NAME / "coldkeypub.txt" + + generate_pre_config_file( + subnet_codename, blockchain, netuid, ssh_ip_address, subnet_config_file_path, csv_file_path + ) + + # Extract remote path from .env.template file + local_env_template_path = os.path.expanduser(LOCAL_SUBNETS_SCRIPTS_PATH / subnet_codename / ".env.template") + + with open(local_env_template_path) as env_file: + for line in env_file: + if line.startswith("TARGET_PATH"): + remote_path = line.split("=")[1].strip() + break + local_directory = os.path.expanduser(LOCAL_SUBNETS_SCRIPTS_PATH / subnet_codename) + local_files = [ + os.path.join(local_directory, file) + for file in os.listdir(local_directory) + if os.path.isfile(os.path.join(local_directory, file)) + ] + local_generator_path = os.path.abspath("auto_validator/core/utils/generate_env.py") + local_files.append(local_generator_path) + with SSH_Manager(ssh_ip_address, ssh_user, ssh_key_path, ssh_passphrase) as ssh_manager: + ssh_manager.copy_files_to_remote(local_files, remote_path) + + remote_hotkey_path = "~/.bittensor/wallets/validator/hotkeys/validator-hotkey" + local_hotkey_file = [str(local_hotkey_path)] + ssh_manager.copy_files_to_remote(local_hotkey_file, remote_hotkey_path) + + remote_coldkey_path = "~/.bittensor/wallets/validator/" + local_coldkey_file = [str(local_coldkeypub_path)] + ssh_manager.copy_files_to_remote(local_coldkey_file, remote_coldkey_path) + + # Generate .env file on remote server + remote_env_template_path = os.path.join(remote_path, ".env.template") + remote_pre_config_path = os.path.join(remote_path, "pre_config.json") + remote_env_path = os.path.join(remote_path, ".env") + command = f"python3 {os.path.join(remote_path, 'generate_env.py')} {remote_env_template_path} {remote_pre_config_path} {remote_env_path}" + ssh_manager.execute_command(command) + ssh_manager.logger.info(command) + + # Run install.sh on remote server + remote_install_script_path = os.path.join(remote_path, "pre_install.sh") + ssh_manager.execute_command(f"bash {remote_install_script_path}") + + +def get_dumper_commands(subnet_identifier: str, config_path: str) -> list: + """ + Get dumper commands for a subnet with normalized subnet identifier. + + Examples: + >>> get_dumper_commands("sn1", "subnets.yaml") + """ + with open(config_path) as file: + data = yaml.safe_load(file) + codename_lower = subnet_identifier.lower() + for codename, sn_config in data.items(): + mainnet_netuid = sn_config.get("mainnet_netuid") + testnet_netuid = sn_config.get("testnet_netuid") + possible_codenames = [str(mainnet_netuid), "sn" + str(mainnet_netuid), str(testnet_netuid), codename] + if codename_lower in map(str.lower, possible_codenames): + return sn_config.get("dumper_commands", []) + return None diff --git a/app/src/auto_validator/settings.py b/app/src/auto_validator/settings.py index 2acc5fa..7515621 100644 --- a/app/src/auto_validator/settings.py +++ b/app/src/auto_validator/settings.py @@ -4,6 +4,7 @@ import inspect import logging +import pathlib from datetime import timedelta from functools import wraps @@ -418,7 +419,8 @@ def configure_structlog(): BT_NETWORK_NAME = env("BT_NETWORK_NAME", default="finney") SUBNETS_INFO_GITHUB_URL = env( - "SUBNETS_INFO_GITHUB_URL", default="https://raw.githubusercontent.com/drunest/subnets-info/main/subnets.json" + "SUBNETS_INFO_GITHUB_URL", + default="https://raw.githubusercontent.com/bactensor/bt-validator-scripts/master/subnets.yaml", ) LINODE_API_KEY = env("LINODE_API_KEY", default="") @@ -426,8 +428,53 @@ def configure_structlog(): SIGNATURE_EXPIRE_DURATION = env("SIGNATURE_EXPIRE_DURATION", default="300") - DISCORD_BOT_TOKEN = env("DISCORD_BOT_TOKEN", default="") GUILD_ID = env("GUILD_ID", default="") BOT_NAME = env("BOT_NAME", default="") CATEGORY_NAME = env("CATEGORY_NAME", default="") + +BITTENSOR_WALLET_PATH = pathlib.Path(env("BITTENSOR_WALLET_PATH", default="/root/.bittensor/wallets")) +BITTENSOR_WALLET_NAME = env("BITTENSOR_WALLET_NAME", default="validator") +BITTENSOR_HOTKEY_NAME = env("BITTENSOR_HOTKEY_NAME", default="validator-hotkey") + +LOCAL_SUBNETS_CONFIG_PATH = pathlib.Path( + env("LOCAL_SUBNETS_CONFIG_PATH", default="~/.config/auto-validator/subnets.yaml") +) + +LOCAL_SUBNETS_SCRIPTS_PATH = pathlib.Path( + env("LOCAL_SUBNETS_SCRIPTS_PATH", default="~/.config/auto-validator/subnet-scripts") +) + +LOCAL_VALIDATORS_CONFIG_PATH = pathlib.Path( + env("LOCAL_VALIDATORS_CONFIG_PATH", default="~/.config/auto-validator/validators.yaml") +) + +GITHUB_SUBNETS_SCRIPTS_PATH = env( + "GITHUB_SUBNETS_SCRIPTS_PATH", default="https://github.com/bactensor/bt-validator-scripts.git" +) + +GITHUB_SUBNETS_CONFIG_PATH = env( + "GITHUB_SUBNETS_CONFIG_PATH", + default="https://raw.githubusercontent.com/bactensor/bt-subnet-config/main/subnets.yaml", +) + +GITHUB_VALIDATORS_CONFIG_PATH = env( + "GITHUB_VALIDATORS_CONFIG_PATH", + default="https://raw.githubusercontent.com/bactensor/bt-validator-config/main/validators.yaml", +) + +VALIDATOR_SECRET_VALUE_TYPES = { + "RANDOM": "random", + "HOTKEY_SS58_ADDRESS": "hotkey_ss58_address", + "IP_ADDRESS": "ip_address", +} + +MAINNET_CHAIN_ENDPOINT = env( + "MAINNET_CHAIN_ENDPOINT", + default="wss://entrypoint-finney.opentensor.ai:443", +) + +TESTNET_CHAIN_ENDPOINT = env( + "TESTNET_CHAIN_ENDPOINT", + default="wss://test.finney.opentensor.ai:443", +) diff --git a/pdm.lock b/pdm.lock index 7ba2d12..c9ae6d1 100644 --- a/pdm.lock +++ b/pdm.lock @@ -5,25 +5,25 @@ groups = ["default", "lint", "test", "type_check"] strategy = ["inherit_metadata"] lock_version = "4.5.0" -content_hash = "sha256:b46e2fbc9b92b0c473a6a21928e806b7157ab4d37d1b9acd9d4cb79ce3870e87" +content_hash = "sha256:ab9eab3a1f2867f58406eae8472cac34a0d5e517040473d079ca275ecc8ad95c" [[metadata.targets]] requires_python = "==3.11.*" [[package]] name = "aiohappyeyeballs" -version = "2.4.2" +version = "2.4.3" requires_python = ">=3.8" summary = "Happy Eyeballs for asyncio" groups = ["default"] files = [ - {file = "aiohappyeyeballs-2.4.2-py3-none-any.whl", hash = "sha256:8522691d9a154ba1145b157d6d5c15e5c692527ce6a53c5e5f9876977f6dab2f"}, - {file = "aiohappyeyeballs-2.4.2.tar.gz", hash = "sha256:4ca893e6c5c1f5bf3888b04cb5a3bee24995398efef6e0b9f747b5e89d84fd74"}, + {file = "aiohappyeyeballs-2.4.3-py3-none-any.whl", hash = "sha256:8a7a83727b2756f394ab2895ea0765a0a8c475e3c71e98d43d76f22b4b435572"}, + {file = "aiohappyeyeballs-2.4.3.tar.gz", hash = "sha256:75cf88a15106a5002a8eb1dab212525c00d1f4c0fa96e551c9fbe6f09a621586"}, ] [[package]] name = "aiohttp" -version = "3.10.6" +version = "3.10.9" requires_python = ">=3.8" summary = "Async http client/server framework (asyncio)" groups = ["default"] @@ -37,22 +37,22 @@ dependencies = [ "yarl<2.0,>=1.12.0", ] files = [ - {file = "aiohttp-3.10.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f52e54fd776ad0da1006708762213b079b154644db54bcfc62f06eaa5b896402"}, - {file = "aiohttp-3.10.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:995ab1a238fd0d19dc65f2d222e5eb064e409665c6426a3e51d5101c1979ee84"}, - {file = "aiohttp-3.10.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0749c4d5a08a802dd66ecdf59b2df4d76b900004017468a7bb736c3b5a3dd902"}, - {file = "aiohttp-3.10.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e05b39158f2af0e2438cc2075cfc271f4ace0c3cc4a81ec95b27a0432e161951"}, - {file = "aiohttp-3.10.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a9f196c970db2dcde4f24317e06615363349dc357cf4d7a3b0716c20ac6d7bcd"}, - {file = "aiohttp-3.10.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:47647c8af04a70e07a2462931b0eba63146a13affa697afb4ecbab9d03a480ce"}, - {file = "aiohttp-3.10.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:669c0efe7e99f6d94d63274c06344bd0e9c8daf184ce5602a29bc39e00a18720"}, - {file = "aiohttp-3.10.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9721cdd83a994225352ca84cd537760d41a9da3c0eacb3ff534747ab8fba6d0"}, - {file = "aiohttp-3.10.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0b82c8ebed66ce182893e7c0b6b60ba2ace45b1df104feb52380edae266a4850"}, - {file = "aiohttp-3.10.6-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:b169f8e755e541b72e714b89a831b315bbe70db44e33fead28516c9e13d5f931"}, - {file = "aiohttp-3.10.6-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:0be3115753baf8b4153e64f9aa7bf6c0c64af57979aa900c31f496301b374570"}, - {file = "aiohttp-3.10.6-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e1f80cd17d81a404b6e70ef22bfe1870bafc511728397634ad5f5efc8698df56"}, - {file = "aiohttp-3.10.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6419728b08fb6380c66a470d2319cafcec554c81780e2114b7e150329b9a9a7f"}, - {file = "aiohttp-3.10.6-cp311-cp311-win32.whl", hash = "sha256:bd294dcdc1afdc510bb51d35444003f14e327572877d016d576ac3b9a5888a27"}, - {file = "aiohttp-3.10.6-cp311-cp311-win_amd64.whl", hash = "sha256:bf861da9a43d282d6dd9dcd64c23a0fccf2c5aa5cd7c32024513c8c79fb69de3"}, - {file = "aiohttp-3.10.6.tar.gz", hash = "sha256:d2578ef941be0c2ba58f6f421a703527d08427237ed45ecb091fed6f83305336"}, + {file = "aiohttp-3.10.9-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:16e6a51d8bc96b77f04a6764b4ad03eeef43baa32014fce71e882bd71302c7e4"}, + {file = "aiohttp-3.10.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8bd9125dd0cc8ebd84bff2be64b10fdba7dc6fd7be431b5eaf67723557de3a31"}, + {file = "aiohttp-3.10.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dcf354661f54e6a49193d0b5653a1b011ba856e0b7a76bda2c33e4c6892f34ea"}, + {file = "aiohttp-3.10.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42775de0ca04f90c10c5c46291535ec08e9bcc4756f1b48f02a0657febe89b10"}, + {file = "aiohttp-3.10.9-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:87d1e4185c5d7187684d41ebb50c9aeaaaa06ca1875f4c57593071b0409d2444"}, + {file = "aiohttp-3.10.9-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c2695c61cf53a5d4345a43d689f37fc0f6d3a2dc520660aec27ec0f06288d1f9"}, + {file = "aiohttp-3.10.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a3f063b41cc06e8d0b3fcbbfc9c05b7420f41287e0cd4f75ce0a1f3d80729e6"}, + {file = "aiohttp-3.10.9-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2d37f4718002863b82c6f391c8efd4d3a817da37030a29e2682a94d2716209de"}, + {file = "aiohttp-3.10.9-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2746d8994ebca1bdc55a1e998feff4e94222da709623bb18f6e5cfec8ec01baf"}, + {file = "aiohttp-3.10.9-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:6f3c6648aa123bcd73d6f26607d59967b607b0da8ffcc27d418a4b59f4c98c7c"}, + {file = "aiohttp-3.10.9-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:558b3d223fd631ad134d89adea876e7fdb4c93c849ef195049c063ada82b7d08"}, + {file = "aiohttp-3.10.9-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:4e6cb75f8ddd9c2132d00bc03c9716add57f4beff1263463724f6398b813e7eb"}, + {file = "aiohttp-3.10.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:608cecd8d58d285bfd52dbca5b6251ca8d6ea567022c8a0eaae03c2589cd9af9"}, + {file = "aiohttp-3.10.9-cp311-cp311-win32.whl", hash = "sha256:36d4fba838be5f083f5490ddd281813b44d69685db910907636bc5dca6322316"}, + {file = "aiohttp-3.10.9-cp311-cp311-win_amd64.whl", hash = "sha256:8be1a65487bdfc285bd5e9baf3208c2132ca92a9b4020e9f27df1b16fab998a9"}, + {file = "aiohttp-3.10.9.tar.gz", hash = "sha256:143b0026a9dab07a05ad2dd9e46aa859bffdd6348ddc5967b42161168c24f857"}, ] [[package]] @@ -173,13 +173,13 @@ files = [ [[package]] name = "argcomplete" -version = "3.5.0" +version = "3.5.1" requires_python = ">=3.8" summary = "Bash tab completion for argparse" groups = ["default"] files = [ - {file = "argcomplete-3.5.0-py3-none-any.whl", hash = "sha256:d4bcf3ff544f51e16e54228a7ac7f486ed70ebf2ecfe49a63a91171c76bf029b"}, - {file = "argcomplete-3.5.0.tar.gz", hash = "sha256:4349400469dccfb7950bb60334a680c58d88699bff6159df61251878dc6bf74b"}, + {file = "argcomplete-3.5.1-py3-none-any.whl", hash = "sha256:1a1d148bdaa3e3b93454900163403df41448a248af01b6e849edc5ac08e6c363"}, + {file = "argcomplete-3.5.1.tar.gz", hash = "sha256:eb1ee355aa2557bd3d0145de7b06b2a45b0ce461e1e7813f5d066039ab4177b4"}, ] [[package]] @@ -210,6 +210,16 @@ files = [ {file = "asttokens-2.4.1.tar.gz", hash = "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0"}, ] +[[package]] +name = "async-property" +version = "0.2.2" +summary = "Python decorator for async properties." +groups = ["default"] +files = [ + {file = "async_property-0.2.2-py2.py3-none-any.whl", hash = "sha256:8924d792b5843994537f8ed411165700b27b2bd966cefc4daeefc1253442a9d7"}, + {file = "async_property-0.2.2.tar.gz", hash = "sha256:17d9bd6ca67e27915a75d92549df64b5c7174e9dc806b30a3934dc4ff0506380"}, +] + [[package]] name = "async-timeout" version = "4.0.3" @@ -271,6 +281,38 @@ files = [ {file = "base58-2.1.1.tar.gz", hash = "sha256:c5d0cb3f5b6e81e8e35da5754388ddcc6d0d14b6c6a132cb93d69ed580a7278c"}, ] +[[package]] +name = "bcrypt" +version = "4.2.0" +requires_python = ">=3.7" +summary = "Modern password hashing for your software and your servers" +groups = ["default"] +files = [ + {file = "bcrypt-4.2.0-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:096a15d26ed6ce37a14c1ac1e48119660f21b24cba457f160a4b830f3fe6b5cb"}, + {file = "bcrypt-4.2.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c02d944ca89d9b1922ceb8a46460dd17df1ba37ab66feac4870f6862a1533c00"}, + {file = "bcrypt-4.2.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d84cf6d877918620b687b8fd1bf7781d11e8a0998f576c7aa939776b512b98d"}, + {file = "bcrypt-4.2.0-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:1bb429fedbe0249465cdd85a58e8376f31bb315e484f16e68ca4c786dcc04291"}, + {file = "bcrypt-4.2.0-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:655ea221910bcac76ea08aaa76df427ef8625f92e55a8ee44fbf7753dbabb328"}, + {file = "bcrypt-4.2.0-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:1ee38e858bf5d0287c39b7a1fc59eec64bbf880c7d504d3a06a96c16e14058e7"}, + {file = "bcrypt-4.2.0-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:0da52759f7f30e83f1e30a888d9163a81353ef224d82dc58eb5bb52efcabc399"}, + {file = "bcrypt-4.2.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:3698393a1b1f1fd5714524193849d0c6d524d33523acca37cd28f02899285060"}, + {file = "bcrypt-4.2.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:762a2c5fb35f89606a9fde5e51392dad0cd1ab7ae64149a8b935fe8d79dd5ed7"}, + {file = "bcrypt-4.2.0-cp37-abi3-win32.whl", hash = "sha256:5a1e8aa9b28ae28020a3ac4b053117fb51c57a010b9f969603ed885f23841458"}, + {file = "bcrypt-4.2.0-cp37-abi3-win_amd64.whl", hash = "sha256:8f6ede91359e5df88d1f5c1ef47428a4420136f3ce97763e31b86dd8280fbdf5"}, + {file = "bcrypt-4.2.0-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:c52aac18ea1f4a4f65963ea4f9530c306b56ccd0c6f8c8da0c06976e34a6e841"}, + {file = "bcrypt-4.2.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3bbbfb2734f0e4f37c5136130405332640a1e46e6b23e000eeff2ba8d005da68"}, + {file = "bcrypt-4.2.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3413bd60460f76097ee2e0a493ccebe4a7601918219c02f503984f0a7ee0aebe"}, + {file = "bcrypt-4.2.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:8d7bb9c42801035e61c109c345a28ed7e84426ae4865511eb82e913df18f58c2"}, + {file = "bcrypt-4.2.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3d3a6d28cb2305b43feac298774b997e372e56c7c7afd90a12b3dc49b189151c"}, + {file = "bcrypt-4.2.0-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:9c1c4ad86351339c5f320ca372dfba6cb6beb25e8efc659bedd918d921956bae"}, + {file = "bcrypt-4.2.0-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:27fe0f57bb5573104b5a6de5e4153c60814c711b29364c10a75a54bb6d7ff48d"}, + {file = "bcrypt-4.2.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:8ac68872c82f1add6a20bd489870c71b00ebacd2e9134a8aa3f98a0052ab4b0e"}, + {file = "bcrypt-4.2.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:cb2a8ec2bc07d3553ccebf0746bbf3d19426d1c6d1adbd4fa48925f66af7b9e8"}, + {file = "bcrypt-4.2.0-cp39-abi3-win32.whl", hash = "sha256:77800b7147c9dc905db1cba26abe31e504d8247ac73580b4aa179f98e6608f34"}, + {file = "bcrypt-4.2.0-cp39-abi3-win_amd64.whl", hash = "sha256:61ed14326ee023917ecd093ee6ef422a72f3aec6f07e21ea5f10622b735538a9"}, + {file = "bcrypt-4.2.0.tar.gz", hash = "sha256:cf69eaf5185fd58f268f805b505ce31f9b9fc2d64b376642164e9244540c1221"}, +] + [[package]] name = "beautifulsoup4" version = "4.12.3" @@ -298,70 +340,117 @@ files = [ [[package]] name = "bittensor" -version = "7.3.1" +version = "8.1.1" requires_python = ">=3.9" summary = "bittensor" groups = ["default"] dependencies = [ - "PyNaCl<=1.5.0,>=1.3.0", "aiohttp~=3.9", - "ansible-vault~=2.1", - "ansible~=6.7", - "backoff", - "certifi~=2024.2.2", + "bittensor-wallet==2.0.1", + "bt-decode", "colorama~=0.4.6", - "cryptography~=42.0.5", - "ddt~=1.6.0", - "eth-utils<2.3.0", "fastapi~=0.110.1", - "fuzzywuzzy>=0.18.0", "msgpack-numpy-opentensor~=0.5.0", "munch~=2.5.0", "nest-asyncio", "netaddr", - "numpy", + "numpy~=2.0.1", "packaging", - "password-strength", - "pycryptodome<4.0.0,>=3.18.0", "pydantic<3,>=2.3", "python-Levenshtein", - "python-statemachine~=2.1.2", + "python-statemachine~=2.1", "pyyaml", "requests", "retry", "rich", "scalecodec==1.2.11", - "shtab~=1.6.5", + "setuptools~=70.0.0", "substrate-interface~=1.7.9", - "termcolor", - "tqdm", - "uvicorn<=0.30", + "uvicorn", "wheel", ] files = [ - {file = "bittensor-7.3.1-py3-none-any.whl", hash = "sha256:67d2f375ca53b31e49b1802c6100de3c66df6d760ef562a3ddff63db408ce80b"}, - {file = "bittensor-7.3.1.tar.gz", hash = "sha256:0eb8de326c1f644d8b660e81919301f6ddccb0a824bce8f94c1b1a844624c26b"}, + {file = "bittensor-8.1.1-py3-none-any.whl", hash = "sha256:ccd68afa578feddac1125f78d248cde4322dcb1ec5828192ac8ccc8c7538e8a2"}, + {file = "bittensor-8.1.1.tar.gz", hash = "sha256:2ce95077960b1fb0fe72801618bdc807cdc0b0443fb093185cead20939c4d1bc"}, +] + +[[package]] +name = "bittensor-cli" +version = "8.1.1" +requires_python = ">=3.9" +summary = "Bittensor CLI" +groups = ["default"] +dependencies = [ + "GitPython>=3.0.0", + "Jinja2", + "PyYAML~=6.0.1", + "aiohttp~=3.10.2", + "async-property==0.2.2", + "backoff~=2.2.1", + "bittensor-wallet==2.0.1", + "bt-decode==0.2.0a0", + "fuzzywuzzy~=0.18.0", + "netaddr~=1.3.0", + "numpy>=2.0.1", + "pycryptodome", + "pytest", + "python-Levenshtein", + "rich~=13.7", + "scalecodec==1.2.11", + "substrate-interface~=1.7.9", + "typer~=0.12", + "websockets>=12.0", + "wheel", +] +files = [ + {file = "bittensor-cli-8.1.1.tar.gz", hash = "sha256:4749dba29de42c7d284c92ac0c63030f7716c57d5d8c1335bbc0f39c3a10ed11"}, + {file = "bittensor_cli-8.1.1-py3-none-any.whl", hash = "sha256:30249b7a74b8a299ad565e238ce40d9c3b55cbb079e96ad797decbe02515feda"}, +] + +[[package]] +name = "bittensor-wallet" +version = "2.0.1" +requires_python = ">=3.9" +summary = "" +groups = ["default"] +dependencies = [ + "ansible-vault~=2.1", + "ansible~=6.7", + "cryptography~=42.0.5", + "eth-utils<2.3.0", + "munch~=2.5.0", + "password-strength", + "py-bip39-bindings==0.1.11", + "rich", + "termcolor", +] +files = [ + {file = "bittensor_wallet-2.0.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:1c794ac9a01a324bdb94795e1308fdaf46989e78e276361e375a2f04cd8e49f4"}, + {file = "bittensor_wallet-2.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ea684ba66bc3b5ffa0f9d40cd8eaea85778e12e7c1d4c8002d4c88e58c4ea966"}, + {file = "bittensor_wallet-2.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:465db93993db9cd6d0c0fd6719834cd016ce8f18a2a246c0fd0ab1d8a7e07a6d"}, + {file = "bittensor_wallet-2.0.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:eff65296412c8626b763fbb44ee5de14344efe57211297859964895856b494fe"}, + {file = "bittensor_wallet-2.0.1.tar.gz", hash = "sha256:ea82c367b5d7f74e8465a812e142b29bf5141928bed9146f5d947da3baa29349"}, ] [[package]] name = "boto3" -version = "1.35.28" +version = "1.35.35" requires_python = ">=3.8" summary = "The AWS SDK for Python" groups = ["default"] dependencies = [ - "botocore<1.36.0,>=1.35.28", + "botocore<1.36.0,>=1.35.35", "jmespath<2.0.0,>=0.7.1", "s3transfer<0.11.0,>=0.10.0", ] files = [ - {file = "boto3-1.35.28-py3-none-any.whl", hash = "sha256:dc088b86a14f17d3cd2e96915c6ccfd31bce640dfe9180df579ed311bc6bf0fc"}, - {file = "boto3-1.35.28.tar.gz", hash = "sha256:8960fc458b9ba3c8a9890a607c31cee375db821f39aefaec9ff638248e81644a"}, + {file = "boto3-1.35.35-py3-none-any.whl", hash = "sha256:72eb73d90448632d7388644388be6977293ccb8fbfefd5fd39d7e75ff2d48f8a"}, + {file = "boto3-1.35.35.tar.gz", hash = "sha256:73d4f22b57a725f0e8a6e0c4b2d16336c128e39f3189c24f9e513daa7c14936b"}, ] [[package]] name = "botocore" -version = "1.35.28" +version = "1.35.35" requires_python = ">=3.8" summary = "Low-level, data-driven core of boto 3." groups = ["default"] @@ -372,8 +461,35 @@ dependencies = [ "urllib3<1.27,>=1.25.4; python_version < \"3.10\"", ] files = [ - {file = "botocore-1.35.28-py3-none-any.whl", hash = "sha256:b66c78f3d6379bd16f0362f07168fa7699cdda3921fc880047192d96f2c8c527"}, - {file = "botocore-1.35.28.tar.gz", hash = "sha256:115d13f2172d8e9fa92e8d913f0e80092b97624d190f46772ed2930d4a355d55"}, + {file = "botocore-1.35.35-py3-none-any.whl", hash = "sha256:44b843e310b6338c3086908928709c7a303a2bb0326ea3c93ece5ac5afafb6c8"}, + {file = "botocore-1.35.35.tar.gz", hash = "sha256:899d303046391caa1d05093a673e52d02185b37bc64bd78771ad6752167a25ab"}, +] + +[[package]] +name = "bt-decode" +version = "0.2.0a0" +requires_python = ">=3.9" +summary = "A wrapper around the scale-codec crate for fast scale-decoding of Bittensor data structures." +groups = ["default"] +dependencies = [ + "toml==0.10.0", +] +files = [ + {file = "bt_decode-0.2.0a0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:0b392f97653e004b56bfcb13043ae7017e7d174682d942537b8716a8608a2738"}, + {file = "bt_decode-0.2.0a0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8e52863dc63fd9e29c72a6642123aef916bf4b815b391daea4b3a0933937089b"}, + {file = "bt_decode-0.2.0a0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f49e85d2f9deda9196b373725c9a46cecf5c7ff6a15fe3c0a07cad8149129c47"}, + {file = "bt_decode-0.2.0a0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3d1d5edeb38cdd2d5ac7a6ade4bd18dc25663e5b58e98de51b0ba57671f64a68"}, + {file = "bt_decode-0.2.0a0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6d8d689c485e86e3614fe1cf03565f68b71730d19a55e2a759491cb848c0d782"}, + {file = "bt_decode-0.2.0a0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87a19c4ff5bcf2fb66316ce5ac2a60934062cd555afc529dbd416b4b4bf42ed1"}, + {file = "bt_decode-0.2.0a0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf2f93104a8b4df22207bd4144f6803e930e5ea41de2129bfbdc7e90e7bb536c"}, + {file = "bt_decode-0.2.0a0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:08be1a0ff7f6435cefa8eb45f235c17a57b5ea4422ab6f3e098ad9faf057d315"}, + {file = "bt_decode-0.2.0a0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a946b1e037c7aa051ffef19ce3a69800b2cad5268ee43bc9f5ef15c5d89ef6d4"}, + {file = "bt_decode-0.2.0a0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:d6923ddcd23dc5aeeaa353b5e5e6a3b321de87f5ec5a86fcff30fbc0d31fc78f"}, + {file = "bt_decode-0.2.0a0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:56229f220cde61ce3af05f4d6cde78b9ed32e9ca60817585bd791948197b8921"}, + {file = "bt_decode-0.2.0a0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ee9adfd7dfa0dd171e4c8bace23787370db5b3c20dfe032275920c51d248fa1c"}, + {file = "bt_decode-0.2.0a0-cp311-none-win32.whl", hash = "sha256:00ff9052ec53f6c3ef9d5e785f8efc72a4542688851c3e438d5e4d5345925093"}, + {file = "bt_decode-0.2.0a0-cp311-none-win_amd64.whl", hash = "sha256:bc0229921b993948fc1aacc2c83cae8c343f39d71ab8befa77d94b12ab7183b7"}, + {file = "bt_decode-0.2.0a0.tar.gz", hash = "sha256:13261e31870cdccdf5d20772ffcce5d603bd3d0a76d733b3c4d37f09bb75d170"}, ] [[package]] @@ -402,13 +518,13 @@ files = [ [[package]] name = "certifi" -version = "2024.2.2" +version = "2024.8.30" requires_python = ">=3.6" summary = "Python package for providing Mozilla's CA Bundle." groups = ["default", "type_check"] files = [ - {file = "certifi-2024.2.2-py3-none-any.whl", hash = "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"}, - {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, + {file = "certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8"}, + {file = "certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9"}, ] [[package]] @@ -609,8 +725,8 @@ files = [ [[package]] name = "cytoolz" -version = "0.12.3" -requires_python = ">=3.7" +version = "1.0.0" +requires_python = ">=3.8" summary = "Cython implementation of Toolz: High performance functional utilities" groups = ["default"] marker = "implementation_name == \"cpython\"" @@ -618,34 +734,21 @@ dependencies = [ "toolz>=0.8.0", ] files = [ - {file = "cytoolz-0.12.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3ac4f2fb38bbc67ff1875b7d2f0f162a247f43bd28eb7c9d15e6175a982e558d"}, - {file = "cytoolz-0.12.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0cf1e1e96dd86829a0539baf514a9c8473a58fbb415f92401a68e8e52a34ecd5"}, - {file = "cytoolz-0.12.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08a438701c6141dd34eaf92e9e9a1f66e23a22f7840ef8a371eba274477de85d"}, - {file = "cytoolz-0.12.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c6b6f11b0d7ed91be53166aeef2a23a799e636625675bb30818f47f41ad31821"}, - {file = "cytoolz-0.12.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7fde09384d23048a7b4ac889063761e44b89a0b64015393e2d1d21d5c1f534a"}, - {file = "cytoolz-0.12.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d3bfe45173cc8e6c76206be3a916d8bfd2214fb2965563e288088012f1dabfc"}, - {file = "cytoolz-0.12.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27513a5d5b6624372d63313574381d3217a66e7a2626b056c695179623a5cb1a"}, - {file = "cytoolz-0.12.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d294e5e81ff094fe920fd545052ff30838ea49f9e91227a55ecd9f3ca19774a0"}, - {file = "cytoolz-0.12.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:727b01a2004ddb513496507a695e19b5c0cfebcdfcc68349d3efd92a1c297bf4"}, - {file = "cytoolz-0.12.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:fe1e1779a39dbe83f13886d2b4b02f8c4b10755e3c8d9a89b630395f49f4f406"}, - {file = "cytoolz-0.12.3-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:de74ef266e2679c3bf8b5fc20cee4fc0271ba13ae0d9097b1491c7a9bcadb389"}, - {file = "cytoolz-0.12.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e04d22049233394e0b08193aca9737200b4a2afa28659d957327aa780ddddf2"}, - {file = "cytoolz-0.12.3-cp311-cp311-win32.whl", hash = "sha256:20d36430d8ac809186736fda735ee7d595b6242bdb35f69b598ef809ebfa5605"}, - {file = "cytoolz-0.12.3-cp311-cp311-win_amd64.whl", hash = "sha256:780c06110f383344d537f48d9010d79fa4f75070d214fc47f389357dd4f010b6"}, - {file = "cytoolz-0.12.3.tar.gz", hash = "sha256:4503dc59f4ced53a54643272c61dc305d1dbbfbd7d6bdf296948de9f34c3a282"}, -] - -[[package]] -name = "ddt" -version = "1.6.0" -summary = "Data-Driven/Decorated Tests" -groups = ["default"] -dependencies = [ - "enum34; python_version < \"3\"", -] -files = [ - {file = "ddt-1.6.0-py2.py3-none-any.whl", hash = "sha256:e3c93b961a108b4f4d5a6c7f2263513d928baf3bb5b32af8e1c804bfb041141d"}, - {file = "ddt-1.6.0.tar.gz", hash = "sha256:f71b348731b8c78c3100bffbd951a769fbd439088d1fdbb3841eee019af80acd"}, + {file = "cytoolz-1.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:dffc22fd2c91be64dbdbc462d0786f8e8ac9a275cfa1869a1084d1867d4f67e0"}, + {file = "cytoolz-1.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a99e7e29274e293f4ffe20e07f76c2ac753a78f1b40c1828dfc54b2981b2f6c4"}, + {file = "cytoolz-1.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c507a3e0a45c41d66b43f96797290d75d1e7a8549aa03a4a6b8854fdf3f7b8d8"}, + {file = "cytoolz-1.0.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:643a593ec272ef7429099e1182a22f64ec2696c00d295d2a5be390db1b7ff176"}, + {file = "cytoolz-1.0.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6ce38e2e42cbae30446190c59b92a8a9029e1806fd79eaf88f48b0fe33003893"}, + {file = "cytoolz-1.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:810a6a168b8c5ecb412fbae3dd6f7ed6c6253a63caf4174ee9794ebd29b2224f"}, + {file = "cytoolz-1.0.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0ce8a2a85c0741c1b19b16e6782c4a5abc54c3caecda66793447112ab2fa9884"}, + {file = "cytoolz-1.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ea4ac72e6b830861035c4c7999af8e55813f57c6d1913a3d93cc4a6babc27bf7"}, + {file = "cytoolz-1.0.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:a09cdfb21dfb38aa04df43e7546a41f673377eb5485da88ceb784e327ec7603b"}, + {file = "cytoolz-1.0.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:658dd85deb375ff7af990a674e5c9058cef1c9d1f5dc89bc87b77be499348144"}, + {file = "cytoolz-1.0.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:9715d1ff5576919d10b68f17241375f6a1eec8961c25b78a83e6ef1487053f39"}, + {file = "cytoolz-1.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f370a1f1f1afc5c1c8cc5edc1cfe0ba444263a0772af7ce094be8e734f41769d"}, + {file = "cytoolz-1.0.0-cp311-cp311-win32.whl", hash = "sha256:dbb2ec1177dca700f3db2127e572da20de280c214fc587b2a11c717fc421af56"}, + {file = "cytoolz-1.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:0983eee73df86e54bb4a79fcc4996aa8b8368fdbf43897f02f9c3bf39c4dc4fb"}, + {file = "cytoolz-1.0.0.tar.gz", hash = "sha256:eb453b30182152f9917a5189b7d99046b6ce90cdf8aeb0feff4b2683e600defd"}, ] [[package]] @@ -1205,6 +1308,35 @@ files = [ {file = "fuzzywuzzy-0.18.0.tar.gz", hash = "sha256:45016e92264780e58972dca1b3d939ac864b78437422beecebb3095f8efd00e8"}, ] +[[package]] +name = "gitdb" +version = "4.0.11" +requires_python = ">=3.7" +summary = "Git Object Database" +groups = ["default"] +dependencies = [ + "smmap<6,>=3.0.1", +] +files = [ + {file = "gitdb-4.0.11-py3-none-any.whl", hash = "sha256:81a3407ddd2ee8df444cbacea00e2d038e40150acfa3001696fe0dcf1d3adfa4"}, + {file = "gitdb-4.0.11.tar.gz", hash = "sha256:bf5421126136d6d0af55bc1e7c1af1c397a34f5b7bd79e776cd3e89785c2b04b"}, +] + +[[package]] +name = "gitpython" +version = "3.1.43" +requires_python = ">=3.7" +summary = "GitPython is a Python library used to interact with Git repositories" +groups = ["default"] +dependencies = [ + "gitdb<5,>=4.0.1", + "typing-extensions>=3.7.4.3; python_version < \"3.8\"", +] +files = [ + {file = "GitPython-3.1.43-py3-none-any.whl", hash = "sha256:eec7ec56b92aad751f9912a73404bc02ba212a23adb2c7098ee668417051a1ff"}, + {file = "GitPython-3.1.43.tar.gz", hash = "sha256:35f314a9f878467f5453cc1fee295c3e18e52f1b99f10f6cf5b1682e968a9e7c"}, +] + [[package]] name = "gunicorn" version = "20.1.0" @@ -1260,7 +1392,7 @@ name = "iniconfig" version = "2.0.0" requires_python = ">=3.7" summary = "brain-dead simple config-ini parsing" -groups = ["test"] +groups = ["default", "test"] files = [ {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, @@ -1426,22 +1558,22 @@ files = [ [[package]] name = "markupsafe" -version = "2.1.5" -requires_python = ">=3.7" +version = "3.0.0" +requires_python = ">=3.9" summary = "Safely add untrusted strings to HTML/XML markup." groups = ["default"] files = [ - {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, - {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, + {file = "MarkupSafe-3.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e64b390a306f9e849ee809f92af6a52cda41741c914358e0e9f8499d03741526"}, + {file = "MarkupSafe-3.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7c524203207f5b569df06c96dafdc337228921ee8c3cc5f6e891d024c6595352"}, + {file = "MarkupSafe-3.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c409691696bec2b5e5c9efd9593c99025bf2f317380bf0d993ee0213516d908a"}, + {file = "MarkupSafe-3.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64f7d04410be600aa5ec0626d73d43e68a51c86500ce12917e10fd013e258df5"}, + {file = "MarkupSafe-3.0.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:105ada43a61af22acb8774514c51900dc820c481cc5ba53f17c09d294d9c07ca"}, + {file = "MarkupSafe-3.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a5fd5500d4e4f7cc88d8c0f2e45126c4307ed31e08f8ec521474f2fd99d35ac3"}, + {file = "MarkupSafe-3.0.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:25396abd52b16900932e05b7104bcdc640a4d96c914f39c3b984e5a17b01fba0"}, + {file = "MarkupSafe-3.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3efde9a8c56c3b6e5f3fa4baea828f8184970c7c78480fedb620d804b1c31e5c"}, + {file = "MarkupSafe-3.0.0-cp311-cp311-win32.whl", hash = "sha256:12ddac720b8965332d36196f6f83477c6351ba6a25d4aff91e30708c729350d7"}, + {file = "MarkupSafe-3.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:658fdf6022740896c403d45148bf0c36978c6b48c9ef8b1f8d0c7a11b6cdea86"}, + {file = "markupsafe-3.0.0.tar.gz", hash = "sha256:03ff62dea2fef3eadf2f1853bc6332bcb0458d9608b11dfb1cd5aeda1c178ea6"}, ] [[package]] @@ -1632,22 +1764,22 @@ files = [ [[package]] name = "numpy" -version = "2.1.1" -requires_python = ">=3.10" +version = "2.0.2" +requires_python = ">=3.9" summary = "Fundamental package for array computing in Python" groups = ["default"] files = [ - {file = "numpy-2.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0d07841fd284718feffe7dd17a63a2e6c78679b2d386d3e82f44f0108c905550"}, - {file = "numpy-2.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b5613cfeb1adfe791e8e681128f5f49f22f3fcaa942255a6124d58ca59d9528f"}, - {file = "numpy-2.1.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:0b8cc2715a84b7c3b161f9ebbd942740aaed913584cae9cdc7f8ad5ad41943d0"}, - {file = "numpy-2.1.1-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:b49742cdb85f1f81e4dc1b39dcf328244f4d8d1ded95dea725b316bd2cf18c95"}, - {file = "numpy-2.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8d5f8a8e3bc87334f025194c6193e408903d21ebaeb10952264943a985066ca"}, - {file = "numpy-2.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d51fc141ddbe3f919e91a096ec739f49d686df8af254b2053ba21a910ae518bf"}, - {file = "numpy-2.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:98ce7fb5b8063cfdd86596b9c762bf2b5e35a2cdd7e967494ab78a1fa7f8b86e"}, - {file = "numpy-2.1.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:24c2ad697bd8593887b019817ddd9974a7f429c14a5469d7fad413f28340a6d2"}, - {file = "numpy-2.1.1-cp311-cp311-win32.whl", hash = "sha256:397bc5ce62d3fb73f304bec332171535c187e0643e176a6e9421a6e3eacef06d"}, - {file = "numpy-2.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:ae8ce252404cdd4de56dcfce8b11eac3c594a9c16c231d081fb705cf23bd4d9e"}, - {file = "numpy-2.1.1.tar.gz", hash = "sha256:d0cf7d55b1051387807405b3898efafa862997b4cba8aa5dbe657be794afeafd"}, + {file = "numpy-2.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:49ca4decb342d66018b01932139c0961a8f9ddc7589611158cb3c27cbcf76448"}, + {file = "numpy-2.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:11a76c372d1d37437857280aa142086476136a8c0f373b2e648ab2c8f18fb195"}, + {file = "numpy-2.0.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:807ec44583fd708a21d4a11d94aedf2f4f3c3719035c76a2bbe1fe8e217bdc57"}, + {file = "numpy-2.0.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:8cafab480740e22f8d833acefed5cc87ce276f4ece12fdaa2e8903db2f82897a"}, + {file = "numpy-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a15f476a45e6e5a3a79d8a14e62161d27ad897381fecfa4a09ed5322f2085669"}, + {file = "numpy-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13e689d772146140a252c3a28501da66dfecd77490b498b168b501835041f951"}, + {file = "numpy-2.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9ea91dfb7c3d1c56a0e55657c0afb38cf1eeae4544c208dc465c3c9f3a7c09f9"}, + {file = "numpy-2.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c1c9307701fec8f3f7a1e6711f9089c06e6284b3afbbcd259f7791282d660a15"}, + {file = "numpy-2.0.2-cp311-cp311-win32.whl", hash = "sha256:a392a68bd329eafac5817e5aefeb39038c48b671afd242710b451e76090e81f4"}, + {file = "numpy-2.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:286cd40ce2b7d652a6f22efdfc6d1edf879440e53e76a75955bc0c826c7e64dc"}, + {file = "numpy-2.0.2.tar.gz", hash = "sha256:883c987dee1880e2a864ab0dc9892292582510604156762362d9326444636e78"}, ] [[package]] @@ -1661,6 +1793,22 @@ files = [ {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, ] +[[package]] +name = "paramiko" +version = "3.5.0" +requires_python = ">=3.6" +summary = "SSH2 protocol library" +groups = ["default"] +dependencies = [ + "bcrypt>=3.2", + "cryptography>=3.3", + "pynacl>=1.5", +] +files = [ + {file = "paramiko-3.5.0-py3-none-any.whl", hash = "sha256:1fedf06b085359051cd7d0d270cebe19e755a8a921cc2ddbfa647fb0cd7d68f9"}, + {file = "paramiko-3.5.0.tar.gz", hash = "sha256:ad11e540da4f55cedda52931f1a3f812a8238a7af7f62a60de538cd80bb28124"}, +] + [[package]] name = "parso" version = "0.8.4" @@ -1690,6 +1838,7 @@ name = "pexpect" version = "4.9.0" summary = "Pexpect allows easy control of interactive console applications." groups = ["default"] +marker = "sys_platform != \"win32\"" dependencies = [ "ptyprocess>=0.5", ] @@ -1727,7 +1876,7 @@ name = "pluggy" version = "1.5.0" requires_python = ">=3.8" summary = "plugin and hook calling mechanisms for python" -groups = ["test"] +groups = ["default", "test"] files = [ {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, @@ -1805,6 +1954,7 @@ name = "ptyprocess" version = "0.7.0" summary = "Run a subprocess in a pseudo terminal" groups = ["default"] +marker = "sys_platform != \"win32\"" files = [ {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, @@ -1898,22 +2048,22 @@ files = [ [[package]] name = "pycryptodome" -version = "3.20.0" -requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +version = "3.21.0" +requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" summary = "Cryptographic library for Python" groups = ["default"] files = [ - {file = "pycryptodome-3.20.0-cp35-abi3-macosx_10_9_universal2.whl", hash = "sha256:ac1c7c0624a862f2e53438a15c9259d1655325fc2ec4392e66dc46cdae24d044"}, - {file = "pycryptodome-3.20.0-cp35-abi3-macosx_10_9_x86_64.whl", hash = "sha256:76658f0d942051d12a9bd08ca1b6b34fd762a8ee4240984f7c06ddfb55eaf15a"}, - {file = "pycryptodome-3.20.0-cp35-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f35d6cee81fa145333137009d9c8ba90951d7d77b67c79cbe5f03c7eb74d8fe2"}, - {file = "pycryptodome-3.20.0-cp35-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76cb39afede7055127e35a444c1c041d2e8d2f1f9c121ecef573757ba4cd2c3c"}, - {file = "pycryptodome-3.20.0-cp35-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49a4c4dc60b78ec41d2afa392491d788c2e06edf48580fbfb0dd0f828af49d25"}, - {file = "pycryptodome-3.20.0-cp35-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:fb3b87461fa35afa19c971b0a2b7456a7b1db7b4eba9a8424666104925b78128"}, - {file = "pycryptodome-3.20.0-cp35-abi3-musllinux_1_1_i686.whl", hash = "sha256:acc2614e2e5346a4a4eab6e199203034924313626f9620b7b4b38e9ad74b7e0c"}, - {file = "pycryptodome-3.20.0-cp35-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:210ba1b647837bfc42dd5a813cdecb5b86193ae11a3f5d972b9a0ae2c7e9e4b4"}, - {file = "pycryptodome-3.20.0-cp35-abi3-win32.whl", hash = "sha256:8d6b98d0d83d21fb757a182d52940d028564efe8147baa9ce0f38d057104ae72"}, - {file = "pycryptodome-3.20.0-cp35-abi3-win_amd64.whl", hash = "sha256:9b3ae153c89a480a0ec402e23db8d8d84a3833b65fa4b15b81b83be9d637aab9"}, - {file = "pycryptodome-3.20.0.tar.gz", hash = "sha256:09609209ed7de61c2b560cc5c8c4fbf892f8b15b1faf7e4cbffac97db1fffda7"}, + {file = "pycryptodome-3.21.0-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:2480ec2c72438430da9f601ebc12c518c093c13111a5c1644c82cdfc2e50b1e4"}, + {file = "pycryptodome-3.21.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:de18954104667f565e2fbb4783b56667f30fb49c4d79b346f52a29cb198d5b6b"}, + {file = "pycryptodome-3.21.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2de4b7263a33947ff440412339cb72b28a5a4c769b5c1ca19e33dd6cd1dcec6e"}, + {file = "pycryptodome-3.21.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0714206d467fc911042d01ea3a1847c847bc10884cf674c82e12915cfe1649f8"}, + {file = "pycryptodome-3.21.0-cp36-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d85c1b613121ed3dbaa5a97369b3b757909531a959d229406a75b912dd51dd1"}, + {file = "pycryptodome-3.21.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:8898a66425a57bcf15e25fc19c12490b87bd939800f39a03ea2de2aea5e3611a"}, + {file = "pycryptodome-3.21.0-cp36-abi3-musllinux_1_2_i686.whl", hash = "sha256:932c905b71a56474bff8a9c014030bc3c882cee696b448af920399f730a650c2"}, + {file = "pycryptodome-3.21.0-cp36-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:18caa8cfbc676eaaf28613637a89980ad2fd96e00c564135bf90bc3f0b34dd93"}, + {file = "pycryptodome-3.21.0-cp36-abi3-win32.whl", hash = "sha256:280b67d20e33bb63171d55b1067f61fbd932e0b1ad976b3a184303a3dad22764"}, + {file = "pycryptodome-3.21.0-cp36-abi3-win_amd64.whl", hash = "sha256:b7aa25fc0baa5b1d95b7633af4f5f1838467f1815442b22487426f94e0d66c53"}, + {file = "pycryptodome-3.21.0.tar.gz", hash = "sha256:f7787e0d469bdae763b876174cf2e6c0f7be79808af26b1da96f1a64bcf47297"}, ] [[package]] @@ -1996,7 +2146,7 @@ name = "pytest" version = "8.3.3" requires_python = ">=3.8" summary = "pytest: simple powerful testing with Python" -groups = ["test"] +groups = ["default", "test"] dependencies = [ "colorama; sys_platform == \"win32\"", "exceptiongroup>=1.0.0rc8; python_version < \"3.11\"", @@ -2091,13 +2241,13 @@ files = [ [[package]] name = "python-statemachine" -version = "2.1.2" -requires_python = ">=3.7,<3.13" +version = "2.3.6" +requires_python = ">=3.7" summary = "Python Finite State Machines made easy." groups = ["default"] files = [ - {file = "python_statemachine-2.1.2-py3-none-any.whl", hash = "sha256:d7e369d5da5b9007cc7cf5eb7a1b169081e2f4b7d30b6415fc122858fb7696ec"}, - {file = "python_statemachine-2.1.2.tar.gz", hash = "sha256:0b0dd8b28738b53f14391b06d5072cd5e72259da5ae23574d3d4f5e6dd366663"}, + {file = "python_statemachine-2.3.6-py3-none-any.whl", hash = "sha256:0001b02cbe2f5b2420c423b5b3e3a33915447ac6d9735219c929e2378d454f5f"}, + {file = "python_statemachine-2.3.6.tar.gz", hash = "sha256:9cb4040ca7f2158d3cd46f36a77b420b6ef95a90223928a7f3cab232a70bd560"}, ] [[package]] @@ -2218,18 +2368,18 @@ files = [ [[package]] name = "rich" -version = "13.8.1" -requires_python = ">=3.7.0" +version = "13.9.2" +requires_python = ">=3.8.0" summary = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" groups = ["default"] dependencies = [ "markdown-it-py>=2.2.0", "pygments<3.0.0,>=2.13.0", - "typing-extensions<5.0,>=4.0.0; python_version < \"3.9\"", + "typing-extensions<5.0,>=4.0.0; python_version < \"3.11\"", ] files = [ - {file = "rich-13.8.1-py3-none-any.whl", hash = "sha256:1760a3c0848469b97b558fc61c85233e3dafb69c7a071b4d60c38099d3cd4c06"}, - {file = "rich-13.8.1.tar.gz", hash = "sha256:8260cda28e3db6bf04d2d1ef4dbc03ba80a824c88b0e7668a0f23126a424844a"}, + {file = "rich-13.9.2-py3-none-any.whl", hash = "sha256:8c82a3d3f8dcfe9e734771313e606b39d8247bb6b826e196f4914b333b743cf1"}, + {file = "rich-13.9.2.tar.gz", hash = "sha256:51a2c62057461aaf7152b4d611168f93a9fc73068f8ded2790f29fe2b5366d0c"}, ] [[package]] @@ -2257,29 +2407,29 @@ files = [ [[package]] name = "ruff" -version = "0.6.8" +version = "0.6.9" requires_python = ">=3.7" summary = "An extremely fast Python linter and code formatter, written in Rust." groups = ["lint"] files = [ - {file = "ruff-0.6.8-py3-none-linux_armv6l.whl", hash = "sha256:77944bca110ff0a43b768f05a529fecd0706aac7bcce36d7f1eeb4cbfca5f0f2"}, - {file = "ruff-0.6.8-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:27b87e1801e786cd6ede4ada3faa5e254ce774de835e6723fd94551464c56b8c"}, - {file = "ruff-0.6.8-py3-none-macosx_11_0_arm64.whl", hash = "sha256:cd48f945da2a6334f1793d7f701725a76ba93bf3d73c36f6b21fb04d5338dcf5"}, - {file = "ruff-0.6.8-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:677e03c00f37c66cea033274295a983c7c546edea5043d0c798833adf4cf4c6f"}, - {file = "ruff-0.6.8-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9f1476236b3eacfacfc0f66aa9e6cd39f2a624cb73ea99189556015f27c0bdeb"}, - {file = "ruff-0.6.8-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f5a2f17c7d32991169195d52a04c95b256378bbf0de8cb98478351eb70d526f"}, - {file = "ruff-0.6.8-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:5fd0d4b7b1457c49e435ee1e437900ced9b35cb8dc5178921dfb7d98d65a08d0"}, - {file = "ruff-0.6.8-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f8034b19b993e9601f2ddf2c517451e17a6ab5cdb1c13fdff50c1442a7171d87"}, - {file = "ruff-0.6.8-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6cfb227b932ba8ef6e56c9f875d987973cd5e35bc5d05f5abf045af78ad8e098"}, - {file = "ruff-0.6.8-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ef0411eccfc3909269fed47c61ffebdcb84a04504bafa6b6df9b85c27e813b0"}, - {file = "ruff-0.6.8-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:007dee844738c3d2e6c24ab5bc7d43c99ba3e1943bd2d95d598582e9c1b27750"}, - {file = "ruff-0.6.8-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:ce60058d3cdd8490e5e5471ef086b3f1e90ab872b548814e35930e21d848c9ce"}, - {file = "ruff-0.6.8-py3-none-musllinux_1_2_i686.whl", hash = "sha256:1085c455d1b3fdb8021ad534379c60353b81ba079712bce7a900e834859182fa"}, - {file = "ruff-0.6.8-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:70edf6a93b19481affd287d696d9e311388d808671bc209fb8907b46a8c3af44"}, - {file = "ruff-0.6.8-py3-none-win32.whl", hash = "sha256:792213f7be25316f9b46b854df80a77e0da87ec66691e8f012f887b4a671ab5a"}, - {file = "ruff-0.6.8-py3-none-win_amd64.whl", hash = "sha256:ec0517dc0f37cad14a5319ba7bba6e7e339d03fbf967a6d69b0907d61be7a263"}, - {file = "ruff-0.6.8-py3-none-win_arm64.whl", hash = "sha256:8d3bb2e3fbb9875172119021a13eed38849e762499e3cfde9588e4b4d70968dc"}, - {file = "ruff-0.6.8.tar.gz", hash = "sha256:a5bf44b1aa0adaf6d9d20f86162b34f7c593bfedabc51239953e446aefc8ce18"}, + {file = "ruff-0.6.9-py3-none-linux_armv6l.whl", hash = "sha256:064df58d84ccc0ac0fcd63bc3090b251d90e2a372558c0f057c3f75ed73e1ccd"}, + {file = "ruff-0.6.9-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:140d4b5c9f5fc7a7b074908a78ab8d384dd7f6510402267bc76c37195c02a7ec"}, + {file = "ruff-0.6.9-py3-none-macosx_11_0_arm64.whl", hash = "sha256:53fd8ca5e82bdee8da7f506d7b03a261f24cd43d090ea9db9a1dc59d9313914c"}, + {file = "ruff-0.6.9-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:645d7d8761f915e48a00d4ecc3686969761df69fb561dd914a773c1a8266e14e"}, + {file = "ruff-0.6.9-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eae02b700763e3847595b9d2891488989cac00214da7f845f4bcf2989007d577"}, + {file = "ruff-0.6.9-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d5ccc9e58112441de8ad4b29dcb7a86dc25c5f770e3c06a9d57e0e5eba48829"}, + {file = "ruff-0.6.9-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:417b81aa1c9b60b2f8edc463c58363075412866ae4e2b9ab0f690dc1e87ac1b5"}, + {file = "ruff-0.6.9-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3c866b631f5fbce896a74a6e4383407ba7507b815ccc52bcedabb6810fdb3ef7"}, + {file = "ruff-0.6.9-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7b118afbb3202f5911486ad52da86d1d52305b59e7ef2031cea3425142b97d6f"}, + {file = "ruff-0.6.9-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a67267654edc23c97335586774790cde402fb6bbdb3c2314f1fc087dee320bfa"}, + {file = "ruff-0.6.9-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:3ef0cc774b00fec123f635ce5c547dac263f6ee9fb9cc83437c5904183b55ceb"}, + {file = "ruff-0.6.9-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:12edd2af0c60fa61ff31cefb90aef4288ac4d372b4962c2864aeea3a1a2460c0"}, + {file = "ruff-0.6.9-py3-none-musllinux_1_2_i686.whl", hash = "sha256:55bb01caeaf3a60b2b2bba07308a02fca6ab56233302406ed5245180a05c5625"}, + {file = "ruff-0.6.9-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:925d26471fa24b0ce5a6cdfab1bb526fb4159952385f386bdcc643813d472039"}, + {file = "ruff-0.6.9-py3-none-win32.whl", hash = "sha256:eb61ec9bdb2506cffd492e05ac40e5bc6284873aceb605503d8494180d6fc84d"}, + {file = "ruff-0.6.9-py3-none-win_amd64.whl", hash = "sha256:785d31851c1ae91f45b3d8fe23b8ae4b5170089021fbb42402d811135f0b7117"}, + {file = "ruff-0.6.9-py3-none-win_arm64.whl", hash = "sha256:a9641e31476d601f83cd602608739a0840e348bda93fec9f1ee816f8b6798b93"}, + {file = "ruff-0.6.9.tar.gz", hash = "sha256:b076ef717a8e5bc819514ee1d602bbdca5b4420ae13a9cf61a0c0a4f53a2baa2"}, ] [[package]] @@ -2312,6 +2462,19 @@ files = [ {file = "scalecodec-1.2.11.tar.gz", hash = "sha256:99a2cdbfccdcaf22bd86b86da55a730a2855514ad2309faef4a4a93ac6cbeb8d"}, ] +[[package]] +name = "scp" +version = "0.15.0" +summary = "scp module for paramiko" +groups = ["default"] +dependencies = [ + "paramiko", +] +files = [ + {file = "scp-0.15.0-py2.py3-none-any.whl", hash = "sha256:9e7f721e5ac563c33eb0831d0f949c6342f1c28c3bdc3b02f39d77b5ea20df7e"}, + {file = "scp-0.15.0.tar.gz", hash = "sha256:f1b22e9932123ccf17eebf19e0953c6e9148f589f93d91b872941a696305c83f"}, +] + [[package]] name = "sentry-sdk" version = "1.3.0" @@ -2328,24 +2491,24 @@ files = [ [[package]] name = "setuptools" -version = "75.1.0" +version = "70.0.0" requires_python = ">=3.8" summary = "Easily download, build, install, upgrade, and uninstall Python packages" groups = ["default"] files = [ - {file = "setuptools-75.1.0-py3-none-any.whl", hash = "sha256:35ab7fd3bcd95e6b7fd704e4a1539513edad446c097797f2985e0e4b960772f2"}, - {file = "setuptools-75.1.0.tar.gz", hash = "sha256:d59a21b17a275fb872a9c3dae73963160ae079f1049ed956880cd7c09b120538"}, + {file = "setuptools-70.0.0-py3-none-any.whl", hash = "sha256:54faa7f2e8d2d11bcd2c07bed282eef1046b5c080d1c32add737d7b5817b1ad4"}, + {file = "setuptools-70.0.0.tar.gz", hash = "sha256:f211a66637b8fa059bb28183da127d4e86396c991a942b028c6650d4319c3fd0"}, ] [[package]] -name = "shtab" -version = "1.6.5" +name = "shellingham" +version = "1.5.4" requires_python = ">=3.7" -summary = "Automagic shell tab completion for Python CLI applications" +summary = "Tool to Detect Surrounding Shell" groups = ["default"] files = [ - {file = "shtab-1.6.5-py3-none-any.whl", hash = "sha256:3c7be25ab65a324ed41e9c2964f2146236a5da6e6a247355cfea56f65050f220"}, - {file = "shtab-1.6.5.tar.gz", hash = "sha256:cf4ab120183e84cce041abeb6f620f9560739741dfc31dd466315550c08be9ec"}, + {file = "shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686"}, + {file = "shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de"}, ] [[package]] @@ -2359,6 +2522,17 @@ files = [ {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, ] +[[package]] +name = "smmap" +version = "5.0.1" +requires_python = ">=3.7" +summary = "A pure Python implementation of a sliding window memory map manager" +groups = ["default"] +files = [ + {file = "smmap-5.0.1-py3-none-any.whl", hash = "sha256:e6d8668fa5f93e706934a62d7b4db19c8d9eb8cf2adbb75ef1b675aa332b69da"}, + {file = "smmap-5.0.1.tar.gz", hash = "sha256:dceeb6c0028fdb6734471eb07c0cd2aae706ccaecab45965ee83f11c8d3b1f62"}, +] + [[package]] name = "sniffio" version = "1.3.1" @@ -2435,7 +2609,7 @@ files = [ [[package]] name = "substrate-interface" -version = "1.7.10" +version = "1.7.11" requires_python = "<4,>=3.7" summary = "Library for interfacing with a Substrate node" groups = ["default"] @@ -2445,7 +2619,7 @@ dependencies = [ "certifi>=2019.3.9", "ecdsa<1,>=0.17.0", "eth-keys<1,>=0.2.1", - "eth-utils<3,>=1.3.0", + "eth-utils<6,>=1.3.0", "idna<4,>=2.1.0", "py-bip39-bindings<1,>=0.1.9", "py-ed25519-zebra-bindings<2,>=1.0", @@ -2457,45 +2631,41 @@ dependencies = [ "xxhash<4,>=1.3.0", ] files = [ - {file = "substrate-interface-1.7.10.tar.gz", hash = "sha256:0dec0104abc16d01c3d22700253a84e67430b5e56c46efea71fea47063a8eaa4"}, - {file = "substrate_interface-1.7.10-py3-none-any.whl", hash = "sha256:4873e9f1b75375ed9fcdd12d7bca66c47ab0e9fbd532ec4f9538ceac0f0ab2f5"}, + {file = "substrate-interface-1.7.11.tar.gz", hash = "sha256:4caa5eacb9996edbe76ad12249521b3542bbd8d9d69b96734087201db1fef8f6"}, + {file = "substrate_interface-1.7.11-py3-none-any.whl", hash = "sha256:ce19bc97481769238ed23c752db985a3058637918693f2db6aeed2fab3756075"}, ] [[package]] name = "termcolor" -version = "2.4.0" -requires_python = ">=3.8" +version = "2.5.0" +requires_python = ">=3.9" summary = "ANSI color formatting for output in terminal" groups = ["default"] files = [ - {file = "termcolor-2.4.0-py3-none-any.whl", hash = "sha256:9297c0df9c99445c2412e832e882a7884038a25617c60cea2ad69488d4040d63"}, - {file = "termcolor-2.4.0.tar.gz", hash = "sha256:aab9e56047c8ac41ed798fa36d892a37aca6b3e9159f3e0c24bc64a9b3ac7b7a"}, + {file = "termcolor-2.5.0-py3-none-any.whl", hash = "sha256:37b17b5fc1e604945c2642c872a3764b5d547a48009871aea3edd3afa180afb8"}, + {file = "termcolor-2.5.0.tar.gz", hash = "sha256:998d8d27da6d48442e8e1f016119076b690d962507531df4890fcd2db2ef8a6f"}, ] [[package]] -name = "toolz" -version = "0.12.1" -requires_python = ">=3.7" -summary = "List processing tools and functional utilities" +name = "toml" +version = "0.10.0" +summary = "Python Library for Tom's Obvious, Minimal Language" groups = ["default"] -marker = "implementation_name == \"pypy\" or implementation_name == \"cpython\"" files = [ - {file = "toolz-0.12.1-py3-none-any.whl", hash = "sha256:d22731364c07d72eea0a0ad45bafb2c2937ab6fd38a3507bf55eae8744aa7d85"}, - {file = "toolz-0.12.1.tar.gz", hash = "sha256:ecca342664893f177a13dac0e6b41cbd8ac25a358e5f215316d43e2100224f4d"}, + {file = "toml-0.10.0-py2.py3-none-any.whl", hash = "sha256:235682dd292d5899d361a811df37e04a8828a5b1da3115886b73cf81ebc9100e"}, + {file = "toml-0.10.0.tar.gz", hash = "sha256:229f81c57791a41d65e399fc06bf0848bab550a9dfd5ed66df18ce5f05e73d5c"}, ] [[package]] -name = "tqdm" -version = "4.66.5" -requires_python = ">=3.7" -summary = "Fast, Extensible Progress Meter" +name = "toolz" +version = "1.0.0" +requires_python = ">=3.8" +summary = "List processing tools and functional utilities" groups = ["default"] -dependencies = [ - "colorama; platform_system == \"Windows\"", -] +marker = "implementation_name == \"pypy\" or implementation_name == \"cpython\"" files = [ - {file = "tqdm-4.66.5-py3-none-any.whl", hash = "sha256:90279a3770753eafc9194a0364852159802111925aa30eb3f9d85b0e805ac7cd"}, - {file = "tqdm-4.66.5.tar.gz", hash = "sha256:e1020aef2e5096702d8a025ac7d16b1577279c9d63f8375b63083e9a5f0fcbad"}, + {file = "toolz-1.0.0-py3-none-any.whl", hash = "sha256:292c8f1c4e7516bf9086f8850935c799a874039c8bcf959d47b600e4c44a6236"}, + {file = "toolz-1.0.0.tar.gz", hash = "sha256:2c86e3d9a04798ac556793bced838816296a2f085017664e4995cb40a1047a02"}, ] [[package]] @@ -2509,6 +2679,23 @@ files = [ {file = "traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7"}, ] +[[package]] +name = "typer" +version = "0.12.5" +requires_python = ">=3.7" +summary = "Typer, build great CLIs. Easy to code. Based on Python type hints." +groups = ["default"] +dependencies = [ + "click>=8.0.0", + "rich>=10.11.0", + "shellingham>=1.3.0", + "typing-extensions>=3.7.4.3", +] +files = [ + {file = "typer-0.12.5-py3-none-any.whl", hash = "sha256:62fe4e471711b147e3365034133904df3e235698399bc4de2b36c8579298d52b"}, + {file = "typer-0.12.5.tar.gz", hash = "sha256:f592f089bedcc8ec1b974125d64851029c3b1af145f04aca64d69410f0c9b722"}, +] + [[package]] name = "types-freezegun" version = "1.1.10" @@ -2521,13 +2708,13 @@ files = [ [[package]] name = "types-python-dateutil" -version = "2.9.0.20240906" +version = "2.9.0.20241003" requires_python = ">=3.8" summary = "Typing stubs for python-dateutil" groups = ["type_check"] files = [ - {file = "types-python-dateutil-2.9.0.20240906.tar.gz", hash = "sha256:9706c3b68284c25adffc47319ecc7947e5bb86b3773f843c73906fd598bc176e"}, - {file = "types_python_dateutil-2.9.0.20240906-py3-none-any.whl", hash = "sha256:27c8cc2d058ccb14946eebcaaa503088f4f6dbc4fb6093d3d456a49aef2753f6"}, + {file = "types-python-dateutil-2.9.0.20241003.tar.gz", hash = "sha256:58cb85449b2a56d6684e41aeefb4c4280631246a0da1a719bdbe6f3fb0317446"}, + {file = "types_python_dateutil-2.9.0.20241003-py3-none-any.whl", hash = "sha256:250e1d8e80e7bbc3a6c99b907762711d1a1cdd00e978ad39cb5940f6f0a87f3d"}, ] [[package]] @@ -2601,7 +2788,7 @@ files = [ [[package]] name = "uvicorn" -version = "0.30.0" +version = "0.31.0" requires_python = ">=3.8" summary = "The lightning-fast ASGI server." groups = ["default"] @@ -2611,8 +2798,8 @@ dependencies = [ "typing-extensions>=4.0; python_version < \"3.11\"", ] files = [ - {file = "uvicorn-0.30.0-py3-none-any.whl", hash = "sha256:78fa0b5f56abb8562024a59041caeb555c86e48d0efdd23c3fe7de7a4075bdab"}, - {file = "uvicorn-0.30.0.tar.gz", hash = "sha256:f678dec4fa3a39706bbf49b9ec5fc40049d42418716cea52b53f07828a60aa37"}, + {file = "uvicorn-0.31.0-py3-none-any.whl", hash = "sha256:cac7be4dd4d891c363cd942160a7b02e69150dcbc7a36be04d5f4af4b17c8ced"}, + {file = "uvicorn-0.31.0.tar.gz", hash = "sha256:13bc21373d103859f68fe739608e2eb054a816dea79189bc3ca08ea89a275906"}, ] [[package]] @@ -2628,7 +2815,7 @@ files = [ [[package]] name = "virtualenv" -version = "20.26.5" +version = "20.26.6" requires_python = ">=3.7" summary = "Virtual Python Environment builder" groups = ["default"] @@ -2639,8 +2826,8 @@ dependencies = [ "platformdirs<5,>=3.9.1", ] files = [ - {file = "virtualenv-20.26.5-py3-none-any.whl", hash = "sha256:4f3ac17b81fba3ce3bd6f4ead2749a72da5929c01774948e243db9ba41df4ff6"}, - {file = "virtualenv-20.26.5.tar.gz", hash = "sha256:ce489cac131aa58f4b25e321d6d186171f78e6cb13fafbf32a840cee67733ff4"}, + {file = "virtualenv-20.26.6-py3-none-any.whl", hash = "sha256:7345cc5b25405607a624d8418154577459c3e0277f5466dd79c49d5e492995f2"}, + {file = "virtualenv-20.26.6.tar.gz", hash = "sha256:280aede09a2a5c317e409a00102e7077c6432c5a38f0ef938e643805a7ad2c48"}, ] [[package]] @@ -2667,6 +2854,28 @@ files = [ {file = "websocket_client-1.8.0.tar.gz", hash = "sha256:3239df9f44da632f96012472805d40a23281a991027ce11d2f45a6f24ac4c3da"}, ] +[[package]] +name = "websockets" +version = "13.1" +requires_python = ">=3.8" +summary = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" +groups = ["default"] +files = [ + {file = "websockets-13.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:61fc0dfcda609cda0fc9fe7977694c0c59cf9d749fbb17f4e9483929e3c48a19"}, + {file = "websockets-13.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ceec59f59d092c5007e815def4ebb80c2de330e9588e101cf8bd94c143ec78a5"}, + {file = "websockets-13.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c1dca61c6db1166c48b95198c0b7d9c990b30c756fc2923cc66f68d17dc558fd"}, + {file = "websockets-13.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:308e20f22c2c77f3f39caca508e765f8725020b84aa963474e18c59accbf4c02"}, + {file = "websockets-13.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62d516c325e6540e8a57b94abefc3459d7dab8ce52ac75c96cad5549e187e3a7"}, + {file = "websockets-13.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87c6e35319b46b99e168eb98472d6c7d8634ee37750d7693656dc766395df096"}, + {file = "websockets-13.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5f9fee94ebafbc3117c30be1844ed01a3b177bb6e39088bc6b2fa1dc15572084"}, + {file = "websockets-13.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:7c1e90228c2f5cdde263253fa5db63e6653f1c00e7ec64108065a0b9713fa1b3"}, + {file = "websockets-13.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6548f29b0e401eea2b967b2fdc1c7c7b5ebb3eeb470ed23a54cd45ef078a0db9"}, + {file = "websockets-13.1-cp311-cp311-win32.whl", hash = "sha256:c11d4d16e133f6df8916cc5b7e3e96ee4c44c936717d684a94f48f82edb7c92f"}, + {file = "websockets-13.1-cp311-cp311-win_amd64.whl", hash = "sha256:d04f13a1d75cb2b8382bdc16ae6fa58c97337253826dfe136195b7f89f661557"}, + {file = "websockets-13.1-py3-none-any.whl", hash = "sha256:a9a396a6ad26130cdae92ae10c36af09d9bfe6cafe69670fd3b6da9b07b4044f"}, + {file = "websockets-13.1.tar.gz", hash = "sha256:a3b3366087c1bc0a2795111edcadddb8b3b59509d5db5d7ea3fdd69f954a8878"}, +] + [[package]] name = "wheel" version = "0.44.0" @@ -2705,7 +2914,7 @@ files = [ [[package]] name = "yarl" -version = "1.13.0" +version = "1.13.1" requires_python = ">=3.8" summary = "Yet another URL library" groups = ["default"] @@ -2714,21 +2923,21 @@ dependencies = [ "multidict>=4.0", ] files = [ - {file = "yarl-1.13.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8986fa2be78193dc8b8c27bd0d3667fe612f7232844872714c4200499d5225ca"}, - {file = "yarl-1.13.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0db15ce35dfd100bc9ab40173f143fbea26c84d7458d63206934fe5548fae25d"}, - {file = "yarl-1.13.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:49bee8c99586482a238a7b2ec0ef94e5f186bfdbb8204d14a3dd31867b3875ce"}, - {file = "yarl-1.13.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c73e0f8375b75806b8771890580566a2e6135e6785250840c4f6c45b69eb72d"}, - {file = "yarl-1.13.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ab16c9e94726fdfcbf5b37a641c9d9d0b35cc31f286a2c3b9cad6451cb53b2b"}, - {file = "yarl-1.13.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:784d6e50ea96b3bbb078eb7b40d8c0e3674c2f12da4f0061f889b2cfdbab8f37"}, - {file = "yarl-1.13.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:580fdb2ea48a40bcaa709ee0dc71f64e7a8f23b44356cc18cd9ce55dc3bc3212"}, - {file = "yarl-1.13.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9d2845f1a37438a8e11e4fcbbf6ffd64bc94dc9cb8c815f72d0eb6f6c622deb0"}, - {file = "yarl-1.13.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:bcb374db7a609484941c01380c1450728ec84d9c3e68cd9a5feaecb52626c4be"}, - {file = "yarl-1.13.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:561a5f6c054927cf5a993dd7b032aeebc10644419e65db7dd6bdc0b848806e65"}, - {file = "yarl-1.13.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:b536c2ac042add7f276d4e5857b08364fc32f28e02add153f6f214de50f12d07"}, - {file = "yarl-1.13.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:52b7bb09bb48f7855d574480e2efc0c30d31cab4e6ffc6203e2f7ffbf2e4496a"}, - {file = "yarl-1.13.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e4dddf99a853b3f60f3ce6363fb1ad94606113743cf653f116a38edd839a4461"}, - {file = "yarl-1.13.0-cp311-cp311-win32.whl", hash = "sha256:0b489858642e4e92203941a8fdeeb6373c0535aa986200b22f84d4b39cd602ba"}, - {file = "yarl-1.13.0-cp311-cp311-win_amd64.whl", hash = "sha256:31748bee7078db26008bf94d39693c682a26b5c3a80a67194a4c9c8fe3b5cf47"}, - {file = "yarl-1.13.0-py3-none-any.whl", hash = "sha256:c7d35ff2a5a51bc6d40112cdb4ca3fd9636482ce8c6ceeeee2301e34f7ed7556"}, - {file = "yarl-1.13.0.tar.gz", hash = "sha256:02f117a63d11c8c2ada229029f8bb444a811e62e5041da962de548f26ac2c40f"}, + {file = "yarl-1.13.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:216a6785f296169ed52cd7dcdc2612f82c20f8c9634bf7446327f50398732a51"}, + {file = "yarl-1.13.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:40c6e73c03a6befb85b72da213638b8aaa80fe4136ec8691560cf98b11b8ae6e"}, + {file = "yarl-1.13.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2430cf996113abe5aee387d39ee19529327205cda975d2b82c0e7e96e5fdabdc"}, + {file = "yarl-1.13.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fb4134cc6e005b99fa29dbc86f1ea0a298440ab6b07c6b3ee09232a3b48f495"}, + {file = "yarl-1.13.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:309c104ecf67626c033845b860d31594a41343766a46fa58c3309c538a1e22b2"}, + {file = "yarl-1.13.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f90575e9fe3aae2c1e686393a9689c724cd00045275407f71771ae5d690ccf38"}, + {file = "yarl-1.13.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d2e1626be8712333a9f71270366f4a132f476ffbe83b689dd6dc0d114796c74"}, + {file = "yarl-1.13.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b66c87da3c6da8f8e8b648878903ca54589038a0b1e08dde2c86d9cd92d4ac9"}, + {file = "yarl-1.13.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cf1ad338620249f8dd6d4b6a91a69d1f265387df3697ad5dc996305cf6c26fb2"}, + {file = "yarl-1.13.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9915300fe5a0aa663c01363db37e4ae8e7c15996ebe2c6cce995e7033ff6457f"}, + {file = "yarl-1.13.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:703b0f584fcf157ef87816a3c0ff868e8c9f3c370009a8b23b56255885528f10"}, + {file = "yarl-1.13.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:1d8e3ca29f643dd121f264a7c89f329f0fcb2e4461833f02de6e39fef80f89da"}, + {file = "yarl-1.13.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7055bbade838d68af73aea13f8c86588e4bcc00c2235b4b6d6edb0dbd174e246"}, + {file = "yarl-1.13.1-cp311-cp311-win32.whl", hash = "sha256:a3442c31c11088e462d44a644a454d48110f0588de830921fd201060ff19612a"}, + {file = "yarl-1.13.1-cp311-cp311-win_amd64.whl", hash = "sha256:81bad32c8f8b5897c909bf3468bf601f1b855d12f53b6af0271963ee67fff0d2"}, + {file = "yarl-1.13.1-py3-none-any.whl", hash = "sha256:6a5185ad722ab4dd52d5fb1f30dcc73282eb1ed494906a92d1a228d3f89607b0"}, + {file = "yarl-1.13.1.tar.gz", hash = "sha256:ec8cfe2295f3e5e44c51f57272afbd69414ae629ec7c6b27f5a410efc78b70a0"}, ] diff --git a/pyproject.toml b/pyproject.toml index 3697380..6962f28 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -22,11 +22,15 @@ dependencies = [ "djangorestframework>=3.15.2", "django-storages[s3]>=1.14.4", "drf-spectacular>=0.27.2", - "bittensor>=7.3.1,<7.4.0", - "pexpect>=4.9.0", "django-bootstrap-v5>=1.0.11", "discord.py==2.4.0", "python-dotenv>=1.0.1", + "paramiko>=3.5.0", + "scp>=0.15.0", + "bittensor-cli>=8.1.1", + "bittensor-wallet>=2.0.1", + "bittensor>=8.1.1", + "gitpython>=3.1.43", ] [build-system] diff --git a/secrets.csv b/secrets.csv new file mode 100644 index 0000000..bcf9a0a --- /dev/null +++ b/secrets.csv @@ -0,0 +1,37 @@ +SECRET_KEYS,SECRET_VALUES +SECRET_KEY,random +POSTGRES_PASSWORD,random +RAPID_API_KEY,replace_with_rapid_api_key +WANDB_API_KEY,replace_with_your_wandb_api_key +BETTENSOR_VALIDATOR_MIN_STAKE, replace_with_min_stake +OPENAI_API_KEY,replace_with_openai_api_key +BET365_API_KEY,replace_with_bet365_api_key +PIXABAY_API_KEY,replace_with_pixabay_api_key +GOOGLE_API_KEY,replace_with_google_api_key +ANTHROPIC_API_KEY,replace_with_anthropic_api_key +GROQ_API_KEY,replace_with_groq_api_key +AWS_ACCESS_KEY,replace_with_aws_access_key +AWS_SECRET_KEY,replace_with_aws_secret_key +AWS_ACCESS_KEY_ID,replace_with_AWS_ACCESS_KEY_ID +AWS_SECRET_ACCESS_KEY,replace_with_AWS_SECRET_ACCESS_KEY +DATABASE_USER_PASSWORD,replace_with_database_user_password +APIFY_API_TOKEN,replace_with_apify_api_token +REDDIT_CLIENT_ID,replace_with_reddit_client_id +REDDIT_CLIENT_SECRET,replace_with_reddit_client_secret +REDDIT_USERNAME,replace_with_reddit_username +REDDIT_PASSWORD,replace_with_reddit_password +MISTRAL_API_KEY,replace_with_mistral_api_key +VALIDATOR_HOTKEY_SS58_ADDRESS,hotkey_ss58_address +WANDB_ACCESS_TOKEN,replace_with_wandb_access_token +DHT_IP,ip_address +HF_TOKEN,replace_with_hf_token +GITHUB_TOKEN,replace_with_github_token +ALCHEMY_API_KEY,replace_with_alchemy_api_key +PAYPANGEA_API_KEY,replace_with_paypangea_api_key +VLLM_API_KEY,replace_with_vllm_api_key +WANDB_KEY,replace_with_wandb_key +FOOTBALL_API_KEY,replace_with_football_api_key +EXPECTED_ACCESS_KEY,replace_with_expected_access_key +APIFY_API_KEY,replace_with_apify_api_key +SERPAPI_API_KEY,replace_with_serpapi_api_key +HF_ACCESS_TOKEN,replace_with_hf_access_tokenf \ No newline at end of file