ccxt 4.1.87 → 4.1.89

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 (101) hide show
  1. package/CHANGELOG.md +8309 -5710
  2. package/README.md +10 -9
  3. package/changelog.js +101 -0
  4. package/dist/ccxt.browser.js +8628 -4849
  5. package/dist/ccxt.browser.min.js +3 -3
  6. package/dist/cjs/ccxt.js +6 -1
  7. package/dist/cjs/src/base/Exchange.js +95 -27
  8. package/dist/cjs/src/base/ws/Client.js +3 -3
  9. package/dist/cjs/src/base/ws/Future.js +9 -2
  10. package/dist/cjs/src/base/ws/WsClient.js +1 -1
  11. package/dist/cjs/src/bigone.js +8 -1
  12. package/dist/cjs/src/binance.js +4 -105
  13. package/dist/cjs/src/bit2c.js +8 -2
  14. package/dist/cjs/src/bitget.js +3455 -2480
  15. package/dist/cjs/src/bitmart.js +35 -9
  16. package/dist/cjs/src/coinbase.js +2 -0
  17. package/dist/cjs/src/coinbasepro.js +0 -43
  18. package/dist/cjs/src/coinex.js +14 -1
  19. package/dist/cjs/src/coinsph.js +0 -29
  20. package/dist/cjs/src/cryptocom.js +22 -10
  21. package/dist/cjs/src/gate.js +37 -39
  22. package/dist/cjs/src/gemini.js +1 -0
  23. package/dist/cjs/src/novadax.js +28 -16
  24. package/dist/cjs/src/okcoin.js +80 -21
  25. package/dist/cjs/src/phemex.js +105 -29
  26. package/dist/cjs/src/pro/binance.js +18 -215
  27. package/dist/cjs/src/pro/bitget.js +780 -736
  28. package/dist/cjs/src/pro/bitmart.js +8 -10
  29. package/dist/cjs/src/pro/bitmex.js +9 -34
  30. package/dist/cjs/src/pro/bitpanda.js +4 -4
  31. package/dist/cjs/src/pro/bybit.js +21 -97
  32. package/dist/cjs/src/pro/coinbasepro.js +36 -40
  33. package/dist/cjs/src/pro/cryptocom.js +10 -26
  34. package/dist/cjs/src/pro/gate.js +20 -17
  35. package/dist/cjs/src/pro/kucoin.js +39 -39
  36. package/dist/cjs/src/pro/kucoinfutures.js +40 -36
  37. package/dist/cjs/src/pro/okx.js +16 -29
  38. package/dist/cjs/src/tokocrypto.js +28 -14
  39. package/dist/cjs/src/woo.js +41 -14
  40. package/js/ccxt.d.ts +8 -2
  41. package/js/ccxt.js +6 -2
  42. package/js/src/abstract/bitget.d.ts +1 -1
  43. package/js/src/abstract/coinbasepro.d.ts +69 -0
  44. package/js/src/abstract/coinbasepro.js +11 -0
  45. package/js/src/abstract/phemex.d.ts +1 -0
  46. package/js/src/base/Exchange.d.ts +2 -3
  47. package/js/src/base/Exchange.js +96 -28
  48. package/js/src/base/ws/Client.d.ts +2 -2
  49. package/js/src/base/ws/Client.js +4 -4
  50. package/js/src/base/ws/Future.d.ts +5 -2
  51. package/js/src/base/ws/Future.js +8 -2
  52. package/js/src/base/ws/WsClient.d.ts +1 -1
  53. package/js/src/base/ws/WsClient.js +2 -2
  54. package/js/src/bigone.js +9 -2
  55. package/js/src/binance.d.ts +0 -9
  56. package/js/src/binance.js +4 -105
  57. package/js/src/bit2c.js +8 -2
  58. package/js/src/bitget.d.ts +13 -11
  59. package/js/src/bitget.js +3455 -2480
  60. package/js/src/bitmart.js +35 -9
  61. package/js/src/coinbase.js +2 -0
  62. package/js/src/coinbasepro.d.ts +0 -4
  63. package/js/src/coinbasepro.js +1 -44
  64. package/js/src/coinex.js +14 -1
  65. package/js/src/coinsph.d.ts +0 -1
  66. package/js/src/coinsph.js +0 -29
  67. package/js/src/cryptocom.js +22 -10
  68. package/js/src/gate.js +37 -39
  69. package/js/src/gemini.js +1 -0
  70. package/js/src/novadax.js +28 -16
  71. package/js/src/okcoin.d.ts +1 -0
  72. package/js/src/okcoin.js +81 -22
  73. package/js/src/phemex.d.ts +2 -108
  74. package/js/src/phemex.js +105 -29
  75. package/js/src/pro/binance.d.ts +0 -2
  76. package/js/src/pro/binance.js +19 -216
  77. package/js/src/pro/bitget.d.ts +3 -5
  78. package/js/src/pro/bitget.js +780 -736
  79. package/js/src/pro/bitmart.js +8 -10
  80. package/js/src/pro/bitmex.js +9 -34
  81. package/js/src/pro/bitpanda.d.ts +1 -1
  82. package/js/src/pro/bitpanda.js +4 -4
  83. package/js/src/pro/bybit.d.ts +1 -2
  84. package/js/src/pro/bybit.js +21 -97
  85. package/js/src/pro/coinbasepro.d.ts +2 -2
  86. package/js/src/pro/coinbasepro.js +36 -40
  87. package/js/src/pro/cryptocom.d.ts +1 -1
  88. package/js/src/pro/cryptocom.js +10 -26
  89. package/js/src/pro/gate.d.ts +1 -0
  90. package/js/src/pro/gate.js +20 -17
  91. package/js/src/pro/kucoin.d.ts +1 -0
  92. package/js/src/pro/kucoin.js +39 -39
  93. package/js/src/pro/kucoinfutures.d.ts +2 -1
  94. package/js/src/pro/kucoinfutures.js +40 -36
  95. package/js/src/pro/okx.d.ts +1 -1
  96. package/js/src/pro/okx.js +16 -29
  97. package/js/src/tokocrypto.js +28 -14
  98. package/js/src/woo.d.ts +1 -0
  99. package/js/src/woo.js +42 -15
  100. package/package.json +2 -2
  101. package/skip-tests.json +3 -14
