本页为简体中文译文。如有歧义,请以英文原文为准。 阅读英文版 →
跳转到主要内容

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 摘要中恢复签名者并检查授权:

  1. API 钱包:通过 hc_update_api_wallet 在 Account 上注册的地址(Account.isApiWalletActive)。用于签署订单和撤单。
  2. Manager:Account 的所有者(Account.manager)。用于签署 API 钱包变更、资产转出以及账户模式变更。
  3. RSM 签名者:由协议控制(Exchange.rsmSigner)。用于签署入账、提现、强制平仓指令以及只减仓恢复订单。用户永远不会签署这些消息。

指令编码​

在链上,一条指令为 abi.encodePacked(account, nonce, version, id, data):

字节字段含义
20accountAccount 地址(address)
8nonce签名者的 nonce(uint64)
1version操作族
3id该操作族内的操作 ID
剩余data内部操作结构体的 abi.encode
Version操作族操作 ID
0HyperCall(HC)2 更新 API 钱包。1(转移期权)为保留值,会被拒绝。
1HyperLiquid(HL)1 限价单、9 添加 API 钱包、10 按 oid 撤单、11 按 cloid 撤单、13 发送资产、16 设置抽象模式
255System1 代币入账、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 根据其所运行的链选择分隔符,因此测试网签名永远无法在主网上通过验证。

域nameversion签名者链分隔符
API 钱包HypercallApiSign1API 钱包9990x462ae8a3a67da57ddd088e60be368536f992b8bf369d13e64e620c51993e5ebb
API 钱包HypercallApiSign1API 钱包9980x339bee4c00da9a5361f687797205c8d03f323659f5d9dc9e0505b9437ddee25e
ManagerHypercallManagerSign1Manager9990xc9b5b0b8b0d9d7ba716326acbf795cfe431ef960a25a8f958d6569bea2f1516e
ManagerHypercallManagerSign1Manager9980xd1f76b6138be892c14b71b0569bdb049cb44f239d34c78ef1ffaacd2466f9f18
RSMHypercallRsmSign1RSM 签名者9990x3d0cae2af623c614099dbadd67a1e1457fabde576aa270a70a57e39bf338a7be
RSMHypercallRsmSign1RSM 签名者9980x650b282053fb61d3fd477bdc28f6434311fe905e27cc4ca643e87e802c45938c

在签署任何内容之前,请自行计算分隔符并进行比对:

import { ethers } from "ethers";

const separator = ethers.TypedDataEncoder.hashDomain({
name: "HypercallApiSign",
version: "1",
chainId: 999,
verifyingContract: ethers.ZeroAddress
});
// 0x462ae8a3a67da57ddd088e60be368536f992b8bf369d13e64e620c51993e5ebb

消息参考​

签名者与端点对照表​

消息域签名者提交至执行内容
HLOrderAPIAPI 钱包POST /v1/tee-perp/orders/submit 或 POST /v1/actions/hl_limit_orderHyperliquid 限价单
HLCancelAPIAPI 钱包POST /v1/tee-perp/cancels/submit-by-oid 或 POST /v1/actions/hl_cancel_by_oid按 oid 撤单
HLCancelByCloidAPIAPI 钱包POST /v1/tee-perp/cancels/submit 或 POST /v1/actions/hl_cancel_by_cloid按 cloid 撤单
HCPerpTriggerOrderAPIAPI 钱包POST /v1/tee-perp/orders/submit-trigger原生触发单(仅 TEE)
HCPerpOrderBatchAPIAPI 钱包POST /v1/tee-perp/orders/submit-batch原生批量订单(仅 TEE)
HCPerpLeverageChangeAPIAPI 钱包POST /v1/tee-perp/leverage/submit杠杆调整(仅 TEE)
HCPerpScheduleCancelAPIAPI 钱包POST /v1/tee-perp/schedule-cancel/submit死人开关(仅 TEE)
HCUpdateApiWalletManagerManagerPOST /v1/actions/hc_update_api_walletAccount API 钱包注册表
HLAddApiWalletManagerManagerPOST /v1/actions/hl_add_api_walletHyperCore API 钱包授权
HLSendAssetManagerManagerPOST /v1/actions/hl_send_asset从 Account 执行 HyperCore sendAsset
HLSetAbstractionManagerManagerPOST /v1/actions/hl_set_abstractionHyperCore 账户模式(仅统一账户)
HCTransferOptionManagerManager不接受保留,链上拒绝
HLOrder、HLCancel、HLCancelByCloid、HLSendAssetRSMRSM 签名者仅 sequencer通过 Account 执行的恢复订单与资金归集
System*RSMRSM 签名者仅 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):

