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/js/src/binance.js CHANGED
@@ -250,7 +250,8 @@ export default class binance extends Exchange {
250
250
  'margin/exchange-small-liability-history': 0.6667,
251
251
  'margin/next-hourly-interest-rate': 0.6667,
252
252
  'margin/capital-flow': 10,
253
- 'margin/delist-schedule': 0.6667,
253
+ 'margin/delist-schedule': 10,
254
+ 'margin/available-inventory': 0.3334,
254
255
  'loan/vip/loanable/data': 40,
255
256
  'loan/vip/collateral/data': 40,
256
257
  'loan/vip/request/data': 2.6668,
@@ -641,7 +642,8 @@ export default class binance extends Exchange {
641
642
  'premiumIndexKlines': { 'cost': 1, 'byLimit': [[99, 1], [499, 2], [1000, 5], [10000, 10]] },
642
643
  'ticker/24hr': { 'cost': 1, 'noSymbol': 40 },
643
644
  'ticker/price': { 'cost': 1, 'noSymbol': 2 },
644
- 'ticker/bookTicker': { 'cost': 1, 'noSymbol': 2 },
645
+ 'ticker/bookTicker': { 'cost': 2, 'noSymbol': 5 },
646
+ 'constituents': 2,
645
647
  'openInterest': 1,
646
648
  },
647
649
  },
@@ -726,6 +728,8 @@ export default class binance extends Exchange {
726
728
  'ticker/bookTicker': { 'cost': 1, 'noSymbol': 2 },
727
729
  'openInterest': 1,
728
730
  'indexInfo': 1,
731
+ 'assetIndex': { 'cost': 1, 'noSymbol': 10 },
732
+ 'constituents': 2,
729
733
  'apiTradingStatus': { 'cost': 1, 'noSymbol': 10 },
730
734
  'lvtKlines': 1,
731
735
  },