@@ -31,8 +31,17 @@ class okcoin extends okcoin$1 {
31
31
  'future': true,
32
32
  'option': undefined,
33
33
  'cancelOrder': true,
34
+ 'createMarketBuyOrderWithCost': true,
35
+ 'createMarketOrderWithCost': false,
36
+ 'createMarketSellOrderWithCost': false,
34
37
  'createOrder': true,
35
38
  'fetchBalance': true,
39
+ 'fetchBorrowInterest': false,
40
+ 'fetchBorrowRate': false,
41
+ 'fetchBorrowRateHistories': false,
42
+ 'fetchBorrowRateHistory': false,
43
+ 'fetchBorrowRates': false,
44
+ 'fetchBorrowRatesPerSymbol': false,
36
45
  'fetchClosedOrders': true,
37
46
  'fetchCurrencies': true,
38
47
  'fetchDepositAddress': true,
@@ -54,6 +63,10 @@ class okcoin extends okcoin$1 {
54
63
  'fetchTrades': true,
55
64
  'fetchTransactions': undefined,
56
65
  'fetchWithdrawals': true,
66
+ 'reduceMargin': false,
67
+ 'repayCrossMargin': false,
68
+ 'repayIsolatedMargin': false,
69
+ 'setMargin': false,
57
70
  'transfer': true,
58
71
  'withdraw': true,
59
72
  },
@@ -1253,6 +1266,26 @@ class okcoin extends okcoin$1 {
1253
1266
  }
1254
1267
  return this.safeBalance(result);
1255
1268
  }
