ccxt 4.3.64__py2.py3-none-any.whl → 4.3.66__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.64'
25
+ __version__ = '4.3.66'
26
26
 
27
27
  # ----------------------------------------------------------------------------
28
28
 
@@ -4,7 +4,7 @@
4
4
 
5
5
  # -----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.3.64'
7
+ __version__ = '4.3.66'
8
8
 
9
9
  # -----------------------------------------------------------------------------
10
10
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  # -----------------------------------------------------------------------------
4
4
 
5
- __version__ = '4.3.64'
5
+ __version__ = '4.3.66'
6
6
 
7
7
  # -----------------------------------------------------------------------------
8
8
 
@@ -4,6 +4,7 @@ import asyncio
4
4
  import socket
5
5
  import collections
6
6
  from ccxt.async_support.base.ws.aiohttp_client import AiohttpClient
7
+ from ccxt.base.errors import NetworkError
7
8
 
8
9
 
9
10
  class FastClient(AiohttpClient):
@@ -38,7 +39,7 @@ class FastClient(AiohttpClient):
38
39
  if self.connection._close_code == 1000: # OK close
39
40
  self.on_close(1000)
40
41
  else:
41
- self.on_error(1006) # ABNORMAL_CLOSURE
42
+ self.on_error(NetworkError("Abnormal closure of client")) # ABNORMAL_CLOSURE
42
43
 
43
44
  def wrapper(func):
44
45
  def parse_frame(buf):
@@ -7,11 +7,22 @@ class Future(asyncio.Future):
7
7
 
8
8
  def resolve(self, result=None):
9
9
  if not self.done():
10
- self.set_result(result)
10
+ try:
11
+ self.set_result(result)
12
+ except BaseException as e:
13
+ print("Error in Future.resolve")
14
+ raise e
11
15
 
12
16
  def reject(self, error=None):
13
17
  if not self.done():
14
- self.set_exception(error)
18
+ # If not an exception, wrap it in a generic Exception
19
+ if not isinstance(error, BaseException):
20
+ error = Exception(error)
21
+ try:
22
+ self.set_exception(error)
23
+ except BaseException as e:
24
+ print("Error in Future.reject")
25
+ raise e
15
26
 
16
27
  @classmethod
17
28
  def race(cls, futures):
@@ -2914,7 +2914,7 @@ class bybit(Exchange, ImplicitAPI):
2914
2914
  :see: https://bybit-exchange.github.io/docs/v5/asset/all-balance
2915
2915
  :see: https://bybit-exchange.github.io/docs/v5/account/wallet-balance
2916
2916
  :param dict [params]: extra parameters specific to the exchange API endpoint
2917
- :param str [params.type]: wallet type, ['spot', 'swap', 'fund']
2917
+ :param str [params.type]: wallet type, ['spot', 'swap', 'funding']
2918
2918
  :returns dict: a `balance structure <https://docs.ccxt.com/#/?id=balance-structure>`
2919
2919
  """
2920
2920
  await self.load_markets()
@@ -2922,10 +2922,17 @@ class bybit(Exchange, ImplicitAPI):
2922
2922
  enableUnifiedMargin, enableUnifiedAccount = await self.is_unified_enabled()
2923
2923
  isUnifiedAccount = (enableUnifiedMargin or enableUnifiedAccount)
2924
2924
  type = None
2925
- type, params = self.get_bybit_type('fetchBalance', None, params)
2925
+ # don't use getBybitType here
2926
+ type, params = self.handle_market_type_and_params('fetchBalance', None, params)
2927
+ subType = None
2928
+ subType, params = self.handle_sub_type_and_params('fetchBalance', None, params)
2929
+ if (type == 'swap') or (type == 'future'):
2930
+ type = subType
2931
+ lowercaseRawType = type.lower() if (type is not None) else None
2926
2932
  isSpot = (type == 'spot')
2927
2933
  isLinear = (type == 'linear')
2928
2934
  isInverse = (type == 'inverse')
2935
+ isFunding = (lowercaseRawType == 'fund') or (lowercaseRawType == 'funding')
2929
2936
  if isUnifiedAccount:
2930
2937
  if isInverse:
2931
2938
  type = 'contract'
@@ -2941,10 +2948,10 @@ class bybit(Exchange, ImplicitAPI):
2941
2948
  response = None
2942
2949
  if isSpot and (marginMode is not None):
2943
2950
  response = await self.privateGetV5SpotCrossMarginTradeAccount(self.extend(request, params))
2944
- elif unifiedType == 'FUND':
2951
+ elif isFunding:
2945
2952
  # use self endpoint only we have no other choice
2946
2953
  # because it requires transfer permission
2947
- request['accountType'] = unifiedType
2954
+ request['accountType'] = 'FUND'
2948
2955
  response = await self.privateGetV5AssetTransferQueryAccountCoinsBalance(self.extend(request, params))
2949
2956
  else:
2950
2957
  request['accountType'] = unifiedType
@@ -6,7 +6,7 @@
6
6
  from ccxt.async_support.base.exchange import Exchange
7
7
  from ccxt.abstract.hyperliquid import ImplicitAPI
8
8
  import asyncio
9
- from ccxt.base.types import Balances, Currencies, Currency, Int, MarginModification, Market, Num, Order, OrderBook, OrderRequest, CancellationRequest, OrderSide, OrderType, Str, Strings, Trade, TradingFeeInterface, Transaction, TransferEntry
9
+ from ccxt.base.types import Balances, Currencies, Currency, Int, MarginModification, Market, Num, Order, OrderBook, OrderRequest, CancellationRequest, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, TradingFeeInterface, Transaction, TransferEntry
10
10
  from typing import List
11
11
  from ccxt.base.errors import ExchangeError
12
12
  from ccxt.base.errors import ArgumentsRequired
@@ -102,8 +102,8 @@ class hyperliquid(Exchange, ImplicitAPI):
102
102
  'fetchPositions': True,
103
103
  'fetchPositionsRisk': False,
104
104
  'fetchPremiumIndexOHLCV': False,
105
- 'fetchTicker': False,
106
- 'fetchTickers': False,
105
+ 'fetchTicker': 'emulated',
106
+ 'fetchTickers': True,
107
107
  'fetchTime': False,
108
108
  'fetchTrades': True,
109
109
  'fetchTradingFee': True,
@@ -328,12 +328,12 @@ class hyperliquid(Exchange, ImplicitAPI):
328
328
  #
329
329
  #
330
330
  meta = self.safe_dict(response, 0, {})
331
- meta = self.safe_list(meta, 'universe', [])
331
+ universe = self.safe_list(meta, 'universe', [])
332
332
  assetCtxs = self.safe_dict(response, 1, {})
333
333
  result = []
334
- for i in range(0, len(meta)):
334
+ for i in range(0, len(universe)):
335
335
  data = self.extend(
336
- self.safe_dict(meta, i, {}),
336
+ self.safe_dict(universe, i, {}),
337
337
  self.safe_dict(assetCtxs, i, {})
338
338
  )
339
339
  data['baseId'] = i
@@ -447,11 +447,13 @@ class hyperliquid(Exchange, ImplicitAPI):
447
447
  #
448
448
  # response differs depending on the environment(mainnet vs sandbox)
449
449
  first = self.safe_dict(response, 0, {})
450
+ second = self.safe_list(response, 1, [])
450
451
  meta = self.safe_list_2(first, 'universe', 'spot_infos', [])
451
452
  tokens = self.safe_list_2(first, 'tokens', 'token_infos', [])
452
453
  markets = []
453
454
  for i in range(0, len(meta)):
454
455
  market = self.safe_dict(meta, i, {})
456
+ extraData = self.safe_dict(second, i, {})
455
457
  marketName = self.safe_string(market, 'name')
456
458
  # if marketName.find('/') < 0:
457
459
  # # there are some weird spot markets in testnet, eg @2
@@ -528,7 +530,7 @@ class hyperliquid(Exchange, ImplicitAPI):
528
530
  },
529
531
  },
530
532
  'created': None,
531
- 'info': market,
533
+ 'info': self.extend(extraData, market),
532
534
  }))
533
535
  return markets
534
536
 
@@ -747,6 +749,57 @@ class hyperliquid(Exchange, ImplicitAPI):
747
749
  timestamp = self.safe_integer(response, 'time')
748
750
  return self.parse_order_book(result, market['symbol'], timestamp, 'bids', 'asks', 'px', 'sz')
749
751
 
752
+ async def fetch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
753
+ """
754
+ fetches price tickers for multiple markets, statistical information calculated over the past 24 hours for each market
755
+ :see: https://www.bitmex.com/api/explorer/#not /Instrument/Instrument_getActiveAndIndices
756
+ :param str[]|None symbols: unified symbols of the markets to fetch the ticker for, all market tickers are returned if not assigned
757
+ :param dict [params]: extra parameters specific to the exchange API endpoint
758
+ :returns dict: a dictionary of `ticker structures <https://docs.ccxt.com/#/?id=ticker-structure>`
759
+ """
760
+ await self.load_markets()
761
+ symbols = self.market_symbols(symbols)
762
+ # at self stage, to get tickers data, we use fetchMarkets endpoints
763
+ response = await self.fetch_markets(params)
764
+ # same response "fetchMarkets"
765
+ result: dict = {}
766
+ for i in range(0, len(response)):
767
+ market = response[i]
768
+ info = market['info']
769
+ ticker = self.parse_ticker(info, market)
770
+ symbol = self.safe_string(ticker, 'symbol')
771
+ result[symbol] = ticker
772
+ return self.filter_by_array_tickers(result, 'symbol', symbols)
773
+
774
+ def parse_ticker(self, ticker: dict, market: Market = None) -> Ticker:
775
+ #
776
+ # {
777
+ # "prevDayPx": "3400.5",
778
+ # "dayNtlVlm": "511297257.47936022",
779
+ # "markPx": "3464.7",
780
+ # "midPx": "3465.05",
781
+ # "oraclePx": "3460.1", # only in swap
782
+ # "openInterest": "64638.1108", # only in swap
783
+ # "premium": "0.00141614", # only in swap
784
+ # "funding": "0.00008727", # only in swap
785
+ # "impactPxs": ["3465.0", "3465.1"], # only in swap
786
+ # "coin": "PURR", # only in spot
787
+ # "circulatingSupply": "998949190.03400207", # only in spot
788
+ # },
789
+ #
790
+ bidAsk = self.safe_list(ticker, 'impactPxs')
791
+ return self.safe_ticker({
792
+ 'symbol': market['symbol'],
793
+ 'timestamp': None,
794
+ 'datetime': None,
795
+ 'previousClose': self.safe_number(ticker, 'prevDayPx'),
796
+ 'close': self.safe_number(ticker, 'midPx'),
797
+ 'bid': self.safe_number(bidAsk, 0),
798
+ 'ask': self.safe_number(bidAsk, 1),
799
+ 'quoteVolume': self.safe_number(ticker, 'dayNtlVlm'),
800
+ 'info': ticker,
801
+ }, market)
802
+
750
803
  async def fetch_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}) -> List[list]:
751
804
  """
752
805
  fetches historical candlestick data containing the open, high, low, and close price, and the volume of a market
@@ -98,6 +98,7 @@ class kraken(Exchange, ImplicitAPI):
98
98
  'fetchOrderTrades': 'emulated',
99
99
  'fetchPositions': True,
100
100
  'fetchPremiumIndexOHLCV': False,
101
+ 'fetchStatus': True,
101
102
  'fetchTicker': True,
102
103
  'fetchTickers': True,
103
104
  'fetchTime': True,
@@ -645,6 +646,30 @@ class kraken(Exchange, ImplicitAPI):
645
646
  result.append(self.extend(defaults, markets[i]))
646
647
  return result
647
648
 
649
+ async def fetch_status(self, params={}):
650
+ """
651
+ the latest known information on the availability of the exchange API
652
+ :see: https://docs.kraken.com/api/docs/rest-api/get-system-status/
653
+ :param dict [params]: extra parameters specific to the exchange API endpoint
654
+ :returns dict: a `status structure <https://docs.ccxt.com/#/?id=exchange-status-structure>`
655
+ """
656
+ response = await self.publicGetSystemStatus(params)
657
+ #
658
+ # {
659
+ # error: [],
660
+ # result: {status: 'online', timestamp: '2024-07-22T16:34:44Z'}
661
+ # }
662
+ #
663
+ result = self.safe_dict(response, 'result')
664
+ statusRaw = self.safe_string(result, 'status')
665
+ return {
666
+ 'status': 'ok' if (statusRaw == 'online') else 'maintenance',
667
+ 'updated': None,
668
+ 'eta': None,
669
+ 'url': None,
670
+ 'info': response,
671
+ }
672
+
648
673
  async def fetch_currencies(self, params={}) -> Currencies:
649
674
  """
650
675
  fetches all available currencies on an exchange
ccxt/base/exchange.py CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  # -----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.3.64'
7
+ __version__ = '4.3.66'
8
8
 
9
9
  # -----------------------------------------------------------------------------
10
10
 
ccxt/bybit.py CHANGED
@@ -2913,7 +2913,7 @@ class bybit(Exchange, ImplicitAPI):
2913
2913
  :see: https://bybit-exchange.github.io/docs/v5/asset/all-balance
2914
2914
  :see: https://bybit-exchange.github.io/docs/v5/account/wallet-balance
2915
2915
  :param dict [params]: extra parameters specific to the exchange API endpoint
2916
- :param str [params.type]: wallet type, ['spot', 'swap', 'fund']
2916
+ :param str [params.type]: wallet type, ['spot', 'swap', 'funding']
2917
2917
  :returns dict: a `balance structure <https://docs.ccxt.com/#/?id=balance-structure>`
2918
2918
  """
