ccxt 4.3.66 → 4.3.68

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 (55) hide show
  1. package/README.md +3 -3
  2. package/dist/ccxt.browser.min.js +2 -2
  3. package/dist/cjs/ccxt.js +1 -1
  4. package/dist/cjs/src/base/Exchange.js +6 -4
  5. package/dist/cjs/src/base/functions/type.js +2 -2
  6. package/dist/cjs/src/bingx.js +478 -159
  7. package/dist/cjs/src/bitget.js +4 -2
  8. package/dist/cjs/src/bithumb.js +61 -17
  9. package/dist/cjs/src/pro/krakenfutures.js +7 -6
  10. package/dist/cjs/src/pro/okx.js +17 -4
  11. package/js/ccxt.d.ts +1 -1
  12. package/js/ccxt.js +1 -1
  13. package/js/src/abstract/bingx.d.ts +7 -0
  14. package/js/src/base/Exchange.d.ts +14 -13
  15. package/js/src/base/Exchange.js +6 -4
  16. package/js/src/base/functions/type.js +2 -2
  17. package/js/src/bingx.d.ts +2 -0
  18. package/js/src/bingx.js +478 -159
  19. package/js/src/bitget.js +4 -2
  20. package/js/src/bithumb.js +61 -17
  21. package/js/src/pro/bitget.d.ts +1 -1
  22. package/js/src/pro/bybit.d.ts +1 -1
  23. package/js/src/pro/coinone.d.ts +1 -1
  24. package/js/src/pro/currencycom.d.ts +1 -1
  25. package/js/src/pro/hollaex.d.ts +1 -1
  26. package/js/src/pro/hyperliquid.d.ts +1 -1
  27. package/js/src/pro/krakenfutures.js +7 -6
  28. package/js/src/pro/kucoin.d.ts +1 -1
  29. package/js/src/pro/kucoinfutures.d.ts +1 -1
  30. package/js/src/pro/mexc.d.ts +1 -1
  31. package/js/src/pro/okcoin.d.ts +1 -1
  32. package/js/src/pro/okx.d.ts +2 -2
  33. package/js/src/pro/okx.js +18 -5
  34. package/js/src/pro/oxfun.d.ts +1 -1
  35. package/js/src/pro/p2b.d.ts +1 -1
  36. package/js/src/pro/poloniex.d.ts +1 -1
  37. package/js/src/pro/whitebit.d.ts +1 -1
  38. package/package.json +1 -1
  39. package/dist/cjs/src/abstract/bittrex.js +0 -9
  40. package/dist/cjs/src/bittrex.js +0 -2308
  41. package/dist/cjs/src/pro/bittrex.js +0 -959
  42. package/js/src/bittrex.d.ts +0 -97
  43. package/js/src/bittrex.js +0 -2309
  44. package/js/src/coinbaseprime.d.ts +0 -4
  45. package/js/src/coinbaseprime.js +0 -32
  46. package/js/src/pro/bittrex.d.ts +0 -69
  47. package/js/src/pro/bittrex.js +0 -960
  48. package/js/src/pro/coinbaseprime.d.ts +0 -4
  49. package/js/src/pro/coinbaseprime.js +0 -33
  50. package/js/src/pro/huobipro.d.ts +0 -4
  51. package/js/src/pro/huobipro.js +0 -17
  52. package/js/src/pro/mexc3.d.ts +0 -4
  53. package/js/src/pro/mexc3.js +0 -17
  54. package/js/src/pro/okex.d.ts +0 -4
  55. package/js/src/pro/okex.js +0 -17
package/js/src/bitget.js CHANGED
@@ -5208,8 +5208,10 @@ export default class bitget extends Exchange {
5208
5208
  response = JSON.parse(response);
5209
5209
  }
5210
5210
  const data = this.safeDict(response, 'data');
