ccxt 4.3.96__py2.py3-none-any.whl → 4.3.98__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/__init__.py CHANGED
@@ -22,7 +22,7 @@
22
22
 
23
23
  # ----------------------------------------------------------------------------
24
24
 
25
- __version__ = '4.3.96'
25
+ __version__ = '4.3.98'
26
26
 
27
27
  # ----------------------------------------------------------------------------
28
28
 
@@ -4,7 +4,7 @@
4
4
 
5
5
  # -----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.3.96'
7
+ __version__ = '4.3.98'
8
8
 
9
9
  # -----------------------------------------------------------------------------
10
10
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  # -----------------------------------------------------------------------------
4
4
 
5
- __version__ = '4.3.96'
5
+ __version__ = '4.3.98'
6
6
 
7
7
  # -----------------------------------------------------------------------------
8
8
 
@@ -4121,6 +4121,8 @@ class binance(Exchange, ImplicitAPI):
4121
4121
  price = self.safe_string(params, 'price')
4122
4122
  until = self.safe_integer(params, 'until')
4123
4123
  params = self.omit(params, ['price', 'until'])
4124
+ if since is not None and until is not None and limit is None:
4125
+ limit = maxLimit
4124
4126
  limit = defaultLimit if (limit is None) else min(limit, maxLimit)
