ccxt 4.2.38 → 4.2.40

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 (127) hide show
  1. package/README.md +3 -3
  2. package/dist/ccxt.browser.js +1340 -407
  3. package/dist/ccxt.browser.min.js +3 -3
  4. package/dist/cjs/ccxt.js +1 -1
  5. package/dist/cjs/src/ascendex.js +28 -24
  6. package/dist/cjs/src/base/Exchange.js +28 -16
  7. package/dist/cjs/src/binance.js +528 -181
  8. package/dist/cjs/src/bingx.js +250 -23
  9. package/dist/cjs/src/bitget.js +14 -3
  10. package/dist/cjs/src/bitso.js +18 -2
  11. package/dist/cjs/src/bitstamp.js +24 -2
  12. package/dist/cjs/src/bl3p.js +6 -0
  13. package/dist/cjs/src/blockchaincom.js +21 -0
  14. package/dist/cjs/src/btcalpha.js +9 -0
  15. package/dist/cjs/src/btcbox.js +9 -0
  16. package/dist/cjs/src/btcmarkets.js +19 -0
  17. package/dist/cjs/src/bybit.js +3 -1
  18. package/dist/cjs/src/coinbase.js +21 -8
  19. package/dist/cjs/src/coinbasepro.js +1 -0
  20. package/dist/cjs/src/coinlist.js +9 -7
  21. package/dist/cjs/src/coinmetro.js +2 -1
  22. package/dist/cjs/src/krakenfutures.js +133 -16
  23. package/dist/cjs/src/luno.js +1 -1
  24. package/dist/cjs/src/mexc.js +43 -43
  25. package/dist/cjs/src/okx.js +11 -17
  26. package/dist/cjs/src/phemex.js +1 -0
  27. package/dist/cjs/src/poloniexfutures.js +11 -5
  28. package/dist/cjs/src/pro/bitmart.js +141 -48
  29. package/dist/cjs/src/pro/bybit.js +5 -5
  30. package/dist/cjs/src/pro/mexc.js +1 -1
  31. package/dist/cjs/src/wavesexchange.js +1 -1
  32. package/dist/cjs/src/woo.js +1 -1
  33. package/js/ccxt.d.ts +1 -1
  34. package/js/ccxt.js +1 -1
  35. package/js/src/abstract/bingx.d.ts +4 -0
  36. package/js/src/abstract/coinbase.d.ts +1 -0
  37. package/js/src/abstract/coinbasepro.d.ts +1 -0
  38. package/js/src/abstract/okx.d.ts +1 -0
  39. package/js/src/ascendex.d.ts +2 -2
  40. package/js/src/ascendex.js +28 -24
  41. package/js/src/base/Exchange.d.ts +12 -8
  42. package/js/src/base/Exchange.js +28 -16
  43. package/js/src/base/types.d.ts +2 -0
  44. package/js/src/bigone.d.ts +2 -2
  45. package/js/src/binance.d.ts +9 -9
  46. package/js/src/binance.js +528 -181
  47. package/js/src/bingx.d.ts +6 -5
  48. package/js/src/bingx.js +250 -23
  49. package/js/src/bitfinex.d.ts +3 -3
  50. package/js/src/bitfinex2.d.ts +2 -2
  51. package/js/src/bitget.d.ts +5 -5
  52. package/js/src/bitget.js +14 -3
  53. package/js/src/bitmart.d.ts +2 -2
  54. package/js/src/bitmex.d.ts +2 -2
  55. package/js/src/bitrue.d.ts +2 -2
  56. package/js/src/bitso.d.ts +1 -1
  57. package/js/src/bitso.js +18 -2
  58. package/js/src/bitstamp.d.ts +1 -1
  59. package/js/src/bitstamp.js +24 -2
  60. package/js/src/bitvavo.d.ts +1 -1
  61. package/js/src/bl3p.js +6 -0
  62. package/js/src/blockchaincom.js +21 -0
  63. package/js/src/blofin.d.ts +2 -2
  64. package/js/src/btcalpha.js +9 -0
  65. package/js/src/btcbox.js +9 -0
  66. package/js/src/btcmarkets.js +19 -0
  67. package/js/src/bybit.d.ts +7 -7
  68. package/js/src/bybit.js +3 -1
  69. package/js/src/cex.d.ts +1 -1
  70. package/js/src/coinbase.d.ts +2 -2
  71. package/js/src/coinbase.js +21 -8
  72. package/js/src/coinbasepro.js +1 -0
  73. package/js/src/coinex.d.ts +4 -4
  74. package/js/src/coinlist.d.ts +2 -2
  75. package/js/src/coinlist.js +9 -7
  76. package/js/src/coinmetro.js +2 -1
  77. package/js/src/coinone.d.ts +1 -1
  78. package/js/src/delta.d.ts +2 -2
  79. package/js/src/deribit.d.ts +3 -3
  80. package/js/src/digifinex.d.ts +3 -3
  81. package/js/src/exmo.d.ts +2 -2
  82. package/js/src/gate.d.ts +6 -6
  83. package/js/src/hitbtc.d.ts +2 -2
  84. package/js/src/hollaex.d.ts +1 -1
  85. package/js/src/htx.d.ts +3 -3
  86. package/js/src/huobijp.d.ts +1 -1
  87. package/js/src/kraken.d.ts +2 -2
  88. package/js/src/krakenfutures.d.ts +4 -2
  89. package/js/src/krakenfutures.js +133 -16
  90. package/js/src/kucoin.d.ts +5 -5
  91. package/js/src/kucoinfutures.d.ts +2 -2
  92. package/js/src/latoken.d.ts +1 -1
  93. package/js/src/lbank.d.ts +2 -2
  94. package/js/src/luno.d.ts +1 -1
  95. package/js/src/luno.js +1 -1
  96. package/js/src/mexc.d.ts +4 -4
  97. package/js/src/mexc.js +43 -43
  98. package/js/src/ndax.d.ts +1 -1
  99. package/js/src/novadax.d.ts +1 -1
  100. package/js/src/okcoin.d.ts +2 -2
  101. package/js/src/okx.d.ts +7 -7
  102. package/js/src/okx.js +11 -17
  103. package/js/src/paymium.d.ts +2 -2
  104. package/js/src/phemex.d.ts +4 -4
  105. package/js/src/phemex.js +1 -0
  106. package/js/src/poloniex.d.ts +2 -2
  107. package/js/src/poloniexfutures.d.ts +2 -2
  108. package/js/src/poloniexfutures.js +11 -5
  109. package/js/src/pro/bitmart.d.ts +4 -0
  110. package/js/src/pro/bitmart.js +141 -48
  111. package/js/src/pro/bitvavo.d.ts +1 -1
  112. package/js/src/pro/bybit.d.ts +1 -1
  113. package/js/src/pro/bybit.js +5 -5
  114. package/js/src/pro/cex.d.ts +2 -2
  115. package/js/src/pro/coinbase.d.ts +2 -2
  116. package/js/src/pro/coinex.d.ts +1 -1
  117. package/js/src/pro/lbank.d.ts +1 -1
  118. package/js/src/pro/mexc.js +1 -1
  119. package/js/src/probit.d.ts +1 -1
  120. package/js/src/timex.d.ts +1 -1
  121. package/js/src/upbit.d.ts +1 -1
  122. package/js/src/wavesexchange.js +1 -1
  123. package/js/src/whitebit.d.ts +2 -2
  124. package/js/src/woo.d.ts +3 -3
  125. package/js/src/woo.js +1 -1
  126. package/js/src/zonda.d.ts +3 -3
  127. package/package.json +2 -2
@@ -1705,13 +1705,13 @@ export default class poloniexfutures extends Exchange {
1705
1705
  const trades = this.safeValue(data, 'items', {});
1706
1706
  return this.parseTrades(trades, market, since, limit);
1707
1707
  }
1708
- async setMarginMode(marginMode, symbol, params = {}) {
1708
+ async setMarginMode(marginMode, symbol = undefined, params = {}) {
1709
1709
  /**
1710
1710
  * @method
1711
1711
  * @name poloniexfutures#setMarginMode
1712
1712
  * @description set margin mode to 'cross' or 'isolated'
1713
1713
  * @see https://futures-docs.poloniex.com/#change-margin-mode
1714
- * @param {int} marginMode 0 (isolated) or 1 (cross)
1714
+ * @param {string} marginMode "0" (isolated) or "1" (cross)
1715
1715
  * @param {string} symbol unified market symbol
1716
1716
  * @param {object} [params] extra parameters specific to the exchange API endpoint
1717
1717
  * @returns {object} response from the exchange
@@ -1719,14 +1719,20 @@ export default class poloniexfutures extends Exchange {
1719
1719
  if (symbol === undefined) {
1720
1720
  throw new ArgumentsRequired(this.id + ' setMarginMode() requires a symbol argument');
1721
1721
  }
1722
- if ((marginMode !== 0) && (marginMode !== 1)) {
1723
- throw new ArgumentsRequired(this.id + ' setMarginMode() marginMode must be 0 (isolated) or 1 (cross)');
1722
+ if ((marginMode !== '0') && (marginMode !== '1') && (marginMode !== 'isolated') && (marginMode !== 'cross')) {
1723
+ throw new ArgumentsRequired(this.id + ' setMarginMode() marginMode must be 0/isolated or 1/cross');
1724
1724
  }
1725
1725
  await this.loadMarkets();
1726
+ if (marginMode === 'isolated') {
1727
+ marginMode = '0';
1728
+ }
1729
+ if (marginMode === 'cross') {
1730
+ marginMode = '1';
1731
+ }
1726
1732
  const market = this.market(symbol);
1727
1733
  const request = {
1728
1734
  'symbol': market['id'],
1729
- 'marginType': marginMode,
1735
+ 'marginType': this.parseToInt(marginMode),
1730
1736
  };
1731
1737
  return await this.privatePostMarginTypeChange(request);
1732
1738
  }
@@ -4,11 +4,14 @@ import Client from '../base/ws/Client.js';
4
4
  export default class bitmart extends bitmartRest {
5
5
  describe(): any;
6
6
  subscribe(channel: any, symbol: any, type: any, params?: {}): Promise<any>;
7
+ subscribeMultiple(channel: string, type: string, symbols: string[], params?: {}): Promise<any>;
7
8
  watchBalance(params?: {}): Promise<Balances>;
8
9
  setBalanceCache(client: Client, type: any, subscribeHash: any): void;
9
10
  loadBalanceSnapshot(client: any, messageHash: any, type: any): Promise<void>;
10
11
  handleBalance(client: Client, message: any): void;
11
12
  watchTrades(symbol: string, since?: Int, limit?: Int, params?: {}): Promise<Trade[]>;
13
+ watchTradesForSymbols(symbols: string[], since?: Int, limit?: Int, params?: {}): Promise<Trade[]>;
14
+ getParamsForMultipleSub(methodName: string, symbols: string[], limit?: Int, params?: {}): any[];
12
15
  watchTicker(symbol: string, params?: {}): Promise<Ticker>;
13
16
  watchTickers(symbols?: Strings, params?: {}): Promise<Tickers>;
14
17
  watchOrders(symbol?: Str, since?: Int, limit?: Int, params?: {}): Promise<Order[]>;
@@ -31,6 +34,7 @@ export default class bitmart extends bitmartRest {
31
34
  handleDeltas(bookside: any, deltas: any): void;
32
35
  handleOrderBookMessage(client: Client, message: any, orderbook: any): any;
33
36
  handleOrderBook(client: Client, message: any): void;
37
+ watchOrderBookForSymbols(symbols: string[], limit?: Int, params?: {}): Promise<OrderBook>;
34
38
  authenticate(type: any, params?: {}): Promise<any>;
35
39
  handleSubscriptionStatus(client: Client, message: any): any;
36
40
  handleAuthenticate(client: Client, message: any): void;
@@ -27,8 +27,10 @@ export default class bitmart extends bitmartRest {
27
27
  'watchTicker': true,
28
28
  'watchTickers': true,
29
29
  'watchOrderBook': true,
30
+ 'watchOrderBookForSymbols': true,
30
31
  'watchOrders': true,
31
32
  'watchTrades': true,
33
+ 'watchTradesForSymbols': true,
32
34
  'watchOHLCV': true,
33
35
  'watchPosition': 'emulated',
34
36
  'watchPositions': true,
@@ -53,8 +55,15 @@ export default class bitmart extends bitmartRest {
53
55
  'fetchBalanceSnapshot': true,
54
56
  'awaitBalanceSnapshot': false, // whether to wait for the balance snapshot before providing updates
55
57
  },
58
+ //
59
+ // orderbook channels can have:
60
+ // - 'depth5', 'depth20', 'depth50' // these endpoints emit full Orderbooks once in every 500ms
61
+ // - 'depth/increase100' // this endpoint is preferred, because it emits once in 100ms. however, when this value is chosen, it only affects spot-market, but contracts markets automatically `depth50` will be being used
56
62
  'watchOrderBook': {
57
- 'depth': 'depth/increase100', // depth/increase100, depth5, depth20, depth50
63
+ 'depth': 'depth/increase100',
64
+ },
65
+ 'watchOrderBookForSymbols': {
66
+ 'depth': 'depth/increase100',
58
67
  },
59
68
  'ws': {
60
69
  'inflate': true,
@@ -101,6 +110,24 @@ export default class bitmart extends bitmartRest {
101
110
  }
102
111
  return await this.watch(url, messageHash, this.deepExtend(request, params), messageHash);
103
112
  }
113
+ async subscribeMultiple(channel, type, symbols, params = {}) {
114
+ const url = this.implodeHostname(this.urls['api']['ws'][type]['public']);
115
+ const channelType = (type === 'spot') ? 'spot' : 'futures';
116
+ const actionType = (type === 'spot') ? 'op' : 'action';
117
+ const rawSubscriptions = [];
118
+ const messageHashes = [];
119
+ for (let i = 0; i < symbols.length; i++) {
120
+ const market = this.market(symbols[i]);
121
+ const message = channelType + '/' + channel + ':' + market['id'];
122
+ rawSubscriptions.push(message);
123
+ messageHashes.push(channel + ':' + market['symbol']);
124
+ }
125
+ const request = {
126
+ 'args': rawSubscriptions,
127
+ };
128
+ request[actionType] = 'subscribe';
129
+ return await this.watchMultiple(url, messageHashes, this.deepExtend(request, params), rawSubscriptions);
130
+ }
104
131
  async watchBalance(params = {}) {
105
132
  /**
106
133
  * @method
@@ -248,17 +275,43 @@ export default class bitmart extends bitmartRest {
248
275
  * @param {object} [params] extra parameters specific to the exchange API endpoint
249
276
  * @returns {object[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=public-trades}
250
277
  */
278
+ return await this.watchTradesForSymbols([symbol], since, limit, params);
279
+ }
280
+ async watchTradesForSymbols(symbols, since = undefined, limit = undefined, params = {}) {
281
+ /**
282
+ * @method
283
+ * @name bitmart#watchTradesForSymbols
284
+ * @see https://developer-pro.bitmart.com/en/spot/#public-trade-channel
285
+ * @description get the list of most recent trades for a list of symbols
286
+ * @param {string[]} symbols unified symbol of the market to fetch trades for
287
+ * @param {int} [since] timestamp in ms of the earliest trade to fetch
288
+ * @param {int} [limit] the maximum amount of trades to fetch
289
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
290
+ * @returns {object[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=public-trades}
291
+ */
251
292
  await this.loadMarkets();
252
- symbol = this.symbol(symbol);
253
- const market = this.market(symbol);
254
- let type = 'spot';
255
- [type, params] = this.handleMarketTypeAndParams('watchTrades', market, params);
256
- const trades = await this.subscribe('trade', symbol, type, params);
293
+ let marketType = undefined;
294
+ [symbols, marketType, params] = this.getParamsForMultipleSub('watchTradesForSymbols', symbols, limit, params);
295
+ const channelName = 'trade';
296
+ const trades = await this.subscribeMultiple(channelName, marketType, symbols, params);
257
297
  if (this.newUpdates) {
258
- limit = trades.getLimit(symbol, limit);
298
+ const first = this.safeDict(trades, 0);
299
+ const tradeSymbol = this.safeString(first, 'symbol');
300
+ limit = trades.getLimit(tradeSymbol, limit);
259
301
  }
260
302
  return this.filterBySinceLimit(trades, since, limit, 'timestamp', true);
261
303
  }
304
+ getParamsForMultipleSub(methodName, symbols, limit = undefined, params = {}) {
305
+ symbols = this.marketSymbols(symbols, undefined, false, true);
306
+ const length = symbols.length;
307
+ if (length > 20) {
308
+ throw new NotSupported(this.id + ' ' + methodName + '() accepts a maximum of 20 symbols in one request');
309
+ }
310
+ const market = this.market(symbols[0]);
311
+ let marketType = undefined;
312
+ [marketType, params] = this.handleMarketTypeAndParams(methodName, market, params);
313
+ return [symbols, marketType, params];
314
+ }
262
315
  async watchTicker(symbol, params = {}) {
263
316
  /**
264
317
  * @method
@@ -796,16 +849,15 @@ export default class bitmart extends bitmartRest {
796
849
  // ]
797
850
  // }
798
851
  //
799
- const channel = this.safeString2(message, 'table', 'group');
800
- const isSpot = (channel.indexOf('spot') >= 0);
801
852
  const data = this.safeValue(message, 'data');
802
853
  if (data === undefined) {
803
854
  return;
804
855
  }
805
856
  let stored = undefined;
857
+ let symbol = undefined;
806
858
  for (let i = 0; i < data.length; i++) {
807
859
  const trade = this.parseWsTrade(data[i]);
808
- const symbol = trade['symbol'];
860
+ symbol = trade['symbol'];
809
861
  const tradesLimit = this.safeInteger(this.options, 'tradesLimit', 1000);
810
862
  stored = this.safeValue(this.trades, symbol);
811
863
  if (stored === undefined) {
@@ -814,10 +866,7 @@ export default class bitmart extends bitmartRest {
814
866
  }
815
867
  stored.append(trade);
816
868
  }
817
- let messageHash = channel;
818
- if (isSpot) {
819
- messageHash += ':' + this.safeString(data[0], 'symbol');
820
- }
869
+ const messageHash = 'trade:' + symbol;
821
870
  client.resolve(stored, messageHash);
822
871
  }
823
872
  parseWsTrade(trade, market = undefined) {
@@ -1159,8 +1208,8 @@ export default class bitmart extends bitmartRest {
1159
1208
  // "symbol": "BTC_USDT"
1160
1209
  // }
1161
1210
  //
1162
- const asks = this.safeValue(message, 'asks', []);
1163
- const bids = this.safeValue(message, 'bids', []);
1211
+ const asks = this.safeList(message, 'asks', []);
1212
+ const bids = this.safeList(message, 'bids', []);
1164
1213
  this.handleDeltas(orderbook['asks'], asks);
1165
1214
  this.handleDeltas(orderbook['bids'], bids);
1166
1215
  const timestamp = this.safeInteger(message, 'ms_t');
@@ -1174,6 +1223,7 @@ export default class bitmart extends bitmartRest {
1174
1223
  handleOrderBook(client, message) {
1175
1224
  //
1176
1225
  // spot depth-all
1226
+ //
1177
1227
  // {
1178
1228
  // "data": [
1179
1229
  // {
@@ -1193,33 +1243,31 @@ export default class bitmart extends bitmartRest {
1193
1243
  // ],
1194
1244
  // "table": "spot/depth5"
1195
1245
  // }
1246
+ //
1196
1247
  // spot increse depth snapshot
1248
+ //
1197
1249
  // {
1198
1250
  // "data":[
1199
1251
  // {
1200
- // "asks":[
1201
- // [
1202
- // "43652.52",
1203
- // "0.02039"
1204
- // ],
1205
- // ...
1206
- // ],
1207
- // "bids":[
1208
- // [
1209
- // "43652.51",
1210
- // "0.00500"
1252
+ // "asks":[
1253
+ // [ "43652.52", "0.02039" ],
1254
+ // ...
1211
1255
  // ],
1212
- // ...
1213
- // ],
1214
- // "ms_t":1703376836487,
1215
- // "symbol":"BTC_USDT",
1216
- // "type":"snapshot", // or update
1217
- // "version":2141731
1256
+ // "bids":[
1257
+ // [ "43652.51", "0.00500" ],
1258
+ // ...
1259
+ // ],
1260
+ // "ms_t":1703376836487,
1261
+ // "symbol":"BTC_USDT",
1262
+ // "type":"snapshot", // or update
1263
+ // "version":2141731
1218
1264
  // }
1219
1265
  // ],
1220
1266
  // "table":"spot/depth/increase100"
1221
1267
  // }
1268
+ //
1222
1269
  // swap
1270
+ //
1223
1271
  // {
1224
1272
  // "group":"futures/depth50:BTCUSDT",
1225
1273
  // "data":{
@@ -1240,50 +1288,69 @@ export default class bitmart extends bitmartRest {
1240
1288
  // }
1241
1289
  // }
1242
1290
  //
1243
- const data = this.safeValue(message, 'data');
1244
- if (data === undefined) {
1291
+ const isSpot = ('table' in message);
1292
+ let datas = [];
1293
+ if (isSpot) {
1294
+ datas = this.safeList(message, 'data', datas);
1295
+ }
1296
+ else {
1297
+ const orderBookEntry = this.safeDict(message, 'data');
1298
+ if (orderBookEntry !== undefined) {
1299
+ datas.push(orderBookEntry);
1300
+ }
1301
+ }
1302
+ const length = datas.length;
1303
+ if (length <= 0) {
1245
1304
  return;
1246
1305
  }
1247
- const depths = this.safeValue(data, 'depths');
1248
- const isSpot = (depths === undefined);
1249
- const table = this.safeString2(message, 'table', 'group');
1306
+ const channelName = this.safeString2(message, 'table', 'group');
1250
1307
  // find limit subscribed to
1251
1308
  const limitsToCheck = ['100', '50', '20', '10', '5'];
1252
1309
  let limit = 0;
1253
1310
  for (let i = 0; i < limitsToCheck.length; i++) {
1254
1311
  const limitString = limitsToCheck[i];
1255
- if (table.indexOf(limitString) >= 0) {
1312
+ if (channelName.indexOf(limitString) >= 0) {
1256
1313
  limit = this.parseToInt(limitString);
1257
1314
  break;
1258
1315
  }
1259
1316
  }
1260
1317
  if (isSpot) {
1261
- for (let i = 0; i < data.length; i++) {
1262
- const update = data[i];
1318
+ const channel = channelName.replace('spot/', '');
1319
+ for (let i = 0; i < datas.length; i++) {
1320
+ const update = datas[i];
1263
1321
  const marketId = this.safeString(update, 'symbol');
1264
1322
  const symbol = this.safeSymbol(marketId);
1265
- let orderbook = this.safeValue(this.orderbooks, symbol);
1323
+ let orderbook = this.safeDict(this.orderbooks, symbol);
1266
1324
  if (orderbook === undefined) {
1267
1325
  orderbook = this.orderBook({}, limit);
1268
1326
  orderbook['symbol'] = symbol;
1269
1327
  this.orderbooks[symbol] = orderbook;
1270
1328
  }
1271
1329
  const type = this.safeValue(update, 'type');
1272
- if ((type === 'snapshot') || (!(table.indexOf('increase') >= 0))) {
1330
+ if ((type === 'snapshot') || (!(channelName.indexOf('increase') >= 0))) {
1273
1331
  orderbook.reset({});
1274
1332
  }
1275
1333
  this.handleOrderBookMessage(client, update, orderbook);
1276
1334
  const timestamp = this.safeInteger(update, 'ms_t');
1277
- orderbook['timestamp'] = timestamp;
1278
- orderbook['datetime'] = this.iso8601(timestamp);
1279
- const messageHash = table + ':' + marketId;
1335
+ if (orderbook['timestamp'] === undefined) {
1336
+ orderbook['timestamp'] = timestamp;
1337
+ orderbook['datetime'] = this.iso8601(timestamp);
1338
+ }
1339
+ const messageHash = channelName + ':' + marketId;
1280
1340
  client.resolve(orderbook, messageHash);
1341
+ // resolve ForSymbols
1342
+ const messageHashForMulti = channel + ':' + symbol;
1343
+ client.resolve(orderbook, messageHashForMulti);
1281
1344
  }
1282
1345
  }
1283
1346
  else {
1347
+ const tableParts = channelName.split(':');
1348
+ const channel = tableParts[0].replace('futures/', '');
1349
+ const data = datas[0]; // contract markets always contain only one member
1350
+ const depths = data['depths'];
1284
1351
  const marketId = this.safeString(data, 'symbol');
1285
1352
  const symbol = this.safeSymbol(marketId);
1286
- let orderbook = this.safeValue(this.orderbooks, symbol);
1353
+ let orderbook = this.safeDict(this.orderbooks, symbol);
1287
1354
  if (orderbook === undefined) {
1288
1355
  orderbook = this.orderBook({}, limit);
1289
1356
  orderbook['symbol'] = symbol;
@@ -1312,10 +1379,36 @@ export default class bitmart extends bitmartRest {
1312
1379
  const timestamp = this.safeInteger(data, 'ms_t');
1313
1380
  orderbook['timestamp'] = timestamp;
1314
1381
  orderbook['datetime'] = this.iso8601(timestamp);
1315
- const messageHash = table;
1382
+ const messageHash = channelName;
1316
1383
  client.resolve(orderbook, messageHash);
1384
+ // resolve ForSymbols
1385
+ const messageHashForMulti = channel + ':' + symbol;
1386
+ client.resolve(orderbook, messageHashForMulti);
1317
1387
  }
1318
1388
  }
1389
+ async watchOrderBookForSymbols(symbols, limit = undefined, params = {}) {
1390
+ /**
1391
+ * @method
1392
+ * @name bitmart#watchOrderBookForSymbols
1393
+ * @description watches information on open orders with bid (buy) and ask (sell) prices, volumes and other data
1394
+ * @see https://developer-pro.bitmart.com/en/spot/#public-depth-increase-channel
1395
+ * @param {string[]} symbols unified array of symbols
1396
+ * @param {int} [limit] the maximum amount of order book entries to return
1397
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
1398
+ * @param {string} [params.depth] the type of order book to subscribe to, default is 'depth/increase100', also accepts 'depth5' or 'depth20' or depth50
1399
+ * @returns {object} A dictionary of [order book structures]{@link https://docs.ccxt.com/#/?id=order-book-structure} indexed by market symbols
1400
+ */
1401
+ await this.loadMarkets();
1402
+ let type = undefined;
1403
+ [symbols, type, params] = this.getParamsForMultipleSub('watchOrderBookForSymbols', symbols, limit, params);
1404
+ let channel = undefined;
1405
+ [channel, params] = this.handleOptionAndParams(params, 'watchOrderBookForSymbols', 'depth', 'depth/increase100');
1406
+ if (type === 'swap' && channel === 'depth/increase100') {
1407
+ channel = 'depth50';
1408
+ }
1409
+ const orderbook = await this.subscribeMultiple(channel, type, symbols, params);
1410
+ return orderbook.limit();
1411
+ }
1319
1412
  async authenticate(type, params = {}) {
1320
1413
  this.checkRequiredCredentials();
1321
1414
  const url = this.implodeHostname(this.urls['api']['ws'][type]['private']);
@@ -23,7 +23,7 @@ export default class bitvavo extends bitvavoRest {
23
23
  watchOrders(symbol?: Str, since?: Int, limit?: Int, params?: {}): Promise<Order[]>;
24
24
  watchMyTrades(symbol?: Str, since?: Int, limit?: Int, params?: {}): Promise<Trade[]>;
25
25
  createOrderWs(symbol: string, type: OrderType, side: OrderSide, amount: number, price?: number, params?: {}): Promise<Order>;
26
- editOrderWs(id: string, symbol: any, type: any, side: any, amount?: any, price?: any, params?: {}): Promise<Order>;
26
+ editOrderWs(id: string, symbol: string, type: OrderType, side: OrderSide, amount?: number, price?: number, params?: {}): Promise<Order>;
27
27
  cancelOrderWs(id: string, symbol?: string, params?: {}): Promise<any>;
28
28
  cancelAllOrdersWs(symbol?: string, params?: {}): Promise<any>;
29
29
  handleMultipleOrders(client: Client, message: any): void;
@@ -4,7 +4,7 @@ import Client from '../base/ws/Client.js';
4
4
  export default class bybit extends bybitRest {
5
5
  describe(): any;
6
6
  requestId(): any;
7
- getUrlByMarketType(symbol?: Str, isPrivate?: boolean, method?: any, params?: {}): any;
7
+ getUrlByMarketType(symbol?: Str, isPrivate?: boolean, method?: string, params?: {}): any;
8
8
  cleanParams(params: any): any;
9
9
  watchTicker(symbol: string, params?: {}): Promise<Ticker>;
10
10
  watchTickers(symbols?: Strings, params?: {}): Promise<Tickers>;
@@ -187,7 +187,7 @@ export default class bybit extends bybitRest {
187
187
  const market = this.market(symbol);
188
188
  symbol = market['symbol'];
189
189
  const messageHash = 'ticker:' + symbol;
190
- const url = this.getUrlByMarketType(symbol, false, params);
190
+ const url = this.getUrlByMarketType(symbol, false, 'watchTicker', params);
191
191
  params = this.cleanParams(params);
192
192
  const options = this.safeValue(this.options, 'watchTicker', {});
193
193
  let topic = this.safeString(options, 'name', 'tickers');
@@ -212,7 +212,7 @@ export default class bybit extends bybitRest {
212
212
  await this.loadMarkets();
213
213
  symbols = this.marketSymbols(symbols, undefined, false);
214
214
  const messageHashes = [];
215
- const url = this.getUrlByMarketType(symbols[0], false, params);
215
+ const url = this.getUrlByMarketType(symbols[0], false, 'watchTickers', params);
216
216
  params = this.cleanParams(params);
217
217
  const options = this.safeValue(this.options, 'watchTickers', {});
218
218
  const topic = this.safeString(options, 'name', 'tickers');
@@ -379,7 +379,7 @@ export default class bybit extends bybitRest {
379
379
  await this.loadMarkets();
380
380
  const market = this.market(symbol);
381
381
  symbol = market['symbol'];
382
- const url = this.getUrlByMarketType(symbol, false, params);
382
+ const url = this.getUrlByMarketType(symbol, false, 'watchOHLCV', params);
383
383
  params = this.cleanParams(params);
384
384
  let ohlcv = undefined;
385
385
  const timeframeId = this.safeString(this.timeframes, timeframe, timeframe);
@@ -497,7 +497,7 @@ export default class bybit extends bybitRest {
497
497
  throw new ArgumentsRequired(this.id + ' watchOrderBookForSymbols() requires a non-empty array of symbols');
498
498
  }
499
499
  symbols = this.marketSymbols(symbols);
500
- const url = this.getUrlByMarketType(symbols[0], false, params);
500
+ const url = this.getUrlByMarketType(symbols[0], false, 'watchOrderBook', params);
501
501
  params = this.cleanParams(params);
502
502
  const market = this.market(symbols[0]);
503
503
  if (limit === undefined) {
@@ -629,7 +629,7 @@ export default class bybit extends bybitRest {
629
629
  throw new ArgumentsRequired(this.id + ' watchTradesForSymbols() requires a non-empty array of symbols');
630
630
  }
631
631
  params = this.cleanParams(params);
632
- const url = this.getUrlByMarketType(symbols[0], false, params);
632
+ const url = this.getUrlByMarketType(symbols[0], false, 'watchTrades', params);
633
633
  const topics = [];
634
634
  const messageHashes = [];
635
635
  for (let i = 0; i < symbols.length; i++) {
@@ -40,9 +40,9 @@ export default class cex extends cexRest {
40
40
  fetchOrderWs(id: string, symbol?: string, params?: {}): Promise<Order>;
41
41
  fetchOpenOrdersWs(symbol?: string, since?: Int, limit?: Int, params?: {}): Promise<Order[]>;
42
42
  createOrderWs(symbol: string, type: OrderType, side: OrderSide, amount: number, price?: number, params?: {}): Promise<Order>;
43
- editOrderWs(id: string, symbol: any, type: any, side: any, amount?: any, price?: any, params?: {}): Promise<Order>;
43
+ editOrderWs(id: string, symbol: string, type: OrderType, side: OrderSide, amount?: number, price?: number, params?: {}): Promise<Order>;
44
44
  cancelOrderWs(id: string, symbol?: string, params?: {}): Promise<Order>;
45
- cancelOrdersWs(ids: any, symbol?: string, params?: {}): Promise<Order[]>;
45
+ cancelOrdersWs(ids: string[], symbol?: string, params?: {}): Promise<Order[]>;
46
46
  resolveData(client: Client, message: any): void;
47
47
  handleConnected(client: Client, message: any): any;
48
48
  handleErrorMessage(client: Client, message: any): void;
@@ -3,12 +3,12 @@ import { Strings, Tickers, Ticker, Int, Trade, OrderBook, Order } from '../base/
3
3
  export default class coinbase extends coinbaseRest {
4
4
  describe(): any;
5
5
  subscribe(name: any, symbol?: any, params?: {}): Promise<any>;
6
- watchTicker(symbol: any, params?: {}): Promise<Ticker>;
6
+ watchTicker(symbol: string, params?: {}): Promise<Ticker>;
7
7
  watchTickers(symbols?: Strings, params?: {}): Promise<Tickers>;
8
8
  handleTickers(client: any, message: any): any;
9
9
  parseWsTicker(ticker: any, market?: any): Ticker;
10
10
  watchTrades(symbol: string, since?: Int, limit?: Int, params?: {}): Promise<Trade[]>;
11
- watchOrders(symbol?: any, since?: any, limit?: any, params?: {}): Promise<Order[]>;
11
+ watchOrders(symbol?: string, since?: Int, limit?: Int, params?: {}): Promise<Order[]>;
12
12
  watchOrderBook(symbol: string, limit?: Int, params?: {}): Promise<OrderBook>;
13
13
  handleTrade(client: any, message: any): any;
14
14
  handleOrder(client: any, message: any): any;
@@ -16,7 +16,7 @@ export default class coinex extends coinexRest {
16
16
  watchTrades(symbol: string, since?: Int, limit?: Int, params?: {}): Promise<Trade[]>;
17
17
  watchOrderBook(symbol: string, limit?: Int, params?: {}): Promise<OrderBook>;
18
18
  watchOHLCV(symbol: string, timeframe?: string, since?: Int, limit?: Int, params?: {}): Promise<OHLCV[]>;
19
- fetchOHLCVWs(symbol: any, timeframe?: string, since?: any, limit?: any, params?: {}): Promise<OHLCV[]>;
19
+ fetchOHLCVWs(symbol: string, timeframe?: string, since?: Int, limit?: Int, params?: {}): Promise<OHLCV[]>;
20
20
  handleDelta(bookside: any, delta: any): void;
21
21
  handleDeltas(bookside: any, deltas: any): void;
22
22
  handleOrderBook(client: Client, message: any): void;
@@ -8,7 +8,7 @@ export default class lbank extends lbankRest {
8
8
  watchOHLCV(symbol: string, timeframe?: string, since?: Int, limit?: Int, params?: {}): Promise<OHLCV[]>;
9
9
  handleOHLCV(client: any, message: any): void;
10
10
  fetchTickerWs(symbol: any, params?: {}): Promise<Ticker>;
11
- watchTicker(symbol: any, params?: {}): Promise<Ticker>;
11
+ watchTicker(symbol: string, params?: {}): Promise<Ticker>;
12
12
  handleTicker(client: any, message: any): void;
13
13
  parseWsTicker(ticker: any, market?: any): Ticker;
14
14
  fetchTradesWs(symbol: string, since?: Int, limit?: Int, params?: {}): Promise<Trade[]>;
@@ -472,7 +472,7 @@ export default class mexc extends mexcRest {
472
472
  }
473
473
  try {
474
474
  this.handleDelta(storedOrderBook, data);
475
- const timestamp = this.safeInteger(message, 't');
475
+ const timestamp = this.safeInteger2(message, 't', 'ts');
476
476
  storedOrderBook['timestamp'] = timestamp;
477
477
  storedOrderBook['datetime'] = this.iso8601(timestamp);
478
478
  }
@@ -44,7 +44,7 @@ export default class probit extends Exchange {
44
44
  network: string;
45
45
  info: any;
46
46
  }>;
47
- fetchDepositAddresses(codes?: any, params?: {}): Promise<{}>;
47
+ fetchDepositAddresses(codes?: string[], params?: {}): Promise<{}>;
48
48
  withdraw(code: string, amount: number, address: any, tag?: any, params?: {}): Promise<Transaction>;
49
49
  fetchDeposits(code?: Str, since?: Int, limit?: Int, params?: {}): Promise<Transaction[]>;
50
50
  fetchWithdrawals(code?: Str, since?: Int, limit?: Int, params?: {}): Promise<Transaction[]>;
package/js/src/timex.d.ts CHANGED
@@ -20,7 +20,7 @@ export default class timex extends Exchange {
20
20
  parseBalance(response: any): Balances;
21
21
  fetchBalance(params?: {}): Promise<Balances>;
22
22
  createOrder(symbol: string, type: OrderType, side: OrderSide, amount: number, price?: number, params?: {}): Promise<Order>;
23
- editOrder(id: string, symbol: any, type: any, side: any, amount?: any, price?: any, params?: {}): Promise<Order>;
23
+ editOrder(id: string, symbol: string, type: OrderType, side: OrderSide, amount?: number, price?: number, params?: {}): Promise<Order>;
24
24
  cancelOrder(id: string, symbol?: Str, params?: {}): Promise<any>;
25
25
  cancelOrders(ids: any, symbol?: Str, params?: {}): Promise<any>;
26
26
  fetchOrder(id: string, symbol?: Str, params?: {}): Promise<Order>;
package/js/src/upbit.d.ts CHANGED
@@ -72,7 +72,7 @@ export default class upbit extends Exchange {
72
72
  fetchClosedOrders(symbol?: Str, since?: Int, limit?: Int, params?: {}): Promise<Order[]>;
73
73
  fetchCanceledOrders(symbol?: Str, since?: Int, limit?: Int, params?: {}): Promise<Order[]>;
74
74
  fetchOrder(id: string, symbol?: Str, params?: {}): Promise<Order>;
75
- fetchDepositAddresses(codes?: any, params?: {}): Promise<{}>;
75
+ fetchDepositAddresses(codes?: string[], params?: {}): Promise<{}>;
76
76
  parseDepositAddress(depositAddress: any, currency?: Currency): {
77
77
  currency: string;
78
78
  address: string;
@@ -314,7 +314,7 @@ export default class wavesexchange extends Exchange {
314
314
  },
315
315
  },
316
316
  'currencies': {
317
- 'WX': this.safeCurrencyStructure({ 'id': 'EMAMLxDnv3xiz8RXg8Btj33jcEw3wLczL3JKYYmuubpc', 'numericId': undefined, 'code': 'WX', 'precision': this.parseNumber('8') }),
317
+ 'WX': this.safeCurrencyStructure({ 'id': 'EMAMLxDnv3xiz8RXg8Btj33jcEw3wLczL3JKYYmuubpc', 'numericId': undefined, 'code': 'WX', 'precision': this.parseToInt('8') }),
318
318
  },
319
319
  'precisionMode': DECIMAL_PLACES,
320
320
  'options': {
@@ -9,7 +9,7 @@ export default class whitebit extends Exchange {
9
9
  fetchMarkets(params?: {}): Promise<import("./base/types.js").MarketInterface[]>;
10
10
  parseMarket(market: any): Market;
11
11
  fetchCurrencies(params?: {}): Promise<{}>;
12
- fetchTransactionFees(codes?: any, params?: {}): Promise<{
12
+ fetchTransactionFees(codes?: string[], params?: {}): Promise<{
13
13
  withdraw: {};
14
14
  deposit: {};
15
15
  info: any;
@@ -51,7 +51,7 @@ export default class whitebit extends Exchange {
51
51
  info: any;
52
52
  }>;
53
53
  setLeverage(leverage: Int, symbol?: Str, params?: {}): Promise<any>;
54
- transfer(code: string, amount: number, fromAccount: any, toAccount: any, params?: {}): Promise<TransferEntry>;
54
+ transfer(code: string, amount: number, fromAccount: string, toAccount: string, params?: {}): Promise<TransferEntry>;
55
55
  parseTransfer(transfer: any, currency?: Currency): {
56
56
  info: any;
57
57
  id: any;
package/js/src/woo.d.ts CHANGED
@@ -13,11 +13,11 @@ export default class woo extends Exchange {
13
13
  parseTokenAndFeeTemp(item: any, feeTokenKey: any, feeAmountKey: any): any;
14
14
  fetchTradingFees(params?: {}): Promise<{}>;
15
15
  fetchCurrencies(params?: {}): Promise<{}>;
16
- createMarketBuyOrderWithCost(symbol: string, cost: any, params?: {}): Promise<Order>;
16
+ createMarketBuyOrderWithCost(symbol: string, cost: number, params?: {}): Promise<Order>;
17
17
  createTrailingAmountOrder(symbol: string, type: OrderType, side: OrderSide, amount: any, price?: any, trailingAmount?: any, trailingTriggerPrice?: any, params?: {}): Promise<Order>;
18
18
  createTrailingPercentOrder(symbol: string, type: OrderType, side: OrderSide, amount: any, price?: any, trailingPercent?: any, trailingTriggerPrice?: any, params?: {}): Promise<Order>;
19
19
  createOrder(symbol: string, type: OrderType, side: OrderSide, amount: number, price?: number, params?: {}): Promise<Order>;
20
- editOrder(id: string, symbol: any, type: any, side: any, amount?: any, price?: any, params?: {}): Promise<Order>;
20
+ editOrder(id: string, symbol: string, type: OrderType, side: OrderSide, amount?: number, price?: number, params?: {}): Promise<Order>;
21
21
  cancelOrder(id: string, symbol?: Str, params?: {}): Promise<any>;
22
22
  cancelAllOrders(symbol?: Str, params?: {}): Promise<any>;
23
23
  fetchOrder(id: string, symbol?: Str, params?: {}): Promise<Order>;
@@ -73,7 +73,7 @@ export default class woo extends Exchange {
73
73
  fetchDepositsWithdrawals(code?: Str, since?: Int, limit?: Int, params?: {}): Promise<Transaction[]>;
74
74
  parseTransaction(transaction: any, currency?: Currency): Transaction;
75
75
  parseTransactionStatus(status: any): string;
76
- transfer(code: string, amount: number, fromAccount: any, toAccount: any, params?: {}): Promise<TransferEntry>;
76
+ transfer(code: string, amount: number, fromAccount: string, toAccount: string, params?: {}): Promise<TransferEntry>;
77
77
  fetchTransfers(code?: Str, since?: Int, limit?: Int, params?: {}): Promise<any>;
78
78
  parseTransfer(transfer: any, currency?: Currency): {
79
79
  id: string;
package/js/src/woo.js CHANGED
@@ -1068,7 +1068,7 @@ export default class woo extends Exchange {
1068
1068
  if (stopPrice !== undefined) {
1069
1069
  request['triggerPrice'] = this.priceToPrecision(symbol, stopPrice);
1070
1070
  }
1071
- const trailingTriggerPrice = this.safeString2(params, 'trailingTriggerPrice', 'activatedPrice', price);
1071
+ const trailingTriggerPrice = this.safeString2(params, 'trailingTriggerPrice', 'activatedPrice', this.numberToString(price));
1072
1072
  const trailingAmount = this.safeString2(params, 'trailingAmount', 'callbackValue');
1073
1073
  const trailingPercent = this.safeString2(params, 'trailingPercent', 'callbackRate');
1074
1074
  const isTrailingAmountOrder = trailingAmount !== undefined;
package/js/src/zonda.d.ts CHANGED
@@ -15,7 +15,7 @@ export default class zonda extends Exchange {
15
15
  fetchBalance(params?: {}): Promise<Balances>;
16
16
  fetchOrderBook(symbol: string, limit?: Int, params?: {}): Promise<OrderBook>;
17
17
  parseTicker(ticker: any, market?: Market): Ticker;
18
- fetchTicker(symbol: any, params?: {}): Promise<Ticker>;
18
+ fetchTicker(symbol: string, params?: {}): Promise<Ticker>;
19
19
  fetchTickers(symbols?: Strings, params?: {}): Promise<Tickers>;
20
20
  fetchLedger(code?: Str, since?: Int, limit?: Int, params?: {}): Promise<any>;
21
21
  parseLedgerEntry(item: any, currency?: Currency): {
@@ -57,8 +57,8 @@ export default class zonda extends Exchange {
57
57
  network: any;
58
58
  info: any;
59
59
  }>;
60
- fetchDepositAddresses(codes?: any, params?: {}): Promise<{}>;
61
- transfer(code: string, amount: number, fromAccount: any, toAccount: any, params?: {}): Promise<TransferEntry>;
60
+ fetchDepositAddresses(codes?: string[], params?: {}): Promise<{}>;
61
+ transfer(code: string, amount: number, fromAccount: string, toAccount: string, params?: {}): Promise<TransferEntry>;
62
62
  parseTransfer(transfer: any, currency?: Currency): {
63
63
  info: any;
64
64
  id: any;