Modalità di account abstraction
La modalità di account abstraction di un utente determina il modo in cui i saldi spot e perp interagiscono e se i vari asset sono utilizzati come collaterale per il trading di perp.
Le modalità supportate sono:
- Account unificato (consigliato per la maggior parte degli utenti): saldo unico per ciascun asset. Tale saldo funge da collaterale per tutte le posizioni a margine incrociato in quell'asset ed è unificato con il saldo spot dello stesso asset. Ad esempio, il saldo USDC è la fonte unica per i perp gestiti dai validatori, i perp XYZ e il trading spot con USDC come asset di quotazione. Il saldo spot USDT è la fonte unica per i perp CASH e il trading spot con USDT come asset di quotazione.
- Margine di portafoglio (il più efficiente in termini di capitale): portafoglio unico che unifica tutti gli asset idonei, attualmente HYPE, BTC, USDC, USDT. Per ulteriori dettagli, vedere Margine di portafoglio.
- Manuale / Standard (consigliato per market maker, utenti automatizzati ad alto volume e deployer/builder): saldi perp e spot separati, saldi DEX separati. Il margine incrociato si applica separatamente a ciascun DEX.
Esiste un'ulteriore modalità, dismessa e inclusa qui per completezza:
- Astrazione DEX (dismessa): i saldi USDC confluiscono per impostazione predefinita nel saldo perp, tutti gli altri collaterali confluiscono per impostazione predefinita nel saldo spot. IMPORTANTE: il margine incrociato sui DEX HIP-3 non si comporta in modo intuitivo per gli utenti con astrazione DEX.
Dettagli importanti:
- Gli indirizzi dei Builder Code devono essere in modalità Standard per maturare le commissioni builder
- Il margine di portafoglio e l'account unificato sono limitati a 50k azioni utente al giorno. La modalità Standard non prevede tali restrizioni.
- Per gli utenti API, l'account unificato e il margine di portafoglio mostrano tutti i saldi e gli hold nello stato del clearinghouse spot. I singoli stati utente dei perp dex non sono significativi.
Per esempi sulle azioni firmate dall'agente e dall'utente per modificare le modalità di account abstraction, vedere Python SDK e la documentazione API.
Rapporto dell'account unificato
Per calcolare il rapporto esatto dell'account unificato ai fini del monitoraggio del rischio di liquidazione:
function computeUnifiedAccountRatio(
multiverse: Record<string, { index: number; collateralToken: number }>,
perpDexStates: Array<{
clearinghouseState: {
crossMaintenanceMarginUsed: number;
assetPositions: Array<{
position: { leverage: { type: string }; marginUsed: number };
}>;
};
}>,
spotBalances: Array<{ token: number; total: number }>,
): number {
const indexToCollateralToken: Record<number, number> = {};
for (const meta of Object.values(multiverse)) {
indexToCollateralToken[meta.index] = meta.collateralToken;
}
const crossMarginByToken: Record<number, number> = {};
const isolatedMarginByToken: Record<number, number> = {};
for (let index = 0; index < perpDexStates.length; index++) {
const dex = perpDexStates[index];
const token = indexToCollateralToken[index];
if (dex === undefined || token === undefined) continue;
crossMarginByToken[token] =
(crossMarginByToken[token] ?? 0) +
dex.clearinghouseState.crossMaintenanceMarginUsed;
for (const ap of dex.clearinghouseState.assetPositions) {
if (ap.position.leverage.type === "isolated") {
isolatedMarginByToken[token] =
(isolatedMarginByToken[token] ?? 0) + ap.position.marginUsed;
}
}
}
let maxRatio = 0;
for (const [tokenStr, crossMargin] of Object.entries(crossMarginByToken)) {
const token = Number(tokenStr);
const spotTotal = spotBalances.find((b) => b.token === token)?.total ?? 0;
const isolatedMargin = isolatedMarginByToken[token] ?? 0;
const available = spotTotal - isolatedMargin;
if (available > 0) {
maxRatio = Math.max(maxRatio, crossMargin / available);
}
}
return maxRatio;
}