ccxt 4.3.58 → 4.3.60

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 (83) hide show
  1. package/README.md +4 -4
  2. package/dist/ccxt.browser.min.js +3 -3
  3. package/dist/cjs/ccxt.js +4 -2
  4. package/dist/cjs/src/base/Exchange.js +4 -4
  5. package/dist/cjs/src/base/errors.js +22 -22
  6. package/dist/cjs/src/binance.js +90 -1
  7. package/dist/cjs/src/bingx.js +467 -123
  8. package/dist/cjs/src/bitfinex.js +38 -4
  9. package/dist/cjs/src/bitmart.js +1 -0
  10. package/dist/cjs/src/bitso.js +4 -1
  11. package/dist/cjs/src/btcbox.js +149 -7
  12. package/dist/cjs/src/bybit.js +3 -5
  13. package/dist/cjs/src/cryptocom.js +14 -6
  14. package/dist/cjs/src/deribit.js +15 -1
  15. package/dist/cjs/src/digifinex.js +32 -7
  16. package/dist/cjs/src/gate.js +16 -17
  17. package/dist/cjs/src/htx.js +7 -7
  18. package/dist/cjs/src/hyperliquid.js +108 -2
  19. package/dist/cjs/src/kraken.js +1 -1
  20. package/dist/cjs/src/mexc.js +11 -11
  21. package/dist/cjs/src/okx.js +11 -2
  22. package/dist/cjs/src/pro/binance.js +11 -13
  23. package/dist/cjs/src/pro/bingx.js +11 -8
  24. package/dist/cjs/src/pro/cex.js +1 -1
  25. package/dist/cjs/src/pro/kucoin.js +35 -3
  26. package/dist/cjs/src/pro/phemex.js +1 -1
  27. package/dist/cjs/src/pro/xt.js +1112 -0
  28. package/dist/cjs/src/timex.js +18 -2
  29. package/dist/cjs/src/upbit.js +148 -49
  30. package/dist/cjs/src/xt.js +73 -8
  31. package/js/ccxt.d.ts +6 -3
  32. package/js/ccxt.js +5 -3
  33. package/js/src/abstract/bingx.d.ts +1 -1
  34. package/js/src/abstract/bitmart.d.ts +1 -0
  35. package/js/src/abstract/btcbox.d.ts +1 -0
  36. package/js/src/abstract/upbit.d.ts +3 -0
  37. package/js/src/abstract/xt.d.ts +1 -0
  38. package/js/src/base/Exchange.d.ts +3 -3
  39. package/js/src/base/Exchange.js +5 -5
  40. package/js/src/base/errorHierarchy.d.ts +5 -5
  41. package/js/src/base/errorHierarchy.js +5 -5
  42. package/js/src/base/errors.d.ts +15 -15
  43. package/js/src/base/errors.js +22 -22
  44. package/js/src/binance.d.ts +1 -1
  45. package/js/src/binance.js +90 -1
  46. package/js/src/bingx.js +467 -123
  47. package/js/src/bitfinex.d.ts +2 -2
  48. package/js/src/bitfinex.js +38 -4
  49. package/js/src/bitmart.js +1 -0
  50. package/js/src/bitso.js +4 -1
  51. package/js/src/btcbox.d.ts +4 -1
  52. package/js/src/btcbox.js +149 -7
  53. package/js/src/bybit.js +3 -5
  54. package/js/src/cryptocom.js +14 -6
  55. package/js/src/deribit.d.ts +1 -1
  56. package/js/src/deribit.js +15 -1
  57. package/js/src/digifinex.d.ts +3 -2
  58. package/js/src/digifinex.js +32 -7
  59. package/js/src/gate.js +16 -17
  60. package/js/src/htx.js +7 -7
  61. package/js/src/hyperliquid.d.ts +3 -1
  62. package/js/src/hyperliquid.js +108 -2
  63. package/js/src/kraken.js +1 -1
  64. package/js/src/mexc.js +11 -11
  65. package/js/src/okx.js +11 -2
  66. package/js/src/pro/binance.js +11 -13
  67. package/js/src/pro/bingx.js +11 -8
  68. package/js/src/pro/bitmart.d.ts +3 -3
  69. package/js/src/pro/bitopro.d.ts +2 -2
  70. package/js/src/pro/cex.js +1 -1
  71. package/js/src/pro/coincheck.d.ts +2 -2
  72. package/js/src/pro/coinone.d.ts +2 -2
  73. package/js/src/pro/hyperliquid.d.ts +2 -2
  74. package/js/src/pro/kucoin.js +35 -3
  75. package/js/src/pro/phemex.js +1 -1
  76. package/js/src/pro/xt.d.ts +31 -0
  77. package/js/src/pro/xt.js +1113 -0
  78. package/js/src/timex.d.ts +2 -2
  79. package/js/src/timex.js +18 -2
  80. package/js/src/upbit.d.ts +0 -1
  81. package/js/src/upbit.js +148 -49
  82. package/js/src/xt.js +73 -8
  83. package/package.json +1 -1
