ccxt 4.4.80__py2.py3-none-any.whl → 4.4.85__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 (104) hide show
  1. ccxt/__init__.py +1 -5
  2. ccxt/abstract/blofin.py +8 -0
  3. ccxt/abstract/btcbox.py +1 -0
  4. ccxt/apex.py +21 -30
  5. ccxt/ascendex.py +1 -1
  6. ccxt/async_support/__init__.py +1 -5
  7. ccxt/async_support/apex.py +21 -30
  8. ccxt/async_support/ascendex.py +1 -1
  9. ccxt/async_support/base/exchange.py +26 -3
  10. ccxt/async_support/base/ws/cache.py +6 -1
  11. ccxt/async_support/bigone.py +17 -14
  12. ccxt/async_support/bingx.py +13 -32
  13. ccxt/async_support/bitfinex.py +61 -48
  14. ccxt/async_support/bitget.py +7 -4
  15. ccxt/async_support/bitrue.py +14 -32
  16. ccxt/async_support/bitso.py +33 -0
  17. ccxt/async_support/bitstamp.py +33 -0
  18. ccxt/async_support/blofin.py +145 -14
  19. ccxt/async_support/btcbox.py +25 -5
  20. ccxt/async_support/bybit.py +20 -39
  21. ccxt/async_support/cex.py +2 -4
  22. ccxt/async_support/coinbase.py +56 -42
  23. ccxt/async_support/coinbaseexchange.py +141 -32
  24. ccxt/async_support/coincatch.py +14 -67
  25. ccxt/async_support/coinex.py +28 -29
  26. ccxt/async_support/coinlist.py +17 -16
  27. ccxt/async_support/coinmetro.py +20 -11
  28. ccxt/async_support/coinone.py +8 -10
  29. ccxt/async_support/coinsph.py +124 -2
  30. ccxt/async_support/cryptocom.py +109 -2
  31. ccxt/async_support/cryptomus.py +42 -80
  32. ccxt/async_support/delta.py +75 -36
  33. ccxt/async_support/derive.py +46 -10
  34. ccxt/async_support/ellipx.py +175 -77
  35. ccxt/async_support/gate.py +1 -1
  36. ccxt/async_support/gemini.py +3 -4
  37. ccxt/async_support/hitbtc.py +56 -65
  38. ccxt/async_support/htx.py +2 -2
  39. ccxt/async_support/hyperliquid.py +15 -2
  40. ccxt/async_support/kraken.py +27 -23
  41. ccxt/async_support/kucoinfutures.py +5 -0
  42. ccxt/async_support/lbank.py +1 -1
  43. ccxt/async_support/okx.py +1 -2
  44. ccxt/async_support/oxfun.py +21 -1
  45. ccxt/async_support/paradex.py +120 -4
  46. ccxt/base/errors.py +6 -0
  47. ccxt/base/exchange.py +40 -3
  48. ccxt/base/types.py +3 -0
  49. ccxt/bigone.py +17 -14
  50. ccxt/bingx.py +13 -32
  51. ccxt/bitfinex.py +61 -48
  52. ccxt/bitget.py +7 -4
  53. ccxt/bitrue.py +14 -32
  54. ccxt/bitso.py +33 -0
  55. ccxt/bitstamp.py +33 -0
  56. ccxt/blofin.py +145 -14
  57. ccxt/btcbox.py +24 -5
  58. ccxt/bybit.py +20 -39
  59. ccxt/cex.py +2 -4
  60. ccxt/coinbase.py +56 -42
  61. ccxt/coinbaseexchange.py +141 -32
  62. ccxt/coincatch.py +14 -67
  63. ccxt/coinex.py +28 -29
  64. ccxt/coinlist.py +17 -16
  65. ccxt/coinmetro.py +20 -11
  66. ccxt/coinone.py +8 -10
  67. ccxt/coinsph.py +124 -2
  68. ccxt/cryptocom.py +109 -2
  69. ccxt/cryptomus.py +42 -80
  70. ccxt/delta.py +75 -36
  71. ccxt/derive.py +46 -10
  72. ccxt/ellipx.py +175 -77
  73. ccxt/gate.py +1 -1
  74. ccxt/gemini.py +3 -4
  75. ccxt/hitbtc.py +56 -65
  76. ccxt/htx.py +2 -2
  77. ccxt/hyperliquid.py +15 -2
  78. ccxt/kraken.py +27 -23
  79. ccxt/kucoinfutures.py +5 -0
  80. ccxt/lbank.py +1 -1
  81. ccxt/okx.py +1 -2
  82. ccxt/oxfun.py +21 -1
  83. ccxt/paradex.py +120 -4
  84. ccxt/pro/__init__.py +69 -3
  85. ccxt/pro/binance.py +31 -33
  86. ccxt/pro/bithumb.py +5 -3
  87. ccxt/pro/coinbase.py +1 -1
  88. ccxt/pro/hyperliquid.py +10 -2
  89. ccxt/pro/kraken.py +249 -79
  90. ccxt/pro/mexc.py +252 -7
  91. ccxt/pro/poloniex.py +6 -2
  92. {ccxt-4.4.80.dist-info → ccxt-4.4.85.dist-info}/METADATA +7 -11
  93. {ccxt-4.4.80.dist-info → ccxt-4.4.85.dist-info}/RECORD +96 -104
  94. ccxt/abstract/bl3p.py +0 -19
  95. ccxt/abstract/idex.py +0 -26
  96. ccxt/async_support/base/ws/fast_client.py +0 -97
  97. ccxt/async_support/bl3p.py +0 -543
  98. ccxt/async_support/idex.py +0 -1889
  99. ccxt/bl3p.py +0 -543
  100. ccxt/idex.py +0 -1889
  101. ccxt/pro/idex.py +0 -687
  102. {ccxt-4.4.80.dist-info → ccxt-4.4.85.dist-info}/LICENSE.txt +0 -0
  103. {ccxt-4.4.80.dist-info → ccxt-4.4.85.dist-info}/WHEEL +0 -0
  104. {ccxt-4.4.80.dist-info → ccxt-4.4.85.dist-info}/top_level.txt +0 -0
ccxt/pro/mexc.py CHANGED
@@ -39,6 +39,12 @@ class mexc(ccxt.async_support.mexc):
39
39
  'watchBidsAsks': True,
40
40
  'watchTrades': True,
41
41
  'watchTradesForSymbols': False,
42
+ 'unWatchTicker': True,
43
+ 'unWatchTickers': True,
44
+ 'unWatchBidsAsks': True,
45
+ 'unWatchOHLCV': True,
46
+ 'unWatchOrderBook': True,
47
+ 'unWatchTrades': True,
42
48
  },
43
49
  'urls': {
44
50
  'api': {
@@ -471,12 +477,15 @@ class mexc(ccxt.async_support.mexc):
471
477
  }, market)
472
478
 
473
479
  async def watch_spot_public(self, channel, messageHash, params={}):
480
+ unsubscribed = self.safe_bool(params, 'unsubscribed', False)
481
+ params = self.omit(params, ['unsubscribed'])
474
482
  url = self.urls['api']['ws']['spot']
483
+ method = 'UNSUBSCRIPTION' if (unsubscribed) else 'SUBSCRIPTION'
475
484
  request: dict = {
476
- 'method': 'SUBSCRIPTION',
485
+ 'method': method,
477
486
  'params': [channel],
478
487
  }
479
- return await self.watch(url, messageHash, self.extend(request, params), channel)
488
+ return await self.watch(url, messageHash, self.extend(request, params), messageHash)
480
489
 
481
490
  async def watch_spot_private(self, channel, messageHash, params={}):
482
491
  self.check_required_credentials()
@@ -759,11 +768,6 @@ class mexc(ccxt.async_support.mexc):
759
768
  messageHash = 'orderbook:' + symbol
760
769
  subscription = self.safe_value(client.subscriptions, messageHash)
761
770
  limit = self.safe_integer(subscription, 'limit')
762
- if subscription is True:
763
- # we set client.subscriptions[messageHash] to 1
764
- # once we have received the first delta and initialized the orderbook
765
- client.subscriptions[messageHash] = 1
766
- self.orderbooks[symbol] = self.counted_order_book({})
767
771
  storedOrderBook = self.orderbooks[symbol]
768
772
  nonce = self.safe_integer(storedOrderBook, 'nonce')
769
773
  if nonce is None:
@@ -1351,6 +1355,247 @@ class mexc(ccxt.async_support.mexc):
1351
1355
  self.balance[type] = self.safe_balance(self.balance[type])
1352
1356
  client.resolve(self.balance[type], messageHash)
1353
1357
 
