ccxt 4.2.2 → 4.2.4

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.
package/js/src/htx.js CHANGED
@@ -5017,6 +5017,8 @@ export default class htx extends Exchange {
5017
5017
  * @param {float} [price] the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
5018
5018
  * @param {object} [params] extra parameters specific to the exchange API endpoint
5019
5019
  * @param {string} [params.timeInForce] supports 'IOC' and 'FOK'
5020
+ * @param {float} [params.trailingPercent] *contract only* the percent to trail away from the current market price
5021
+ * @param {float} [params.trailingTriggerPrice] *contract only* the price to trigger a trailing order, default uses the price argument
5020
5022
  * @returns {object} request to be sent to the exchange
5021
5023
  */
5022
5024
  const market = this.market(symbol);
@@ -5040,6 +5042,9 @@ export default class htx extends Exchange {
5040
5042
  const triggerPrice = this.safeNumber2(params, 'stopPrice', 'trigger_price');
5041
5043
  const stopLossTriggerPrice = this.safeNumber2(params, 'stopLossPrice', 'sl_trigger_price');
5042
5044
  const takeProfitTriggerPrice = this.safeNumber2(params, 'takeProfitPrice', 'tp_trigger_price');
5045
+ const trailingPercent = this.safeString2(params, 'trailingPercent', 'callback_rate');
5046
+ const trailingTriggerPrice = this.safeNumber(params, 'trailingTriggerPrice', price);
5047
+ const isTrailingPercentOrder = trailingPercent !== undefined;
5043
5048
  const isStop = triggerPrice !== undefined;
5044
5049
  const isStopLossTriggerOrder = stopLossTriggerPrice !== undefined;
5045
5050
  const isTakeProfitTriggerOrder = takeProfitTriggerPrice !== undefined;
@@ -5067,6 +5072,12 @@ export default class htx extends Exchange {
5067
5072
  }
5068
5073
  }
5069
5074
  }
5075
+ else if (isTrailingPercentOrder) {
5076
+ const trailingPercentString = Precise.stringDiv(trailingPercent, '100');
5077
+ request['callback_rate'] = this.parseToNumeric(trailingPercentString);
5078
+ request['active_price'] = trailingTriggerPrice;
5079
+ request['order_price_type'] = this.safeString(params, 'order_price_type', 'formula_price');
5080
+ }
5070
5081
  else {
5071
5082
  const clientOrderId = this.safeInteger2(params, 'client_order_id', 'clientOrderId');
5072
5083
  if (clientOrderId !== undefined) {
@@ -5078,7 +5089,7 @@ export default class htx extends Exchange {
5078
5089
  }
5079
5090
  }
5080
5091
  if (!isStopLossTriggerOrder && !isTakeProfitTriggerOrder) {
5081
- const leverRate = this.safeInteger2(params, 'leverRate', 'lever_rate', 1);
5092
+ const leverRate = this.safeIntegerN(params, ['leverRate', 'lever_rate', 'leverage'], 1);
5082
5093
  const reduceOnly = this.safeValue2(params, 'reduceOnly', 'reduce_only', false);
5083
5094
  const openOrClose = (reduceOnly) ? 'close' : 'open';
5084
5095
  const offset = this.safeString(params, 'offset', openOrClose);
@@ -5087,12 +5098,14 @@ export default class htx extends Exchange {
5087
5098
  request['reduce_only'] = 1;
5088
5099
  }
5089
5100
  request['lever_rate'] = leverRate;
5090
- request['order_price_type'] = type;
5101
+ if (!isTrailingPercentOrder) {
5102
+ request['order_price_type'] = type;
5103
+ }
5091
5104
  }
5092
5105
  const broker = this.safeValue(this.options, 'broker', {});
5093
5106
  const brokerId = this.safeString(broker, 'id');
5094
5107
  request['channel_code'] = brokerId;
5095
- params = this.omit(params, ['reduceOnly', 'stopPrice', 'stopLossPrice', 'takeProfitPrice', 'triggerType', 'leverRate', 'timeInForce']);
5108
+ params = this.omit(params, ['reduceOnly', 'stopPrice', 'stopLossPrice', 'takeProfitPrice', 'triggerType', 'leverRate', 'timeInForce', 'leverage', 'trailingPercent', 'trailingTriggerPrice']);
5096
5109
  return this.extend(request, params);
5097
5110
  }
5098
5111
  async createOrder(symbol, type, side, amount, price = undefined, params = {}) {
@@ -5125,6 +5138,8 @@ export default class htx extends Exchange {
5125
5138
  * @param {int} [params.leverRate] *contract only* required for all contract orders except tpsl, leverage greater than 20x requires prior approval of high-leverage agreement
5126
5139
  * @param {string} [params.timeInForce] supports 'IOC' and 'FOK'
5127
5140
  * @param {float} [params.cost] *spot market buy only* the quote quantity that can be used as an alternative for the amount
5141
+ * @param {float} [params.trailingPercent] *contract only* the percent to trail away from the current market price
5142
+ * @param {float} [params.trailingTriggerPrice] *contract only* the price to trigger a trailing order, default uses the price argument
5128
5143
  * @returns {object} an [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
5129
5144
  */
5130
5145
  await this.loadMarkets();
@@ -5132,11 +5147,16 @@ export default class htx extends Exchange {
5132
5147
  const triggerPrice = this.safeNumber2(params, 'stopPrice', 'trigger_price');
5133
5148
  const stopLossTriggerPrice = this.safeNumber2(params, 'stopLossPrice', 'sl_trigger_price');
5134
5149
  const takeProfitTriggerPrice = this.safeNumber2(params, 'takeProfitPrice', 'tp_trigger_price');
5150
+ const trailingPercent = this.safeNumber(params, 'trailingPercent');
5151
+ const isTrailingPercentOrder = trailingPercent !== undefined;
5135
5152
  const isStop = triggerPrice !== undefined;
5136
5153
  const isStopLossTriggerOrder = stopLossTriggerPrice !== undefined;
5137
5154
  const isTakeProfitTriggerOrder = takeProfitTriggerPrice !== undefined;
5138
5155
  let response = undefined;
5139
5156
  if (market['spot']) {
5157
+ if (isTrailingPercentOrder) {
5158
+ throw new NotSupported(this.id + ' createOrder() does not support trailing orders for spot markets');
5159
+ }
5140
5160
  const spotRequest = await this.createSpotOrderRequest(symbol, type, side, amount, price, params);
5141
5161
  response = await this.spotPrivatePostV1OrderOrdersPlace(spotRequest);
5142
5162
  }
@@ -5153,6 +5173,9 @@ export default class htx extends Exchange {
5153
5173
  else if (isStopLossTriggerOrder || isTakeProfitTriggerOrder) {
5154
5174
  response = await this.contractPrivatePostLinearSwapApiV1SwapTpslOrder(contractRequest);
5155
5175
  }
5176
+ else if (isTrailingPercentOrder) {
5177
+ response = await this.contractPrivatePostLinearSwapApiV1SwapTrackOrder(contractRequest);
5178
+ }
5156
5179
  else {
5157
5180
  response = await this.contractPrivatePostLinearSwapApiV1SwapOrder(contractRequest);
5158
5181
  }
@@ -5164,6 +5187,9 @@ export default class htx extends Exchange {
5164
5187
  else if (isStopLossTriggerOrder || isTakeProfitTriggerOrder) {
5165
5188
  response = await this.contractPrivatePostLinearSwapApiV1SwapCrossTpslOrder(contractRequest);
5166
5189
  }
5190
+ else if (isTrailingPercentOrder) {
5191
+ response = await this.contractPrivatePostLinearSwapApiV1SwapCrossTrackOrder(contractRequest);
5192
+ }
5167
5193
  else {
5168
5194
  response = await this.contractPrivatePostLinearSwapApiV1SwapCrossOrder(contractRequest);
5169
5195
  }
@@ -5177,6 +5203,9 @@ export default class htx extends Exchange {
5177
5203
  else if (isStopLossTriggerOrder || isTakeProfitTriggerOrder) {
5178
5204
  response = await this.contractPrivatePostSwapApiV1SwapTpslOrder(contractRequest);
5179
5205
  }
5206
+ else if (isTrailingPercentOrder) {
5207
+ response = await this.contractPrivatePostSwapApiV1SwapTrackOrder(contractRequest);
5208
+ }
5180
5209
  else {
5181
5210
  response = await this.contractPrivatePostSwapApiV1SwapOrder(contractRequest);
5182
5211
  }
@@ -5188,6 +5217,9 @@ export default class htx extends Exchange {
5188
5217
  else if (isStopLossTriggerOrder || isTakeProfitTriggerOrder) {
5189
5218
  response = await this.contractPrivatePostApiV1ContractTpslOrder(contractRequest);
5190
5219
  }
5220
+ else if (isTrailingPercentOrder) {
5221
+ response = await this.contractPrivatePostApiV1ContractTrackOrder(contractRequest);
5222
+ }
5191
5223
  else {
5192
5224
  response = await this.contractPrivatePostApiV1ContractOrder(contractRequest);
5193
5225
  }
@@ -1281,7 +1281,7 @@ export default class kucoinfutures extends kucoin {
1281
1281
  * @see https://www.kucoin.com/docs/rest/futures-trading/orders/cancel-multiple-futures-stop-orders
1282
1282
  * @param {string} symbol unified market symbol, only orders in the market of this symbol are cancelled when symbol is not undefined
1283
1283
  * @param {object} [params] extra parameters specific to the exchange API endpoint
1284
- * @param {object} [params.stop] When true, all the trigger orders will be cancelled
1284
+ * @param {object} [params.trigger] When true, all the trigger orders will be cancelled
1285
1285
  * @returns Response from the exchange
1286
1286
  */
1287
1287
  await this.loadMarkets();
@@ -1289,8 +1289,8 @@ export default class kucoinfutures extends kucoin {
1289
1289
  if (symbol !== undefined) {
1290
1290
  request['symbol'] = this.marketId(symbol);
1291
1291
  }
1292
- const stop = this.safeValue(params, 'stop');
1293
- params = this.omit(params, 'stop');
1292
+ const stop = this.safeValue2(params, 'stop', 'trigger');
1293
+ params = this.omit(params, ['stop', 'trigger']);
1294
1294
  let response = undefined;
1295
1295
  if (stop) {
1296
1296
  response = await this.futuresPrivateDeleteStopOrders(this.extend(request, params));
@@ -1459,7 +1459,7 @@ export default class kucoinfutures extends kucoin {
1459
1459
  * @param {int} [since] timestamp in ms of the earliest order to retrieve
1460
1460
  * @param {int} [limit] The maximum number of orders to retrieve
1461
1461
  * @param {object} [params] exchange specific parameters
1462
- * @param {bool} [params.stop] set to true to retrieve untriggered stop orders
1462
+ * @param {bool} [params.trigger] set to true to retrieve untriggered stop orders
1463
1463
  * @param {int} [params.until] End time in ms
1464
1464
  * @param {string} [params.side] buy or sell
1465
1465
  * @param {string} [params.type] limit or market
@@ -1472,9 +1472,9 @@ export default class kucoinfutures extends kucoin {
1472
1472
  if (paginate) {
1473
1473
  return await this.fetchPaginatedCallDynamic('fetchOrdersByStatus', symbol, since, limit, params);
1474
1474
  }
1475
- const stop = this.safeValue(params, 'stop');
1475
+ const stop = this.safeValue2(params, 'stop', 'trigger');
1476
1476
  const until = this.safeInteger2(params, 'until', 'till');
1477
- params = this.omit(params, ['stop', 'until', 'till']);
1477
+ params = this.omit(params, ['stop', 'until', 'till', 'trigger']);
1478
1478
  if (status === 'closed') {
1479
1479
  status = 'done';
1480
1480
  }
package/js/src/okcoin.js CHANGED
@@ -1974,7 +1974,7 @@ export default class okcoin extends Exchange {
1974
1974
  // 'ordId': id,
1975
1975
  };
1976
1976
  const clientOrderId = this.safeString2(params, 'clOrdId', 'clientOrderId');
1977
- const stop = this.safeValue(params, 'stop');
1977
+ const stop = this.safeValue2(params, 'stop', 'trigger');
1978
1978
  if (stop) {
1979
1979
  if (clientOrderId !== undefined) {
1980
1980
  request['algoClOrdId'] = clientOrderId;
@@ -1991,7 +1991,7 @@ export default class okcoin extends Exchange {
1991
1991
  request['ordId'] = id;
1992
1992
  }
1993
1993
  }
1994
- const query = this.omit(params, ['clientOrderId', 'stop']);
1994
+ const query = this.omit(params, ['clientOrderId', 'stop', 'trigger']);
1995
1995
  let response = undefined;
1996
1996
  if (stop) {
1997
1997
  response = await this.privateGetTradeOrderAlgo(this.extend(request, query));
package/js/src/okx.js CHANGED
@@ -3032,12 +3032,13 @@ export default class okx extends Exchange {
3032
3032
  * @param {string} id order id
3033
3033
  * @param {string} symbol unified symbol of the market the order was made in
3034
3034
  * @param {object} [params] extra parameters specific to the exchange API endpoint
3035
+ * @param {boolean} [params.trigger] true if trigger orders
3035
3036
  * @returns {object} An [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
3036
3037
  */
3037
3038
  if (symbol === undefined) {
3038
3039
  throw new ArgumentsRequired(this.id + ' cancelOrder() requires a symbol argument');
3039
3040
  }
3040
- const stop = this.safeValue(params, 'stop');
3041
+ const stop = this.safeValue2(params, 'stop', 'trigger');
3041
3042
  if (stop) {
3042
3043
  const orderInner = await this.cancelOrders([id], symbol, params);
3043
3044
  return this.safeValue(orderInner, 0);
@@ -3409,6 +3410,7 @@ export default class okx extends Exchange {
3409
3410
  * @param {string} id the order id
3410
3411
  * @param {string} symbol unified market symbol
3411
3412
  * @param {object} [params] extra and exchange specific parameters
3413
+ * @param {boolean} [params.trigger] true if fetching trigger orders
3412
3414
  * @returns [an order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
3413
3415
  */
3414
3416
  if (symbol === undefined) {
@@ -3426,7 +3428,7 @@ export default class okx extends Exchange {
3426
3428
  const options = this.safeValue(this.options, 'fetchOrder', {});
3427
3429
  const defaultMethod = this.safeString(options, 'method', 'privateGetTradeOrder');
3428
3430
  let method = this.safeString(params, 'method', defaultMethod);
3429
- const stop = this.safeValue(params, 'stop');
3431
+ const stop = this.safeValue2(params, 'stop', 'trigger');
3430
3432
  if (stop) {
3431
3433
  method = 'privateGetTradeOrderAlgo';
3432
3434
  if (clientOrderId !== undefined) {
@@ -3444,7 +3446,7 @@ export default class okx extends Exchange {
3444
3446
  request['ordId'] = id;
3445
3447
  }
3446
3448
  }
3447
- const query = this.omit(params, ['method', 'clOrdId', 'clientOrderId', 'stop']);
3449
+ const query = this.omit(params, ['method', 'clOrdId', 'clientOrderId', 'stop', 'trigger']);
3448
3450
  let response = undefined;
3449
3451
  if (method === 'privateGetTradeOrderAlgo') {
3450
3452
  response = await this.privateGetTradeOrderAlgo(this.extend(request, query));
@@ -3600,7 +3602,7 @@ export default class okx extends Exchange {
3600
3602
  const defaultMethod = this.safeString(options, 'method', 'privateGetTradeOrdersPending');
3601
3603
  let method = this.safeString(params, 'method', defaultMethod);
3602
3604
  const ordType = this.safeString(params, 'ordType');
3603
- const stop = this.safeValue(params, 'stop');
3605
+ const stop = this.safeValue2(params, 'stop', 'trigger');
3604
3606
  if (stop || (ordType in algoOrderTypes)) {
3605
3607
  method = 'privateGetTradeOrdersAlgoPending';
3606
3608
  if (stop) {
@@ -3609,7 +3611,7 @@ export default class okx extends Exchange {
3609
3611
  }
3610
3612
  }
3611
3613
  }
3612
- const query = this.omit(params, ['method', 'stop']);
3614
+ const query = this.omit(params, ['method', 'stop', 'trigger']);
3613
3615
  let response = undefined;
3614
3616
  if (method === 'privateGetTradeOrdersAlgoPending') {
3615
3617
  response = await this.privateGetTradeOrdersAlgoPending(this.extend(request, query));
@@ -3762,7 +3764,7 @@ export default class okx extends Exchange {
3762
3764
  const defaultMethod = this.safeString(options, 'method', 'privateGetTradeOrdersHistory');
3763
3765
  let method = this.safeString(params, 'method', defaultMethod);
3764
3766
  const ordType = this.safeString(params, 'ordType');
3765
- const stop = this.safeValue(params, 'stop');
3767
+ const stop = this.safeValue2(params, 'stop', 'trigger');
3766
3768
  if (stop || (ordType in algoOrderTypes)) {
3767
3769
  method = 'privateGetTradeOrdersAlgoHistory';
3768
3770
  const algoId = this.safeString(params, 'algoId');
@@ -3787,7 +3789,7 @@ export default class okx extends Exchange {
3787
3789
  query = this.omit(query, ['until', 'till']);
3788
3790
  }
3789
3791
  }
3790
- const send = this.omit(query, ['method', 'stop', 'ordType']);
3792
+ const send = this.omit(query, ['method', 'stop', 'ordType', 'trigger']);
3791
3793
  let response = undefined;
3792
3794
  if (method === 'privateGetTradeOrdersAlgoHistory') {
3793
3795
  response = await this.privateGetTradeOrdersAlgoHistory(this.extend(request, send));
@@ -3904,6 +3906,7 @@ export default class okx extends Exchange {
3904
3906
  * @description fetches information on multiple closed orders made by the user
3905
3907
  * @see https://www.okx.com/docs-v5/en/#order-book-trading-trade-get-order-history-last-7-days
3906
3908
  * @see https://www.okx.com/docs-v5/en/#order-book-trading-algo-trading-get-algo-order-history
3909
+ * @see https://www.okx.com/docs-v5/en/#order-book-trading-trade-get-order-history-last-3-months
3907
3910
  * @param {string} symbol unified market symbol of the market orders were made in
3908
3911
  * @param {int} [since] the earliest time in ms to fetch orders for
3909
3912
  * @param {int} [limit] the maximum number of order structures to retrieve
@@ -3913,6 +3916,7 @@ export default class okx extends Exchange {
3913
3916
  * @param {string} [params.algoId] Algo ID "'433845797218942976'"
3914
3917
  * @param {int} [params.until] timestamp in ms to fetch orders for
3915
3918
  * @param {boolean} [params.paginate] default false, when true will automatically paginate by calling this endpoint multiple times. See in the docs all the [availble parameters](https://github.com/ccxt/ccxt/wiki/Manual#pagination-params)
3919
+ * @param {string} [params.method] method to be used, either 'privateGetTradeOrdersHistory', 'privateGetTradeOrdersHistoryArchive' or 'privateGetTradeOrdersAlgoHistory' default is 'privateGetTradeOrdersHistory'
3916
3920
  * @returns {Order[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
3917
3921
  */
3918
3922
  await this.loadMarkets();
@@ -3949,7 +3953,7 @@ export default class okx extends Exchange {
3949
3953
  const defaultMethod = this.safeString(options, 'method', 'privateGetTradeOrdersHistory');
3950
3954
  let method = this.safeString(params, 'method', defaultMethod);
3951
3955
  const ordType = this.safeString(params, 'ordType');
3952
- const stop = this.safeValue(params, 'stop');
3956
+ const stop = this.safeValue2(params, 'stop', 'trigger');
3953
3957
  if (stop || (ordType in algoOrderTypes)) {
3954
3958
  method = 'privateGetTradeOrdersAlgoHistory';
3955
3959
  if (stop) {
@@ -3970,11 +3974,14 @@ export default class okx extends Exchange {
3970
3974
  }
3971
3975
  request['state'] = 'filled';
3972
3976
  }
3973
- const send = this.omit(query, ['method', 'stop']);
3977
+ const send = this.omit(query, ['method', 'stop', 'trigger']);
3974
3978
  let response = undefined;
3975
3979
  if (method === 'privateGetTradeOrdersAlgoHistory') {
3976
3980
  response = await this.privateGetTradeOrdersAlgoHistory(this.extend(request, send));
3977
3981
  }
3982
+ else if (method === 'privateGetTradeOrdersHistoryArchive') {
3983
+ response = await this.privateGetTradeOrdersHistoryArchive(this.extend(request, send));
3984
+ }
3978
3985
  else {
3979
3986
  response = await this.privateGetTradeOrdersHistory(this.extend(request, send));
3980
3987
  }
package/js/src/phemex.js CHANGED
@@ -1488,7 +1488,7 @@ export default class phemex extends Exchange {
1488
1488
  if (type === 'spot') {
1489
1489
  response = await this.v1GetMdSpotTicker24hrAll(query);
1490
1490
  }
1491
- else if (subType === 'inverse' || market['settle'] === 'USD') {
1491
+ else if (subType === 'inverse' || this.safeString(market, 'settle') === 'USD') {
1492
1492
  response = await this.v1GetMdTicker24hrAll(query);
1493
1493
  }
1494
1494
  else {
@@ -33,6 +33,7 @@ export default class bingx extends bingxRest {
33
33
  },
34
34
  },
35
35
  'options': {
36
+ 'listenKeyRefreshRate': 3540000,
36
37
  'ws': {
37
38
  'gunzip': true,
38
39
  },
@@ -630,7 +631,7 @@ export default class bingx extends bingxRest {
630
631
  const lastAuthenticatedTime = this.safeInteger(this.options, 'lastAuthenticatedTime', 0);
631
632
  const listenKeyRefreshRate = this.safeInteger(this.options, 'listenKeyRefreshRate', 3600000); // 1 hour
632
633
  if (time - lastAuthenticatedTime > listenKeyRefreshRate) {
633
- const response = await this.userAuthPrivatePostUserDataStream({ 'listenKey': listenKey }); // extend the expiry
634
+ const response = await this.userAuthPrivatePutUserDataStream({ 'listenKey': listenKey }); // extend the expiry
634
635
  this.options['listenKey'] = this.safeString(response, 'listenKey');
635
636
  this.options['lastAuthenticatedTime'] = time;
636
637
  }
@@ -211,7 +211,7 @@ export default class bybit extends bybitRest {
211
211
  */
212
212
  await this.loadMarkets();
213
213
  symbols = this.marketSymbols(symbols, undefined, false);
214
- const messageHash = 'tickers::' + symbols.join(',');
214
+ const messageHashes = [];
215
215
  const url = this.getUrlByMarketType(symbols[0], false, params);
216
216
  params = this.cleanParams(params);
217
217
  const options = this.safeValue(this.options, 'watchTickers', {});
@@ -221,8 +221,9 @@ export default class bybit extends bybitRest {
221
221
  for (let i = 0; i < marketIds.length; i++) {
222
222
  const marketId = marketIds[i];
223
223
  topics.push(topic + '.' + marketId);
224
+ messageHashes.push('ticker:' + symbols[i]);
224
225
  }
225
- const ticker = await this.watchTopics(url, messageHash, topics, params);
226
+ const ticker = await this.watchTopics(url, messageHashes, topics, params);
226
227
  if (this.newUpdates) {
227
228
  return ticker;
228
229
  }
@@ -358,17 +359,6 @@ export default class bybit extends bybitRest {
358
359
  this.tickers[symbol] = parsed;
359
360
  const messageHash = 'ticker:' + symbol;
360
361
  client.resolve(this.tickers[symbol], messageHash);
361
- // watchTickers part
362
- const messageHashes = this.findMessageHashes(client, 'tickers::');
363
- for (let i = 0; i < messageHashes.length; i++) {
364
- const messageHashTicker = messageHashes[i];
365
- const parts = messageHashTicker.split('::');
366
- const symbolsString = parts[1];
367
- const symbols = symbolsString.split(',');
368
- if (this.inArray(parsed['symbol'], symbols)) {
369
- client.resolve(parsed, messageHashTicker);
370
- }
371
- }
372
362
  }
373
363
  async watchOHLCV(symbol, timeframe = '1m', since = undefined, limit = undefined, params = {}) {
374
364
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ccxt",
3
- "version": "4.2.2",
3
+ "version": "4.2.4",
4
4
  "description": "A JavaScript / TypeScript / Python / C# / PHP cryptocurrency trading library with support for 100+ exchanges",
5
5
  "unpkg": "dist/ccxt.browser.js",
6
6
  "type": "module",