Розробка бота відслідковування китів
"Кит" в контексті on-chain аналітики — адреса з обсягом позиції чи трансакцій, значимим щодо liquidity конкретного протоколу чи токена. Відслідковування китів корисно в кількох сценаріях: торгові сигнали (крупна адреса почала накопичувати — цікаво), риск-менеджмент протоколу (один holder накопив >10% supply — ризик дампу), compliance (відслідковування адресу зі списків санкцій OFAC).
Ключова технічна складність — не сам моніторинг, а класифікація: відрізнити реальне переміщення коштів кита від внутрішніх переводів між його власними гаманцями, від wash trading, від технічних операцій (rebalancing LP позицій).
Джерела даних
On-chain (первинні):
- Ethereum:
eth_getLogs+eth_subscribe(logs)для ERC-20 Transfer подій - Solana: Helius webhooks з фільтрацією по program ID і типу інструкції
- DEX события: Uniswap V3
Swap, CurveTokenExchange, dYdX order fills
Аналітичні (вторинні, для збагачення):
- Nansen API — labelling адресу (Smart Money, CEX hot wallets, known DeFi whales)
- Arkham Intelligence API — entity-level атрибуція
- Etherscan labels API — біржеві гаманці, протоколи
- DeBank API — поточний портфель адреси
Архітектура бота
Block Producer (WebSocket/Helius webhook)
│
▼
Event Queue (Redis Streams або BullMQ)
│
▼
Transaction Classifier
├── Filter: whale threshold check (>$X USD)
├── Label resolver (CEX deposit? Internal transfer? DEX swap?)
└── Dedup (одна трансакція може викликати N подій)
│
▼
Signal Generator
├── Accumulation pattern detector
├── Large withdrawal from CEX (bullish signal)
└── Large deposit to CEX (potential sell)
│
▼
Notification Dispatcher
├── Telegram Bot API
├── Discord Webhooks
└── WebSocket push (для dashboard)
Детектор значимих трансакцій
interface WhaleTx {
txHash: string;
from: string;
to: string;
tokenAddress: string;
amountUSD: number;
labels: {
from: string | null; // "Binance Hot Wallet", "Smart Money #42"
to: string | null;
};
txType: "cex_deposit" | "cex_withdraw" | "dex_swap" | "wallet_transfer" | "unknown";
}
async function classifyTransaction(tx: RawTransferEvent): Promise<WhaleTx | null> {
// Поріг: мінімум $500k для топовых токенів, $50k для long-tail
const amountUSD = await priceService.toUSD(tx.token, tx.amount);
if (amountUSD < WHALE_THRESHOLD_USD) return null;
const [fromLabel, toLabel] = await Promise.all([
labelResolver.resolve(tx.from),
labelResolver.resolve(tx.to),
]);
const txType = inferTxType(fromLabel, toLabel);
return { txHash: tx.hash, from: tx.from, to: tx.to,
tokenAddress: tx.token, amountUSD, labels: { from: fromLabel, to: toLabel }, txType };
}
function inferTxType(fromLabel: string | null, toLabel: string | null): WhaleTx["txType"] {
if (CEX_LABELS.some((l) => toLabel?.includes(l))) return "cex_deposit";
if (CEX_LABELS.some((l) => fromLabel?.includes(l))) return "cex_withdraw";
if (DEX_LABELS.some((l) => fromLabel?.includes(l) || toLabel?.includes(l))) return "dex_swap";
return "unknown";
}
Визначення кластерів адресу
Одна з складних задач — зрозуміти, що кілька адресу належать одній сутності. Евристики:
- Dust attack / common input ownership (для UTXO-ланцюгів)
- Nonce-based clustering: адреси, фінансовані з одного джерела
- Temporal correlation: адреси, завжди перемішаючі кошти в одному блоці чи з малим lag
Для EVM: якщо адреса A часто відправляє gas на адресу B перед трансакціями B — ймовірно, A і B один власник.
Telegram-уведомлення
async function sendWhaleAlert(tx: WhaleTx, bot: TelegramBot) {
const emoji = tx.txType === "cex_deposit" ? "🔴" : tx.txType === "cex_withdraw" ? "🟢" : "🔵";
const fromStr = tx.labels.from ?? shortenAddress(tx.from);
const toStr = tx.labels.to ?? shortenAddress(tx.to);
const message = [
`${emoji} <b>Whale Alert</b>`,
``,
`<b>Amount:</b> $${formatUSD(tx.amountUSD)}`,
`<b>From:</b> ${fromStr}`,
`<b>To:</b> ${toStr}`,
`<b>Type:</b> ${tx.txType}`,
``,
`<a href="https://etherscan.io/tx/${tx.txHash}">View on Etherscan</a>`,
].join("\n");
await bot.sendMessage(CHANNEL_ID, message, { parse_mode: "HTML" });
}
Фільтрація шуму
Без фільтрації бот буде спамити. Правила:
- Дедупліцікація: одна трансакція → одно уведомлення (по
txHash) - Cooldown на адресу: якщо адреса A вже алертилась 5 хвилин назад — пропускаємо
- Blacklist технічних адресу: мультисіг treasury протоколів, staking контракти
- Aggregation: якщо за 60 сек прийшло 10+ алертів одного типу — відправляємо сводку
Що входить в розробку
- Event listener з підтримкою reconnect і catchup пропущених блоків
- Label cache з TTL (Nansen/Arkham дані мінять рідко, кешувати на 24ч)
- Класифікатор трансакцій з розширюваними правилами
- Telegram/Discord notification з форматуванням і дедупліцікацією
- Dashboard з історією алертів і настройкою порогів
- Підтримка watchlist конкретних адресу (VIP tracking)







