ccxt 4.0.76 → 4.0.78

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/README.md CHANGED
@@ -215,13 +215,13 @@ console.log(version, Object.keys(exchanges));
215
215
 
216
216
  All-in-one browser bundle (dependencies included), served from a CDN of your choice:
217
217
 
218
- * jsDelivr: https://cdn.jsdelivr.net/npm/ccxt@4.0.76/dist/ccxt.browser.js
219
- * unpkg: https://unpkg.com/ccxt@4.0.76/dist/ccxt.browser.js
218
+ * jsDelivr: https://cdn.jsdelivr.net/npm/ccxt@4.0.78/dist/ccxt.browser.js
219
+ * unpkg: https://unpkg.com/ccxt@4.0.78/dist/ccxt.browser.js
220
220
 
221
221
  CDNs are not updated in real-time and may have delays. Defaulting to the most recent version without specifying the version number is not recommended. Please, keep in mind that we are not responsible for the correct operation of those CDN servers.
222
222
 
223
223
  ```HTML
224
- <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/ccxt@4.0.76/dist/ccxt.browser.js"></script>
224
+ <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/ccxt@4.0.78/dist/ccxt.browser.js"></script>
225
225
  ```
226
226
 
227
227
  Creates a global `ccxt` object:
@@ -9907,12 +9907,18 @@ class Exchange {
9907
9907
  precision = this.safeValue(networkItem, 'precision', precision);
9908
9908
  }
9909
9909
  if (precision === undefined) {
9910
- return fee;
9910
+ return this.forceString(fee);
9911
9911
  }
9912
9912
  else {
9913
9913
  return this.decimalToPrecision(fee, ROUND, precision, this.precisionMode, this.paddingMode);
9914
9914
  }
9915
9915
  }
9916
+ forceString(value) {
9917
+ if (typeof value !== 'string') {
9918
+ return this.numberToString(value);
9919
+ }
9920
+ return value;
9921
+ }
9916
9922
  isTickPrecision() {
9917
9923
  return this.precisionMode === TICK_SIZE;
9918
9924
  }
@@ -24646,6 +24652,7 @@ class bingx extends _abstract_bingx_js__WEBPACK_IMPORTED_MODULE_0__/* ["default"
24646
24652
  'market/trades': 3,
24647
24653
  'market/depth': 3,
24648
24654
  'market/kline': 3,
24655
+ 'ticker/24hr': 1,
24649
24656
  },
24650
24657
  },
24651
24658
  'private': {
@@ -24654,7 +24661,6 @@ class bingx extends _abstract_bingx_js__WEBPACK_IMPORTED_MODULE_0__/* ["default"
24654
24661
  'trade/openOrders': 3,
24655
24662
  'trade/historyOrders': 3,
24656
24663
  'account/balance': 3,
24657
- 'ticker/24hr': 1,
24658
24664
  },
24659
24665
  'post': {
24660
24666
  'trade/order': 3,
@@ -24811,6 +24817,7 @@ class bingx extends _abstract_bingx_js__WEBPACK_IMPORTED_MODULE_0__/* ["default"
24811
24817
  '500': _base_errors_js__WEBPACK_IMPORTED_MODULE_2__.ExchangeError,
24812
24818
  '504': _base_errors_js__WEBPACK_IMPORTED_MODULE_2__.ExchangeError,
24813
24819
  '100001': _base_errors_js__WEBPACK_IMPORTED_MODULE_2__.AuthenticationError,
24820
+ '100412': _base_errors_js__WEBPACK_IMPORTED_MODULE_2__.AuthenticationError,
24814
24821
  '100202': _base_errors_js__WEBPACK_IMPORTED_MODULE_2__.InsufficientFunds,
24815
24822
  '100400': _base_errors_js__WEBPACK_IMPORTED_MODULE_2__.BadRequest,
24816
24823
  '100440': _base_errors_js__WEBPACK_IMPORTED_MODULE_2__.ExchangeError,
@@ -25653,10 +25660,10 @@ class bingx extends _abstract_bingx_js__WEBPACK_IMPORTED_MODULE_0__/* ["default"
25653
25660
  };
25654
25661
  let response = undefined;
25655
25662
  if (market['spot']) {
25656
- response = await this.swapV2PublicGetQuoteTicker(this.extend(request, params));
25663
+ response = await this.spotV1PublicGetTicker24hr(this.extend(request, params));
25657
25664
  }
25658
25665
  else {
25659
- response = await this.spotV1PublicGetCommonSymbols(this.extend(request, params));
25666
+ response = await this.swapV2PublicGetQuoteTicker(this.extend(request, params));
25660
25667
  }
25661
25668
  //
25662
25669
  // {
@@ -25679,7 +25686,8 @@ class bingx extends _abstract_bingx_js__WEBPACK_IMPORTED_MODULE_0__/* ["default"
25679
25686
  // }
25680
25687
  //
25681
25688
  const data = this.safeValue(response, 'data');
25682
- return this.parseTicker(data, market);
25689
+ const ticker = this.safeValue(data, 0, data);
25690
+ return this.parseTicker(ticker, market);
25683
25691
  }
25684
25692
  async fetchTickers(symbols = undefined, params = {}) {
25685
25693
  /**
@@ -25692,15 +25700,21 @@ class bingx extends _abstract_bingx_js__WEBPACK_IMPORTED_MODULE_0__/* ["default"
25692
25700
  * @returns {object} a dictionary of [ticker structures]{@link https://github.com/ccxt/ccxt/wiki/Manual#ticker-structure}
25693
25701
  */