2919
2919
  self.load_markets()
@@ -2921,10 +2921,17 @@ class bybit(Exchange, ImplicitAPI):
2921
2921
  enableUnifiedMargin, enableUnifiedAccount = self.is_unified_enabled()
2922
2922
  isUnifiedAccount = (enableUnifiedMargin or enableUnifiedAccount)
2923
2923
  type = None
2924
- type, params = self.get_bybit_type('fetchBalance', None, params)
2924
+ # don't use getBybitType here
2925
+ type, params = self.handle_market_type_and_params('fetchBalance', None, params)
2926
+ subType = None
2927
+ subType, params = self.handle_sub_type_and_params('fetchBalance', None, params)
2928
+ if (type == 'swap') or (type == 'future'):
2929
+ type = subType
2930
+ lowercaseRawType = type.lower() if (type is not None) else None
2925
2931
  isSpot = (type == 'spot')
2926
2932
  isLinear = (type == 'linear')
2927
2933
  isInverse = (type == 'inverse')
2934
+ isFunding = (lowercaseRawType == 'fund') or (lowercaseRawType == 'funding')
2928
2935
  if isUnifiedAccount:
2929
2936
  if isInverse:
2930
2937
  type = 'contract'
@@ -2940,10 +2947,10 @@ class bybit(Exchange, ImplicitAPI):
2940
2947
  response = None
2941
2948
  if isSpot and (marginMode is not None):
2942
2949
  response = self.privateGetV5SpotCrossMarginTradeAccount(self.extend(request, params))
2943
- elif unifiedType == 'FUND':
2950
+ elif isFunding:
2944
2951
  # use self endpoint only we have no other choice
2945
2952
  # because it requires transfer permission
2946
- request['accountType'] = unifiedType
2953
+ request['accountType'] = 'FUND'
2947
2954
  response = self.privateGetV5AssetTransferQueryAccountCoinsBalance(self.extend(request, params))
2948
2955
  else:
2949
2956
  request['accountType'] = unifiedType
ccxt/hyperliquid.py CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  from ccxt.base.exchange import Exchange
7
7
  from ccxt.abstract.hyperliquid import ImplicitAPI
8
- from ccxt.base.types import Balances, Currencies, Currency, Int, MarginModification, Market, Num, Order, OrderBook, OrderRequest, CancellationRequest, OrderSide, OrderType, Str, Strings, Trade, TradingFeeInterface, Transaction, TransferEntry
8
+ from ccxt.base.types import Balances, Currencies, Currency, Int, MarginModification, Market, Num, Order, OrderBook, OrderRequest, CancellationRequest, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, TradingFeeInterface, Transaction, TransferEntry
9
9
  from typing import List
10
10
  from ccxt.base.errors import ExchangeError
11
11
  from ccxt.base.errors import ArgumentsRequired
@@ -101,8 +101,8 @@ class hyperliquid(Exchange, ImplicitAPI):
101
101
  'fetchPositions': True,
102
102
  'fetchPositionsRisk': False,
103
103
  'fetchPremiumIndexOHLCV': False,
104
- 'fetchTicker': False,
105
- 'fetchTickers': False,
104
+ 'fetchTicker': 'emulated',
105
+ 'fetchTickers': True,
106
106
  'fetchTime': False,
107
107
  'fetchTrades': True,
108
108
  'fetchTradingFee': True,
@@ -327,12 +327,12 @@ class hyperliquid(Exchange, ImplicitAPI):
327
327
  #
328
328
  #
329
329
  meta = self.safe_dict(response, 0, {})
330
- meta = self.safe_list(meta, 'universe', [])
330
+ universe = self.safe_list(meta, 'universe', [])
331
331
  assetCtxs = self.safe_dict(response, 1, {})
332
332
  result = []
333
- for i in range(0, len(meta)):
333
+ for i in range(0, len(universe)):
334
334
  data = self.extend(
335
- self.safe_dict(meta, i, {}),
335
+ self.safe_dict(universe, i, {}),
336
336
  self.safe_dict(assetCtxs, i, {})
337
337
  )
338
338
  data['baseId'] = i
@@ -446,11 +446,13 @@ class hyperliquid(Exchange, ImplicitAPI):
446
446
  #
447
447
  # response differs depending on the environment(mainnet vs sandbox)
448
448
  first = self.safe_dict(response, 0, {})
449
+ second = self.safe_list(response, 1, [])
449
450
  meta = self.safe_list_2(first, 'universe', 'spot_infos', [])
450
451
  tokens = self.safe_list_2(first, 'tokens', 'token_infos', [])
451
452
  markets = []
452
453
  for i in range(0, len(meta)):
453
454
  market = self.safe_dict(meta, i, {})
455
+ extraData = self.safe_dict(second, i, {})
454
456
  marketName = self.safe_string(market, 'name')
455
457
  # if marketName.find('/') < 0:
456
458
  # # there are some weird spot markets in testnet, eg @2
@@ -527,7 +529,7 @@ class hyperliquid(Exchange, ImplicitAPI):
527
529
  },
528
530
  },
529
531
  'created': None,
530
- 'info': market,
532
+ 'info': self.extend(extraData, market),
531
533
  }))
532
534
  return markets
533
535
 
@@ -746,6 +748,57 @@ class hyperliquid(Exchange, ImplicitAPI):
746
748
  timestamp = self.safe_integer(response, 'time')
747
749
  return self.parse_order_book(result, market['symbol'], timestamp, 'bids', 'asks', 'px', 'sz')
748
750
 
751
+ def fetch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
752
+ """
753
+ fetches price tickers for multiple markets, statistical information calculated over the past 24 hours for each market
754
+ :see: https://www.bitmex.com/api/explorer/#not /Instrument/Instrument_getActiveAndIndices
755
+ :param str[]|None symbols: unified symbols of the markets to fetch the ticker for, all market tickers are returned if not assigned
756
+ :param dict [params]: extra parameters specific to the exchange API endpoint
757
+ :returns dict: a dictionary of `ticker structures <https://docs.ccxt.com/#/?id=ticker-structure>`
758
+ """
759
+ self.load_markets()
760
+ symbols = self.market_symbols(symbols)
761
+ # at self stage, to get tickers data, we use fetchMarkets endpoints
762
+ response = self.fetch_markets(params)
763
+ # same response "fetchMarkets"
764
+ result: dict = {}
765
+ for i in range(0, len(response)):
766
+ market = response[i]
767
+ info = market['info']
768
+ ticker = self.parse_ticker(info, market)
769
+ symbol = self.safe_string(ticker, 'symbol')
770
+ result[symbol] = ticker
771
+ return self.filter_by_array_tickers(result, 'symbol', symbols)
772
+
773
+ def parse_ticker(self, ticker: dict, market: Market = None) -> Ticker:
774
+ #
775
+ # {
776
+ # "prevDayPx": "3400.5",
777
+ # "dayNtlVlm": "511297257.47936022",
778
+ # "markPx": "3464.7",
779
+ # "midPx": "3465.05",
780
+ # "oraclePx": "3460.1", # only in swap
781
+ # "openInterest": "64638.1108", # only in swap
782
+ # "premium": "0.00141614", # only in swap
783
+ # "funding": "0.00008727", # only in swap
784
+ # "impactPxs": ["3465.0", "3465.1"], # only in swap
785
+ # "coin": "PURR", # only in spot
786
+ # "circulatingSupply": "998949190.03400207", # only in spot
787
+ # },
788
+ #
789
+ bidAsk = self.safe_list(ticker, 'impactPxs')
790
+ return self.safe_ticker({
791
+ 'symbol': market['symbol'],
792
+ 'timestamp': None,
793
+ 'datetime': None,
794
+ 'previousClose': self.safe_number(ticker, 'prevDayPx'),
795
+ 'close': self.safe_number(ticker, 'midPx'),
796
+ 'bid': self.safe_number(bidAsk, 0),
797
+ 'ask': self.safe_number(bidAsk, 1),
798
+ 'quoteVolume': self.safe_number(ticker, 'dayNtlVlm'),
799
+ 'info': ticker,
800
+ }, market)
801
+
749
802
  def fetch_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}) -> List[list]:
750
803
  """
751
804
  fetches historical candlestick data containing the open, high, low, and close price, and the volume of a market
ccxt/kraken.py CHANGED
@@ -98,6 +98,7 @@ class kraken(Exchange, ImplicitAPI):
98
98
  'fetchOrderTrades': 'emulated',
99
99
  'fetchPositions': True,
100
100
  'fetchPremiumIndexOHLCV': False,
101
+ 'fetchStatus': True,
101
102
  'fetchTicker': True,
102
103
  'fetchTickers': True,
103
104
  'fetchTime': True,
@@ -645,6 +646,30 @@ class kraken(Exchange, ImplicitAPI):
645
646
  result.append(self.extend(defaults, markets[i]))
646
647
  return result
647
648
 
649
+ def fetch_status(self, params={}):
650
+ """
651
+ the latest known information on the availability of the exchange API
652
+ :see: https://docs.kraken.com/api/docs/rest-api/get-system-status/
653
+ :param dict [params]: extra parameters specific to the exchange API endpoint
654
+ :returns dict: a `status structure <https://docs.ccxt.com/#/?id=exchange-status-structure>`
655
+ """
656
+ response = self.publicGetSystemStatus(params)
657
+ #
658
+ # {
659
+ # error: [],
660
+ # result: {status: 'online', timestamp: '2024-07-22T16:34:44Z'}
661
+ # }
662
+ #
663
+ result = self.safe_dict(response, 'result')
664
+ statusRaw = self.safe_string(result, 'status')
665
+ return {
666
+ 'status': 'ok' if (statusRaw == 'online') else 'maintenance',
667
+ 'updated': None,
668
+ 'eta': None,
669
+ 'url': None,
670
+ 'info': response,
671
+ }
672
+
648
673
  def fetch_currencies(self, params={}) -> Currencies:
649
674
  """
650
675
  fetches all available currencies on an exchange
ccxt/pro/__init__.py CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  # ----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.3.64'
7
+ __version__ = '4.3.66'
8
8
 
9
9
  # ----------------------------------------------------------------------------
10
10
 
ccxt/pro/hyperliquid.py CHANGED
@@ -5,7 +5,7 @@
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 Int, Market, Order, OrderBook, Str, Trade
8
+ from ccxt.base.types import Int, Market, 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
11
  from ccxt.base.errors import ExchangeError
@@ -23,7 +23,7 @@ class hyperliquid(ccxt.async_support.hyperliquid):
23
23
  'watchOrderBook': True,
24
24
  'watchOrders': True,
25
25
  'watchTicker': False,
26
- 'watchTickers': False,
26
+ 'watchTickers': True,
27
27
  'watchTrades': True,
28
28
  'watchPosition': False,
29
29
  },
@@ -123,6 +123,29 @@ class hyperliquid(ccxt.async_support.hyperliquid):
123
123
  messageHash = 'orderbook:' + symbol
124
124
  client.resolve(orderbook, messageHash)
125
125
 
126
+ async def watch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
127
+ """
128
+ watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for all markets of a specific list
129
+ :param str[] symbols: unified symbol of the market to fetch the ticker for
130
+ :param dict [params]: extra parameters specific to the exchange API endpoint
131
+ :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
132
+ """
133
+ await self.load_markets()
134
+ symbols = self.market_symbols(symbols, None, True)
135
+ messageHash = 'tickers'
136
+ url = self.urls['api']['ws']['public']
137
+ request: dict = {
138
+ 'method': 'subscribe',
139
+ 'subscription': {
140
+ 'type': 'webData2', # allMids
141
+ 'user': '0x0000000000000000000000000000000000000000',
142
+ },
143
+ }
144
+ tickers = await self.watch(url, messageHash, self.extend(request, params), messageHash)
145
+ if self.newUpdates:
146
+ return self.filter_by_array_tickers(tickers, 'symbol', symbols)
147
+ return self.tickers
148
+
126
149
  async def watch_my_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
