Розробка DeFi-протоколу
Команда запускає lending-протокол, натхненний Aave v3. На етапі тестування все працює. Після деплою на mainnet через 48 годин оракул Chainlink повертає застарілу ціну — liquidation threshold пробиває безпечні позиції. Ліквідатори дренують залоговий пул на $400K, поки команда розбирається в чому справа. Проблема не в самому Chainlink — в відсутності перевірки staleness: контракт не перевіряв updatedAt з latestRoundData().
Розробка DeFi-протоколу — це не просто Solidity-код. Це система інваріантів, які повинні утримуватися при будь-яких ринкових умовах, MEV-атаках та force majeure на рівні інфраструктури.
Де DeFi-протоколи ломаються на етапі дизайну
Oracle manipulation через flash loan
Типова схема: атакуючий бере flash loan на 50M USDC у Aave, маніпулює ціною у пулу Uniswap v2 з низькою ліквідністю, використовує цей пул як ціновий оракул, позичає під завищену collateral, не повертає займ. Протоколи, які використовують token.balanceOf(pool) або spot price з AMM як оракул — вразливі за визначенням.
Захист працює на кількох рівнях:
TWAP замість spot price. Uniswap v3 надає OracleLibrary.consult() для розрахунку time-weighted average price. Вікно в 30 хвилин робить flash loan маніпуляцію економічно невигідною — потрібно утримувати позицію кілька блоків, кожен з ризиком арбітражу.
Chainlink з fallback. Primary source — Chainlink, fallback — Uniswap v3 TWAP. Якщо Chainlink повертає ціну з updatedAt старішою за 3600 секунд або answer < 0 — перемикаємся на TWAP з emission event для мониторингу.
Circuit breaker на відхилення. Якщо ціна змінилась більше ніж на 15% за один блок — транзакція revert. Параметр налаштовується через governance з timelock.
Reentrancy у cross-protocol взаємодіях
AMM-протокол викликає токен при swap. Якщо токен реалізує ERC-777 з tokensReceived хуком — атакуючий контракт отримує управління в середині swap, до оновлення внутрішніх балансів пулу. Не теорія: атака на Uniswap v1 через ERC-777 була одна з перших публічних DEX експлойтів.
У сучасних протоколах проблема ускладнюється: callback-паттерни (uniswapV3SwapCallback, flashLoanReceiver) навмисно передають управління зовнішньому коду. Захист будується через invariant check: перед callback фіксується стан, після — перевіряється що інваріанти дотримані.
Liquidation mechanics та bad debt
При різкому падінні ринку на 40%+ за один блок (Ethereum впав на 50% за кілька годин в березні 2020) ліквідація може не встигнути. Collateral коштує менше, ніж борг — протокол накопичує bad debt. Compound v2 з цим зіткнувся, MakerDAO ввів Emergency Shutdown саме як останній рубіж.
Параметри ліквідації вимагають математичного моделювання: loan-to-value ratio, liquidation threshold, liquidation bonus, close factor — всі мають бути відкалібровані під волатильність конкретного активу. WBTC та мем-токен не можуть мати однаковий LTV.
Архітектура протоколу
Модульна структура контрактів
Монолітний контракт на 3000 рядків — перша помилка у DeFi-протоколі. Не з естетики, а тому що:
- Перевищує лімит байткода EVM (24 KB)
- Неможливо замінити окремий модуль без повного редеплою
- Аудит займає в 3x дольше і коштує відповідно
Використовуємо Diamond Pattern (EIP-2535) для протоколів з багатою функціональністю: окремі facets для lending, liquidation, oracle, governance. Хранилище — спільне Diamond Storage через keccak256-слоти (ERC-7201).
Для простіших випадків — розділення на Core (незмінна логіка), Periphery (допоміжні контракти, можна оновлювати) та Governance. Цей паттерн використовує Uniswap починаючи з v2.
Upgradability: коли потрібна та коли шкодить
UUPS (EIP-1822) vs Transparent Proxy (EIP-1967): вибір залежить від того, хто платить за upgrade. У UUPS логіка upgrade у імплементації — дешевше для користувачів, але якщо у новій імплементації видалити функцію upgradeTo — протокол втрачає можливість upgrade навічно. У Transparent Proxy логіка у proxy — трохи дорожче кожен вив, але надійніше.
Для протоколів з TVL >$10M upgradability через multisig без timelock — це централізований вектор атаки. Gnosis Safe 4-of-7 + 48-годинний timelock через OpenZeppelin TimelockController — мінімальний стандарт довіри.
Tokenomics на рівні контракту
Ve-модель (vote-escrowed, як у Curve) вимагає careful balance: контракт блокує токени на строк до 4 років, розраховує voting power через balanceOfAtTime() на конкретному блоці. Якщо voting power розраховується неправильно — governance атака коштує дешевше, ніж мала б.
Emission schedule має бути immutable або керуватися через supermajority голосування. Retroactive зміни емісії — саме те, що вбиває довіру до протоколу.
Stack розробки
| Компонент | Інструменти | Призначення |
|---|---|---|
| Розробка | Foundry, Hardhat | Основне середовище, тести, deploy |
| Base контракти | OpenZeppelin 5.x | Access control, proxy, tokens |
| Oracle | Chainlink, Uniswap v3 TWAP | Цінові дані |
| Тестування | Foundry fuzz, Echidna | Property-based тести |
| Статичний аналіз | Slither, Mythril | Автоматичний пошук вразливостей |
| Мониторинг | Tenderly, OpenZeppelin Defender | Алерти, автоматизація |
| Індексування | The Graph | Субграф для frontend |
Fork-тести на Foundry дозволяють запустити весь протокол проти реального стану mainnet: vm.createFork("mainnet"), vm.rollFork(blockNumber). Єдиний спосіб перевірити взаємодію з реальними пулами Uniswap, реальними Chainlink feeds та реальними позиціями Aave.
Процес розробки
Специфікація (1 тиждень). Формальне описання інваріантів: «сумарний борг завжди менше сумарного collateral з врахуванням LTV», «тільки ліквідатор може закрити unhealthy позицію», «emission rate не може вирости більше ніж на X% за один governance цикл». Інваріанти стають основою для Echidna property-тестів.
Архітектурний дизайн (3-5 днів). Storage layout, інтерфейси, діаграма взаємодії контрактів. Рішення по upgradability та governance. Цей етап дешевше змінити на папері, ніж після 2 тижнів розробки.
Розробка (3-8 тижнів). Залежить від складності протоколу. Паралельно: контракти + тести у Foundry (>90% покриття), субграф на The Graph, скрипти деплою.
Внутрішній аудит + підготовка до зовнішнього. Slither CI на кожен PR. Перед зовнішнім аудитом — повна Mythril-перевірка, ручний review по SWC-checklist. Мета — закрити low/medium до зовнішнього аудитора, щоб він сфокусувався на high-level векторах.
Deploy. Testnet (Sepolia/Arbitrum Goerli) → staged mainnet через multisig з timelock → post-launch мониторинг через Tenderly.
Орієнтири за часом
Мінімальний AMM-протокол (xy=k, без концентрованої ліквідності) — 4-6 тижнів. Lending за моделлю Compound v2 — 8-12 тижнів. Повнофункціональний протокол з ve-токеномікою, governance та cross-chain поддержкою — від 3 до 6 місяців. Зовнішній аудит займає додатково 2-4 тижні та планується завчасно у топових фірм (Trail of Bits, Spearbit, Code4rena).
Вартість розраховується після технічної специфікації.







