@syldel/hl-shared-types 0.0.17 → 0.0.19

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.d.ts CHANGED
@@ -1,2 +1,3 @@
1
1
  export * from './interfaces';
2
2
  export * from './format';
3
+ export * from './market';
package/dist/index.js CHANGED
@@ -16,3 +16,4 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./interfaces"), exports);
18
18
  __exportStar(require("./format"), exports);
19
+ __exportStar(require("./market"), exports);
@@ -46,6 +46,29 @@ export interface HLPerpMeta {
46
46
  universe: HLPerpMarketInfo[];
47
47
  /** Margin configuration tables. */
48
48
  marginTables: HLPerpMarginTableEntry[];
49
+ /**
50
+ * Index du token qui sert de collatéral à **tout** ce dex — `0` pour USDC.
51
+ *
52
+ * C'est la correspondance dex → collatéral que l'exchange publie, et la seule
53
+ * qui ne vieillit pas. Les trois dépôts en tenaient jusqu'ici une copie en
54
+ * dur (`cash → USDT`, `hyna → USDE`, sinon USDC) : elle était **juste** quand
55
+ * elle a été écrite — les marchés Dreamcash s'appelaient bien `TSLA-USDT` et
56
+ * la marge HyENA était rendue en USDE — mais ces deux dex ont été éteints en
57
+ * juin et août 2026, et elle ne couvrait de toute façon que 2 des 10 dex
58
+ * déployés. Relevé le 2026-09-30 : les quatre dex vivants (`xyz`, `para`,
59
+ * `mkts`, `io`) rendent tous `collateralToken: 0`.
60
+ *
61
+ * Un `index`, et non un symbole : c'est ce que fait le calcul officiel du
62
+ * ratio de compte unifié, qui apparie ensuite `spotBalances[].token`. Deux
63
+ * tokens peuvent porter le même nom ; aucun ne partage un index. Le symbole
64
+ * se retrouve dans `spotMeta.tokens[].name`, pour l'affichage seulement.
65
+ *
66
+ * ⚠️ Optionnel, bien que l'API le rende sur tous les dex mesurés — y compris
67
+ * le principal : la doc de `meta` ne le montre pas dans son exemple (celle de
68
+ * `metaAndAssetCtxs`, si). Une réponse qui ne le porterait pas doit se
69
+ * traiter comme une absence de réponse, jamais comme « USDC par défaut ».
70
+ */
71
+ collateralToken?: number;
49
72
  }
