EIP-712 签名
本页是 Hypercall 所验证的每一种 EIP-712 消息的字段级参考:三个指令签名域(API 钱包、Manager、RSM),与 API 钱包域共用的纯链下永续合约消息,以及独立的 Physical Covered Call Quote(实物交割备兑看涨期权报价)域。REST API 上的期权订单使用另一个域 Hypercall,请参阅认证与签名。
本页所有内容均已与部署在 HyperEVM 主网(链 ID 999)上的合约核对:位于 0xE6b7FaA216cabb2b38B392f577C9c826378b2240 的 Exchange 0.6.1 以及 Account 0.2.4。下文列出的域分隔符和 typehash 均嵌入在已部署的字节码中。
概述
一条指令是针对单个 Account 的单个操作,在链下签名,并由 Hypercall 的 sequencer 通过 Exchange.executeUserDirective 或 Exchange.executeRsmDirective 提交上链。Account 从 EIP-712 摘要中恢复签名者并检查授权:
- API 钱包:通过
hc_update_api_wallet在 Account 上注册的地址(Account.isApiWalletActive)。用于签署订单和撤单。 - Manager:Account 的所有者(
Account.manager)。用于签署 API 钱包变更、资产转出以及账户模式变更。 - RSM 签名者:由协议控制(
Exchange.rsmSigner)。用于签署入账、提现、强制平仓指令以及只减仓恢复订单。用户永远不会签署这些消息。
指令编码
在链上,一条指令为 abi.encodePacked(account, nonce, version, id, data):
| 字节 | 字段 | 含义 |
|---|---|---|
| 20 | account | Account 地址(address) |
| 8 | nonce | 签名者的 nonce(uint64) |
| 1 | version | 操作族 |
| 3 | id | 该操作族内的操作 ID |
| 剩余 | data | 内部操作结构体的 abi.encode |
| Version | 操作族 | 操作 ID |
|---|---|---|
0 | HyperCall(HC) | 2 更新 API 钱包。1(转移期权)为保留值,会被拒绝。 |
1 | HyperLiquid(HL) | 1 限价单、9 添加 API 钱包、10 按 oid 撤单、11 按 cloid 撤单、13 发送资产、16 设置抽象模式 |
255 | System | 1 代币入账、2 期权入账、3 开始强制平仓、4 停止强制平仓、5 代币提现 |
您无需自行构建这个字节串。只需签署类型化数据,然后将 account、nonce、action 和 signature 提交给 API,由 API 完成指令编码。
类型化数据结构
每条指令的外层结构都相同:Account 地址、签名者的 nonce,以及一个内部操作结构体。
<Outer>(address account,uint64 nonce,<Inner> action)<Inner>(...)
外层类型字符串会附加内部类型定义,因此 typehash 同时覆盖两者。按 EIP-712 的术语,primaryType 为外层名称,types 包含两个条目,message 为 { account, nonce, action }。字段顺序是类型字符串的一部分,必须完全一致。
无签名的充值入口
并非所有充值调用都是 EIP-712 操作。以下方法是由付款钱包或路由合约直接发送的交易:
function depositUsdcFor(address account, uint256 amount) external;
function depositOption(address account, address token, uint256 amount) external;
depositUsdcFor 有意设计为无需签名,因为 msg.sender 仅是 USDC 的付款方。被入账的 Hypercall 账户由显式的 account 参数以及 UsdcDeposit.account 事件字段确定。路由合约和 zap 合约可能会调用此方法,因此索引器和后端服务不得使用 msg.sender 来判定入账归属。
depositOption 从 msg.sender 销毁期权代币,并为 RSM 索引器发出 Deposit(account, msg.sender, token, amount) 事件。期权入账路径由事件驱动,不需要充值方提供 manager、agent 或 RSM 签名。
独立域:实物交割备兑看涨期权报价
实物交割备兑看涨期权报价由部署在所选链上的 factory 合约验证。它们不使用 Exchange 验证器,也不使用其零地址域。
域:
{
"name": "Hypercall Physical Covered Call",
"version": "1",
"chainId": "<selected chain id>",
"verifyingContract": "<exact PhysicalCoveredCallFactory address>"
}
签名者:PhysicalCoveredCallQuote.marketMaker 中编码的做市商。
规范嵌套类型:
AssetTerms(address underlyingWrapper)
OptionTerms(address seller,uint256 underlyingAmount,uint64 strikeX8,uint64 expiry)
PhysicalCoveredCallRequest(bytes32 rfqId,AssetTerms asset,OptionTerms option)AssetTerms(address underlyingWrapper)OptionTerms(address seller,uint256 underlyingAmount,uint64 strikeX8,uint64 expiry)
PhysicalCoveredCallQuote(bytes32 requestHash,bytes32 quoteId,address marketMaker,uint256 premiumSettlement,uint64 quoteDeadline,uint64 nonce)
factory 在恢复报价签名者之前,会根据完整的嵌套请求重新计算 requestHash。因此该签名绑定了卖方、标的资产包装合约、包装份额数量、行权价、到期日、权利金、报价截止时间、nonce、链 ID 以及 factory 地址。结算代币及其精度是 factory 的权威配置,不作为单独的签名值。这一代无预言机设计中不包含 Pyth。当卖方为 vault 注资时,报价摘要和做市商 nonce 都会被消耗。
只有请求中编码的卖方才能提交已签名的报价。注资时会向卖方铸造 writer-claim NFT,并向报价的做市商铸造多头期权 NFT,前提是在启用可选的买方白名单时,该做市商是合格接收方。有效签名授权的是注资,而不是行权。
只有当前多头期权 NFT 的持有者才能调用行权。这一仅限持有者的规则可防止 ERC-721 operator 消耗持有者的结算代币授权额度。获批准的 operator 仍可按照标准 ERC-721 规则转移该 NFT,在启用买方门控时,这会将经济权利转移给合格接收方。行权成功后,会从调用者(即持有者)处划转行权现金,向该持有者交付标的资产,并销毁多头期权 NFT。
EIP-712 域分隔符
三个指令域结构相同,仅 name 不同。verifyingContract 为零地址,因此同一签名对链上任意 Account 都有效,真正将其绑定到某一个 Account 的是消息内的 Account 地址。
{
"name": "<DomainName>",
"version": "1",
"chainId": <chainId>,
"verifyingContract": "0x0000000000000000000000000000000000000000"
}
域类型为 EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)。
链 ID:主网 999,测试网 998。Account 根据其所运行的链选择分隔符,因此测试网签名永远无法在主网上通过验证。
| 域 | name | version | 签名者 | 链 | 分隔符 |
|---|---|---|---|---|---|
| API 钱包 | HypercallApiSign | 1 | API 钱包 | 999 | 0x462ae8a3a67da57ddd088e60be368536f992b8bf369d13e64e620c51993e5ebb |
| API 钱包 | HypercallApiSign | 1 | API 钱包 | 998 | 0x339bee4c00da9a5361f687797205c8d03f323659f5d9dc9e0505b9437ddee25e |
| Manager | HypercallManagerSign | 1 | Manager | 999 | 0xc9b5b0b8b0d9d7ba716326acbf795cfe431ef960a25a8f958d6569bea2f1516e |
| Manager | HypercallManagerSign | 1 | Manager | 998 | 0xd1f76b6138be892c14b71b0569bdb049cb44f239d34c78ef1ffaacd2466f9f18 |
| RSM | HypercallRsmSign | 1 | RSM 签名者 | 999 | 0x3d0cae2af623c614099dbadd67a1e1457fabde576aa270a70a57e39bf338a7be |
| RSM | HypercallRsmSign | 1 | RSM 签名者 | 998 | 0x650b282053fb61d3fd477bdc28f6434311fe905e27cc4ca643e87e802c45938c |
在签署任何内容之前,请自行计算分隔符并进行比对:
import { ethers } from "ethers";
const separator = ethers.TypedDataEncoder.hashDomain({
name: "HypercallApiSign",
version: "1",
chainId: 999,
verifyingContract: ethers.ZeroAddress
});
// 0x462ae8a3a67da57ddd088e60be368536f992b8bf369d13e64e620c51993e5ebb
消息参考
签名者与端点对照表
| 消息 | 域 | 签名者 | 提交至 | 执行内容 |
|---|---|---|---|---|
HLOrder | API | API 钱包 | POST /v1/tee-perp/orders/submit 或 POST /v1/actions/hl_limit_order | Hyperliquid 限价单 |
HLCancel | API | API 钱包 | POST /v1/tee-perp/cancels/submit-by-oid 或 POST /v1/actions/hl_cancel_by_oid | 按 oid 撤单 |
HLCancelByCloid | API | API 钱包 | POST /v1/tee-perp/cancels/submit 或 POST /v1/actions/hl_cancel_by_cloid | 按 cloid 撤单 |
HCPerpTriggerOrder | API | API 钱包 | POST /v1/tee-perp/orders/submit-trigger | 原生触发单(仅 TEE) |
HCPerpOrderBatch | API | API 钱包 | POST /v1/tee-perp/orders/submit-batch | 原生批量订单(仅 TEE) |
HCPerpLeverageChange | API | API 钱包 | POST /v1/tee-perp/leverage/submit | 杠杆调整(仅 TEE) |
HCPerpScheduleCancel | API | API 钱包 | POST /v1/tee-perp/schedule-cancel/submit | 死人开关(仅 TEE) |
HCUpdateApiWallet | Manager | Manager | POST /v1/actions/hc_update_api_wallet | Account API 钱包注册表 |
HLAddApiWallet | Manager | Manager | POST /v1/actions/hl_add_api_wallet | HyperCore API 钱包授权 |
HLSendAsset | Manager | Manager | POST /v1/actions/hl_send_asset | 从 Account 执行 HyperCore sendAsset |
HLSetAbstraction | Manager | Manager | POST /v1/actions/hl_set_abstraction | HyperCore 账户模式(仅统一账户) |
HCTransferOption | Manager | Manager | 不接受 | 保留,链上拒绝 |
HLOrder、HLCancel、HLCancelByCloid、HLSendAsset | RSM | RSM 签名者 | 仅 sequencer | 通过 Account 执行的恢复订单与资金归集 |
System* | RSM | RSM 签名者 | 仅 sequencer | 通过 Exchange 执行的入账、提现与强制平仓 |
所有 /v1/actions/{action} 路由都接收 account、nonce、action 和 signature。POST /v1/actions/{action}/typed-data 会返回该请求需要签署的精确类型化数据,这是确认您的编码器是否正确的最简便方法。GET /v1/directives/{directive_id} 返回链上执行结果。请求 schema 详见 API 参考。
传输约定
nonce以及所有uint64、uint128或uint256字段可以是不超过9007199254740991的 JSON 整数,也可以是十进制字符串。超过该值时请使用字符串。signature是 65 字节的0x十六进制字符串(r || s || v)。v可以为0、1、27或28。bytes32字段为带0x前缀的 32 字节十六进制。地址可使用校验和格式或小写十六进制。- 永续合约的价格和数量为 HyperCore 的
1e8整数,例如$50,000为5000000000000,0.001个币为100000。
API 钱包指令(HypercallApiSign)
由 Account 的活跃 API 钱包签署。使用链 ID 999,name 为 HypercallApiSign。
测试向量使用占位账户和固定 nonce,便于您逐字节核对编码器。摘要为 keccak256(0x1901 || domainSeparator || directiveStructHash)。
HLOrder
为 Account 下一笔 Hyperliquid 限价单。
结构体:
struct LimitOrder {
uint32 asset;
bool isBuy;
uint64 limitPx;
uint64 sz;
bool reduceOnly;
uint8 encodedTif;
uint128 cloid;
}
struct HLOrder {
address account;
uint64 nonce;
LimitOrder action;
}
规范 EIP-712 类型:
HLOrder(address account,uint64 nonce,LimitOrder action)LimitOrder(uint32 asset,bool isBuy,uint64 limitPx,uint64 sz,bool reduceOnly,uint8 encodedTif,uint128 cloid)
Typehash:0xe6facb816c5f9c321054ef43c7d8fb1ec750f65d630ec39c5c18119a6f4707dd。签名者:API 钱包。操作:version 1,id 1。
asset:Hyperliquid 资产索引。GET /v1/tee-perp/markets列出 Hypercall 接受的永续合约市场及其索引。isBuy:true为买入,false为卖出。limitPx、sz:价格和数量乘以1e8。reduceOnly:若订单只能减少持仓,则为true。encodedTif:ALO =1,GTC =2,IOC =3。其他任何值都会被拒绝。cloid:客户端订单 ID,不能为零。之后可用于按 cloid 撤单。
示例(ethers.js):
const domain = {
name: "HypercallApiSign",
version: "1",
chainId: 999,
verifyingContract: ethers.ZeroAddress
};
const types = {
LimitOrder: [
{ name: "asset", type: "uint32" },
{ name: "isBuy", type: "bool" },
{ name: "limitPx", type: "uint64" },
{ name: "sz", type: "uint64" },
{ name: "reduceOnly", type: "bool" },
{ name: "encodedTif", type: "uint8" },
{ name: "cloid", type: "uint128" }
],
HLOrder: [
{ name: "account", type: "address" },
{ name: "nonce", type: "uint64" },
{ name: "action", type: "LimitOrder" }
]
};
const message = {
account: managedAccount,
nonce: selectedNonce,
action: {
asset: 0,
isBuy: true,
limitPx: 5000000000000n,
sz: 100000n,
reduceOnly: false,
encodedTif: 2,
cloid: selectedNonce
}
};
const signature = await apiWalletSigner.signTypedData(domain, types, message);
测试向量(account 0x1111111111111111111111111111111111111111,nonce 1760000000000,链 999):
| 步骤 | 值 |
|---|---|
| Typehash | 0xe6facb816c5f9c321054ef43c7d8fb1ec750f65d630ec39c5c18119a6f4707dd |
| 操作结构体哈希 | 0x0fd024c6bf8f132123e63a78d50008d8c39c52e5409ef6ca87a4eec8f6eabb41 |
| 指令结构体哈希 | 0xd32948ee1f249b96124a6acdb5845d09aad8228512098598de6858d5484fe703 |
| 待签名摘要 | 0xc3c42699092fe20c7dbc4205a1027f55c28d33a682a64bd3f04e40f1d28693f5 |
该测试向量使用 isBuy: true、limitPx: 5000000000000、sz: 100000、reduceOnly: false、encodedTif: 2、asset: 0,且 cloid 等于 nonce。
提交:向 POST /v1/tee-perp/orders/submit 提交 account、nonce、action 和 signature。Hypercall 先执行保证金检查,然后由安全飞地签署并发送附带 Hypercall builder code 的原生 Hyperliquid 订单。Account manager 必须先通过 Account.approveZeroFeeBuilder 批准该 builder,请参阅入门。完整流程请参阅永续合约。
{
"account": "0x1111111111111111111111111111111111111111",
"nonce": 1760000000000,
"action": {
"asset": 0,
"isBuy": true,
"limitPx": "5000000000000",
"sz": "100000",
"reduceOnly": false,
"encodedTif": 2,
"cloid": "1760000000000"
},
"signature": "0x<65 byte signature>"
}
同一条已签名消息也可提交至 POST /v1/actions/hl_limit_order,该端点会将其编码为链上指令,并通过 Exchange.executeUserDirective 和 Account.performCoreAction 执行。
HLCancel
按 Hyperliquid 订单 ID 撤销一笔订单。外层包装为 HLCancel,内部结构体为 CancelOrderByOid。
struct CancelOrderByOid {
uint32 asset;
uint64 oid; // Order ID assigned by HyperCore
}
struct HLCancel {
address account;
uint64 nonce;
CancelOrderByOid action;
}
HLCancel(address account,uint64 nonce,CancelOrderByOid action)CancelOrderByOid(uint32 asset,uint64 oid)
Typehash:0x23c5529f34a875b6c0d11a6dfafdd945996dbdc5fbd1bdace2c2e0cf6a253a85。签名者:API 钱包。操作:version 1,id 10。提交:POST /v1/tee-perp/cancels/submit-by-oid 或 POST /v1/actions/hl_cancel_by_oid。
const types = {
CancelOrderByOid: [
{ name: "asset", type: "uint32" },
{ name: "oid", type: "uint64" }
],
HLCancel: [
{ name: "account", type: "address" },
{ name: "nonce", type: "uint64" },
{ name: "action", type: "CancelOrderByOid" }
]
};
const message = {
account: managedAccount,
nonce: selectedNonce,
action: { asset: 0, oid: 123456789n }
};
const signature = await apiWalletSigner.signTypedData(domain, types, message);
测试向量(account 0x1111111111111111111111111111111111111111,nonce 1760000000000,链 999):
| 步骤 | 值 |
|---|---|
| Typehash | 0x23c5529f34a875b6c0d11a6dfafdd945996dbdc5fbd1bdace2c2e0cf6a253a85 |
| 操作结构体哈希 | 0xa34e7bb8af0d099f9c48095924e53067bcb9b542a816445b96abebbc5646b727 |
| 指令结构体哈希 | 0x69d560ba5ef3e88459bde7fb8252e55dbc33627373c8f0cfcf8ef0868f59e097 |
| 待签名摘要 | 0x5046aba9fb33c55ce736faf63734ea66914f3f168ff0aff2229fa6f31fa9b330 |
该测试向量使用 asset: 0 和 oid: 123456789。
HLCancelByCloid
按您在 HLOrder 中设置的客户端订单 ID 撤销一笔订单。
struct CancelOrderByCloid {
uint32 asset;
uint128 cloid; // Client order ID
}
struct HLCancelByCloid {
address account;
uint64 nonce;
CancelOrderByCloid action;
}
HLCancelByCloid(address account,uint64 nonce,CancelOrderByCloid action)CancelOrderByCloid(uint32 asset,uint128 cloid)
Typehash:0x10cbcfa56297fc737e4defee7b7937a52978ebbe5920e584317f7f25416836f5。签名者:API 钱包。操作:version 1,id 11。提交:POST /v1/tee-perp/cancels/submit 或 POST /v1/actions/hl_cancel_by_cloid。
const types = {
CancelOrderByCloid: [
{ name: "asset", type: "uint32" },
{ name: "cloid", type: "uint128" }
],
HLCancelByCloid: [
{ name: "account", type: "address" },
{ name: "nonce", type: "uint64" },
{ name: "action", type: "CancelOrderByCloid" }
]
};
const message = {
account: managedAccount,
nonce: selectedNonce,
action: { asset: 0, cloid: 1760000000000n }
};
const signature = await apiWalletSigner.signTypedData(domain, types, message);
测试向量(account 0x1111111111111111111111111111111111111111,nonce 1760000000000,链 999):
| 步骤 | 值 |
|---|---|
| Typehash | 0x10cbcfa56297fc737e4defee7b7937a52978ebbe5920e584317f7f25416836f5 |
| 操作结构体哈希 | 0xfa4ab6440f946a6e279d90972d71223c768c01c8a91dc22703a6448dbcb966d0 |
| 指令结构体哈希 | 0x998efb01bb9c842eea80e8cc084b9e4e7ec13b2111790e1acbfec32e49060d9d |
| 待签名摘要 | 0x56af82a6aa7fa50907a23c6cfe3aa556af5aa087b1157163ebf6ea0240e8d29d |
该测试向量使用 asset: 0 和 cloid: 1760000000000。
仅限 TEE 的永续合约消息
以下四种消息由 Hypercall API 验证,而非由 Account 合约验证,因为它们由飞地直接在 Hyperliquid 上原生执行,不存在对应的链上指令。它们使用相同的 HypercallApiSign 域,授权方式也与 HLOrder 相同(签名者必须是该 Account 的活跃 API 钱包,且该 Account 必须为组合保证金模式)。它们的 typehash 不在合约中。nonce 为以毫秒计的 Unix 时间。
PerpOrderTerms
HCPerpTriggerOrder 和 HCPerpOrderBatch 都内嵌此结构体。限价子订单签署其 TIF 字节,并设置 triggerPx = 0、isMarket = false、tpsl = 0。触发子订单签署 encodedTif = 0、正数 triggerPx,以及 tpsl 为 1(止盈)或 2(止损)。
struct PerpOrderTerms {
uint32 asset;
bool isBuy;
uint64 limitPx;
uint64 sz;
bool reduceOnly;
uint8 encodedTif;
uint64 triggerPx;
bool isMarket;
uint8 tpsl;
uint128 cloid;
}
HCPerpTriggerOrder
一笔止损或止盈订单,提交至 POST /v1/tee-perp/orders/submit-trigger。请求中的 action.orderType 必须为触发类型。
struct HCPerpTriggerOrder {
address account;
uint64 nonce;
PerpOrderTerms order;
}
HCPerpTriggerOrder(address account,uint64 nonce,PerpOrderTerms action)PerpOrderTerms(uint32 asset,bool isBuy,uint64 limitPx,uint64 sz,bool reduceOnly,uint8 encodedTif,uint64 triggerPx,bool isMarket,uint8 tpsl,uint128 cloid)
Typehash:0x2d3104ab255275839aad254429e4be789f64a8d16b8e3e7d5f30a0db3c887b5c
测试向量(account 0x1111111111111111111111111111111111111111,nonce 1760000000000,链 999):
| 步骤 | 值 |
|---|---|
| Typehash | 0x2d3104ab255275839aad254429e4be789f64a8d16b8e3e7d5f30a0db3c887b5c |
| 操作结构体哈希 | 0x285b3186be219b92d7159419288c0dce9bc4ad7bfc9536e009ebf24bd67f434c |
| 指令结构体哈希 | 0xaa03e40b34b15e7e932ae827921930e7538387b596ef1040dbcc791e69021299 |
| 待签名摘要 | 0xc46aadc390b66c235af15e199e188ab23fb7f7f1b9237f6c2849c264c28d94da |
该测试向量是一笔只减仓的市价止损卖单:asset: 0、isBuy: false、limitPx: 4800000000000(最差成交价)、sz: 100000、reduceOnly: true、encodedTif: 0、triggerPx: 4900000000000、isMarket: true、tpsl: 2、cloid: 1760000000001。
HCPerpOrderBatch
同一分组下最多 100 笔订单,提交至 POST /v1/tee-perp/orders/submit-batch。每笔订单必须使用不同的 cloid。grouping 为 0(不分组)、1(normalTpsl)或 2(positionTpsl)。一个批次在速率限制中计为一次下单。
struct HCPerpOrderBatch {
address account;
uint64 nonce;
uint8 grouping;
PerpOrderTerms[] orders;
}
HCPerpOrderBatch(address account,uint64 nonce,uint8 grouping,PerpOrderTerms[] orders)PerpOrderTerms(uint32 asset,bool isBuy,uint64 limitPx,uint64 sz,bool reduceOnly,uint8 encodedTif,uint64 triggerPx,bool isMarket,uint8 tpsl,uint128 cloid)
Typehash:0x9d4f467a44f4b0d39f234f3b91888546ce31dcbb67ce791550901b9042c38f8b。orders 数组按提交顺序,编码为拼接后的各 PerpOrderTerms 结构体哈希的 keccak256。
测试向量(account 0x1111111111111111111111111111111111111111,nonce 1760000000000,链 999):
| 步骤 | 值 |
|---|---|
| Typehash | 0x9d4f467a44f4b0d39f234f3b91888546ce31dcbb67ce791550901b9042c38f8b |
| 订单数组哈希 | 0x13fc75fcc69bf3b4ef7cdc3a0872c3cc1cf59440c74d366055109b6bd5ea7c98 |
| 指令结构体哈希 | 0x69d0b1131e386769823fe1ab3facbe8e6fc013f86a117cf95cb52b8ce2f274e0 |
| 待签名摘要 | 0x4b5cd34b1f254fdd9881b7674a3412807e16cade1f2ccc7a1e261482682fbd07 |
该测试向量为 grouping: 1,包含两笔订单:一笔 GTC 限价买单(limitPx: 5000000000000、sz: 100000、cloid: 1760000000000),其后是触发单示例中的止损单。
HCPerpLeverageChange
为单个资产设置杠杆,提交至 POST /v1/tee-perp/leverage/submit。leverage 必须大于零。
struct PerpLeverageChange {
uint32 asset;
bool isCross;
uint32 leverage;
}
struct HCPerpLeverageChange {
address account;
uint64 nonce;
PerpLeverageChange action;
}
HCPerpLeverageChange(address account,uint64 nonce,PerpLeverageChange action)PerpLeverageChange(uint32 asset,bool isCross,uint32 leverage)
Typehash:0xe13845f0e6c16a5e1fc56b2d11fb0972faa2ec30b01e94d58c72147fa9b6a463
测试向量(account 0x1111111111111111111111111111111111111111,nonce 1760000000000,链 999):
| 步骤 | 值 |
|---|---|
| Typehash | 0xe13845f0e6c16a5e1fc56b2d11fb0972faa2ec30b01e94d58c72147fa9b6a463 |
| 操作结构体哈希 | 0x0e6e271dd56192d7fb1f37ea2eaffecfbbe2d1f79cac78dce6a6930bb8cc253e |
| 指令结构体哈希 | 0xe04b169bbb0e20042308e5aad1036ce60eda75f484a4d6093dc60f2c2231129e |
| 待签名摘要 | 0xb2a43487152a7cecc73d2b6b84d817a58dd02c559b05289a8d8e1b5c3d25e266 |
该测试向量将 asset: 0 的全仓杠杆设置为 5 倍。
HCPerpScheduleCancel
Hyperliquid 的死人开关:在 time(Unix 毫秒,至少提前七秒)撤销所有挂单。提交至 POST /v1/tee-perp/schedule-cancel/submit。要清除已计划的撤单,请在请求中省略 time 并签署 time = 0。显式发送 0 会被拒绝。
struct PerpScheduleCancel {
uint64 time;
}
struct HCPerpScheduleCancel {
address account;
uint64 nonce;
PerpScheduleCancel action;
}
HCPerpScheduleCancel(address account,uint64 nonce,PerpScheduleCancel action)PerpScheduleCancel(uint64 time)
Typehash:0xf21b6881e346bbf4b8d82e8ea507cf487e58dfc08776ad662591be7d6065bdfb
测试向量(account 0x1111111111111111111111111111111111111111,nonce 1760000000000,链 999):
| 步骤 | 值 |
|---|---|
| Typehash | 0xf21b6881e346bbf4b8d82e8ea507cf487e58dfc08776ad662591be7d6065bdfb |
| 操作结构体哈希 | 0x0a3ebfe48ef28a79beeee4d56e524f8a5280c38562efb697e7b1d63b3d475afc |
| 指令结构体哈希 | 0xae64a13943a6a35b33aeb3095763b855c58c2119daf71e1e3228d8acf2645e8b |
| 待签名摘要 | 0xa01806f47299010b5963a516562be3c3b44fed4f4a9e2e56c4bb601630146cdc |
该测试向量将撤单计划在 time: 1760000060000。
Manager 签名的预备撤单
POST /v1/tee-perp/cancels/submit-prepared 是由 manager 签名的撤单路径。它不使用类型化数据结构体。manager 对一笔预备好的原生 Hyperliquid 撤单的摘要进行签名,该撤单以 preparedRequest(base64)形式提供,并附带规范 low-s 形式的 managerSignature,以及一个用于认证 manager 钱包的带时间戳的 authenticationSignature。请求 schema 请参阅 API 参考。
Manager 指令(HypercallManagerSign)
由 Account manager 签署。使用链 ID 999,name 为 HypercallManagerSign。Account 要求 signer == manager。通过 POST /v1/actions/{action} 提交。
HCUpdateApiWallet
添加、替换或移除(addr = 0x0)Account 上以 name 存储的 API 钱包。
struct UpdateApiWallet {
bytes32 name; // Wallet label, ASCII left-aligned and zero padded
address addr; // API wallet address, zero to remove
}
struct HCUpdateApiWallet {
address account;
uint64 nonce;
UpdateApiWallet action;
}
HCUpdateApiWallet(address account,uint64 nonce,UpdateApiWallet action)UpdateApiWallet(bytes32 name,address addr)
Typehash:0x8ebe7d19374200e5dc3ae838db74b370da95bd2b3a8aec9de85d2398dd4a9257。操作:version 0,id 2。提交:POST /v1/actions/hc_update_api_wallet,action 为 { "name": "0x...", "addr": "0x..." }。
const domain = {
name: "HypercallManagerSign",
version: "1",
chainId: 999,
verifyingContract: ethers.ZeroAddress
};
const types = {
UpdateApiWallet: [
{ name: "name", type: "bytes32" },
{ name: "addr", type: "address" }
],
HCUpdateApiWallet: [
{ name: "account", type: "address" },
{ name: "nonce", type: "uint64" },
{ name: "action", type: "UpdateApiWallet" }
]
};
const message = {
account: accountAddress,
nonce: selectedNonce,
action: {
name: ethers.encodeBytes32String("trading-bot"),
addr: apiWalletAddress
}
};
const signature = await managerSigner.signTypedData(domain, types, message);
测试向量(account 0x1111111111111111111111111111111111111111,nonce 1760000000000,链 999):
| 步骤 | 值 |
|---|---|
| Typehash | 0x8ebe7d19374200e5dc3ae838db74b370da95bd2b3a8aec9de85d2398dd4a9257 |
| 操作结构体哈希 | 0x8b6c4a9db102e9d27c9a4069b39ba35e04948129359f0c15cd5103dd101ffce7 |
| 指令结构体哈希 | 0x830e291835ad182f290bc3d2bff09eaf9fd33acfbe44c6ad583218cd1a8232e5 |
| 待签名摘要 | 0x06589077544af449314db1fa8c7aac2d277cce9e833a04992d88161ede24cbe8 |
该测试向量使用 name trading-bot(0x74726164696e672d626f74 右侧补零)和 addr 0x2222222222222222222222222222222222222222。完整的 API 钱包流程请参阅入门。Account 会发出 ApiWalletUpdated(name, addr) 事件。
HLAddApiWallet
在 HyperCore 上为 Account 批准一个 Hyperliquid API 钱包。
struct AddApiWallet {
address apiWalletAddress;
string apiWalletName; // An empty name replaces the main API wallet
}
struct HLAddApiWallet {
address account;
uint64 nonce;
AddApiWallet action;
}
HLAddApiWallet(address account,uint64 nonce,AddApiWallet action)AddApiWallet(address apiWalletAddress,string apiWalletName)
Typehash:0x71c0e0dfbddc3456015249946354324befde42b6851d1c9b26c6a29f2e0b1ac2。操作:version 1,id 9。提交:POST /v1/actions/hl_add_api_wallet。
apiWalletName 是 string 类型,因此其结构体字段值为 keccak256(bytes(apiWalletName))。Ethers 和 viem 会自动处理这一点。
测试向量(account 0x1111111111111111111111111111111111111111,nonce 1760000000000,链 999):
| 步骤 | 值 |
|---|---|
| Typehash | 0x71c0e0dfbddc3456015249946354324befde42b6851d1c9b26c6a29f2e0b1ac2 |
| 操作结构体哈希 | 0xed32a441b0ee59c0252f5dff3411766289c9c35c19e3152b0b2b204176c2c7cd |
| 指令结构体哈希 | 0xb990a3dfb4e8d96243539f8758b3a55249b217542bb4112f4f88ed67ec516ed9 |
| 待签名摘要 | 0x584886d020316085de0e0dec16331b8e990558be3e8fd004c47200abbebed518 |
该测试向量使用 apiWalletAddress 0x2222222222222222222222222222222222222222 和 apiWalletName hl-bot。
HLSendAsset
从 HyperCore 上的 Account 向目标地址发送资产。
struct SendAsset {
address destination; // Recipient
address subAccount; // Recipient sub-account, zero for main
uint32 srcDex; // Source dex: 0 = perps, 4294967295 = spot
uint32 dstDex; // Destination dex: 0 = perps, 4294967295 = spot
uint64 token; // HyperCore token index (0 = USDC)
uint64 amountWei; // Amount in HyperCore wei (USDC: 1e8 per dollar)
}
struct HLSendAsset {
address account;
uint64 nonce;
SendAsset action;
}
HLSendAsset(address account,uint64 nonce,SendAsset action)SendAsset(address destination,address subAccount,uint32 srcDex,uint32 dstDex,uint64 token,uint64 amountWei)
Typehash:0x7feffdf7e7b191d5d27c2a209ca71c789289da73de203e99546abf9632860595。操作:version 1,id 13。提交:POST /v1/actions/hl_send_asset。
const types = {
SendAsset: [
{ name: "destination", type: "address" },
{ name: "subAccount", type: "address" },
{ name: "srcDex", type: "uint32" },
{ name: "dstDex", type: "uint32" },
{ name: "token", type: "uint64" },
{ name: "amountWei", type: "uint64" }
],
HLSendAsset: [
{ name: "account", type: "address" },
{ name: "nonce", type: "uint64" },
{ name: "action", type: "SendAsset" }
]
};
const message = {
account: accountAddress,
nonce: selectedNonce,
action: {
destination: recipientAddress,
subAccount: ethers.ZeroAddress,
srcDex: 0,
dstDex: 0xFFFFFFFF, // spot
token: 0, // USDC
amountWei: 500000000n // 5 USDC
}
};
const signature = await managerSigner.signTypedData(domain, types, message);
测试向量(account 0x1111111111111111111111111111111111111111,nonce 1760000000000,链 999):
| 步骤 | 值 |
|---|---|
| Typehash | 0x7feffdf7e7b191d5d27c2a209ca71c789289da73de203e99546abf9632860595 |
| 操作结构体哈希 | 0x9b8c0290da19ea1069e14833023c4621a4f043354b36b4f17d4803b1fce6e656 |
| 指令结构体哈希 | 0xa0cb8a72188a61289fc2685c29a424605e0a2ee7b7af3e8cfee10e1c75153e08 |
| 待签名摘要 | 0x7c7037f27c659a1885f744778480e6847c5d08e98fb22517265ba708b6597d10 |
该测试向量从永续合约(srcDex: 0)向现货(dstDex: 4294967295)发送 5 USDC(amountWei: 500000000),destination 为生产环境 Exchange 0xE6b7FaA216cabb2b38B392f577C9c826378b2240。
HLSetAbstraction
设置 Account 的 HyperCore 账户模式。Account 仅接受 user 等于其自身且 abstraction = 2(统一账户),其他任何值都会 revert。组合保证金模式要求进行此设置。
struct SetAbstraction {
address user; // Must equal the Account
uint8 abstraction; // Must be 2 (unified account)
}
struct HLSetAbstraction {
address account;
uint64 nonce;
SetAbstraction action;
}
HLSetAbstraction(address account,uint64 nonce,SetAbstraction action)SetAbstraction(address user,uint8 abstraction)
Typehash:0xcf5fddf081e5f2a9a45aa87cb1a3c42e5aa20164566b1ad2369b6b1318eac786。操作:version 1,id 16。提交:POST /v1/actions/hl_set_abstraction。
测试向量(account 0x1111111111111111111111111111111111111111,nonce 1760000000000,链 999):
| 步骤 | 值 |
|---|---|
| Typehash | 0xcf5fddf081e5f2a9a45aa87cb1a3c42e5aa20164566b1ad2369b6b1318eac786 |
| 操作结构体哈希 | 0xef6c70a3c14b9e77c710c6b3b3ee681ca270ef884bd8a64fa4064a96f3dda84e |
| 指令结构体哈希 | 0xdda9d0fe82b63c728c4ac42585d5998a04cabaed0f957a2cafdf31a754829c3d |
| 待签名摘要 | 0xf49d7d8d74596e503d6a1bdfb26653533a12a5ba3816acd992d0bd4ef378f59d |
该测试向量将 user 设为该 Account,abstraction 设为 2。
HCTransferOption(保留)
合约中定义了 HCTransferOption(address account,uint64 nonce,TransferOption action)TransferOption(address recipient,address option,uint256 amountWei)(typehash 0xa218e1158788b23987f954edc7a07659a03a03fe5ba981a5bbe44d7a146e0819,操作 version 0,id 1),但未为其分配任何签名者类型。Account 会以 Account__UserDirectiveNotSupported revert,API 也会拒绝 hc_transfer_option。请勿签署此消息。请改用 depositOption 和提现来转移期权代币。
无需签名的 Manager 交易
部分 manager 操作是直接调用 Account,而非 EIP-712 消息:Account.approveZeroFeeBuilder(builder) 以 0% 最高费率批准一个 Hyperliquid builder,在首笔永续合约订单之前需要执行一次(请参阅入门)。Account.transferTo(recipient, token, amount) 在 HyperEVM 上将代币转出 Account。两者都要求 msg.sender == manager,且在 Account 处于强制平仓期间会 revert。
RSM 指令(HypercallRsmSign)
由 RSM 签名者签署,并由 sequencer 提交。它们用于充值入账、处理提现、开始和停止强制平仓,以及下达只减仓 IOC 恢复订单。做市商和用户不会签署或提交这些指令;此处列出它们,是为了让您能够核实协议可能对 Account 执行的操作。使用链 ID 999,name 为 HypercallRsmSign。Exchange 会检查 signer == rsmSigner(目前主网上为 0x502E7fAbF34E84EeB115C34FE947b79A94dF886E),且调用者必须持有 SEQUENCER_ROLE。
RSM 订单与资金归集(由 Account 执行)
这些消息在 RSM 域下复用 HL 结构体,因此其 typehash 与 API 及 manager 指令相同,只有域分隔符不同。Account 会施加额外约束,并且即使在强制平仓期间也会执行它们。
| 消息 | Typehash | Account 施加的约束 |
|---|---|---|
HLOrder | 0xe6facb816c5f9c321054ef43c7d8fb1ec750f65d630ec39c5c18119a6f4707dd | encodedTif 必须为 IOC(3),且订单必须为 reduceOnly,或者是卖出为 USDC 的现货卖单(现货资产 ID 10000 至 99999),其限价不得低于 HyperCore 现货价格 5% 以上 |
HLCancel | 0x23c5529f34a875b6c0d11a6dfafdd945996dbdc5fbd1bdace2c2e0cf6a253a85 | 无 |
HLCancelByCloid | 0x10cbcfa56297fc737e4defee7b7937a52978ebbe5920e584317f7f25416836f5 | 无 |
HLSendAsset | 0x7feffdf7e7b191d5d27c2a209ca71c789289da73de203e99546abf9632860595 | destination 必须为 Exchange |
RSM HLOrder 测试向量(account 0x1111111111111111111111111111111111111111,nonce 1760000000000,链 999):
| 步骤 | 值 |
|---|---|
| Typehash | 0xe6facb816c5f9c321054ef43c7d8fb1ec750f65d630ec39c5c18119a6f4707dd |
| 操作结构体哈希 | 0x39b4e0699f382aaad23f04740034e7c5581ba918139d2db63fbf586cc447e7db |
| 指令结构体哈希 | 0xe6dde5ad6d310b5ebb83c09ec28ee5568700473b885bb483b7437dca202af4f3 |
| 待签名摘要 | 0x57afa1e810804e768c05a467aa88ede15fdceedae5aaa840adff61a613aca469 |
该 RSM HLOrder 向量是一笔只减仓 IOC 卖单(isBuy: false、limitPx: 4800000000000、sz: 100000、reduceOnly: true、encodedTif: 3,cloid 等于 nonce)。Exchange.executeRsmDirective 验证签名后将该操作转发给 Account。
系统操作(由 Exchange 执行)
Version 255。每个外层包装为 System<Action>(address account,uint64 nonce,<Action> action)<Action>(...)。
| 外层包装 | 内部类型 | Typehash |
|---|---|---|
SystemCreditToken | CreditToken(uint32 srcDex,uint32 dstDex,uint64 token,uint64 amountWei) | 0xe845f2049264182802994dae939dc8ac42d3ae543a7eeb530dd021428743f052 |
SystemCreditOption | CreditOption(bytes32 underlying,uint256 expiry,uint256 strike,bool isCall,uint256 amountWei) | 0x65aedd5af06882e1e62d752b43b72ec62a85cacf2ca59e8ec2affc57eed9d8ae |
SystemStartLiquidation | StartLiquidation(int256 equity,uint256 marginNeeded) | 0x92b6a135a656e489c24fb5511684842b0ab3895c22b51e4910dee90a7d23511e |
SystemStopLiquidation | StopLiquidation(uint256 startTime) | 0xe1af98778e9cfd1d1a679bb0b64b6dc8aa3fb152ff6469d0a81a1c7eb87a4bd3 |
SystemWithdrawToken | WithdrawToken(address destination,address subAccount,uint32 srcDex,uint32 dstDex,uint64 token,uint64 amountWei) | 0x634b866e9a922bb846e297973c7a456e641b88f4e97493da9b222084d799c883 |
完整外层类型字符串:
SystemCreditToken(address account,uint64 nonce,CreditToken action)CreditToken(uint32 srcDex,uint32 dstDex,uint64 token,uint64 amountWei)
SystemCreditOption(address account,uint64 nonce,CreditOption action)CreditOption(bytes32 underlying,uint256 expiry,uint256 strike,bool isCall,uint256 amountWei)
SystemStartLiquidation(address account,uint64 nonce,StartLiquidation action)StartLiquidation(int256 equity,uint256 marginNeeded)
SystemStopLiquidation(address account,uint64 nonce,StopLiquidation action)StopLiquidation(uint256 startTime)
SystemWithdrawToken(address account,uint64 nonce,WithdrawToken action)WithdrawToken(address destination,address subAccount,uint32 srcDex,uint32 dstDex,uint64 token,uint64 amountWei)
- SystemCreditToken 将现货或永续合约代币从 HyperCore 入账到 Account。
amountWei必须非零,且 Account 必须已在 HyperCore 上激活。 - SystemCreditOption 向 Account 铸造期权代币,必要时部署该期权对。
underlying是一个 OpenZeppelinShortString字:ASCII 左对齐,最后一个字节为字节长度(BTC为0x42544300...03)。非规范编码会 revert。 - SystemStartLiquidation 记录拍卖参数并锁定 Account。
marginNeeded必须非零。 - SystemStopLiquidation 要求
startTime等于已记录的开始时间,并将 Account 交还给其 manager。 - SystemWithdrawToken 从 Exchange 自身余额中排队在 HyperCore 上交付标准 USDC。它要求
subAccount = 0、srcDex = 0、dstDex为0或4294967295、token = 0(USDC),且amountWei为 EVM 单位的整数倍。仅凭 HyperEVM 收据并不能证明已在 HyperCore 上完成交付。
SystemCreditToken 测试向量(account 0x1111111111111111111111111111111111111111,nonce 1760000000000,链 999):
| 步骤 | 值 |
|---|---|
| Typehash | 0xe845f2049264182802994dae939dc8ac42d3ae543a7eeb530dd021428743f052 |
| 操作结构体哈希 | 0xc69d7c6e5c36c9789d990c6316eaff3be43980583806f41f8a8e6461b7114011 |
| 指令结构体哈希 | 0x7ffa37cef7e08d3a2dd5501a8648899d37bc09ebb25d148c124e12c5047476e1 |
| 待签名摘要 | 0x95f75e5ddb4837de3f578b8aa0d714d4b02672b18c4929e3d2dda4a266de8254 |
该向量入账 5 USDC(srcDex 和 dstDex 均为 4294967295,token: 0,amountWei: 500000000)。
SystemCreditOption 测试向量(account 0x1111111111111111111111111111111111111111,nonce 1760000000000,链 999):
| 步骤 | 值 |
|---|---|
| Typehash | 0x65aedd5af06882e1e62d752b43b72ec62a85cacf2ca59e8ec2affc57eed9d8ae |
| 操作结构体哈希 | 0x4a8b563fc94d26c1da376145d5aa5d05f996232fcf9739ed0a662650e91861b6 |
| 指令结构体哈希 | 0x190b638f1a462469bf0d070248acfc86bbbb95ea8a9d3d97d33581c7d6bb5554 |
| 待签名摘要 | 0x86fb7c53bb7e139a4d5df7db2feae40e634efe09ea7509165d3cece75d75fce2 |
该向量入账一份 BTC 看涨期权(underlying: 0x42544300...03、expiry: 1761811200、strike: 80000、isCall: true、amountWei: 1000000000000000000)。
SystemStartLiquidation 测试向量(account 0x1111111111111111111111111111111111111111,nonce 1760000000000,链 999):
| 步骤 | 值 |
|---|---|
| Typehash | 0x92b6a135a656e489c24fb5511684842b0ab3895c22b51e4910dee90a7d23511e |
| 操作结构体哈希 | 0x4cd6a7f0997eba84ef82eabd429a0d9ca80e55bd6d89d2e67eda9970d87ec803 |
| 指令结构体哈希 | 0x84f18dc2577978d7890c9eb269fd787d99de37039b3a08e24745398feffbd0c5 |
| 待签名摘要 | 0xcc72c0e7829938c9ca0a4515d759f94cc96d2f24cd51a134a430f215ed5f5d4b |
该向量使用 equity: -1500000000 和 marginNeeded: 20000000000(均为六位小数的 USDC)。
SystemStopLiquidation 测试向量(account 0x1111111111111111111111111111111111111111,nonce 1760000000000,链 999):
| 步骤 | 值 |
|---|---|
| Typehash | 0xe1af98778e9cfd1d1a679bb0b64b6dc8aa3fb152ff6469d0a81a1c7eb87a4bd3 |
| 操作结构体哈希 | 0x1d900a795b328bd5fa734bd6d7f74634b98ca66eb5e45322fb1ba6400564b62b |
| 指令结构体哈希 | 0x977b9becdd26830f2cdf70ab40f72f24490fe6ed45822d1fc8c84120e9a46f40 |
| 待签名摘要 | 0xbe65f82782b14dba42e334e32dd7dcc6bf14c96824523723a186a7381f8f12af |
该向量使用 startTime: 1760000000。
SystemWithdrawToken 测试向量(account 0x1111111111111111111111111111111111111111,nonce 1760000000000,链 999):
| 步骤 | 值 |
|---|---|
| Typehash | 0x634b866e9a922bb846e297973c7a456e641b88f4e97493da9b222084d799c883 |
| 操作结构体哈希 | 0x10bd8d4372a09e613a6b4fb7018fcccde857ebf6cc3327d6c9a3c0f81515a076 |
| 指令结构体哈希 | 0x86680427965513c65a7a170730b9f4fb2e2b40e22cd18338cb004b6a7872ada2 |
| 待签名摘要 | 0x65cc392038decb9ccdc23b0a4a1cfbe657d3417f8cd9ebf2319b3172fb7d885c |
该向量向 destination 0x1111111111111111111111111111111111111111 提现 5 USDC(amountWei: 500000000),参数为 srcDex: 0、dstDex: 0、token: 0。
Nonce
每个签名者拥有独立的 nonce 空间,在三个位置进行跟踪。
- Account 合约:每个签名者一个位图。
Account.isNonceUsed(signer, nonce)返回某个 nonce 是否已被消耗。用户指令重复使用 nonce 时会以Account__NonceAlreadyUsedrevert。不存在nextNonce;允许出现间隔,链上也不要求顺序。 - Exchange 合约:RSM 签名者的位图,通过
Exchange.isNonceUsed(signer, nonce)读取。 - 引擎:为每个签名者保留最高的 100 个 nonce。新 nonce 不得已在该集合中;集合已满时,必须大于其中最小的 nonce;并且必须严格位于服务器毫秒时间之前两天至之后一天的范围内。
请使用当前以毫秒计的 Unix 时间作为 nonce 种子,并按签名者递增。同一钱包在同一毫秒内签署的两个请求需要不同的 nonce,因此请维护一个计数器。对于 TEE 永续合约路由,nonce 同时也是请求的时间锚点,因此请使用真实的毫秒时间戳,而不是较小的整数。
function isNonceUsed(address signer, uint256 nonce) external view returns (bool);
签名验证流程
- 链下:签名者构建 EIP-712 摘要(
0x1901 || domainSeparator || structHash)并对其签名。 - API:Hypercall 恢复签名者,检查其是活跃 API 钱包还是 manager,对订单执行引擎保证金检查,然后将指令排入队列。响应会如实报告当前阶段、拒绝详情和交易哈希。
- Sequencer:提交
Exchange.executeUserDirective(directive, signature)。Exchange 检查 Account 是否存在,并转发至Account.executeUserDirective。 - Account:根据自身地址、nonce 和操作重建摘要,使用该操作对应的 API 或 manager 分隔符恢复签名者,检查授权,消耗 nonce,然后执行。HL 操作发往 HyperCore CoreWriter。HC 操作更新 API 钱包注册表。
- 客户端:轮询
GET /v1/directives/{directive_id}获取最终状态。
TEE 永续合约路由在 API 步骤之后即结束:在 Hyperliquid 上执行订单的是飞地,而不是 Account。
Example (HLOrder):
1. API wallet signs HLOrder with the managed account, a unique nonce, and one LimitOrder action
2. Client posts account, nonce, action, and signature to /v1/tee-perp/orders/submit
3. Hypercall recovers the API wallet and applies portfolio-margin admission
4. The enclave signs and sends the native Hyperliquid order with the Hypercall builder code
5. Client reads the stage from the response and polls for subsequent status
已弃用和已移除的内容
以下内容曾出现在本页的早期版本中,现已不再属于已部署系统。在此列出,以便基于它们构建的集成进行迁移。
- Processor 与 ActionCaster 编码。
Processor合约和 ActionCaster 消息编码已在 Exchange0.2.0(2026 年 2 月)中移除。Account 指令现在通过Exchange.executeUserDirective和 CoreWriter 执行。已部署的 Exchange0.6.1不包含任何旧入口。 - 带有独立结构体的 Exchange 入口。
hlRequestOrder、hlRequestCancel、hlRequestCancelByCloid、hlActionSendAsset、hcActionWithdrawToken、hcActionWithdrawOption、rsmCommandRebalance和rsmCommandRepay均已移除。替代方案如下:
| 已移除的消息 | 替代方案 |
|---|---|
HLRequestCancel(一批 HLCancel{asset,oid} 加 nonce) | HLCancel,每条指令一个 CancelOrderByOid |
HLRequestCancelByCloid | HLCancelByCloid,每条指令一个 CancelOrderByCloid |
HLActionSendAsset(account、nonce、destination、srcDex、dstDex、token、amountWei) | 使用 SendAsset 的 HLSendAsset,新增了 subAccount |
HCActionWithdrawToken | RSM 签名的 SystemWithdrawToken,在引擎批准提现后由 sequencer 执行 |
HCActionWithdrawOption | 期权入账使用 RSM SystemCreditOption;充值使用 depositOption |
RsmCommandRebalance | RSM 签名的 HLOrder(只减仓 IOC) |
RsmCommandRepay | RSM 签名、发往 Exchange 的 HLSendAsset |
- 旧版订单函数。
placeCoreOrders、cancelCoreOrders和cancelCoreOrdersByCloid使用 MsgPack 编码和CoreSignatures域("Exchange",链 ID1337)。它们已被移除。 nextNonce。 链上的nextNonce[signer]计数器已不存在。仅保留已用 nonce 位图(isNonceUsed)。- 标记为 TBD 的主网分隔符。 早期文本将 manager 和 RSM 的主网分隔符列为 TBD。现在三者均已确定,并列于上文。
HCTransferOption。 已定义但从未启用,参见上文。
安全注意事项
- 密钥:将 manager 密钥保存在硬件钱包中。API 钱包仅签署订单和撤单;不同系统请使用不同的密钥。
- Nonce 重放:切勿重复使用 nonce。请在链下跟踪 nonce 并以原子方式递增。
- 域:主网始终使用链 ID
999签名(测试网为998),并将您计算出的分隔符与上表进行核对。 - 核实您签署的内容:在使用硬件钱包签名之前,调用
POST /v1/actions/{action}/typed-data并与您自己的编码器结果进行比对。 - 链上验证为最终结果:API 会预先检查签名,但 Account 会在链上重新验证每一条指令。请勿将 API 确认视为已执行。
- Manager 与 API 钱包:manager 控制所有权、API 钱包和资产转移。API 钱包仅签署交易类消息。请使用不同的密钥。