ccxt 4.5.39 → 4.5.41

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 (138) hide show
  1. package/README.md +6 -5
  2. package/dist/ccxt.browser.min.js +18 -18
  3. package/dist/cjs/ccxt.js +6 -1
  4. package/dist/cjs/src/abstract/lighter.js +11 -0
  5. package/dist/cjs/src/ascendex.js +73 -1
  6. package/dist/cjs/src/base/Exchange.js +211 -22
  7. package/dist/cjs/src/base/functions/generic.js +1 -0
  8. package/dist/cjs/src/base/functions/io.js +160 -0
  9. package/dist/cjs/src/base/functions.js +6 -0
  10. package/dist/cjs/src/base/ws/Client.js +1 -0
  11. package/dist/cjs/src/base/ws/WsClient.js +1 -0
  12. package/dist/cjs/src/binance.js +143 -0
  13. package/dist/cjs/src/bingx.js +150 -123
  14. package/dist/cjs/src/bitmart.js +20 -6
  15. package/dist/cjs/src/bitmex.js +436 -0
  16. package/dist/cjs/src/blofin.js +86 -1
  17. package/dist/cjs/src/bybit.js +135 -0
  18. package/dist/cjs/src/coinspot.js +7 -2
  19. package/dist/cjs/src/delta.js +367 -0
  20. package/dist/cjs/src/gate.js +11 -4
  21. package/dist/cjs/src/gemini.js +76 -1
  22. package/dist/cjs/src/htx.js +266 -3
  23. package/dist/cjs/src/hyperliquid.js +20 -7
  24. package/dist/cjs/src/independentreserve.js +7 -7
  25. package/dist/cjs/src/kraken.js +1 -1
  26. package/dist/cjs/src/krakenfutures.js +96 -5
  27. package/dist/cjs/src/kucoin.js +3 -3
  28. package/dist/cjs/src/kucoinfutures.js +121 -0
  29. package/dist/cjs/src/lighter.js +2931 -0
  30. package/dist/cjs/src/mexc.js +9 -2
  31. package/dist/cjs/src/phemex.js +359 -0
  32. package/dist/cjs/src/poloniex.js +5 -0
  33. package/dist/cjs/src/pro/binance.js +2 -2
  34. package/dist/cjs/src/pro/bingx.js +248 -35
  35. package/dist/cjs/src/pro/bitget.js +49 -90
  36. package/dist/cjs/src/pro/bitmart.js +68 -0
  37. package/dist/cjs/src/pro/blofin.js +52 -1
  38. package/dist/cjs/src/pro/coinbaseinternational.js +5 -2
  39. package/dist/cjs/src/pro/defx.js +1 -1
  40. package/dist/cjs/src/pro/kucoinfutures.js +1 -1
  41. package/dist/cjs/src/pro/lighter.js +787 -0
  42. package/dist/cjs/src/pro/mexc.js +73 -1
  43. package/dist/cjs/src/pro/okx.js +7 -4
  44. package/dist/cjs/src/pro/paradex.js +138 -1
  45. package/dist/cjs/src/pro/woo.js +43 -0
  46. package/dist/cjs/src/static_dependencies/ethers/abi-coder.js +1 -0
  47. package/dist/cjs/src/static_dependencies/ethers/address/address.js +1 -0
  48. package/dist/cjs/src/static_dependencies/ethers/coders/abstract-coder.js +1 -0
  49. package/dist/cjs/src/static_dependencies/ethers/coders/address.js +1 -0
  50. package/dist/cjs/src/static_dependencies/ethers/coders/array.js +1 -0
  51. package/dist/cjs/src/static_dependencies/ethers/coders/bytes.js +1 -0
  52. package/dist/cjs/src/static_dependencies/ethers/coders/fixed-bytes.js +1 -0
  53. package/dist/cjs/src/static_dependencies/ethers/coders/number.js +1 -0
  54. package/dist/cjs/src/static_dependencies/ethers/fragments.js +1 -0
  55. package/dist/cjs/src/static_dependencies/ethers/index.js +1 -0
  56. package/dist/cjs/src/static_dependencies/ethers/interface.js +1 -0
  57. package/dist/cjs/src/static_dependencies/ethers/typed.js +1 -0
  58. package/dist/cjs/src/static_dependencies/ethers/utils/index.js +1 -0
  59. package/dist/cjs/src/whitebit.js +118 -16
  60. package/dist/cjs/src/woo.js +103 -3
  61. package/js/ccxt.d.ts +9 -3
  62. package/js/ccxt.js +6 -2
  63. package/js/src/abstract/gemini.d.ts +27 -0
  64. package/js/src/abstract/lighter.d.ts +53 -0
  65. package/js/src/abstract/lighter.js +5 -0
  66. package/js/src/ascendex.d.ts +12 -1
  67. package/js/src/ascendex.js +73 -1
  68. package/js/src/base/Exchange.d.ts +29 -14
  69. package/js/src/base/Exchange.js +216 -23
  70. package/js/src/base/functions/generic.js +1 -0
  71. package/js/src/base/functions/io.d.ts +32 -0
  72. package/js/src/base/functions/io.js +131 -0
  73. package/js/src/base/functions.d.ts +1 -0
  74. package/js/src/base/functions.js +1 -0
  75. package/js/src/base/types.d.ts +9 -0
  76. package/js/src/binance.d.ts +27 -1
  77. package/js/src/binance.js +143 -0
  78. package/js/src/bingx.d.ts +113 -108
  79. package/js/src/bingx.js +150 -123
  80. package/js/src/bitmart.js +20 -6
  81. package/js/src/bitmex.d.ts +50 -1
  82. package/js/src/bitmex.js +436 -0
  83. package/js/src/blofin.d.ts +12 -1
  84. package/js/src/blofin.js +86 -1
  85. package/js/src/bybit.d.ts +12 -1
  86. package/js/src/bybit.js +135 -0
  87. package/js/src/coinspot.js +7 -2
  88. package/js/src/delta.d.ts +12 -1
  89. package/js/src/delta.js +367 -0
  90. package/js/src/gate.d.ts +1 -0
  91. package/js/src/gate.js +11 -4
  92. package/js/src/gemini.d.ts +11 -0
  93. package/js/src/gemini.js +76 -1
  94. package/js/src/htx.d.ts +15 -1
  95. package/js/src/htx.js +266 -3
  96. package/js/src/hyperliquid.js +20 -7
  97. package/js/src/independentreserve.js +7 -7
  98. package/js/src/kraken.js +1 -1
  99. package/js/src/krakenfutures.d.ts +1 -1
  100. package/js/src/krakenfutures.js +96 -5
  101. package/js/src/kucoin.d.ts +3 -3
  102. package/js/src/kucoin.js +3 -3
  103. package/js/src/kucoinfutures.d.ts +12 -1
  104. package/js/src/kucoinfutures.js +121 -0
  105. package/js/src/lighter.d.ts +424 -0
  106. package/js/src/lighter.js +2924 -0
  107. package/js/src/mexc.js +9 -2
  108. package/js/src/phemex.d.ts +16 -1
  109. package/js/src/phemex.js +359 -0
  110. package/js/src/poloniex.js +5 -0
  111. package/js/src/pro/binance.js +2 -2
  112. package/js/src/pro/bingx.d.ts +50 -34
  113. package/js/src/pro/bingx.js +249 -36
  114. package/js/src/pro/bitget.d.ts +6 -6
  115. package/js/src/pro/bitget.js +49 -90
  116. package/js/src/pro/bitmart.d.ts +22 -1
  117. package/js/src/pro/bitmart.js +69 -1
  118. package/js/src/pro/blofin.d.ts +12 -1
  119. package/js/src/pro/blofin.js +52 -1
  120. package/js/src/pro/coinbaseinternational.d.ts +2 -2
  121. package/js/src/pro/coinbaseinternational.js +6 -3
  122. package/js/src/pro/defx.js +1 -1
  123. package/js/src/pro/kucoinfutures.js +1 -1
  124. package/js/src/pro/lighter.d.ts +161 -0
  125. package/js/src/pro/lighter.js +780 -0
  126. package/js/src/pro/mexc.d.ts +22 -1
  127. package/js/src/pro/mexc.js +73 -1
  128. package/js/src/pro/okx.d.ts +4 -4
  129. package/js/src/pro/okx.js +7 -4
  130. package/js/src/pro/paradex.d.ts +23 -1
  131. package/js/src/pro/paradex.js +138 -1
  132. package/js/src/pro/woo.d.ts +12 -1
  133. package/js/src/pro/woo.js +43 -0
  134. package/js/src/whitebit.d.ts +2 -1
  135. package/js/src/whitebit.js +118 -16
  136. package/js/src/woo.d.ts +12 -1
  137. package/js/src/woo.js +103 -3
  138. package/package.json +1 -1
@@ -69,12 +69,10 @@ export default class bitget extends bitgetRest {
69
69
  '1d': '1D',
70
70
  '1w': '1W',
71
71
  },
72
- 'watchOrderBook': {
73
- 'checksum': true,
74
- },
75
72
  'watchTrades': {
76
73
  'ignoreDuplicates': true,
77
74
  },
75
+ 'uta': false,
78
76
  },
79
77
  'streaming': {
80
78
  'ping': this.ping,
@@ -101,10 +99,7 @@ export default class bitget extends bitgetRest {
101
99
  },
102
100
  });
103
101
  }
104
- getInstType(market, uta = false, params = {}) {
105
- if ((uta === undefined) || !uta) {
106
- [uta, params] = this.handleOptionAndParams(params, 'getInstType', 'uta', false);
107
- }
102
+ getInstType(methodName, market, uta = false, params = {}) {
108
103
  let instType = undefined;
109
104
  if (market === undefined) {
110
105
  [instType, params] = this.handleProductTypeAndParams(undefined, params);
@@ -116,7 +111,7 @@ export default class bitget extends bitgetRest {
116
111
  instType = 'SPOT';
117
112
  }
118
113
  let instypeAux = undefined;
119
- [instypeAux, params] = this.handleOptionAndParams(params, 'getInstType', 'instType', instType);
114
+ [instypeAux, params] = this.handleOptionAndParams(params, methodName, 'instType', instType);
120
115
  instType = instypeAux;
121
116
  if (uta) {
122
117
  instType = instType.toLowerCase();
@@ -143,7 +138,7 @@ export default class bitget extends bitgetRest {
143
138
  let instType = undefined;
144
139
  let uta = undefined;
145
140
  [uta, params] = this.handleOptionAndParams(params, 'watchTicker', 'uta', false);
146
- [instType, params] = this.getInstType(market, uta, params);
141
+ [instType, params] = this.getInstType('watchTicker', market, uta, params);
147
142
  const args = {
148
143
  'instType': instType,
149
144
  };
@@ -151,7 +146,7 @@ export default class bitget extends bitgetRest {
151
146
  const symbolOrInstId = uta ? 'symbol' : 'instId';
152
147
  args[topicOrChannel] = 'ticker';
153
148
  args[symbolOrInstId] = market['id'];
154
- return await this.watchPublic(messageHash, args, params);
149
+ return await this.watchPublic(uta, messageHash, args, params);
155
150
  }
156
151
  /**
157
152
  * @method
@@ -165,7 +160,7 @@ export default class bitget extends bitgetRest {
165
160
  */
166
161
  async unWatchTicker(symbol, params = {}) {
167
162
  await this.loadMarkets();
168
- return await this.unWatchChannel(symbol, 'ticker', 'ticker', params);
163
+ return await this.unWatchChannel(symbol, 'ticker', 'ticker', 'watchTicker', params);
169
164
  }
170
165
  /**
171
166
  * @method
@@ -186,7 +181,7 @@ export default class bitget extends bitgetRest {
186
181
  let instType = undefined;
187
182
  let uta = undefined;
188
183
  [uta, params] = this.handleOptionAndParams(params, 'watchTickers', 'uta', false);
189
- [instType, params] = this.getInstType(market, uta, params);
184
+ [instType, params] = this.getInstType('watchTickers', market, uta, params);
190
185
  const topics = [];
191
186
  const messageHashes = [];
192
187
  for (let i = 0; i < symbols.length; i++) {
@@ -202,7 +197,7 @@ export default class bitget extends bitgetRest {
202
197
  topics.push(args);
203
198
  messageHashes.push('ticker:' + symbol);
204
199
  }
205
- const tickers = await this.watchPublicMultiple(messageHashes, topics, params);
200
+ const tickers = await this.watchPublicMultiple(uta, messageHashes, topics, params);
206
201
  if (this.newUpdates) {
207
202
  const result = {};
208
203
  result[tickers['symbol']] = tickers;
@@ -378,8 +373,8 @@ export default class bitget extends bitgetRest {
378
373
  const marketId = this.safeString(ticker, 'instId', utaMarketId);
379
374
  market = this.safeMarket(marketId, market, undefined, marketType);
380
375
  const close = this.safeString2(ticker, 'lastPr', 'lastPrice');
381
- const changeDecimal = this.safeString(ticker, 'change24h', '');
382
- const change = this.safeString(ticker, 'price24hPcnt', Precise.stringMul(changeDecimal, '100'));
376
+ const changeCoefficient = this.safeString2(ticker, 'price24hPcnt', 'change24h');
377
+ const changePercentage = Precise.stringMul(changeCoefficient, '100');
383
378
  return this.safeTicker({
384
379
  'symbol': market['symbol'],
385
380
  'timestamp': timestamp,
@@ -396,7 +391,7 @@ export default class bitget extends bitgetRest {
396
391
  'last': close,
397
392
  'previousClose': undefined,
398
393
  'change': undefined,
399
- 'percentage': change,
394
+ 'percentage': changePercentage,
400
395
  'average': undefined,
401
396
  'baseVolume': this.safeString2(ticker, 'baseVolume', 'volume24h'),
402
397
  'quoteVolume': this.safeString2(ticker, 'quoteVolume', 'turnover24h'),
@@ -421,8 +416,8 @@ export default class bitget extends bitgetRest {
421
416
  const market = this.market(symbols[0]);
422
417
  let instType = undefined;
423
418
  let uta = undefined;
424
- [uta, params] = this.handleOptionAndParams(params, 'watchBidsAsks', 'uta', false);
425
- [instType, params] = this.getInstType(market, uta, params);
419
+ [uta, params] = this.handleOptionAndParams(params, 'watchTickers', 'uta', false);
420
+ [instType, params] = this.getInstType('watchBidsAsks', market, uta, params);
426
421
  const topics = [];
427
422
  const messageHashes = [];
428
423
  for (let i = 0; i < symbols.length; i++) {
@@ -438,7 +433,7 @@ export default class bitget extends bitgetRest {
438
433
  topics.push(args);
439
434
  messageHashes.push('bidask:' + symbol);
440
435
  }
441
- const tickers = await this.watchPublicMultiple(messageHashes, topics, params);
436
+ const tickers = await this.watchPublicMultiple(uta, messageHashes, topics, params);
442
437
  if (this.newUpdates) {
443
438
  const result = {};
444
439
  result[tickers['symbol']] = tickers;
@@ -500,7 +495,7 @@ export default class bitget extends bitgetRest {
500
495
  let instType = undefined;
501
496
  let uta = undefined;
502
497
  [uta, params] = this.handleOptionAndParams(params, 'watchOHLCV', 'uta', false);
503
- [instType, params] = this.getInstType(market, uta, params);
498
+ [instType, params] = this.getInstType('watchOHLCV', market, uta, params);
504
499
  const args = {
505
500
  'instType': instType,
506
501
  };
@@ -516,7 +511,7 @@ export default class bitget extends bitgetRest {
516
511
  args['instId'] = market['id'];
517
512
  messageHash = 'candles:' + timeframe + ':' + symbol;
518
513
  }
519
- const ohlcv = await this.watchPublic(messageHash, args, params);
514
+ const ohlcv = await this.watchPublic(uta, messageHash, args, params);
520
515
  if (this.newUpdates) {
521
516
  limit = ohlcv.getLimit(symbol, limit);
522
517
  }
@@ -546,9 +541,9 @@ export default class bitget extends bitgetRest {
546
541
  }
547
542
  let instType = undefined;
548
543
  let messageHash = undefined;
549
- let uta = undefined;
550
- [uta, params] = this.handleOptionAndParams(params, 'unWatchOHLCV', 'uta', false);
551
- [instType, params] = this.getInstType(market, uta, params);
544
+ const values = this.handleOptionAndParams(params, 'watchOHLCV', 'uta', false);
545
+ const uta = values[0];
546
+ [instType, params] = this.getInstType('watchOHLCV', market, uta, params);
552
547
  const args = {
553
548
  'instType': instType,
554
549
  };
@@ -567,7 +562,7 @@ export default class bitget extends bitgetRest {
567
562
  args['instId'] = market['id'];
568
563
  messageHash = 'candles:' + interval;
569
564
  }
570
- return await this.unWatchChannel(symbol, channel, messageHash, params);
565
+ return await this.unWatchChannel(symbol, channel, messageHash, 'watchOHLCV', params);
571
566
  }
572
567
  handleOHLCV(client, message) {
573
568
  //
@@ -738,16 +733,16 @@ export default class bitget extends bitgetRest {
738
733
  params = this.omit(params, 'limit');
739
734
  channel += limit.toString();
740
735
  }
741
- return await this.unWatchChannel(symbol, channel, 'orderbook', params);
736
+ return await this.unWatchChannel(symbol, channel, 'orderbook', 'watchOrderBook', params);
742
737
  }
743
- async unWatchChannel(symbol, channel, messageHashTopic, params = {}) {
738
+ async unWatchChannel(symbol, channel, messageHashTopic, methodName, params = {}) {
744
739
  await this.loadMarkets();
745
740
  const market = this.market(symbol);
746
741
  const messageHash = 'unsubscribe:' + messageHashTopic + ':' + market['symbol'];
747
742
  let instType = undefined;
748
743
  let uta = undefined;
749
- [uta, params] = this.handleOptionAndParams(params, 'unWatchChannel', 'uta', false);
750
- [instType, params] = this.getInstType(market, uta, params);
744
+ [uta, params] = this.handleOptionAndParams(params, methodName, 'uta', false);
745
+ [instType, params] = this.getInstType(methodName, market, uta, params);
751
746
  const args = {
752
747
  'instType': instType,
753
748
  };
@@ -762,7 +757,7 @@ export default class bitget extends bitgetRest {
762
757
  args['channel'] = channel;
763
758
  args['instId'] = market['id'];
764
759
  }
765
- return await this.unWatchPublic(messageHash, args, params);
760
+ return await this.unWatchPublic(uta, messageHash, args, params);
766
761
  }
767
762
  /**
768
763
  * @method
@@ -794,7 +789,7 @@ export default class bitget extends bitgetRest {
794
789
  const symbol = symbols[i];
795
790
  const market = this.market(symbol);
796
791
  let instType = undefined;
797
- [instType, params] = this.getInstType(market, uta, params);
792
+ [instType, params] = this.getInstType('watchOrderBookForSymbols', market, uta, params);
798
793
  const args = {
799
794
  'instType': instType,
800
795
  };
@@ -808,7 +803,7 @@ export default class bitget extends bitgetRest {
808
803
  if (uta) {
809
804
  params['uta'] = true;
810
805
  }
811
- const orderbook = await this.watchPublicMultiple(messageHashes, topics, params);
806
+ const orderbook = await this.watchPublicMultiple(uta, messageHashes, topics, params);
812
807
  if (incrementalFeed) {
813
808
  return orderbook.limit();
814
809
  }
@@ -1005,7 +1000,7 @@ export default class bitget extends bitgetRest {
1005
1000
  const symbol = symbols[i];
1006
1001
  const market = this.market(symbol);
1007
1002
  let instType = undefined;
1008
- [instType, params] = this.getInstType(market, uta, params);
1003
+ [instType, params] = this.getInstType('watchTradesForSymbols', market, uta, params);
1009
1004
  const args = {
1010
1005
  'instType': instType,
1011
1006
  };
@@ -1019,7 +1014,7 @@ export default class bitget extends bitgetRest {
1019
1014
  if (uta) {
1020
1015
  params = this.extend(params, { 'uta': true });
1021
1016
  }
1022
- const trades = await this.watchPublicMultiple(messageHashes, topics, params);
1017
+ const trades = await this.watchPublicMultiple(uta, messageHashes, topics, params);
1023
1018
  if (this.newUpdates) {
1024
1019
  const first = this.safeValue(trades, 0);
1025
1020
  const tradeSymbol = this.safeString(first, 'symbol');
@@ -1046,10 +1041,10 @@ export default class bitget extends bitgetRest {
1046
1041
  * @returns {any} status of the unwatch request
1047
1042
  */
1048
1043
  async unWatchTrades(symbol, params = {}) {
1049
- let uta = undefined;
1050
- [uta, params] = this.handleOptionAndParams(params, 'unWatchTrades', 'uta', false);
1044
+ const values = this.handleOptionAndParams(params, 'watchTrades', 'uta', false);
1045
+ const uta = values[0];
1051
1046
  const channelTopic = uta ? 'publicTrade' : 'trade';
1052
- return await this.unWatchChannel(symbol, channelTopic, 'trade', params);
1047
+ return await this.unWatchChannel(symbol, channelTopic, 'trade', 'watchTrades', params);
1053
1048
  }
1054
1049
  handleTrades(client, message) {
1055
1050
  //
@@ -1271,7 +1266,7 @@ export default class bitget extends bitgetRest {
1271
1266
  symbols = this.marketSymbols(symbols);
1272
1267
  if (!this.isEmpty(symbols)) {
1273
1268
  market = this.getMarketFromSymbols(symbols);
1274
- [instType, params] = this.getInstType(market, uta, params);
1269
+ [instType, params] = this.getInstType('watchPositions', market, uta, params);
1275
1270
  }
1276
1271
  if (uta) {
1277
1272
  instType = 'UTA';
@@ -1289,7 +1284,7 @@ export default class bitget extends bitgetRest {
1289
1284
  else {
1290
1285
  params = this.extend(params, { 'uta': true });
1291
1286
  }
1292
- const newPositions = await this.watchPrivate(messageHash, subscriptionHash, args, params);
1287
+ const newPositions = await this.watchPrivate(uta, messageHash, subscriptionHash, args, params);
1293
1288
  if (this.newUpdates) {
1294
1289
  return newPositions;
1295
1290
  }
@@ -1564,7 +1559,7 @@ export default class bitget extends bitgetRest {
1564
1559
  instType = 'SPOT';
1565
1560
  }
1566
1561
  else {
1567
- [instType, params] = this.getInstType(market, uta, params);
1562
+ [instType, params] = this.getInstType('watchOrders', market, uta, params);
1568
1563
  }
1569
1564
  if (type === 'spot' && (symbol !== undefined)) {
1570
1565
  subscriptionHash = subscriptionHash + ':' + symbol;
@@ -1602,7 +1597,7 @@ export default class bitget extends bitgetRest {
1602
1597
  else {
1603
1598
  params = this.extend(params, { 'uta': true });
1604
1599
  }
1605
- const orders = await this.watchPrivate(messageHash, subscriptionHash, args, params);
1600
+ const orders = await this.watchPrivate(uta, messageHash, subscriptionHash, args, params);
1606
1601
  if (this.newUpdates) {
1607
1602
  limit = orders.getLimit(symbol, limit);
1608
1603
  }
@@ -2016,6 +2011,7 @@ export default class bitget extends bitgetRest {
2016
2011
  }
2017
2012
  parseWsOrderStatus(status) {
2018
2013
  const statuses = {
2014
+ 'new': 'open',
2019
2015
  'live': 'open',
2020
2016
  'partially_filled': 'open',
2021
2017
  'filled': 'closed',
@@ -2055,7 +2051,7 @@ export default class bitget extends bitgetRest {
2055
2051
  instType = 'SPOT';
2056
2052
  }
2057
2053
  else {
2058
- [instType, params] = this.getInstType(market, uta, params);
2054
+ [instType, params] = this.getInstType('watchMyTrades', market, uta, params);
2059
2055
  }
2060
2056
  if (uta) {
2061
2057
  instType = 'UTA';
@@ -2072,7 +2068,7 @@ export default class bitget extends bitgetRest {
2072
2068
  else {
2073
2069
  params = this.extend(params, { 'uta': true });
2074
2070
  }
2075
- const trades = await this.watchPrivate(messageHash, subscriptionHash, args, params);
2071
+ const trades = await this.watchPrivate(uta, messageHash, subscriptionHash, args, params);
2076
2072
  if (this.newUpdates) {
2077
2073
  limit = trades.getLimit(symbol, limit);
2078
2074
  }
@@ -2264,7 +2260,7 @@ export default class bitget extends bitgetRest {
2264
2260
  params = this.extend(params, { 'uta': true });
2265
2261
  }
2266
2262
  const messageHash = 'balance:' + instType.toLowerCase();
2267
- return await this.watchPrivate(messageHash, messageHash, args, params);
2263
+ return await this.watchPrivate(uta, messageHash, messageHash, args, params);
2268
2264
  }
2269
2265
  handleBalance(client, message) {
2270
2266
  //
@@ -2398,16 +2394,8 @@ export default class bitget extends bitgetRest {
2398
2394
  const messageHash = 'balance:' + instType;
2399
2395
  client.resolve(this.balance, messageHash);
2400
2396
  }
2401
- async watchPublic(messageHash, args, params = {}) {
2402
- let uta = undefined;
2403
- let url = undefined;
2404
- [uta, params] = this.handleOptionAndParams(params, 'watchPublic', 'uta', false);
2405
- if (uta) {
2406
- url = this.urls['api']['ws']['utaPublic'];
2407
- }
2408
- else {
2409
- url = this.urls['api']['ws']['public'];
2410
- }
2397
+ async watchPublic(uta, messageHash, args, params = {}) {
2398
+ let url = uta ? this.urls['api']['ws']['utaPublic'] : this.urls['api']['ws']['public'];
2411
2399
  const sandboxMode = this.safeBool2(this.options, 'sandboxMode', 'sandbox', false);
2412
2400
  if (sandboxMode) {
2413
2401
  const instType = this.safeString(args, 'instType');
@@ -2427,16 +2415,8 @@ export default class bitget extends bitgetRest {
2427
2415
  const message = this.extend(request, params);
2428
2416
  return await this.watch(url, messageHash, message, messageHash);
2429
2417
  }
2430
- async unWatchPublic(messageHash, args, params = {}) {
2431
- let uta = undefined;
2432
- let url = undefined;
2433
- [uta, params] = this.handleOptionAndParams(params, 'unWatchPublic', 'uta', false);
2434
- if (uta) {
2435
- url = this.urls['api']['ws']['utaPublic'];
2436
- }
2437
- else {
2438
- url = this.urls['api']['ws']['public'];
2439
- }
2418
+ async unWatchPublic(uta, messageHash, args, params = {}) {
2419
+ let url = uta ? this.urls['api']['ws']['utaPublic'] : this.urls['api']['ws']['public'];
2440
2420
  const sandboxMode = this.safeBool2(this.options, 'sandboxMode', 'sandbox', false);
2441
2421
  if (sandboxMode) {
2442
2422
  const instType = this.safeString(args, 'instType');
@@ -2456,27 +2436,14 @@ export default class bitget extends bitgetRest {
2456
2436
  const message = this.extend(request, params);
2457
2437
  return await this.watch(url, messageHash, message, messageHash);
2458
2438
  }
2459
- async watchPublicMultiple(messageHashes, argsArray, params = {}) {
2460
- let uta = undefined;
2461
- let url = undefined;
2462
- [uta, params] = this.handleOptionAndParams(params, 'watchPublicMultiple', 'uta', false);
2463
- if (uta) {
2464
- url = this.urls['api']['ws']['utaPublic'];
2465
- }
2466
- else {
2467
- url = this.urls['api']['ws']['public'];
2468
- }
2439
+ async watchPublicMultiple(uta, messageHashes, argsArray, params = {}) {
2440
+ let url = uta ? this.urls['api']['ws']['utaPublic'] : this.urls['api']['ws']['public'];
2469
2441
  const sandboxMode = this.safeBool2(this.options, 'sandboxMode', 'sandbox', false);
2470
2442
  if (sandboxMode) {
2471
2443
  const argsArrayFirst = this.safeDict(argsArray, 0, {});
2472
2444
  const instType = this.safeString(argsArrayFirst, 'instType');
2473
2445
  if ((instType !== 'SCOIN-FUTURES') && (instType !== 'SUSDT-FUTURES') && (instType !== 'SUSDC-FUTURES')) {
2474
- if (uta) {
2475
- url = this.urls['api']['demo']['utaPublic'];
2476
- }
2477
- else {
2478
- url = this.urls['api']['demo']['public'];
2479
- }
2446
+ url = uta ? this.urls['api']['demo']['utaPublic'] : this.urls['api']['demo']['public'];
2480
2447
  }
2481
2448
  }
2482
2449
  const request = {
@@ -2514,16 +2481,8 @@ export default class bitget extends bitgetRest {
2514
2481
  }
2515
2482
  return await future;
2516
2483
  }
2517
- async watchPrivate(messageHash, subscriptionHash, args, params = {}) {
2518
- let uta = undefined;
2519
- let url = undefined;
2520
- [uta, params] = this.handleOptionAndParams(params, 'watchPrivate', 'uta', false);
2521
- if (uta) {
2522
- url = this.urls['api']['ws']['utaPrivate'];
2523
- }
2524
- else {
2525
- url = this.urls['api']['ws']['private'];
2526
- }
2484
+ async watchPrivate(uta, messageHash, subscriptionHash, args, params = {}) {
2485
+ let url = uta ? this.urls['api']['ws']['utaPrivate'] : this.urls['api']['ws']['private'];
2527
2486
  const sandboxMode = this.safeBool2(this.options, 'sandboxMode', 'sandbox', false);
2528
2487
  if (sandboxMode) {
2529
2488
  const instType = this.safeString(args, 'instType');
@@ -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, Dict, Bool } from '../base/types.js';
2
+ import type { Int, Market, Str, Strings, OrderBook, Order, Trade, Ticker, Tickers, OHLCV, Position, Balances, Dict, Bool, FundingRate, FundingRates } 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;
@@ -261,6 +261,27 @@ export default class bitmart extends bitmartRest {
261
261
  * @returns {object} A dictionary of [order book structures]{@link https://docs.ccxt.com/#/?id=order-book-structure} indexed by market symbols
262
262
  */
263
263
  unWatchOrderBookForSymbols(symbols: string[], params?: {}): Promise<any>;
264
+ /**
265
+ * @method
266
+ * @name bitmart#watchFundingRate
267
+ * @description watch the current funding rate
268
+ * @see https://developer-pro.bitmart.com/en/futuresv2/#public-funding-rate-channel
269
+ * @param {string} symbol unified market symbol
270
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
271
+ * @returns {object} a [funding rate structure]{@link https://docs.ccxt.com/?id=funding-rate-structure}
272
+ */
273
+ watchFundingRate(symbol: string, params?: {}): Promise<FundingRate>;
274
+ /**
275
+ * @method
276
+ * @name bitmart#watchFundingRates
277
+ * @description watch the funding rate for multiple markets
278
+ * @see https://developer-pro.bitmart.com/en/futuresv2/#public-funding-rate-channel
279
+ * @param {string[]} symbols a list of unified market symbols
280
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
281
+ * @returns {object} a dictionary of [funding rate structures]{@link https://docs.ccxt.com/?id=funding-rate-structure}, indexed by market symbols
282
+ */
283
+ watchFundingRates(symbols?: Strings, params?: {}): Promise<FundingRates>;
284
+ handleFundingRate(client: Client, message: any): void;
264
285
  authenticate(type: any, params?: {}): Promise<any>;
265
286
  handleSubscriptionStatus(client: Client, message: any): any;
266
287
  handleAuthenticate(client: Client, message: any): void;
@@ -1,6 +1,6 @@
1
1
  // ---------------------------------------------------------------------------
2
2
  import bitmartRest from '../bitmart.js';
3
- import { AuthenticationError, ExchangeError, NotSupported } from '../base/errors.js';
3
+ import { AuthenticationError, ExchangeError, NotSupported, ArgumentsRequired } from '../base/errors.js';
4
4
  import { ArrayCache, ArrayCacheByTimestamp, ArrayCacheBySymbolById, ArrayCacheBySymbolBySide } from '../base/ws/Cache.js';
5
5
  import { sha256 } from '../static_dependencies/noble-hashes/sha256.js';
6
6
  import { Asks, Bids } from '../base/ws/OrderBookSide.js';
@@ -18,6 +18,8 @@ export default class bitmart extends bitmartRest {
18
18
  'cancelAllOrdersWs': false,
19
19
  'ws': true,
20
20
  'watchBalance': true,
21
+ 'watchFundingRate': true,
22
+ 'watchFundingRates': true,
21
23
  'watchTicker': true,
22
24
  'watchTickers': true,
23
25
  'watchBidsAsks': true,
@@ -1737,6 +1739,69 @@ export default class bitmart extends bitmartRest {
1737
1739
  params = this.extend(params, { 'unsubscribe': true });
1738
1740
  return await this.subscribeMultiple(channel, type, symbols, params);
1739
1741
  }
1742
+ /**
1743
+ * @method
1744
+ * @name bitmart#watchFundingRate
1745
+ * @description watch the current funding rate
1746
+ * @see https://developer-pro.bitmart.com/en/futuresv2/#public-funding-rate-channel
1747
+ * @param {string} symbol unified market symbol
1748
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
1749
+ * @returns {object} a [funding rate structure]{@link https://docs.ccxt.com/?id=funding-rate-structure}
1750
+ */
1751
+ async watchFundingRate(symbol, params = {}) {
1752
+ await this.loadMarkets();
1753
+ symbol = this.symbol(symbol);
1754
+ const fundingRate = await this.watchFundingRates([symbol], params);
1755
+ return fundingRate[symbol];
1756
+ }
1757
+ /**
1758
+ * @method
1759
+ * @name bitmart#watchFundingRates
1760
+ * @description watch the funding rate for multiple markets
1761
+ * @see https://developer-pro.bitmart.com/en/futuresv2/#public-funding-rate-channel
1762
+ * @param {string[]} symbols a list of unified market symbols
1763
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
1764
+ * @returns {object} a dictionary of [funding rate structures]{@link https://docs.ccxt.com/?id=funding-rate-structure}, indexed by market symbols
1765
+ */
1766
+ async watchFundingRates(symbols = undefined, params = {}) {
1767
+ if (symbols === undefined) {
1768
+ throw new ArgumentsRequired(this.id + ' watchFundingRates() requires an array of symbols');
1769
+ }
1770
+ await this.loadMarkets();
1771
+ const market = this.getMarketFromSymbols(symbols);
1772
+ let marketType = undefined;
1773
+ [marketType, params] = this.handleMarketTypeAndParams('watchFundingRates', market, params);
1774
+ const fundingRate = await this.subscribeMultiple('fundingRate', marketType, symbols, params);
1775
+ if (this.newUpdates) {
1776
+ const fundingRates = {};
1777
+ fundingRates[fundingRate['symbol']] = fundingRate;
1778
+ return fundingRates;
1779
+ }
1780
+ return this.filterByArray(this.fundingRates, 'symbol', symbols);
1781
+ }
1782
+ handleFundingRate(client, message) {
1783
+ //
1784
+ // {
1785
+ // "data": {
1786
+ // "symbol": "BTCUSDT",
1787
+ // "fundingRate": "0.0000561",
1788
+ // "fundingTime": 1770978448000,
1789
+ // "nextFundingRate": "-0.0000195",
1790
+ // "nextFundingTime": 1770998400000,
1791
+ // "funding_upper_limit": "0.0375",
1792
+ // "funding_lower_limit": "-0.0375",
1793
+ // "ts": 1770978448970
1794
+ // },
1795
+ // "group": "futures/fundingRate:BTCUSDT"
1796
+ // }
1797
+ //
1798
+ const data = this.safeDict(message, 'data', {});
1799
+ const fundingRate = this.parseFundingRate(data);
1800
+ const symbol = fundingRate['symbol'];
1801
+ this.fundingRates[symbol] = fundingRate;
1802
+ const messageHash = 'fundingRate:' + symbol;
1803
+ client.resolve(fundingRate, messageHash);
1804
+ }
1740
1805
  async authenticate(type, params = {}) {
1741
1806
  this.checkRequiredCredentials();
1742
1807
  const url = this.implodeHostname(this.urls['api']['ws'][type]['private']);
@@ -2026,6 +2091,9 @@ export default class bitmart extends bitmartRest {
2026
2091
  'balance': this.handleBalance,
2027
2092
  'asset': this.handleBalance,
2028
2093
  };
2094
+ if (channel.indexOf('fundingRate') >= 0) {
2095
+ this.handleFundingRate(client, message);
2096
+ }
2029
2097
  const keys = Object.keys(methods);
2030
2098
  for (let i = 0; i < keys.length; i++) {
2031
2099
  const key = keys[i];
@@ -1,5 +1,5 @@
1
1
  import blofinRest from '../blofin.js';
2
- import type { Int, Market, Trade, OrderBook, Strings, Ticker, Tickers, OHLCV, Balances, Str, Order, Position } from '../base/types.js';
2
+ import type { Int, Market, Trade, OrderBook, Strings, Ticker, Tickers, OHLCV, Balances, Str, Order, Position, FundingRate } from '../base/types.js';
3
3
  import Client from '../base/ws/Client.js';
4
4
  export default class blofin extends blofinRest {
5
5
  describe(): any;
@@ -169,6 +169,17 @@ export default class blofin extends blofinRest {
169
169
  watchPositions(symbols?: Strings, since?: Int, limit?: Int, params?: {}): Promise<Position[]>;
170
170
  handlePositions(client: Client, message: any): void;
171
171
  parseWsPosition(position: any, market?: Market): Position;
172
+ /**
173
+ * @method
174
+ * @name blofin#watchFundingRate
175
+ * @description watch the current funding rate
176
+ * @see https://docs.blofin.com/index.html#ws-funding-rate-channel
177
+ * @param {string} symbol unified market symbol
178
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
179
+ * @returns {object} a [funding rate structure]{@link https://docs.ccxt.com/?id=funding-rate-structure}
180
+ */
181
+ watchFundingRate(symbol: string, params?: {}): Promise<FundingRate>;
182
+ handleFundingRate(client: Client, message: any): void;
172
183
  watchMultipleWrapper(isPublic: boolean, channelName: string, callerMethodName: string, symbolsArray?: any[], params?: {}): Promise<any>;
173
184
  getSubscriptionRequest(args: any): {
174
185
  op: string;
@@ -9,6 +9,8 @@ export default class blofin extends blofinRest {
9
9
  return this.deepExtend(super.describe(), {
10
10
  'has': {
11
11
  'ws': true,
12
+ 'watchFundingRate': true,
13
+ 'watchFundingRates': false,
12
14
  'watchTrades': true,
13
15
  'watchTradesForSymbols': true,
14
16
  'watchOrderBook': true,
@@ -102,7 +104,8 @@ export default class blofin extends blofinRest {
102
104
  const firstSymbol = this.safeString(firstMarket, 'symbol');
103
105
  limit = trades.getLimit(firstSymbol, limit);
104
106
  }
105
- return this.filterBySinceLimit(trades, since, limit, 'timestamp', true);
107
+ const result = this.filterBySinceLimit(trades, since, limit, 'timestamp', true);
108
+ return this.sortBy(result, 'timestamp'); // needed bcz of https://github.com/ccxt/ccxt/actions/runs/20755599430/job/59597237029?pr=27624#step:11:611
106
109
  }
107
110
  handleTrades(client, message) {
108
111
  //
@@ -598,6 +601,53 @@ export default class blofin extends blofinRest {
598
601
  parseWsPosition(position, market = undefined) {
599
602
  return this.parsePosition(position, market);
600
603
  }
604
+ /**
605
+ * @method
606
+ * @name blofin#watchFundingRate
607
+ * @description watch the current funding rate
608
+ * @see https://docs.blofin.com/index.html#ws-funding-rate-channel
609
+ * @param {string} symbol unified market symbol
610
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
611
+ * @returns {object} a [funding rate structure]{@link https://docs.ccxt.com/?id=funding-rate-structure}
612
+ */
613
+ async watchFundingRate(symbol, params = {}) {
614
+ await this.loadMarkets();
615
+ const market = this.market(symbol);
616
+ let marketType = undefined;
617
+ [marketType, params] = this.handleMarketTypeAndParams('watchFundingRate', market, params);
618
+ const messageHash = 'fundingRate:' + market['symbol'];
619
+ const requestParams = {
620
+ 'channel': 'funding-rate',
621
+ 'instId': market['id'],
622
+ };
623
+ const request = this.getSubscriptionRequest([requestParams]);
624
+ const url = this.implodeHostname(this.urls['api']['ws'][marketType]['public']);
625
+ return await this.watch(url, messageHash, this.deepExtend(request, params), messageHash);
626
+ }
627
+ handleFundingRate(client, message) {
628
+ //
629
+ // {
630
+ // "arg": {
631
+ // "channel": "funding-rate",
632
+ // "instId": "BTC-USDT"
633
+ // },
634
+ // "data": [
635
+ // {
636
+ // "instId": "BTC-USDT",
637
+ // "fundingRate": "0.00007873240488719234",
638
+ // "fundingTime": "1771430400000"
639
+ // }
640
+ // ]
641
+ // }
642
+ //
643
+ const data = this.safeList(message, 'data', []);
644
+ const first = this.safeDict(data, 0, {});
645
+ const fundingRate = this.parseFundingRate(first);
646
+ const symbol = fundingRate['symbol'];
647
+ this.fundingRates[symbol] = fundingRate;
648
+ const messageHash = 'fundingRate:' + symbol;
649
+ client.resolve(fundingRate, messageHash);
650
+ }
601
651
  async watchMultipleWrapper(isPublic, channelName, callerMethodName, symbolsArray = undefined, params = {}) {
602
652
  // underlier method for all watch-multiple symbols
603
653
  await this.loadMarkets();
@@ -690,6 +740,7 @@ export default class blofin extends blofinRest {
690
740
  'orders': this.handleOrders,
691
741
  'orders-algo': this.handleOrders,
692
742
  'positions': this.handlePositions,
743
+ 'funding-rate': this.handleFundingRate,
693
744
  };
694
745
  let method = undefined;
695
746
  if (message === 'pong') {
@@ -40,11 +40,11 @@ export default class coinbaseinternational extends coinbaseinternationalRest {
40
40
  * @name coinbaseinternational#watchFundingRates
41
41
  * @description watch the funding rate for multiple markets
42
42
  * @see https://docs.cloud.coinbase.com/intx/docs/websocket-channels#funding-channel
43
- * @param {string[]|undefined} symbols list of unified market symbols
43
+ * @param {string[]} symbols a list of unified market symbols
44
44
  * @param {object} [params] extra parameters specific to the exchange API endpoint
45
45
  * @returns {object} a dictionary of [funding rates structures]{@link https://docs.ccxt.com/?id=funding-rates-structure}, indexe by market symbols
46
46
  */
47
- watchFundingRates(symbols: string[], params?: {}): Promise<FundingRates>;
47
+ watchFundingRates(symbols?: Strings, params?: {}): Promise<FundingRates>;
48
48
  /**
49
49
  * @method
50
50
  * @name coinbaseinternational#watchTicker