Оракул

Цены в 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.