1358
+ async def un_watch_ticker(self, symbol: str, params={}) -> Any:
1359
+ """
1360
+ unWatches a price ticker, a statistical calculation with the information calculated over the past 24 hours for all markets of a specific list
1361
+ :param str symbol: unified symbol of the market to fetch the ticker for
1362
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1363
+ :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
1364
+ """
1365
+ await self.load_markets()
1366
+ market = self.market(symbol)
1367
+ messageHash = 'unsubscribe:ticker:' + market['symbol']
1368
+ url = None
1369
+ channel = None
1370
+ if market['spot']:
1371
+ miniTicker = False
1372
+ miniTicker, params = self.handle_option_and_params(params, 'watchTicker', 'miniTicker')
1373
+ if miniTicker:
1374
+ channel = 'spot@public.miniTicker.v3.api@' + market['id'] + '@UTC+8'
1375
+ else:
1376
+ channel = 'spot@public.bookTicker.v3.api@' + market['id']
1377
+ url = self.urls['api']['ws']['spot']
1378
+ params['unsubscribed'] = True
1379
+ self.watch_spot_public(channel, messageHash, params)
1380
+ else:
1381
+ channel = 'unsub.ticker'
1382
+ requestParams: dict = {
1383
+ 'symbol': market['id'],
1384
+ }
1385
+ url = self.urls['api']['ws']['swap']
1386
+ self.watch_swap_public(channel, messageHash, requestParams, params)
1387
+ client = self.client(url)
1388
+ self.handle_unsubscriptions(client, [messageHash])
1389
+ return None
1390
+
1391
+ async def un_watch_tickers(self, symbols: Strings = None, params={}) -> Any:
1392
+ """
1393
+ unWatches a price ticker, a statistical calculation with the information calculated over the past 24 hours for all markets of a specific list
1394
+ :param str[] symbols: unified symbol of the market to fetch the ticker for
1395
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1396
+ :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
1397
+ """
1398
+ await self.load_markets()
1399
+ symbols = self.market_symbols(symbols, None)
1400
+ messageHashes = []
1401
+ firstSymbol = self.safe_string(symbols, 0)
1402
+ market = None
1403
+ if firstSymbol is not None:
1404
+ market = self.market(firstSymbol)
1405
+ type = None
1406
+ type, params = self.handle_market_type_and_params('watchTickers', market, params)
1407
+ isSpot = (type == 'spot')
1408
+ url = self.urls['api']['ws']['spot'] if (isSpot) else self.urls['api']['ws']['swap']
1409
+ request: dict = {}
1410
+ if isSpot:
1411
+ miniTicker = False
1412
+ miniTicker, params = self.handle_option_and_params(params, 'watchTickers', 'miniTicker')
1413
+ topics = []
1414
+ if not miniTicker:
1415
+ if symbols is None:
1416
+ raise ArgumentsRequired(self.id + ' watchTickers required symbols argument for the bookTicker channel')
1417
+ marketIds = self.market_ids(symbols)
1418
+ for i in range(0, len(marketIds)):
1419
+ marketId = marketIds[i]
1420
+ messageHashes.append('unsubscribe:ticker:' + symbols[i])
1421
+ channel = 'spot@public.bookTicker.v3.api@' + marketId
1422
+ topics.append(channel)
1423
+ else:
1424
+ topics.append('spot@public.miniTickers.v3.api@UTC+8')
1425
+ if symbols is None:
1426
+ messageHashes.append('unsubscribe:spot:ticker')
1427
+ else:
1428
+ for i in range(0, len(symbols)):
1429
+ messageHashes.append('unsubscribe:ticker:' + symbols[i])
1430
+ request['method'] = 'UNSUBSCRIPTION'
1431
+ request['params'] = topics
1432
+ else:
1433
+ request['method'] = 'unsub.tickers'
1434
+ request['params'] = {}
1435
+ messageHashes.append('unsubscribe:ticker')
1436
+ client = self.client(url)
1437
+ self.watch_multiple(url, messageHashes, self.extend(request, params), messageHashes)
1438
+ self.handle_unsubscriptions(client, messageHashes)
1439
+ return None
1440
+
1441
+ async def un_watch_bids_asks(self, symbols: Strings = None, params={}) -> Any:
1442
+ """
1443
+ unWatches best bid & ask for symbols
1444
+ :param str[] symbols: unified symbol of the market to fetch the ticker for
1445
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1446
+ :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
1447
+ """
1448
+ await self.load_markets()
1449
+ symbols = self.market_symbols(symbols, None, True, False, True)
1450
+ marketType = None
1451
+ if symbols is None:
1452
+ raise ArgumentsRequired(self.id + ' watchBidsAsks required symbols argument')
1453
+ markets = self.markets_for_symbols(symbols)
1454
+ marketType, params = self.handle_market_type_and_params('watchBidsAsks', markets[0], params)
1455
+ isSpot = marketType == 'spot'
1456
+ if not isSpot:
1457
+ raise NotSupported(self.id + ' watchBidsAsks only support spot market')
1458
+ messageHashes = []
1459
+ topics = []
1460
+ for i in range(0, len(symbols)):
1461
+ if isSpot:
1462
+ market = self.market(symbols[i])
1463
+ topics.append('spot@public.bookTicker.v3.api@' + market['id'])
1464
+ messageHashes.append('unsubscribe:bidask:' + symbols[i])
1465
+ url = self.urls['api']['ws']['spot']
1466
+ request: dict = {
1467
+ 'method': 'UNSUBSCRIPTION',
1468
+ 'params': topics,
1469
+ }
1470
+ client = self.client(url)
1471
+ self.watch_multiple(url, messageHashes, self.extend(request, params), messageHashes)
1472
+ self.handle_unsubscriptions(client, messageHashes)
1473
+ return None
1474
+
1475
+ async def un_watch_ohlcv(self, symbol: str, timeframe='1m', params={}) -> Any:
1476
+ """
1477
+ unWatches historical candlestick data containing the open, high, low, and close price, and the volume of a market
1478
+ :param str symbol: unified symbol of the market to fetch OHLCV data for
1479
+ :param str timeframe: the length of time each candle represents
1480
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1481
+ :param dict [params.timezone]: if provided, kline intervals are interpreted in that timezone instead of UTC, example '+08:00'
1482
+ :returns int[][]: A list of candles ordered, open, high, low, close, volume
1483
+ """
1484
+ await self.load_markets()
1485
+ market = self.market(symbol)
1486
+ symbol = market['symbol']
1487
+ timeframes = self.safe_value(self.options, 'timeframes', {})
1488
+ timeframeId = self.safe_string(timeframes, timeframe)
1489
+ messageHash = 'unsubscribe:candles:' + symbol + ':' + timeframe
1490
+ url = None
1491
+ if market['spot']:
1492
+ url = self.urls['api']['ws']['spot']
1493
+ channel = 'spot@public.kline.v3.api@' + market['id'] + '@' + timeframeId
1494
+ params['unsubscribed'] = True
1495
+ self.watch_spot_public(channel, messageHash, params)
1496
+ else:
1497
+ url = self.urls['api']['ws']['swap']
1498
+ channel = 'unsub.kline'
1499
+ requestParams: dict = {
1500
+ 'symbol': market['id'],
1501
+ 'interval': timeframeId,
1502
+ }
1503
+ self.watch_swap_public(channel, messageHash, requestParams, params)
1504
+ client = self.client(url)
1505
+ self.handle_unsubscriptions(client, [messageHash])
1506
+ return None
1507
+
1508
+ async def un_watch_order_book(self, symbol: str, params={}) -> Any:
1509
+ """
1510
+ unWatches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
1511
+ :param str symbol: unified array of symbols
1512
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1513
+ :returns dict: A dictionary of `order book structures <https://docs.ccxt.com/#/?id=order-book-structure>` indexed by market symbols
1514
+ """
1515
+ await self.load_markets()
1516
+ market = self.market(symbol)
1517
+ symbol = market['symbol']
1518
+ messageHash = 'unsubscribe:orderbook:' + symbol
1519
+ url = None
1520
+ if market['spot']:
1521
+ url = self.urls['api']['ws']['spot']
1522
+ channel = 'spot@public.increase.depth.v3.api@' + market['id']
1523
+ params['unsubscribed'] = True
1524
+ self.watch_spot_public(channel, messageHash, params)
1525
+ else:
1526
+ url = self.urls['api']['ws']['swap']
1527
+ channel = 'unsub.depth'
1528
+ requestParams: dict = {
1529
+ 'symbol': market['id'],
1530
+ }
1531
+ self.watch_swap_public(channel, messageHash, requestParams, params)
1532
+ client = self.client(url)
1533
+ self.handle_unsubscriptions(client, [messageHash])
1534
+ return None
1535
+
1536
+ async def un_watch_trades(self, symbol: str, params={}) -> Any:
1537
+ """
1538
+ unsubscribes from the trades channel
1539
+ :param str symbol: unified symbol of the market to fetch trades for
1540
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1541
+ :param str [params.name]: the name of the method to call, 'trade' or 'aggTrade', default is 'trade'
1542
+ :returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=public-trades>`
1543
+ """
1544
+ await self.load_markets()
1545
+ market = self.market(symbol)
1546
+ symbol = market['symbol']
1547
+ messageHash = 'unsubscribe:trades:' + symbol
1548
+ url = None
1549
+ if market['spot']:
1550
+ url = self.urls['api']['ws']['spot']
1551
+ channel = 'spot@public.deals.v3.api@' + market['id']
1552
+ params['unsubscribed'] = True
1553
+ self.watch_spot_public(channel, messageHash, params)
1554
+ else:
1555
+ url = self.urls['api']['ws']['swap']
1556
+ channel = 'unsub.deal'
1557
+ requestParams: dict = {
1558
+ 'symbol': market['id'],
1559
+ }
1560
+ self.watch_swap_public(channel, messageHash, requestParams, params)
1561
+ client = self.client(url)
1562
+ self.handle_unsubscriptions(client, [messageHash])
1563
+ return None
1564
+
1565
+ def handle_unsubscriptions(self, client: Client, messageHashes: List[str]):
1566
+ for i in range(0, len(messageHashes)):
1567
+ messageHash = messageHashes[i]
1568
+ subMessageHash = messageHash.replace('unsubscribe:', '')
1569
+ self.clean_unsubscription(client, subMessageHash, messageHash)
1570
+ if messageHash.find('ticker') >= 0:
1571
+ symbol = messageHash.replace('unsubscribe:ticker:', '')
1572
+ if symbol.find('unsubscribe') >= 0:
1573
+ # unWatchTickers
1574
+ symbols = list(self.tickers.keys())
1575
+ for j in range(0, len(symbols)):
1576
+ del self.tickers[symbols[j]]
1577
+ elif symbol in self.tickers:
1578
+ del self.tickers[symbol]
1579
+ elif messageHash.find('bidask') >= 0:
1580
+ symbol = messageHash.replace('unsubscribe:bidask:', '')
1581
+ if symbol in self.bidsasks:
1582
+ del self.bidsasks[symbol]
1583
+ elif messageHash.find('candles') >= 0:
1584
+ splitHashes = messageHash.split(':')
1585
+ symbol = self.safe_string(splitHashes, 2)
1586
+ if len(splitHashes) > 4:
1587
+ symbol += ':' + self.safe_string(splitHashes, 3)
1588
+ if symbol in self.ohlcvs:
1589
+ del self.ohlcvs[symbol]
1590
+ elif messageHash.find('orderbook') >= 0:
1591
+ symbol = messageHash.replace('unsubscribe:orderbook:', '')
1592
+ if symbol in self.orderbooks:
1593
+ del self.orderbooks[symbol]
1594
+ elif messageHash.find('trades') >= 0:
1595
+ symbol = messageHash.replace('unsubscribe:trades:', '')
1596
+ if symbol in self.trades:
1597
+ del self.trades[symbol]
1598
+
1354
1599
  async def authenticate(self, subscriptionHash, params={}):
1355
1600
  # we only need one listenKey since ccxt shares connections
1356
1601
  listenKey = self.safe_string(self.options, 'listenKey')
ccxt/pro/poloniex.py CHANGED
@@ -244,7 +244,9 @@ class poloniex(ccxt.async_support.poloniex):
244
244
  request['quantity'] = self.amount_to_precision(market['symbol'], amount)
245
245
  if price is not None:
246
246
  request['price'] = self.price_to_precision(symbol, price)
247
- return await self.trade_request('createOrder', self.extend(request, params))
247
+ orders = await self.trade_request('createOrder', self.extend(request, params))
248
+ order = self.safe_dict(orders, 0)
249
+ return order
248
250
 
249
251
  async def cancel_order_ws(self, id: str, symbol: Str = None, params={}):
250
252
  """
@@ -262,7 +264,9 @@ class poloniex(ccxt.async_support.poloniex):
262
264
  if clientOrderId is not None:
263
265
  clientOrderIds = self.safe_value(params, 'clientOrderId', [])
264
266
  params['clientOrderIds'] = self.array_concat(clientOrderIds, [clientOrderId])
265
- return await self.cancel_orders_ws([id], symbol, params)
267
+ orders = await self.cancel_orders_ws([id], symbol, params)
268
+ order = self.safe_dict(orders, 0)
269
+ return order
266
270
 
267
271
  async def cancel_orders_ws(self, ids: List[str], symbol: Str = None, params={}):
268
272
  """
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ccxt
3
- Version: 4.4.80
3
+ Version: 4.4.85
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
@@ -38,7 +38,7 @@ Requires-Dist: certifi>=2018.1.18
38
38
  Requires-Dist: requests>=2.18.4
