@blackcube/xgate-sdk 0.56.2 → 0.56.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -1623,6 +1623,8 @@ exports.TradingService = class TradingService {
1623
1623
  * disent la même chose**. La forme native complète reste dans `xtras`, rien n'est perdu.
1624
1624
  *
1625
1625
  * **blofin ne l'expose pas** et lève ; les sept autres le servent.
1626
+ *
1627
+ * **hyperliquid en compte unifié lit le spot** (`unifiedAccountState`) : son état perp y vaut 0.
1626
1628
  */
1627
1629
  async accountInfo(access) {
1628
1630
  const perp = this.perpOf(access);
@@ -1632,7 +1634,42 @@ exports.TradingService = class TradingService {
1632
1634
  );
1633
1635
  }
1634
1636
  const brut = await perp.getAccountInfo();
1635
- return this.toAccountState(brut, access.xex);
1637
+ const etat = this.toAccountState(brut, access.xex);
1638
+ return access.xex === "hyperliquid" /* Hyperliquid */ ? this.unifiedAccountState(access, etat) : etat;
1639
+ }
1640
+ /**
1641
+ * HYPERLIQUID EN COMPTE UNIFIÉ — l'argent vit dans le spot, et l'état perp affiche 0.
1642
+ *
1643
+ * La doc HL : « unified account and portfolio margin show all balances and holds in the spot
1644
+ * clearinghouse state. Individual perp dex user states are not meaningful ». Lu côté perp, un
1645
+ * compte unifié de 101 USDC rend une équité de 0 — et tout appelant qui dimensionne une mise sur
1646
+ * l'équité refuse d'ouvrir (Blips, 2026-10-01 : « plafond d'engagement » sur un compte financé).
1647
+ *
1648
+ * Le mode est DEMANDÉ à HL (`getAbstraction`), jamais déduit des soldes : en mode standard
1649
+ * (`disabled`), le spot ne finance pas les perps, et le compter fausserait l'équité dans l'autre
1650
+ * sens. Hors `unifiedAccount`/`portfolioMargin`, l'état perp est rendu tel quel.
1651
+ *
1652
+ * L'équité est le total USDC du spot, le disponible ce total moins ce que HL bloque (`hold`).
1653
+ * **Le PnL latent n'y est pas ajouté** (décision Philippe, 2026-10-01) : la doc ne dit pas si le
1654
+ * total spot le contient déjà, et l'ajouter risquerait de le compter deux fois. En portfolio
1655
+ * margin, les autres actifs éligibles (HYPE, BTC, USDT) ne sont pas comptés non plus : seul l'USDC
1656
+ * finance ici. Le mode et le solde lu restent dans `xtras`.
1657
+ */
1658
+ async unifiedAccountState(access, etat) {
1659
+ const source = createAccountXex(access.xex, access);
1660
+ const abstraction = await source.native.account().getAbstraction();
1661
+ if (abstraction.mode !== "unifiedAccount" && abstraction.mode !== "portfolioMargin") {
1662
+ return etat;
1663
+ }
1664
+ const usdc = (await source.account().getBalances()).find((balance) => balance.asset === "USDC");
1665
+ const total = usdc?.total ?? "0";
1666
+ const hold = Number(usdc?.xtras?.hold ?? 0);
1667
+ return {
1668
+ ...etat,
1669
+ equity: total,
1670
+ available: String(Math.max(0, Number(total) - hold)),
1671
+ xtras: { ...etat.xtras, abstraction: abstraction.mode, spotUsdc: usdc ?? null }
1672
+ };
1636
1673
  }
1637
1674
  /**
1638
1675
  * RÈGLE LE LEVIER d'une paire, avant d'ouvrir.