Onboarding
Bu doküman, Piyasa Yapıcılar için zincir üstü hesap yaşam döngüsünü, fonlama akışlarını ve API cüzdanı yönetimini açıklamaktadır.
Genel Bakış
Hypercall bir yönetici/vekil (manager/agent) modeli kullanır:
- Manager (Yönetici): Hesabın sahibi olan EOA (genellikle ana cüzdanınız)
- Account (Hesap): Fonları tutan ve zincir üstü işlemleri gerçekleştiren minimal bir proxy kontratı (clone)
- API Wallet (API Cüzdanı): Yönetici tarafından alım satım isteklerini imzalamak üzere yetkilendirilmiş bir EOA (vekil)
Tüm zincir üstü etkileşimler Exchange kontratı üzerinden gerçekleşir.
Kontrat Adresleri
Testnet
- Exchange: ``
Ana Ağ
- Detaylar özel olarak paylaşılmaktadır.
Hesap Yaşam Döngüsü
1. Mevcut Hesapları Kontrol Edin
Yeni bir hesap oluşturmadan önce, hâlihazırda hesaplarınızın olup olmadığını kontrol edin:
function getAccounts(address manager) external view returns (ManagedAccount[] memory);
Örnek (ethers.js):
const exchange = new ethers.Contract(EXCHANGE_ADDRESS, EXCHANGE_ABI, provider);
const accounts = await exchange.getAccounts(managerAddress);
// Returns: [{ account: "0x...", manager: "0x...", apiWallets: ["0x..."] }]
2. Hesap Oluşturun
msg.sender'ı yönetici olarak ayarlayarak yeni bir hesap oluşturur:
function createAccount() external payable returns (address account);
Gereksinimler:
accountImplyönetişim (governance) tarafından ayarlanmış olmalıdırmsg.value >= getCreationDeposit()(HYPE cinsinden minimum yatırma tutarı)creationDepositUsd == 0ise, minimum yatırma tutarı gerekmez- Aksi halde,
getCreationDeposit()USD tutarını güncel spot fiyat üzerinden HYPE'a dönüştürür
Davranış:
accountImplkontratının deterministik bir minimal proxy'sini (clone) dağıtırmsg.sender'ı hesap yöneticisi olarak ayarlarmsg.value > 0ise, hesap adına HYPE yatırma işlemi gerçekleştirir- HYPE'ı
HYPE_SYSTEM_ADDRESSadresine aktarır (HyperCore köprüsü) - Yatırılan tutar 1$ değerinde HYPE veya üzerindeyse, hesap HyperCore üzerinde aktive edilir (aktivasyon ücreti düşülür)
- HYPE'ı
Örnek (ethers.js):
// Get minimum deposit (in HYPE wei)
const minDeposit = await exchange.getCreationDeposit();
// Or set to ~$1-2 worth of HYPE for activation
const depositAmount = ethers.parseEther("0.001"); // Adjust based on HYPE price
const tx = await exchange.createAccount({ value: depositAmount });
const receipt = await tx.wait();
// Account address is deterministic - can predict before creation
Hesap Adresini Önceden Tahmin Edin:
function predictNextAccount(address manager) external view returns (address);
Hesap adresini oluşturmadan önce öğrenmek için bunu kullanın (UI/UX için faydalıdır).
3. Hesap Devri
Yöneticiler hesap sahipliğini devredebilir (doğrudan çağrılamaz; oluşturma sırasında veya yönetişim aracılığıyla gerçekleşir):
event AccountTransferred(address indexed account, address indexed oldManager, address indexed newManager);
Hesap devri işlevi talep üzerine sağlanmaktadır.
API Cüzdanı Yönetimi
API cüzdanları, yönetici tarafından alım satım isteklerini imzalamak üzere yetkilendirilmiş EOA'lardır. Zincir üzerinde doğrulanan EIP-712 mesajlarını imzalarlar.
API Cüzdanı Ekleme
function addApiWallet(address account, address apiWallet) external;
Gereksinimler:
msg.sender == managers[account](hesap yöneticisi olmalıdır)apiWalletbaşka herhangi bir hesap/yönetici için aktif olmamalıdıraccount != address(0)veapiWallet != address(0)
Davranış:
apiWallet -> accountveapiWallet -> managereşlemelerini oluştururapiWallet'ı hesabın API cüzdanı kümesine eklerApiWalletAdded(account, manager, apiWallet)olayını yayınlar
Örnek:
const tx = await exchange.addApiWallet(accountAddress, apiWalletAddress);
await tx.wait();
API Cüzdanı Kaldırma
function removeApiWallet(address account, address apiWallet) external;
Gereksinimler:
msg.sender == managers[account]apiWalletbu hesap/yönetici için aktif olmalıdır
Davranış:
apiWalletiçin eşlemeleri kaldırırapiWallet'ı hesabın API cüzdanı kümesinden çıkarırApiWalletRemoved(account, manager, apiWallet)olayını yayınlar
API Cüzdanlarını Sorgulama
function getAccountByApiWallet(address apiWallet) external view returns (ManagedAccount memory);
apiWallet aktifse hesabı, yöneticiyi ve hesaba ait tüm API cüzdanlarını döndürür. Aktif değilse sıfır struct döndürür.
Örnek:
const managedAccount = await exchange.getAccountByApiWallet(apiWalletAddress);
if (managedAccount.account !== ethers.ZeroAddress) {
console.log("Account:", managedAccount.account);
console.log("Manager:", managedAccount.manager);
console.log("API Wallets:", managedAccount.apiWallets);
}
Fonlama ve Para Yatırma
Hypercall'a USDC Yatırma
function depositUsdcFor(address account, uint256 amount) external;
depositUsdcFor, Hypercall nakit bakiyeleri için doğrudan HyperEVM fonlama yoludur. Yerel HyperEVM USDC'yi msg.sender'dan Exchange kontratına aktarır, ardından Exchange bu USDC'yi Circle'ın CoreDepositWallet kontratı aracılığıyla kendi HyperCore bakiyesine yatırır.
Kimler çağırabilir:
- Herhangi bir cüzdan, router, solver veya zap kontratı bu metodu çağırabilir.
- USDC'yi
msg.senderöder. account, bakiyesi alacaklandırılacak Hypercall hesabı veya cüzdanıdır. Alacaklandırılacak hesabımsg.senderüzerinden çıkarsamayın.
Gereksinimler:
account != address(0)amount > 0msg.sender,Exchangekontratınaamountkadar yerel HyperEVM USDC için onay (approve) vermelidir- Dağıtılan
Exchangeimplementasyonu, hedef ağ için yerel HyperEVM USDC token veCoreDepositWalletadresleriyle oluşturulmuş olmalıdır
Olaylar ve alacaklandırma:
event UsdcDeposit(
address indexed account,
address indexed from,
address indexed token,
uint256 amount,
uint32 dstDex
);
Bu olay, CoreDepositWallet.depositFor çağrısından sonra Exchange tarafından yayınlanır. Backend, Hypercall nakit bakiyesini alacaklandırmadan önce bu olayı Exchange bakiyesine gelen ve gözlemlenen HyperCore yatırma işlemiyle eşleştirmelidir. Alacaklandırılan Hypercall hesabı, olaydaki açık account alanıdır.
Örnek:
const usdc = new ethers.Contract(USDC_ADDRESS, ERC20_ABI, signer);
const exchange = new ethers.Contract(EXCHANGE_ADDRESS, EXCHANGE_ABI, signer);
await usdc.approve(EXCHANGE_ADDRESS, amount);
await exchange.depositUsdcFor(accountAddress, amount);
Opsiyon Token Yatırma Fonksiyonu
function depositOption(address account, address token, uint256 amount) external;
Desteklenen Token Türleri:
- Opsiyon ERC20 Tokenları (
OptionRegistryiçinde kayıtlı):msg.value == 0(zorunludur)- Opsiyon tokenını
IOptionToken(token).burnFrom(msg.sender, amount)aracılığıyla yakar (burn) Deposit(account, msg.sender, token, amount)olayını yayınlar- RSM indeksleyicisi olayı yakalar ve hesabın opsiyon pozisyonunu alacaklandırır
Gereksinimler:
accountkayıtlı bir Hypercall hesabı olmalıdıroptionRegistry != address(0)(ayarlanmış olmalıdır)msg.sender,Exchangekontratınaamountiçin onay vermiş olmalıdır
Örnek (opsiyon token yatırma):
const option = new ethers.Contract(OPTION_TOKEN_ADDRESS, ERC20_ABI, signer);
const exchange = new ethers.Contract(EXCHANGE_ADDRESS, EXCHANGE_ABI, signer);
await option.approve(EXCHANGE_ADDRESS, amount);
await exchange.depositOption(accountAddress, OPTION_TOKEN_ADDRESS, amount);
Hesaptan Transfer
Yöneticiler, hesaplarından HyperEVM üzerindeki herhangi bir alıcıya token aktarabilir:
function transferFromAccount(address account, address token, address recipient, uint256 amount) external;
Gereksinimler:
msg.sender == managers[account]recipient != address(0)
Kullanım Senaryoları:
- Hesap tarafından başlatılan HyperCore -> HyperEVM transferlerini tamamlamak
- Hesaptan fon kurtarmak
- Farklı bir adrese para çekmek
Örnek:
await exchange.transferFromAccount(
accountAddress,
tokenAddress,
recipientAddress,
amount
);
Zincir Dışı API ile Entegrasyon
Bir hesap oluşturulup bir API cüzdanı eklendikten sonra:
- Zincir dışı API kimlik doğrulaması: EIP-712 mesajlarını imzalamak için API cüzdanının özel anahtarını kullanın (bkz. Authentication)
- Zincir üstü doğrulama: RSM Sequencer, imzalı isteğinizle birlikte
Exchange.hlRequestOrder(veya benzeri) fonksiyonunu çağırır - Yürütme: Exchange imzayı doğrular, API cüzdanını kurtarır (recover), hesabınızla eşleştirir ve zincir üstü işlemleri gerçekleştirir
Ayrıca Bakınız:
- Zincir dışı API kimlik doğrulaması için Authentication
Olaylar
event AccountTransferred(address indexed account, address indexed oldManager, address indexed newManager);
event ApiWalletAdded(address indexed account, address indexed manager, address indexed apiWallet);
event ApiWalletRemoved(address indexed account, address indexed manager, address indexed apiWallet);
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);
Hatalar
Tüm hatalar IExchangeBase.sol içinde tanımlanmıştır:
Exchange__AccountManagerNotSet(address account): Hesap mevcut değilExchange__ApiWalletAlreadyActive(address apiWallet): API cüzdanı zaten kullanımdaExchange__ApiWalletNotActive(address apiWallet): API cüzdanı bulunamadıExchange__CreationDepositNotMet(uint256 expected): Yetersizmsg.valueExchange__TokenNotSupported(address token): Token yatırma için desteklenmiyorExchange__MsgValueIncorrect(uint256 expected):msg.valueuyuşmazlığıExchange__NotManager(address account, address notManager): Çağıran yönetici değil
Güvenlik Hususları
-
Yönetici Anahtar Güvenliği: Yönetici anahtarı, hesap sahipliğini ve API cüzdanı yönetimini kontrol eder. Güvenli bir şekilde saklayın (donanım cüzdanı önerilir).
-
API Cüzdanı Anahtar Güvenliği: API cüzdanı anahtarları alım satım isteklerini imzalar. Her hesap/ortam için ayrı anahtarlar kullanın. Düzenli olarak yenileyin.
-
Nonce Yönetimi: Her imzalayıcının (API cüzdanı, yönetici, RSM) ayrı bir nonce alanı vardır. Tekrar (replay) saldırılarını önlemek için nonce'ları zincir dışında takip edin.
-
Hesap Aktivasyonu: Hesapların perp işlemleri yapabilmesi için önce HyperCore üzerinde aktive edilmesi gerekir (1$ değerinde veya üzeri HYPE yatırma). Aktivasyon durumunu HyperCore API üzerinden kontrol edin.
-
Deterministik Adresler: Hesap adresleri, yönetici adresine ve oluşturma sayısına göre deterministiktir. Adresleri oluşturmadan önce öğrenmek için
predictNextAccountfonksiyonunu kullanın.