5211
- if ((data !== undefined) && !Array.isArray(data)) {
5212
- return this.parseOrder(data, market);
5211
+ if ((data !== undefined)) {
5212
+ if (!Array.isArray(data)) {
5213
+ return this.parseOrder(data, market);
5214
+ }
5213
5215
  }
5214
5216
  const dataList = this.safeList(response, 'data', []);
5215
5217
  const first = this.safeDict(dataList, 0, {});
package/js/src/bithumb.js CHANGED
@@ -206,17 +206,57 @@ export default class bithumb extends Exchange {
206
206
  * @returns {object[]} an array of objects representing market data
207
207
  */
208
208
  const result = [];
209
- const quoteCurrencies = this.safeValue(this.options, 'quoteCurrencies', {});
209
+ const quoteCurrencies = this.safeDict(this.options, 'quoteCurrencies', {});
210
210
  const quotes = Object.keys(quoteCurrencies);
211
+ const promises = [];
211
212
  for (let i = 0; i < quotes.length; i++) {
212
- const quote = quotes[i];
213
- const quoteId = quote;
214
- const extension = this.safeValue(quoteCurrencies, quote, {});
215
213
  const request = {
216
- 'quoteId': quoteId,
214
+ 'quoteId': quotes[i],
217
215
  };
218
- const response = await this.publicGetTickerALLQuoteId(this.extend(request, params));
219
- const data = this.safeValue(response, 'data');
216
+ promises.push(this.publicGetTickerALLQuoteId(this.extend(request, params)));
217
+ //
218
+ // {
219
+ // "status": "0000",
220
+ // "data": {
221
+ // "ETH": {
222
+ // "opening_price": "0.05153399",
223
+ // "closing_price": "0.05145144",
224
+ // "min_price": "0.05145144",
225
+ // "max_price": "0.05160781",
226
+ // "units_traded": "6.541124172077830855",
227
+ // "acc_trade_value": "0.33705472498492329997697755",
228
+ // "prev_closing_price": "0.0515943",
229
+ // "units_traded_24H": "43.368879902677400513",
230
+ // "acc_trade_value_24H": "2.24165339555398079994373342",
231
+ // "fluctate_24H": "-0.00018203",
232
+ // "fluctate_rate_24H": "-0.35"
233
+ // },
234
+ // "XRP": {
235
+ // "opening_price": "0.00000918",
236
+ // "closing_price": "0.0000092",
237
+ // "min_price": "0.00000918",
238
+ // "max_price": "0.0000092",
239
+ // "units_traded": "6516.949363",
240
+ // "acc_trade_value": "0.0598792533602796",
241
+ // "prev_closing_price": "0.00000916",
242
+ // "units_traded_24H": "229161.50354738",
243
+ // "acc_trade_value_24H": "2.0446589371637117",
244
+ // "fluctate_24H": "0.00000049",
245
+ // "fluctate_rate_24H": "5.63"
246
+ // },
247
+ // ...
248
+ // "date": "1721675913145"
249
+ // }
250
+ // }
251
+ //
252
+ }
253
+ const results = await Promise.all(promises);
254
+ for (let i = 0; i < quotes.length; i++) {
255
+ const quote = quotes[i];
256
+ const quoteId = quote;
257
+ const response = results[i];
258
+ const data = this.safeDict(response, 'data');
259
+ const extension = this.safeDict(quoteCurrencies, quote, {});
220
260
  const currencyIds = Object.keys(data);
221
261
  for (let j = 0; j < currencyIds.length; j++) {
222
262
  const currencyId = currencyIds[j];
@@ -285,7 +325,7 @@ export default class bithumb extends Exchange {
285
325
  }
286
326
  parseBalance(response) {
287
327
  const result = { 'info': response };
288
- const balances = this.safeValue(response, 'data');
328
+ const balances = this.safeDict(response, 'data');
289
329
  const codes = Object.keys(this.currencies);
290
330
  for (let i = 0; i < codes.length; i++) {
291
331
  const code = codes[i];
@@ -356,7 +396,7 @@ export default class bithumb extends Exchange {
356
396
  // }
357
397
  // }
358
398
  //
359
- const data = this.safeValue(response, 'data', {});
399
+ const data = this.safeDict(response, 'data', {});
360
400
  const timestamp = this.safeInteger(data, 'timestamp');
361
401
  return this.parseOrderBook(data, symbol, timestamp, 'bids', 'asks', 'price', 'quantity');
362
402
  }
@@ -420,15 +460,19 @@ export default class bithumb extends Exchange {
420
460
  */
421
461
  await this.loadMarkets();
422
462
  const result = {};
423
- const quoteCurrencies = this.safeValue(this.options, 'quoteCurrencies', {});
463
+ const quoteCurrencies = this.safeDict(this.options, 'quoteCurrencies', {});
424
464
  const quotes = Object.keys(quoteCurrencies);
465
+ const promises = [];
425
466
  for (let i = 0; i < quotes.length; i++) {
426
- const quote = quotes[i];
427
- const quoteId = quote;
428
467
  const request = {
429
- 'quoteId': quoteId,
468
+ 'quoteId': quotes[i],
430
469
  };
431
- const response = await this.publicGetTickerALLQuoteId(this.extend(request, params));
470
+ promises.push(this.publicGetTickerALLQuoteId(this.extend(request, params)));
471
+ }
472
+ const responses = await Promise.all(promises);
473
+ for (let i = 0; i < quotes.length; i++) {
474
+ const quote = quotes[i];
475
+ const response = responses[i];
432
476
  //
433
477
  // {
434
478
  // "status":"0000",
@@ -450,7 +494,7 @@ export default class bithumb extends Exchange {
450
494
  // }
451
495
  // }
452
496
  //
453
- const data = this.safeValue(response, 'data', {});
497
+ const data = this.safeDict(response, 'data', {});
454
498
  const timestamp = this.safeInteger(data, 'date');
455
499
  const tickers = this.omit(data, 'date');
456
500
  const currencyIds = Object.keys(tickers);
@@ -835,7 +879,7 @@ export default class bithumb extends Exchange {
835
879
  // }
836
880
  //
837
881
  const timestamp = this.safeIntegerProduct(order, 'order_date', 0.001);
838
- const sideProperty = this.safeValue2(order, 'type', 'side');
882
+ const sideProperty = this.safeString2(order, 'type', 'side');
839
883
  const side = (sideProperty === 'bid') ? 'buy' : 'sell';
840
884
  const status = this.parseOrderStatus(this.safeString(order, 'order_status'));
841
885
  const price = this.safeString2(order, 'order_price', 'price');
@@ -866,7 +910,7 @@ export default class bithumb extends Exchange {
866
910
  symbol = market['symbol'];
867
911
  }
868
912
  const id = this.safeString(order, 'order_id');
869
- const rawTrades = this.safeValue(order, 'contract', []);
913
+ const rawTrades = this.safeList(order, 'contract', []);
870
914
  return this.safeOrder({
871
915
  'info': order,
872
916
  'id': id,
@@ -43,7 +43,7 @@ export default class bitget extends bitgetRest {
43
43
  handleAuthenticate(client: Client, message: any): void;
44
44
  handleErrorMessage(client: Client, message: any): boolean;
45
45
  handleMessage(client: Client, message: any): void;
46
- ping(client: any): string;
46
+ ping(client: Client): string;
47
47
  handlePong(client: Client, message: any): any;
48
48
  handleSubscriptionStatus(client: Client, message: any): any;
49
49
  }
@@ -46,7 +46,7 @@ export default class bybit extends bybitRest {
46
46
  authenticate(url: any, params?: {}): Promise<any>;
47
47
  handleErrorMessage(client: Client, message: any): boolean;
48
48
  handleMessage(client: Client, message: any): void;
49
- ping(client: any): {
49
+ ping(client: Client): {
50
50
  req_id: any;
51
51
  op: string;
52
52
  };
@@ -14,7 +14,7 @@ export default class coinone extends coinoneRest {
14
14
  parseWsTrade(trade: Dict, market?: Market): Trade;
15
15
  handleErrorMessage(client: Client, message: any): boolean;
16
16
  handleMessage(client: Client, message: any): void;
17
- ping(client: any): {
17
+ ping(client: Client): {
18
18
  request_type: string;
19
19
  };
20
20
  handlePong(client: Client, message: any): any;
@@ -3,7 +3,7 @@ import type { Int, OrderBook, Trade, Ticker, OHLCV, Balances } from '../base/typ
3
3
  import Client from '../base/ws/Client.js';
4
4
  export default class currencycom extends currencycomRest {
5
5
  describe(): any;
6
- ping(client: any): {
6
+ ping(client: Client): {
7
7
  destination: string;
8
8
  correlationId: any;
9
9
  payload: {};
@@ -17,7 +17,7 @@ export default class hollaex extends hollaexRest {
17
17
  watchPrivate(messageHash: any, params?: {}): Promise<any>;
18
18
  handleErrorMessage(client: Client, message: any): any;
19
19
  handleMessage(client: Client, message: any): void;
20
- ping(client: any): {
20
+ ping(client: Client): {
21
21
  op: string;
22
22
  };
23
23
  handlePong(client: Client, message: any): any;
@@ -19,7 +19,7 @@ export default class hyperliquid extends hyperliquidRest {
19
19
  handleOrder(client: Client, message: any): void;
20
20
  handleErrorMessage(client: Client, message: any): boolean;
21
21
  handleMessage(client: Client, message: any): void;
22
- ping(client: any): {
22
+ ping(client: Client): {
23
23
  method: string;
24
24
  };
25
25
  handlePong(client: Client, message: any): any;
@@ -79,17 +79,17 @@ export default class krakenfutures extends krakenfuturesRest {
79
79
  const url = this.urls['api']['ws'];
80
80
  const messageHash = 'challenge';
81
81
  const client = this.client(url);
82
- let future = this.safeValue(client.subscriptions, messageHash);
83
- if (future === undefined) {
82
+ const future = client.future(messageHash);
83
+ const authenticated = this.safeValue(client.subscriptions, messageHash);
84
+ if (authenticated === undefined) {
84
85
  const request = {
85
86
  'event': 'challenge',
86
87
  'api_key': this.apiKey,
87
88
  };
88
89
  const message = this.extend(request, params);
89
- future = await this.watch(url, messageHash, message, messageHash);
90
- client.subscriptions[messageHash] = future;
90
+ this.watch(url, messageHash, message, messageHash);
91
91
  }
92
- return future;
92
+ return await future;
93
93
  }
94
94
  async watchOrderBookForSymbols(symbols, limit = undefined, params = {}) {
95
95
  /**
@@ -1575,7 +1575,8 @@ export default class krakenfutures extends krakenfuturesRest {
1575
1575
  const signature = this.hmac(hashedChallenge, base64Secret, sha512, 'base64');
1576
1576
  this.options['challenge'] = challenge;
1577
1577
  this.options['signedChallenge'] = signature;
1578
- client.resolve(message, messageHash);
1578
+ const future = this.safeValue(client.futures, messageHash);
1579
+ future.resolve(true);
1579
1580
  }
1580
1581
  else {
1581
1582
  const error = new AuthenticationError(this.id + ' ' + this.json(message));
@@ -39,7 +39,7 @@ export default class kucoin extends kucoinRest {
39
39
  watchBalance(params?: {}): Promise<Balances>;
40
40
  handleBalance(client: Client, message: any): void;
41
41
  handleSubject(client: Client, message: any): void;
42
- ping(client: any): {
42
+ ping(client: Client): {
43
43
  id: any;
44
44
  type: string;
45
45
  };
@@ -42,7 +42,7 @@ export default class kucoinfutures extends kucoinfuturesRest {
42
42
  fetchBalanceSnapshot(client: any, message: any): Promise<void>;
43
43
  handleSubject(client: Client, message: any): void;
44
44
  getMessageHash(elementName: string, symbol?: Str): string;
45
- ping(client: any): {
45
+ ping(client: Client): {
46
46
  id: any;
47
47
  type: string;
48
48
  };
@@ -37,7 +37,7 @@ export default class mexc extends mexcRest {
37
37
  handlePong(client: Client, message: any): any;
38
38
  handleSubscriptionStatus(client: Client, message: any): void;
39
39
  handleMessage(client: Client, message: any): void;
40
- ping(client: any): {
40
+ ping(client: Client): {
41
41
  method: string;
42
42
  };
43
43
  }
@@ -23,7 +23,7 @@ export default class okcoin extends okcoinRest {
23
23
  handleBalance(client: Client, message: any): void;
24
24
  handleSubscriptionStatus(client: Client, message: any): any;
25
25
  handleAuthenticate(client: Client, message: any): any;
26
- ping(client: any): string;
26
+ ping(client: Client): string;
27
27
  handlePong(client: Client, message: any): any;
28
28
  handleErrorMessage(client: Client, message: any): any;
29
29
  handleMessage(client: Client, message: any): void;
@@ -28,7 +28,7 @@ export default class okx extends okxRest {
28
28
  watchOrderBookForSymbols(symbols: string[], limit?: Int, params?: {}): Promise<OrderBook>;
29
29
  handleDelta(bookside: any, delta: any): void;
30
30
  handleDeltas(bookside: any, deltas: any): void;
31
- handleOrderBookMessage(client: Client, message: any, orderbook: any, messageHash: any): any;
31
+ handleOrderBookMessage(client: Client, message: any, orderbook: any, messageHash: any, market?: any): any;
32
32
  handleOrderBook(client: Client, message: any): any;
33
33
  authenticate(params?: {}): Promise<any>;
34
34
  watchBalance(params?: {}): Promise<Balances>;
@@ -50,7 +50,7 @@ export default class okx extends okxRest {
50
50
  handleCancelAllOrders(client: Client, message: any): void;
51
51
  handleSubscriptionStatus(client: Client, message: any): any;
52
52
  handleAuthenticate(client: Client, message: any): void;
53
- ping(client: any): string;
53
+ ping(client: Client): string;
54
54
  handlePong(client: Client, message: any): any;
55
55
  handleErrorMessage(client: Client, message: any): any;
56
56
  handleMessage(client: Client, message: any): void;
package/js/src/pro/okx.js CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
  // ---------------------------------------------------------------------------
8
8
  import okxRest from '../okx.js';
9
- import { ArgumentsRequired, BadRequest, ExchangeError, ChecksumError, AuthenticationError } from '../base/errors.js';
9
+ import { ArgumentsRequired, BadRequest, ExchangeError, ChecksumError, AuthenticationError, InvalidNonce } from '../base/errors.js';
10
10
  import { ArrayCache, ArrayCacheByTimestamp, ArrayCacheBySymbolById, ArrayCacheBySymbolBySide } from '../base/ws/Cache.js';
11
11
  import { sha256 } from '../static_dependencies/noble-hashes/sha256.js';
12
12
  // ---------------------------------------------------------------------------
@@ -897,7 +897,7 @@ export default class okx extends okxRest {
897
897
  this.handleDelta(bookside, deltas[i]);
898
898
  }
899
899
  }
900
- handleOrderBookMessage(client, message, orderbook, messageHash) {
900
+ handleOrderBookMessage(client, message, orderbook, messageHash, market = undefined) {
901
901
  //
902
902
  // {
903
903
  // "asks": [
@@ -912,6 +912,9 @@ export default class okx extends okxRest {
912
912
  // ],
913
913
  // "instId": "BTC-USDT",
914
914
  // "ts": "1626537446491"
915
+ // "checksum": -855196043,
916
+ // "prevSeqId": 123456,
917
+ // "seqId": 123457
915
918
  // }
916
919
  //
917
920
  const asks = this.safeValue(message, 'asks', []);
@@ -921,9 +924,12 @@ export default class okx extends okxRest {
921
924
  this.handleDeltas(storedAsks, asks);
922
925
  this.handleDeltas(storedBids, bids);
923
926
  const marketId = this.safeString(message, 'instId');
924
- const symbol = this.safeSymbol(marketId);
927
+ const symbol = this.safeSymbol(marketId, market);
925
928
  const checksum = this.handleOption('watchOrderBook', 'checksum', true);
929
+ const seqId = this.safeInteger(message, 'seqId');
926
930
  if (checksum) {
931
+ const prevSeqId = this.safeInteger(message, 'prevSeqId');
932
+ const nonce = orderbook['nonce'];
927
933
  const asksLength = storedAsks.length;
928
934
  const bidsLength = storedBids.length;
929
935
  const payloadArray = [];
@@ -940,14 +946,21 @@ export default class okx extends okxRest {
940
946
  const payload = payloadArray.join(':');
941
947
  const responseChecksum = this.safeInteger(message, 'checksum');
942
948
  const localChecksum = this.crc32(payload, true);
949
+ let error = undefined;
950
+ if (prevSeqId !== -1 && nonce !== prevSeqId) {
951
+ error = new InvalidNonce(this.id + ' watchOrderBook received invalid nonce');
952
+ }
943
953
  if (responseChecksum !== localChecksum) {
944
- const error = new ChecksumError(this.id + ' ' + this.orderbookChecksumMessage(symbol));
954
+ error = new ChecksumError(this.id + ' ' + this.orderbookChecksumMessage(symbol));
955
+ }
956
+ if (error !== undefined) {
945
957
  delete client.subscriptions[messageHash];
946
958
  delete this.orderbooks[symbol];
947
959
  client.reject(error, messageHash);
948
960
  }
949
961
  }
950
962
  const timestamp = this.safeInteger(message, 'ts');
963
+ orderbook['nonce'] = seqId;
951
964
  orderbook['timestamp'] = timestamp;
952
965
  orderbook['datetime'] = this.iso8601(timestamp);
953
966
  return orderbook;
@@ -1069,7 +1082,7 @@ export default class okx extends okxRest {
1069
1082
  const orderbook = this.orderbooks[symbol];
1070
1083
  for (let i = 0; i < data.length; i++) {
1071
1084
  const update = data[i];
1072
- this.handleOrderBookMessage(client, update, orderbook, messageHash);
1085
+ this.handleOrderBookMessage(client, update, orderbook, messageHash, market);
1073
1086
  client.resolve(orderbook, messageHash);
1074
1087
  }
1075
1088
  }
@@ -32,7 +32,7 @@ export default class oxfun extends oxfunRest {
32
32
  cancelOrdersWs(ids: string[], symbol?: Str, params?: {}): Promise<any>;
33
33
  authenticate(params?: {}): Promise<any>;
34
34
  handleAuthenticationMessage(client: Client, message: any): void;
35
- ping(client: any): string;
35
+ ping(client: Client): string;
36
36
  handlePong(client: Client, message: any): any;
37
37
  handleMessage(client: Client, message: any): void;
38
38
  }
@@ -14,7 +14,7 @@ export default class p2b extends p2bRest {
14
14
  handleOrderBook(client: Client, message: any): void;
15
15
  handleMessage(client: Client, message: any): void;
16
16
  handleErrorMessage(client: Client, message: any): boolean;
17
- ping(client: any): {
17
+ ping(client: Client): {
18
18
  method: string;
19
19
  params: any[];
20
20
  id: number;
@@ -36,7 +36,7 @@ export default class poloniex extends poloniexRest {
36
36
  handleMessage(client: Client, message: any): void;
37
37
  handleErrorMessage(client: Client, message: any): boolean;
38
38
  handleAuthenticate(client: Client, message: any): any;
39
- ping(client: any): {
39
+ ping(client: Client): {
40
40
  event: string;
41
41
  };
42
42
  }
@@ -31,7 +31,7 @@ export default class whitebit extends whitebitRest {
31
31
  handleMessage(client: Client, message: any): void;
32
32
  handleSubscriptionStatus(client: Client, message: any, id: any): void;
33
33
  handlePong(client: Client, message: any): any;
34
- ping(client: any): {
34
+ ping(client: Client): {
35
35
  id: number;
36
36
  method: string;
37
37
  params: any[];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ccxt",
3
- "version": "4.3.66",
3
+ "version": "4.3.68",
4
4
  "description": "A JavaScript / TypeScript / Python / C# / PHP cryptocurrency trading library with support for 100+ exchanges",
5
5
  "unpkg": "dist/ccxt.browser.min.js",
6
6
  "type": "module",
@@ -1,9 +0,0 @@
1
- 'use strict';
2
-
3
- var Exchange$1 = require('../base/Exchange.js');
4
-
5
- // -------------------------------------------------------------------------------
6
- class Exchange extends Exchange$1["default"] {
7
- }
8
-
9
- module.exports = Exchange;