refactor: consolidate blockchain explorer into single app and update backup ignore patterns
- Remove standalone explorer-web app (README, HTML, package files) - Add /web endpoint to blockchain-explorer for web interface access - Update .gitignore to exclude application backup archives (*.tar.gz, *.zip) - Add backup documentation files to .gitignore (BACKUP_INDEX.md, README.md) - Consolidate explorer functionality into main blockchain-explorer application
This commit is contained in:
5
apps/wallet/src/app/receipts/__init__.py
Normal file
5
apps/wallet/src/app/receipts/__init__.py
Normal file
@@ -0,0 +1,5 @@
|
||||
"""Receipt verification helpers for the wallet daemon."""
|
||||
|
||||
from .service import ReceiptValidationResult, ReceiptVerifierService
|
||||
|
||||
__all__ = ["ReceiptValidationResult", "ReceiptVerifierService"]
|
||||
58
apps/wallet/src/app/receipts/service.py
Normal file
58
apps/wallet/src/app/receipts/service.py
Normal file
@@ -0,0 +1,58 @@
|
||||
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),
|
||||
)
|
||||
Reference in New Issue
Block a user