Как это устроено
Цены: прекомпил BBO
Exchange читает цены прямо из собственного стакана Hyperliquid через прекомпил EVM. Ни внешнего оракула, ни ценового бота, ни подписанта цен.
Техническая реализация прекомпила BBO
Бирже бессрочных фьючерсов нужны цены для двух задач: исполнять сделки и решать, когда ликвидировать позиции. В большинстве сетей это значит доверять оператору оракула, или медленному и дорогому децентрализованному фиду, или мириться с риском, что тот, кто публикует цены, может заморозить рынок, просто перестав это делать.
HyperEVM предлагает другой путь. HyperCore — слой, в котором работают стаканы Hyperliquid, — можно читать из контрактов HyperEVM через прекомпилы для чтения: системные контракты по фиксированным адресам, которые возвращают текущее состояние HyperCore, в том числе цены. Exchange использует прекомпил BBO по адресу 0x000000000000000000000000000000000000080e. По индексу актива Hyperliquid (в мейннете BTC — это 0, а ETH — 1) он возвращает текущие лучшую цену покупки и лучшую цену продажи этого бессрочного фьючерса:
(ok, bid, ask) = HyperCore.readBbo(assetIndex, precompileGas) // a static call with a fixed gas allowance
require(ok && bid != 0 && ask != 0 && ask >= bid) // an empty or crossed book reverts
Цена исполнения — середина с округлением вниз, в сырых ценовых единицах рынка (цена Hyperliquid, умноженная на масштаб конкретного рынка):
price = (bid + ask) / 2
Вот и весь механизм ценообразования. Все чтения в одном блоке видят один и тот же снимок, а Exchange кэширует цену каждого рынка до конца вызова, поэтому все открытия, закрытия и ликвидации по рынку в одном блоке используют одну цену.
Чем мы за это платим и что получаем
Цена вопроса понятна: листинговать можно только рынки, которые уже торгуются в стакане Hyperliquid. То, чего нет на Hyperliquid, здесь торговать нельзя.
Взамен у ценообразования вообще нет внешней части. BBO — это состояние HyperCore, которое подтверждается консенсусом Hyperliquid так же, как балансы в её реестре. Нет ни подписанта цен, ни комитета оракулов; цена, которую видит Exchange, — это цена, которую котируют маркетмейкеры Hyperliquid в этом блоке, и её может прочитать любой контракт.
Нет предохранителя по отклонению
Кто-то может попытаться сдвинуть стакан Hyperliquid на один блок — расширить спред или сместить лучшие котировки — и торговать здесь против искажённой средней цены. Это реальный риск прямого использования BBO.
Чтение откатывает сделку, если прекомпил не отвечает, если одна из сторон стакана равна нулю или если стакан пересечён; запертый стакан, где цена покупки равна цене продажи, принимается. В контрактах есть и ценовые защиты: максимальный спред и коридоры, сравнивающие среднюю цену с маркировочной ценой и ценой оракула Hyperliquid. В развёрнутой конфигурации они выключены — намеренно, чтобы сделки исполнялись по сырой средней цене, — поэтому манипулированный, но ненулевой и непересечённый стакан принимается. Мёртвая зона, кривая влияния, лимиты открытого интереса по сторонам и короткое удержание релейером закрытий только что открытых позиций (6 секунд) уменьшают часть выплат и ограничивают экспозицию; они не делают манипуляцию невыгодной и не ограничивают убыток LP. Подробнее — в разделе Риски.
Единственный рычаг в реальном времени: вывод рынка из обращения
Одно административное действие над ценами вступает в силу сразу — вывод рынка из обращения. Хранитель вызывает pauseMarket(instrumentId): функция сохраняет текущий BBO как замороженные цены покупки и продажи и помечает рынок как выведенный. С этого момента:
- новые открытия по этому рынку откатываются;
- закрытия и ликвидации по-прежнему работают — по замороженному стакану вместо текущего.
Вывод необратим: никто, даже владелец, не может снова открыть этот id рынка. Если бы выведенный рынок мог вернуться, держатели позиций могли бы выбирать между замороженной ценой и более поздней текущей, а сам момент повторного открытия стал бы предметом игры. Если рынок возвращается, его листингуют заново под новым id. Замороженная цена позволяет остановить рынок, не заперев его позиции: их по-прежнему можно закрыть по цене, которая была разумной в момент вмешательства. Вывод делается по отдельным рынкам, поэтому проблема с одним активом не останавливает остальные.
Если в этот момент сам стакан непригоден или ему нельзя доверять, хранитель может вместо этого вывести рынок по маркировочной цене или цене оракула Hyperliquid (retireMarket с этим источником); при неудачном чтении BBO автоматически используется маркировочная цена. Хранитель также может приостановить торговлю на всех рынках через setTradingPaused(true), не замораживая цены: закрытия и ликвидации продолжают использовать текущий стакан, а снять паузу может только владелец.
Кроме лимитов открытого интереса и минимумов сделок, которые задаёт кипер рынков, выбора внерабочим кипером между двумя кривыми выплат и удаления билдера мультисигом управления, все остальные административные действия (комиссии, параметры влияния, листинги, киперы, обновления) — это действия владельца через таймлок.