ccxt 4.2.86 → 4.2.87

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 (93) hide show
  1. package/README.md +3 -3
  2. package/build.sh +1 -1
  3. package/dist/ccxt.browser.js +671 -130
  4. package/dist/ccxt.browser.min.js +3 -3
  5. package/dist/cjs/ccxt.js +1 -1
  6. package/dist/cjs/src/ascendex.js +11 -1
  7. package/dist/cjs/src/binance.js +14 -1
  8. package/dist/cjs/src/bingx.js +37 -1
  9. package/dist/cjs/src/bitfinex.js +3 -0
  10. package/dist/cjs/src/bitfinex2.js +16 -1
  11. package/dist/cjs/src/bitflyer.js +19 -0
  12. package/dist/cjs/src/bitget.js +15 -1
  13. package/dist/cjs/src/bitopro.js +3 -0
  14. package/dist/cjs/src/bitrue.js +13 -7
  15. package/dist/cjs/src/bitvavo.js +3 -0
  16. package/dist/cjs/src/btcmarkets.js +1 -1
  17. package/dist/cjs/src/btcturk.js +2 -1
  18. package/dist/cjs/src/coinex.js +182 -54
  19. package/dist/cjs/src/currencycom.js +1 -1
  20. package/dist/cjs/src/delta.js +3 -1
  21. package/dist/cjs/src/digifinex.js +4 -2
  22. package/dist/cjs/src/exmo.js +11 -12
  23. package/dist/cjs/src/gate.js +5 -2
  24. package/dist/cjs/src/hitbtc.js +26 -2
  25. package/dist/cjs/src/htx.js +2 -2
  26. package/dist/cjs/src/huobijp.js +1 -1
  27. package/dist/cjs/src/hyperliquid.js +249 -12
  28. package/dist/cjs/src/idex.js +1 -1
  29. package/dist/cjs/src/krakenfutures.js +2 -6
  30. package/dist/cjs/src/lbank.js +3 -0
  31. package/dist/cjs/src/oceanex.js +1 -1
  32. package/dist/cjs/src/okx.js +24 -10
  33. package/dist/cjs/src/phemex.js +3 -1
  34. package/dist/cjs/src/pro/kucoin.js +11 -6
  35. package/dist/cjs/src/wazirx.js +1 -1
  36. package/dist/cjs/src/zonda.js +3 -0
  37. package/examples/js/benchmark.js +104 -0
  38. package/examples/ts/benchmark.ts +134 -0
  39. package/js/ccxt.d.ts +1 -1
  40. package/js/ccxt.js +1 -1
  41. package/js/src/ascendex.d.ts +5 -12
  42. package/js/src/ascendex.js +11 -1
  43. package/js/src/base/Exchange.d.ts +4 -4
  44. package/js/src/base/types.d.ts +11 -0
  45. package/js/src/binance.d.ts +4 -11
  46. package/js/src/binance.js +14 -1
  47. package/js/src/bingx.d.ts +5 -2
  48. package/js/src/bingx.js +37 -1
  49. package/js/src/bitfinex.js +3 -0
  50. package/js/src/bitfinex2.d.ts +3 -17
  51. package/js/src/bitfinex2.js +16 -1
  52. package/js/src/bitflyer.d.ts +1 -0
  53. package/js/src/bitflyer.js +20 -1
  54. package/js/src/bitget.d.ts +5 -12
  55. package/js/src/bitget.js +15 -1
  56. package/js/src/bitopro.js +3 -0
  57. package/js/src/bitrue.d.ts +3 -17
  58. package/js/src/bitrue.js +13 -7
  59. package/js/src/bitvavo.js +3 -0
  60. package/js/src/btcmarkets.js +1 -1
  61. package/js/src/btcturk.js +2 -1
  62. package/js/src/coinex.d.ts +4 -11
  63. package/js/src/coinex.js +182 -54
  64. package/js/src/currencycom.js +1 -1
  65. package/js/src/delta.d.ts +5 -37
  66. package/js/src/delta.js +3 -1
  67. package/js/src/digifinex.d.ts +5 -13
  68. package/js/src/digifinex.js +4 -2
  69. package/js/src/exmo.d.ts +5 -37
  70. package/js/src/exmo.js +11 -12
  71. package/js/src/gate.d.ts +5 -33
  72. package/js/src/gate.js +5 -2
  73. package/js/src/hitbtc.d.ts +5 -12
  74. package/js/src/hitbtc.js +26 -2
  75. package/js/src/htx.js +2 -2
  76. package/js/src/huobijp.js +1 -1
  77. package/js/src/hyperliquid.d.ts +7 -4
  78. package/js/src/hyperliquid.js +249 -12
  79. package/js/src/idex.js +1 -1
  80. package/js/src/krakenfutures.js +2 -6
  81. package/js/src/kucoinfutures.d.ts +2 -2
  82. package/js/src/lbank.js +3 -0
  83. package/js/src/mexc.d.ts +3 -3
  84. package/js/src/oceanex.js +1 -1
  85. package/js/src/okx.d.ts +5 -33
  86. package/js/src/okx.js +24 -10
  87. package/js/src/phemex.d.ts +3 -11
  88. package/js/src/phemex.js +3 -1
  89. package/js/src/pro/kucoin.js +11 -6
  90. package/js/src/wazirx.js +1 -1
  91. package/js/src/zonda.js +3 -0
  92. package/package.json +3 -2
  93. package/skip-tests.json +3 -3