25694
25702
  await this.loadMarkets();
25703
+ let market = undefined;
25695
25704
  if (symbols !== undefined) {
25696
25705
  symbols = this.marketSymbols(symbols);
25697
25706
  const firstSymbol = this.safeString(symbols, 0);
25698
- const market = this.market(firstSymbol);
25699
- if (!market['swap']) {
25700
- throw new _base_errors_js__WEBPACK_IMPORTED_MODULE_2__.BadRequest(this.id + ' fetchTicker is only supported for swap markets.');
25701
- }
25707
+ market = this.market(firstSymbol);
25708
+ }
25709
+ let type = undefined;
25710
+ [type, params] = this.handleMarketTypeAndParams('fetchTickers', market, params);
25711
+ let response = undefined;
25712
+ if (type === 'spot') {
25713
+ response = await this.spotV1PublicGetTicker24hr(params);
25714
+ }
25715
+ else {
25716
+ response = await this.swapV2PublicGetQuoteTicker(params);
25702
25717
  }
25703
- const response = await this.swapV2PublicGetQuoteTicker(params);
25704
25718
  //
25705
25719
  // {
25706
25720
  // "code": 0,
@@ -25727,6 +25741,20 @@ class bingx extends _abstract_bingx_js__WEBPACK_IMPORTED_MODULE_0__/* ["default"
25727
25741
  return this.parseTickers(tickers, symbols);
25728
25742
  }
25729
25743
  parseTicker(ticker, market = undefined) {
25744
+ //
25745
+ // spot
25746
+ // {
25747
+ // symbol: 'BTC-USDT',
25748
+ // openPrice: '26032.08',
25749
+ // highPrice: '26178.86',
25750
+ // lowPrice: '25968.18',
25751
+ // lastPrice: '26113.60',
25752
+ // volume: '1161.79',
25753
+ // quoteVolume: '30288466.44',
25754
+ // openTime: '1693081020762',
25755
+ // closeTime: '1693167420762'
25756
+ // }
25757
+ // swap
25730
25758
  //
25731
25759
  // {
25732
25760
  // "symbol": "BTC-USDT",
@@ -25744,15 +25772,15 @@ class bingx extends _abstract_bingx_js__WEBPACK_IMPORTED_MODULE_0__/* ["default"
25744
25772
  // }
25745
25773
  //
25746
25774
  const marketId = this.safeString(ticker, 'symbol');
25747
- const defaultType = this.safeString(this.options, 'defaultType', 'swap');
25748
- const symbol = this.safeSymbol(marketId, market, '-', defaultType);
25775
+ const change = this.safeString(ticker, 'priceChange');
25776
+ const type = (change === undefined) ? 'spot' : 'swap';
25777
+ const symbol = this.safeSymbol(marketId, market, undefined, type);
25749
25778
  const open = this.safeString(ticker, 'openPrice');
25750
25779
  const high = this.safeString(ticker, 'highPrice');
25751
25780
  const low = this.safeString(ticker, 'lowPrice');
25752
25781
  const close = this.safeString(ticker, 'lastPrice');
25753
25782
  const quoteVolume = this.safeString(ticker, 'quoteVolume');
25754
25783
  const baseVolume = this.safeString(ticker, 'volume');
25755
- const change = this.safeString(ticker, 'chapriceChangenge');
25756
25784
  const percentage = this.safeString(ticker, 'priceChangePercent');
25757
25785
  const ts = this.safeInteger(ticker, 'closeTime');
25758
25786
  const datetime = this.iso8601(ts);
@@ -27367,31 +27395,25 @@ class bingx extends _abstract_bingx_js__WEBPACK_IMPORTED_MODULE_0__/* ["default"
27367
27395
  this.parseTransaction(data);
27368
27396
  }
27369
27397
  parseParams(params) {
27370
- let result = '';
27371
27398
  const sortedParams = this.keysort(params);
27372
27399
  const keys = Object.keys(sortedParams);
27373
27400
  for (let i = 0; i < keys.length; i++) {
27374
27401
  const key = keys[i];
27375
- if (i > 0) {
27376
- result += '&';
27377
- }
27378
27402
  const value = sortedParams[key];
27379
27403
  if (Array.isArray(value)) {
27380
- result += key + '=[';
27404
+ let arrStr = '[';
27381
27405
  for (let j = 0; j < value.length; j++) {
27382
27406
  const arrayElement = value[j];
27383
27407
  if (j > 0) {
27384
- result += ',';
27408
+ arrStr += ',';
27385
27409
  }
27386
- result += arrayElement.toString();
27410
+ arrStr += arrayElement.toString();
27387
27411
  }
27388
- result += ']';
27389
- }
27390
- else {
27391
- result += key + '=' + value.toString();
27412
+ arrStr += ']';
27413
+ sortedParams[key] = arrStr;
27392
27414
  }
27393
27415
  }
27394
- return result;
27416
+ return sortedParams;
27395
27417
  }
27396
27418
  sign(path, section = 'public', method = 'GET', params = {}, headers = undefined, body = undefined) {
27397
27419
  const type = section[0];
@@ -27410,6 +27432,7 @@ class bingx extends _abstract_bingx_js__WEBPACK_IMPORTED_MODULE_0__/* ["default"
27410
27432
  params = this.omit(params, this.extractParams(path));
27411
27433
  params = this.keysort(params);
27412
27434
  if (access === 'public') {
27435
+ params['timestamp'] = this.nonce();
27413
27436
  if (Object.keys(params).length) {
27414
27437
  url += '?' + this.urlencode(params);
27415
27438
  }
@@ -27417,8 +27440,9 @@ class bingx extends _abstract_bingx_js__WEBPACK_IMPORTED_MODULE_0__/* ["default"
27417
27440
  else if (access === 'private') {
27418
27441
  this.checkRequiredCredentials();
27419
27442
  params['timestamp'] = this.nonce();
27420
- let query = this.parseParams(params);
27421
- const signature = this.hmac(this.encode(query), this.encode(this.secret), _static_dependencies_noble_hashes_sha256_js__WEBPACK_IMPORTED_MODULE_4__/* .sha256 */ .J);
27443
+ const parsedParams = this.parseParams(params);
27444
+ let query = this.urlencode(parsedParams);
27445
+ const signature = this.hmac(this.encode(this.rawencode(parsedParams)), this.encode(this.secret), _static_dependencies_noble_hashes_sha256_js__WEBPACK_IMPORTED_MODULE_4__/* .sha256 */ .J);
27422
27446
  if (Object.keys(params).length) {
27423
27447
  query = '?' + query + '&';
27424
27448
  }
