ccxt 4.2.44 → 4.2.46

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 (92) hide show
  1. package/CHANGELOG.md +3099 -8415
  2. package/README.md +4 -4
  3. package/change.sh +4 -2
  4. package/dist/ccxt.browser.js +1242 -195
  5. package/dist/ccxt.browser.min.js +7 -7
  6. package/dist/cjs/ccxt.js +1 -1
  7. package/dist/cjs/src/base/Exchange.js +48 -0
  8. package/dist/cjs/src/base/ws/Cache.js +13 -5
  9. package/dist/cjs/src/base/ws/OrderBook.js +2 -2
  10. package/dist/cjs/src/binance.js +407 -21
  11. package/dist/cjs/src/bingx.js +43 -5
  12. package/dist/cjs/src/bitfinex2.js +1 -0
  13. package/dist/cjs/src/bithumb.js +5 -0
  14. package/dist/cjs/src/bitstamp.js +1 -1
  15. package/dist/cjs/src/btcturk.js +11 -0
  16. package/dist/cjs/src/bybit.js +96 -43
  17. package/dist/cjs/src/coinbase.js +228 -38
  18. package/dist/cjs/src/coincheck.js +11 -0
  19. package/dist/cjs/src/coinmate.js +114 -1
  20. package/dist/cjs/src/coinspot.js +7 -0
  21. package/dist/cjs/src/cryptocom.js +2 -2
  22. package/dist/cjs/src/deribit.js +1 -1
  23. package/dist/cjs/src/hitbtc.js +2 -0
  24. package/dist/cjs/src/idex.js +60 -1
  25. package/dist/cjs/src/latoken.js +3 -0
  26. package/dist/cjs/src/mercado.js +3 -0
  27. package/dist/cjs/src/oceanex.js +3 -0
  28. package/dist/cjs/src/okx.js +1 -0
  29. package/dist/cjs/src/pro/bitget.js +12 -8
  30. package/dist/cjs/src/pro/bitmart.js +11 -11
  31. package/dist/cjs/src/pro/bitmex.js +4 -4
  32. package/dist/cjs/src/pro/cex.js +2 -2
  33. package/dist/cjs/src/pro/gate.js +76 -42
  34. package/dist/cjs/src/pro/gemini.js +4 -3
  35. package/dist/cjs/src/pro/hitbtc.js +1 -0
  36. package/dist/cjs/src/probit.js +3 -3
  37. package/dist/cjs/src/timex.js +65 -0
  38. package/js/ccxt.d.ts +1 -1
  39. package/js/ccxt.js +1 -1
  40. package/js/src/abstract/bequant.d.ts +2 -0
  41. package/js/src/abstract/bitcoincom.d.ts +2 -0
  42. package/js/src/abstract/bithumb.d.ts +5 -0
  43. package/js/src/abstract/coinbase.d.ts +1 -0
  44. package/js/src/abstract/coinmate.d.ts +12 -0
  45. package/js/src/abstract/fmfwio.d.ts +2 -0
  46. package/js/src/abstract/hitbtc.d.ts +2 -0
  47. package/js/src/abstract/hitbtc3.d.ts +2 -0
  48. package/js/src/abstract/okx.d.ts +1 -0
  49. package/js/src/base/Exchange.d.ts +12 -6
  50. package/js/src/base/Exchange.js +48 -0
  51. package/js/src/base/ws/Cache.d.ts +5 -1
  52. package/js/src/base/ws/Cache.js +13 -5
  53. package/js/src/base/ws/OrderBook.d.ts +5 -1
  54. package/js/src/base/ws/OrderBook.js +3 -3
  55. package/js/src/binance.d.ts +2 -1
  56. package/js/src/binance.js +407 -21
  57. package/js/src/bingx.d.ts +2 -1
  58. package/js/src/bingx.js +43 -5
  59. package/js/src/bitfinex2.js +1 -0
  60. package/js/src/bithumb.js +5 -0
  61. package/js/src/bitstamp.js +1 -1
  62. package/js/src/btcturk.js +11 -0
  63. package/js/src/bybit.d.ts +4 -1
  64. package/js/src/bybit.js +96 -43
  65. package/js/src/coinbase.d.ts +10 -4
  66. package/js/src/coinbase.js +228 -38
  67. package/js/src/coincheck.js +11 -0
  68. package/js/src/coinmate.d.ts +3 -1
  69. package/js/src/coinmate.js +114 -1
  70. package/js/src/coinspot.js +7 -0
  71. package/js/src/cryptocom.js +2 -2
  72. package/js/src/deribit.js +1 -1
  73. package/js/src/hitbtc.js +2 -0
  74. package/js/src/idex.d.ts +14 -0
  75. package/js/src/idex.js +60 -1
  76. package/js/src/latoken.js +3 -0
  77. package/js/src/mercado.js +3 -0
  78. package/js/src/oceanex.js +3 -0
  79. package/js/src/okx.js +1 -0
  80. package/js/src/pro/bitget.js +12 -8
  81. package/js/src/pro/bitmart.js +11 -11
  82. package/js/src/pro/bitmex.js +4 -4
  83. package/js/src/pro/cex.js +2 -2
  84. package/js/src/pro/gate.d.ts +4 -0
  85. package/js/src/pro/gate.js +76 -42
  86. package/js/src/pro/gemini.js +4 -3
  87. package/js/src/pro/hitbtc.js +1 -0
  88. package/js/src/probit.js +3 -3
  89. package/js/src/timex.d.ts +14 -0
  90. package/js/src/timex.js +65 -0
  91. package/package.json +1 -1
  92. package/skip-tests.json +4 -0