127
150
  """
128
151
  watches information on multiple trades made by the user
@@ -154,6 +177,82 @@ class hyperliquid(ccxt.async_support.hyperliquid):
154
177
  limit = trades.getLimit(symbol, limit)
155
178
  return self.filter_by_symbol_since_limit(trades, symbol, since, limit, True)
156
179
 
180
+ def handle_ws_tickers(self, client: Client, message):
181
+ #
182
+ # {
183
+ # "channel": "webData2",
184
+ # "data": {
185
+ # "meta": {
186
+ # "universe": [
187
+ # {
188
+ # "szDecimals": 5,
189
+ # "name": "BTC",
190
+ # "maxLeverage": 50,
191
+ # "onlyIsolated": False
192
+ # },
193
+ # ...
194
+ # ],
195
+ # },
196
+ # "assetCtxs": [
197
+ # {
198
+ # "funding": "0.00003005",
199
+ # "openInterest": "2311.50778",
200
+ # "prevDayPx": "63475.0",
201
+ # "dayNtlVlm": "468043329.64289033",
202
+ # "premium": "0.00094264",
203
+ # "oraclePx": "64712.0",
204
+ # "markPx": "64774.0",
205
+ # "midPx": "64773.5",
206
+ # "impactPxs": [
207
+ # "64773.0",
208
+ # "64774.0"
209
+ # ]
210
+ # },
211
+ # ...
212
+ # ],
213
+ # "spotAssetCtxs": [
214
+ # {
215
+ # "prevDayPx": "0.20937",
216
+ # "dayNtlVlm": "11188888.61984999",
217
+ # "markPx": "0.19722",
218
+ # "midPx": "0.197145",
219
+ # "circulatingSupply": "598760557.12072003",
220
+ # "coin": "PURR/USDC"
221
+ # },
222
+ # ...
223
+ # ],
224
+ # }
225
+ # }
226
+ #
227
+ # spot
228
+ rawData = self.safe_dict(message, 'data', {})
229
+ spotAssets = self.safe_list(rawData, 'spotAssetCtxs', [])
230
+ parsedTickers = []
231
+ for i in range(0, len(spotAssets)):
232
+ assetObject = spotAssets[i]
233
+ marketId = self.safe_string(assetObject, 'coin')
234
+ market = self.safe_market(marketId, None, None, 'spot')
235
+ ticker = self.parse_ws_ticker(assetObject, market)
236
+ parsedTickers.append(ticker)
237
+ # perpetuals
238
+ meta = self.safe_dict(rawData, 'meta', {})
239
+ universe = self.safe_list(meta, 'universe', [])
240
+ assetCtxs = self.safe_list(rawData, 'assetCtxs', [])
241
+ for i in range(0, len(universe)):
242
+ data = self.extend(
243
+ self.safe_dict(universe, i, {}),
244
+ self.safe_dict(assetCtxs, i, {})
245
+ )
246
+ id = data['name'] + '/USDC:USDC'
247
+ market = self.safe_market(id, None, None, 'swap')
248
+ ticker = self.parse_ws_ticker(data, market)
249
+ parsedTickers.append(ticker)
250
+ tickers = self.index_by(parsedTickers, 'symbol')
251
+ client.resolve(tickers, 'tickers')
252
+
253
+ def parse_ws_ticker(self, rawTicker, market: Market = None) -> Ticker:
254
+ return self.parse_ticker(rawTicker, market)
255
+
157
256
  def handle_my_trades(self, client: Client, message):
158
257
  #
159
258
  # {
@@ -497,6 +596,7 @@ class hyperliquid(ccxt.async_support.hyperliquid):
497
596
  'candle': self.handle_ohlcv,
498
597
  'orderUpdates': self.handle_order,
499
598
  'userFills': self.handle_my_trades,
599
+ 'webData2': self.handle_ws_tickers,
500
600
  }
501
601
  exacMethod = self.safe_value(methods, topic)
502
602
  if exacMethod is not None:
ccxt/pro/okx.py CHANGED
@@ -1528,7 +1528,7 @@ class okx(ccxt.async_support.okx):
1528
1528
  await self.load_markets()
1529
1529
  await self.authenticate()
1530
1530
  url = self.get_url('private', 'private')
1531
- messageHash = str(self.nonce())
1531
+ messageHash = str(self.milliseconds())
1532
1532
  op = None
1533
1533
  op, params = self.handle_option_and_params(params, 'createOrderWs', 'op', 'batch-orders')
1534
1534
  args = self.create_order_request(symbol, type, side, amount, price, params)
@@ -1593,7 +1593,7 @@ class okx(ccxt.async_support.okx):
1593
1593
  await self.load_markets()
1594
1594
  await self.authenticate()
1595
1595
  url = self.get_url('private', 'private')
1596
- messageHash = str(self.nonce())
1596
+ messageHash = str(self.milliseconds())
1597
1597
  op = None
1598
1598
  op, params = self.handle_option_and_params(params, 'editOrderWs', 'op', 'amend-order')
1599
1599
  args = self.edit_order_request(id, symbol, type, side, amount, price, params)
@@ -1619,7 +1619,7 @@ class okx(ccxt.async_support.okx):
1619
1619
  await self.load_markets()
1620
1620
  await self.authenticate()
1621
1621
  url = self.get_url('private', 'private')
1622
- messageHash = str(self.nonce())
1622
+ messageHash = str(self.milliseconds())
1623
1623
  clientOrderId = self.safe_string_2(params, 'clOrdId', 'clientOrderId')
1624
1624
  params = self.omit(params, ['clientOrderId', 'clOrdId'])
1625
1625
  arg: dict = {
@@ -1653,7 +1653,7 @@ class okx(ccxt.async_support.okx):
1653
1653
  await self.load_markets()
1654
1654
  await self.authenticate()
1655
1655
  url = self.get_url('private', 'private')
1656
- messageHash = str(self.nonce())
1656
+ messageHash = str(self.milliseconds())
1657
1657
  args = []
1658
1658
  for i in range(0, idsLength):
1659
1659
  arg: dict = {
@@ -1684,7 +1684,7 @@ class okx(ccxt.async_support.okx):
1684
1684
  if market['type'] != 'option':
1685
1685
  raise BadRequest(self.id + 'cancelAllOrdersWs is only applicable to Option in Portfolio Margin mode, and MMP privilege is required.')
1686
1686
  url = self.get_url('private', 'private')
1687
- messageHash = str(self.nonce())
1687
+ messageHash = str(self.milliseconds())
1688
1688
  request: dict = {
1689
1689
  'id': messageHash,
1690
1690
  'op': 'mass-cancel',
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ccxt
3
- Version: 4.3.64
3
+ Version: 4.3.66
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
@@ -70,6 +70,7 @@ Current feature list:
70
70
 
71
71
 
72
72
  ## Sponsored Promotion
73
+ [![bingx-campaign](https://github.com/user-attachments/assets/374fd5de-7d70-4281-85aa-d827afeb7270)](https://bingx.com/en/act/contestNew/7947320527/)
73
74
 
74
75
  ## See Also
75
76
 
@@ -268,13 +269,13 @@ console.log(version, Object.keys(exchanges));
268
269
 
269
270
  All-in-one browser bundle (dependencies included), served from a CDN of your choice:
270
271
 
271
- * jsDelivr: https://cdn.jsdelivr.net/npm/ccxt@4.3.64/dist/ccxt.browser.min.js
272
- * unpkg: https://unpkg.com/ccxt@4.3.64/dist/ccxt.browser.min.js
272
+ * jsDelivr: https://cdn.jsdelivr.net/npm/ccxt@4.3.66/dist/ccxt.browser.min.js
273
+ * unpkg: https://unpkg.com/ccxt@4.3.66/dist/ccxt.browser.min.js
273
274
 
274
275
  CDNs are not updated in real-time and may have delays. Defaulting to the most recent version without specifying the version number is not recommended. Please, keep in mind that we are not responsible for the correct operation of those CDN servers.
275
276
 
276
277
  ```HTML
277
- <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/ccxt@4.3.64/dist/ccxt.browser.min.js"></script>
278
+ <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/ccxt@4.3.66/dist/ccxt.browser.min.js"></script>
278
279
  ```
279
280
 
280
281
  Creates a global `ccxt` object:
@@ -1,4 +1,4 @@
1
- ccxt/__init__.py,sha256=2XaoezxZ_uLla9cINzsK_13PDQaS4qF5DW9pIpR6neA,16319
1
+ ccxt/__init__.py,sha256=LGQdAkrx1kgOTDieoPSs5bhxzjZwlzBK7yjhyU4W-jA,16319
2
2
  ccxt/ace.py,sha256=5DwQ9rmdDCRh-l-65Mi2Ei_o1GqR0xqWZiiU7Lz-LvM,42379
3
3
  ccxt/alpaca.py,sha256=HQuhQZSFGRlT-BaCUSEZmxpzYp6tll2zn63qn3gTmoU,47470
4
4
  ccxt/ascendex.py,sha256=4aEwibO_me6khr66z8JFqDBxe2gtFOWIFBE7ulBEJPs,151933
@@ -35,7 +35,7 @@ ccxt/btcalpha.py,sha256=UcCCDZ_7EM-Q2tHU1IQPEA2DErFsLhrSfX-Oy-Q2uL4,36715
35
35
  ccxt/btcbox.py,sha256=RksPuQd_i3c-Qs5MZr1dPAa7ig8IePFpYJK3suQyemE,27747
36
36
  ccxt/btcmarkets.py,sha256=0gMC0vvmuDJwcnllHMUZsQRV6QWA1-Cbq1N1F9rIUW8,52697
37
37
  ccxt/btcturk.py,sha256=bQ8sJq5iEj9oq2R17uDadPWKcnIQG8id5UmdlpHfFy8,36992
38
- ccxt/bybit.py,sha256=sghNV8ktGxVlJN2It9DGxvauo9mOniv-vk72WC5Gqpc,415463
38
+ ccxt/bybit.py,sha256=ncl49FzsSzVFE2KM_IgV_wmD43HzB7M760eluwDhE_E,415847
39
39
  ccxt/cex.py,sha256=YQtARIBP7cY3y-AqRarEH_mVh7_ftt18jLebhpL3hxQ,70084
40
40
  ccxt/coinbase.py,sha256=OLcnNdnOxnbTY54BEvptJCysDBU3ZZGw6eJcHalaFFc,217105
41
41
  ccxt/coinbaseadvanced.py,sha256=d5g6nRx-NCcCwZDdtp8FsI2D-pRjSvnAP9ISSKY_nCQ,538
@@ -65,11 +65,11 @@ ccxt/hollaex.py,sha256=2KIbenZ3vcBDN_rs2CxG5_foKLaYxJd73vVV7M8n_8E,76140
65
65
  ccxt/htx.py,sha256=wrLgsowQRre6HAAlxQjM8kJrHRiq_mRy_jMr7S82vTk,427487
66
66
  ccxt/huobi.py,sha256=4vaG7IRN7fyjaJ_ac6S-njlHOfSEN5de7aq0noznxYw,438
67
67
  ccxt/huobijp.py,sha256=DPg9DkSTrsFZt8bCnGcodfPPCWMKRAFyh6ti9iNU3VE,90183
68
- ccxt/hyperliquid.py,sha256=bs8KgaGvwX85jktXp2kNqgfdgyRx3oYcpQChNzOeKaY,107006
68
+ ccxt/hyperliquid.py,sha256=ORwlaPwQxgS80WFoIjcWR4jvgcWEKerp9rxlV4EtXwI,109662
69
69
  ccxt/idex.py,sha256=P2jNsxiwIlMgrfPKbtmjLJQrzFcWp_TjgJaLq793oco,73255
70
70
  ccxt/independentreserve.py,sha256=ChkSnahGsn0aN_cfaAonSk-V2Aa1UB-0cPTa1d3AdI4,37713
71
71
  ccxt/indodax.py,sha256=rFfAwlYalCXdHQvhjmb7Zt4fGYqjoPv_koL21CBv-O8,53431
72
- ccxt/kraken.py,sha256=7DjAeeUmP1y5JR2u48x-462u1Wlch3iNb_Gj0mTeWb8,129166
72
+ ccxt/kraken.py,sha256=j2NnpL1fttk9ii1LqaKz8pGm7Lx3hYZvD6h941oxNfA,130120
73
73
  ccxt/krakenfutures.py,sha256=2K40RYEqHB2kgo9715eXc8O2SKcZpAb26iRdC70ftts,119521
74
74
  ccxt/kucoin.py,sha256=Tfg5d5Nn4N-xd39LoJPBOSjfjoMhVUtoV7PjMJrF74I,226263
75
75
  ccxt/kucoinfutures.py,sha256=Mn9eflwmD_FmTCHYkRvyfxG3SU3Pgv9Hpj-6umYT3h8,124558
@@ -216,7 +216,7 @@ ccxt/abstract/xt.py,sha256=JkWvsic3L2O968BCr9H5Wd5NIbRE9aTT2A-9WbAtl0c,27146
216
216
  ccxt/abstract/yobit.py,sha256=8ycfCO8ORFly9hc0Aa47sZyX4_ZKPXS9h9yJzI-uQ7Q,1339
217
217
  ccxt/abstract/zaif.py,sha256=m15WHdl3gYy0GOXNZ8NEH8eE7sVh8c0T_ITNuU8vXeU,3935
218
218
  ccxt/abstract/zonda.py,sha256=X-hCW0SdX3YKZWixDyW-O2211M58Rno8kKJ6quY7rw4,7183
219
- ccxt/async_support/__init__.py,sha256=ay7fJDqHd2OTvdbn6BLRxeOURUkzpVWdOuOT_J_mQco,16122
219
+ ccxt/async_support/__init__.py,sha256=1xh69SRocA4L9vJwaf5ny0-xqny7vFBIBp8WaaJNiOI,16122
220
220
  ccxt/async_support/ace.py,sha256=GxXMtM5Como1NVqXhOqJntxhLO1w9pNe1yYbQP_4ylQ,42603
221
221
  ccxt/async_support/alpaca.py,sha256=495vDvdF1IWlsh9QhUnMtkMuINdD0EzeFGlUVqCf8TE,47682
222
222
  ccxt/async_support/ascendex.py,sha256=LK259BdUqU0_STGRH6DmTgaR-7lXqFpZHFVACf2um5c,152721
@@ -253,7 +253,7 @@ ccxt/async_support/btcalpha.py,sha256=DgzrJ6cczUCDZr-QLUxMpazeudEFdQ_OzXiQiJM4Hb
253
253
  ccxt/async_support/btcbox.py,sha256=s36BAKOFcZYnqTp-IqRDHvgiXpZQ-rirZHCj1JAzhvs,27971
254
254
  ccxt/async_support/btcmarkets.py,sha256=x1-s5uVioHyvNJoBxhxP8eUUslTDwQnZMU0FWfu1Fd4,53047
255
255
  ccxt/async_support/btcturk.py,sha256=P3bg0XG0sAi-8ge9ZFzQqZHsoGOGfxBjkhIDo4VPSK4,37210
256
- ccxt/async_support/bybit.py,sha256=MLIIp2zPmckmMw75dnJOdIPvnDIxFUjlIjluiS04ejE,417303
256
+ ccxt/async_support/bybit.py,sha256=UjBrW-vap05VR3FCD64kuoHzhkjJgtJKblR8Bq2GjaU,417687
257
257
  ccxt/async_support/cex.py,sha256=5KZ9qt4WsUAkH2rkHn7zW7SwlB9FumruLELdKF4LFoE,70434
258
258
  ccxt/async_support/coinbase.py,sha256=RMcQFh7tSzTe8QqFaz9WmH2Op8sXD8jWpZfLBt_13QQ,218259
259
259
  ccxt/async_support/coinbaseadvanced.py,sha256=Kupwnuxiu_qTjwCNV2asacoDUNFQvcaHNAznUJPhdQs,552
@@ -283,11 +283,11 @@ ccxt/async_support/hollaex.py,sha256=msUnnbWLNeCxFW77BnfLoFWBdvQIDwV7Rtbi9TA4TYY
283
283
  ccxt/async_support/htx.py,sha256=TjGp3JCN40B1mKD5U9bbo0kJceL0etS0A0fKclX5CvY,429879
284
284
  ccxt/async_support/huobi.py,sha256=fup0j6wQ1khAtfbb1H4CSyJAOzhxuoHMmrM6sgTuhr8,452
285
285
  ccxt/async_support/huobijp.py,sha256=e4vfgX8c9eTLZk6bOrB8_Upq13PLDjTLiR109Pj4phM,90683
286
- ccxt/async_support/hyperliquid.py,sha256=5kG6qZFPCqRy3t6VR-Sd2ogE5J25bRBYsEeSfhNXQJY,107544
286
+ ccxt/async_support/hyperliquid.py,sha256=k8Hik0ZLa583iMki2jp7AfR_7HpTB61yO2z5G0ILW0Q,110218
287
287
  ccxt/async_support/idex.py,sha256=UcAvdMc2CP_6E8lET4rmQiIP-RaUfZHSo6pQeA17v-g,73731
288
288
  ccxt/async_support/independentreserve.py,sha256=fCTAQ1U74KOZHIoYbDxzEly1xSgykcYcdpeiJiCEXkU,37991
289
289
  ccxt/async_support/indodax.py,sha256=m6F8bSiEz9c6UQuadeOfC40rnmlAVKkj94C1uvsc9k0,53739
290
- ccxt/async_support/kraken.py,sha256=PSrlB_8MvMT76_YnXrF5rVl5KR3mJe8f6SYEssDaFCM,129804
290
+ ccxt/async_support/kraken.py,sha256=D7tT1Oxgm8KLZjTaH3reqo7nHnN4xgtIH7racOMkfaA,130770
291
291
  ccxt/async_support/krakenfutures.py,sha256=2r88_rC1cY7t4s8dgeqRUlwNC2NVaagS9wPAEonLAQs,120009
292
292
  ccxt/async_support/kucoin.py,sha256=7SMZDx5NduNXdY0HexEkE8K_p6zBnRFBLd08mIHIUJ8,227364
293
293
  ccxt/async_support/kucoinfutures.py,sha256=uy8gNsJOI6SggxhYMH1TSTFM6rlzWvLknZL_KgCDLBE,125196
@@ -326,24 +326,24 @@ ccxt/async_support/yobit.py,sha256=rndL_bMH17YAFCGX__ZPid-Rym1sKoikKO2At7Mbe2Y,5
326
326
  ccxt/async_support/zaif.py,sha256=-ZTr8M2JaIRCL90VrbCDXBMAsZwbiwsFChSQ2rWODuQ,29044
327
327
  ccxt/async_support/zonda.py,sha256=3Lk1ZKvnxDcJjN5_dIJcaoxq30tL8HZ48pPiuYJGjIM,81725
328
328
  ccxt/async_support/base/__init__.py,sha256=aVYSsFi--b4InRs9zDN_wtCpj8odosAB726JdUHavrk,67
329
- ccxt/async_support/base/exchange.py,sha256=n4Cx7wIazQ0YKWCjvL-0ZV9XRUvtW9C3W-IF7uoARwU,110793
329
+ ccxt/async_support/base/exchange.py,sha256=oPSYQjYjbsITUYie1H0cq0cHpaBGFf48qOOUAdx3SJA,110793
330
330
  ccxt/async_support/base/throttler.py,sha256=tvDVcdRUVYi8fZRlEcnqtgzcgB_KMUMRs5Pu8tuU-tU,1847
331
331
  ccxt/async_support/base/ws/__init__.py,sha256=uockzpLuwntKGZbs5EOWFe-Zg-k6Cj7GhNJLc_RX0so,1791
332
332
  ccxt/async_support/base/ws/aiohttp_client.py,sha256=5IEiT0elWI9a7Vr-KV0jgmlbpLJWBzIlrLaCkTKGaqY,5752
333
333
  ccxt/async_support/base/ws/cache.py,sha256=jK1nzPIijhBZz9eXItbFULfZRv4uV2HGOmVwhHEyahg,8134
334
334
  ccxt/async_support/base/ws/client.py,sha256=05Nag7cglClu4QGykZ0cY9lm6Ope0dOSG8rIbDUlnC8,8187
335
- ccxt/async_support/base/ws/fast_client.py,sha256=NEA912Z4xe4O3VMQrNrWJhLa3XItf3Jh9YirKu8zNsI,3876
335
+ ccxt/async_support/base/ws/fast_client.py,sha256=WPXKqSi9OPDtpgAvt19T1EVtTg4BNk8WGSLtxUVMh08,3956
336
336
  ccxt/async_support/base/ws/functions.py,sha256=qwvEnjtINWL5ZU-dbbeIunjyBxzFqbGWHfVhxqAcKug,1499
337
- ccxt/async_support/base/ws/future.py,sha256=poJororPTavN1YT4whp9VXDd_rwqkn-3EDeiBoGmKLs,1984
337
+ ccxt/async_support/base/ws/future.py,sha256=WhAJ7wdEiLdfgl5tfGHv6HgLxAN0tTc9xL4gbkKVOaE,2409
338
338
  ccxt/async_support/base/ws/order_book.py,sha256=uBUaIHhzMRykpmo4BCsdJ-t_HozS6VxhEs8x-Kbj-NI,2894
339
339
  ccxt/async_support/base/ws/order_book_side.py,sha256=GhnGUt78pJ-AYL_Dq9produGjmBJLCI5FHIRdMz1O-g,6551
340
340
  ccxt/base/__init__.py,sha256=eTx1OE3HJjspFUQjGm6LBhaQiMKJnXjkdP-JUXknyQ0,1320
341
341
  ccxt/base/decimal_to_precision.py,sha256=fgWRBzRTtsf3r2INyS4f7WHlzgjB5YM1ekiwqD21aac,6634
342
342
  ccxt/base/errors.py,sha256=tosnf1tDaBn4YMCbWVNWyDYzqft-ImVtyjqJb6q83Y4,4369
343
- ccxt/base/exchange.py,sha256=EHpIRcPLhKkcwj0b4ryezrNhQP61TarEeoC5lZsVgGs,282079
343
+ ccxt/base/exchange.py,sha256=8SvNZpqnkTZuaKtPjU4H_7G0gqDpF1fD3G_1TNQeTMU,282079
344
344
  ccxt/base/precise.py,sha256=koce64Yrp6vFbGijJtUt-QQ6XhJgeGTCksZ871FPp_A,8886
345
345
  ccxt/base/types.py,sha256=JfD1eNzfKS06XwwLUobK9d2SfVGRqbVfMY0ApU-Hn9A,9349
346
- ccxt/pro/__init__.py,sha256=Xbp7bOaZ8lBn7QaEEtZbofuObVo_bgUIVQwMy-O38zo,7405
346
+ ccxt/pro/__init__.py,sha256=yJyeY2RIYEfNAx8LzE1A1JRShGzlHPrh_Qx5iNv4St0,7405
347
347
  ccxt/pro/alpaca.py,sha256=TGfyNTaYawHIUWDzoVKXitCPMWO1wKn9VcgmdWMex58,27212
348
348
  ccxt/pro/ascendex.py,sha256=181FIeztchLqGmgecRJEN8F8xEM45D5aMKhC-5nuNfU,35467
349
349
  ccxt/pro/bequant.py,sha256=5zbsP8BHQTUZ8ZNL6uaACxDbUClgkOV4SYfXT_LfQVg,1351
@@ -385,7 +385,7 @@ ccxt/pro/hollaex.py,sha256=bFL0Rc3XAQx7HozRYpOxGWXfeDk-RTR-jsQyqq-WUxg,21989
385
385
  ccxt/pro/htx.py,sha256=NgdEA7O9vIZsQJ-gfB1VevfDYnAljQs0Zst1heKXekk,96281
386
386
  ccxt/pro/huobi.py,sha256=rKZVgYqEr-MmZzTqAk4FoJt8qWFjCi_FY0ci_mWZrL0,385
387
387
  ccxt/pro/huobijp.py,sha256=aL6wEqAfnZp15mvfxbCsKI5OJqeCLN5IM5QO0OvJRSk,23270
388
- ccxt/pro/hyperliquid.py,sha256=iYVKkK-WxpOUfIfiNnkAYqAWAajcESzP8T8gfmPR5VE,20839
388
+ ccxt/pro/hyperliquid.py,sha256=mh8BnIlmoqg4LdWaXacgY3wfcLMpuFY8dmbE6S-97Ws,25233
389
389
  ccxt/pro/idex.py,sha256=WAY58yMHFUPoqZUGFvzxqcKizvMuFXqdZ6BD0WgstQA,28361
390
390
  ccxt/pro/independentreserve.py,sha256=wLONq1yDOV-92ZaKaBLZwUxopu0MZR-Z-AjvPN-_fuY,11308
391
391
  ccxt/pro/kraken.py,sha256=hrYXzL-CLCgm0BbQBjNOoiAfC57Ca5JTiD_24eIvikM,63840
@@ -397,7 +397,7 @@ ccxt/pro/luno.py,sha256=AzLK0_C0Hu25ukMNkMLP_sY3D4UG9FT38oawpo4jzTg,12336
397
397
  ccxt/pro/mexc.py,sha256=4HGDH6Z-I1RoyHuiXnuSbThgmKyEyOZFwu8kaerCO6s,43262
398
398
  ccxt/pro/ndax.py,sha256=fQsoYtrTEsCZB3hl-pavQytwQAaiMAiTyaCiOy1sVTg,22715
399
399
  ccxt/pro/okcoin.py,sha256=M9x9p9umvIdP13uw_Wyx-TCg7QLMI7ov5DnukCXTBNE,30421
400
- ccxt/pro/okx.py,sha256=rR2SIRRadNaT6Z8_RqSwmFyeB31H1cHg-Zq53H1Ti9I,83855
400
+ ccxt/pro/okx.py,sha256=Rq3_u7dgJOdtrWnl5CeZJrrvFN0isU69lqHYSIGiwLg,83890
401
401
  ccxt/pro/onetrading.py,sha256=Qlr6LRRqO8te7QyTIhCk5nXJnupH8MtRWhQnH3Zc9yE,54769
402
402
  ccxt/pro/oxfun.py,sha256=5UuhC7ikqvTcmaFJsp3PuGbi_lzgH1H6OVV-ox3Lc1s,43935
403
403
  ccxt/pro/p2b.py,sha256=Vdm2wc4RF3IDMKivSlNyWjrh9IR0c-Zm5lDjY4AIass,17889
@@ -514,8 +514,8 @@ ccxt/test/tests_async.py,sha256=rQN7Ac7qQ9Ag8zaDS7LCijM4Y4tpxlMN1Q2uJjZuntM,8093
514
514
  ccxt/test/tests_helpers.py,sha256=RLDL2iakRjfCc2FuiTUvgmFcRyObizOPX3Ww3a4uXsQ,9670
515
515
  ccxt/test/tests_init.py,sha256=eVwwUHujX9t4rjgo4TqEeg7DDhR1Hb_e2SJN8NVGyl0,998
516
516
  ccxt/test/tests_sync.py,sha256=01AYWrs1Gt0LEM9rhEZmqmZKH2RtToz37XzOZIizfEg,80041
517
- ccxt-4.3.64.dist-info/LICENSE.txt,sha256=EIb9221AhMHV7xF1_55STFdKTFsnJVJYkRpY2Lnvo5w,1068
518
- ccxt-4.3.64.dist-info/METADATA,sha256=32zbVCRs2kEx0fM0mDwHqzmNOwg8CVJQhCmHWPkAS3c,115795
519
- ccxt-4.3.64.dist-info/WHEEL,sha256=z9j0xAa_JmUKMpmz72K0ZGALSM_n-wQVmGbleXx2VHg,110
520
- ccxt-4.3.64.dist-info/top_level.txt,sha256=CkQDuCTDKNcImPV60t36G6MdYfxsAPNiSaEwifVoVMo,5
521
- ccxt-4.3.64.dist-info/RECORD,,
517
+ ccxt-4.3.66.dist-info/LICENSE.txt,sha256=EIb9221AhMHV7xF1_55STFdKTFsnJVJYkRpY2Lnvo5w,1068
518
+ ccxt-4.3.66.dist-info/METADATA,sha256=K_LzS6v2AgjvqrIY0vCMyZE1DGe-0O5KSNe2obNXB04,115945
519
+ ccxt-4.3.66.dist-info/WHEEL,sha256=z9j0xAa_JmUKMpmz72K0ZGALSM_n-wQVmGbleXx2VHg,110
520
+ ccxt-4.3.66.dist-info/top_level.txt,sha256=CkQDuCTDKNcImPV60t36G6MdYfxsAPNiSaEwifVoVMo,5
521
+ ccxt-4.3.66.dist-info/RECORD,,
File without changes