Bu sayfa otomatik olarak çevrilmiştir. İngilizce orijinal kanonik versiyondur. İngilizce oku →
Ana içeriğe geç

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:

  1. API cüzdanı: Account üzerinde hc_update_api_wallet ile kaydedilmiş bir adres (Account.isApiWalletActive). Emirleri ve iptalleri imzalar.
  2. Manager: Account sahibi (Account.manager). API cüzdanı değişikliklerini, varlık gönderimlerini ve hesap modu değişikliklerini imzalar.
  3. 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:

BaytAlanAnlamı
20accountAccount adresi (address)
8nonceİmzalayanın nonce değeri (uint64)
1versionAksiyon ailesi
3idAile içindeki aksiyon ID'si
kalandataİç aksiyon struct'ının abi.encode çıktısı
VersiyonAileAksiyon ID'leri
0HyperCall (HC)2 API cüzdanı güncelleme. 1 (opsiyon transferi) ayrılmıştır ve reddedilir.
1HyperLiquid (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
255Sistem1 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.

DomainnameversionİmzalayanZincirSeparator
API cüzdanıHypercallApiSign1API cüzdanı9990x462ae8a3a67da57ddd088e60be368536f992b8bf369d13e64e620c51993e5ebb
API cüzdanıHypercallApiSign1API cüzdanı9980x339bee4c00da9a5361f687797205c8d03f323659f5d9dc9e0505b9437ddee25e
ManagerHypercallManagerSign1Manager9990xc9b5b0b8b0d9d7ba716326acbf795cfe431ef960a25a8f958d6569bea2f1516e
ManagerHypercallManagerSign1Manager9980xd1f76b6138be892c14b71b0569bdb049cb44f239d34c78ef1ffaacd2466f9f18
RSMHypercallRsmSign1RSM imzalayıcı9990x3d0cae2af623c614099dbadd67a1e1457fabde576aa270a70a57e39bf338a7be
RSMHypercallRsmSign1RSM imzalayıcı9980x650b282053fb61d3fd477bdc28f6434311fe905e27cc4ca643e87e802c45938c

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​

MesajDomainİmzalayanGönderim adresiYürüttüğü işlem
HLOrderAPIAPI cüzdanıPOST /v1/tee-perp/orders/submit veya POST /v1/actions/hl_limit_orderHyperliquid limit emri
HLCancelAPIAPI cüzdanıPOST /v1/tee-perp/cancels/submit-by-oid veya POST /v1/actions/hl_cancel_by_oidoid ile iptal
HLCancelByCloidAPIAPI cüzdanıPOST /v1/tee-perp/cancels/submit veya POST /v1/actions/hl_cancel_by_cloidcloid ile iptal
HCPerpTriggerOrderAPIAPI cüzdanıPOST /v1/tee-perp/orders/submit-triggerNative tetikli emir (yalnızca TEE)
HCPerpOrderBatchAPIAPI cüzdanıPOST /v1/tee-perp/orders/submit-batchNative emir grubu (yalnızca TEE)
HCPerpLeverageChangeAPIAPI cüzdanıPOST /v1/tee-perp/leverage/submitKaldıraç güncellemesi (yalnızca TEE)
HCPerpScheduleCancelAPIAPI cüzdanıPOST /v1/tee-perp/schedule-cancel/submitDead-man switch (yalnızca TEE)
HCUpdateApiWalletManagerManagerPOST /v1/actions/hc_update_api_walletAccount API cüzdanı kaydı
HLAddApiWalletManagerManagerPOST /v1/actions/hl_add_api_walletHyperCore API cüzdanı onayı
HLSendAssetManagerManagerPOST /v1/actions/hl_send_assetAccount'tan HyperCore sendAsset
HLSetAbstractionManagerManagerPOST /v1/actions/hl_set_abstractionHyperCore hesap modu (yalnızca unified)
HCTransferOptionManagerManagerKabul edilmezAyrılmış, on-chain reddedilir
HLOrder, HLCancel, HLCancelByCloid, HLSendAssetRSMRSM imzalayıcıYalnızca sequencerAccount üzerinden kurtarma emirleri ve süpürmeler
System*RSMRSM imzalayıcıYalnızca sequencerExchange ü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ı​

  • nonce ve her uint64, uint128 veya uint256 alanı, 9007199254740991 değerine kadar JSON tam sayısı ya da ondalık string olarak gönderilir. Bu değerin üzerinde string kullanın.
  • signature, 65 baytlık 0x hex string'idir (r || s || v). v değeri 0, 1, 27 veya 28 olabilir.
  • bytes32 alanları 0x önekli 32 baytlık hex'tir. Adresler checksum'lı veya küçük harfli hex'tir.
  • Perp fiyatları ve büyüklükleri HyperCore 1e8 tam sayılarıdır; örneğin $50,000 değeri 5000000000000, 0.001 coin ise 100000 olur.

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çin true, satmak için false.
  • limitPx, sz: 1e8 ile çarpılmış fiyat ve büyüklük.
  • reduceOnly: emir yalnızca pozisyonu azaltabiliyorsa true.
  • 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ımDeğer
Typehash0xe6facb816c5f9c321054ef43c7d8fb1ec750f65d630ec39c5c18119a6f4707dd
Aksiyon struct hash0x0fd024c6bf8f132123e63a78d50008d8c39c52e5409ef6ca87a4eec8f6eabb41
Direktif struct hash0xd32948ee1f249b96124a6acdb5845d09aad8228512098598de6858d5484fe703
İmzalanacak digest0xc3c42699092fe20c7dbc4205a1027f55c28d33a682a64bd3f04e40f1d28693f5

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ımDeğer
Typehash0x23c5529f34a875b6c0d11a6dfafdd945996dbdc5fbd1bdace2c2e0cf6a253a85
Aksiyon struct hash0xa34e7bb8af0d099f9c48095924e53067bcb9b542a816445b96abebbc5646b727
Direktif struct hash0x69d560ba5ef3e88459bde7fb8252e55dbc33627373c8f0cfcf8ef0868f59e097
İmzalanacak digest0x5046aba9fb33c55ce736faf63734ea66914f3f168ff0aff2229fa6f31fa9b330

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ımDeğer
Typehash0x10cbcfa56297fc737e4defee7b7937a52978ebbe5920e584317f7f25416836f5
Aksiyon struct hash0xfa4ab6440f946a6e279d90972d71223c768c01c8a91dc22703a6448dbcb966d0
Direktif struct hash0x998efb01bb9c842eea80e8cc084b9e4e7ec13b2111790e1acbfec32e49060d9d
İmzalanacak digest0x56af82a6aa7fa50907a23c6cfe3aa556af5aa087b1157163ebf6ea0240e8d29d

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ımDeğer
Typehash0x2d3104ab255275839aad254429e4be789f64a8d16b8e3e7d5f30a0db3c887b5c
Aksiyon struct hash0x285b3186be219b92d7159419288c0dce9bc4ad7bfc9536e009ebf24bd67f434c
Direktif struct hash0xaa03e40b34b15e7e932ae827921930e7538387b596ef1040dbcc791e69021299
İmzalanacak digest0xc46aadc390b66c235af15e199e188ab23fb7f7f1b9237f6c2849c264c28d94da

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ımDeğer
Typehash0x9d4f467a44f4b0d39f234f3b91888546ce31dcbb67ce791550901b9042c38f8b
Emir dizisi hash0x13fc75fcc69bf3b4ef7cdc3a0872c3cc1cf59440c74d366055109b6bd5ea7c98
Direktif struct hash0x69d0b1131e386769823fe1ab3facbe8e6fc013f86a117cf95cb52b8ce2f274e0
İmzalanacak digest0x4b5cd34b1f254fdd9881b7674a3412807e16cade1f2ccc7a1e261482682fbd07

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ımDeğer
Typehash0xe13845f0e6c16a5e1fc56b2d11fb0972faa2ec30b01e94d58c72147fa9b6a463
Aksiyon struct hash0x0e6e271dd56192d7fb1f37ea2eaffecfbbe2d1f79cac78dce6a6930bb8cc253e
Direktif struct hash0xe04b169bbb0e20042308e5aad1036ce60eda75f484a4d6093dc60f2c2231129e
İmzalanacak digest0xb2a43487152a7cecc73d2b6b84d817a58dd02c559b05289a8d8e1b5c3d25e266

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ımDeğer
Typehash0xf21b6881e346bbf4b8d82e8ea507cf487e58dfc08776ad662591be7d6065bdfb
Aksiyon struct hash0x0a3ebfe48ef28a79beeee4d56e524f8a5280c38562efb697e7b1d63b3d475afc
Direktif struct hash0xae64a13943a6a35b33aeb3095763b855c58c2119daf71e1e3228d8acf2645e8b
İmzalanacak digest0xa01806f47299010b5963a516562be3c3b44fed4f4a9e2e56c4bb601630146cdc

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ımDeğer
Typehash0x8ebe7d19374200e5dc3ae838db74b370da95bd2b3a8aec9de85d2398dd4a9257
Aksiyon struct hash0x8b6c4a9db102e9d27c9a4069b39ba35e04948129359f0c15cd5103dd101ffce7
Direktif struct hash0x830e291835ad182f290bc3d2bff09eaf9fd33acfbe44c6ad583218cd1a8232e5
İmzalanacak digest0x06589077544af449314db1fa8c7aac2d277cce9e833a04992d88161ede24cbe8

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ımDeğer
Typehash0x71c0e0dfbddc3456015249946354324befde42b6851d1c9b26c6a29f2e0b1ac2
Aksiyon struct hash0xed32a441b0ee59c0252f5dff3411766289c9c35c19e3152b0b2b204176c2c7cd
Direktif struct hash0xb990a3dfb4e8d96243539f8758b3a55249b217542bb4112f4f88ed67ec516ed9
İmzalanacak digest0x584886d020316085de0e0dec16331b8e990558be3e8fd004c47200abbebed518

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ımDeğer
Typehash0x7feffdf7e7b191d5d27c2a209ca71c789289da73de203e99546abf9632860595
Aksiyon struct hash0x9b8c0290da19ea1069e14833023c4621a4f043354b36b4f17d4803b1fce6e656
Direktif struct hash0xa0cb8a72188a61289fc2685c29a424605e0a2ee7b7af3e8cfee10e1c75153e08
İmzalanacak digest0x7c7037f27c659a1885f744778480e6847c5d08e98fb22517265ba708b6597d10

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ımDeğer
Typehash0xcf5fddf081e5f2a9a45aa87cb1a3c42e5aa20164566b1ad2369b6b1318eac786
Aksiyon struct hash0xef6c70a3c14b9e77c710c6b3b3ee681ca270ef884bd8a64fa4064a96f3dda84e
Direktif struct hash0xdda9d0fe82b63c728c4ac42585d5998a04cabaed0f957a2cafdf31a754829c3d
İmzalanacak digest0xf49d7d8d74596e503d6a1bdfb26653533a12a5ba3816acd992d0bd4ef378f59d

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.

MesajTypehashAccount tarafından uygulanan kısıt
HLOrder0xe6facb816c5f9c321054ef43c7d8fb1ec750f65d630ec39c5c18119a6f4707ddencodedTif 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ı)
HLCancel0x23c5529f34a875b6c0d11a6dfafdd945996dbdc5fbd1bdace2c2e0cf6a253a85Yok
HLCancelByCloid0x10cbcfa56297fc737e4defee7b7937a52978ebbe5920e584317f7f25416836f5Yok
HLSendAsset0x7feffdf7e7b191d5d27c2a209ca71c789289da73de203e99546abf9632860595destination Exchange olmalıdır

