Оракул

Ціни в NeutronX постачають самі валідатори. У кожному блоці вони голосують за ціни, мережа агрегує голоси й записує підсумкову ціну. Зовнішнього оракула й довіреного постачальника немає.

Звідки беруться ціни

Кожен валідатор запускає сайдкар оракула, який збирає котирування з кількох бірж. Ціни валідатор підписує у vote extension свого голосу за блок. Мережа не диктує джерела, вона перевіряє результат.

Надіслати ціну звичайною транзакцією неможливо: ціни потрапляють у мережу лише через голоси валідаторів.

Як рахується ціна

  1. Кворум. Ціна пари приймається, лише якщо за неї проголосували валідатори з 66% стейку й більше. Інакше в цьому блоці ціна пари не оновлюється.
  2. Медіана за стейком. Підсумкова ціна - точка, де накопичений стейк голосів досягає половини. Валідатор з більшим стейком важить більше.
  3. Викиди. Голос далі ніж 5% від медіани відкидається й вважається порушенням. Детальніше - в «Консенсус і валідатори».

Ціна, використана в блоці, отримана з голосів попереднього блоку.

Де використовується ціна

Ціна оракула - єдина mark-ціна в протоколі. За нею рахуються маржа, ліквідації й спрацювання умовних ордерів. Ціну угоди вона не задає: угоди завжди йдуть за цінами ордерів у книзі.

Захисні механізми

СитуаціяПорігЩо відбувається
Ціна застарілаСтарша за 10 блоківРинок автоматично ставиться на паузу, ліквідації за ним відкладаються. Торгівля відновлюється сама, коли ціна знову свіжа
Немає голосів50 блоків без нової ціниСпрацьовує circuit breaker
Стрибок ціниПонад 30% від поточної ціниСпрацьовує circuit breaker, нова ціна не приймається
Великий рухПонад 20%Лише подія-попередження, ціна приймається

Поки circuit breaker активний, ціна пари не оновлюється, а з ордерів приймаються лише reduce-only і закриття позиції. Він знімається автоматично, коли 120 блоків поспіль нові ціни тримаються в межах 30% одна від одної.

Управління

Governance може:

  • поставити пару на паузу й зняти паузу;
  • зняти circuit breaker раніше строку.

Поки пара на паузі, приймаються лише reduce-only ордери й закриття позиції, а ліквідації за нею йдуть зіставленням.

Для цього є повідомлення MsgOraclePausePair, MsgOracleResumePair і MsgOracleResetCircuitBreaker.