Страница переведена сообществом и носит справочный характер; актуальна английская версия.
Оригинал ↗

Действия деплоера HIP-4

Только для тестнета

Обзор

Чтобы рынки были качественными и чётко определёнными, валидаторы голосуют за шаблоны исходов, которые деплойеры HIP-4 используют как основу для развёртываний без разрешения (permissionless). Шаблоны фиксируют структуру отображаемого текста спецификации, названия сторон и набор типизированных ключевых слов.

Развёртывание не требует затрат газа. Вместо этого ёмкость ограничена лимитами на каждого деплойера (см. Лимиты).

Формат действий

В развёртывании участвуют следующие действия:

{ "type": "activateOutcomeDeployer", "activate": { "venueName": <venue> } }
{ "type": "activateOutcomeDeployer", "deactivate": null }
{ "type": "outcomeDeploy", "venue": <venue>, "operation": { "<variant>": { ...variant fields... } } }
  • Исходы и вопросы ссылаются по числовому индексу, присвоенному при создании, например "outcome": 7.
  • Venue (площадка): каждое действие outcomeDeploy содержит обязательное поле верхнего уровня venue, которым должно быть название площадки деплойера (аналогично полю dex в действиях деплойера HIP-3). Действия суб-деплойеров передают площадку деплойера, от имени которого они действуют, а расчёты должны быть направлены на исходы и вопросы деплойера этой площадки.
  • Название площадки: 2–4 строчные ASCII-буквы, подчиняющиеся тем же правилам, что и названия перп-DEX HIP-3. Название должно быть уникальным среди названий площадок всех деплойеров — включая деактивированные, названия которых остаются зарезервированными — и не должно совпадать с существующим названием перп-DEX (а также spot). И наоборот, зарегистрированное название площадки не может быть занято более поздним развёртыванием перп-DEX.
  • Как и в HIP-3, все списки кортежей следует отсортировать лексикографически перед подписанием
  • keywordToValue — отсортированный список кортежей, сопоставляющий каждому ключевому слову шаблона его значение. Например, [["expiry","20260801-0600"],["target","100"],["underlying","ABC"]].
  • Значения имени и описания — массивы из двух элементов: ["<name>", "<description>"].
  • Массивы sideNames имеют вид ["<название стороны YES>", "<название стороны NO>"].
  • Суммы и доли расчёта — десятичные строки ("1", "0.25").

Активация

activateOutcomeDeployer — перечисление (enum) с вариантами activate и deactivate:

{ "type": "activateOutcomeDeployer", "activate": { "venueName": "ab" } }
{ "type": "activateOutcomeDeployer", "deactivate": null }
  • Требование стейкинга: активные деплойеры должны поддерживать требование стейкинга, пока остаются деплойерами исходов. Требования суммируются с другими требованиями стейкинга деплойера. Например, стейк, засчитываемый для развёртывания HIP-3, не засчитывается повторно для развёртывания исходов.
  • Деплойеры должны использовать Standard account abstraction.

Для деактивации требуется, чтобы минимальный срок стейкинга деплойера (183 дня) истёк и у деплойера не было активных исходов. Деактивация постоянна: аккаунт не сможет активироваться снова, а его название площадки остаётся зарезервированным.

Шаблоны

Каждый созданный деплойером рынок происходит из шаблона. Шаблон выполняет одну из трёх ролей:

  • Автономный исход: развёртывает один рынок YES/NO; шаблон фиксирует названия сторон.
  • Вопрос: развёртывает вопрос (контейнер).
  • Исход вопроса: развёртывает один исход вопроса; каждый шаблон исхода вопроса объявляет свой родительский шаблон вопроса, и экземпляры принимаются только под этим родителем.

Шаблон фиксирует отображаемые имя и текст описания, содержащие плейсхолдеры {keyword} (например, "{underlying} above {target} at {expiry}"), вместе с типизированной подсказкой (hint) для каждого ключевого слова. При инстанцировании передаётся ровно одно значение для каждого ключевого слова.

Метаданные шаблона включают поле semanticRestriction, которое в общих чертах определяет предполагаемую семантику рынков, инстанцируемых из шаблона. Рынки, противоречащие семантическому ограничению своего шаблона, считаются некорректными и подлежат слэшингу со стороны валидаторов.

Форматы значений ключевых слов по типу подсказки:

Подсказка Формат значения
dateTime время UTC %Y%m%d-%H%M, например "20260712-1830"; должно быть в пределах следующего года
date дата UTC YYYYMMDD, например "20260712" (конец дня); должна быть в пределах следующего года
string свободный текст
shortString свободный текст не более 10 символов
hlPerp название монеты существующего перпа, например "ABC" или "test:ABC"
uInt неотрицательное целое, помещающееся в u64, например "250" (без знака и ведущих нулей)
uDecimal неотрицательное десятичное число, например "0.5" или "250" (без знака, экспоненты и ведущих/конечных нулей)

