ccxt 4.3.84__py2.py3-none-any.whl → 4.3.85__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
ccxt/__init__.py CHANGED
@@ -22,7 +22,7 @@
22
22
 
23
23
  # ----------------------------------------------------------------------------
24
24
 
25
- __version__ = '4.3.84'
25
+ __version__ = '4.3.85'
26
26
 
27
27
  # ----------------------------------------------------------------------------
28
28
 
@@ -54,6 +54,7 @@ from ccxt.base.errors import OperationRejected # noqa: F4
54
54
  from ccxt.base.errors import NoChange # noqa: F401
55
55
  from ccxt.base.errors import MarginModeAlreadySet # noqa: F401
56
56
  from ccxt.base.errors import MarketClosed # noqa: F401
57
+ from ccxt.base.errors import ManualInteractionNeeded # noqa: F401
57
58
  from ccxt.base.errors import InsufficientFunds # noqa: F401
58
59
  from ccxt.base.errors import InvalidAddress # noqa: F401
59
60
  from ccxt.base.errors import AddressPending # noqa: F401
@@ -38,6 +38,8 @@ class ImplicitAPI:
38
38
  v1_private_post_private_get_accounts = v1PrivatePostPrivateGetAccounts = Entry('private/get-accounts', ['v1', 'private'], 'POST', {'cost': 3.3333333333333335})
39
39
  v1_private_post_private_get_withdrawal_history = v1PrivatePostPrivateGetWithdrawalHistory = Entry('private/get-withdrawal-history', ['v1', 'private'], 'POST', {'cost': 3.3333333333333335})
40
40
  v1_private_post_private_get_deposit_history = v1PrivatePostPrivateGetDepositHistory = Entry('private/get-deposit-history', ['v1', 'private'], 'POST', {'cost': 3.3333333333333335})
41
+ v1_private_post_private_get_fee_rate = v1PrivatePostPrivateGetFeeRate = Entry('private/get-fee-rate', ['v1', 'private'], 'POST', {'cost': 2})
42
+ v1_private_post_private_get_instrument_fee_rate = v1PrivatePostPrivateGetInstrumentFeeRate = Entry('private/get-instrument-fee-rate', ['v1', 'private'], 'POST', {'cost': 2})
41
43
  v1_private_post_private_staking_stake = v1PrivatePostPrivateStakingStake = Entry('private/staking/stake', ['v1', 'private'], 'POST', {'cost': 2})
42
44
  v1_private_post_private_staking_unstake = v1PrivatePostPrivateStakingUnstake = Entry('private/staking/unstake', ['v1', 'private'], 'POST', {'cost': 2})
43
45
  v1_private_post_private_staking_get_staking_position = v1PrivatePostPrivateStakingGetStakingPosition = Entry('private/staking/get-staking-position', ['v1', 'private'], 'POST', {'cost': 2})
@@ -162,6 +162,7 @@ class ImplicitAPI:
162
162
  futurespublic_get_status = futuresPublicGetStatus = Entry('status', 'futuresPublic', 'GET', {'cost': 1})
163
163
  futurespublic_get_level2_message_query = futuresPublicGetLevel2MessageQuery = Entry('level2/message/query', 'futuresPublic', 'GET', {'cost': 1})
164
164
  futurespublic_get_contracts_risk_limit_symbol = futuresPublicGetContractsRiskLimitSymbol = Entry('contracts/risk-limit/{symbol}', 'futuresPublic', 'GET', {'cost': 1})
165
+ futurespublic_get_alltickers = futuresPublicGetAllTickers = Entry('allTickers', 'futuresPublic', 'GET', {'cost': 1})
165
166
  futurespublic_get_level2_depth_limit = futuresPublicGetLevel2DepthLimit = Entry('level2/depth{limit}', 'futuresPublic', 'GET', {'cost': 1})
166
167
  futurespublic_get_level3_message_query = futuresPublicGetLevel3MessageQuery = Entry('level3/message/query', 'futuresPublic', 'GET', {'cost': 1})
167
168
  futurespublic_get_level3_snapshot = futuresPublicGetLevel3Snapshot = Entry('level3/snapshot', 'futuresPublic', 'GET', {'cost': 1})
@@ -191,6 +192,7 @@ class ImplicitAPI:
191
192
  futuresprivate_get_trade_statistics = futuresPrivateGetTradeStatistics = Entry('trade-statistics', 'futuresPrivate', 'GET', {'cost': 1})
192
193
  futuresprivate_get_trade_fees = futuresPrivateGetTradeFees = Entry('trade-fees', 'futuresPrivate', 'GET', {'cost': 1})
193
194
  futuresprivate_get_history_positions = futuresPrivateGetHistoryPositions = Entry('history-positions', 'futuresPrivate', 'GET', {'cost': 1})
195
+ futuresprivate_get_getmaxopensize = futuresPrivateGetGetMaxOpenSize = Entry('getMaxOpenSize', 'futuresPrivate', 'GET', {'cost': 1})
194
196
  futuresprivate_post_transfer_out = futuresPrivatePostTransferOut = Entry('transfer-out', 'futuresPrivate', 'POST', {'cost': 1})
195
197
  futuresprivate_post_transfer_in = futuresPrivatePostTransferIn = Entry('transfer-in', 'futuresPrivate', 'POST', {'cost': 1})
196
198
  futuresprivate_post_orders = futuresPrivatePostOrders = Entry('orders', 'futuresPrivate', 'POST', {'cost': 1.33})
@@ -4,7 +4,7 @@
4
4
 
5
5
  # -----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.3.84'
7
+ __version__ = '4.3.85'
8
8
 
9
9
  # -----------------------------------------------------------------------------
10
10
 
@@ -33,6 +33,7 @@ from ccxt.base.errors import OperationRejected # noqa: F4
33
33
  from ccxt.base.errors import NoChange # noqa: F401
34
34
  from ccxt.base.errors import MarginModeAlreadySet # noqa: F401
35
35
  from ccxt.base.errors import MarketClosed # noqa: F401
36
+ from ccxt.base.errors import ManualInteractionNeeded # noqa: F401
36
37
  from ccxt.base.errors import InsufficientFunds # noqa: F401
37
38
  from ccxt.base.errors import InvalidAddress # noqa: F401
38
39
  from ccxt.base.errors import AddressPending # noqa: F401
@@ -2,7 +2,7 @@
2
2
 
3
3
  # -----------------------------------------------------------------------------
4
4
 
5
- __version__ = '4.3.84'
5
+ __version__ = '4.3.85'
6
6
 
7
7
  # -----------------------------------------------------------------------------
8
8
 
@@ -2307,6 +2307,8 @@ class bitmex(Exchange, ImplicitAPI):
2307
2307
  # 'otpToken': '123456', # requires if two-factor auth(OTP) is enabled
2308
2308
  # 'fee': 0.001, # bitcoin network fee
2309
2309
  }
2310
+ if self.twofa is not None:
2311
+ request['otpToken'] = self.totp(self.twofa)
2310
2312
  response = await self.privatePostUserRequestWithdrawal(self.extend(request, params))
2311
2313
  #
2312
2314
  # {
@@ -16,6 +16,7 @@ from ccxt.base.errors import ArgumentsRequired
16
16
  from ccxt.base.errors import BadRequest
17
17
  from ccxt.base.errors import NoChange
18
18
  from ccxt.base.errors import MarginModeAlreadySet
19
+ from ccxt.base.errors import ManualInteractionNeeded
19
20
  from ccxt.base.errors import InsufficientFunds
20
21
  from ccxt.base.errors import InvalidOrder
21
22
  from ccxt.base.errors import OrderNotFound
@@ -768,8 +769,11 @@ class bybit(Exchange, ImplicitAPI):
768
769
  '140069': PermissionDenied, # Do not allow OTC lending users to trade
769
770
  '140070': InvalidOrder, # ETP symbols are not allowed to be traded
770
771
  '170001': ExchangeError, # Internal error.
771
- '170007': RequestTimeout, # Timeout waiting for response from backend server.
772
772
  '170005': InvalidOrder, # Too many new orders; current limit is %s orders per %s.
773
+ '170007': RequestTimeout, # Timeout waiting for response from backend server.
774
+ '170010': InvalidOrder, # Purchase failed: Exceed the maximum position limit of leveraged tokens, the current available limit is %s USDT
775
+ '170011': InvalidOrder, # "Purchase failed: Exceed the maximum position limit of innovation tokens,
776
+ '170019': InvalidOrder, # the current available limit is replaceKey0 USDT"
773
777
  '170031': ExchangeError, # The feature has been suspended
774
778
  '170032': ExchangeError, # Network error. Please try again later
775
779
  '170033': InsufficientFunds, # margin Insufficient account balance
@@ -782,6 +786,7 @@ class bybit(Exchange, ImplicitAPI):
782
786
  '170116': InvalidOrder, # Invalid orderType.
783
787
  '170117': InvalidOrder, # Invalid side.
784
788
  '170121': InvalidOrder, # Invalid symbol.
789
+ '170124': InvalidOrder, # Order amount too large.
785
790
  '170130': BadRequest, # Data sent for paramter '%s' is not valid.
786
791
  '170131': InsufficientFunds, # Balance insufficient
787
792
  '170132': InvalidOrder, # Order price too high.
@@ -792,7 +797,6 @@ class bybit(Exchange, ImplicitAPI):
792
797
  '170137': InvalidOrder, # Order volume decimal too long
793
798
  '170139': InvalidOrder, # Order has been filled.
794
799
  '170140': InvalidOrder, # Transaction amount lower than the minimum.
795
- '170124': InvalidOrder, # Order amount too large.
796
800
  '170141': InvalidOrder, # Duplicate clientOrderId
797
801
  '170142': InvalidOrder, # Order has been canceled
798
802
  '170143': InvalidOrder, # Cannot be found on order book
@@ -817,6 +821,15 @@ class bybit(Exchange, ImplicitAPI):
817
821
  '170198': InvalidOrder, # Your order quantity to sell is too large. The filled price may deviate significantly from the market price. Please try again
818
822
  '170199': InvalidOrder, # Your order quantity to buy is too large. The filled price may deviate significantly from the nav. Please try again.
819
823
  '170200': InvalidOrder, # Your order quantity to sell is too large. The filled price may deviate significantly from the nav. Please try again.
824
+ '170201': PermissionDenied, # Your account has been restricted for trades. If you have any questions, please email us at support@bybit.com
825
+ '170202': InvalidOrder, # Invalid orderFilter parameter.
826
+ '170203': InvalidOrder, # Please enter the TP/SL price.
827
+ '170204': InvalidOrder, # trigger price cannot be higher than 110% price.
828
+ '170206': InvalidOrder, # trigger price cannot be lower than 90% of qty.
829
+ '170210': InvalidOrder, # New order rejected.
830
+ '170213': OrderNotFound, # Order does not exist.
831
+ '170217': InvalidOrder, # Only LIMIT-MAKER order is supported for the current pair.
832
+ '170218': InvalidOrder, # The LIMIT-MAKER order is rejected due to invalid price.
820
833
  '170221': BadRequest, # This coin does not exist.
