Daten-Harvester
Das Crypto-Modul verwendet 8 Daten-Harvester, um Echtzeitinformationen von externen APIs zu sammeln.
🏗️ Architektur
┌────────────┐ ┌────────────┐ ┌────────────┐ ┌────────────┐ ┌────────────┐
│ 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 Harvester
Datei: coingecko.py
Zweck: Ruft Preis-, Marktdaten und Metadaten ab.
Gesammelte Daten
| Feld | Beschreibung | Beispiel |
|---|---|---|
price_usd | Aktueller Preis in USD | 245.50 |
market_cap | Gesamte Marktkapitalisierung | 3,650,000,000 |
fdv | Vollständig verwässerte Bewertung | 4,100,000,000 |
price_change_24h | % Änderung in 24 Stunden | -2.5 |
github_url | Haupt-Repository-URL | github.com/aave |
homepage | Projekt-Website | aave.com |
API Details
- Endpoint:
https://api.coingecko.com/api/v3/coins/ID - Ratenbegrenzung: 50 Anfragen/Minute (kostenloser Tarif)
- Cache TTL: 24 Stunden
- Kosten: Kostenlos
Verwendung
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"
}
Bekannte Probleme
Veraltete GitHub-URLs: CoinGecko gibt manchmal alte Repository-URLs zurück. Wir pflegen eine Überschreibungstabelle:
GITHUB_OVERRIDES = {
"aave": "https://github.com/aave/aave-v3-core",
"compound": "https://github.com/compound-finance/compound-v2",
}
2. GitHub Harvester
Datei: github.py
Zweck: Ruft Metriken zur Entwickleraktivität ab.
Gesammelte Daten
| Feld | Beschreibung | Beispiel |
|---|---|---|
commits_30d | Commits in den letzten 30 Tagen | 45 |
active_devs | Einzigartige Mitwirkende (30d) | 12 |
last_commit_date | Letzter Commit | 2025-12-25 |
total_stars | Repository-Sterne | 2,500 |
open_issues | Anzahl offener Issues | 48 |
API Details
- Endpoint:
https://api.github.com/repos/OWNER/REPO - Stats Endpoint:
https://api.github.com/repos/OWNER/REPO/stats/participation - Ratenbegrenzung: 5.000 Anfragen/Stunde (authentifiziert)
- Cache TTL: 24 Stunden
- Kosten: Kostenlos
Asynchrone Statistikverarbeitung
Große Repositories geben anfänglich 202 NO CONTENT zurück – Statistiken werden
asynchron berechnet:
async def fetch_stats(self, repo):
response = await self.client.get(f"/repos/REPO/stats/participation")
if response.status_code == 202:
# GitHub is computing stats, retry after delay
await asyncio.sleep(2)
return await self.fetch_stats(repo)
return response.json()
Fallback für fehlende Repos
if not github_url or github_url == "":
return {
"commits_30d": 0,
"active_devs": 0,
"error": "No public repository found"
}
3. DefiLlama Harvester
Datei: defillama.py
Zweck: Ruft DeFi-spezifische Metriken ab (TVL, Treasury).
Gesammelte Daten
| Feld | Beschreibung | Beispiel |
|---|---|---|
tvl | Gesamtwert gesperrt (USD) | 32,400,000,000 |
chain_tvls | TVL-Aufschlüsselung nach Chain | ethereum: 25B, polygon: 5B |
category | DeFi-Kategorie | "Lending" |
mcap_to_tvl_ratio | Marktkapitalisierung / TVL | 0.09 |
API Details
- Endpoint:
https://api.llama.fi/protocol/SLUG - TVL History:
https://api.llama.fi/protocol/SLUG/tvl - Ratenbegrenzung: Unbegrenzt (kein Schlüssel erforderlich)
- Cache TTL: 6 Stunden (TVL ändert sich schneller)
- Kosten: Kostenlos ✅
Slug-Zuordnung
DefiLlama verwendet andere Slugs als CoinGecko. Wir pflegen eine Zuordnung:
DEFILLAMA_SLUGS = {
"aave": "aave",
"uniswap": "uniswap",
"compound-governance-token": "compound",
}
Beispiel-Antwort
{
"tvl": 32451269361,
"chainTvls": {
"Ethereum": 25000000000,
"Polygon": 5000000000,
"Avalanche": 2451269361
},
"category": "Lending",
"mcap": 2900000000
}
🔄 Harvesting-Pipeline
Wenn ein Projekt angefordert wird, orchestriert der CryptoService alle
Harvester:
async def fetch_project(self, slug: str):
# 1. Check cache first
cached = await self.cache.get(f"project:{slug}")
if cached:
return cached
# 2. Fetch from all sources in parallel
coingecko_data, github_data, defillama_data = await asyncio.gather(
self.coingecko.fetch(slug),
self.github.fetch(slug),
self.defillama.fetch(slug)
)
# 3. Merge data
project = self.merge_data(coingecko_data, github_data, defillama_data)
# 4. Calculate Trust Score
project["trust_score"] = self.risk_engine.calculate(project)
project["risk_level"] = self.risk_engine.get_risk_level(project["trust_score"])
# 5. Save to database
await self.db.upsert(project)
# 6. Cache for next request
await self.cache.set(f"project:{slug}", project, ttl=3600)
return project
⚡ Performance
| Metrik | Frische Abfrage | Gecached |
|---|---|---|
| Gesamtzeit | 2-3 Sekunden | unter 50ms |
| CoinGecko | ~800ms | - |
| GitHub | ~1.2s | - |
| DefiLlama | ~500ms | - |
Cache-Trefferquoten
- CoinGecko: ~90%
- GitHub: ~85%
- DefiLlama: ~75%
4. DefiLlama Raises Harvester ✨ NEU
Datei: defillama_raises.py
Zweck: Ruft Fundraising-Daten (Runden, Investoren, Beträge) für die Tokenomics-Säule ab.
Gesammelte Daten
| Feld | Beschreibung | Beispiel |
|---|---|---|
total_raised | Gesamtfinanzierung in Millionen USD | 150.4 |
funding_rounds | Liste der Finanzierungsrunden | [Seed, Series A, ...] |
lead_investors | Lead-Investoren pro Runde | ["a16z", "Paradigm"] |
all_investors | Alle Investoren mit Tiers | [{name, tier, weight}] |
backer_tier_score | Investor-Qualitätsscore (0-100) | 80 |
API Details
- Endpoint:
https://api.llama.fi/raises - Ratenbegrenzung: Unbegrenzt
- Cache TTL: 24 Stunden (Daten ändern sich selten)
- Kosten: Kostenlos ✅
- Datengröße: 6.723 Finanzierungsrunden, 9.311 Investoren
VC Tier Klassifizierung
Der Harvester klassifiziert Investoren automatisch in Tiers:
VC_TIERS = {
"tier_1": ["a16z", "paradigm", "pantera", "polychain", "coinbase ventures"],
"tier_2": ["delphi digital", "galaxy", "blockchain capital"],
"tier_3": ["dwf labs", "wintermute", "gsr"] # Red flags
}
Berechnung des Backer Score
score = 50 # Base
score += min(tier_1_count * 10, 30) # Tier 1 bonus (max +30)
score -= min(tier_3_count * 10, 20) # Tier 3 penalty (max -20)
score += min(total_investors * 2, 20) # Investor count bonus
score += min(lead_count * 5, 10) # Lead investor bonus
Beispiel-Antwort
{
"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"]
}
oder GSR unterstützt wird, wird der backer_tier_score automatisch
reduziert, um potenzielle Bedenken hinsichtlich Marktmanipulation zu
kennzeichnen. :::
5. Dropstab Harvester (All-in-One) ✨ NEU
Datei: dropstab.py
Zweck: Ein leistungsstarker Aggregator, der kritische Daten extrahiert, die normalerweise hinter Paywalls oder komplexen Benutzeroberflächen verborgen sind.
Gesammelte Daten
| Feld | Quelle | Beschreibung |
|---|---|---|
| Certik Score | Certik Skynet | Sicherheits-Score (0-100) und Tier (AAA-Bronze) |
| TweetScout | TweetScout.io | Community-Einflusslevel (1-5) und Score |
| Scam Alert | Dropstab Risk | KRITISCHES Flag, wenn das Projekt ein bekannter Scam ist |
| Investoren | CryptoRank/Crunchbase | Liste der VCs und Finanzierungsrunden |
| Vesting | VestLab | Token-Freigabepläne |
Schlüssel-Logik: Das "Dropstab Object"
Wir extrahieren ein umfangreiches JSON-Objekt, das in der Dropstab-Seitenquelle
(__NEXT_DATA__) eingebettet ist. Dies ermöglicht uns den Zugriff auf ihr
gesamtes Partner-Ecosystem (Certik, TweetScout), ohne separate API-Schlüssel für
jeden Dienst zu benötigen.
🔄 Harvesting-Pipeline
Wenn ein Projekt angefordert wird, orchestriert der CryptoService alle
Harvester:
def _fetch_and_save(self, cur, slug: str):
# 1. Fetch from CoinGecko
cg_data = self.coingecko.get_coin_data(slug)
# 2. Fetch GitHub metrics
gh_data = self.github.get_repo_metrics(cg_data.get("github_org"))
# 3. Fetch DefiLlama TVL
dl_data = self.defillama.get_protocol_data(slug)
# 4. Fetch DefiLlama Raises (fundraising)
raises_data = self.defillama_raises.harvest_project_funding(cg_data.get("name"))
# 5. Merge all data
merged_data = {**cg_data, **gh_data, **dl_data, **raises_data}
# 6. Calculate 6-Pillar Trust Score
score_result = self.risk_engine.calculate_trust_score(merged_data)
# 7. Save to database
cur.execute("INSERT INTO crypto_projects ...")
⚡ Performance
| Metrik | Frische Abfrage | Gecached |
|---|---|---|
| Gesamtzeit | 2-3 Sekunden | < 50ms |
| CoinGecko | ~800ms | - |
| GitHub | ~1.2s | - |
| DefiLlama TVL | ~500ms | - |
| DefiLlama Raises | ~100ms* | - |
*Raises-Daten werden im Bulk-Cache gespeichert (alle 6.723 Runden auf einmal).
Cache-Trefferquoten
| Harvester | Trefferquote |
|---|---|
| CoinGecko | ~90% |
| GitHub | ~85% |
| DefiLlama TVL | ~75% |
| DefiLlama Raises | ~95%* |
*Der Raises-Cache wird über alle Projekte hinweg geteilt.
6. DefiLlama Emissions Harvester ✨ NEU
Datei: defillama_emissions.py
Zweck: Ruft Token-Vesting-/Entsperrungspläne mit Aufschlüsselung der Zuteilung ab.
Gesammelte Daten
| Feld | Beschreibung | Beispiel |
|---|---|---|
categories | Zuteilung nach Kategorie | [Airdrop, Team, Investors...] |
unlock_progress_pct | % der entsperrten Token | 65.4% |
total_supply | Maximalversorgung | 10,000,000,000 |
next_unlock | Nächstes Entsperrungsereignis | {date, amount} |
API Details
- Endpoint:
https://api.llama.fi/emission/SLUG - Ratenbegrenzung: Unbegrenzt
- Cache TTL: 24 Stunden
- Kosten: Kostenlos ✅
Beispiel-Output
{
"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
}
Testergebnisse
| Token | Kategorien | Entsperrungsfortschritt |
|---|---|---|
| Arbitrum | 5 | 100% |
| Aptos | 4 | 100% |
| Sui | 8 | 0% |
| ApeCoin | 5 | 100% |
Daten (z.B. Optimism) geben wir den Status "not_tracked" zurück. :::
7. ICODrops Harvester ✨ NEU
Datei: icodrops.py
Zweck: Fallback-Vesting-Datenquelle, wenn DefiLlama Emissions keine Abdeckung bietet. Extrahiert detaillierte Token-Zuteilungsaufschlüsselungen von ICODrops SSR-Seiten.
Gesammelte Daten
| Feld | Beschreibung | Beispiel |
|---|---|---|
vesting_schedule | Liste der Vesting-Kategorien | [Team, Investors, Airdrop...] |
tge_date | Datum des Token Generation Event | "2025-04-28" |
investors | Liste der Projektinvestoren | [Paradigm, a16z, ...] |
vesting_progress | Gesamter Entsperrungsprozentsatz | 45.5% |
Hauptfunktionen
- Fallback-Integration: Nur aufgerufen, wenn DefiLlama Emissions keine Daten zurückgibt
- days_remaining: Berechnet die Tage bis zur Entsperrung jeder Kategorie
- locked_value_m: Dollarwert der gesperrten Token pro Kategorie
Beispiel-Output
{
"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"
}
für neue Projekte, die DefiLlama möglicherweise noch nicht verfolgt. Dies gewährleistet eine umfassende Abdeckung für kürzlich eingeführte Token. :::
8. CryptoRank Harvester (Deaktiviert)
Datei: cryptorank.py
Zweck: Offizielle API für Fundraising-Daten (erfordert einen kostenpflichtigen API-Schlüssel).
Status: Derzeit deaktiviert aufgrund von API-Kosten.
🚀 Zukünftige Harvester (Geplant)
LunarCrush Harvester
- Daten: Soziale Metriken, Influencer-Engagement
- Zweck: Community-Säule
- Status: Geplant für Q1 2026
TwitterScore Harvester
- Daten: Follower-Qualität, Bot-Erkennung
- Zweck: Community-Säule
- Status: Geplant
Alle 8 Harvester arbeiten mit kostenlosen API-Tarifen ohne Kosten.