"""FastAPI dashboard for the copy-trader. Endpoints: /api/stats — overall counters /api/wallets — top-priority wallet pool /api/signals/recent — recent consensus signals /api/health — liveness check """ import logging from typing import Optional from fastapi import FastAPI, Query from fastapi.responses import HTMLResponse from src.config import get_settings from src.db.database import CopyTraderDatabase logger = logging.getLogger(__name__) app = FastAPI(title="Polymarket Copy Trader Dashboard") def _get_db() -> CopyTraderDatabase: settings = get_settings() return CopyTraderDatabase(settings.db_path) @app.get("/api/stats") def api_stats(): db = _get_db() return db.get_stats() @app.get("/api/wallets") def api_wallets(limit: int = Query(50, ge=1, le=200)): db = _get_db() wallets = db.get_all_wallet_targets() return wallets[:limit] @app.get("/api/signals/recent") def api_signals(limit: int = Query(20, ge=1, le=200)): db = _get_db() return db.get_recent_signals(limit=limit) @app.get("/api/health") def api_health(): return {"status": "ok"} HTML_TEMPLATE = """ Polymarket Copy Trader Dashboard

Polymarket Copy Trader

Live signal & wallet dashboard · auto-refresh 30s

Loading...
""" @app.get("/", response_class=HTMLResponse) def dashboard_page(): return HTML_TEMPLATE