EIP-712 İmzalama
Bu sayfa, Hypercall'un doğruladığı her EIP-712 mesajı için alan düzeyinde referanstır: üç direktif imzalama domain'i (API cüzdanı, Manager, RSM), API cüzdanı domain'ini paylaşan yalnızca off-chain perp mesajları ve bağımsız Physical Covered Call Quote domain'i. REST API üzerindeki opsiyon emirleri farklı bir domain kullanır: Hypercall. Ayrıntılar için Kimlik Doğrulama ve İmzalama sayfasına bakın.
Buradaki her şey HyperEVM ana ağında (chain ID 999) deploy edilmiş kontratlara karşı kontrol edilmiştir: 0xE6b7FaA216cabb2b38B392f577C9c826378b2240 adresindeki Exchange 0.6.1 ve Account 0.2.4. Aşağıdaki domain separator'lar ve typehash'ler bu deploy edilmiş bytecode'un içinde gömülüdür.
Genel Bakış
Bir direktif, tek bir Account üzerinde tek bir aksiyondur. Off-chain olarak imzalanır ve Hypercall'un sequencer'ı tarafından Exchange.executeUserDirective veya Exchange.executeRsmDirective aracılığıyla on-chain olarak gönderilir. Account, imzalayanı EIP-712 digest'inden geri elde eder ve yetkilendirmeyi kontrol eder:
- API cüzdanı: Account üzerinde
hc_update_api_walletile kaydedilmiş bir adres (Account.isApiWalletActive). Emirleri ve iptalleri imzalar. - Manager: Account sahibi (
Account.manager). API cüzdanı değişikliklerini, varlık gönderimlerini ve hesap modu değişikliklerini imzalar. - RSM imzalayıcı: protokol kontrolündedir (
Exchange.rsmSigner). Kredileri, çekimleri, likidasyon direktiflerini ve yalnızca pozisyon azaltan (reduce-only) kurtarma emirlerini imzalar. Kullanıcılar bunları asla imzalamaz.
Direktif Kodlaması
On-chain olarak bir direktif abi.encodePacked(account, nonce, version, id, data) şeklindedir:
| Bayt | Alan | Anlamı |
|---|---|---|
| 20 | account | Account adresi (address) |
| 8 | nonce | İmzalayanın nonce değeri (uint64) |
| 1 | version | Aksiyon ailesi |
| 3 | id | Aile içindeki aksiyon ID'si |
| kalan | data | İç aksiyon struct'ının abi.encode çıktısı |
| Versiyon | Aile | Aksiyon ID'leri |
|---|---|---|
0 | HyperCall (HC) | 2 API cüzdanı güncelleme. 1 (opsiyon transferi) ayrılmıştır ve reddedilir. |
1 | HyperLiquid (HL) | 1 limit emir, 9 API cüzdanı ekleme, 10 oid ile iptal, 11 cloid ile iptal, 13 varlık gönderme, 16 abstraction ayarlama |
255 | Sistem | 1 token kredisi, 2 opsiyon kredisi, 3 likidasyonu başlatma, 4 likidasyonu durdurma, 5 token çekimi |
Bu bayt dizisini kendiniz oluşturmazsınız. Tipli veriyi imzalayın, ardından account, nonce, action ve signature alanlarını API'ye gönderin; direktifi API kodlar.
Tipli Veri Yapısı
Her direktif aynı dış yapıya sahiptir: Account adresi, imzalayanın nonce değeri ve tek bir iç aksiyon struct'ı.
<Outer>(address account,uint64 nonce,<Inner> action)<Inner>(...)
Dış tip dizesi iç tip tanımını sonuna ekler, bu nedenle typehash her ikisini de kapsar. EIP-712 terimleriyle primaryType dış isimdir, types her iki girdiyi içerir ve message { account, nonce, action } şeklindedir. Alan sırası tip dizesinin bir parçasıdır ve birebir eşleşmelidir.
İmzasız Fonlama Giriş Noktaları
Her fonlama çağrısı bir EIP-712 aksiyonu değildir. Aşağıdaki metotlar, ödemeyi yapan cüzdan veya router tarafından gönderilen doğrudan işlemlerdir:
function depositUsdcFor(address account, uint256 amount) external;
function depositOption(address account, address token, uint256 amount) external;
depositUsdcFor bilinçli olarak imzasızdır, çünkü msg.sender yalnızca USDC ödeyicisidir. Kredilendirilen Hypercall hesabı, açıkça belirtilen account argümanı ve UsdcDeposit.account event alanıdır. Router'lar ve zap'ler bu metodu çağırabilir, bu nedenle indexer'lar ve backend servisleri kredi atfı için msg.sender değerini kullanmamalıdır.
depositOption, msg.sender adresinden opsiyon tokenlarını yakar ve RSM indexer'ı için Deposit(account, msg.sender, token, amount) event'ini yayar. Opsiyon kredi yolu event tabanlıdır ve yatırım yapan taraftan manager, agent veya RSM imzası kullanmaz.
Bağımsız Domain: Fiziksel Covered Call Kotasyonları
Fiziksel covered call kotasyonları, seçilen zincirde deploy edilmiş factory tarafından doğrulanır. Exchange doğrulayıcısını veya onun sıfır adresli domain'ini kullanmazlar.
Domain:
{
"name": "Hypercall Physical Covered Call",
"version": "1",
"chainId": "<selected chain id>",
"verifyingContract": "<exact PhysicalCoveredCallFactory address>"
}
İmzalayan: PhysicalCoveredCallQuote.marketMaker içinde kodlanmış piyasa yapıcı.
Kanonik iç içe tipler:
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, kotasyonu imzalayanı geri elde etmeden önce requestHash değerini iç içe talebin tamamından yeniden hesaplar. Bu nedenle imza; satıcıyı, dayanak varlık wrapper'ını, wrapper pay miktarını, kullanım fiyatını, vade sonunu, primi, kotasyon son tarihini, nonce'u, chain id'yi ve factory adresini bağlar. Uzlaşma tokenı ve ondalık basamakları ayrıca imzalanan değerler değil, factory'nin yetkili konfigürasyonudur. Bu oracle'sız nesilde Pyth yer almaz. Satıcı bir vault'u fonladığında hem kotasyon digest'i hem de piyasa yapıcının nonce değeri tüketilir.
İmzalı kotasyonu yalnızca talepte kodlanmış satıcı gönderebilir. Fonlama, writer-claim NFT'sini satıcıya, long opsiyon NFT'sini ise kotasyonu veren piyasa yapıcıya mint eder; bunun koşulu, opsiyonel alıcı izin listesi etkinken bu piyasa yapıcının uygun bir alıcı olmasıdır. Geçerli bir imza kullanımı (exercise) değil, fonlamayı yetkilendirir.
Kullanım çağrısını yalnızca mevcut long opsiyon NFT sahibi yapabilir. Bu yalnızca-sahip kuralı, bir ERC-721 operatörünün sahibin uzlaşma tokenı allowance'ını tüketmesini engeller. Onaylı bir operatör, standart ERC-721 kuralları altında NFT'yi yine de transfer edebilir; bu da alıcı kapısı etkinken ekonomik hakkı uygun bir alıcıya devreder. Başarılı bir kullanım, kullanım fiyatı tutarındaki nakdi çağıran sahipten çeker, dayanak varlığı o sahibe teslim eder ve long opsiyon NFT'sini yakar.
EIP-712 Domain Separator'ları
Üç direktif domain'i aynı yapıyı kullanır ve yalnızca name alanında farklılaşır. verifyingContract sıfır adrestir, bu nedenle aynı imza zincirdeki herhangi bir Account için geçerlidir; imzayı tek bir Account'a bağlayan şey mesajın içindeki Account adresidir.
{
"name": "<DomainName>",
"version": "1",
"chainId": <chainId>,
"verifyingContract": "0x0000000000000000000000000000000000000000"
}
Domain tipi EIP712Domain(string name,string version,uint256 chainId,address verifyingContract) şeklindedir.
Chain ID'leri: ana ağ 999, testnet 998. Account, separator'ı çalıştığı zincire göre seçer; bu nedenle bir testnet imzası ana ağda asla doğrulanmaz.
| Domain | name | version | İmzalayan | Zincir | Separator |
|---|---|---|---|---|---|
| API cüzdanı | HypercallApiSign | 1 | API cüzdanı | 999 | 0x462ae8a3a67da57ddd088e60be368536f992b8bf369d13e64e620c51993e5ebb |
| API cüzdanı | HypercallApiSign | 1 | API cüzdanı | 998 | 0x339bee4c00da9a5361f687797205c8d03f323659f5d9dc9e0505b9437ddee25e |
| Manager | HypercallManagerSign | 1 | Manager | 999 | 0xc9b5b0b8b0d9d7ba716326acbf795cfe431ef960a25a8f958d6569bea2f1516e |
| Manager | HypercallManagerSign | 1 | Manager | 998 | 0xd1f76b6138be892c14b71b0569bdb049cb44f239d34c78ef1ffaacd2466f9f18 |
| RSM | HypercallRsmSign | 1 | RSM imzalayıcı | 999 | 0x3d0cae2af623c614099dbadd67a1e1457fabde576aa270a70a57e39bf338a7be |
| RSM | HypercallRsmSign | 1 | RSM imzalayıcı | 998 | 0x650b282053fb61d3fd477bdc28f6434311fe905e27cc4ca643e87e802c45938c |
Herhangi bir şeyi imzalamadan önce separator'ı kendiniz hesaplayın ve karşılaştırın:
import { ethers } from "ethers";
const separator = ethers.TypedDataEncoder.hashDomain({
name: "HypercallApiSign",
version: "1",
chainId: 999,
verifyingContract: ethers.ZeroAddress
});
// 0x462ae8a3a67da57ddd088e60be368536f992b8bf369d13e64e620c51993e5ebb
Mesaj Referansı
İmzalayan ve Endpoint Matrisi
| Mesaj | Domain | İmzalayan | Gönderim adresi | Yürüttüğü işlem |
|---|---|---|---|---|
HLOrder | API | API cüzdanı | POST /v1/tee-perp/orders/submit veya POST /v1/actions/hl_limit_order | Hyperliquid limit emri |
HLCancel | API | API cüzdanı | POST /v1/tee-perp/cancels/submit-by-oid veya POST /v1/actions/hl_cancel_by_oid | oid ile iptal |
HLCancelByCloid | API | API cüzdanı | POST /v1/tee-perp/cancels/submit veya POST /v1/actions/hl_cancel_by_cloid | cloid ile iptal |
HCPerpTriggerOrder | API | API cüzdanı | POST /v1/tee-perp/orders/submit-trigger | Native tetikli emir (yalnızca TEE) |
HCPerpOrderBatch | API | API cüzdanı | POST /v1/tee-perp/orders/submit-batch | Native emir grubu (yalnızca TEE) |
HCPerpLeverageChange | API | API cüzdanı | POST /v1/tee-perp/leverage/submit | Kaldıraç güncellemesi (yalnızca TEE) |
HCPerpScheduleCancel | API | API cüzdanı | POST /v1/tee-perp/schedule-cancel/submit | Dead-man switch (yalnızca TEE) |
HCUpdateApiWallet | Manager | Manager | POST /v1/actions/hc_update_api_wallet | Account API cüzdanı kaydı |
HLAddApiWallet | Manager | Manager | POST /v1/actions/hl_add_api_wallet | HyperCore API cüzdanı onayı |
HLSendAsset | Manager | Manager | POST /v1/actions/hl_send_asset | Account'tan HyperCore sendAsset |
HLSetAbstraction | Manager | Manager | POST /v1/actions/hl_set_abstraction | HyperCore hesap modu (yalnızca unified) |
HCTransferOption | Manager | Manager | Kabul edilmez | Ayrılmış, on-chain reddedilir |
HLOrder, HLCancel, HLCancelByCloid, HLSendAsset | RSM | RSM imzalayıcı | Yalnızca sequencer | Account üzerinden kurtarma emirleri ve süpürmeler |
System* | RSM | RSM imzalayıcı | Yalnızca sequencer | Exchange üzerinden krediler, çekimler, likidasyon |
Tüm /v1/actions/{action} rotaları account, nonce, action ve signature alır. POST /v1/actions/{action}/typed-data, o istek için imzalanacak kesin tipli veriyi döndürür; bu, encoder'ınızı doğrulamanın en kolay yoludur. GET /v1/directives/{directive_id} on-chain sonucu raporlar. İstek şemaları API Referansı sayfasındadır.
Wire Kuralları
nonceve heruint64,uint128veyauint256alanı,9007199254740991değerine kadar JSON tam sayısı ya da ondalık string olarak gönderilir. Bu değerin üzerinde string kullanın.signature, 65 baytlık0xhex string'idir (r || s || v).vdeğeri0,1,27veya28olabilir.bytes32alanları0xönekli 32 baytlık hex'tir. Adresler checksum'lı veya küçük harfli hex'tir.- Perp fiyatları ve büyüklükleri HyperCore
1e8tam sayılarıdır; örneğin$50,000değeri5000000000000,0.001coin ise100000olur.
API Cüzdanı Direktifleri (HypercallApiSign)
Account'un aktif bir API cüzdanı tarafından imzalanır. Chain ID 999 ve name olarak HypercallApiSign kullanın.
Test vektörleri, encoder'ınızı bayt bayt kontrol edebilmeniz için yer tutucu bir hesap ve sabit bir nonce kullanır. Digest, keccak256(0x1901 || domainSeparator || directiveStructHash) şeklindedir.
HLOrder
Account için tek bir Hyperliquid limit emri.
Struct:
struct LimitOrder {
uint32 asset;
bool isBuy;
uint64 limitPx;
uint64 sz;
bool reduceOnly;
uint8 encodedTif;
uint128 cloid;
}
struct HLOrder {
address account;
uint64 nonce;
LimitOrder action;
}
Kanonik EIP-712 tipi:
HLOrder(address account,uint64 nonce,LimitOrder action)LimitOrder(uint32 asset,bool isBuy,uint64 limitPx,uint64 sz,bool reduceOnly,uint8 encodedTif,uint128 cloid)
Typehash: 0xe6facb816c5f9c321054ef43c7d8fb1ec750f65d630ec39c5c18119a6f4707dd. İmzalayan: API cüzdanı. Aksiyon: versiyon 1, id 1.
asset: Hyperliquid varlık indeksi.GET /v1/tee-perp/markets, Hypercall'un kabul ettiği perp piyasalarını ve indekslerini listeler.isBuy: almak içintrue, satmak içinfalse.limitPx,sz:1e8ile çarpılmış fiyat ve büyüklük.reduceOnly: emir yalnızca pozisyonu azaltabiliyorsatrue.encodedTif: ALO =1, GTC =2, IOC =3. Diğer tüm değerler reddedilir.cloid: istemci emir ID'si, sıfırdan farklı olmalıdır. Daha sonra cloid ile iptal için kullanılır.
Örnek (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);
Test vektörü (hesap 0x1111111111111111111111111111111111111111, nonce 1760000000000, zincir 999):
| Adım | Değer |
|---|---|
| Typehash | 0xe6facb816c5f9c321054ef43c7d8fb1ec750f65d630ec39c5c18119a6f4707dd |
| Aksiyon struct hash | 0x0fd024c6bf8f132123e63a78d50008d8c39c52e5409ef6ca87a4eec8f6eabb41 |
| Direktif struct hash | 0xd32948ee1f249b96124a6acdb5845d09aad8228512098598de6858d5484fe703 |
| İmzalanacak digest | 0xc3c42699092fe20c7dbc4205a1027f55c28d33a682a64bd3f04e40f1d28693f5 |
Test vektörü isBuy: true, limitPx: 5000000000000, sz: 100000, reduceOnly: false, encodedTif: 2, asset: 0 ve nonce'a eşit cloid kullanır.
Gönderim: account, nonce, action ve signature ile POST /v1/tee-perp/orders/submit. Hypercall teminat kontrolünü çalıştırır, ardından güvenli bir enclave, Hypercall builder kodu eklenmiş native Hyperliquid emrini imzalar ve gönderir. Account manager'ı önce bu builder'ı Account.approveZeroFeeBuilder ile onaylamalıdır; bkz. Onboarding. Akışın tamamı için Perps sayfasına bakın.
{
"account": "0x1111111111111111111111111111111111111111",
"nonce": 1760000000000,
"action": {
"asset": 0,
"isBuy": true,
"limitPx": "5000000000000",
"sz": "100000",
"reduceOnly": false,
"encodedTif": 2,
"cloid": "1760000000000"
},
"signature": "0x<65 byte signature>"
}
Aynı imzalı mesaj POST /v1/actions/hl_limit_order adresinde de kabul edilir; bu adres mesajı, Exchange.executeUserDirective ve Account.performCoreAction üzerinden yürütülen bir on-chain direktif olarak kodlar.
HLCancel
Tek bir emri Hyperliquid emir ID'si ile iptal eder. Sarmalayıcı HLCancel, iç struct ise CancelOrderByOid şeklindedir.
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. İmzalayan: API cüzdanı. Aksiyon: versiyon 1, id 10. Gönderim: POST /v1/tee-perp/cancels/submit-by-oid veya 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);
Test vektörü (hesap 0x1111111111111111111111111111111111111111, nonce 1760000000000, zincir 999):
| Adım | Değer |
|---|---|
| Typehash | 0x23c5529f34a875b6c0d11a6dfafdd945996dbdc5fbd1bdace2c2e0cf6a253a85 |
| Aksiyon struct hash | 0xa34e7bb8af0d099f9c48095924e53067bcb9b542a816445b96abebbc5646b727 |
| Direktif struct hash | 0x69d560ba5ef3e88459bde7fb8252e55dbc33627373c8f0cfcf8ef0868f59e097 |
| İmzalanacak digest | 0x5046aba9fb33c55ce736faf63734ea66914f3f168ff0aff2229fa6f31fa9b330 |
Test vektörü asset: 0 ve oid: 123456789 kullanır.
HLCancelByCloid
Tek bir emri, HLOrder üzerinde belirlediğiniz istemci emir ID'si ile iptal eder.
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. İmzalayan: API cüzdanı. Aksiyon: versiyon 1, id 11. Gönderim: POST /v1/tee-perp/cancels/submit veya 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);
Test vektörü (hesap 0x1111111111111111111111111111111111111111, nonce 1760000000000, zincir 999):
| Adım | Değer |
|---|---|
| Typehash | 0x10cbcfa56297fc737e4defee7b7937a52978ebbe5920e584317f7f25416836f5 |
| Aksiyon struct hash | 0xfa4ab6440f946a6e279d90972d71223c768c01c8a91dc22703a6448dbcb966d0 |
| Direktif struct hash | 0x998efb01bb9c842eea80e8cc084b9e4e7ec13b2111790e1acbfec32e49060d9d |
| İmzalanacak digest | 0x56af82a6aa7fa50907a23c6cfe3aa556af5aa087b1157163ebf6ea0240e8d29d |
Test vektörü asset: 0 ve cloid: 1760000000000 kullanır.
Yalnızca TEE Perp Mesajları
Bu dört mesaj Account kontratı tarafından değil Hypercall API tarafından doğrulanır; çünkü enclave bunları Hyperliquid üzerinde native olarak yürütür ve bunlar için bir on-chain direktif mevcut değildir. HLOrder ile aynı HypercallApiSign domain'ini ve aynı API cüzdanı yetkilendirmesini kullanırlar (imzalayan, Account'un aktif bir API cüzdanı olmalı ve Account portföy teminatı modunda olmalıdır). Typehash'leri kontratlarda yer almaz. Nonce değerleri milisaniye cinsinden Unix zamanıdır.
PerpOrderTerms
HCPerpTriggerOrder ve HCPerpOrderBatch bu struct'ı içerir. Limit alt emri, TIF baytını triggerPx = 0, isMarket = false, tpsl = 0 ile imzalar. Tetikli alt emir ise encodedTif = 0, pozitif bir triggerPx ve 1 (kâr al) veya 2 (zarar durdur) değerinde tpsl imzalar.
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 adresine gönderilen tek bir zarar durdur veya kâr al emri. İstekteki action.orderType bir tetikli emir olmalıdır.
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
Test vektörü (hesap 0x1111111111111111111111111111111111111111, nonce 1760000000000, zincir 999):
| Adım | Değer |
|---|---|
| Typehash | 0x2d3104ab255275839aad254429e4be789f64a8d16b8e3e7d5f30a0db3c887b5c |
| Aksiyon struct hash | 0x285b3186be219b92d7159419288c0dce9bc4ad7bfc9536e009ebf24bd67f434c |
| Direktif struct hash | 0xaa03e40b34b15e7e932ae827921930e7538387b596ef1040dbcc791e69021299 |
| İmzalanacak digest | 0xc46aadc390b66c235af15e199e188ab23fb7f7f1b9237f6c2849c264c28d94da |
Test vektörü, yalnızca pozisyon azaltan bir piyasa zarar durdur satış emridir: asset: 0, isBuy: false, limitPx: 4800000000000 (en kötü fiyat), sz: 100000, reduceOnly: true, encodedTif: 0, triggerPx: 4900000000000, isMarket: true, tpsl: 2, cloid: 1760000000001.
HCPerpOrderBatch
POST /v1/tee-perp/orders/submit-batch adresine gönderilen, tek bir gruplama altında en fazla 100 emir. Her emir farklı bir cloid kullanmalıdır. grouping değeri 0 (gruplama yok), 1 (normalTpsl) veya 2 (positionTpsl) olur. Bir grup, rate limit açısından tek bir emir girişi sayılır.
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 dizisi, gönderim sırasıyla birleştirilmiş PerpOrderTerms struct hash'lerinin keccak256 değeri olarak kodlanır.
Test vektörü (hesap 0x1111111111111111111111111111111111111111, nonce 1760000000000, zincir 999):
| Adım | Değer |
|---|---|
| Typehash | 0x9d4f467a44f4b0d39f234f3b91888546ce31dcbb67ce791550901b9042c38f8b |
| Emir dizisi hash | 0x13fc75fcc69bf3b4ef7cdc3a0872c3cc1cf59440c74d366055109b6bd5ea7c98 |
| Direktif struct hash | 0x69d0b1131e386769823fe1ab3facbe8e6fc013f86a117cf95cb52b8ce2f274e0 |
| İmzalanacak digest | 0x4b5cd34b1f254fdd9881b7674a3412807e16cade1f2ccc7a1e261482682fbd07 |
Test vektörü, iki emirli grouping: 1 grubudur: bir GTC limit alış emri (limitPx: 5000000000000, sz: 100000, cloid: 1760000000000) ve ardından tetikli emir örneğindeki zarar durdur emri.
HCPerpLeverageChange
POST /v1/tee-perp/leverage/submit adresine gönderilir ve tek bir varlık için kaldıracı ayarlar. leverage sıfırdan büyük olmalıdır.
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
Test vektörü (hesap 0x1111111111111111111111111111111111111111, nonce 1760000000000, zincir 999):
| Adım | Değer |
|---|---|
| Typehash | 0xe13845f0e6c16a5e1fc56b2d11fb0972faa2ec30b01e94d58c72147fa9b6a463 |
| Aksiyon struct hash | 0x0e6e271dd56192d7fb1f37ea2eaffecfbbe2d1f79cac78dce6a6930bb8cc253e |
| Direktif struct hash | 0xe04b169bbb0e20042308e5aad1036ce60eda75f484a4d6093dc60f2c2231129e |
| İmzalanacak digest | 0xb2a43487152a7cecc73d2b6b84d817a58dd02c559b05289a8d8e1b5c3d25e266 |
Test vektörü, asset: 0 üzerinde cross kaldıracı 5x olarak ayarlar.
HCPerpScheduleCancel
Hyperliquid'in dead-man switch'i: tüm açık emirleri time anında (Unix milisaniye, en az yedi saniye ileride) iptal eder. POST /v1/tee-perp/schedule-cancel/submit adresine gönderilir. Planlanmış bir iptali temizlemek için istekte time alanını çıkarın ve time = 0 imzalayın. Açıkça 0 göndermek reddedilir.
struct PerpScheduleCancel {
uint64 time;
}
struct HCPerpScheduleCancel {
address account;
uint64 nonce;
PerpScheduleCancel action;
}
HCPerpScheduleCancel(address account,uint64 nonce,PerpScheduleCancel action)PerpScheduleCancel(uint64 time)
Typehash: 0xf21b6881e346bbf4b8d82e8ea507cf487e58dfc08776ad662591be7d6065bdfb
Test vektörü (hesap 0x1111111111111111111111111111111111111111, nonce 1760000000000, zincir 999):
| Adım | Değer |
|---|---|
| Typehash | 0xf21b6881e346bbf4b8d82e8ea507cf487e58dfc08776ad662591be7d6065bdfb |
| Aksiyon struct hash | 0x0a3ebfe48ef28a79beeee4d56e524f8a5280c38562efb697e7b1d63b3d475afc |
| Direktif struct hash | 0xae64a13943a6a35b33aeb3095763b855c58c2119daf71e1e3228d8acf2645e8b |
| İmzalanacak digest | 0xa01806f47299010b5963a516562be3c3b44fed4f4a9e2e56c4bb601630146cdc |
Test vektörü, time: 1760000060000 anına bir iptal planlar.
Manager İmzalı Hazırlanmış İptal
POST /v1/tee-perp/cancels/submit-prepared, manager imzalı iptal yoludur. Tipli veri struct'ı kullanmaz. Manager, preparedRequest (base64) olarak sağlanan hazırlanmış bir native Hyperliquid iptalinin digest'ini kanonik low-s formundaki managerSignature ile imzalar; buna ek olarak manager cüzdanının kimliğini doğrulayan zaman damgalı bir authenticationSignature gönderir. İstek şeması için API Referansı sayfasına bakın.
Manager Direktifleri (HypercallManagerSign)
Account manager'ı tarafından imzalanır. Chain ID 999 ve name olarak HypercallManagerSign kullanın. Account, signer == manager koşulunu arar. POST /v1/actions/{action} ile gönderin.
HCUpdateApiWallet
Account üzerinde name altında saklanan API cüzdanını ekler, değiştirir veya kaldırır (addr = 0x0).
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. Aksiyon: versiyon 0, id 2. Gönderim: { "name": "0x...", "addr": "0x..." } değerinde action ile POST /v1/actions/hc_update_api_wallet.
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);
Test vektörü (hesap 0x1111111111111111111111111111111111111111, nonce 1760000000000, zincir 999):
| Adım | Değer |
|---|---|
| Typehash | 0x8ebe7d19374200e5dc3ae838db74b370da95bd2b3a8aec9de85d2398dd4a9257 |
| Aksiyon struct hash | 0x8b6c4a9db102e9d27c9a4069b39ba35e04948129359f0c15cd5103dd101ffce7 |
| Direktif struct hash | 0x830e291835ad182f290bc3d2bff09eaf9fd33acfbe44c6ad583218cd1a8232e5 |
| İmzalanacak digest | 0x06589077544af449314db1fa8c7aac2d277cce9e833a04992d88161ede24cbe8 |
Test vektörü name olarak trading-bot (0x74726164696e672d626f74, sağdan sıfırlarla doldurulmuş) ve addr olarak 0x2222222222222222222222222222222222222222 kullanır. API cüzdanı akışının tamamı için Onboarding sayfasına bakın. Account, ApiWalletUpdated(name, addr) event'ini yayar.
HLAddApiWallet
Account için HyperCore üzerinde bir Hyperliquid API cüzdanını onaylar.
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. Aksiyon: versiyon 1, id 9. Gönderim: POST /v1/actions/hl_add_api_wallet.
apiWalletName bir string olduğundan struct alanı keccak256(bytes(apiWalletName)) olur. Ethers ve viem bunu sizin yerinize yapar.
Test vektörü (hesap 0x1111111111111111111111111111111111111111, nonce 1760000000000, zincir 999):
| Adım | Değer |
|---|---|
| Typehash | 0x71c0e0dfbddc3456015249946354324befde42b6851d1c9b26c6a29f2e0b1ac2 |
| Aksiyon struct hash | 0xed32a441b0ee59c0252f5dff3411766289c9c35c19e3152b0b2b204176c2c7cd |
| Direktif struct hash | 0xb990a3dfb4e8d96243539f8758b3a55249b217542bb4112f4f88ed67ec516ed9 |
| İmzalanacak digest | 0x584886d020316085de0e0dec16331b8e990558be3e8fd004c47200abbebed518 |
Test vektörü apiWalletAddress olarak 0x2222222222222222222222222222222222222222 ve apiWalletName olarak hl-bot kullanır.
HLSendAsset
HyperCore üzerindeki Account'tan bir hedefe varlık gönderir.
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. Aksiyon: versiyon 1, id 13. Gönderim: 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);
Test vektörü (hesap 0x1111111111111111111111111111111111111111, nonce 1760000000000, zincir 999):
| Adım | Değer |
|---|---|
| Typehash | 0x7feffdf7e7b191d5d27c2a209ca71c789289da73de203e99546abf9632860595 |
| Aksiyon struct hash | 0x9b8c0290da19ea1069e14833023c4621a4f043354b36b4f17d4803b1fce6e656 |
| Direktif struct hash | 0xa0cb8a72188a61289fc2685c29a424605e0a2ee7b7af3e8cfee10e1c75153e08 |
| İmzalanacak digest | 0x7c7037f27c659a1885f744778480e6847c5d08e98fb22517265ba708b6597d10 |
Test vektörü, destination olarak üretim Exchange adresi 0xE6b7FaA216cabb2b38B392f577C9c826378b2240 ile perps'ten (srcDex: 0) spot'a (dstDex: 4294967295) 5 USDC (amountWei: 500000000) gönderir.
HLSetAbstraction
Account'un HyperCore hesap modunu ayarlar. Account yalnızca kendisine eşit user ve abstraction = 2 (unified hesap) değerlerini kabul eder; diğer her şey revert eder. Portföy Teminatı (Portfolio Margin) bunu gerektirir.
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. Aksiyon: versiyon 1, id 16. Gönderim: POST /v1/actions/hl_set_abstraction.
Test vektörü (hesap 0x1111111111111111111111111111111111111111, nonce 1760000000000, zincir 999):
| Adım | Değer |
|---|---|
| Typehash | 0xcf5fddf081e5f2a9a45aa87cb1a3c42e5aa20164566b1ad2369b6b1318eac786 |
| Aksiyon struct hash | 0xef6c70a3c14b9e77c710c6b3b3ee681ca270ef884bd8a64fa4064a96f3dda84e |
| Direktif struct hash | 0xdda9d0fe82b63c728c4ac42585d5998a04cabaed0f957a2cafdf31a754829c3d |
| İmzalanacak digest | 0xf49d7d8d74596e503d6a1bdfb26653533a12a5ba3816acd992d0bd4ef378f59d |
Test vektörü user değerini Account'a, abstraction değerini 2 olarak ayarlar.
HCTransferOption (ayrılmış)
Kontratlar HCTransferOption(address account,uint64 nonce,TransferOption action)TransferOption(address recipient,address option,uint256 amountWei) tipini tanımlar (typehash 0xa218e1158788b23987f954edc7a07659a03a03fe5ba981a5bbe44d7a146e0819, aksiyon versiyonu 0, id 1), ancak buna hiçbir imzalayan türü atanmamıştır. Account Account__UserDirectiveNotSupported ile revert eder ve API hc_transfer_option isteğini reddeder. Bunu imzalamayın. Opsiyon tokenlarını bunun yerine depositOption ve çekimlerle taşıyın.
İmza Gerektirmeyen Manager İşlemleri
Bazı manager aksiyonları EIP-712 mesajı değil, doğrudan Account çağrılarıdır: Account.approveZeroFeeBuilder(builder), bir Hyperliquid builder'ını en fazla %0 ücretle onaylar ve ilk perp emrinden önce bir kez gereklidir (bkz. Onboarding). Account.transferTo(recipient, token, amount), tokenları HyperEVM üzerinde Account'tan dışarı taşır. Her ikisi de msg.sender == manager gerektirir ve Account likidasyondayken revert eder.
RSM Direktifleri (HypercallRsmSign)
RSM imzalayıcı tarafından imzalanır ve sequencer tarafından gönderilir. Yatırımları kredilendirir, çekimleri işler, likidasyonu başlatıp durdurur ve yalnızca pozisyon azaltan IOC kurtarma emirleri verir. Piyasa yapıcılar ve kullanıcılar bunları imzalamaz veya göndermez; protokolün bir Account üzerinde neler yapabileceğini doğrulayabilmeniz için belgelenmiştir. Chain ID 999 ve name olarak HypercallRsmSign kullanın. Exchange, signer == rsmSigner koşulunu (ana ağda şu anda 0x502E7fAbF34E84EeB115C34FE947b79A94dF886E) kontrol eder ve çağıranın SEQUENCER_ROLE rolüne sahip olması gerekir.
RSM Emirleri ve Süpürmeler (Account tarafından yürütülür)
Bunlar HL struct'larını RSM domain'i altında yeniden kullanır; bu nedenle typehash'ler API ve manager typehash'leriyle aynıdır ve yalnızca domain separator farklıdır. Account ek kısıtlar uygular ve bunları likidasyon sırasında bile çalıştırır.
| Mesaj | Typehash | Account tarafından uygulanan kısıt |
|---|---|---|
HLOrder | 0xe6facb816c5f9c321054ef43c7d8fb1ec750f65d630ec39c5c18119a6f4707dd | encodedTif IOC (3) olmalıdır ve emir ya reduceOnly olmalı ya da HyperCore spot fiyatının en fazla %5 altına limitlenmiş, USDC'ye yönelik bir spot satış olmalıdır (spot varlık id'leri 10000 ile 99999 arası) |
HLCancel | 0x23c5529f34a875b6c0d11a6dfafdd945996dbdc5fbd1bdace2c2e0cf6a253a85 | Yok |
HLCancelByCloid | 0x10cbcfa56297fc737e4defee7b7937a52978ebbe5920e584317f7f25416836f5 | Yok |
HLSendAsset | 0x7feffdf7e7b191d5d27c2a209ca71c789289da73de203e99546abf9632860595 | destination Exchange olmalıdır |
RSM HLOrder test vektörü (hesap 0x1111111111111111111111111111111111111111, nonce 1760000000000, zincir 999):
| Adım | Değer |
|---|---|
| Typehash | 0xe6facb816c5f9c321054ef43c7d8fb1ec750f65d630ec39c5c18119a6f4707dd |
| Aksiyon struct hash | 0x39b4e0699f382aaad23f04740034e7c5581ba918139d2db63fbf586cc447e7db |
| Direktif struct hash | 0xe6dde5ad6d310b5ebb83c09ec28ee5568700473b885bb483b7437dca202af4f3 |
| İmzalanacak digest | 0x57afa1e810804e768c05a467aa88ede15fdceedae5aaa840adff61a613aca469 |
RSM HLOrder vektörü, yalnızca pozisyon azaltan bir IOC satış emridir (isBuy: false, limitPx: 4800000000000, sz: 100000, reduceOnly: true, encodedTif: 3, nonce'a eşit cloid). Exchange.executeRsmDirective imzayı doğrular ve aksiyonu Account'a iletir.
Sistem Aksiyonları (Exchange tarafından yürütülür)
Versiyon 255. Her sarmalayıcı System<Action>(address account,uint64 nonce,<Action> action)<Action>(...) şeklindedir.
| Sarmalayıcı | İç tip | 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 |
Tam dış tip dizeleri:
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'dan Account'a spot veya perp tokenları kredilendirir.
amountWeisıfırdan farklı olmalı ve Account HyperCore üzerinde aktifleştirilmiş olmalıdır. - SystemCreditOption, gerekirse opsiyon çiftini deploy ederek Account'a opsiyon tokenları mint eder.
underlying, bir OpenZeppelinShortStringkelimesidir: ASCII sola hizalı, bayt uzunluğu son baytta (BTCiçin0x42544300...03). Kanonik olmayan kodlamalar revert eder. - SystemStartLiquidation, açık artırma parametrelerini kaydeder ve Account'u kilitler.
marginNeededsıfırdan farklı olmalıdır. - SystemStopLiquidation,
startTimedeğerinin kaydedilen başlangıca eşit olmasını gerektirir ve Account'u manager'ına geri verir. - SystemWithdrawToken, Exchange'in kendi bakiyesinden HyperCore üzerinde Standard USDC teslimatını kuyruğa alır.
subAccount = 0,srcDex = 0,0veya4294967295değerindedstDex,token = 0(USDC) ve EVM biriminin tam katı olan biramountWeigerektirir. Tek başına bir HyperEVM makbuzu, HyperCore üzerinde teslimatın kanıtı değildir.
SystemCreditToken test vektörü (hesap 0x1111111111111111111111111111111111111111, nonce 1760000000000, zincir 999):
| Adım | Değer |
|---|---|
| Typehash | 0xe845f2049264182802994dae939dc8ac42d3ae543a7eeb530dd021428743f052 |
| Aksiyon struct hash | 0xc69d7c6e5c36c9789d990c6316eaff3be43980583806f41f8a8e6461b7114011 |
| Direktif struct hash | 0x7ffa37cef7e08d3a2dd5501a8648899d37bc09ebb25d148c124e12c5047476e1 |
| İmzalanacak digest | 0x95f75e5ddb4837de3f578b8aa0d714d4b02672b18c4929e3d2dda4a266de8254 |
Vektör 5 USDC kredilendirir (srcDex ve dstDex için 4294967295, token: 0, amountWei: 500000000).
SystemCreditOption test vektörü (hesap 0x1111111111111111111111111111111111111111, nonce 1760000000000, zincir 999):
| Adım | Değer |
|---|---|
| Typehash | 0x65aedd5af06882e1e62d752b43b72ec62a85cacf2ca59e8ec2affc57eed9d8ae |
| Aksiyon struct hash | 0x4a8b563fc94d26c1da376145d5aa5d05f996232fcf9739ed0a662650e91861b6 |
| Direktif struct hash | 0x190b638f1a462469bf0d070248acfc86bbbb95ea8a9d3d97d33581c7d6bb5554 |
| İmzalanacak digest | 0x86fb7c53bb7e139a4d5df7db2feae40e634efe09ea7509165d3cece75d75fce2 |
Vektör bir BTC alım opsiyonu kredilendirir (underlying: 0x42544300...03, expiry: 1761811200, strike: 80000, isCall: true, amountWei: 1000000000000000000).
SystemStartLiquidation test vektörü (hesap 0x1111111111111111111111111111111111111111, nonce 1760000000000, zincir 999):
| Adım | Değer |
|---|---|
| Typehash | 0x92b6a135a656e489c24fb5511684842b0ab3895c22b51e4910dee90a7d23511e |
| Aksiyon struct hash | 0x4cd6a7f0997eba84ef82eabd429a0d9ca80e55bd6d89d2e67eda9970d87ec803 |
| Direktif struct hash | 0x84f18dc2577978d7890c9eb269fd787d99de37039b3a08e24745398feffbd0c5 |
| İmzalanacak digest | 0xcc72c0e7829938c9ca0a4515d759f94cc96d2f24cd51a134a430f215ed5f5d4b |
Vektör equity: -1500000000 ve marginNeeded: 20000000000 kullanır (her ikisi de altı ondalıklı USDC).
SystemStopLiquidation test vektörü (hesap 0x1111111111111111111111111111111111111111, nonce 1760000000000, zincir 999):
| Adım | Değer |
|---|---|
| Typehash | 0xe1af98778e9cfd1d1a679bb0b64b6dc8aa3fb152ff6469d0a81a1c7eb87a4bd3 |
| Aksiyon struct hash | 0x1d900a795b328bd5fa734bd6d7f74634b98ca66eb5e45322fb1ba6400564b62b |
| Direktif struct hash | 0x977b9becdd26830f2cdf70ab40f72f24490fe6ed45822d1fc8c84120e9a46f40 |
| İmzalanacak digest | 0xbe65f82782b14dba42e334e32dd7dcc6bf14c96824523723a186a7381f8f12af |
Vektör startTime: 1760000000 kullanır.
SystemWithdrawToken test vektörü (hesap 0x1111111111111111111111111111111111111111, nonce 1760000000000, zincir 999):
| Adım | Değer |
|---|---|
| Typehash | 0x634b866e9a922bb846e297973c7a456e641b88f4e97493da9b222084d799c883 |
| Aksiyon struct hash | 0x10bd8d4372a09e613a6b4fb7018fcccde857ebf6cc3327d6c9a3c0f81515a076 |
| Direktif struct hash | 0x86680427965513c65a7a170730b9f4fb2e2b40e22cd18338cb004b6a7872ada2 |
| İmzalanacak digest | 0x65cc392038decb9ccdc23b0a4a1cfbe657d3417f8cd9ebf2319b3172fb7d885c |
Vektör, srcDex: 0, dstDex: 0, token: 0 ile destination 0x1111111111111111111111111111111111111111 adresine 5 USDC (amountWei: 500000000) çeker.
Nonce'lar
Her imzalayanın bağımsız bir nonce alanı vardır ve bu alan üç yerde izlenir.
- Account kontratı: imzalayan başına bir bitmap.
Account.isNonceUsed(signer, nonce), bir nonce'un tüketilip tüketilmediğini döndürür. Bir kullanıcı direktifi, yeniden kullanımdaAccount__NonceAlreadyUsedile revert eder.nextNonceyoktur; boşluklara izin verilir ve on-chain sıra önemli değildir. - Exchange kontratı: RSM imzalayıcı için bir bitmap;
Exchange.isNonceUsed(signer, nonce)ile okunur. - Engine: imzalayan başına en yüksek 100 nonce'u tutar. Yeni bir nonce bu kümede olmamalı, küme dolduğunda saklanan en küçük nonce'tan büyük olmalı ve milisaniye cinsinden sunucu zamanının iki gün öncesi ile bir gün sonrası arasında (sınırlar hariç) olmalıdır.
Nonce başlangıç değeri olarak milisaniye cinsinden güncel Unix zamanını kullanın ve imzalayan başına artırın. Aynı cüzdan tarafından aynı milisaniyede imzalanan iki istek farklı nonce'lar gerektirir, bu nedenle bir sayaç tutun. TEE perp rotalarında nonce aynı zamanda isteğin zaman çapasıdır; bu yüzden orada küçük tam sayılar yerine gerçek milisaniye zaman damgaları kullanın.
function isNonceUsed(address signer, uint256 nonce) external view returns (bool);
İmza Doğrulama Akışı
- Off-chain: imzalayan EIP-712 digest'ini (
0x1901 || domainSeparator || structHash) oluşturur ve imzalar. - API: Hypercall imzalayanı geri elde eder, aktif bir API cüzdanı veya manager olduğunu kontrol eder, emirler için engine teminat kontrolünü çalıştırır, ardından direktifi kuyruğa alır. Yanıt; gerçek aşamayı, ret ayrıntılarını ve işlem hash'ini raporlar.
- Sequencer:
Exchange.executeUserDirective(directive, signature)gönderir. Exchange, Account'un var olduğunu kontrol eder veAccount.executeUserDirectiveçağrısına iletir. - Account: digest'i kendi adresi, nonce ve aksiyondan yeniden oluşturur, o aksiyon için API veya manager separator'ı ile imzalayanı geri elde eder, yetkilendirmeyi kontrol eder, nonce'u tüketir ve ardından yürütür. HL aksiyonları HyperCore CoreWriter'a gider. HC aksiyonları API cüzdanı kaydını günceller.
- İstemci: nihai durum için
GET /v1/directives/{directive_id}adresini sorgular.
TEE perp rotaları API adımından sonra durur: emri Hyperliquid üzerinde Account değil, enclave yürütür.
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
Kullanımdan Kaldırılanlar
Bu parçalar bu sayfanın önceki sürümlerinde yer alıyordu ve artık deploy edilmiş sistemin parçası değildir. Bunlara karşı geliştirilmiş entegrasyonların taşınabilmesi için listelenmiştir.
- Processor ve ActionCaster kodlaması.
Processorkontratı ve ActionCaster mesaj kodlaması Exchange0.2.0sürümünde (Şubat 2026) kaldırıldı. Account direktifleri artıkExchange.executeUserDirectiveve CoreWriter üzerinden geçer. Deploy edilmiş Exchange0.6.1eski giriş noktalarının hiçbirini içermez. - Kendi struct'larına sahip Exchange giriş noktaları.
hlRequestOrder,hlRequestCancel,hlRequestCancelByCloid,hlActionSendAsset,hcActionWithdrawToken,hcActionWithdrawOption,rsmCommandRebalanceversmCommandRepaykaldırıldı. Yerlerine gelenler:
| Kaldırılan mesaj | Yerine gelen |
|---|---|
HLRequestCancel (HLCancel{asset,oid} grubu artı nonce) | Direktif başına bir CancelOrderByOid ile HLCancel |
HLRequestCancelByCloid | Direktif başına bir CancelOrderByCloid ile HLCancelByCloid |
HLActionSendAsset (account, nonce, destination, srcDex, dstDex, token, amountWei) | subAccount ekleyen SendAsset ile HLSendAsset |
HCActionWithdrawToken | Engine çekimi onayladıktan sonra sequencer tarafından yürütülen, RSM imzalı SystemWithdrawToken |
HCActionWithdrawOption | Opsiyon kredileri RSM SystemCreditOption ile yapılır; yatırımlar depositOption kullanır |
RsmCommandRebalance | RSM imzalı HLOrder (yalnızca pozisyon azaltan IOC) |
RsmCommandRepay | Exchange'e RSM imzalı HLSendAsset |
- Eski emir fonksiyonları.
placeCoreOrders,cancelCoreOrdersvecancelCoreOrdersByCloid, MsgPack kodlaması veCoreSignaturesdomain'ini ("Exchange", chain ID1337) kullanıyordu. Kaldırıldılar. nextNonce. On-chainnextNonce[signer]sayacı artık mevcut değil. Yalnızca kullanılmış nonce bitmap'i (isNonceUsed) kaldı.- TBD olarak işaretlenmiş ana ağ separator'ları. Önceki metin, manager ve RSM ana ağ separator'larını TBD olarak listeliyordu. Üçü de sabittir ve yukarıda listelenmiştir.
HCTransferOption. Tanımlı ancak hiç etkinleştirilmedi; yukarıya bakın.
Güvenlik Hususları
- Anahtarlar: manager anahtarını bir donanım cüzdanında tutun. API cüzdanları yalnızca emirleri ve iptalleri imzalar; her sistem için ayrı anahtar kullanın.
- Nonce tekrarı: bir nonce'u asla yeniden kullanmayın. Nonce'ları off-chain olarak izleyin ve atomik şekilde artırın.
- Domain: ana ağda her zaman chain ID
999(testnet'te998) ile imzalayın ve hesapladığınız separator'ı yukarıdaki tabloyla karşılaştırın. - İmzaladığınızı doğrulayın: donanım cüzdanıyla imzalamadan önce
POST /v1/actions/{action}/typed-dataçağrısını yapın ve sonucu kendi encoder'ınızla karşılaştırın. - On-chain doğrulama nihaidir: API imzaları önceden kontrol eder, ancak Account her direktifi on-chain olarak yeniden doğrular. Bir API onayını yürütme olarak kabul etmeyin.
- Manager ve API cüzdanı: manager'lar sahipliği, API cüzdanlarını ve varlık hareketlerini kontrol eder. API cüzdanları yalnızca işlem mesajlarını imzalar. Ayrı anahtarlar kullanın.
Referanslar
- Account oluşturma ve API cüzdanı kurulumu için Onboarding
- Deploy edilmiş adresler ve direktif türleri için Kontratlara genel bakış
- Perp emir akışı için Perps
- Opsiyon emri imzalama için Kimlik Doğrulama ve İmzalama