Розробка on-chain опційного протоколу
Опційний протокол Hegic у 2020 році втратив $48k через помилку у розрахунку premium: целочислене ділення у Solidity з неправильним порядком операцій давало нульову вартість опціону при певних параметрах. Користувачі отримували опціони безкоштовно. Це не теоретична вразливість — це те, що трапляється, коли фінансову математику переносять до EVM без ретельного тестування граничних значень.
On-chain опціони складніші за більшість DeFi-примітивів: одночасно потрібні pricing model, управління ліквідністю, settlement mechanics та захист від ціневої маніпуляції. Кожен компонент — окремий вектор ризику.
Ключові технічні проблеми опційного протоколу
On-chain pricing: проблема волатильності
Black-Scholes вимагає передбаченої волатильності (IV). IV — динамічна величина, яка змінюється щохвилини. На блокчейні у вас два варіанти: hardcode IV (простий, але неточний) або отримати з оракула (складно, але честно).
Dopex використовує Chainlink для IV. Lyra Protocol реалізував власну off-chain волатильність з on-chain верифікацією через SNX стейкинг. Hegic v888 спростив — фіксована IV для кожного активу, оновлювана governance.
Для production-протоколу використовуємо двоосередно підхід: Chainlink price feed для spot-ціни + скользяче стандартне відхилення ціни за 30 днів як proxy для історичної волатильності. Не ідеально, але суттєво нижчий вектор атаки ніж IV-оракул з тонкою ліквідністю.
Premium формула у Solidity вимагає fixed-point arithmetic. Бібліотека ABDKMath64x64 дає 64.64-бітну точність, достатню для опційної математики. Чистий uint256 з масштабуванням на 1e18 працює, але вимагає ретельного контролю overflow у ланцюгах множень — використовуйте mulDiv з OpenZeppelin замість прямих операцій.
Settlement: європейський vs американський стиль
Європейський стиль (виконання тільки при expiry) — простіше у реалізації. Settlement відбувається в одній транзакції: порівняємо spot-ціну на момент expiry зі страйком, виплачуємо різницю. Проблема: spot-ціна на момент expiry маніпульована. Flash loan $10M зсуває spot Chainlink? Ні — Chainlink агрегує дані з затримкою, але TWAP з AMM-пулу? Так.
Американський стиль (виконання будь-коли до expiry) — значно складніше. Потрібен keeper-механізм або користувач сам викликає exercise(). Якщо exercise вигідно, але користувач забув — він втрачає гроші. Опційні протоколи вирішують це через Gelato Network або Chainlink Automation для автоматичного виконання ITM-опцій перед expiry.
Пули ліквідності для покриття позицій
Протокол може працювати в двох моделях:
Peer-to-pool. Один пул ліквідності покриває всі продані опціони. Ліквідність додають LP-провайдери в обмін на комісії. Ризик: якщо ринок сильно рухається проти позицій пулу — LP несуть убитки. Саме так працюють Hegic та Dopex.
Peer-to-peer orderbook. Продавці опцій самі ставлять ціни та блокують collateral. Покупці матчатися з продавцями. Нижча ліквідність, але немає систематичного ризику для пулу. Так працює Opyn (oToken стандарт).
Для peer-to-pool розрахунок collateral requirements критичний. Call-опцион покривається базовим активом (або cash-equivalent). Put-опцион — стейблкоїном на strike * amount. Якщо протокол дозволяє undercollateralization — це вектор атаки через швидкий рух ціни та затримку ліквідації.
Архітектура протоколу
Контракти та їх взаємодія
OptionsFactory
├── OptionsPool (per asset, per expiry)
│ ├── PricingEngine (Black-Scholes approximation)
│ ├── CollateralVault (locked LP funds)
│ └── SettlementModule
├── OracleAdapter (Chainlink + TWAP fallback)
└── FeeCollector
OptionsFactory деплоїить новий OptionsPool для кожної пари актив/expiry або керує одним пулом з маппінгом по серіях. Один пул з маппінгом простіший для аудиту, але створює cross-series ризик.
OracleAdapter — обгортка з circuit breaker. Якщо Chainlink staleness > 1 час або deviation > 10% від TWAP — торгівля призупиняється. Це захист від оракульної маніпуляції та чорних лебедів у даних.
Greeks та управління ризиком пулу
Повнофункціональний on-chain delta/gamma hedging — економічно невиправданий при поточній вартості газу. Протоколи вирішують це по-різному:
Lyra v2 використовує off-chain market maker з on-chain settlement. MM керує greeks off-chain, синхронізує позицію з пулом періодично. Компромісс між децентралізацією та ефективністю.
Dopex запровадив концепцію SSOV (Single Staking Option Vaults) — страйки та expiry фіксовані епохами, що спрощує управління ліквідністю та hedging.
Для нашого протоколу: ліміт відкритого інтересу (OI) на кожен страйк та expiry через параметри maxCallsOI та maxPutsOI. Не ідеальний hedging, але передбачувано обмежує ризик пулу.
Тестування та безпека
Fuzz-тести у Foundry покривають:
- Premium ніколи не дорівнює нулю при ненульовому size
- Settlement сума не перевищує locked collateral
- Неможливо виконати виснулий опцион
- Oracle price staleness коректно детектується
Fork-тести на mainnet: купуємо опцион, маніпулюємо Uniswap TWAP через великий swap, намагаємося виконати за маніпульованою ціною — протокол повинен або використати Chainlink, або скасуватися.
Перед розгортанням — обов'язковий зовнішній аудит. Опційні протоколи входять у топ-5 за сумою втрат у DeFi-взломах. Code4rena contest або прямий аудит у Trail of Bits, Spearbit.
Процес роботи
Специфікація (3-5 днів). Тип опцій (call/put, європейський/американський), стиль ліквідності (peer-to-pool/P2P), підтримувані активи, механіка expiry, governance.
Проектування (1 тиждень). Storage layout всіх контрактів, інтерфейси, математика pricing з верифікацією на Python-референсі перед імплементацією у Solidity.
Розробка (4-6 тижнів). Контракти + тести (unit, fuzz, fork). Окремий модуль для pricing engine з можливістю апгрейду через UUPS — моделі оцінки змінюються.
Аудит (2-4 тижні). Внутрішній + зовнішній. Для mainnet розгортання без аудиту не працюємо.
Розгортання та моніторинг. Forta-боти для моніторингу аномальних обсягів, Tenderly для алертів по on-chain подіям.
Орієнтири за часовими рамками
Мінімальний протокол (один актив, європейський стиль, фіксована IV) — 6-8 тижнів розробки без аудиту. Повнофункціональний multi-asset протокол з greeks та автоматичним settlement — 2-3 місяці. Терміни аудиту додаються окремо.







