Ми регулярно стикаємося із задачею збору TVL та APY по DeFi-протоколах. Наша компанія має 5+ років досвіду в DeFi-розробці, реалізували 30+ проектів зі збору даних. На перший погляд усе просто: витягнути дані, скласти в базу, віддати через API. Але на практиці кожен протокол використовує власну логіку розрахунку — частина даних лежить on-chain, частина — у субграфах із затримкою, а APY перераховується кожен блок. Багато протоколів деплоять кілька версій на різних чейнах із несумісними ABI. До того ж RPC-провайдери обмежують частоту запитів, а субграфи The Graph можуть застарівати. Без продуманої архітектури грабінгу замість чистих даних ви отримаєте кашу з пропущених точок, завищених TVL через маніпульовані ціни та невірного APY.
Ми гарантуємо точність даних на рівні 99% завдяки перехресній валідації з кількох джерел.
Джерела даних та їх особливості
The Graph: основне джерело агрегованих даних
Більшість великих протоколів мають офіційні субграфи: Uniswap, Curve, Aave, Compound, Balancer, Yearn. The Graph Studio дозволяє запитувати історичні та поточні дані через GraphQL.
Проблеми, з якими стикаємося:
- Затримка. Субграф оновлюється із затримкою 1–10 хвилин після on-chain подій. Для моніторингу реального часу — не підходить. Для історичних даних та дашбордів — норма.
- Застарілі субграфи. Uniswap v2 субграф давно не підтримується командою, дані можуть бути неповними. Для Uniswap v3 офіційний субграф періодично відстає при високому об'ємі.
- Пагінація. The Graph повертає максимум 1000 записів за запит. Для отримання всіх пулів Uniswap v3 (їх >50 000) потрібна пагінація через
skipабоid_gtпатерн.
query GetPools($lastId: String) {
pools(first: 1000, where: { id_gt: $lastId }, orderBy: id) {
id
token0 { symbol, decimals }
token1 { symbol, decimals }
totalValueLockedUSD
volumeUSD
feeTier
}
}
- Нюанс із TVL в The Graph. Uniswap v3 субграф рахує TVL як суму значень токенів в USD через внутрішній price feed. Цей price feed іноді дає невірні значення для малоліквідних токенів — пул із $500k реального TVL може відображатися як $50M через маніпульовану ціну одного токена. Потрібна перевірка через зовнішнє джерело.
On-chain запити для точних даних
Для даних, які важливо отримати точно та актуально — прямі eth_call до контрактів:
- Aave v3 TVL:
Pool.getReserveData(asset)повертаєaToken.totalSupply() * liquidityIndex. Для кожного активу на кожному ринку. - Curve APY:
Minter.minted(gauge, user)для CRV емісії,gauge.inflation_rate()для поточної ставки. Реальний APY =(crv_per_year * crv_price) / gauge_tvl_usd. - Uniswap v3 fee APY:
positions.tokensOwed0/1— накопичені комісії. Для general pool APY:pool.feeGrowthGlobal0X128— дельта за період / liquidity.
Multicall3 (0xcA11bde05977b3631167028862bE2a173976CA11) — деплоєний на всіх мейджорних чейнах, дозволяє пакетувати сотні eth_call в одну транзакцію. Multicall3 у 10 разів ефективніший за послідовні eth_call.
DeFi Llama API
https://api.llama.fi — публічний API без ключа для TVL даних по більшості протоколів. Структура даних:
GET /tvl/{protocol} → current TVL
GET /protocol/{protocol} → historical TVL + breakdown
GET /pools → APY по всіх пулах (~10k записів)
/pools — золота жила: там вже пораховано APY для тисяч пулів на всіх чейнах. Але DeFi Llama оновлює дані раз на кілька хвилин — для realtime задач потрібен власний розрахунок.
| Джерело | Затримка | Точність TVL | Вартість запитів |
|---|---|---|---|
| The Graph | 1–10 хв | Середня (ризик маніпуляції) | Безкоштовно (1000 запитів/день) |
| On-chain (eth_call) | Реальний час | Висока | Gas, RPC ліміти |
| DeFi Llama | кілька хв | Середня | Безкоштовно, без ключа |
Як нормалізувати дані з різних протоколів?
Кожен протокол повертає дані у своєму форматі. Нормалізація DeFi даних — ключовий компонент системи. Ми приводимо все до єдиної схеми: { protocolId, chainId, poolAddress, tvlUsd, apy, timestamp }. Єдина схема дозволяє будувати cross-protocol порівняння. Для цього використовуємо Node.js скрипти з TypeScript та бібліотеку ethers.js.
Архітектура системи грабінгу
Шари збору даних
Scheduler (cron / event-driven)
├── GraphQL Fetcher (The Graph subgraphs) — The Graph scraping
├── On-chain Fetcher (Multicall3 + ethers.js) — Multicall3 batch
├── HTTP Fetcher (DeFi Llama, CoinGecko) — DeFi Llama API
└── WebSocket Listener (real-time events)
↓
Normalizer (єдиний формат)
↓
TimescaleDB / PostgreSQL
↓
API (REST/GraphQL) — дефі дані API
Normalizer — ключовий компонент. Кожен протокол повертає дані у своєму форматі. Нормалізація: { protocolId, chainId, poolAddress, tvlUsd, apy, timestamp }. Єдина схема дозволяє будувати cross-protocol порівняння.
Розрахунок APY
APY = Annual Percentage Yield з урахуванням compound. Для більшості DeFi-протоколів дані — це APR (без compound), який потрібно перерахувати:
APY = (1 + APR/n)^n - 1, де n — кількість compound періодів на рік.
Для lending протоколів APR зазвичай вже з compound (Aave v3 рахує через liquidityRate). Для LP позицій — ні: fees нараховуються без reinvest.
Компоненти реального APY для Uniswap v3 LP позиції:
- Trading fees APR (залежить від об'єму та position range)
- Liquidity mining rewards (якщо є incentives)
- Мінус IL (історична оцінка)
Чому APY без вирахування IL вводить в оману?
Чесний APY без вирахування impermanent loss — показує завищену дохідність. У реальності при широкому діапазоні LP позиції IL може з'їдати до 80% прибутку. Ми показуємо обидва числа: fee APY та fee APY мінус IL.
Обробка помилок та rate limiting
Alchemy free tier: 300 CUPS (compute units per second). Один eth_call = 10–40 CU, Multicall3 = 20 CU незалежно від кількості запитів всередині. Пакетуємо максимально. Multicall3 batch знижує витрати на RPC у 10 разів.
The Graph: 1000 запитів на день на безкоштовному плані. Використовуємо кеш з TTL — більшість даних не потрібно оновлювати частіше ніж раз на 5 хвилин.
Retry з exponential backoff на всі HTTP запити. Dead letter queue для failed fetches — не втрачаємо дані при тимчасових збоях RPC.
| Компонент | Джерело | Особливості |
|---|---|---|
| Trading fees | On-chain / The Graph | Залежить від об'єму та діапазону |
| Rewards | Merkle drop / incentives | Вимагає моніторингу |
| IL | On-chain price | Оцінюється історично |
Стек розробки
TypeScript + Node.js для скраперів. PostgreSQL + TimescaleDB для зберігання time-series. Redis для кешування проміжних даних. Docker Compose для локальної розробки.
ethers.js v6 для on-chain взаємодій. graphql-request для The Graph запитів. p-limit для контролю паралельності (не тиснемо RPC провайдери).
Типові помилки при грабінгу DeFi-даних
- Використовувати лише одне джерело без валідації. TVL з неперевіреного субграфа може бути в 10 разів вищим за реальний через маніпульовані ціни.
- Не враховувати impermanent loss при розрахунку APY для LP.
- Ігнорувати rate limits — скрапер падає з помилками, дані втрачаються.
- Зберігати всі дані в одній таблиці без партиціонування — запити до історії гальмують.
Що входить у роботу
- Аналіз протоколів та джерел даних під вашу задачу.
- Розробка скрапера з нормалізацією та валідацією.
- Налаштування TimescaleDB з TTL та партиціонуванням.
- REST/GraphQL API з кешуванням — дефі дані API.
- Документація по структурі даних та endpoint'ам.
- Підтримка протягом місяця після здачі.
Орієнтири за термінами та вартістю
Граббер для 2–3 протоколів на одному чейні з базовим API — 2–3 дні, вартість від $500. Multi-protocol, multi-chain система з історичною базою та нормалізацією — 1–2 тижні, вартість від $2000 в залежності від кількості джерел та вимог до точності APY.
Наші рішення включають парсинг Defi-пулів, розрахунок APY Uniswap, Aave TVL on-chain, використання The Graph scraping, Multicall3 batch, DeFi Llama API, нормалізацію DeFi даних, обробку rate limit RPC, та надають дефі дані API для доступу до зібраної ліквідності пулів. Оцінимо ваш проект та запропонуємо рішення під ключ. Зв'яжіться з нами, щоб обговорити деталі. Замовте розробку скрапера DeFi-даних.