50
73
  /**
51
74
  * Market metadata including its index in the universe list.
@@ -0,0 +1 @@
1
+ export * from './market-name';
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./market-name"), exports);
@@ -0,0 +1,54 @@
1
+ /**
2
+ * ============================================================================
3
+ * LE NOM D'UN MARCHÉ DIT DE QUEL CATALOGUE IL RELÈVE
4
+ *
5
+ * Source : doc Hyperliquid « Asset IDs », relevée le 2026-09-30.
6
+ *
7
+ * - un perp déployé par un builder porte **toujours** un nom `{dex}:{coin}` —
8
+ * la doc écrit « always », ce n'est pas une heuristique ;
9
+ * - une paire spot se désigne par `10000 + spotInfo.index`, d'où la forme
10
+ * protocolaire `@<index>` ; seules les canoniques portent `BASE/QUOTE`.
11
+ * L'exemple HYPE de la doc (token 150, spot 107) recoupe le relevé du
12
+ * 2026-09-30 : le solde porte `token: 150`, la paire s'appelle `@107` ;
13
+ * - tout le reste est un perp du dex principal, que l'API désigne par un `dex`
14
+ * vide.
15
+ *
16
+ * Ce module vit ici, et non dans le bot ou le mobile, pour la même raison que
17
+ * `tick-and-lot` : qu'il n'en existe **qu'une seule implémentation**. Les deux
18
+ * doivent décider à l'identique de quel univers relève un marché — sans quoi
19
+ * l'un signalerait comme morte une paire que l'autre continuerait de trader,
20
+ * ou l'inverse. Une divergence silencieuse entre l'écran et le moteur est
21
+ * exactement ce qu'on ne peut pas se permettre ici.
22
+ *
23
+ * L'incident qui l'a motivé, le 2026-09-30 : `vntl:ROBOT` était configurée sur
24
+ * l'écran Bot Strategies, ratio et protections comprises, sur un dex dont les
25
+ * 15 marchés sont délistés — et rien ne le disait. Le dex principal n'est pas
26
+ * épargné : 56 de ses 234 marchés le sont aussi.
27
+ *
28
+ * ⚠️ Le piège est le spot. Sur 330 paires spot relevées, la grande majorité
29
+ * s'appelle `@N` et ne porte **ni** barre oblique **ni** deux-points. Les
30
+ * traiter par défaut comme des perps les ferait chercher — en vain — dans
31
+ * l'univers du dex principal, et déclarer inexistant un marché vivant.
32
+ * ============================================================================
33
+ */
34
+ /** Ce qu'un nom de marché désigne, du point de vue du catalogue à consulter. */
35
+ export type HLMarketKind =
36
+ /** Perp du dex principal : `BTC`, `ETH`. L'API le désigne par un `dex` vide. */
37
+ 'perp'
38
+ /** Perp déployé par un builder (HIP-3) : `vntl:ROBOT`, `xyz:AAPL`. */
39
+ | 'builderPerp'
40
+ /** Paire spot : `PURR/USDC` (canonique) ou `@107` (forme protocolaire). */
41
+ | 'spot';
42
+ /**
43
+ * Le genre de marché que ce nom désigne, ou `null` quand le nom n'en désigne
44
+ * aucun.
45
+ */
46
+ export declare function hlMarketKind(name: string): HLMarketKind | null;
47
+ /**
48
+ * Le dex perp dont relève ce marché — `''` pour le dex principal, le préfixe
49
+ * pour un HIP-3 —, ou `null` quand ce n'est pas un marché perp.
50
+ *
51
+ * C'est la valeur à passer à `meta({ dex })` : l'API accepte la chaîne vide
52
+ * pour le dex principal, et `null` dit qu'il n'y a rien à charger.
53
+ */
54
+ export declare function hlPerpDexOf(name: string): string | null;
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ /**
3
+ * ============================================================================
4
+ * LE NOM D'UN MARCHÉ DIT DE QUEL CATALOGUE IL RELÈVE
5
+ *
6
+ * Source : doc Hyperliquid « Asset IDs », relevée le 2026-09-30.
7
+ *
8
+ * - un perp déployé par un builder porte **toujours** un nom `{dex}:{coin}` —
9
+ * la doc écrit « always », ce n'est pas une heuristique ;
10
+ * - une paire spot se désigne par `10000 + spotInfo.index`, d'où la forme
11
+ * protocolaire `@<index>` ; seules les canoniques portent `BASE/QUOTE`.
12
+ * L'exemple HYPE de la doc (token 150, spot 107) recoupe le relevé du
13
+ * 2026-09-30 : le solde porte `token: 150`, la paire s'appelle `@107` ;
14
+ * - tout le reste est un perp du dex principal, que l'API désigne par un `dex`
15
+ * vide.
16
+ *
17
+ * Ce module vit ici, et non dans le bot ou le mobile, pour la même raison que
18
+ * `tick-and-lot` : qu'il n'en existe **qu'une seule implémentation**. Les deux
19
+ * doivent décider à l'identique de quel univers relève un marché — sans quoi
20
+ * l'un signalerait comme morte une paire que l'autre continuerait de trader,
21
+ * ou l'inverse. Une divergence silencieuse entre l'écran et le moteur est
22
+ * exactement ce qu'on ne peut pas se permettre ici.
23
+ *
24
+ * L'incident qui l'a motivé, le 2026-09-30 : `vntl:ROBOT` était configurée sur
25
+ * l'écran Bot Strategies, ratio et protections comprises, sur un dex dont les
26
+ * 15 marchés sont délistés — et rien ne le disait. Le dex principal n'est pas
27
+ * épargné : 56 de ses 234 marchés le sont aussi.
28
+ *
29
+ * ⚠️ Le piège est le spot. Sur 330 paires spot relevées, la grande majorité
30
+ * s'appelle `@N` et ne porte **ni** barre oblique **ni** deux-points. Les
31
+ * traiter par défaut comme des perps les ferait chercher — en vain — dans
32
+ * l'univers du dex principal, et déclarer inexistant un marché vivant.
33
+ * ============================================================================
34
+ */
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.hlMarketKind = hlMarketKind;
37
+ exports.hlPerpDexOf = hlPerpDexOf;
38
+ /**
39
+ * Le genre de marché que ce nom désigne, ou `null` quand le nom n'en désigne
40
+ * aucun.
41
+ */
42
+ function hlMarketKind(name) {
43
+ if (!name)
44
+ return null;
45
+ // Le spot se teste en premier : un nom peut porter les deux marques
46
+ // (`cash:XYZ/USDT`), et c'est alors la paire qui prime sur le dex.
47
+ if (name.includes('/') || name.startsWith('@'))
48
+ return 'spot';
49
+ const separator = name.indexOf(':');
50
+ if (separator === -1)
51
+ return 'perp';
52
+ // Un nom de builder doit porter ses deux moitiés. Les accepter amputées
53
+ // serait pire que les refuser : `:BTC` rendrait un dex vide, donc le dex
54
+ // **principal**, et ferait juger un marché contre un univers qui n'est pas
55
+ // le sien.
56
+ const dex = name.slice(0, separator);
57
+ const coin = name.slice(separator + 1);
58
+ return dex && coin ? 'builderPerp' : null;
59
+ }
60
+ /**
61
+ * Le dex perp dont relève ce marché — `''` pour le dex principal, le préfixe
62
+ * pour un HIP-3 —, ou `null` quand ce n'est pas un marché perp.
63
+ *
64
+ * C'est la valeur à passer à `meta({ dex })` : l'API accepte la chaîne vide
65
+ * pour le dex principal, et `null` dit qu'il n'y a rien à charger.
66
+ */
67
+ function hlPerpDexOf(name) {
68
+ const kind = hlMarketKind(name);
69
+ if (kind === 'perp')
70
+ return '';
71
+ if (kind === 'builderPerp')
72
+ return name.slice(0, name.indexOf(':'));
73
+ return null;
74
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@syldel/hl-shared-types",
3
- "version": "0.0.17",
3
+ "version": "0.0.19",
4
4
  "description": "Shared TypeScript interfaces and types for Hyperliquid integration.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",