Розробка системи розрахунку funding rate для perpetual DEX
Ми інтегруємо механізм funding rate у ваш perpetual DEX — від вибору формули до деплою keeper-інфраструктури. Perpetual futures — найбільший за об'ємом інструмент у крипто: тільки по BTC perp добовий notional сягає десятків мільярдів доларів. Без надійного on-chain розрахунку funding rate протокол ризикує втратити ліквідність через розбіжність ціни perp з spot. Ми вирішуємо це завдання під ключ: проектуємо стійкий до маніпуляцій контракт, обираємо оракули та забезпечуємо масштабування. Економія на gas та зниження витрат на інфраструктуру keeper — наші пріоритети.
Чому funding rate критичний для perp DEX?
Funding rate утримує ціну perpetual поруч зі spot. Без нього perp може торгуватися з премією >50% до spot, роблячи хеджування безглуздим. На CEX розрахунок централізований — на DEX все має бути прозорим і стійким до атак. Типова ситуація: при екстремальному дисбалансі (90% longs) ставка повинна зростати нелінійно, щоб стимулювати відкриття shorts. Ігнорування цього — шлях до краху пулу. Вартість проектування коректної моделі окупається стабільною роботою протоколу.
Як працює механіка funding rate?
Класична формула (Bitmex style)
Базова формула:
Funding Rate = clamp(Premium Index + clamp(IR - Premium Index, -0.05%, 0.05%), -0.075%, 0.075%) де:
- Premium Index = (Mark Price - Index Price) / Index Price
- IR (Interest Rate) = зазвичай 0.01% per 8h
- clamp обмежує діапазон
Mark Price — зважена за об'ємом ціна з кількох бірж. Index Price — spot ціна з оракула (Chainlink / Pyth). Коли Mark > Index — longs платять shorts, штовхаючи ціну назад до spot.
Проблема маніпуляції Mark Price
На on-chain perp DEX Mark Price не можна брати як last trade — flash loan або wash trading у маленькому пулі можуть спотворити знімок. Захист через TWAP (Time-Weighted Average Price):
function getMarkPrice() public view returns (uint256) { uint256 twapPrice = 0; uint256 totalWeight = 0; for (uint i = 0; i < observations.length; i++) { uint256 weight = observations[i].timestamp - (i > 0 ? observations[i-1].timestamp : periodStart); twapPrice += observations[i].price * weight; totalWeight += weight; } return totalWeight > 0 ? twapPrice / totalWeight : currentPrice; } Довгий TWAP period (8h) робить маніпуляцію дорогою: атакуючому потрібно утримувати штучну ціну весь інтервал. Uniswap V3 використовує аналогічний observe().
Pyth Network vs Chainlink для Index Price
| Характеристика | Chainlink | Pyth Network |
|---|---|---|
| Частота оновлення | Кожен heartbeat (1h) або при девіації >0.5% | Кожні 400 мс (pull-based) |
| Модель | Push (оракул сам надсилає) | Pull (користувач запитує) |
| Gas cost | Немає витрат на оновлення (заздалегідь) | Невеликий overhead на VAA |
| Fallback | Немає | Рекомендуємо Chainlink як fallback |
Pyth pull oracle потребує передачі VAA в кожній транзакції:
function updateAndGetPrice(bytes[] calldata priceUpdateData) external payable returns (PythStructs.Price memory) { uint fee = pyth.getUpdateFee(priceUpdateData); pyth.updatePriceFeeds{value: fee}(priceUpdateData); return pyth.getPriceUnsafe(priceId); } Невеликий gas overhead виправданий точністю.
Як нараховується funding rate on-chain?
Continuous vs discrete нарахування
| Аспект | Discrete snapshot (раз на 8h) | Continuous per-block |
|---|---|---|
| Складність | Низька | Середня |
| Масштабованість | Обмежена (>100 позицій — перевищення gas) | Без обмежень |
| Точність | Середня | Висока (постійна синхронізація) |
Continuous per-block accumulation (dYdX v3, Synthetix) елегантніший: fundingIndex зростає з кожним блоком. При відкритті запам'ятовуємо entryFundingIndex, при закритті — (currentFundingIndex - entryFundingIndex) * positionSize.
mapping(address => uint256) public positionEntryFundingIndex; uint256 public globalFundingIndex; function calculateFundingPayment(address trader) public view returns (int256) { return int256(positionSize[trader]) * int256(globalFundingIndex - positionEntryFundingIndex[trader]) / 1e18; } Цей підхід масштабується без pagination. Головне — регулярне оновлення globalFundingIndex (Chainlink Automation або власний keeper).
Реалізація з урахуванням знакових позицій
Long і short платять/отримують у протилежних напрямках. Використовуємо signed position size: int256 fundingPayment = signedPositionSize * int256(fundingRateDelta) / 1e18;.
Funding rate bounds і extreme markets
При 99% longs ставка без обмежень летить у небеса, shorts заробляють, але ніхто не хоче відкривати шорт. Потрібні границі: maxFundingRate і graduated rate (як GMX v2) — при малому дисбалансі низька ставка, при великому — нелінійне зростання. Це м'якше ніж hard cap і ефективніше вирівнює ринок.
Keeper інфраструктура
Funding rate потребує регулярного on-chain оновлення. Варіанти:
- Chainlink Automation — надійно, децентралізовано, але латентність не гарантована при навантаженні.
- Gelato Network — аналог з conditional triggers.
- Власний keeper — повний контроль, для critical protocol рекомендуємо з Chainlink як fallback.
async function updateFunding() { const lastUpdate = await contract.lastFundingUpdate(); if (Date.now() / 1000 - lastUpdate > FUNDING_INTERVAL) { const markPrice = await getMarkPriceTWAP(); const indexPrice = await pythOracle.getPrice(PRICE_ID); await contract.updateFundingRate(markPrice, indexPrice); } } setInterval(updateFunding, 60_000); Деталі вибору keeper
Для протоколів з високими вимогами до часу відгуку ми рекомендуємо власного keeper з Chainlink Automation як резервний канал. Це знижує ризики простоїв та забезпечує безперервність нарахування funding rate.Що входить у роботу
- Опис архітектури: вибір формули, oracle, settlement model.
- Інтеграція Pyth/Chainlink, написання TWAP-контракту та funding index.
- Fork-тести з екстремальними сценаріями (99% long, flash crash, rapid rate changes). Fuzz-тести на invariant: сума платежів longs = сума отримань shorts (без insurance fund).
- Деплой keeper (Chainlink Automation або власний сервіс).
- Документація та навчання команди.
- Технічна підтримка 3 місяці після релізу.
Процес розробки
- Аналітика (2-3 дні) — вибір формули (Bitmex, adaptive, bounded), oracle стратегія, модель settlement.
- Розробка (3-5 днів) — контракти: TWAP, funding index, settlement, Pyth integration.
- Тестування (2-3 дні) — fork-тести, fuzzing, invariant checks.
- Keeper деплой — налаштування Chainlink Automation або власного сервісу.
- Документація та передача.
Орієнтири за строками
Базова система з discrete settlement і Chainlink — 3-4 дні. Continuous з Pyth, adaptive bounds і keeper — 1-2 тижні. Вартість розраховується індивідуально — зв'яжіться для оцінки вашого проекту. У нас 5+ років досвіду в DeFi, понад 30 успішних контрактів у продакшені. Отримайте консультацію щодо вашого протоколу.







