Розробка агрегатора DeFi-доходності
Yearn Finance у 2020 році сформулював ідею, яка залишається актуальною: користувач не повинен вручну моніторити десятки протоколів у пошуках найкращого APY. Vault приймає депозит, стратегія автоматично розміщує засоби в найкращому протоколі, реінвестує доходність, переключається при зміні умов. Користувач отримує yvToken та більше ні про що не думає.
Побудувати агрегатор — означає вирішити кілька несв'язаних інженерних завдань одночасно: on-chain vault з множеством стратегій, off-chain keeper для автоматизації, систему порівняння APY з нормалізацією та gas-оптимізацію, яка не з'їдає всю доходність.
Архітектура: від простого vault до multi-strategy
Базовий ERC-4626 vault
ERC-4626 — стандарт для токенізованого vault (прийнятий у 2022, Ethereum mainnet). Визначає єдиний інтерфейс: deposit(), withdraw(), convertToShares(), convertToAssets(). Vault видає shares (ERC-20 токени), ціна за share зростає при накопленні доходу.
Ключова перевага: сумісність. Будь-який протокол, що підтримує ERC-4626, може використовувати ваш vault як будівельний блок. Yearn V3 переробив все під цей стандарт. Будувати vault сьогодні — означає реалізовувати ERC-4626.
// Мінімальний інтерфейс
interface IERC4626 {
function deposit(uint256 assets, address receiver) external returns (uint256 shares);
function withdraw(uint256 assets, address receiver, address owner) external returns (uint256 shares);
function totalAssets() external view returns (uint256);
function convertToShares(uint256 assets) external view returns (uint256);
function convertToAssets(uint256 shares) external view returns (uint256);
}
Multi-strategy розподіл
Один vault — кілька стратегій. Vault розподіляє засоби між стратегіями за вагами. Yearn називає це "allocator". Кожна стратегія — окремий контракт, реалізуючий інтерфейс IStrategy з методами harvest(), report(), withdraw().
Типові стратегії для USDC vault:
- Aave V3 USDC lending (base APY ~5%)
- Compound V3 USDC lending (base APY ~4-6%)
- Curve 3pool (base APY ~2-4% + CRV rewards)
- Morpho (оптимізований Aave/Compound, APY ~6-8%)
Allocator вирішує, скільки засобів тримати в кожній стратегії. Найпростіший підхід: все в максимальному APY. Більш зрілий: диверсифікація через max_allocation_per_strategy (наприклад, не більше 50% в один протокол) плюс облік ліквідності (стратегія повинна вивести засоби розумно швидко).
Проблема газу при малих позиціях
Операція harvest (клейм rewards + своп в базовий актив + реінвест) коштує $5-20 на Ethereum mainnet. Для vault з $10K TVL щоденний harvest з'їдає 1-2% років — может повністю знищити APY.
Рішення:
Batch harvesting: harvest викликається не за розписанням, а коли накопилений unrealized profit перевищує поріг gas_cost * multiplier. Якщо очікуваний profit $50, harvest коштує $15 — виконуємо. Якщо profit $5 — чекаємо.
L2-first стратегія: на Arbitrum або Base газ для harvest в 100-500 разів дешевше. $50K TVL vault на Arbitrum може харвестити щогодини без значних втрат.
Gas оптимізація в контрактах: батчинг через Multicall3, використання ERC-2612 (permit) замість окремого approve, packed storage.
Порівняння APY: навіщо не можна просто взяти число з UI
APY, відображений на Aave, Compound, Curve — це не одна та ж метрика. Не можна порівнювати напрямо.
Aave: supplyAPY = (1 + supplyRatePerSecond)^(seconds_per_year) - 1. Включає base rate, не включає AAVE emissions окремо.
Compound V3: supplyRate у wei за секунду. Плюс COMP reward токен, потрібно клеймити окремо.
Curve + Convex: base APY з комісій за торгівлю + CRV emissions (залежить від gauge weight голосування) + CVX rewards + будь-які додаткові rewards. Усього 4-5 окремих потоків.
Morpho: оптимізує ставки Aave/Compound через peer-to-peer matching. APY вище базового, але залежить від utilization peer-to-peer шару.
Нормалізація: усі rewards конвертуємо в USD за поточною ціною (Chainlink oracle), рахуємо total_yield_per_day / tvl * 365. Це comparable APY. Для forward-looking: використовуємо 7-денне ковзне середнє, а не spot rate.
Ризики та захист
Strategy loss: стратегія може втратити засоби (exploit в Aave, Compound або іншому). Vault повинен мати механізм звітності про втрати через report() без паніки. OpenZeppelin Vault guard: якщо стратегія репортує втрату >X% — emergency exit, засоби виводяться зі стратегії.
Withdrawal queue: користувач хоче вивести $1M, але тільки $200K вільно в vault (решта в стратегіях). Потрібна черга: спочатку free balance, потім поступовий вихід зі стратегій за пріоритетом (найменш ризикові спочатку).
Rugpull через governance: власник vault не повинен мати змогу мгновенно перевести засоби на будь-яку адресу. Усі зміни стратегій — через timelock 48 годин. Emergency функція (вивести все) — тільки на заздалегідь одобрену адресу (multisig).
Інструменти та стек
Foundry для контрактів та тестів. OpenZeppelin для базових блоків (ERC-4626 base implementation, AccessControl, ReentrancyGuard). The Graph для індексування подій vault (deposits, withdrawals, harvests) — потрібна для analytics dashboard.
Off-chain keeper: TypeScript + viem, працює на Railway або власному VPS. Cron-like scheduler для перевірки harvest conditions кожні 15 хвилин. Tenderly для симуляції перед відправкою реальних транзакцій.
Процес розробки
Архітектура та стратегії (1 тиждень). Вибір цільових протоколів, визначення allocation логіки, моделювання gas threshold.
Core vault + базова стратегія (2 тижні). ERC-4626 vault, одна стратегія (Aave або Compound), keeper для harvest.
Додаткові стратегії (1 тиждень на стратегію). Інтеграція з Curve, Morpho, Convex за необхідністю.
APY engine + frontend data (1 тиждень). Off-chain сервіс нормалізації APY, API для frontend.
Аудит. Рекомендований для будь-якого публічного vault з чужими засобами.
Сроки: простий single-strategy vault на одній мережі — 2-3 тижні. Multi-strategy з keeper, APY engine та аналітикою — 2-3 місяці. Вартість розраховується після уточнення цільових протоколів.







