ccxt 4.1.13 → 4.1.16

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 (152) hide show
  1. package/CHANGELOG.md +219 -0
  2. package/CONTRIBUTING.md +1 -0
  3. package/README.md +3 -3
  4. package/dist/ccxt.browser.js +539 -189
  5. package/dist/ccxt.browser.min.js +9 -9
  6. package/dist/cjs/ccxt.js +1 -1
  7. package/dist/cjs/src/ascendex.js +1 -0
  8. package/dist/cjs/src/base/Exchange.js +3 -0
  9. package/dist/cjs/src/binance.js +6 -2
  10. package/dist/cjs/src/bingx.js +5 -3
  11. package/dist/cjs/src/bitget.js +357 -64
  12. package/dist/cjs/src/bitmart.js +2 -0
  13. package/dist/cjs/src/bitmex.js +6 -3
  14. package/dist/cjs/src/bittrex.js +7 -0
  15. package/dist/cjs/src/btcalpha.js +2 -1
  16. package/dist/cjs/src/btcturk.js +3 -0
  17. package/dist/cjs/src/cex.js +1 -0
  18. package/dist/cjs/src/coinbase.js +1 -0
  19. package/dist/cjs/src/coinbasepro.js +1 -0
  20. package/dist/cjs/src/coinex.js +2 -0
  21. package/dist/cjs/src/coinfalcon.js +1 -0
  22. package/dist/cjs/src/coinmate.js +1 -0
  23. package/dist/cjs/src/coinone.js +15 -5
  24. package/dist/cjs/src/cryptocom.js +25 -87
  25. package/dist/cjs/src/currencycom.js +1 -0
  26. package/dist/cjs/src/delta.js +1 -0
  27. package/dist/cjs/src/deribit.js +1 -0
  28. package/dist/cjs/src/digifinex.js +10 -8
  29. package/dist/cjs/src/exmo.js +1 -0
  30. package/dist/cjs/src/gate.js +3 -0
  31. package/dist/cjs/src/gemini.js +1 -0
  32. package/dist/cjs/src/hitbtc.js +1 -0
  33. package/dist/cjs/src/hollaex.js +1 -0
  34. package/dist/cjs/src/huobi.js +8 -0
  35. package/dist/cjs/src/huobijp.js +1 -0
  36. package/dist/cjs/src/idex.js +1 -0
  37. package/dist/cjs/src/independentreserve.js +1 -0
  38. package/dist/cjs/src/indodax.js +1 -0
  39. package/dist/cjs/src/kraken.js +10 -0
  40. package/dist/cjs/src/krakenfutures.js +1 -0
  41. package/dist/cjs/src/kucoin.js +1 -0
  42. package/dist/cjs/src/kucoinfutures.js +1 -0
  43. package/dist/cjs/src/kuna.js +1 -0
  44. package/dist/cjs/src/latoken.js +1 -0
  45. package/dist/cjs/src/lbank.js +1 -0
  46. package/dist/cjs/src/lbank2.js +2 -0
  47. package/dist/cjs/src/luno.js +1 -0
  48. package/dist/cjs/src/lykke.js +2 -1
  49. package/dist/cjs/src/mercado.js +1 -0
  50. package/dist/cjs/src/mexc.js +4 -1
  51. package/dist/cjs/src/ndax.js +1 -0
  52. package/dist/cjs/src/novadax.js +1 -0
  53. package/dist/cjs/src/oceanex.js +1 -0
  54. package/dist/cjs/src/phemex.js +2 -0
  55. package/dist/cjs/src/poloniex.js +1 -0
  56. package/dist/cjs/src/poloniexfutures.js +8 -2
  57. package/dist/cjs/src/pro/krakenfutures.js +14 -10
  58. package/dist/cjs/src/probit.js +1 -0
  59. package/dist/cjs/src/tidex.js +1 -0
  60. package/dist/cjs/src/timex.js +1 -0
  61. package/dist/cjs/src/tokocrypto.js +1 -0
  62. package/dist/cjs/src/upbit.js +1 -0
  63. package/dist/cjs/src/wavesexchange.js +1 -0
  64. package/dist/cjs/src/wazirx.js +2 -1
  65. package/dist/cjs/src/whitebit.js +1 -0
  66. package/dist/cjs/src/woo.js +1 -0
  67. package/dist/cjs/src/yobit.js +1 -0
  68. package/dist/cjs/src/zaif.js +1 -0
  69. package/dist/cjs/src/zonda.js +1 -0
  70. package/js/ccxt.d.ts +1 -1
  71. package/js/ccxt.js +1 -1
  72. package/js/src/abstract/binance.d.ts +4 -0
  73. package/js/src/abstract/binancecoinm.d.ts +4 -0
  74. package/js/src/abstract/binanceus.d.ts +4 -0
  75. package/js/src/abstract/binanceusdm.d.ts +4 -0
  76. package/js/src/abstract/btcturk.d.ts +3 -0
  77. package/js/src/abstract/kraken.d.ts +8 -0
  78. package/js/src/abstract/poloniexfutures.d.ts +6 -1
  79. package/js/src/ascendex.js +1 -0
  80. package/js/src/base/Exchange.d.ts +1 -0
  81. package/js/src/base/Exchange.js +3 -0
  82. package/js/src/binance.js +6 -2
  83. package/js/src/bingx.js +5 -3
  84. package/js/src/bitget.d.ts +28 -0
  85. package/js/src/bitget.js +357 -64
  86. package/js/src/bitmart.js +2 -0
  87. package/js/src/bitmex.js +6 -3
  88. package/js/src/bittrex.d.ts +2 -2
  89. package/js/src/bittrex.js +7 -0
  90. package/js/src/btcalpha.js +2 -1
  91. package/js/src/btcturk.js +3 -0
  92. package/js/src/cex.js +1 -0
  93. package/js/src/coinbase.js +1 -0
  94. package/js/src/coinbasepro.js +1 -0
  95. package/js/src/coinex.js +2 -0
  96. package/js/src/coinfalcon.js +1 -0
  97. package/js/src/coinmate.js +1 -0
  98. package/js/src/coinone.js +15 -5
  99. package/js/src/cryptocom.d.ts +0 -2
  100. package/js/src/cryptocom.js +25 -87
  101. package/js/src/currencycom.js +1 -0
  102. package/js/src/delta.js +1 -0
  103. package/js/src/deribit.js +1 -0
  104. package/js/src/digifinex.d.ts +3 -28
  105. package/js/src/digifinex.js +10 -8
  106. package/js/src/exmo.js +1 -0
  107. package/js/src/gate.d.ts +1 -0
  108. package/js/src/gate.js +3 -0
  109. package/js/src/gemini.d.ts +1 -0
  110. package/js/src/gemini.js +1 -0
  111. package/js/src/hitbtc.js +1 -0
  112. package/js/src/hollaex.js +1 -0
  113. package/js/src/huobi.js +8 -0
  114. package/js/src/huobijp.js +1 -0
  115. package/js/src/idex.js +1 -0
  116. package/js/src/independentreserve.js +1 -0
  117. package/js/src/indodax.js +1 -0
  118. package/js/src/kraken.js +10 -0
  119. package/js/src/krakenfutures.js +1 -0
  120. package/js/src/kucoin.js +1 -0
  121. package/js/src/kucoinfutures.js +1 -0
  122. package/js/src/kuna.js +1 -0
  123. package/js/src/latoken.js +1 -0
  124. package/js/src/lbank.js +1 -0
  125. package/js/src/lbank2.js +2 -0
  126. package/js/src/luno.js +1 -0
  127. package/js/src/lykke.js +2 -1
  128. package/js/src/mercado.js +1 -0
  129. package/js/src/mexc.js +4 -1
  130. package/js/src/ndax.js +1 -0
  131. package/js/src/novadax.js +1 -0
  132. package/js/src/oceanex.js +1 -0
  133. package/js/src/phemex.d.ts +2 -0
  134. package/js/src/phemex.js +2 -0
  135. package/js/src/poloniex.js +1 -0
  136. package/js/src/poloniexfutures.js +8 -2
  137. package/js/src/pro/krakenfutures.js +14 -10
  138. package/js/src/probit.js +1 -0
  139. package/js/src/tidex.js +1 -0
  140. package/js/src/timex.d.ts +1 -0
  141. package/js/src/timex.js +1 -0
  142. package/js/src/tokocrypto.js +1 -0
  143. package/js/src/upbit.js +1 -0
  144. package/js/src/wavesexchange.js +1 -0
  145. package/js/src/wazirx.js +2 -1
  146. package/js/src/whitebit.js +1 -0
  147. package/js/src/woo.js +1 -0
  148. package/js/src/yobit.js +1 -0
  149. package/js/src/zaif.js +1 -0
  150. package/js/src/zonda.js +1 -0
  151. package/package.json +1 -1
  152. package/skip-tests.json +141 -12
package/dist/cjs/ccxt.js CHANGED
@@ -180,7 +180,7 @@ var woo$1 = require('./src/pro/woo.js');
180
180
 
181
181
  //-----------------------------------------------------------------------------
182
182
  // this is updated by vss.js when building
183
- const version = '4.1.13';
183
+ const version = '4.1.16';
184
184
  Exchange["default"].ccxtVersion = version;
185
185
  const exchanges = {
186
186
  'ace': ace,
@@ -665,6 +665,7 @@ class ascendex extends ascendex$1 {
665
665
  'max': this.safeNumber(market, 'maxNotional'),
666
666
  },
667
667
  },
668
+ 'created': this.safeInteger(market, 'tradingStartTime'),
668
669
  'info': market,
669
670
  });
670
671
  }
@@ -1056,6 +1056,9 @@ class Exchange {
1056
1056
  convertToBigInt(value) {
1057
1057
  return BigInt(value); // used on XT
1058
1058
  }
1059
+ stringToCharsArray(value) {
1060
+ return value.split('');
1061
+ }
1059
1062
  valueIsDefined(value) {
1060
1063
  return value !== undefined && value !== null;
1061
1064
  }
@@ -247,7 +247,8 @@ class binance extends binance$1 {
247
247
  'margin/exchange-small-liability-history': 0.6667,
248
248
  'margin/next-hourly-interest-rate': 0.6667,
249
249
  'margin/capital-flow': 10,
250
- 'margin/delist-schedule': 0.6667,
250
+ 'margin/delist-schedule': 10,
251
+ 'margin/available-inventory': 0.3334,
251
252
  'loan/vip/loanable/data': 40,
252
253
  'loan/vip/collateral/data': 40,
253
254
  'loan/vip/request/data': 2.6668,
@@ -638,7 +639,8 @@ class binance extends binance$1 {
638
639
  'premiumIndexKlines': { 'cost': 1, 'byLimit': [[99, 1], [499, 2], [1000, 5], [10000, 10]] },
639
640
  'ticker/24hr': { 'cost': 1, 'noSymbol': 40 },
640
641
  'ticker/price': { 'cost': 1, 'noSymbol': 2 },
641
- 'ticker/bookTicker': { 'cost': 1, 'noSymbol': 2 },
642
+ 'ticker/bookTicker': { 'cost': 2, 'noSymbol': 5 },
643
+ 'constituents': 2,
642
644
  'openInterest': 1,
643
645
  },
644
646
  },
@@ -723,6 +725,8 @@ class binance extends binance$1 {
723
725
  'ticker/bookTicker': { 'cost': 1, 'noSymbol': 2 },
724
726
  'openInterest': 1,
725
727
  'indexInfo': 1,
728
+ 'assetIndex': { 'cost': 1, 'noSymbol': 10 },
729
+ 'constituents': 2,
726
730
  'apiTradingStatus': { 'cost': 1, 'noSymbol': 10 },
727
731
  'lvtKlines': 1,
728
732
  },
@@ -1553,7 +1553,7 @@ class bingx extends bingx$1 {
1553
1553
  'info': position,
1554
1554
  'id': this.safeString(position, 'positionId'),
1555
1555
  'symbol': this.safeSymbol(marketId, market, '-', 'swap'),
1556
- 'notional': this.safeString(position, 'positionAmt'),
1556
+ 'notional': this.safeNumber(position, 'positionAmt'),
1557
1557
  'marginMode': marginMode,
1558
1558
  'liquidationPrice': undefined,
1559
1559
  'entryPrice': this.safeNumber2(position, 'avgPrice', 'entryPrice'),
@@ -2697,8 +2697,10 @@ class bingx extends bingx$1 {
2697
2697
  const network = this.safeString(transaction, 'network');
2698
2698
  const currencyId = this.safeString(transaction, 'coin');
2699
2699
  let code = this.safeCurrencyCode(currencyId, currency);
2700
- if (code !== undefined && code.indexOf(network) >= 0) {
2701
- code = code.replace(network, '');
2700
+ if ((code !== undefined) && (code !== network) && code.indexOf(network) >= 0) {
2701
+ if (network !== undefined) {
2702
+ code = code.replace(network, '');
2703
+ }
2702
2704
  }
2703
2705
  const rawType = this.safeString(transaction, 'transferType');
2704
2706
  const type = (rawType === '0') ? 'deposit' : 'withdrawal';
@@ -25,11 +25,12 @@ class bitget extends bitget$1 {
25
25
  'has': {
26
26
  'CORS': undefined,
27
27
  'spot': true,
28
- 'margin': false,
28
+ 'margin': undefined,
29
29
  'swap': true,
30
30
  'future': true,
31
31
  'option': false,
32
32
  'addMargin': true,
33
+ 'borrowMargin': true,
33
34
  'cancelAllOrders': true,
34
35
  'cancelOrder': true,
35
36
  'cancelOrders': true,
@@ -88,6 +89,7 @@ class bitget extends bitget$1 {
88
89
  'fetchWithdrawal': false,
89
90
  'fetchWithdrawals': true,
90
91
  'reduceMargin': true,
92
+ 'repayMargin': true,
91
93
  'setLeverage': true,
92
94
  'setMarginMode': true,
93
95
  'setPositionMode': true,
@@ -1292,6 +1294,7 @@ class bitget extends bitget$1 {
1292
1294
  'max': undefined,
1293
1295
  },
1294
1296
  },
1297
+ 'created': undefined,
1295
1298
  'info': market,
1296
1299
  };
1297
1300
  }
@@ -2638,18 +2641,20 @@ class bitget extends bitget$1 {
2638
2641
  * @description query for balance and get the amount of funds available for trading or funds locked in orders
2639
2642
  * @see https://bitgetlimited.github.io/apidoc/en/spot/#get-account-assets
2640
2643
  * @see https://bitgetlimited.github.io/apidoc/en/mix/#get-account-list
2644
+ * @see https://bitgetlimited.github.io/apidoc/en/margin/#get-cross-assets
2645
+ * @see https://bitgetlimited.github.io/apidoc/en/margin/#get-isolated-assets
2641
2646
  * @param {object} [params] extra parameters specific to the bitget api endpoint
2642
2647
  * @returns {object} a [balance structure]{@link https://github.com/ccxt/ccxt/wiki/Manual#balance-structure}
2643
2648
  */
2644
2649
  const sandboxMode = this.safeValue(this.options, 'sandboxMode', false);
2645
2650
  await this.loadMarkets();
2646
- const [marketType, query] = this.handleMarketTypeAndParams('fetchBalance', undefined, params);
2647
- const method = this.getSupportedMapping(marketType, {
2648
- 'spot': 'privateSpotGetAccountAssets',
2649
- 'swap': 'privateMixGetAccountAccounts',
2650
- });
2651
2651
  const request = {};
2652
- if (marketType === 'swap') {
2652
+ let marketType = undefined;
2653
+ let marginMode = undefined;
2654
+ let response = undefined;
2655
+ [marketType, params] = this.handleMarketTypeAndParams('fetchBalance', undefined, params);
2656
+ [marginMode, params] = this.handleMarginModeAndParams('fetchBalance', params);
2657
+ if ((marketType === 'swap') || (marketType === 'future')) {
2653
2658
  let subType = undefined;
2654
2659
  [subType, params] = this.handleSubTypeAndParams('fetchBalance', undefined, params);
2655
2660
  let productType = (subType === 'linear') ? 'UMCBL' : 'DMCBL';
@@ -2657,45 +2662,106 @@ class bitget extends bitget$1 {
2657
2662
  productType = 'S' + productType;
2658
2663
  }
2659
2664
  request['productType'] = productType;
2665
+ response = await this.privateMixGetAccountAccounts(this.extend(request, params));
2666
+ }
2667
+ else if (marginMode === 'isolated') {
2668
+ response = await this.privateMarginGetIsolatedAccountAssets(this.extend(request, params));
2669
+ }
2670
+ else if (marginMode === 'cross') {
2671
+ response = await this.privateMarginGetCrossAccountAssets(this.extend(request, params));
2672
+ }
2673
+ else if (marketType === 'spot') {
2674
+ response = await this.privateSpotGetAccountAssets(this.extend(request, params));
2675
+ }
2676
+ else {
2677
+ throw new errors.NotSupported(this.id + ' fetchBalance() does not support ' + marketType + ' accounts');
2660
2678
  }
2661
- const response = await this[method](this.extend(request, query));
2662
2679
  // spot
2680
+ //
2663
2681
  // {
2664
- // code: '00000',
2665
- // msg: 'success',
2666
- // requestTime: 1645928868827,
2667
- // data: [
2668
- // {
2669
- // coinId: 1,
2670
- // coinName: 'BTC',
2671
- // available: '0.00070000',
2672
- // frozen: '0.00000000',
2673
- // lock: '0.00000000',
2674
- // uTime: '1645921706000'
2675
- // }
2676
- // ]
2682
+ // "code": "00000",
2683
+ // "msg": "success",
2684
+ // "requestTime": 1697507299139,
2685
+ // "data": [
2686
+ // {
2687
+ // "coinId": 1,
2688
+ // "coinName": "BTC",
2689
+ // "available": "0.00000000",
2690
+ // "frozen": "0.00000000",
2691
+ // "lock": "0.00000000",
2692
+ // "uTime": "1697248128000"
2693
+ // },
2694
+ // ]
2677
2695
  // }
2678
2696
  //
2679
2697
  // swap
2698
+ //
2680
2699
  // {
2681
- // code: '00000',
2682
- // msg: 'success',
2683
- // requestTime: 1645928929251,
2684
- // data: [
2685
- // {
2686
- // marginCoin: 'USDT',
2687
- // locked: '0',
2688
- // available: '8.078525',
2689
- // crossMaxAvailable: '8.078525',
2690
- // fixedMaxAvailable: '8.078525',
2691
- // maxTransferOut: '8.078525',
2692
- // equity: '10.02508',
2693
- // usdtEquity: '10.02508',
2694
- // btcEquity: '0.00026057027'
2695
- // }
2696
- // ]
2700
+ // "code": "00000",
2701
+ // "msg": "success",
2702
+ // "requestTime": 1697507505367,
2703
+ // "data": [
2704
+ // {
2705
+ // "marginCoin": "STETH",
2706
+ // "locked": "0",
2707
+ // "available": "0",
2708
+ // "crossMaxAvailable": "0",
2709
+ // "fixedMaxAvailable": "0",
2710
+ // "maxTransferOut": "0",
2711
+ // "equity": "0",
2712
+ // "usdtEquity": "0",
2713
+ // "btcEquity": "0",
2714
+ // "crossRiskRate": "0",
2715
+ // "unrealizedPL": "0",
2716
+ // "bonus": "0"
2717
+ // },
2718
+ // ]
2697
2719
  // }
2698
- const data = this.safeValue(response, 'data');
2720
+ //
2721
+ // isolated margin
2722
+ //
2723
+ // {
2724
+ // "code": "00000",
2725
+ // "msg": "success",
2726
+ // "requestTime": 1697501436571,
2727
+ // "data": [
2728
+ // {
2729
+ // "symbol": "BTCUSDT",
2730
+ // "coin": "BTC",
2731
+ // "totalAmount": "0.00021654",
2732
+ // "available": "0.00021654",
2733
+ // "transferable": "0.00021654",
2734
+ // "frozen": "0",
2735
+ // "borrow": "0",
2736
+ // "interest": "0",
2737
+ // "net": "0.00021654",
2738
+ // "ctime": "1697248128071"
2739
+ // },
2740
+ // ]
2741
+ // }
2742
+ //
2743
+ // cross margin
2744
+ //
2745
+ // {
2746
+ // "code": "00000",
2747
+ // "msg": "success",
2748
+ // "requestTime": 1697515463804,
2749
+ // "data": [
2750
+ // {
2751
+ // "coin": "BTC",
2752
+ // "totalAmount": "0.00024996",
2753
+ // "available": "0.00024996",
2754
+ // "transferable": "0.00004994",
2755
+ // "frozen": "0",
2756
+ // "borrow": "0.0001",
2757
+ // "interest": "0.00000001",
2758
+ // "net": "0.00014995",
2759
+ // "ctime": "1697251265504"
2760
+ // },
2761
+ // ]
2762
+ // }
2763
+ //
2764
+ const data = this.safeValue(response, 'data', []);
2699
2765
  return this.parseBalance(data);
2700
2766
  }
2701
2767
  parseBalance(balance) {
@@ -2704,42 +2770,81 @@ class bitget extends bitget$1 {
2704
2770
  // spot
2705
2771
  //
2706
2772
  // {
2707
- // coinId: '1',
2708
- // coinName: 'BTC',
2709
- // available: '0.00099900',
2710
- // frozen: '0.00000000',
2711
- // lock: '0.00000000',
2712
- // uTime: '1661595535000'
2773
+ // "coinId": 1,
2774
+ // "coinName": "BTC",
2775
+ // "available": "0.00000000",
2776
+ // "frozen": "0.00000000",
2777
+ // "lock": "0.00000000",
2778
+ // "uTime": "1697248128000"
2713
2779
  // }
2714
2780
  //
2715
2781
  // swap
2716
2782
  //
2717
2783
  // {
2718
- // marginCoin: 'BTC',
2719
- // locked: '0.00001948',
2720
- // available: '0.00006622',
2721
- // crossMaxAvailable: '0.00004674',
2722
- // fixedMaxAvailable: '0.00004674',
2723
- // maxTransferOut: '0.00004674',
2724
- // equity: '0.00006622',
2725
- // usdtEquity: '1.734307497491',
2726
- // btcEquity: '0.000066229058',
2727
- // crossRiskRate: '0.066308887072',
2728
- // unrealizedPL: '0',
2729
- // bonus: '0'
2784
+ // "marginCoin": "STETH",
2785
+ // "locked": "0",
2786
+ // "available": "0",
2787
+ // "crossMaxAvailable": "0",
2788
+ // "fixedMaxAvailable": "0",
2789
+ // "maxTransferOut": "0",
2790
+ // "equity": "0",
2791
+ // "usdtEquity": "0",
2792
+ // "btcEquity": "0",
2793
+ // "crossRiskRate": "0",
2794
+ // "unrealizedPL": "0",
2795
+ // "bonus": "0"
2796
+ // }
2797
+ //
2798
+ // isolated margin
2799
+ //
2800
+ // {
2801
+ // "symbol": "BTCUSDT",
2802
+ // "coin": "BTC",
2803
+ // "totalAmount": "0.00021654",
2804
+ // "available": "0.00021654",
2805
+ // "transferable": "0.00021654",
2806
+ // "frozen": "0",
2807
+ // "borrow": "0",
2808
+ // "interest": "0",
2809
+ // "net": "0.00021654",
2810
+ // "ctime": "1697248128071"
2811
+ // }
2812
+ //
2813
+ // cross margin
2814
+ //
2815
+ // {
2816
+ // "coin": "BTC",
2817
+ // "totalAmount": "0.00024995",
2818
+ // "available": "0.00024995",
2819
+ // "transferable": "0.00004993",
2820
+ // "frozen": "0",
2821
+ // "borrow": "0.0001",
2822
+ // "interest": "0.00000001",
2823
+ // "net": "0.00014994",
2824
+ // "ctime": "1697251265504"
2730
2825
  // }
2731
2826
  //
2732
2827
  for (let i = 0; i < balance.length; i++) {
2733
2828
  const entry = balance[i];
2734
- const currencyId = this.safeString2(entry, 'coinName', 'marginCoin');
2735
- const code = this.safeCurrencyCode(currencyId);
2736
2829
  const account = this.account();
2737
- const spotAccountFree = this.safeString(entry, 'available');
2738
- const contractAccountFree = this.safeString(entry, 'maxTransferOut');
2739
- account['free'] = (contractAccountFree !== undefined) ? contractAccountFree : spotAccountFree;
2740
- const frozen = this.safeString(entry, 'frozen');
2741
- const locked = this.safeString2(entry, 'lock', 'locked');
2742
- account['used'] = Precise["default"].stringAdd(frozen, locked);
2830
+ const currencyId = this.safeStringN(entry, ['coinName', 'marginCoin', 'coin']);
2831
+ const code = this.safeCurrencyCode(currencyId);
2832
+ const borrow = this.safeString(entry, 'borrow');
2833
+ if (borrow !== undefined) {
2834
+ const interest = this.safeString(entry, 'interest');
2835
+ account['free'] = this.safeString(entry, 'transferable');
2836
+ account['total'] = this.safeString(entry, 'totalAmount');
2837
+ account['debt'] = Precise["default"].stringAdd(borrow, interest);
2838
+ }
2839
+ else {
2840
+ // Use transferable instead of available for swap and margin https://github.com/ccxt/ccxt/pull/19127
2841
+ const spotAccountFree = this.safeString(entry, 'available');
2842
+ const contractAccountFree = this.safeString(entry, 'maxTransferOut');
2843
+ account['free'] = (contractAccountFree !== undefined) ? contractAccountFree : spotAccountFree;
2844
+ const frozen = this.safeString(entry, 'frozen');
2845
+ const locked = this.safeString2(entry, 'lock', 'locked');
2846
+ account['used'] = Precise["default"].stringAdd(frozen, locked);
2847
+ }
2743
2848
  result[code] = account;
2744
2849
  }
2745
2850
  return this.safeBalance(result);
@@ -5198,6 +5303,194 @@ class bitget extends bitget$1 {
5198
5303
  'info': interest,
5199
5304
  }, market);
5200
5305
  }
5306
+ async borrowMargin(code, amount, symbol = undefined, params = {}) {
5307
+ /**
5308
+ * @method
5309
+ * @name bitget#borrowMargin
5310
+ * @description create a loan to borrow margin
5311
+ * @see https://bitgetlimited.github.io/apidoc/en/margin/#cross-borrow
5312
+ * @see https://bitgetlimited.github.io/apidoc/en/margin/#isolated-borrow
5313
+ * @param {string} code unified currency code of the currency to borrow
5314
+ * @param {string} amount the amount to borrow
5315
+ * @param {string} [symbol] unified market symbol
5316
+ * @param {object} [params] extra parameters specific to the bitget api endpoint
5317
+ * @param {string} [params.marginMode] 'isolated' or 'cross', symbol is required for 'isolated'
5318
+ * @returns {object} a [margin loan structure]{@link https://github.com/ccxt/ccxt/wiki/Manual#margin-loan-structure}
5319
+ */
5320
+ await this.loadMarkets();
5321
+ const currency = this.currency(code);
5322
+ const request = {
5323
+ 'coin': currency['info']['coinName'],
5324
+ 'borrowAmount': this.currencyToPrecision(code, amount),
5325
+ };
5326
+ let response = undefined;
5327
+ let marginMode = undefined;
5328
+ [marginMode, params] = this.handleMarginModeAndParams('borrowMargin', params);
5329
+ if ((symbol !== undefined) || (marginMode === 'isolated')) {
5330
+ this.checkRequiredSymbol('borrowMargin', symbol);
5331
+ const market = this.market(symbol);
5332
+ const marketId = market['id'];
5333
+ const parts = marketId.split('_');
5334
+ const marginMarketId = this.safeStringUpper(parts, 0);
5335
+ request['symbol'] = marginMarketId;
5336
+ response = await this.privateMarginPostIsolatedAccountBorrow(this.extend(request, params));
5337
+ }
5338
+ else {
5339
+ response = await this.privateMarginPostCrossAccountBorrow(this.extend(request, params));
5340
+ }
5341
+ //
5342
+ // isolated
5343
+ //
5344
+ // {
5345
+ // "code": "00000",
5346
+ // "msg": "success",
5347
+ // "requestTime": 1697250952516,
5348
+ // "data": {
5349
+ // "clientOid": null,
5350
+ // "symbol": "BTCUSDT",
5351
+ // "coin": "BTC",
5352
+ // "borrowAmount": "0.001"
5353
+ // }
5354
+ // }
5355
+ //
5356
+ // cross
5357
+ //
5358
+ // {
5359
+ // "code": "00000",
5360
+ // "msg": "success",
5361
+ // "requestTime": 1697251314271,
5362
+ // "data": {
5363
+ // "clientOid": null,
5364
+ // "coin": "BTC",
5365
+ // "borrowAmount": "0.0001"
5366
+ // }
5367
+ // }
5368
+ //
5369
+ const data = this.safeValue(response, 'data', {});
5370
+ return this.parseMarginLoan(data, currency);
5371
+ }
5372
+ async repayMargin(code, amount, symbol = undefined, params = {}) {
5373
+ /**
5374
+ * @method
5375
+ * @name bitget#repayMargin
5376
+ * @description repay borrowed margin and interest
5377
+ * @see https://bitgetlimited.github.io/apidoc/en/margin/#cross-repay
5378
+ * @see https://bitgetlimited.github.io/apidoc/en/margin/#isolated-repay
5379
+ * @param {string} code unified currency code of the currency to repay
5380
+ * @param {string} amount the amount to repay
5381
+ * @param {string} [symbol] unified market symbol
5382
+ * @param {object} [params] extra parameters specific to the bitget api endpoint
5383
+ * @param {string} [params.marginMode] 'isolated' or 'cross', symbol is required for 'isolated'
5384
+ * @returns {object} a [margin loan structure]{@link https://github.com/ccxt/ccxt/wiki/Manual#margin-loan-structure}
5385
+ */
5386
+ await this.loadMarkets();
5387
+ const currency = this.currency(code);
5388
+ const request = {
5389
+ 'coin': currency['info']['coinName'],
5390
+ 'repayAmount': this.currencyToPrecision(code, amount),
5391
+ };
5392
+ let response = undefined;
5393
+ let marginMode = undefined;
5394
+ [marginMode, params] = this.handleMarginModeAndParams('repayMargin', params);
5395
+ if ((symbol !== undefined) || (marginMode === 'isolated')) {
5396
+ this.checkRequiredSymbol('repayMargin', symbol);
5397
+ const market = this.market(symbol);
5398
+ const marketId = market['id'];
5399
+ const parts = marketId.split('_');
5400
+ const marginMarketId = this.safeStringUpper(parts, 0);
5401
+ request['symbol'] = marginMarketId;
5402
+ response = await this.privateMarginPostIsolatedAccountRepay(this.extend(request, params));
5403
+ }
5404
+ else {
5405
+ response = await this.privateMarginPostCrossAccountRepay(this.extend(request, params));
5406
+ }
5407
+ //
5408
+ // isolated
5409
+ //
5410
+ // {
5411
+ // "code": "00000",
5412
+ // "msg": "success",
5413
+ // "requestTime": 1697251988593,
5414
+ // "data": {
5415
+ // "remainDebtAmount": "0",
5416
+ // "clientOid": null,
5417
+ // "symbol": "BTCUSDT",
5418
+ // "coin": "BTC",
5419
+ // "repayAmount": "0.00100001"
5420
+ // }
5421
+ // }
5422
+ //
5423
+ // cross
5424
+ //
5425
+ // {
5426
+ // "code": "00000",
5427
+ // "msg": "success",
5428
+ // "requestTime": 1697252151042,
5429
+ // "data": {
5430
+ // "remainDebtAmount": "0",
5431
+ // "clientOid": null,
5432
+ // "coin": "BTC",
5433
+ // "repayAmount": "0.00010001"
5434
+ // }
5435
+ // }
5436
+ //
5437
+ const data = this.safeValue(response, 'data', {});
5438
+ return this.parseMarginLoan(data, currency);
5439
+ }
5440
+ parseMarginLoan(info, currency = undefined) {
5441
+ //
5442
+ // isolated: borrowMargin
5443
+ //
5444
+ // {
5445
+ // "clientOid": null,
5446
+ // "symbol": "BTCUSDT",
5447
+ // "coin": "BTC",
5448
+ // "borrowAmount": "0.001"
5449
+ // }
5450
+ //
5451
+ // cross: borrowMargin
5452
+ //
5453
+ // {
5454
+ // "clientOid": null,
5455
+ // "coin": "BTC",
5456
+ // "borrowAmount": "0.0001"
5457
+ // }
5458
+ //
5459
+ // isolated: repayMargin
5460
+ //
5461
+ // {
5462
+ // "remainDebtAmount": "0",
5463
+ // "clientOid": null,
5464
+ // "symbol": "BTCUSDT",
5465
+ // "coin": "BTC",
5466
+ // "repayAmount": "0.00100001"
5467
+ // }
5468
+ //
5469
+ // cross: repayMargin
5470
+ //
5471
+ // {
5472
+ // "remainDebtAmount": "0",
5473
+ // "clientOid": null,
5474
+ // "coin": "BTC",
5475
+ // "repayAmount": "0.00010001"
5476
+ // }
5477
+ //
5478
+ const currencyId = this.safeString(info, 'coin');
5479
+ const marketId = this.safeString(info, 'symbol');
5480
+ let symbol = undefined;
5481
+ if (marketId !== undefined) {
5482
+ symbol = this.safeSymbol(marketId);
5483
+ }
5484
+ return {
5485
+ 'id': this.safeString(info, 'clientOid'),
5486
+ 'currency': this.safeCurrencyCode(currencyId, currency),
5487
+ 'amount': this.safeNumber2(info, 'borrowAmount', 'repayAmount'),
5488
+ 'symbol': symbol,
5489
+ 'timestamp': undefined,
5490
+ 'datetime': undefined,
5491
+ 'info': info,
5492
+ };
5493
+ }
5201
5494
  handleErrors(code, reason, url, method, headers, body, response, requestHeaders, requestBody) {
5202
5495
  if (!response) {
5203
5496
  return undefined; // fallback to default error handler
@@ -757,6 +757,7 @@ class bitmart extends bitmart$1 {
757
757
  'max': undefined,
758
758
  },
759
759
  },
760
+ 'created': undefined,
760
761
  'info': market,
761
762
  });
762
763
  }
@@ -863,6 +864,7 @@ class bitmart extends bitmart$1 {
863
864
  'max': undefined,
864
865
  },
865
866
  },
867
+ 'created': this.safeInteger(market, 'open_timestamp'),
866
868
  'info': market,
867
869
  });
868
870
  }
