Розробка системи моніторингу продаж NFT-колекцій
Floor price колекції впала на 30% за останні 6 годин, а ви дізналися про це з Twitter наступного дня. Або навпаки — whale купив 50 токенів підряд, спровокував pump, а ваші алерти мовчали. Для трейдерів, засновників колекцій та аналітиків NFT-ринку потрібна система, яка бачить ці подіїї протягом хвилин, а не годин.
Джерела даних
Архітектурний вибір №1: брати дані з API маркетплейсів або напрямки з blockchain подій. У кожного підходу свої trade-offs.
API маркетплейсів (OpenSea, Blur, Reservoir) — простіше в реалізації, але залежність від uptime третьої сторони та затримки агрегації. Reservoir найзручніший варіант: єдиний API, покриває Blur, OpenSea, X2Y2, LooksRare та інші, повертає нормалізовані дані.
On-chain подіїї — всебічні та не залежать від маркетплейсів, але потребують розбору кожного протоколу окремо. Кожен маркетплейс має свою signature подіїї:
| Маркетплейс | Contract | Event |
|---|---|---|
| OpenSea Seaport | 0x00000000000000ADc04C56Bf30aC9d3c0aAF14dC |
OrderFulfilled(bytes32,address,address,address,(uint8,address,uint256,uint256)[],(uint8,address,uint256,uint256,address)[]) |
| Blur | 0x000000000000Ad05Ccc4F10045630fb830B95127 |
OrdersMatched(bytes32,bytes32) |
| LooksRare v2 | 0x0000000000E655fAe4d56241588680F86E3b2377 |
TakerBid(...) / TakerAsk(...) |
Для надійної системи моніторингу — комбінація: Reservoir API для швидких даних + on-chain парсинг як резервне джерело та для верифікації.
Архітектура системи
Data pipeline
Blockchain events (WebSocket via Alchemy/QuickNode)
│
▼
Event Parser Service ◄── Reservoir API (polling / webhooks)
│
▼
Message Queue (Redis Streams / BullMQ)
│
┌────┴────┐
▼ ▼
Metrics DB Alert Engine
(TimescaleDB) (правила оцінки)
│ │
▼ ▼
Analytics API Notification Service
(Telegram, Discord, Email)
TimescaleDB — розширення PostgreSQL для time-series даних. Автоматичне партиціювання за часом, функції для агрегації за часовими вікнами (time_bucket), компресія старих даних. Для NFT метрик це значно краще за звичайний PostgreSQL.
CREATE TABLE nft_sales (
time TIMESTAMPTZ NOT NULL,
collection VARCHAR(42) NOT NULL,
token_id TEXT,
price_eth DECIMAL(20, 8),
price_usd DECIMAL(20, 4),
marketplace VARCHAR(20),
buyer VARCHAR(42),
seller VARCHAR(42),
tx_hash VARCHAR(66)
);
SELECT create_hypertable('nft_sales', 'time');
-- Floor price за останні 24 години по годинах
SELECT time_bucket('1 hour', time) AS bucket,
MIN(price_eth) AS floor,
COUNT(*) AS volume,
SUM(price_eth) AS total_volume_eth
FROM nft_sales
WHERE collection = $1
AND time > NOW() - INTERVAL '24 hours'
GROUP BY bucket
ORDER BY bucket;
Realtime floor price tracking
Floor price не просто мінімальна ціна останньої продажі. Це мінімальна ціна активного листингу. Для коректного розрахунку потрібен окремий трекер листингів:
class FloorPriceTracker {
private listings = new Map<string, { price: bigint; seller: string }>()
onListing(tokenId: string, price: bigint, seller: string) {
this.listings.set(tokenId, { price, seller })
this.updateFloor()
}
onDelisting(tokenId: string) {
this.listings.delete(tokenId)
this.updateFloor()
}
onSale(tokenId: string) {
this.listings.delete(tokenId) // sold = delisted
this.updateFloor()
}
getFloor(): bigint {
return [...this.listings.values()]
.reduce((min, l) => l.price < min ? l.price : min, BigInt(Infinity))
}
}
Стан листингів ініціалізується при старті з Reservoir API, потім підтримується через event stream.
Система алертів
Типи алертів
Floor price алерти: зміна floor більш ніж на X% за Y хвилин. Важливо рахувати процентну зміну відносно rolling baseline, а не попереднього значення — інакше один wash trade з низькою ціною сгенерує помилковий алерт.
Whale активність: один адрес купив N+ токенів за M годин. Whale у контексті колекції — відносне поняття, поріг залежить від supply.
Volume spike: обсяг торгів за останню годину перевищує N-сигма від середнього значення (rolling mean + std deviation за 7 днів).
Large single sale: продаж токена по ціні, що перевищує floor у K разів.
Wash trading detection: одинакові токени швидко перепродаються між пов'язаними адресами по растучим цінам. Проста евристика: якщо sale.buyer == попередній sale.seller та інтервал < 10 хвилин — підозрілим.
Конфігурація правил алертів
Правила алертів зберігаються в БД, редагуються через UI без деплою:
{
"collection": "0xBC4CA0EdA7647A8aB7C2061c2E118A18a936f13D",
"alert_type": "floor_change",
"conditions": {
"direction": "down",
"threshold_percent": 15,
"window_minutes": 30
},
"notifications": ["telegram:@bayc_holder", "discord:webhook_url"]
}
Метрики колекції та дашборд
Ключові метрики для дашборду:
- Floor price (поточна, 24h зміна, 7d зміна)
- Total volume (24h, 7d, all time)
- Кількість продажів (24h)
- Унікальні покупці/продавці (24h)
- Середня ціна продажу vs. floor (spread)
- Holder distribution: top 10 холдерів % пропозиції, кількість унікальних холдерів
- Listing depth: кількість листингів у діапазонах +5%, +10%, +20% від floor
Holder distribution оновлюється рідше — раз на годину достатньо. Потребує або on-chain трекингу Transfer подій, або запиту до Alchemy/Moralis NFT API.
Доставка уведомлень
Telegram Bot: найбільш затребуваний у NFT-спільноті. telegraf або grammy бібліотека, групові чати для проектних комьюніті, особисті сповіщення для індивідуальних трейдерів.
Discord Webhooks: стандарт для NFT-проектів. Форматований embed з іконкою колекції, ціною, посиланням на токен на маркетплейсі.
Email: через SendGrid/Resend для підсумкових дайджестів — щогодинно або раз на день.
Throttling: не більше 1 алерту одного типу за N хвилин на колекцію, інакше при volatile ринку система спамить. Очередь з дедупліцією в Redis.
Строки розробки
День 1: аналіз цільових маркетплейсів, отримання API ключів, розробка схеми зберігання, реалізація базових HTTP клієнтів з retry/backoff.
День 2: воркери для історичного збору, WebSocket інтеграція для realtime, нормалізація даних між форматами різних площадок, документація та базовий моніторинг.
День 3: движок алертів з базовими правилами, інтеграція Telegram та Discord уведомлень, базовий дашборд.
Усього 2-3 робочих дні для системи з realtime мониторингом, алертами та дашбордом. Додавання складних детекторів (wash trading, multi-collection кореляції) — ще 1-2 дні.







