ccxt 4.1.29 → 4.1.31

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 (61) hide show
  1. package/CHANGELOG.md +186 -0
  2. package/README.md +3 -3
  3. package/dist/ccxt.browser.js +474 -135
  4. package/dist/ccxt.browser.min.js +2 -2
  5. package/dist/cjs/ccxt.js +1 -1
  6. package/dist/cjs/src/ascendex.js +89 -12
  7. package/dist/cjs/src/base/Exchange.js +6 -0
  8. package/dist/cjs/src/base/ws/Future.js +6 -2
  9. package/dist/cjs/src/bitget.js +187 -44
  10. package/dist/cjs/src/bitopro.js +5 -4
  11. package/dist/cjs/src/bitrue.js +33 -18
  12. package/dist/cjs/src/bitvavo.js +43 -7
  13. package/dist/cjs/src/bybit.js +0 -3
  14. package/dist/cjs/src/coinex.js +2 -1
  15. package/dist/cjs/src/gate.js +58 -10
  16. package/dist/cjs/src/gemini.js +1 -2
  17. package/dist/cjs/src/hitbtc.js +32 -22
  18. package/dist/cjs/src/huobi.js +0 -1
  19. package/dist/cjs/src/huobijp.js +0 -1
  20. package/dist/cjs/src/krakenfutures.js +1 -1
  21. package/dist/cjs/src/mexc.js +2 -6
  22. package/dist/cjs/src/okx.js +1 -0
  23. package/dist/cjs/src/phemex.js +3 -0
  24. package/dist/cjs/src/pro/huobi.js +4 -0
  25. package/js/ccxt.d.ts +3 -3
  26. package/js/ccxt.js +1 -1
  27. package/js/src/ascendex.d.ts +11 -1
  28. package/js/src/ascendex.js +89 -12
  29. package/js/src/base/Exchange.d.ts +5 -3
  30. package/js/src/base/Exchange.js +6 -0
  31. package/js/src/base/types.d.ts +9 -0
  32. package/js/src/base/ws/Future.js +6 -2
  33. package/js/src/binance.d.ts +1 -1
  34. package/js/src/bitget.d.ts +3 -3
  35. package/js/src/bitget.js +187 -44
  36. package/js/src/bitopro.js +5 -4
  37. package/js/src/bitrue.js +33 -18
  38. package/js/src/bitvavo.d.ts +13 -13
  39. package/js/src/bitvavo.js +43 -7
  40. package/js/src/bybit.js +0 -3
  41. package/js/src/coinex.d.ts +2 -2
  42. package/js/src/coinex.js +2 -1
  43. package/js/src/gate.d.ts +3 -3
  44. package/js/src/gate.js +58 -10
  45. package/js/src/gemini.js +1 -2
  46. package/js/src/hitbtc.js +33 -23
  47. package/js/src/huobi.d.ts +1 -1
  48. package/js/src/huobi.js +0 -1
  49. package/js/src/huobijp.js +0 -1
  50. package/js/src/krakenfutures.js +1 -1
  51. package/js/src/kucoinfutures.d.ts +2 -2
  52. package/js/src/mexc.d.ts +2 -2
  53. package/js/src/mexc.js +2 -6
  54. package/js/src/okx.d.ts +2 -2
  55. package/js/src/okx.js +1 -0
  56. package/js/src/phemex.d.ts +2 -2
  57. package/js/src/phemex.js +3 -0
  58. package/js/src/poloniexfutures.d.ts +2 -2
  59. package/js/src/pro/huobi.js +4 -0
  60. package/js/src/woo.d.ts +1 -1
  61. package/package.json +2 -2