RSM HLOrder test vektörü (hesap 0x1111111111111111111111111111111111111111, nonce 1760000000000, zincir 999):

AdımDeğer
Typehash0xe6facb816c5f9c321054ef43c7d8fb1ec750f65d630ec39c5c18119a6f4707dd
Aksiyon struct hash0x39b4e0699f382aaad23f04740034e7c5581ba918139d2db63fbf586cc447e7db
Direktif struct hash0xe6dde5ad6d310b5ebb83c09ec28ee5568700473b885bb483b7437dca202af4f3
İmzalanacak digest0x57afa1e810804e768c05a467aa88ede15fdceedae5aaa840adff61a613aca469

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ıİç tipTypehash
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

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. amountWei sı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 OpenZeppelin ShortString kelimesidir: ASCII sola hizalı, bayt uzunluğu son baytta (BTC için 0x42544300...03). Kanonik olmayan kodlamalar revert eder.
  • SystemStartLiquidation, açık artırma parametrelerini kaydeder ve Account'u kilitler. marginNeeded sıfırdan farklı olmalıdır.
  • SystemStopLiquidation, startTime değ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, 0 veya 4294967295 değerinde dstDex, token = 0 (USDC) ve EVM biriminin tam katı olan bir amountWei gerektirir. 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ımDeğer
