Розробка yield vault з автокомпаундингом під ключ
Користувач вніс 100 ETH у vault на Curve, але через пропущений harvest протягом місяця APY виявився на 30% нижчим за розрахунковий. Це типова ситуація: без автокомпаундингу складний відсоток не працює, а ручний збір винагород (harvest) потребує часу та газових витрат. Ми будуємо yield vault — смарт-контракти, які автоматично реінвестують дохідність, позбавляючи від ручного harvest. Це ключовий компонент DeFi-протоколів, але реалізація пов'язана з нетривіальними технічними складнощами: хто платить за compound, як уникнути прослизання при продажу reward-токенів і як захиститися від reentrancy через токени з хуками. Наші інженери з 5+ річним досвідом у DeFi запустили 10+ vault-ів у mainnet, і ми готові поділитися напрацьованими практиками.
Як працює yield vault з автокомпаундингом?
Yield vault приймає користувацькі кошти, розміщує їх у протоколі (Aave, Compound, Curve, Convex), збирає накопичені reward-токени та реінвестує їх назад. На практиці виникають нетривіальні проблеми: хто платить за compound, як не втратити на прослизанні при продажу rewards і як не потрапити під reentrancy через токени з хуками.
Хто викликає harvest і за чий рахунок
Автокомпаундинг потребує періодичного виклику функції harvest() — збір rewards та реінвестування. Цю транзакцію хтось має оплатити.
- Permissionless harvest: Будь-хто може викликати
harvest()та отримати bounty (зазвичай 0.5-1% від зібраних rewards). Економіка працює, коли rewards достатньо великі. При низькому TVL vault-а harvest трапляється рідко, APY нижче заявленого. - Keeper-based harvest: Згідно з документацією Chainlink Automation, налаштування тригера займає хвилини. Chainlink Automation або Gelato Network викликають
harvest()за розкладом або при накопиченні порогу. Надійніше, але потребує фінансування. Gelato бере оплату з самих rewards черезIAutomateінтерфейс. - Harvest при кожному deposit/withdraw: Найпростіший варіант, але при першому депозиті в новий vault ви платите gas за harvest нульових rewards.
Ми зазвичай використовуємо гібрид: keeper за розкладом з permissionless harvest як fallback.
Математика компаундингу та помилки накопичення
APY при компаундингу: (1 + r/n)^n - 1, де r — річна ставка, n — кількість компаундингів на рік. При щоденному компаундингу (n=365) та 20% APR — APY складе 22.13%. При щотижневому (n=52) — 21.94%. Різниця невелика, але неправильна частота на frontend розчаровує користувачів.
Помилка округлення: при кожному compound shares * pricePerShare не завжди ділиться націло на totalAssets. Накопичувальна помилка за тисячі compound-операцій може стати значущою. Рішення: зберігати totalAssets як точне значення, оновлювати його атомарно при кожній операції. Ефект складного відсотка працює без втрат.
Як налаштувати Chainlink Automation keeper?
- Розгорніть контракт vault та зареєструйте upkeep на Chainlink Automation.
- У
checkUpkeep()повернітьtrue, коли накопичені rewards перевищують поріг (наприклад, 1000 токенів). - У
performUpkeep()викличтеharvest()та спалюйте комісію keeper. - Встановіть інтервал перевірки (minWaitSeconds) та бюджет у LINK.
Це гарантує регулярний compound навіть при низькому TVL.
Стратегія — ядро vault
Інтеграція з Curve + Convex
Класична стратегія: депозит USDC → Curve 3pool (USDC/USDT/DAI) → отримання 3CRV → стейкінг у Convex Finance → отримання CRV + CVX rewards → продаж CRV/CVX за USDC → додавання назад у 3pool. Криві взаємодії в Solidity:
// Deposit в Curve
ICurvePool(POOL_3CRV).add_liquidity([amount, 0, 0], minLpTokens);
// Stake LP в Convex
IConvexBooster(BOOSTER).deposit(pid, lpAmount, true);
// Claim rewards
IConvexRewardPool(REWARD_POOL).getReward(address(this), true);
// Sell CRV via Uniswap V3
ISwapRouter(UNISWAP_ROUTER).exactInputSingle(params);
Ризик прослизання при продажу rewards: якщо vault накопичив 50,000 CRV і продає все за один своп — price impact 2-5%. Рішення: розбити продаж на кілька частин (slicedSell) або використовувати 1inch для оптимального маршруту через кілька пулів.
Управління комісіями
Стандартна структура fee для yield vault:
- Performance fee: 10-20% від накопиченого yield при кожному harvest. Йде treasury протоколу.
- Management fee: 0.5-2% річних від TVL. Нараховується безперервно через збільшення totalAssets на користь treasury.
- Withdrawal fee: 0-0.1%. Опціонально, для discourage короткострокових депозитів.
Реалізація management fee без окремих транзакцій: при кожному totalAssets() call обчислювати elapsed_seconds * annualFeeRate / SECONDS_IN_YEAR * tvl та віднімати з поверненого значення. Treasury shares мінтяться при harvest.
Порівняння моделей harvest
| Модель | Переваги | Недоліки | Витрати на газ |
|---|---|---|---|
| Permissionless bounty | Нульові витрати на keeper | Непередбачувана частота | OPEX на bounty (0.5-1% rewards) |
| Keeper (Chainlink) | Гарантована періодичність | Витрати на LINK | $2-5 за upkeep на день |
| При депозиті/виводі | Простота, немає зовнішніх залежностей | Рідкий harvest при малому TVL | Входить у gas користувача |
Які ризики виникають при роботі з yield vault?
Reentrancy через ERC-777 та callback-токени
Harvest функція робить кілька зовнішніх викликів: claim → swap → deposit. ERC-777 токени викликають tokensReceived хук у отримувача. Якщо vault приймає ERC-777, під час claim хук може викликати deposit або withdraw до завершення harvest. Патерн захисту: nonReentrant на harvest, deposit, withdraw.
Sandwich-атаки на harvest своп
Публічний harvest() видимий у mempool. MEV-боти роблять sandwich: купують CRV до harvest свопу, продають після. Захист: deadline на своп (максимум 1-2 блоки), жорсткий minAmountOut через TWAP oracle замість spot price. amountOutMin = twapPrice * amount * (1 - maxSlippage). TWAP за 30 хвилин — Uniswap V3 observe(). Альтернатива: Flashbots Private Transactions.
Price manipulation через flash loan
Стратегія, яка читає spot price з AMM для розрахунку compound ratio, вразлива: flash loan тимчасово зсуває ціну. Рішення: ніколи не використовувати spot AMM price для прийняття рішень про суми. Тільки TWAP або Chainlink для цінових розрахунків.
Стек розробки
Solidity 0.8.x + OpenZeppelin 5.x (ERC-4626, ReentrancyGuard, Pausable, AccessControl). Foundry для тестування з fork-тестами на mainnet. Chainlink Automation для keeper. 1inch Fusion API для оптимальних свапів.
| Ризик | Вектор | Захист |
|---|---|---|
| Reentrancy | ERC-777 хуки в claim | nonReentrant на всі state-changing функції |
| Sandwich | Публічний harvest | TWAP minAmountOut + Flashbots |
| Price manipulation | Spot AMM ціни | Chainlink / TWAP для розрахунків |
| Накопичувальна помилка fee | Неточний totalAssets | Exact accounting, оновлення при кожній операції |
| Занадто рідкий compound | Недостатній TVL | Keeper + permissionless з bounty |
Процес роботи
- Аналітика (2-3 дні). Цільові протоколи, структура fee, частота compound, вимоги до keeper.
- Проектування (3-5 днів). ERC-4626 vault архітектура, окремий контракт стратегії для апгрейдабельності, fee accounting.
- Розробка (2-4 тижні). Vault → стратегія → keeper інтеграція → frontend (wagmi + viem).
- Тестування. Foundry fork-тести: повний цикл deposit → earn → harvest → withdraw на mainnet стані. Fuzz на суми та timing.
- Аудит. Зовнішній аудит обов'язковий при TVL > $500k. Наші vault-и проходять формальну верифікацію.
Що входить в результат?
- Вихідний код смарт-контрактів (перевірений на Etherscan)
- Документація архітектури та інструкція з деплою
- Налаштований Chainlink Automation keeper
- Інтеграція з 1inch для оптимальних свопів
- Звіт про аудит (при необхідності)
- Навчання команди та підтримка на етапі запуску
Орієнтири за термінами та вартістю
Простий vault на один протокол з Chainlink Automation — 1-2 тижні. Мультистратегійний vault з оптимальним роутингом rewards та sandwich-захистом — 4-8 тижнів. Вартість розраховується після визначення стратегії та вимог до безпеки. Обговоріть деталі — ми підготуємо індивідуальне комерційне пропозицію.
Замовте розробку yield vault з автокомпаундингом — отримайте безкоштовну консультацію. Наші інженери з 5+ річним досвідом у DeFi реалізували 10+ vault-ів для відомих протоколів. Опишіть вашу задачу, і ми запропонуємо оптимальне рішення.