package/js/src/bitget.js CHANGED
@@ -28,7 +28,7 @@ export default class bitget extends Exchange {
28
28
  'has': {
29
29
  'CORS': undefined,
30
30
  'spot': true,
31
- 'margin': undefined,
31
+ 'margin': true,
32
32
  'swap': true,
33
33
  'future': true,
34
34
  'option': false,
@@ -1306,11 +1306,16 @@ export default class bitget extends Exchange {
1306
1306
  };
1307
1307
  }
1308
1308
  async fetchMarketsByType(type, params = {}) {
1309
- const method = this.getSupportedMapping(type, {
1310
- 'spot': 'publicSpotGetPublicProducts',
1311
- 'swap': 'publicMixGetMarketContracts',
1312
- });
1313
- const response = await this[method](params);
1309
+ let response = undefined;
1310
+ if (type === 'spot') {
1311
+ response = await this.publicSpotGetPublicProducts(params);
1312
+ }
1313
+ else if (type === 'swap') {
1314
+ response = await this.publicMixGetMarketContracts(params);
1315
+ }
1316
+ else {
1317
+ throw new NotSupported(this.id + ' does not support ' + type + ' market');
1318
+ }
1314
1319
  //
1315
1320
  // spot
1316
1321
  //
@@ -1495,20 +1500,47 @@ export default class bitget extends Exchange {
1495
1500
  * @name bitget#fetchMarketLeverageTiers
1496
1501
  * @description retrieve information on the maximum leverage, and maintenance margin for trades of varying trade sizes for a single market
1497
1502
  * @see https://bitgetlimited.github.io/apidoc/en/mix/#get-position-tier
1503
+ * @see https://bitgetlimited.github.io/apidoc/en/margin/#get-isolated-tier-data
1504
+ * @see https://bitgetlimited.github.io/apidoc/en/margin/#get-cross-tier-data
1498
1505
  * @param {string} symbol unified market symbol
1499
1506
  * @param {object} [params] extra parameters specific to the bitget api endpoint
1507
+ * @param {string} [params.marginMode] for spot margin 'cross' or 'isolated', default is 'isolated'
1508
+ * @param {string} [params.code] required for cross spot margin
1500
1509
  * @returns {object} a [leverage tiers structure]{@link https://github.com/ccxt/ccxt/wiki/Manual#leverage-tiers-structure}
1501
1510
  */
1502
1511
  await this.loadMarkets();
1503
1512
  const request = {};
1504
- let market = undefined;
1505
- market = this.market(symbol);
1506
- if (market['spot']) {
1513
+ const market = this.market(symbol);
1514
+ let type = undefined;
1515
+ [type, params] = this.handleMarketTypeAndParams('fetchMarketLeverageTiers', market, params);
1516
+ let response = undefined;
1517
+ let marginMode = undefined;
1518
+ [marginMode, params] = this.handleMarginModeAndParams('fetchMarketLeverageTiers', params, 'isolated');
1519
+ if ((type === 'swap') || (type === 'future')) {
1520
+ const marketId = market['id'];
1521
+ const parts = marketId.split('_');
1522
+ const productType = this.safeStringUpper(parts, 1);
1523
+ request['symbol'] = marketId;
1524
+ request['productType'] = productType;
1525
+ response = await this.publicMixGetMarketQueryPositionLever(this.extend(request, params));
1526
+ }
1527
+ else if (marginMode === 'isolated') {
1528
+ request['symbol'] = market['info']['symbolName'];
1529
+ response = await this.publicMarginGetIsolatedPublicTierData(this.extend(request, params));
1530
+ }
1531
+ else if (marginMode === 'cross') {
1532
+ const code = this.safeString(params, 'code');
1533
+ this.checkRequiredArgument('fetchMarketLeverageTiers', code, 'code');
1534
+ params = this.omit(params, 'code');
1535
+ const currency = this.currency(code);
1536
+ request['coin'] = currency['code'];
1537
+ response = await this.publicMarginGetCrossPublicTierData(this.extend(request, params));
1538
+ }
1539
+ else {
1507
1540
  throw new BadRequest(this.id + ' fetchMarketLeverageTiers() symbol does not support market ' + symbol);
1508
1541
  }
1509
- request['symbol'] = market['id'];
1510
- request['productType'] = 'UMCBL';
1511
- const response = await this.publicMixGetMarketQueryPositionLever(this.extend(request, params));
1542
+ //
1543
+ // swap and future
1512
1544
  //
1513
1545
  // {
1514
1546
  // "code":"00000",
@@ -1525,10 +1557,50 @@ export default class bitget extends Exchange {
1525
1557
  // "requestTime":1627292076687
1526
1558
  // }
1527
1559
  //
1528
- const result = this.safeValue(response, 'data');
1560
+ // isolated
1561
+ //
1562
+ // {
1563
+ // "code": "00000",
1564
+ // "msg": "success",
1565
+ // "requestTime": 1698352496622,
1566
+ // "data": [
1567
+ // {
1568
+ // "tier": "1",
1569
+ // "symbol": "BTCUSDT",
1570
+ // "leverage": "10",
1571
+ // "baseCoin": "BTC",
1572
+ // "quoteCoin": "USDT",
1573
+ // "baseMaxBorrowableAmount": "3",
1574
+ // "quoteMaxBorrowableAmount": "30000",
1575
+ // "maintainMarginRate": "0.05",
1576
+ // "initRate": "0.1111"
1577
+ // },
1578
+ // ]
1579
+ // }
1580
+ //
1581
+ // cross
1582
+ //
1583
+ // {
1584
+ // "code": "00000",
1585
+ // "msg": "success",
1586
+ // "requestTime": 1698352997077,
1587
+ // "data": [
1588
+ // {
1589
+ // "tier": "1",
1590
+ // "leverage": "3",
1591
+ // "coin": "BTC",
1592
+ // "maxBorrowableAmount": "26",
1593
+ // "maintainMarginRate": "0.1"
1594
+ // }
1595
+ // ]
1596
+ // }
1597
+ //
1598
+ const result = this.safeValue(response, 'data', []);
1529
1599
  return this.parseMarketLeverageTiers(result, market);
1530
1600
  }
1531
1601
  parseMarketLeverageTiers(info, market = undefined) {
1602
+ //
1603
+ // swap and future
1532
1604
  //
1533
1605
  // [
1534
1606
  // {
@@ -1538,22 +1610,57 @@ export default class bitget extends Exchange {
1538
1610
  // "leverage": 125,
1539
1611
  // "keepMarginRate": "0.004"
1540
1612
  // }
1541
- // ],
1613
+ // ]
1614
+ //
1615
+ // isolated
1616
+ //
1617
+ // [
1618
+ // {
1619
+ // "tier": "1",
1620
+ // "symbol": "BTCUSDT",
1621
+ // "leverage": "10",
1622
+ // "baseCoin": "BTC",
1623
+ // "quoteCoin": "USDT",
1624
+ // "baseMaxBorrowableAmount": "3",
1625
+ // "quoteMaxBorrowableAmount": "30000",
1626
+ // "maintainMarginRate": "0.05",
1627
+ // "initRate": "0.1111"
1628
+ // }
1629
+ // ]
1630
+ //
1631
+ // cross
1632
+ //
1633
+ // [
1634
+ // {
1635
+ // "tier": "1",
1636
+ // "leverage": "3",
1637
+ // "coin": "BTC",
1638
+ // "maxBorrowableAmount": "26",
1639
+ // "maintainMarginRate": "0.1"
1640
+ // }
1641
+ // ]
1542
1642
  //
1543
1643
  const tiers = [];
1644
+ let minNotional = 0;
1544
1645
  for (let i = 0; i < info.length; i++) {
1545
1646
  const item = info[i];
1546
- const minNotional = this.safeNumber(item, 'startUnit');
1547
- const maxNotional = this.safeNumber(item, 'endUnit');
1647
+ const minimumNotional = this.safeNumber(item, 'startUnit');
1648
+ if (minimumNotional !== undefined) {
1649
+ minNotional = minimumNotional;
1650
+ }
1651
+ const maxNotional = this.safeNumberN(item, ['endUnit', 'maxBorrowableAmount', 'baseMaxBorrowableAmount']);
1652
+ const marginCurrency = this.safeString2(item, 'coin', 'baseCoin');
1653
+ const currencyId = (marginCurrency !== undefined) ? marginCurrency : market['base'];
1548
1654
  tiers.push({
1549
- 'tier': this.sum(i, 1),
1550
- 'currency': market['base'],
1655
+ 'tier': this.safeInteger2(item, 'level', 'tier'),
1656
+ 'currency': this.safeCurrencyCode(currencyId),
1551
1657
  'minNotional': minNotional,
1552
1658
  'maxNotional': maxNotional,
1553
- 'maintenanceMarginRate': this.safeNumber(item, 'keepMarginRate'),
1659
+ 'maintenanceMarginRate': this.safeNumber2(item, 'keepMarginRate', 'maintainMarginRate'),
1554
1660
  'maxLeverage': this.safeNumber(item, 'leverage'),
1555
1661
  'info': item,
1556
1662
  });
1663
+ minNotional = maxNotional;
1557
1664
  }
1558
1665
  return tiers;
1559
1666
  }
@@ -3335,12 +3442,16 @@ export default class bitget extends Exchange {
3335
3442
  * @description create a list of trade orders (all orders should be of the same symbol)
3336
3443
  * @see https://bitgetlimited.github.io/apidoc/en/spot/#batch-order
3337
3444
  * @see https://bitgetlimited.github.io/apidoc/en/mix/#batch-order
3445
+ * @see https://bitgetlimited.github.io/apidoc/en/margin/#isolated-batch-order
3446
+ * @see https://bitgetlimited.github.io/apidoc/en/margin/#cross-batch-order
3338
3447
  * @param {array} orders list of orders to create, each object should contain the parameters required by createOrder, namely symbol, type, side, amount, price and params
3448
+ * @param {object} [params] extra parameters specific to the api endpoint
3339
3449
  * @returns {object} an [order structure]{@link https://github.com/ccxt/ccxt/wiki/Manual#order-structure}
3340
3450
  */
3341
3451
  await this.loadMarkets();
3342
3452
  const ordersRequests = [];
3343
3453
  let symbol = undefined;
3454
+ let marginMode = undefined;
3344
3455
  for (let i = 0; i < orders.length; i++) {
3345
3456
  const rawOrder = orders[i];
3346
3457
  const marketId = this.safeString(rawOrder, 'symbol');
@@ -3357,23 +3468,44 @@ export default class bitget extends Exchange {
3357
3468
  const amount = this.safeValue(rawOrder, 'amount');
3358
3469
  const price = this.safeValue(rawOrder, 'price');
3359
3470
  const orderParams = this.safeValue(rawOrder, 'params', {});
3471
+ const marginResult = this.handleMarginModeAndParams('createOrders', params);
3472
+ const currentMarginMode = marginResult[0];
3473
+ if (currentMarginMode !== undefined) {
3474
+ if (marginMode === undefined) {
3475
+ marginMode = currentMarginMode;
3476
+ }
3477
+ else {
3478
+ if (marginMode !== currentMarginMode) {
3479
+ throw new BadRequest(this.id + ' createOrders() requires all orders to have the same margin mode (isolated or cross)');
3480
+ }
3481
+ }
3482
+ }
3360
3483
  const orderRequest = this.createOrderRequest(marketId, type, side, amount, price, orderParams);
3361
3484
  ordersRequests.push(orderRequest);
3362
3485
  }
3363
3486
  const market = this.market(symbol);
3487
+ const symbolRequest = (marginMode !== undefined) ? (market['info']['symbolName']) : (market['id']);
3364
3488
  const request = {
3365
- 'symbol': market['id'],
3489
+ 'symbol': symbolRequest,
3366
3490
  };
3367
3491
  let response = undefined;
3368
3492
  if (market['spot']) {
3369
3493
  request['orderList'] = ordersRequests;
3370
- response = await this.privateSpotPostTradeBatchOrders(request);
3371
3494
  }
3372
- else {
3495
+ if ((market['swap']) || (market['future'])) {
3373
3496
  request['orderDataList'] = ordersRequests;
3374
3497
  request['marginCoin'] = market['settleId'];
3375
3498
  response = await this.privateMixPostOrderBatchOrders(request);
3376
3499
  }
3500
+ else if (marginMode === 'isolated') {
3501
+ response = await this.privateMarginPostIsolatedOrderBatchPlaceOrder(request);
3502
+ }
3503
+ else if (marginMode === 'cross') {
3504
+ response = await this.privateMarginPostCrossOrderBatchPlaceOrder(request);
3505
+ }
3506
+ else {
3507
+ response = await this.privateSpotPostTradeBatchOrders(request);
3508
+ }
3377
3509
  //
3378
3510
  // {
3379
3511
  // "code": "00000",
@@ -3441,11 +3573,6 @@ export default class bitget extends Exchange {
3441
3573
  if (!isStopOrder && !isTriggerOrder) {
3442
3574
  throw new InvalidOrder(this.id + ' editOrder() only support plan orders');
3443
3575
  }
3444
- let method = this.getSupportedMapping(marketType, {
3445
- 'spot': 'privateSpotPostPlanModifyPlan',
3446
- 'swap': 'privateMixPostPlanModifyPlan',
3447
- 'future': 'privateMixPostPlanModifyPlan',
3448
- });
3449
3576
  if (triggerPrice !== undefined) {
3450
3577
  // default triggerType to market price for unification
3451
3578
  const triggerType = this.safeString(params, 'triggerType', 'market_price');
@@ -3453,6 +3580,8 @@ export default class bitget extends Exchange {
3453
3580
  request['triggerPrice'] = this.priceToPrecision(symbol, triggerPrice);
3454
3581
  request['executePrice'] = this.priceToPrecision(symbol, price);
3455
3582
  }
3583
+ const omitted = this.omit(query, ['stopPrice', 'triggerType', 'stopLossPrice', 'takeProfitPrice']);
3584
+ let response = undefined;
3456
3585
  if (marketType === 'spot') {
3457
3586
  if (isStopOrder) {
3458
3587
  throw new InvalidOrder(this.id + ' editOrder() does not support stop orders on spot markets, only swap markets');
@@ -3472,10 +3601,15 @@ export default class bitget extends Exchange {
3472
3601
  else {
3473
3602
  request['size'] = this.amountToPrecision(symbol, amount);
3474
3603
  }
3604
+ response = await this.privateSpotPostPlanModifyPlan(this.extend(request, omitted));
3475
3605
  }
3476
3606
  else {
3477
3607
  request['symbol'] = market['id'];
3478
3608
  request['size'] = this.amountToPrecision(symbol, amount);
3609
+ if ((marketType !== 'swap') && (marketType !== 'future')) {
3610
+ throw new NotSupported(this.id + ' editOrder() does not support ' + marketType + ' market');
3611
+ }
3612
+ request['marginCoin'] = market['settleId'];
3479
3613
  if (isStopOrder) {
3480
3614
  if (!isMarketOrder) {
3481
3615
  throw new ExchangeError(this.id + ' editOrder() bitget stopLoss or takeProfit orders must be market orders');
@@ -3488,12 +3622,12 @@ export default class bitget extends Exchange {
3488
3622
  request['triggerPrice'] = this.priceToPrecision(symbol, takeProfitPrice);
3489
3623
  request['planType'] = 'profit_plan';
3490
3624
  }
3491
- method = 'privateMixPostPlanModifyTPSLPlan';
3625
+ response = await this.privateMixPostPlanModifyTPSLPlan(this.extend(request, omitted));
3626
+ }
3627
+ else {
3628
+ response = await this.privateMixPostPlanModifyPlan(this.extend(request, omitted));
3492
3629
  }
3493
- request['marginCoin'] = market['settleId'];
3494
3630
  }
3495
- const omitted = this.omit(query, ['stopPrice', 'triggerType', 'stopLossPrice', 'takeProfitPrice']);
3496
- const response = await this[method](this.extend(request, omitted));
3497
3631
  //
3498
3632
  // spot
3499
3633
  // {
@@ -3823,16 +3957,20 @@ export default class bitget extends Exchange {
3823
3957
  await this.loadMarkets();
3824
3958
  const market = this.market(symbol);
3825
3959
  const [marketType, query] = this.handleMarketTypeAndParams('fetchOrder', market, params);
3826
- const method = this.getSupportedMapping(marketType, {
3827
- 'spot': 'privateSpotPostTradeOrderInfo',
3828
- 'swap': 'privateMixGetOrderDetail',
3829
- 'future': 'privateMixGetOrderDetail',
3830
- });
3831
3960
  const request = {
3832
3961
  'symbol': market['id'],
3833
3962
  'orderId': id,
3834
3963
  };
3835
- let response = await this[method](this.extend(request, query));
3964
+ let response = undefined;
3965
+ if (marketType === 'spot') {
3966
+ response = await this.privateSpotPostTradeOrderInfo(this.extend(request, query));
3967
+ }
3968
+ else if ((marketType === 'swap') || (marketType === 'future')) {
3969
+ response = await this.privateMixGetOrderDetail(this.extend(request, query));
3970
+ }
3971
+ else {
3972
+ throw new NotSupported(this.id + ' fetchOrder() does not support ' + marketType + ' market');
3973
+ }
3836
3974
  // spot
3837
3975
  // {
3838
3976
  // code: '00000',
@@ -4758,16 +4896,20 @@ export default class bitget extends Exchange {
4758
4896
  await this.loadMarkets();
4759
4897
  const market = this.market(symbol);
4760
4898
  const [marketType, query] = this.handleMarketTypeAndParams('fetchOrderTrades', market, params);
4761
- const method = this.getSupportedMapping(marketType, {
4762
- 'spot': 'privateSpotPostTradeFills',
4763
- 'swap': 'privateMixGetOrderFills',
4764
- 'future': 'privateMixGetOrderFills',
4765
- });
4766
4899
  const request = {
4767
4900
  'symbol': market['id'],
4768
4901
  'orderId': id,
4769
4902
  };
4770
- const response = await this[method](this.extend(request, query));
4903
+ let response = undefined;
4904
+ if (marketType === 'spot') {
4905
+ response = await this.privateSpotPostTradeFills(this.extend(request, query));
4906
+ }
4907
+ else if ((marketType === 'swap') || (marketType === 'future')) {
4908
+ response = await this.privateMixGetOrderFills(this.extend(request, query));
4909
+ }
4910
+ else {
4911
+ throw new NotSupported(this.id + ' fetchOrderTrades() does not support ' + marketType + ' market');
4912
+ }
4771
4913
  // spot
4772
4914
  //
4773
4915
  // swap
@@ -5231,7 +5373,7 @@ export default class bitget extends Exchange {
5231
5373
  'previousFundingDatetime': undefined,
5232
5374
  };
5233
5375
  }
5234
- async fetchFundingHistory(symbol, since = undefined, limit = undefined, params = {}) {
5376
+ async fetchFundingHistory(symbol = undefined, since = undefined, limit = undefined, params = {}) {
5235
5377
  /**
5236
5378
  * @method
5237
5379
  * @name bitget#fetchFundingHistory
@@ -5244,6 +5386,7 @@ export default class bitget extends Exchange {
5244
5386
  * @returns {object[]} a list of [funding history structures]{@link https://github.com/ccxt/ccxt/wiki/Manual#funding-history-structure}
5245
5387
  */
5246
5388
  await this.loadMarkets();
5389
+ this.checkRequiredSymbol('fetchFundingHistory', symbol);
5247
5390
  const market = this.market(symbol);
5248
5391
  if (!market['swap']) {
5249
5392
  throw new BadSymbol(this.id + ' fetchFundingHistory() supports swap contracts only');
package/js/src/bitopro.js CHANGED
@@ -1124,14 +1124,15 @@ export default class bitopro extends Exchange {
1124
1124
  const request = {
1125
1125
  // 'pair': market['id'], // optional
1126
1126
  };
1127
- // privateDeleteOrdersAll or privateDeleteOrdersPair
1128
- let method = this.safeString(this.options, 'privateDeleteOrdersPair', 'privateDeleteOrdersAll');
1127
+ let response = undefined;
1129
1128
  if (symbol !== undefined) {
1130
1129
  const market = this.market(symbol);
1131
1130
  request['pair'] = market['id'];
1132
- method = 'privateDeleteOrdersPair';
1131
+ response = await this.privateDeleteOrdersPair(this.extend(request, params));
1132
+ }
1133
+ else {
1134
+ response = await this.privateDeleteOrdersAll(this.extend(request, params));
1133
1135
  }
1134
- const response = await this[method](this.extend(request, params));
1135
1136
  const result = this.safeValue(response, 'data', {});
1136
1137
  //
1137
1138
  // {
package/js/src/bitrue.js CHANGED
@@ -799,6 +799,16 @@ export default class bitrue extends Exchange {
799
799
  return orderbook;
800
800
  }
801
801
  parseTicker(ticker, market = undefined) {
802
+ //
803
+ // fetchBidsAsks
804
+ //
805
+ // {
806
+ // "symbol": "LTCBTC",
807
+ // "bidPrice": "4.00000000",
808
+ // "bidQty": "431.00000000",
809
+ // "askPrice": "4.00000200",
810
+ // "askQty": "9.00000000"
811
+ // }
802
812
  //
803
813
  // fetchTicker
804
814
  //
@@ -823,10 +833,10 @@ export default class bitrue extends Exchange {
823
833
  'datetime': undefined,
824
834
  'high': this.safeString(ticker, 'high24hr'),
825
835
  'low': this.safeString(ticker, 'low24hr'),
826
- 'bid': this.safeString(ticker, 'highestBid'),
827
- 'bidVolume': undefined,
828
- 'ask': this.safeString(ticker, 'lowestAsk'),
829
- 'askVolume': undefined,
836
+ 'bid': this.safeString2(ticker, 'highestBid', 'bidPrice'),
837
+ 'bidVolume': this.safeString(ticker, 'bidQty'),
838
+ 'ask': this.safeString2(ticker, 'lowestAsk', 'askPrice'),
839
+ 'askVolume': this.safeString(ticker, 'askQty'),
830
840
  'vwap': undefined,
831
841
  'open': undefined,
832
842
  'close': last,
@@ -954,26 +964,31 @@ export default class bitrue extends Exchange {
954
964
  * @method
955
965
  * @name bitrue#fetchBidsAsks
956
966
  * @description fetches the bid and ask price and volume for multiple markets
967
+ * @see https://github.com/Bitrue-exchange/Spot-official-api-docs#symbol-order-book-ticker
957
968
  * @param {string[]|undefined} symbols unified symbols of the markets to fetch the bids and asks for, all markets are returned if not assigned
958
969
  * @param {object} [params] extra parameters specific to the bitrue api endpoint
959
970
  * @returns {object} a dictionary of [ticker structures]{@link https://github.com/ccxt/ccxt/wiki/Manual#ticker-structure}
960
971
  */
961
972
  await this.loadMarkets();
962
- const defaultType = this.safeString2(this.options, 'fetchBidsAsks', 'defaultType', 'spot');
963
- const type = this.safeString(params, 'type', defaultType);
964
- const query = this.omit(params, 'type');
965
- let method = undefined;
966
- if (type === 'future') {
967
- method = 'fapiPublicGetTickerBookTicker';
968
- }
969
- else if (type === 'delivery') {
970
- method = 'dapiPublicGetTickerBookTicker';
971
- }
972
- else {
973
- method = 'publicGetTickerBookTicker';
973
+ symbols = this.marketSymbols(symbols);
974
+ let market = undefined;
975
+ const request = {};
976
+ if (symbols !== undefined) {
977
+ const first = this.safeString(symbols, 0);
978
+ market = this.market(first);
979
+ request['symbol'] = market['id'];
974
980
  }
975
- const response = await this[method](query);
976
- return this.parseTickers(response, symbols);
981
+ const response = await this.v1PublicGetTickerBookTicker(this.extend(request, params));
982
+ // {
983
+ // "symbol": "LTCBTC",
984
+ // "bidPrice": "4.00000000",
985
+ // "bidQty": "431.00000000",
986
+ // "askPrice": "4.00000200",
987
+ // "askQty": "9.00000000"
988
+ // }
989
+ const data = {};
990
+ data[market['id']] = response;
991
+ return this.parseTickers(data, symbols);
977
992
  }
978
993
  async fetchTickers(symbols = undefined, params = {}) {
979
994
  /**
@@ -1,5 +1,5 @@
1
1
  import Exchange from './abstract/bitvavo.js';
2
- import { Int, OrderSide, OrderType } from './base/types.js';
2
+ import { Int, OHLCV, Order, OrderSide, OrderType, Trade } from './base/types.js';
3
3
  /**
4
4
  * @class bitvavo
5
5
  * @extends Exchange
@@ -15,12 +15,12 @@ export default class bitvavo extends Exchange {
15
15
  fetchTicker(symbol: string, params?: {}): Promise<import("./base/types.js").Ticker>;
16
16
  parseTicker(ticker: any, market?: any): import("./base/types.js").Ticker;
17
17
  fetchTickers(symbols?: string[], params?: {}): Promise<import("./base/types.js").Dictionary<import("./base/types.js").Ticker>>;
18
- fetchTrades(symbol: string, since?: Int, limit?: Int, params?: {}): Promise<import("./base/types.js").Trade[]>;
19
- parseTrade(trade: any, market?: any): import("./base/types.js").Trade;
18
+ fetchTrades(symbol: string, since?: Int, limit?: Int, params?: {}): Promise<Trade[]>;
19
+ parseTrade(trade: any, market?: any): Trade;
20
20
  fetchTradingFees(params?: {}): Promise<{}>;
21
21
  fetchOrderBook(symbol: string, limit?: Int, params?: {}): Promise<import("./base/types.js").OrderBook>;
22
22
  parseOHLCV(ohlcv: any, market?: any): number[];
23
- fetchOHLCV(symbol: string, timeframe?: string, since?: Int, limit?: Int, params?: {}): Promise<import("./base/types.js").OHLCV[]>;
23
+ fetchOHLCV(symbol: string, timeframe?: string, since?: Int, limit?: Int, params?: {}): Promise<OHLCV[]>;
24
24
  parseBalance(response: any): import("./base/types.js").Balances;
25
25
  fetchBalance(params?: {}): Promise<import("./base/types.js").Balances>;
26
26
  fetchDepositAddress(code: string, params?: {}): Promise<{
@@ -30,16 +30,16 @@ export default class bitvavo extends Exchange {
30
30
  network: any;
31
31
  info: any;
32
32
  }>;
33
- createOrder(symbol: string, type: OrderType, side: OrderSide, amount: any, price?: any, params?: {}): Promise<import("./base/types.js").Order>;
34
- editOrder(id: string, symbol: any, type: any, side: any, amount?: any, price?: any, params?: {}): Promise<import("./base/types.js").Order>;
35
- cancelOrder(id: string, symbol?: string, params?: {}): Promise<import("./base/types.js").Order>;
36
- cancelAllOrders(symbol?: string, params?: {}): Promise<import("./base/types.js").Order[]>;
37
- fetchOrder(id: string, symbol?: string, params?: {}): Promise<import("./base/types.js").Order>;
38
- fetchOrders(symbol?: string, since?: Int, limit?: Int, params?: {}): Promise<import("./base/types.js").Order[]>;
39
- fetchOpenOrders(symbol?: string, since?: Int, limit?: Int, params?: {}): Promise<import("./base/types.js").Order[]>;
33
+ createOrder(symbol: string, type: OrderType, side: OrderSide, amount: any, price?: any, params?: {}): Promise<Order>;
34
+ editOrder(id: string, symbol: any, type: any, side: any, amount?: any, price?: any, params?: {}): Promise<Order>;
35
+ cancelOrder(id: string, symbol?: string, params?: {}): Promise<Order>;
36
+ cancelAllOrders(symbol?: string, params?: {}): Promise<Order[]>;
37
+ fetchOrder(id: string, symbol?: string, params?: {}): Promise<Order>;
38
+ fetchOrders(symbol?: string, since?: Int, limit?: Int, params?: {}): Promise<Order[]>;
39
+ fetchOpenOrders(symbol?: string, since?: Int, limit?: Int, params?: {}): Promise<Order[]>;
40
40
  parseOrderStatus(status: any): string;
41
- parseOrder(order: any, market?: any): import("./base/types.js").Order;
42
- fetchMyTrades(symbol?: string, since?: Int, limit?: Int, params?: {}): Promise<import("./base/types.js").Trade[]>;
41
+ parseOrder(order: any, market?: any): Order;
42
+ fetchMyTrades(symbol?: string, since?: Int, limit?: Int, params?: {}): Promise<Trade[]>;
43
43
  withdraw(code: string, amount: any, address: any, tag?: any, params?: {}): Promise<{
44
44
  info: any;
45
45
  id: any;