ccxt 4.3.11__py2.py3-none-any.whl → 4.3.13__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.
Files changed (73) hide show
  1. ccxt/__init__.py +1 -1
  2. ccxt/abstract/bybit.py +1 -0
  3. ccxt/async_support/__init__.py +1 -1
  4. ccxt/async_support/base/exchange.py +1 -1
  5. ccxt/async_support/bigone.py +22 -22
  6. ccxt/async_support/binance.py +7 -7
  7. ccxt/async_support/bingx.py +2 -2
  8. ccxt/async_support/bitget.py +10 -8
  9. ccxt/async_support/bitmart.py +7 -11
  10. ccxt/async_support/bitmex.py +2 -2
  11. ccxt/async_support/bybit.py +76 -65
  12. ccxt/async_support/coinbase.py +8 -8
  13. ccxt/async_support/coinbaseinternational.py +2 -2
  14. ccxt/async_support/coinex.py +501 -445
  15. ccxt/async_support/coinlist.py +12 -12
  16. ccxt/async_support/coinmetro.py +2 -2
  17. ccxt/async_support/cryptocom.py +16 -16
  18. ccxt/async_support/digifinex.py +3 -3
  19. ccxt/async_support/gate.py +2 -2
  20. ccxt/async_support/hitbtc.py +3 -3
  21. ccxt/async_support/htx.py +6 -9
  22. ccxt/async_support/indodax.py +2 -2
  23. ccxt/async_support/kraken.py +3 -1
  24. ccxt/async_support/kucoin.py +4 -4
  25. ccxt/async_support/kucoinfutures.py +6 -6
  26. ccxt/async_support/mexc.py +5 -5
  27. ccxt/async_support/okx.py +9 -9
  28. ccxt/async_support/poloniexfutures.py +4 -4
  29. ccxt/async_support/probit.py +2 -2
  30. ccxt/async_support/whitebit.py +72 -1
  31. ccxt/async_support/woo.py +2 -2
  32. ccxt/base/exchange.py +14 -2
  33. ccxt/base/types.py +25 -0
  34. ccxt/bigone.py +22 -22
  35. ccxt/binance.py +7 -7
  36. ccxt/bingx.py +2 -2
  37. ccxt/bitget.py +10 -8
  38. ccxt/bitmart.py +7 -11
  39. ccxt/bitmex.py +2 -2
  40. ccxt/bybit.py +76 -65
  41. ccxt/coinbase.py +8 -8
  42. ccxt/coinbaseinternational.py +2 -2
  43. ccxt/coinex.py +501 -445
  44. ccxt/coinlist.py +12 -12
  45. ccxt/coinmetro.py +2 -2
  46. ccxt/cryptocom.py +16 -16
  47. ccxt/digifinex.py +3 -3
  48. ccxt/gate.py +2 -2
  49. ccxt/hitbtc.py +3 -3
  50. ccxt/htx.py +6 -9
  51. ccxt/indodax.py +2 -2
  52. ccxt/kraken.py +3 -1
  53. ccxt/kucoin.py +4 -4
  54. ccxt/kucoinfutures.py +6 -6
  55. ccxt/mexc.py +5 -5
  56. ccxt/okx.py +9 -9
  57. ccxt/poloniexfutures.py +4 -4
  58. ccxt/pro/__init__.py +1 -1
  59. ccxt/pro/bitget.py +139 -87
  60. ccxt/pro/bybit.py +192 -12
  61. ccxt/pro/coinbase.py +90 -20
  62. ccxt/pro/mexc.py +21 -1
  63. ccxt/probit.py +2 -2
  64. ccxt/test/base/test_datetime.py +6 -0
  65. ccxt/test/base/test_ledger_entry.py +2 -2
  66. ccxt/whitebit.py +72 -1
  67. ccxt/woo.py +2 -2
  68. {ccxt-4.3.11.dist-info → ccxt-4.3.13.dist-info}/METADATA +4 -4
  69. {ccxt-4.3.11.dist-info → ccxt-4.3.13.dist-info}/RECORD +71 -73
  70. ccxt/async_support/flowbtc.py +0 -34
  71. ccxt/flowbtc.py +0 -34
  72. {ccxt-4.3.11.dist-info → ccxt-4.3.13.dist-info}/WHEEL +0 -0
  73. {ccxt-4.3.11.dist-info → ccxt-4.3.13.dist-info}/top_level.txt +0 -0