4125
4127
  request: dict = {
4126
4128
  'interval': self.safe_string(self.timeframes, timeframe, timeframe),
@@ -1251,7 +1251,9 @@ class bitget(Exchange, ImplicitAPI):
1251
1251
  '40713': ExchangeError, # Cannot exceed the maximum transferable margin amount
1252
1252
  '40714': ExchangeError, # No direct margin call is allowed
1253
1253
  '40762': InsufficientFunds, # {"code":"40762","msg":"The order amount exceeds the balance","requestTime":1716572156622,"data":null}
1254
- '40768': OrderNotFound, # Order does not exist"
1254
+ '40768': OrderNotFound, # Order does not exist
1255
+ '40808': InvalidOrder, # {"code":"40808","msg":"Parameter verification exception size checkBDScale error value=2293.577 checkScale=2","requestTime":1725638500052,"data":null}
1256
+ '41103': InvalidOrder, # {"code":"41103","msg":"param price scale error error","requestTime":1725635883561,"data":null}
1255
1257
  '41114': OnMaintenance, # {"code":"41114","msg":"The current trading pair is under maintenance, please refer to the official announcement for the opening time","requestTime":1679196062544,"data":null}
1256
1258
  '43011': InvalidOrder, # The parameter does not meet the specification executePrice <= 0
1257
1259
  '43012': InsufficientFunds, # {"code":"43012","msg":"Insufficient balance","requestTime":1711648951774,"data":null}
@@ -1199,7 +1199,10 @@ class coinex(Exchange, ImplicitAPI):
1199
1199
  # "side": "buy",
1200
1200
  # "order_id": 136915589622,
1201
1201
  # "price": "64376",
1202
- # "amount": "0.0001"
1202
+ # "amount": "0.0001",
1203
+ # "role": "taker",
1204
+ # "fee": "0.0299",
1205
+ # "fee_ccy": "USDT"
1203
1206
  # }
1204
1207
  #
1205
1208
  timestamp = self.safe_integer(trade, 'created_at')
@@ -1208,6 +1211,15 @@ class coinex(Exchange, ImplicitAPI):
1208
1211
  defaultType = market['type']
1209
1212
  marketId = self.safe_string(trade, 'market')
1210
1213
  market = self.safe_market(marketId, market, None, defaultType)
1214
+ feeCostString = self.safe_string(trade, 'fee')
1215
+ fee = None
1216
+ if feeCostString is not None:
1217
+ feeCurrencyId = self.safe_string(trade, 'fee_ccy')
1218
+ feeCurrencyCode = self.safe_currency_code(feeCurrencyId)
1219
+ fee = {
1220
+ 'cost': feeCostString,
1221
+ 'currency': feeCurrencyCode,
1222
+ }
1211
1223
  return self.safe_trade({
1212
1224
  'info': trade,
1213
1225
  'timestamp': timestamp,
@@ -1217,11 +1229,11 @@ class coinex(Exchange, ImplicitAPI):
1217
1229
  'order': self.safe_string(trade, 'order_id'),
1218
1230
  'type': None,
1219
1231
  'side': self.safe_string(trade, 'side'),
1220
- 'takerOrMaker': None,
1232
+ 'takerOrMaker': self.safe_string(trade, 'role'),
1221
1233
  'price': self.safe_string(trade, 'price'),
1222
1234
  'amount': self.safe_string(trade, 'amount'),
1223
1235
  'cost': self.safe_string(trade, 'deal_money'),
1224
- 'fee': None,
1236
+ 'fee': fee,
1225
1237
  }, market)
1226
1238
 
1227
1239
  async def fetch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
@@ -3786,7 +3786,7 @@ class gate(Exchange, ImplicitAPI):
3786
3786
  if not market['option']:
3787
3787
  request['settle'] = market['settleId'] # filled in prepareRequest above
3788
3788
  if isMarketOrder:
3789
- request['price'] = price # set to 0 for market orders
3789
+ request['price'] = '0' # set to 0 for market orders
3790
3790
  else:
3791
3791
  request['price'] = '0' if (price == 0) else self.price_to_precision(symbol, price)
3792
3792
  if reduceOnly is not None:
@@ -3602,7 +3602,7 @@ class kucoin(Exchange, ImplicitAPI):
3602
3602
  params = self.omit(params, 'type')
3603
3603
  hf = None
3604
3604
  hf, params = self.handle_hf_and_params(params)
3605
- if hf:
3605
+ if hf and (type != 'main'):
3606
3606
  type = 'trade_hf'
3607
3607
  marginMode, query = self.handle_margin_mode_and_params('fetchBalance', params)
3608
3608
  response = None
@@ -1521,19 +1521,18 @@ class whitebit(Exchange, ImplicitAPI):
1521
1521
  """
1522
1522
  fetch all unfilled currently open orders
1523
1523
  :see: https://docs.whitebit.com/private/http-trade-v4/#query-unexecutedactive-orders
1524
- :param str symbol: unified market symbol
1524
+ :param str [symbol]: unified market symbol
1525
1525
  :param int [since]: the earliest time in ms to fetch open orders for
1526
1526
  :param int [limit]: the maximum number of open order structures to retrieve
1527
1527
  :param dict [params]: extra parameters specific to the exchange API endpoint
1528
1528
  :returns Order[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
1529
1529
  """
1530
- if symbol is None:
1531
- raise ArgumentsRequired(self.id + ' fetchOpenOrders() requires a symbol argument')
1532
1530
  await self.load_markets()
1533
- market = self.market(symbol)
1534
- request: dict = {
1535
- 'market': market['id'],
1536
- }
1531
+ market = None
1532
+ request: dict = {}
1533
+ if symbol is not None:
1534
+ market = self.market(symbol)
1535
+ request['market'] = market['id']
1537
1536
  if limit is not None:
1538
1537
  request['limit'] = min(limit, 100)
1539
1538
  response = await self.v4PrivatePostOrders(self.extend(request, params))
ccxt/base/exchange.py CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  # -----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.3.96'
7
+ __version__ = '4.3.98'
8
8
 
9
9
  # -----------------------------------------------------------------------------
10
10
 
ccxt/binance.py CHANGED
@@ -4120,6 +4120,8 @@ class binance(Exchange, ImplicitAPI):
4120
4120
  price = self.safe_string(params, 'price')
4121
4121
  until = self.safe_integer(params, 'until')
4122
4122
  params = self.omit(params, ['price', 'until'])
4123
+ if since is not None and until is not None and limit is None:
4124
+ limit = maxLimit
4123
4125
  limit = defaultLimit if (limit is None) else min(limit, maxLimit)
4124
4126
  request: dict = {
4125
4127
  'interval': self.safe_string(self.timeframes, timeframe, timeframe),
ccxt/bitget.py CHANGED
@@ -1250,7 +1250,9 @@ class bitget(Exchange, ImplicitAPI):
1250
1250
  '40713': ExchangeError, # Cannot exceed the maximum transferable margin amount
1251
1251
  '40714': ExchangeError, # No direct margin call is allowed
1252
1252
  '40762': InsufficientFunds, # {"code":"40762","msg":"The order amount exceeds the balance","requestTime":1716572156622,"data":null}
1253
- '40768': OrderNotFound, # Order does not exist"
1253
+ '40768': OrderNotFound, # Order does not exist
1254
+ '40808': InvalidOrder, # {"code":"40808","msg":"Parameter verification exception size checkBDScale error value=2293.577 checkScale=2","requestTime":1725638500052,"data":null}
1255
+ '41103': InvalidOrder, # {"code":"41103","msg":"param price scale error error","requestTime":1725635883561,"data":null}
1254
1256
  '41114': OnMaintenance, # {"code":"41114","msg":"The current trading pair is under maintenance, please refer to the official announcement for the opening time","requestTime":1679196062544,"data":null}
1255
1257
  '43011': InvalidOrder, # The parameter does not meet the specification executePrice <= 0
1256
1258
  '43012': InsufficientFunds, # {"code":"43012","msg":"Insufficient balance","requestTime":1711648951774,"data":null}
ccxt/coinex.py CHANGED
@@ -1198,7 +1198,10 @@ class coinex(Exchange, ImplicitAPI):
1198
1198
  # "side": "buy",
1199
1199
  # "order_id": 136915589622,
1200
1200
  # "price": "64376",
1201
- # "amount": "0.0001"
1201
+ # "amount": "0.0001",
1202
+ # "role": "taker",
1203
+ # "fee": "0.0299",
1204
+ # "fee_ccy": "USDT"
1202
1205
  # }
1203
1206
  #
1204
1207
  timestamp = self.safe_integer(trade, 'created_at')
@@ -1207,6 +1210,15 @@ class coinex(Exchange, ImplicitAPI):
1207
1210
  defaultType = market['type']
1208
1211
  marketId = self.safe_string(trade, 'market')
1209
1212
  market = self.safe_market(marketId, market, None, defaultType)
1213
+ feeCostString = self.safe_string(trade, 'fee')
1214
+ fee = None
1215
+ if feeCostString is not None:
1216
+ feeCurrencyId = self.safe_string(trade, 'fee_ccy')
1217
+ feeCurrencyCode = self.safe_currency_code(feeCurrencyId)
1218
+ fee = {
1219
+ 'cost': feeCostString,
1220
+ 'currency': feeCurrencyCode,
1221
+ }
1210
1222
  return self.safe_trade({
1211
1223
  'info': trade,
1212
1224
  'timestamp': timestamp,
@@ -1216,11 +1228,11 @@ class coinex(Exchange, ImplicitAPI):
1216
1228
  'order': self.safe_string(trade, 'order_id'),
1217
1229
  'type': None,
1218
1230
  'side': self.safe_string(trade, 'side'),
1219
- 'takerOrMaker': None,
1231
+ 'takerOrMaker': self.safe_string(trade, 'role'),
1220
1232
  'price': self.safe_string(trade, 'price'),
1221
1233
  'amount': self.safe_string(trade, 'amount'),
1222
1234
  'cost': self.safe_string(trade, 'deal_money'),
1223
- 'fee': None,
1235
+ 'fee': fee,
1224
1236
  }, market)
1225
1237
 
1226
1238
  def fetch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
ccxt/gate.py CHANGED
@@ -3785,7 +3785,7 @@ class gate(Exchange, ImplicitAPI):
3785
3785
  if not market['option']:
3786
3786
  request['settle'] = market['settleId'] # filled in prepareRequest above
3787
3787
  if isMarketOrder:
3788
- request['price'] = price # set to 0 for market orders
3788
+ request['price'] = '0' # set to 0 for market orders
3789
3789
  else:
3790
3790
  request['price'] = '0' if (price == 0) else self.price_to_precision(symbol, price)
3791
3791
  if reduceOnly is not None:
ccxt/kucoin.py CHANGED
@@ -3601,7 +3601,7 @@ class kucoin(Exchange, ImplicitAPI):
3601
3601
  params = self.omit(params, 'type')
3602
3602
  hf = None
3603
3603
  hf, params = self.handle_hf_and_params(params)
3604
- if hf:
3604
+ if hf and (type != 'main'):
3605
3605
  type = 'trade_hf'
3606
3606
  marginMode, query = self.handle_margin_mode_and_params('fetchBalance', params)
3607
3607
  response = None
ccxt/pro/__init__.py CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  # ----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.3.96'
7
+ __version__ = '4.3.98'
8
8
 
9
9
  # ----------------------------------------------------------------------------
10
10
 
ccxt/pro/gate.py CHANGED
@@ -9,12 +9,14 @@ import hashlib
9
9
  from ccxt.base.types import Balances, Int, Liquidation, Market, MarketType, Num, Order, OrderBook, OrderRequest, OrderSide, OrderType, Position, Str, Strings, Ticker, Tickers, Trade
10
10
  from ccxt.async_support.base.ws.client import Client
11
11
  from typing import List
12
+ from typing import Any
12
13
  from ccxt.base.errors import ExchangeError
13
14
  from ccxt.base.errors import AuthenticationError
14
15
  from ccxt.base.errors import ArgumentsRequired
15
16
  from ccxt.base.errors import BadRequest
16
17
  from ccxt.base.errors import NotSupported
17
18
  from ccxt.base.errors import ChecksumError
19
+ from ccxt.base.errors import UnsubscribeError
18
20
  from ccxt.base.precise import Precise
19
21
 
20
22
 
@@ -371,6 +373,31 @@ class gate(ccxt.async_support.gate):
371
373
  orderbook = await self.subscribe_public(url, messageHash, payload, channel, query, subscription)
372
374
  return orderbook.limit()
373
375
 
376
+ async def un_watch_order_book(self, symbol: str, params={}) -> Any:
377
+ """
378
+ unWatches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
379
+ :param str symbol: unified symbol of the market to fetch the order book for
380
+ :param dict [params]: extra parameters specific to the exchange API endpoint
381
+ :returns dict: A dictionary of `order book structures <https://docs.ccxt.com/#/?id=order-book-structure>` indexed by market symbols
382
+ """
383
+ await self.load_markets()
384
+ market = self.market(symbol)
385
+ symbol = market['symbol']
386
+ marketId = market['id']
387
+ interval = '100ms'
388
+ interval, params = self.handle_option_and_params(params, 'watchOrderBook', 'interval', interval)
389
+ messageType = self.get_type_by_market(market)
390
+ channel = messageType + '.order_book_update'
391
+ subMessageHash = 'orderbook' + ':' + symbol
392
+ messageHash = 'unsubscribe:orderbook' + ':' + symbol
393
+ url = self.get_url_by_market(market)
394
+ payload = [marketId, interval]
395
+ limit = self.safe_integer(params, 'limit', 100)
396
+ if market['contract']:
397
+ stringLimit = str(limit)
398
+ payload.append(stringLimit)
399
+ return await self.un_subscribe_public_multiple(url, 'orderbook', [symbol], [messageHash], [subMessageHash], payload, channel, params)
400
+
374
401
  def handle_order_book_subscription(self, client: Client, message, subscription):
375
402
  symbol = self.safe_string(subscription, 'symbol')
376
403
  limit = self.safe_integer(subscription, 'limit')
@@ -671,6 +698,37 @@ class gate(ccxt.async_support.gate):
671
698
  limit = trades.getLimit(tradeSymbol, limit)
672
699
  return self.filter_by_since_limit(trades, since, limit, 'timestamp', True)
673
700
 
701
+ async def un_watch_trades_for_symbols(self, symbols: List[str], params={}) -> Any:
702
+ """
703
+ get the list of most recent trades for a particular symbol
704
+ :param str symbol: unified symbol of the market to fetch trades for
705
+ :param dict [params]: extra parameters specific to the exchange API endpoint
706
+ :returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=public-trades>`
707
+ """
708
+ await self.load_markets()
709
+ symbols = self.market_symbols(symbols)
710
+ marketIds = self.market_ids(symbols)
711
+ market = self.market(symbols[0])
712
+ messageType = self.get_type_by_market(market)
713
+ channel = messageType + '.trades'
714
+ subMessageHashes = []
715
+ messageHashes = []
716
+ for i in range(0, len(symbols)):
717
+ symbol = symbols[i]
718
+ subMessageHashes.append('trades:' + symbol)
719
+ messageHashes.append('unsubscribe:trades:' + symbol)
720
+ url = self.get_url_by_market(market)
721
+ return await self.un_subscribe_public_multiple(url, 'trades', symbols, messageHashes, subMessageHashes, marketIds, channel, params)
722
+
723
+ async def un_watch_trades(self, symbol: str, params={}) -> Any:
724
+ """
725
+ get the list of most recent trades for a particular symbol
726
+ :param str symbol: unified symbol of the market to fetch trades for
727
+ :param dict [params]: extra parameters specific to the exchange API endpoint
728
+ :returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=public-trades>`
729
+ """
730
+ return await self.un_watch_trades_for_symbols([symbol], params)
731
+
674
732
  def handle_trades(self, client: Client, message):
675
733
  #
676
734
  # {
@@ -1445,6 +1503,79 @@ class gate(ccxt.async_support.gate):
1445
1503
  if id in client.subscriptions:
1446
1504
  del client.subscriptions[id]
1447
1505
 
1506
+ def handle_un_subscribe(self, client: Client, message):
1507
+ #
1508
+ # {
1509
+ # "time":1725534679,
1510
+ # "time_ms":1725534679786,
1511
+ # "id":2,
1512
+ # "conn_id":"fac539b443fd7002",
1513
+ # "trace_id":"efe1d282b630b4aa266b84bee177791a",
1514
+ # "channel":"spot.trades",
1515
+ # "event":"unsubscribe",
1516
+ # "payload":[
1517
+ # "LTC_USDT"
1518
+ # ],
1519
+ # "result":{
1520
+ # "status":"success"
1521
+ # },
1522
+ # "requestId":"efe1d282b630b4aa266b84bee177791a"
1523
+ # }
1524
+ #
1525
+ id = self.safe_string(message, 'id')
1526
+ keys = list(client.subscriptions.keys())
1527
+ for i in range(0, len(keys)):
1528
+ messageHash = keys[i]
1529
+ if not (messageHash in client.subscriptions):
1530
+ continue
1531
+ # the previous iteration can have deleted the messageHash from the subscriptions
1532
+ if messageHash.startswith('unsubscribe'):
1533
+ subscription = client.subscriptions[messageHash]
1534
+ subId = self.safe_string(subscription, 'id')
1535
+ if id != subId:
1536
+ continue
1537
+ messageHashes = self.safe_list(subscription, 'messageHashes', [])
1538
+ subMessageHashes = self.safe_list(subscription, 'subMessageHashes', [])
1539
+ for j in range(0, len(messageHashes)):
1540
+ unsubHash = messageHashes[j]
1541
+ subHash = subMessageHashes[j]
1542
+ if unsubHash in client.subscriptions:
1543
+ del client.subscriptions[unsubHash]
1544
+ if subHash in client.subscriptions:
1545
+ del client.subscriptions[subHash]
1546
+ error = UnsubscribeError(self.id + ' ' + messageHash)
1547
+ client.reject(error, subHash)
1548
+ client.resolve(True, unsubHash)
1549
+ self.clean_cache(subscription)
1550
+
1551
+ def clean_cache(self, subscription: dict):
1552
+ topic = self.safe_string(subscription, 'topic', '')
1553
+ symbols = self.safe_list(subscription, 'symbols', [])
1554
+ symbolsLength = len(symbols)
1555
+ if topic == 'ohlcv':
1556
+ symbolsAndTimeFrames = self.safe_list(subscription, 'symbolsAndTimeframes', [])
1557
+ for i in range(0, len(symbolsAndTimeFrames)):
1558
+ symbolAndTimeFrame = symbolsAndTimeFrames[i]
1559
+ symbol = self.safe_string(symbolAndTimeFrame, 0)
1560
+ timeframe = self.safe_string(symbolAndTimeFrame, 1)
1561
+ del self.ohlcvs[symbol][timeframe]
1562
+ elif symbolsLength > 0:
1563
+ for i in range(0, len(symbols)):
1564
+ symbol = symbols[i]
1565
+ if topic.endswith('trades'):
1566
+ del self.trades[symbol]
1567
+ elif topic == 'orderbook':
1568
+ del self.orderbooks[symbol]
1569
+ elif topic == 'ticker':
1570
+ del self.tickers[symbol]
1571
+ else:
1572
+ if topic.endswith('trades'):
1573
+ # don't reset self.myTrades directly here
1574
+ # because in c# we need to use a different object
1575
+ keys = list(self.trades.keys())
1576
+ for i in range(0, len(keys)):
1577
+ del self.trades[keys[i]]
1578
+
1448
1579
  def handle_message(self, client: Client, message):
1449
1580
  #
1450
1581
  # subscribe
@@ -1541,6 +1672,9 @@ class gate(ccxt.async_support.gate):
1541
1672
  if event == 'subscribe':
1542
1673
  self.handle_subscription_status(client, message)
1543
1674
  return
1675
+ if event == 'unsubscribe':
1676
+ self.handle_un_subscribe(client, message)
1677
+ return
1544
1678
  channel = self.safe_string(message, 'channel', '')
1545
1679
  channelParts = channel.split('.')
1546
1680
  channelType = self.safe_value(channelParts, 1)
@@ -1645,6 +1779,27 @@ class gate(ccxt.async_support.gate):
1645
1779
  message = self.extend(request, params)
1646
1780
  return await self.watch_multiple(url, messageHashes, message, messageHashes)
1647
1781
 
1782
+ async def un_subscribe_public_multiple(self, url, topic, symbols, messageHashes, subMessageHashes, payload, channel, params={}):
1783
+ requestId = self.request_id()
1784
+ time = self.seconds()
1785
+ request: dict = {
1786
+ 'id': requestId,
1787
+ 'time': time,
1788
+ 'channel': channel,
1789
+ 'event': 'unsubscribe',
1790
+ 'payload': payload,
1791
+ }
1792
+ sub = {
1793
+ 'id': str(requestId),
1794
+ 'topic': topic,
1795
+ 'unsubscribe': True,
1796
+ 'messageHashes': messageHashes,
1797
+ 'subMessageHashes': subMessageHashes,
1798
+ 'symbols': symbols,
1799
+ }
1800
+ message = self.extend(request, params)
1801
+ return await self.watch_multiple(url, messageHashes, message, messageHashes, sub)
1802
+
1648
1803
  async def authenticate(self, url, messageType):
1649
1804
  channel = messageType + '.login'
1650
1805
  client = self.client(url)
ccxt/pro/kraken.py CHANGED
@@ -128,7 +128,7 @@ class kraken(ccxt.async_support.kraken):
128
128
 
129
129
  async def create_order_ws(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, params={}) -> Order:
130
130
  """
131
- :see: https://docs.kraken.com/websockets/#message-addOrder
131
+ :see: https://docs.kraken.com/api/docs/websocket-v1/addorder
132
132
  create a trade order
133
133
  :param str symbol: unified symbol of the market to create an order in
134
134
  :param str type: 'market' or 'limit'
@@ -183,7 +183,7 @@ class kraken(ccxt.async_support.kraken):
183
183
  async def edit_order_ws(self, id: str, symbol: str, type: OrderType, side: OrderSide, amount: Num = None, price: Num = None, params={}) -> Order:
184
184
  """
185
185
  edit a trade order
186
- :see: https://docs.kraken.com/websockets/#message-editOrder
186
+ :see: https://docs.kraken.com/api/docs/websocket-v1/editorder
187
187
  :param str id: order id
188
188
  :param str symbol: unified symbol of the market to create an order in
189
189
  :param str type: 'market' or 'limit'
@@ -213,7 +213,7 @@ class kraken(ccxt.async_support.kraken):
213
213
 
214
214
  async def cancel_orders_ws(self, ids: List[str], symbol: Str = None, params={}):
215
215
  """
216
- :see: https://docs.kraken.com/websockets/#message-cancelOrder
216
+ :see: https://docs.kraken.com/api/docs/websocket-v1/cancelorder
217
217
  cancel multiple orders
218
218
  :param str[] ids: order ids
219
219
  :param str symbol: unified market symbol, default is None
@@ -235,7 +235,7 @@ class kraken(ccxt.async_support.kraken):
235
235
 
236
236
  async def cancel_order_ws(self, id: str, symbol: Str = None, params={}) -> Order:
237
237
  """
238
- :see: https://docs.kraken.com/websockets/#message-cancelOrder
238
+ :see: https://docs.kraken.com/api/docs/websocket-v1/cancelorder
239
239
  cancels an open order
240
240
  :param str id: order id
241
241
  :param str symbol: unified symbol of the market the order was made in
@@ -271,7 +271,7 @@ class kraken(ccxt.async_support.kraken):
271
271
 
272
272
  async def cancel_all_orders_ws(self, symbol: Str = None, params={}):
273
273
  """
274
- :see: https://docs.kraken.com/websockets/#message-cancelAll
274
+ :see: https://docs.kraken.com/api/docs/websocket-v1/cancelall
275
275
  cancel all open orders
276
276
  :param str symbol: unified market symbol, only orders in the market of self symbol are cancelled when symbol is not None
277
277
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -465,6 +465,7 @@ class kraken(ccxt.async_support.kraken):
465
465
  async def watch_ticker(self, symbol: str, params={}) -> Ticker:
466
466
  """
467
467
  watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
468
+ :see: https://docs.kraken.com/api/docs/websocket-v1/ticker
468
469
  :param str symbol: unified symbol of the market to fetch the ticker for
469
470
  :param dict [params]: extra parameters specific to the exchange API endpoint
470
471
  :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
@@ -477,6 +478,7 @@ class kraken(ccxt.async_support.kraken):
477
478
  async def watch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
478
479
  """
479
480
  watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
481
+ :see: https://docs.kraken.com/api/docs/websocket-v1/ticker
480
482
  :param str symbol: unified symbol of the market to fetch the ticker for
481
483
  :param dict [params]: extra parameters specific to the exchange API endpoint
482
484
  :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
@@ -493,7 +495,7 @@ class kraken(ccxt.async_support.kraken):
493
495
  async def watch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
494
496
  """
495
497
  get the list of most recent trades for a particular symbol
496
- :see: https://docs.kraken.com/websockets/#message-trade
498
+ :see: https://docs.kraken.com/api/docs/websocket-v1/trade
497
499
  :param str symbol: unified symbol of the market to fetch trades for
498
500
  :param int [since]: timestamp in ms of the earliest trade to fetch
499
501
  :param int [limit]: the maximum amount of trades to fetch
@@ -504,7 +506,7 @@ class kraken(ccxt.async_support.kraken):
504
506
 
505
507
  async def watch_trades_for_symbols(self, symbols: List[str], since: Int = None, limit: Int = None, params={}) -> List[Trade]:
506
508
  """
507
- :see: https://docs.kraken.com/websockets/#message-trade
509
+ :see: https://docs.kraken.com/api/docs/websocket-v1/trade
508
510
  get the list of most recent trades for a list of symbols
509
511
  :param str[] symbols: unified symbol of the market to fetch trades for
510
512
  :param int [since]: timestamp in ms of the earliest trade to fetch
@@ -522,7 +524,7 @@ class kraken(ccxt.async_support.kraken):
522
524
  async def watch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
523
525
  """
524
526
  watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
525
- :see: https://docs.kraken.com/websockets/#message-book
527
+ :see: https://docs.kraken.com/api/docs/websocket-v1/book
526
528
  :param str symbol: unified symbol of the market to fetch the order book for
527
529
  :param int [limit]: the maximum amount of order book entries to return
528
530
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -533,7 +535,7 @@ class kraken(ccxt.async_support.kraken):
533
535
  async def watch_order_book_for_symbols(self, symbols: List[str], limit: Int = None, params={}) -> OrderBook:
534
536
  """
535
537
  watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
536
- :see: https://docs.kraken.com/websockets/#message-book
538
+ :see: https://docs.kraken.com/api/docs/websocket-v1/book
537
539
  :param str[] symbols: unified array of symbols
538
540
  :param int [limit]: the maximum amount of order book entries to return
539
541
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -553,6 +555,7 @@ class kraken(ccxt.async_support.kraken):
553
555
  async def watch_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}) -> List[list]:
554
556
  """
555
557
  watches historical candlestick data containing the open, high, low, and close price, and the volume of a market
558
+ :see: https://docs.kraken.com/api/docs/websocket-v1/ohlc
556
559
  :param str symbol: unified symbol of the market to fetch OHLCV data for
557
560
  :param str timeframe: the length of time each candle represents
558
561
  :param int [since]: timestamp in ms of the earliest candle to fetch
@@ -834,6 +837,7 @@ class kraken(ccxt.async_support.kraken):
834
837
  async def watch_my_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
835
838
  """
836
839
  watches information on multiple trades made by the user
840
+ :see: https://docs.kraken.com/api/docs/websocket-v1/owntrades
837
841
  :param str symbol: unified market symbol of the market trades were made in
838
842
  :param int [since]: the earliest time in ms to fetch trades for
839
843
  :param int [limit]: the maximum number of trade structures to retrieve
@@ -982,7 +986,7 @@ class kraken(ccxt.async_support.kraken):
982
986
 
983
987
  async def watch_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
984
988
  """
985
- :see: https://docs.kraken.com/websockets/#message-openOrders
989
+ :see: https://docs.kraken.com/api/docs/websocket-v1/openorders
986
990
  watches information on multiple orders made by the user
987
991
  :param str symbol: unified market symbol of the market orders were made in
988
992
  :param int [since]: the earliest time in ms to fetch orders for
ccxt/pro/kucoin.py CHANGED
@@ -8,8 +8,10 @@ from ccxt.async_support.base.ws.cache import ArrayCache, ArrayCacheBySymbolById,
8
8
  from ccxt.base.types import Balances, Int, Order, OrderBook, Str, Strings, Ticker, Tickers, Trade
9
9
  from ccxt.async_support.base.ws.client import Client
10
10
  from typing import List
11
+ from typing import Any
11
12
  from ccxt.base.errors import ExchangeError
12
13
  from ccxt.base.errors import ArgumentsRequired
14
+ from ccxt.base.errors import UnsubscribeError
13
15
 
14
16
 
15
17
  class kucoin(ccxt.async_support.kucoin):
@@ -153,6 +155,24 @@ class kucoin(ccxt.async_support.kucoin):
153
155
  client.subscriptions[requestId] = subscriptionHash
154
156
  return await self.watch_multiple(url, messageHashes, message, subscriptionHashes, subscription)
155
157
 
158
+ async def un_subscribe_multiple(self, url, messageHashes, topic, subscriptionHashes, params={}, subscription: dict = None):
159
+ requestId = str(self.request_id())
160
+ request: dict = {
161
+ 'id': requestId,
162
+ 'type': 'unsubscribe',
163
+ 'topic': topic,
164
+ 'response': True,
165
+ }
166
+ message = self.extend(request, params)
167
+ if subscription is not None:
168
+ subscription[requestId] = requestId
169
+ client = self.client(url)
170
+ for i in range(0, len(subscriptionHashes)):
171
+ subscriptionHash = subscriptionHashes[i]
172
+ if not (subscriptionHash in client.subscriptions):
173
+ client.subscriptions[requestId] = subscriptionHash
174
+ return await self.watch_multiple(url, messageHashes, message, subscriptionHashes, subscription)
175
+
156
176
  async def watch_ticker(self, symbol: str, params={}) -> Ticker:
157
177
  """
158
178
  watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
@@ -477,6 +497,46 @@ class kucoin(ccxt.async_support.kucoin):
477
497
  limit = trades.getLimit(tradeSymbol, limit)
478
498
  return self.filter_by_since_limit(trades, since, limit, 'timestamp', True)
479
499
 
500
+ async def un_watch_trades_for_symbols(self, symbols: List[str], params={}) -> Any:
501
+ """
502
+ unWatches trades stream
503
+ :see: https://www.kucoin.com/docs/websocket/spot-trading/public-channels/match-execution-data
504
+ :param str symbol: unified symbol of the market to fetch trades for
505
+ :param int [since]: timestamp in ms of the earliest trade to fetch
506
+ :param int [limit]: the maximum amount of trades to fetch
507
+ :param dict [params]: extra parameters specific to the exchange API endpoint
508
+ :returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=public-trades>`
509
+ """
510
+ await self.load_markets()
511
+ symbols = self.market_symbols(symbols, None, False)
512
+ marketIds = self.market_ids(symbols)
513
+ url = await self.negotiate(False)
514
+ messageHashes = []
515
+ subscriptionHashes = []
516
+ topic = '/market/match:' + ','.join(marketIds)
517
+ for i in range(0, len(symbols)):
518
+ symbol = symbols[i]
519
+ messageHashes.append('unsubscribe:trades:' + symbol)
520
+ subscriptionHashes.append('trades:' + symbol)
521
+ subscription = {
522
+ 'messageHashes': messageHashes,
523
+ 'subMessageHashes': subscriptionHashes,
524
+ 'topic': 'trades',
525
+ 'unsubscribe': True,
526
+ 'symbols': symbols,
527
+ }
528
+ return await self.un_subscribe_multiple(url, messageHashes, topic, messageHashes, params, subscription)
529
+
530
+ async def un_watch_trades(self, symbol: str, params={}) -> Any:
531
+ """
532
+ unWatches trades stream
533
+ :see: https://www.kucoin.com/docs/websocket/spot-trading/public-channels/match-execution-data
534
+ :param str symbol: unified symbol of the market to fetch trades for
535
+ :param dict [params]: extra parameters specific to the exchange API endpoint
536
+ :returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=public-trades>`
537
+ """
538
+ return await self.un_watch_trades_for_symbols([symbol], params)
539
+
480
540
  def handle_trade(self, client: Client, message):
481
541
  #
482
542
  # {
@@ -539,6 +599,20 @@ class kucoin(ccxt.async_support.kucoin):
539
599
  #
540
600
  return await self.watch_order_book_for_symbols([symbol], limit, params)
541
601
 
602
+ async def un_watch_order_book(self, symbol: str, params={}) -> Any:
603
+ """
604
+ :see: https://www.kucoin.com/docs/websocket/spot-trading/public-channels/level1-bbo-market-data
605
+ :see: https://www.kucoin.com/docs/websocket/spot-trading/public-channels/level2-market-data
606
+ :see: https://www.kucoin.com/docs/websocket/spot-trading/public-channels/level2-5-best-ask-bid-orders
607
+ :see: https://www.kucoin.com/docs/websocket/spot-trading/public-channels/level2-50-best-ask-bid-orders
608
+ unWatches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
609
+ :param str symbol: unified symbol of the market to fetch the order book for
610
+ :param dict [params]: extra parameters specific to the exchange API endpoint
611
+ :param str [params.method]: either '/market/level2' or '/spotMarket/level2Depth5' or '/spotMarket/level2Depth50' default is '/market/level2'
612
+ :returns dict: A dictionary of `order book structures <https://docs.ccxt.com/#/?id=order-book-structure>` indexed by market symbols
613
+ """
614
+ return await self.un_watch_order_book_for_symbols([symbol], params)
615
+
542
616
  async def watch_order_book_for_symbols(self, symbols: List[str], limit: Int = None, params={}) -> OrderBook:
543
617
  """
544
618
  :see: https://www.kucoin.com/docs/websocket/spot-trading/public-channels/level1-bbo-market-data
@@ -584,6 +658,45 @@ class kucoin(ccxt.async_support.kucoin):
584
658
  orderbook = await self.subscribe_multiple(url, messageHashes, topic, subscriptionHashes, params, subscription)
585
659
  return orderbook.limit()
586
660
 
661
+ async def un_watch_order_book_for_symbols(self, symbols: List[str], params={}) -> Any:
662
+ """
663
+ :see: https://www.kucoin.com/docs/websocket/spot-trading/public-channels/level1-bbo-market-data
664
+ :see: https://www.kucoin.com/docs/websocket/spot-trading/public-channels/level2-market-data
665
+ :see: https://www.kucoin.com/docs/websocket/spot-trading/public-channels/level2-5-best-ask-bid-orders
666
+ :see: https://www.kucoin.com/docs/websocket/spot-trading/public-channels/level2-50-best-ask-bid-orders
667
+ unWatches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
668
+ :param str[] symbols: unified array of symbols
669
+ :param int [limit]: the maximum amount of order book entries to return
670
+ :param dict [params]: extra parameters specific to the exchange API endpoint
671
+ :param str [params.method]: either '/market/level2' or '/spotMarket/level2Depth5' or '/spotMarket/level2Depth50' default is '/market/level2'
672
+ :returns dict: A dictionary of `order book structures <https://docs.ccxt.com/#/?id=order-book-structure>` indexed by market symbols
673
+ """
674
+ limit = self.safe_integer(params, 'limit')
675
+ params = self.omit(params, 'limit')
676
+ await self.load_markets()
677
+ symbols = self.market_symbols(symbols, None, False)
678
+ marketIds = self.market_ids(symbols)
679
+ url = await self.negotiate(False)
680
+ method: Str = None
681
+ method, params = self.handle_option_and_params(params, 'watchOrderBook', 'method', '/market/level2')
682
+ if (limit == 5) or (limit == 50):
683
+ method = '/spotMarket/level2Depth' + str(limit)
684
+ topic = method + ':' + ','.join(marketIds)
685
+ messageHashes = []
686
+ subscriptionHashes = []
687
+ for i in range(0, len(symbols)):
688
+ symbol = symbols[i]
689
+ messageHashes.append('unsubscribe:orderbook:' + symbol)
690
+ subscriptionHashes.append('orderbook:' + symbol)
691
+ subscription = {
692
+ 'messageHashes': messageHashes,
693
+ 'symbols': symbols,
694
+ 'unsubscribe': True,
695
+ 'topic': 'orderbook',
696
+ 'subMessageHashes': subscriptionHashes,
697
+ }
698
+ return await self.un_subscribe_multiple(url, messageHashes, topic, messageHashes, params, subscription)
699
+
587
700
  def handle_order_book(self, client: Client, message):
588
701
  #
589
702
  # initial snapshot is fetched with ccxt's fetchOrderBook
@@ -731,6 +844,53 @@ class kucoin(ccxt.async_support.kucoin):
731
844
  method = self.safe_value(subscription, 'method')
732
845
  if method is not None:
733
846
  method(client, message, subscription)
847
+ isUnSub = self.safe_bool(subscription, 'unsubscribe', False)
848
+ if isUnSub:
849
+ messageHashes = self.safe_list(subscription, 'messageHashes', [])
850
+ subMessageHashes = self.safe_list(subscription, 'subMessageHashes', [])
851
+ for i in range(0, len(messageHashes)):
852
+ messageHash = messageHashes[i]
853
+ subHash = subMessageHashes[i]
854
+ if messageHash in client.subscriptions:
855
+ del client.subscriptions[messageHash]
856
+ if subHash in client.subscriptions:
857
+ del client.subscriptions[subHash]
858
+ error = UnsubscribeError(self.id + ' ' + subHash)
859
+ client.reject(error, subHash)
860
+ client.resolve(True, messageHash)
861
+ self.clean_cache(subscription)
862
+
863
+ def clean_cache(self, subscription: dict):
864
+ topic = self.safe_string(subscription, 'topic')
865
+ symbols = self.safe_list(subscription, 'symbols', [])
866
+ symbolsLength = len(symbols)
867
+ if symbolsLength > 0:
868
+ for i in range(0, len(symbols)):
869
+ symbol = symbols[i]
870
+ if topic == 'trades':
871
+ if symbol in self.trades:
872
+ del self.trades[symbol]
873
+ elif topic == 'orderbook':
874
+ if symbol in self.orderbooks:
875
+ del self.orderbooks[symbol]
876
+ elif topic == 'ticker':
877
+ if symbol in self.tickers:
878
+ del self.tickers[symbol]
879
+ else:
880
+ if topic == 'myTrades':
881
+ # don't reset self.myTrades directly here
882
+ # because in c# we need to use a different object
883
+ keys = list(self.myTrades.keys())
884
+ for i in range(0, len(keys)):
885
+ del self.myTrades[keys[i]]
886
+ elif topic == 'orders':
887
+ orderSymbols = list(self.orders.keys())
888
+ for i in range(0, len(orderSymbols)):
889
+ del self.orders[orderSymbols[i]]
890
+ elif topic == 'ticker':
891
+ tickerSymbols = list(self.tickers.keys())
892
+ for i in range(0, len(tickerSymbols)):
893
+ del self.tickers[tickerSymbols[i]]
734
894
 
735
895
  def handle_system_status(self, client: Client, message):
736
896
  #
ccxt/whitebit.py CHANGED
@@ -1521,19 +1521,18 @@ class whitebit(Exchange, ImplicitAPI):
1521
1521
  """
1522
1522
  fetch all unfilled currently open orders
1523
1523
  :see: https://docs.whitebit.com/private/http-trade-v4/#query-unexecutedactive-orders
1524
- :param str symbol: unified market symbol
1524
+ :param str [symbol]: unified market symbol
1525
1525
  :param int [since]: the earliest time in ms to fetch open orders for
1526
1526
  :param int [limit]: the maximum number of open order structures to retrieve
1527
1527
  :param dict [params]: extra parameters specific to the exchange API endpoint
1528
1528
  :returns Order[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
1529
1529
  """
1530
- if symbol is None:
1531
- raise ArgumentsRequired(self.id + ' fetchOpenOrders() requires a symbol argument')
1532
1530
  self.load_markets()
1533
- market = self.market(symbol)
1534
- request: dict = {
1535
- 'market': market['id'],
1536
- }
1531
+ market = None
1532
+ request: dict = {}
1533
+ if symbol is not None:
1534
+ market = self.market(symbol)
1535
+ request['market'] = market['id']
1537
1536
  if limit is not None:
1538
1537
  request['limit'] = min(limit, 100)
1539
1538
  response = self.v4PrivatePostOrders(self.extend(request, params))
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ccxt
3
- Version: 4.3.96
3
+ Version: 4.3.98
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
@@ -272,13 +272,13 @@ console.log(version, Object.keys(exchanges));
272
272
 
273
273
  All-in-one browser bundle (dependencies included), served from a CDN of your choice:
274
274
 
275
- * jsDelivr: https://cdn.jsdelivr.net/npm/ccxt@4.3.96/dist/ccxt.browser.min.js
276
- * unpkg: https://unpkg.com/ccxt@4.3.96/dist/ccxt.browser.min.js
275
+ * jsDelivr: https://cdn.jsdelivr.net/npm/ccxt@4.3.98/dist/ccxt.browser.min.js
276
+ * unpkg: https://unpkg.com/ccxt@4.3.98/dist/ccxt.browser.min.js
277
277
 
278
278
  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.
279
279
 
280
280
  ```HTML
281
- <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/ccxt@4.3.96/dist/ccxt.browser.min.js"></script>
281
+ <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/ccxt@4.3.98/dist/ccxt.browser.min.js"></script>
282
282
  ```
283
283
 
284
284
  Creates a global `ccxt` object:
@@ -1,10 +1,10 @@
1
- ccxt/__init__.py,sha256=bGNyUUEIKAswu64l7yyJsxHb2NZRTUdETLiU84KoNQk,16486
1
+ ccxt/__init__.py,sha256=vXYwL74aE9Vs_OAakppysSIZ3teIGfShjSC2-Z6Ea3g,16486
2
2
  ccxt/ace.py,sha256=3KFlbRm6N9hXsKUsgZbQCFPZT5WGLm4HOjR19Q3uPts,42419
3
3
  ccxt/alpaca.py,sha256=nVQJ8vG4JrjEvMlu_nPoyR2lBq41j9Z2smPq95nDhng,47504
4
4
  ccxt/ascendex.py,sha256=qYzddORwUgXBOuvuRi3AtaH2srPYr21MOT2THdrXyLE,151540
5
5
  ccxt/bequant.py,sha256=RBiAmaTbL35DgiV3Hl6uchLUd78V0z1T9riTlNsrpdc,1174
6
6
  ccxt/bigone.py,sha256=RiEDQutD2BtvKfwVvAo2T9_DPqr0oa6ZJFDXph_g1UI,93122
7
- ccxt/binance.py,sha256=T42ws9X4TMWJ5b5B51OkUuisRz1-5GKDmNaEa10YShE,641455
7
+ ccxt/binance.py,sha256=mEgPDVGYzf93lRJhdINcnI73DJZro2_leWUebA7iLcM,641554
8
8
  ccxt/binancecoinm.py,sha256=arFnEh8mErSyi23eVPWE4iwoT7PWQyxGGVJCKCy6UJY,1702
9
9
  ccxt/binanceus.py,sha256=hdcT4OnadcdFFFjF3GtM0nWv90jqojqwdVS3xWGuW40,9163
10
10
  ccxt/binanceusdm.py,sha256=bAPcJj5HLxoCdPolriM8sJpoTBwbV78vBTbKRmWhNP4,2632
@@ -17,7 +17,7 @@ ccxt/bitcoincom.py,sha256=PyWIl4nC4jp5Uba2lI1At0N_hhNyWD0DoZC_MSyL_s4,502
17
17
  ccxt/bitfinex.py,sha256=w3t0YAwtOfCwLy5_w2wTq90qkTgUUyn0sqdO22zD-9U,73527
18
18
  ccxt/bitfinex2.py,sha256=a-mWVZfIiHIUOyXhjjyS9YYP5oDZAR22oPdvPqm2tU4,160875
19
19
  ccxt/bitflyer.py,sha256=A5Qtxec8uuhL0M2CIm908XFG_dauGoPetkGvglFUbrE,41719
20
- ccxt/bitget.py,sha256=xBTfJmSxKt-6g0EfvOzPi4mXyupWJILXQzrgwfsQ__A,424656
20
+ ccxt/bitget.py,sha256=qTZJor8cXIojk_0W5w4Z4Gb4mMW_RcOxcsWWNalyskA,424992
21
21
  ccxt/bithumb.py,sha256=8oTnFWi8Ai9fnm5FPXvNmaUAVJEOqYi-18VC23cWmXY,47935
22
22
  ccxt/bitmart.py,sha256=E8spf8q8jqlL41dlhwntz1WJzWQY0v9_IaIut1-r_y0,211807
23
23
  ccxt/bitmex.py,sha256=SoKTmrAKQ__SZzh1Fok1dOL7kUZjCIHl-qIHe9bO3Jc,126988
@@ -42,7 +42,7 @@ ccxt/coinbaseadvanced.py,sha256=d5g6nRx-NCcCwZDdtp8FsI2D-pRjSvnAP9ISSKY_nCQ,538
42
42
  ccxt/coinbaseexchange.py,sha256=7fdLpBd_Do9Fd1_6bfgwYGJkOv6tQIFbsXKFTX0qYAQ,78943
43
43
  ccxt/coinbaseinternational.py,sha256=JHciYqg_ZcVXWAUBj_zlcaUKfSjOL6CQmoAtO8ZbtSE,97484
44
44
  ccxt/coincheck.py,sha256=SeNvZm_3p01IsW8y6b3rw67qiMu29S59HHPG6Jma_T4,35942
45
- ccxt/coinex.py,sha256=XxMME7vtfppXuGC98TK_IWedLjnQf_l317pJGC5lVM8,256814
45
+ ccxt/coinex.py,sha256=__ESSoFpz01uydvyK5uslqwQxTt-jqCbDErK-4BgN50,257309
46
46
  ccxt/coinlist.py,sha256=Z2v-sn9_K3JUt42tQX5Naq3p55fH2giM2-fnSx--O2k,104123
47
47
  ccxt/coinmate.py,sha256=BkPcT92OQFeUQtnLDIkl-Sg0PcLrQ87RfHMFIybJoWk,46190
48
48
  ccxt/coinmetro.py,sha256=1HqUu4ScH4oZbloodvn0l25y7DaUMl_5MjBf5v8z_cA,80591
@@ -56,7 +56,7 @@ ccxt/deribit.py,sha256=hs6yUT8s7sfmO-GJ9RZ9nQC7Y9vnp_2puTRrd9r1Plw,161350
56
56
  ccxt/digifinex.py,sha256=pUPM7EEeRFoenX_jzNJM1RNuIUjATy6GB4J2osJJ4bY,169282
57
57
  ccxt/exmo.py,sha256=KlQqGZey31br-SVwhQg6mWIESyeM_wiIKRDOzIekuSs,114638
58
58
  ccxt/fmfwio.py,sha256=RbVLvzPwnqfDsE7Ea-N13ISCC82eJVPsXYjrleASmew,1236
59
- ccxt/gate.py,sha256=yMLmH3V2rIOIYkSesK6WENnQ6nB-404sybIi83zO7to,327725
59
+ ccxt/gate.py,sha256=JWn9RH_0AVQjnpdKC5puum_gDwvoTR6K8Po1Cdc-hms,327723
60
60
  ccxt/gateio.py,sha256=86AETJWODl_vA5VNeQRHZprmpNIY1HAxCddKZcnKSi8,445
61
61
  ccxt/gemini.py,sha256=qWLpJE-Ue3F-KhFfzhAteAMMJOr35duwdI-exBrRTEo,80950
62
62
  ccxt/hashkey.py,sha256=AfbhV_QCW31jzy8BFPnmGdhWfXz4WILIl-qh3jB4ZMc,191738
@@ -72,7 +72,7 @@ ccxt/independentreserve.py,sha256=k2T7rA1zcvlHC8QpmkKYO7ik44SayiElaSpW0EsTevA,37
72
72
  ccxt/indodax.py,sha256=o5YLVpQzm1LFWPAsvUOnvJxeBEWtaB_jQCvCOmXEw1Y,54758
73
73
  ccxt/kraken.py,sha256=DMy-Lncp9zYsid59O7cn3OLlCIT4Nf1BQa_kqM5dSJM,133417
74
74
  ccxt/krakenfutures.py,sha256=_-bbgzshifKnbyOB1pSs_bRfRepkRAdiDlsLDRiAw9w,119597
75
- ccxt/kucoin.py,sha256=LbzgmNP9yVChVBa2QA-dKpqus8OCj_EizIEVPzxRxUM,229633
75
+ ccxt/kucoin.py,sha256=ThXUcJmLLktHAdbBhXYJvhgnMgfnxqrpgXu7TtqAFbQ,229654
76
76
  ccxt/kucoinfutures.py,sha256=KNh4biqkvaVzgQ2DGUTnNf5853iwF628jKWk3rdOcB4,125860
77
77
  ccxt/kuna.py,sha256=GnIMk8R_IL84FTUHDNP6jHxd2FKNX9YwfoCXoYG83uA,96157
78
78
  ccxt/latoken.py,sha256=wBhaMcTEsB316nFCxm_WbLRZ_G2Q0Vi1FK-850Q07D0,79516
@@ -102,7 +102,7 @@ ccxt/upbit.py,sha256=d03xZjLdhtMrqTVm3VYmvQoT7inmq05bjrUNrJLi_7U,85413
102
102
  ccxt/vertex.py,sha256=r-ucPKA3DKb4Ke7u-OJxAXkHIS_ysF357R5-9dcYFHI,121797
103
103
  ccxt/wavesexchange.py,sha256=vmzv9h1QjthvpKUGajQn_tdCJ5tWmzEA6r7ow_y6ASY,114980
104
104
  ccxt/wazirx.py,sha256=LVHNdononi8FrZpT0pYiJoS-NrNi7_uIZ6Qbu8dJRPc,52405
105
- ccxt/whitebit.py,sha256=nm-FIOgvB35irrJ078mtvLki-cZ_V4aRT0B8z2rjMbU,119428
105
+ ccxt/whitebit.py,sha256=stDtMdsAZV2NVOmuTGjIZoYSHvfw3hAW73X8hUhCZgE,119365
106
106
  ccxt/woo.py,sha256=u7tYOD7NQVkeP0ypXiE5YeAZpI-RtELHL_fdkkD6qEU,153219
107
107
  ccxt/woofipro.py,sha256=bOytP6GTDdJ7JDEdGYOx3RFQhx_zySNNHexf_0MyUcc,115500
108
108
  ccxt/xt.py,sha256=a9f_Oq5KyDdytyCqW15jjXXdHGumbZwCqutt8cbfsPo,202616
@@ -218,13 +218,13 @@ ccxt/abstract/xt.py,sha256=JkWvsic3L2O968BCr9H5Wd5NIbRE9aTT2A-9WbAtl0c,27146
218
218
  ccxt/abstract/yobit.py,sha256=8ycfCO8ORFly9hc0Aa47sZyX4_ZKPXS9h9yJzI-uQ7Q,1339
219
219
  ccxt/abstract/zaif.py,sha256=m15WHdl3gYy0GOXNZ8NEH8eE7sVh8c0T_ITNuU8vXeU,3935
220
220
  ccxt/abstract/zonda.py,sha256=X-hCW0SdX3YKZWixDyW-O2211M58Rno8kKJ6quY7rw4,7183
221
- ccxt/async_support/__init__.py,sha256=rmi1c6dm0Pkl8OOFceQQFWC7N2QJFQrm1fakLSNJtUo,16289
221
+ ccxt/async_support/__init__.py,sha256=v2qSXsDgehTFrItkXcTs0bBKqwNWuU5qaKBxX6UfnmU,16289
222
222
  ccxt/async_support/ace.py,sha256=ucCkKaWRkILAIK9g4iEi1Q_-zmn0V89-rX8Al4WdK8s,42643
223
223
  ccxt/async_support/alpaca.py,sha256=HxonsP_MzbE7Z9r6hZ1rgmf_jPcP4H7H3z1YQgCv4qc,47716
224
224
  ccxt/async_support/ascendex.py,sha256=Yj4_0UHGd-cYY8s3vqu_zEwa6BLmqPYy6ztKapkuEaw,152353
225
225
  ccxt/async_support/bequant.py,sha256=1hTwHovo1bW1XTIc8ZKjvJ-Xg6LfmpGdzT7TepykaVM,1188
226
226
  ccxt/async_support/bigone.py,sha256=A7AjX0iWl2twYRwOc-2tKUbnI4KNmO2QVetMaAJujpg,93576
227
- ccxt/async_support/binance.py,sha256=mdKkkKttukXBVIi6XMdT1naJqRss9UJrUB_j8hZvD44,644189
227
+ ccxt/async_support/binance.py,sha256=EksRZxcbu72kYp2VPy7USViYSTtJOEHoP5_Vif4Ixu8,644288
228
228
  ccxt/async_support/binancecoinm.py,sha256=yeE73xG5UXD_X3VPul6DMGnV_mgJfWYskpas1BUDdCU,1740
229
229
  ccxt/async_support/binanceus.py,sha256=c-K3Tk7LaRJjmYdCx8vBOqsx01uXrtvt0PC2ekBiD0g,9177
230
230
  ccxt/async_support/binanceusdm.py,sha256=8ugRkx7vyYmn67wdkEEf2f-DFMGAoC4t09usKlPVNyw,2670
@@ -237,7 +237,7 @@ ccxt/async_support/bitcoincom.py,sha256=RiqwhK3RfxQ_PXTa860fphDCvwA8dalL-_rXlK85
237
237
  ccxt/async_support/bitfinex.py,sha256=pzyfQzUSxFYd6Ted0hNLgL545S8rFCrsoJc9Odk3zoo,73993
238
238
  ccxt/async_support/bitfinex2.py,sha256=Bw0d8dK5Ybp4_Aq9P-9DPJrtvzVJ6F28hHqX_BodLHM,161629
239
239
  ccxt/async_support/bitflyer.py,sha256=9tRLLI8tHyp0T1yj3-3F-MVoHB8Jq81qx_vQ-N00PJI,42027
240
- ccxt/async_support/bitget.py,sha256=LLL5XnYB2Wdlh3NDuInCvsZOUo6ifVopJazVMTU4diU,426280
240
+ ccxt/async_support/bitget.py,sha256=aYGgpFSlW1D2QDh87QYJMSdGlYQQnjNQ0G1yi93D2I0,426616
241
241
  ccxt/async_support/bithumb.py,sha256=Q0Cx_cRKZRfdpBAhQyINm63Qw3M6BRYQRiF0UqYzfis,48214
242
242
  ccxt/async_support/bitmart.py,sha256=DM-RMAL2itKyO_dTafBwQXnZ3NsDxy4LauDPucHT29M,212763
243
243
  ccxt/async_support/bitmex.py,sha256=bpaQ7pqan9JFj5AJxngtcuqeN9ReO76WbNkqfvBtyT0,127566
@@ -262,7 +262,7 @@ ccxt/async_support/coinbaseadvanced.py,sha256=Kupwnuxiu_qTjwCNV2asacoDUNFQvcaHNA
262
262
  ccxt/async_support/coinbaseexchange.py,sha256=f19V1ImoyhYNllwWxygVWuJuu7F6_LXcthgIeXEHiDM,79449
263
263
  ccxt/async_support/coinbaseinternational.py,sha256=o7Fhezgb75wSyxzyH0hHYzRaNnQvkZtpylXdYYgRedo,98098
264
264
  ccxt/async_support/coincheck.py,sha256=N_0cDMAiFRC4G--QgOmSH8esKDr_lEVZUpukc4QoHk8,36148
265
- ccxt/async_support/coinex.py,sha256=pxDqfQs-zzA-BxOih99R_K0sOQoQseMmZXGNFfYP4Uc,258072
265
+ ccxt/async_support/coinex.py,sha256=Rdj2sthSVkATxJ9tAmPSWRnPf1gBpfNExm6j3lgPFgA,258567
266
266
  ccxt/async_support/coinlist.py,sha256=NTN-W6Jm4fcwvBHRcSB6yj4QTeNrMg5IyZiYpkKUGZ0,104611
267
267
  ccxt/async_support/coinmate.py,sha256=NI58zYMkuOL9lB3UFzyjUNbuFZGrtjZbb4PBFTOsbz4,46456
268
268
  ccxt/async_support/coinmetro.py,sha256=BloSsFuLoLTt_lnaZL051g75Yn1M2LIf7kMCZLOiYTc,80911
@@ -276,7 +276,7 @@ ccxt/async_support/deribit.py,sha256=JfdtFswWctlKE_GOjoxFIVKTNq-LUeuVik59MAx-u8s
276
276
  ccxt/async_support/digifinex.py,sha256=6fj4RPpxV8ArNSBXm5_y_Mt7fzjYxYOSO8mcxGKXpUU,170252
277
277
  ccxt/async_support/exmo.py,sha256=uVJsy3mfNLpfbY0ndl2EF9hipUylEw8J58J3wCGyyA0,115270
278
278
  ccxt/async_support/fmfwio.py,sha256=lzfSnPrB2ARcC3EIqAuBM4vyg6LJ6n8RE71Zvt3ez1s,1250
279
- ccxt/async_support/gate.py,sha256=4YbAEwG7gfn_mWrEVki76rzQ_wFor80rItpPy4eWK6w,329456
279
+ ccxt/async_support/gate.py,sha256=EsnqQ_V_hQUxe1vqRhUx9JIkPCqcCSVEwHkCks_RPxw,329454
280
280
  ccxt/async_support/gateio.py,sha256=6_t032F9p9x5KGTjtSuqGXITzFOx-XAQBYLpsuQjzxw,459
281
281
  ccxt/async_support/gemini.py,sha256=nB8pdA9FAezRsRhF6_7w-T5keDtlahjPo9WPApEJbsY,81474
282
282
  ccxt/async_support/hashkey.py,sha256=bwQsEvhGU60iy_vlAbLvtx1blhDxS4L3cqoTpk6JNQ8,192580
@@ -292,7 +292,7 @@ ccxt/async_support/independentreserve.py,sha256=-W-SMPkJwY9FMN5I6l5eL8cPwC0_Uuqm
292
292
  ccxt/async_support/indodax.py,sha256=-dcr5VdpSkcLgy2KUlumm0NhGs4_mNstysIlunhF2-4,55066
293
293
  ccxt/async_support/kraken.py,sha256=aDndekk6rCIyASRAjJNg1oNzxcProwA1ezZ7ftKLOY8,134067
294
294
  ccxt/async_support/krakenfutures.py,sha256=stPhBne9pFVlgFkw4mwqtaaI6NTZCAcmOIFVlQSbl8I,120085
295
- ccxt/async_support/kucoin.py,sha256=A80W0tVyY4k39-kOFYj52gCoXYQhaTWi6ZL8ln4v-5A,230776
295
+ ccxt/async_support/kucoin.py,sha256=MQarL6ZcVHA09oColzpwT00EcP-34rBXIJeFzgqQOJ4,230797
296
296
  ccxt/async_support/kucoinfutures.py,sha256=a2oRhfH61LsSnhSlhwSJM7yRUUsegkmQenOa_nPwHuA,126516
297
297
  ccxt/async_support/kuna.py,sha256=QtzLgqgv8mLXECN2drWNVtdvm_vy-bawdxKvozDzbVE,96573
298
298
  ccxt/async_support/latoken.py,sha256=9BUu8akWtbBtAzVr_c_cYLkiLQqcJdSdkJbHmuLee-Y,79992
@@ -322,7 +322,7 @@ ccxt/async_support/upbit.py,sha256=r-7J61DYPXfCOa2-iks16MIiqF4IjfuIWQURyximwZ4,8
322
322
  ccxt/async_support/vertex.py,sha256=TSw1dmCXj2kIDV7uvj-kd3wPurRu90fg9mHWHoHjF_o,122297
323
323
  ccxt/async_support/wavesexchange.py,sha256=wHxvsBQydDEYRgeAZKI9WO4TLBKmmSPTLm0eT0pKB5g,115530
324
324
  ccxt/async_support/wazirx.py,sha256=bnUpw9be3o4l2Hxm3jcfNXn5bMyZlgqoG8BGPusuIzs,52707
325
- ccxt/async_support/whitebit.py,sha256=MMKYPLjbCyW9yd2saPifUJIFwddN9z4DG3agTaAMKOc,120078
325
+ ccxt/async_support/whitebit.py,sha256=zt8NkoziYOrYUR7K-SJW3qP7nP6pY6f334NiRdOKIZA,120015
326
326
  ccxt/async_support/woo.py,sha256=dvKBt8HDmQk1i5u2f3UUWmR9Pw1NALgyAj2wq3uWIds,154187
327
327
  ccxt/async_support/woofipro.py,sha256=B-BTPNdv3fL6wz3cHcMG2G8IU0MtvfzAiPP0OVT-xsI,116180
328
328
  ccxt/async_support/xt.py,sha256=_U-r4Gp0oBCOE6Ngo98Sn_Q6tr_81CUDDSliF0FMezE,203770
@@ -330,7 +330,7 @@ ccxt/async_support/yobit.py,sha256=GQhvYrsGHQrVdTrNHQxx9isEGqUABexlllzao9HL3f8,5
330
330
  ccxt/async_support/zaif.py,sha256=-ZTr8M2JaIRCL90VrbCDXBMAsZwbiwsFChSQ2rWODuQ,29044
331
331
  ccxt/async_support/zonda.py,sha256=jncr6Wg12S72CTpu6mCKCse1pm1f8oefVQurQSrFvP0,81733
332
332
  ccxt/async_support/base/__init__.py,sha256=aVYSsFi--b4InRs9zDN_wtCpj8odosAB726JdUHavrk,67
333
- ccxt/async_support/base/exchange.py,sha256=pVsNqTr1VZwb9tiANMjF6s9h9P1-8wOd2pWQwzM8i3k,110678
333
+ ccxt/async_support/base/exchange.py,sha256=wIZY8rE6aLTzPur4pwEAIOCtnduhsLdcNEhku_BYvKg,110678
334
334
  ccxt/async_support/base/throttler.py,sha256=tvDVcdRUVYi8fZRlEcnqtgzcgB_KMUMRs5Pu8tuU-tU,1847
335
335
  ccxt/async_support/base/ws/__init__.py,sha256=uockzpLuwntKGZbs5EOWFe-Zg-k6Cj7GhNJLc_RX0so,1791
336
336
  ccxt/async_support/base/ws/aiohttp_client.py,sha256=5IEiT0elWI9a7Vr-KV0jgmlbpLJWBzIlrLaCkTKGaqY,5752
@@ -344,10 +344,10 @@ ccxt/async_support/base/ws/order_book_side.py,sha256=GhnGUt78pJ-AYL_Dq9produGjmB
344
344
  ccxt/base/__init__.py,sha256=eTx1OE3HJjspFUQjGm6LBhaQiMKJnXjkdP-JUXknyQ0,1320
345
345
  ccxt/base/decimal_to_precision.py,sha256=fgWRBzRTtsf3r2INyS4f7WHlzgjB5YM1ekiwqD21aac,6634
346
346
  ccxt/base/errors.py,sha256=Pad-6ugvGUwhoYuKUliX-N7FTrcnKCQGFjsaq2tMn0I,4610
347
- ccxt/base/exchange.py,sha256=sCALbBznRatUGql-21srZDGCaPQopR9IrW94f5qz8Kg,295943
347
+ ccxt/base/exchange.py,sha256=bZjv1EMizBQEw17jjqeqCn_cb7rL4gjl9WxX8VaiKR0,295943
348
348
  ccxt/base/precise.py,sha256=koce64Yrp6vFbGijJtUt-QQ6XhJgeGTCksZ871FPp_A,8886
349
349
  ccxt/base/types.py,sha256=TaP_RElKjGEZWuzyp4o4u2YhREyTG3rUeVT6gDffY9A,9613
350
- ccxt/pro/__init__.py,sha256=VDViEiYAgzARPqQC_ImxjJHAIlo7hSEM19BuVHl_Ta0,7710
350
+ ccxt/pro/__init__.py,sha256=WAB-1ZYJjVTWvSxf9sGCj_1La0ENE86uLXtUopuv3VY,7710
351
351
  ccxt/pro/alpaca.py,sha256=xh1yg1Ok-Zh_Mfx-MBjNrfJDs6MUU0exFfEj3GuQPC4,27631
352
352
  ccxt/pro/ascendex.py,sha256=QueLgISoIxgGSOta2W7En4pwAsEXbTP5q5ef4UjpTQQ,37524
353
353
  ccxt/pro/bequant.py,sha256=33OEUWBi4D9-2w8CmkwN3aF1qS-AlLqX3pxrWwNbXPY,1552
@@ -382,7 +382,7 @@ ccxt/pro/cryptocom.py,sha256=jJgBlJOzAWemQEQCiw1sNpEuX3RbqpIqwd9cPd3ZtP0,54607
382
382
  ccxt/pro/currencycom.py,sha256=8B9pSuPyO0ROCWOROUFoNbJBeOU3bRmlKXSj1CBMkPI,22459
383
383
  ccxt/pro/deribit.py,sha256=DG3UJE8VWuydP64_CJzDqmRC0vqc9ViBvQr28gW_nhY,41094
384
384
  ccxt/pro/exmo.py,sha256=n44MqOwY-tSt0TFNhQKydjxRJoSbrMVBzL4NNswOZm4,24542
385
- ccxt/pro/gate.py,sha256=PhhmAgeY2IcSIpCdeQcZlhc19neXJkYrRL4W8Bocs84,79322
385
+ ccxt/pro/gate.py,sha256=lykOS-yeTZUN1YLOcZpa9H9Ym-oKfzofVpq7H5jZI6k,86576
386
386
  ccxt/pro/gateio.py,sha256=_uBWXYQbmsHRivKnZOJDmxJ9tWLO_0HAxmOjAEUy9nE,391
387
387
  ccxt/pro/gemini.py,sha256=8B8dbYPbKbZb3lzhlt8-x0oybQxOHr8Q4R_f5edLwbU,36899
388
388
  ccxt/pro/hashkey.py,sha256=F-NAOAeNSEjHyuZnvGiIYHQow5RAKcwgyb23cGwOiJs,34065
@@ -394,9 +394,9 @@ ccxt/pro/huobijp.py,sha256=urnktXqCIJTccup0oQJPJsM32XR09dDP6qGP1kvBtfg,23318
394
394
  ccxt/pro/hyperliquid.py,sha256=B-bV58Jw20AL4C2LGaj11cPp3osZRRr3T5WjfPXwc5Y,32500
395
395
  ccxt/pro/idex.py,sha256=WAY58yMHFUPoqZUGFvzxqcKizvMuFXqdZ6BD0WgstQA,28361
396
396
  ccxt/pro/independentreserve.py,sha256=JWMjJ0FUs4LhybAZ4rjHMQIWeOu5Njaj8aVimA7kf30,11356
397
- ccxt/pro/kraken.py,sha256=hrYXzL-CLCgm0BbQBjNOoiAfC57Ca5JTiD_24eIvikM,63840
397
+ ccxt/pro/kraken.py,sha256=ITIUkUaC7AfLEhaQR7s3zkJnJBa_eQU5DEOn980QOW0,64129
398
398
  ccxt/pro/krakenfutures.py,sha256=Y9vqrxNbr7OJ0BIMZqrVtMedUzk7XtOZuF_OGQ2tUJc,64033
399
- ccxt/pro/kucoin.py,sha256=Vsbt5k8zDSve31LiRlPQgdp1AxVtosT1c9nSCUCF364,54296
399
+ ccxt/pro/kucoin.py,sha256=a4zZ7u2oGE8Cq9wkfBSGkgi3rmjV8uIXCD1vkZJkdtA,62986
400
400
  ccxt/pro/kucoinfutures.py,sha256=gMRflEtuO_S_cuhhVOtIwarL_Nk9ThAmGqyvUncVqHc,50331
401
401
  ccxt/pro/lbank.py,sha256=p6Ynjmud9B3Yw1SGTPdTB36AW4KtyR1JOotqFBdyyxs,35083
402
402
  ccxt/pro/luno.py,sha256=ThXkXNrLvp9BW8XXxRcbpRaw9QcLCS2f2tCqbF6qpEU,12384
@@ -650,8 +650,8 @@ ccxt/test/tests_async.py,sha256=f4Q7u2feejQp5rh3-4oB6XDNZ7_gkaZbkHqAu1wGyIU,8457
650
650
  ccxt/test/tests_helpers.py,sha256=xhOILoZ_x3RSfQjtKt6AQlkp9DkOtpTQe8GAUUZoM6s,10069
651
651
  ccxt/test/tests_init.py,sha256=eVwwUHujX9t4rjgo4TqEeg7DDhR1Hb_e2SJN8NVGyl0,998
652
652
  ccxt/test/tests_sync.py,sha256=ZFBHhpfH40I0VkpOdQo-8h2ccUMIEiKGppElvf1myK8,83635
653
- ccxt-4.3.96.dist-info/LICENSE.txt,sha256=EIb9221AhMHV7xF1_55STFdKTFsnJVJYkRpY2Lnvo5w,1068
654
- ccxt-4.3.96.dist-info/METADATA,sha256=VLijQU0vyWMSL2CKu6h2qT9wJYw8IWVYeJ83EYHWl4s,118342
655
- ccxt-4.3.96.dist-info/WHEEL,sha256=z9j0xAa_JmUKMpmz72K0ZGALSM_n-wQVmGbleXx2VHg,110
656
- ccxt-4.3.96.dist-info/top_level.txt,sha256=CkQDuCTDKNcImPV60t36G6MdYfxsAPNiSaEwifVoVMo,5
657
- ccxt-4.3.96.dist-info/RECORD,,
653
+ ccxt-4.3.98.dist-info/LICENSE.txt,sha256=EIb9221AhMHV7xF1_55STFdKTFsnJVJYkRpY2Lnvo5w,1068
654
+ ccxt-4.3.98.dist-info/METADATA,sha256=C5Ov-x1xomtPh2YPcyBUEDYvbu0jpzqnNPgOuEdj9dU,118342
655
+ ccxt-4.3.98.dist-info/WHEEL,sha256=z9j0xAa_JmUKMpmz72K0ZGALSM_n-wQVmGbleXx2VHg,110
656
+ ccxt-4.3.98.dist-info/top_level.txt,sha256=CkQDuCTDKNcImPV60t36G6MdYfxsAPNiSaEwifVoVMo,5
657
+ ccxt-4.3.98.dist-info/RECORD,,
File without changes