Розробка протоколу синтетичних активів
Synthetix втратив близько 37 мільйонів доларів у 2019 році не через уязвимість у коді — через баг в оракулі Chainlink для корейської вони. Один бот прочитав неправильну ціну, виконав 37 мільйонів транзакцій sETH/sKRW за кілька хвилин. Протокол відкатив угоди через governance. Це показова історія: синтетичні активи — це протокол, який цілком живе на точності цінових даних, і будь-який сбій у цьому шарі смертельний.
Архітектурні підходи до синтетики
Два принципово різні механізми лежать в основі більшості синтетичних протоколів.
Debt pool модель (Synthetix v2/v3)
Усі стейкери протоколу колективно несуть борг перед власниками синтетиків. Якщо власники sAAPL заробляють, стейкери втрачають — пропорційно доле в загальному debt pool. Це створює zero-sum динаміку всередині протоколу та складну математику P&L для провайдерів ліквідності.
Головна проблема debt pool: якщо деякі синтетики росте в ціні значно швидше інших, борг стейкерів раздувається асиметрично. Synthetix v2 вирішував це через debt hedging з допомогою synth indices на Curve. Synthetix v3 розділив collateral пули за ізольованими ринками — тепер ризик не розмазується по всім стейкерам глобально.
CDP модель з overcollateralization (Mirror, Abracadabra)
Кожен синтетик забезпечений залогом в іншому активі з надлишком. Mirror Protocol чеканив mAAPL, mTSLA під залог UST з collateral ratio 150%+. Після краху UST у травні 2022 — нічого не залишилось для забезпечення погашення. Це екзистенціальний ризик будь-якої CDP-синтетики: якість забезпечення визначає стійкість всієї системи.
| Параметр | Debt Pool (Synthetix) | CDP (Mirror/Abracadabra) |
|---|---|---|
| Ліквідність | Теоретично нескінченна (mint on-demand) | Обмежена залогом |
| Ризик стейкера | Розділений борг пулу | Ізольований (тільки своя позиція) |
| Oracle dependency | Критична | Критична |
| Складність аудиту | Висока | Середня |
| Gas cost mint | Низький | Середній |
Оракули: найслабке місце
Latency arbitrage
Synthetix v1 страждав від frontrunning: трейдер бачив оновлення оракула в мемпулі, відправляв транзакцію з вищим газом, торгував по старій ціні до того, як оновлення пройде. Це називається latency arbitrage.
Рішення, яке впровадив Synthetix — off-chain pricing з on-chain settlement: ціна підписується авторизованим вузлом у момент угоди, контракт верифікує підпис. Нульовий slippage, latency arbitrage неможливий. Подібний механізм використовує Pyth Network через Wormhole.
function exchange(
bytes32 sourceCurrencyKey,
uint256 sourceAmount,
bytes32 destinationCurrencyKey,
bytes calldata priceUpdateData, // Signed price from Pyth
uint256 publishTime
) external {
// Verify price freshness
require(block.timestamp - publishTime <= MAX_PRICE_LATENCY, "Price too old");
// Update price on-chain atomically with trade
pyth.updatePriceFeeds{value: msg.value}(priceUpdateData);
// Execute exchange at verified price
_internalExchange(sourceCurrencyKey, sourceAmount, destinationCurrencyKey);
}
Реальні активи (RWA синтетика): специфіка
Синтетики на акції, сировину, форекс працюють тільки під час торгів. Контракт повинен знати, коли ринок закритий, та заблокувати торгівлю в ці періоди — інакше арбітражні бути експлуатувати gap між закриттям та відкриттям.
Для RWA-синтетики обов'язкові:
- Market hours oracle — перевірка активності торгів
- Circuit breaker при відхиленні ціни більше ніж на 10% між оновленнями
- Settlement механізм для expired синтетиків
Як ми будуємо синтетичний протокол
Стек та компоненти
Core contracts (Solidity):
-
SynthFactory— деплой нових синтетичних ERC-20 -
CollateralManager— управління залогом, розрахунок C-ratio -
ExchangeEngine— логіка обміну, fee routing -
DebtLedger— облік глобального боргу (для debt pool моделі) -
OracleAggregator— агрегація Chainlink + Pyth з fallback
Розробка в Foundry з fork-тестами проти mainnet. Особливо важливо тестувати сценарії з історичними цінними даними — replay реальних рыночних рухів через vm.warp та mock оракулів.
Formalization invariants для Certora:
- Сума всіх синтетиків у долараовому еквіваленті ≤ сума залогу × max C-ratio
- Після ліквідації C-ratio позиції завжди ≥ target C-ratio
The Graph subgraph для індексації mint/burn подій, позицій, історичних боргів — без нього фронтенд буде читати стан через повільні on-chain виклики.
Механізм ліквідацій
Для CDP моделі: якщо C-ratio опускається нижче мінімального порогу, позиція відкривається для ліквідаторів. Ліквідатор спалює синтетик, отримує залог зі скидкою (зазвичай 10-15%).
Критичний момент — флаг ліквідації: не можна ліквідувати позицію атомарно, якщо це створює flash loan вектор. Схема: ліквідатор повинен тримати синтетик, щоб ліквідувати. Flash loan дозволяє позичити синтетик, ліквідувати позицію, отримати залог та повернути позику — якщо протокол не захищений.
Захист: same-block restriction — забарона ліквідації, якщо синтетик був отриманий в тому ж блоці (подібно до ERC-4626 share inflation protection).
Процес роботи
Аналітика (5-7 днів). Вибір моделі (debt pool vs CDP), список активів, джерела оракулів, параметри C-ratio, fee structure. Моделювання економіки через Python-симуляції: що відбувається при -40% основного collateral активу.
Проектування (1 тиждень). Архітектура контрактів, storage layout, інтеграції оракулів. Окремо — механізм управління для додавання нових синтетиків та зміни параметрів.
Розробка (6-10 тижнів). Core протокол + синтетичні ERC-20 + ліквідації + оракульний агрегатор. Тесты: unit, integration, fork-тесты, invariant тесты у Echidna.
Security (2-3 тижні). Внутрішній аудит (Slither, Mythril, ручний), потім зовнішній аудит. Для синтетичних протоколів — обов'язково, мінімум одна зовнішня команда.
Деплой та моніторинг. Tenderly алерти на аномальні рухи C-ratio, обсяги, цінові відхилення.
Часові орієнтири
Базовий CDP-протокол для одного синтетика — 6-8 тижнів. Повнофункціональна мульти-asset платформа з debt pool, governance та кількома типами залогу — 3-5 місяців. Паралельний аудит додає 4-8 тижнів.
Вартість розраховується індивідуально після визначення архітектури та списку активів.







