@blackcube/xgate-sdk 0.25.1 → 0.25.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.d.cts CHANGED
@@ -461,6 +461,92 @@ declare const WS_SUBSCRIPTION_LIMITS: Partial<Record<XgateEx, number>>;
461
461
  */
462
462
  declare function subscriptionLimitOf(xex: XgateEx): number | undefined;
463
463
 
464
+ /**
465
+ * COMBIEN DE BOUGIES UNE VENUE SERT PAR APPEL — uniquement ce qu'une documentation ou un SDK affirme.
466
+ *
467
+ * Le budget d'une venue se compte en APPELS, pas en bougies : dix fois plus de barres par appel, c'est dix fois
468
+ * moins d'appels ET dix fois moins d'attente cumulée. C'est le seul levier qui décide de la durée d'un backfill.
469
+ *
470
+ * **binance** — « `limit` est plafonné à 1500 par la venue **sur les deux marchés** ; au-delà, elle refuse la
471
+ * requête au lieu de tronquer » (`binance-sdk`, docblock de `getCandles`). Le plafond vaut donc pour le comptant
472
+ * comme pour le perpétuel.
473
+ *
474
+ * **bybit** — `limit [1, 1000]`, défaut **200** (doc officielle v5, `/v5/market/kline`). C'est `category` qui
475
+ * distingue comptant et perpétuel chez elle, pas la limite. ⚠️ SANS `limit` EXPLICITE, BYBIT EN REND 200, quelle
476
+ * que soit la fenêtre demandée — mesuré le 2026-08-16 : 197 bougies par appel sur les six intervalles, les
477
+ * huit cents manquantes n'étant jamais redemandées puisque le curseur avance de la fenêtre entière.
478
+ *
479
+ * **blofin** — 1440 ; la venue clampe EN SILENCE et le SDK lève au-delà (`blofin-sdk`, `getCandles`).
480
+ *
481
+ * **aster** — 1500 ; non documenté, API de forme binance.
482
+ *
483
+ * **hyperliquid** et **pacifica** n'acceptent AUCUN `limit` : leurs SDK n'envoient que `startTime`/`endTime`
484
+ * (`get-candle-snapshot.ts`, `get-candle-data.ts`). Le nombre sert alors à dimensionner la FENÊTRE demandée, pas
485
+ * à remplir un paramètre. Pour hyperliquid, la venue borne d'elle-même à ~5 000 bougies par (coin, intervalle) —
486
+ * et l'horizon que ça couvre dépend de l'activité du coin, ce n'est donc pas une durée fixe.
487
+ *
488
+ * ⚠️ UNE VENUE ABSENTE DE CETTE TABLE N'A PAS DE PLAFOND DOCUMENTÉ — ce qui n'est pas « pas de plafond ». On ne
489
+ * devine aucun chiffre : le jour où l'une d'elles s'en approche, on lit sa documentation et on l'ajoute.
490
+ */
491
+ declare const CANDLES_PER_CALL: Partial<Record<XgateEx, number>>;
492
+ /**
493
+ * Combien de bougies demander à une venue en un appel, ou `undefined` si personne ne l'a publié.
494
+ *
495
+ * ⚠️ LA CLÉ EST LA VENUE, PAS LA LIGNE DE CATALOGUE DE L'APPELANT. Un consommateur qui distingue le comptant du
496
+ * perpétuel par deux identifiants à lui (`binance` / `binance-spot`) doit résoudre vers la venue avant de
497
+ * demander : le plafond appartient à binance, pas à l'un de ses marchés. Interroger cette table avec un
498
+ * identifiant maison rendait `undefined` et faisait retomber l'appelant sur une valeur de repli — trois fois trop
499
+ * petite pour binance, deux fois pour bybit.
500
+ */
501
+ declare function candlesPerCallOf(xex: XgateEx): number | undefined;
502
+ /**
503
+ * LA CADENCE MINIMALE ENTRE DEUX APPELS, PAR VENUE — en millisecondes.
504
+ *
505
+ * ⚠️ INTERDIT DE DEVINER UN CHIFFRE ICI. Toute valeur se source dans la documentation de la venue, et la source
506
+ * s'écrit dans ce commentaire. Un throttle inventé se paie en bannissement d'IP, pas en lenteur.
507
+ *
508
+ * Ces cadences sont un PLANCHER : si la venue répond plus lentement que son throttle, c'est sa latence qui
509
+ * commande. Trois d'entre elles ont été corrigées PAR LA MESURE, jamais par confort — deux tours complets du
510
+ * 2026-08-02 ayant compté les refus venue par venue :
511
+ *
512
+ * venue avant → après refus au 1er tour refus au 2e
513
+ * pacifica 2 500 → 4 000 51 / 525 (9,7 %) 0
514
+ * lighter 600 → 1 200 126 / 1 218 (10,3 %) 0
515
+ * hyperliquid 200 → 500 17 / 1 239 (1,4 %) 39 / 708 (5,5 %) à 300 ms
516
+ *
517
+ * ⚠️ LEÇON DU CAS HYPERLIQUID : un premier réglage à 300 ms reposait sur un poids de requête SUPPOSÉ, et il a
518
+ * EMPIRÉ la situation. Une cadence ne se déduit pas d'une hypothèse sur ce que coûte un appel — elle se dérive du
519
+ * budget documenté, puis se vérifie au tour suivant.
520
+ *
521
+ * Détail des budgets :
522
+ *
523
+ * binance weight 2 par kline, budget IP 6 000 weight/min → ~3 000 req/min ; 150 ms est très en dessous.
524
+ * 429 et 418 (ban d'IP) remontés par la venue.
525
+ * bybit 600 req / 5 s en public → 150 ms reste prudent.
526
+ * hyperliquid 1 200 weight/min par IP. À 387 ms réels on tirait 155 req/min en se faisant encore refouler :
527
+ * la requête pèse donc ~8 weight et le budget est atteint vers 150 req/min. 500 ms garde 20 % de
528
+ * marge, la même que celle qui a ramené lighter et pacifica à zéro refus.
529
+ * blofin 500 req/min ET 1 500 req/5 min (docs.blofin.com). C'EST LA SECONDE QUI MORD : 300 req/min, deux
530
+ * fois plus strict — et sa sanction est d'UNE HEURE contre cinq minutes. 250 ms tient 240 req/min.
531
+ * pacifica 125 crédits / 60 s sur IP non identifiée, une kline étant un GET lourd à 3-12 crédits. La plus
532
+ * contraignante de loin, et sa pénalité s'ALLONGE si on insiste. À 4 000 ms on tire 15 req/min,
533
+ * soit 45 à 180 crédits — sous le budget pour tout coût jusqu'à 8.
534
+ * lighter ~60 requêtes pondérées/min (palier Standard), les endpoints pesant ~300. Le budget donne
535
+ * 1 000 ms tout juste ; 1 200 parce qu'un réglage COLLÉ au budget laisse un résidu de refus.
536
+ * aster 2 400 weight/min, une kline au-delà de 1 000 bougies coûtant 10 → ~240 req/min.
537
+ * paradex 1 500 req/min par IP.
538
+ * extended API lente (2 à 4 s par requête observées) — le throttle ne mord jamais.
539
+ */
540
+ declare const REST_THROTTLE_MS: Partial<Record<XgateEx, number>>;
541
+ /**
542
+ * La cadence documentée d'une venue, ou `undefined` si personne ne l'a publiée.
543
+ *
544
+ * ⚠️ LE BUDGET EST CELUI DE LA VENUE, PAS DU MARCHÉ. Une IP qui interroge le comptant ET le perpétuel de binance
545
+ * consomme UN SEUL budget : un appelant qui traite les deux en parallèle, chacun à cette cadence, tire deux fois
546
+ * plus vite que ce que la table annonce. C'est à lui de sérialiser par venue.
547
+ */
548
+ declare function restThrottleOf(xex: XgateEx): number | undefined;
549
+
464
550
  /**
465
551
  * UNE COTATION, TELLE QU'XGATE LA REND — quelle que soit la venue d'où elle vient.
466
552
  *
@@ -1729,4 +1815,4 @@ declare function expiryOf(xtras?: Record<string, unknown>): Date | undefined;
1729
1815
  */
1730
1816
  declare function isDated(xtras?: Record<string, unknown>): boolean;
1731
1817
 
1732
- export { CandlesService, CandlesStreamRegistry, CandlesStreamService, CatalogService, type Direction, type IAccountState, type IBalance, type ICandle, type ICandlesQuery, type IEntryWithProtection, type IEquityPoint, type IFundingPaid, type IMoveStop, type IMovement, type IOrder, type IPair, type IPosition, type IPrice, type IProtection, type IProtectionInput, type IProtectionLeg, type IPublicTrade, type ITarget, type ITrade, type ITradingAccess, type IWalletAccess, type IXexAccess, type IXexSpotSource, type MarketKind, type MovementKind, type MovementStatus, ORDER_STATUSES, type OrderStatus, type OrderType, PricesService, SPOT_XEXES, type Side, SpotCandlesService, SpotCatalogService, SpotPricesService, SpotWsCandlesService, TIMEFRAME_MINUTES, type TimeInForce, Timeframe, TradingService, type Unsubscribe, WALLET_XEXES, WS_SUBSCRIPTION_LIMITS, WalletService, WsCandlesService, WsTradesService, XGATE_EXCHANGES, XgateEx, XgateModule, buildLevels, buildProtection, canonicalFromBase, canonicalFromXex, expiryOf, isDated, multiplierFromXex, roundPrice, roundToStep, servesNatively, servesSpot, sourceFor, subscriptionLimitOf, timeframeMs };
1818
+ export { CANDLES_PER_CALL, CandlesService, CandlesStreamRegistry, CandlesStreamService, CatalogService, type Direction, type IAccountState, type IBalance, type ICandle, type ICandlesQuery, type IEntryWithProtection, type IEquityPoint, type IFundingPaid, type IMoveStop, type IMovement, type IOrder, type IPair, type IPosition, type IPrice, type IProtection, type IProtectionInput, type IProtectionLeg, type IPublicTrade, type ITarget, type ITrade, type ITradingAccess, type IWalletAccess, type IXexAccess, type IXexSpotSource, type MarketKind, type MovementKind, type MovementStatus, ORDER_STATUSES, type OrderStatus, type OrderType, PricesService, REST_THROTTLE_MS, SPOT_XEXES, type Side, SpotCandlesService, SpotCatalogService, SpotPricesService, SpotWsCandlesService, TIMEFRAME_MINUTES, type TimeInForce, Timeframe, TradingService, type Unsubscribe, WALLET_XEXES, WS_SUBSCRIPTION_LIMITS, WalletService, WsCandlesService, WsTradesService, XGATE_EXCHANGES, XgateEx, XgateModule, buildLevels, buildProtection, candlesPerCallOf, canonicalFromBase, canonicalFromXex, expiryOf, isDated, multiplierFromXex, restThrottleOf, roundPrice, roundToStep, servesNatively, servesSpot, sourceFor, subscriptionLimitOf, timeframeMs };
package/dist/index.d.ts CHANGED
@@ -461,6 +461,92 @@ declare const WS_SUBSCRIPTION_LIMITS: Partial<Record<XgateEx, number>>;
461
461
  */
462
462
  declare function subscriptionLimitOf(xex: XgateEx): number | undefined;
463
463
 
464
+ /**
465
+ * COMBIEN DE BOUGIES UNE VENUE SERT PAR APPEL — uniquement ce qu'une documentation ou un SDK affirme.
466
+ *
467
+ * Le budget d'une venue se compte en APPELS, pas en bougies : dix fois plus de barres par appel, c'est dix fois
468
+ * moins d'appels ET dix fois moins d'attente cumulée. C'est le seul levier qui décide de la durée d'un backfill.
469
+ *
470
+ * **binance** — « `limit` est plafonné à 1500 par la venue **sur les deux marchés** ; au-delà, elle refuse la
471
+ * requête au lieu de tronquer » (`binance-sdk`, docblock de `getCandles`). Le plafond vaut donc pour le comptant
472
+ * comme pour le perpétuel.
473
+ *
474
+ * **bybit** — `limit [1, 1000]`, défaut **200** (doc officielle v5, `/v5/market/kline`). C'est `category` qui
475
+ * distingue comptant et perpétuel chez elle, pas la limite. ⚠️ SANS `limit` EXPLICITE, BYBIT EN REND 200, quelle
476
+ * que soit la fenêtre demandée — mesuré le 2026-08-16 : 197 bougies par appel sur les six intervalles, les
477
+ * huit cents manquantes n'étant jamais redemandées puisque le curseur avance de la fenêtre entière.
478
+ *
479
+ * **blofin** — 1440 ; la venue clampe EN SILENCE et le SDK lève au-delà (`blofin-sdk`, `getCandles`).
480
+ *
481
+ * **aster** — 1500 ; non documenté, API de forme binance.
482
+ *
483
+ * **hyperliquid** et **pacifica** n'acceptent AUCUN `limit` : leurs SDK n'envoient que `startTime`/`endTime`
484
+ * (`get-candle-snapshot.ts`, `get-candle-data.ts`). Le nombre sert alors à dimensionner la FENÊTRE demandée, pas
485
+ * à remplir un paramètre. Pour hyperliquid, la venue borne d'elle-même à ~5 000 bougies par (coin, intervalle) —
486
+ * et l'horizon que ça couvre dépend de l'activité du coin, ce n'est donc pas une durée fixe.
487
+ *
488
+ * ⚠️ UNE VENUE ABSENTE DE CETTE TABLE N'A PAS DE PLAFOND DOCUMENTÉ — ce qui n'est pas « pas de plafond ». On ne
489
+ * devine aucun chiffre : le jour où l'une d'elles s'en approche, on lit sa documentation et on l'ajoute.
490
+ */
491
+ declare const CANDLES_PER_CALL: Partial<Record<XgateEx, number>>;
492
+ /**
493
+ * Combien de bougies demander à une venue en un appel, ou `undefined` si personne ne l'a publié.
494
+ *
495
+ * ⚠️ LA CLÉ EST LA VENUE, PAS LA LIGNE DE CATALOGUE DE L'APPELANT. Un consommateur qui distingue le comptant du
496
+ * perpétuel par deux identifiants à lui (`binance` / `binance-spot`) doit résoudre vers la venue avant de
497
+ * demander : le plafond appartient à binance, pas à l'un de ses marchés. Interroger cette table avec un
498
+ * identifiant maison rendait `undefined` et faisait retomber l'appelant sur une valeur de repli — trois fois trop
499
+ * petite pour binance, deux fois pour bybit.
500
+ */
501
+ declare function candlesPerCallOf(xex: XgateEx): number | undefined;
502
+ /**
503
+ * LA CADENCE MINIMALE ENTRE DEUX APPELS, PAR VENUE — en millisecondes.
504
+ *
505
+ * ⚠️ INTERDIT DE DEVINER UN CHIFFRE ICI. Toute valeur se source dans la documentation de la venue, et la source
506
+ * s'écrit dans ce commentaire. Un throttle inventé se paie en bannissement d'IP, pas en lenteur.
507
+ *
508
+ * Ces cadences sont un PLANCHER : si la venue répond plus lentement que son throttle, c'est sa latence qui
509
+ * commande. Trois d'entre elles ont été corrigées PAR LA MESURE, jamais par confort — deux tours complets du
510
+ * 2026-08-02 ayant compté les refus venue par venue :
511
+ *
512
+ * venue avant → après refus au 1er tour refus au 2e
513
+ * pacifica 2 500 → 4 000 51 / 525 (9,7 %) 0
514
+ * lighter 600 → 1 200 126 / 1 218 (10,3 %) 0
515
+ * hyperliquid 200 → 500 17 / 1 239 (1,4 %) 39 / 708 (5,5 %) à 300 ms
516
+ *
517
+ * ⚠️ LEÇON DU CAS HYPERLIQUID : un premier réglage à 300 ms reposait sur un poids de requête SUPPOSÉ, et il a
518
+ * EMPIRÉ la situation. Une cadence ne se déduit pas d'une hypothèse sur ce que coûte un appel — elle se dérive du
519
+ * budget documenté, puis se vérifie au tour suivant.
520
+ *
521
+ * Détail des budgets :
522
+ *
523
+ * binance weight 2 par kline, budget IP 6 000 weight/min → ~3 000 req/min ; 150 ms est très en dessous.
524
+ * 429 et 418 (ban d'IP) remontés par la venue.
525
+ * bybit 600 req / 5 s en public → 150 ms reste prudent.
526
+ * hyperliquid 1 200 weight/min par IP. À 387 ms réels on tirait 155 req/min en se faisant encore refouler :
527
+ * la requête pèse donc ~8 weight et le budget est atteint vers 150 req/min. 500 ms garde 20 % de
528
+ * marge, la même que celle qui a ramené lighter et pacifica à zéro refus.
529
+ * blofin 500 req/min ET 1 500 req/5 min (docs.blofin.com). C'EST LA SECONDE QUI MORD : 300 req/min, deux
530
+ * fois plus strict — et sa sanction est d'UNE HEURE contre cinq minutes. 250 ms tient 240 req/min.
531
+ * pacifica 125 crédits / 60 s sur IP non identifiée, une kline étant un GET lourd à 3-12 crédits. La plus
532
+ * contraignante de loin, et sa pénalité s'ALLONGE si on insiste. À 4 000 ms on tire 15 req/min,
533
+ * soit 45 à 180 crédits — sous le budget pour tout coût jusqu'à 8.
534
+ * lighter ~60 requêtes pondérées/min (palier Standard), les endpoints pesant ~300. Le budget donne
535
+ * 1 000 ms tout juste ; 1 200 parce qu'un réglage COLLÉ au budget laisse un résidu de refus.
536
+ * aster 2 400 weight/min, une kline au-delà de 1 000 bougies coûtant 10 → ~240 req/min.
537
+ * paradex 1 500 req/min par IP.
538
+ * extended API lente (2 à 4 s par requête observées) — le throttle ne mord jamais.
539
+ */
540
+ declare const REST_THROTTLE_MS: Partial<Record<XgateEx, number>>;
541
+ /**
542
+ * La cadence documentée d'une venue, ou `undefined` si personne ne l'a publiée.
543
+ *
544
+ * ⚠️ LE BUDGET EST CELUI DE LA VENUE, PAS DU MARCHÉ. Une IP qui interroge le comptant ET le perpétuel de binance
545
+ * consomme UN SEUL budget : un appelant qui traite les deux en parallèle, chacun à cette cadence, tire deux fois
546
+ * plus vite que ce que la table annonce. C'est à lui de sérialiser par venue.
547
+ */
548
+ declare function restThrottleOf(xex: XgateEx): number | undefined;
549
+
464
550
  /**
465
551
  * UNE COTATION, TELLE QU'XGATE LA REND — quelle que soit la venue d'où elle vient.
466
552
  *
@@ -1729,4 +1815,4 @@ declare function expiryOf(xtras?: Record<string, unknown>): Date | undefined;
1729
1815
  */
1730
1816
  declare function isDated(xtras?: Record<string, unknown>): boolean;
1731
1817
 
1732
- export { CandlesService, CandlesStreamRegistry, CandlesStreamService, CatalogService, type Direction, type IAccountState, type IBalance, type ICandle, type ICandlesQuery, type IEntryWithProtection, type IEquityPoint, type IFundingPaid, type IMoveStop, type IMovement, type IOrder, type IPair, type IPosition, type IPrice, type IProtection, type IProtectionInput, type IProtectionLeg, type IPublicTrade, type ITarget, type ITrade, type ITradingAccess, type IWalletAccess, type IXexAccess, type IXexSpotSource, type MarketKind, type MovementKind, type MovementStatus, ORDER_STATUSES, type OrderStatus, type OrderType, PricesService, SPOT_XEXES, type Side, SpotCandlesService, SpotCatalogService, SpotPricesService, SpotWsCandlesService, TIMEFRAME_MINUTES, type TimeInForce, Timeframe, TradingService, type Unsubscribe, WALLET_XEXES, WS_SUBSCRIPTION_LIMITS, WalletService, WsCandlesService, WsTradesService, XGATE_EXCHANGES, XgateEx, XgateModule, buildLevels, buildProtection, canonicalFromBase, canonicalFromXex, expiryOf, isDated, multiplierFromXex, roundPrice, roundToStep, servesNatively, servesSpot, sourceFor, subscriptionLimitOf, timeframeMs };
1818
+ export { CANDLES_PER_CALL, CandlesService, CandlesStreamRegistry, CandlesStreamService, CatalogService, type Direction, type IAccountState, type IBalance, type ICandle, type ICandlesQuery, type IEntryWithProtection, type IEquityPoint, type IFundingPaid, type IMoveStop, type IMovement, type IOrder, type IPair, type IPosition, type IPrice, type IProtection, type IProtectionInput, type IProtectionLeg, type IPublicTrade, type ITarget, type ITrade, type ITradingAccess, type IWalletAccess, type IXexAccess, type IXexSpotSource, type MarketKind, type MovementKind, type MovementStatus, ORDER_STATUSES, type OrderStatus, type OrderType, PricesService, REST_THROTTLE_MS, SPOT_XEXES, type Side, SpotCandlesService, SpotCatalogService, SpotPricesService, SpotWsCandlesService, TIMEFRAME_MINUTES, type TimeInForce, Timeframe, TradingService, type Unsubscribe, WALLET_XEXES, WS_SUBSCRIPTION_LIMITS, WalletService, WsCandlesService, WsTradesService, XGATE_EXCHANGES, XgateEx, XgateModule, buildLevels, buildProtection, candlesPerCallOf, canonicalFromBase, canonicalFromXex, expiryOf, isDated, multiplierFromXex, restThrottleOf, roundPrice, roundToStep, servesNatively, servesSpot, sourceFor, subscriptionLimitOf, timeframeMs };
package/dist/index.js CHANGED
@@ -2130,6 +2130,33 @@ XgateModule = __decorateClass([
2130
2130
  })
