from json import loads from time import time_ns from aiohttp import ClientTimeout, ClientSession from substrateinterface import Keypair from scorevision.utils.settings import get_settings async def _sign_batch(payloads: list[str]) -> tuple[str, list[str]]: """ """ settings = get_settings() if settings.SIGNER_URL: try: timeout = ClientTimeout(connect=2, total=30) async with ClientSession(timeout=timeout) as sess: r = await sess.post( f"{settings.SIGNER_URL}/sign", json={"payloads": payloads} ) txt = await r.text() if r.status == 200: data = loads(txt) sigs = data.get("signatures") or [] hk = data.get("hotkey") or "" if len(sigs) == len(payloads) and hk: return hk, sigs except Exception as e: raise Exception(f"signer unavailable, fallback to local: {e}") raise ValueError("No Signer URL set") def sign_message(keypair: Keypair, message: str | None) -> str | None: if message is None: return None return f"0x{keypair.sign(message).hex()}" def build_validator_query_params(keypair: Keypair) -> dict[str, str]: """ Create validator authentication query parameters required by the ScoreVision API. """ settings = get_settings() nonce = str(time_ns()) signature = sign_message(keypair, nonce) return { "validator_hotkey": keypair.ss58_address, "signature": signature, "nonce": nonce, "netuid": str(settings.SCOREVISION_NETUID), }