Разработка бота отслеживания китов
"Кит" в контексте 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)