@@ -101,7 +101,7 @@ export default class hyperliquid extends Exchange {
101
101
  'fetchTickers': false,
102
102
  'fetchTime': false,
103
103
  'fetchTrades': true,
104
- 'fetchTradingFee': false,
104
+ 'fetchTradingFee': true,
105
105
  'fetchTradingFees': false,
106
106
  'fetchTransfer': false,
107
107
  'fetchTransfers': false,
@@ -1318,7 +1318,7 @@ export default class hyperliquid extends Exchange {
1318
1318
  * @description cancel multiple orders for multiple symbols
1319
1319
  * @see https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#cancel-order-s
1320
1320
  * @see https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#cancel-order-s-by-cloid
1321
- * @param {CancellationRequest[]} orders each order should contain the parameters required by cancelOrder namely id and symbol
1321
+ * @param {CancellationRequest[]} orders each order should contain the parameters required by cancelOrder namely id and symbol, example [{"id": "a", "symbol": "BTC/USDT"}, {"id": "b", "symbol": "ETH/USDT"}]
1322
1322
  * @param {object} [params] extra parameters specific to the exchange API endpoint
1323
1323
  * @param {string} [params.vaultAddress] the vault address
1324
1324
  * @returns {object} an list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
@@ -2519,6 +2519,112 @@ export default class hyperliquid extends Exchange {
2519
2519
  'fee': undefined,
2520
2520
  };
2521
2521
  }
2522
+ async fetchTradingFee(symbol, params = {}) {
2523
+ /**
2524
+ * @method
2525
+ * @name hyperliquid#fetchTradingFee
2526
+ * @description fetch the trading fees for a market
2527
+ * @param {string} symbol unified market symbol
2528
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
2529
+ * @param {string} [params.user] user address, will default to this.walletAddress if not provided
2530
+ * @returns {object} a [fee structure]{@link https://docs.ccxt.com/#/?id=fee-structure}
2531
+ */
2532
+ await this.loadMarkets();
2533
+ let userAddress = undefined;
2534
+ [userAddress, params] = this.handlePublicAddress('fetchTradingFee', params);
2535
+ const market = this.market(symbol);
2536
+ const request = {
2537
+ 'type': 'userFees',
2538
+ 'user': userAddress,
2539
+ };
2540
+ const response = await this.publicPostInfo(this.extend(request, params));
2541
+ //
2542
+ // {
2543
+ // "dailyUserVlm": [
2544
+ // {
2545
+ // "date": "2024-07-08",
2546
+ // "userCross": "0.0",
2547
+ // "userAdd": "0.0",
2548
+ // "exchange": "90597185.23639999"
2549
+ // }
2550
+ // ],
2551
+ // "feeSchedule": {
2552
+ // "cross": "0.00035",
2553
+ // "add": "0.0001",
2554
+ // "tiers": {
2555
+ // "vip": [
2556
+ // {
2557
+ // "ntlCutoff": "5000000.0",
2558
+ // "cross": "0.0003",
2559
+ // "add": "0.00005"
2560
+ // }
2561
+ // ],
2562
+ // "mm": [
2563
+ // {
2564
+ // "makerFractionCutoff": "0.005",
2565
+ // "add": "-0.00001"
2566
+ // }
2567
+ // ]
2568
+ // },
2569
+ // "referralDiscount": "0.04"
2570
+ // },
2571
+ // "userCrossRate": "0.00035",
2572
+ // "userAddRate": "0.0001",
2573
+ // "activeReferralDiscount": "0.0"
2574
+ // }
2575
+ //
2576
+ const data = {
2577
+ 'userCrossRate': this.safeString(response, 'userCrossRate'),
2578
+ 'userAddRate': this.safeString(response, 'userAddRate'),
2579
+ };
2580
+ return this.parseTradingFee(data, market);
2581
+ }
2582
+ parseTradingFee(fee, market = undefined) {
2583
+ //
2584
+ // {
2585
+ // "dailyUserVlm": [
2586
+ // {
2587
+ // "date": "2024-07-08",
2588
+ // "userCross": "0.0",
2589
+ // "userAdd": "0.0",
2590
+ // "exchange": "90597185.23639999"
2591
+ // }
2592
+ // ],
2593
+ // "feeSchedule": {
2594
+ // "cross": "0.00035",
2595
+ // "add": "0.0001",
2596
+ // "tiers": {
2597
+ // "vip": [
2598
+ // {
2599
+ // "ntlCutoff": "5000000.0",
2600
+ // "cross": "0.0003",
2601
+ // "add": "0.00005"
2602
+ // }
2603
+ // ],
2604
+ // "mm": [
2605
+ // {
2606
+ // "makerFractionCutoff": "0.005",
2607
+ // "add": "-0.00001"
2608
+ // }
2609
+ // ]
2610
+ // },
2611
+ // "referralDiscount": "0.04"
2612
+ // },
2613
+ // "userCrossRate": "0.00035",
2614
+ // "userAddRate": "0.0001",
2615
+ // "activeReferralDiscount": "0.0"
2616
+ // }
2617
+ //
2618
+ const symbol = this.safeSymbol(undefined, market);
2619
+ return {
2620
+ 'info': fee,
2621
+ 'symbol': symbol,
2622
+ 'maker': this.safeNumber(fee, 'userAddRate'),
2623
+ 'taker': this.safeNumber(fee, 'userCrossRate'),
2624
+ 'percentage': undefined,
2625
+ 'tierBased': undefined,
2626
+ };
2627
+ }
2522
2628
  formatVaultAddress(address = undefined) {
2523
2629
  if (address === undefined) {
2524
2630
  return undefined;
package/js/src/kraken.js CHANGED
@@ -1052,7 +1052,7 @@ export default class kraken extends Exchange {
1052
1052
  else {
1053
1053
  direction = 'in';
1054
1054
  }
1055
- const timestamp = this.safeTimestamp(item, 'time');
1055
+ const timestamp = this.safeIntegerProduct(item, 'time', 1000);
1056
1056
  return {
1057
1057
  'info': item,
1058
1058
  'id': id,
package/js/src/mexc.js CHANGED
@@ -799,24 +799,24 @@ export default class mexc extends Exchange {
799
799
  'commonCurrencies': {
800
800
  'BEYONDPROTOCOL': 'BEYOND',
801
801
  'BIFI': 'BIFIF',
802
- 'BYN': 'BeyondFi',
802
+ 'BYN': 'BEYONDFI',
803
803
  'COFI': 'COFIX',
804
- 'DFI': 'DfiStarter',
805
- 'DFT': 'dFuture',
804
+ 'DFI': 'DFISTARTER',
805
+ 'DFT': 'DFUTURE',
806
806
  'DRK': 'DRK',
807
- 'EGC': 'Egoras Credit',
807
+ 'EGC': 'EGORASCREDIT',
808
808
  'FLUX1': 'FLUX',
809
809
  'FLUX': 'FLUX1',
810
- 'FREE': 'FreeRossDAO',
810
+ 'FREE': 'FREEROSSDAO',
811
811
  'GAS': 'GASDAO',
812
812
  'GASNEO': 'GAS',
813
- 'GMT': 'GMT Token',
813
+ 'GMT': 'GMTTOKEN',
814
814
  'STEPN': 'GMT',
815
- 'HERO': 'Step Hero',
816
- 'MIMO': 'Mimosa',
817
- 'PROS': 'Pros.Finance',
818
- 'SIN': 'Sin City Token',
819
- 'SOUL': 'Soul Swap',
815
+ 'HERO': 'STEPHERO',
816
+ 'MIMO': 'MIMOSA',
817
+ 'PROS': 'PROSFINANCE',
818
+ 'SIN': 'SINCITYTOKEN',
819
+ 'SOUL': 'SOULSWAP',
820
820
  },
821
821
  'exceptions': {
822
822
  'exact': {
package/js/src/okx.js CHANGED
@@ -927,7 +927,16 @@ export default class okx extends Exchange {
927
927
  '64003': AccountNotEnabled,
928
928
  '70010': BadRequest,
929
929
  '70013': BadRequest,
930
- '70016': BadRequest, // Please specify your instrument settings for at least one instType.
930
+ '70016': BadRequest,
931
+ '1009': BadRequest,
932
+ '4001': AuthenticationError,
933
+ '4002': BadRequest,
934
+ '4003': RateLimitExceeded,
935
+ '4004': NetworkError,
936
+ '4005': ExchangeNotAvailable,
937
+ '4006': BadRequest,
938
+ '4007': AuthenticationError,
939
+ '4008': RateLimitExceeded, // The number of subscribed channels exceeds the maximum limit.
931
940
  },
932
941
  'broad': {
933
942
  'Internal Server Error': ExchangeNotAvailable,
@@ -3351,7 +3360,7 @@ export default class okx extends Exchange {
3351
3360
  * @description cancel multiple orders for multiple symbols
3352
3361
  * @see https://www.okx.com/docs-v5/en/#order-book-trading-trade-post-cancel-multiple-orders
3353
3362
  * @see https://www.okx.com/docs-v5/en/#order-book-trading-algo-trading-post-cancel-algo-order
3354
- * @param {CancellationRequest[]} orders each order should contain the parameters required by cancelOrder namely id and symbol
3363
+ * @param {CancellationRequest[]} orders each order should contain the parameters required by cancelOrder namely id and symbol, example [{"id": "a", "symbol": "BTC/USDT"}, {"id": "b", "symbol": "ETH/USDT"}]
3355
3364
  * @param {object} [params] extra parameters specific to the exchange API endpoint
3356
3365
  * @param {boolean} [params.trigger] whether the order is a stop/trigger order
3357
3366
  * @param {boolean} [params.trailing] set to true if you want to cancel trailing orders
@@ -614,9 +614,9 @@ export default class binance extends binanceRest {
614
614
  for (let i = 0; i < symbols.length; i++) {
615
615
  const symbol = symbols[i];
616
616
  const market = this.market(symbol);
617
- const messageHash = market['lowercaseId'] + '@' + name;
618
- messageHashes.push(messageHash);
619
- const symbolHash = messageHash + '@' + watchOrderBookRate + 'ms';
617
+ messageHashes.push('orderbook::' + symbol);
618
+ const subscriptionHash = market['lowercaseId'] + '@' + name;
619
+ const symbolHash = subscriptionHash + '@' + watchOrderBookRate + 'ms';
620
620
  subParams.push(symbolHash);
621
621
  }
622
622
  const messageHashesLength = messageHashes.length;
@@ -636,8 +636,7 @@ export default class binance extends binanceRest {
636
636
  'type': type,
637
637
  'params': params,
638
638
  };
639
- const message = this.extend(request, params);
640
- const orderbook = await this.watchMultiple(url, messageHashes, message, messageHashes, subscription);
639
+ const orderbook = await this.watchMultiple(url, messageHashes, this.extend(request, params), messageHashes, subscription);
641
640
  return orderbook.limit();
642
641
  }
643
642
  async fetchOrderBookWs(symbol, limit = undefined, params = {}) {
@@ -816,8 +815,7 @@ export default class binance extends binanceRest {
816
815
  const marketId = this.safeString(message, 's');
817
816
  const market = this.safeMarket(marketId, undefined, undefined, marketType);
818
817
  const symbol = market['symbol'];
819
- const name = 'depth';
820
- const messageHash = market['lowercaseId'] + '@' + name;
818
+ const messageHash = 'orderbook::' + symbol;
821
819
  if (!(symbol in this.orderbooks)) {
822
820
  //
823
821
  // https://github.com/ccxt/ccxt/issues/6672
@@ -960,12 +958,14 @@ export default class binance extends binanceRest {
960
958
  if (firstMarket['contract']) {
961
959
  type = firstMarket['linear'] ? 'future' : 'delivery';
962
960
  }
961
+ const messageHashes = [];
963
962
  const subParams = [];
964
963
  for (let i = 0; i < symbols.length; i++) {
965
964
  const symbol = symbols[i];
966
965
  const market = this.market(symbol);
967
- const currentMessageHash = market['lowercaseId'] + '@' + name;
968
- subParams.push(currentMessageHash);
966
+ messageHashes.push('trade::' + symbol);
967
+ const rawHash = market['lowercaseId'] + '@' + name;
968
+ subParams.push(rawHash);
969
969
  }
970
970
  const query = this.omit(params, 'type');
971
971
  const subParamsLength = subParams.length;
@@ -979,7 +979,7 @@ export default class binance extends binanceRest {
979
979
  const subscribe = {
980
980
  'id': requestId,
981
981
  };
982
- const trades = await this.watchMultiple(url, subParams, this.extend(request, query), subParams, subscribe);
982
+ const trades = await this.watchMultiple(url, messageHashes, this.extend(request, query), messageHashes, subscribe);
983
983
  if (this.newUpdates) {
984
984
  const first = this.safeValue(trades, 0);
985
985
  const tradeSymbol = this.safeString(first, 'symbol');
@@ -1170,9 +1170,7 @@ export default class binance extends binanceRest {
1170
1170
  const marketId = this.safeString(message, 's');
1171
1171
  const market = this.safeMarket(marketId, undefined, undefined, marketType);
1172
1172
  const symbol = market['symbol'];
1173
- const lowerCaseId = this.safeStringLower(message, 's');
1174
- const event = this.safeString(message, 'e');
1175
- const messageHash = lowerCaseId + '@' + event;
1173
+ const messageHash = 'trade::' + symbol;
1176
1174
  const trade = this.parseWsTrade(message, market);
1177
1175
  let tradesArray = this.safeValue(this.trades, symbol);
1178
1176
  if (tradesArray === undefined) {
@@ -97,10 +97,10 @@ export default class bingx extends bingxRest {
97
97
  */
98
98
  await this.loadMarkets();
99
99
  const market = this.market(symbol);
100
- const [marketType, query] = this.handleMarketTypeAndParams('watchTrades', market, params);
100
+ const [marketType, query] = this.handleMarketTypeAndParams('watchTicker', market, params);
101
101
  const url = this.safeValue(this.urls['api']['ws'], marketType);
102
102
  if (url === undefined) {
103
- throw new BadRequest(this.id + ' watchTrades is not supported for ' + marketType + ' markets.');
103
+ throw new BadRequest(this.id + ' watchTicker is not supported for ' + marketType + ' markets.');
104
104
  }
105
105
  const subscriptionHash = market['id'] + '@ticker';
106
106
  const messageHash = this.getMessageHash('ticker', market['symbol']);
@@ -448,21 +448,23 @@ export default class bingx extends bingxRest {
448
448
  */
449
449
  await this.loadMarkets();
450
450
  const market = this.market(symbol);
451
- const [marketType, query] = this.handleMarketTypeAndParams('watchTrades', market, params);
451
+ let marketType = undefined;
452
+ [marketType, params] = this.handleMarketTypeAndParams('watchTrades', market, params);
452
453
  const url = this.safeValue(this.urls['api']['ws'], marketType);
453
454
  if (url === undefined) {
454
455
  throw new BadRequest(this.id + ' watchTrades is not supported for ' + marketType + ' markets.');
455
456
  }
456
- const messageHash = market['id'] + '@trade';
457
+ const rawHash = market['id'] + '@trade';
458
+ const messageHash = 'trade::' + symbol;
457
459
  const uuid = this.uuid();
458
460
  const request = {
459
461
  'id': uuid,
460
- 'dataType': messageHash,
462
+ 'dataType': rawHash,
461
463
  };
462
464
  if (marketType === 'swap') {
463
465
  request['reqType'] = 'sub';
464
466
  }
465
- const trades = await this.watch(url, messageHash, this.extend(request, query), messageHash);
467
+ const trades = await this.watch(url, messageHash, this.extend(request, params), messageHash);
466
468
  if (this.newUpdates) {
467
469
  limit = trades.getLimit(symbol, limit);
468
470
  }
@@ -529,12 +531,13 @@ export default class bingx extends bingxRest {
529
531
  // }
530
532
  //
531
533
  const data = this.safeValue(message, 'data', []);
532
- const messageHash = this.safeString(message, 'dataType');
533
- const marketId = messageHash.split('@')[0];
534
+ const rawHash = this.safeString(message, 'dataType');
535
+ const marketId = rawHash.split('@')[0];
534
536
  const isSwap = client.url.indexOf('swap') >= 0;
535
537
  const marketType = isSwap ? 'swap' : 'spot';
536
538
  const market = this.safeMarket(marketId, undefined, undefined, marketType);
537
539
  const symbol = market['symbol'];
540
+ const messageHash = 'trade::' + symbol;
538
541
  let trades = undefined;
539
542
  if (Array.isArray(data)) {
540
543
  trades = this.parseTrades(data, market);
@@ -1,5 +1,5 @@
1
1
  import bitmartRest from '../bitmart.js';
2
- import type { Int, Market, Str, Strings, OrderBook, Order, Trade, Ticker, Tickers, OHLCV, Position, Balances } from '../base/types.js';
2
+ import type { Int, Market, Str, Strings, OrderBook, Order, Trade, Ticker, Tickers, OHLCV, Position, Balances, Dict } from '../base/types.js';
3
3
  import Client from '../base/ws/Client.js';
4
4
  export default class bitmart extends bitmartRest {
5
5
  describe(): any;
@@ -16,7 +16,7 @@ export default class bitmart extends bitmartRest {
16
16
  watchTickers(symbols?: Strings, params?: {}): Promise<Tickers>;
17
17
  watchOrders(symbol?: Str, since?: Int, limit?: Int, params?: {}): Promise<Order[]>;
18
18
  handleOrders(client: Client, message: any): void;
19
- parseWsOrder(order: any, market?: Market): Order;
19
+ parseWsOrder(order: Dict, market?: Market): Order;
20
20
  parseWsOrderStatus(statusId: any): string;
21
21
  parseWsOrderSide(sideId: any): string;
22
22
  watchPositions(symbols?: Strings, since?: Int, limit?: Int, params?: {}): Promise<Position[]>;
@@ -24,7 +24,7 @@ export default class bitmart extends bitmartRest {
24
24
  parseWsPosition(position: any, market?: Market): Position;
25
25
  handleTrade(client: Client, message: any): void;
26
26
  handleTradeLoop(entry: any): string;
27
- parseWsTrade(trade: any, market?: Market): Trade;
27
+ parseWsTrade(trade: Dict, market?: Market): Trade;
28
28
  handleTicker(client: Client, message: any): void;
29
29
  parseWsSwapTicker(ticker: any, market?: Market): Ticker;
30
30
  watchOHLCV(symbol: string, timeframe?: string, since?: Int, limit?: Int, params?: {}): Promise<OHLCV[]>;
@@ -1,5 +1,5 @@
1
1
  import bitoproRest from '../bitopro.js';
2
- import type { Int, OrderBook, Trade, Ticker, Balances, Market, Str } from '../base/types.js';
2
+ import type { Int, OrderBook, Trade, Ticker, Balances, Market, Str, Dict } from '../base/types.js';
3
3
  import Client from '../base/ws/Client.js';
4
4
  export default class bitopro extends bitoproRest {
5
5
  describe(): any;
@@ -10,7 +10,7 @@ export default class bitopro extends bitoproRest {
10
10
  handleTrade(client: Client, message: any): void;
11
11
  watchMyTrades(symbol?: Str, since?: Int, limit?: Int, params?: {}): Promise<Trade[]>;
12
12
  handleMyTrade(client: Client, message: any): void;
13
- parseWsTrade(trade: any, market?: Market): Trade;
13
+ parseWsTrade(trade: Dict, market?: Market): Trade;
14
14
  watchTicker(symbol: string, params?: {}): Promise<Ticker>;
15
15
  handleTicker(client: Client, message: any): void;
16
16
  authenticate(url: any): void;
package/js/src/pro/cex.js CHANGED
@@ -1015,7 +1015,7 @@ export default class cex extends cexRest {
1015
1015
  // }
1016
1016
  //
1017
1017
  const data = this.safeValue(message, 'data', {});
1018
- const incrementalId = this.safeNumber(data, 'id');
1018
+ const incrementalId = this.safeInteger(data, 'id');
1019
1019
  const pair = this.safeString(data, 'pair', '');
1020
1020
  const symbol = this.pairToSymbol(pair);
1021
1021
  const storedOrderBook = this.safeValue(this.orderbooks, symbol);
@@ -1,5 +1,5 @@
1
1
  import coincheckRest from '../coincheck.js';
2
- import type { Int, Market, OrderBook, Trade } from '../base/types.js';
2
+ import type { Int, Market, OrderBook, Trade, Dict } from '../base/types.js';
3
3
  import Client from '../base/ws/Client.js';
4
4
  export default class coincheck extends coincheckRest {
5
5
  describe(): any;
@@ -7,6 +7,6 @@ export default class coincheck extends coincheckRest {
7
7
  handleOrderBook(client: any, message: any): void;
8
8
  watchTrades(symbol: string, since?: Int, limit?: Int, params?: {}): Promise<Trade[]>;
9
9
  handleTrades(client: Client, message: any): void;
10
- parseWsTrade(trade: any, market?: Market): Trade;
10
+ parseWsTrade(trade: Dict, market?: Market): Trade;
11
11
  handleMessage(client: Client, message: any): void;
12
12
  }
@@ -1,5 +1,5 @@
1
1
  import coinoneRest from '../coinone.js';
2
- import type { Int, Market, OrderBook, Ticker, Trade } from '../base/types.js';
2
+ import type { Int, Market, OrderBook, Ticker, Trade, Dict } from '../base/types.js';
3
3
  import Client from '../base/ws/Client.js';
4
4
  export default class coinone extends coinoneRest {
5
5
  describe(): any;
@@ -11,7 +11,7 @@ export default class coinone extends coinoneRest {
11
11
  parseWsTicker(ticker: any, market?: Market): Ticker;
12
12
  watchTrades(symbol: string, since?: Int, limit?: Int, params?: {}): Promise<Trade[]>;
13
13
  handleTrades(client: Client, message: any): void;
14
- parseWsTrade(trade: any, market?: Market): Trade;
14
+ parseWsTrade(trade: Dict, market?: Market): Trade;
15
15
  handleErrorMessage(client: Client, message: any): boolean;
16
16
  handleMessage(client: Client, message: any): void;
17
17
  ping(client: any): {
@@ -1,6 +1,6 @@
1
1
  import hyperliquidRest from '../hyperliquid.js';
2
2
  import Client from '../base/ws/Client.js';
3
- import { Int, Str, Market, OrderBook, Trade, OHLCV, Order } from '../base/types.js';
3
+ import { Int, Str, Market, OrderBook, Trade, OHLCV, Order, Dict } from '../base/types.js';
4
4
  export default class hyperliquid extends hyperliquidRest {
5
5
  describe(): any;
6
6
  watchOrderBook(symbol: string, limit?: Int, params?: {}): Promise<OrderBook>;
@@ -9,7 +9,7 @@ export default class hyperliquid extends hyperliquidRest {
9
9
  handleMyTrades(client: Client, message: any): void;
10
10
  watchTrades(symbol: string, since?: Int, limit?: Int, params?: {}): Promise<Trade[]>;
11
11
  handleTrades(client: Client, message: any): void;
12
- parseWsTrade(trade: any, market?: Market): Trade;
12
+ parseWsTrade(trade: Dict, market?: Market): Trade;
13
13
  watchOHLCV(symbol: string, timeframe?: string, since?: Int, limit?: Int, params?: {}): Promise<OHLCV[]>;
14
14
  handleOHLCV(client: Client, message: any): void;
15
15
  watchOrders(symbol?: Str, since?: Int, limit?: Int, params?: {}): Promise<Order[]>;
@@ -43,6 +43,9 @@ export default class kucoin extends kucoinRest {
43
43
  'snapshotMaxRetries': 3,
44
44
  'method': '/market/level2', // '/spotMarket/level2Depth5' or '/spotMarket/level2Depth50'
45
45
  },
46
+ 'watchMyTrades': {
47
+ 'method': '/spotMarket/tradeOrders', // or '/spot/tradeFills'
48
+ },
46
49
  },
47
50
  'streaming': {
48
51
  // kucoin does not support built-in ws protocol-level ping-pong
@@ -986,11 +989,14 @@ export default class kucoin extends kucoinRest {
986
989
  * @param {int} [since] the earliest time in ms to fetch trades for
987
990
  * @param {int} [limit] the maximum number of trade structures to retrieve
988
991
  * @param {object} [params] extra parameters specific to the exchange API endpoint
992
+ * @param {string} [params.method] '/spotMarket/tradeOrders' or '/spot/tradeFills' default is '/spotMarket/tradeOrders'
989
993
  * @returns {object[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=trade-structure
990
994
  */
991
995
  await this.loadMarkets();
992
996
  const url = await this.negotiate(true);
993
- const topic = '/spotMarket/tradeOrders';
997
+ const options = this.safeDict(this.options, 'watchMyTrades');
998
+ const defaultMethod = this.safeString(params, 'method', '/spotMarket/tradeOrders');
999
+ const topic = (defaultMethod !== undefined) ? defaultMethod : this.safeString(options, 'method');
994
1000
  const request = {
995
1001
  'privateChannel': true,
996
1002
  };
@@ -1048,6 +1054,8 @@ export default class kucoin extends kucoinRest {
1048
1054
  client.resolve(this.myTrades, symbolSpecificMessageHash);
1049
1055
  }
1050
1056
  parseWsTrade(trade, market = undefined) {
1057
+ //
1058
+ // /spotMarket/tradeOrders
1051
1059
  //
1052
1060
  // {
1053
1061
  // "symbol": "KCS-USDT",
@@ -1070,6 +1078,22 @@ export default class kucoin extends kucoinRest {
1070
1078
  // "ts": 1670329987311000000
1071
1079
  // }
1072
1080
  //
1081
+ // /spot/tradeFills
1082
+ //
1083
+ // {
1084
+ // "fee": 0.00262148,
1085
+ // "feeCurrency": "USDT",
1086
+ // "feeRate": 0.001,
1087
+ // "orderId": "62417436b29df8000183df2f",
1088
+ // "orderType": "market",
1089
+ // "price": 131.074,
1090
+ // "side": "sell",
1091
+ // "size": 0.02,
1092
+ // "symbol": "LTC-USDT",
1093
+ // "time": "1648456758734571745",
1094
+ // "tradeId": "624174362e113d2f467b3043"
1095
+ // }
1096
+ //
1073
1097
  const marketId = this.safeString(trade, 'symbol');
1074
1098
  market = this.safeMarket(marketId, market, '-');
1075
1099
  const symbol = market['symbol'];
@@ -1079,7 +1103,10 @@ export default class kucoin extends kucoinRest {
1079
1103
  const price = this.safeString(trade, 'matchPrice');
1080
1104
  const amount = this.safeString(trade, 'matchSize');
1081
1105
  const order = this.safeString(trade, 'orderId');
1082
- const timestamp = this.safeIntegerProduct(trade, 'ts', 0.000001);
1106
+ const timestamp = this.safeIntegerProduct2(trade, 'ts', 'time', 0.000001);
1107
+ const feeCurrency = market['quote'];
1108
+ const feeRate = this.safeString(trade, 'feeRate');
1109
+ const feeCost = this.safeString(trade, 'fee');
1083
1110
  return this.safeTrade({
1084
1111
  'info': trade,
1085
1112
  'timestamp': timestamp,
@@ -1093,7 +1120,11 @@ export default class kucoin extends kucoinRest {
1093
1120
  'price': price,
1094
1121
  'amount': amount,
1095
1122
  'cost': undefined,
1096
- 'fee': undefined,
1123
+ 'fee': {
1124
+ 'cost': feeCost,
1125
+ 'rate': feeRate,
1126
+ 'currency': feeCurrency,
1127
+ },
1097
1128
  }, market);
1098
1129
  }
1099
1130
  async watchBalance(params = {}) {
@@ -1202,6 +1233,7 @@ export default class kucoin extends kucoinRest {
1202
1233
  'account.balance': this.handleBalance,
1203
1234
  'orderChange': this.handleOrder,
1204
1235
  'stopOrder': this.handleOrder,
1236
+ '/spot/tradeFills': this.handleMyTrade,
1205
1237
  };
1206
1238
  const method = this.safeValue(methods, subject);
1207
1239
  if (method !== undefined) {
@@ -42,7 +42,7 @@ export default class phemex extends phemexRest {
42
42
  'OHLCVLimit': 1000,
43
43
  },
44
44
  'streaming': {
45
- 'keepAlive': 10000,
45
+ 'keepAlive': 9000,
46
46
  },
47
47
  });
48
48
  }
@@ -0,0 +1,31 @@
1
+ import xtRest from '../xt.js';
2
+ import { Balances, Dict, Int, Market, OHLCV, Order, OrderBook, Str, Strings, Ticker, Tickers, Trade } from '../base/types.js';
3
+ import Client from '../base/ws/Client.js';
4
+ export default class xt extends xtRest {
5
+ describe(): any;
6
+ getListenKey(isContract: boolean): Promise<any>;
7
+ getCacheIndex(orderbook: any, cache: any): any;
8
+ handleDelta(orderbook: any, delta: any): void;
9
+ subscribe(name: string, access: string, methodName: string, market?: Market, symbols?: string[], params?: {}): Promise<any>;
10
+ watchTicker(symbol: string, params?: {}): Promise<Ticker>;
11
+ watchTickers(symbols?: Strings, params?: {}): Promise<Tickers>;
12
+ watchOHLCV(symbol: string, timeframe?: string, since?: Int, limit?: Int, params?: {}): Promise<OHLCV[]>;
13
+ watchTrades(symbol: string, since?: Int, limit?: Int, params?: {}): Promise<Trade[]>;
14
+ watchOrderBook(symbol: string, limit?: Int, params?: {}): Promise<OrderBook>;
15
+ watchOrders(symbol?: Str, since?: Int, limit?: Int, params?: {}): Promise<Order[]>;
16
+ watchMyTrades(symbol?: Str, since?: Int, limit?: Int, params?: {}): Promise<Trade[]>;
17
+ watchBalance(params?: {}): Promise<Balances>;
18
+ handleTicker(client: Client, message: Dict): Dict;
19
+ handleTickers(client: Client, message: Dict): Dict;
20
+ handleOHLCV(client: Client, message: Dict): Dict;
21
+ handleTrade(client: Client, message: Dict): Dict;
22
+ handleOrderBook(client: Client, message: Dict): void;
23
+ parseWsOrderTrade(trade: Dict, market?: Market): Trade;
24
+ parseWsOrder(order: Dict, market?: Market): Order;
25
+ handleOrder(client: Client, message: Dict): Dict;
26
+ handleBalance(client: Client, message: Dict): void;
27
+ handleMyTrades(client: Client, message: Dict): void;
28
+ handleMessage(client: Client, message: any): void;
29
+ ping(client: Client): string;
30
+ handleErrorMessage(client: Client, message: Dict): void;
31
+ }