步骤值
Typehash0xe6facb816c5f9c321054ef43c7d8fb1ec750f65d630ec39c5c18119a6f4707dd
操作结构体哈希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):

步骤值
Typehash0x23c5529f34a875b6c0d11a6dfafdd945996dbdc5fbd1bdace2c2e0cf6a253a85
操作结构体哈希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):

步骤值
Typehash0x10cbcfa56297fc737e4defee7b7937a52978ebbe5920e584317f7f25416836f5
操作结构体哈希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):

步骤值
Typehash0x2d3104ab255275839aad254429e4be789f64a8d16b8e3e7d5f30a0db3c887b5c
操作结构体哈希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):

步骤值
Typehash0x9d4f467a44f4b0d39f234f3b91888546ce31dcbb67ce791550901b9042c38f8b
订单数组哈希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):

步骤值
Typehash0xe13845f0e6c16a5e1fc56b2d11fb0972faa2ec30b01e94d58c72147fa9b6a463
操作结构体哈希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):

步骤值
Typehash0xf21b6881e346bbf4b8d82e8ea507cf487e58dfc08776ad662591be7d6065bdfb
操作结构体哈希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):

步骤值
Typehash0x8ebe7d19374200e5dc3ae838db74b370da95bd2b3a8aec9de85d2398dd4a9257
操作结构体哈希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):

步骤值
Typehash0x71c0e0dfbddc3456015249946354324befde42b6851d1c9b26c6a29f2e0b1ac2
操作结构体哈希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):

步骤值
Typehash0x7feffdf7e7b191d5d27c2a209ca71c789289da73de203e99546abf9632860595
操作结构体哈希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):

步骤值
Typehash0xcf5fddf081e5f2a9a45aa87cb1a3c42e5aa20164566b1ad2369b6b1318eac786
操作结构体哈希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 会施加额外约束,并且即使在强制平仓期间也会执行它们。

消息TypehashAccount 施加的约束
HLOrder0xe6facb816c5f9c321054ef43c7d8fb1ec750f65d630ec39c5c18119a6f4707ddencodedTif 必须为 IOC(3),且订单必须为 reduceOnly,或者是卖出为 USDC 的现货卖单(现货资产 ID 10000 至 99999),其限价不得低于 HyperCore 现货价格 5% 以上
HLCancel0x23c5529f34a875b6c0d11a6dfafdd945996dbdc5fbd1bdace2c2e0cf6a253a85无
HLCancelByCloid0x10cbcfa56297fc737e4defee7b7937a52978ebbe5920e584317f7f25416836f5无
HLSendAsset0x7feffdf7e7b191d5d27c2a209ca71c789289da73de203e99546abf9632860595destination 必须为 Exchange

RSM HLOrder 测试向量(account 0x1111111111111111111111111111111111111111,nonce 1760000000000,链 999):

