Действия деплоера 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 в тестнете).