Разработка системы расчета 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 успешных контрактов в продакшене. Получите консультацию по вашему протоколу.







