- Change file mode from 644 to 755 for all project files - Add chain_id parameter to get_balance RPC endpoint with default "ait-devnet" - Rename Miner.extra_meta_data to extra_metadata for consistency
59 lines
1.9 KiB
Python
Executable File
59 lines
1.9 KiB
Python
Executable File
from __future__ import annotations
|
|
|
|
from dataclasses import dataclass
|
|
from typing import List, Optional
|
|
|
|
from aitbc_sdk import (
|
|
CoordinatorReceiptClient,
|
|
ReceiptVerification,
|
|
SignatureValidation,
|
|
verify_receipt,
|
|
verify_receipts,
|
|
)
|
|
|
|
|
|
@dataclass
|
|
class ReceiptValidationResult:
|
|
job_id: str
|
|
receipt_id: str
|
|
receipt: dict
|
|
miner_signature: SignatureValidation
|
|
coordinator_attestations: List[SignatureValidation]
|
|
|
|
@property
|
|
def miner_valid(self) -> bool:
|
|
return self.miner_signature.valid
|
|
|
|
@property
|
|
def all_valid(self) -> bool:
|
|
return self.miner_signature.valid and all(att.valid for att in self.coordinator_attestations)
|
|
|
|
|
|
class ReceiptVerifierService:
|
|
"""Wraps `aitbc_sdk` receipt verification for wallet daemon workflows."""
|
|
|
|
def __init__(self, coordinator_url: str, api_key: str, timeout: float = 10.0) -> None:
|
|
self.client = CoordinatorReceiptClient(coordinator_url, api_key, timeout=timeout)
|
|
|
|
def verify_latest(self, job_id: str) -> Optional[ReceiptValidationResult]:
|
|
receipt = self.client.fetch_latest(job_id)
|
|
if receipt is None:
|
|
return None
|
|
verification = verify_receipt(receipt)
|
|
return self._to_result(verification)
|
|
|
|
def verify_history(self, job_id: str) -> List[ReceiptValidationResult]:
|
|
receipts = self.client.fetch_history(job_id)
|
|
verifications = verify_receipts(receipts)
|
|
return [self._to_result(item) for item in verifications]
|
|
|
|
@staticmethod
|
|
def _to_result(verification: ReceiptVerification) -> ReceiptValidationResult:
|
|
return ReceiptValidationResult(
|
|
job_id=str(verification.receipt.get("job_id")),
|
|
receipt_id=str(verification.receipt.get("receipt_id")),
|
|
receipt=verification.receipt,
|
|
miner_signature=verification.miner_signature,
|
|
coordinator_attestations=list(verification.coordinator_attestations),
|
|
)
|