步骤值
Typehash0xe6facb816c5f9c321054ef43c7d8fb1ec750f65d630ec39c5c18119a6f4707dd
操作结构体哈希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
SystemCreditTokenCreditToken(uint32 srcDex,uint32 dstDex,uint64 token,uint64 amountWei)0xe845f2049264182802994dae939dc8ac42d3ae543a7eeb530dd021428743f052
SystemCreditOptionCreditOption(bytes32 underlying,uint256 expiry,uint256 strike,bool isCall,uint256 amountWei)0x65aedd5af06882e1e62d752b43b72ec62a85cacf2ca59e8ec2affc57eed9d8ae
SystemStartLiquidationStartLiquidation(int256 equity,uint256 marginNeeded)0x92b6a135a656e489c24fb5511684842b0ab3895c22b51e4910dee90a7d23511e
SystemStopLiquidationStopLiquidation(uint256 startTime)0xe1af98778e9cfd1d1a679bb0b64b6dc8aa3fb152ff6469d0a81a1c7eb87a4bd3
SystemWithdrawTokenWithdrawToken(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 是一个 OpenZeppelin ShortString 字: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):

步骤值
Typehash0xe845f2049264182802994dae939dc8ac42d3ae543a7eeb530dd021428743f052
操作结构体哈希0xc69d7c6e5c36c9789d990c6316eaff3be43980583806f41f8a8e6461b7114011
指令结构体哈希0x7ffa37cef7e08d3a2dd5501a8648899d37bc09ebb25d148c124e12c5047476e1
待签名摘要0x95f75e5ddb4837de3f578b8aa0d714d4b02672b18c4929e3d2dda4a266de8254

该向量入账 5 USDC(srcDex 和 dstDex 均为 4294967295,token: 0,amountWei: 500000000)。

SystemCreditOption 测试向量(account 0x1111111111111111111111111111111111111111,nonce 1760000000000,链 999):

步骤值
Typehash0x65aedd5af06882e1e62d752b43b72ec62a85cacf2ca59e8ec2affc57eed9d8ae
操作结构体哈希0x4a8b563fc94d26c1da376145d5aa5d05f996232fcf9739ed0a662650e91861b6
指令结构体哈希0x190b638f1a462469bf0d070248acfc86bbbb95ea8a9d3d97d33581c7d6bb5554
待签名摘要0x86fb7c53bb7e139a4d5df7db2feae40e634efe09ea7509165d3cece75d75fce2

该向量入账一份 BTC 看涨期权(underlying: 0x42544300...03、expiry: 1761811200、strike: 80000、isCall: true、amountWei: 1000000000000000000)。

SystemStartLiquidation 测试向量(account 0x1111111111111111111111111111111111111111,nonce 1760000000000,链 999):

步骤值
Typehash0x92b6a135a656e489c24fb5511684842b0ab3895c22b51e4910dee90a7d23511e
操作结构体哈希0x4cd6a7f0997eba84ef82eabd429a0d9ca80e55bd6d89d2e67eda9970d87ec803
指令结构体哈希0x84f18dc2577978d7890c9eb269fd787d99de37039b3a08e24745398feffbd0c5
待签名摘要0xcc72c0e7829938c9ca0a4515d759f94cc96d2f24cd51a134a430f215ed5f5d4b

该向量使用 equity: -1500000000 和 marginNeeded: 20000000000(均为六位小数的 USDC)。

SystemStopLiquidation 测试向量(account 0x1111111111111111111111111111111111111111,nonce 1760000000000,链 999):

步骤值
Typehash0xe1af98778e9cfd1d1a679bb0b64b6dc8aa3fb152ff6469d0a81a1c7eb87a4bd3
操作结构体哈希0x1d900a795b328bd5fa734bd6d7f74634b98ca66eb5e45322fb1ba6400564b62b
指令结构体哈希0x977b9becdd26830f2cdf70ab40f72f24490fe6ed45822d1fc8c84120e9a46f40
待签名摘要0xbe65f82782b14dba42e334e32dd7dcc6bf14c96824523723a186a7381f8f12af

该向量使用 startTime: 1760000000。

SystemWithdrawToken 测试向量(account 0x1111111111111111111111111111111111111111,nonce 1760000000000,链 999):

