ccxt 4.3.97__py2.py3-none-any.whl → 4.4.1__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.97'
25
+ __version__ = '4.4.1'
26
26
 
27
27
  # ----------------------------------------------------------------------------
28
28
 
@@ -4,7 +4,7 @@
4
4
 
5
5
  # -----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.3.97'
7
+ __version__ = '4.4.1'
8
8
 
9
9
  # -----------------------------------------------------------------------------
10
10
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  # -----------------------------------------------------------------------------
4
4
 
5
- __version__ = '4.3.97'
5
+ __version__ = '4.4.1'
6
6
 
7
7
  # -----------------------------------------------------------------------------
8
8
 
@@ -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}
@@ -1328,10 +1330,11 @@ class bitget(Exchange, ImplicitAPI):
1328
1330
  },
1329
1331
  'precisionMode': TICK_SIZE,
1330
1332
  'commonCurrencies': {
1331
- 'JADE': 'Jade Protocol',
1333
+ 'APX': 'AstroPepeX',
1332
1334
  'DEGEN': 'DegenReborn',
1333
- 'TONCOIN': 'TON',
1335
+ 'JADE': 'Jade Protocol',
1334
1336
  'OMNI': 'omni', # conflict with Omni Network
1337
+ 'TONCOIN': 'TON',
1335
1338
  },
1336
1339
  'options': {
1337
1340
  'timeframes': {
@@ -626,6 +626,7 @@ class gate(Exchange, ImplicitAPI):
626
626
  'MPH': 'MORPHER', # conflict with 88MPH
627
627
  'POINT': 'GATEPOINT',
628
628
  'RAI': 'RAIREFLEXINDEX', # conflict with RAI Finance
629
+ 'RED': 'RedLang',
629
630
  'SBTC': 'SUPERBITCOIN',
630
631
  'TNC': 'TRINITYNETWORKCREDIT',
631
632
  'VAI': 'VAIOT',
@@ -3786,7 +3787,7 @@ class gate(Exchange, ImplicitAPI):
3786
3787
  if not market['option']:
3787
3788
  request['settle'] = market['settleId'] # filled in prepareRequest above
3788
3789
  if isMarketOrder:
3789
- request['price'] = price # set to 0 for market orders
3790
+ request['price'] = '0' # set to 0 for market orders
3790
3791
  else:
3791
3792
  request['price'] = '0' if (price == 0) else self.price_to_precision(symbol, price)
3792
3793
  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.97'
7
+ __version__ = '4.4.1'
8
8
 
9
9
  # -----------------------------------------------------------------------------
10
10
 
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}
@@ -1327,10 +1329,11 @@ class bitget(Exchange, ImplicitAPI):
1327
1329
  },
1328
1330
  'precisionMode': TICK_SIZE,
1329
1331
  'commonCurrencies': {
1330
- 'JADE': 'Jade Protocol',
1332
+ 'APX': 'AstroPepeX',
1331
1333
  'DEGEN': 'DegenReborn',
1332
- 'TONCOIN': 'TON',
1334
+ 'JADE': 'Jade Protocol',
1333
1335
  'OMNI': 'omni', # conflict with Omni Network
1336
+ 'TONCOIN': 'TON',
1334
1337
  },