@@ -660,6 +660,7 @@ class bitmex extends bitmex$1 {
660
660
  'max': positionIsQuote ? maxOrderQty : undefined,
661
661
  },
662
662
  },
663
+ 'created': this.parse8601(this.safeString(market, 'listing')),
663
664
  'info': market,
664
665
  });
665
666
  }
@@ -1040,6 +1041,7 @@ class bitmex extends bitmex$1 {
1040
1041
  'Deposit': 'transaction',
1041
1042
  'Transfer': 'transfer',
1042
1043
  'AffiliatePayout': 'referral',
1044
+ 'SpotTrade': 'trade',
1043
1045
  };
1044
1046
  return this.safeString(types, type, type);
1045
1047
  }
@@ -1577,9 +1579,9 @@ class bitmex extends bitmex$1 {
1577
1579
  const feeCurrencyCode = this.safeCurrencyCode(currencyId);
1578
1580
  const feeRateString = this.safeString(trade, 'commission');
1579
1581
  fee = {
1580
- 'cost': feeCostString,
1582
+ 'cost': Precise["default"].stringAbs(feeCostString),
1581
1583
  'currency': feeCurrencyCode,
1582
- 'rate': feeRateString,
1584
+ 'rate': Precise["default"].stringAbs(feeRateString),
1583
1585
  };
1584
1586
  }
1585
1587
  // Trade or Funding
@@ -2107,7 +2109,8 @@ class bitmex extends bitmex$1 {
2107
2109
  // }
2108
2110
  // ]
2109
2111
  //
2110
- return this.parsePositions(response, symbols);
2112
+ const results = this.parsePositions(response, symbols);
2113
+ return this.filterByArrayPositions(results, 'symbol', symbols, false);
2111
2114
  }
2112
2115
  parsePosition(position, market = undefined) {
2113
2116
  //