"""x402 address-labels tools — multi-source wallet label resolver. Phase 3A of AUDIT-2026-Q3.md (split from app/routers/x402_tools.py). Endpoints mounted on sub_router: POST /api/v1/x402-tools/address_labels Resolved sources: Etherscan labels, RolodETH, walletLabels.xyz, bluepages.fyi, internal RAG. Other SENTINEL modules live in tools/evidence_tools.py and tools/report_tools.py. """ from __future__ import annotations from datetime import datetime from fastapi import APIRouter, HTTPException from app.domains.billing.x402.shared import ( SentinelModuleRequest, record_x402_payment, ) sub_router = APIRouter(tags=["x402-labels"]) @sub_router.post("/address_labels") async def address_labels_endpoint(req: SentinelModuleRequest): """SENTINEL Address Labels - multi-source wallet address labeling. Pricing: $0.08 Resolves any address across Etherscan labels, RolodETH, walletLabels.xyz, bluepages.fyi, and internal RAG. Returns unified labels (exchange, MEV bot, known scammer, deployer, etc.). """ try: from app.domains.scanners.sentinel_pipeline import run_address_labels result = await run_address_labels(req.address, req.chain) await record_x402_payment("address_labels", "0.08", req.address) return { "tool": "SENTINEL Address Labels", "version": "1.0", "timestamp": datetime.utcnow().isoformat(), "address": req.address, "chain": req.chain, **result, "guarantee": "Data delivered or auto-refund via x402 receipt", } except Exception as e: raise HTTPException(status_code=500, detail=str(e)) from e