import json import os from datetime import datetime, timezone from pathlib import Path from fastapi import APIRouter, HTTPException, Request from fastapi.responses import HTMLResponse from pydantic import BaseModel from sqlmodel import select from ..wallet import ( TRUSTED_MINTS, fetch_all_balances, get_proofs_per_mint_and_unit, get_wallet, send_token, slow_filter_spend_proofs, ) from .db import ApiKey, create_session from .logging import get_logger logger = get_logger(__name__) admin_router = APIRouter(prefix="/admin", include_in_schema=False) class WithdrawRequest(BaseModel): amount: int mint_url: str | None = None unit: str = "sat" def login_form() -> str: return """
{content}
Your balance = Total wallet - User balance
Save this token! It represents your withdrawn balance.
| Hashed Key | Balance (mSats) | Total Spent (mSats) | Total Requests | Refund Address | Refund Time |
|---|
Found {len(log_entries)} log entries • Searched last 7 days of logs
""" @admin_router.post("/withdraw") async def withdraw( request: Request, withdraw_request: WithdrawRequest ) -> dict[str, str]: admin_cookie = request.cookies.get("admin_password") if not admin_cookie or admin_cookie != os.getenv("ADMIN_PASSWORD"): raise HTTPException(status_code=403, detail="Unauthorized") # Get wallet and check balance wallet = await get_wallet( withdraw_request.mint_url or TRUSTED_MINTS[0], withdraw_request.unit ) proofs = get_proofs_per_mint_and_unit( wallet, withdraw_request.mint_url or TRUSTED_MINTS[0], withdraw_request.unit, not_reserved=True, ) proofs = await slow_filter_spend_proofs(proofs, wallet) current_balance = sum(proof.amount for proof in proofs) if withdraw_request.amount <= 0: raise HTTPException( status_code=400, detail="Withdrawal amount must be positive" ) if withdraw_request.amount > current_balance: raise HTTPException(status_code=400, detail="Insufficient wallet balance") token = await send_token( withdraw_request.amount, withdraw_request.unit, withdraw_request.mint_url ) return {"token": token}