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 +1 -1
- ccxt/async_support/__init__.py +1 -1
- ccxt/async_support/base/exchange.py +1 -1
- ccxt/async_support/base/ws/fast_client.py +2 -1
- ccxt/async_support/base/ws/future.py +13 -2
- ccxt/async_support/bybit.py +11 -4
- ccxt/async_support/hyperliquid.py +60 -7
- ccxt/async_support/kraken.py +25 -0
- ccxt/base/exchange.py +1 -1
- ccxt/bybit.py +11 -4
- ccxt/hyperliquid.py +60 -7
- ccxt/kraken.py +25 -0
- ccxt/pro/__init__.py +1 -1
- ccxt/pro/hyperliquid.py +102 -2
- ccxt/pro/okx.py +5 -5
- {ccxt-4.3.64.dist-info → ccxt-4.3.66.dist-info}/METADATA +5 -4
- {ccxt-4.3.64.dist-info → ccxt-4.3.66.dist-info}/RECORD +20 -20
- {ccxt-4.3.64.dist-info → ccxt-4.3.66.dist-info}/LICENSE.txt +0 -0
- {ccxt-4.3.64.dist-info → ccxt-4.3.66.dist-info}/WHEEL +0 -0
- {ccxt-4.3.64.dist-info → ccxt-4.3.66.dist-info}/top_level.txt +0 -0
ccxt/__init__.py
CHANGED
ccxt/async_support/__init__.py
CHANGED
@@ -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(
|
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
|
-
|
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
|
-
|
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):
|
ccxt/async_support/bybit.py
CHANGED
@@ -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', '
|
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
|
-
|
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
|
2951
|
+
elif isFunding:
|
2945
2952
|
# use self endpoint only we have no other choice
|
2946
2953
|
# because it requires transfer permission
|
2947
|
-
request['accountType'] =
|
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':
|
106
|
-
'fetchTickers':
|
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
|
-
|
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(
|
334
|
+
for i in range(0, len(universe)):
|
335
335
|
data = self.extend(
|
336
|
-
self.safe_dict(
|
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
|
ccxt/async_support/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
|
+
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
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', '
|
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
|
-
|
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
|
2950
|
+
elif isFunding:
|
2944
2951
|
# use self endpoint only we have no other choice
|
2945
2952
|
# because it requires transfer permission
|
2946
|
-
request['accountType'] =
|
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':
|
105
|
-
'fetchTickers':
|
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
|
-
|
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(
|
333
|
+
for i in range(0, len(universe)):
|
334
334
|
data = self.extend(
|
335
|
-
self.safe_dict(
|
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
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':
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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
|
+
[](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.
|
272
|
-
* unpkg: https://unpkg.com/ccxt@4.3.
|
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.
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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.
|
518
|
-
ccxt-4.3.
|
519
|
-
ccxt-4.3.
|
520
|
-
ccxt-4.3.
|
521
|
-
ccxt-4.3.
|
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
|
File without changes
|
File without changes
|