步骤值
Typehash0x634b866e9a922bb846e297973c7a456e641b88f4e97493da9b222084d799c883
操作结构体哈希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__NonceAlreadyUsed revert。不存在 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);

签名验证流程​

  1. 链下:签名者构建 EIP-712 摘要(0x1901 || domainSeparator || structHash)并对其签名。
  2. API:Hypercall 恢复签名者,检查其是活跃 API 钱包还是 manager,对订单执行引擎保证金检查,然后将指令排入队列。响应会如实报告当前阶段、拒绝详情和交易哈希。
  3. Sequencer:提交 Exchange.executeUserDirective(directive, signature)。Exchange 检查 Account 是否存在,并转发至 Account.executeUserDirective。
  4. Account:根据自身地址、nonce 和操作重建摘要,使用该操作对应的 API 或 manager 分隔符恢复签名者,检查授权,消耗 nonce,然后执行。HL 操作发往 HyperCore CoreWriter。HC 操作更新 API 钱包注册表。
  5. 客户端:轮询 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 消息编码已在 Exchange 0.2.0(2026 年 2 月)中移除。Account 指令现在通过 Exchange.executeUserDirective 和 CoreWriter 执行。已部署的 Exchange 0.6.1 不包含任何旧入口。
  • 带有独立结构体的 Exchange 入口。 hlRequestOrder、hlRequestCancel、hlRequestCancelByCloid、hlActionSendAsset、hcActionWithdrawToken、hcActionWithdrawOption、rsmCommandRebalance 和 rsmCommandRepay 均已移除。替代方案如下:
已移除的消息替代方案
HLRequestCancel(一批 HLCancel{asset,oid} 加 nonce)HLCancel,每条指令一个 CancelOrderByOid
HLRequestCancelByCloidHLCancelByCloid,每条指令一个 CancelOrderByCloid
HLActionSendAsset(account、nonce、destination、srcDex、dstDex、token、amountWei)使用 SendAsset 的 HLSendAsset,新增了 subAccount
HCActionWithdrawTokenRSM 签名的 SystemWithdrawToken,在引擎批准提现后由 sequencer 执行
HCActionWithdrawOption期权入账使用 RSM SystemCreditOption;充值使用 depositOption
RsmCommandRebalanceRSM 签名的 HLOrder(只减仓 IOC)
RsmCommandRepayRSM 签名、发往 Exchange 的 HLSendAsset
  • 旧版订单函数。 placeCoreOrders、cancelCoreOrders 和 cancelCoreOrdersByCloid 使用 MsgPack 编码和 CoreSignatures 域("Exchange",链 ID 1337)。它们已被移除。
  • nextNonce。 链上的 nextNonce[signer] 计数器已不存在。仅保留已用 nonce 位图(isNonceUsed)。
  • 标记为 TBD 的主网分隔符。 早期文本将 manager 和 RSM 的主网分隔符列为 TBD。现在三者均已确定,并列于上文。
  • HCTransferOption。 已定义但从未启用,参见上文。

安全注意事项​

  1. 密钥:将 manager 密钥保存在硬件钱包中。API 钱包仅签署订单和撤单;不同系统请使用不同的密钥。
  2. Nonce 重放:切勿重复使用 nonce。请在链下跟踪 nonce 并以原子方式递增。
  3. 域:主网始终使用链 ID 999 签名(测试网为 998),并将您计算出的分隔符与上表进行核对。
  4. 核实您签署的内容:在使用硬件钱包签名之前,调用 POST /v1/actions/{action}/typed-data 并与您自己的编码器结果进行比对。
  5. 链上验证为最终结果:API 会预先检查签名,但 Account 会在链上重新验证每一条指令。请勿将 API 确认视为已执行。
  6. Manager 与 API 钱包:manager 控制所有权、API 钱包和资产转移。API 钱包仅签署交易类消息。请使用不同的密钥。

参考资料​