Оракул
Ціни в NeutronX постачають самі валідатори. У кожному блоці вони голосують за ціни, мережа агрегує голоси й записує підсумкову ціну. Зовнішнього оракула й довіреного постачальника немає.
Звідки беруться ціни
Кожен валідатор запускає сайдкар оракула, який збирає котирування з кількох бірж. Ціни валідатор підписує у vote extension свого голосу за блок. Мережа не диктує джерела, вона перевіряє результат.
Надіслати ціну звичайною транзакцією неможливо: ціни потрапляють у мережу лише через голоси валідаторів.
Як рахується ціна
- Кворум. Ціна пари приймається, лише якщо за неї проголосували валідатори з 66% стейку й більше. Інакше в цьому блоці ціна пари не оновлюється.
- Медіана за стейком. Підсумкова ціна - точка, де накопичений стейк голосів досягає половини. Валідатор з більшим стейком важить більше.
- Викиди. Голос далі ніж 5% від медіани відкидається й вважається порушенням. Детальніше - в «Консенсус і валідатори».
Ціна, використана в блоці, отримана з голосів попереднього блоку.
Де використовується ціна
Ціна оракула - єдина mark-ціна в протоколі. За нею рахуються маржа, ліквідації й спрацювання умовних ордерів. Ціну угоди вона не задає: угоди завжди йдуть за цінами ордерів у книзі.
Захисні механізми
| Ситуація | Поріг | Що відбувається |
|---|---|---|
| Ціна застаріла | Старша за 10 блоків | Ринок автоматично ставиться на паузу, ліквідації за ним відкладаються. Торгівля відновлюється сама, коли ціна знову свіжа |
| Немає голосів | 50 блоків без нової ціни | Спрацьовує circuit breaker |
| Стрибок ціни | Понад 30% від поточної ціни | Спрацьовує circuit breaker, нова ціна не приймається |
| Великий рух | Понад 20% | Лише подія-попередження, ціна приймається |
Поки circuit breaker активний, ціна пари не оновлюється, а з ордерів приймаються лише reduce-only і закриття позиції. Він знімається автоматично, коли 120 блоків поспіль нові ціни тримаються в межах 30% одна від одної.
Управління
Governance може:
- поставити пару на паузу й зняти паузу;
- зняти circuit breaker раніше строку.
Поки пара на паузі, приймаються лише reduce-only ордери й закриття позиції, а ліквідації за нею йдуть зіставленням.
Для цього є повідомлення MsgOraclePausePair, MsgOracleResumePair і MsgOracleResetCircuitBreaker.