Typehash0xe845f2049264182802994dae939dc8ac42d3ae543a7eeb530dd021428743f052
Aksiyon struct hash0xc69d7c6e5c36c9789d990c6316eaff3be43980583806f41f8a8e6461b7114011
Direktif struct hash0x7ffa37cef7e08d3a2dd5501a8648899d37bc09ebb25d148c124e12c5047476e1
İmzalanacak digest0x95f75e5ddb4837de3f578b8aa0d714d4b02672b18c4929e3d2dda4a266de8254

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ımDeğer
Typehash0x65aedd5af06882e1e62d752b43b72ec62a85cacf2ca59e8ec2affc57eed9d8ae
Aksiyon struct hash0x4a8b563fc94d26c1da376145d5aa5d05f996232fcf9739ed0a662650e91861b6
Direktif struct hash0x190b638f1a462469bf0d070248acfc86bbbb95ea8a9d3d97d33581c7d6bb5554
İmzalanacak digest0x86fb7c53bb7e139a4d5df7db2feae40e634efe09ea7509165d3cece75d75fce2

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ımDeğer
Typehash0x92b6a135a656e489c24fb5511684842b0ab3895c22b51e4910dee90a7d23511e
Aksiyon struct hash0x4cd6a7f0997eba84ef82eabd429a0d9ca80e55bd6d89d2e67eda9970d87ec803
Direktif struct hash0x84f18dc2577978d7890c9eb269fd787d99de37039b3a08e24745398feffbd0c5
İmzalanacak digest0xcc72c0e7829938c9ca0a4515d759f94cc96d2f24cd51a134a430f215ed5f5d4b

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ımDeğer
Typehash0xe1af98778e9cfd1d1a679bb0b64b6dc8aa3fb152ff6469d0a81a1c7eb87a4bd3
Aksiyon struct hash0x1d900a795b328bd5fa734bd6d7f74634b98ca66eb5e45322fb1ba6400564b62b
Direktif struct hash0x977b9becdd26830f2cdf70ab40f72f24490fe6ed45822d1fc8c84120e9a46f40
İmzalanacak digest0xbe65f82782b14dba42e334e32dd7dcc6bf14c96824523723a186a7381f8f12af