@@ -115528,6 +115552,29 @@ class gate extends _abstract_gate_js__WEBPACK_IMPORTED_MODULE_0__/* ["default"]
115528
115552
  'sub_accounts/{user_id}/keys/{key}': 1,
115529
115553
  },
115530
115554
  },
115555
+ 'portfolio': {
115556
+ 'get': {
115557
+ 'accounts': 1.5,
115558
+ 'account_mode': 1.5,
115559
+ 'borrowable': 1.5,
115560
+ 'transferable': 1.5,
115561
+ 'loans': 1.5,
115562
+ 'loan_records': 1.5,
115563
+ 'interest_records': 1.5,
115564
+ 'spot/orders': 1.5,
115565
+ 'spot/orders/{order_id}': 1.5,
115566
+ },
115567
+ 'post': {
115568
+ 'loans': 1.5,
115569
+ 'spot/orders': 1.5,
115570
+ },
115571
+ 'delete': {
115572
+ 'spot/orders/{order_id}': 1.5,
115573
+ },
115574
+ 'patch': {
115575
+ 'spot/orders/{order_id}': 1.5,
115576
+ },
115577
+ },
115531
115578
  'spot': {
115532
115579
  'get': {
115533
115580
  'fee': 1,
@@ -115721,6 +115768,22 @@ class gate extends _abstract_gate_js__WEBPACK_IMPORTED_MODULE_0__/* ["default"]
115721
115768
  'uni/lends': 1.5,
115722
115769
  },
115723
115770
  },
115771
+ 'loan': {
115772
+ 'get': {
115773
+ 'collateral/orders': 1.5,
115774
+ 'collateral/orders/{order_id}': 1.5,
115775
+ 'collateral/repay_records': 1.5,
115776
+ 'collateral/collaterals': 1.5,
115777
+ 'collateral/total_amount': 1.5,
115778
+ 'collateral/ltv': 1.5,
115779
+ 'collateral/currencies': 1.5,
115780
+ },
115781
+ 'post': {
115782
+ 'collateral/orders': 1.5,
115783
+ 'collateral/repay': 1.5,
115784
+ 'collateral/collaterals': 1.5,
115785
+ },
115786
+ },
115724
115787
  'account': {
115725
115788
  'get': {
115726
115789
  'detail': 1.5,
@@ -115731,6 +115794,9 @@ class gate extends _abstract_gate_js__WEBPACK_IMPORTED_MODULE_0__/* ["default"]
115731
115794
  'stp_groups': 1.5,
115732
115795
  'stp_groups/{stp_id}/users': 1.5,
115733
115796
  },
115797
+ 'delete': {
115798
+ 'stp_groups/{stp_id}/users': 1.5,
115799
+ },
115734
115800
  },
115735
115801
  'rebate': {
115736
115802
  'get': {
@@ -177206,6 +177272,7 @@ class okx extends _abstract_okx_js__WEBPACK_IMPORTED_MODULE_0__/* ["default"] */
177206
177272
  'tradingBot/grid/ai-param': 1,
