ccxt 4.2.57 → 4.2.59

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.
Files changed (110) hide show
  1. package/CHANGELOG.md +83 -0
  2. package/README.md +4 -5
  3. package/build.sh +1 -1
  4. package/cleanup.sh +3 -0
  5. package/dist/ccxt.browser.js +772 -497
  6. package/dist/ccxt.browser.min.js +7 -7
  7. package/dist/cjs/ccxt.js +1 -1
  8. package/dist/cjs/src/alpaca.js +90 -88
  9. package/dist/cjs/src/base/Exchange.js +24 -1
  10. package/dist/cjs/src/binance.js +43 -30
  11. package/dist/cjs/src/bingx.js +15 -4
  12. package/dist/cjs/src/bitget.js +72 -57
  13. package/dist/cjs/src/bitmex.js +13 -29
  14. package/dist/cjs/src/bitrue.js +24 -15
  15. package/dist/cjs/src/blofin.js +25 -2
  16. package/dist/cjs/src/bybit.js +11 -3
  17. package/dist/cjs/src/coinbase.js +24 -14
  18. package/dist/cjs/src/currencycom.js +15 -5
  19. package/dist/cjs/src/delta.js +14 -1
  20. package/dist/cjs/src/gate.js +1 -1
  21. package/dist/cjs/src/hitbtc.js +12 -1
  22. package/dist/cjs/src/krakenfutures.js +22 -7
  23. package/dist/cjs/src/kuna.js +14 -11
  24. package/dist/cjs/src/lbank.js +1 -1
  25. package/dist/cjs/src/mexc.js +20 -20
  26. package/dist/cjs/src/okx.js +32 -2
  27. package/dist/cjs/src/phemex.js +1 -1
  28. package/dist/cjs/src/pro/alpaca.js +1 -1
  29. package/dist/cjs/src/pro/binance.js +1 -1
  30. package/dist/cjs/src/pro/bitfinex2.js +1 -1
  31. package/dist/cjs/src/pro/bitget.js +1 -1
  32. package/dist/cjs/src/pro/bitmart.js +51 -89
  33. package/dist/cjs/src/pro/bitvavo.js +1 -1
  34. package/dist/cjs/src/pro/bybit.js +1 -1
  35. package/dist/cjs/src/pro/coinex.js +1 -1
  36. package/dist/cjs/src/pro/cryptocom.js +1 -1
  37. package/dist/cjs/src/pro/deribit.js +201 -84
  38. package/dist/cjs/src/pro/gate.js +1 -1
  39. package/dist/cjs/src/pro/independentreserve.js +1 -1
  40. package/dist/cjs/src/pro/kraken.js +1 -1
  41. package/dist/cjs/src/pro/kucoinfutures.js +1 -1
  42. package/dist/cjs/src/pro/mexc.js +5 -3
  43. package/dist/cjs/src/pro/okx.js +1 -1
  44. package/dist/cjs/src/pro/whitebit.js +4 -6
  45. package/dist/cjs/src/pro/woo.js +1 -1
  46. package/dist/cjs/src/probit.js +1 -1
  47. package/dist/cjs/src/wavesexchange.js +1 -1
  48. package/dist/cjs/src/woo.js +22 -6
  49. package/js/ccxt.d.ts +3 -3
  50. package/js/ccxt.js +1 -1
  51. package/js/src/alpaca.js +90 -88
  52. package/js/src/base/Exchange.d.ts +6 -4
  53. package/js/src/base/Exchange.js +24 -1
  54. package/js/src/base/types.d.ts +9 -0
  55. package/js/src/binance.d.ts +3 -2
  56. package/js/src/binance.js +43 -30
  57. package/js/src/bingx.d.ts +3 -2
  58. package/js/src/bingx.js +15 -4
  59. package/js/src/bitget.d.ts +3 -2
  60. package/js/src/bitget.js +72 -57
  61. package/js/src/bitmex.d.ts +3 -3
  62. package/js/src/bitmex.js +13 -29
  63. package/js/src/bitrue.js +24 -15
  64. package/js/src/blofin.d.ts +3 -2
  65. package/js/src/blofin.js +25 -2
  66. package/js/src/bybit.d.ts +3 -6
  67. package/js/src/bybit.js +11 -3
  68. package/js/src/coinbase.js +24 -14
  69. package/js/src/currencycom.d.ts +3 -2
  70. package/js/src/currencycom.js +15 -5
  71. package/js/src/delta.d.ts +3 -2
  72. package/js/src/delta.js +14 -1
  73. package/js/src/gate.js +1 -1
  74. package/js/src/hitbtc.d.ts +3 -2
  75. package/js/src/hitbtc.js +12 -1
  76. package/js/src/krakenfutures.d.ts +3 -2
  77. package/js/src/krakenfutures.js +22 -7
  78. package/js/src/kuna.js +14 -11
  79. package/js/src/lbank.js +1 -1
  80. package/js/src/mexc.d.ts +3 -13
  81. package/js/src/mexc.js +20 -20
  82. package/js/src/okx.d.ts +3 -2
  83. package/js/src/okx.js +32 -2
  84. package/js/src/phemex.js +1 -1
  85. package/js/src/pro/alpaca.js +1 -1
  86. package/js/src/pro/binance.js +1 -1
  87. package/js/src/pro/bitfinex2.js +1 -1
  88. package/js/src/pro/bitget.js +1 -1
  89. package/js/src/pro/bitmart.d.ts +2 -2
  90. package/js/src/pro/bitmart.js +51 -89
  91. package/js/src/pro/bitvavo.js +1 -1
  92. package/js/src/pro/bybit.js +1 -1
  93. package/js/src/pro/coinex.js +1 -1
  94. package/js/src/pro/cryptocom.js +1 -1
  95. package/js/src/pro/deribit.d.ts +5 -0
  96. package/js/src/pro/deribit.js +202 -85
  97. package/js/src/pro/gate.js +1 -1
  98. package/js/src/pro/independentreserve.js +1 -1
  99. package/js/src/pro/kraken.js +1 -1
  100. package/js/src/pro/kucoinfutures.js +1 -1
  101. package/js/src/pro/mexc.js +6 -4
  102. package/js/src/pro/okx.js +1 -1
  103. package/js/src/pro/whitebit.js +4 -6
  104. package/js/src/pro/woo.js +1 -1
  105. package/js/src/probit.js +1 -1
  106. package/js/src/wavesexchange.js +1 -1
  107. package/js/src/woo.d.ts +3 -5
  108. package/js/src/woo.js +22 -6
  109. package/package.json +1 -1
  110. package/skip-tests.json +8 -3