1335
1338
  'options': {
1336
1339
  'timeframes': {
ccxt/gate.py CHANGED
@@ -625,6 +625,7 @@ class gate(Exchange, ImplicitAPI):
625
625
  'MPH': 'MORPHER', # conflict with 88MPH
626
626
  'POINT': 'GATEPOINT',
627
627
  'RAI': 'RAIREFLEXINDEX', # conflict with RAI Finance
628
+ 'RED': 'RedLang',
628
629
  'SBTC': 'SUPERBITCOIN',
629
630
  'TNC': 'TRINITYNETWORKCREDIT',
630
631
  'VAI': 'VAIOT',
@@ -3785,7 +3786,7 @@ class gate(Exchange, ImplicitAPI):
3785
3786
  if not market['option']:
3786
3787
  request['settle'] = market['settleId'] # filled in prepareRequest above
3787
3788
  if isMarketOrder:
3788
- request['price'] = price # set to 0 for market orders
3789
+ request['price'] = '0' # set to 0 for market orders
3789
3790
  else:
3790
3791
  request['price'] = '0' if (price == 0) else self.price_to_precision(symbol, price)
3791
3792
  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.97'
7
+ __version__ = '4.4.1'
8
8
 
9
9
  # ----------------------------------------------------------------------------
10
10
 
ccxt/pro/hyperliquid.py CHANGED
@@ -5,10 +5,12 @@
5
5
 
6
6
  import ccxt.async_support
7
7
  from ccxt.async_support.base.ws.cache import ArrayCache, ArrayCacheBySymbolById, ArrayCacheByTimestamp
8
- from ccxt.base.types import Any, Int, Market, Num, Order, OrderBook, OrderRequest, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade
8
+ from ccxt.base.types import Int, Market, Num, Order, OrderBook, OrderRequest, OrderSide, OrderType, 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
13
+ from ccxt.base.errors import UnsubscribeError
12
14
 
13
15
 
14
16
  class hyperliquid(ccxt.async_support.hyperliquid):
@@ -160,6 +162,32 @@ class hyperliquid(ccxt.async_support.hyperliquid):
160
162
  orderbook = await self.watch(url, messageHash, message, messageHash)
161
163
  return orderbook.limit()
162
164
 
165
+ async def un_watch_order_book(self, symbol: str, params={}) -> Any:
166
+ """
167
+ unWatches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
168
+ :see: https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/websocket/subscriptions
169
+ :param str symbol: unified symbol of the market to fetch the order book for
170
+ :param dict [params]: extra parameters specific to the exchange API endpoint
171
+ :returns dict: A dictionary of `order book structures <https://docs.ccxt.com/#/?id=order-book-structure>` indexed by market symbols
172
+ """
173
+ await self.load_markets()
174
+ market = self.market(symbol)
175
+ symbol = market['symbol']
176
+ subMessageHash = 'orderbook:' + symbol
177
+ messageHash = 'unsubscribe:' + subMessageHash
178
+ url = self.urls['api']['ws']['public']
179
+ id = str(self.nonce())
180
+ request: dict = {
181
+ 'id': id,
182
+ 'method': 'unsubscribe',
183
+ 'subscription': {
184
+ 'type': 'l2Book',
185
+ 'coin': market['base'] if market['swap'] else market['id'],
186
+ },
187
+ }
188
+ message = self.extend(request, params)
189
+ return await self.watch(url, messageHash, message, messageHash)
190
+
163
191
  def handle_order_book(self, client, message):
164
192
  #
165
193
  # {
@@ -230,6 +258,28 @@ class hyperliquid(ccxt.async_support.hyperliquid):
230
258
  return self.filter_by_array_tickers(tickers, 'symbol', symbols)
231
259
  return self.tickers
232
260
 
261
+ async def un_watch_tickers(self, symbols: Strings = None, params={}) -> Any:
262
+ """
263
+ unWatches a price ticker, a statistical calculation with the information calculated over the past 24 hours for all markets of a specific list
264
+ :see: https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/websocket/subscriptions
265
+ :param str[] symbols: unified symbol of the market to fetch the ticker for
266
+ :param dict [params]: extra parameters specific to the exchange API endpoint
267
+ :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
268
+ """
269
+ await self.load_markets()
270
+ symbols = self.market_symbols(symbols, None, True)
271
+ subMessageHash = 'tickers'
272
+ messageHash = 'unsubscribe:' + subMessageHash
273
+ url = self.urls['api']['ws']['public']
274
+ request: dict = {
275
+ 'method': 'unsubscribe',
276
+ 'subscription': {
277
+ 'type': 'webData2', # allMids
278
+ 'user': '0x0000000000000000000000000000000000000000',
279
+ },
280
+ }
281
+ return await self.watch(url, messageHash, self.extend(request, params), messageHash)
282
+
233
283
  async def watch_my_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
234
284
  """
235
285
  watches information on multiple trades made by the user
@@ -392,15 +442,17 @@ class hyperliquid(ccxt.async_support.hyperliquid):
392
442
  client.resolve(trades, messageHash)
393
443
 
394
444
  async def watch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
395
- """
396
- watches information on multiple trades made in a market
397
- :see: https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/websocket/subscriptions
398
- :param str symbol: unified market symbol of the market trades were made in
399
- :param int [since]: the earliest time in ms to fetch trades for
400
- :param int [limit]: the maximum number of trade structures to retrieve
401
- :param dict [params]: extra parameters specific to the exchange API endpoint
402
- :returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=trade-structure>`
403
- """
445
+ # s
446
+ # @method
447
+ # @name hyperliquid#watchTrades
448
+ # @description watches information on multiple trades made in a market
449
+ # @see https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/websocket/subscriptions
450
+ # @param {string} symbol unified market symbol of the market trades were made in
451
+ # @param {int} [since] the earliest time in ms to fetch trades for
452
+ # @param {int} [limit] the maximum number of trade structures to retrieve
453
+ # @param {object} [params] extra parameters specific to the exchange API endpoint
454
+ # @returns {object[]} a list of `trade structures <https://docs.ccxt.com/#/?id=trade-structure>`
455
+ #
404
456
  await self.load_markets()
405
457
  market = self.market(symbol)
406
458
  symbol = market['symbol']
@@ -419,6 +471,30 @@ class hyperliquid(ccxt.async_support.hyperliquid):
419
471
  limit = trades.getLimit(symbol, limit)
420
472
  return self.filter_by_since_limit(trades, since, limit, 'timestamp', True)
421
473
 
474
+ async def un_watch_trades(self, symbol: str, params={}) -> Any:
475
+ """
476
+ unWatches information on multiple trades made in a market
477
+ :see: https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/websocket/subscriptions
478
+ :param str symbol: unified market symbol of the market trades were made in
479
+ :param dict [params]: extra parameters specific to the exchange API endpoint
480
+ :returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=trade-structure>`
481
+ """
482
+ await self.load_markets()
483
+ market = self.market(symbol)
484
+ symbol = market['symbol']
485
+ subMessageHash = 'trade:' + symbol
486
+ messageHash = 'unsubscribe:' + subMessageHash
487
+ url = self.urls['api']['ws']['public']
488
+ request: dict = {
489
+ 'method': 'unsubscribe',
490
+ 'subscription': {
491
+ 'type': 'trades',
492
+ 'coin': market['base'] if market['swap'] else market['id'],
493
+ },
494
+ }
495
+ message = self.extend(request, params)
496
+ return await self.watch(url, messageHash, message, messageHash)
497
+
422
498
  def handle_trades(self, client: Client, message):
423
499
  #
424
500
  # {
@@ -546,6 +622,32 @@ class hyperliquid(ccxt.async_support.hyperliquid):
546
622
  limit = ohlcv.getLimit(symbol, limit)
547
623
  return self.filter_by_since_limit(ohlcv, since, limit, 0, True)
548
624
 
625
+ async def un_watch_ohlcv(self, symbol: str, timeframe='1m', params={}) -> Any:
626
+ """
627
+ watches historical candlestick data containing the open, high, low, close price, and the volume of a market
628
+ :see: https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/websocket/subscriptions
629
+ :param str symbol: unified symbol of the market to fetch OHLCV data for
630
+ :param str timeframe: the length of time each candle represents
631
+ :param dict [params]: extra parameters specific to the exchange API endpoint
632
+ :returns int[][]: A list of candles ordered, open, high, low, close, volume
633
+ """
634
+ await self.load_markets()
635
+ market = self.market(symbol)
636
+ symbol = market['symbol']
637
+ url = self.urls['api']['ws']['public']
638
+ request: dict = {
639
+ 'method': 'unsubscribe',
640
+ 'subscription': {
641
+ 'type': 'candle',
642
+ 'coin': market['base'] if market['swap'] else market['id'],
643
+ 'interval': timeframe,
644
+ },
645
+ }
646
+ subMessageHash = 'candles:' + timeframe + ':' + symbol
647
+ messagehash = 'unsubscribe:' + subMessageHash
648
+ message = self.extend(request, params)
649
+ return await self.watch(url, messagehash, message, messagehash)
650
+
549
651
  def handle_ohlcv(self, client: Client, message):
550
652
  #
551
653
  # {
@@ -581,7 +683,7 @@ class hyperliquid(ccxt.async_support.hyperliquid):
581
683
  messageHash = 'candles:' + timeframe + ':' + symbol
582
684
  client.resolve(ohlcv, messageHash)
583
685
 
584
- def handle_ws_post(self, client: Client, message: Any):
686
+ def handle_ws_post(self, client: Client, message: dict):
585
687
  # {
586
688
  # channel: "post",
587
689
  # data: {
@@ -689,7 +791,135 @@ class hyperliquid(ccxt.async_support.hyperliquid):
689
791
  else:
690
792
  return False
691
793
 
794
+ def handle_order_book_unsubscription(self, client: Client, subscription: dict):
795
+ #
796
+ # "subscription":{
797
+ # "type":"l2Book",
798
+ # "coin":"BTC",
799
+ # "nSigFigs":5,
800
+ # "mantissa":null
801
+ # }
802
+ #
803
+ coin = self.safe_string(subscription, 'coin')
804
+ marketId = self.coinToMarketId(coin)
805
+ symbol = self.safe_symbol(marketId)
806
+ subMessageHash = 'orderbook:' + symbol
807
+ messageHash = 'unsubscribe:' + subMessageHash
808
+ if messageHash in client.subscriptions:
809
+ del client.subscriptions[messageHash]
810
+ if subMessageHash in client.subscriptions:
811
+ del client.subscriptions[subMessageHash]
812
+ error = UnsubscribeError(self.id + ' ' + subMessageHash)
813
+ client.reject(error, subMessageHash)
814
+ client.resolve(True, messageHash)
815
+ if symbol in self.orderbooks:
816
+ del self.orderbooks[symbol]
817
+
818
+ def handle_trades_unsubscription(self, client: Client, subscription: dict):
819
+ #
820
+ coin = self.safe_string(subscription, 'coin')
821
+ marketId = self.coinToMarketId(coin)
822
+ symbol = self.safe_symbol(marketId)
823
+ subMessageHash = 'trade:' + symbol
824
+ messageHash = 'unsubscribe:' + subMessageHash
825
+ if messageHash in client.subscriptions:
826
+ del client.subscriptions[messageHash]
827
+ if subMessageHash in client.subscriptions:
828
+ del client.subscriptions[subMessageHash]
829
+ error = UnsubscribeError(self.id + ' ' + subMessageHash)
830
+ client.reject(error, subMessageHash)
831
+ client.resolve(True, messageHash)
832
+ if symbol in self.trades:
833
+ del self.trades[symbol]
834
+
835
+ def handle_tickers_unsubscription(self, client: Client, subscription: dict):
836
+ #
837
+ subMessageHash = 'tickers'
838
+ messageHash = 'unsubscribe:' + subMessageHash
839
+ if messageHash in client.subscriptions:
840
+ del client.subscriptions[messageHash]
841
+ if subMessageHash in client.subscriptions:
842
+ del client.subscriptions[subMessageHash]
843
+ error = UnsubscribeError(self.id + ' ' + subMessageHash)
844
+ client.reject(error, subMessageHash)
845
+ client.resolve(True, messageHash)
846
+ symbols = list(self.tickers.keys())
847
+ for i in range(0, len(symbols)):
848
+ del self.tickers[symbols[i]]
849
+
850
+ def handle_ohlcv_unsubscription(self, client: Client, subscription: dict):
851
+ coin = self.safe_string(subscription, 'coin')
852
+ marketId = self.coinToMarketId(coin)
853
+ symbol = self.safe_symbol(marketId)
854
+ interval = self.safe_string(subscription, 'interval')
855
+ timeframe = self.find_timeframe(interval)
856
+ subMessageHash = 'candles:' + timeframe + ':' + symbol
857
+ messageHash = 'unsubscribe:' + subMessageHash
858
+ if messageHash in client.subscriptions:
859
+ del client.subscriptions[messageHash]
860
+ if subMessageHash in client.subscriptions:
861
+ del client.subscriptions[subMessageHash]
862
+ error = UnsubscribeError(self.id + ' ' + subMessageHash)
863
+ client.reject(error, subMessageHash)
864
+ client.resolve(True, messageHash)
865
+ if symbol in self.ohlcvs:
866
+ if timeframe in self.ohlcvs[symbol]:
867
+ del self.ohlcvs[symbol][timeframe]
868
+
869
+ def handle_subscription_response(self, client: Client, message):
870
+ # {
871
+ # "channel":"subscriptionResponse",
872
+ # "data":{
873
+ # "method":"unsubscribe",
874
+ # "subscription":{
875
+ # "type":"l2Book",
876
+ # "coin":"BTC",
877
+ # "nSigFigs":5,
878
+ # "mantissa":null
879
+ # }
880
+ # }
881
+ # }
882
+ #
883
+ # {
884
+ # "channel":"subscriptionResponse",
885
+ # "data":{
886
+ # "method":"unsubscribe",
887
+ # "subscription":{
888
+ # "type":"trades",
889
+ # "coin":"PURR/USDC"
890
+ # }
891
+ # }
892
+ # }
893
+ #
894
+ data = self.safe_dict(message, 'data', {})
895
+ method = self.safe_string(data, 'method')
896
+ if method == 'unsubscribe':
897
+ subscription = self.safe_dict(data, 'subscription', {})
898
+ type = self.safe_string(subscription, 'type')
899
+ if type == 'l2Book':
900
+ self.handle_order_book_unsubscription(client, subscription)
901
+ elif type == 'trades':
902
+ self.handle_trades_unsubscription(client, subscription)
903
+ elif type == 'webData2':
904
+ self.handle_tickers_unsubscription(client, subscription)
905
+ elif type == 'candle':
906
+ self.handle_ohlcv_unsubscription(client, subscription)
907
+
692
908
  def handle_message(self, client: Client, message):
909
+ #
910
+ # {
911
+ # "channel":"subscriptionResponse",
912
+ # "data":{
913
+ # "method":"unsubscribe",
914
+ # "subscription":{
915
+ # "type":"l2Book",
916
+ # "coin":"BTC",
917
+ # "nSigFigs":5,
918
+ # "mantissa":null
919
+ # }
920
+ # }
921
+ # }
922
+ #
693
923
  if self.handle_error_message(client, message):
694
924
  return
695
925
  topic = self.safe_string(message, 'channel', '')
@@ -702,6 +932,7 @@ class hyperliquid(ccxt.async_support.hyperliquid):
702
932
  'userFills': self.handle_my_trades,
703
933
  'webData2': self.handle_ws_tickers,
704
934
  'post': self.handle_ws_post,
935
+ 'subscriptionResponse': self.handle_subscription_response,
705
936
  }
706
937
  exacMethod = self.safe_value(methods, topic)
707
938
  if exacMethod is not None:
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
@@ -599,6 +599,20 @@ class kucoin(ccxt.async_support.kucoin):
599
599
  #
600
600
  return await self.watch_order_book_for_symbols([symbol], limit, params)
601
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
+
602
616
  async def watch_order_book_for_symbols(self, symbols: List[str], limit: Int = None, params={}) -> OrderBook:
603
617
  """
604
618
  :see: https://www.kucoin.com/docs/websocket/spot-trading/public-channels/level1-bbo-market-data
@@ -644,6 +658,45 @@ class kucoin(ccxt.async_support.kucoin):
644
658
  orderbook = await self.subscribe_multiple(url, messageHashes, topic, subscriptionHashes, params, subscription)
645
659
  return orderbook.limit()
646
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
+
647
700
  def handle_order_book(self, client: Client, message):
648
701
  #
649
702
  # initial snapshot is fetched with ccxt's fetchOrderBook
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.97
3
+ Version: 4.4.1
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.97/dist/ccxt.browser.min.js
276
- * unpkg: https://unpkg.com/ccxt@4.3.97/dist/ccxt.browser.min.js
275
+ * jsDelivr: https://cdn.jsdelivr.net/npm/ccxt@4.4.1/dist/ccxt.browser.min.js
276
+ * unpkg: https://unpkg.com/ccxt@4.4.1/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.97/dist/ccxt.browser.min.js"></script>
281
+ <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/ccxt@4.4.1/dist/ccxt.browser.min.js"></script>
282
282
  ```
283
283
 
284
284
  Creates a global `ccxt` object:
@@ -1,4 +1,4 @@
1
- ccxt/__init__.py,sha256=kpYw9B4E5ksqx39E5OpUQX7kxtQCdfCcPA7ovtP9Ka8,16486
1
+ ccxt/__init__.py,sha256=5pHLDRlvaWLCFdbq7IcJkXl4oSrToseJYYQgHPgYGY4,16485
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
@@ -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=GfD-EFU6ADutFKjgktMSCZzvQKKU6GnA5dZ30aQMSI4,425029
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
@@ -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=aLBLALozzREVkdc3UORV4b__lX_-rMn9XCgje5yWsqs,327757
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,7 +218,7 @@ 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=KePoEzOs1lPbGIfbYtCeGGidsTP00wmODPSW_L92Yog,16289
221
+ ccxt/async_support/__init__.py,sha256=Q88aJ0ejcU-nzNbtBrdSXkovgDeDJFd-uNn8nAkVbqw,16288
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
@@ -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=eefVDqYPND5EIPAKoNBe2KnCck2nrVOt0piRggcCF9A,426653
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
@@ -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=KhWrVg1sy-R_ycPNGPYBYWhvtH_jTsMvL23oFiUNXXM,329488
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=Z5NWBh-Y8mBiHecmZXh-brYALoWdLzzoFmGm4_pvOsg,110678
333
+ ccxt/async_support/base/exchange.py,sha256=K_idMkctnhYOPoxHd3YOM0IXMgqf57UZLyx3dluAkAs,110677
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=CK7KRGBpym1C3eOfJPJVZzzwrclrWOUQRP4ZtrulvtU,295943
347
+ ccxt/base/exchange.py,sha256=wkgTfVaUfH9xmF6rrdYYXCd8FRLNVVrHov4k6MxNpa4,295942
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=wN1_kV6w3gXi2N9MmQzZaj3REboBkGrcvY55-2SpXf8,7710
350
+ ccxt/pro/__init__.py,sha256=aZkmQpsvZhvjzQFJe-1vFXu2hsuwOBLmJ7m2SSxEA28,7709
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
@@ -391,12 +391,12 @@ ccxt/pro/hollaex.py,sha256=la302Z6BMjcqZQhTaj4PQXSfhgFH6m7o3u7Ts5JkHbY,22045
391
391
  ccxt/pro/htx.py,sha256=mt-Bh5U6W6MRrpPp5xm6ayhkIcdaS8YCczczw9_1yx4,96329
392
392
  ccxt/pro/huobi.py,sha256=rKZVgYqEr-MmZzTqAk4FoJt8qWFjCi_FY0ci_mWZrL0,385
393
393
  ccxt/pro/huobijp.py,sha256=urnktXqCIJTccup0oQJPJsM32XR09dDP6qGP1kvBtfg,23318
394
- ccxt/pro/hyperliquid.py,sha256=B-bV58Jw20AL4C2LGaj11cPp3osZRRr3T5WjfPXwc5Y,32500
394
+ ccxt/pro/hyperliquid.py,sha256=GsRiT5cRUuB1e8XQN_ZByyEwJcVHpmW3h_QfjjJ4cS8,42727
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=v1a4ksoQCHj1fht_ENJ6OASFbW4AJ3asMw_8DuiWDsI,59505
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.97.dist-info/LICENSE.txt,sha256=EIb9221AhMHV7xF1_55STFdKTFsnJVJYkRpY2Lnvo5w,1068
654
- ccxt-4.3.97.dist-info/METADATA,sha256=COjpy0vFMszTHCx1mtiBsV_ig1uyTPq3BaMhi8J34qo,118342
655
- ccxt-4.3.97.dist-info/WHEEL,sha256=z9j0xAa_JmUKMpmz72K0ZGALSM_n-wQVmGbleXx2VHg,110
656
- ccxt-4.3.97.dist-info/top_level.txt,sha256=CkQDuCTDKNcImPV60t36G6MdYfxsAPNiSaEwifVoVMo,5
657
- ccxt-4.3.97.dist-info/RECORD,,
653
+ ccxt-4.4.1.dist-info/LICENSE.txt,sha256=EIb9221AhMHV7xF1_55STFdKTFsnJVJYkRpY2Lnvo5w,1068
654
+ ccxt-4.4.1.dist-info/METADATA,sha256=BjmN7DRZXUy6jvG-hZW2OdMVkgTOeyIv5NEabbvY32U,118338
655
+ ccxt-4.4.1.dist-info/WHEEL,sha256=z9j0xAa_JmUKMpmz72K0ZGALSM_n-wQVmGbleXx2VHg,110
656
+ ccxt-4.4.1.dist-info/top_level.txt,sha256=CkQDuCTDKNcImPV60t36G6MdYfxsAPNiSaEwifVoVMo,5
657
+ ccxt-4.4.1.dist-info/RECORD,,
File without changes