HIP-4 部署者操作
仅测试网
概述
为确保市场高质量且定义明确,验证者对结果模板进行投票,HIP-4 部署者以这些模板作为无许可部署的基础。模板固定了规范的显示文本结构、侧边名称以及类型化关键字集合。
部署没有 Gas 成本。容量则受每个部署者的限额约束(见"限额")。
操作格式
部署涉及以下操作:
{ "type": "activateOutcomeDeployer", "activate": { "venueName": <venue> } }
{ "type": "activateOutcomeDeployer", "deactivate": null }
{ "type": "outcomeDeploy", "venue": <venue>, "operation": { "<variant>": { ...variant fields... } } }
- 结果和问题通过创建时分配的数字索引引用,例如
"outcome": 7。 - 场所:每个
outcomeDeploy操作都携带必填的顶层venue字段,必须为部署者的场所名称(类似 HIP-3 部署者操作上的dex字段)。子部署者操作传递其所代表的部署者的场所,且结算必须针对该场所部署者的结果和问题。 - 场所名称:2–4 个小写 ASCII 字母,遵循与 HIP-3 永续 DEX 名称相同的规则。该名称必须在所有部署者的场所名称中唯一——包括已停用者(其名称继续保留)——且不得与现有永续 DEX 名称(或
spot)相同。反之,已注册的场所名称不能被后续的永续 DEX 部署占用。 - 与 HIP-3 一样,所有元组列表在签名前应按字典序排序
keywordToValue是一个已排序的元组列表,将每个模板关键字映射到其值。例如[["expiry","20260801-0600"],["target","100"],["underlying","ABC"]]。- 名称和描述的值是二元数组:
["<name>", "<description>"]。 sideNames数组为["<YES side name>", "<NO side name>"]。- 金额和结算比例是十进制字符串(
"1"、"0.25")。
激活
activateOutcomeDeployer 是一个枚举,包含 activate 和 deactivate 两个变体:
{ "type": "activateOutcomeDeployer", "activate": { "venueName": "ab" } }
{ "type": "activateOutcomeDeployer", "deactivate": null }
- 质押要求:活跃的部署者在其作为结果部署者期间必须持续满足质押要求。该要求与部署者的其他质押要求叠加。例如,计入 HIP-3 部署的质押不会重复计入结果部署。
- 部署者必须使用 Standard 账户抽象。
停用要求最低部署者质押时长(183 天)已届满,且部署者没有活跃的结果。停用是永久的:账户无法再次激活,其场所名称继续保留。
模板
每个由部署者创建的市场都来自模板。模板具有以下三种角色之一:
- 独立结果:部署单个 YES/NO 市场;模板固定侧边名称。
- 问题:部署一个问题(即容器)。
- 问题结果:部署问题的一个结果;每个问题结果模板声明其父问题模板,且实例化仅在该父模板下被接受。
模板固定了包含 {keyword} 占位符的显示名称与描述文本(例如 "{underlying} above {target} at {expiry}"),以及每个关键字的类型化 hint。每次实例化为每个关键字提供恰好一个值。
模板元数据包含 semanticRestriction 字段,大致定义了从该模板实例化的市场的预期语义。与模板语义限制相矛盾的市场被视为格式错误,可被验证者罚没。
按 hint 类型划分的关键字值格式:
| Hint | 值格式 |
|---|---|
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 以及 registerQuestionFromTemplate 中的 questionTemplateInstance)必须携带 deployerFeeScale,即 [0, 10] 范围内的十进制字符串(Deployer fee scale cannot be negative or greater than 10.)。
- 交易该结果市场的用户支付基准结果交易费率乘以
scale + max(scale, 1):scale部分归部署者,其余归协议。若为"0",用户支付基准费率,部署者不获得任何费用。结果市场永不支付 Maker 返还。 - 问题的 scale 统一适用于其兜底结果和每一个问题结果,包括后续关联的结果;问题结果模板实例自身不携带 scale。
- 每个结果的 scale 在
outcomeMetainfo 请求中返回。
示例,以用户基准结果交易费率的倍数表示:
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 Code 的卖出订单行为与现货一致。Builder Code 也可应用于结果订单的买入订单,同样以计价代币计收。这些 builder 费用由协议尽力收取。Builder 接口在计算最大订单规模时可以验证计价代币余额是否充足。
操作参考
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 代币余额,因此现有的"其他"头寸含义保持不变。
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"}info 请求包含非空的结果部署者。{"type": "outcomeTemplates"}info 请求返回所有模板。
限额
- 每个部署者最多
N个活跃结果(测试网 N=10)。结算结果可释放容量。 - 部署者每天最多可部署
M个结果(测试网 M=50)。