177207
177273
  'tradingBot/grid/min-investment': 1,
177208
177274
  'tradingBot/public/rsi-back-testing': 1,
177275
+ 'asset/exchange-list': 5 / 3,
177209
177276
  'finance/savings/lending-rate-summary': 5 / 3,
177210
177277
  'finance/savings/lending-rate-history': 5 / 3,
177211
177278
  // public broker
@@ -229663,6 +229730,9 @@ class okx extends _okx_js__WEBPACK_IMPORTED_MODULE_0__/* ["default"] */ .Z {
229663
229730
  * @param {string} [params.channel] the channel to subscribe to, tickers by default. Can be tickers, sprd-tickers, index-tickers, block-tickers
229664
229731
  * @returns {object} a [ticker structure]{@link https://github.com/ccxt/ccxt/wiki/Manual#ticker-structure}
229665
229732
  */
229733
+ if (this.isEmpty(symbols)) {
229734
+ throw new _base_errors_js__WEBPACK_IMPORTED_MODULE_2__.ArgumentsRequired(this.id + ' watchTickers requires a list of symbols');
229735
+ }
229666
229736
  let channel = undefined;
229667
229737
  [channel, params] = this.handleOptionAndParams(params, 'watchTickers', 'channel', 'tickers');
229668
229738
  const newTickers = await this.subscribeMultiple('public', channel, symbols, params);
@@ -259218,6 +259288,7 @@ class whitebit extends _abstract_whitebit_js__WEBPACK_IMPORTED_MODULE_0__/* ["de
259218
259288
  '422': _base_errors_js__WEBPACK_IMPORTED_MODULE_2__.OrderNotFound, // {"response":null,"status":422,"errors":{"orderId":["Finished order id 1295772653 not found on your account"]},"notification":null,"warning":"Finished order id 1295772653 not found on your account","_token":null}
259219
259289
  },
259220
259290
  'broad': {
259291
+ 'This action is unauthorized': _base_errors_js__WEBPACK_IMPORTED_MODULE_2__.PermissionDenied,
259221
259292
  'Given amount is less than min amount': _base_errors_js__WEBPACK_IMPORTED_MODULE_2__.InvalidOrder,
259222
259293
  'Total is less than': _base_errors_js__WEBPACK_IMPORTED_MODULE_2__.InvalidOrder,
259223
259294
  'fee must be no less than': _base_errors_js__WEBPACK_IMPORTED_MODULE_2__.InvalidOrder,
@@ -273373,7 +273444,7 @@ SOFTWARE.
273373
273444
 
273374
273445
  //-----------------------------------------------------------------------------
273375
273446
  // this is updated by vss.js when building
273376
- const version = '4.0.76';
273447
+ const version = '4.0.78';
273377
273448
  _src_base_Exchange_js__WEBPACK_IMPORTED_MODULE_0__/* .Exchange.ccxtVersion */ .e.ccxtVersion = version;
273378
273449
  //-----------------------------------------------------------------------------
273379
273450