ccxt/pro/coinbase.py CHANGED
@@ -31,10 +31,12 @@ class coinbase(ccxt.async_support.coinbase):
31
31
  'watchMyTrades': False,
32
32
  'watchOHLCV': False,
33
33
  'watchOrderBook': True,
34
+ 'watchOrderBookForSymbols': True,
34
35
  'watchOrders': True,
35
36
  'watchTicker': True,
36
37
  'watchTickers': True,
37
38
  'watchTrades': True,
39
+ 'watchTradesForSymbols': True,
38
40
  },
39
41
  'urls': {
40
42
  'api': {
@@ -76,7 +78,6 @@ class coinbase(ccxt.async_support.coinbase):
76
78
  messageHash = name + '::' + market['id']
77
79
  productIds = [market['id']]
78
80
  url = self.urls['api']['ws']
79
- timestamp = self.number_to_string(self.seconds())
80
81
  subscribe = {
81
82
  'type': 'subscribe',
82
83
  'product_ids': productIds,
@@ -86,27 +87,63 @@ class coinbase(ccxt.async_support.coinbase):
86
87
  # 'signature': self.hmac(self.encode(auth), self.encode(self.secret), hashlib.sha256),
87
88
  }
88
89
  if isPrivate:
89
- self.check_required_credentials()
90
- isCloudAPiKey = (self.apiKey.find('organizations/') >= 0) or (self.secret.startswith('-----BEGIN'))
91
- auth = timestamp + name + ','.join(productIds)
92
- if not isCloudAPiKey:
93
- subscribe['api_key'] = self.apiKey
94
- subscribe['timestamp'] = timestamp
95
- subscribe['signature'] = self.hmac(self.encode(auth), self.encode(self.secret), hashlib.sha256)
96
- else:
97
- if self.apiKey.startswith('-----BEGIN'):
98
- raise ArgumentsRequired(self.id + ' apiKey should contain the name(eg: organizations/3b910e93....) and not the public key')
99
- currentToken = self.safe_string(self.options, 'wsToken')
100
- tokenTimestamp = self.safe_integer(self.options, 'wsTokenTimestamp', 0)
101
- seconds = self.seconds()
102
- if currentToken is None or tokenTimestamp + 120 < seconds:
103
- # we should generate new token
104
- token = self.create_auth_token(seconds)
105
- self.options['wsToken'] = token
106
- self.options['wsTokenTimestamp'] = seconds
107
- subscribe['jwt'] = self.safe_string(self.options, 'wsToken')
90
+ subscribe = self.extend(subscribe, self.create_ws_auth(name, productIds))
108
91
  return await self.watch(url, messageHash, subscribe, messageHash)
109
92
 
93
+ async def subscribe_multiple(self, name: str, isPrivate: bool, symbols: Strings = None, params={}):
94
+ """
95
+ * @ignore
96
+ subscribes to a websocket channel
97
+ :see: https://docs.cloud.coinbase.com/advanced-trade-api/docs/ws-overview#subscribe
98
+ :param str name: the name of the channel
99
+ :param str[] [symbols]: unified market symbol
100
+ :param dict [params]: extra parameters specific to the exchange API endpoint
101
+ :returns dict: subscription to a websocket channel
102
+ """
103
+ await self.load_markets()
104
+ productIds = []
105
+ messageHashes = []
106
+ symbols = self.market_symbols(symbols, None, False)
107
+ for i in range(0, len(symbols)):
108
+ symbol = symbols[i]
109
+ market = self.market(symbol)
110
+ marketId = market['id']
111
+ productIds.append(marketId)
112
+ messageHashes.append(name + '::' + marketId)
113
+ url = self.urls['api']['ws']
114
+ subscribe = {
115
+ 'type': 'subscribe',
116
+ 'product_ids': productIds,
117
+ 'channel': name,
118
+ }
119
+ if isPrivate:
120
+ subscribe = self.extend(subscribe, self.create_ws_auth(name, productIds))
121
+ return await self.watch_multiple(url, messageHashes, subscribe, messageHashes)
122
+
123
+ def create_ws_auth(self, name: str, productIds: List[str]):
124
+ subscribe = {}
125
+ timestamp = self.number_to_string(self.seconds())
126
+ self.check_required_credentials()
127
+ isCloudAPiKey = (self.apiKey.find('organizations/') >= 0) or (self.secret.startswith('-----BEGIN'))
128
+ auth = timestamp + name + ','.join(productIds)
129
+ if not isCloudAPiKey:
130
+ subscribe['api_key'] = self.apiKey
131
+ subscribe['timestamp'] = timestamp
132
+ subscribe['signature'] = self.hmac(self.encode(auth), self.encode(self.secret), hashlib.sha256)
133
+ else:
134
+ if self.apiKey.startswith('-----BEGIN'):
135
+ raise ArgumentsRequired(self.id + ' apiKey should contain the name(eg: organizations/3b910e93....) and not the public key')
136
+ currentToken = self.safe_string(self.options, 'wsToken')
137
+ tokenTimestamp = self.safe_integer(self.options, 'wsTokenTimestamp', 0)
138
+ seconds = self.seconds()
139
+ if currentToken is None or tokenTimestamp + 120 < seconds:
140
+ # we should generate new token
141
+ token = self.create_auth_token(seconds)
142
+ self.options['wsToken'] = token
143
+ self.options['wsTokenTimestamp'] = seconds
144
+ subscribe['jwt'] = self.safe_string(self.options, 'wsToken')
145
+ return subscribe
146
+
110
147
  async def watch_ticker(self, symbol: str, params={}) -> Ticker:
111
148
  """
112
149
  watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
@@ -289,6 +326,25 @@ class coinbase(ccxt.async_support.coinbase):
289
326
  limit = trades.getLimit(symbol, limit)
290
327
  return self.filter_by_since_limit(trades, since, limit, 'timestamp', True)
291
328
 
329
+ async def watch_trades_for_symbols(self, symbols: List[str], since: Int = None, limit: Int = None, params={}) -> List[Trade]:
330
+ """
331
+ get the list of most recent trades for a particular symbol
332
+ :see: https://docs.cloud.coinbase.com/advanced-trade-api/docs/ws-channels#market-trades-channel
333
+ :param str[] symbols: unified symbol of the market to fetch trades for
334
+ :param int [since]: timestamp in ms of the earliest trade to fetch
335
+ :param int [limit]: the maximum amount of trades to fetch
336
+ :param dict [params]: extra parameters specific to the exchange API endpoint
337
+ :returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=public-trades>`
338
+ """
339
+ await self.load_markets()
340
+ name = 'market_trades'
341
+ trades = await self.subscribe_multiple(name, False, symbols, params)
342
+ if self.newUpdates:
343
+ first = self.safe_dict(trades, 0)
344
+ tradeSymbol = self.safe_string(first, 'symbol')
345
+ limit = trades.getLimit(tradeSymbol, limit)
346
+ return self.filter_by_since_limit(trades, since, limit, 'timestamp', True)
347
+
292
348
  async def watch_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
293
349
  """
294
350
  watches information on multiple orders made by the user
@@ -322,6 +378,20 @@ class coinbase(ccxt.async_support.coinbase):
322
378
  orderbook = await self.subscribe(name, False, symbol, params)
323
379
  return orderbook.limit()
324
380
 
381
+ async def watch_order_book_for_symbols(self, symbols: List[str], limit: Int = None, params={}) -> OrderBook:
382
+ """
383
+ watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
384
+ :see: https://docs.cloud.coinbase.com/advanced-trade-api/docs/ws-channels#level2-channel
385
+ :param str[] symbols: unified array of symbols
386
+ :param int [limit]: the maximum amount of order book entries to return
387
+ :param dict [params]: extra parameters specific to the exchange API endpoint
388
+ :returns dict: A dictionary of `order book structures <https://docs.ccxt.com/#/?id=order-book-structure>` indexed by market symbols
389
+ """
390
+ await self.load_markets()
391
+ name = 'level2'
392
+ orderbook = await self.subscribe_multiple(name, False, symbols, params)
393
+ return orderbook.limit()
394
+
325
395
  def handle_trade(self, client, message):
326
396
  #
327
397
  # {
ccxt/pro/mexc.py CHANGED
@@ -665,6 +665,21 @@ class mexc(ccxt.async_support.mexc):
665
665
  # "v": "5"
666
666
  # }
667
667
  #
668
+ #
669
+ # d: {
670
+ # p: '1.0005',
671
+ # v: '5.71',
672
+ # a: '5.712855',
673
+ # S: 1,
674
+ # T: 1714325698237,
675
+ # t: 'edafcd9fdc2f426e82443d114691f724',
676
+ # c: '',
677
+ # i: 'C02__413321238354677760043',
678
+ # m: 0,
679
+ # st: 0,
680
+ # n: '0.005712855',
681
+ # N: 'USDT'
682
+ # }
668
683
  timestamp = self.safe_integer(trade, 'T')
669
684
  tradeId = self.safe_string(trade, 't')
670
685
  if timestamp is None:
@@ -675,6 +690,8 @@ class mexc(ccxt.async_support.mexc):
675
690
  rawSide = self.safe_string(trade, 'S')
676
691
  side = 'buy' if (rawSide == '1') else 'sell'
677
692
  isMaker = self.safe_integer(trade, 'm')
693
+ feeAmount = self.safe_number(trade, 'n')
694
+ feeCurrencyId = self.safe_string(trade, 'N')
678
695
  return self.safe_trade({
679
696
  'info': trade,
680
697
  'id': tradeId,
@@ -688,7 +705,10 @@ class mexc(ccxt.async_support.mexc):
688
705
  'price': priceString,
689
706
  'amount': amountString,
690
707
  'cost': None,
691
- 'fee': None,
708
+ 'fee': {
709
+ 'cost': feeAmount,
710
+ 'currency': self.safe_currency_code(feeCurrencyId),
711
+ },
692
712
  }, market)
693
713
 
694
714
  async def watch_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
ccxt/probit.py CHANGED
@@ -1428,10 +1428,10 @@ class probit(Exchange, ImplicitAPI):
1428
1428
  request['start_time'] = self.iso8601(since)
1429
1429
  else:
1430
1430
  request['start_time'] = self.iso8601(1)
1431
- until = self.safe_integer_2(params, 'till', 'until')
1431
+ until = self.safe_integer(params, 'until')
1432
1432
  if until is not None:
1433
1433
  request['end_time'] = self.iso8601(until)
1434
- params = self.omit(params, ['until', 'till'])
1434
+ params = self.omit(params, ['until'])
1435
1435
  else:
1436
1436
  request['end_time'] = self.iso8601(self.milliseconds())
1437
1437
  if limit is not None:
@@ -62,6 +62,12 @@ assert exchange.parse8601(33) is None
62
62
  assert exchange.parse_date('1986-04-26 00:00:00') == 514857600000
63
63
  assert exchange.parse_date('1986-04-26T01:23:47.000Z') == 514862627000
64
64
  assert exchange.parse_date('1986-13-13 00:00:00') is None
65
+ # GMT formats
66
+ assert exchange.parse_date('Mon, 29 Apr 2024 14:00:17 GMT') == 1714399217000
67
+ assert exchange.parse_date('Mon, 29 Apr 2024 14:09:17 GMT') == 1714399757000
68
+ assert exchange.parse_date('Sun, 29 Dec 2024 01:01:10 GMT') == 1735434070000
69
+ assert exchange.parse_date('Sun, 29 Dec 2024 02:11:10 GMT') == 1735438270000
70
+ assert exchange.parse_date('Sun, 08 Dec 2024 02:03:04 GMT') == 1733623384000
65
71
 
66
72
 
67
73
  assert exchange.roundTimeframe('5m', exchange.parse8601('2019-08-12 13:22:08'), ROUND_DOWN) == exchange.parse8601('2019-08-12 13:20:00')
@@ -20,8 +20,8 @@ def test_ledger_entry(exchange, skipped_properties, method, entry, requested_cod
20
20
  'id': 'x1234',
21
21
  'currency': 'BTC',
22
22
  'account': 'spot',
23
- 'referenceId': '',
24
- 'referenceAccount': '',
23
+ 'referenceId': 'foo',
24
+ 'referenceAccount': 'bar',
25
25
  'status': 'ok',
26
26
  'amount': exchange.parse_number('22'),
27
27
  'before': exchange.parse_number('111'),
ccxt/whitebit.py CHANGED
@@ -60,6 +60,7 @@ class whitebit(Exchange, ImplicitAPI):
60
60
  'fetchDeposit': True,
61
61
  'fetchDepositAddress': True,
62
62
  'fetchDeposits': True,
63
+ 'fetchDepositsWithdrawals': True,
63
64
  'fetchDepositWithdrawFee': 'emulated',
64
65
  'fetchDepositWithdrawFees': True,
65
66
  'fetchFundingHistory': False,
@@ -1852,6 +1853,7 @@ class whitebit(Exchange, ImplicitAPI):
1852
1853
  # {
1853
1854
  # "address": "3ApEASLcrQtZpg1TsssFgYF5V5YQJAKvuE", # deposit address
1854
1855
  # "uniqueId": null, # unique Id of deposit
1856
+ # "transactionId": "a6d71d69-2b17-4ad8-8b15-2d686c54a1a5",
1855
1857
  # "createdAt": 1593437922, # timestamp of deposit
1856
1858
  # "currency": "Bitcoin", # deposit currency
1857
1859
  # "ticker": "BTC", # deposit currency ticker
@@ -1875,6 +1877,7 @@ class whitebit(Exchange, ImplicitAPI):
1875
1877
  # "actual": 1, # current block confirmations
1876
1878
  # "required": 2 # required block confirmation for successful deposit
1877
1879
  # }
1880
+ # "centralized": False,
1878
1881
  # }
1879
1882
  #
1880
1883
  currency = self.safe_currency(None, currency)
@@ -1885,7 +1888,7 @@ class whitebit(Exchange, ImplicitAPI):
1885
1888
  method = self.safe_string(transaction, 'method')
1886
1889
  return {
1887
1890
  'id': self.safe_string(transaction, 'uniqueId'),
1888
- 'txid': self.safe_string(transaction, 'transactionHash'),
1891
+ 'txid': self.safe_string(transaction, 'transactionId'),
1889
1892
  'timestamp': timestamp,
1890
1893
  'datetime': self.iso8601(timestamp),
1891
1894
  'network': self.safe_string(transaction, 'network'),
@@ -2263,6 +2266,74 @@ class whitebit(Exchange, ImplicitAPI):
2263
2266
  'previousFundingDatetime': None,
2264
2267
  }
2265
2268
 
2269
+ def fetch_deposits_withdrawals(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Transaction]:
2270
+ """
2271
+ fetch history of deposits and withdrawals
2272
+ :see: https://github.com/whitebit-exchange/api-docs/blob/main/pages/private/http-main-v4.md#get-depositwithdraw-history
2273
+ :param str [code]: unified currency code for the currency of the deposit/withdrawals, default is None
2274
+ :param int [since]: timestamp in ms of the earliest deposit/withdrawal, default is None
2275
+ :param int [limit]: max number of deposit/withdrawals to return, default = 50, Min: 1, Max: 100
2276
+ :param dict [params]: extra parameters specific to the exchange API endpoint
2277
+ *
2278
+ * EXCHANGE SPECIFIC PARAMETERS
2279
+ :param number [params.transactionMethod]: Method. Example: 1 to display deposits / 2 to display withdraws. Do not send self parameter in order to receive both deposits and withdraws.
2280
+ :param str [params.address]: Can be used for filtering transactions by specific address or memo.
2281
+ :param str[] [params.addresses]: Can be used for filtering transactions by specific addresses or memos(max: 20).
2282
+ :param str [params.uniqueId]: Can be used for filtering transactions by specific unique id
2283
+ :param int [params.offset]: If you want the request to return entries starting from a particular line, you can use OFFSET clause to tell it where it should start. Default: 0, Min: 0, Max: 10000
2284
+ :param str[] [params.status]: Can be used for filtering transactions by status codes. Caution: You must use self parameter with appropriate transactionMethod and use valid status codes for self method. You can find them below. Example: "status": [3,7]
2285
+ :returns dict: a list of `transaction structure <https://docs.ccxt.com/#/?id=transaction-structure>`
2286
+ """
2287
+ self.load_markets()
2288
+ request = {}
2289
+ currency = None
2290
+ if code is not None:
2291
+ currency = self.currency(code)
2292
+ request['ticker'] = currency['id']
2293
+ if limit is not None:
2294
+ request['limit'] = limit # default 1000
2295
+ response = self.v4PrivatePostMainAccountHistory(self.extend(request, params))
2296
+ #
2297
+ # {
2298
+ # "limit": 100,
2299
+ # "offset": 0,
2300
+ # "records": [
2301
+ # {
2302
+ # "address": "3ApEASLcrQtZpg1TsssFgYF5V5YQJAKvuE", # deposit address
2303
+ # "uniqueId": null, # unique Id of deposit
2304
+ # "createdAt": 1593437922, # timestamp of deposit
2305
+ # "currency": "Bitcoin", # deposit currency
2306
+ # "ticker": "BTC", # deposit currency ticker
2307
+ # "method": 1, # called method 1 - deposit, 2 - withdraw
2308
+ # "amount": "0.0006", # amount of deposit
2309
+ # "description": "", # deposit description
2310
+ # "memo": "", # deposit memo
2311
+ # "fee": "0", # deposit fee
2312
+ # "status": 15, # transactions status
2313
+ # "network": null, # if currency is multinetwork
2314
+ # "transactionHash": "a275a514013e4e0f927fd0d1bed215e7f6f2c4c6ce762836fe135ec22529d886", # deposit transaction hash
2315
+ # "transactionId": "5e112b38-9652-11ed-a1eb-0242ac120002", # transaction id
2316
+ # "details": {
2317
+ # "partial": { # details about partially successful withdrawals
2318
+ # "requestAmount": "50000", # requested withdrawal amount
2319
+ # "processedAmount": "39000", # processed withdrawal amount
2320
+ # "processedFee": "273", # fee for processed withdrawal amount
2321
+ # "normalizeTransaction": "" # deposit id
2322
+ # }
2323
+ # },
2324
+ # "confirmations": { # if transaction status == 15(Pending) you can see self object
2325
+ # "actual": 1, # current block confirmations
2326
+ # "required": 2 # required block confirmation for successful deposit
2327
+ # }
2328
+ # },
2329
+ # {...},
2330
+ # ],
2331
+ # "total": 300 # total number of transactions, use self for calculating ‘limit’ and ‘offset'
2332
+ # }
2333
+ #
2334
+ records = self.safe_list(response, 'records')
2335
+ return self.parse_transactions(records, currency, since, limit)
2336
+
2266
2337
  def is_fiat(self, currency):
2267
2338
  fiatCurrencies = self.safe_value(self.options, 'fiatCurrencies', [])
2268
2339
  return self.in_array(currency, fiatCurrencies)
ccxt/woo.py CHANGED
@@ -2156,8 +2156,8 @@ class woo(Exchange, ImplicitAPI):
2156
2156
  request['size'] = limit
2157
2157
  if since is not None:
2158
2158
  request['start_t'] = since
2159
- until = self.safe_integer_2(params, 'until', 'till') # unified in milliseconds
2160
- params = self.omit(params, ['until', 'till'])
2159
+ until = self.safe_integer(params, 'until') # unified in milliseconds
2160
+ params = self.omit(params, ['until'])
2161
2161
  if until is not None:
2162
2162
  request['end_t'] = until
2163
2163
  response = self.v1PrivateGetAssetMainSubTransferHistory(self.extend(request, params))
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ccxt
3
- Version: 4.3.11
3
+ Version: 4.3.13
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
@@ -262,13 +262,13 @@ console.log(version, Object.keys(exchanges));
262
262
 
263
263
  All-in-one browser bundle (dependencies included), served from a CDN of your choice:
264
264
 
265
- * jsDelivr: https://cdn.jsdelivr.net/npm/ccxt@4.3.11/dist/ccxt.browser.js
266
- * unpkg: https://unpkg.com/ccxt@4.3.11/dist/ccxt.browser.js
265
+ * jsDelivr: https://cdn.jsdelivr.net/npm/ccxt@4.3.13/dist/ccxt.browser.js
266
+ * unpkg: https://unpkg.com/ccxt@4.3.13/dist/ccxt.browser.js
267
267
 
268
268
  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.
269
269
 
270
270
  ```HTML
271
- <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/ccxt@4.3.11/dist/ccxt.browser.js"></script>
271
+ <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/ccxt@4.3.13/dist/ccxt.browser.js"></script>
272
272
  ```
273
273
 
274
274
  Creates a global `ccxt` object: