ccxt 4.1.86 → 4.1.88

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 (234) hide show
  1. package/README.md +9 -11
  2. package/dist/ccxt.browser.js +5673 -8615
  3. package/dist/ccxt.browser.min.js +3 -3
  4. package/dist/cjs/ccxt.js +1 -11
  5. package/dist/cjs/src/base/Exchange.js +95 -27
  6. package/dist/cjs/src/base/ws/Client.js +3 -3
  7. package/dist/cjs/src/base/ws/Future.js +9 -2
  8. package/dist/cjs/src/base/ws/WsClient.js +1 -1
  9. package/dist/cjs/src/binance.js +4 -105
  10. package/dist/cjs/src/binanceus.js +0 -2
  11. package/dist/cjs/src/bit2c.js +8 -2
  12. package/dist/cjs/src/bitforex.js +0 -2
  13. package/dist/cjs/src/bitget.js +3455 -2480
  14. package/dist/cjs/src/bitmart.js +35 -9
  15. package/dist/cjs/src/coinbase.js +2 -0
  16. package/dist/cjs/src/coinbasepro.js +0 -43
  17. package/dist/cjs/src/coinlist.js +0 -2
  18. package/dist/cjs/src/coinsph.js +0 -31
  19. package/dist/cjs/src/cryptocom.js +22 -12
  20. package/dist/cjs/src/gate.js +37 -249
  21. package/dist/cjs/src/gemini.js +1 -0
  22. package/dist/cjs/src/kuna.js +0 -2
  23. package/dist/cjs/src/mexc.js +0 -2
  24. package/dist/cjs/src/novadax.js +28 -16
  25. package/dist/cjs/src/okcoin.js +23 -5
  26. package/dist/cjs/src/okx.js +0 -1
  27. package/dist/cjs/src/pro/binance.js +18 -215
  28. package/dist/cjs/src/pro/bitget.js +780 -736
  29. package/dist/cjs/src/pro/bitmart.js +8 -10
  30. package/dist/cjs/src/pro/bitmex.js +9 -34
  31. package/dist/cjs/src/pro/bitpanda.js +4 -4
  32. package/dist/cjs/src/pro/bybit.js +21 -97
  33. package/dist/cjs/src/pro/coinbasepro.js +36 -40
  34. package/dist/cjs/src/pro/coinex.js +2 -1
  35. package/dist/cjs/src/pro/cryptocom.js +10 -26
  36. package/dist/cjs/src/pro/gate.js +20 -17
  37. package/dist/cjs/src/pro/kucoin.js +39 -39
  38. package/dist/cjs/src/pro/kucoinfutures.js +40 -36
  39. package/dist/cjs/src/pro/okx.js +16 -29
  40. package/dist/cjs/src/tokocrypto.js +0 -1
  41. package/dist/cjs/src/upbit.js +36 -26
  42. package/dist/cjs/src/wazirx.js +0 -2
  43. package/dist/cjs/src/whitebit.js +0 -2
  44. package/dist/cjs/src/woo.js +0 -2
  45. package/js/ccxt.d.ts +3 -15
  46. package/js/ccxt.js +2 -10
  47. package/js/src/abstract/bitget.d.ts +1 -1
  48. package/js/src/ace.d.ts +1 -1
  49. package/js/src/alpaca.d.ts +1 -1
  50. package/js/src/ascendex.d.ts +1 -1
  51. package/js/src/base/Exchange.d.ts +5 -6
  52. package/js/src/base/Exchange.js +96 -28
  53. package/js/src/base/ws/Client.d.ts +2 -2
  54. package/js/src/base/ws/Client.js +4 -4
  55. package/js/src/base/ws/Future.d.ts +5 -2
  56. package/js/src/base/ws/Future.js +8 -2
  57. package/js/src/base/ws/WsClient.d.ts +1 -1
  58. package/js/src/base/ws/WsClient.js +2 -2
  59. package/js/src/bigone.d.ts +1 -1
  60. package/js/src/binance.d.ts +1 -10
  61. package/js/src/binance.js +4 -105
  62. package/js/src/binanceus.js +0 -2
  63. package/js/src/bingx.d.ts +1 -1
  64. package/js/src/bit2c.d.ts +1 -1
  65. package/js/src/bit2c.js +8 -2
  66. package/js/src/bitbank.d.ts +1 -1
  67. package/js/src/bitbns.d.ts +1 -1
  68. package/js/src/bitfinex.d.ts +1 -1
  69. package/js/src/bitfinex2.d.ts +1 -1
  70. package/js/src/bitflyer.d.ts +1 -1
  71. package/js/src/bitforex.d.ts +1 -1
  72. package/js/src/bitforex.js +0 -2
  73. package/js/src/bitget.d.ts +13 -11
  74. package/js/src/bitget.js +3455 -2480
  75. package/js/src/bithumb.d.ts +1 -1
  76. package/js/src/bitmart.d.ts +1 -1
  77. package/js/src/bitmart.js +35 -9
  78. package/js/src/bitmex.d.ts +1 -1
  79. package/js/src/bitopro.d.ts +1 -1
  80. package/js/src/bitpanda.d.ts +1 -1
  81. package/js/src/bitrue.d.ts +1 -1
  82. package/js/src/bitso.d.ts +1 -1
  83. package/js/src/bitstamp.d.ts +1 -1
  84. package/js/src/bitvavo.d.ts +1 -1
  85. package/js/src/bl3p.d.ts +1 -1
  86. package/js/src/blockchaincom.d.ts +1 -1
  87. package/js/src/btcalpha.d.ts +1 -1
  88. package/js/src/btcbox.d.ts +1 -1
  89. package/js/src/btcmarkets.d.ts +1 -1
  90. package/js/src/btcturk.d.ts +1 -1
  91. package/js/src/bybit.d.ts +1 -1
  92. package/js/src/cex.d.ts +1 -1
  93. package/js/src/coinbase.d.ts +1 -1
  94. package/js/src/coinbase.js +2 -0
  95. package/js/src/coinbasepro.d.ts +1 -5
  96. package/js/src/coinbasepro.js +1 -44
  97. package/js/src/coincheck.d.ts +1 -1
  98. package/js/src/coinex.d.ts +1 -1
  99. package/js/src/coinlist.d.ts +1 -1
  100. package/js/src/coinlist.js +0 -2
  101. package/js/src/coinmate.d.ts +1 -1
  102. package/js/src/coinone.d.ts +1 -1
  103. package/js/src/coinsph.d.ts +1 -2
  104. package/js/src/coinsph.js +0 -31
  105. package/js/src/coinspot.d.ts +1 -1
  106. package/js/src/cryptocom.d.ts +1 -1
  107. package/js/src/cryptocom.js +22 -12
  108. package/js/src/currencycom.d.ts +1 -1
  109. package/js/src/delta.d.ts +1 -1
  110. package/js/src/deribit.d.ts +1 -1
  111. package/js/src/digifinex.d.ts +1 -1
  112. package/js/src/exmo.d.ts +1 -1
  113. package/js/src/gate.d.ts +1 -28
  114. package/js/src/gate.js +37 -249
  115. package/js/src/gemini.d.ts +1 -1
  116. package/js/src/gemini.js +1 -0
  117. package/js/src/hitbtc.d.ts +1 -1
  118. package/js/src/hollaex.d.ts +1 -1
  119. package/js/src/htx.d.ts +1 -1
  120. package/js/src/huobijp.d.ts +1 -1
  121. package/js/src/idex.d.ts +1 -1
  122. package/js/src/independentreserve.d.ts +1 -1
  123. package/js/src/indodax.d.ts +1 -1
  124. package/js/src/kraken.d.ts +1 -1
  125. package/js/src/krakenfutures.d.ts +1 -1
  126. package/js/src/kucoin.d.ts +1 -1
  127. package/js/src/kucoinfutures.d.ts +1 -1
  128. package/js/src/kuna.d.ts +1 -1
  129. package/js/src/kuna.js +0 -2
  130. package/js/src/latoken.d.ts +1 -1
  131. package/js/src/lbank.d.ts +1 -1
  132. package/js/src/luno.d.ts +1 -1
  133. package/js/src/lykke.d.ts +1 -1
  134. package/js/src/mercado.d.ts +1 -1
  135. package/js/src/mexc.d.ts +1 -1
  136. package/js/src/mexc.js +0 -2
  137. package/js/src/ndax.d.ts +1 -1
  138. package/js/src/novadax.d.ts +1 -1
  139. package/js/src/novadax.js +28 -16
  140. package/js/src/oceanex.d.ts +1 -1
  141. package/js/src/okcoin.d.ts +1 -1
  142. package/js/src/okcoin.js +23 -5
  143. package/js/src/okx.d.ts +1 -1
  144. package/js/src/okx.js +0 -1
  145. package/js/src/p2b.d.ts +1 -1
  146. package/js/src/paymium.d.ts +1 -1
  147. package/js/src/phemex.d.ts +1 -1
  148. package/js/src/poloniex.d.ts +1 -1
  149. package/js/src/poloniexfutures.d.ts +1 -1
  150. package/js/src/pro/alpaca.d.ts +8 -8
  151. package/js/src/pro/ascendex.d.ts +7 -7
  152. package/js/src/pro/binance.d.ts +22 -24
  153. package/js/src/pro/binance.js +19 -216
  154. package/js/src/pro/bingx.d.ts +7 -7
  155. package/js/src/pro/bitfinex.d.ts +6 -6
  156. package/js/src/pro/bitfinex2.d.ts +11 -11
  157. package/js/src/pro/bitget.d.ts +20 -22
  158. package/js/src/pro/bitget.js +780 -736
  159. package/js/src/pro/bitmart.d.ts +13 -13
  160. package/js/src/pro/bitmart.js +8 -10
  161. package/js/src/pro/bitmex.d.ts +10 -10
  162. package/js/src/pro/bitmex.js +9 -34
  163. package/js/src/pro/bitopro.d.ts +5 -5
  164. package/js/src/pro/bitpanda.d.ts +11 -11
  165. package/js/src/pro/bitpanda.js +4 -4
  166. package/js/src/pro/bitrue.d.ts +5 -5
  167. package/js/src/pro/bitstamp.d.ts +6 -6
  168. package/js/src/pro/bitvavo.d.ts +7 -7
  169. package/js/src/pro/blockchaincom.d.ts +10 -10
  170. package/js/src/pro/bybit.d.ts +15 -16
  171. package/js/src/pro/bybit.js +21 -97
  172. package/js/src/pro/cex.d.ts +20 -20
  173. package/js/src/pro/coinbase.d.ts +7 -6
  174. package/js/src/pro/coinbasepro.d.ts +12 -12
  175. package/js/src/pro/coinbasepro.js +36 -40
  176. package/js/src/pro/coinex.d.ts +12 -12
  177. package/js/src/pro/coinex.js +2 -1
  178. package/js/src/pro/cryptocom.d.ts +14 -14
  179. package/js/src/pro/cryptocom.js +10 -26
  180. package/js/src/pro/currencycom.d.ts +6 -6
  181. package/js/src/pro/deribit.d.ts +8 -8
  182. package/js/src/pro/exmo.d.ts +6 -6
  183. package/js/src/pro/gate.d.ts +12 -11
  184. package/js/src/pro/gate.js +20 -17
  185. package/js/src/pro/gemini.d.ts +7 -7
  186. package/js/src/pro/hitbtc.d.ts +13 -13
  187. package/js/src/pro/hollaex.d.ts +6 -6
  188. package/js/src/pro/htx.d.ts +12 -12
  189. package/js/src/pro/huobijp.d.ts +5 -5
  190. package/js/src/pro/idex.d.ts +7 -7
  191. package/js/src/pro/independentreserve.d.ts +4 -4
  192. package/js/src/pro/kraken.d.ts +11 -11
  193. package/js/src/pro/krakenfutures.d.ts +15 -15
  194. package/js/src/pro/kucoin.d.ts +14 -13
  195. package/js/src/pro/kucoin.js +39 -39
  196. package/js/src/pro/kucoinfutures.d.ts +12 -11
  197. package/js/src/pro/kucoinfutures.js +40 -36
  198. package/js/src/pro/luno.d.ts +3 -3
  199. package/js/src/pro/mexc.d.ts +11 -11
  200. package/js/src/pro/ndax.d.ts +5 -5
  201. package/js/src/pro/okcoin.d.ts +7 -7
  202. package/js/src/pro/okx.d.ts +17 -17
  203. package/js/src/pro/okx.js +16 -29
  204. package/js/src/pro/phemex.d.ts +9 -9
  205. package/js/src/pro/poloniex.d.ts +13 -13
  206. package/js/src/pro/poloniexfutures.d.ts +10 -10
  207. package/js/src/pro/probit.d.ts +7 -7
  208. package/js/src/pro/upbit.d.ts +4 -4
  209. package/js/src/pro/wazirx.d.ts +12 -12
  210. package/js/src/pro/whitebit.d.ts +10 -10
  211. package/js/src/pro/woo.d.ts +11 -11
  212. package/js/src/probit.d.ts +1 -1
  213. package/js/src/timex.d.ts +1 -1
  214. package/js/src/tokocrypto.d.ts +1 -1
  215. package/js/src/tokocrypto.js +0 -1
  216. package/js/src/upbit.d.ts +1 -1
  217. package/js/src/upbit.js +36 -26
  218. package/js/src/wavesexchange.d.ts +1 -1
  219. package/js/src/wazirx.d.ts +1 -1
  220. package/js/src/wazirx.js +0 -2
  221. package/js/src/whitebit.d.ts +1 -1
  222. package/js/src/whitebit.js +0 -2
  223. package/js/src/woo.d.ts +1 -1
  224. package/js/src/woo.js +0 -2
  225. package/js/src/yobit.d.ts +1 -1
  226. package/js/src/zaif.d.ts +1 -1
  227. package/js/src/zonda.d.ts +1 -1
  228. package/jsdoc2md.js +0 -2
  229. package/package.json +1 -1
  230. package/skip-tests.json +3 -14
  231. package/js/src/abstract/bittrex.d.ts +0 -79
  232. package/js/src/abstract/bittrex.js +0 -11
  233. package/js/src/abstract/coinbaseprime.d.ts +0 -69
  234. package/js/src/abstract/coinbaseprime.js +0 -11
@@ -73,11 +73,7 @@ class cryptocom extends cryptocom$1 {
73
73
  * @param {object} [params] extra parameters specific to the exchange API endpoint
74
74
  * @returns {object} A dictionary of [order book structures]{@link https://docs.ccxt.com/#/?id=order-book-structure} indexed by market symbols
75
75
  */
76
- await this.loadMarkets();
77
- const market = this.market(symbol);
78
- const messageHash = 'book' + '.' + market['id'];
79
- const orderbook = await this.watchPublic(messageHash, params);
80
- return orderbook.limit();
76
+ return await this.watchOrderBookForSymbols([symbol], limit, params);
81
77
  }
82
78
  async watchOrderBookForSymbols(symbols, limit = undefined, params = {}) {
83
79
  /**
@@ -96,11 +92,10 @@ class cryptocom extends cryptocom$1 {
96
92
  for (let i = 0; i < symbols.length; i++) {
97
93
  const symbol = symbols[i];
98
94
  const market = this.market(symbol);
99
- const currentMessageHash = 'book' + '.' + market['id'];
100
- topics.push(currentMessageHash);
95
+ const currentTopic = 'book' + '.' + market['id'];
96
+ topics.push(currentTopic);
101
97
  }
102
- const messageHash = 'multipleOrderbooks::' + symbols.join(',');
103
- const orderbook = await this.watchPublicMultiple(messageHash, topics, params);
98
+ const orderbook = await this.watchPublicMultiple(topics, topics, params);
104
99
  return orderbook.limit();
105
100
  }
106
101
  handleOrderBookSnapshot(client, message) {
@@ -142,7 +137,6 @@ class cryptocom extends cryptocom$1 {
142
137
  orderbook.reset(snapshot);
143
138
  this.orderbooks[symbol] = orderbook;
144
139
  client.resolve(orderbook, messageHash);
145
- this.resolvePromiseIfMessagehashMatches(client, 'multipleOrderbooks::', symbol, orderbook);
146
140
  }
147
141
  async watchTrades(symbol, since = undefined, limit = undefined, params = {}) {
148
142
  /**
@@ -156,15 +150,7 @@ class cryptocom extends cryptocom$1 {
156
150
  * @param {object} [params] extra parameters specific to the exchange API endpoint
157
151
  * @returns {object[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=public-trades}
158
152
  */
159
- await this.loadMarkets();
160
- const market = this.market(symbol);
161
- symbol = market['symbol'];
162
- const messageHash = 'trade' + '.' + market['id'];
163
- const trades = await this.watchPublic(messageHash, params);
164
- if (this.newUpdates) {
165
- limit = trades.getLimit(symbol, limit);
166
- }
167
- return this.filterBySinceLimit(trades, since, limit, 'timestamp', true);
153
+ return await this.watchTradesForSymbols([symbol], since, limit, params);
168
154
  }
169
155
  async watchTradesForSymbols(symbols, since = undefined, limit = undefined, params = {}) {
170
156
  /**
@@ -184,11 +170,10 @@ class cryptocom extends cryptocom$1 {
184
170
  for (let i = 0; i < symbols.length; i++) {
185
171
  const symbol = symbols[i];
186
172
  const market = this.market(symbol);
187
- const currentMessageHash = 'trade' + '.' + market['id'];
188
- topics.push(currentMessageHash);
173
+ const currentTopic = 'trade' + '.' + market['id'];
174
+ topics.push(currentTopic);
189
175
  }
190
- const messageHash = 'multipleTrades::' + symbols.join(',');
191
- const trades = await this.watchPublicMultiple(messageHash, topics, params);
176
+ const trades = await this.watchPublicMultiple(topics, topics, params);
192
177
  if (this.newUpdates) {
193
178
  const first = this.safeValue(trades, 0);
194
179
  const tradeSymbol = this.safeString(first, 'symbol');
@@ -242,7 +227,6 @@ class cryptocom extends cryptocom$1 {
242
227
  const channelReplaced = channel.replace('.' + marketId, '');
243
228
  client.resolve(stored, symbolSpecificMessageHash);
244
229
  client.resolve(stored, channelReplaced);
245
- this.resolvePromiseIfMessagehashMatches(client, 'multipleTrades::', symbol, stored);
246
230
  }
247
231
  async watchMyTrades(symbol = undefined, since = undefined, limit = undefined, params = {}) {
248
232
  /**
@@ -761,7 +745,7 @@ class cryptocom extends cryptocom$1 {
761
745
  const message = this.extend(request, params);
762
746
  return await this.watch(url, messageHash, message, messageHash);
763
747
  }
764
- async watchPublicMultiple(messageHash, topics, params = {}) {
748
+ async watchPublicMultiple(messageHashes, topics, params = {}) {
765
749
  const url = this.urls['api']['ws']['public'];
766
750
  const id = this.nonce();
767
751
  const request = {
@@ -772,7 +756,7 @@ class cryptocom extends cryptocom$1 {
772
756
  'nonce': id,
773
757
  };
774
758
  const message = this.extend(request, params);
775
- return await this.watch(url, messageHash, message, messageHash);
759
+ return await this.watchMultiple(url, messageHashes, message, messageHashes);
776
760
  }
777
761
  async watchPrivateRequest(nonce, params = {}) {
778
762
  await this.authenticate();
@@ -385,20 +385,7 @@ class gate extends gate$1 {
385
385
  * @param {object} [params] extra parameters specific to the exchange API endpoint
386
386
  * @returns {object[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=public-trades}
387
387
  */
388
- await this.loadMarkets();
389
- const market = this.market(symbol);
390
- symbol = market['symbol'];
391
- const marketId = market['id'];
392
- const messageType = this.getTypeByMarket(market);
393
- const channel = messageType + '.trades';
394
- const messageHash = 'trades:' + symbol;
395
- const url = this.getUrlByMarket(market);
396
- const payload = [marketId];
397
- const trades = await this.subscribePublic(url, messageHash, payload, channel, params);
398
- if (this.newUpdates) {
399
- limit = trades.getLimit(symbol, limit);
400
- }
401
- return this.filterBySinceLimit(trades, since, limit, 'timestamp', true);
388
+ return await this.watchTradesForSymbols([symbol], since, limit, params);
402
389
  }
403
390
  async watchTradesForSymbols(symbols, since = undefined, limit = undefined, params = {}) {
404
391
  /**
@@ -417,9 +404,13 @@ class gate extends gate$1 {
417
404
  const market = this.market(symbols[0]);
418
405
  const messageType = this.getTypeByMarket(market);
419
406
  const channel = messageType + '.trades';
420
- const messageHash = 'multipleTrades::' + symbols.join(',');
407
+ const messageHashes = [];
408
+ for (let i = 0; i < symbols.length; i++) {
409
+ const symbol = symbols[i];
410
+ messageHashes.push('trades:' + symbol);
411
+ }
421
412
  const url = this.getUrlByMarket(market);
422
- const trades = await this.subscribePublic(url, messageHash, marketIds, channel, params);
413
+ const trades = await this.subscribePublicMultiple(url, messageHashes, marketIds, channel, params);
423
414
  if (this.newUpdates) {
424
415
  const first = this.safeValue(trades, 0);
425
416
  const tradeSymbol = this.safeString(first, 'symbol');
@@ -461,7 +452,6 @@ class gate extends gate$1 {
461
452
  cachedTrades.append(trade);
462
453
  const hash = 'trades:' + symbol;
463
454
  client.resolve(cachedTrades, hash);
464
- this.resolvePromiseIfMessagehashMatches(client, 'multipleTrades::', symbol, cachedTrades);
465
455
  }
466
456
  }
467
457
  async watchOHLCV(symbol, timeframe = '1m', since = undefined, limit = undefined, params = {}) {
@@ -1264,6 +1254,19 @@ class gate extends gate$1 {
1264
1254
  const message = this.extend(request, params);
1265
1255
  return await this.watch(url, messageHash, message, messageHash, subscription);
1266
1256
  }
1257
+ async subscribePublicMultiple(url, messageHashes, payload, channel, params = {}) {
1258
+ const requestId = this.requestId();
1259
+ const time = this.seconds();
1260
+ const request = {
1261
+ 'id': requestId,
1262
+ 'time': time,
1263
+ 'channel': channel,
1264
+ 'event': 'subscribe',
1265
+ 'payload': payload,
1266
+ };
1267
+ const message = this.extend(request, params);
1268
+ return await this.watchMultiple(url, messageHashes, message, messageHashes);
1269
+ }
1267
1270
  async subscribePrivate(url, messageHash, payload, channel, params, requiresUid = false) {
1268
1271
  this.checkRequiredCredentials();
1269
1272
  // uid is required for some subscriptions only so it's not a part of required credentials
@@ -121,6 +121,24 @@ class kucoin extends kucoin$1 {
121
121
  }
122
122
  return await this.watch(url, messageHash, message, subscriptionHash, subscription);
123
123
  }
124
+ async subscribeMultiple(url, messageHashes, topic, subscriptionHashes, params = {}, subscription = undefined) {
125
+ const requestId = this.requestId().toString();
126
+ const request = {
127
+ 'id': requestId,
128
+ 'type': 'subscribe',
129
+ 'topic': topic,
130
+ 'response': true,
131
+ };
132
+ const message = this.extend(request, params);
133
+ const client = this.client(url);
134
+ for (let i = 0; i < subscriptionHashes.length; i++) {
135
+ const subscriptionHash = subscriptionHashes[i];
136
+ if (!(subscriptionHash in client.subscriptions)) {
137
+ client.subscriptions[requestId] = subscriptionHash;
138
+ }
139
+ }
140
+ return await this.watchMultiple(url, messageHashes, message, subscriptionHashes, subscription);
141
+ }
124
142
  async watchTicker(symbol, params = {}) {
125
143
  /**
126
144
  * @method
@@ -333,17 +351,7 @@ class kucoin extends kucoin$1 {
333
351
  * @param {object} [params] extra parameters specific to the exchange API endpoint
334
352
  * @returns {object[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=public-trades}
335
353
  */
336
- await this.loadMarkets();
337
- const url = await this.negotiate(false);
338
- const market = this.market(symbol);
339
- symbol = market['symbol'];
340
- const topic = '/market/match:' + market['id'];
341
- const messageHash = 'trades:' + symbol;
342
- const trades = await this.subscribe(url, messageHash, topic, params);
343
- if (this.newUpdates) {
344
- limit = trades.getLimit(symbol, limit);
345
- }
346
- return this.filterBySinceLimit(trades, since, limit, 'timestamp', true);
354
+ return await this.watchTradesForSymbols([symbol], since, limit, params);
347
355
  }
348
356
  async watchTradesForSymbols(symbols, since = undefined, limit = undefined, params = {}) {
349
357
  /**
@@ -362,12 +370,18 @@ class kucoin extends kucoin$1 {
362
370
  }
363
371
  await this.loadMarkets();
364
372
  symbols = this.marketSymbols(symbols);
365
- const url = await this.negotiate(false);
366
- symbols = this.marketSymbols(symbols);
367
373
  const marketIds = this.marketIds(symbols);
374
+ const url = await this.negotiate(false);
375
+ const messageHashes = [];
376
+ const subscriptionHashes = [];
368
377
  const topic = '/market/match:' + marketIds.join(',');
369
- const messageHash = 'multipleTrades::' + symbols.join(',');
370
- const trades = await this.subscribe(url, messageHash, topic, params);
378
+ for (let i = 0; i < symbols.length; i++) {
379
+ const symbol = symbols[i];
380
+ messageHashes.push('trades:' + symbol);
381
+ const marketId = marketIds[i];
382
+ subscriptionHashes.push('/market/match:' + marketId);
383
+ }
384
+ const trades = await this.subscribeMultiple(url, messageHashes, topic, subscriptionHashes, params);
371
385
  if (this.newUpdates) {
372
386
  const first = this.safeValue(trades, 0);
373
387
  const tradeSymbol = this.safeString(first, 'symbol');
@@ -407,8 +421,6 @@ class kucoin extends kucoin$1 {
407
421
  }
408
422
  trades.append(trade);
409
423
  client.resolve(trades, messageHash);
410
- // watchMultipleTrades
411
- this.resolvePromiseIfMessagehashMatches(client, 'multipleTrades::', symbol, trades);
412
424
  }
413
425
  async watchOrderBook(symbol, limit = undefined, params = {}) {
414
426
  /**
@@ -435,24 +447,7 @@ class kucoin extends kucoin$1 {
435
447
  // If the size=0, update the sequence and remove the price of which the
436
448
  // size is 0 out of level 2. Fr other cases, please update the price.
437
449
  //
438
- if (limit !== undefined) {
439
- if ((limit !== 20) && (limit !== 100)) {
440
- throw new errors.ExchangeError(this.id + " watchOrderBook 'limit' argument must be undefined, 20 or 100");
441
- }
442
- }
443
- await this.loadMarkets();
444
- const url = await this.negotiate(false);
445
- const market = this.market(symbol);
446
- symbol = market['symbol'];
447
- const topic = '/market/level2:' + market['id'];
448
- const messageHash = 'orderbook:' + symbol;
449
- const subscription = {
450
- 'method': this.handleOrderBookSubscription,
451
- 'symbol': symbol,
452
- 'limit': limit,
453
- };
454
- const orderbook = await this.subscribe(url, messageHash, topic, params, subscription);
455
- return orderbook.limit();
450
+ return await this.watchOrderBookForSymbols([symbol], limit, params);
456
451
  }
457
452
  async watchOrderBookForSymbols(symbols, limit = undefined, params = {}) {
458
453
  /**
@@ -478,13 +473,20 @@ class kucoin extends kucoin$1 {
478
473
  const marketIds = this.marketIds(symbols);
479
474
  const url = await this.negotiate(false);
480
475
  const topic = '/market/level2:' + marketIds.join(',');
481
- const messageHash = 'multipleOrderbook::' + symbols.join(',');
476
+ const messageHashes = [];
477
+ const subscriptionHashes = [];
478
+ for (let i = 0; i < symbols.length; i++) {
479
+ const symbol = symbols[i];
480
+ messageHashes.push('orderbook:' + symbol);
481
+ const marketId = marketIds[i];
482
+ subscriptionHashes.push('/market/level2:' + marketId);
483
+ }
482
484
  const subscription = {
483
485
  'method': this.handleOrderBookSubscription,
484
486
  'symbols': symbols,
485
487
  'limit': limit,
486
488
  };
487
- const orderbook = await this.subscribe(url, messageHash, topic, params, subscription);
489
+ const orderbook = await this.subscribeMultiple(url, messageHashes, topic, subscriptionHashes, params, subscription);
488
490
  return orderbook.limit();
489
491
  }
490
492
  handleOrderBook(client, message) {
@@ -542,8 +544,6 @@ class kucoin extends kucoin$1 {
542
544
  }
543
545
  this.handleDelta(storedOrderBook, data);
544
546
  client.resolve(storedOrderBook, messageHash);
545
- // watchMultipleOrderBook
546
- this.resolvePromiseIfMessagehashMatches(client, 'multipleOrderbook::', symbol, storedOrderBook);
547
547
  }
548
548
  getCacheIndex(orderbook, cache) {
549
549
  const firstDelta = this.safeValue(cache, 0);
@@ -136,6 +136,26 @@ class kucoinfutures extends kucoinfutures$1 {
136
136
  }
137
137
  return await this.watch(url, messageHash, message, subscriptionHash, subscription);
138
138
  }
139
+ async subscribeMultiple(url, messageHashes, topic, subscriptionHashes, subscription, params = {}) {
140
+ const requestId = this.requestId().toString();
141
+ const request = {
142
+ 'id': requestId,
143
+ 'type': 'subscribe',
144
+ 'topic': topic,
145
+ 'response': true,
146
+ };
147
+ const message = this.extend(request, params);
148
+ const subscriptionRequest = {
149
+ 'id': requestId,
150
+ };
151
+ if (subscription === undefined) {
152
+ subscription = subscriptionRequest;
153
+ }
154
+ else {
155
+ subscription = this.extend(subscriptionRequest, subscription);
156
+ }
157
+ return await this.watchMultiple(url, messageHashes, message, subscriptionHashes, subscription);
158
+ }
139
159
  async watchTicker(symbol, params = {}) {
140
160
  /**
141
161
  * @method
@@ -370,17 +390,7 @@ class kucoinfutures extends kucoinfutures$1 {
370
390
  * @param {object} [params] extra parameters specific to the exchange API endpoint
371
391
  * @returns {object[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=public-trades}
372
392
  */
373
- await this.loadMarkets();
374
- const url = await this.negotiate(false);
375
- const market = this.market(symbol);
376
- symbol = market['symbol'];
377
- const topic = '/contractMarket/execution:' + market['id'];
378
- const messageHash = 'trades:' + symbol;
379
- const trades = await this.subscribe(url, messageHash, topic, undefined, params);
380
- if (this.newUpdates) {
381
- limit = trades.getLimit(symbol, limit);
382
- }
383
- return this.filterBySinceLimit(trades, since, limit, 'timestamp', true);
393
+ return await this.watchTradesForSymbols([symbol], since, limit, params);
384
394
  }
385
395
  async watchTradesForSymbols(symbols, since = undefined, limit = undefined, params = {}) {
386
396
  /**
@@ -403,8 +413,15 @@ class kucoinfutures extends kucoinfutures$1 {
403
413
  symbols = this.marketSymbols(symbols);
404
414
  const marketIds = this.marketIds(symbols);
405
415
  const topic = '/contractMarket/execution:' + marketIds.join(',');
406
- const messageHash = 'multipleTrades::' + symbols.join(',');
407
- const trades = await this.subscribe(url, messageHash, topic, params);
416
+ const subscriptionHashes = [];
417
+ const messageHashes = [];
418
+ for (let i = 0; i < symbols.length; i++) {
419
+ const symbol = symbols[i];
420
+ const marketId = marketIds[i];
421
+ messageHashes.push('trades:' + symbol);
422
+ subscriptionHashes.push('/contractMarket/execution:' + marketId);
423
+ }
424
+ const trades = await this.subscribeMultiple(url, messageHashes, topic, subscriptionHashes, params);
408
425
  if (this.newUpdates) {
409
426
  const first = this.safeValue(trades, 0);
410
427
  const tradeSymbol = this.safeString(first, 'symbol');
@@ -445,7 +462,6 @@ class kucoinfutures extends kucoinfutures$1 {
445
462
  trades.append(trade);
446
463
  const messageHash = 'trades:' + symbol;
447
464
  client.resolve(trades, messageHash);
448
- this.resolvePromiseIfMessagehashMatches(client, 'multipleTrades::', symbol, trades);
449
465
  return message;
450
466
  }
451
467
  async watchOrderBook(symbol, limit = undefined, params = {}) {
@@ -465,24 +481,7 @@ class kucoinfutures extends kucoinfutures$1 {
465
481
  * @param {object} [params] extra parameters specific to the exchange API endpoint
466
482
  * @returns {object} A dictionary of [order book structures]{@link https://docs.ccxt.com/#/?id=order-book-structure} indexed by market symbols
467
483
  */
468
- if (limit !== undefined) {
469
- if ((limit !== 20) && (limit !== 100)) {
470
- throw new errors.ExchangeError(this.id + " watchOrderBook 'limit' argument must be undefined, 20 or 100");
471
- }
472
- }
473
- await this.loadMarkets();
474
- const url = await this.negotiate(false);
475
- const market = this.market(symbol);
476
- symbol = market['symbol'];
477
- const topic = '/contractMarket/level2:' + market['id'];
478
- const messageHash = 'orderbook:' + symbol;
479
- const subscription = {
480
- 'method': this.handleOrderBookSubscription,
481
- 'symbol': symbol,
482
- 'limit': limit,
483
- };
484
- const orderbook = await this.subscribe(url, messageHash, topic, subscription, params);
485
- return orderbook.limit();
484
+ return await this.watchOrderBookForSymbols([symbol], limit, params);
486
485
  }
487
486
  async watchOrderBookForSymbols(symbols, limit = undefined, params = {}) {
488
487
  /**
@@ -508,13 +507,20 @@ class kucoinfutures extends kucoinfutures$1 {
508
507
  const marketIds = this.marketIds(symbols);
509
508
  const url = await this.negotiate(false);
510
509
  const topic = '/contractMarket/level2:' + marketIds.join(',');
511
- const messageHash = 'multipleOrderbook::' + symbols.join(',');
512
510
  const subscription = {
513
511
  'method': this.handleOrderBookSubscription,
514
512
  'symbols': symbols,
515
513
  'limit': limit,
516
514
  };
517
- const orderbook = await this.subscribe(url, messageHash, topic, subscription, params);
515
+ const subscriptionHashes = [];
516
+ const messageHashes = [];
517
+ for (let i = 0; i < symbols.length; i++) {
518
+ const symbol = symbols[i];
519
+ const marketId = marketIds[i];
520
+ messageHashes.push('orderbook:' + symbol);
521
+ subscriptionHashes.push('/contractMarket/level2:' + marketId);
522
+ }
523
+ const orderbook = await this.subscribeMultiple(url, messageHashes, topic, subscriptionHashes, subscription, params);
518
524
  return orderbook.limit();
519
525
  }
520
526
  handleDelta(orderbook, delta) {
@@ -595,7 +601,6 @@ class kucoinfutures extends kucoinfutures$1 {
595
601
  }
596
602
  this.handleDelta(storedOrderBook, data);
597
603
  client.resolve(storedOrderBook, messageHash);
598
- this.resolvePromiseIfMessagehashMatches(client, 'multipleOrderbook::', symbol, storedOrderBook);
599
604
  }
600
605
  getCacheIndex(orderbook, cache) {
601
606
  const firstDelta = this.safeValue(cache, 0);
@@ -645,7 +650,6 @@ class kucoinfutures extends kucoinfutures$1 {
645
650
  if (method !== undefined) {
646
651
  method.call(this, client, message, subscription);
647
652
  }
648
- return message;
649
653
  }
650
654
  handleSystemStatus(client, message) {
651
655
  //
@@ -165,13 +165,7 @@ class okx extends okx$1 {
165
165
  * @param {object} [params] extra parameters specific to the exchange API endpoint
166
166
  * @returns {object[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=public-trades}
167
167
  */
168
- await this.loadMarkets();
169
- symbol = this.symbol(symbol);
170
- const trades = await this.subscribe('public', 'trades', 'trades', symbol, params);
171
- if (this.newUpdates) {
172
- limit = trades.getLimit(symbol, limit);
173
- }
174
- return this.filterBySinceLimit(trades, since, limit, 'timestamp', true);
168
+ return await this.watchTradesForSymbols([symbol], since, limit, params);
175
169
  }
176
170
  async watchTradesForSymbols(symbols, since = undefined, limit = undefined, params = {}) {
177
171
  /**
@@ -192,8 +186,11 @@ class okx extends okx$1 {
192
186
  symbols = this.marketSymbols(symbols);
193
187
  const channel = 'trades';
194
188
  const topics = [];
189
+ const messageHashes = [];
195
190
  for (let i = 0; i < symbols.length; i++) {
196
- const marketId = this.marketId(symbols[i]);
191
+ const symbol = symbols[i];
192
+ messageHashes.push(channel + ':' + symbol);
193
+ const marketId = this.marketId(symbol);
197
194
  const topic = {
198
195
  'channel': channel,
199
196
  'instId': marketId,
@@ -204,9 +201,8 @@ class okx extends okx$1 {
204
201
  'op': 'subscribe',
205
202
  'args': topics,
206
203
  };
207
- const messageHash = 'multipleTrades::' + symbols.join(',');
208
204
  const url = this.getUrl(channel, 'public');
209
- const trades = await this.watch(url, messageHash, request, messageHash);
205
+ const trades = await this.watchMultiple(url, messageHashes, request, messageHashes);
210
206
  if (this.newUpdates) {
211
207
  const first = this.safeValue(trades, 0);
212
208
  const tradeSymbol = this.safeString(first, 'symbol');
@@ -232,13 +228,13 @@ class okx extends okx$1 {
232
228
  //
233
229
  const arg = this.safeValue(message, 'arg', {});
234
230
  const channel = this.safeString(arg, 'channel');
231
+ const marketId = this.safeString(arg, 'instId');
232
+ const symbol = this.safeSymbol(marketId);
235
233
  const data = this.safeValue(message, 'data', []);
236
234
  const tradesLimit = this.safeInteger(this.options, 'tradesLimit', 1000);
237
235
  for (let i = 0; i < data.length; i++) {
238
236
  const trade = this.parseTrade(data[i]);
239
- const symbol = trade['symbol'];
240
- const marketId = this.safeString(trade['info'], 'instId');
241
- const messageHash = channel + ':' + marketId;
237
+ const messageHash = channel + ':' + symbol;
242
238
  let stored = this.safeValue(this.trades, symbol);
243
239
  if (stored === undefined) {
244
240
  stored = new Cache.ArrayCache(tradesLimit);
@@ -246,9 +242,7 @@ class okx extends okx$1 {
246
242
  }
247
243
  stored.append(trade);
248
244
  client.resolve(stored, messageHash);
249
- this.resolvePromiseIfMessagehashMatches(client, 'multipleTrades::', symbol, stored);
250
245
  }
251
- return message;
252
246
  }
253
247
  async watchTicker(symbol, params = {}) {
254
248
  /**
@@ -412,7 +406,6 @@ class okx extends okx$1 {
412
406
  * @param {object} [params] extra parameters specific to the exchange API endpoint
413
407
  * @returns {object} A dictionary of [order book structures]{@link https://docs.ccxt.com/#/?id=order-book-structure} indexed by market symbols
414
408
  */
415
- const options = this.safeValue(this.options, 'watchOrderBook', {});
416
409
  //
417
410
  // bbo-tbt
418
411
  // 1. Newly added channel that sends tick-by-tick Level 1 data
@@ -436,12 +429,7 @@ class okx extends okx$1 {
436
429
  // 2. Public depth channel, verification not required
437
430
  // 3. Data feeds will be delivered every 100ms (vs. every 200ms now)
438
431
  //
439
- const depth = this.safeString(options, 'depth', 'books');
440
- if ((depth === 'books-l2-tbt') || (depth === 'books50-l2-tbt')) {
441
- await this.authenticate({ 'access': 'public' });
442
- }
443
- const orderbook = await this.subscribe('public', depth, depth, symbol, params);
444
- return orderbook.limit();
432
+ return await this.watchOrderBookForSymbols([symbol], limit, params);
445
433
  }
446
434
  async watchOrderBookForSymbols(symbols, limit = undefined, params = {}) {
447
435
  /**
@@ -461,8 +449,11 @@ class okx extends okx$1 {
461
449
  await this.authenticate({ 'access': 'public' });
462
450
  }
463
451
  const topics = [];
452
+ const messageHashes = [];
464
453
  for (let i = 0; i < symbols.length; i++) {
465
- const marketId = this.marketId(symbols[i]);
454
+ const symbol = symbols[i];
455
+ messageHashes.push(depth + ':' + symbol);
456
+ const marketId = this.marketId(symbol);
466
457
  const topic = {
467
458
  'channel': depth,
468
459
  'instId': marketId,
@@ -474,8 +465,7 @@ class okx extends okx$1 {
474
465
  'args': topics,
475
466
  };
476
467
  const url = this.getUrl(depth, 'public');
477
- const messageHash = 'multipleOrderbooks::' + symbols.join(',');
478
- const orderbook = await this.watch(url, messageHash, request, messageHash);
468
+ const orderbook = await this.watchMultiple(url, messageHashes, request, messageHashes);
479
469
  return orderbook.limit();
480
470
  }
481
471
  handleDelta(bookside, delta) {
@@ -648,7 +638,7 @@ class okx extends okx$1 {
648
638
  'books50-l2-tbt': 50,
649
639
  };
650
640
  const limit = this.safeInteger(depths, channel);
651
- const messageHash = channel + ':' + marketId;
641
+ const messageHash = channel + ':' + symbol;
652
642
  if (action === 'snapshot') {
653
643
  for (let i = 0; i < data.length; i++) {
654
644
  const update = data[i];
@@ -657,7 +647,6 @@ class okx extends okx$1 {
657
647
  orderbook['symbol'] = symbol;
658
648
  this.handleOrderBookMessage(client, update, orderbook, messageHash);
659
649
  client.resolve(orderbook, messageHash);
660
- this.resolvePromiseIfMessagehashMatches(client, 'multipleOrderbooks::', symbol, orderbook);
661
650
  }
662
651
  }
663
652
  else if (action === 'update') {
@@ -667,7 +656,6 @@ class okx extends okx$1 {
667
656
  const update = data[i];
668
657
  this.handleOrderBookMessage(client, update, orderbook, messageHash);
669
658
  client.resolve(orderbook, messageHash);
670
- this.resolvePromiseIfMessagehashMatches(client, 'multipleOrderbooks::', symbol, orderbook);
671
659
  }
672
660
  }
673
661
  }
@@ -683,7 +671,6 @@ class okx extends okx$1 {
683
671
  const snapshot = this.parseOrderBook(update, symbol, timestamp, 'bids', 'asks', 0, 1);
684
672
  orderbook.reset(snapshot);
685
673
  client.resolve(orderbook, messageHash);
686
- this.resolvePromiseIfMessagehashMatches(client, 'multipleOrderbooks::', symbol, orderbook);
687
674
  }
688
675
  }
689
676
  return message;
@@ -102,7 +102,6 @@ class tokocrypto extends tokocrypto$1 {
102
102
  'fetchWithdrawals': true,
103
103
  'fetchWithdrawalWhitelist': false,
104
104
  'reduceMargin': false,
105
- 'repayMargin': false,
106
105
  'setLeverage': false,
107
106
  'setMargin': false,
108
107
  'setMarginMode': false,