ccxt 4.4.40 → 4.4.42

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 (183) hide show
  1. package/README.md +4 -4
  2. package/dist/ccxt.browser.min.js +3 -3
  3. package/dist/cjs/ccxt.js +1 -1
  4. package/dist/cjs/src/ace.js +1 -1
  5. package/dist/cjs/src/alpaca.js +0 -1
  6. package/dist/cjs/src/ascendex.js +0 -1
  7. package/dist/cjs/src/base/Exchange.js +41 -19
  8. package/dist/cjs/src/bigone.js +0 -1
  9. package/dist/cjs/src/binance.js +27 -24
  10. package/dist/cjs/src/bingx.js +6 -1
  11. package/dist/cjs/src/bitfinex.js +124 -1
  12. package/dist/cjs/src/bitget.js +1 -0
  13. package/dist/cjs/src/bitmart.js +254 -1
  14. package/dist/cjs/src/blofin.js +16 -7
  15. package/dist/cjs/src/bybit.js +8 -8
  16. package/dist/cjs/src/cex.js +1 -1
  17. package/dist/cjs/src/coinbase.js +8 -9
  18. package/dist/cjs/src/coinbaseexchange.js +5 -6
  19. package/dist/cjs/src/coinbaseinternational.js +7 -8
  20. package/dist/cjs/src/coincatch.js +0 -1
  21. package/dist/cjs/src/coincheck.js +0 -1
  22. package/dist/cjs/src/coinex.js +91 -6
  23. package/dist/cjs/src/coinlist.js +3 -4
  24. package/dist/cjs/src/coinmate.js +1 -3
  25. package/dist/cjs/src/coinmetro.js +4 -5
  26. package/dist/cjs/src/coinone.js +0 -1
  27. package/dist/cjs/src/coinsph.js +7 -8
  28. package/dist/cjs/src/cryptocom.js +3 -0
  29. package/dist/cjs/src/currencycom.js +3 -4
  30. package/dist/cjs/src/defx.js +6 -7
  31. package/dist/cjs/src/deribit.js +1 -3
  32. package/dist/cjs/src/digifinex.js +0 -1
  33. package/dist/cjs/src/ellipx.js +0 -2
  34. package/dist/cjs/src/exmo.js +63 -6
  35. package/dist/cjs/src/gate.js +2 -3
  36. package/dist/cjs/src/gemini.js +4 -5
  37. package/dist/cjs/src/hashkey.js +79 -83
  38. package/dist/cjs/src/hitbtc.js +49 -5
  39. package/dist/cjs/src/hollaex.js +4 -6
  40. package/dist/cjs/src/htx.js +2 -4
  41. package/dist/cjs/src/huobijp.js +0 -1
  42. package/dist/cjs/src/hyperliquid.js +65 -1
  43. package/dist/cjs/src/idex.js +8 -8
  44. package/dist/cjs/src/independentreserve.js +0 -1
  45. package/dist/cjs/src/indodax.js +0 -1
  46. package/dist/cjs/src/kraken.js +192 -29
  47. package/dist/cjs/src/krakenfutures.js +75 -3
  48. package/dist/cjs/src/kucoin.js +7 -4
  49. package/dist/cjs/src/kucoinfutures.js +10 -9
  50. package/dist/cjs/src/kuna.js +1 -3
  51. package/dist/cjs/src/latoken.js +1 -3
  52. package/dist/cjs/src/lbank.js +0 -1
  53. package/dist/cjs/src/luno.js +0 -1
  54. package/dist/cjs/src/lykke.js +0 -1
  55. package/dist/cjs/src/mercado.js +0 -1
  56. package/dist/cjs/src/mexc.js +6 -7
  57. package/dist/cjs/src/ndax.js +1 -1
  58. package/dist/cjs/src/novadax.js +4 -6
  59. package/dist/cjs/src/oceanex.js +0 -1
  60. package/dist/cjs/src/okcoin.js +1 -3
  61. package/dist/cjs/src/okx.js +7 -4
  62. package/dist/cjs/src/onetrading.js +1 -3
  63. package/dist/cjs/src/p2b.js +1 -1
  64. package/dist/cjs/src/paradex.js +5 -7
  65. package/dist/cjs/src/phemex.js +8 -10
  66. package/dist/cjs/src/poloniex.js +1 -3
  67. package/dist/cjs/src/poloniexfutures.js +6 -6
  68. package/dist/cjs/src/probit.js +0 -1
  69. package/dist/cjs/src/timex.js +0 -1
  70. package/dist/cjs/src/tokocrypto.js +11 -14
  71. package/dist/cjs/src/tradeogre.js +1 -1
  72. package/dist/cjs/src/upbit.js +0 -1
  73. package/dist/cjs/src/wavesexchange.js +4 -5
  74. package/dist/cjs/src/whitebit.js +8 -9
  75. package/dist/cjs/src/woo.js +99 -13
  76. package/dist/cjs/src/woofipro.js +96 -15
  77. package/dist/cjs/src/xt.js +8 -4
  78. package/dist/cjs/src/yobit.js +0 -1
  79. package/dist/cjs/src/zaif.js +0 -1
  80. package/dist/cjs/src/zonda.js +1 -2
  81. package/js/ccxt.d.ts +3 -3
  82. package/js/ccxt.js +1 -1
  83. package/js/src/abstract/binance.d.ts +3 -0
  84. package/js/src/abstract/binancecoinm.d.ts +3 -0
  85. package/js/src/abstract/binanceus.d.ts +3 -0
  86. package/js/src/abstract/binanceusdm.d.ts +3 -0
  87. package/js/src/abstract/bitmart.d.ts +2 -0
  88. package/js/src/abstract/okx.d.ts +5 -0
  89. package/js/src/ace.js +1 -1
  90. package/js/src/alpaca.js +0 -1
  91. package/js/src/ascendex.js +0 -1
  92. package/js/src/base/Exchange.d.ts +12 -9
  93. package/js/src/base/Exchange.js +41 -19
  94. package/js/src/base/types.d.ts +2 -0
  95. package/js/src/bigone.js +0 -1
  96. package/js/src/binance.js +27 -24
  97. package/js/src/bingx.js +6 -1
  98. package/js/src/bitfinex.d.ts +11 -1
  99. package/js/src/bitfinex.js +124 -1
  100. package/js/src/bitget.js +1 -0
  101. package/js/src/bitmart.d.ts +52 -1
  102. package/js/src/bitmart.js +254 -1
  103. package/js/src/blofin.d.ts +1 -1
  104. package/js/src/blofin.js +16 -7
  105. package/js/src/bybit.js +8 -8
  106. package/js/src/cex.js +1 -1
  107. package/js/src/coinbase.js +8 -9
  108. package/js/src/coinbaseexchange.js +5 -6
  109. package/js/src/coinbaseinternational.d.ts +1 -1
  110. package/js/src/coinbaseinternational.js +7 -8
  111. package/js/src/coincatch.js +0 -1
  112. package/js/src/coincheck.js +0 -1
  113. package/js/src/coinex.js +91 -6
  114. package/js/src/coinlist.js +3 -4
  115. package/js/src/coinmate.js +1 -3
  116. package/js/src/coinmetro.js +4 -5
  117. package/js/src/coinone.js +0 -1
  118. package/js/src/coinsph.js +7 -8
  119. package/js/src/cryptocom.js +3 -0
  120. package/js/src/currencycom.js +3 -4
  121. package/js/src/defx.js +6 -7
  122. package/js/src/deribit.js +1 -3
  123. package/js/src/digifinex.js +0 -1
  124. package/js/src/ellipx.js +0 -2
  125. package/js/src/exmo.d.ts +36 -1
  126. package/js/src/exmo.js +63 -6
  127. package/js/src/gate.d.ts +1 -1
  128. package/js/src/gate.js +2 -3
  129. package/js/src/gemini.js +4 -5
  130. package/js/src/hashkey.js +79 -83
  131. package/js/src/hitbtc.d.ts +11 -1
  132. package/js/src/hitbtc.js +49 -5
  133. package/js/src/hollaex.js +4 -6
  134. package/js/src/htx.js +2 -4
  135. package/js/src/huobijp.js +0 -1
  136. package/js/src/hyperliquid.d.ts +20 -1
  137. package/js/src/hyperliquid.js +65 -1
  138. package/js/src/idex.js +8 -8
  139. package/js/src/independentreserve.js +0 -1
  140. package/js/src/indodax.js +0 -1
  141. package/js/src/kraken.d.ts +15 -9
  142. package/js/src/kraken.js +192 -29
  143. package/js/src/krakenfutures.d.ts +2 -2
  144. package/js/src/krakenfutures.js +75 -3
  145. package/js/src/kucoin.js +7 -4
  146. package/js/src/kucoinfutures.d.ts +5 -4
  147. package/js/src/kucoinfutures.js +10 -9
  148. package/js/src/kuna.js +1 -3
  149. package/js/src/latoken.js +1 -3
  150. package/js/src/lbank.js +0 -1
  151. package/js/src/luno.js +0 -1
  152. package/js/src/lykke.js +0 -1
  153. package/js/src/mercado.js +0 -1
  154. package/js/src/mexc.js +6 -7
  155. package/js/src/ndax.js +1 -1
  156. package/js/src/novadax.js +4 -6
  157. package/js/src/oceanex.js +0 -1
  158. package/js/src/okcoin.js +1 -3
  159. package/js/src/okx.js +7 -4
  160. package/js/src/onetrading.js +1 -3
  161. package/js/src/p2b.js +1 -1
  162. package/js/src/paradex.d.ts +1 -1
  163. package/js/src/paradex.js +5 -7
  164. package/js/src/phemex.js +8 -10
  165. package/js/src/poloniex.js +1 -3
  166. package/js/src/poloniexfutures.js +6 -6
  167. package/js/src/probit.js +0 -1
  168. package/js/src/timex.js +0 -1
  169. package/js/src/tokocrypto.js +11 -14
  170. package/js/src/tradeogre.js +1 -1
  171. package/js/src/upbit.js +0 -1
  172. package/js/src/wavesexchange.d.ts +1 -1
  173. package/js/src/wavesexchange.js +4 -5
  174. package/js/src/whitebit.js +8 -9
  175. package/js/src/woo.d.ts +1 -1
  176. package/js/src/woo.js +99 -13
  177. package/js/src/woofipro.js +96 -15
  178. package/js/src/xt.d.ts +2 -1
  179. package/js/src/xt.js +8 -4
  180. package/js/src/yobit.js +0 -1
  181. package/js/src/zaif.js +0 -1
  182. package/js/src/zonda.js +1 -2
  183. package/package.json +2 -2
package/dist/cjs/ccxt.js CHANGED
@@ -200,7 +200,7 @@ var xt$1 = require('./src/pro/xt.js');
200
200
 
201
201
  //-----------------------------------------------------------------------------
202
202
  // this is updated by vss.js when building
203
- const version = '4.4.40';
203
+ const version = '4.4.42';
204
204
  Exchange["default"].ccxtVersion = version;
205
205
  const exchanges = {
206
206
  'ace': ace,
@@ -589,7 +589,7 @@ class ace extends ace$1 {
589
589
  'postOnly': undefined,
590
590
  'side': side,
591
591
  'price': price,
592
- 'stopPrice': undefined,
592
+ 'triggerPrice': undefined,
593
593
  'amount': amount,
594
594
  'cost': undefined,
595
595
  'average': average,
@@ -1211,7 +1211,6 @@ class alpaca extends alpaca$1 {
1211
1211
  'postOnly': undefined,
1212
1212
  'side': this.safeString(order, 'side'),
1213
1213
  'price': this.safeNumber(order, 'limit_price'),
1214
- 'stopPrice': this.safeNumber(order, 'stop_price'),
1215
1214
  'triggerPrice': this.safeNumber(order, 'stop_price'),
1216
1215
  'cost': undefined,
1217
1216
  'average': this.safeNumber(order, 'filled_avg_price'),
@@ -1418,7 +1418,6 @@ class ascendex extends ascendex$1 {
1418
1418
  'reduceOnly': reduceOnly,
1419
1419
  'side': side,
1420
1420
  'price': price,
1421
- 'stopPrice': triggerPrice,
1422
1421
  'triggerPrice': triggerPrice,
1423
1422
  'amount': amount,
1424
1423
  'cost': undefined,
@@ -1444,6 +1444,7 @@ class Exchange {
1444
1444
  'fetchOHLCV': undefined,
1445
1445
  'fetchOHLCVWs': undefined,
1446
1446
  'fetchOpenInterest': undefined,
1447
+ 'fetchOpenInterests': undefined,
1447
1448
  'fetchOpenInterestHistory': undefined,
1448
1449
  'fetchOpenOrder': undefined,
1449
1450
  'fetchOpenOrders': undefined,
@@ -2278,6 +2279,9 @@ class Exchange {
2278
2279
  async fetchOpenInterest(symbol, params = {}) {
2279
2280
  throw new errors.NotSupported(this.id + ' fetchOpenInterest() is not supported yet');
2280
2281
  }
2282
+ async fetchOpenInterests(symbols = undefined, params = {}) {
2283
+ throw new errors.NotSupported(this.id + ' fetchOpenInterests() is not supported yet');
2284
+ }
2281
2285
  async signIn(params = {}) {
2282
2286
  throw new errors.NotSupported(this.id + ' signIn() is not supported yet');
2283
2287
  }
@@ -4462,10 +4466,15 @@ class Exchange {
4462
4466
  }
4463
4467
  handleOptionAndParams2(params, methodName1, optionName1, optionName2, defaultValue = undefined) {
4464
4468
  let value = undefined;
4465
- [value, params] = this.handleOptionAndParams(params, methodName1, optionName1, defaultValue);
4469
+ [value, params] = this.handleOptionAndParams(params, methodName1, optionName1);
4470
+ if (value !== undefined) {
4471
+ // omit optionName2 too from params
4472
+ params = this.omit(params, optionName2);
4473
+ return [value, params];
4474
+ }
4466
4475
  // if still undefined, try optionName2
4467
4476
  let value2 = undefined;
4468
- [value2, params] = this.handleOptionAndParams(params, methodName1, optionName2, value);
4477
+ [value2, params] = this.handleOptionAndParams(params, methodName1, optionName2, defaultValue);
4469
4478
  return [value2, params];
4470
4479
  }
4471
4480
  handleOption(methodName, optionName, defaultValue = undefined) {
@@ -5520,52 +5529,52 @@ class Exchange {
5520
5529
  const query = this.extend(params, { 'reduceOnly': true });
5521
5530
  return await this.createOrderWs(symbol, type, side, amount, price, query);
5522
5531
  }
5523
- async createStopOrder(symbol, type, side, amount, price = undefined, stopPrice = undefined, params = {}) {
5532
+ async createStopOrder(symbol, type, side, amount, price = undefined, triggerPrice = undefined, params = {}) {
5524
5533
  if (!this.has['createStopOrder']) {
5525
5534
  throw new errors.NotSupported(this.id + ' createStopOrder() is not supported yet');
5526
5535
  }
5527
- if (stopPrice === undefined) {
5536
+ if (triggerPrice === undefined) {
5528
5537
  throw new errors.ArgumentsRequired(this.id + ' create_stop_order() requires a stopPrice argument');
5529
5538
  }
5530
- const query = this.extend(params, { 'stopPrice': stopPrice });
5539
+ const query = this.extend(params, { 'stopPrice': triggerPrice });
5531
5540
  return await this.createOrder(symbol, type, side, amount, price, query);
5532
5541
  }
5533
- async createStopOrderWs(symbol, type, side, amount, price = undefined, stopPrice = undefined, params = {}) {
5542
+ async createStopOrderWs(symbol, type, side, amount, price = undefined, triggerPrice = undefined, params = {}) {
5534
5543
  if (!this.has['createStopOrderWs']) {
5535
5544
  throw new errors.NotSupported(this.id + ' createStopOrderWs() is not supported yet');
5536
5545
  }
5537
- if (stopPrice === undefined) {
5546
+ if (triggerPrice === undefined) {
5538
5547
  throw new errors.ArgumentsRequired(this.id + ' createStopOrderWs() requires a stopPrice argument');
5539
5548
  }
5540
- const query = this.extend(params, { 'stopPrice': stopPrice });
5549
+ const query = this.extend(params, { 'stopPrice': triggerPrice });
5541
5550
  return await this.createOrderWs(symbol, type, side, amount, price, query);
5542
5551
  }
5543
- async createStopLimitOrder(symbol, side, amount, price, stopPrice, params = {}) {
5552
+ async createStopLimitOrder(symbol, side, amount, price, triggerPrice, params = {}) {
5544
5553
  if (!this.has['createStopLimitOrder']) {
5545
5554
  throw new errors.NotSupported(this.id + ' createStopLimitOrder() is not supported yet');
5546
5555
  }
5547
- const query = this.extend(params, { 'stopPrice': stopPrice });
5556
+ const query = this.extend(params, { 'stopPrice': triggerPrice });
5548
5557
  return await this.createOrder(symbol, 'limit', side, amount, price, query);
5549
5558
  }
5550
- async createStopLimitOrderWs(symbol, side, amount, price, stopPrice, params = {}) {
5559
+ async createStopLimitOrderWs(symbol, side, amount, price, triggerPrice, params = {}) {
5551
5560
  if (!this.has['createStopLimitOrderWs']) {
5552
5561
  throw new errors.NotSupported(this.id + ' createStopLimitOrderWs() is not supported yet');
5553
5562
  }
5554
- const query = this.extend(params, { 'stopPrice': stopPrice });
5563
+ const query = this.extend(params, { 'stopPrice': triggerPrice });
5555
5564
  return await this.createOrderWs(symbol, 'limit', side, amount, price, query);
5556
5565
  }
5557
- async createStopMarketOrder(symbol, side, amount, stopPrice, params = {}) {
5566
+ async createStopMarketOrder(symbol, side, amount, triggerPrice, params = {}) {
5558
5567
  if (!this.has['createStopMarketOrder']) {
5559
5568
  throw new errors.NotSupported(this.id + ' createStopMarketOrder() is not supported yet');
5560
5569
  }
5561
- const query = this.extend(params, { 'stopPrice': stopPrice });
5570
+ const query = this.extend(params, { 'stopPrice': triggerPrice });
5562
5571
  return await this.createOrder(symbol, 'market', side, amount, undefined, query);
5563
5572
  }
5564
- async createStopMarketOrderWs(symbol, side, amount, stopPrice, params = {}) {
5573
+ async createStopMarketOrderWs(symbol, side, amount, triggerPrice, params = {}) {
5565
5574
  if (!this.has['createStopMarketOrderWs']) {
5566
5575
  throw new errors.NotSupported(this.id + ' createStopMarketOrderWs() is not supported yet');
5567
5576
  }
5568
- const query = this.extend(params, { 'stopPrice': stopPrice });
5577
+ const query = this.extend(params, { 'stopPrice': triggerPrice });
5569
5578
  return await this.createOrderWs(symbol, 'market', side, amount, undefined, query);
5570
5579
  }
5571
5580
  safeCurrencyCode(currencyId, currency = undefined) {
@@ -5733,6 +5742,14 @@ class Exchange {
5733
5742
  }
5734
5743
  return result;
5735
5744
  }
5745
+ parseOpenInterests(response, market = undefined) {
5746
+ const result = {};
5747
+ for (let i = 0; i < response.length; i++) {
5748
+ const parsed = this.parseOpenInterest(response[i], market);
5749
+ result[parsed['symbol']] = parsed;
5750
+ }
5751
+ return result;
5752
+ }
5736
5753
  parseLongShortRatio(info, market = undefined) {
5737
5754
  throw new errors.NotSupported(this.id + ' parseLongShortRatio() is not supported yet');
5738
5755
  }
@@ -5842,7 +5859,7 @@ class Exchange {
5842
5859
  parseOpenInterest(interest, market = undefined) {
5843
5860
  throw new errors.NotSupported(this.id + ' parseOpenInterest () is not supported yet');
5844
5861
  }
5845
- parseOpenInterests(response, market = undefined, since = undefined, limit = undefined) {
5862
+ parseOpenInterestsHistory(response, market = undefined, since = undefined, limit = undefined) {
5846
5863
  const interests = [];
5847
5864
  for (let i = 0; i < response.length; i++) {
5848
5865
  const entry = response[i];
@@ -6194,7 +6211,7 @@ class Exchange {
6194
6211
  }
6195
6212
  return [maxEntriesPerRequest, params];
6196
6213
  }
6197
- async fetchPaginatedCallDynamic(method, symbol = undefined, since = undefined, limit = undefined, params = {}, maxEntriesPerRequest = undefined) {
6214
+ async fetchPaginatedCallDynamic(method, symbol = undefined, since = undefined, limit = undefined, params = {}, maxEntriesPerRequest = undefined, removeRepeated = true) {
6198
6215
  let maxCalls = undefined;
6199
6216
  [maxCalls, params] = this.handleOptionAndParams(params, method, 'paginationCalls', 10);
6200
6217
  let maxRetries = undefined;
@@ -6202,6 +6219,8 @@ class Exchange {
6202
6219
  let paginationDirection = undefined;
6203
6220
  [paginationDirection, params] = this.handleOptionAndParams(params, method, 'paginationDirection', 'backward');
6204
6221
  let paginationTimestamp = undefined;
6222
+ let removeRepeatedOption = removeRepeated;
6223
+ [removeRepeatedOption, params] = this.handleOptionAndParams(params, method, 'removeRepeated', removeRepeated);
6205
6224
  let calls = 0;
6206
6225
  let result = [];
6207
6226
  let errors$1 = 0;
@@ -6272,7 +6291,10 @@ class Exchange {
6272
6291
  }
6273
6292
  }
6274
6293
  }
6275
- const uniqueResults = this.removeRepeatedElementsFromArray(result);
6294
+ let uniqueResults = result;
6295
+ if (removeRepeatedOption) {
6296
+ uniqueResults = this.removeRepeatedElementsFromArray(result);
6297
+ }
6276
6298
  const key = (method === 'fetchOHLCV') ? 0 : 'timestamp';
6277
6299
  return this.filterBySinceLimit(uniqueResults, since, limit, key);
6278
6300
  }
@@ -1375,7 +1375,6 @@ class bigone extends bigone$1 {
1375
1375
  'postOnly': this.safeBool(order, 'post_only'),
1376
1376
  'side': side,
1377
1377
  'price': price,
1378
- 'stopPrice': triggerPrice,
1379
1378
  'triggerPrice': triggerPrice,
1380
1379
  'amount': amount,
1381
1380
  'cost': cost,
@@ -634,6 +634,8 @@ class binance extends binance$1 {
634
634
  'portfolio/bnb-transfer': 150,
635
635
  'portfolio/repay-futures-switch': 150,
636
636
  'portfolio/repay-futures-negative-balance': 150,
637
+ 'portfolio/mint': 20,
638
+ 'portfolio/redeem': 20,
637
639
  'lending/auto-invest/plan/add': 0.1,
638
640
  'lending/auto-invest/plan/edit': 0.1,
639
641
  'lending/auto-invest/plan/edit-status': 0.1,
@@ -962,6 +964,7 @@ class binance extends binance$1 {
962
964
  'block/order/orders': 5,
963
965
  'block/order/execute': 5,
964
966
  'block/user-trades': 5,
967
+ 'blockTrades': 5,
965
968
  },
966
969
  'post': {
967
970
  'order': 1,
@@ -5229,8 +5232,8 @@ class binance extends binance$1 {
5229
5232
  uppercaseType = 'LIMIT_MAKER';
5230
5233
  }
5231
5234
  request['type'] = uppercaseType;
5232
- const stopPrice = this.safeNumber2(params, 'stopPrice', 'triggerPrice');
5233
- if (stopPrice !== undefined) {
5235
+ const triggerPrice = this.safeNumber2(params, 'stopPrice', 'triggerPrice');
5236
+ if (triggerPrice !== undefined) {
5234
5237
  if (uppercaseType === 'MARKET') {
5235
5238
  uppercaseType = 'STOP_LOSS';
5236
5239
  }
@@ -5241,7 +5244,7 @@ class binance extends binance$1 {
5241
5244
  const validOrderTypes = this.safeList(market['info'], 'orderTypes');
5242
5245
  if (!this.inArray(uppercaseType, validOrderTypes)) {
5243
5246
  if (initialUppercaseType !== uppercaseType) {
5244
- throw new errors.InvalidOrder(this.id + ' stopPrice parameter is not allowed for ' + symbol + ' ' + type + ' orders');
5247
+ throw new errors.InvalidOrder(this.id + ' triggerPrice parameter is not allowed for ' + symbol + ' ' + type + ' orders');
5245
5248
  }
5246
5249
  else {
5247
5250
  throw new errors.InvalidOrder(this.id + ' ' + type + ' is not a valid order type for the ' + symbol + ' market');
@@ -5262,7 +5265,7 @@ class binance extends binance$1 {
5262
5265
  request['newOrderRespType'] = this.safeValue(this.options['newOrderRespType'], type, 'RESULT'); // 'ACK' for order id, 'RESULT' for full order or 'FULL' for order with fills
5263
5266
  let timeInForceIsRequired = false;
5264
5267
  let priceIsRequired = false;
5265
- let stopPriceIsRequired = false;
5268
+ let triggerPriceIsRequired = false;
5266
5269
  let quantityIsRequired = false;
5267
5270
  if (uppercaseType === 'MARKET') {
5268
5271
  const quoteOrderQty = this.safeBool(this.options, 'quoteOrderQty', true);
@@ -5292,12 +5295,12 @@ class binance extends binance$1 {
5292
5295
  quantityIsRequired = true;
5293
5296
  }
5294
5297
  else if ((uppercaseType === 'STOP_LOSS') || (uppercaseType === 'TAKE_PROFIT')) {
5295
- stopPriceIsRequired = true;
5298
+ triggerPriceIsRequired = true;
5296
5299
  quantityIsRequired = true;
5297
5300
  }
5298
5301
  else if ((uppercaseType === 'STOP_LOSS_LIMIT') || (uppercaseType === 'TAKE_PROFIT_LIMIT')) {
5299
5302
  quantityIsRequired = true;
5300
- stopPriceIsRequired = true;
5303
+ triggerPriceIsRequired = true;
5301
5304
  priceIsRequired = true;
5302
5305
  timeInForceIsRequired = true;
5303
5306
  }
@@ -5317,12 +5320,12 @@ class binance extends binance$1 {
5317
5320
  if (timeInForceIsRequired && (this.safeString(params, 'timeInForce') === undefined)) {
5318
5321
  request['timeInForce'] = this.options['defaultTimeInForce']; // 'GTC' = Good To Cancel (default), 'IOC' = Immediate Or Cancel
5319
5322
  }
5320
- if (stopPriceIsRequired) {
5321
- if (stopPrice === undefined) {
5322
- throw new errors.InvalidOrder(this.id + ' editOrder() requires a stopPrice extra param for a ' + type + ' order');
5323
+ if (triggerPriceIsRequired) {
5324
+ if (triggerPrice === undefined) {
5325
+ throw new errors.InvalidOrder(this.id + ' editOrder() requires a triggerPrice extra param for a ' + type + ' order');
5323
5326
  }
5324
5327
  else {
5325
- request['stopPrice'] = this.priceToPrecision(symbol, stopPrice);
5328
+ request['stopPrice'] = this.priceToPrecision(symbol, triggerPrice);
5326
5329
  }
5327
5330
  }
5328
5331
  request['cancelReplaceMode'] = 'STOP_ON_FAILURE'; // If the cancel request fails, the new order placement will not be attempted.
@@ -5986,7 +5989,7 @@ class binance extends binance$1 {
5986
5989
  type = 'limit';
5987
5990
  }
5988
5991
  const stopPriceString = this.safeString(order, 'stopPrice');
5989
- const stopPrice = this.parseNumber(this.omitZero(stopPriceString));
5992
+ const triggerPrice = this.parseNumber(this.omitZero(stopPriceString));
5990
5993
  const feeCost = this.safeNumber(order, 'fee');
5991
5994
  let fee = undefined;
5992
5995
  if (feeCost !== undefined) {
@@ -6011,7 +6014,7 @@ class binance extends binance$1 {
6011
6014
  'reduceOnly': this.safeBool(order, 'reduceOnly'),
6012
6015
  'side': side,
6013
6016
  'price': price,
6014
- 'triggerPrice': stopPrice,
6017
+ 'triggerPrice': triggerPrice,
6015
6018
  'amount': amount,
6016
6019
  'cost': cost,
6017
6020
  'average': average,
@@ -6330,7 +6333,7 @@ class binance extends binance$1 {
6330
6333
  const validOrderTypes = this.safeList(market['info'], 'orderTypes');
6331
6334
  if (!this.inArray(uppercaseType, validOrderTypes)) {
6332
6335
  if (initialUppercaseType !== uppercaseType) {
6333
- throw new errors.InvalidOrder(this.id + ' stopPrice parameter is not allowed for ' + symbol + ' ' + type + ' orders');
6336
+ throw new errors.InvalidOrder(this.id + ' triggerPrice parameter is not allowed for ' + symbol + ' ' + type + ' orders');
6334
6337
  }
6335
6338
  else {
6336
6339
  throw new errors.InvalidOrder(this.id + ' ' + type + ' is not a valid order type for the ' + symbol + ' market');
@@ -6385,7 +6388,7 @@ class binance extends binance$1 {
6385
6388
  const closePosition = this.safeBool(params, 'closePosition', false);
6386
6389
  let timeInForceIsRequired = false;
6387
6390
  let priceIsRequired = false;
6388
- let stopPriceIsRequired = false;
6391
+ let triggerPriceIsRequired = false;
6389
6392
  let quantityIsRequired = false;
6390
6393
  //
6391
6394
  // spot/margin
@@ -6440,7 +6443,7 @@ class binance extends binance$1 {
6440
6443
  quantityIsRequired = true;
6441
6444
  }
6442
6445
  else if ((uppercaseType === 'STOP_LOSS') || (uppercaseType === 'TAKE_PROFIT')) {
6443
- stopPriceIsRequired = true;
6446
+ triggerPriceIsRequired = true;
6444
6447
  quantityIsRequired = true;
6445
6448
  if (market['linear'] || market['inverse']) {
6446
6449
  priceIsRequired = true;
@@ -6448,7 +6451,7 @@ class binance extends binance$1 {
6448
6451
  }
6449
6452
  else if ((uppercaseType === 'STOP_LOSS_LIMIT') || (uppercaseType === 'TAKE_PROFIT_LIMIT')) {
6450
6453
  quantityIsRequired = true;
6451
- stopPriceIsRequired = true;
6454
+ triggerPriceIsRequired = true;
6452
6455
  priceIsRequired = true;
6453
6456
  timeInForceIsRequired = true;
6454
6457
  }
@@ -6458,14 +6461,14 @@ class binance extends binance$1 {
6458
6461
  }
6459
6462
  else if (uppercaseType === 'STOP') {
6460
6463
  quantityIsRequired = true;
6461
- stopPriceIsRequired = true;
6464
+ triggerPriceIsRequired = true;
6462
6465
  priceIsRequired = true;
6463
6466
  }
6464
6467
  else if ((uppercaseType === 'STOP_MARKET') || (uppercaseType === 'TAKE_PROFIT_MARKET')) {
6465
6468
  if (!closePosition) {
6466
6469
  quantityIsRequired = true;
6467
6470
  }
6468
- stopPriceIsRequired = true;
6471
+ triggerPriceIsRequired = true;
6469
6472
  }
6470
6473
  else if (uppercaseType === 'TRAILING_STOP_MARKET') {
6471
6474
  if (!closePosition) {
@@ -6504,16 +6507,16 @@ class binance extends binance$1 {
6504
6507
  request['price'] = this.parseToNumeric(price); // some options don't have the precision available
6505
6508
  }
6506
6509
  }
6507
- if (stopPriceIsRequired) {
6510
+ if (triggerPriceIsRequired) {
6508
6511
  if (market['contract']) {
6509
6512
  if (stopPrice === undefined) {
6510
- throw new errors.InvalidOrder(this.id + ' createOrder() requires a stopPrice extra param for a ' + type + ' order');
6513
+ throw new errors.InvalidOrder(this.id + ' createOrder() requires a triggerPrice extra param for a ' + type + ' order');
6511
6514
  }
6512
6515
  }
6513
6516
  else {
6514
6517
  // check for delta price as well
6515
6518
  if (trailingDelta === undefined && stopPrice === undefined && trailingPercent === undefined) {
6516
- throw new errors.InvalidOrder(this.id + ' createOrder() requires a stopPrice, trailingDelta or trailingPercent param for a ' + type + ' order');
6519
+ throw new errors.InvalidOrder(this.id + ' createOrder() requires a triggerPrice, trailingDelta or trailingPercent param for a ' + type + ' order');
6517
6520
  }
6518
6521
  }
6519
6522
  if (stopPrice !== undefined) {
@@ -11637,7 +11640,7 @@ class binance extends binance$1 {
11637
11640
  let paginate = false;
11638
11641
  [paginate, params] = this.handleOptionAndParams(params, 'fetchLedger', 'paginate');
11639
11642
  if (paginate) {
11640
- return await this.fetchPaginatedCallDynamic('fetchLedger', code, since, limit, params);
11643
+ return await this.fetchPaginatedCallDynamic('fetchLedger', code, since, limit, params, undefined, false);
11641
11644
  }
11642
11645
  let type = undefined;
11643
11646
  let subType = undefined;
@@ -12819,7 +12822,7 @@ class binance extends binance$1 {
12819
12822
  // ...
12820
12823
  // ]
12821
12824
  //
12822
- return this.parseOpenInterests(response, market, since, limit);
12825
+ return this.parseOpenInterestsHistory(response, market, since, limit);
12823
12826
  }
12824
12827
  /**
12825
12828
  * @method
@@ -12888,7 +12891,7 @@ class binance extends binance$1 {
12888
12891
  //
12889
12892
  if (market['option']) {
12890
12893
  symbol = market['symbol'];
12891
- const result = this.parseOpenInterests(response, market);
12894
+ const result = this.parseOpenInterestsHistory(response, market);
12892
12895
  for (let i = 0; i < result.length; i++) {
12893
12896
  const item = result[i];
12894
12897
  if (item['symbol'] === symbol) {
@@ -48,6 +48,7 @@ class bingx extends bingx$1 {
48
48
  'createTrailingAmountOrder': true,
49
49
  'createTrailingPercentOrder': true,
50
50
  'createTriggerOrder': true,
51
+ 'editOrder': true,
51
52
  'fetchBalance': true,
52
53
  'fetchCanceledOrders': true,
53
54
  'fetchClosedOrders': true,
@@ -70,6 +71,7 @@ class bingx extends bingx$1 {
70
71
  'fetchMarkPrice': true,
71
72
  'fetchMarkPrices': true,
72
73
  'fetchMyLiquidations': true,
74
+ 'fetchMyTrades': true,
73
75
  'fetchOHLCV': true,
74
76
  'fetchOpenInterest': true,
75
77
  'fetchOpenOrders': true,
@@ -1037,7 +1039,7 @@ class bingx extends bingx$1 {
1037
1039
  };
1038
1040
  request['interval'] = this.safeString(this.timeframes, timeframe, timeframe);
1039
1041
  if (since !== undefined) {
1040
- request['startTime'] = since;
1042
+ request['startTime'] = Math.max(since - 1, 0);
1041
1043
  }
1042
1044
  if (limit !== undefined) {
1043
1045
  request['limit'] = limit;
@@ -5596,6 +5598,9 @@ class bingx extends bingx$1 {
5596
5598
  request['endTs'] = now;
5597
5599
  }
5598
5600
  if (market['spot']) {
5601
+ if (limit !== undefined) {
5602
+ request['limit'] = limit; // default 500, maximum 1000
5603
+ }
5599
5604
  response = await this.spotV1PrivateGetTradeMyTrades(this.extend(request, params));
5600
5605
  const data = this.safeDict(response, 'data', {});
5601
5606
  fills = this.safeList(data, 'fills', []);
@@ -82,6 +82,7 @@ class bitfinex extends bitfinex$1 {
82
82
  'fetchOHLCV': true,
83
83
  'fetchOpenInterest': true,
84
84
  'fetchOpenInterestHistory': true,
85
+ 'fetchOpenInterests': true,
85
86
  'fetchOpenOrder': true,
86
87
  'fetchOpenOrders': true,
87
88
  'fetchOrder': true,
@@ -401,6 +402,75 @@ class bitfinex extends bitfinex$1 {
401
402
  'TETHERUSE': 'ERC20',
402
403
  },
403
404
  },
405
+ 'features': {
406
+ 'default': {
407
+ 'sandbox': false,
408
+ 'createOrder': {
409
+ 'marginMode': true,
410
+ 'triggerPrice': true,
411
+ 'triggerPriceType': undefined,
412
+ 'triggerDirection': false,
413
+ 'stopLossPrice': true,
414
+ 'takeProfitPrice': true,
415
+ 'attachedStopLossTakeProfit': undefined,
416
+ 'timeInForce': {
417
+ 'IOC': true,
418
+ 'FOK': true,
419
+ 'PO': true,
420
+ 'GTD': false,
421
+ },
422
+ 'hedged': false,
423
+ 'trailing': true, // todo: unify
424
+ // todo: leverage unify
425
+ },
426
+ 'createOrders': {
427
+ 'max': 75,
428
+ },
429
+ 'fetchMyTrades': {
430
+ 'marginMode': false,
431
+ 'limit': 2500,
432
+ 'daysBack': undefined,
433
+ 'untilDays': 100000, // todo: implement
434
+ },
435
+ 'fetchOrder': {
436
+ 'marginMode': false,
437
+ 'trigger': false,
438
+ 'trailing': false,
439
+ },
440
+ 'fetchOpenOrders': {
441
+ 'marginMode': false,
442
+ 'limit': undefined,
443
+ 'trigger': false,
444
+ 'trailing': false,
445
+ },
446
+ 'fetchOrders': undefined,
447
+ 'fetchClosedOrders': {
448
+ 'marginMode': false,
449
+ 'limit': undefined,
450
+ 'daysBackClosed': undefined,
451
+ 'daysBackCanceled': undefined,
452
+ 'untilDays': 100000,
453
+ 'trigger': false,
454
+ 'trailing': false,
455
+ },
456
+ 'fetchOHLCV': {
457
+ 'limit': 10000,
458
+ },
459
+ },
460
+ 'spot': {
461
+ 'extends': 'default',
462
+ },
463
+ 'swap': {
464
+ 'linear': {
465
+ 'extends': 'default',
466
+ },
467
+ 'inverse': undefined,
468
+ },
469
+ 'future': {
470
+ 'linear': undefined,
471
+ 'inverse': undefined,
472
+ },
473
+ },
404
474
  'exceptions': {
405
475
  'exact': {
406
476
  '11010': errors.RateLimitExceeded,
@@ -3245,6 +3315,59 @@ class bitfinex extends bitfinex$1 {
3245
3315
  'previousFundingDatetime': undefined,
3246
3316
  };
3247
3317
  }
3318
+ /**
3319
+ * @method
3320
+ * @name bitfinex#fetchOpenInterests
3321
+ * @description Retrieves the open interest for a list of symbols
3322
+ * @see https://docs.bitfinex.com/reference/rest-public-derivatives-status
3323
+ * @param {string[]} [symbols] a list of unified CCXT market symbols
3324
+ * @param {object} [params] exchange specific parameters
3325
+ * @returns {object[]} a list of [open interest structures]{@link https://docs.ccxt.com/#/?id=open-interest-structure}
3326
+ */
3327
+ async fetchOpenInterests(symbols = undefined, params = {}) {
3328
+ await this.loadMarkets();
3329
+ symbols = this.marketSymbols(symbols);
3330
+ let marketIds = ['ALL'];
3331
+ if (symbols !== undefined) {
3332
+ marketIds = this.marketIds(symbols);
3333
+ }
3334
+ const request = {
3335
+ 'keys': marketIds.join(','),
3336
+ };
3337
+ const response = await this.publicGetStatusDeriv(this.extend(request, params));
3338
+ //
3339
+ // [
3340
+ // [
3341
+ // "tXRPF0:USTF0", // market id
3342
+ // 1706256986000, // millisecond timestamp
3343
+ // null,
3344
+ // 0.512705, // derivative mid price
3345
+ // 0.512395, // underlying spot mid price
3346
+ // null,
3347
+ // 37671483.04, // insurance fund balance
3348
+ // null,
3349
+ // 1706284800000, // timestamp of next funding
3350
+ // 0.00002353, // accrued funding for next period
3351
+ // 317, // next funding step
3352
+ // null,
3353
+ // 0, // current funding
3354
+ // null,
3355
+ // null,
3356
+ // 0.5123016, // mark price
3357
+ // null,
3358
+ // null,
3359
+ // 2233562.03115, // open interest in contracts
3360
+ // null,
3361
+ // null,
3362
+ // null,
3363
+ // 0.0005, // average spread without funding payment
3364
+ // 0.0025 // funding payment cap
3365
+ // ]
3366
+ // ]
3367
+ //
3368
+ const result = this.parseOpenInterests(response);
3369
+ return this.filterByArray(result, 'symbol', symbols);
3370
+ }
3248
3371
  /**
3249
3372
  * @method
3250
3373
  * @name bitfinex#fetchOpenInterest
@@ -3356,7 +3479,7 @@ class bitfinex extends bitfinex$1 {
3356
3479
  // ],
3357
3480
  // ]
3358
3481
  //
3359
- return this.parseOpenInterests(response, market, since, limit);
3482
+ return this.parseOpenInterestsHistory(response, market, since, limit);
3360
3483
  }
3361
3484
  parseOpenInterest(interest, market = undefined) {
3362
3485
  //
@@ -1243,6 +1243,7 @@ class bitget extends bitget$1 {
1243
1243
  '41103': errors.InvalidOrder,
1244
1244
  '41114': errors.OnMaintenance,
1245
1245
  '43011': errors.InvalidOrder,
1246
+ '43001': errors.OrderNotFound,
1246
1247
  '43012': errors.InsufficientFunds,
1247
1248
  '43025': errors.InvalidOrder,
1248
1249
  '43115': errors.OnMaintenance,