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...