账户开通
本页介绍链上 Account 的生命周期、资金注入以及 API 钱包管理。合约地址见 Contracts,GET /exchange-info 会返回当前 Exchange、Factory 和入金路由合约的地址。
概览
Hypercall 采用管理者(manager)加 API 钱包的模型:
- Manager:创建并拥有 Account 的 EOA(通常是您的主钱包)。
- Account:一个 BeaconProxy 合约,持有您在 HyperCore 上的余额和持仓,并执行已签名的指令。
- API 钱包:由 manager 在 Account 上授权的 EOA,用于签署下单和撤单。
Account 由 Factory 创建。已签名的指令由 Hypercall 的排序器(sequencer)提交到 Exchange:您负责签名,Hypercall 负责提交。
Account 生命周期
1. 查询已有 Account
// Exchange
function getAccounts(address manager) external view returns (ManagedAccount[] memory);
struct ManagedAccount {
address account;
address manager;
ApiWallet[] apiWallets; // { bytes32 name; address addr; }
}
2. 创建 Account
// Factory
function createAccount(uint96 salt) external payable returns (address account);
function getCreationDeposit() external view returns (uint256); // in HYPE wei
function predictAccount(address manager, uint96 salt) external view returns (address account, bool exists);
要求:
msg.value >= getCreationDeposit()。Factory 以美元设定创建押金,并按 HyperCore 现货价格换算为 HYPE,向上取整。目前主网上为 $1.50。- 如果配置了创建过滤器,则该过滤器必须允许
msg.sender。
行为:
- 使用 CREATE2,根据 manager 地址和
salt部署 Account,因此可以通过predictAccount提前获知其地址。 - 在 Exchange 中注册该 Account,并将
msg.sender设为 manager。 - 将全部
msg.value以 HYPE 形式跨链转入该 Account 在 HyperCore 上的账户。价值至少 $1 的入金会在 HyperCore 上激活该 Account。
const factory = new ethers.Contract(FACTORY_ADDRESS, FACTORY_ABI, signer);
const salt = 0n;
const [predicted] = await factory.predictAccount(managerAddress, salt);
const value = await factory.getCreationDeposit();
await (await factory.createAccount(salt, { value })).wait();
3. Manager 变更
合约不提供 manager 转让函数。只有在链上强制平仓拍卖结算时,manager 才会变更,而主网上并未配置拍卖人(auctioneer)。发生变更时,Exchange 会发出 AccountTransferred(account, oldManager, newManager),Account 会发出 ManagerSet(oldManager, newManager)。
API 钱包管理
API 钱包存储在 Account 上,以 bytes32 名称作为键。它们在 HypercallApiSign EIP-712 域中签署指令。详见 EIP-712 签名。
添加、替换或移除
提交一条由 manager 在 HypercallManagerSign 域中签名的 hc_update_api_wallet 指令:
HCUpdateApiWallet(address account,uint64 nonce,UpdateApiWallet action)UpdateApiWallet(bytes32 name,address addr)
- 使用新的
name会添加一个钱包;使用已有的name会替换该名称下的钱包。 addr = 0x0会移除name下的钱包。- API 钱包不能是 manager,也不能已经在该 Account 上处于激活状态。
将其发送到 POST /v1/actions/hc_update_api_wallet,请求中包含 account、nonce、action({ "name": "0x...", "addr": "0x..." })和 signature。POST /v1/actions/hc_update_api_wallet/typed-data 会返回需要签名的完整 typed data。轮询 GET /v1/directives/{directive_id} 以获取链上执行结果。Account 会发出 ApiWalletUpdated(name, addr)。
查询
// Account
function getApiWallets() external view returns (ApiWallet[] memory);
function getApiWallet(bytes32 name) external view returns (address);
function isApiWalletActive(address addr) external view returns (bool);
资金与入金
向 Hypercall 存入 USDC
// Exchange
function depositUsdcFor(address account, uint256 amount) external;
depositUsdcFor 是在 HyperEVM 上直接为 Hypercall 现金入金的路径。它从 msg.sender 拉取原生 HyperEVM USDC 到 Exchange,再通过 Circle 的 CoreDepositWallet 存入 Exchange 在 HyperCore 上的余额。
谁可以调用:
- 任意钱包、路由合约、solver 或 zap 合约。
- 由
msg.sender支付 USDC。 account是需要入账的 Hypercall 账户或钱包。不要根据msg.sender推断入账账户。
要求:
account != address(0)且amount > 0msg.sender已授权 Exchange 使用amount数量的 USDC
event UsdcDeposit(
address indexed account,
address indexed from,
address indexed token,
uint256 amount,
uint32 dstDex
);
只有在将该事件与观察到的 HyperCore 入金匹配之后,Hypercall 才会为账户入账现金。入账账户以 account 字段为准。
await usdc.approve(EXCHANGE_ADDRESS, amount);
await exchange.depositUsdcFor(accountAddress, amount);
Router 的 deposit(account, token, amount, isPerp) 是应用使用的通用辅助函数,适用于 USDC、现货代币和期权代币。
期权代币入金
// Exchange
function depositOption(address account, address token, uint256 amount) external;
account必须是已注册的 Hypercall Account。token必须是 Option Registry 中支持的期权。- 从
msg.sender销毁amount(需先授权 Exchange),并发出Deposit(account, msg.sender, token, amount),由引擎据此入账。
从 Account 转出
// Account, manager only
function transferTo(address recipient, address token, uint256 amount) external;
将 Account 在 HyperEVM 上持有的原生 HYPE(token = 0x0)或 ERC20 转给 recipient。可用于完成从 HyperCore 到 HyperEVM 的转账,或清空 Account 余额。Account 处于强制平仓期间不可用。
永续合约的 Builder 授权
// Account, manager only
function approveZeroFeeBuilder(address builder) external;
以 0% 的最高费率为该 Account 授权一个 Hyperliquid builder。每笔 Hypercall 永续合约订单都带有 Hypercall 的 builder code,因此在下第一笔永续合约订单之前,请使用 GET /exchange-info 返回的 hl_builder_address 调用一次该函数。应用会在 Enable trading 步骤中完成这一操作。
事件
// Exchange
event AccountTransferred(address indexed account, address indexed oldManager, address indexed newManager);
event Deposit(address indexed account, address indexed from, address indexed token, uint256 amount);
event Withdraw(address indexed account, address indexed to, address indexed token, uint256 amount);
// Factory
event AccountCreated(address indexed account, address indexed manager);
// Account
event ApiWalletUpdated(bytes32 indexed name, address indexed addr);
event ManagerSet(address indexed oldManager, address indexed newManager);
错误
Factory__CreationDepositNotMet(uint256 expected):msg.value低于创建押金Factory__CreationNotAllowed():被创建过滤器拦截Exchange__AccountDoesNotExist(address account):不是已注册的 AccountExchange__TokenNotSupported(address token):不是受支持的期权代币Account__NotManager(address addr):调用者或签名者不是 managerAccount__ApiWalletNotActive(address addr):签名者不是已激活的 API 钱包Account__ApiWalletAlreadyActive(address addr):该 API 钱包已在 Account 上Account__ApiWalletIsManager():manager 不能作为自己的 API 钱包Account__NonceAlreadyUsed(address signer, uint256 nonce):nonce 重复使用Account__LiquidationInProgress():强制平仓期间该操作被禁止
安全注意事项
- Manager 私钥:控制 API 钱包、资金转出和 builder 授权。请使用硬件钱包。
- API 钱包私钥:仅用于签署下单和撤单。每个系统使用独立的私钥,并定期轮换。
- Nonce:每个签名者拥有独立的 nonce 空间。请使用毫秒级时间戳,并在链下记录。
- 激活:Account 必须先在 HyperCore 上激活(至少存入价值 $1 的 HYPE),才能交易永续合约。