2131
2131
  ], XgateModule);
2132
2132
 
2133
- export { CandlesService, CandlesStreamRegistry, CandlesStreamService, CatalogService, ORDER_STATUSES, PricesService, SPOT_XEXES, SpotCandlesService, SpotCatalogService, SpotPricesService, SpotWsCandlesService, TIMEFRAME_MINUTES, Timeframe, TradingService, WALLET_XEXES, WS_SUBSCRIPTION_LIMITS, WalletService, WsCandlesService, WsTradesService, XGATE_EXCHANGES, XgateEx, XgateModule, buildLevels, buildProtection, canonicalFromBase, canonicalFromXex, expiryOf, isDated, multiplierFromXex, roundPrice, roundToStep, servesNatively, servesSpot, sourceFor, subscriptionLimitOf, timeframeMs };
2133
+ // src/helpers/rest-limits.ts
2134
+ var CANDLES_PER_CALL = {
2135
+ binance: 1500,
2136
+ bybit: 1e3,
2137
+ blofin: 1440,
2138
+ aster: 1500,
2139
+ hyperliquid: 5e3,
2140
+ pacifica: 500
2141
+ };
2142
+ function candlesPerCallOf(xex) {
2143
+ return CANDLES_PER_CALL[xex];
2144
+ }
2145
+ var REST_THROTTLE_MS = {
2146
+ binance: 150,
2147
+ bybit: 150,
2148
+ hyperliquid: 500,
2149
+ extended: 200,
2150
+ paradex: 200,
2151
+ aster: 400,
2152
+ lighter: 1200,
2153
+ blofin: 250,
2154
+ pacifica: 4e3
2155
+ };
2156
+ function restThrottleOf(xex) {
2157
+ return REST_THROTTLE_MS[xex];
2158
+ }
2159
+
2160
+ export { CANDLES_PER_CALL, CandlesService, CandlesStreamRegistry, CandlesStreamService, CatalogService, ORDER_STATUSES, PricesService, REST_THROTTLE_MS, SPOT_XEXES, SpotCandlesService, SpotCatalogService, SpotPricesService, SpotWsCandlesService, TIMEFRAME_MINUTES, Timeframe, TradingService, WALLET_XEXES, WS_SUBSCRIPTION_LIMITS, WalletService, WsCandlesService, WsTradesService, XGATE_EXCHANGES, XgateEx, XgateModule, buildLevels, buildProtection, candlesPerCallOf, canonicalFromBase, canonicalFromXex, expiryOf, isDated, multiplierFromXex, restThrottleOf, roundPrice, roundToStep, servesNatively, servesSpot, sourceFor, subscriptionLimitOf, timeframeMs };
2134
2161
  //# sourceMappingURL=index.js.map
2135
2162
  //# sourceMappingURL=index.js.map