package/js/src/bingx.js CHANGED
@@ -1556,7 +1556,7 @@ export default class bingx extends Exchange {
1556
1556
  'info': position,
1557
1557
  'id': this.safeString(position, 'positionId'),
1558
1558
  'symbol': this.safeSymbol(marketId, market, '-', 'swap'),
1559
- 'notional': this.safeString(position, 'positionAmt'),
1559
+ 'notional': this.safeNumber(position, 'positionAmt'),
1560
1560
  'marginMode': marginMode,
1561
1561
  'liquidationPrice': undefined,
1562
1562
  'entryPrice': this.safeNumber2(position, 'avgPrice', 'entryPrice'),
@@ -2700,8 +2700,10 @@ export default class bingx extends Exchange {
2700
2700
  const network = this.safeString(transaction, 'network');
2701
2701
  const currencyId = this.safeString(transaction, 'coin');
2702
2702
  let code = this.safeCurrencyCode(currencyId, currency);
2703
- if (code !== undefined && code.indexOf(network) >= 0) {
2704
- code = code.replace(network, '');
2703
+ if ((code !== undefined) && (code !== network) && code.indexOf(network) >= 0) {
2704
+ if (network !== undefined) {
2705
+ code = code.replace(network, '');
2706
+ }
2705
2707
  }
2706
2708
  const rawType = this.safeString(transaction, 'transferType');
2707
2709
  const type = (rawType === '0') ? 'deposit' : 'withdrawal';
@@ -58,6 +58,7 @@ export default class bitget extends Exchange {
58
58
  max: any;
59
59
  };
60
60
  };
61
+ created: any;
61
62
  info: any;
62
63
  };
63
64
  fetchMarketsByType(type: any, params?: {}): Promise<any[]>;
@@ -286,6 +287,33 @@ export default class bitget extends Exchange {
286
287
  fetchDepositWithdrawFees(codes?: string[], params?: {}): Promise<any>;
287
288
  parseTransferStatus(status: any): string;
288
289
  parseOpenInterest(interest: any, market?: any): import("./base/types.js").OpenInterest;
290
+ borrowMargin(code: string, amount: any, symbol?: string, params?: {}): Promise<{
291
+ id: string;
292
+ currency: any;
293
+ amount: number;
294
+ symbol: any;
295
+ timestamp: any;
296
+ datetime: any;
297
+ info: any;
298
+ }>;
299
+ repayMargin(code: string, amount: any, symbol?: string, params?: {}): Promise<{
300
+ id: string;
301
+ currency: any;
302
+ amount: number;
303
+ symbol: any;
304
+ timestamp: any;
305
+ datetime: any;
306
+ info: any;
307
+ }>;
308
+ parseMarginLoan(info: any, currency?: any): {
309
+ id: string;
310
+ currency: any;
311
+ amount: number;
312
+ symbol: any;
313
+ timestamp: any;
314
+ datetime: any;
315
+ info: any;
316
+ };
289
317
  handleErrors(code: any, reason: any, url: any, method: any, headers: any, body: any, response: any, requestHeaders: any, requestBody: any): any;
290
318
  sign(path: any, api?: any[], method?: string, params?: {}, headers?: any, body?: any): {
291
319
  url: string;
package/js/src/bitget.js CHANGED
@@ -28,11 +28,12 @@ export default class bitget extends Exchange {
28
28
  'has': {
29
29
  'CORS': undefined,
30
30
  'spot': true,
31
- 'margin': false,
31
+ 'margin': undefined,
32
32
  'swap': true,
33
33
  'future': true,
34
34
  'option': false,
35
35
  'addMargin': true,
36
+ 'borrowMargin': true,
36
37
  'cancelAllOrders': true,
37
38
  'cancelOrder': true,
38
39
  'cancelOrders': true,
@@ -91,6 +92,7 @@ export default class bitget extends Exchange {
91
92
  'fetchWithdrawal': false,
92
93
  'fetchWithdrawals': true,
93
94
  'reduceMargin': true,
95
+ 'repayMargin': true,
94
96
  'setLeverage': true,
95
97
  'setMarginMode': true,
96
98
  'setPositionMode': true,
@@ -1295,6 +1297,7 @@ export default class bitget extends Exchange {
1295
1297
  'max': undefined,
1296
1298
  },
1297
1299
  },
1300
+ 'created': undefined,
1298
1301
  'info': market,
1299
1302
  };
1300
1303
  }
@@ -2641,18 +2644,20 @@ export default class bitget extends Exchange {
2641
2644
  * @description query for balance and get the amount of funds available for trading or funds locked in orders
2642
2645
  * @see https://bitgetlimited.github.io/apidoc/en/spot/#get-account-assets
2643
2646
  * @see https://bitgetlimited.github.io/apidoc/en/mix/#get-account-list
2647
+ * @see https://bitgetlimited.github.io/apidoc/en/margin/#get-cross-assets
2648
+ * @see https://bitgetlimited.github.io/apidoc/en/margin/#get-isolated-assets
2644
2649
  * @param {object} [params] extra parameters specific to the bitget api endpoint
2645
2650
  * @returns {object} a [balance structure]{@link https://github.com/ccxt/ccxt/wiki/Manual#balance-structure}
2646
2651
  */
2647
2652
  const sandboxMode = this.safeValue(this.options, 'sandboxMode', false);
2648
2653
  await this.loadMarkets();
2649
- const [marketType, query] = this.handleMarketTypeAndParams('fetchBalance', undefined, params);
2650
- const method = this.getSupportedMapping(marketType, {
2651
- 'spot': 'privateSpotGetAccountAssets',
2652
- 'swap': 'privateMixGetAccountAccounts',
2653
- });
2654
2654
  const request = {};
2655
- if (marketType === 'swap') {
2655
+ let marketType = undefined;
2656
+ let marginMode = undefined;
2657
+ let response = undefined;
2658
+ [marketType, params] = this.handleMarketTypeAndParams('fetchBalance', undefined, params);
2659
+ [marginMode, params] = this.handleMarginModeAndParams('fetchBalance', params);
2660
+ if ((marketType === 'swap') || (marketType === 'future')) {
2656
2661
  let subType = undefined;
2657
2662
  [subType, params] = this.handleSubTypeAndParams('fetchBalance', undefined, params);
2658
2663
  let productType = (subType === 'linear') ? 'UMCBL' : 'DMCBL';
@@ -2660,45 +2665,106 @@ export default class bitget extends Exchange {
2660
2665
  productType = 'S' + productType;
2661
2666
  }
2662
2667
  request['productType'] = productType;
2668
+ response = await this.privateMixGetAccountAccounts(this.extend(request, params));
2669
+ }
2670
+ else if (marginMode === 'isolated') {
2671
+ response = await this.privateMarginGetIsolatedAccountAssets(this.extend(request, params));
2672
+ }
2673
+ else if (marginMode === 'cross') {
2674
+ response = await this.privateMarginGetCrossAccountAssets(this.extend(request, params));
2675
+ }
2676
+ else if (marketType === 'spot') {
2677
+ response = await this.privateSpotGetAccountAssets(this.extend(request, params));
2678
+ }
2679
+ else {
2680
+ throw new NotSupported(this.id + ' fetchBalance() does not support ' + marketType + ' accounts');
2663
2681
  }
2664
- const response = await this[method](this.extend(request, query));
2665
2682
  // spot
2683
+ //
2666
2684
  // {
2667
- // code: '00000',
2668
- // msg: 'success',
2669
- // requestTime: 1645928868827,
2670
- // data: [
2671
- // {
2672
- // coinId: 1,
2673
- // coinName: 'BTC',
2674
- // available: '0.00070000',
2675
- // frozen: '0.00000000',
2676
- // lock: '0.00000000',
2677
- // uTime: '1645921706000'
2678
- // }
2679
- // ]
2685
+ // "code": "00000",
2686
+ // "msg": "success",
2687
+ // "requestTime": 1697507299139,
2688
+ // "data": [
2689
+ // {
2690
+ // "coinId": 1,
2691
+ // "coinName": "BTC",
2692
+ // "available": "0.00000000",
2693
+ // "frozen": "0.00000000",
2694
+ // "lock": "0.00000000",
2695
+ // "uTime": "1697248128000"
2696
+ // },
2697
+ // ]
2680
2698
  // }
2681
2699
  //
2682
2700
  // swap
2701
+ //
2683
2702
  // {
2684
- // code: '00000',
2685
- // msg: 'success',
2686
- // requestTime: 1645928929251,
2687
- // data: [
2688
- // {
2689
- // marginCoin: 'USDT',
2690
- // locked: '0',
2691
- // available: '8.078525',
2692
- // crossMaxAvailable: '8.078525',
2693
- // fixedMaxAvailable: '8.078525',
2694
- // maxTransferOut: '8.078525',
2695
- // equity: '10.02508',
2696
- // usdtEquity: '10.02508',
2697
- // btcEquity: '0.00026057027'
2698
- // }
2699
- // ]
2703
+ // "code": "00000",
2704
+ // "msg": "success",
2705
+ // "requestTime": 1697507505367,
2706
+ // "data": [
2707
+ // {
2708
+ // "marginCoin": "STETH",
2709
+ // "locked": "0",
2710
+ // "available": "0",
2711
+ // "crossMaxAvailable": "0",
2712
+ // "fixedMaxAvailable": "0",
2713
+ // "maxTransferOut": "0",
2714
+ // "equity": "0",
2715
+ // "usdtEquity": "0",
2716
+ // "btcEquity": "0",
2717
+ // "crossRiskRate": "0",
2718
+ // "unrealizedPL": "0",
2719
+ // "bonus": "0"
2720
+ // },
2721
+ // ]
2700
2722
  // }
2701
- const data = this.safeValue(response, 'data');
2723
+ //
2724
+ // isolated margin
2725
+ //
2726
+ // {
2727
+ // "code": "00000",
2728
+ // "msg": "success",
2729
+ // "requestTime": 1697501436571,
2730
+ // "data": [
2731
+ // {
2732
+ // "symbol": "BTCUSDT",
2733
+ // "coin": "BTC",
2734
+ // "totalAmount": "0.00021654",
2735
+ // "available": "0.00021654",
2736
+ // "transferable": "0.00021654",
2737
+ // "frozen": "0",
2738
+ // "borrow": "0",
2739
+ // "interest": "0",
2740
+ // "net": "0.00021654",
2741
+ // "ctime": "1697248128071"
2742
+ // },
2743
+ // ]
2744
+ // }
2745
+ //
2746
+ // cross margin
2747
+ //
2748
+ // {
2749
+ // "code": "00000",
2750
+ // "msg": "success",
2751
+ // "requestTime": 1697515463804,
2752
+ // "data": [
2753
+ // {
2754
+ // "coin": "BTC",
2755
+ // "totalAmount": "0.00024996",
2756
+ // "available": "0.00024996",
2757
+ // "transferable": "0.00004994",
2758
+ // "frozen": "0",
2759
+ // "borrow": "0.0001",
2760
+ // "interest": "0.00000001",
2761
+ // "net": "0.00014995",
2762
+ // "ctime": "1697251265504"
2763
+ // },
2764
+ // ]
2765
+ // }
2766
+ //
2767
+ const data = this.safeValue(response, 'data', []);
2702
2768
  return this.parseBalance(data);
2703
2769
  }
2704
2770
  parseBalance(balance) {
@@ -2707,42 +2773,81 @@ export default class bitget extends Exchange {
2707
2773
  // spot
2708
2774
  //
2709
2775
  // {
2710
- // coinId: '1',
2711
- // coinName: 'BTC',
2712
- // available: '0.00099900',
2713
- // frozen: '0.00000000',
2714
- // lock: '0.00000000',
2715
- // uTime: '1661595535000'
2776
+ // "coinId": 1,
2777
+ // "coinName": "BTC",
2778
+ // "available": "0.00000000",
2779
+ // "frozen": "0.00000000",
2780
+ // "lock": "0.00000000",
2781
+ // "uTime": "1697248128000"
2716
2782
  // }
2717
2783
  //
2718
2784
  // swap
2719
2785
  //
2720
2786
  // {
2721
- // marginCoin: 'BTC',
2722
- // locked: '0.00001948',
2723
- // available: '0.00006622',
2724
- // crossMaxAvailable: '0.00004674',
2725
- // fixedMaxAvailable: '0.00004674',
2726
- // maxTransferOut: '0.00004674',
2727
- // equity: '0.00006622',
2728
- // usdtEquity: '1.734307497491',
2729
- // btcEquity: '0.000066229058',
2730
- // crossRiskRate: '0.066308887072',
2731
- // unrealizedPL: '0',
2732
- // bonus: '0'
2787
+ // "marginCoin": "STETH",
2788
+ // "locked": "0",
2789
+ // "available": "0",
2790
+ // "crossMaxAvailable": "0",
2791
+ // "fixedMaxAvailable": "0",
2792
+ // "maxTransferOut": "0",
2793
+ // "equity": "0",
2794
+ // "usdtEquity": "0",
2795
+ // "btcEquity": "0",
2796
+ // "crossRiskRate": "0",
2797
+ // "unrealizedPL": "0",
2798
+ // "bonus": "0"
2799
+ // }
2800
+ //
2801
+ // isolated margin
2802
+ //
2803
+ // {
2804
+ // "symbol": "BTCUSDT",
2805
+ // "coin": "BTC",
2806
+ // "totalAmount": "0.00021654",
2807
+ // "available": "0.00021654",
2808
+ // "transferable": "0.00021654",
2809
+ // "frozen": "0",
2810
+ // "borrow": "0",
2811
+ // "interest": "0",
2812
+ // "net": "0.00021654",
2813
+ // "ctime": "1697248128071"
2814
+ // }
2815
+ //
2816
+ // cross margin
2817
+ //
2818
+ // {
2819
+ // "coin": "BTC",
2820
+ // "totalAmount": "0.00024995",
2821
+ // "available": "0.00024995",
2822
+ // "transferable": "0.00004993",
2823
+ // "frozen": "0",
2824
+ // "borrow": "0.0001",
2825
+ // "interest": "0.00000001",
2826
+ // "net": "0.00014994",
2827
+ // "ctime": "1697251265504"
2733
2828
  // }
2734
2829
  //
2735
2830
  for (let i = 0; i < balance.length; i++) {
2736
2831
  const entry = balance[i];
2737
- const currencyId = this.safeString2(entry, 'coinName', 'marginCoin');
2738
- const code = this.safeCurrencyCode(currencyId);
2739
2832
  const account = this.account();
2740
- const spotAccountFree = this.safeString(entry, 'available');
2741
- const contractAccountFree = this.safeString(entry, 'maxTransferOut');
2742
- account['free'] = (contractAccountFree !== undefined) ? contractAccountFree : spotAccountFree;
2743
- const frozen = this.safeString(entry, 'frozen');
2744
- const locked = this.safeString2(entry, 'lock', 'locked');
2745
- account['used'] = Precise.stringAdd(frozen, locked);
2833
+ const currencyId = this.safeStringN(entry, ['coinName', 'marginCoin', 'coin']);
2834
+ const code = this.safeCurrencyCode(currencyId);
2835
+ const borrow = this.safeString(entry, 'borrow');
2836
+ if (borrow !== undefined) {
2837
+ const interest = this.safeString(entry, 'interest');
2838
+ account['free'] = this.safeString(entry, 'transferable');
2839
+ account['total'] = this.safeString(entry, 'totalAmount');
2840
+ account['debt'] = Precise.stringAdd(borrow, interest);
2841
+ }
2842
+ else {
2843
+ // Use transferable instead of available for swap and margin https://github.com/ccxt/ccxt/pull/19127
2844
+ const spotAccountFree = this.safeString(entry, 'available');
2845
+ const contractAccountFree = this.safeString(entry, 'maxTransferOut');
2846
+ account['free'] = (contractAccountFree !== undefined) ? contractAccountFree : spotAccountFree;
2847
+ const frozen = this.safeString(entry, 'frozen');
2848
+ const locked = this.safeString2(entry, 'lock', 'locked');
2849
+ account['used'] = Precise.stringAdd(frozen, locked);
2850
+ }
2746
2851
  result[code] = account;
2747
2852
  }
2748
2853
  return this.safeBalance(result);
@@ -5201,6 +5306,194 @@ export default class bitget extends Exchange {
5201
5306
  'info': interest,
5202
5307
  }, market);
5203
5308
  }
5309
+ async borrowMargin(code, amount, symbol = undefined, params = {}) {
5310
+ /**
5311
+ * @method
5312
+ * @name bitget#borrowMargin
5313
+ * @description create a loan to borrow margin
5314
+ * @see https://bitgetlimited.github.io/apidoc/en/margin/#cross-borrow
5315
+ * @see https://bitgetlimited.github.io/apidoc/en/margin/#isolated-borrow
5316
+ * @param {string} code unified currency code of the currency to borrow
5317
+ * @param {string} amount the amount to borrow
5318
+ * @param {string} [symbol] unified market symbol
5319
+ * @param {object} [params] extra parameters specific to the bitget api endpoint
5320
+ * @param {string} [params.marginMode] 'isolated' or 'cross', symbol is required for 'isolated'
5321
+ * @returns {object} a [margin loan structure]{@link https://github.com/ccxt/ccxt/wiki/Manual#margin-loan-structure}
5322
+ */
5323
+ await this.loadMarkets();
5324
+ const currency = this.currency(code);
5325
+ const request = {
5326
+ 'coin': currency['info']['coinName'],
5327
+ 'borrowAmount': this.currencyToPrecision(code, amount),
5328
+ };
5329
+ let response = undefined;
5330
+ let marginMode = undefined;
5331
+ [marginMode, params] = this.handleMarginModeAndParams('borrowMargin', params);
5332
+ if ((symbol !== undefined) || (marginMode === 'isolated')) {
5333
+ this.checkRequiredSymbol('borrowMargin', symbol);
5334
+ const market = this.market(symbol);
5335
+ const marketId = market['id'];
5336
+ const parts = marketId.split('_');
5337
+ const marginMarketId = this.safeStringUpper(parts, 0);
5338
+ request['symbol'] = marginMarketId;
5339
+ response = await this.privateMarginPostIsolatedAccountBorrow(this.extend(request, params));
5340
+ }
5341
+ else {
5342
+ response = await this.privateMarginPostCrossAccountBorrow(this.extend(request, params));
5343
+ }
5344
+ //
5345
+ // isolated
5346
+ //
5347
+ // {
5348
+ // "code": "00000",
5349
+ // "msg": "success",
5350
+ // "requestTime": 1697250952516,
5351
+ // "data": {
5352
+ // "clientOid": null,
5353
+ // "symbol": "BTCUSDT",
5354
+ // "coin": "BTC",
5355
+ // "borrowAmount": "0.001"
5356
+ // }
5357
+ // }
5358
+ //
5359
+ // cross
5360
+ //
5361
+ // {
5362
+ // "code": "00000",
5363
+ // "msg": "success",
5364
+ // "requestTime": 1697251314271,
5365
+ // "data": {
5366
+ // "clientOid": null,
5367
+ // "coin": "BTC",
5368
+ // "borrowAmount": "0.0001"
5369
+ // }
5370
+ // }
5371
+ //
5372
+ const data = this.safeValue(response, 'data', {});
5373
+ return this.parseMarginLoan(data, currency);
5374
+ }
5375
+ async repayMargin(code, amount, symbol = undefined, params = {}) {
5376
+ /**
5377
+ * @method
5378
+ * @name bitget#repayMargin
5379
+ * @description repay borrowed margin and interest
5380
+ * @see https://bitgetlimited.github.io/apidoc/en/margin/#cross-repay
5381
+ * @see https://bitgetlimited.github.io/apidoc/en/margin/#isolated-repay
5382
+ * @param {string} code unified currency code of the currency to repay
5383
+ * @param {string} amount the amount to repay
5384
+ * @param {string} [symbol] unified market symbol
5385
+ * @param {object} [params] extra parameters specific to the bitget api endpoint
5386
+ * @param {string} [params.marginMode] 'isolated' or 'cross', symbol is required for 'isolated'
5387
+ * @returns {object} a [margin loan structure]{@link https://github.com/ccxt/ccxt/wiki/Manual#margin-loan-structure}
5388
+ */
5389
+ await this.loadMarkets();
5390
+ const currency = this.currency(code);
5391
+ const request = {
5392
+ 'coin': currency['info']['coinName'],
5393
+ 'repayAmount': this.currencyToPrecision(code, amount),
5394
+ };
5395
+ let response = undefined;
5396
+ let marginMode = undefined;
5397
+ [marginMode, params] = this.handleMarginModeAndParams('repayMargin', params);
5398
+ if ((symbol !== undefined) || (marginMode === 'isolated')) {
5399
+ this.checkRequiredSymbol('repayMargin', symbol);
5400
+ const market = this.market(symbol);
5401
+ const marketId = market['id'];
5402
+ const parts = marketId.split('_');
5403
+ const marginMarketId = this.safeStringUpper(parts, 0);
5404
+ request['symbol'] = marginMarketId;
5405
+ response = await this.privateMarginPostIsolatedAccountRepay(this.extend(request, params));
5406
+ }
5407
+ else {
5408
+ response = await this.privateMarginPostCrossAccountRepay(this.extend(request, params));
5409
+ }
5410
+ //
5411
+ // isolated
5412
+ //
5413
+ // {
5414
+ // "code": "00000",
5415
+ // "msg": "success",
5416
+ // "requestTime": 1697251988593,
5417
+ // "data": {
5418
+ // "remainDebtAmount": "0",
5419
+ // "clientOid": null,
5420
+ // "symbol": "BTCUSDT",
5421
+ // "coin": "BTC",
5422
+ // "repayAmount": "0.00100001"
5423
+ // }
5424
+ // }
5425
+ //
5426
+ // cross
5427
+ //
5428
+ // {
5429
+ // "code": "00000",
5430
+ // "msg": "success",
5431
+ // "requestTime": 1697252151042,
5432
+ // "data": {
5433
+ // "remainDebtAmount": "0",
5434
+ // "clientOid": null,
5435
+ // "coin": "BTC",
5436
+ // "repayAmount": "0.00010001"
5437
+ // }
5438
+ // }
5439
+ //
5440
+ const data = this.safeValue(response, 'data', {});
5441
+ return this.parseMarginLoan(data, currency);
5442
+ }
5443
+ parseMarginLoan(info, currency = undefined) {
5444
+ //
5445
+ // isolated: borrowMargin
5446
+ //
5447
+ // {
5448
+ // "clientOid": null,
5449
+ // "symbol": "BTCUSDT",
5450
+ // "coin": "BTC",
5451
+ // "borrowAmount": "0.001"
5452
+ // }
5453
+ //
5454
+ // cross: borrowMargin
5455
+ //
5456
+ // {
5457
+ // "clientOid": null,
5458
+ // "coin": "BTC",
5459
+ // "borrowAmount": "0.0001"
5460
+ // }
5461
+ //
5462
+ // isolated: repayMargin
5463
+ //
5464
+ // {
5465
+ // "remainDebtAmount": "0",
5466
+ // "clientOid": null,
5467
+ // "symbol": "BTCUSDT",
5468
+ // "coin": "BTC",
5469
+ // "repayAmount": "0.00100001"
5470
+ // }
5471
+ //
5472
+ // cross: repayMargin
5473
+ //
5474
+ // {
5475
+ // "remainDebtAmount": "0",
5476
+ // "clientOid": null,
5477
+ // "coin": "BTC",
5478
+ // "repayAmount": "0.00010001"
5479
+ // }
5480
+ //
5481
+ const currencyId = this.safeString(info, 'coin');
5482
+ const marketId = this.safeString(info, 'symbol');
5483
+ let symbol = undefined;
5484
+ if (marketId !== undefined) {
5485
+ symbol = this.safeSymbol(marketId);
5486
+ }
5487
+ return {
5488
+ 'id': this.safeString(info, 'clientOid'),
5489
+ 'currency': this.safeCurrencyCode(currencyId, currency),
5490
+ 'amount': this.safeNumber2(info, 'borrowAmount', 'repayAmount'),
5491
+ 'symbol': symbol,
5492
+ 'timestamp': undefined,
5493
+ 'datetime': undefined,
5494
+ 'info': info,
5495
+ };
5496
+ }
5204
5497
  handleErrors(code, reason, url, method, headers, body, response, requestHeaders, requestBody) {
5205
5498
  if (!response) {
5206
5499
  return undefined; // fallback to default error handler
package/js/src/bitmart.js CHANGED
@@ -760,6 +760,7 @@ export default class bitmart extends Exchange {
760
760
  'max': undefined,
761
761
  },
762
762
  },
763
+ 'created': undefined,
763
764
  'info': market,
764
765
  });
765
766
  }
@@ -866,6 +867,7 @@ export default class bitmart extends Exchange {
866
867
  'max': undefined,
867
868
  },
868
869
  },
870
+ 'created': this.safeInteger(market, 'open_timestamp'),
869
871
  'info': market,
870
872
  });
