ccxt 4.2.56 → 4.2.58

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 (75) hide show
  1. package/README.md +4 -4
  2. package/dist/ccxt.browser.js +818 -335
  3. package/dist/ccxt.browser.min.js +7 -7
  4. package/dist/cjs/ccxt.js +1 -1
  5. package/dist/cjs/src/alpaca.js +90 -88
  6. package/dist/cjs/src/base/Exchange.js +53 -3
  7. package/dist/cjs/src/binance.js +196 -28
  8. package/dist/cjs/src/bingx.js +12 -1
  9. package/dist/cjs/src/bitget.js +71 -56
  10. package/dist/cjs/src/bitmex.js +26 -1
  11. package/dist/cjs/src/bitrue.js +24 -15
  12. package/dist/cjs/src/blofin.js +24 -1
  13. package/dist/cjs/src/bybit.js +11 -3
  14. package/dist/cjs/src/currencycom.js +15 -5
  15. package/dist/cjs/src/delta.js +14 -1
  16. package/dist/cjs/src/gate.js +1 -1
  17. package/dist/cjs/src/hitbtc.js +63 -55
  18. package/dist/cjs/src/krakenfutures.js +22 -7
  19. package/dist/cjs/src/kuna.js +14 -11
  20. package/dist/cjs/src/mexc.js +75 -0
  21. package/dist/cjs/src/okx.js +31 -1
  22. package/dist/cjs/src/pro/alpaca.js +1 -1
  23. package/dist/cjs/src/pro/bitmex.js +23 -32
  24. package/dist/cjs/src/pro/cex.js +6 -2
  25. package/dist/cjs/src/pro/coinex.js +6 -3
  26. package/dist/cjs/src/pro/mexc.js +2 -2
  27. package/dist/cjs/src/pro/whitebit.js +15 -13
  28. package/dist/cjs/src/probit.js +1 -1
  29. package/dist/cjs/src/wavesexchange.js +1 -1
  30. package/dist/cjs/src/woo.js +20 -4
  31. package/js/ccxt.d.ts +3 -3
  32. package/js/ccxt.js +1 -1
  33. package/js/src/alpaca.js +90 -88
  34. package/js/src/base/Exchange.d.ts +14 -6
  35. package/js/src/base/Exchange.js +53 -3
  36. package/js/src/base/types.d.ts +12 -1
  37. package/js/src/binance.d.ts +5 -2
  38. package/js/src/binance.js +196 -28
  39. package/js/src/bingx.d.ts +3 -2
  40. package/js/src/bingx.js +12 -1
  41. package/js/src/bitget.d.ts +3 -2
  42. package/js/src/bitget.js +71 -56
  43. package/js/src/bitmex.d.ts +3 -1
  44. package/js/src/bitmex.js +26 -1
  45. package/js/src/bitrue.js +24 -15
  46. package/js/src/blofin.d.ts +3 -2
  47. package/js/src/blofin.js +24 -1
  48. package/js/src/bybit.d.ts +3 -6
  49. package/js/src/bybit.js +11 -3
  50. package/js/src/currencycom.d.ts +3 -2
  51. package/js/src/currencycom.js +15 -5
  52. package/js/src/delta.d.ts +3 -2
  53. package/js/src/delta.js +14 -1
  54. package/js/src/gate.js +1 -1
  55. package/js/src/hitbtc.d.ts +5 -3
  56. package/js/src/hitbtc.js +63 -55
  57. package/js/src/krakenfutures.d.ts +3 -2
  58. package/js/src/krakenfutures.js +22 -7
  59. package/js/src/kuna.js +14 -11
  60. package/js/src/mexc.d.ts +3 -1
  61. package/js/src/mexc.js +75 -0
  62. package/js/src/okx.d.ts +3 -2
  63. package/js/src/okx.js +31 -1
  64. package/js/src/pro/alpaca.js +1 -1
  65. package/js/src/pro/bitmex.js +24 -31
  66. package/js/src/pro/cex.js +6 -2
  67. package/js/src/pro/coinex.js +6 -3
  68. package/js/src/pro/mexc.js +2 -2
  69. package/js/src/pro/whitebit.js +15 -13
  70. package/js/src/probit.js +1 -1
  71. package/js/src/wavesexchange.js +1 -1
  72. package/js/src/woo.d.ts +3 -5
  73. package/js/src/woo.js +20 -4
  74. package/package.json +1 -1
  75. package/skip-tests.json +26 -8
@@ -63,7 +63,8 @@ class hitbtc extends hitbtc$1 {
63
63
  'fetchLeverage': true,
64
64
  'fetchLeverageTiers': undefined,
65
65
  'fetchLiquidations': false,
66
- 'fetchMarginMode': true,
66
+ 'fetchMarginMode': 'emulated',
67
+ 'fetchMarginModes': true,
67
68
  'fetchMarketLeverageTiers': false,
68
69
  'fetchMarkets': true,
69
70
  'fetchMarkOHLCV': true,
@@ -2507,7 +2508,7 @@ class hitbtc extends hitbtc$1 {
2507
2508
  'stopLossPrice': undefined,
2508
2509
  }, market);
2509
2510
  }
2510
- async fetchMarginMode(symbol = undefined, params = {}) {
2511
+ async fetchMarginModes(symbols = undefined, params = {}) {
2511
2512
  /**
2512
2513
  * @method
2513
2514
  * @name hitbtc#fetchMarginMode
@@ -2520,70 +2521,66 @@ class hitbtc extends hitbtc$1 {
2520
2521
  */
2521
2522
  await this.loadMarkets();
2522
2523
  let market = undefined;
2523
- if (symbol !== undefined) {
2524
- market = this.market(symbol);
2524
+ if (symbols !== undefined) {
2525
+ symbols = this.marketSymbols(symbols);
2526
+ market = this.market(symbols[0]);
2525
2527
  }
2526
2528
  let marketType = undefined;
2527
2529
  [marketType, params] = this.handleMarketTypeAndParams('fetchMarginMode', market, params);
2528
2530
  let response = undefined;
2529
2531
  if (marketType === 'margin') {
2530
2532
  response = await this.privateGetMarginConfig(params);
2533
+ //
2534
+ // {
2535
+ // "config": [{
2536
+ // "symbol": "BTCUSD",
2537
+ // "margin_call_leverage_mul": "1.50",
2538
+ // "liquidation_leverage_mul": "2.00",
2539
+ // "max_initial_leverage": "10.00",
2540
+ // "margin_mode": "Isolated",
2541
+ // "force_close_fee": "0.05",
2542
+ // "enabled": true,
2543
+ // "active": true,
2544
+ // "limit_base": "50000.00",
2545
+ // "limit_power": "2.2",
2546
+ // "unlimited_threshold": "10.0"
2547
+ // }]
2548
+ // }
2549
+ //
2531
2550
  }
2532
2551
  else if (marketType === 'swap') {
2533
2552
  response = await this.privateGetFuturesConfig(params);
2553
+ //
2554
+ // {
2555
+ // "config": [{
2556
+ // "symbol": "BTCUSD_PERP",
2557
+ // "margin_call_leverage_mul": "1.20",
2558
+ // "liquidation_leverage_mul": "2.00",
2559
+ // "max_initial_leverage": "100.00",
2560
+ // "margin_mode": "Isolated",
2561
+ // "force_close_fee": "0.001",
2562
+ // "enabled": true,
2563
+ // "active": false,
2564
+ // "limit_base": "5000000.000000000000",
2565
+ // "limit_power": "1.25",
2566
+ // "unlimited_threshold": "2.00"
2567
+ // }]
2568
+ // }
2569
+ //
2534
2570
  }
2535
2571
  else {
2536
- throw new errors.BadSymbol(this.id + ' fetchMarginMode() supports swap contracts and margin only');
2572
+ throw new errors.BadSymbol(this.id + ' fetchMarginModes () supports swap contracts and margin only');
2537
2573
  }
2538
- //
2539
- // margin
2540
- // {
2541
- // "config": [{
2542
- // "symbol": "BTCUSD",
2543
- // "margin_call_leverage_mul": "1.50",
2544
- // "liquidation_leverage_mul": "2.00",
2545
- // "max_initial_leverage": "10.00",
2546
- // "margin_mode": "Isolated",
2547
- // "force_close_fee": "0.05",
2548
- // "enabled": true,
2549
- // "active": true,
2550
- // "limit_base": "50000.00",
2551
- // "limit_power": "2.2",
2552
- // "unlimited_threshold": "10.0"
2553
- // }]
2554
- // }
2555
- //
2556
- // swap
2557
- // {
2558
- // "config": [{
2559
- // "symbol": "BTCUSD_PERP",
2560
- // "margin_call_leverage_mul": "1.20",
2561
- // "liquidation_leverage_mul": "2.00",
2562
- // "max_initial_leverage": "100.00",
2563
- // "margin_mode": "Isolated",
2564
- // "force_close_fee": "0.001",
2565
- // "enabled": true,
2566
- // "active": false,
2567
- // "limit_base": "5000000.000000000000",
2568
- // "limit_power": "1.25",
2569
- // "unlimited_threshold": "2.00"
2570
- // }]
2571
- // }
2572
- //
2573
- const config = this.safeValue(response, 'config', []);
2574
- const marginModes = [];
2575
- for (let i = 0; i < config.length; i++) {
2576
- const data = this.safeValue(config, i);
2577
- const marketId = this.safeString(data, 'symbol');
2578
- const marketInner = this.safeMarket(marketId);
2579
- marginModes.push({
2580
- 'info': data,
2581
- 'symbol': this.safeString(marketInner, 'symbol'),
2582
- 'marginMode': this.safeStringLower(data, 'margin_mode'),
2583
- });
2584
- }
2585
- const filteredMargin = this.filterBySymbol(marginModes, symbol);
2586
- return this.safeValue(filteredMargin, 0);
2574
+ const config = this.safeList(response, 'config', []);
2575
+ return this.parseMarginModes(config, symbols, 'symbol');
2576
+ }
2577
+ parseMarginMode(marginMode, market = undefined) {
2578
+ const marketId = this.safeString(marginMode, 'symbol');
2579
+ return {
2580
+ 'info': marginMode,
2581
+ 'symbol': this.safeSymbol(marketId, market),
2582
+ 'marginMode': this.safeStringLower(marginMode, 'margin_mode'),
2583
+ };
2587
2584
  }
2588
2585
  async transfer(code, amount, fromAccount, toAccount, params = {}) {
2589
2586
  /**
@@ -3402,7 +3399,18 @@ class hitbtc extends hitbtc$1 {
3402
3399
  // ]
3403
3400
  // }
3404
3401
  //
3405
- return this.safeNumber(response, 'leverage');
3402
+ return this.parseLeverage(response, market);
3403
+ }
3404
+ parseLeverage(leverage, market = undefined) {
3405
+ const marketId = this.safeString(leverage, 'symbol');
3406
+ const leverageValue = this.safeInteger(leverage, 'leverage');
3407
+ return {
3408
+ 'info': leverage,
3409
+ 'symbol': this.safeSymbol(marketId, market),
3410
+ 'marginMode': this.safeStringLower(leverage, 'type'),
3411
+ 'longLeverage': leverageValue,
3412
+ 'shortLeverage': leverageValue,
3413
+ };
3406
3414
  }
3407
3415
  async setLeverage(leverage, symbol = undefined, params = {}) {
3408
3416
  /**
@@ -2456,7 +2456,7 @@ class krakenfutures extends krakenfutures$1 {
2456
2456
  //
2457
2457
  return await this.privatePutLeveragepreferences(this.extend(request, params));
2458
2458
  }
2459
- async fetchLeverage(symbol = undefined, params = {}) {
2459
+ async fetchLeverage(symbol, params = {}) {
2460
2460
  /**
2461
2461
  * @method
2462
2462
  * @name krakenfutures#fetchLeverage
@@ -2470,17 +2470,32 @@ class krakenfutures extends krakenfutures$1 {
2470
2470
  throw new errors.ArgumentsRequired(this.id + ' fetchLeverage() requires a symbol argument');
2471
2471
  }
2472
2472
  await this.loadMarkets();
2473
+ const market = this.market(symbol);
2473
2474
  const request = {
2474
2475
  'symbol': this.marketId(symbol).toUpperCase(),
2475
2476
  };
2477
+ const response = await this.privateGetLeveragepreferences(this.extend(request, params));
2476
2478
  //
2477
- // {
2478
- // "result": "success",
2479
- // "serverTime": "2023-08-01T09:54:08.900Z",
2480
- // "leveragePreferences": [ { symbol: "PF_LTCUSD", maxLeverage: "5.00" } ]
2481
- // }
2479
+ // {
2480
+ // "result": "success",
2481
+ // "serverTime": "2023-08-01T09:54:08.900Z",
2482
+ // "leveragePreferences": [ { symbol: "PF_LTCUSD", maxLeverage: "5.00" } ]
2483
+ // }
2482
2484
  //
2483
- return await this.privateGetLeveragepreferences(this.extend(request, params));
2485
+ const leveragePreferences = this.safeList(response, 'leveragePreferences', []);
2486
+ const data = this.safeDict(leveragePreferences, 0, {});
2487
+ return this.parseLeverage(data, market);
2488
+ }
2489
+ parseLeverage(leverage, market = undefined) {
2490
+ const marketId = this.safeString(leverage, 'symbol');
2491
+ const leverageValue = this.safeInteger(leverage, 'maxLeverage');
2492
+ return {
2493
+ 'info': leverage,
2494
+ 'symbol': this.safeSymbol(marketId, market),
2495
+ 'marginMode': undefined,
2496
+ 'longLeverage': leverageValue,
2497
+ 'shortLeverage': leverageValue,
2498
+ };
2484
2499
  }
2485
2500
  handleErrors(code, reason, url, method, headers, body, response, requestHeaders, requestBody) {
2486
2501
  if (response === undefined) {
@@ -806,7 +806,7 @@ class kuna extends kuna$1 {
806
806
  await this.loadMarkets();
807
807
  const market = this.market(symbol);
808
808
  const request = {
809
- 'pair': market['id'],
809
+ 'pairs': market['id'],
810
810
  };
811
811
  if (limit !== undefined) {
812
812
  request['limit'] = limit;
@@ -814,18 +814,21 @@ class kuna extends kuna$1 {
814
814
  const response = await this.v4PublicGetTradePublicBookPairs(this.extend(request, params));
815
815
  //
816
816
  // {
817
- // "data": {
818
- // "id": "3e5591ba-2778-4d85-8851-54284045ea44", // Unique identifier of a trade
819
- // "pair": "BTC_USDT", // Market pair that is being traded
820
- // "quoteQuantity": "11528.8118", // Qty of the quote asset, USDT in this example
821
- // "matchPrice": "18649", // Exchange price at the moment of execution
822
- // "matchQuantity": "0.6182", // Qty of the base asset, BTC in this example
823
- // "createdAt": "2022-09-23T14:30:41.486Z", // Date-time of trade execution, UTC
824
- // "side": "Ask" // Trade type: `Ask` or `Bid`. Bid for buying base asset, Ask for selling base asset (e.g. for BTC_USDT trading pair, BTC is the base asset).
825
- // }
817
+ // 'data': [
818
+ // {
819
+ // 'createdAt': '2024-03-02T00:10:49.385Z',
820
+ // 'id': '3b42878a-3688-4bc1-891e-5cc2fc902142',
821
+ // 'matchPrice': '62181.31',
822
+ // 'matchQuantity': '0.00568',
823
+ // 'pair': 'BTC_USDT',
824
+ // 'quoteQuantity': '353.1898408',
825
+ // 'side': 'Bid'
826
+ // },
827
+ // ...
828
+ // ]
826
829
  // }
827
830
  //
828
- const data = this.safeValue(response, 'data', {});
831
+ const data = this.safeList(response, 'data', []);
829
832
  return this.parseTrades(data, market, since, limit);
830
833
  }
831
834
  parseTrade(trade, market = undefined) {
@@ -71,6 +71,8 @@ class mexc extends mexc$1 {
71
71
  'fetchL2OrderBook': true,
72
72
  'fetchLedger': undefined,
73
73
  'fetchLedgerEntry': undefined,
74
+ 'fetchLeverage': true,
75
+ 'fetchLeverages': false,
74
76
  'fetchLeverageTiers': true,
75
77
  'fetchMarginMode': false,
76
78
  'fetchMarketLeverageTiers': undefined,
@@ -5373,6 +5375,79 @@ class mexc extends mexc$1 {
5373
5375
  }
5374
5376
  return this.assignDefaultDepositWithdrawFees(result);
5375
5377
  }
5378
+ async fetchLeverage(symbol, params = {}) {
5379
+ /**
5380
+ * @method
5381
+ * @name mexc#fetchLeverage
5382
+ * @description fetch the set leverage for a market
5383
+ * @see https://mexcdevelop.github.io/apidocs/contract_v1_en/#get-leverage
5384
+ * @param {string} symbol unified market symbol
5385
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
5386
+ * @returns {object} a [leverage structure]{@link https://docs.ccxt.com/#/?id=leverage-structure}
5387
+ */
5388
+ await this.loadMarkets();
5389
+ const market = this.market(symbol);
5390
+ const request = {
5391
+ 'symbol': market['id'],
5392
+ };
5393
+ const response = await this.contractPrivateGetPositionLeverage(this.extend(request, params));
5394
+ //
5395
+ // {
5396
+ // "success": true,
5397
+ // "code": 0,
5398
+ // "data": [
5399
+ // {
5400
+ // "level": 1,
5401
+ // "maxVol": 463300,
5402
+ // "mmr": 0.004,
5403
+ // "imr": 0.005,
5404
+ // "positionType": 1,
5405
+ // "openType": 1,
5406
+ // "leverage": 20,
5407
+ // "limitBySys": false,
5408
+ // "currentMmr": 0.004
5409
+ // },
5410
+ // {
5411
+ // "level": 1,
5412
+ // "maxVol": 463300,
5413
+ // "mmr": 0.004,
5414
+ // "imr": 0.005,
5415
+ // "positionType": 2,
5416
+ // "openType": 1,
5417
+ // "leverage": 20,
5418
+ // "limitBySys": false,
5419
+ // "currentMmr": 0.004
5420
+ // }
5421
+ // ]
5422
+ // }
5423
+ //
5424
+ const data = this.safeList(response, 'data', []);
5425
+ return this.parseLeverage(data, market);
5426
+ }
5427
+ parseLeverage(leverage, market = undefined) {
5428
+ let marginMode = undefined;
5429
+ let longLeverage = undefined;
5430
+ let shortLeverage = undefined;
5431
+ for (let i = 0; i < leverage.length; i++) {
5432
+ const entry = leverage[i];
5433
+ const openType = this.safeInteger(entry, 'openType');
5434
+ const positionType = this.safeInteger(entry, 'positionType');
5435
+ if (positionType === 1) {
5436
+ longLeverage = this.safeInteger(entry, 'leverage');
5437
+ }
5438
+ else if (positionType === 2) {
5439
+ shortLeverage = this.safeInteger(entry, 'leverage');
5440
+ }
5441
+ marginMode = (openType === 1) ? 'isolated' : 'cross';
5442
+ }
5443
+ return {
5444
+ 'info': leverage,
5445
+ 'symbol': market['symbol'],
5446
+ 'marginMode': marginMode,
5447
+ 'longLeverage': longLeverage,
5448
+ 'shortLeverage': shortLeverage,
5449
+ };
5450
+ }
5376
5451
  handleMarginModeAndParams(methodName, params = {}, defaultValue = undefined) {
5377
5452
  /**
5378
5453
  * @ignore
@@ -5161,7 +5161,37 @@ class okx extends okx$1 {
5161
5161
  // "msg": ""
5162
5162
  // }
5163
5163
  //
5164
- return response;
5164
+ const data = this.safeList(response, 'data', []);
5165
+ return this.parseLeverage(data, market);
5166
+ }
5167
+ parseLeverage(leverage, market = undefined) {
5168
+ let marketId = undefined;
5169
+ let marginMode = undefined;
5170
+ let longLeverage = undefined;
5171
+ let shortLeverage = undefined;
5172
+ for (let i = 0; i < leverage.length; i++) {
5173
+ const entry = leverage[i];
5174
+ marginMode = this.safeStringLower(entry, 'mgnMode');
5175
+ marketId = this.safeString(entry, 'instId');
5176
+ const positionSide = this.safeStringLower(entry, 'posSide');
5177
+ if (positionSide === 'long') {
5178
+ longLeverage = this.safeInteger(entry, 'lever');
5179
+ }
5180
+ else if (positionSide === 'short') {
5181
+ shortLeverage = this.safeInteger(entry, 'lever');
5182
+ }
5183
+ else {
5184
+ longLeverage = this.safeInteger(entry, 'lever');
5185
+ shortLeverage = this.safeInteger(entry, 'lever');
5186
+ }
5187
+ }
5188
+ return {
5189
+ 'info': leverage,
5190
+ 'symbol': this.safeSymbol(marketId, market),
5191
+ 'marginMode': marginMode,
5192
+ 'longLeverage': longLeverage,
5193
+ 'shortLeverage': shortLeverage,
5194
+ };
5165
5195
  }
5166
5196
  async fetchPosition(symbol, params = {}) {
5167
5197
  /**
@@ -610,7 +610,7 @@ class alpaca extends alpaca$1 {
610
610
  for (let i = 0; i < message.length; i++) {
611
611
  const data = message[i];
612
612
  const T = this.safeString(data, 'T');
613
- const msg = this.safeValue(data, 'msg', {});
613
+ const msg = this.safeString(data, 'msg');
614
614
  if (T === 'subscription') {
615
615
  this.handleSubscription(client, data);
616
616
  return;
@@ -60,17 +60,9 @@ class bitmex extends bitmex$1 {
60
60
  * @returns {object} a [ticker structure]{@link https://docs.ccxt.com/#/?id=ticker-structure}
61
61
  */
62
62
  await this.loadMarkets();
63
- const market = this.market(symbol);
64
- const name = 'instrument';
65
- const messageHash = name + ':' + market['id'];
66
- const url = this.urls['api']['ws'];
67
- const request = {
68
- 'op': 'subscribe',
69
- 'args': [
70
- messageHash,
71
- ],
72
- };
73
- return await this.watch(url, messageHash, this.extend(request, params), messageHash);
63
+ symbol = this.symbol(symbol);
64
+ const tickers = await this.watchTickers([symbol], params);
65
+ return tickers[symbol];
74
66
  }
75
67
  async watchTickers(symbols = undefined, params = {}) {
76
68
  /**
@@ -86,26 +78,27 @@ class bitmex extends bitmex$1 {
86
78
  const name = 'instrument';
87
79
  const url = this.urls['api']['ws'];
88
80
  const messageHashes = [];
81
+ const rawSubscriptions = [];
89
82
  if (symbols !== undefined) {
90
83
  for (let i = 0; i < symbols.length; i++) {
91
84
  const symbol = symbols[i];
92
85
  const market = this.market(symbol);
93
- const hash = name + ':' + market['id'];
94
- messageHashes.push(hash);
86
+ const subscription = name + ':' + market['id'];
87
+ rawSubscriptions.push(subscription);
88
+ const messageHash = 'ticker:' + symbol;
89
+ messageHashes.push(messageHash);
95
90
  }
96
91
  }
97
92
  else {
98
- messageHashes.push(name);
93
+ rawSubscriptions.push(name);
94
+ messageHashes.push('alltickers');
99
95
  }
100
96
  const request = {
101
97
  'op': 'subscribe',
102
- 'args': messageHashes,
98
+ 'args': rawSubscriptions,
103
99
  };
104
- const ticker = await this.watchMultiple(url, messageHashes, this.extend(request, params), messageHashes);
100
+ const ticker = await this.watchMultiple(url, messageHashes, this.extend(request, params), rawSubscriptions);
105
101
  if (this.newUpdates) {
106
- if (symbols === undefined) {
107
- return ticker;
108
- }
109
102
  const result = {};
110
103
  result[ticker['symbol']] = ticker;
111
104
  return result;
@@ -339,23 +332,21 @@ class bitmex extends bitmex$1 {
339
332
  // ]
340
333
  // }
341
334
  //
342
- const table = this.safeString(message, 'table');
343
335
  const data = this.safeList(message, 'data', []);
344
- const tickers = {};
345
336
  for (let i = 0; i < data.length; i++) {
346
337
  const update = data[i];
347
338
  const marketId = this.safeString(update, 'symbol');
348
- const market = this.safeMarket(marketId);
349
- const symbol = market['symbol'];
350
- const messageHash = table + ':' + marketId;
351
- const ticker = this.safeDict(this.tickers, symbol, {});
352
- const info = this.safeDict(ticker, 'info', {});
353
- const parsedTicker = this.parseTicker(this.extend(info, update), market);
354
- tickers[symbol] = parsedTicker;
355
- this.tickers[symbol] = parsedTicker;
356
- client.resolve(ticker, messageHash);
339
+ const symbol = this.safeSymbol(marketId);
340
+ if (!(symbol in this.tickers)) {
341
+ this.tickers[symbol] = this.parseTicker({});
342
+ }
343
+ const updatedTicker = this.parseTicker(update);
344
+ const fullParsedTicker = this.deepExtend(this.tickers[symbol], updatedTicker);
345
+ this.tickers[symbol] = fullParsedTicker;
346
+ const messageHash = 'ticker:' + symbol;
347
+ client.resolve(fullParsedTicker, messageHash);
348
+ client.resolve(fullParsedTicker, 'alltickers');
357
349
  }
358
- client.resolve(tickers, 'instrument');
359
350
  return message;
360
351
  }
361
352
  async watchBalance(params = {}) {
@@ -1335,7 +1326,7 @@ class bitmex extends bitmex$1 {
1335
1326
  const messageHash = table + ':' + market['id'];
1336
1327
  const result = [
1337
1328
  this.parse8601(this.safeString(candle, 'timestamp')) - duration * 1000,
1338
- this.safeFloat(candle, 'open'),
1329
+ undefined,
1339
1330
  this.safeFloat(candle, 'high'),
1340
1331
  this.safeFloat(candle, 'low'),
1341
1332
  this.safeFloat(candle, 'close'),
@@ -1088,7 +1088,10 @@ class cex extends cex$1 {
1088
1088
  for (let i = 0; i < sorted.length; i++) {
1089
1089
  stored.append(this.parseOHLCV(sorted[i], market));
1090
1090
  }
1091
- this.ohlcvs[symbol] = stored;
1091
+ if (!(symbol in this.ohlcvs)) {
1092
+ this.ohlcvs[symbol] = {};
1093
+ }
1094
+ this.ohlcvs[symbol]['unknown'] = stored;
1092
1095
  client.resolve(stored, messageHash);
1093
1096
  }
1094
1097
  handleOHLCV24(client, message) {
@@ -1147,7 +1150,8 @@ class cex extends cex$1 {
1147
1150
  const pair = this.safeString(message, 'pair');
1148
1151
  const symbol = this.pairToSymbol(pair);
1149
1152
  const messageHash = 'ohlcv:' + symbol;
1150
- const stored = this.safeValue(this.ohlcvs, symbol);
1153
+ // const stored = this.safeValue (this.ohlcvs, symbol);
1154
+ const stored = this.ohlcvs[symbol]['unknown'];
1151
1155
  for (let i = 0; i < data.length; i++) {
1152
1156
  const ohlcv = [
1153
1157
  this.safeTimestamp(data[i], 0),
@@ -387,14 +387,17 @@ class coinex extends coinex$1 {
387
387
  const keys = Object.keys(this.ohlcvs);
388
388
  const keysLength = keys.length;
389
389
  if (keysLength === 0) {
390
+ this.ohlcvs['unknown'] = {};
390
391
  const limit = this.safeInteger(this.options, 'OHLCVLimit', 1000);
391
- this.ohlcvs = new Cache.ArrayCacheByTimestamp(limit);
392
+ const stored = new Cache.ArrayCacheByTimestamp(limit);
393
+ this.ohlcvs['unknown']['unknown'] = stored;
392
394
  }
395
+ const ohlcv = this.ohlcvs['unknown']['unknown'];
393
396
  for (let i = 0; i < ohlcvs.length; i++) {
394
397
  const candle = ohlcvs[i];
395
- this.ohlcvs.append(candle);
398
+ ohlcv.append(candle);
396
399
  }
397
- client.resolve(this.ohlcvs, messageHash);
400
+ client.resolve(ohlcv, messageHash);
398
401
  }
399
402
  async watchTicker(symbol, params = {}) {
400
403
  /**
@@ -244,7 +244,7 @@ class mexc extends mexc$1 {
244
244
  // "d": {
245
245
  // "e": "spot@public.kline.v3.api",
246
246
  // "k": {
247
- // "t": 1678642260,
247
+ // "t": 1678642261,
248
248
  // "o": 20626.94,
249
249
  // "c": 20599.69,
250
250
  // "h": 20626.94,
@@ -457,7 +457,7 @@ class mexc extends mexc$1 {
457
457
  client.subscriptions[messageHash] = 1;
458
458
  this.orderbooks[symbol] = this.countedOrderBook({});
459
459
  }
460
- const storedOrderBook = this.safeValue(this.orderbooks, symbol);
460
+ const storedOrderBook = this.orderbooks[symbol];
461
461
  const nonce = this.safeInteger(storedOrderBook, 'nonce');
462
462
  if (nonce === undefined) {
463
463
  const cacheLength = storedOrderBook.cache.length;
@@ -114,15 +114,19 @@ class whitebit extends whitebit$1 {
114
114
  const symbol = market['symbol'];
115
115
  const messageHash = 'candles' + ':' + symbol;
116
116
  const parsed = this.parseOHLCV(data, market);
117
- this.ohlcvs[symbol] = this.safeValue(this.ohlcvs, symbol);
118
- let stored = this.ohlcvs[symbol];
119
- if (stored === undefined) {
117
+ // this.ohlcvs[symbol] = this.safeValue (this.ohlcvs, symbol);
118
+ if (!(symbol in this.ohlcvs)) {
119
+ this.ohlcvs[symbol] = {};
120
+ }
121
+ // let stored = this.ohlcvs[symbol]['unknown']; // we don't know the timeframe but we need to respect the type
122
+ if (!('unknown' in this.ohlcvs[symbol])) {
120
123
  const limit = this.safeInteger(this.options, 'OHLCVLimit', 1000);
121
- stored = new Cache.ArrayCacheByTimestamp(limit);
122
- this.ohlcvs[symbol] = stored;
124
+ const stored = new Cache.ArrayCacheByTimestamp(limit);
125
+ this.ohlcvs[symbol]['unknown'] = stored;
123
126
  }
124
- stored.append(parsed);
125
- client.resolve(stored, messageHash);
127
+ const ohlcv = this.ohlcvs[symbol]['unknown'];
128
+ ohlcv.append(parsed);
129
+ client.resolve(ohlcv, messageHash);
126
130
  }
127
131
  return message;
128
132
  }
@@ -864,12 +868,10 @@ class whitebit extends whitebit$1 {
864
868
  if (!this.handleErrorMessage(client, message)) {
865
869
  return;
866
870
  }
867
- const result = this.safeValue(message, 'result', {});
868
- if (result !== undefined) {
869
- if (result === 'pong') {
870
- this.handlePong(client, message);
871
- return;
872
- }
871
+ const result = this.safeString(message, 'result');
872
+ if (result === 'pong') {
873
+ this.handlePong(client, message);
874
+ return;
873
875
  }
874
876
  const id = this.safeInteger(message, 'id');
875
877
  if (id !== undefined) {
@@ -1553,7 +1553,7 @@ class probit extends probit$1 {
1553
1553
  // ]
1554
1554
  // }
1555
1555
  //
1556
- const data = this.safeValue(response, 'data', {});
1556
+ const data = this.safeList(response, 'data', []);
1557
1557
  return this.parseTransactions(data, currency, since, limit);
1558
1558
  }
1559
1559
  parseTransaction(transaction, currency = undefined) {
@@ -1378,7 +1378,7 @@ class wavesexchange extends wavesexchange$1 {
1378
1378
  'amountAsset': amountAsset,
1379
1379
  'priceAsset': priceAsset,
1380
1380
  };
1381
- const sandboxMode = this.safeValue(this.options, 'sandboxMode', false);
1381
+ const sandboxMode = this.safeBool(this.options, 'sandboxMode', false);
1382
1382
  const chainId = (sandboxMode) ? 84 : 87;
1383
1383
  const body = {
1384
1384
  'senderPublicKey': this.apiKey,