39
39
  Requires-Dist: cryptography>=2.6.1
40
40
  Requires-Dist: typing-extensions>=4.4.0
41
- Requires-Dist: aiohttp<=3.10.11; python_version >= "3.5.2"
41
+ Requires-Dist: aiohttp>=3.10.11; python_version >= "3.5.2"
42
42
  Requires-Dist: aiodns>=1.1.1; python_version >= "3.5.2"
43
43
  Requires-Dist: yarl>=1.7.2; python_version >= "3.5.2"
44
44
  Provides-Extra: qa
@@ -49,7 +49,7 @@ Requires-Dist: mypy==1.6.1; extra == "type"
49
49
 
50
50
  # CCXT – CryptoCurrency eXchange Trading Library
51
51
 
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-107-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)
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-105-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
 
@@ -68,8 +68,6 @@ Current feature list:
68
68
  - works in Node 10.4+, Python 3, PHP 8.1+, netstandard2.0/2.1, Go 1.20+ and web browsers
69
69
 
70
70
 
71
- ## Sponsored Promotion
72
-
73
71
  ## See Also
74
72
 
75
73
  - <sub>[![TabTrader](https://user-images.githubusercontent.com/1294454/66755907-9c3e8880-eea1-11e9-846e-0bff349ceb87.png)](https://tab-trader.com/?utm_source=ccxt)</sub> **[TabTrader](https://tab-trader.com/?utm_source=ccxt)** – trading on all exchanges in one app. Available on **[Android](https://play.google.com/store/apps/details?id=com.tabtrader.android&referrer=utm_source%3Dccxt)** and **[iOS](https://itunes.apple.com/app/apple-store/id1095716562?mt=8)**!
@@ -104,7 +102,7 @@ Current feature list:
104
102
  | [![woofipro](https://github.com/user-attachments/assets/9ba21b8a-a9c7-4770-b7f1-ce3bcbde68c1)](https://dex.woo.org/en/trade?ref=CCXT) | woofipro | [WOOFI PRO](https://dex.woo.org/en/trade?ref=CCXT) | [![API Version 1](https://img.shields.io/badge/1-lightgray)](https://orderly.network/docs/build-on-evm/building-on-evm) | ![DEX - Distributed EXchange](https://img.shields.io/badge/DEX-blue.svg "DEX - Distributed EXchange") | [![CCXT Certified](https://img.shields.io/badge/CCXT-Certified-green.svg)](https://github.com/ccxt/ccxt/wiki/Certification) | [![CCXT Pro](https://img.shields.io/badge/CCXT-Pro-black)](https://ccxt.pro) | [![Sign up with WOOFI PRO using CCXT's referral link for a 5% discount!](https://img.shields.io/static/v1?label=Fee&message=%2d5%25&color=orange)](https://dex.woo.org/en/trade?ref=CCXT) |
105
103
 
106
104
  ## Supported Cryptocurrency Exchanges
107
- <!--- init list -->The CCXT library currently supports the following 104 cryptocurrency exchange markets and trading APIs:
105
+ <!--- init list -->The CCXT library currently supports the following 102 cryptocurrency exchange markets and trading APIs:
108
106
 
109
107
  |logo |id |name |ver |type |certified |pro |
110
108
  |-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------|----------------------------------------------------------------------------------------------|:------------------------------------------------------------------------------------------------------------------------------------------------:|--------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------|
@@ -133,7 +131,6 @@ Current feature list:
133
131
  | [![bitstamp](https://github.com/user-attachments/assets/d5480572-1fee-43cb-b900-d38c522d0024)](https://www.bitstamp.net) | bitstamp | [Bitstamp](https://www.bitstamp.net) | [![API Version 2](https://img.shields.io/badge/2-lightgray)](https://www.bitstamp.net/api) | ![CEX – Centralized EXchange](https://img.shields.io/badge/CEX-green.svg "CEX – Centralized EXchange") | | [![CCXT Pro](https://img.shields.io/badge/CCXT-Pro-black)](https://ccxt.pro) |
134
132
  | [![bitteam](https://github.com/user-attachments/assets/b41b5e0d-98e5-4bd3-8a6e-aeb230a4a135)](https://bit.team/auth/sign-up?ref=bitboy2023) | bitteam | [BIT.TEAM](https://bit.team/auth/sign-up?ref=bitboy2023) | [![API Version 2.0.6](https://img.shields.io/badge/2.0.6-lightgray)](https://bit.team/trade/api/documentation) | ![CEX – Centralized EXchange](https://img.shields.io/badge/CEX-green.svg "CEX – Centralized EXchange") | | |
135
133
  | [![bitvavo](https://github.com/user-attachments/assets/d213155c-8c71-4701-9bd5-45351febc2a8)](https://bitvavo.com/?a=24F34952F7) | bitvavo | [Bitvavo](https://bitvavo.com/?a=24F34952F7) | [![API Version 2](https://img.shields.io/badge/2-lightgray)](https://docs.bitvavo.com/) | ![CEX – Centralized EXchange](https://img.shields.io/badge/CEX-green.svg "CEX – Centralized EXchange") | | [![CCXT Pro](https://img.shields.io/badge/CCXT-Pro-black)](https://ccxt.pro) |
136
- | [![bl3p](https://github.com/user-attachments/assets/75aeb14e-cd48-43c8-8492-dff002dea0be)](https://bl3p.eu) | bl3p | [BL3P](https://bl3p.eu) | [![API Version 1](https://img.shields.io/badge/1-lightgray)](https://github.com/BitonicNL/bl3p-api/tree/master/docs) | ![CEX – Centralized EXchange](https://img.shields.io/badge/CEX-green.svg "CEX – Centralized EXchange") | | |
137
134
  | [![blockchaincom](https://github.com/user-attachments/assets/975e3054-3399-4363-bcee-ec3c6d63d4e8)](https://blockchain.com) | blockchaincom | [Blockchain.com](https://blockchain.com) | [![API Version 3](https://img.shields.io/badge/3-lightgray)](https://api.blockchain.com/v3) | ![CEX – Centralized EXchange](https://img.shields.io/badge/CEX-green.svg "CEX – Centralized EXchange") | | [![CCXT Pro](https://img.shields.io/badge/CCXT-Pro-black)](https://ccxt.pro) |
138
135
  | [![blofin](https://github.com/user-attachments/assets/518cdf80-f05d-4821-a3e3-d48ceb41d73b)](https://blofin.com/register?referral_code=f79EsS) | blofin | [BloFin](https://blofin.com/register?referral_code=f79EsS) | [![API Version 1](https://img.shields.io/badge/1-lightgray)](https://blofin.com/docs) | ![CEX – Centralized EXchange](https://img.shields.io/badge/CEX-green.svg "CEX – Centralized EXchange") | | [![CCXT Pro](https://img.shields.io/badge/CCXT-Pro-black)](https://ccxt.pro) |
139
136
  | [![btcalpha](https://github.com/user-attachments/assets/dce49f3a-61e5-4ba0-a2fe-41d192fd0e5d)](https://btc-alpha.com/?r=123788) | btcalpha | [BTC-Alpha](https://btc-alpha.com/?r=123788) | [![API Version 1](https://img.shields.io/badge/1-lightgray)](https://btc-alpha.github.io/api-docs) | ![CEX – Centralized EXchange](https://img.shields.io/badge/CEX-green.svg "CEX – Centralized EXchange") | | |
@@ -172,7 +169,6 @@ Current feature list:
172
169
  | [![htx](https://user-images.githubusercontent.com/1294454/76137448-22748a80-604e-11ea-8069-6e389271911d.jpg)](https://www.htx.com.vc/invite/en-us/1h?invite_code=6rmm2223) | htx | [HTX](https://www.htx.com.vc/invite/en-us/1h?invite_code=6rmm2223) | [![API Version 1](https://img.shields.io/badge/1-lightgray)](https://huobiapi.github.io/docs/spot/v1/en/) | ![CEX – Centralized EXchange](https://img.shields.io/badge/CEX-green.svg "CEX – Centralized EXchange") | [![CCXT Certified](https://img.shields.io/badge/CCXT-Certified-green.svg)](https://github.com/ccxt/ccxt/wiki/Certification) | [![CCXT Pro](https://img.shields.io/badge/CCXT-Pro-black)](https://ccxt.pro) |
173
170
  | [![huobijp](https://user-images.githubusercontent.com/1294454/85734211-85755480-b705-11ea-8b35-0b7f1db33a2f.jpg)](https://www.huobi.co.jp/register/?invite_code=znnq3) | huobijp | [Huobi Japan](https://www.huobi.co.jp/register/?invite_code=znnq3) | [![API Version 1](https://img.shields.io/badge/1-lightgray)](https://api-doc.huobi.co.jp) | ![CEX – Centralized EXchange](https://img.shields.io/badge/CEX-green.svg "CEX – Centralized EXchange") | | [![CCXT Pro](https://img.shields.io/badge/CCXT-Pro-black)](https://ccxt.pro) |
174
171
  | [![hyperliquid](https://github.com/ccxt/ccxt/assets/43336371/b371bc6c-4a8c-489f-87f4-20a913dd8d4b)](https://app.hyperliquid.xyz/) | hyperliquid | [Hyperliquid](https://app.hyperliquid.xyz/) | [![API Version 1](https://img.shields.io/badge/1-lightgray)](https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api) | ![DEX - Distributed EXchange](https://img.shields.io/badge/DEX-blue.svg "DEX - Distributed EXchange") | [![CCXT Certified](https://img.shields.io/badge/CCXT-Certified-green.svg)](https://github.com/ccxt/ccxt/wiki/Certification) | [![CCXT Pro](https://img.shields.io/badge/CCXT-Pro-black)](https://ccxt.pro) |
175
- | [![idex](https://user-images.githubusercontent.com/51840849/94481303-2f222100-01e0-11eb-97dd-bc14c5943a86.jpg)](https://idex.io) | idex | [IDEX](https://idex.io) | [![API Version 3](https://img.shields.io/badge/3-lightgray)](https://api-docs-v3.idex.io/) | ![DEX - Distributed EXchange](https://img.shields.io/badge/DEX-blue.svg "DEX - Distributed EXchange") | | [![CCXT Pro](https://img.shields.io/badge/CCXT-Pro-black)](https://ccxt.pro) |
176
172
  | [![independentreserve](https://user-images.githubusercontent.com/51840849/87182090-1e9e9080-c2ec-11ea-8e49-563db9a38f37.jpg)](https://www.independentreserve.com) | independentreserve | [Independent Reserve](https://www.independentreserve.com) | [![API Version *](https://img.shields.io/badge/*-lightgray)](https://www.independentreserve.com/API) | ![CEX – Centralized EXchange](https://img.shields.io/badge/CEX-green.svg "CEX – Centralized EXchange") | | [![CCXT Pro](https://img.shields.io/badge/CCXT-Pro-black)](https://ccxt.pro) |
177
173
  | [![indodax](https://user-images.githubusercontent.com/51840849/87070508-9358c880-c221-11ea-8dc5-5391afbbb422.jpg)](https://indodax.com/ref/testbitcoincoid/1) | indodax | [INDODAX](https://indodax.com/ref/testbitcoincoid/1) | [![API Version 2.0](https://img.shields.io/badge/2.0-lightgray)](https://github.com/btcid/indodax-official-api-docs) | ![CEX – Centralized EXchange](https://img.shields.io/badge/CEX-green.svg "CEX – Centralized EXchange") | | |
178
174
  | [![kraken](https://user-images.githubusercontent.com/51840849/76173629-fc67fb00-61b1-11ea-84fe-f2de582f58a3.jpg)](https://www.kraken.com) | kraken | [Kraken](https://www.kraken.com) | [![API Version 0](https://img.shields.io/badge/0-lightgray)](https://docs.kraken.com/rest/) | ![CEX – Centralized EXchange](https://img.shields.io/badge/CEX-green.svg "CEX – Centralized EXchange") | | [![CCXT Pro](https://img.shields.io/badge/CCXT-Pro-black)](https://ccxt.pro) |
@@ -273,13 +269,13 @@ console.log(version, Object.keys(exchanges));
273
269
 
274
270
  All-in-one browser bundle (dependencies included), served from a CDN of your choice:
275
271
 
276
- * jsDelivr: https://cdn.jsdelivr.net/npm/ccxt@4.4.80/dist/ccxt.browser.min.js
277
- * unpkg: https://unpkg.com/ccxt@4.4.80/dist/ccxt.browser.min.js
272
+ * jsDelivr: https://cdn.jsdelivr.net/npm/ccxt@4.4.85/dist/ccxt.browser.min.js
273
+ * unpkg: https://unpkg.com/ccxt@4.4.85/dist/ccxt.browser.min.js
278
274
 
279
275
  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.
280
276
 
281
277
  ```HTML
282
- <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/ccxt@4.4.80/dist/ccxt.browser.min.js"></script>
278
+ <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/ccxt@4.4.85/dist/ccxt.browser.min.js"></script>
283
279
  ```
284
280
 
285
281
  Creates a global `ccxt` object: