ccxt 4.4.32 → 4.4.34

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 (118) hide show
  1. package/README.md +8 -7
  2. package/dist/ccxt.browser.min.js +6 -6
  3. package/dist/cjs/ccxt.js +4 -1
  4. package/dist/cjs/src/abstract/ellipx.js +9 -0
  5. package/dist/cjs/src/alpaca.js +2 -0
  6. package/dist/cjs/src/base/Exchange.js +116 -1
  7. package/dist/cjs/src/binance.js +164 -6
  8. package/dist/cjs/src/bingx.js +156 -9
  9. package/dist/cjs/src/bitbank.js +5 -0
  10. package/dist/cjs/src/bitbns.js +2 -0
  11. package/dist/cjs/src/bitfinex2.js +2 -1
  12. package/dist/cjs/src/bitget.js +177 -44
  13. package/dist/cjs/src/bitmex.js +2 -0
  14. package/dist/cjs/src/bitopro.js +3 -0
  15. package/dist/cjs/src/bitrue.js +1 -0
  16. package/dist/cjs/src/btcmarkets.js +2 -0
  17. package/dist/cjs/src/bybit.js +148 -13
  18. package/dist/cjs/src/cex.js +16 -6
  19. package/dist/cjs/src/coinbase.js +5 -24
  20. package/dist/cjs/src/coinbaseexchange.js +2 -1
  21. package/dist/cjs/src/coinex.js +2 -0
  22. package/dist/cjs/src/coinone.js +7 -7
  23. package/dist/cjs/src/coinsph.js +7 -7
  24. package/dist/cjs/src/coinspot.js +39 -39
  25. package/dist/cjs/src/cryptocom.js +36 -34
  26. package/dist/cjs/src/ellipx.js +1871 -0
  27. package/dist/cjs/src/gate.js +2 -1
  28. package/dist/cjs/src/hyperliquid.js +16 -2
  29. package/dist/cjs/src/kraken.js +1 -0
  30. package/dist/cjs/src/krakenfutures.js +3 -1
  31. package/dist/cjs/src/kucoinfutures.js +1 -1
  32. package/dist/cjs/src/lbank.js +1 -0
  33. package/dist/cjs/src/okcoin.js +2 -0
  34. package/dist/cjs/src/okx.js +104 -9
  35. package/dist/cjs/src/onetrading.js +14 -1
  36. package/dist/cjs/src/paradex.js +2 -0
  37. package/dist/cjs/src/phemex.js +35 -7
  38. package/dist/cjs/src/poloniex.js +3 -1
  39. package/dist/cjs/src/poloniexfutures.js +3 -1
  40. package/dist/cjs/src/pro/idex.js +5 -0
  41. package/dist/cjs/src/pro/okx.js +11 -1
  42. package/dist/cjs/src/pro/probit.js +4 -2
  43. package/dist/cjs/src/pro/woo.js +15 -15
  44. package/dist/cjs/src/vertex.js +2 -0
  45. package/dist/cjs/src/woo.js +69 -69
  46. package/examples/js/cli.js +1 -1
  47. package/js/ccxt.d.ts +5 -2
  48. package/js/ccxt.js +4 -2
  49. package/js/src/abstract/bingx.d.ts +16 -0
  50. package/js/src/abstract/bitbank.d.ts +5 -0
  51. package/js/src/abstract/bitfinex2.d.ts +1 -0
  52. package/js/src/abstract/coinbaseexchange.d.ts +1 -0
  53. package/js/src/abstract/ellipx.d.ts +28 -0
  54. package/js/src/abstract/ellipx.js +11 -0
  55. package/js/src/abstract/kraken.d.ts +1 -0
  56. package/js/src/alpaca.js +2 -0
  57. package/js/src/base/Exchange.d.ts +11 -0
  58. package/js/src/base/Exchange.js +116 -1
  59. package/js/src/binance.js +164 -6
  60. package/js/src/bingx.d.ts +3 -1
  61. package/js/src/bingx.js +156 -9
  62. package/js/src/bitbank.js +5 -0
  63. package/js/src/bitbns.js +2 -0
  64. package/js/src/bitfinex2.js +2 -1
  65. package/js/src/bitget.d.ts +4 -4
  66. package/js/src/bitget.js +177 -44
  67. package/js/src/bitmex.js +2 -0
  68. package/js/src/bitopro.d.ts +1 -0
  69. package/js/src/bitopro.js +3 -0
  70. package/js/src/bitrue.js +1 -0
  71. package/js/src/btcmarkets.d.ts +1 -0
  72. package/js/src/btcmarkets.js +2 -0
  73. package/js/src/bybit.d.ts +3 -2
  74. package/js/src/bybit.js +149 -14
  75. package/js/src/cex.d.ts +1 -0
  76. package/js/src/cex.js +17 -7
  77. package/js/src/coinbase.d.ts +2 -1
  78. package/js/src/coinbase.js +5 -24
  79. package/js/src/coinbaseexchange.js +2 -1
  80. package/js/src/coinex.js +2 -0
  81. package/js/src/coinone.js +7 -7
  82. package/js/src/coinsph.js +7 -7
  83. package/js/src/coinspot.js +39 -39
  84. package/js/src/cryptocom.d.ts +1 -1
  85. package/js/src/cryptocom.js +36 -34
  86. package/js/src/ellipx.d.ts +236 -0
  87. package/js/src/ellipx.js +1874 -0
  88. package/js/src/gate.d.ts +2 -2
  89. package/js/src/gate.js +2 -1
  90. package/js/src/hyperliquid.d.ts +2 -1
  91. package/js/src/hyperliquid.js +16 -2
  92. package/js/src/kraken.js +1 -0
  93. package/js/src/krakenfutures.js +3 -1
  94. package/js/src/kucoinfutures.d.ts +1 -1
  95. package/js/src/kucoinfutures.js +1 -1
  96. package/js/src/lbank.js +1 -0
  97. package/js/src/okcoin.js +2 -0
  98. package/js/src/okx.d.ts +1 -1
  99. package/js/src/okx.js +104 -9
  100. package/js/src/onetrading.d.ts +5 -0
  101. package/js/src/onetrading.js +15 -2
  102. package/js/src/paradex.js +2 -0
  103. package/js/src/phemex.d.ts +4 -0
  104. package/js/src/phemex.js +35 -7
  105. package/js/src/poloniex.d.ts +1 -1
  106. package/js/src/poloniex.js +3 -1
  107. package/js/src/poloniexfutures.d.ts +1 -1
  108. package/js/src/poloniexfutures.js +3 -1
  109. package/js/src/pro/idex.d.ts +5 -0
  110. package/js/src/pro/idex.js +5 -0
  111. package/js/src/pro/okx.js +11 -1
  112. package/js/src/pro/probit.js +4 -2
  113. package/js/src/pro/woo.d.ts +11 -11
  114. package/js/src/pro/woo.js +15 -15
  115. package/js/src/vertex.js +2 -0
  116. package/js/src/woo.d.ts +60 -60
  117. package/js/src/woo.js +69 -69
  118. package/package.json +3 -3
package/dist/cjs/ccxt.js CHANGED
@@ -67,6 +67,7 @@ var currencycom = require('./src/currencycom.js');
67
67
  var delta = require('./src/delta.js');
68
68
  var deribit = require('./src/deribit.js');
69
69
  var digifinex = require('./src/digifinex.js');
70
+ var ellipx = require('./src/ellipx.js');
70
71
  var exmo = require('./src/exmo.js');
71
72
  var fmfwio = require('./src/fmfwio.js');
72
73
  var gate = require('./src/gate.js');
@@ -197,7 +198,7 @@ var xt$1 = require('./src/pro/xt.js');
197
198
 
198
199
  //-----------------------------------------------------------------------------
199
200
  // this is updated by vss.js when building
200
- const version = '4.4.32';
201
+ const version = '4.4.34';
201
202
  Exchange["default"].ccxtVersion = version;
202
203
  const exchanges = {
203
204
  'ace': ace,
@@ -255,6 +256,7 @@ const exchanges = {
255
256
  'delta': delta,
256
257
  'deribit': deribit,
257
258
  'digifinex': digifinex,
259
+ 'ellipx': ellipx,
258
260
  'exmo': exmo,
259
261
  'fmfwio': fmfwio,
260
262
  'gate': gate,
@@ -490,6 +492,7 @@ exports.currencycom = currencycom;
490
492
  exports.delta = delta;
491
493
  exports.deribit = deribit;
492
494
  exports.digifinex = digifinex;
495
+ exports.ellipx = ellipx;
493
496
  exports.exmo = exmo;
494
497
  exports.fmfwio = fmfwio;
495
498
  exports.gate = gate;
@@ -0,0 +1,9 @@
1
+ 'use strict';
2
+
3
+ var Exchange$1 = require('../base/Exchange.js');
4
+
5
+ // -------------------------------------------------------------------------------
6
+ class Exchange extends Exchange$1["default"] {
7
+ }
8
+
9
+ module.exports = Exchange;
@@ -51,6 +51,8 @@ class alpaca extends alpaca$1 {
51
51
  'closeAllPositions': false,
52
52
  'closePosition': false,
53
53
  'createOrder': true,
54
+ 'createStopOrder': true,
55
+ 'createTriggerOrder': true,
54
56
  'editOrder': true,
55
57
  'fetchBalance': false,
56
58
  'fetchBidsAsks': false,
@@ -116,6 +116,7 @@ class Exchange {
116
116
  this.last_request_path = undefined;
117
117
  this.id = 'Exchange';
118
118
  this.markets = undefined;
119
+ this.features = undefined;
119
120
  this.status = undefined;
120
121
  this.rateLimit = undefined; // milliseconds
121
122
  this.tokenBucket = undefined;
@@ -1960,7 +1961,7 @@ class Exchange {
1960
1961
  const entryFiledEqualValue = entry[field] === value;
1961
1962
  const firstCondition = valueIsDefined ? entryFiledEqualValue : true;
1962
1963
  const entryKeyValue = this.safeValue(entry, key);
1963
- const entryKeyGESince = (entryKeyValue) && since && (entryKeyValue >= since);
1964
+ const entryKeyGESince = (entryKeyValue) && (since !== undefined) && (entryKeyValue >= since);
1964
1965
  const secondCondition = sinceIsDefined ? entryKeyGESince : true;
1965
1966
  if (firstCondition && secondCondition) {
1966
1967
  result.push(entry);
@@ -1972,6 +1973,12 @@ class Exchange {
1972
1973
  }
1973
1974
  return this.filterByLimit(result, limit, key, sinceIsDefined);
1974
1975
  }
1976
+ /**
1977
+ * @method
1978
+ * @name Exchange#setSandboxMode
1979
+ * @description set the sandbox mode for the exchange
1980
+ * @param {boolean} enabled true to enable sandbox mode, false to disable it
1981
+ */
1975
1982
  setSandboxMode(enabled) {
1976
1983
  if (enabled) {
1977
1984
  if ('test' in this.urls) {
@@ -2316,6 +2323,94 @@ class Exchange {
2316
2323
  }
2317
2324
  afterConstruct() {
2318
2325
  this.createNetworksByIdObject();
2326
+ this.featuresGenerator();
2327
+ }
2328
+ featuresGenerator() {
2329
+ //
2330
+ // the exchange-specific features can be something like this, where we support 'string' aliases too:
2331
+ //
2332
+ // {
2333
+ // 'myItem' : {
2334
+ // 'createOrder' : {...},
2335
+ // 'fetchOrders' : {...},
2336
+ // },
2337
+ // 'swap': {
2338
+ // 'linear': 'myItem',
2339
+ // 'inverse': 'myItem',
2340
+ // },
2341
+ // 'future': {
2342
+ // 'linear': 'myItem',
2343
+ // 'inverse': 'myItem',
2344
+ // }
2345
+ // }
2346
+ //
2347
+ //
2348
+ //
2349
+ // this method would regenerate the blank features tree, eg:
2350
+ //
2351
+ // {
2352
+ // "spot": {
2353
+ // "createOrder": undefined,
2354
+ // "fetchBalance": undefined,
2355
+ // ...
2356
+ // },
2357
+ // "swap": {
2358
+ // ...
2359
+ // }
2360
+ // }
2361
+ //
2362
+ if (this.features === undefined) {
2363
+ return;
2364
+ }
2365
+ // reconstruct
2366
+ const initialFeatures = this.features;
2367
+ this.features = {};
2368
+ const unifiedMarketTypes = ['spot', 'swap', 'future', 'option'];
2369
+ const subTypes = ['linear', 'inverse'];
2370
+ // atm only support basic methods, eg: 'createOrder', 'fetchOrder', 'fetchOrders', 'fetchMyTrades'
2371
+ for (let i = 0; i < unifiedMarketTypes.length; i++) {
2372
+ const marketType = unifiedMarketTypes[i];
2373
+ // if marketType is not filled for this exchange, don't add that in `features`
2374
+ if (!(marketType in initialFeatures)) {
2375
+ this.features[marketType] = undefined;
2376
+ }
2377
+ else {
2378
+ if (marketType === 'spot') {
2379
+ this.features[marketType] = this.featuresMapper(initialFeatures, marketType, undefined);
2380
+ }
2381
+ else {
2382
+ this.features[marketType] = {};
2383
+ for (let j = 0; j < subTypes.length; j++) {
2384
+ const subType = subTypes[j];
2385
+ this.features[marketType][subType] = this.featuresMapper(initialFeatures, marketType, subType);
2386
+ }
2387
+ }
2388
+ }
2389
+ }
2390
+ }
2391
+ featuresMapper(initialFeatures, marketType, subType = undefined) {
2392
+ let featuresObj = (subType !== undefined) ? initialFeatures[marketType][subType] : initialFeatures[marketType];
2393
+ const extendsStr = this.safeString(featuresObj, 'extends');
2394
+ if (extendsStr !== undefined) {
2395
+ featuresObj = this.omit(featuresObj, 'extends');
2396
+ const extendObj = this.featuresMapper(initialFeatures, extendsStr);
2397
+ featuresObj = this.deepExtend(extendObj, featuresObj);
2398
+ }
2399
+ //
2400
+ // corrections
2401
+ //
2402
+ if ('createOrder' in featuresObj) {
2403
+ const value = this.safeDict(featuresObj['createOrder'], 'attachedStopLossTakeProfit');
2404
+ if (value !== undefined) {
2405
+ featuresObj['createOrder']['stopLoss'] = value;
2406
+ featuresObj['createOrder']['takeProfit'] = value;
2407
+ }
2408
+ // false 'hedged' for spot
2409
+ if (marketType === 'spot') {
2410
+ featuresObj['createOrder']['hedged'] = false;
2411
+ }
2412
+ }
2413
+ return featuresObj;
2319
2414
  }
2320
2415
  orderbookChecksumMessage(symbol) {
2321
2416
  return symbol + ' : ' + 'orderbook data checksum validation failed. You can reconnect by calling watchOrderBook again or you can mute the error by setting exchange.options["watchOrderBook"]["checksum"] = false';
@@ -3421,6 +3516,16 @@ class Exchange {
3421
3516
  }
3422
3517
  return result;
3423
3518
  }
3519
+ currencyIds(codes = undefined) {
3520
+ if (codes === undefined) {
3521
+ return codes;
3522
+ }
3523
+ const result = [];
3524
+ for (let i = 0; i < codes.length; i++) {
3525
+ result.push(this.currencyId(codes[i]));
3526
+ }
3527
+ return result;
3528
+ }
3424
3529
  marketsForSymbols(symbols = undefined) {
3425
3530
  if (symbols === undefined) {
3426
3531
  return symbols;
@@ -3847,6 +3952,16 @@ class Exchange {
3847
3952
  setHeaders(headers) {
3848
3953
  return headers;
3849
3954
  }
3955
+ currencyId(code) {
3956
+ let currency = this.safeDict(this.currencies, code);
3957
+ if (currency === undefined) {
3958
+ currency = this.safeCurrency(code);
3959
+ }
3960
+ if (currency !== undefined) {
3961
+ return currency['id'];
3962
+ }
3963
+ return code;
3964
+ }
3850
3965
  marketId(symbol) {
3851
3966
  const market = this.market(symbol);
3852
3967
  if (market !== undefined) {
@@ -1555,6 +1555,159 @@ class binance extends binance$1 {
1555
1555
  'BUSD': 'USD',
1556
1556
  },
1557
1557
  },
1558
+ 'features': {
1559
+ // https://developers.binance.com/docs/binance-spot-api-docs/rest-api#:~:text=quoteOrderQty
1560
+ 'spot': {
1561
+ 'sandbox': true,
1562
+ 'createOrder': {
1563
+ 'marginMode': true,
1564
+ 'triggerPrice': true,
1565
+ 'triggerPriceType': undefined,
1566
+ 'triggerDirection': false,
1567
+ 'stopLossPrice': true,
1568
+ 'takeProfitPrice': true,
1569
+ 'attachedStopLossTakeProfit': undefined,
1570
+ 'timeInForce': {
1571
+ 'GTC': true,
1572
+ 'IOC': true,
1573
+ 'FOK': true,
1574
+ 'PO': true,
1575
+ 'GTD': false,
1576
+ },
1577
+ 'hedged': true,
1578
+ // exchange-supported features
1579
+ 'selfTradePrevention': true,
1580
+ 'trailing': true,
1581
+ 'twap': false,
1582
+ 'iceberg': true,
1583
+ 'oco': false,
1584
+ },
1585
+ 'createOrders': undefined,
1586
+ 'fetchMyTrades': {
1587
+ 'marginMode': false,
1588
+ 'limit': 1000,
1589
+ 'daysBack': undefined,
1590
+ 'untilDays': 1, // days between start-end
1591
+ },
1592
+ 'fetchOrder': {
1593
+ 'marginMode': true,
1594
+ 'trigger': false,
1595
+ 'trailing': false,
1596
+ },
1597
+ 'fetchOpenOrders': {
1598
+ 'marginMode': true,
1599
+ 'limit': undefined,
1600
+ 'trigger': false,
1601
+ 'trailing': false,
1602
+ },
1603
+ 'fetchOrders': {
1604
+ 'marginMode': true,
1605
+ 'limit': 1000,
1606
+ 'daysBack': undefined,
1607
+ 'untilDays': 10000,
1608
+ 'trigger': false,
1609
+ 'trailing': false,
1610
+ },
1611
+ 'fetchClosedOrders': {
1612
+ 'marginMode': true,
1613
+ 'limit': 1000,
1614
+ 'daysBackClosed': undefined,
1615
+ 'daysBackCanceled': undefined,
1616
+ 'untilDays': 10000,
1617
+ 'trigger': false,
1618
+ 'trailing': false,
1619
+ },
1620
+ 'fetchOHLCV': {
1621
+ 'limit': 1000,
1622
+ },
1623
+ },
1624
+ 'default': {
1625
+ 'sandbox': true,
1626
+ 'createOrder': {
1627
+ 'marginMode': false,
1628
+ 'triggerPrice': true,
1629
+ 'triggerPriceType': {
1630
+ 'mark': true,
1631
+ 'last': true,
1632
+ 'index': false,
1633
+ },
1634
+ 'stopLossPrice': true,
1635
+ 'takeProfitPrice': true,
1636
+ 'attachedStopLossTakeProfit': undefined,
1637
+ 'timeInForce': {
1638
+ 'GTC': true,
1639
+ 'IOC': true,
1640
+ 'FOK': true,
1641
+ 'PO': true,
1642
+ 'GTD': true,
1643
+ // 'GTX': true,
1644
+ },
1645
+ 'hedged': true,
1646
+ // exchange-supported features
1647
+ 'selfTradePrevention': true,
1648
+ 'trailing': true,
1649
+ 'twap': false,
1650
+ 'iceberg': false,
1651
+ 'oco': false,
1652
+ },
1653
+ 'createOrders': {
1654
+ 'max': 5,
1655
+ },
1656
+ 'fetchMyTrades': {
1657
+ 'marginMode': false,
1658
+ 'daysBack': undefined,
1659
+ 'limit': 1000,
1660
+ 'untilDays': 7,
1661
+ },
1662
+ 'fetchOrder': {
1663
+ 'marginMode': false,
1664
+ 'trigger': false,
1665
+ 'trailing': false,
1666
+ },
1667
+ 'fetchOpenOrders': {
1668
+ 'marginMode': true,
1669
+ 'limit': 500,
1670
+ 'trigger': false,
1671
+ 'trailing': false,
1672
+ },
1673
+ 'fetchOrders': {
1674
+ 'marginMode': true,
1675
+ 'limit': 1000,
1676
+ 'daysBack': 90,
1677
+ 'untilDays': 7,
1678
+ 'trigger': false,
1679
+ 'trailing': false,
1680
+ },
1681
+ 'fetchClosedOrders': {
1682
+ 'marginMode': true,
1683
+ 'limit': 1000,
1684
+ 'daysBackClosed': 90,
1685
+ 'daysBackCanceled': 3,
1686
+ 'untilDays': 7,
1687
+ 'trigger': false,
1688
+ 'trailing': false,
1689
+ },
1690
+ 'fetchOHLCV': {
1691
+ 'limit': 1500,
1692
+ },
1693
+ },
1694
+ 'swap': {
1695
+ 'linear': {
1696
+ 'extends': 'default',
1697
+ },
1698
+ 'inverse': {
1699
+ 'extends': 'default',
1700
+ },
1701
+ },
1702
+ 'future': {
1703
+ 'linear': {
1704
+ 'extends': 'default',
1705
+ },
1706
+ 'inverse': {
1707
+ 'extends': 'default',
1708
+ },
1709
+ },
1710
+ },
1558
1711
  'exceptions': {
1559
1712
  'spot': {
1560
1713
  'exact': {
@@ -1950,12 +2103,15 @@ class binance extends binance$1 {
1950
2103
  '-4088': errors.PermissionDenied,
1951
2104
  '-4114': errors.BadRequest,
1952
2105
  '-4115': errors.BadRequest,
2106
+ '-4116': errors.InvalidOrder,
2107
+ '-4117': errors.OperationRejected,
1953
2108
  '-4118': errors.OperationRejected,
1954
2109
  '-4131': errors.OperationRejected,
1955
2110
  '-4140': errors.BadRequest,
1956
2111
  '-4141': errors.OperationRejected,
1957
2112
  '-4144': errors.BadSymbol,
1958
2113
  '-4164': errors.InvalidOrder,
2114
+ '-4136': errors.InvalidOrder,
1959
2115
  '-4165': errors.BadRequest,
1960
2116
  '-4167': errors.BadRequest,
1961
2117
  '-4168': errors.BadRequest,
@@ -6234,6 +6390,7 @@ class binance extends binance$1 {
6234
6390
  const typeRequest = isPortfolioMarginConditional ? 'strategyType' : 'type';
6235
6391
  request[typeRequest] = uppercaseType;
6236
6392
  // additional required fields depending on the order type
6393
+ const closePosition = this.safeBool(params, 'closePosition', false);
6237
6394
  let timeInForceIsRequired = false;
6238
6395
  let priceIsRequired = false;
6239
6396
  let stopPriceIsRequired = false;
@@ -6313,14 +6470,15 @@ class binance extends binance$1 {
6313
6470
  priceIsRequired = true;
6314
6471
  }
6315
6472
  else if ((uppercaseType === 'STOP_MARKET') || (uppercaseType === 'TAKE_PROFIT_MARKET')) {
6316
- const closePosition = this.safeBool(params, 'closePosition');
6317
- if (closePosition === undefined) {
6473
+ if (!closePosition) {
6318
6474
  quantityIsRequired = true;
6319
6475
  }
6320
6476
  stopPriceIsRequired = true;
6321
6477
  }
6322
6478
  else if (uppercaseType === 'TRAILING_STOP_MARKET') {
6323
- quantityIsRequired = true;
6479
+ if (!closePosition) {
6480
+ quantityIsRequired = true;
6481
+ }
6324
6482
  if (trailingPercent === undefined) {
6325
6483
  throw new errors.InvalidOrder(this.id + ' createOrder() requires a trailingPercent param for a ' + type + ' order');
6326
6484
  }
@@ -11771,13 +11929,13 @@ class binance extends binance$1 {
11771
11929
  getExceptionsByUrl(url, exactOrBroad) {
11772
11930
  let marketType = undefined;
11773
11931
  const hostname = (this.hostname !== undefined) ? this.hostname : 'binance.com';
11774
- if (url.startsWith('https://api.' + hostname + '/')) {
11932
+ if (url.startsWith('https://api.' + hostname + '/') || url.startsWith('https://testnet.binance.vision')) {
11775
11933
  marketType = 'spot';
11776
11934
  }
11777
- else if (url.startsWith('https://dapi.' + hostname + '/')) {
11935
+ else if (url.startsWith('https://dapi.' + hostname + '/') || url.startsWith('https://testnet.binancefuture.com/dapi')) {
11778
11936
  marketType = 'inverse';
11779
11937
  }
11780
- else if (url.startsWith('https://fapi.' + hostname + '/')) {
11938
+ else if (url.startsWith('https://fapi.' + hostname + '/') || url.startsWith('https://testnet.binancefuture.com/fapi')) {
11781
11939
  marketType = 'linear';
11782
11940
  }
11783
11941
  else if (url.startsWith('https://eapi.' + hostname + '/')) {