871
873
  }
package/js/src/bitmex.js CHANGED
@@ -663,6 +663,7 @@ export default class bitmex extends Exchange {
663
663
  'max': positionIsQuote ? maxOrderQty : undefined,
664
664
  },
665
665
  },
666
+ 'created': this.parse8601(this.safeString(market, 'listing')),
666
667
  'info': market,
667
668
  });
668
669
  }
@@ -1043,6 +1044,7 @@ export default class bitmex extends Exchange {
1043
1044
  'Deposit': 'transaction',
1044
1045
  'Transfer': 'transfer',
1045
1046
  'AffiliatePayout': 'referral',
1047
+ 'SpotTrade': 'trade',
1046
1048
  };
1047
1049
  return this.safeString(types, type, type);
1048
1050
  }
@@ -1580,9 +1582,9 @@ export default class bitmex extends Exchange {
1580
1582
  const feeCurrencyCode = this.safeCurrencyCode(currencyId);
1581
1583
  const feeRateString = this.safeString(trade, 'commission');
1582
1584
  fee = {
1583
- 'cost': feeCostString,
1585
+ 'cost': Precise.stringAbs(feeCostString),
1584
1586
  'currency': feeCurrencyCode,
1585
- 'rate': feeRateString,
1587
+ 'rate': Precise.stringAbs(feeRateString),
1586
1588
  };
1587
1589
  }
1588
1590
  // Trade or Funding
@@ -2110,7 +2112,8 @@ export default class bitmex extends Exchange {
2110
2112
  // }
2111
2113
  // ]
2112
2114
  //
2113
- return this.parsePositions(response, symbols);
2115
+ const results = this.parsePositions(response, symbols);
2116
+ return this.filterByArrayPositions(results, 'symbol', symbols, false);
2114
2117
  }
2115
2118
  parsePosition(position, market = undefined) {
2116
2119
  //