1269
+ async createMarketBuyOrderWithCost(symbol, cost, params = {}) {
1270
+ /**
1271
+ * @method
1272
+ * @name okcoin#createMarketBuyOrderWithCost
1273
+ * @description create a market buy order by providing the symbol and cost
1274
+ * @see https://www.okcoin.com/docs-v5/en/#rest-api-trade-place-order
1275
+ * @param {string} symbol unified symbol of the market to create an order in
1276
+ * @param {float} cost how much you want to trade in units of the quote currency
1277
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
1278
+ * @returns {object} an [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
1279
+ */
1280
+ await this.loadMarkets();
1281
+ const market = this.market(symbol);
1282
+ if (!market['spot']) {
1283
+ throw new errors.NotSupported(this.id + ' createMarketBuyOrderWithCost() supports spot orders only');
1284
+ }
1285
+ params['createMarketBuyOrderRequiresPrice'] = false;
1286
+ params['tgtCcy'] = 'quote_ccy';
1287
+ return await this.createOrder(symbol, 'market', 'buy', cost, undefined, params);
1288
+ }
1256
1289
  async createOrder(symbol, type, side, amount, price = undefined, params = {}) {
1257
1290
  /**
1258
1291
  * @method
@@ -1279,6 +1312,7 @@ class okcoin extends okcoin$1 {
1279
1312
  * @param {float} [params.stopLoss.triggerPrice] stop loss trigger price
1280
1313
  * @param {float} [params.stopLoss.price] used for stop loss limit orders, not used for stop loss market price orders
1281
1314
  * @param {string} [params.stopLoss.type] 'market' or 'limit' used to specify the stop loss price type
1315
+ * @param {float} [params.cost] *spot market buy only* the quote quantity that can be used as an alternative for the amount
1282
1316
  * @returns {object} an [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
1283
1317
  */
1284
1318
  await this.loadMarkets();
@@ -1289,16 +1323,25 @@ class okcoin extends okcoin$1 {
1289
1323
  if ((requestOrdType === 'trigger') || (requestOrdType === 'conditional') || (type === 'oco') || (type === 'move_order_stop') || (type === 'iceberg') || (type === 'twap')) {
1290
1324
  method = 'privatePostTradeOrderAlgo';
1291
1325
  }
1292
- if ((method !== 'privatePostTradeOrder') && (method !== 'privatePostTradeOrderAlgo') && (method !== 'privatePostTradeBatchOrders')) {
1293
- throw new errors.ExchangeError(this.id + ' createOrder() this.options["createOrder"] must be either privatePostTradeBatchOrders or privatePostTradeOrder or privatePostTradeOrderAlgo');
1294
- }
1295
1326
  if (method === 'privatePostTradeBatchOrders') {
1296
1327
  // keep the request body the same
1297
1328
  // submit a single order in an array to the batch order endpoint
1298
1329
  // because it has a lower ratelimit
1299
1330
  request = [request];
1300
1331
  }
1301
- const response = await this[method](request);
1332
+ let response = undefined;
1333
+ if (method === 'privatePostTradeOrder') {
1334
+ response = await this.privatePostTradeOrder(request);
1335
+ }
1336
+ else if (method === 'privatePostTradeOrderAlgo') {
1337
+ response = await this.privatePostTradeOrderAlgo(request);
1338
+ }
1339
+ else if (method === 'privatePostTradeBatchOrders') {
1340
+ response = await this.privatePostTradeBatchOrders(request);
1341
+ }
1342
+ else {
1343
+ throw new errors.ExchangeError(this.id + ' createOrder() this.options["createOrder"] must be either privatePostTradeBatchOrders or privatePostTradeOrder or privatePostTradeOrderAlgo');
1344
+ }
1302
1345
  const data = this.safeValue(response, 'data', []);
1303
1346
  const first = this.safeValue(data, 0);
1304
1347
  const order = this.parseOrder(first, market);
@@ -1318,7 +1361,7 @@ class okcoin extends okcoin$1 {
1318
1361
  'ordType': type,
1319
1362
  // 'ordType': type, // privatePostTradeOrder: market, limit, post_only, fok, ioc, optimal_limit_ioc
1320
1363
  // 'ordType': type, // privatePostTradeOrderAlgo: conditional, oco, trigger, move_order_stop, iceberg, twap
1321
- 'sz': this.amountToPrecision(symbol, amount),
1364
+ // 'sz': this.amountToPrecision (symbol, amount),
1322
1365
  // 'px': this.priceToPrecision (symbol, price), // limit orders only
1323
1366
  // 'reduceOnly': false,
1324
1367
  //
@@ -1385,30 +1428,37 @@ class okcoin extends okcoin$1 {
1385
1428
  // see documentation: https://www.okx.com/docs-v5/en/#rest-api-trade-place-order
1386
1429
  if (tgtCcy === 'quote_ccy') {
1387
1430
  // quote_ccy: sz refers to units of quote currency
1388
- let notional = this.safeNumber2(params, 'cost', 'sz');
1389
- const createMarketBuyOrderRequiresPrice = this.safeValue(this.options, 'createMarketBuyOrderRequiresPrice', true);
1390
- if (createMarketBuyOrderRequiresPrice) {
1391
- if (price !== undefined) {
1392
- if (notional === undefined) {
1393
- const amountString = this.numberToString(amount);
1394
- const priceString = this.numberToString(price);
1395
- const quoteAmount = Precise["default"].stringMul(amountString, priceString);
1396
- notional = this.parseNumber(quoteAmount);
1397
- }
1431
+ let quoteAmount = undefined;
1432
+ let createMarketBuyOrderRequiresPrice = true;
1433
+ [createMarketBuyOrderRequiresPrice, params] = this.handleOptionAndParams(params, 'createOrder', 'createMarketBuyOrderRequiresPrice', true);
1434
+ const cost = this.safeNumber2(params, 'cost', 'sz');
1435
+ params = this.omit(params, ['cost', 'sz']);
1436
+ if (cost !== undefined) {
1437
+ quoteAmount = this.costToPrecision(symbol, cost);
1438
+ }
1439
+ else if (createMarketBuyOrderRequiresPrice) {
1440
+ if (price === undefined) {
1441
+ throw new errors.InvalidOrder(this.id + ' createOrder() requires the price argument for market buy orders to calculate the total cost to spend (amount * price), alternatively set the createMarketBuyOrderRequiresPrice option or param to false and pass the cost to spend (quote quantity) in the amount argument');
1398
1442
  }
1399
- else if (notional === undefined) {
1400
- throw new errors.InvalidOrder(this.id + " createOrder() requires the price argument with market buy orders to calculate total order cost (amount to spend), where cost = amount * price. Supply a price argument to createOrder() call if you want the cost to be calculated for you from price and amount, or, alternatively, add .options['createMarketBuyOrderRequiresPrice'] = false and supply the total cost value in the 'amount' argument or in the 'cost' unified extra parameter or in exchange-specific 'sz' extra parameter (the exchange-specific behaviour)");
1443
+ else {
1444
+ const amountString = this.numberToString(amount);
1445
+ const priceString = this.numberToString(price);
1446
+ const costRequest = Precise["default"].stringMul(amountString, priceString);
1447
+ quoteAmount = this.costToPrecision(symbol, costRequest);
1401
1448
  }
1402
1449
  }
1403
1450
  else {
1404
- notional = (notional === undefined) ? amount : notional;
1451
+ quoteAmount = this.costToPrecision(symbol, amount);
1405
1452
  }
1406
- request['sz'] = this.costToPrecision(symbol, notional);
1407
- params = this.omit(params, ['cost', 'sz']);
1453
+ request['sz'] = quoteAmount;
1454
+ }
1455
+ else {
1456
+ request['sz'] = this.amountToPrecision(symbol, amount);
1408
1457
  }
1409
1458
  }
1410
1459
  }
1411
1460
  else {
1461
+ request['sz'] = this.amountToPrecision(symbol, amount);
1412
1462
  if ((!trigger) && (!conditional)) {
1413
1463
  request['px'] = this.priceToPrecision(symbol, price);
1414
1464
  }
@@ -2813,7 +2863,16 @@ class okcoin extends okcoin$1 {
2813
2863
  request['ccy'] = currency['id'];
2814
2864
  }
2815
2865
  [request, params] = this.handleUntilOption('end', request, params);
2816
- const response = await this[method](this.extend(request, params));
2866
+ let response = undefined;
2867
+ if (method === 'privateGetAccountBillsArchive') {
2868
+ response = await this.privateGetAccountBillsArchive(this.extend(request, params));
2869
+ }
2870
+ else if (method === 'privateGetAssetBills') {
2871
+ response = await this.privateGetAssetBills(this.extend(request, params));
2872
+ }
2873
+ else {
2874
+ response = await this.privateGetAccountBills(this.extend(request, params));
2875
+ }
2817
2876
  //
2818
2877
  // privateGetAccountBills, privateGetAccountBillsArchive
2819
2878
  //
@@ -157,6 +157,7 @@ class phemex extends phemex$1 {
157
157
  },
158
158
  'v2': {
159
159
  'get': {
160
+ 'public/products': 5,
160
161
  'md/v2/orderbook': 5,
161
162
  'md/v2/trade': 5,
162
163
  'md/v2/ticker/24hr': 5,
@@ -483,6 +484,8 @@ class phemex extends phemex$1 {
483
484
  //
484
485
  // {
485
486
  // "symbol":"BTCUSD",
487
+ // "code":"1",
488
+ // "type":"Perpetual",
486
489
  // "displaySymbol":"BTC / USD",
487
490
  // "indexSymbol":".BTC",
488
491
  // "markSymbol":".MBTC",
@@ -500,9 +503,10 @@ class phemex extends phemex$1 {
500
503
  // "minPriceEp":5000,
501
504
  // "maxPriceEp":10000000000,
502
505
  // "maxOrderQty":1000000,
503
- // "type":"Perpetual",
504
506
  // "status":"Listed",
505
507
  // "tipOrderQty":1000000,
508
+ // "listTime":"1574650800000",
509
+ // "majorSymbol":true,
506
510
  // "steps":"50",
507
511
  // "riskLimits":[
508
512
  // {"limit":100,"initialMargin":"1.0%","initialMarginEr":1000000,"maintenanceMargin":"0.5%","maintenanceMarginEr":500000},
@@ -560,7 +564,7 @@ class phemex extends phemex$1 {
560
564
  // "1.0"
561
565
  contractSize = this.parseNumber(contractSizeString);
562
566
  }
563
- return {
567
+ return this.safeMarketStructure({
564
568
  'id': id,
565
569
  'symbol': base + '/' + quote + ':' + settle,
566
570
  'base': base,
@@ -613,24 +617,26 @@ class phemex extends phemex$1 {
613
617
  },
614
618
  'created': undefined,
615
619
  'info': market,
616
- };
620
+ });
617
621
  }
618
622
  parseSpotMarket(market) {
619
623
  //
620
624
  // {
621
625
  // "symbol":"sBTCUSDT",
622
626
  // "code":1001,
627
+ // "type":"Spot",
623
628
  // "displaySymbol":"BTC / USDT",
624
629
  // "quoteCurrency":"USDT",
625
630
  // "priceScale":8,
626
631
  // "ratioScale":8,
627
632
  // "pricePrecision":2,
628
- // "type":"Spot",
629
633
  // "baseCurrency":"BTC",
630
634
  // "baseTickSize":"0.000001 BTC",
631
635
  // "baseTickSizeEv":100,
632
636
  // "quoteTickSize":"0.01 USDT",
633
637
  // "quoteTickSizeEv":1000000,
638
+ // "baseQtyPrecision":6,
639
+ // "quoteQtyPrecision":2,
634
640
  // "minOrderValue":"10 USDT",
635
641
  // "minOrderValueEv":1000000000,
636
642
  // "maxBaseOrderSize":"1000 BTC",
@@ -641,13 +647,13 @@ class phemex extends phemex$1 {
641
647
  // "defaultTakerFeeEr":100000,
642
648
  // "defaultMakerFee":"0.001",
643
649
  // "defaultMakerFeeEr":100000,
644
- // "baseQtyPrecision":6,
645
- // "quoteQtyPrecision":2,
650
+ // "description":"BTCUSDT is a BTC/USDT spot trading pair. Minimum order value is 1 USDT",
646
651
  // "status":"Listed",
647
652
  // "tipOrderQty":2,
648
- // "description":"BTCUSDT is a BTC/USDT spot trading pair. Minimum order value is 1 USDT",
653
+ // "listTime":1589338800000,
654
+ // "buyPriceUpperLimitPct":110,
655
+ // "sellPriceLowerLimitPct":90,
649
656
  // "leverage":5
650
- // "valueScale":8,
651
657
  // },
652
658
  //
653
659
  const type = this.safeStringLower(market, 'type');
@@ -659,7 +665,7 @@ class phemex extends phemex$1 {
659
665
  const status = this.safeString(market, 'status');
660
666
  const precisionAmount = this.parseSafeNumber(this.safeString(market, 'baseTickSize'));
661
667
  const precisionPrice = this.parseSafeNumber(this.safeString(market, 'quoteTickSize'));
662
- return {
668
+ return this.safeMarketStructure({
663
669
  'id': id,
664
670
  'symbol': base + '/' + quote,
665
671
  'base': base,
@@ -712,7 +718,7 @@ class phemex extends phemex$1 {
712
718
  },
713
719
  'created': undefined,
714
720
  'info': market,
715
- };
721
+ });
716
722
  }
717
723
  async fetchMarkets(params = {}) {
718
724
  /**
@@ -722,21 +728,22 @@ class phemex extends phemex$1 {
722
728
  * @param {object} [params] extra parameters specific to the exchange API endpoint
723
729
  * @returns {object[]} an array of objects representing market data
724
730
  */
725
- const v2Products = await this.publicGetCfgV2Products(params);
731
+ const v2Products = await this.v2GetPublicProducts(params);
726
732
  //
727
733
  // {
728
734
  // "code":0,
729
- // "msg":"OK",
735
+ // "msg":"",
730
736
  // "data":{
731
- // "ratioScale":8,
732
737
  // "currencies":[
733
- // {"code":1,"currency":"BTC","valueScale":8,"minValueEv":1,"maxValueEv":5000000000000000000,"name":"Bitcoin"},
734
- // {"code":2,"currency":"USD","valueScale":4,"minValueEv":1,"maxValueEv":500000000000000,"name":"USD"},
735
- // {"code":3,"currency":"USDT","valueScale":8,"minValueEv":1,"maxValueEv":5000000000000000000,"name":"TetherUS"},
738
+ // {"currency":"BTC","name":"Bitcoin","code":1,"valueScale":8,"minValueEv":1,"maxValueEv":5000000000000000000,"needAddrTag":0,"status":"Listed","displayCurrency":"BTC","inAssetsDisplay":1,"perpetual":0,"stableCoin":0,"assetsPrecision":8},
739
+ // {"currency":"USD","name":"USD","code":2,"valueScale":4,"minValueEv":1,"maxValueEv":5000000000000000000,"needAddrTag":0,"status":"Listed","displayCurrency":"USD","inAssetsDisplay":1,"perpetual":0,"stableCoin":0,"assetsPrecision":2},
740
+ // {"currency":"USDT","name":"TetherUS","code":3,"valueScale":8,"minValueEv":1,"maxValueEv":5000000000000000000,"needAddrTag":0,"status":"Listed","displayCurrency":"USDT","inAssetsDisplay":1,"perpetual":2,"stableCoin":1,"assetsPrecision":8},
736
741
  // ],
737
742
  // "products":[
738
743
  // {
739
744
  // "symbol":"BTCUSD",
745
+ // "code":1,
746
+ // "type":"Perpetual"
740
747
  // "displaySymbol":"BTC / USD",
741
748
  // "indexSymbol":".BTC",
742
749
  // "markSymbol":".MBTC",
@@ -754,22 +761,31 @@ class phemex extends phemex$1 {
754
761
  // "minPriceEp":5000,
755
762
  // "maxPriceEp":10000000000,
756
763
  // "maxOrderQty":1000000,
757
- // "type":"Perpetual"
764
+ // "description":"BTC/USD perpetual contracts are priced on the .BTC Index. Each contract is worth 1 USD. Funding fees are paid and received every 8 hours at UTC time: 00:00, 08:00 and 16:00.",
765
+ // "status":"Listed",
766
+ // "tipOrderQty":1000000,
767
+ // "listTime":1574650800000,
768
+ // "majorSymbol":true,
769
+ // "defaultLeverage":"-10",
770
+ // "fundingInterval":28800,
771
+ // "maxLeverage":100
758
772
  // },
759
773
  // {
760
774
  // "symbol":"sBTCUSDT",
761
775
  // "code":1001,
776
+ // "type":"Spot",
762
777
  // "displaySymbol":"BTC / USDT",
763
778
  // "quoteCurrency":"USDT",
764
779
  // "priceScale":8,
765
780
  // "ratioScale":8,
766
781
  // "pricePrecision":2,
767
- // "type":"Spot",
768
782
  // "baseCurrency":"BTC",
769
783
  // "baseTickSize":"0.000001 BTC",
770
784
  // "baseTickSizeEv":100,
771
785
  // "quoteTickSize":"0.01 USDT",
772
786
  // "quoteTickSizeEv":1000000,
787
+ // "baseQtyPrecision":6,
788
+ // "quoteQtyPrecision":2,
773
789
  // "minOrderValue":"10 USDT",
774
790
  // "minOrderValueEv":1000000000,
775
791
  // "maxBaseOrderSize":"1000 BTC",
@@ -780,14 +796,51 @@ class phemex extends phemex$1 {
780
796
  // "defaultTakerFeeEr":100000,
781
797
  // "defaultMakerFee":"0.001",
782
798
  // "defaultMakerFeeEr":100000,
783
- // "baseQtyPrecision":6,
784
- // "quoteQtyPrecision":2,
799
+ // "description":"BTCUSDT is a BTC/USDT spot trading pair. Minimum order value is 1 USDT",
785
800
  // "status":"Listed",
786
801
  // "tipOrderQty":2,
787
- // "description":"BTCUSDT is a BTC/USDT spot trading pair. Minimum order value is 1 USDT",
802
+ // "listTime":1589338800000,
803
+ // "buyPriceUpperLimitPct":110,
804
+ // "sellPriceLowerLimitPct":90,
788
805
  // "leverage":5
789
806
  // },
790
807
  // ],
808
+ // "perpProductsV2":[
809
+ // {
810
+ // "symbol":"BTCUSDT",
811
+ // "code":41541,
812
+ // "type":"PerpetualV2",
813
+ // "displaySymbol":"BTC / USDT",
814
+ // "indexSymbol":".BTCUSDT",
815
+ // "markSymbol":".MBTCUSDT",
816
+ // "fundingRateSymbol":".BTCUSDTFR",
817
+ // "fundingRate8hSymbol":".BTCUSDTFR8H",
818
+ // "contractUnderlyingAssets":"BTC",
819
+ // "settleCurrency":"USDT",
820
+ // "quoteCurrency":"USDT",
821
+ // "tickSize":"0.1",
822
+ // "priceScale":0,
823
+ // "ratioScale":0,
824
+ // "pricePrecision":1,
825
+ // "baseCurrency":"BTC",
826
+ // "description":"BTC/USDT perpetual contracts are priced on the .BTCUSDT Index. Each contract is worth 1 BTC. Funding fees are paid and received every 8 hours at UTC time: 00:00, 08:00 and 16:00.",
827
+ // "status":"Listed",
828
+ // "tipOrderQty":0,
829
+ // "listTime":1668225600000,
830
+ // "majorSymbol":true,
831
+ // "defaultLeverage":"-10",
832
+ // "fundingInterval":28800,
833
+ // "maxLeverage":100,
834
+ // "maxOrderQtyRq":"1000",
835
+ // "maxPriceRp":"2000000000",
836
+ // "minOrderValueRv":"1",
837
+ // "minPriceRp":"1000.0",
838
+ // "qtyPrecision":3,
839
+ // "qtyStepSize":"0.001",
840
+ // "tipOrderQtyRq":"200",
841
+ // "maxOpenPosLeverage":100.0
842
+ // },
843
+ // ],
791
844
  // "riskLimits":[
792
845
  // {
793
846
  // "symbol":"BTCUSD",
@@ -803,7 +856,25 @@ class phemex extends phemex$1 {
803
856
  // {"initialMargin":"1.0%","initialMarginEr":1000000,"options":[1,2,3,5,10,25,50,100]},
804
857
  // {"initialMargin":"1.5%","initialMarginEr":1500000,"options":[1,2,3,5,10,25,50,66]},
805
858
  // {"initialMargin":"2.0%","initialMarginEr":2000000,"options":[1,2,3,5,10,25,33,50]},
806
- // ]
859
+ // ],
860
+ // "riskLimitsV2":[
861
+ // {
862
+ // "symbol":"BTCUSDT",
863
+ // "steps":"2000K",
864
+ // "riskLimits":[
865
+ // {"limit":2000000,"initialMarginRr":"0.01","maintenanceMarginRr":"0.005"},,
866
+ // {"limit":4000000,"initialMarginRr":"0.015","maintenanceMarginRr":"0.0075"},
867
+ // {"limit":6000000,"initialMarginRr":"0.02","maintenanceMarginRr":"0.01"},
868
+ // ]
869
+ // },
870
+ // ],
871
+ // "leveragesV2":[
872
+ // {"options":[1.0,2.0,3.0,5.0,10.0,25.0,50.0,100.0],"initialMarginRr":"0.01"},
873
+ // {"options":[1.0,2.0,3.0,5.0,10.0,25.0,50.0,66.67],"initialMarginRr":"0.015"},
874
+ // {"options":[1.0,2.0,3.0,5.0,10.0,25.0,33.0,50.0],"initialMarginRr":"0.02"},
875
+ // ],
876
+ // "ratioScale":8,
877
+ // "md5Checksum":"5c6604814d3c1bafbe602c3d11a7e8bf",
807
878
  // }
808
879
  // }
809
880
  //
@@ -845,8 +916,12 @@ class phemex extends phemex$1 {
845
916
  // }
846
917
  //
847
918
  const v2ProductsData = this.safeValue(v2Products, 'data', {});
848
- const products = this.safeValue(v2ProductsData, 'products', []);
849
- const riskLimits = this.safeValue(v2ProductsData, 'riskLimits', []);
919
+ let products = this.safeValue(v2ProductsData, 'products', []);
920
+ const perpetualProductsV2 = this.safeValue(v2ProductsData, 'perpProductsV2', []);
921
+ products = this.arrayConcat(products, perpetualProductsV2);
922
+ let riskLimits = this.safeValue(v2ProductsData, 'riskLimits', []);
923
+ const riskLimitsV2 = this.safeValue(v2ProductsData, 'riskLimitsV2', []);
924
+ riskLimits = this.arrayConcat(riskLimits, riskLimitsV2);
850
925
  const currencies = this.safeValue(v2ProductsData, 'currencies', []);
851
926
  const riskLimitsById = this.indexBy(riskLimits, 'symbol');
852
927
  const v1ProductsById = this.indexBy(v1ProductsData, 'symbol');
@@ -882,7 +957,7 @@ class phemex extends phemex$1 {
882
957
  * @param {object} [params] extra parameters specific to the exchange API endpoint
883
958
  * @returns {object} an associative dictionary of currencies
884
959
  */
885
- const response = await this.publicGetCfgV2Products(params);
960
+ const response = await this.v2GetPublicProducts(params);
886
961
  //
887
962
  // {
888
963
  // "code":0,
@@ -890,9 +965,9 @@ class phemex extends phemex$1 {
890
965
  // "data":{
891
966
  // ...,
892
967
  // "currencies":[
893
- // {"currency":"BTC","valueScale":8,"minValueEv":1,"maxValueEv":5000000000000000000,"name":"Bitcoin"},
894
- // {"currency":"USD","valueScale":4,"minValueEv":1,"maxValueEv":500000000000000,"name":"USD"},
895
- // {"currency":"USDT","valueScale":8,"minValueEv":1,"maxValueEv":5000000000000000000,"name":"TetherUS"},
968
+ // {"currency":"BTC","name":"Bitcoin","code":1,"valueScale":8,"minValueEv":1,"maxValueEv":5000000000000000000,"needAddrTag":0,"status":"Listed","displayCurrency":"BTC","inAssetsDisplay":1,"perpetual":0,"stableCoin":0,"assetsPrecision":8},
969
+ // {"currency":"USD","name":"USD","code":2,"valueScale":4,"minValueEv":1,"maxValueEv":5000000000000000000,"needAddrTag":0,"status":"Listed","displayCurrency":"USD","inAssetsDisplay":1,"perpetual":0,"stableCoin":0,"assetsPrecision":2},
970
+ // {"currency":"USDT","name":"TetherUS","code":3,"valueScale":8,"minValueEv":1,"maxValueEv":5000000000000000000,"needAddrTag":0,"status":"Listed","displayCurrency":"USDT","inAssetsDisplay":1,"perpetual":2,"stableCoin":1,"assetsPrecision":8},
896
971
  // ],
897
972
  // ...
898
973
  // }
@@ -905,6 +980,7 @@ class phemex extends phemex$1 {
905
980
  const id = this.safeString(currency, 'currency');
906
981
  const name = this.safeString(currency, 'name');
907
982
  const code = this.safeCurrencyCode(id);
983
+ const status = this.safeString(currency, 'status');
908
984
  const valueScaleString = this.safeString(currency, 'valueScale');
909
985
  const valueScale = parseInt(valueScaleString);
910
986
  const minValueEv = this.safeString(currency, 'minValueEv');
@@ -923,7 +999,7 @@ class phemex extends phemex$1 {
923
999
  'info': currency,
924
1000
  'code': code,
925
1001
  'name': name,
926
- 'active': undefined,
1002
+ 'active': status === 'Listed',
927
1003
  'deposit': undefined,
928
1004
  'withdraw': undefined,
929
1005
  'fee': undefined,