Розробка калькулятора дохідності DeFi-стратегій
Користувач бачить «APY 45%» на платформі та кладе гроші. Через три місяці знімає — отримав 8% у доларах. Остаток з'їли: комісії при вході та виході, газ на 12 транзакціях, impermanent loss у пулі, податок на reward токени, які упали на 70% до моменту harvesting. Калькулятор дохідності — це інструмент, який показує реальні цифри до прийняття рішення.
Що потрібно рахувати правильно
APY vs. APR: одна з найчастіших путаниць у DeFi
APR (Annual Percentage Rate) — простий процент без реінвестування. APY (Annual Percentage Yield) — з урахуванням compound interest. Різниця істотна:
- APR 50% → APY ≈ 64.8% при ежедневном compounding
- APR 50% → APY ≈ 100% при компаундингу кожний блок (~12 сек на Ethereum)
Формула APY через APR: APY = (1 + APR/n)^n - 1, де n — кількість періодів нарахування в рік.
Проблема: у DeFi APY часто відображається з допущенням про постійну ставку та максимальний compounding. У реальності ставка змінюється кожний блок, а газ на кожен compound операцію зменшує реальну дохідність.
Breakeven по compound частоті: При газі $5 за claim та $1000 позиції з APR 40% — оптимальна частота compound раз в ~7 днів. Частіше — газ з'їдає більше, ніж заробляє compound. Калькулятор повинен рахувати оптимальний інтервал.
Impermanent loss для LP позицій
Для liquidity provider позицій дохідність не можна рахувати без impermanent loss (IL). Формула IL для Uniswap v2:
IL = 2 * sqrt(priceRatio) / (1 + priceRatio) - 1
Для ETH/USDC пулу: ETH входив по $2000, зараз $3000. priceRatio = 1.5. IL = 2×√1.5/(1+1.5) - 1 ≈ -2.02%.
Для Uniswap v3 з concentrated liquidity IL рахується інакше — залежить від діапазону позиції. Якщо ціна виходить з діапазону, позиція стає 100% в одному активі (повний IL, комісії не нараховуються). Математика складніша, але реалізуєма: потрібно знати tickLower, tickUpper, поточний tick.
Реальні компоненти дохідності для повного розрахунку
interface YieldComponents {
baseApr: number; // Lending APR або trading fees
rewardApr: number; // Emission rewards у токенах протоколу
compoundBonus: number; // Пририст від реінвестування
impermanentLoss: number; // Тільки для LP (негативне)
tradingFees: number; // Накопленні комісії за період
gasCosts: number; // Всі on-chain операції у USD
tokenPriceImpact: number; // Зміна ціни reward токена
realYield: number; // Итого у USD
}
Як будуємо калькулятор
Джерела даних
-
Aave v3:
getReserveData()повертаєcurrentLiquidityRate(RAY = 1e27). Конвертація в APY:(1 + rate/SECONDS_PER_YEAR)^SECONDS_PER_YEAR - 1 -
Compound v3:
getUtilization()→getSupplyRate(utilization)→ лінійний розрахунок APR -
Uniswap v3: fees APR рахується через subgraph або
positions()NFT дані — volume за 24h × fee tier / TVL × 365 -
Curve:
get_virtual_price()для base APY + gauge reward APR через CRV emission schedule -
Balancer: vault API або subgraph для
swapFeeта volume
The Graph subgraph — пріоритетний джерело для історичних даних. Прямі RPC виклики — для real-time поточних ставок.
Симуляція на часовому горизонті
Калькулятор повинен не тільки рахувати поточний APY, але й проецировать на користувацький горизонт (30/90/365 днів) з кількома сценаріями:
| Сценарій | Допущення | Назначение |
|---|---|---|
| Оптимістичний | APR не падає, ціна rewards +50% | Максимальний потенціал |
| Базовий | APR знижується на 20% за квартал (ріст TVL) | Реалістична оцінка |
| Консервативний | APR -50%, rewards -70% | Захист від помилкових очікувань |
| Bear market | APR мінімальний, всі активи -50% | Stress-тест |
Gas cost calculation
Кожна операція має вимірюваний gas cost:
const GAS_ESTIMATES = {
aaveDeposit: 180_000,
aaveWithdraw: 210_000,
uniswapV3Mint: 450_000,
uniswapV3Collect: 280_000,
curveDeposit: 320_000,
rewardClaim: 150_000,
} as const;
function calcGasCost(operation: keyof typeof GAS_ESTIMATES, gasPriceGwei: number): number {
const gasUnits = GAS_ESTIMATES[operation];
const ethPrice = getCurrentEthPrice();
return (gasUnits * gasPriceGwei * 1e-9) * ethPrice; // USD
}
Історичні дані по gas price з Etherscan API або The Graph — для розрахунку середніх витрат при заданій стратегії rebalancing/harvesting.
Функціональність та UX
Мінімальний набір:
- Введення суми та періоду
- Вибір протоколу/стратегії (пошук за назвою)
- Real-time fetch поточних APR з протоколів
- Три сценарії (оптимістичний/базовий/консервативний)
- Розбивка: base yield, rewards, impermanent loss, gas costs, net yield
- Порівняння кількох стратегій рядом
Додатково — ROI breakeven калькулятор: при якій мінімальній сумі та тривалості стратегія окупає gas costs. Особливо важливо для дрібних інвесторів на Ethereum mainnet.
Стек
Frontend: React + TypeScript, Recharts для графіків дохідності, wagmi для підключення гаманця. Data: The Graph (APR histories), Alchemy/Infura (real-time chain data), CoinGecko API (ціни токенів). Logic: Typescript utility library з чистими функціями для всіх фінансових розрахунків — легко тестувати та переіспользовувать.
Часові орієнтири
Базовий калькулятор для 2-3 протоколів — 3-5 днів. Мульти-протокольний з історичними даними, IL для LP та газ-оптимізатором — 1-2 тижні. Вартість розраховується індивідуально.







