← Back
import { useState, useEffect, useCallback } from 'react';

export interface WhaleTrade {
  id: string;
  address: string;
  marketId: string;
  marketQuestion: string | null;
  marketSlug: string | null;
  side: string;       // "BUY" or "SELL"
  outcome: string;    // "Yes" or "No"
  size: number;
  price: number;
  amount: number;     // USDC total
  timestamp: string;
  whaleLabel: string | null;
  whaleTotalVolume: number | null;
  whaleTotalTrades: number | null;
  whaleWinRate: number | null;     // 0..1, null if no resolved trades yet
  whaleTopCategory: string | null;
}

interface WhalesMeta {
  limit: number;
  offset: number;
  minAmount: number;
  days: number;
  count: number;
}

interface UseWhalesOptions {
  limit?: number;
  minAmount?: number;
  days?: number;
  marketId?: string;
  includeResolved?: boolean;
}

export function useWhales(options: UseWhalesOptions = {}) {
  const { limit = 50, minAmount = 5000, days = 7, marketId, includeResolved = false } = options;

  const [trades, setTrades] = useState<WhaleTrade[]>([]);
  const [meta, setMeta] = useState<WhalesMeta | null>(null);
  const [loading, setLoading] = useState(true);

  const fetchWhales = useCallback(async () => {
    setLoading(true);
    try {
      const params = new URLSearchParams({
        limit: String(limit),
        min_amount: String(minAmount),
        days: String(days),
      });
      if (marketId) params.set('market_id', marketId);
      if (includeResolved) params.set('include_resolved', 'true');

      const res = await fetch(`/api/signals/whales?${params}`);
      const d = await res.json();
      if (d.success) {
        setTrades(d.data ?? []);
        setMeta(d.meta ?? null);
      }
    } catch { /* ignore */ }
    finally { setLoading(false); }
  }, [limit, minAmount, days, marketId, includeResolved]);

  useEffect(() => {
    const t = setTimeout(fetchWhales, 0);
    // Refresh every 5 min (matches whale cron interval)
    const interval = setInterval(fetchWhales, 5 * 60_000);
    return () => { clearTimeout(t); clearInterval(interval); };
  }, [fetchWhales]);

  return { trades, meta, loading, refresh: fetchWhales };
}

📜 Git History

6c47fa4chore: local Polikopi project home + Phase 1 redesign artifacts12 days ago
Show last diff
Loading...