ccxt 4.4.57__py2.py3-none-any.whl → 4.4.58__py2.py3-none-any.whl

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.
ccxt/bitmart.py CHANGED
@@ -528,7 +528,10 @@ class bitmart(Exchange, ImplicitAPI):
528
528
  '40049': InvalidOrder, # 403, The maximum length of clientOrderId cannot exceed 32
529
529
  '40050': InvalidOrder, # 403, Client OrderId duplicated with existing orders
530
530
  },
531
- 'broad': {},
531
+ 'broad': {
532
+ 'You contract account available balance not enough': InsufficientFunds,
533
+ 'you contract account available balance not enough': InsufficientFunds,
534
+ },
532
535
  },
533
536
  'commonCurrencies': {
534
537
  '$GM': 'GOLDMINER',
@@ -968,6 +971,7 @@ class bitmart(Exchange, ImplicitAPI):
968
971
  data = self.safe_dict(response, 'data', {})
969
972
  symbols = self.safe_list(data, 'symbols', [])
970
973
  result = []
974
+ fees = self.fees['trading']
971
975
  for i in range(0, len(symbols)):
972
976
  market = symbols[i]
973
977
  id = self.safe_string(market, 'symbol')
@@ -1006,6 +1010,8 @@ class bitmart(Exchange, ImplicitAPI):
1006
1010
  'expiryDatetime': None,
1007
1011
  'strike': None,
1008
1012
  'optionType': None,
1013
+ 'maker': fees['maker'],
1014
+ 'taker': fees['taker'],
1009
1015
  'precision': {
1010
1016
  'amount': baseMinSize,
1011
1017
  'price': self.parse_number(self.parse_precision(self.safe_string(market, 'price_max_precision'))),
@@ -1077,6 +1083,7 @@ class bitmart(Exchange, ImplicitAPI):
1077
1083
  data = self.safe_dict(response, 'data', {})
1078
1084
  symbols = self.safe_list(data, 'symbols', [])
1079
1085
  result = []
1086
+ fees = self.fees['trading']
1080
1087
  for i in range(0, len(symbols)):
1081
1088
  market = symbols[i]
1082
1089
  id = self.safe_string(market, 'symbol')
@@ -1118,6 +1125,8 @@ class bitmart(Exchange, ImplicitAPI):
1118
1125
  'expiryDatetime': self.iso8601(expiry),
1119
1126
  'strike': None,
1120
1127
  'optionType': None,
1128
+ 'maker': fees['maker'],
1129
+ 'taker': fees['taker'],
1121
1130
  'precision': {
1122
1131
  'amount': self.safe_number(market, 'vol_precision'),
1123
1132
  'price': self.safe_number(market, 'price_precision'),
@@ -5085,6 +5094,7 @@ class bitmart(Exchange, ImplicitAPI):
5085
5094
  # {"message":"Bad Request [from is empty]","code":50000,"trace":"579986f7-c93a-4559-926b-06ba9fa79d76","data":{}}
5086
5095
  # {"message":"Kline size over 500","code":50004,"trace":"d625caa8-e8ca-4bd2-b77c-958776965819","data":{}}
5087
5096
  # {"message":"Balance not enough","code":50020,"trace":"7c709d6a-3292-462c-98c5-32362540aeef","data":{}}
5097
+ # {"code":40012,"message":"You contract account available balance not enough.","trace":"..."}
5088
5098
  #
5089
5099
  # contract
5090
5100
  #
@@ -5096,9 +5106,9 @@ class bitmart(Exchange, ImplicitAPI):
5096
5106
  isErrorCode = (errorCode is not None) and (errorCode != '1000')
5097
5107
  if isErrorCode or isErrorMessage:
5098
5108
  feedback = self.id + ' ' + body
5099
- self.throw_exactly_matched_exception(self.exceptions['exact'], errorCode, feedback)
5100
- self.throw_broadly_matched_exception(self.exceptions['broad'], errorCode, feedback)
5101
5109
  self.throw_exactly_matched_exception(self.exceptions['exact'], message, feedback)
5102
5110
  self.throw_broadly_matched_exception(self.exceptions['broad'], message, feedback)
5111
+ self.throw_exactly_matched_exception(self.exceptions['exact'], errorCode, feedback)
5112
+ self.throw_broadly_matched_exception(self.exceptions['broad'], errorCode, feedback)
5103
5113
  raise ExchangeError(feedback) # unknown message
5104
5114
  return None
ccxt/blofin.py CHANGED
@@ -328,8 +328,7 @@ class blofin(Exchange, ImplicitAPI):
328
328
  'takeProfitPrice': True,
329
329
  'attachedStopLossTakeProfit': {
330
330
  'triggerPriceType': None,
331
- 'limit': True,
332
- 'price': None,
331
+ 'price': True,
333
332
  },
334
333
  'hedged': True,
335
334
  },
ccxt/bybit.py CHANGED
@@ -1420,8 +1420,8 @@ class bybit(Exchange, ImplicitAPI):
1420
1420
 
1421
1421
  def create_expired_option_market(self, symbol: str):
1422
1422
  # support expired option contracts
1423
- quote = 'USD'
1424
- settle = 'USDC'
1423
+ quote = None
1424
+ settle = None
1425
1425
  optionParts = symbol.split('-')
1426
1426
  symbolBase = symbol.split('/')
1427
1427
  base = None
@@ -1429,9 +1429,20 @@ class bybit(Exchange, ImplicitAPI):
1429
1429
  if symbol.find('/') > -1:
1430
1430
  base = self.safe_string(symbolBase, 0)
1431
1431
  expiry = self.safe_string(optionParts, 1)
1432
+ symbolQuoteAndSettle = self.safe_string(symbolBase, 1)
1433
+ splitQuote = symbolQuoteAndSettle.split(':')
1434
+ quoteAndSettle = self.safe_string(splitQuote, 0)
1435
+ quote = quoteAndSettle
1436
+ settle = quoteAndSettle
1432
1437
  else:
1433
1438
  base = self.safe_string(optionParts, 0)
1434
1439
  expiry = self.convert_market_id_expire_date(self.safe_string(optionParts, 1))
1440
+ if symbol.endswith('-USDT'):
1441
+ quote = 'USDT'
1442
+ settle = 'USDT'
1443
+ else:
1444
+ quote = 'USDC'
1445
+ settle = 'USDC'
1435
1446
  strike = self.safe_string(optionParts, 2)
1436
1447
  optionType = self.safe_string(optionParts, 3)
1437
1448
  datetime = self.convert_expire_date(expiry)
ccxt/coinbase.py CHANGED
@@ -4795,10 +4795,17 @@ class coinbase(Exchange, ImplicitAPI):
4795
4795
  # }
4796
4796
  # ]
4797
4797
  # }
4798
+ # or
4799
+ # {
4800
+ # "error": "UNKNOWN_FAILURE_REASON",
4801
+ # "message": "",
4802
+ # "error_details": "",
4803
+ # "preview_failure_reason": "PREVIEW_STOP_PRICE_BELOW_LAST_TRADE_PRICE"
4804
+ # }
4798
4805
  #
4799
4806
  errorCode = self.safe_string(response, 'error')
4800
4807
  if errorCode is not None:
4801
- errorMessage = self.safe_string(response, 'error_description')
4808
+ errorMessage = self.safe_string_2(response, 'error_description', 'preview_failure_reason')
4802
4809
  self.throw_exactly_matched_exception(self.exceptions['exact'], errorCode, feedback)
4803
4810
  self.throw_broadly_matched_exception(self.exceptions['broad'], errorMessage, feedback)
4804
4811
  raise ExchangeError(feedback)
ccxt/hyperliquid.py CHANGED
@@ -203,7 +203,7 @@ class hyperliquid(Exchange, ImplicitAPI):
203
203
  'broad': {
204
204
  'Price must be divisible by tick size.': InvalidOrder,
205
205
  'Order must have minimum value of $10': InvalidOrder,
206
- 'Insufficient margin to place order.': InvalidOrder,
206
+ 'Insufficient margin to place order.': InsufficientFunds,
207
207
  'Reduce only order would increase position.': InvalidOrder,
208
208
  'Post only order would have immediately matched,': InvalidOrder,
209
209
  'Order could not immediately match against any resting orders.': InvalidOrder,
@@ -601,7 +601,9 @@ class hyperliquid(Exchange, ImplicitAPI):
601
601
  amountPrecisionStr = self.safe_string(innerBaseTokenInfo, 'szDecimals')
602
602
  amountPrecision = int(amountPrecisionStr)
603
603
  price = self.safe_number(extraData, 'midPx')
604
- pricePrecision = self.calculate_price_precision(price, amountPrecision, 8)
604
+ pricePrecision = 0
605
+ if price is not None:
606
+ pricePrecision = self.calculate_price_precision(price, amountPrecision, 8)
605
607
  pricePrecisionStr = self.number_to_string(pricePrecision)
606
608
  # quotePrecision = self.parse_number(self.parse_precision(self.safe_string(innerQuoteTokenInfo, 'szDecimals')))
607
609
  baseId = self.number_to_string(index + 10000)
@@ -698,7 +700,9 @@ class hyperliquid(Exchange, ImplicitAPI):
698
700
  amountPrecisionStr = self.safe_string(market, 'szDecimals')
699
701
  amountPrecision = int(amountPrecisionStr)
700
702
  price = self.safe_number(market, 'markPx', 0)
701
- pricePrecision = self.calculate_price_precision(price, amountPrecision, 6)
703
+ pricePrecision = 0
704
+ if price is not None:
705
+ pricePrecision = self.calculate_price_precision(price, amountPrecision, 6)
702
706
  pricePrecisionStr = self.number_to_string(pricePrecision)
703
707
  isDelisted = self.safe_bool(market, 'isDelisted')
704
708
  active = True
@@ -3264,6 +3268,7 @@ class hyperliquid(Exchange, ImplicitAPI):
3264
3268
  # status: 'ok',
3265
3269
  # response: {type: 'order', data: {statuses: [{error: 'Insufficient margin to place order. asset=4'}]}}
3266
3270
  # }
3271
+ # {"status":"ok","response":{"type":"order","data":{"statuses":[{"error":"Insufficient margin to place order. asset=84"}]}}}
3267
3272
  #
3268
3273
  status = self.safe_string(response, 'status', '')
3269
3274
  message = None
ccxt/pro/__init__.py CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  # ----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.4.57'
7
+ __version__ = '4.4.58'
8
8
 
9
9
  # ----------------------------------------------------------------------------
10
10
 
ccxt/pro/bybit.py CHANGED
@@ -842,7 +842,10 @@ class bybit(ccxt.async_support.bybit):
842
842
  raise BadRequest(self.id + ' watchOrderBookForSymbols() can only use limit 25 and 100 for option markets.')
843
843
  elif (limit != 1) and (limit != 50) and (limit != 200) and (limit != 500):
844
844
  # bybit only support limit 1, 50, 200, 500 for contract
845
- raise BadRequest(self.id + ' watchOrderBookForSymbols() can only use limit 1, 50, 200 and 500.')
845
+ raise BadRequest(self.id + ' watchOrderBookForSymbols() can only use limit 1, 50, 200 and 500 for swap and future markets.')
846
+ else:
847
+ if (limit != 1) and (limit != 50) and (limit != 200):
848
+ raise BadRequest(self.id + ' watchOrderBookForSymbols() can only use limit 1,50, and 200 for spot markets.')
846
849
  topics = []
847
850
  messageHashes = []
848
851
  for i in range(0, len(symbols)):
ccxt/pro/mexc.py CHANGED
@@ -446,7 +446,9 @@ class mexc(ccxt.async_support.mexc):
446
446
  # }
447
447
  #
448
448
  parsedTicker = self.parse_ws_bid_ask(message)
449
- symbol = parsedTicker['symbol']
449
+ symbol = self.safe_string(parsedTicker, 'symbol')
450
+ if symbol is None:
451
+ return
450
452
  self.bidsasks[symbol] = parsedTicker
451
453
  messageHash = 'bidask:' + symbol
452
454
  client.resolve(parsedTicker, messageHash)
ccxt/test/tests_init.py CHANGED
@@ -18,7 +18,7 @@ if sys.platform == 'win32':
18
18
  # ########### args ###########
19
19
  isWs = get_cli_arg_value('--ws')
20
20
  isBaseTests = get_cli_arg_value('--baseTests')
21
- run_all = get_cli_arg_value('--all')
21
+ runAll = get_cli_arg_value('--all')
22
22
 
23
23
  # ###### base tests #######
24
24
  if (isBaseTests):
@@ -27,7 +27,7 @@ if (isBaseTests):
27
27
  else:
28
28
  base_tests_init()
29
29
  print('base tests passed!')
30
- if not run_all:
30
+ if not runAll:
31
31
  exit(0)
32
32
 
33
33
  # ###### exchange tests #######
ccxt/timex.py CHANGED
@@ -729,6 +729,7 @@ class timex(Exchange, ImplicitAPI):
729
729
  :param int [since]: timestamp in ms of the earliest candle to fetch
730
730
  :param int [limit]: the maximum amount of candles to fetch
731
731
  :param dict [params]: extra parameters specific to the exchange API endpoint
732
+ :param int [params.until]: timestamp in ms of the latest candle to fetch
732
733
  :returns int[][]: A list of candles ordered, open, high, low, close, volume
733
734
  """
734
735
  self.load_markets()
@@ -739,15 +740,24 @@ class timex(Exchange, ImplicitAPI):
739
740
  }
740
741
  # if since and limit are not specified
741
742
  duration = self.parse_timeframe(timeframe)
743
+ until = self.safe_integer(params, 'until')
742
744
  if limit is None:
743
745
  limit = 1000 # exchange provides tens of thousands of data, but we set generous default value
744
746
  if since is not None:
745
747
  request['from'] = self.iso8601(since)
746
- request['till'] = self.iso8601(self.sum(since, self.sum(limit, 1) * duration * 1000))
748
+ if until is None:
749
+ request['till'] = self.iso8601(self.sum(since, self.sum(limit, 1) * duration * 1000))
750
+ else:
751
+ request['till'] = self.iso8601(until)
752
+ elif until is not None:
753
+ request['till'] = self.iso8601(until)
754
+ fromTimestamp = until - self.sum(limit, 1) * duration * 1000
755
+ request['from'] = self.iso8601(fromTimestamp)
747
756
  else:
748
757
  now = self.milliseconds()
749
758
  request['till'] = self.iso8601(now)
750
- request['from'] = self.iso8601(now - limit * duration * 1000 - 1)
759
+ request['from'] = self.iso8601(now - self.sum(limit, 1) * duration * 1000 - 1)
760
+ params = self.omit(params, 'until')
751
761
  response = self.publicGetCandles(self.extend(request, params))
752
762
  #
753
763
  # [
ccxt/vertex.py CHANGED
@@ -1523,7 +1523,7 @@ class vertex(Exchange, ImplicitAPI):
1523
1523
  marketId = base + '/' + quote
1524
1524
  if base.find('PERP') > 0:
1525
1525
  marketId = marketId.replace('-PERP', '') + ':USDC'
1526
- market = self.market(marketId)
1526
+ market = self.safe_market(marketId, market)
1527
1527
  last = self.safe_string(ticker, 'last_price')
1528
1528
  return self.safe_ticker({
1529
1529
  'symbol': market['symbol'],
ccxt/whitebit.py CHANGED
@@ -2626,12 +2626,13 @@ class whitebit(Exchange, ImplicitAPI):
2626
2626
  # For cases where we have a meaningful status
2627
2627
  # {"response":null,"status":422,"errors":{"orderId":["Finished order id 435453454535 not found on your account"]},"notification":null,"warning":"Finished order id 435453454535 not found on your account","_token":null}
2628
2628
  status = self.safe_string(response, 'status')
2629
+ errors = self.safe_value(response, 'errors')
2629
2630
  # {"code":10,"message":"Unauthorized request."}
2630
2631
  message = self.safe_string(response, 'message')
2631
2632
  # For these cases where we have a generic code variable error key
2632
2633
  # {"code":0,"message":"Validation failed","errors":{"amount":["Amount must be greater than 0"]}}
2633
2634
  codeNew = self.safe_integer(response, 'code')
2634
- hasErrorStatus = status is not None and status != '200'
2635
+ hasErrorStatus = status is not None and status != '200' and errors is not None
2635
2636
  if hasErrorStatus or codeNew is not None:
2636
2637
  feedback = self.id + ' ' + body
2637
2638
  errorInfo = message
ccxt/xt.py CHANGED
@@ -128,7 +128,7 @@ class xt(Exchange, ImplicitAPI):
128
128
  'repayMargin': False,
129
129
  'setLeverage': True,
130
130
  'setMargin': False,
131
- 'setMarginMode': False,
131
+ 'setMarginMode': True,
132
132
  'setPositionMode': False,
133
133
  'signIn': False,
134
134
  'transfer': True,
@@ -286,6 +286,7 @@ class xt(Exchange, ImplicitAPI):
286
286
  'future/user/v1/position/margin': 1,
287
287
  'future/user/v1/user/collection/add': 1,
288
288
  'future/user/v1/user/collection/cancel': 1,
289
+ 'future/user/v1/position/change-type': 1,
289
290
  },
290
291
  },
291
292
  'inverse': {
@@ -531,10 +532,12 @@ class xt(Exchange, ImplicitAPI):
531
532
  'TRANSFER_012': PermissionDenied, # Currency transfer prohibited
532
533
  'symbol_not_support_trading_via_api': BadSymbol, # {"returnCode":1,"msgInfo":"failure","error":{"code":"symbol_not_support_trading_via_api","msg":"The symbol does not support trading via API"},"result":null}
533
534
  'open_order_min_nominal_value_limit': InvalidOrder, # {"returnCode":1,"msgInfo":"failure","error":{"code":"open_order_min_nominal_value_limit","msg":"Exceeds the minimum notional value of a single order"},"result":null}
535
+ 'insufficient_balance': InsufficientFunds,
534
536
  },
535
537
  'broad': {
536
538
  'The symbol does not support trading via API': BadSymbol, # {"returnCode":1,"msgInfo":"failure","error":{"code":"symbol_not_support_trading_via_api","msg":"The symbol does not support trading via API"},"result":null}
537
539
  'Exceeds the minimum notional value of a single order': InvalidOrder, # {"returnCode":1,"msgInfo":"failure","error":{"code":"open_order_min_nominal_value_limit","msg":"Exceeds the minimum notional value of a single order"},"result":null}
540
+ 'insufficient balance': InsufficientFunds,
538
541
  },
539
542
  },
540
543
  'timeframes': {
@@ -4616,6 +4619,53 @@ class xt(Exchange, ImplicitAPI):
4616
4619
  'status': None,
4617
4620
  }
4618
4621
 
4622
+ def set_margin_mode(self, marginMode: str, symbol: Str = None, params={}):
4623
+ """
4624
+ set margin mode to 'cross' or 'isolated'
4625
+
4626
+ https://doc.xt.com/#futures_userchangePositionType
4627
+
4628
+ :param str marginMode: 'cross' or 'isolated'
4629
+ :param str [symbol]: required
4630
+ :param dict [params]: extra parameters specific to the exchange API endpoint
4631
+ :param str [params.positionSide]: *required* "long" or "short"
4632
+ :returns dict: response from the exchange
4633
+ """
4634
+ if symbol is None:
4635
+ raise ArgumentsRequired(self.id + ' setMarginMode() requires a symbol argument')
4636
+ self.load_markets()
4637
+ market = self.market(symbol)
4638
+ if market['spot']:
4639
+ raise BadSymbol(self.id + ' setMarginMode() supports contract markets only')
4640
+ marginMode = marginMode.lower()
4641
+ if marginMode != 'isolated' and marginMode != 'cross':
4642
+ raise BadRequest(self.id + ' setMarginMode() marginMode argument should be isolated or cross')
4643
+ if marginMode == 'cross':
4644
+ marginMode = 'CROSSED'
4645
+ else:
4646
+ marginMode = 'ISOLATED'
4647
+ posSide = self.safe_string_upper(params, 'positionSide')
4648
+ if posSide is None:
4649
+ raise ArgumentsRequired(self.id + ' setMarginMode() requires a positionSide parameter, either "LONG" or "SHORT"')
4650
+ request: dict = {
4651
+ 'positionType': marginMode,
4652
+ 'positionSide': posSide,
4653
+ 'symbol': market['id'],
4654
+ }
4655
+ response = self.privateLinearPostFutureUserV1PositionChangeType(self.extend(request, params))
4656
+ #
4657
+ # {
4658
+ # "error": {
4659
+ # "code": "",
4660
+ # "msg": ""
4661
+ # },
4662
+ # "msgInfo": "",
4663
+ # "result": {},
4664
+ # "returnCode": 0
4665
+ # }
4666
+ #
4667
+ return response # unify return type
4668
+
4619
4669
  def handle_errors(self, code, reason, url, method, headers, body, response, requestHeaders, requestBody):
4620
4670
  #
4621
4671
  # spot: error
@@ -4666,6 +4716,9 @@ class xt(Exchange, ImplicitAPI):
4666
4716
  # "result": {}
4667
4717
  # }
4668
4718
  #
4719
+ # {"returnCode":1,"msgInfo":"failure","error":{"code":"insufficient_balance","msg":"insufficient balance","args":[]},"result":null}
4720
+ #
4721
+ #
4669
4722
  status = self.safe_string_upper_2(response, 'msgInfo', 'mc')
4670
4723
  if status is not None and status != 'SUCCESS':
4671
4724
  feedback = self.id + ' ' + body
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ccxt
3
- Version: 4.4.57
3
+ Version: 4.4.58
4
4
  Summary: A JavaScript / TypeScript / Python / C# / PHP cryptocurrency trading library with support for 100+ exchanges
5
5
  Home-page: https://ccxt.com
6
6
  Author: Igor Kroitor
@@ -49,7 +49,7 @@ Requires-Dist: mypy==1.6.1; extra == "type"
49
49
 
50
50
  # CCXT – CryptoCurrency eXchange Trading Library
51
51
 
52
- [![Build Status](https://img.shields.io/travis/com/ccxt/ccxt)](https://travis-ci.com/ccxt/ccxt) [![npm](https://img.shields.io/npm/v/ccxt.svg)](https://npmjs.com/package/ccxt) [![PyPI](https://img.shields.io/pypi/v/ccxt.svg)](https://pypi.python.org/pypi/ccxt) [![NPM Downloads](https://img.shields.io/npm/dy/ccxt.svg)](https://www.npmjs.com/package/ccxt) [![NuGet version](https://badge.fury.io/nu/ccxt.svg)](https://badge.fury.io/nu/ccxt) [![GoDoc](https://pkg.go.dev/badge/github.com/ccxt/ccxt/go/v4?utm_source=godoc)](https://godoc.org/github.com/ccxt/ccxt/go/v4) [![Discord](https://img.shields.io/discord/690203284119617602?logo=discord&logoColor=white)](https://discord.gg/ccxt) [![Supported Exchanges](https://img.shields.io/badge/exchanges-111-blue.svg)](https://github.com/ccxt/ccxt/wiki/Exchange-Markets) [![Twitter Follow](https://img.shields.io/twitter/follow/ccxt_official.svg?style=social&label=CCXT)](https://twitter.com/ccxt_official)
52
+ [![NPM Downloads](https://img.shields.io/npm/dy/ccxt.svg)](https://www.npmjs.com/package/ccxt) [![npm](https://img.shields.io/npm/v/ccxt.svg)](https://npmjs.com/package/ccxt) [![PyPI](https://img.shields.io/pypi/v/ccxt.svg)](https://pypi.python.org/pypi/ccxt) [![NuGet version](https://img.shields.io/nuget/v/ccxt)](https://www.nuget.org/packages/ccxt) [![GoDoc](https://pkg.go.dev/badge/github.com/ccxt/ccxt/go/v4?utm_source=godoc)](https://godoc.org/github.com/ccxt/ccxt/go/v4) [![Discord](https://img.shields.io/discord/690203284119617602?logo=discord&logoColor=white)](https://discord.gg/ccxt) [![Supported Exchanges](https://img.shields.io/badge/exchanges-111-blue.svg)](https://github.com/ccxt/ccxt/wiki/Exchange-Markets) [![Follow CCXT at x.com](https://img.shields.io/twitter/follow/ccxt_official.svg?style=social&label=CCXT)](https://x.com/ccxt_official)
53
53
 
54
54
  A JavaScript / Python / PHP / C# / Go library for cryptocurrency trading and e-commerce with support for many bitcoin/ether/altcoin exchange markets and merchant APIs.
55
55
 
@@ -280,13 +280,13 @@ console.log(version, Object.keys(exchanges));
280
280
 
281
281
  All-in-one browser bundle (dependencies included), served from a CDN of your choice:
282
282
 
283
- * jsDelivr: https://cdn.jsdelivr.net/npm/ccxt@4.4.57/dist/ccxt.browser.min.js
284
- * unpkg: https://unpkg.com/ccxt@4.4.57/dist/ccxt.browser.min.js
283
+ * jsDelivr: https://cdn.jsdelivr.net/npm/ccxt@4.4.58/dist/ccxt.browser.min.js
284
+ * unpkg: https://unpkg.com/ccxt@4.4.58/dist/ccxt.browser.min.js
285
285
 
286
286
  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.
287
287
 
288
288
  ```HTML
289
- <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/ccxt@4.4.57/dist/ccxt.browser.min.js"></script>
289
+ <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/ccxt@4.4.58/dist/ccxt.browser.min.js"></script>
290
290
  ```
291
291
 
292
292
  Creates a global `ccxt` object: