Збирачі даних
Модуль Crypto використовує 8 збирачів даних для збору інформації в реальному часі із зовнішніх API.
🏗️ Архітектура
┌────────────┐ ┌────────────┐ ┌────────────┐ ┌────────────┐ ┌────────────┐
│ CoinGecko │ │ GitHub │ │ DefiLlama │ │ DefiLlama │ │ Dropstab │
│ Harvester │ │ Harvester │ │ TVL │ │ Raises │ │ Investors │
└─────┬──────┘ └─────┬──────┘ └─────┬──────┘ └─────┬──────┘ └─────┬──────┘
│ │ │ │ │
▼ ▼ ▼ ▼ ▼
┌─────────────────────────────────────────────────────────────────────────────┐
│ Redis Cache │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │coingecko:│ │ github: │ │defillama:│ │ raises: │ │dropstab: │ │
│ │ SLUG │ │ REPO │ │ PROTOCOL │ │ ALL │ │ SLUG │ │
│ │ TTL:24h │ │ TTL:24h │ │ TTL:6h │ │ TTL:24h │ │ TTL:24h │ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
└─────────────────────────────────────────────────────────────────────────────┘
1. Збирач CoinGecko
Файл: coingecko.py
Призначення: Отримує ціни, ринкові дані та метадані.
Зібрані дані
| Поле | Опис | Приклад |
|---|---|---|
price_usd | Поточна ціна в USD | 245.50 |
market_cap | Загальна ринкова капіталізація | 3,650,000,000 |
fdv | Повністю розбавлена оцінка | 4,100,000,000 |
price_change_24h | % зміна за 24 години | -2.5 |
github_url | URL основного репозиторію | github.com/aave |
homepage | Вебсайт проєкту | aave.com |
Деталі API
- Кінцева точка:
https://api.coingecko.com/api/v3/coins/ID - Ліміт запитів: 50 запитів/хвилину (безкоштовний рівень)
- Cache TTL: 24 години
- Вартість: Безкоштовно
Використання
from harvesters.coingecko import CoinGeckoHarvester
harvester = CoinGeckoHarvester()
data = await harvester.fetch("aave")
# Returns:
{
"price_usd": 245.50,
"market_cap": 3650000000,
"fdv": 4100000000,
"github_url": "https://github.com/aave"
}
Відомі проблеми
Застарілі URL GitHub: CoinGecko іноді повертає старі URL репозиторіїв. Ми підтримуємо мапу перевизначень:
GITHUB_OVERRIDES = {
"aave": "https://github.com/aave/aave-v3-core",
"compound": "https://github.com/compound-finance/compound-v2",
}
2. Збирач GitHub
Файл: github.py
Призначення: Отримує метрики активності розробників.
Зібрані дані
| Поле | Опис | Приклад |
|---|---|---|
commits_30d | Коміти за останні 30 днів | 45 |
active_devs | Унікальні контриб'ютори (30 дн.) | 12 |
last_commit_date | Останній коміт | 2025-12-25 |
total_stars | Зірки репозиторію | 2,500 |
open_issues | Кількість відкритих проблем | 48 |
Деталі API
- Кінцева точка:
https://api.github.com/repos/OWNER/REPO - Кінцева точка статистики:
https://api.github.com/repos/OWNER/REPO/stats/participation - Ліміт запитів: 5 000 запитів/годину (з аутентифікацією)
- Cache TTL: 24 години
- Вартість: Безкоштовно
Асинхронна обробка статистики
Великі репозиторії спочатку повертають 202 NO CONTENT – статистика
обчислюється асинхронно:
async def fetch_stats(self, repo):
response = await self.client.get(f"/repos/REPO/stats/participation")
if response.status_code == 202:
# GitHub обчислює статистику, спробуйте знову після затримки
await asyncio.sleep(2)
return await self.fetch_stats(repo)
return response.json()
Запасний варіант для відсутніх репозиторіїв
if not github_url or github_url == "":
return {
"commits_30d": 0,
"active_devs": 0,
"error": "Публічний репозиторій не знайдено"
}
3. Збирач DefiLlama
Файл: defillama.py
Призначення: Отримує DeFi-специфічні метрики (TVL, скарбниця).
Зібрані дані
| Поле | Опис | Приклад |
|---|---|---|
tvl | Загальна заблокована вартість (USD) | 32,400,000,000 |
chain_tvls | Розбивка TVL за блокчейном | ethereum: 25B, polygon: 5B |
category | Категорія DeFi | "Lending" |
mcap_to_tvl_ratio | Ринкова капіталізація / TVL | 0.09 |
Деталі API
- Кінцева точка:
https://api.llama.fi/protocol/SLUG - Історія TVL:
https://api.llama.fi/protocol/SLUG/tvl - Ліміт запитів: Без обмежень (ключ не потрібен)
- Cache TTL: 6 годин (TVL змінюється швидше)
- Вартість: Безкоштовно ✅
Мапування слагів
DefiLlama використовує інші слаги, ніж CoinGecko. Ми підтримуємо мапування:
DEFILLAMA_SLUGS = {
"aave": "aave",
"uniswap": "uniswap",
"compound-governance-token": "compound",
}
Приклад відповіді
{
"tvl": 32451269361,
"chainTvls": {
"Ethereum": 25000000000,
"Polygon": 5000000000,
"Avalanche": 2451269361
},
"category": "Lending",
"mcap": 2900000000
}
🔄 Конвеєр збору даних
Коли запитується проєкт, CryptoService координує роботу всіх збирачів даних:
async def fetch_project(self, slug: str):
# 1. Спочатку перевірити кеш
cached = await self.cache.get(f"project:{slug}")
if cached:
return cached
# 2. Отримати дані з усіх джерел паралельно
coingecko_data, github_data, defillama_data = await asyncio.gather(
self.coingecko.fetch(slug),
self.github.fetch(slug),
self.defillama.fetch(slug)
)
# 3. Об'єднати дані
project = self.merge_data(coingecko_data, github_data, defillama_data)
# 4. Обчислити Trust Score
project["trust_score"] = self.risk_engine.calculate(project)
project["risk_level"] = self.risk_engine.get_risk_level(project["trust_score"])
# 5. Зберегти в базу даних
await self.db.upsert(project)
# 6. Кешувати для наступного запиту
await self.cache.set(f"project:{slug}", project, ttl=3600)
return project
⚡ Продуктивність
| Метрика | Нове отримання | Кешовані |
|---|---|---|
| Загальний час | 2-3 секунди | менше 50 мс |
| CoinGecko | ~800 мс | - |
| GitHub | ~1.2 с | - |
| DefiLlama | ~500 мс | - |
Коефіцієнт влучання в кеш
- CoinGecko: ~90%
- GitHub: ~85%
- DefiLlama: ~75%
4. Збирач DefiLlama Raises ✨ НОВЕ
Файл: defillama_raises.py
Призначення: Отримує дані про збір коштів (раунди, інвестори, суми) для компонента Tokenomics.
Зібрані дані
| Поле | Опис | Приклад |
|---|---|---|
total_raised | Загальне фінансування в мільйонах USD | 150.4 |
funding_rounds | Список раундів фінансування | [Seed, Series A, ...] |
lead_investors | Провідні інвестори за раунд | ["a16z", "Paradigm"] |
all_investors | Усі інвестори з рівнями | [{name, tier, weight}] |
backer_tier_score | Оцінка якості інвестора (0-100) | 80 |
Деталі API
- Кінцева точка:
https://api.llama.fi/raises - Ліміт запитів: Без обмежень
- Cache TTL: 24 години (дані рідко змінюються)
- Вартість: Безкоштовно ✅
- Розмір даних: 6 723 раунди фінансування, 9 311 інвесторів
Класифікація VC-рівнів
Збирач автоматично класифікує інвесторів за рівнями:
VC_TIERS = {
"tier_1": ["a16z", "paradigm", "pantera", "polychain", "coinbase ventures"],
"tier_2": ["delphi digital", "galaxy", "blockchain capital"],
"tier_3": ["dwf labs", "wintermute", "gsr"] # Червоні прапорці
}
Розрахунок оцінки підтримки
score = 50 # База
score += min(tier_1_count * 10, 30) # Бонус рівня 1 (макс. +30)
score -= min(tier_3_count * 10, 20) # Штраф рівня 3 (макс. -20)
score += min(total_investors * 2, 20) # Бонус за кількість інвесторів
score += min(lead_count * 5, 10) # Бонус за провідного інвестора
Приклад відповіді
{
"project_name": "Polkadot",
"total_raised": 150.4,
"backer_tier_score": 80,
"funding_rounds": [
{ "round_type": "Private", "amount_raised": 100, "date": "2020-06-01" },
{ "round_type": "Series A", "amount_raised": 50.4, "date": "2021-02-15" }
],
"investors": [
{ "name": "Polychain Capital", "tier": 1, "is_lead": true },
{ "name": "Hashed", "tier": 2, "is_lead": true }
],
"lead_investors": ["Polychain Capital", "Hashed"]
}
Wintermute або GSR, оцінка backer_tier_score автоматично знижується,
щоб позначити потенційні занепокоєння щодо маніпуляцій ринком. :::
5. Збирач Dropstab (Все-в-одному) ✨ НОВЕ
Файл: dropstab.py
Призначення: Потужний агрегатор, що витягує критичні дані, зазвичай приховані за платними підписками або складними інтерфейсами.
Зібрані дані
| Поле | Джерело | Опис |
|---|---|---|
| Certik Score | Certik Skynet | Оцінка безпеки (0-100) та Рівень (AAA-Bronze) |
| TweetScout | TweetScout.io | Рівень впливу спільноти (1-5) та Оцінка |
| Scam Alert | Dropstab Risk | КРИТИЧНИЙ прапорець, якщо проєкт є відомим шахрайством |
| Investors | CryptoRank/Crunchbase | Список VC та раундів збору коштів |
| Vesting | VestLab | Графіки розблокування токенів |
Ключова логіка: "Об'єкт Dropstab"
Ми витягуємо масивний об'єкт JSON, вбудований у вихідний код сторінки Dropstab
(__NEXT_DATA__). Це дає нам доступ до всієї їхньої партнерської екосистеми
(Certik, TweetScout) без необхідності окремих ключів API для кожного сервісу.
🔄 Конвеєр збору даних
Коли запитується проєкт, CryptoService координує роботу всіх збирачів даних:
def _fetch_and_save(self, cur, slug: str):
# 1. Отримати дані з CoinGecko
cg_data = self.coingecko.get_coin_data(slug)
# 2. Отримати метрики GitHub
gh_data = self.github.get_repo_metrics(cg_data.get("github_org"))
# 3. Отримати TVL з DefiLlama
dl_data = self.defillama.get_protocol_data(slug)
# 4. Отримати DefiLlama Raises (збір коштів)
raises_data = self.defillama_raises.harvest_project_funding(cg_data.get("name"))
# 5. Об'єднати всі дані
merged_data = {**cg_data, **gh_data, **dl_data, **raises_data}
# 6. Обчислити Trust Score за 6 стовпами
score_result = self.risk_engine.calculate_trust_score(merged_data)
# 7. Зберегти в базу даних
cur.execute("INSERT INTO crypto_projects ...")
⚡ Продуктивність
| Метрика | Нове отримання | Кешовані |
|---|---|---|
| Загальний час | 2-3 секунди | < 50 мс |
| CoinGecko | ~800 мс | - |
| GitHub | ~1.2 с | - |
| DefiLlama TVL | ~500 мс | - |
| DefiLlama Raises | ~100 мс* | - |
*Дані Raises кешуються масово (усі 6 723 раунди одночасно).
Коефіцієнт влучання в кеш
| Збирач | Коефіцієнт влучання |
|---|---|
| CoinGecko | ~90% |
| GitHub | ~85% |
| DefiLlama TVL | ~75% |
| DefiLlama Raises | ~95%* |
*Кеш Raises є спільним для всіх проєктів.
6. Збирач DefiLlama Emissions ✨ НОВЕ
Файл: defillama_emissions.py
Призначення: Отримує графіки вестингу/розблокування токенів з розбивкою за розподілом.
Зібрані дані
| Поле | Опис | Приклад |
|---|---|---|
categories | Розподіл за категоріями | [Airdrop, Team, Investors...] |
unlock_progress_pct | % розблокованих токенів | 65.4% |
total_supply | Максимальна пропозиція | 10,000,000,000 |
next_unlock | Наступна подія розблокування | {date, amount} |
Деталі API
- Кінцева точка:
https://api.llama.fi/emission/SLUG - Ліміт запитів: Без обмежень
- Cache TTL: 24 години
- Вартість: Безкоштовно ✅
Приклад виводу
{
"name": "Arbitrum",
"categories": [
{ "name": "Airdrop", "unlocked": 1162000000 },
{ "name": "Foundation", "unlocked": 750000000 },
{ "name": "Advisors Team OffchainLabs", "unlocked": 2694000000 }
],
"unlock_progress_pct": 100.0,
"total_supply": 10000000000
}
Результати тестування
| Токен | Категорії | Прогрес розблокування |
|---|---|---|
| Arbitrum | 5 | 100% |
| Aptos | 4 | 100% |
| Sui | 8 | 0% |
| ApeCoin | 5 | 100% |
(наприклад, Optimism) ми елегантно повертаємо статус "not_tracked". :::
7. Збирач ICODrops ✨ НОВЕ
Файл: icodrops.py
Призначення: Запасне джерело даних про вестинг, коли DefiLlama Emissions не має покриття. Витягує детальну розбивку розподілу токенів зі сторінок ICODrops SSR.
Зібрані дані
| Поле | Опис | Приклад |
|---|---|---|
vesting_schedule | Список категорій вестингу | [Team, Investors, Airdrop...] |
tge_date | Дата події генерації токенів | "2025-04-28" |
investors | Список інвесторів проєкту | [Paradigm, a16z, ...] |
vesting_progress | Загальний відсоток розблокування | 45.5% |
Ключові функції
- Інтеграція резервного варіанту: Викликається лише тоді, коли DefiLlama Emissions не повертає даних
- days_remaining: Обчислює кількість днів до розблокування кожної категорії
- locked_value_m: Вартість заблокованих токенів у доларах за категорією
Приклад виводу
{
"coin_name": "Monad",
"vesting_schedule": [
{
"category": "Team",
"status": "locked",
"days_remaining": 1453,
"locked_value_m": 606.99
},
{ "category": "Public Sale", "status": "unlocked", "unlock_pct": 100 }
],
"investor_count": 15,
"tge_date": "2025-04-28"
}
нових проєктів, які DefiLlama ще може не відстежувати. Це забезпечує комплексне покриття для нещодавно запущених токенів. :::
8. Збирач CryptoRank (Відключено)
Файл: cryptorank.py
Призначення: Офіційний API для даних про збір коштів (потрібен платний ключ API).
Статус: Наразі відключено через вартість API.
🚀 Майбутні збирачі даних (Заплановано)
Збирач LunarCrush
- Дані: Соціальні метрики, залученість інфлюенсерів
- Призначення: Опора спільноти
- Статус: Заплановано на 1 квартал 2026 року
Збирач TwitterScore
- Дані: Якість підписників, виявлення ботів
- Призначення: Опора спільноти
- Статус: Заплановано
Усі 8 збирачів даних працюють на безкоштовних рівнях API без жодних витрат.