#!/usr/bin/env python3
"""
Manual script to cancel all stale unverified/pending orders.
Run: python cancel_stale.py
Frees locked capital from orders that will never fill.
"""
import sys
import os
# Ensure project root is in path
sys.path.insert(0, os.path.dirname(__file__))
from loguru import logger
# Setup logging to stdout
logger.remove()
logger.add(sys.stdout, level="INFO", colorize=True)
import db
from resolver import cancel_stale_orders
def main():
db.init_db()
# Show current stale orders first
conn = db.get_conn()
pending = conn.execute("""
SELECT t.id, t.order_id, t.price, t.size, t.status, t.created_at, m.question
FROM trades t
LEFT JOIN markets m ON t.market_id = m.id
WHERE t.status IN ('pending', 'unverified') AND t.outcome IS NULL AND t.dry_run = 0
""").fetchall()
conn.close()
if not pending:
logger.info("No pending/unverified orders found. Nothing to cancel.")
return
total_locked = sum(t["size"] for t in pending)
logger.info(f"Found {len(pending)} pending/unverified orders (${total_locked:.2f} locked):")
for t in pending:
q = (t["question"] or "")[:60]
logger.info(f" #{t['id']} | {t['status']:10s} | ${t['size']:.2f} @ ${t['price']:.2f} | {t['created_at']} | {q}")
# Cancel all stale orders (0 min age = cancel everything pending)
logger.info("")
logger.info("Cancelling all pending/unverified orders...")
cancelled = cancel_stale_orders(max_age_minutes=0)
logger.info(f"Done: {cancelled}/{len(pending)} orders cancelled")
if cancelled > 0:
logger.info(f"Capital freed: check Polymarket wallet for updated balance")
if __name__ == "__main__":
main()