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
@@ -24,8 +24,10 @@ class bitmart extends bitmart$1 {
24
24
  'watchTicker': true,
25
25
  'watchTickers': true,
26
26
  'watchOrderBook': true,
27
+ 'watchOrderBookForSymbols': true,
27
28
  'watchOrders': true,
28
29
  'watchTrades': true,
30
+ 'watchTradesForSymbols': true,
29
31
  'watchOHLCV': true,
30
32
  'watchPosition': 'emulated',
31
33
  'watchPositions': true,
@@ -50,8 +52,15 @@ class bitmart extends bitmart$1 {
50
52
  'fetchBalanceSnapshot': true,
51
53
  'awaitBalanceSnapshot': false, // whether to wait for the balance snapshot before providing updates
52
54
  },
55
+ //
56
+ // orderbook channels can have:
57
+ // - 'depth5', 'depth20', 'depth50' // these endpoints emit full Orderbooks once in every 500ms
58
+ // - '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
53
59
  'watchOrderBook': {
54
- 'depth': 'depth/increase100', // depth/increase100, depth5, depth20, depth50
60
+ 'depth': 'depth/increase100',
61
+ },
62
+ 'watchOrderBookForSymbols': {
63
+ 'depth': 'depth/increase100',
55
64
  },
56
65
  'ws': {
57
66
  'inflate': true,
@@ -98,6 +107,24 @@ class bitmart extends bitmart$1 {
98
107
  }
99
108
  return await this.watch(url, messageHash, this.deepExtend(request, params), messageHash);
100
109
  }
110
+ async subscribeMultiple(channel, type, symbols, params = {}) {
111
+ const url = this.implodeHostname(this.urls['api']['ws'][type]['public']);
112
+ const channelType = (type === 'spot') ? 'spot' : 'futures';
113
+ const actionType = (type === 'spot') ? 'op' : 'action';
114
+ const rawSubscriptions = [];
115
+ const messageHashes = [];
116
+ for (let i = 0; i < symbols.length; i++) {
117
+ const market = this.market(symbols[i]);
118
+ const message = channelType + '/' + channel + ':' + market['id'];
119
+ rawSubscriptions.push(message);
120
+ messageHashes.push(channel + ':' + market['symbol']);
121
+ }
122
+ const request = {
123
+ 'args': rawSubscriptions,
124
+ };
125
+ request[actionType] = 'subscribe';
126
+ return await this.watchMultiple(url, messageHashes, this.deepExtend(request, params), rawSubscriptions);
127
+ }
101
128
  async watchBalance(params = {}) {
102
129
  /**
103
130
  * @method
@@ -245,17 +272,43 @@ class bitmart extends bitmart$1 {
245
272
  * @param {object} [params] extra parameters specific to the exchange API endpoint
246
273
  * @returns {object[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=public-trades}
247
274
  */
275
+ return await this.watchTradesForSymbols([symbol], since, limit, params);
276
+ }
277
+ async watchTradesForSymbols(symbols, since = undefined, limit = undefined, params = {}) {
278
+ /**
279
+ * @method
280
+ * @name bitmart#watchTradesForSymbols
281
+ * @see https://developer-pro.bitmart.com/en/spot/#public-trade-channel
282
+ * @description get the list of most recent trades for a list of symbols
283
+ * @param {string[]} symbols unified symbol of the market to fetch trades for
284
+ * @param {int} [since] timestamp in ms of the earliest trade to fetch
285
+ * @param {int} [limit] the maximum amount of trades to fetch
286
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
287
+ * @returns {object[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=public-trades}
288
+ */
248
289
  await this.loadMarkets();
249
- symbol = this.symbol(symbol);
250
- const market = this.market(symbol);
251
- let type = 'spot';
252
- [type, params] = this.handleMarketTypeAndParams('watchTrades', market, params);
253
- const trades = await this.subscribe('trade', symbol, type, params);
290
+ let marketType = undefined;
291
+ [symbols, marketType, params] = this.getParamsForMultipleSub('watchTradesForSymbols', symbols, limit, params);
292
+ const channelName = 'trade';
293
+ const trades = await this.subscribeMultiple(channelName, marketType, symbols, params);
254
294
  if (this.newUpdates) {
255
- limit = trades.getLimit(symbol, limit);
295
+ const first = this.safeDict(trades, 0);
296
+ const tradeSymbol = this.safeString(first, 'symbol');
297
+ limit = trades.getLimit(tradeSymbol, limit);
256
298
  }
257
299
  return this.filterBySinceLimit(trades, since, limit, 'timestamp', true);
258
300
  }
301
+ getParamsForMultipleSub(methodName, symbols, limit = undefined, params = {}) {
302
+ symbols = this.marketSymbols(symbols, undefined, false, true);
303
+ const length = symbols.length;
304
+ if (length > 20) {
305
+ throw new errors.NotSupported(this.id + ' ' + methodName + '() accepts a maximum of 20 symbols in one request');
306
+ }
307
+ const market = this.market(symbols[0]);
308
+ let marketType = undefined;
309
+ [marketType, params] = this.handleMarketTypeAndParams(methodName, market, params);
310
+ return [symbols, marketType, params];
311
+ }
259
312
  async watchTicker(symbol, params = {}) {
260
313
  /**
261
314
  * @method
@@ -793,16 +846,15 @@ class bitmart extends bitmart$1 {
793
846
  // ]
794
847
  // }
795
848
  //
796
- const channel = this.safeString2(message, 'table', 'group');
797
- const isSpot = (channel.indexOf('spot') >= 0);
798
849
  const data = this.safeValue(message, 'data');
799
850
  if (data === undefined) {
800
851
  return;
801
852
  }
802
853
  let stored = undefined;
854
+ let symbol = undefined;
803
855
  for (let i = 0; i < data.length; i++) {
804
856
  const trade = this.parseWsTrade(data[i]);
805
- const symbol = trade['symbol'];
857
+ symbol = trade['symbol'];
806
858
  const tradesLimit = this.safeInteger(this.options, 'tradesLimit', 1000);
807
859
  stored = this.safeValue(this.trades, symbol);
808
860
  if (stored === undefined) {
@@ -811,10 +863,7 @@ class bitmart extends bitmart$1 {
811
863
  }
812
864
  stored.append(trade);
813
865
  }
814
- let messageHash = channel;
815
- if (isSpot) {
816
- messageHash += ':' + this.safeString(data[0], 'symbol');
817
- }
866
+ const messageHash = 'trade:' + symbol;
818
867
  client.resolve(stored, messageHash);
819
868
  }
820
869
  parseWsTrade(trade, market = undefined) {
@@ -1156,8 +1205,8 @@ class bitmart extends bitmart$1 {
1156
1205
  // "symbol": "BTC_USDT"
1157
1206
  // }
1158
1207
  //
1159
- const asks = this.safeValue(message, 'asks', []);
1160
- const bids = this.safeValue(message, 'bids', []);
1208
+ const asks = this.safeList(message, 'asks', []);
1209
+ const bids = this.safeList(message, 'bids', []);
1161
1210
  this.handleDeltas(orderbook['asks'], asks);
1162
1211
  this.handleDeltas(orderbook['bids'], bids);
1163
1212
  const timestamp = this.safeInteger(message, 'ms_t');
@@ -1171,6 +1220,7 @@ class bitmart extends bitmart$1 {
1171
1220
  handleOrderBook(client, message) {
1172
1221
  //
1173
1222
  // spot depth-all
1223
+ //
1174
1224
  // {
1175
1225
  // "data": [
1176
1226
  // {
@@ -1190,33 +1240,31 @@ class bitmart extends bitmart$1 {
1190
1240
  // ],
1191
1241
  // "table": "spot/depth5"
1192
1242
  // }
1243
+ //
1193
1244
  // spot increse depth snapshot
1245
+ //
1194
1246
  // {
1195
1247
  // "data":[
1196
1248
  // {
1197
- // "asks":[
1198
- // [
1199
- // "43652.52",
1200
- // "0.02039"
1201
- // ],
1202
- // ...
1203
- // ],
1204
- // "bids":[
1205
- // [
1206
- // "43652.51",
1207
- // "0.00500"
1249
+ // "asks":[
1250
+ // [ "43652.52", "0.02039" ],
1251
+ // ...
1208
1252
  // ],
1209
- // ...
1210
- // ],
1211
- // "ms_t":1703376836487,
1212
- // "symbol":"BTC_USDT",
1213
- // "type":"snapshot", // or update
1214
- // "version":2141731
1253
+ // "bids":[
1254
+ // [ "43652.51", "0.00500" ],
1255
+ // ...
1256
+ // ],
1257
+ // "ms_t":1703376836487,
1258
+ // "symbol":"BTC_USDT",
1259
+ // "type":"snapshot", // or update
1260
+ // "version":2141731
1215
1261
  // }
1216
1262
  // ],
1217
1263
  // "table":"spot/depth/increase100"
1218
1264
  // }
1265
+ //
1219
1266
  // swap
1267
+ //
1220
1268
  // {
1221
1269
  // "group":"futures/depth50:BTCUSDT",
1222
1270
  // "data":{
@@ -1237,50 +1285,69 @@ class bitmart extends bitmart$1 {
1237
1285
  // }
1238
1286
  // }
1239
1287
  //
1240
- const data = this.safeValue(message, 'data');
1241
- if (data === undefined) {
1288
+ const isSpot = ('table' in message);
1289
+ let datas = [];
1290
+ if (isSpot) {
1291
+ datas = this.safeList(message, 'data', datas);
1292
+ }
1293
+ else {
1294
+ const orderBookEntry = this.safeDict(message, 'data');
1295
+ if (orderBookEntry !== undefined) {
1296
+ datas.push(orderBookEntry);
1297
+ }
1298
+ }
1299
+ const length = datas.length;
1300
+ if (length <= 0) {
1242
1301
  return;
1243
1302
  }
1244
- const depths = this.safeValue(data, 'depths');
1245
- const isSpot = (depths === undefined);
1246
- const table = this.safeString2(message, 'table', 'group');
1303
+ const channelName = this.safeString2(message, 'table', 'group');
1247
1304
  // find limit subscribed to
1248
1305
  const limitsToCheck = ['100', '50', '20', '10', '5'];
1249
1306
  let limit = 0;
1250
1307
  for (let i = 0; i < limitsToCheck.length; i++) {
1251
1308
  const limitString = limitsToCheck[i];
1252
- if (table.indexOf(limitString) >= 0) {
1309
+ if (channelName.indexOf(limitString) >= 0) {
1253
1310
  limit = this.parseToInt(limitString);
1254
1311
  break;
1255
1312
  }
1256
1313
  }
1257
1314
  if (isSpot) {
1258
- for (let i = 0; i < data.length; i++) {
1259
- const update = data[i];
1315
+ const channel = channelName.replace('spot/', '');
1316
+ for (let i = 0; i < datas.length; i++) {
1317
+ const update = datas[i];
1260
1318
  const marketId = this.safeString(update, 'symbol');
1261
1319
  const symbol = this.safeSymbol(marketId);
1262
- let orderbook = this.safeValue(this.orderbooks, symbol);
1320
+ let orderbook = this.safeDict(this.orderbooks, symbol);
1263
1321
  if (orderbook === undefined) {
1264
1322
  orderbook = this.orderBook({}, limit);
1265
1323
  orderbook['symbol'] = symbol;
1266
1324
  this.orderbooks[symbol] = orderbook;
1267
1325
  }
1268
1326
  const type = this.safeValue(update, 'type');
1269
- if ((type === 'snapshot') || (!(table.indexOf('increase') >= 0))) {
1327
+ if ((type === 'snapshot') || (!(channelName.indexOf('increase') >= 0))) {
1270
1328
  orderbook.reset({});
1271
1329
  }
1272
1330
  this.handleOrderBookMessage(client, update, orderbook);
1273
1331
  const timestamp = this.safeInteger(update, 'ms_t');
1274
- orderbook['timestamp'] = timestamp;
1275
- orderbook['datetime'] = this.iso8601(timestamp);
1276
- const messageHash = table + ':' + marketId;
1332
+ if (orderbook['timestamp'] === undefined) {
1333
+ orderbook['timestamp'] = timestamp;
1334
+ orderbook['datetime'] = this.iso8601(timestamp);
1335
+ }
1336
+ const messageHash = channelName + ':' + marketId;
1277
1337
  client.resolve(orderbook, messageHash);
1338
+ // resolve ForSymbols
1339
+ const messageHashForMulti = channel + ':' + symbol;
1340
+ client.resolve(orderbook, messageHashForMulti);
1278
1341
  }
1279
1342
  }
1280
1343
  else {
1344
+ const tableParts = channelName.split(':');
1345
+ const channel = tableParts[0].replace('futures/', '');
1346
+ const data = datas[0]; // contract markets always contain only one member
1347
+ const depths = data['depths'];
1281
1348
  const marketId = this.safeString(data, 'symbol');
1282
1349
  const symbol = this.safeSymbol(marketId);
1283
- let orderbook = this.safeValue(this.orderbooks, symbol);
1350
+ let orderbook = this.safeDict(this.orderbooks, symbol);
1284
1351
  if (orderbook === undefined) {
1285
1352
  orderbook = this.orderBook({}, limit);
1286
1353
  orderbook['symbol'] = symbol;
@@ -1309,10 +1376,36 @@ class bitmart extends bitmart$1 {
1309
1376
  const timestamp = this.safeInteger(data, 'ms_t');
1310
1377
  orderbook['timestamp'] = timestamp;
1311
1378
  orderbook['datetime'] = this.iso8601(timestamp);
1312
- const messageHash = table;
1379
+ const messageHash = channelName;
1313
1380
  client.resolve(orderbook, messageHash);
1381
+ // resolve ForSymbols
1382
+ const messageHashForMulti = channel + ':' + symbol;
1383
+ client.resolve(orderbook, messageHashForMulti);
1314
1384
  }
1315
1385
  }
1386
+ async watchOrderBookForSymbols(symbols, limit = undefined, params = {}) {
1387
+ /**
1388
+ * @method
1389
+ * @name bitmart#watchOrderBookForSymbols
1390
+ * @description watches information on open orders with bid (buy) and ask (sell) prices, volumes and other data
1391
+ * @see https://developer-pro.bitmart.com/en/spot/#public-depth-increase-channel
1392
+ * @param {string[]} symbols unified array of symbols
1393
+ * @param {int} [limit] the maximum amount of order book entries to return
1394
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
1395
+ * @param {string} [params.depth] the type of order book to subscribe to, default is 'depth/increase100', also accepts 'depth5' or 'depth20' or depth50
1396
+ * @returns {object} A dictionary of [order book structures]{@link https://docs.ccxt.com/#/?id=order-book-structure} indexed by market symbols
1397
+ */
1398
+ await this.loadMarkets();
1399
+ let type = undefined;
1400
+ [symbols, type, params] = this.getParamsForMultipleSub('watchOrderBookForSymbols', symbols, limit, params);
1401
+ let channel = undefined;
1402
+ [channel, params] = this.handleOptionAndParams(params, 'watchOrderBookForSymbols', 'depth', 'depth/increase100');
1403
+ if (type === 'swap' && channel === 'depth/increase100') {
1404
+ channel = 'depth50';
1405
+ }
1406
+ const orderbook = await this.subscribeMultiple(channel, type, symbols, params);
1407
+ return orderbook.limit();
1408
+ }
1316
1409
  async authenticate(type, params = {}) {
1317
1410
  this.checkRequiredCredentials();
1318
1411
  const url = this.implodeHostname(this.urls['api']['ws'][type]['private']);
@@ -184,7 +184,7 @@ class bybit extends bybit$1 {
184
184
  const market = this.market(symbol);
185
185
  symbol = market['symbol'];
186
186
  const messageHash = 'ticker:' + symbol;
187
- const url = this.getUrlByMarketType(symbol, false, params);
187
+ const url = this.getUrlByMarketType(symbol, false, 'watchTicker', params);
188
188
  params = this.cleanParams(params);
189
189
  const options = this.safeValue(this.options, 'watchTicker', {});
190
190
  let topic = this.safeString(options, 'name', 'tickers');
@@ -209,7 +209,7 @@ class bybit extends bybit$1 {
209
209
  await this.loadMarkets();
210
210
  symbols = this.marketSymbols(symbols, undefined, false);
211
211
  const messageHashes = [];
212
- const url = this.getUrlByMarketType(symbols[0], false, params);
212
+ const url = this.getUrlByMarketType(symbols[0], false, 'watchTickers', params);
213
213
  params = this.cleanParams(params);
214
214
  const options = this.safeValue(this.options, 'watchTickers', {});
215
215
  const topic = this.safeString(options, 'name', 'tickers');
@@ -376,7 +376,7 @@ class bybit extends bybit$1 {
376
376
  await this.loadMarkets();
377
377
  const market = this.market(symbol);
378
378
  symbol = market['symbol'];
379
- const url = this.getUrlByMarketType(symbol, false, params);
379
+ const url = this.getUrlByMarketType(symbol, false, 'watchOHLCV', params);
380
380
  params = this.cleanParams(params);
381
381
  let ohlcv = undefined;
382
382
  const timeframeId = this.safeString(this.timeframes, timeframe, timeframe);
@@ -494,7 +494,7 @@ class bybit extends bybit$1 {
494
494
  throw new errors.ArgumentsRequired(this.id + ' watchOrderBookForSymbols() requires a non-empty array of symbols');
495
495
  }
496
496
  symbols = this.marketSymbols(symbols);
497
- const url = this.getUrlByMarketType(symbols[0], false, params);
497
+ const url = this.getUrlByMarketType(symbols[0], false, 'watchOrderBook', params);
498
498
  params = this.cleanParams(params);
499
499
  const market = this.market(symbols[0]);
500
500
  if (limit === undefined) {
@@ -626,7 +626,7 @@ class bybit extends bybit$1 {
626
626
  throw new errors.ArgumentsRequired(this.id + ' watchTradesForSymbols() requires a non-empty array of symbols');
627
627
  }
628
628
  params = this.cleanParams(params);
629
- const url = this.getUrlByMarketType(symbols[0], false, params);
629
+ const url = this.getUrlByMarketType(symbols[0], false, 'watchTrades', params);
630
630
  const topics = [];
631
631
  const messageHashes = [];
632
632
  for (let i = 0; i < symbols.length; i++) {
@@ -469,7 +469,7 @@ class mexc extends mexc$1 {
469
469
  }
470
470
  try {
471
471
  this.handleDelta(storedOrderBook, data);
472
- const timestamp = this.safeInteger(message, 't');
472
+ const timestamp = this.safeInteger2(message, 't', 'ts');
473
473
  storedOrderBook['timestamp'] = timestamp;
474
474
  storedOrderBook['datetime'] = this.iso8601(timestamp);
475
475
  }
@@ -311,7 +311,7 @@ class wavesexchange extends wavesexchange$1 {
311
311
  },
312
312
  },
313
313
  'currencies': {
314
- 'WX': this.safeCurrencyStructure({ 'id': 'EMAMLxDnv3xiz8RXg8Btj33jcEw3wLczL3JKYYmuubpc', 'numericId': undefined, 'code': 'WX', 'precision': this.parseNumber('8') }),
314
+ 'WX': this.safeCurrencyStructure({ 'id': 'EMAMLxDnv3xiz8RXg8Btj33jcEw3wLczL3JKYYmuubpc', 'numericId': undefined, 'code': 'WX', 'precision': this.parseToInt('8') }),
315
315
  },
316
316
  'precisionMode': number.DECIMAL_PLACES,
317
317
  'options': {
@@ -1065,7 +1065,7 @@ class woo extends woo$1 {
1065
1065
  if (stopPrice !== undefined) {
1066
1066
  request['triggerPrice'] = this.priceToPrecision(symbol, stopPrice);
1067
1067
  }
1068
- const trailingTriggerPrice = this.safeString2(params, 'trailingTriggerPrice', 'activatedPrice', price);
1068
+ const trailingTriggerPrice = this.safeString2(params, 'trailingTriggerPrice', 'activatedPrice', this.numberToString(price));
1069
1069
  const trailingAmount = this.safeString2(params, 'trailingAmount', 'callbackValue');
1070
1070
  const trailingPercent = this.safeString2(params, 'trailingPercent', 'callbackRate');
1071
1071
  const isTrailingAmountOrder = trailingAmount !== undefined;
package/js/ccxt.d.ts CHANGED
@@ -4,7 +4,7 @@ import * as functions from './src/base/functions.js';
4
4
  import * as errors from './src/base/errors.js';
5
5
  import type { Market, Trade, Fee, Ticker, OrderBook, Order, Transaction, Tickers, Currency, Balance, DepositAddress, WithdrawalResponse, DepositAddressResponse, OHLCV, Balances, PartialBalances, Dictionary, MinMax, Position, FundingRateHistory, Liquidation, FundingHistory, MarginMode, Greeks } from './src/base/types.js';
6
6
  import { BaseError, ExchangeError, PermissionDenied, AccountNotEnabled, AccountSuspended, ArgumentsRequired, BadRequest, BadSymbol, MarginModeAlreadySet, BadResponse, NullResponse, InsufficientFunds, InvalidAddress, InvalidOrder, OrderNotFound, OrderNotCached, CancelPending, OrderImmediatelyFillable, OrderNotFillable, DuplicateOrderId, NotSupported, NetworkError, DDoSProtection, RateLimitExceeded, ExchangeNotAvailable, OnMaintenance, InvalidNonce, RequestTimeout, AuthenticationError, AddressPending, NoChange } from './src/base/errors.js';
7
- declare const version = "4.2.37";
7
+ declare const version = "4.2.39";
8
8
  import ace from './src/ace.js';
9
9
  import alpaca from './src/alpaca.js';
10
10
  import ascendex from './src/ascendex.js';
package/js/ccxt.js CHANGED
@@ -38,7 +38,7 @@ import * as errors from './src/base/errors.js';
38
38
  import { BaseError, ExchangeError, PermissionDenied, AccountNotEnabled, AccountSuspended, ArgumentsRequired, BadRequest, BadSymbol, MarginModeAlreadySet, BadResponse, NullResponse, InsufficientFunds, InvalidAddress, InvalidOrder, OrderNotFound, OrderNotCached, CancelPending, OrderImmediatelyFillable, OrderNotFillable, DuplicateOrderId, NotSupported, NetworkError, DDoSProtection, RateLimitExceeded, ExchangeNotAvailable, OnMaintenance, InvalidNonce, RequestTimeout, AuthenticationError, AddressPending, NoChange } from './src/base/errors.js';
39
39
  //-----------------------------------------------------------------------------
40
40
  // this is updated by vss.js when building
41
- const version = '4.2.38';
41
+ const version = '4.2.40';
42
42
  Exchange.ccxtVersion = version;
43
43
  //-----------------------------------------------------------------------------
44
44
  import ace from './src/ace.js';
@@ -15,6 +15,7 @@ interface Exchange {
15
15
  spotV1PrivatePostTradeOrder(params?: {}): Promise<implicitReturnType>;
16
16
  spotV1PrivatePostTradeCancel(params?: {}): Promise<implicitReturnType>;
17
17
  spotV1PrivatePostTradeBatchOrders(params?: {}): Promise<implicitReturnType>;
18
+ spotV1PrivatePostTradeOrderCancelReplace(params?: {}): Promise<implicitReturnType>;
18
19
  spotV1PrivatePostTradeCancelOrders(params?: {}): Promise<implicitReturnType>;
19
20
  spotV1PrivatePostTradeCancelOpenOrders(params?: {}): Promise<implicitReturnType>;
20
21
  spotV3PrivateGetGetAssetTransfer(params?: {}): Promise<implicitReturnType>;
@@ -22,8 +23,11 @@ interface Exchange {
22
23
  spotV3PrivateGetCapitalDepositHisrec(params?: {}): Promise<implicitReturnType>;
23
24
  spotV3PrivateGetCapitalWithdrawHistory(params?: {}): Promise<implicitReturnType>;
24
25
  spotV3PrivatePostPostAssetTransfer(params?: {}): Promise<implicitReturnType>;
26
+ swapV1PublicGetTickerPrice(params?: {}): Promise<implicitReturnType>;
25
27
  swapV1PrivateGetPositionSideDual(params?: {}): Promise<implicitReturnType>;
26
28
  swapV1PrivateGetMarketMarkPriceKlines(params?: {}): Promise<implicitReturnType>;
29
+ swapV1PrivateGetTradeBatchCancelReplace(params?: {}): Promise<implicitReturnType>;
30
+ swapV1PrivatePostTradeCancelReplace(params?: {}): Promise<implicitReturnType>;
27
31
  swapV1PrivatePostPositionSideDual(params?: {}): Promise<implicitReturnType>;
28
32
  swapV2PublicGetServerTime(params?: {}): Promise<implicitReturnType>;
29
33
  swapV2PublicGetQuoteContracts(params?: {}): Promise<implicitReturnType>;
@@ -72,6 +72,7 @@ interface Exchange {
72
72
  v3PrivatePostBrokerageOrdersBatchCancel(params?: {}): Promise<implicitReturnType>;
73
73
  v3PrivatePostBrokerageOrdersEdit(params?: {}): Promise<implicitReturnType>;
74
74
  v3PrivatePostBrokerageOrdersEditPreview(params?: {}): Promise<implicitReturnType>;
75
+ v3PrivatePostBrokerageOrdersPreview(params?: {}): Promise<implicitReturnType>;
75
76
  v3PrivatePostBrokeragePortfolios(params?: {}): Promise<implicitReturnType>;
76
77
  v3PrivatePostBrokeragePortfoliosMoveFunds(params?: {}): Promise<implicitReturnType>;
77
78
  v3PrivatePostBrokerageConvertQuote(params?: {}): Promise<implicitReturnType>;
@@ -46,6 +46,7 @@ interface Exchange {
46
46
  privateGetUsersSelfTrailingVolume(params?: {}): Promise<implicitReturnType>;
47
47
  privateGetWithdrawalsFeeEstimate(params?: {}): Promise<implicitReturnType>;
48
48
  privateGetConversionsConversionId(params?: {}): Promise<implicitReturnType>;
49
+ privateGetConversionsFees(params?: {}): Promise<implicitReturnType>;
49
50
  privatePostConversions(params?: {}): Promise<implicitReturnType>;
50
51
  privatePostDepositsCoinbaseAccount(params?: {}): Promise<implicitReturnType>;
51
52
  privatePostDepositsPaymentMethod(params?: {}): Promise<implicitReturnType>;
@@ -98,6 +98,7 @@ interface Exchange {
98
98
  privateGetTradeEasyConvertHistory(params?: {}): Promise<implicitReturnType>;
99
99
  privateGetTradeOneClickRepayCurrencyList(params?: {}): Promise<implicitReturnType>;
100
100
  privateGetTradeOneClickRepayHistory(params?: {}): Promise<implicitReturnType>;
101
+ privateGetTradeAccountRateLimit(params?: {}): Promise<implicitReturnType>;
101
102
  privateGetAssetCurrencies(params?: {}): Promise<implicitReturnType>;
102
103
  privateGetAssetBalances(params?: {}): Promise<implicitReturnType>;
103
104
  privateGetAssetNonTradableAssets(params?: {}): Promise<implicitReturnType>;
@@ -87,7 +87,7 @@ export default class ascendex extends Exchange {
87
87
  reduceMargin(symbol: string, amount: any, params?: {}): Promise<any>;
88
88
  addMargin(symbol: string, amount: any, params?: {}): Promise<any>;
89
89
  setLeverage(leverage: Int, symbol?: Str, params?: {}): Promise<any>;
90
- setMarginMode(marginMode: any, symbol?: Str, params?: {}): Promise<any>;
90
+ setMarginMode(marginMode: string, symbol?: Str, params?: {}): Promise<any>;
91
91
  fetchLeverageTiers(symbols?: Strings, params?: {}): Promise<{}>;
92
92
  parseMarketLeverageTiers(info: any, market?: Market): any[];
93
93
  parseDepositWithdrawFee(fee: any, currency?: Currency): {
@@ -103,7 +103,7 @@ export default class ascendex extends Exchange {
103
103
  networks: {};
104
104
  };
105
105
  fetchDepositWithdrawFees(codes?: Strings, params?: {}): Promise<any>;
106
- transfer(code: string, amount: number, fromAccount: any, toAccount: any, params?: {}): Promise<TransferEntry>;
106
+ transfer(code: string, amount: number, fromAccount: string, toAccount: string, params?: {}): Promise<TransferEntry>;
107
107
  parseTransfer(transfer: any, currency?: Currency): {
108
108
  info: any;
109
109
  id: any;
@@ -277,11 +277,14 @@ export default class ascendex extends Exchange {
277
277
  'fillResponseFromRequest': true,
278
278
  },
279
279
  'networks': {
280
- 'BSC': 'BEP20 (BSC)',
280
+ 'BSC': 'BEP20 ' + '(BSC)',
281
281
  'ARB': 'arbitrum',
282
282
  'SOL': 'Solana',
283
283
  'AVAX': 'avalanche C chain',
284
284
  'OMNI': 'Omni',
285
+ 'TRC': 'TRC20',
286
+ 'TRX': 'TRC20',
287
+ 'ERC': 'ERC20',
285
288
  },
286
289
  'networksById': {
287
290
  'BEP20 (BSC)': 'BSC',
@@ -289,6 +292,16 @@ export default class ascendex extends Exchange {
289
292
  'Solana': 'SOL',
290
293
  'avalanche C chain': 'AVAX',
291
294
  'Omni': 'OMNI',
295
+ 'TRC20': 'TRC20',
296
+ 'ERC20': 'ERC20',
297
+ 'GO20': 'GO20',
298
+ 'BEP2': 'BEP2',
299
+ 'Bitcoin': 'BTC',
300
+ 'Bitcoin ABC': 'BCH',
301
+ 'Litecoin': 'LTC',
302
+ 'Matic Network': 'MATIC',
303
+ 'xDai': 'STAKE',
304
+ 'Akash': 'AKT',
292
305
  },
293
306
  },
294
307
  'exceptions': {
@@ -2378,8 +2391,8 @@ export default class ascendex extends Exchange {
2378
2391
  const tag = this.safeString(depositAddress, tagId);
2379
2392
  this.checkAddress(address);
2380
2393
  const code = (currency === undefined) ? undefined : currency['code'];
2381
- const chainName = this.safeString(depositAddress, 'chainName');
2382
- const network = this.safeNetwork(chainName);
2394
+ const chainName = this.safeString(depositAddress, 'blockchain');
2395
+ const network = this.networkIdToCode(chainName, code);
2383
2396
  return {
2384
2397
  'currency': code,
2385
2398
  'address': address,
@@ -2389,20 +2402,7 @@ export default class ascendex extends Exchange {
2389
2402
  };
2390
2403
  }
2391
2404
  safeNetwork(networkId) {
2392
- const networksById = {
2393
- 'TRC20': 'TRC20',
2394
- 'ERC20': 'ERC20',
2395
- 'GO20': 'GO20',
2396
- 'BEP2': 'BEP2',
2397
- 'BEP20 (BSC)': 'BEP20',
2398
- 'Bitcoin': 'BTC',
2399
- 'Bitcoin ABC': 'BCH',
2400
- 'Litecoin': 'LTC',
2401
- 'Matic Network': 'MATIC',
2402
- 'Solana': 'SOL',
2403
- 'xDai': 'STAKE',
2404
- 'Akash': 'AKT',
2405
- };
2405
+ const networksById = this.safeDict(this.options, 'networksById');
2406
2406
  return this.safeString(networksById, networkId, networkId);
2407
2407
  }
2408
2408
  async fetchDepositAddress(code, params = {}) {
@@ -2410,16 +2410,20 @@ export default class ascendex extends Exchange {
2410
2410
  * @method
2411
2411
  * @name ascendex#fetchDepositAddress
2412
2412
  * @description fetch the deposit address for a currency associated with this account
2413
+ * @see https://ascendex.github.io/ascendex-pro-api/#query-deposit-addresses
2413
2414
  * @param {string} code unified currency code
2414
2415
  * @param {object} [params] extra parameters specific to the exchange API endpoint
2416
+ * @param {string} [params.network] unified network code for deposit chain
2415
2417
  * @returns {object} an [address structure]{@link https://docs.ccxt.com/#/?id=address-structure}
2416
2418
  */
2417
2419
  await this.loadMarkets();
2418
2420
  const currency = this.currency(code);
2419
- const chainName = this.safeString(params, 'chainName');
2420
- params = this.omit(params, 'chainName');
2421
+ const networkCode = this.safeString2(params, 'network', 'chainName');
2422
+ const networkId = this.networkCodeToId(networkCode);
2423
+ params = this.omit(params, ['chainName']);
2421
2424
  const request = {
2422
2425
  'asset': currency['id'],
2426
+ 'blockchain': networkId,
2423
2427
  };
2424
2428
  const response = await this.v1PrivateGetWalletDepositAddress(this.extend(request, params));
2425
2429
  //
@@ -2455,22 +2459,22 @@ export default class ascendex extends Exchange {
2455
2459
  // }
2456
2460
  // }
2457
2461
  //
2458
- const data = this.safeValue(response, 'data', {});
2459
- const addresses = this.safeValue(data, 'address', []);
2462
+ const data = this.safeDict(response, 'data', {});
2463
+ const addresses = this.safeList(data, 'address', []);
2460
2464
  const numAddresses = addresses.length;
2461
2465
  let address = undefined;
2462
2466
  if (numAddresses > 1) {
2463
2467
  const addressesByChainName = this.indexBy(addresses, 'chainName');
2464
- if (chainName === undefined) {
2468
+ if (networkId === undefined) {
2465
2469
  const chainNames = Object.keys(addressesByChainName);
2466
2470
  const chains = chainNames.join(', ');
2467
2471
  throw new ArgumentsRequired(this.id + ' fetchDepositAddress() returned more than one address, a chainName parameter is required, one of ' + chains);
2468
2472
  }
2469
- address = this.safeValue(addressesByChainName, chainName, {});
2473
+ address = this.safeDict(addressesByChainName, networkId, {});
2470
2474
  }
2471
2475
  else {
2472
2476
  // first address
2473
- address = this.safeValue(addresses, 0, {});
2477
+ address = this.safeDict(addresses, 0, {});
2474
2478
  }
2475
2479
  const result = this.parseDepositAddress(address, currency);
2476
2480
  return this.extend(result, {