@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 +1 -0
- package/dist/index.js +1 -0
- package/dist/interfaces/perp/meta.interfaces.d.ts +23 -0
- package/dist/market/index.d.ts +1 -0
- package/dist/market/index.js +17 -0
- package/dist/market/market-name.d.ts +54 -0
- package/dist/market/market-name.js +74 -0
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
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
|
+
}
|