Парсинг данных whale-транзакций
"Кит" в контексте on-chain анализа — адрес с объёмом активов или транзакций, значимым относительно общей рыночной ликвидности. Перевод 50,000 ETH с биржевого кошелька на cold wallet создаёт ценовое давление и информационный сигнал. Мониторинг таких перемещений — практическая задача для трейдинговых систем, risk management и on-chain аналитики.
Что именно отслеживать
Не все крупные транзакции одинаково информативны. Ключевые паттерны:
Exchange inflow/outflow: крупный перевод на биржу (inflow) — потенциальная продажа. Перевод с биржи (outflow) — аккумуляция или переход к self-custody. Для корректной интерпретации необходима база биржевых адресов.
Cross-chain bridges: крупные движения через мосты (Arbitrum bridge, Stargate, LayerZero) сигнализируют о перемещении ликвидности между сетями.
DeFi-события: крупный вывод ликвидности из Uniswap пула, крупное погашение займа в Aave, открытие/закрытие крупной позиции на GMX.
Stablecoin mint/burn: Tether и Circle печатают/сжигают USDT/USDC на основании фиатных депозитов. Крупный mint — потенциальный приток капитала на рынок.
Ethereum: мониторинг через eth_getLogs и WebSocket
Мониторинг крупных ERC-20 переводов в реальном времени — через WebSocket подписку на Transfer события с фильтрацией по размеру уже в приложении (блокчейн-уровень не поддерживает фильтрацию по value):
import asyncio
from web3 import AsyncWeb3, WebSocketProvider
from web3.middleware import ExtraDataToPOAMiddleware
WHALE_THRESHOLD_USDT = 500_000 * 10**6 # 500k USDT
USDT_ADDRESS = "0xdAC17F958D2ee523a2206206994597C13D831ec7"
async def monitor_usdt_whales():
w3 = AsyncWeb3(WebSocketProvider("wss://eth-mainnet.g.alchemy.com/v2/YOUR_KEY"))
transfer_filter = await w3.eth.filter({
'address': USDT_ADDRESS,
'topics': [w3.keccak(text="Transfer(address,address,uint256)").hex()]
})
async for event in transfer_filter.get_new_entries():
amount = int(event['data'], 16)
if amount >= WHALE_THRESHOLD_USDT:
from_addr = '0x' + event['topics'][1].hex()[26:]
to_addr = '0x' + event['topics'][2].hex()[26:]
await process_whale_transfer({
'from': from_addr,
'to': to_addr,
'amount_usdt': amount / 10**6,
'tx_hash': event['transactionHash'].hex(),
'block': event['blockNumber'],
})
Для нативного ETH — отдельная логика через eth_getBlockByNumber с full_transactions=True и фильтрация по value:
async def scan_block_for_whale_eth(block_number: int, threshold_eth: float):
block = await w3.eth.get_block(block_number, full_transactions=True)
threshold_wei = w3.to_wei(threshold_eth, 'ether')
whale_txns = [
tx for tx in block.transactions
if tx['value'] >= threshold_wei
]
return whale_txns
Bitcoin: UTXO модель
Bitcoin не имеет Transfer событий. Отслеживание крупных транзакций — через мониторинг mempool и блоков. Bitcoin Core RPC:
import bitcoinrpc
rpc = bitcoinrpc.connect_to_local()
def find_whale_transactions(block_hash: str, threshold_btc: float):
block = rpc.getblock(block_hash, verbosity=2)
whale_txns = []
for tx in block['tx']:
# Сумма всех outputs
total_output = sum(
vout['value']
for vout in tx['vout']
if vout.get('scriptPubKey', {}).get('type') != 'OP_RETURN'
)
if total_output >= threshold_btc:
whale_txns.append({
'txid': tx['txid'],
'total_btc': total_output,
'outputs': tx['vout'],
'input_count': len(tx['vin']),
})
return whale_txns
Labeling: кто есть кто
Сырой адрес 0x28C6c06298d514Db089934071355E5743bf21d60 не несёт смысла. Ценность появляется при наличии labels — базы знаний о том, какому субъекту принадлежит адрес.
Источники labels:
- Arkham Intelligence — коммерческая база с entity labels
- Etherscan tags — community-submitted labels, доступны через API
- Dune Analytics — community datasets (известные биржевые адреса, протоколы)
- Собственная база — пополняется при анализе on-chain активности
Типовая структура label базы:
CREATE TABLE address_labels (
address TEXT NOT NULL,
chain TEXT NOT NULL,
entity_name TEXT, -- 'Binance', 'Coinbase', 'Jump Trading'
entity_type TEXT, -- 'exchange', 'market_maker', 'fund', 'whale'
confidence SMALLINT, -- 1-100
source TEXT,
verified BOOLEAN DEFAULT FALSE,
PRIMARY KEY (address, chain)
);
Агрегация и хранение
Whale-события должны быть сохранены с контекстом для последующего анализа:
CREATE TABLE whale_events (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
chain TEXT NOT NULL,
tx_hash TEXT NOT NULL,
block_number BIGINT,
block_time TIMESTAMPTZ NOT NULL,
from_address TEXT NOT NULL,
to_address TEXT NOT NULL,
token_address TEXT, -- NULL для нативной монеты
amount_raw NUMERIC,
amount_usd NUMERIC,
from_label TEXT,
to_label TEXT,
event_type TEXT, -- 'exchange_inflow', 'exchange_outflow', 'defi_exit', etc.
notified BOOLEAN DEFAULT FALSE
);
CREATE INDEX ON whale_events (block_time DESC);
CREATE INDEX ON whale_events (from_address, block_time DESC);
Нотификации
Telegram-бот или Discord webhook для real-time оповещений. Формат сообщения с максимальной информативностью:
🐋 WHALE ALERT — Ethereum
💰 50,000,000 USDT ($50.0M)
📤 Binance (0x28C6...21d60)
📥 Unknown Wallet (0xF9e...3a14)
🔗 tx: 0x7f8...b2c
⏱ 12 сек назад | Block 19,847,231
Кастомные пороги для разных активов и типов событий — конфигурируемы через admin интерфейс или env-файл.
Готовые сервисы vs собственный парсер
Whale Alert, Lookonchain, Arkham имеют бесплатные и платные тиры с готовыми уведомлениями. Собственный парсер оправдан когда: нужна кастомная логика (определённые контракты, специфические паттерны), данные используются в трейдинговой системе с требованиями к latency, или нужна интеграция с проприетарной label базой.
Разработка системы мониторинга whale-транзакций для ETH + BTC с Telegram-оповещениями, label базой из 5000+ адресов и хранением истории — 2–3 недели.