@@ -275,6 +275,7 @@ export default class gate extends gateRest {
275
275
  /**
276
276
  * @method
277
277
  * @name gate#watchTicker
278
+ * @see https://www.gate.io/docs/developers/apiv4/ws/en/#tickers-channel
278
279
  * @description watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
279
280
  * @param {string} symbol unified symbol of the market to fetch the ticker for
280
281
  * @param {object} [params] extra parameters specific to the exchange API endpoint
@@ -283,45 +284,21 @@ export default class gate extends gateRest {
283
284
  await this.loadMarkets();
284
285
  const market = this.market(symbol);
285
286
  symbol = market['symbol'];
286
- const marketId = market['id'];
287
- const url = this.getUrlByMarket(market);
288
- const messageType = this.getTypeByMarket(market);
289
- const [topic, query] = this.handleOptionAndParams(params, 'watchTicker', 'name', 'tickers');
290
- const channel = messageType + '.' + topic;
291
- const messageHash = 'ticker:' + symbol;
292
- const payload = [marketId];
293
- return await this.subscribePublic(url, messageHash, payload, channel, query);
287
+ params['callerMethodName'] = 'watchTicker';
288
+ const result = await this.watchTickers([symbol], params);
289
+ return this.safeValue(result, symbol);
294
290
  }
295
291
  async watchTickers(symbols = undefined, params = {}) {
296
292
  /**
297
293
  * @method
298
294
  * @name gate#watchTickers
295
+ * @see https://www.gate.io/docs/developers/apiv4/ws/en/#tickers-channel
299
296
  * @description watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for all markets of a specific list
300
297
  * @param {string[]} symbols unified symbol of the market to fetch the ticker for
301
298
  * @param {object} [params] extra parameters specific to the exchange API endpoint
302
299
  * @returns {object} a [ticker structure]{@link https://docs.ccxt.com/#/?id=ticker-structure}
303
300
  */
304
- await this.loadMarkets();
305
- symbols = this.marketSymbols(symbols);
306
- if (symbols === undefined) {
307
- throw new ArgumentsRequired(this.id + ' watchTickers requires symbols');
308
- }
309
- const market = this.market(symbols[0]);
310
- const messageType = this.getTypeByMarket(market);
311
- const marketIds = this.marketIds(symbols);
312
- const [topic, query] = this.handleOptionAndParams(params, 'watchTicker', 'method', 'tickers');
313
- const channel = messageType + '.' + topic;
314
- const messageHash = 'tickers';
315
- const url = this.getUrlByMarket(market);
316
- const ticker = await this.subscribePublic(url, messageHash, marketIds, channel, query);
317
- let result = {};
318
- if (this.newUpdates) {
319
- result[ticker['symbol']] = ticker;
320
- }
321
- else {
322
- result = this.tickers;
323
- }
324
- return this.filterByArray(result, 'symbol', symbols, true);
301
+ return await this.subscribeWatchTickersAndBidsAsks(symbols, 'watchTickers', this.extend({ 'method': 'tickers' }, params));
325
302
  }
326
303
  handleTicker(client, message) {
327
304
  //
@@ -341,6 +318,24 @@ export default class gate extends gateRest {
341
318
  // "low_24h": "42721.03"
342
319
  // }
343
320
  // }
321
+ //
322
+ this.handleTickerAndBidAsk('ticker', client, message);
323
+ }
324
+ async watchBidsAsks(symbols = undefined, params = {}) {
325
+ /**
326
+ * @method
327
+ * @name gate#watchBidsAsks
328
+ * @see https://www.gate.io/docs/developers/apiv4/ws/en/#best-bid-or-ask-price
329
+ * @see https://www.gate.io/docs/developers/apiv4/ws/en/#order-book-channel
330
+ * @description watches best bid & ask for symbols
331
+ * @param {string[]} symbols unified symbol of the market to fetch the ticker for
332
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
333
+ * @returns {object} a [ticker structure]{@link https://docs.ccxt.com/#/?id=ticker-structure}
334
+ */
335
+ return await this.subscribeWatchTickersAndBidsAsks(symbols, 'watchBidsAsks', this.extend({ 'method': 'book_ticker' }, params));
336
+ }
337
+ handleBidAsk(client, message) {
338
+ //
344
339
  // {
345
340
  // "time": 1671363004,
346
341
  // "time_ms": 1671363004235,
@@ -357,24 +352,63 @@ export default class gate extends gateRest {
357
352
  // }
358
353
  // }
359
354
  //
355
+ this.handleTickerAndBidAsk('bidask', client, message);
356
+ }
357
+ async subscribeWatchTickersAndBidsAsks(symbols = undefined, callerMethodName = undefined, params = {}) {
358
+ await this.loadMarkets();
359
+ [callerMethodName, params] = this.handleParamString(params, 'callerMethodName', callerMethodName);
360
+ symbols = this.marketSymbols(symbols, undefined, false);
361
+ const market = this.market(symbols[0]);
362
+ const messageType = this.getTypeByMarket(market);
363
+ const marketIds = this.marketIds(symbols);
364
+ let channelName = undefined;
365
+ [channelName, params] = this.handleOptionAndParams(params, callerMethodName, 'method');
366
+ const url = this.getUrlByMarket(market);
367
+ const channel = messageType + '.' + channelName;
368
+ const isWatchTickers = callerMethodName.indexOf('watchTicker') >= 0;
369
+ const prefix = isWatchTickers ? 'ticker' : 'bidask';
370
+ const messageHashes = [];
371
+ for (let i = 0; i < symbols.length; i++) {
372
+ const symbol = symbols[i];
373
+ messageHashes.push(prefix + ':' + symbol);
374
+ }
375
+ const tickerOrBidAsk = await this.subscribePublicMultiple(url, messageHashes, marketIds, channel, params);
376
+ if (this.newUpdates) {
377
+ const items = {};
378
+ items[tickerOrBidAsk['symbol']] = tickerOrBidAsk;
379
+ return items;
380
+ }
381
+ const result = isWatchTickers ? this.tickers : this.bidsasks;
382
+ return this.filterByArray(result, 'symbol', symbols, true);
383
+ }
384
+ handleTickerAndBidAsk(objectName, client, message) {
360
385
  const channel = this.safeString(message, 'channel');
361
386
  const parts = channel.split('.');
362
387
  const rawMarketType = this.safeString(parts, 0);
363
388
  const marketType = (rawMarketType === 'futures') ? 'contract' : 'spot';
364
- let result = this.safeValue(message, 'result');
365
- if (!Array.isArray(result)) {
366
- result = [result];
389
+ let results = [];
390
+ if (marketType === 'contract') {
391
+ results = this.safeList(message, 'result', []);
367
392
  }
368
- for (let i = 0; i < result.length; i++) {
369
- const ticker = result[i];
370
- const marketId = this.safeString(ticker, 's');
393
+ else {
394
+ const rawTicker = this.safeDict(message, 'result', {});
395
+ results = [rawTicker];
396
+ }
397
+ const isTicker = (objectName === 'ticker'); // whether ticker or bid-ask
398
+ for (let i = 0; i < results.length; i++) {
399
+ const rawTicker = results[i];
400
+ const marketId = this.safeString(rawTicker, 's');
371
401
  const market = this.safeMarket(marketId, undefined, '_', marketType);
372
- const parsed = this.parseTicker(ticker, market);
373
- const symbol = parsed['symbol'];
374
- this.tickers[symbol] = parsed;
375
- const messageHash = 'ticker:' + symbol;
376
- client.resolve(parsed, messageHash);
377
- client.resolve(parsed, 'tickers');
402
+ const parsedItem = this.parseTicker(rawTicker, market);
403
+ const symbol = parsedItem['symbol'];
404
+ if (isTicker) {
405
+ this.tickers[symbol] = parsedItem;
406
+ }
407
+ else {
408
+ this.bidsasks[symbol] = parsedItem;
409
+ }
410
+ const messageHash = objectName + ':' + symbol;
411
+ client.resolve(parsedItem, messageHash);
378
412
  }
379
413
  }
380
414
  async watchTrades(symbol, since = undefined, limit = undefined, params = {}) {
@@ -1175,7 +1209,7 @@ export default class gate extends gateRest {
1175
1209
  'orders': this.handleOrder,
1176
1210
  'positions': this.handlePositions,
1177
1211
  'tickers': this.handleTicker,
1178
- 'book_ticker': this.handleTicker,
1212
+ 'book_ticker': this.handleBidAsk,
1179
1213
  'trades': this.handleTrades,
1180
1214
  'order_book_update': this.handleOrderBook,
1181
1215
  'balances': this.handleBalance,
@@ -463,10 +463,11 @@ export default class gemini extends geminiRest {
463
463
  const market = this.safeMarket(marketId.toLowerCase());
464
464
  const symbol = market['symbol'];
465
465
  const messageHash = 'orderbook:' + symbol;
466
- let orderbook = this.safeDict(this.orderbooks, symbol);
467
- if (orderbook === undefined) {
468
- orderbook = this.orderBook();
466
+ if (!(symbol in this.orderbooks)) {
467
+ const ob = this.orderBook();
468
+ this.orderbooks[symbol] = ob;
469
469
  }
470
+ const orderbook = this.orderbooks[symbol];
470
471
  const bids = orderbook['bids'];
471
472
  const asks = orderbook['asks'];
472
473
  for (let i = 0; i < rawOrderBookChanges.length; i++) {
@@ -411,6 +411,7 @@ export default class hitbtc extends hitbtcRest {
411
411
  const messageHash = channel + '::' + symbol;
412
412
  client.resolve(newTickers, messageHash);
413
413
  }
414
+ client.resolve(newTickers, 'tickers');
414
415
  const messageHashes = this.findMessageHashes(client, 'tickers::');
415
416
  for (let i = 0; i < messageHashes.length; i++) {
416
417
  const messageHash = messageHashes[i];
package/js/src/probit.js CHANGED
@@ -1592,12 +1592,12 @@ export default class probit extends Exchange {
1592
1592
  const currencyId = this.safeString(transaction, 'currency_id');
1593
1593
  const code = this.safeCurrencyCode(currencyId);
1594
1594
  const status = this.parseTransactionStatus(this.safeString(transaction, 'status'));
1595
- const feeCost = this.safeNumber(transaction, 'fee');
1595
+ const feeCostString = this.safeString(transaction, 'fee');
1596
1596
  let fee = undefined;
1597
- if (feeCost !== undefined && feeCost !== 0) {
1597
+ if (feeCostString !== undefined && feeCostString !== '0') {
1598
1598
  fee = {
1599
1599
  'currency': code,
1600
- 'cost': feeCost,
1600
+ 'cost': this.parseNumber(feeCostString),
1601
1601
  };
1602
1602
  }
1603
1603
  return {
package/js/src/timex.d.ts CHANGED
@@ -67,6 +67,20 @@ export default class timex extends Exchange {
67
67
  parseTrade(trade: any, market?: Market): Trade;
68
68
  parseOHLCV(ohlcv: any, market?: Market): OHLCV;
69
69
  parseOrder(order: any, market?: Market): Order;
70
+ fetchDepositAddress(code: string, params?: {}): Promise<{
71
+ info: any;
72
+ currency: string;
73
+ address: string;
74
+ tag: any;
75
+ network: any;
76
+ }>;
77
+ parseDepositAddress(depositAddress: any, currency?: Currency): {
78
+ info: any;
79
+ currency: string;
80
+ address: string;
81
+ tag: any;
82
+ network: any;
83
+ };
70
84
  sign(path: any, api?: string, method?: string, params?: {}, headers?: any, body?: any): {
71
85
  url: string;
72
86
  method: string;
package/js/src/timex.js CHANGED
@@ -44,6 +44,9 @@ export default class timex extends Exchange {
44
44
  'fetchCrossBorrowRates': false,
45
45
  'fetchCurrencies': true,
46
46
  'fetchDeposit': false,
47
+ 'fetchDepositAddress': true,
48
+ 'fetchDepositAddresses': false,
49
+ 'fetchDepositAddressesByNetwork': false,
47
50
  'fetchDeposits': true,
48
51
  'fetchFundingHistory': false,
49
52
  'fetchFundingRate': false,
@@ -1524,7 +1527,69 @@ export default class timex extends Exchange {
1524
1527
  'trades': rawTrades,
1525
1528
  }, market);
1526
1529
  }
1530
+ async fetchDepositAddress(code, params = {}) {
1531
+ /**
1532
+ * @method
1533
+ * @name timex#fetchDepositAddress
1534
+ * @description fetch the deposit address for a currency associated with this account, does not accept params["network"]
1535
+ * @param {string} code unified currency code
1536
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
1537
+ * @returns {object} an [address structure]{@link https://docs.ccxt.com/#/?id=address-structure}
1538
+ */
1539
+ await this.loadMarkets();
1540
+ const currency = this.currency(code);
1541
+ const request = {
1542
+ 'symbol': currency['code'],
1543
+ };
1544
+ const response = await this.currenciesGetSSymbol(this.extend(request, params));
1545
+ //
1546
+ // {
1547
+ // id: '1',
1548
+ // currency: {
1549
+ // symbol: 'BTC',
1550
+ // name: 'Bitcoin',
1551
+ // address: '0x8370fbc6ddec1e18b4e41e72ed943e238458487c',
1552
+ // decimals: '8',
1553
+ // tradeDecimals: '20',
1554
+ // fiatSymbol: 'BTC',
1555
+ // depositEnabled: true,
1556
+ // withdrawalEnabled: true,
1557
+ // transferEnabled: true,
1558
+ // active: true
1559
+ // }
1560
+ // }
1561
+ //
1562
+ const data = this.safeDict(response, 'currency', {});
1563
+ return this.parseDepositAddress(data, currency);
1564
+ }
1565
+ parseDepositAddress(depositAddress, currency = undefined) {
1566
+ //
1567
+ // {
1568
+ // symbol: 'BTC',
1569
+ // name: 'Bitcoin',
1570
+ // address: '0x8370fbc6ddec1e18b4e41e72ed943e238458487c',
1571
+ // decimals: '8',
1572
+ // tradeDecimals: '20',
1573
+ // fiatSymbol: 'BTC',
1574
+ // depositEnabled: true,
1575
+ // withdrawalEnabled: true,
1576
+ // transferEnabled: true,
1577
+ // active: true
1578
+ // }
1579
+ //
1580
+ const currencyId = this.safeString(depositAddress, 'symbol');
1581
+ return {
1582
+ 'info': depositAddress,
1583
+ 'currency': this.safeCurrencyCode(currencyId, currency),
1584
+ 'address': this.safeString(depositAddress, 'address'),
1585
+ 'tag': undefined,
1586
+ 'network': undefined,
1587
+ };
1588
+ }
1527
1589
  sign(path, api = 'public', method = 'GET', params = {}, headers = undefined, body = undefined) {
1590
+ const paramsToExtract = this.extractParams(path);
1591
+ path = this.implodeParams(path, params);
1592
+ params = this.omit(params, paramsToExtract);
1528
1593
  let url = this.urls['api']['rest'] + '/' + api + '/' + path;
1529
1594
  if (Object.keys(params).length) {
1530
1595
  url += '?' + this.urlencodeWithArrayRepeat(params);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ccxt",
3
- "version": "4.2.44",
3
+ "version": "4.2.46",
4
4
  "description": "A JavaScript / TypeScript / Python / C# / PHP cryptocurrency trading library with support for 100+ exchanges",
5
5
  "unpkg": "dist/ccxt.browser.js",
6
6
  "type": "module",
package/skip-tests.json CHANGED
@@ -356,6 +356,8 @@
356
356
  }
357
357
  },
358
358
  "onetrading": {
359
+ "skip": true,
360
+ "until": "2024-02-18",
359
361
  "skipWs": true,
360
362
  "skipMethods": {
361
363
  "fetchOrderBook": "some bid might be lower than next bid",
@@ -707,6 +709,8 @@
707
709
  }
708
710
  },
709
711
  "coinsph": {
712
+ "skip": true,
713
+ "until": "2024-02-20",
710
714
  "skipMethods": {
711
715
  "loadMarkets": {
712
716
  "taker":"messed",