@@ -110,11 +110,12 @@ export default class bitmart extends bitmartRest {
110
110
  }
111
111
  return await this.watch(url, messageHash, this.deepExtend(request, params), messageHash);
112
112
  }
113
- async subscribeMultiple(channel, type, symbols, params = {}) {
113
+ async subscribeMultiple(channel, type, symbols = undefined, params = {}) {
114
+ symbols = this.marketSymbols(symbols, type, false, true);
114
115
  const url = this.implodeHostname(this.urls['api']['ws'][type]['public']);
115
116
  const channelType = (type === 'spot') ? 'spot' : 'futures';
116
117
  const actionType = (type === 'spot') ? 'op' : 'action';
117
- const rawSubscriptions = [];
118
+ let rawSubscriptions = [];
118
119
  const messageHashes = [];
119
120
  for (let i = 0; i < symbols.length; i++) {
120
121
  const market = this.market(symbols[i]);
@@ -122,6 +123,10 @@ export default class bitmart extends bitmartRest {
122
123
  rawSubscriptions.push(message);
123
124
  messageHashes.push(channel + ':' + market['symbol']);
124
125
  }
126
+ // as an exclusion, futures "tickers" need one generic request for all symbols
127
+ if ((type !== 'spot') && (channel === 'ticker')) {
128
+ rawSubscriptions = [channelType + '/' + channel];
129
+ }
125
130
  const request = {
126
131
  'args': rawSubscriptions,
127
132
  };
@@ -324,13 +329,8 @@ export default class bitmart extends bitmartRest {
324
329
  */
325
330
  await this.loadMarkets();
326
331
  symbol = this.symbol(symbol);
327
- const market = this.market(symbol);
328
- let type = 'spot';
329
- [type, params] = this.handleMarketTypeAndParams('watchTicker', market, params);
330
- if (type === 'swap') {
331
- throw new NotSupported(this.id + ' watchTicker() does not support ' + type + ' markets. Use watchTickers() instead');
332
- }
333
- return await this.subscribe('ticker', symbol, type, params);
332
+ const tickers = await this.watchTickers([symbol], params);
333
+ return tickers[symbol];
334
334
  }
335
335
  async watchTickers(symbols = undefined, params = {}) {
336
336
  /**
@@ -344,40 +344,12 @@ export default class bitmart extends bitmartRest {
344
344
  */
345
345
  await this.loadMarkets();
346
346
  const market = this.getMarketFromSymbols(symbols);
347
- let type = 'spot';
348
- [type, params] = this.handleMarketTypeAndParams('watchTickers', market, params);
349
- const url = this.implodeHostname(this.urls['api']['ws'][type]['public']);
350
- symbols = this.marketSymbols(symbols);
351
- let messageHash = 'tickers::' + type;
352
- if (symbols !== undefined) {
353
- messageHash += '::' + symbols.join(',');
354
- }
355
- let request = undefined;
356
- let tickers = undefined;
357
- const isSpot = (type === 'spot');
358
- if (isSpot) {
359
- if (symbols === undefined) {
360
- throw new ArgumentsRequired(this.id + ' watchTickers() for ' + type + ' market type requires symbols argument to be provided');
361
- }
362
- const marketIds = this.marketIds(symbols);
363
- const finalArray = [];
364
- for (let i = 0; i < marketIds.length; i++) {
365
- finalArray.push('spot/ticker:' + marketIds[i]);
366
- }
367
- request = {
368
- 'op': 'subscribe',
369
- 'args': finalArray,
370
- };
371
- tickers = await this.watch(url, messageHash, this.deepExtend(request, params), messageHash);
372
- }
373
- else {
374
- request = {
375
- 'action': 'subscribe',
376
- 'args': ['futures/ticker'],
377
- };
378
- tickers = await this.watch(url, messageHash, this.deepExtend(request, params), messageHash);
379
- }
347
+ let marketType = undefined;
348
+ [marketType, params] = this.handleMarketTypeAndParams('watchTickers', market, params);
349
+ const ticker = await this.subscribeMultiple('ticker', marketType, symbols, params);
380
350
  if (this.newUpdates) {
351
+ const tickers = {};
352
+ tickers[ticker['symbol']] = ticker;
381
353
  return tickers;
382
354
  }
383
355
  return this.filterByArray(this.tickers, 'symbol', symbols);
@@ -853,21 +825,34 @@ export default class bitmart extends bitmartRest {
853
825
  if (data === undefined) {
854
826
  return;
855
827
  }
856
- let stored = undefined;
857
828
  let symbol = undefined;
858
- for (let i = 0; i < data.length; i++) {
859
- const trade = this.parseWsTrade(data[i]);
860
- symbol = trade['symbol'];
861
- const tradesLimit = this.safeInteger(this.options, 'tradesLimit', 1000);
862
- stored = this.safeValue(this.trades, symbol);
863
- if (stored === undefined) {
864
- stored = new ArrayCache(tradesLimit);
865
- this.trades[symbol] = stored;
829
+ const length = data.length;
830
+ const isSwap = ('group' in message);
831
+ if (isSwap) {
832
+ // in swap, chronologically decreasing: 1709536849322, 1709536848954,
833
+ const maxLen = Math.max(length - 1, 0);
834
+ for (let i = maxLen; i >= 0; i--) {
835
+ symbol = this.handleTradeLoop(data[i]);
836
+ }
837
+ }
838
+ else {
839
+ // in spot, chronologically increasing: 1709536771200, 1709536771226,
840
+ for (let i = 0; i < length; i++) {
841
+ symbol = this.handleTradeLoop(data[i]);
866
842
  }
867
- stored.append(trade);
868
843
  }
869
- const messageHash = 'trade:' + symbol;
870
- client.resolve(stored, messageHash);
844
+ client.resolve(this.trades[symbol], 'trade:' + symbol);
845
+ }
846
+ handleTradeLoop(entry) {
847
+ const trade = this.parseWsTrade(entry);
848
+ const symbol = trade['symbol'];
849
+ const tradesLimit = this.safeInteger(this.options, 'tradesLimit', 1000);
850
+ if (this.safeValue(this.trades, symbol) === undefined) {
851
+ this.trades[symbol] = new ArrayCache(tradesLimit);
852
+ }
853
+ const stored = this.trades[symbol];
854
+ stored.append(trade);
855
+ return symbol;
871
856
  }
872
857
  parseWsTrade(trade, market = undefined) {
873
858
  // spot
@@ -946,45 +931,22 @@ export default class bitmart extends bitmartRest {
946
931
  //
947
932
  const table = this.safeString(message, 'table');
948
933
  const isSpot = (table !== undefined);
949
- const data = this.safeValue(message, 'data');
950
- if (data === undefined) {
951
- return;
952
- }
934
+ let rawTickers = [];
953
935
  if (isSpot) {
954
- for (let i = 0; i < data.length; i++) {
955
- const ticker = this.parseTicker(data[i]);
956
- const symbol = ticker['symbol'];
957
- const marketId = this.safeString(ticker['info'], 'symbol');
958
- const messageHash = table + ':' + marketId;
959
- this.tickers[symbol] = ticker;
960
- client.resolve(ticker, messageHash);
961
- this.resolveMessageHashesForSymbol(client, symbol, ticker, 'tickers::');
962
- }
936
+ rawTickers = this.safeList(message, 'data', []);
963
937
  }
964
938
  else {
965
- // on each update for contract markets, single ticker is provided
966
- const ticker = this.parseWsSwapTicker(data);
967
- const symbol = this.safeString(ticker, 'symbol');
968
- this.tickers[symbol] = ticker;
969
- client.resolve(ticker, 'tickers::swap');
970
- this.resolveMessageHashesForSymbol(client, symbol, ticker, 'tickers::');
939
+ rawTickers = [this.safeValue(message, 'data', {})];
971
940
  }
972
- }
973
- resolveMessageHashesForSymbol(client, symbol, result, prexif) {
974
- const prefixSeparator = '::';
975
- const symbolsSeparator = ',';
976
- const messageHashes = this.findMessageHashes(client, prexif);
977
- for (let i = 0; i < messageHashes.length; i++) {
978
- const messageHash = messageHashes[i];
979
- const parts = messageHash.split(prefixSeparator);
980
- const length = parts.length;
981
- const symbolsString = parts[length - 1];
982
- const symbols = symbolsString.split(symbolsSeparator);
983
- if (this.inArray(symbol, symbols)) {
984
- const response = {};
985
- response[symbol] = result;
986
- client.resolve(response, messageHash);
987
- }
941
+ if (!rawTickers.length) {
942
+ return;
943
+ }
944
+ for (let i = 0; i < rawTickers.length; i++) {
945
+ const ticker = isSpot ? this.parseTicker(rawTickers[i]) : this.parseWsSwapTicker(rawTickers[i]);
946
+ const symbol = ticker['symbol'];
947
+ this.tickers[symbol] = ticker;
948
+ const messageHash = 'ticker:' + symbol;
949
+ client.resolve(ticker, messageHash);
988
950
  }
989
951
  }
990
952
  parseWsSwapTicker(ticker, market = undefined) {
@@ -1087,7 +1087,7 @@ export default class bitvavo extends bitvavoRest {
1087
1087
  return messageHash;
1088
1088
  }
1089
1089
  checkMessageHashDoesNotExist(messageHash) {
1090
- const supressMultipleWsRequestsError = this.safeValue(this.options, 'supressMultipleWsRequestsError', false);
1090
+ const supressMultipleWsRequestsError = this.safeBool(this.options, 'supressMultipleWsRequestsError', false);
1091
1091
  if (!supressMultipleWsRequestsError) {
1092
1092
  const client = this.safeValue(this.clients, this.urls['api']['ws']);
1093
1093
  if (client !== undefined) {
@@ -942,7 +942,7 @@ export default class bybit extends bybitRest {
942
942
  this.setPositionsCache(client, symbols);
943
943
  const cache = this.positions;
944
944
  const fetchPositionsSnapshot = this.handleOption('watchPositions', 'fetchPositionsSnapshot', true);
945
- const awaitPositionsSnapshot = this.safeValue('watchPositions', 'awaitPositionsSnapshot', true);
945
+ const awaitPositionsSnapshot = this.safeBool('watchPositions', 'awaitPositionsSnapshot', true);
946
946
  if (fetchPositionsSnapshot && awaitPositionsSnapshot && cache === undefined) {
947
947
  const snapshot = await client.future('fetchPositionsSnapshot');
948
948
  return this.filterBySymbolsSinceLimit(snapshot, symbols, since, limit, true);
@@ -549,7 +549,7 @@ export default class coinex extends coinexRest {
549
549
  }
550
550
  const url = this.urls['api']['ws'][type];
551
551
  const messageHash = 'ohlcv';
552
- const watchOHLCVWarning = this.safeValue(this.options, 'watchOHLCVWarning', true);
552
+ const watchOHLCVWarning = this.safeBool(this.options, 'watchOHLCVWarning', true);
553
553
  const client = this.safeValue(this.clients, url, {});
554
554
  const clientSub = this.safeValue(client, 'subscriptions', {});
555
555
  const existingSubscription = this.safeValue(clientSub, messageHash);
@@ -556,7 +556,7 @@ export default class cryptocom extends cryptocomRest {
556
556
  const client = this.client(url);
557
557
  this.setPositionsCache(client, symbols);
558
558
  const fetchPositionsSnapshot = this.handleOption('watchPositions', 'fetchPositionsSnapshot', true);
559
- const awaitPositionsSnapshot = this.safeValue('watchPositions', 'awaitPositionsSnapshot', true);
559
+ const awaitPositionsSnapshot = this.safeBool('watchPositions', 'awaitPositionsSnapshot', true);
560
560
  if (fetchPositionsSnapshot && awaitPositionsSnapshot && this.positions === undefined) {
561
561
  const snapshot = await client.future('fetchPositionsSnapshot');
562
562
  return this.filterBySymbolsSinceLimit(snapshot, symbols, since, limit, true);
@@ -9,10 +9,12 @@ export default class deribit extends deribitRest {
9
9
  watchTicker(symbol: string, params?: {}): Promise<Ticker>;
10
10
  handleTicker(client: Client, message: any): void;
11
11
  watchTrades(symbol: string, since?: Int, limit?: Int, params?: {}): Promise<Trade[]>;
12
+ watchTradesForSymbols(symbols: string[], since?: Int, limit?: Int, params?: {}): Promise<Trade[]>;
12
13
  handleTrades(client: Client, message: any): void;
13
14
  watchMyTrades(symbol?: Str, since?: Int, limit?: Int, params?: {}): Promise<Trade[]>;
14
15
  handleMyTrades(client: Client, message: any): void;
15
16
  watchOrderBook(symbol: string, limit?: Int, params?: {}): Promise<OrderBook>;
17
+ watchOrderBookForSymbols(symbols: string[], limit?: Int, params?: {}): Promise<OrderBook>;
16
18
  handleOrderBook(client: Client, message: any): void;
17
19
  cleanOrderBook(data: any): any;
18
20
  handleDelta(bookside: any, delta: any): void;
@@ -20,7 +22,10 @@ export default class deribit extends deribitRest {
20
22
  watchOrders(symbol?: Str, since?: Int, limit?: Int, params?: {}): Promise<Order[]>;
21
23
  handleOrders(client: Client, message: any): void;
22
24
  watchOHLCV(symbol: string, timeframe?: string, since?: Int, limit?: Int, params?: {}): Promise<OHLCV[]>;
25
+ watchOHLCVForSymbols(symbolsAndTimeframes: string[][], since?: Int, limit?: Int, params?: {}): Promise<import("../base/types.js").Dictionary<import("../base/types.js").Dictionary<OHLCV[]>>>;
23
26
  handleOHLCV(client: Client, message: any): void;
27
+ parseWsOHLCV(ohlcv: any, market?: any): OHLCV;
28
+ watchMultipleWrapper(channelName: string, channelDescriptor: string, symbolsArray?: any, params?: {}): Promise<any>;
24
29
  handleMessage(client: Client, message: any): void;
25
30
  handleAuthenticationMessage(client: Client, message: any): any;
26
31
  authenticate(params?: {}): Promise<any>;