계정 추상화 모드
사용자의 계정 추상화 모드는 스팟과 무기한 선물(펍) 잔고가 상호작용하는 방식과, 다양한 자산이 무기한 선물(펍) 거래의 담보로 사용되는지 여부를 결정합니다.
지원되는 모드는 다음과 같습니다:
- 통합 계정(대부분의 사용자에게 권장): 각 자산에 대해 단일 잔고를 사용합니다. 이 잔고는 해당 자산의 모든 교차 마진 포지션의 담보가 되며 해당 자산의 스팟 잔고와 통합됩니다. 예를 들어, USDC 잔고는 검증인 운영 무기한 선물(펍), XYZ 무기한 선물(펍), USDC를 호가 자산으로 하는 스팟 거래의 단일 출처입니다. USDT 스팟 잔고는 CASH 무기한 선물(펍)과 USDT를 호가 자산으로 하는 스팟 거래의 단일 출처입니다.
- 포트폴리오 마진(가장 자본 효율적): 현재 HYPE, BTC, USDC, USDT인 모든 적격 자산을 통합하는 단일 포트폴리오를 사용합니다. 자세한 내용은 포트폴리오 마진을 참조하세요.
- 수동 / 표준(마켓메이커, 대량 자동화 사용자, 배포자/빌더에게 권장): 무기한 선물(펍)과 스팟 잔고가 분리되고, DEX 잔고가 분리됩니다. 교차 마진은 각 DEX에 개별적으로 적용됩니다.
완전성을 위해 여기에 포함된, 중단된 모드가 하나 더 있습니다:
- DEX 추상화(중단됨): USDC 잔고는 기본적으로 무기한 선물(펍) 잔고가 되고, 다른 모든 담보는 기본적으로 스팟 잔고가 됩니다. 중요: HIP-3 DEX의 교차 마진은 DEX 추상화 사용자에게 직관적으로 작동하지 않습니다.
중요한 세부 사항:
- Builder Code 주소는 빌더 수수료를 적립하려면 표준 모드여야 합니다
- 포트폴리오 마진과 통합 계정은 하루 50,000개의 사용자 액션으로 제한됩니다. 표준 모드에는 이러한 제한이 없습니다.
- API 사용자의 경우, 통합 계정과 포트폴리오 마진은 모든 잔고와 보류를 스팟 클리어링하우스 상태에 표시합니다. 개별 무기한 선물(펍) dex 사용자 상태는 의미가 없습니다.
계정 추상화 모드 변경을 위한 에이전트 및 사용자 서명 액션의 예는 Python SDK와 API 문서를 참조하세요.
통합 계정 비율
청산 위험 모니터링을 위한 정확한 통합 계정 비율을 계산하려면:
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;
}