Значения содержат не более 100 символов и не могут содержать {, } или | (: разрешён, например для названий монет HIP-3).

Интерполированный отображаемый текст (текст шаблона с подставленными значениями) также ограничен: имена — не более 70 символов для автономных исходов и вопросов и не более 25 символов для исходов вопросов, названия сторон автономных исходов — не более 10 символов.

Ончейн-описания исходов формируются на основе инстанцирования:

  • Имя: template:<template_id>, например template:aaa. Префикс template: зарезервирован; его могут создавать только развёртывания из шаблонов. Имена — не более 100 символов.
  • Описание: пары «ключевое слово — значение», отсортированные по ключевому слову и соединённые как keyword:value|keyword:value, например expiry:20260801-0600|target:100|underlying:BTC. Описания — не более 2000 символов.
  • Названия сторон: для автономных исходов — template: плюс названия сторон шаблона (например, template:Over / template:Under); исходы вопросов используют значения по умолчанию Yes / No.
  • Резервный исход вопроса: имя template fallback, описание other, названия сторон Yes / No.

Шкала комиссий деплойера

Экземпляры шаблонов (registerStandaloneOutcomeFromTemplate и questionTemplateInstance в registerQuestionFromTemplate) содержат обязательное поле deployerFeeScale — десятичную строку в [0, 10] (Deployer fee scale cannot be negative or greater than 10.).

  • Пользователи, торгующие на рынках исхода, платят базовую ставку комиссии за торговлю исходами, умноженную на scale + max(scale, 1): компонент scale получает деплойер, остальное — протокол. При "0" пользователи платят базовую ставку, и деплойер ничего не получает. Рибейты мейкеров на рынках исходов никогда не выплачиваются.
  • Шкала вопроса применяется единообразно к его резервному исходу и каждому исходу вопроса, включая связанные позже; экземпляры шаблонов исходов вопроса собственной шкалы не имеют.
  • Шкалы по каждому исходу возвращаются инфо-запросом outcomeMeta.

Примеры, выраженные в единицах, кратных базовой ставке комиссии пользователя за торговлю исходами:

deployerFeeScale Общая комиссия пользователя Деплойер получает Протокол получает
"1" 2x 1x 1x
"3" 6x 3x 3x
"10" 20x 10x 10x
"0.5" 1.5x 0.5x 1x
"0.25" 1.25x 0.25x 1x
"0" 1x 0x 1x

Builder codes

Builder codes наследуют поведение спота для заявок на продажу. Builder codes можно также применять к заявкам на покупку для ордеров исходов; они также списываются в котируемом токене. Эти комиссии билдеров списываются протоколом по принципу best-effort. Интерфейсы билдеров могут проверять достаточность баланса котируемого токена при вычислении максимального размера ордера.

Справочник действий

registerStandaloneOutcomeFromTemplate

Развёртывает автономный рынок YES/NO из шаблона автономного исхода.

{
  "type": "outcomeDeploy",
  "venue": "ab",
  "operation": {
    "registerStandaloneOutcomeFromTemplate": {
      "id": "abc",
      "keywordToValue": [
        ["expiry", "20260801-0600"],
        ["target", "100"],
        ["underlying", "ABC"]
      ],
      "deployerFeeScale": "1"
    }
  }
}

registerQuestionFromTemplate

Развёртывает вопрос и его исходы вопроса одним действием.

{
  "type": "outcomeDeploy",
  "venue": "ab",
  "operation": {
    "registerQuestionFromTemplate": {
      "questionTemplateInstance": {
        "id": "abc",
        "keywordToValue": [["expiry", "20260801-1830"]],
        "deployerFeeScale": "1"
      },
      "namedOutcomeTemplateInstances": [
        { "id": "abc-outcome", "keywordToValue": [["choice", "A"]] },
        { "id": "abc-outcome", "keywordToValue": [["choice", "B"]] },
        { "id": "abc-other", "keywordToValue": [] }
      ]
    }
  }
}
  • Каждый шаблон исхода вопроса должен объявлять шаблон вопроса своим родителем. Один и тот же шаблон исхода вопроса может быть инстанцирован несколько раз с разными значениями.
  • Вопрос с N исходами вопроса регистрирует N + 1 исходов (резервный создаётся автоматически). Все засчитываются в лимит активных исходов деплойера.
  • К активному вопросу можно добавить дополнительные исходы вопроса с помощью registerAndAssociateNamedOutcomeFromTemplate. Ограничение — не более 100 исходов вопроса на вопрос.

registerAndAssociateNamedOutcomeFromTemplate

