@blackcube/xgate-sdk 0.21.0 → 0.21.1

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/README.md CHANGED
@@ -70,6 +70,29 @@ position n'est jamais sans stop.
70
70
  | fermer sans reliquat | `closePosition` | toutes celles qui tradent |
71
71
  | relire le prix de sortie réel | `exitPrice` | toutes celles qui tradent |
72
72
 
73
+ ## Le portefeuille
74
+
75
+ `balances()` rend **le comptant et le collatéral**, chaque ligne portant sa nature :
76
+
77
+ ```typescript
78
+ const soldes = await wallet.balances(access);
79
+ soldes.filter((solde) => solde.xtras?.scope === 'perp'); // la marge
80
+ soldes.filter((solde) => solde.xtras?.scope !== 'perp'); // le comptant
81
+ ```
82
+
83
+ Les SDK de venue, eux, ne rendent que le comptant — c'est leur convention, et la documentation de
84
+ chacune le confirme. **Sans le collatéral, un portefeuille peut paraître vide** : sur un compte
85
+ pacifica dont tout le solde est en marge, les soldes comptant valent `[]`, ce qui se lit « pas
86
+ d'argent » alors qu'il y a 499 USDC. XGate lit donc aussi la marge et l'ajoute, marquée.
87
+
88
+ ```
89
+ pacifica USDC 499.204355 (perp)
90
+ hyperliquid USDC 1137.565924 (spot) + USDC 7.320954 (perp)
91
+ ```
92
+
93
+ Les deux lignes s'additionnent sans se recouvrir : le collatéral est hors comptant chez les deux
94
+ venues.
95
+
73
96
  ## Le trading
74
97
 
75
98
  **Jamais un ordre sans stop.** `openWithProtection` est la seule façon d'ouvrir une position, et
package/dist/index.cjs CHANGED
@@ -1013,8 +1013,9 @@ exports.WalletService = class WalletService {
1013
1013
  */
1014
1014
  async balances(...accesses) {
1015
1015
  return this.collect(accesses, "balances", async (access) => {
1016
- const balances = await createAccountXex(access.xex, access).account().getBalances();
1017
- return balances.map((balance) => ({
1016
+ const source = createAccountXex(access.xex, access);
1017
+ const balances = await source.account().getBalances();
1018
+ const lignes = balances.map((balance) => ({
1018
1019
  xex: access.xex,
1019
1020
  asset: balance.asset,
1020
1021
  total: balance.total,
@@ -1022,8 +1023,48 @@ exports.WalletService = class WalletService {
1022
1023
  usdValue: balance.usdValue,
1023
1024
  xtras: balance.xtras
1024
1025
  }));
1026
+ const collateral = await this.perpCollateral(source, access.xex);
1027
+ return collateral === null ? lignes : [...lignes, collateral];
1025
1028
  });
1026
1029
  }
1030
+ /**
1031
+ * LE COLLATÉRAL PERPÉTUEL, ajouté aux soldes comptant — sans lui, un portefeuille peut paraître VIDE.
1032
+ *
1033
+ * `getBalances` ne rend que le **comptant**, chez les huit venues : c'est leur convention, et la
1034
+ * documentation de chacune le dit. Or l'argent qui sert à trader n'y est pas. Sur un compte
1035
+ * pacifica dont tout le solde est en marge, `getBalances` rend `[]` — ce qui se lit « pas
1036
+ * d'argent » alors qu'il y a 499 USDC. Sur hyperliquid, le comptant s'affiche mais la marge
1037
+ * manque.
1038
+ *
1039
+ * La ligne est **marquée `scope: 'perp'`** dans `xtras` : elle s'additionne au comptant sans le
1040
+ * doubler, et un appelant qui ne veut que l'un des deux peut trancher.
1041
+ *
1042
+ * Le champ diffère par venue et n'est pas devinable — d'où la lecture explicite, venue par venue,
1043
+ * plutôt qu'un parcours à l'aveugle d'un objet `unknown`.
1044
+ */
1045
+ async perpCollateral(source, xex) {
1046
+ const facade = source;
1047
+ if (typeof facade.perp !== "function") {
1048
+ return null;
1049
+ }
1050
+ const scope = facade.perp();
1051
+ if (typeof scope.getAccountInfo !== "function") {
1052
+ return null;
1053
+ }
1054
+ const info = await scope.getAccountInfo();
1055
+ const total = info.balance ?? info.marginSummary?.accountValue;
1056
+ if (total === void 0 || Number(total) === 0) {
1057
+ return null;
1058
+ }
1059
+ return {
1060
+ xex,
1061
+ asset: "USDC",
1062
+ total,
1063
+ available: info.availableToSpend ?? info.withdrawable ?? null,
1064
+ usdValue: total,
1065
+ xtras: { scope: "perp" }
1066
+ };
1067
+ }
1027
1068
  /**
1028
1069
  * Les mouvements d'argent, triés du plus ancien au plus récent, montants **signés**.
1029
1070
  *