821
834
  '170222': RateLimitExceeded, # Too many hasattr(self, requests) time frame.
822
835
  '170223': InsufficientFunds, # Your Spot Account with Institutional Lending triggers an alert or liquidation.
@@ -826,18 +839,7 @@ class bybit(Exchange, ImplicitAPI):
826
839
  '170228': InvalidOrder, # The purchase amount of each order exceeds the estimated maximum purchase amount.
827
840
  '170229': InvalidOrder, # The sell quantity per order exceeds the estimated maximum sell quantity.
828
841
  '170234': ExchangeError, # System Error
829
- '170210': InvalidOrder, # New order rejected.
830
- '170213': OrderNotFound, # Order does not exist.
831
- '170217': InvalidOrder, # Only LIMIT-MAKER order is supported for the current pair.
832
- '170218': InvalidOrder, # The LIMIT-MAKER order is rejected due to invalid price.
833
- '170010': InvalidOrder, # Purchase failed: Exceed the maximum position limit of leveraged tokens, the current available limit is %s USDT
834
- '170011': InvalidOrder, # "Purchase failed: Exceed the maximum position limit of innovation tokens,
835
- '170019': InvalidOrder, # the current available limit is replaceKey0 USDT"
836
- '170201': PermissionDenied, # Your account has been restricted for trades. If you have any questions, please email us at support@bybit.com
837
- '170202': InvalidOrder, # Invalid orderFilter parameter.
838
- '170203': InvalidOrder, # Please enter the TP/SL price.
839
- '170204': InvalidOrder, # trigger price cannot be higher than 110% price.
840
- '170206': InvalidOrder, # trigger price cannot be lower than 90% of qty.
842
+ '170241': ManualInteractionNeeded, # To proceed with trading, users must read through and confirm that they fully understand the project's risk disclosure document.
841
843
  '175000': InvalidOrder, # The serialNum is already in use.
842
844
  '175001': InvalidOrder, # Daily purchase limit has been exceeded. Please try again later.
843
845
  '175002': InvalidOrder, # There's a large number of purchase orders. Please try again later.
@@ -6,7 +6,7 @@
6
6
  from ccxt.async_support.base.exchange import Exchange
7
7
  from ccxt.abstract.cryptocom import ImplicitAPI
8
8
  import hashlib
9
- from ccxt.base.types import Account, Balances, Currency, Int, Market, Num, Order, OrderBook, OrderRequest, CancellationRequest, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, Transaction
9
+ from ccxt.base.types import Account, Balances, Currency, Int, Market, Num, Order, OrderBook, OrderRequest, CancellationRequest, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, TradingFeeInterface, TradingFees, Transaction
10
10
  from typing import List
11
11
  from ccxt.base.errors import ExchangeError
12
12
  from ccxt.base.errors import AuthenticationError
@@ -109,8 +109,8 @@ class cryptocom(Exchange, ImplicitAPI):
109
109
  'fetchTickers': True,
110
110
  'fetchTime': False,
111
111
  'fetchTrades': True,
112
- 'fetchTradingFee': False,
113
- 'fetchTradingFees': False,
112
+ 'fetchTradingFee': True,
113
+ 'fetchTradingFees': True,
114
114
  'fetchTransactionFees': False,
115
115
  'fetchTransactions': False,
116
116
  'fetchTransfers': False,
@@ -211,6 +211,8 @@ class cryptocom(Exchange, ImplicitAPI):
211
211
  'private/get-accounts': 10 / 3,
212
212
  'private/get-withdrawal-history': 10 / 3,
213
213
  'private/get-deposit-history': 10 / 3,
214
+ 'private/get-fee-rate': 2,
215
+ 'private/get-instrument-fee-rate': 2,
214
216
  'private/staking/stake': 2,
215
217
  'private/staking/unstake': 2,
216
218
  'private/staking/get-staking-position': 2,
@@ -2806,6 +2808,114 @@ class cryptocom(Exchange, ImplicitAPI):
2806
2808
  result = self.safe_dict(response, 'result')
2807
2809
  return self.parse_order(result, market)
2808
2810
 
2811
+ async def fetch_trading_fee(self, symbol: str, params={}) -> TradingFeeInterface:
2812
+ """
2813
+ fetch the trading fees for a market
2814
+ :see: https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-get-instrument-fee-rate
2815
+ :param str symbol: unified market symbol
2816
+ :param dict [params]: extra parameters specific to the exchange API endpoint
2817
+ :returns dict: a `fee structure <https://docs.ccxt.com/#/?id=fee-structure>`
2818
+ """
2819
+ await self.load_markets()
2820
+ market = self.market(symbol)
2821
+ request: dict = {
2822
+ 'instrument_name': market['id'],
2823
+ }
2824
+ response = await self.v1PrivatePostPrivateGetInstrumentFeeRate(self.extend(request, params))
2825
+ #
2826
+ # {
2827
+ # "id": 1,
2828
+ # "code": 0,
2829
+ # "method": "private/staking/unstake",
2830
+ # "result": {
2831
+ # "staking_id": "1",
2832
+ # "instrument_name": "SOL.staked",
2833
+ # "status": "NEW",
2834
+ # "quantity": "1",
2835
+ # "underlying_inst_name": "SOL",
2836
+ # "reason": "NO_ERROR"
2837
+ # }
2838
+ # }
2839
+ #
2840
+ data = self.safe_dict(response, 'result', {})
2841
+ return self.parse_trading_fee(data, market)
2842
+
2843
+ async def fetch_trading_fees(self, params={}) -> TradingFees:
2844
+ """
2845
+ :see: https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-get-fee-rate
2846
+ fetch the trading fees for multiple markets
2847
+ :param dict [params]: extra parameters specific to the exchange API endpoint
2848
+ :returns dict: a dictionary of `fee structures <https://docs.ccxt.com/#/?id=fee-structure>` indexed by market symbols
2849
+ """
2850
+ await self.load_markets()
2851
+ response = await self.v1PrivatePostPrivateGetFeeRate(params)
2852
+ #
2853
+ # {
2854
+ # "id": 1,
2855
+ # "method": "/private/get-fee-rate",
2856
+ # "code": 0,
2857
+ # "result": {
2858
+ # "spot_tier": "3",
2859
+ # "deriv_tier": "3",
2860
+ # "effective_spot_maker_rate_bps": "6.5",
2861
+ # "effective_spot_taker_rate_bps": "6.9",
2862
+ # "effective_deriv_maker_rate_bps": "1.1",
2863
+ # "effective_deriv_taker_rate_bps": "3"
2864
+ # }
2865
+ # }
2866
+ #
2867
+ result = self.safe_dict(response, 'result', {})
2868
+ return self.parse_trading_fees(result)
2869
+
2870
+ def parse_trading_fees(self, response):
2871
+ #
2872
+ # {
2873
+ # "spot_tier": "3",
2874
+ # "deriv_tier": "3",
2875
+ # "effective_spot_maker_rate_bps": "6.5",
2876
+ # "effective_spot_taker_rate_bps": "6.9",
2877
+ # "effective_deriv_maker_rate_bps": "1.1",
2878
+ # "effective_deriv_taker_rate_bps": "3"
2879
+ # }
2880
+ #
2881
+ result: dict = {}
2882
+ result['info'] = response
2883
+ for i in range(0, len(self.symbols)):
2884
+ symbol = self.symbols[i]
2885
+ market = self.market(symbol)
2886
+ isSwap = market['swap']
2887
+ takerFeeKey = 'effective_deriv_taker_rate_bps' if isSwap else 'effective_spot_taker_rate_bps'
2888
+ makerFeeKey = 'effective_deriv_maker_rate_bps' if isSwap else 'effective_spot_maker_rate_bps'
2889
+ tradingFee = {
2890
+ 'info': response,
2891
+ 'symbol': symbol,
2892
+ 'maker': self.parse_number(Precise.string_div(self.safe_string(response, makerFeeKey), '10000')),
2893
+ 'taker': self.parse_number(Precise.string_div(self.safe_string(response, takerFeeKey), '10000')),
2894
+ 'percentage': None,
2895
+ 'tierBased': None,
2896
+ }
2897
+ result[symbol] = tradingFee
2898
+ return result
2899
+
2900
+ def parse_trading_fee(self, fee: dict, market: Market = None) -> TradingFeeInterface:
2901
+ #
2902
+ # {
2903
+ # "instrument_name": "BTC_USD",
2904
+ # "effective_maker_rate_bps": "6.5",
2905
+ # "effective_taker_rate_bps": "6.9"
2906
+ # }
2907
+ #
2908
+ marketId = self.safe_string(fee, 'instrument_name')
2909
+ symbol = self.safe_symbol(marketId, market)
2910
+ return {
2911
+ 'info': fee,
2912
+ 'symbol': symbol,
2913
+ 'maker': self.parse_number(Precise.string_div(self.safe_string(fee, 'effective_maker_rate_bps'), '10000')),
2914
+ 'taker': self.parse_number(Precise.string_div(self.safe_string(fee, 'effective_taker_rate_bps'), '10000')),
2915
+ 'percentage': None,
2916
+ 'tierBased': None,
2917
+ }
2918
+
2809
2919
  def sign(self, path, api='public', method='GET', params={}, headers=None, body=None):
2810
2920
  type = self.safe_string(api, 0)
2811
2921
  access = self.safe_string(api, 1)
@@ -1181,6 +1181,26 @@ class kraken(Exchange, ImplicitAPI):
1181
1181
  # "misc": ''
1182
1182
  # }
1183
1183
  #
1184
+ # fetchMyTrades
1185
+ #
1186
+ # {
1187
+ # "ordertxid": "OSJVN7-A2AE-63WZV",
1188
+ # "postxid": "TBP7O6-PNXI-CONU",
1189
+ # "pair": "XXBTZUSD",
1190
+ # "time": 1710429248.3052235,
1191
+ # "type": "sell",
1192
+ # "ordertype": "liquidation market",
1193
+ # "price": "72026.50000",
1194
+ # "cost": "7.20265",
1195
+ # "fee": "0.01873",
1196
+ # "vol": "0.00010000",
1197
+ # "margin": "1.44053",
1198
+ # "leverage": "5",
1199
+ # "misc": "closing",
1200
+ # "trade_id": 68230622,
1201
+ # "maker": False
1202
+ # }
1203
+ #
1184
1204
  timestamp = None
1185
1205
  side = None
1186
1206
  type = None
@@ -1227,6 +1247,10 @@ class kraken(Exchange, ImplicitAPI):
1227
1247
  if market is not None:
1228
1248
  symbol = market['symbol']
1229
1249
  cost = self.safe_string(trade, 'cost')
1250
+ maker = self.safe_bool(trade, 'maker')
1251
+ takerOrMaker = None
1252
+ if maker is not None:
1253
+ takerOrMaker = 'maker' if maker else 'taker'
1230
1254
  return self.safe_trade({
1231
1255
  'id': id,
1232
1256
  'order': orderId,
@@ -1236,7 +1260,7 @@ class kraken(Exchange, ImplicitAPI):
1236
1260
  'symbol': symbol,
1237
1261
  'type': type,
1238
1262
  'side': side,
1239
- 'takerOrMaker': None,
1263
+ 'takerOrMaker': takerOrMaker,
1240
1264
  'price': price,
1241
1265
  'amount': amount,
1242
1266
  'cost': cost,
@@ -2001,7 +2025,10 @@ class kraken(Exchange, ImplicitAPI):
2001
2025
  # "fee": "0.000026",
2002
2026
  # "vol": "16.00000000",
2003
2027
  # "margin": "0.000000",
2028
+ # "leverage": "5",
2004
2029
  # "misc": ""
2030
+ # "trade_id": 68230622,
2031
+ # "maker": False
2005
2032
  # },
2006
2033
  # ...
2007
2034
  # },
@@ -137,6 +137,7 @@ class kucoinfutures(kucoin, ImplicitAPI):
137
137
  'contracts/{symbol}': 1,
138
138
  'contracts/risk-limit/{symbol}': 1,
139
139
  'ticker': 1,
140
+ 'allTickers': 1,
140
141
  'level2/snapshot': 1.33,
141
142
  'level2/depth{limit}': 1,
142
143
  'level2/message/query': 1,
@@ -180,6 +181,7 @@ class kucoinfutures(kucoin, ImplicitAPI):
180
181
  'trade-statistics': 1,
181
182
  'trade-fees': 1,
182
183
  'history-positions': 1,
184
+ 'getMaxOpenSize': 1,
183
185
  },
184
186
  'post': {
185
187
  'withdrawals': 1,
@@ -325,6 +327,9 @@ class kucoinfutures(kucoin, ImplicitAPI):
325
327
  # endpoint versions
326
328
  'versions': {
327
329
  'futuresPrivate': {
330
+ 'GET': {
331
+ 'getMaxOpenSize': 'v2',
332
+ },
328
333
  'POST': {
329
334
  'transfer-out': 'v2',
330
335
  },
@@ -1158,7 +1158,7 @@ class mexc(Exchange, ImplicitAPI):
1158
1158
  # "symbols": [
1159
1159
  # {
1160
1160
  # "symbol": "OGNUSDT",
1161
- # "status": "ENABLED",
1161
+ # "status": "1",
1162
1162
  # "baseAsset": "OGN",
1163
1163
  # "baseAssetPrecision": "2",
1164
1164
  # "quoteAsset": "USDT",
@@ -1203,7 +1203,7 @@ class mexc(Exchange, ImplicitAPI):
1203
1203
  status = self.safe_string(market, 'status')
1204
1204
  isSpotTradingAllowed = self.safe_value(market, 'isSpotTradingAllowed')
1205
1205
  active = False
1206
- if (status == 'ENABLED') and (isSpotTradingAllowed):
1206
+ if (status == '1') and (isSpotTradingAllowed):
1207
1207
  active = True
1208
1208
  isMarginTradingAllowed = self.safe_value(market, 'isMarginTradingAllowed')
1209
1209
  makerCommission = self.safe_number(market, 'makerCommission')
ccxt/base/errors.py CHANGED
@@ -16,6 +16,7 @@ error_hierarchy = {
16
16
  'MarginModeAlreadySet': {},
17
17
  },
18
18
  'MarketClosed': {},
19
+ 'ManualInteractionNeeded': {},
19
20
  },
20
21
  'InsufficientFunds': {},
21
22
  'InvalidAddress': {
@@ -106,6 +107,10 @@ class MarketClosed(OperationRejected):
106
107
  pass
107
108
 
108
109
 
110
+ class ManualInteractionNeeded(OperationRejected):
111
+ pass
112
+
113
+
109
114
  class InsufficientFunds(ExchangeError):
110
115
  pass
111
116
 
@@ -221,6 +226,7 @@ __all__ = [
221
226
  'NoChange',
222
227
  'MarginModeAlreadySet',
223
228
  'MarketClosed',
229
+ 'ManualInteractionNeeded',
224
230
  'InsufficientFunds',
225
231
  'InvalidAddress',
226
232
  'AddressPending',
ccxt/base/exchange.py CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  # -----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.3.84'
7
+ __version__ = '4.3.85'
8
8
 
9
9
  # -----------------------------------------------------------------------------
10
10
 
ccxt/bitmex.py CHANGED
@@ -2307,6 +2307,8 @@ class bitmex(Exchange, ImplicitAPI):
2307
2307
  # 'otpToken': '123456', # requires if two-factor auth(OTP) is enabled
2308
2308
  # 'fee': 0.001, # bitcoin network fee
2309
2309
  }
2310
+ if self.twofa is not None:
2311
+ request['otpToken'] = self.totp(self.twofa)
2310
2312
  response = self.privatePostUserRequestWithdrawal(self.extend(request, params))
2311
2313
  #
2312
2314
  # {
ccxt/bybit.py CHANGED
@@ -15,6 +15,7 @@ from ccxt.base.errors import ArgumentsRequired
15
15
  from ccxt.base.errors import BadRequest
16
16
  from ccxt.base.errors import NoChange
17
17
  from ccxt.base.errors import MarginModeAlreadySet
18
+ from ccxt.base.errors import ManualInteractionNeeded
18
19
  from ccxt.base.errors import InsufficientFunds
19
20
  from ccxt.base.errors import InvalidOrder
20
21
  from ccxt.base.errors import OrderNotFound
@@ -767,8 +768,11 @@ class bybit(Exchange, ImplicitAPI):
767
768
  '140069': PermissionDenied, # Do not allow OTC lending users to trade
768
769
  '140070': InvalidOrder, # ETP symbols are not allowed to be traded
769
770
  '170001': ExchangeError, # Internal error.
770
- '170007': RequestTimeout, # Timeout waiting for response from backend server.
771
771
  '170005': InvalidOrder, # Too many new orders; current limit is %s orders per %s.
772
+ '170007': RequestTimeout, # Timeout waiting for response from backend server.
773
+ '170010': InvalidOrder, # Purchase failed: Exceed the maximum position limit of leveraged tokens, the current available limit is %s USDT
774
+ '170011': InvalidOrder, # "Purchase failed: Exceed the maximum position limit of innovation tokens,
775
+ '170019': InvalidOrder, # the current available limit is replaceKey0 USDT"
772
776
  '170031': ExchangeError, # The feature has been suspended
773
777
  '170032': ExchangeError, # Network error. Please try again later
774
778
  '170033': InsufficientFunds, # margin Insufficient account balance
@@ -781,6 +785,7 @@ class bybit(Exchange, ImplicitAPI):
781
785
  '170116': InvalidOrder, # Invalid orderType.
782
786
  '170117': InvalidOrder, # Invalid side.
783
787
  '170121': InvalidOrder, # Invalid symbol.
788
+ '170124': InvalidOrder, # Order amount too large.
784
789
  '170130': BadRequest, # Data sent for paramter '%s' is not valid.
785
790
  '170131': InsufficientFunds, # Balance insufficient
786
791
  '170132': InvalidOrder, # Order price too high.
@@ -791,7 +796,6 @@ class bybit(Exchange, ImplicitAPI):
791
796
  '170137': InvalidOrder, # Order volume decimal too long
792
797
  '170139': InvalidOrder, # Order has been filled.
793
798
  '170140': InvalidOrder, # Transaction amount lower than the minimum.
794
- '170124': InvalidOrder, # Order amount too large.
795
799
  '170141': InvalidOrder, # Duplicate clientOrderId
796
800
  '170142': InvalidOrder, # Order has been canceled
797
801
  '170143': InvalidOrder, # Cannot be found on order book
@@ -816,6 +820,15 @@ class bybit(Exchange, ImplicitAPI):
816
820
  '170198': InvalidOrder, # Your order quantity to sell is too large. The filled price may deviate significantly from the market price. Please try again
817
821
  '170199': InvalidOrder, # Your order quantity to buy is too large. The filled price may deviate significantly from the nav. Please try again.
818
822
  '170200': InvalidOrder, # Your order quantity to sell is too large. The filled price may deviate significantly from the nav. Please try again.
823
+ '170201': PermissionDenied, # Your account has been restricted for trades. If you have any questions, please email us at support@bybit.com
824
+ '170202': InvalidOrder, # Invalid orderFilter parameter.
825
+ '170203': InvalidOrder, # Please enter the TP/SL price.
826
+ '170204': InvalidOrder, # trigger price cannot be higher than 110% price.
827
+ '170206': InvalidOrder, # trigger price cannot be lower than 90% of qty.
828
+ '170210': InvalidOrder, # New order rejected.
829
+ '170213': OrderNotFound, # Order does not exist.
830
+ '170217': InvalidOrder, # Only LIMIT-MAKER order is supported for the current pair.
831
+ '170218': InvalidOrder, # The LIMIT-MAKER order is rejected due to invalid price.
819
832
  '170221': BadRequest, # This coin does not exist.
820
833
  '170222': RateLimitExceeded, # Too many hasattr(self, requests) time frame.
821
834
  '170223': InsufficientFunds, # Your Spot Account with Institutional Lending triggers an alert or liquidation.
@@ -825,18 +838,7 @@ class bybit(Exchange, ImplicitAPI):
825
838
  '170228': InvalidOrder, # The purchase amount of each order exceeds the estimated maximum purchase amount.
826
839
  '170229': InvalidOrder, # The sell quantity per order exceeds the estimated maximum sell quantity.
827
840
  '170234': ExchangeError, # System Error
828
- '170210': InvalidOrder, # New order rejected.
829
- '170213': OrderNotFound, # Order does not exist.
830
- '170217': InvalidOrder, # Only LIMIT-MAKER order is supported for the current pair.
831
- '170218': InvalidOrder, # The LIMIT-MAKER order is rejected due to invalid price.
832
- '170010': InvalidOrder, # Purchase failed: Exceed the maximum position limit of leveraged tokens, the current available limit is %s USDT
833
- '170011': InvalidOrder, # "Purchase failed: Exceed the maximum position limit of innovation tokens,
834
- '170019': InvalidOrder, # the current available limit is replaceKey0 USDT"
835
- '170201': PermissionDenied, # Your account has been restricted for trades. If you have any questions, please email us at support@bybit.com
836
- '170202': InvalidOrder, # Invalid orderFilter parameter.
837
- '170203': InvalidOrder, # Please enter the TP/SL price.
838
- '170204': InvalidOrder, # trigger price cannot be higher than 110% price.
839
- '170206': InvalidOrder, # trigger price cannot be lower than 90% of qty.
841
+ '170241': ManualInteractionNeeded, # To proceed with trading, users must read through and confirm that they fully understand the project's risk disclosure document.
840
842
  '175000': InvalidOrder, # The serialNum is already in use.
841
843
  '175001': InvalidOrder, # Daily purchase limit has been exceeded. Please try again later.
842
844
  '175002': InvalidOrder, # There's a large number of purchase orders. Please try again later.
ccxt/cryptocom.py CHANGED
@@ -6,7 +6,7 @@
6
6
  from ccxt.base.exchange import Exchange
7
7
  from ccxt.abstract.cryptocom import ImplicitAPI
8
8
  import hashlib
9
- from ccxt.base.types import Account, Balances, Currency, Int, Market, Num, Order, OrderBook, OrderRequest, CancellationRequest, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, Transaction
9
+ from ccxt.base.types import Account, Balances, Currency, Int, Market, Num, Order, OrderBook, OrderRequest, CancellationRequest, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, TradingFeeInterface, TradingFees, Transaction
10
10
  from typing import List
11
11
  from ccxt.base.errors import ExchangeError
12
12
  from ccxt.base.errors import AuthenticationError
@@ -109,8 +109,8 @@ class cryptocom(Exchange, ImplicitAPI):
109
109
  'fetchTickers': True,
110
110
  'fetchTime': False,
111
111
  'fetchTrades': True,
112
- 'fetchTradingFee': False,
113
- 'fetchTradingFees': False,
112
+ 'fetchTradingFee': True,
113
+ 'fetchTradingFees': True,
114
114
  'fetchTransactionFees': False,
115
115
  'fetchTransactions': False,
116
116
  'fetchTransfers': False,
@@ -211,6 +211,8 @@ class cryptocom(Exchange, ImplicitAPI):
211
211
  'private/get-accounts': 10 / 3,
212
212
  'private/get-withdrawal-history': 10 / 3,
213
213
  'private/get-deposit-history': 10 / 3,
214
+ 'private/get-fee-rate': 2,
215
+ 'private/get-instrument-fee-rate': 2,
214
216
  'private/staking/stake': 2,
215
217
  'private/staking/unstake': 2,
216
218
  'private/staking/get-staking-position': 2,
@@ -2806,6 +2808,114 @@ class cryptocom(Exchange, ImplicitAPI):
2806
2808
  result = self.safe_dict(response, 'result')
2807
2809
  return self.parse_order(result, market)
2808
2810
 
2811
+ def fetch_trading_fee(self, symbol: str, params={}) -> TradingFeeInterface:
2812
+ """
2813
+ fetch the trading fees for a market
2814
+ :see: https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-get-instrument-fee-rate
2815
+ :param str symbol: unified market symbol
2816
+ :param dict [params]: extra parameters specific to the exchange API endpoint
2817
+ :returns dict: a `fee structure <https://docs.ccxt.com/#/?id=fee-structure>`
2818
+ """
2819
+ self.load_markets()
2820
+ market = self.market(symbol)
2821
+ request: dict = {
2822
+ 'instrument_name': market['id'],
2823
+ }
2824
+ response = self.v1PrivatePostPrivateGetInstrumentFeeRate(self.extend(request, params))
2825
+ #
2826
+ # {
2827
+ # "id": 1,
2828
+ # "code": 0,
2829
+ # "method": "private/staking/unstake",
2830
+ # "result": {
2831
+ # "staking_id": "1",
2832
+ # "instrument_name": "SOL.staked",
2833
+ # "status": "NEW",
2834
+ # "quantity": "1",
2835
+ # "underlying_inst_name": "SOL",
2836
+ # "reason": "NO_ERROR"
2837
+ # }
2838
+ # }
2839
+ #
2840
+ data = self.safe_dict(response, 'result', {})
2841
+ return self.parse_trading_fee(data, market)
2842
+
2843
+ def fetch_trading_fees(self, params={}) -> TradingFees:
2844
+ """
2845
+ :see: https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-get-fee-rate
2846
+ fetch the trading fees for multiple markets
2847
+ :param dict [params]: extra parameters specific to the exchange API endpoint
2848
+ :returns dict: a dictionary of `fee structures <https://docs.ccxt.com/#/?id=fee-structure>` indexed by market symbols
2849
+ """
2850
+ self.load_markets()
2851
+ response = self.v1PrivatePostPrivateGetFeeRate(params)
2852
+ #
2853
+ # {
2854
+ # "id": 1,
2855
+ # "method": "/private/get-fee-rate",
2856
+ # "code": 0,
2857
+ # "result": {
2858
+ # "spot_tier": "3",
2859
+ # "deriv_tier": "3",
2860
+ # "effective_spot_maker_rate_bps": "6.5",
2861
+ # "effective_spot_taker_rate_bps": "6.9",
2862
+ # "effective_deriv_maker_rate_bps": "1.1",
2863
+ # "effective_deriv_taker_rate_bps": "3"
2864
+ # }
2865
+ # }
2866
+ #
2867
+ result = self.safe_dict(response, 'result', {})
2868
+ return self.parse_trading_fees(result)
2869
+
2870
+ def parse_trading_fees(self, response):
2871
+ #
2872
+ # {
2873
+ # "spot_tier": "3",
2874
+ # "deriv_tier": "3",
2875
+ # "effective_spot_maker_rate_bps": "6.5",
2876
+ # "effective_spot_taker_rate_bps": "6.9",
2877
+ # "effective_deriv_maker_rate_bps": "1.1",
2878
+ # "effective_deriv_taker_rate_bps": "3"
2879
+ # }
2880
+ #
2881
+ result: dict = {}
2882
+ result['info'] = response
2883
+ for i in range(0, len(self.symbols)):
2884
+ symbol = self.symbols[i]
2885
+ market = self.market(symbol)
2886
+ isSwap = market['swap']
2887
+ takerFeeKey = 'effective_deriv_taker_rate_bps' if isSwap else 'effective_spot_taker_rate_bps'
2888
+ makerFeeKey = 'effective_deriv_maker_rate_bps' if isSwap else 'effective_spot_maker_rate_bps'
2889
+ tradingFee = {
2890
+ 'info': response,
2891
+ 'symbol': symbol,
2892
+ 'maker': self.parse_number(Precise.string_div(self.safe_string(response, makerFeeKey), '10000')),
2893
+ 'taker': self.parse_number(Precise.string_div(self.safe_string(response, takerFeeKey), '10000')),
2894
+ 'percentage': None,
2895
+ 'tierBased': None,
2896
+ }
2897
+ result[symbol] = tradingFee
2898
+ return result
2899
+
2900
+ def parse_trading_fee(self, fee: dict, market: Market = None) -> TradingFeeInterface:
2901
+ #
2902
+ # {
2903
+ # "instrument_name": "BTC_USD",
2904
+ # "effective_maker_rate_bps": "6.5",
2905
+ # "effective_taker_rate_bps": "6.9"
2906
+ # }
2907
+ #
2908
+ marketId = self.safe_string(fee, 'instrument_name')
2909
+ symbol = self.safe_symbol(marketId, market)
2910
+ return {
2911
+ 'info': fee,
2912
+ 'symbol': symbol,
2913
+ 'maker': self.parse_number(Precise.string_div(self.safe_string(fee, 'effective_maker_rate_bps'), '10000')),
2914
+ 'taker': self.parse_number(Precise.string_div(self.safe_string(fee, 'effective_taker_rate_bps'), '10000')),
2915
+ 'percentage': None,
2916
+ 'tierBased': None,
2917
+ }
2918
+
2809
2919
  def sign(self, path, api='public', method='GET', params={}, headers=None, body=None):
2810
2920
  type = self.safe_string(api, 0)
2811
2921
  access = self.safe_string(api, 1)
ccxt/kraken.py CHANGED
@@ -1181,6 +1181,26 @@ class kraken(Exchange, ImplicitAPI):
1181
1181
  # "misc": ''
1182
1182
  # }
1183
1183
  #
1184
+ # fetchMyTrades
1185
+ #
1186
+ # {
1187
+ # "ordertxid": "OSJVN7-A2AE-63WZV",
1188
+ # "postxid": "TBP7O6-PNXI-CONU",
1189
+ # "pair": "XXBTZUSD",
1190
+ # "time": 1710429248.3052235,
1191
+ # "type": "sell",
1192
+ # "ordertype": "liquidation market",
1193
+ # "price": "72026.50000",
1194
+ # "cost": "7.20265",
1195
+ # "fee": "0.01873",
1196
+ # "vol": "0.00010000",
1197
+ # "margin": "1.44053",
1198
+ # "leverage": "5",
1199
+ # "misc": "closing",
1200
+ # "trade_id": 68230622,
1201
+ # "maker": False
1202
+ # }
1203
+ #
1184
1204
  timestamp = None
1185
1205
  side = None
1186
1206
  type = None
@@ -1227,6 +1247,10 @@ class kraken(Exchange, ImplicitAPI):
1227
1247
  if market is not None:
1228
1248
  symbol = market['symbol']
1229
1249
  cost = self.safe_string(trade, 'cost')
1250
+ maker = self.safe_bool(trade, 'maker')
1251
+ takerOrMaker = None
1252
+ if maker is not None:
1253
+ takerOrMaker = 'maker' if maker else 'taker'
1230
1254
  return self.safe_trade({
1231
1255
  'id': id,
1232
1256
  'order': orderId,
@@ -1236,7 +1260,7 @@ class kraken(Exchange, ImplicitAPI):
1236
1260
  'symbol': symbol,
1237
1261
  'type': type,
1238
1262
  'side': side,
1239
- 'takerOrMaker': None,
1263
+ 'takerOrMaker': takerOrMaker,
1240
1264
  'price': price,
1241
1265
  'amount': amount,
1242
1266
  'cost': cost,
@@ -2001,7 +2025,10 @@ class kraken(Exchange, ImplicitAPI):
2001
2025
  # "fee": "0.000026",
2002
2026
  # "vol": "16.00000000",
2003
2027
  # "margin": "0.000000",
2028
+ # "leverage": "5",
2004
2029
  # "misc": ""
2030
+ # "trade_id": 68230622,
2031
+ # "maker": False
2005
2032
  # },
2006
2033
  # ...
2007
2034
  # },
ccxt/kucoinfutures.py CHANGED
@@ -137,6 +137,7 @@ class kucoinfutures(kucoin, ImplicitAPI):
137
137
  'contracts/{symbol}': 1,
138
138
  'contracts/risk-limit/{symbol}': 1,
139
139
  'ticker': 1,
140
+ 'allTickers': 1,
140
141
  'level2/snapshot': 1.33,
141
142
  'level2/depth{limit}': 1,
142
143
  'level2/message/query': 1,
@@ -180,6 +181,7 @@ class kucoinfutures(kucoin, ImplicitAPI):
180
181
  'trade-statistics': 1,
181
182
  'trade-fees': 1,
182
183
  'history-positions': 1,
184
+ 'getMaxOpenSize': 1,
183
185
  },
184
186
  'post': {
185
187
  'withdrawals': 1,
@@ -325,6 +327,9 @@ class kucoinfutures(kucoin, ImplicitAPI):
325
327
  # endpoint versions
326
328
  'versions': {
327
329
  'futuresPrivate': {
330
+ 'GET': {
331
+ 'getMaxOpenSize': 'v2',
332
+ },
328
333
  'POST': {
329
334
  'transfer-out': 'v2',
330
335
  },
ccxt/mexc.py CHANGED
@@ -1158,7 +1158,7 @@ class mexc(Exchange, ImplicitAPI):
1158
1158
  # "symbols": [
1159
1159
  # {
1160
1160
  # "symbol": "OGNUSDT",
1161
- # "status": "ENABLED",
1161
+ # "status": "1",
1162
1162
  # "baseAsset": "OGN",
1163
1163
  # "baseAssetPrecision": "2",
1164
1164
  # "quoteAsset": "USDT",
@@ -1203,7 +1203,7 @@ class mexc(Exchange, ImplicitAPI):
1203
1203
  status = self.safe_string(market, 'status')
1204
1204
  isSpotTradingAllowed = self.safe_value(market, 'isSpotTradingAllowed')
1205
1205
  active = False
1206
- if (status == 'ENABLED') and (isSpotTradingAllowed):
1206
+ if (status == '1') and (isSpotTradingAllowed):
1207
1207
  active = True
1208
1208
  isMarginTradingAllowed = self.safe_value(market, 'isMarginTradingAllowed')
1209
1209
  makerCommission = self.safe_number(market, 'makerCommission')
ccxt/pro/__init__.py CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  # ----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.3.84'
7
+ __version__ = '4.3.85'
8
8
 
9
9
  # ----------------------------------------------------------------------------
10
10
 
ccxt/pro/binance.py CHANGED
@@ -228,7 +228,7 @@ class binance(ccxt.async_support.binance):
228
228
  else:
229
229
  for i in range(0, len(symbols)):
230
230
  market = self.market(symbols[i])
231
- subscriptionHashes.append(market['id'] + '@forceOrder')
231
+ subscriptionHashes.append(market['lowercaseId'] + '@forceOrder')
232
232
  messageHashes.append('liquidations::' + symbols[i])
233
233
  streamHash += '::' + ','.join(symbols)
234
234
  firstMarket = self.get_market_from_symbols(symbols)
ccxt/pro/bitget.py CHANGED
@@ -9,6 +9,7 @@ import hashlib
9
9
  from ccxt.base.types import Balances, Int, Order, OrderBook, Position, Str, Strings, Ticker, Tickers, Trade
10
10
  from ccxt.async_support.base.ws.client import Client
11
11
  from typing import List
12
+ from typing import Any
12
13
  from ccxt.base.errors import ExchangeError
13
14
  from ccxt.base.errors import AuthenticationError
14
15
  from ccxt.base.errors import ArgumentsRequired
@@ -429,6 +430,32 @@ class bitget(ccxt.async_support.bitget):
429
430
  """
430
431
  return await self.watch_order_book_for_symbols([symbol], limit, params)
431
432
 
433
+ async def un_watch_order_book(self, symbol: str, params={}) -> Any:
434
+ """
435
+ unsubscribe from the orderbook channel
436
+ :see: https://www.bitget.com/api-doc/spot/websocket/public/Depth-Channel
437
+ :see: https://www.bitget.com/api-doc/contract/websocket/public/Order-Book-Channel
438
+ :param str symbol: unified symbol of the market to fetch the order book for
439
+ :param int [params.limit]: orderbook limit, default is None
440
+ :returns dict: A dictionary of `order book structures <https://docs.ccxt.com/#/?id=order-book-structure>` indexed by market symbols
441
+ """
442
+ await self.load_markets()
443
+ market = self.market(symbol)
444
+ messageHash = 'unsubscribe:orderbook:' + market['symbol']
445
+ channel = 'books'
446
+ limit = self.safe_integer(params, 'limit')
447
+ if (limit == 1) or (limit == 5) or (limit == 15):
448
+ params = self.omit(params, 'limit')
449
+ channel += str(limit)
450
+ instType = None
451
+ instType, params = self.get_inst_type(market, params)
452
+ args: dict = {
453
+ 'instType': instType,
454
+ 'channel': channel,
455
+ 'instId': market['id'],
456
+ }
457
+ return await self.un_watch_public(messageHash, args, params)
458
+
432
459
  async def watch_order_book_for_symbols(self, symbols: List[str], limit: Int = None, params={}) -> OrderBook:
433
460
  """
434
461
  watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
@@ -542,10 +569,11 @@ class bitget(ccxt.async_support.bitget):
542
569
  calculatedChecksum = self.crc32(payload, True)
543
570
  responseChecksum = self.safe_integer(rawOrderBook, 'checksum')
544
571
  if calculatedChecksum != responseChecksum:
545
- del client.subscriptions[messageHash]
546
- del self.orderbooks[symbol]
547
- error = ChecksumError(self.id + ' ' + self.orderbook_checksum_message(symbol))
548
- client.reject(error, messageHash)
572
+ # if messageHash in client.subscriptions:
573
+ # # del client.subscriptions[messageHash]
574
+ # # del self.orderbooks[symbol]
575
+ # }
576
+ self.spawn(self.handle_check_sum_error, client, symbol, messageHash)
549
577
  return
550
578
  else:
551
579
  orderbook = self.order_book({})
@@ -554,6 +582,11 @@ class bitget(ccxt.async_support.bitget):
554
582
  self.orderbooks[symbol] = orderbook
555
583
  client.resolve(self.orderbooks[symbol], messageHash)
556
584
 
585
+ async def handle_check_sum_error(self, client: Client, symbol: str, messageHash: str):
586
+ await self.un_watch_order_book(symbol)
587
+ error = ChecksumError(self.id + ' ' + self.orderbook_checksum_message(symbol))
588
+ client.reject(error, messageHash)
589
+
557
590
  def handle_delta(self, bookside, delta):
558
591
  bidAsk = self.parse_bid_ask(delta, 0, 1)
559
592
  # we store the string representations in the orderbook for checksum calculation
@@ -1524,6 +1557,15 @@ class bitget(ccxt.async_support.bitget):
1524
1557
  message = self.extend(request, params)
1525
1558
  return await self.watch(url, messageHash, message, messageHash)
1526
1559
 
1560
+ async def un_watch_public(self, messageHash, args, params={}):
1561
+ url = self.urls['api']['ws']['public']
1562
+ request: dict = {
1563
+ 'op': 'unsubscribe',
1564
+ 'args': [args],
1565
+ }
1566
+ message = self.extend(request, params)
1567
+ return await self.watch(url, messageHash, message, messageHash)
1568
+
1527
1569
  async def watch_public_multiple(self, messageHashes, argsArray, params={}):
1528
1570
  url = self.urls['api']['ws']['public']
1529
1571
  request: dict = {
@@ -1637,6 +1679,17 @@ class bitget(ccxt.async_support.bitget):
1637
1679
  # "event": "subscribe",
1638
1680
  # "arg": {instType: 'SPOT', channel: "account", instId: "default"}
1639
1681
  # }
1682
+ # unsubscribe
1683
+ # {
1684
+ # "op":"unsubscribe",
1685
+ # "args":[
1686
+ # {
1687
+ # "instType":"USDT-FUTURES",
1688
+ # "channel":"ticker",
1689
+ # "instId":"BTCUSDT"
1690
+ # }
1691
+ # ]
1692
+ # }
1640
1693
  #
1641
1694
  if self.handle_error_message(client, message):
1642
1695
  return
@@ -1654,6 +1707,9 @@ class bitget(ccxt.async_support.bitget):
1654
1707
  if event == 'subscribe':
1655
1708
  self.handle_subscription_status(client, message)
1656
1709
  return
1710
+ if event == 'unsubscribe':
1711
+ self.handle_un_subscription_status(client, message)
1712
+ return
1657
1713
  methods: dict = {
1658
1714
  'ticker': self.handle_ticker,
1659
1715
  'trade': self.handle_trades,
@@ -1693,3 +1749,47 @@ class bitget(ccxt.async_support.bitget):
1693
1749
  # }
1694
1750
  #
1695
1751
  return message
1752
+
1753
+ def handle_un_subscription_status(self, client: Client, message):
1754
+ #
1755
+ # {
1756
+ # "op":"unsubscribe",
1757
+ # "args":[
1758
+ # {
1759
+ # "instType":"USDT-FUTURES",
1760
+ # "channel":"ticker",
1761
+ # "instId":"BTCUSDT"
1762
+ # },
1763
+ # {
1764
+ # "instType":"USDT-FUTURES",
1765
+ # "channel":"candle1m",
1766
+ # "instId":"BTCUSDT"
1767
+ # }
1768
+ # ]
1769
+ # }
1770
+ # or
1771
+ # {"event":"unsubscribe","arg":{"instType":"SPOT","channel":"books","instId":"BTCUSDT"}}
1772
+ #
1773
+ argsList = self.safe_list(message, 'args')
1774
+ if argsList is None:
1775
+ argsList = [self.safe_dict(message, 'arg', {})]
1776
+ for i in range(0, len(argsList)):
1777
+ arg = argsList[i]
1778
+ channel = self.safe_string(arg, 'channel')
1779
+ if channel == 'books':
1780
+ # for now only unWatchOrderBook is supporteod
1781
+ instType = self.safe_string_lower(arg, 'instType')
1782
+ type = 'spot' if (instType == 'spot') else 'contract'
1783
+ instId = self.safe_string(arg, 'instId')
1784
+ market = self.safe_market(instId, None, None, type)
1785
+ symbol = market['symbol']
1786
+ messageHash = 'unsubscribe:orderbook:' + market['symbol']
1787
+ subMessageHash = 'orderbook:' + symbol
1788
+ if symbol in self.orderbooks:
1789
+ del self.orderbooks[symbol]
1790
+ if subMessageHash in client.subscriptions:
1791
+ del client.subscriptions[subMessageHash]
1792
+ if messageHash in client.subscriptions:
1793
+ del client.subscriptions[messageHash]
1794
+ client.resolve(True, messageHash)
1795
+ return message
ccxt/pro/okx.py CHANGED
@@ -419,8 +419,13 @@ class okx(ccxt.async_support.okx):
419
419
  await self.load_markets()
420
420
  symbols = self.market_symbols(symbols, None, True, True)
421
421
  messageHash = 'liquidations'
422
+ messageHashes = []
422
423
  if symbols is not None:
423
- messageHash += '::' + ','.join(symbols)
424
+ for i in range(0, len(symbols)):
425
+ symbol = symbols[i]
426
+ messageHashes.append(messageHash + '::' + symbol)
427
+ else:
428
+ messageHashes.append(messageHash)
424
429
  market = self.get_market_from_symbols(symbols)
425
430
  type = None
426
431
  type, params = self.handle_market_type_and_params('watchliquidationsForSymbols', market, params)
@@ -431,9 +436,16 @@ class okx(ccxt.async_support.okx):
431
436
  type = 'futures'
432
437
  uppercaseType = type.upper()
433
438
  request = {
434
- 'instType': uppercaseType,
439
+ 'op': 'subscribe',
440
+ 'args': [
441
+ {
442
+ 'channel': channel,
443
+ 'instType': uppercaseType,
444
+ },
445
+ ],
435
446
  }
436
- newLiquidations = await self.subscribe('public', messageHash, channel, None, self.extend(request, params))
447
+ url = self.get_url(channel, 'public')
448
+ newLiquidations = await self.watch_multiple(url, messageHashes, request, messageHashes)
437
449
  if self.newUpdates:
438
450
  return newLiquidations
439
451
  return self.filter_by_symbols_since_limit(self.liquidations, symbols, since, limit, True)
@@ -1305,6 +1317,12 @@ class okx(ccxt.async_support.okx):
1305
1317
  for i in range(0, len(data)):
1306
1318
  rawPosition = data[i]
1307
1319
  position = self.parse_position(rawPosition)
1320
+ if position['contracts'] == 0:
1321
+ position['side'] = 'long'
1322
+ shortPosition = self.clone(position)
1323
+ shortPosition['side'] = 'short'
1324
+ cache.append(shortPosition)
1325
+ newPositions.append(shortPosition)
1308
1326
  newPositions.append(position)
1309
1327
  cache.append(position)
1310
1328
  messageHashes = self.find_message_hashes(client, channel + '::')
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ccxt
3
- Version: 4.3.84
3
+ Version: 4.3.85
4
4
  Summary: A JavaScript / TypeScript / Python / C# / PHP cryptocurrency trading library with support for 100+ exchanges
5
5
  Home-page: https://ccxt.com
6
6
  Author: Igor Kroitor
@@ -269,13 +269,13 @@ console.log(version, Object.keys(exchanges));
269
269
 
270
270
  All-in-one browser bundle (dependencies included), served from a CDN of your choice:
271
271
 
272
- * jsDelivr: https://cdn.jsdelivr.net/npm/ccxt@4.3.84/dist/ccxt.browser.min.js
273
- * unpkg: https://unpkg.com/ccxt@4.3.84/dist/ccxt.browser.min.js
272
+ * jsDelivr: https://cdn.jsdelivr.net/npm/ccxt@4.3.85/dist/ccxt.browser.min.js
273
+ * unpkg: https://unpkg.com/ccxt@4.3.85/dist/ccxt.browser.min.js
274
274
 
275
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.
276
276
 
277
277
  ```HTML
278
- <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/ccxt@4.3.84/dist/ccxt.browser.min.js"></script>
278
+ <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/ccxt@4.3.85/dist/ccxt.browser.min.js"></script>
279
279
  ```
280
280
 
281
281
  Creates a global `ccxt` object:
@@ -1,4 +1,4 @@
1
- ccxt/__init__.py,sha256=xC-AxNjzbac79_XlYeB4TOvksN8yURGPaJPdT4Uqjxk,16417
1
+ ccxt/__init__.py,sha256=TvTfX0u8diovLyug6K9bHFy7n3FVFUIo6N3zgsdNE_I,16500
2
2
  ccxt/ace.py,sha256=Gee4ymA83iAuBFm3J8NaTb7qmu9buV2trA676KCtSVg,42383
3
3
  ccxt/alpaca.py,sha256=HQuhQZSFGRlT-BaCUSEZmxpzYp6tll2zn63qn3gTmoU,47470
4
4
  ccxt/ascendex.py,sha256=4aEwibO_me6khr66z8JFqDBxe2gtFOWIFBE7ulBEJPs,151933
@@ -20,7 +20,7 @@ ccxt/bitflyer.py,sha256=biQ8-J_HSb9_S6HE1LBDd6BGpIZSMxK5JyTZ3Xg1SdI,41683
20
20
  ccxt/bitget.py,sha256=ZQvtdW3pnv-LVHG3a1UwR72b-K8Fq-BZ-tu_haz-v60,424620
21
21
  ccxt/bithumb.py,sha256=8oTnFWi8Ai9fnm5FPXvNmaUAVJEOqYi-18VC23cWmXY,47935
22
22
  ccxt/bitmart.py,sha256=U-QuxcYA6rMGGuD6RiTo1Mx-39uWX1at4uCNkdJFaV0,211937
23
- ccxt/bitmex.py,sha256=oOFatIOxvXIPOdOeeVau-IdryOeYpdCtTPGxX05HA9A,126861
23
+ ccxt/bitmex.py,sha256=R9N__wk5-f1f48lavJcty5J4VJYDhP0Hmx_UdqkAO3c,126952
24
24
  ccxt/bitopro.py,sha256=0m104rrKQXuXa3dThHGgqq0leIIcdN_nQTR3a9YJLLM,69322
25
25
  ccxt/bitpanda.py,sha256=aiwPkx9lKbVzt4ggoYdq_mIbMGtg5ZtGl2yRHO5xyz8,471
26
26
  ccxt/bitrue.py,sha256=Qy8YKJ0A3TdQv25oyc05wD6FHXBfLDp8GWHAaLDM71c,136636
@@ -35,7 +35,7 @@ ccxt/btcalpha.py,sha256=UcCCDZ_7EM-Q2tHU1IQPEA2DErFsLhrSfX-Oy-Q2uL4,36715
35
35
  ccxt/btcbox.py,sha256=9-P15L-OiZRzz0ZOtgO3bf73kuHro9u3NYf3QjeYv4k,27744
36
36
  ccxt/btcmarkets.py,sha256=0gMC0vvmuDJwcnllHMUZsQRV6QWA1-Cbq1N1F9rIUW8,52697
37
37
  ccxt/btcturk.py,sha256=bQ8sJq5iEj9oq2R17uDadPWKcnIQG8id5UmdlpHfFy8,36992
38
- ccxt/bybit.py,sha256=8RVgRPc2A4-fs2_EdLYHMB9_Lx-2e4EC4H3B84tKrUQ,418859
38
+ ccxt/bybit.py,sha256=EH9i0MS3psHYzkpiQSjw-rnLQou3-1e9v0NTs_nX2rM,419098
39
39
  ccxt/cex.py,sha256=YQtARIBP7cY3y-AqRarEH_mVh7_ftt18jLebhpL3hxQ,70084
40
40
  ccxt/coinbase.py,sha256=3L5CDWhg4MQlDkdZnuJxxOjmsWEh-gnqcV4R6nCq7rg,217483
41
41
  ccxt/coinbaseadvanced.py,sha256=d5g6nRx-NCcCwZDdtp8FsI2D-pRjSvnAP9ISSKY_nCQ,538
@@ -49,7 +49,7 @@ ccxt/coinmetro.py,sha256=1HqUu4ScH4oZbloodvn0l25y7DaUMl_5MjBf5v8z_cA,80591
49
49
  ccxt/coinone.py,sha256=qwsxTXTSxDS_zwIfmaB-acS4DWOlw6KY6eBkbTu8-mU,46708
50
50
  ccxt/coinsph.py,sha256=DIqcTDjosc3kufV78oUfFPer5bWC4MjRrl2oiBIUQkw,90858
51
51
  ccxt/coinspot.py,sha256=-9oRdHdc6iWrkxXxcVF9zBashNcRJSoFORwHRa9scMc,23876
52
- ccxt/cryptocom.py,sha256=44R7HZAeVUH6lISaWOSa0qh_LVrcuiiu3_ckICxJFnk,132037
52
+ ccxt/cryptocom.py,sha256=8ka-x1bxEIgbPmRzPeyDJdQ_cD7xLiMTdMAu5JFuh1M,136687
53
53
  ccxt/currencycom.py,sha256=1VrbHSrzDkf0VnzhEQLLGJPRF2LDtOq_gsj-4ZwT3ZY,87046
54
54
  ccxt/delta.py,sha256=2DotO5rmhl2JkaUyM13N4WR3jAqKBMlaZ4Wlv2tDBg0,150832
55
55
  ccxt/deribit.py,sha256=hs6yUT8s7sfmO-GJ9RZ9nQC7Y9vnp_2puTRrd9r1Plw,161350
@@ -69,17 +69,17 @@ ccxt/hyperliquid.py,sha256=r_xDktfiSdLDbxwkN_vCKSAu4n9uPyKVlWio-ligUms,109612
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=mn5wIpTR2TnoKFIm5A1N8AxZAE-Ck2hPsVSKJSOtJdE,130190
72
+ ccxt/kraken.py,sha256=67FEfEmLONiFIHGIKKqlGInGHEtj-E1tMJPhuIU3ytM,131190
73
73
  ccxt/krakenfutures.py,sha256=2K40RYEqHB2kgo9715eXc8O2SKcZpAb26iRdC70ftts,119521
74
74
  ccxt/kucoin.py,sha256=rwv5bdlaeFAMbo2vYpT3_mX_keeJmz5Nk5HF26Br3vA,226576
75
- ccxt/kucoinfutures.py,sha256=Mn9eflwmD_FmTCHYkRvyfxG3SU3Pgv9Hpj-6umYT3h8,124558
75
+ ccxt/kucoinfutures.py,sha256=bINtr0EBupNmE_IufzwRy7GuWHa5JtBmtrPk-WjhCno,124756
76
76
  ccxt/kuna.py,sha256=GnIMk8R_IL84FTUHDNP6jHxd2FKNX9YwfoCXoYG83uA,96157
77
77
  ccxt/latoken.py,sha256=JkfGMFYEQqE_2BG3EHQozelw6yxbHXu1TPebg4a3Cgg,79462
78
78
  ccxt/lbank.py,sha256=Glx9CN_jdQMiUngJLYioxzwDfgFTdusdOfK53_Bg6A8,116045
79
79
  ccxt/luno.py,sha256=mJqzQFX-DneQ6Wo0Dqfc7sG0OVmaPSKAkmRs1pM7Yj8,46191
80
80
  ccxt/lykke.py,sha256=RqjZ8TXHN_Bok2gXNsJX5jgMDb7GqMbpPPqBMHiLb0E,51408
81
81
  ccxt/mercado.py,sha256=LWCh89IzXu-yhPGqhkdPW6wqOqfO8nmbSQhAyYiSH8U,35710
82
- ccxt/mexc.py,sha256=JexIe_RjsbWtC7vfcgnIwHqniIL_OSbNSirk7od5C1Q,241442
82
+ ccxt/mexc.py,sha256=b7D09KB3di1iQvsqtbl6G-xPuZNzze3LNhsHQBiC_WY,241430
83
83
  ccxt/ndax.py,sha256=K4nlroc0lE0c3wETvYt_O5sfOrHmTiknpXfMIWdafzA,108947
84
84
  ccxt/novadax.py,sha256=_xFkuZ72vHhpJb1N9h_MQHRD05GDWlqUeLQQcOp43BM,64436
85
85
  ccxt/oceanex.py,sha256=DrsNIW-eXvaSHCB2l1valmiU9xMztxm1VNBJodMkWIY,38021
@@ -159,7 +159,7 @@ ccxt/abstract/coinmetro.py,sha256=W2eAbFInYZMm1BgfZMRuCX7i201hT4q6QCtie30-_AQ,39
159
159
  ccxt/abstract/coinone.py,sha256=X2gKABhQbzyFUs8MLo-VGyhG4CxgRSVa6qJsiJqubk0,8291
160
160
  ccxt/abstract/coinsph.py,sha256=b9r6_whKjx26f3ld_JtsFbGmF9awGLDViJV8SgXlE8Q,8007
161
161
  ccxt/abstract/coinspot.py,sha256=DVsqMQGmEZYESzYvaGBmctP3W229yF1__Y5KzGiI5RA,2707
162
- ccxt/abstract/cryptocom.py,sha256=qBAFvtpcKTtWES0wVwLI5rQur0j6BV_4oQ69f1JuBys,20433
162
+ ccxt/abstract/cryptocom.py,sha256=dU9ggQh3MBpsRPdDBOD-STSwCgtl05U50-LYq92DKh4,20757
163
163
  ccxt/abstract/currencycom.py,sha256=8T6Wn2n5KXpFv-nev5P314dMfndVemm7tBtI7qwFtqc,7563
164
164
  ccxt/abstract/delta.py,sha256=6OghLS5gTO5kVSnRmRnFMDi5ZszxgZetKq9FjnvawmY,5107
165
165
  ccxt/abstract/deribit.py,sha256=rS_982u8dOVsh2vGSB5TO7K8Tye0Alq-Rg9fYZwz8hg,15499
@@ -182,7 +182,7 @@ ccxt/abstract/indodax.py,sha256=E16v8W6Ac9kmV9hFEqf_kwV6VQmK74lc1LEUEkuDpYg,2488
182
182
  ccxt/abstract/kraken.py,sha256=AUpdQHWHZFXseHNx1-cuLqRutYwYEUVqQ7mjc0TQR_s,5883
183
183
  ccxt/abstract/krakenfutures.py,sha256=pu81cKhQgBkQd8F9-Ly3b7xQD-qQ8WLi8EUMfmAUJcM,4080
184
184
  ccxt/abstract/kucoin.py,sha256=IoPbxQ9p5pBot_wFTbwlmDerthGg4S03XGYVhCJvPE4,27951
185
- ccxt/abstract/kucoinfutures.py,sha256=UB4Hia-PbBg3oJdHtXS4q3MvAtLzISxGAGv5LAMLPU4,30664
185
+ ccxt/abstract/kucoinfutures.py,sha256=8L1ek3YnBLBRjcz_yEx8I4we-tOpGGVZQDQJOwecua0,30921
186
186
  ccxt/abstract/kuna.py,sha256=IsaLq8A4DUOlQ8Esyk0WqBU6hHm5Q4sIqhgnMIvDGX0,24579
187
187
  ccxt/abstract/latoken.py,sha256=1GqE9WxrubgZILnYvg7W_dGyui-FKeIv0bU4z1dQj1k,7168
188
188
  ccxt/abstract/lbank.py,sha256=pdut_cIcwcUhN_ZCyWJxixBc4dgeQqvENYqFCrUYrvA,8675
@@ -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=aORcbHfP4KpEc5qfYT1R7RlyB5TqUoyD-w1OXyfFs1U,16230
221
+ ccxt/async_support/__init__.py,sha256=2Wtec1h2Pb6lm1hUhRde0YbaszZwi6daqNQSd2GmYpA,16313
222
222
  ccxt/async_support/ace.py,sha256=zBmLUKH691a2BH1sPzlJPg-uO7lD6Ys92Rv8WSzNtoo,42607
223
223
  ccxt/async_support/alpaca.py,sha256=495vDvdF1IWlsh9QhUnMtkMuINdD0EzeFGlUVqCf8TE,47682
224
224
  ccxt/async_support/ascendex.py,sha256=LK259BdUqU0_STGRH6DmTgaR-7lXqFpZHFVACf2um5c,152721
@@ -240,7 +240,7 @@ ccxt/async_support/bitflyer.py,sha256=hIrGMxaM78V1i-gHN2FRFAhI2aaLR21mPAoIE33fW7
240
240
  ccxt/async_support/bitget.py,sha256=JloBQJwLONpLsNjzTxfabc-poDryi3xqwl66UNYi8DU,426244
241
241
  ccxt/async_support/bithumb.py,sha256=Q0Cx_cRKZRfdpBAhQyINm63Qw3M6BRYQRiF0UqYzfis,48214
242
242
  ccxt/async_support/bitmart.py,sha256=zIkhlHwCfAXP7Uli6PKZaZmsJV-CI8qFsKXqYo1XUxY,212893
243
- ccxt/async_support/bitmex.py,sha256=qSKH_dXDtpY5BUrLUbESI3a3WQhBFrc1ucv1N5GDuIU,127439
243
+ ccxt/async_support/bitmex.py,sha256=80LjlDRL4jsAPxDnddpq0r-3NwHTAjy-kbrefSr0bDY,127530
244
244
  ccxt/async_support/bitopro.py,sha256=HHESL0hiE0Rc0GRhFeIKnTs-eBzHEtOqqECANTSp0e0,69726
245
245
  ccxt/async_support/bitpanda.py,sha256=2k3URBWrpnh2xHa7JiYenI7_4MW5UeOPGzetlmRkR4U,485
246
246
  ccxt/async_support/bitrue.py,sha256=g2wFOSJhHEiBgGYx-mpROhWsqPExMBAS_Gewf1N7U6o,137294
@@ -255,7 +255,7 @@ ccxt/async_support/btcalpha.py,sha256=DgzrJ6cczUCDZr-QLUxMpazeudEFdQ_OzXiQiJM4Hb
255
255
  ccxt/async_support/btcbox.py,sha256=FGIj8il6VZL56_dDYsAMwp4DpdKNt_vbMXV6VZ2boCI,27968
256
256
  ccxt/async_support/btcmarkets.py,sha256=x1-s5uVioHyvNJoBxhxP8eUUslTDwQnZMU0FWfu1Fd4,53047
257
257
  ccxt/async_support/btcturk.py,sha256=P3bg0XG0sAi-8ge9ZFzQqZHsoGOGfxBjkhIDo4VPSK4,37210
258
- ccxt/async_support/bybit.py,sha256=PcNgqEEBqggWY4xHLUX2TZHhY7-U96Ne1Ps5CDGfoIw,420735
258
+ ccxt/async_support/bybit.py,sha256=0Nd0jRapYvZ5BFywVegbsZf_gFqkB64UNYP62TjhOkI,420974
259
259
  ccxt/async_support/cex.py,sha256=5KZ9qt4WsUAkH2rkHn7zW7SwlB9FumruLELdKF4LFoE,70434
260
260
  ccxt/async_support/coinbase.py,sha256=Ch_hFo2zj0qp4kuDUnebGD16pUeKs6h3HJxs5Fdpkco,218637
261
261
  ccxt/async_support/coinbaseadvanced.py,sha256=Kupwnuxiu_qTjwCNV2asacoDUNFQvcaHNAznUJPhdQs,552
@@ -269,7 +269,7 @@ ccxt/async_support/coinmetro.py,sha256=BloSsFuLoLTt_lnaZL051g75Yn1M2LIf7kMCZLOiY
269
269
  ccxt/async_support/coinone.py,sha256=i3zsrFAZZ1l5TStJWjt-C7TexFnr03dyKelhIfj4PIg,46950
270
270
  ccxt/async_support/coinsph.py,sha256=q40WnrointhQKzu8uXvPdb9aMbYTMRJmacIG7kac-n4,91292
271
271
  ccxt/async_support/coinspot.py,sha256=54ogK4qq8RNEnUIR17lpbGPIR9Ed1SXlDtxSKoxi1uQ,24034
272
- ccxt/async_support/cryptocom.py,sha256=DoBsEf9It28z8uuUkrVhnuek5yC5nYf650ruz3U18Uk,132609
272
+ ccxt/async_support/cryptocom.py,sha256=sj6D254j2wLJCSEqGRiaNThMhQtxjtntPcUspb5e-Y4,137295
273
273
  ccxt/async_support/currencycom.py,sha256=BRWAn5uBDcwR-1SyjJCSwkS83T_5tfUmCDymr9ZHFEs,87468
274
274
  ccxt/async_support/delta.py,sha256=aUIysAyPQgS3XV_T41R3HEPAB2xKCG5mF1UXQ-bS1K0,151440
275
275
  ccxt/async_support/deribit.py,sha256=JfdtFswWctlKE_GOjoxFIVKTNq-LUeuVik59MAx-u8s,162126
@@ -289,17 +289,17 @@ ccxt/async_support/hyperliquid.py,sha256=wFj9yXEojlPWK4JT6aOWFI08P9EwkWT9m7Furqi
289
289
  ccxt/async_support/idex.py,sha256=UcAvdMc2CP_6E8lET4rmQiIP-RaUfZHSo6pQeA17v-g,73731
290
290
  ccxt/async_support/independentreserve.py,sha256=fCTAQ1U74KOZHIoYbDxzEly1xSgykcYcdpeiJiCEXkU,37991
291
291
  ccxt/async_support/indodax.py,sha256=m6F8bSiEz9c6UQuadeOfC40rnmlAVKkj94C1uvsc9k0,53739
292
- ccxt/async_support/kraken.py,sha256=7NcBanzzk-4vzZ6mMbQocLJM6NnIEddLqyPmfFDgOUg,130840
292
+ ccxt/async_support/kraken.py,sha256=mOu4Ur2r2fs0HX61_SW5cG-IBNXcnDxHpBPDy0uJpz0,131840
293
293
  ccxt/async_support/krakenfutures.py,sha256=2r88_rC1cY7t4s8dgeqRUlwNC2NVaagS9wPAEonLAQs,120009
294
294
  ccxt/async_support/kucoin.py,sha256=XAOfLEyRUeHfS3pB5elec6F1M_ryPyaEKZle2rPFZDM,227677
295
- ccxt/async_support/kucoinfutures.py,sha256=uy8gNsJOI6SggxhYMH1TSTFM6rlzWvLknZL_KgCDLBE,125196
295
+ ccxt/async_support/kucoinfutures.py,sha256=X6TMi-Bjv2mijE8xGbg-qp9Ha8Nl7o1Z5LjEiDgxaJ8,125394
296
296
  ccxt/async_support/kuna.py,sha256=QtzLgqgv8mLXECN2drWNVtdvm_vy-bawdxKvozDzbVE,96573
297
297
  ccxt/async_support/latoken.py,sha256=iLypvfxDSW3PGHWLraibz0hBZV4ch5LYH5D24VOnIqk,79938
298
298
  ccxt/async_support/lbank.py,sha256=MeqPjECSmsplCtatu7Ns6sHRwzAGP_6S5MwB2BomnXk,116757
299
299
  ccxt/async_support/luno.py,sha256=F4t6XgboOe688S6bZCEnaF_ZEh_6f1YTqV6wRaddWo0,46529
300
300
  ccxt/async_support/lykke.py,sha256=UXQmNfWucuylickY0EBbrkahAoU-68B7k1B-EBNpC00,51722
301
301
  ccxt/async_support/mercado.py,sha256=mb7ULqvEr9PQ7jBOpQxiufgYzwTeAfr0G2NZmrUeUgs,35952
302
- ccxt/async_support/mexc.py,sha256=fmaaizeaOGz1Rt-ep1HOW4XyDrAIplmcOxR4Ksi1vbU,242620
302
+ ccxt/async_support/mexc.py,sha256=PRTAu__SQbXQh9tIG-d-fNYEz91Wvq-DaPPH_aAiW1Q,242608
303
303
  ccxt/async_support/ndax.py,sha256=M_DtH6Rtzpc8p4nwOwBkxMIf0yQNoVvRkOexcvNUK6k,109471
304
304
  ccxt/async_support/novadax.py,sha256=YNKUM1CGFK7lpBwbxSSL1IAEJCRVsNxeITkwtw6VWCM,64804
305
305
  ccxt/async_support/oceanex.py,sha256=85IHjCWsBZZXntKHPeuUpFYP9FV0Ik93gJsTlrGzhVA,38341
@@ -329,7 +329,7 @@ ccxt/async_support/yobit.py,sha256=GQhvYrsGHQrVdTrNHQxx9isEGqUABexlllzao9HL3f8,5
329
329
  ccxt/async_support/zaif.py,sha256=-ZTr8M2JaIRCL90VrbCDXBMAsZwbiwsFChSQ2rWODuQ,29044
330
330
  ccxt/async_support/zonda.py,sha256=jncr6Wg12S72CTpu6mCKCse1pm1f8oefVQurQSrFvP0,81733
331
331
  ccxt/async_support/base/__init__.py,sha256=aVYSsFi--b4InRs9zDN_wtCpj8odosAB726JdUHavrk,67
332
- ccxt/async_support/base/exchange.py,sha256=2OWQI4yYKUSFlbMvsIC2P5VQsDw9az1g51QcxOoL3R4,110799
332
+ ccxt/async_support/base/exchange.py,sha256=RfEwp_97diSEam3wDDniAkawSmcJWvao5nlckpUvWtY,110799
333
333
  ccxt/async_support/base/throttler.py,sha256=tvDVcdRUVYi8fZRlEcnqtgzcgB_KMUMRs5Pu8tuU-tU,1847
334
334
  ccxt/async_support/base/ws/__init__.py,sha256=uockzpLuwntKGZbs5EOWFe-Zg-k6Cj7GhNJLc_RX0so,1791
335
335
  ccxt/async_support/base/ws/aiohttp_client.py,sha256=5IEiT0elWI9a7Vr-KV0jgmlbpLJWBzIlrLaCkTKGaqY,5752
@@ -342,15 +342,15 @@ ccxt/async_support/base/ws/order_book.py,sha256=uBUaIHhzMRykpmo4BCsdJ-t_HozS6Vxh
342
342
  ccxt/async_support/base/ws/order_book_side.py,sha256=GhnGUt78pJ-AYL_Dq9produGjmBJLCI5FHIRdMz1O-g,6551
343
343
  ccxt/base/__init__.py,sha256=eTx1OE3HJjspFUQjGm6LBhaQiMKJnXjkdP-JUXknyQ0,1320
344
344
  ccxt/base/decimal_to_precision.py,sha256=fgWRBzRTtsf3r2INyS4f7WHlzgjB5YM1ekiwqD21aac,6634
345
- ccxt/base/errors.py,sha256=tosnf1tDaBn4YMCbWVNWyDYzqft-ImVtyjqJb6q83Y4,4369
346
- ccxt/base/exchange.py,sha256=noOssd9lkOx65w0VZTT28RhoaTYEAa11Q8qtZm-djh0,295904
345
+ ccxt/base/errors.py,sha256=khy0rlaZGU93pATGenSfHSdYk4f-HCMJpJz3VOTfw0E,4508
346
+ ccxt/base/exchange.py,sha256=9xgIvq08LnlqBmgvj7Fab3eDW6tbk_jqxRgrmKmfLnk,295904
347
347
  ccxt/base/precise.py,sha256=koce64Yrp6vFbGijJtUt-QQ6XhJgeGTCksZ871FPp_A,8886
348
348
  ccxt/base/types.py,sha256=TaP_RElKjGEZWuzyp4o4u2YhREyTG3rUeVT6gDffY9A,9613
349
- ccxt/pro/__init__.py,sha256=zJvE5fm49Ypdtd26y5jxcipKgh6nJZEulWqYFpO4IiQ,7608
349
+ ccxt/pro/__init__.py,sha256=35z5KPENamKPmfd3rWYQUUAQ385ZIEjWkgEyuKpVPXo,7608
350
350
  ccxt/pro/alpaca.py,sha256=xh1yg1Ok-Zh_Mfx-MBjNrfJDs6MUU0exFfEj3GuQPC4,27631
351
351
  ccxt/pro/ascendex.py,sha256=181FIeztchLqGmgecRJEN8F8xEM45D5aMKhC-5nuNfU,35467
352
352
  ccxt/pro/bequant.py,sha256=33OEUWBi4D9-2w8CmkwN3aF1qS-AlLqX3pxrWwNbXPY,1552
353
- ccxt/pro/binance.py,sha256=pFuGKmbf2gi6cTtQOuEwOWtczOQW5K9SYOTxswNuDlU,178067
353
+ ccxt/pro/binance.py,sha256=Q7E5xSUpoouqwbexBG4f9Nq-3Ziia8SwMHFfWMomZIo,178076
354
354
  ccxt/pro/binancecoinm.py,sha256=LlgF4rXHHrsQMaklhTEzSiE6U9V25AjHHg_DRat7Mf0,1036
355
355
  ccxt/pro/binanceus.py,sha256=_IXpS_wyH0nEtsLR7cJLtrUlsNQoG0MSUVo3PV0RDDc,1946
356
356
  ccxt/pro/binanceusdm.py,sha256=lLdOv0d-lM-1wfCc_y_POb6GdmVIiX7PFzmKTWsVyNw,1512
@@ -358,7 +358,7 @@ ccxt/pro/bingx.py,sha256=2wFRTui3vj2QGmisn--hjug0bRAgt9Mvru9AiWpXmZo,53911
358
358
  ccxt/pro/bitcoincom.py,sha256=zAX6hiz4hS6Un8dSGp88rpnvItxQHfNmsfF0IZ2xIVA,1181
359
359
  ccxt/pro/bitfinex.py,sha256=m4ERTUt7QIZhAYu8NP818wOHSLRi2vK-_Z5-LXD8zjA,25257
360
360
  ccxt/pro/bitfinex2.py,sha256=kZVHZwfu1_E27p9Cx55uDVGcEPA6Oy-BQk8t2fbwOmg,43058
361
- ccxt/pro/bitget.py,sha256=15JcegpMeu1HROmDtuTP3WmUw3lEoV4TYjBfWAWnCkk,74754
361
+ ccxt/pro/bitget.py,sha256=r_c6hVH1fwVKLpxgRTZ9r9arIPEr3uRGBgHeI_6ZAtk,78915
362
362
  ccxt/pro/bithumb.py,sha256=dqYKWebxFg4rsP7jg3oBnCUBcpZAoqAmZsozAU9pYds,16835
363
363
  ccxt/pro/bitmart.py,sha256=LxcP6aiCdwN-euseCMhsXZkhqesPJM-eLh549sGHHfo,62556
364
364
  ccxt/pro/bitmex.py,sha256=dNQf2EAim7kxgCM6I1TgFDl-e2zrXa2veicTEqu8WbQ,73949
@@ -401,7 +401,7 @@ ccxt/pro/luno.py,sha256=AzLK0_C0Hu25ukMNkMLP_sY3D4UG9FT38oawpo4jzTg,12336
401
401
  ccxt/pro/mexc.py,sha256=yiLfthMojs2T-sUzzhDjmTTNFc8Ob8S85ovpPb_I7Ts,43270
402
402
  ccxt/pro/ndax.py,sha256=fQsoYtrTEsCZB3hl-pavQytwQAaiMAiTyaCiOy1sVTg,22715
403
403
  ccxt/pro/okcoin.py,sha256=elwHzrWUSuU7Edp1oisxAnvst5IpxjyzgqLVMEHZWIU,30429
404
- ccxt/pro/okx.py,sha256=J59wN1DpFT6X3_OsD2sxqnB1OczrLPBKs-xvHGmYE60,84894
404
+ ccxt/pro/okx.py,sha256=rKAUOmT-BfnNzd7IPzgkgbeLJN2e29SOdLfrHboFbeM,85537
405
405
  ccxt/pro/onetrading.py,sha256=Qlr6LRRqO8te7QyTIhCk5nXJnupH8MtRWhQnH3Zc9yE,54769
406
406
  ccxt/pro/oxfun.py,sha256=gcmnoD0pzEDVIaiHyuU2ABoQBrxi0CTP62H2xZD0T7g,43943
407
407
  ccxt/pro/p2b.py,sha256=qulHrptdJ48MtOQ0bOZH3h_An8Ybu14cU6cJrySV5KQ,17897
@@ -648,8 +648,8 @@ ccxt/test/tests_async.py,sha256=NShOLO2-HzYsh07U7aiUGssiv-AZ_p88h-NuQub9OKU,8468
648
648
  ccxt/test/tests_helpers.py,sha256=xhOILoZ_x3RSfQjtKt6AQlkp9DkOtpTQe8GAUUZoM6s,10069
649
649
  ccxt/test/tests_init.py,sha256=eVwwUHujX9t4rjgo4TqEeg7DDhR1Hb_e2SJN8NVGyl0,998
650
650
  ccxt/test/tests_sync.py,sha256=6Arr2TcJpNg9eEpH_JQeBbLzaMPlb94J1P11HGlbpPg,83761
651
- ccxt-4.3.84.dist-info/LICENSE.txt,sha256=EIb9221AhMHV7xF1_55STFdKTFsnJVJYkRpY2Lnvo5w,1068
652
- ccxt-4.3.84.dist-info/METADATA,sha256=pGkNPDyr3HOUr1NMfiFmukg_XRKm00rSb5i1URnR0bE,116492
653
- ccxt-4.3.84.dist-info/WHEEL,sha256=z9j0xAa_JmUKMpmz72K0ZGALSM_n-wQVmGbleXx2VHg,110
654
- ccxt-4.3.84.dist-info/top_level.txt,sha256=CkQDuCTDKNcImPV60t36G6MdYfxsAPNiSaEwifVoVMo,5
655
- ccxt-4.3.84.dist-info/RECORD,,
651
+ ccxt-4.3.85.dist-info/LICENSE.txt,sha256=EIb9221AhMHV7xF1_55STFdKTFsnJVJYkRpY2Lnvo5w,1068
652
+ ccxt-4.3.85.dist-info/METADATA,sha256=i6wFHG-N5Gdq_DSkvyGtfMo_Ed_afgX1buo3VLo8ejY,116492
653
+ ccxt-4.3.85.dist-info/WHEEL,sha256=z9j0xAa_JmUKMpmz72K0ZGALSM_n-wQVmGbleXx2VHg,110
654
+ ccxt-4.3.85.dist-info/top_level.txt,sha256=CkQDuCTDKNcImPV60t36G6MdYfxsAPNiSaEwifVoVMo,5
655
+ ccxt-4.3.85.dist-info/RECORD,,
File without changes