package/dist/cjs/ccxt.js CHANGED
@@ -182,7 +182,7 @@ var woo$1 = require('./src/pro/woo.js');
182
182
 
183
183
  //-----------------------------------------------------------------------------
184
184
  // this is updated by vss.js when building
185
- const version = '4.2.86';
185
+ const version = '4.2.87';
186
186
  Exchange["default"].ccxtVersion = version;
187
187
  const exchanges = {
188
188
  'ace': ace,
@@ -2873,15 +2873,25 @@ class ascendex extends ascendex$1 {
2873
2873
  });
2874
2874
  }
2875
2875
  parseMarginModification(data, market = undefined) {
2876
+ //
2877
+ // addMargin/reduceMargin
2878
+ //
2879
+ // {
2880
+ // "code": 0
2881
+ // }
2882
+ //
2876
2883
  const errorCode = this.safeString(data, 'code');
2877
2884
  const status = (errorCode === '0') ? 'ok' : 'failed';
2878
2885
  return {
2879
2886
  'info': data,
2887
+ 'symbol': market['symbol'],
2880
2888
  'type': undefined,
2881
2889
  'amount': undefined,
2890
+ 'total': undefined,
2882
2891
  'code': market['quote'],
2883
- 'symbol': market['symbol'],
2884
2892
  'status': status,
2893
+ 'timestamp': undefined,
2894
+ 'datetime': undefined,
2885
2895
  };
2886
2896
  }
2887
2897
  async reduceMargin(symbol, amount, params = {}) {
@@ -11212,6 +11212,16 @@ class binance extends binance$1 {
11212
11212
  });
11213
11213
  }