Добавляет один исход вопроса к активному вопросу деплойера.

{
  "type": "outcomeDeploy",
  "venue": "ab",
  "operation": {
    "registerAndAssociateNamedOutcomeFromTemplate": {
      "question": 3,
      "namedOutcomeTemplateInstance": { "id": "abc-outcome", "keywordToValue": [["choice", "C"]] }
    }
  }
}
  • Вопрос должен быть развёрнут из шаблона, а шаблон исхода вопроса должен объявлять шаблон этого вопроса своим родителем.
  • Новый исход наследует deployerFeeScale вопроса и засчитывается в лимит активных исходов и дневной лимит деплойера.
  • Держатели резервного YES-токена вопроса получают равный баланс YES-токена нового исхода, поэтому существующие позиции «other» сохраняют свой смысл.

settleOutcome

Рассчитывает один исход деплойера.

{
  "type": "outcomeDeploy",
  "venue": "ab",
  "operation": {
    "settleOutcome": {
      "outcome": 7,
      "settleFraction": "1",
      "details": "",
      "nameAndDescription": ["template:abc", "expiry:20260801-0600|target:100|underlying:ABC"],
      "sideNames": ["template:Over", "template:Under"]
    }
  }
}
  • nameAndDescription и sideNames должны точно совпадать с рассчитываемым исходом.
  • settleFraction — десятичное число в [0, 1]. Автономные исходы могут рассчитываться в произвольную долю (например, "0.66" для скалярных выплат); исходы, принадлежащие вопросу, должны рассчитываться ровно в "0" или "1".
  • details должен быть пустым.
  • Для исходов вопроса расчёт последовательен: исходы вопроса могут рассчитываться в "0" в любом порядке. Одиночный исход рассчитывается в "1" после того, как становится последним активным исходом вопроса, что автоматически рассчитывает резервный исход в 0 и закрывает вопрос.

settleQuestion2

Рассчитывает все оставшиеся исходы вопроса одним действием. Примечание: исходный вариант settleQuestion упразднён.

{
  "type": "outcomeDeploy",
  "venue": "ab",
  "operation": {
    "settleQuestion2": {
      "question": 3,
      "outcomeSettlements": [
        {
          "outcome": 11,
          "settleFraction": "1",
          "details": "",
          "nameAndDescription": ["template:abc-outcome", "choice:A"],
          "sideNames": ["Yes", "No"]
        },
        {
          "outcome": 12,
          "settleFraction": "0",
          "details": "",
          "nameAndDescription": ["template:abc-outcome", "choice:B"],
          "sideNames": ["Yes", "No"]
        }
      ],
      "nameAndDescription": ["template:abc", "expiry:20260801-1830"]
    }
  }
}
  • outcomeSettlements должны покрывать ровно оставшиеся активные исходы вопроса, при этом ровно один рассчитывается в "1", а все остальные — в "0". Резервный исход рассчитывается в 0 автоматически.

setSubDeployers

Выдаёт или отзывает разрешения суб-деплойеров.

{
  "type": "outcomeDeploy",
  "venue": "ab",
  "operation": {
    "setSubDeployers": [
      { "variant": "registerStandaloneOutcomeFromTemplate", "user": "0xSUB_DEPLOYER", "allowed": true },
      { "variant": "settleOutcome", "user": "0xSUB_DEPLOYER", "allowed": true },
      { "variant": "settleQuestion", "user": "0xFORMER_OPERATOR", "allowed": false }
    ]
  }
}
  • Суб-деплойер, получивший вариант, может отправлять это действие от имени деплойера: регистрации создаются под площадкой деплойера и засчитываются в его лимиты, а расчёты могут быть направлены только на собственные исходы и вопросы деплойера.
  • variant — один из registerStandaloneOutcomeFromTemplate, registerQuestionFromTemplate, registerAndAssociateNamedOutcomeFromTemplate, settleOutcome или settleQuestion. Право settleQuestion авторизует действие settleQuestion2.
  • allowed добавляет или удаляет пользователя из авторизованного набора для варианта.

API чтения

  • Инфо-запрос {"type": "outcomeMeta"} включает деплойеров исходов со значением, отличным от null.
  • Инфо-запрос {"type": "outcomeTemplates"} возвращает все шаблоны.

Лимиты

  • Не более N активных исходов на деплойера (N=10 в тестнете). Расчёт исходов освобождает ёмкость.
  • Деплойер может развёртывать M исходов в день (M=50 в тестнете).
Официальный источник: https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/hip-4-deployer-actions
Дата снимка: · Дата сборки: · Перевод сообщества; приоритет у английской версии
Неофициальный перевод сообщества. Права на контент принадлежат Hyperliquid; актуальна английская версия. Источник: https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/hip-4-deployer-actions