Vektör startTime: 1760000000 kullanır.

SystemWithdrawToken test vektörü (hesap 0x1111111111111111111111111111111111111111, nonce 1760000000000, zincir 999):

AdımDeğer
Typehash0x634b866e9a922bb846e297973c7a456e641b88f4e97493da9b222084d799c883
Aksiyon struct hash0x10bd8d4372a09e613a6b4fb7018fcccde857ebf6cc3327d6c9a3c0f81515a076
Direktif struct hash0x86680427965513c65a7a170730b9f4fb2e2b40e22cd18338cb004b6a7872ada2
İmzalanacak digest0x65cc392038decb9ccdc23b0a4a1cfbe657d3417f8cd9ebf2319b3172fb7d885c

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ımda Account__NonceAlreadyUsed ile revert eder. nextNonce yoktur; 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ışı​

  1. Off-chain: imzalayan EIP-712 digest'ini (0x1901 || domainSeparator || structHash) oluşturur ve imzalar.
  2. 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.
  3. Sequencer: Exchange.executeUserDirective(directive, signature) gönderir. Exchange, Account'un var olduğunu kontrol eder ve Account.executeUserDirective çağrısına iletir.
  4. 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.
  5. İ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ı. Processor kontratı ve ActionCaster mesaj kodlaması Exchange 0.2.0 sürümünde (Şubat 2026) kaldırıldı. Account direktifleri artık Exchange.executeUserDirective ve CoreWriter üzerinden geçer. Deploy edilmiş Exchange 0.6.1 eski giriş noktalarının hiçbirini içermez.
  • Kendi struct'larına sahip Exchange giriş noktaları. hlRequestOrder, hlRequestCancel, hlRequestCancelByCloid, hlActionSendAsset, hcActionWithdrawToken, hcActionWithdrawOption, rsmCommandRebalance ve rsmCommandRepay kaldırıldı. Yerlerine gelenler:
Kaldırılan mesajYerine gelen
HLRequestCancel (HLCancel{asset,oid} grubu artı nonce)Direktif başına bir CancelOrderByOid ile HLCancel
HLRequestCancelByCloidDirektif başına bir CancelOrderByCloid ile HLCancelByCloid
HLActionSendAsset (account, nonce, destination, srcDex, dstDex, token, amountWei)subAccount ekleyen SendAsset ile HLSendAsset
HCActionWithdrawTokenEngine çekimi onayladıktan sonra sequencer tarafından yürütülen, RSM imzalı SystemWithdrawToken
HCActionWithdrawOptionOpsiyon kredileri RSM SystemCreditOption ile yapılır; yatırımlar depositOption kullanır
RsmCommandRebalanceRSM imzalı HLOrder (yalnızca pozisyon azaltan IOC)
RsmCommandRepayExchange'e RSM imzalı HLSendAsset
  • Eski emir fonksiyonları. placeCoreOrders, cancelCoreOrders ve cancelCoreOrdersByCloid, MsgPack kodlaması ve CoreSignatures domain'ini ("Exchange", chain ID 1337) kullanıyordu. Kaldırıldılar.
  • nextNonce. On-chain nextNonce[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ı​

  1. 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.
  2. Nonce tekrarı: bir nonce'u asla yeniden kullanmayın. Nonce'ları off-chain olarak izleyin ve atomik şekilde artırın.
  3. Domain: ana ağda her zaman chain ID 999 (testnet'te 998) ile imzalayın ve hesapladığınız separator'ı yukarıdaki tabloyla karşılaştırın.
  4. İ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.
  5. 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.
  6. 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​