11214
11214
  parseMarginModification(data, market = undefined) {
11215
+ //
11216
+ // add/reduce margin
11217
+ //
11218
+ // {
11219
+ // "code": 200,
11220
+ // "msg": "Successfully modify position margin.",
11221
+ // "amount": 0.001,
11222
+ // "type": 1
11223
+ // }
11224
+ //
11215
11225
  const rawType = this.safeInteger(data, 'type');
11216
11226
  const resultType = (rawType === 1) ? 'add' : 'reduce';
11217
11227
  const resultAmount = this.safeNumber(data, 'amount');
@@ -11219,11 +11229,14 @@ class binance extends binance$1 {
11219
11229
  const status = (errorCode === '200') ? 'ok' : 'failed';
11220
11230
  return {
11221
11231
  'info': data,
11232
+ 'symbol': market['symbol'],
11222
11233
  'type': resultType,
11223
11234
  'amount': resultAmount,
11235
+ 'total': undefined,
11224
11236
  'code': undefined,
11225
- 'symbol': market['symbol'],
11226
11237
  'status': status,
11238
+ 'timestamp': undefined,
11239
+ 'datetime': undefined,
11227
11240
  };
11228
11241
  }
11229
11242
  async reduceMargin(symbol, amount, params = {}) {
@@ -30,6 +30,7 @@ class bingx extends bingx$1 {
30
30
  'swap': true,
31
31
  'future': false,
32
32
  'option': false,
33
+ 'addMargin': true,
33
34
  'cancelAllOrders': true,
34
35
  'cancelOrder': true,
35
36
  'cancelOrders': true,
@@ -76,6 +77,7 @@ class bingx extends bingx$1 {
76
77
  'fetchTrades': true,
77
78
  'fetchTransfers': true,
78
79
  'fetchWithdrawals': true,
80
+ 'reduceMargin': true,
79
81
  'setLeverage': true,
80
82
  'setMargin': true,
81
83
  'setMarginMode': true,
@@ -3464,6 +3466,18 @@ class bingx extends bingx$1 {
3464
3466
  };
3465
3467
  return await this.swapV2PrivatePostTradeMarginType(this.extend(request, params));
3466
3468
  }
3469
+ async addMargin(symbol, amount, params = {}) {
3470
+ const request = {
3471
+ 'type': 1,
3472
+ };
3473
+ return await this.setMargin(symbol, amount, this.extend(request, params));
3474
+ }
3475
+ async reduceMargin(symbol, amount, params = {}) {
3476
+ const request = {
3477
+ 'type': 2,
3478
+ };
3479
+ return await this.setMargin(symbol, amount, this.extend(request, params));
3480
+ }
3467
3481
  async setMargin(symbol, amount, params = {}) {
3468
3482
  /**
3469
3483
  * @method
@@ -3498,7 +3512,29 @@ class bingx extends bingx$1 {
3498
3512
  // "type": 1
3499
3513
  // }
3500
3514
  //
3501
- return response;
3515
+ return this.parseMarginModification(response, market);
3516
+ }
3517
+ parseMarginModification(data, market = undefined) {
3518
+ //
3519
+ // {
3520
+ // "code": 0,
3521
+ // "msg": "",
3522
+ // "amount": 1,
3523
+ // "type": 1
3524
+ // }
3525
+ //
3526
+ const type = this.safeString(data, 'type');
3527
+ return {
3528
+ 'info': data,
3529
+ 'symbol': this.safeString(market, 'symbol'),
3530
+ 'type': (type === '1') ? 'add' : 'reduce',
3531
+ 'amount': this.safeNumber(data, 'amount'),
3532
+ 'total': this.safeNumber(data, 'margin'),
3533
+ 'code': this.safeString(market, 'settle'),
3534
+ 'status': undefined,
3535
+ 'timestamp': undefined,
3536
+ 'datetime': undefined,
3537
+ };
3502
3538
  }
3503
3539
  async fetchLeverage(symbol, params = {}) {
3504
3540
  /**
@@ -1323,6 +1323,9 @@ class bitfinex extends bitfinex$1 {
1323
1323
  if (limit === undefined) {
1324
1324
  limit = 100;
1325
1325
  }
1326
+ else {
1327
+ limit = Math.min(limit, 10000);
1328
+ }
1326
1329
  const market = this.market(symbol);
1327
1330
  const v2id = 't' + market['id'];
1328
1331
  const request = {
@@ -1380,6 +1380,9 @@ class bitfinex2 extends bitfinex2$1 {
1380
1380
  if (limit === undefined) {
1381
1381
  limit = 10000;
1382
1382
  }
1383
+ else {
1384
+ limit = Math.min(limit, 10000);
1385
+ }
1383
1386
  let request = {
1384
1387
  'symbol': market['id'],
1385
1388
  'timeframe': this.safeString(this.timeframes, timeframe, timeframe),
@@ -3501,15 +3504,27 @@ class bitfinex2 extends bitfinex2$1 {
3501
3504
  return this.parseMarginModification(data, market);
3502
3505
  }
3503
3506
  parseMarginModification(data, market = undefined) {
3507
+ //
3508
+ // setMargin
3509
+ //
3510
+ // [
3511
+ // [
3512
+ // 1
3513
+ // ]
3514
+ // ]
3515
+ //
3504
3516
  const marginStatusRaw = data[0];
3505
3517
  const marginStatus = (marginStatusRaw === 1) ? 'ok' : 'failed';
3506
3518
  return {
3507
3519
  'info': data,
3520
+ 'symbol': market['symbol'],
3508
3521
  'type': undefined,
3509
3522
  'amount': undefined,
3523
+ 'total': undefined,
3510
3524
  'code': undefined,
3511
- 'symbol': market['symbol'],
3512
3525
  'status': marginStatus,
3526
+ 'timestamp': undefined,
3527
+ 'datetime': undefined,
3513
3528
  };
3514
3529
  }
3515
3530
  async fetchOrder(id, symbol = undefined, params = {}) {
@@ -114,6 +114,11 @@ class bitflyer extends bitflyer$1 {
114
114
  },
115
115
  },
116
116
  'precisionMode': number.TICK_SIZE,
117
+ 'exceptions': {
118
+ 'exact': {
119
+ '-2': errors.OnMaintenance, // {"status":-2,"error_message":"Under maintenance","data":null}
120
+ },
121
+ },
117
122
  });
118
123
  }
119
124
  parseExpiryDate(expiry) {
@@ -1041,6 +1046,20 @@ class bitflyer extends bitflyer$1 {
1041
1046
  }
1042
1047
  return { 'url': url, 'method': method, 'body': body, 'headers': headers };
1043
1048
  }
1049
+ handleErrors(code, reason, url, method, headers, body, response, requestHeaders, requestBody) {
1050
+ if (response === undefined) {
1051
+ return undefined; // fallback to the default error handler
1052
+ }
1053
+ const feedback = this.id + ' ' + body;
1054
+ // i.e. {"status":-2,"error_message":"Under maintenance","data":null}
1055
+ const errorMessage = this.safeString(response, 'error_message');
1056
+ const statusCode = this.safeNumber(response, 'status');
1057
+ if (errorMessage !== undefined) {
1058
+ this.throwExactlyMatchedException(this.exceptions['exact'], statusCode, feedback);
1059
+ this.throwBroadlyMatchedException(this.exceptions['broad'], errorMessage, feedback);
1060
+ }
1061
+ return undefined;
1062
+ }
1044
1063
  }
1045
1064
 
1046
1065
  module.exports = bitflyer;
@@ -1219,6 +1219,7 @@ class bitget extends bitget$1 {
1219
1219
  '40768': errors.OrderNotFound,
1220
1220
  '41114': errors.OnMaintenance,
1221
1221
  '43011': errors.InvalidOrder,
1222
+ '43012': errors.InsufficientFunds,
1222
1223
  '43025': errors.InvalidOrder,
1223
1224
  '43115': errors.OnMaintenance,
1224
1225
  '45110': errors.InvalidOrder,
@@ -6960,15 +6961,28 @@ class bitget extends bitget$1 {
6960
6961
  });
6961
6962
  }
6962
6963
  parseMarginModification(data, market = undefined) {
6964
+ //
6965
+ // addMargin/reduceMargin
6966
+ //
6967
+ // {
6968
+ // "code": "00000",
6969
+ // "msg": "success",
6970
+ // "requestTime": 1700813444618,
6971
+ // "data": ""
6972
+ // }
6973
+ //
6963
6974
  const errorCode = this.safeString(data, 'code');
6964
6975
  const status = (errorCode === '00000') ? 'ok' : 'failed';
6965
6976
  return {
6966
6977
  'info': data,
6978
+ 'symbol': market['symbol'],
6967
6979
  'type': undefined,
6968
6980
  'amount': undefined,
6981
+ 'total': undefined,
6969
6982
  'code': market['settle'],
6970
- 'symbol': market['symbol'],
6971
6983
  'status': status,
6984
+ 'timestamp': undefined,
6985
+ 'datetime': undefined,
6972
6986
  };
6973
6987
  }
6974
6988
  async reduceMargin(symbol, amount, params = {}) {
@@ -756,6 +756,9 @@ class bitopro extends bitopro$1 {
756
756
  if (limit === undefined) {
757
757
  limit = 500;
758
758
  }
759
+ else {
760
+ limit = Math.min(limit, 75000); // supports slightly more than 75k candles atm, but limit here to avoid errors
761
+ }
759
762
  const timeframeInSeconds = this.parseTimeframe(timeframe);
760
763
  let alignedSince = undefined;
761
764
  if (since === undefined) {
@@ -1348,9 +1348,6 @@ class bitrue extends bitrue$1 {
1348
1348
  'interval': this.safeString(timeframesFuture, timeframe, '1min'),
1349
1349
  };
1350
1350
  if (limit !== undefined) {
1351
- if (limit > 300) {
1352
- limit = 300;
1353
- }
1354
1351
  request['limit'] = limit;
1355
1352
  }
1356
1353
  if (market['linear']) {
@@ -1369,9 +1366,6 @@ class bitrue extends bitrue$1 {
1369
1366
  'scale': this.safeString(timeframesSpot, timeframe, '1m'),
1370
1367
  };
1371
1368
  if (limit !== undefined) {
1372
- if (limit > 1440) {
1373
- limit = 1440;
1374
- }
1375
1369
  request['limit'] = limit;
1376
1370
  }
1377
1371
  if (since !== undefined) {
@@ -3043,13 +3037,25 @@ class bitrue extends bitrue$1 {
3043
3037
  return response;
3044
3038
  }
3045
3039
  parseMarginModification(data, market = undefined) {
3040
+ //
3041
+ // setMargin
3042
+ //
3043
+ // {
3044
+ // "code": 0,
3045
+ // "msg": "success"
3046
+ // "data": null
3047
+ // }
3048
+ //
3046
3049
  return {
3047
3050
  'info': data,
3051
+ 'symbol': market['symbol'],
3048
3052
  'type': undefined,
3049
3053
  'amount': undefined,
3054
+ 'total': undefined,
3050
3055
  'code': undefined,
3051
- 'symbol': market['symbol'],
3052
3056
  'status': undefined,
3057
+ 'timestamp': undefined,
3058
+ 'datetime': undefined,
3053
3059
  };
3054
3060
  }
3055
3061
  async setMargin(symbol, amount, params = {}) {
@@ -932,6 +932,9 @@ class bitvavo extends bitvavo$1 {
932
932
  if (limit === undefined) {
933
933
  limit = 1440;
934
934
  }
935
+ else {
936
+ limit = Math.min(limit, 1440);
937
+ }
935
938
  request['end'] = this.sum(since, limit * duration * 1000);
936
939
  }
937
940
  [request, params] = this.handleUntilOption('end', request, params);
@@ -538,7 +538,7 @@ class btcmarkets extends btcmarkets$1 {
538
538
  request['from'] = this.iso8601(since);
539
539
  }
540
540
  if (limit !== undefined) {
541
- request['limit'] = limit; // default is 10, max 200
541
+ request['limit'] = Math.min(limit, 200); // default is 10, max 200
542
542
  }
543
543
  const response = await this.publicGetMarketsMarketIdCandles(this.extend(request, params));
544
544
  //
@@ -585,6 +585,7 @@ class btcturk extends btcturk$1 {
585
585
  limit = 100; // default value
586
586
  }
587
587
  if (limit !== undefined) {
588
+ limit = Math.min(limit, 11000); // max 11000 candles diapason can be covered
588
589
  if (timeframe === '1y') { // difficult with leap years
589
590
  throw new errors.BadRequest(this.id + ' fetchOHLCV () does not accept a limit parameter when timeframe == "1y"');
590
591
  }
@@ -595,7 +596,7 @@ class btcturk extends btcturk$1 {
595
596
  request['to'] = Math.min(request['to'], to);
596
597
  }
597
598
  else {
598
- request['from'] = this.parseToInt(until / 1000) - limitSeconds;
599
+ request['from'] = this.parseToInt(0 / 1000) - limitSeconds;
599
600
  }
600
601
  }
601
602
  const response = await this.graphGetKlinesHistory(this.extend(request, params));
@@ -1065,19 +1065,22 @@ class coinex extends coinex$1 {
1065
1065
  * @method
1066
1066
  * @name coinex#fetchTime
1067
1067
  * @description fetches the current integer timestamp in milliseconds from the exchange server
1068
- * @see https://viabtc.github.io/coinex_api_en_doc/futures/#docsfutures001_http005_system_time
1068
+ * @see https://docs.coinex.com/api/v2/common/http/time
1069
1069
  * @param {object} [params] extra parameters specific to the exchange API endpoint
1070
1070
  * @returns {int} the current integer timestamp in milliseconds from the exchange server
1071
1071
  */
1072
- const response = await this.v1PerpetualPublicGetTime(params);
1072
+ const response = await this.v2PublicGetTime(params);
1073
1073
  //
1074
1074
  // {
1075
- // "code": "0",
1076
- // "data": "1653261274414",
1075
+ // "code": 0,
1076
+ // "data": {
1077
+ // "timestamp": 1711699867777
1078
+ // },
1077
1079
  // "message": "OK"
1078
1080
  // }
1079
1081
  //
1080
- return this.safeInteger(response, 'data');
1082
+ const data = this.safeDict(response, 'data', {});
1083
+ return this.safeInteger(data, 'timestamp');
1081
1084
  }
1082
1085
  async fetchOrderBook(symbol, limit = 20, params = {}) {
1083
1086
  /**
@@ -1337,7 +1340,8 @@ class coinex extends coinex$1 {
1337
1340
  * @method
1338
1341
  * @name coinex#fetchTradingFee
1339
1342
  * @description fetch the trading fees for a market
1340
- * @see https://viabtc.github.io/coinex_api_en_doc/spot/#docsspot001_market003_single_market_info
1343
+ * @see https://docs.coinex.com/api/v2/spot/market/http/list-market
1344
+ * @see https://docs.coinex.com/api/v2/futures/market/http/list-market
1341
1345
  * @param {string} symbol unified market symbol
1342
1346
  * @param {object} [params] extra parameters specific to the exchange API endpoint
1343
1347
  * @returns {object} a [fee structure]{@link https://docs.ccxt.com/#/?id=fee-structure}
@@ -1347,67 +1351,132 @@ class coinex extends coinex$1 {
1347
1351
  const request = {
1348
1352
  'market': market['id'],
1349
1353
  };
1350
- const response = await this.v1PublicGetMarketDetail(this.extend(request, params));
1351
- //
1352
- // {
1353
- // "code": 0,
1354
- // "data": {
1355
- // "name": "BTCUSDC",
1356
- // "min_amount": "0.0005",
1357
- // "maker_fee_rate": "0.002",
1358
- // "taker_fee_rate": "0.002",
1359
- // "pricing_name": "USDC",
1360
- // "pricing_decimal": 2,
1361
- // "trading_name": "BTC",
1362
- // "trading_decimal": 8
1363
- // },
1364
- // "message": "OK"
1365
- // }
1366
- //
1367
- const data = this.safeValue(response, 'data', {});
1368
- return this.parseTradingFee(data, market);
1354
+ let response = undefined;
1355
+ if (market['spot']) {
1356
+ response = await this.v2PublicGetSpotMarket(this.extend(request, params));
1357
+ //
1358
+ // {
1359
+ // "code": 0,
1360
+ // "data": [
1361
+ // {
1362
+ // "base_ccy": "BTC",
1363
+ // "base_ccy_precision": 8,
1364
+ // "is_amm_available": false,
1365
+ // "is_margin_available": true,
1366
+ // "maker_fee_rate": "0.002",
1367
+ // "market": "BTCUSDT",
1368
+ // "min_amount": "0.0001",
1369
+ // "quote_ccy": "USDT",
1370
+ // "quote_ccy_precision": 2,
1371
+ // "taker_fee_rate": "0.002"
1372
+ // }
1373
+ // ],
1374
+ // "message": "OK"
1375
+ // }
1376
+ //
1377
+ }
1378
+ else {
1379
+ response = await this.v2PublicGetFuturesMarket(this.extend(request, params));
1380
+ //
1381
+ // {
1382
+ // "code": 0,
1383
+ // "data": [
1384
+ // {
1385
+ // "base_ccy": "BTC",
1386
+ // "base_ccy_precision": 8,
1387
+ // "contract_type": "linear",
1388
+ // "leverage": ["1","2","3","5","8","10","15","20","30","50","100"],
1389
+ // "maker_fee_rate": "0",
1390
+ // "market": "BTCUSDT",
1391
+ // "min_amount": "0.0001",
1392
+ // "open_interest_volume": "185.7498",
1393
+ // "quote_ccy": "USDT",
1394
+ // "quote_ccy_precision": 2,
1395
+ // "taker_fee_rate": "0"
1396
+ // }
1397
+ // ],
1398
+ // "message": "OK"
1399
+ // }
1400
+ //
1401
+ }
1402
+ const data = this.safeList(response, 'data', []);
1403
+ const result = this.safeDict(data, 0, {});
1404
+ return this.parseTradingFee(result, market);
1369
1405
  }
1370
1406
  async fetchTradingFees(params = {}) {
1371
1407
  /**
1372
1408
  * @method
1373
1409
  * @name coinex#fetchTradingFees
1374
1410
  * @description fetch the trading fees for multiple markets
1375
- * @see https://viabtc.github.io/coinex_api_en_doc/spot/#docsspot001_market002_all_market_info
1411
+ * @see https://docs.coinex.com/api/v2/spot/market/http/list-market
1412
+ * @see https://docs.coinex.com/api/v2/futures/market/http/list-market
1376
1413
  * @param {object} [params] extra parameters specific to the exchange API endpoint
1377
1414
  * @returns {object} a dictionary of [fee structures]{@link https://docs.ccxt.com/#/?id=fee-structure} indexed by market symbols
1378
1415
  */
1379
1416
  await this.loadMarkets();
1380
- const response = await this.v1PublicGetMarketInfo(params);
1381
- //
1382
- // {
1383
- // "code": 0,
1384
- // "data": {
1385
- // "WAVESBTC": {
1386
- // "name": "WAVESBTC",
1387
- // "min_amount": "1",
1388
- // "maker_fee_rate": "0.001",
1389
- // "taker_fee_rate": "0.001",
1390
- // "pricing_name": "BTC",
1391
- // "pricing_decimal": 8,
1392
- // "trading_name": "WAVES",
1393
- // "trading_decimal": 8
1394
- // }
1395
- // ...
1396
- // }
1397
- // }
1398
- //
1399
- const data = this.safeValue(response, 'data', {});
1417
+ let type = undefined;
1418
+ [type, params] = this.handleMarketTypeAndParams('fetchTradingFees', undefined, params);
1419
+ let response = undefined;
1420
+ if (type === 'swap') {
1421
+ response = await this.v2PublicGetFuturesMarket(params);
1422
+ //
1423
+ // {
1424
+ // "code": 0,
1425
+ // "data": [
1426
+ // {
1427
+ // "base_ccy": "BTC",
1428
+ // "base_ccy_precision": 8,
1429
+ // "contract_type": "linear",
1430
+ // "leverage": ["1","2","3","5","8","10","15","20","30","50","100"],
1431
+ // "maker_fee_rate": "0",
1432
+ // "market": "BTCUSDT",
1433
+ // "min_amount": "0.0001",
1434
+ // "open_interest_volume": "185.7498",
1435
+ // "quote_ccy": "USDT",
1436
+ // "quote_ccy_precision": 2,
1437
+ // "taker_fee_rate": "0"
1438
+ // }
1439
+ // ],
1440
+ // "message": "OK"
1441
+ // }
1442
+ //
1443
+ }
1444
+ else {
1445
+ response = await this.v2PublicGetSpotMarket(params);
1446
+ //
1447
+ // {
1448
+ // "code": 0,
1449
+ // "data": [
1450
+ // {
1451
+ // "base_ccy": "BTC",
1452
+ // "base_ccy_precision": 8,
1453
+ // "is_amm_available": false,
1454
+ // "is_margin_available": true,
1455
+ // "maker_fee_rate": "0.002",
1456
+ // "market": "BTCUSDT",
1457
+ // "min_amount": "0.0001",
1458
+ // "quote_ccy": "USDT",
1459
+ // "quote_ccy_precision": 2,
1460
+ // "taker_fee_rate": "0.002"
1461
+ // },
1462
+ // ],
1463
+ // "message": "OK"
1464
+ // }
1465
+ //
1466
+ }
1467
+ const data = this.safeList(response, 'data', []);
1400
1468
  const result = {};
1401
- for (let i = 0; i < this.symbols.length; i++) {
1402
- const symbol = this.symbols[i];
1403
- const market = this.market(symbol);
1404
- const fee = this.safeValue(data, market['id'], {});
1405
- result[symbol] = this.parseTradingFee(fee, market);
1469
+ for (let i = 0; i < data.length; i++) {
1470
+ const entry = data[i];
1471
+ const marketId = this.safeString(entry, 'market');
1472
+ const market = this.safeMarket(marketId, undefined, undefined, type);
1473
+ const symbol = market['symbol'];
1474
+ result[symbol] = this.parseTradingFee(entry, market);
1406
1475
  }
1407
1476
  return result;
1408
1477
  }
1409
1478
  parseTradingFee(fee, market = undefined) {
1410
- const marketId = this.safeValue(fee, 'name');
1479
+ const marketId = this.safeValue(fee, 'market');
1411
1480
  const symbol = this.safeSymbol(marketId, market);
1412
1481
  return {
1413
1482
  'info': fee,
@@ -4179,13 +4248,72 @@ class coinex extends coinex$1 {
4179
4248
  });
4180
4249
  }
4181
4250
  parseMarginModification(data, market = undefined) {
4251
+ //
4252
+ // addMargin/reduceMargin
4253
+ //
4254
+ // {
4255
+ // "adl_sort": 1,
4256
+ // "adl_sort_val": "0.00004320",
4257
+ // "amount": "0.0005",
4258
+ // "amount_max": "0.0005",
4259
+ // "amount_max_margin": "6.57352000000000000000",
4260
+ // "bkr_price": "16294.08000000000000011090",
4261
+ // "bkr_price_imply": "0.00000000000000000000",
4262
+ // "close_left": "0.0005",
4263
+ // "create_time": 1651202571.320778,
4264
+ // "deal_all": "19.72000000000000000000",
4265
+ // "deal_asset_fee": "0.00000000000000000000",
4266
+ // "fee_asset": "",
4267
+ // "finish_type": 1,
4268
+ // "first_price": "39441.12",
4269
+ // "insurance": "0.00000000000000000000",
4270
+ // "latest_price": "39441.12",
4271
+ // "leverage": "3",
4272
+ // "liq_amount": "0.00000000000000000000",
4273
+ // "liq_order_price": "0",
4274
+ // "liq_order_time": 0,
4275
+ // "liq_price": "16491.28560000000000011090",
4276
+ // "liq_price_imply": "0.00000000000000000000",
4277
+ // "liq_profit": "0.00000000000000000000",
4278
+ // "liq_time": 0,
4279
+ // "mainten_margin": "0.005",
4280
+ // "mainten_margin_amount": "0.09860280000000000000",
4281
+ // "maker_fee": "0.00000000000000000000",
4282
+ // "margin_amount": "11.57352000000000000000",
4283
+ // "market": "BTCUSDT",
4284
+ // "open_margin": "0.58687582908396110455",
4285
+ // "open_margin_imply": "0.00000000000000000000",
4286
+ // "open_price": "39441.12000000000000000000",
4287
+ // "open_val": "19.72056000000000000000",
4288
+ // "open_val_max": "19.72056000000000000000",
4289
+ // "position_id": 65171206,
4290
+ // "profit_clearing": "-0.00986028000000000000",
4291
+ // "profit_real": "-0.00986028000000000000",
4292
+ // "profit_unreal": "0.00",
4293
+ // "side": 2,
4294
+ // "stop_loss_price": "0.00000000000000000000",
4295
+ // "stop_loss_type": 0,
4296
+ // "sys": 0,
4297
+ // "take_profit_price": "0.00000000000000000000",
4298
+ // "take_profit_type": 0,
4299
+ // "taker_fee": "0.00000000000000000000",
4300
+ // "total": 3464,
4301
+ // "type": 1,
4302
+ // "update_time": 1651202638.911212,
4303
+ // "user_id": 3620173
4304
+ // }
4305
+ //
4306
+ const timestamp = this.safeIntegerProduct(data, 'update_time', 1000);
4182
4307
  return {
4183
4308
  'info': data,
4309
+ 'symbol': this.safeSymbol(undefined, market),
4184
4310
  'type': undefined,
4185
- 'amount': undefined,
4311
+ 'amount': this.safeNumber(data, 'margin_amount'),
4312
+ 'total': undefined,
4186
4313
  'code': market['quote'],
4187
- 'symbol': this.safeSymbol(undefined, market),
4188
4314
  'status': undefined,
4315
+ 'timestamp': timestamp,
4316
+ 'datetime': this.iso8601(timestamp),
4189
4317
  };
4190
4318
  }
4191
4319
  async addMargin(symbol, amount, params = {}) {