Пользователь внёс 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-ов для известных протоколов. Опишите вашу задачу, и мы предложим оптимальное решение.







