ccxt 4.4.16__py2.py3-none-any.whl → 4.4.17__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.4.16'
25
+ __version__ = '4.4.17'
26
26
 
27
27
  # ----------------------------------------------------------------------------
28
28
 
ccxt/abstract/mexc.py CHANGED
@@ -56,6 +56,7 @@ class ImplicitAPI:
56
56
  spot_private_get_rebate_affiliate_commission_detail = spotPrivateGetRebateAffiliateCommissionDetail = Entry('rebate/affiliate/commission/detail', ['spot', 'private'], 'GET', {'cost': 1})
57
57
  spot_private_get_mxdeduct_enable = spotPrivateGetMxDeductEnable = Entry('mxDeduct/enable', ['spot', 'private'], 'GET', {'cost': 1})
58
58
  spot_private_get_userdatastream = spotPrivateGetUserDataStream = Entry('userDataStream', ['spot', 'private'], 'GET', {'cost': 1})
59
+ spot_private_get_selfsymbols = spotPrivateGetSelfSymbols = Entry('selfSymbols', ['spot', 'private'], 'GET', {'cost': 1})
59
60
  spot_private_post_order = spotPrivatePostOrder = Entry('order', ['spot', 'private'], 'POST', {'cost': 1})
60
61
  spot_private_post_order_test = spotPrivatePostOrderTest = Entry('order/test', ['spot', 'private'], 'POST', {'cost': 1})
61
62
  spot_private_post_sub_account_virtualsubaccount = spotPrivatePostSubAccountVirtualSubAccount = Entry('sub-account/virtualSubAccount', ['spot', 'private'], 'POST', {'cost': 1})
@@ -4,7 +4,7 @@
4
4
 
5
5
  # -----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.4.16'
7
+ __version__ = '4.4.17'
8
8
 
9
9
  # -----------------------------------------------------------------------------
10
10
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  # -----------------------------------------------------------------------------
4
4
 
5
- __version__ = '4.4.16'
5
+ __version__ = '4.4.17'
6
6
 
7
7
  # -----------------------------------------------------------------------------
8
8
 
@@ -2663,11 +2663,16 @@ class binance(Exchange, ImplicitAPI):
2663
2663
  apiBackup = self.safe_value(self.urls, 'apiBackup')
2664
2664
  if apiBackup is not None:
2665
2665
  return None
2666
- promises = [self.sapiGetCapitalConfigGetall(params), self.sapiGetMarginAllAssets(params)]
2666
+ promises = [self.sapiGetCapitalConfigGetall(params)]
2667
+ fetchMargins = self.safe_bool(self.options, 'fetchMargins', False)
2668
+ if fetchMargins:
2669
+ promises.append(self.sapiGetMarginAllPairs(params))
2667
2670
  results = await asyncio.gather(*promises)
2668
2671
  responseCurrencies = results[0]
2669
- responseMarginables = results[1]
2670
- marginablesById = self.index_by(responseMarginables, 'assetName')
2672
+ marginablesById = None
2673
+ if fetchMargins:
2674
+ responseMarginables = results[1]
2675
+ marginablesById = self.index_by(responseMarginables, 'assetName')
2671
2676
  result: dict = {}
2672
2677
  for i in range(0, len(responseCurrencies)):
2673
2678
  #
@@ -4115,7 +4120,7 @@ class binance(Exchange, ImplicitAPI):
4115
4120
  fetches mark price for the market
4116
4121
  :see: https://binance-docs.github.io/apidocs/futures/en/#mark-price
4117
4122
  :see: https://binance-docs.github.io/apidocs/delivery/en/#index-price-and-mark-price
4118
- :param str[] [symbols]: unified symbols of the markets to fetch the ticker for, all market tickers are returned if not assigned
4123
+ :param str symbol: unified symbol of the market to fetch the ticker for
4119
4124
  :param dict [params]: extra parameters specific to the exchange API endpoint
4120
4125
  :param str [params.subType]: "linear" or "inverse"
4121
4126
  :returns dict: a dictionary of `ticker structures <https://docs.ccxt.com/#/?id=ticker-structure>`
@@ -82,6 +82,7 @@ class bingx(Exchange, ImplicitAPI):
82
82
  'fetchMarginMode': True,
83
83
  'fetchMarkets': True,
84
84
  'fetchMarkOHLCV': True,
85
+ 'fetchMarkPrice': True,
85
86
  'fetchMarkPrices': True,
86
87
  'fetchMyLiquidations': True,
87
88
  'fetchOHLCV': True,
@@ -1657,6 +1658,59 @@ class bingx(Exchange, ImplicitAPI):
1657
1658
  tickers = self.safe_list(response, 'data')
1658
1659
  return self.parse_tickers(tickers, symbols)
1659
1660
 
1661
+ async def fetch_mark_price(self, symbol: str, params={}) -> Ticker:
1662
+ """
1663
+ fetches mark prices for the market
1664
+ :see: https://bingx-api.github.io/docs/#/en-us/swapV2/market-api.html#Mark%20Price%20and%20Funding%20Rate
1665
+ :param str symbol: unified symbol of the market to fetch the ticker for
1666
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1667
+ :returns dict: a dictionary of `ticker structures <https://docs.ccxt.com/#/?id=ticker-structure>`
1668
+ """
1669
+ await self.load_markets()
1670
+ market = self.market(symbol)
1671
+ subType = None
1672
+ subType, params = self.handle_sub_type_and_params('fetchMarkPrice', market, params, 'linear')
1673
+ request = {
1674
+ 'symbol': market['id'],
1675
+ }
1676
+ response = None
1677
+ if subType == 'inverse':
1678
+ response = await self.cswapV1PublicGetMarketPremiumIndex(self.extend(request, params))
1679
+ #
1680
+ # {
1681
+ # "code": 0,
1682
+ # "msg": "",
1683
+ # "timestamp": 1728577213289,
1684
+ # "data": [
1685
+ # {
1686
+ # "symbol": "ETH-USD",
1687
+ # "lastFundingRate": "0.0001",
1688
+ # "markPrice": "2402.68",
1689
+ # "indexPrice": "2404.92",
1690
+ # "nextFundingTime": 1728604800000
1691
+ # }
1692
+ # ]
1693
+ # }
1694
+ #
1695
+ else:
1696
+ response = await self.swapV2PublicGetQuotePremiumIndex(self.extend(request, params))
1697
+ #
1698
+ # {
1699
+ # "code": 0,
1700
+ # "msg": "",
1701
+ # "data": {
1702
+ # "symbol": "ETH-USDT",
1703
+ # "markPrice": "2408.40",
1704
+ # "indexPrice": "2409.62",
1705
+ # "lastFundingRate": "0.00009900",
1706
+ # "nextFundingTime": 1728604800000
1707
+ # }
1708
+ # }
1709
+ #
1710
+ if isinstance(response['data'], list):
1711
+ return self.parse_ticker(self.safe_dict(response['data'], 0, {}), market)
1712
+ return self.parse_ticker(response['data'], market)
1713
+
1660
1714
  async def fetch_mark_prices(self, symbols: Strings = None, params={}) -> Tickers:
1661
1715
  """
1662
1716
  fetches mark prices for multiple markets
@@ -458,9 +458,9 @@ class bitvavo(Exchange, ImplicitAPI):
458
458
  # },
459
459
  # ]
460
460
  #
461
- return self.parse_currencies(response)
461
+ return self.parse_currencies_custom(response)
462
462
 
463
- def parse_currencies(self, currencies):
463
+ def parse_currencies_custom(self, currencies):
464
464
  #
465
465
  # [
466
466
  # {
@@ -4539,7 +4539,7 @@ class bybit(Exchange, ImplicitAPI):
4539
4539
  length = len(result)
4540
4540
  if length == 0:
4541
4541
  isTrigger = self.safe_bool_n(params, ['trigger', 'stop'], False)
4542
- extra = '' if isTrigger else 'If you are trying to fetch SL/TP conditional order, you might try setting params["trigger"] = True'
4542
+ extra = '' if isTrigger else ' If you are trying to fetch SL/TP conditional order, you might try setting params["trigger"] = True'
4543
4543
  raise OrderNotFound('Order ' + str(id) + ' was not found.' + extra)
4544
4544
  if length > 1:
4545
4545
  raise InvalidOrder(self.id + ' returned more than one order')
@@ -4628,6 +4628,9 @@ class bybit(Exchange, ImplicitAPI):
4628
4628
  #
4629
4629
  result = self.safe_dict(response, 'result', {})
4630
4630
  innerList = self.safe_list(result, 'list', [])
4631
+ if len(innerList) == 0:
4632
+ extra = '' if isTrigger else ' If you are trying to fetch SL/TP conditional order, you might try setting params["trigger"] = True'
4633
+ raise OrderNotFound('Order ' + str(id) + ' was not found.' + extra)
4631
4634
  order = self.safe_dict(innerList, 0, {})
4632
4635
  return self.parse_order(order, market)
4633
4636
 
@@ -4778,7 +4781,7 @@ class bybit(Exchange, ImplicitAPI):
4778
4781
  length = len(result)
4779
4782
  if length == 0:
4780
4783
  isTrigger = self.safe_bool_n(params, ['trigger', 'stop'], False)
4781
- extra = '' if isTrigger else 'If you are trying to fetch SL/TP conditional order, you might try setting params["trigger"] = True'
4784
+ extra = '' if isTrigger else ' If you are trying to fetch SL/TP conditional order, you might try setting params["trigger"] = True'
4782
4785
  raise OrderNotFound('Order ' + str(id) + ' was not found.' + extra)
4783
4786
  if length > 1:
4784
4787
  raise InvalidOrder(self.id + ' returned more than one order')
@@ -4807,7 +4810,7 @@ class bybit(Exchange, ImplicitAPI):
4807
4810
  length = len(result)
4808
4811
  if length == 0:
4809
4812
  isTrigger = self.safe_bool_n(params, ['trigger', 'stop'], False)
4810
- extra = '' if isTrigger else 'If you are trying to fetch SL/TP conditional order, you might try setting params["trigger"] = True'
4813
+ extra = '' if isTrigger else ' If you are trying to fetch SL/TP conditional order, you might try setting params["trigger"] = True'
4811
4814
  raise OrderNotFound('Order ' + str(id) + ' was not found.' + extra)
4812
4815
  if length > 1:
4813
4816
  raise InvalidOrder(self.id + ' returned more than one order')
@@ -1315,13 +1315,9 @@ class coinbaseinternational(Exchange, ImplicitAPI):
1315
1315
  # ...
1316
1316
  # ]
1317
1317
  #
1318
- result: dict = {}
1319
- for i in range(0, len(currencies)):
1320
- currency = self.parse_currency(currencies[i])
1321
- result[currency['code']] = currency
1322
- return result
1318
+ return self.parse_currencies(currencies)
1323
1319
 
1324
- def parse_currency(self, currency: dict):
1320
+ def parse_currency(self, currency: dict) -> Currency:
1325
1321
  #
1326
1322
  # {
1327
1323
  # "asset_id":"1",
@@ -1335,7 +1331,7 @@ class coinbaseinternational(Exchange, ImplicitAPI):
1335
1331
  id = self.safe_string(currency, 'asset_name')
1336
1332
  code = self.safe_currency_code(id)
1337
1333
  statusId = self.safe_string(currency, 'status')
1338
- return {
1334
+ return self.safe_currency_structure({
1339
1335
  'id': id,
1340
1336
  'name': code,
1341
1337
  'code': code,
@@ -1348,7 +1344,7 @@ class coinbaseinternational(Exchange, ImplicitAPI):
1348
1344
  'fee': None,
1349
1345
  'fees': None,
1350
1346
  'limits': self.limits,
1351
- }
1347
+ })
1352
1348
 
1353
1349
  async def fetch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
1354
1350
  """
@@ -462,15 +462,7 @@ class kuna(Exchange, ImplicitAPI):
462
462
  data = self.safe_value(response, 'data', [])
463
463
  return self.parse_currencies(data)
464
464
 
465
- def parse_currencies(self, currencies, params={}):
466
- currencies = self.to_array(currencies)
467
- result: dict = {}
468
- for i in range(0, len(currencies)):
469
- currency = self.parse_currency(currencies[i])
470
- result[currency['code']] = currency
471
- return result
472
-
473
- def parse_currency(self, currency: dict):
465
+ def parse_currency(self, currency: dict) -> Currency:
474
466
  #
475
467
  # {
476
468
  # "code": "BTC",
@@ -494,7 +486,7 @@ class kuna(Exchange, ImplicitAPI):
494
486
  currencyId = self.safe_string(currency, 'code')
495
487
  precision = self.safe_string(currency, 'precision')
496
488
  tradePrecision = self.safe_string(currency, 'tradePrecision')
497
- return {
489
+ return self.safe_currency_structure({
498
490
  'info': currency,
499
491
  'id': currencyId,
500
492
  'code': self.safe_currency_code(currencyId),
@@ -505,7 +497,7 @@ class kuna(Exchange, ImplicitAPI):
505
497
  'deposit': None,
506
498
  'withdraw': None,
507
499
  'fee': None,
508
- 'precision': Precise.string_min(precision, tradePrecision),
500
+ 'precision': self.parse_number(Precise.string_min(precision, tradePrecision)),
509
501
  'limits': {
510
502
  'amount': {
511
503
  'min': None,
@@ -517,7 +509,7 @@ class kuna(Exchange, ImplicitAPI):
517
509
  },
518
510
  },
519
511
  'networks': {},
520
- }
512
+ })
521
513
 
522
514
  async def fetch_markets(self, params={}) -> List[Market]:
523
515
  """
@@ -243,6 +243,7 @@ class mexc(Exchange, ImplicitAPI):
243
243
  'rebate/affiliate/commission/detail': 1,
244
244
  'mxDeduct/enable': 1,
245
245
  'userDataStream': 1,
246
+ 'selfSymbols': 1,
246
247
  },
247
248
  'post': {
248
249
  'order': 1,
ccxt/async_support/okx.py CHANGED
@@ -123,6 +123,7 @@ class okx(Exchange, ImplicitAPI):
123
123
  'fetchMarketLeverageTiers': True,
124
124
  'fetchMarkets': True,
125
125
  'fetchMarkOHLCV': True,
126
+ 'fetchMarkPrice': True,
126
127
  'fetchMarkPrices': True,
127
128
  'fetchMySettlementHistory': False,
128
129
  'fetchMyTrades': True,
@@ -1958,6 +1959,37 @@ class okx(Exchange, ImplicitAPI):
1958
1959
  tickers = self.safe_list(response, 'data', [])
1959
1960
  return self.parse_tickers(tickers, symbols)
1960
1961
 
1962
+ async def fetch_mark_price(self, symbol: str, params={}) -> Ticker:
1963
+ """
1964
+ fetches mark price for the market
1965
+ :see: https://www.okx.com/docs-v5/en/#public-data-rest-api-get-mark-price
1966
+ :param str symbol: unified symbol of the market to fetch the ticker for
1967
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1968
+ :returns dict: a dictionary of `ticker structures <https://docs.ccxt.com/#/?id=ticker-structure>`
1969
+ """
1970
+ await self.load_markets()
1971
+ market = self.market(symbol)
1972
+ request: dict = {
1973
+ 'instId': market['id'],
1974
+ }
1975
+ response = await self.publicGetPublicMarkPrice(self.extend(request, params))
1976
+ #
1977
+ # {
1978
+ # "code": "0",
1979
+ # "data": [
1980
+ # {
1981
+ # "instId": "ETH-USDT",
1982
+ # "instType": "MARGIN",
1983
+ # "markPx": "2403.98",
1984
+ # "ts": "1728578500703"
1985
+ # }
1986
+ # ],
1987
+ # "msg": ""
1988
+ # }
1989
+ #
1990
+ data = self.safe_list(response, 'data')
1991
+ return self.parse_ticker(self.safe_dict(data, 0), market)
1992
+
1961
1993
  async def fetch_mark_prices(self, symbols: Strings = None, params={}) -> Tickers:
1962
1994
  """
1963
1995
  fetches price tickers for multiple markets, statistical information calculated over the past 24 hours for each market
@@ -1978,7 +2010,7 @@ class okx(Exchange, ImplicitAPI):
1978
2010
  defaultUnderlying = self.safe_string(self.options, 'defaultUnderlying', 'BTC-USD')
1979
2011
  currencyId = self.safe_string_2(params, 'uly', 'marketId', defaultUnderlying)
1980
2012
  if currencyId is None:
1981
- raise ArgumentsRequired(self.id + ' fetchTickers() requires an underlying uly or marketId parameter for options markets')
2013
+ raise ArgumentsRequired(self.id + ' fetchMarkPrices() requires an underlying uly or marketId parameter for options markets')
1982
2014
  else:
1983
2015
  request['uly'] = currencyId
1984
2016
  response = await self.publicGetPublicMarkPrice(self.extend(request, params))
@@ -359,11 +359,7 @@ class timex(Exchange, ImplicitAPI):
359
359
  # },
360
360
  # ]
361
361
  #
362
- result = []
363
- for i in range(0, len(response)):
364
- currency = response[i]
365
- result.append(self.parse_currency(currency))
366
- return self.index_by(result, 'code')
362
+ return self.parse_currencies(response)
367
363
 
368
364
  async def fetch_deposits(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Transaction]:
369
365
  """
@@ -1239,7 +1235,7 @@ class timex(Exchange, ImplicitAPI):
1239
1235
  'info': market,
1240
1236
  }
1241
1237
 
1242
- def parse_currency(self, currency: dict):
1238
+ def parse_currency(self, currency: dict) -> Currency:
1243
1239
  #
1244
1240
  # {
1245
1241
  # "symbol": "BTC",
@@ -1300,7 +1296,7 @@ class timex(Exchange, ImplicitAPI):
1300
1296
  for i in range(0, -dotIndex):
1301
1297
  fraction += '0'
1302
1298
  fee = self.parse_number(fraction + feeString)
1303
- return {
1299
+ return self.safe_currency_structure({
1304
1300
  'id': code,
1305
1301
  'code': code,
1306
1302
  'info': currency,
@@ -1316,7 +1312,7 @@ class timex(Exchange, ImplicitAPI):
1316
1312
  'amount': {'min': None, 'max': None},
1317
1313
  },
1318
1314
  'networks': {},
1319
- }
1315
+ })
1320
1316
 
1321
1317
  def parse_ticker(self, ticker: dict, market: Market = None) -> Ticker:
1322
1318
  #
ccxt/base/exchange.py CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  # -----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.4.16'
7
+ __version__ = '4.4.17'
8
8
 
9
9
  # -----------------------------------------------------------------------------
10
10
 
@@ -2491,6 +2491,18 @@ class Exchange(object):
2491
2491
  def fetch_trading_limits(self, symbols: Strings = None, params={}):
2492
2492
  raise NotSupported(self.id + ' fetchTradingLimits() is not supported yet')
2493
2493
 
2494
+ def parse_currency(self, rawCurrency: dict):
2495
+ raise NotSupported(self.id + ' parseCurrency() is not supported yet')
2496
+
2497
+ def parse_currencies(self, rawCurrencies):
2498
+ result = {}
2499
+ arr = self.to_array(rawCurrencies)
2500
+ for i in range(0, len(arr)):
2501
+ parsed = self.parse_currency(arr[i])
2502
+ code = parsed['code']
2503
+ result[code] = parsed
2504
+ return result
2505
+
2494
2506
  def parse_market(self, market: dict):
2495
2507
  raise NotSupported(self.id + ' parseMarket() is not supported yet')
2496
2508
 
ccxt/binance.py CHANGED
@@ -2662,11 +2662,16 @@ class binance(Exchange, ImplicitAPI):
2662
2662
  apiBackup = self.safe_value(self.urls, 'apiBackup')
2663
2663
  if apiBackup is not None:
2664
2664
  return None
2665
- promises = [self.sapiGetCapitalConfigGetall(params), self.sapiGetMarginAllAssets(params)]
2665
+ promises = [self.sapiGetCapitalConfigGetall(params)]
2666
+ fetchMargins = self.safe_bool(self.options, 'fetchMargins', False)
2667
+ if fetchMargins:
2668
+ promises.append(self.sapiGetMarginAllPairs(params))
2666
2669
  results = promises
2667
2670
  responseCurrencies = results[0]
2668
- responseMarginables = results[1]
2669
- marginablesById = self.index_by(responseMarginables, 'assetName')
2671
+ marginablesById = None
2672
+ if fetchMargins:
2673
+ responseMarginables = results[1]
2674
+ marginablesById = self.index_by(responseMarginables, 'assetName')
2670
2675
  result: dict = {}
2671
2676
  for i in range(0, len(responseCurrencies)):
2672
2677
  #
@@ -4114,7 +4119,7 @@ class binance(Exchange, ImplicitAPI):
4114
4119
  fetches mark price for the market
4115
4120
  :see: https://binance-docs.github.io/apidocs/futures/en/#mark-price
4116
4121
  :see: https://binance-docs.github.io/apidocs/delivery/en/#index-price-and-mark-price
4117
- :param str[] [symbols]: unified symbols of the markets to fetch the ticker for, all market tickers are returned if not assigned
4122
+ :param str symbol: unified symbol of the market to fetch the ticker for
4118
4123
  :param dict [params]: extra parameters specific to the exchange API endpoint
4119
4124
  :param str [params.subType]: "linear" or "inverse"
4120
4125
  :returns dict: a dictionary of `ticker structures <https://docs.ccxt.com/#/?id=ticker-structure>`
ccxt/bingx.py CHANGED
@@ -81,6 +81,7 @@ class bingx(Exchange, ImplicitAPI):
81
81
  'fetchMarginMode': True,
82
82
  'fetchMarkets': True,
83
83
  'fetchMarkOHLCV': True,
84
+ 'fetchMarkPrice': True,
84
85
  'fetchMarkPrices': True,
85
86
  'fetchMyLiquidations': True,
86
87
  'fetchOHLCV': True,
@@ -1656,6 +1657,59 @@ class bingx(Exchange, ImplicitAPI):
1656
1657
  tickers = self.safe_list(response, 'data')
1657
1658
  return self.parse_tickers(tickers, symbols)
1658
1659
 
1660
+ def fetch_mark_price(self, symbol: str, params={}) -> Ticker:
1661
+ """
1662
+ fetches mark prices for the market
1663
+ :see: https://bingx-api.github.io/docs/#/en-us/swapV2/market-api.html#Mark%20Price%20and%20Funding%20Rate
1664
+ :param str symbol: unified symbol of the market to fetch the ticker for
1665
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1666
+ :returns dict: a dictionary of `ticker structures <https://docs.ccxt.com/#/?id=ticker-structure>`
1667
+ """
1668
+ self.load_markets()
1669
+ market = self.market(symbol)
1670
+ subType = None
1671
+ subType, params = self.handle_sub_type_and_params('fetchMarkPrice', market, params, 'linear')
1672
+ request = {
1673
+ 'symbol': market['id'],
1674
+ }
1675
+ response = None
1676
+ if subType == 'inverse':
1677
+ response = self.cswapV1PublicGetMarketPremiumIndex(self.extend(request, params))
1678
+ #
1679
+ # {
1680
+ # "code": 0,
1681
+ # "msg": "",
1682
+ # "timestamp": 1728577213289,
1683
+ # "data": [
1684
+ # {
1685
+ # "symbol": "ETH-USD",
1686
+ # "lastFundingRate": "0.0001",
1687
+ # "markPrice": "2402.68",
1688
+ # "indexPrice": "2404.92",
1689
+ # "nextFundingTime": 1728604800000
1690
+ # }
1691
+ # ]
1692
+ # }
1693
+ #
1694
+ else:
1695
+ response = self.swapV2PublicGetQuotePremiumIndex(self.extend(request, params))
1696
+ #
1697
+ # {
1698
+ # "code": 0,
1699
+ # "msg": "",
1700
+ # "data": {
1701
+ # "symbol": "ETH-USDT",
1702
+ # "markPrice": "2408.40",
1703
+ # "indexPrice": "2409.62",
1704
+ # "lastFundingRate": "0.00009900",
1705
+ # "nextFundingTime": 1728604800000
1706
+ # }
1707
+ # }
1708
+ #
1709
+ if isinstance(response['data'], list):
1710
+ return self.parse_ticker(self.safe_dict(response['data'], 0, {}), market)
1711
+ return self.parse_ticker(response['data'], market)
1712
+
1659
1713
  def fetch_mark_prices(self, symbols: Strings = None, params={}) -> Tickers:
1660
1714
  """
1661
1715
  fetches mark prices for multiple markets
ccxt/bitvavo.py CHANGED
@@ -458,9 +458,9 @@ class bitvavo(Exchange, ImplicitAPI):
458
458
  # },
459
459
  # ]
460
460
  #
461
- return self.parse_currencies(response)
461
+ return self.parse_currencies_custom(response)
462
462
 
463
- def parse_currencies(self, currencies):
463
+ def parse_currencies_custom(self, currencies):
464
464
  #
465
465
  # [
466
466
  # {
ccxt/bybit.py CHANGED
@@ -4538,7 +4538,7 @@ class bybit(Exchange, ImplicitAPI):
4538
4538
  length = len(result)
4539
4539
  if length == 0:
4540
4540
  isTrigger = self.safe_bool_n(params, ['trigger', 'stop'], False)
4541
- extra = '' if isTrigger else 'If you are trying to fetch SL/TP conditional order, you might try setting params["trigger"] = True'
4541
+ extra = '' if isTrigger else ' If you are trying to fetch SL/TP conditional order, you might try setting params["trigger"] = True'
4542
4542
  raise OrderNotFound('Order ' + str(id) + ' was not found.' + extra)
4543
4543
  if length > 1:
4544
4544
  raise InvalidOrder(self.id + ' returned more than one order')
@@ -4627,6 +4627,9 @@ class bybit(Exchange, ImplicitAPI):
4627
4627
  #
4628
4628
  result = self.safe_dict(response, 'result', {})
4629
4629
  innerList = self.safe_list(result, 'list', [])
4630
+ if len(innerList) == 0:
4631
+ extra = '' if isTrigger else ' If you are trying to fetch SL/TP conditional order, you might try setting params["trigger"] = True'
4632
+ raise OrderNotFound('Order ' + str(id) + ' was not found.' + extra)
4630
4633
  order = self.safe_dict(innerList, 0, {})
4631
4634
  return self.parse_order(order, market)
4632
4635
 
@@ -4777,7 +4780,7 @@ class bybit(Exchange, ImplicitAPI):
4777
4780
  length = len(result)
4778
4781
  if length == 0:
4779
4782
  isTrigger = self.safe_bool_n(params, ['trigger', 'stop'], False)
4780
- extra = '' if isTrigger else 'If you are trying to fetch SL/TP conditional order, you might try setting params["trigger"] = True'
4783
+ extra = '' if isTrigger else ' If you are trying to fetch SL/TP conditional order, you might try setting params["trigger"] = True'
4781
4784
  raise OrderNotFound('Order ' + str(id) + ' was not found.' + extra)
4782
4785
  if length > 1:
4783
4786
  raise InvalidOrder(self.id + ' returned more than one order')
@@ -4806,7 +4809,7 @@ class bybit(Exchange, ImplicitAPI):
4806
4809
  length = len(result)
4807
4810
  if length == 0:
4808
4811
  isTrigger = self.safe_bool_n(params, ['trigger', 'stop'], False)
4809
- extra = '' if isTrigger else 'If you are trying to fetch SL/TP conditional order, you might try setting params["trigger"] = True'
4812
+ extra = '' if isTrigger else ' If you are trying to fetch SL/TP conditional order, you might try setting params["trigger"] = True'
4810
4813
  raise OrderNotFound('Order ' + str(id) + ' was not found.' + extra)
4811
4814
  if length > 1:
4812
4815
  raise InvalidOrder(self.id + ' returned more than one order')
@@ -1315,13 +1315,9 @@ class coinbaseinternational(Exchange, ImplicitAPI):
1315
1315
  # ...
1316
1316
  # ]
1317
1317
  #
1318
- result: dict = {}
1319
- for i in range(0, len(currencies)):
1320
- currency = self.parse_currency(currencies[i])
1321
- result[currency['code']] = currency
1322
- return result
1318
+ return self.parse_currencies(currencies)
1323
1319
 
1324
- def parse_currency(self, currency: dict):
1320
+ def parse_currency(self, currency: dict) -> Currency:
1325
1321
  #
1326
1322
  # {
1327
1323
  # "asset_id":"1",
@@ -1335,7 +1331,7 @@ class coinbaseinternational(Exchange, ImplicitAPI):
1335
1331
  id = self.safe_string(currency, 'asset_name')
1336
1332
  code = self.safe_currency_code(id)
1337
1333
  statusId = self.safe_string(currency, 'status')
1338
- return {
1334
+ return self.safe_currency_structure({
1339
1335
  'id': id,
1340
1336
  'name': code,
1341
1337
  'code': code,
@@ -1348,7 +1344,7 @@ class coinbaseinternational(Exchange, ImplicitAPI):
1348
1344
  'fee': None,
1349
1345
  'fees': None,
1350
1346
  'limits': self.limits,
1351
- }
1347
+ })
1352
1348
 
1353
1349
  def fetch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
1354
1350
  """
ccxt/kuna.py CHANGED
@@ -462,15 +462,7 @@ class kuna(Exchange, ImplicitAPI):
462
462
  data = self.safe_value(response, 'data', [])
463
463
  return self.parse_currencies(data)
464
464
 
465
- def parse_currencies(self, currencies, params={}):
466
- currencies = self.to_array(currencies)
467
- result: dict = {}
468
- for i in range(0, len(currencies)):
469
- currency = self.parse_currency(currencies[i])
470
- result[currency['code']] = currency
471
- return result
472
-
473
- def parse_currency(self, currency: dict):
465
+ def parse_currency(self, currency: dict) -> Currency:
474
466
  #
475
467
  # {
476
468
  # "code": "BTC",
@@ -494,7 +486,7 @@ class kuna(Exchange, ImplicitAPI):
494
486
  currencyId = self.safe_string(currency, 'code')
495
487
  precision = self.safe_string(currency, 'precision')
496
488
  tradePrecision = self.safe_string(currency, 'tradePrecision')
497
- return {
489
+ return self.safe_currency_structure({
498
490
  'info': currency,
499
491
  'id': currencyId,
500
492
  'code': self.safe_currency_code(currencyId),
@@ -505,7 +497,7 @@ class kuna(Exchange, ImplicitAPI):
505
497
  'deposit': None,
506
498
  'withdraw': None,
507
499
  'fee': None,
508
- 'precision': Precise.string_min(precision, tradePrecision),
500
+ 'precision': self.parse_number(Precise.string_min(precision, tradePrecision)),
509
501
  'limits': {
510
502
  'amount': {
511
503
  'min': None,
@@ -517,7 +509,7 @@ class kuna(Exchange, ImplicitAPI):
517
509
  },
518
510
  },
519
511
  'networks': {},
520
- }
512
+ })
521
513
 
522
514
  def fetch_markets(self, params={}) -> List[Market]:
523
515
  """
ccxt/mexc.py CHANGED
@@ -242,6 +242,7 @@ class mexc(Exchange, ImplicitAPI):
242
242
  'rebate/affiliate/commission/detail': 1,
243
243
  'mxDeduct/enable': 1,
244
244
  'userDataStream': 1,
245
+ 'selfSymbols': 1,
245
246
  },
246
247
  'post': {
247
248
  'order': 1,
ccxt/okx.py CHANGED
@@ -122,6 +122,7 @@ class okx(Exchange, ImplicitAPI):
122
122
  'fetchMarketLeverageTiers': True,
123
123
  'fetchMarkets': True,
124
124
  'fetchMarkOHLCV': True,
125
+ 'fetchMarkPrice': True,
125
126
  'fetchMarkPrices': True,
126
127
  'fetchMySettlementHistory': False,
127
128
  'fetchMyTrades': True,
@@ -1957,6 +1958,37 @@ class okx(Exchange, ImplicitAPI):
1957
1958
  tickers = self.safe_list(response, 'data', [])
1958
1959
  return self.parse_tickers(tickers, symbols)
1959
1960
 
1961
+ def fetch_mark_price(self, symbol: str, params={}) -> Ticker:
1962
+ """
1963
+ fetches mark price for the market
1964
+ :see: https://www.okx.com/docs-v5/en/#public-data-rest-api-get-mark-price
1965
+ :param str symbol: unified symbol of the market to fetch the ticker for
1966
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1967
+ :returns dict: a dictionary of `ticker structures <https://docs.ccxt.com/#/?id=ticker-structure>`
1968
+ """
1969
+ self.load_markets()
1970
+ market = self.market(symbol)
1971
+ request: dict = {
1972
+ 'instId': market['id'],
1973
+ }
1974
+ response = self.publicGetPublicMarkPrice(self.extend(request, params))
1975
+ #
1976
+ # {
1977
+ # "code": "0",
1978
+ # "data": [
1979
+ # {
1980
+ # "instId": "ETH-USDT",
1981
+ # "instType": "MARGIN",
1982
+ # "markPx": "2403.98",
1983
+ # "ts": "1728578500703"
1984
+ # }
1985
+ # ],
1986
+ # "msg": ""
1987
+ # }
1988
+ #
1989
+ data = self.safe_list(response, 'data')
1990
+ return self.parse_ticker(self.safe_dict(data, 0), market)
1991
+
1960
1992
  def fetch_mark_prices(self, symbols: Strings = None, params={}) -> Tickers:
1961
1993
  """
1962
1994
  fetches price tickers for multiple markets, statistical information calculated over the past 24 hours for each market
@@ -1977,7 +2009,7 @@ class okx(Exchange, ImplicitAPI):
1977
2009
  defaultUnderlying = self.safe_string(self.options, 'defaultUnderlying', 'BTC-USD')
1978
2010
  currencyId = self.safe_string_2(params, 'uly', 'marketId', defaultUnderlying)
1979
2011
  if currencyId is None:
1980
- raise ArgumentsRequired(self.id + ' fetchTickers() requires an underlying uly or marketId parameter for options markets')
2012
+ raise ArgumentsRequired(self.id + ' fetchMarkPrices() requires an underlying uly or marketId parameter for options markets')
1981
2013
  else:
1982
2014
  request['uly'] = currencyId
1983
2015
  response = self.publicGetPublicMarkPrice(self.extend(request, params))
ccxt/pro/__init__.py CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  # ----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.4.16'
7
+ __version__ = '4.4.17'
8
8
 
9
9
  # ----------------------------------------------------------------------------
10
10
 
ccxt/pro/bitvavo.py CHANGED
@@ -978,7 +978,7 @@ class bitvavo(ccxt.async_support.bitvavo):
978
978
  action = self.safe_string(message, 'action')
979
979
  messageHash = self.build_message_hash(action, message)
980
980
  response = self.safe_value(message, 'response')
981
- currencies = self.parseCurrencies(response)
981
+ currencies = self.parse_currencies(response)
982
982
  client.resolve(currencies, messageHash)
983
983
 
984
984
  def handle_trading_fees(self, client, message):
ccxt/timex.py CHANGED
@@ -359,11 +359,7 @@ class timex(Exchange, ImplicitAPI):
359
359
  # },
360
360
  # ]
361
361
  #
362
- result = []
363
- for i in range(0, len(response)):
364
- currency = response[i]
365
- result.append(self.parse_currency(currency))
366
- return self.index_by(result, 'code')
362
+ return self.parse_currencies(response)
367
363
 
368
364
  def fetch_deposits(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Transaction]:
369
365
  """
@@ -1239,7 +1235,7 @@ class timex(Exchange, ImplicitAPI):
1239
1235
  'info': market,
1240
1236
  }
1241
1237
 
1242
- def parse_currency(self, currency: dict):
1238
+ def parse_currency(self, currency: dict) -> Currency:
1243
1239
  #
1244
1240
  # {
1245
1241
  # "symbol": "BTC",
@@ -1300,7 +1296,7 @@ class timex(Exchange, ImplicitAPI):
1300
1296
  for i in range(0, -dotIndex):
1301
1297
  fraction += '0'
1302
1298
  fee = self.parse_number(fraction + feeString)
1303
- return {
1299
+ return self.safe_currency_structure({
1304
1300
  'id': code,
1305
1301
  'code': code,
1306
1302
  'info': currency,
@@ -1316,7 +1312,7 @@ class timex(Exchange, ImplicitAPI):
1316
1312
  'amount': {'min': None, 'max': None},
1317
1313
  },
1318
1314
  'networks': {},
1319
- }
1315
+ })
1320
1316
 
1321
1317
  def parse_ticker(self, ticker: dict, market: Market = None) -> Ticker:
1322
1318
  #
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ccxt
3
- Version: 4.4.16
3
+ Version: 4.4.17
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
@@ -271,13 +271,13 @@ console.log(version, Object.keys(exchanges));
271
271
 
272
272
  All-in-one browser bundle (dependencies included), served from a CDN of your choice:
273
273
 
274
- * jsDelivr: https://cdn.jsdelivr.net/npm/ccxt@4.4.16/dist/ccxt.browser.min.js
275
- * unpkg: https://unpkg.com/ccxt@4.4.16/dist/ccxt.browser.min.js
274
+ * jsDelivr: https://cdn.jsdelivr.net/npm/ccxt@4.4.17/dist/ccxt.browser.min.js
275
+ * unpkg: https://unpkg.com/ccxt@4.4.17/dist/ccxt.browser.min.js
276
276
 
277
277
  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.
278
278
 
279
279
  ```HTML
280
- <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/ccxt@4.4.16/dist/ccxt.browser.min.js"></script>
280
+ <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/ccxt@4.4.17/dist/ccxt.browser.min.js"></script>
281
281
  ```
282
282
 
283
283
  Creates a global `ccxt` object:
@@ -1,14 +1,14 @@
1
- ccxt/__init__.py,sha256=cDjpJnkfBOMVSe1HHMV-lgnvCVPZgL-GDV1RL4hS-7c,16486
1
+ ccxt/__init__.py,sha256=uv3YWaDd5C_hXF-Z1wqTwS73WYWb29AhRtk79NqtjMs,16486
2
2
  ccxt/ace.py,sha256=3KFlbRm6N9hXsKUsgZbQCFPZT5WGLm4HOjR19Q3uPts,42419
3
3
  ccxt/alpaca.py,sha256=nVQJ8vG4JrjEvMlu_nPoyR2lBq41j9Z2smPq95nDhng,47504
4
4
  ccxt/ascendex.py,sha256=aJ5_UysmRijYUvjenq5EDLldl2JUO6lXGofJ_NqPvJU,151676
5
5
  ccxt/bequant.py,sha256=RBiAmaTbL35DgiV3Hl6uchLUd78V0z1T9riTlNsrpdc,1174
6
6
  ccxt/bigone.py,sha256=mPYt5d9L4nCRnxwhVpwoBcpLLkt5E0ptOVzkveR_F28,91249
7
- ccxt/binance.py,sha256=vimOwA-nXcCrWYxq63d8lpsXjsucK8IVkbiqTw67kWw,656090
7
+ ccxt/binance.py,sha256=E42-WB-h_tDxnrLO91lGmu1XSjXhEz6CJa7reSnwv3w,656225
8
8
  ccxt/binancecoinm.py,sha256=arFnEh8mErSyi23eVPWE4iwoT7PWQyxGGVJCKCy6UJY,1702
9
9
  ccxt/binanceus.py,sha256=HRsk0fIoi8AAFdzRCUMkkXUGLqBrf0guUOfUxupHFeY,9202
10
10
  ccxt/binanceusdm.py,sha256=bAPcJj5HLxoCdPolriM8sJpoTBwbV78vBTbKRmWhNP4,2632
11
- ccxt/bingx.py,sha256=_KDCHBggvWBfVORV0wdofbxQ36_f17QHTCJ5T64ifEI,249751
11
+ ccxt/bingx.py,sha256=BcBa8ifYpcvqQaibtPTQXwoWAtRxjxow1nRtuk4U2F0,251948
12
12
  ccxt/bit2c.py,sha256=Y_YHvg90Sq3CayQ2lr1_wLYwz4wGR7G3NJARiv_jX8M,37254
13
13
  ccxt/bitbank.py,sha256=npoyV3c8uJ36nKofSzpMri590Yj_DIH0FAZg8o2EW6Y,43709
14
14
  ccxt/bitbay.py,sha256=xAIjzGRDVGwoy-Gygd99H0YN4wiaz_0lR0Z14oxaaxc,478
@@ -27,7 +27,7 @@ ccxt/bitrue.py,sha256=NQS636RfId1YBEEK2ZaI4rcdbB7L0vSU9AAoOinIJUA,136386
27
27
  ccxt/bitso.py,sha256=oLutbN5CT6lV0HxJaF-ibItY-sE_-wIVIkkqrkZpmSA,71785
28
28
  ccxt/bitstamp.py,sha256=W9stgPLf-N5utFoYWdaTzzqBPtzAZWN5u2nMwogzdRY,93437
29
29
  ccxt/bitteam.py,sha256=S5gDVlmAqoK_bOuCUmfyStFAApq2kDxQaUHHDf4byQM,102264
30
- ccxt/bitvavo.py,sha256=upuB871jsZYw61GEEmt_7s8w3ef3mrUYMOIwuOD9DdM,91841
30
+ ccxt/bitvavo.py,sha256=y7TzNtYqWl5Y-91Q_lazQiw4RoK5r9XbuHhF3RIh688,91855
31
31
  ccxt/bl3p.py,sha256=9i67YpJBrD-6pocvqq9ZyKjYXoOIwlJKuNHIW_jgmmM,20648
32
32
  ccxt/blockchaincom.py,sha256=IlqagAgla4SCYRU1ieYcU7Y138Bie5DF-udw2vctdVY,48948
33
33
  ccxt/blofin.py,sha256=0xD7MDAQ_lOFGOD0EKSQ-2Yirzz3XQtS66qo1JXD-6c,102039
@@ -35,12 +35,12 @@ ccxt/btcalpha.py,sha256=plU5SSsJn0ZMLW7I8sXb_L0Woc3-kamGMSlqPGujUzE,36751
35
35
  ccxt/btcbox.py,sha256=lvY7cgoe4tglaQiTJZ4vILmzvoEjAWxgswRuB2iYzmE,27780
36
36
  ccxt/btcmarkets.py,sha256=WDDbtbUQ9I0odVZp8nJdIjc4-zv4li49EDSt8EqQbRU,52733
37
37
  ccxt/btcturk.py,sha256=jSA4UnD1GiJu24gXNkfb94f-zXifP5By_Ptery_cMnY,37024
38
- ccxt/bybit.py,sha256=8VTK-oDB9aoeh62CGvES3E0AZXt--A8UFX9Se8kf6eg,441236
38
+ ccxt/bybit.py,sha256=XplwVNsQ_6pqa8uAYH2S_E-8LTULjyVCBwc9g6ZaGtA,441494
39
39
  ccxt/cex.py,sha256=C1j8Vk2duXt4TuKINJ7VWivVY54sOIo-FzE6dn_laWU,70211
40
40
  ccxt/coinbase.py,sha256=CNDpskULlvJ8PLjb0tXp_PifmYXYImX8ZjB4Kvx5NqY,218725
41
41
  ccxt/coinbaseadvanced.py,sha256=d5g6nRx-NCcCwZDdtp8FsI2D-pRjSvnAP9ISSKY_nCQ,538
42
42
  ccxt/coinbaseexchange.py,sha256=hSqkZw0y3EELtpsbJaMQXzc2nCbevVjHw6LDPcGH7_Y,79031
43
- ccxt/coinbaseinternational.py,sha256=XY6VLnNk3aefZfH5SbTxvNqowRbmEtUfeiGZUVIjzWE,97616
43
+ ccxt/coinbaseinternational.py,sha256=-hCiM3wE4_V0GHuNZimHx9SSV0ozBj4zkUZEAh0UxFg,97509
44
44
  ccxt/coincheck.py,sha256=SeNvZm_3p01IsW8y6b3rw67qiMu29S59HHPG6Jma_T4,35942
45
45
  ccxt/coinex.py,sha256=zb-hXwulprBR1q-ulztkFM1xurdXeEmbSMw-IGBm--g,258863
46
46
  ccxt/coinlist.py,sha256=KI49yKisargPm5nApMMfWfFs3e0Uxbx9yMRibY9n7Tw,104273
@@ -74,18 +74,18 @@ ccxt/kraken.py,sha256=qOJz1jNl7wKqvonYdPCqWIbj7uKfsPY1qSVXllc5w6Y,135904
74
74
  ccxt/krakenfutures.py,sha256=dbreVGrjMD7AY6xai0eazuvnUpTXTD7wLDVT9VDD5Qk,119839
75
75
  ccxt/kucoin.py,sha256=tdNUENPhjXh6xJm5ybDQhQTrCC0x6WDzrcFeGZiQFYU,231781
76
76
  ccxt/kucoinfutures.py,sha256=rpXIhIf1uAMKkyhY4_JzwQAv83n8EwTngY1LizWojaA,135136
77
- ccxt/kuna.py,sha256=qJViv1x15mtIATqu4w_bI6UsuxqH_qUBQgAH1AVJLVw,96314
77
+ ccxt/kuna.py,sha256=wL4QciCkKXgOSnmMP2mkSq9HlL7Gsz-c2s75rH5YZkA,96074
78
78
  ccxt/latoken.py,sha256=wBhaMcTEsB316nFCxm_WbLRZ_G2Q0Vi1FK-850Q07D0,79516
79
79
  ccxt/lbank.py,sha256=bBnT07L-6RHbmWwvyxZvbAfwP7lRKe6TSrDveyLZabA,116250
80
80
  ccxt/luno.py,sha256=P3cZ_CnVyjMjDFn5e7jaev-pqs_rgmWQTsiJThRtffE,46353
81
81
  ccxt/lykke.py,sha256=3la3ckeV8v_i7UdspYRJRwQ9ZzyHph88JK01kgXOeX8,51550
82
82
  ccxt/mercado.py,sha256=LWCh89IzXu-yhPGqhkdPW6wqOqfO8nmbSQhAyYiSH8U,35710
83
- ccxt/mexc.py,sha256=4dcpjaXIo-A7YZLp_tSAfukvrRs9ojST0Fzd61ALXtg,252827
83
+ ccxt/mexc.py,sha256=Kxowi1HvM9HUyukCa3xto2HI9mwdpEP0r0JgGFce66U,252873
84
84
  ccxt/ndax.py,sha256=EHlxGEi6RKnz2IDLdEGj8V4yVt8exliTJiP46J40a_8,110430
85
85
  ccxt/novadax.py,sha256=_xFkuZ72vHhpJb1N9h_MQHRD05GDWlqUeLQQcOp43BM,64436
86
86
  ccxt/oceanex.py,sha256=NRL1VUBdpkAZj0qFov-HB_TEwmIX6lyz3RdCW53B66A,41178
87
87
  ccxt/okcoin.py,sha256=Dvn7kOe6pvFLqkq3zA7DTWPQB6HmzoNLZ5tAeZ8gWwA,151307
88
- ccxt/okx.py,sha256=d7PRKsTHinZHVs09xx0obLSwlQNSU4PZzYXDO4DfaTo,383227
88
+ ccxt/okx.py,sha256=qKpTtxqGxVtIGkKHzjceu1FZRdPTP4VBiHJtyh5A6rM,384437
89
89
  ccxt/onetrading.py,sha256=0yQ1MNVcTrHlWYVU_D3FmeHkK1FT35zFans6e9KeRxA,88480
90
90
  ccxt/oxfun.py,sha256=uFrS6oO6rvyXmocqPwAxVzczg0IG-BZeqRmNcNcTTig,124875
91
91
  ccxt/p2b.py,sha256=iPzHv663K8F1F0uTWEYpfQBcaqowY8MQ5tZt2ZNpoQE,54290
@@ -95,7 +95,7 @@ ccxt/phemex.py,sha256=SdCk0DW9WSxSzyffSgVNMepWlBheRzj0Av-uETMP5Gk,224005
95
95
  ccxt/poloniex.py,sha256=-jsr_QurlQ-Zck6vUONWwBTHZe1g_CtSddxd3fDo4Kc,102504
96
96
  ccxt/poloniexfutures.py,sha256=pPAI2e0rGI6D7ESB8zVEb0faswQI1PKSESXBqZwcADs,80045
97
97
  ccxt/probit.py,sha256=NsGAJu5c3Ey7ebhEMkwGqVMgIDIAOTFL4cjQLJ1-kPs,76334
98
- ccxt/timex.py,sha256=0WTwb6bJfpCQvOvnOPtkkY9hRnga5ryiaIxGC54Rdgg,72120
98
+ ccxt/timex.py,sha256=UapOuKChUDl8rQuA2lteGvHzVGUI7_LSP8MCPyKdv0U,72010
99
99
  ccxt/tokocrypto.py,sha256=Lrw_ZKl9S_XbwapC85rrruHXOvoxFq_-ZKbHEBaGMEo,123226
100
100
  ccxt/tradeogre.py,sha256=YoSQQl4jHI2JJShR0k_liI0dCntDdnHDqZmc5a-y7-w,24168
101
101
  ccxt/upbit.py,sha256=JXHH1lG8QCWr7C_E3SWaEaIrk_rpF6NwYDEjcYGHcKE,85546
@@ -189,7 +189,7 @@ ccxt/abstract/lbank.py,sha256=pdut_cIcwcUhN_ZCyWJxixBc4dgeQqvENYqFCrUYrvA,8675
189
189
  ccxt/abstract/luno.py,sha256=QUsEL2MMhv6qF-4pW0o0xs9lI8HsZtlrAp3sBskq7i4,3619
190
190
  ccxt/abstract/lykke.py,sha256=PyLaU4RVPYTkPYsGgL2e2c9mtnz0xiy-LMOBSA4w_1g,2960
191
191
  ccxt/abstract/mercado.py,sha256=qs3Fr6C_K8M-YIsGx-W9iUiFXcgQ0SA8uADvhV8mDQM,2357
192
- ccxt/abstract/mexc.py,sha256=HzrpLRSJhT42IExFc3tzRWNcJNx-gUTeGcn9o2bzrbM,26192
192
+ ccxt/abstract/mexc.py,sha256=bJpZsS8YZVU2g-39E6OV-BYahAx6HMB7k7NVJJOc530,26317
193
193
  ccxt/abstract/ndax.py,sha256=M98Ys406KT6T19Y98dXriD6YjzfglHHbnfQw-PDYWtM,11878
194
194
  ccxt/abstract/novadax.py,sha256=IvQFP_v2Q-Sx0tK2bXx4oY81rtNwC7gkc75p_E2jhKw,3093
195
195
  ccxt/abstract/oceanex.py,sha256=JoK404UCkmMG2VqMaGit6PtonyXtCixYx539SoYtYug,2307
@@ -218,17 +218,17 @@ 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=GFpY9vTsw89eQ4Mlfq8SnlwGZFGiBW3bEuw68WpTD_w,16289
221
+ ccxt/async_support/__init__.py,sha256=CVF8rT4aKLXfiJUecRf1V28xpxzZQIq2k3aQ5uIsipM,16289
222
222
  ccxt/async_support/ace.py,sha256=ucCkKaWRkILAIK9g4iEi1Q_-zmn0V89-rX8Al4WdK8s,42643
223
223
  ccxt/async_support/alpaca.py,sha256=HxonsP_MzbE7Z9r6hZ1rgmf_jPcP4H7H3z1YQgCv4qc,47716
224
224
  ccxt/async_support/ascendex.py,sha256=YcGVveIDir8A1rDak-DdS_qVO1yPwAUX9sRDwCVNX80,152489
225
225
  ccxt/async_support/bequant.py,sha256=1hTwHovo1bW1XTIc8ZKjvJ-Xg6LfmpGdzT7TepykaVM,1188
226
226
  ccxt/async_support/bigone.py,sha256=EQohpAnGnA1z4K6-6An--5WxdW6raQPrZCH2s_-WGmg,91703
227
- ccxt/async_support/binance.py,sha256=b2DD_66V5dGZlBwmyJUTVS3o0uuR652Ofd11gKZNdIM,658919
227
+ ccxt/async_support/binance.py,sha256=tBCGXhs4h9fLdHD1lUZJrsOCDxmI0gAe89eoLrf_MbA,659054
228
228
  ccxt/async_support/binancecoinm.py,sha256=yeE73xG5UXD_X3VPul6DMGnV_mgJfWYskpas1BUDdCU,1740
229
229
  ccxt/async_support/binanceus.py,sha256=ZkGgQGB0bWYZTz7PqBCgw22yyOZbvd7GuJAJzzgDTCA,9216
230
230
  ccxt/async_support/binanceusdm.py,sha256=8ugRkx7vyYmn67wdkEEf2f-DFMGAoC4t09usKlPVNyw,2670
231
- ccxt/async_support/bingx.py,sha256=owdGPHTMvhfWMur2HCEEYEQPMirJXM4ual4_LOw_KjU,251045
231
+ ccxt/async_support/bingx.py,sha256=8E-o-A9dPYiPNi0gSNlp5YLcDSgLS6JfdOrTFGDXX5U,253266
232
232
  ccxt/async_support/bit2c.py,sha256=8gA0VW3_617LwqCNliJnhjpjtwXAGxv7FsEn9805XOc,37466
233
233
  ccxt/async_support/bitbank.py,sha256=DOBazUZetD7gxURy42C3m-T-YK-zvYIkcUjHqJggkGU,43969
234
234
  ccxt/async_support/bitbay.py,sha256=jcaEXi2IhYTva8ezO_SfJhwxEZk7HST4J3NaxD16BQA,492
@@ -247,7 +247,7 @@ ccxt/async_support/bitrue.py,sha256=owSEnJYp47wZRP8dj_lpR-r7aqyhy0nnNI9vzd79P64,
247
247
  ccxt/async_support/bitso.py,sha256=XSMfOYCTmjHT1WkocYQsfj2lHOix5D4jEJVB3ZBIFzM,72171
248
248
  ccxt/async_support/bitstamp.py,sha256=zDgKXyHsLLPYg7SlKrpxs6BNjPgM5QtUo38Yuyp1txQ,93937
249
249
  ccxt/async_support/bitteam.py,sha256=vPMTVr0bDCd5okV_tFA9gVVW4a5NmsabvEplOm2-uOo,102596
250
- ccxt/async_support/bitvavo.py,sha256=s5QqxGGRwyKKuI6StZVqmGHsvlAu-M6IvgSNR_hssyM,92275
250
+ ccxt/async_support/bitvavo.py,sha256=lLv-0-cCdr-XfdDRHYIVzppUUeGEJMq0Q-Jz91NrvGQ,92289
251
251
  ccxt/async_support/bl3p.py,sha256=6K1wuBI0uFjoN0N7V6Bps_jKeNCJUQrsXO9tubuZlyU,20776
252
252
  ccxt/async_support/blockchaincom.py,sha256=cU1SliV4XO4OFYR_TbAFFiUMFajvBZPzKkG5LHEtZow,49340
253
253
  ccxt/async_support/blofin.py,sha256=h6RgUaaYFV7PUOR_KgGjBANEYb33-jLO5YTfWjIDHlQ,102641
@@ -255,12 +255,12 @@ ccxt/async_support/btcalpha.py,sha256=8OefA3GsJ27eAL44yQQcRNOruHXAwTemjTPkpLKwjE
255
255
  ccxt/async_support/btcbox.py,sha256=rBXxuvdQaku5QYseQ4XSvMrCkohDefYmf-rGeS9W0IU,28004
256
256
  ccxt/async_support/btcmarkets.py,sha256=fTf_MDIM7NMwpbv6X5lYPLNg8tFKcviNiUB7N3yO6FI,53083
257
257
  ccxt/async_support/btcturk.py,sha256=Uq9rXMoDkXIy0nw1rzmw2e8eeRepcNtXKNYuw-02tkM,37242
258
- ccxt/async_support/bybit.py,sha256=IjYb_ItSy7tjANRBW62-ODNj1AlqkQjySXLB1JjFvbA,443255
258
+ ccxt/async_support/bybit.py,sha256=7ckgkQtELiauRcvWZIdQcRywGWkmlGlYD_9DeyFxzOs,443513
259
259
  ccxt/async_support/cex.py,sha256=HzFy4eP5qVwbXzq96VyjgJmXxK3DWUxHqJ1nHuV28cQ,70561
260
260
  ccxt/async_support/coinbase.py,sha256=XsAHx1vPMpsWcCbz6WYlY6J68luojlE3Xw5wzsaiE7U,219879
261
261
  ccxt/async_support/coinbaseadvanced.py,sha256=Kupwnuxiu_qTjwCNV2asacoDUNFQvcaHNAznUJPhdQs,552
262
262
  ccxt/async_support/coinbaseexchange.py,sha256=u4s7rt6wavGgwzvfGtKkVeiBphq0hCG8VODQCb9Phi0,79537
263
- ccxt/async_support/coinbaseinternational.py,sha256=Y2d0pXbtMupgpsrDLwkAwWaLTgVDwM1Bc2mVIwaKRXA,98230
263
+ ccxt/async_support/coinbaseinternational.py,sha256=lkBNMcyDi6V_ilZ3co-33wTHVsyn87XDdXiW8ItUKZw,98123
264
264
  ccxt/async_support/coincheck.py,sha256=N_0cDMAiFRC4G--QgOmSH8esKDr_lEVZUpukc4QoHk8,36148
265
265
  ccxt/async_support/coinex.py,sha256=XJx0zvBPCJnirLLFhHKVDeC0nGHNWIIfUAmqG9EJ994,260133
266
266
  ccxt/async_support/coinlist.py,sha256=VOqcXFP1fpK5vXKALS8GcioZhb1o-VvhpOUym594xl8,104761
@@ -294,18 +294,18 @@ ccxt/async_support/kraken.py,sha256=F1NRf8PFqrzM-XQzf81sjpAER8mz1aYIgP4M5kO_DfQ,
294
294
  ccxt/async_support/krakenfutures.py,sha256=Wcry7ar4Esbi_3Urp8LcnzPMsThN6KcdU6QN5YMxDCk,120327
295
295
  ccxt/async_support/kucoin.py,sha256=cE0IuoIdGeYcGBr19iRPHPy8dYJnJS-5cPvAENhBKX8,232960
296
296
  ccxt/async_support/kucoinfutures.py,sha256=pRdx9vnlvXH19SqYNpfQcUtZltduZEKNQxaSnY5054k,135894
297
- ccxt/async_support/kuna.py,sha256=NfVhLrTTMqpCuc4Bp-yLF5Grs8Rnteh1CVekLJDjOV8,96730
297
+ ccxt/async_support/kuna.py,sha256=_8S74LqI1c5zbCbaSfJgUsVyqus9gB2OV9s3UMXkzYQ,96490
298
298
  ccxt/async_support/latoken.py,sha256=9BUu8akWtbBtAzVr_c_cYLkiLQqcJdSdkJbHmuLee-Y,79992
299
299
  ccxt/async_support/lbank.py,sha256=xWUzIsFFAV_yd0Igo3CimSys6z-AoQH88oQ0zzBb1w0,116962
300
300
  ccxt/async_support/luno.py,sha256=WRQ5uH3Wr1HHZa9ZtcWCYdrmz-Y8proS5XOGZpBtiZo,46691
301
301
  ccxt/async_support/lykke.py,sha256=E5n93dUuUShGO8wXogPMQkotguYpJFWM12aT_lTwEoM,51864
302
302
  ccxt/async_support/mercado.py,sha256=mb7ULqvEr9PQ7jBOpQxiufgYzwTeAfr0G2NZmrUeUgs,35952
303
- ccxt/async_support/mexc.py,sha256=D1UmPX7MClQ_1qS2-CjgCrmWxLMtnUSbMrHrEtPbcHo,254091
303
+ ccxt/async_support/mexc.py,sha256=FcPqE7YNeZ9cIwZmsLuttwwnaCVVTbFbr19EEVEMAUg,254137
304
304
  ccxt/async_support/ndax.py,sha256=V157f9E_-NzmEwRxCpxN9Th_9TIlU9EJOgRYxLfss9E,110954
305
305
  ccxt/async_support/novadax.py,sha256=YNKUM1CGFK7lpBwbxSSL1IAEJCRVsNxeITkwtw6VWCM,64804
306
306
  ccxt/async_support/oceanex.py,sha256=U9VJN3Sym8GEZUqkmIt8yDzVw9XRc-WtSj35R1Fdv_U,41516
307
307
  ccxt/async_support/okcoin.py,sha256=Vwbq1Sf1RiYHOehTkvIuet7vqskMyiFj4j-OTpjxRZg,151831
308
- ccxt/async_support/okx.py,sha256=WE0NikeItKvR4JBLJr3BcZny2CqyCC36wVvL-UEdFj4,384850
308
+ ccxt/async_support/okx.py,sha256=qhvWDOm1vb6m8yscwAhqvDN8LJ4j4-wgasQK0lKovHE,386078
309
309
  ccxt/async_support/onetrading.py,sha256=FNOJlpBOGHu51EKhdFJPxNNHWPTIw_OcVzBf83UlR-w,88932
310
310
  ccxt/async_support/oxfun.py,sha256=26g7I24m8le35qcEqFVZGfiEv3sP3pOIu53724Bz5k0,125419
311
311
  ccxt/async_support/p2b.py,sha256=VKUX8u7gtHkKDwBjAyskScm2FEs6xxDuKLXE-jSHXwY,54532
@@ -315,7 +315,7 @@ ccxt/async_support/phemex.py,sha256=FKEOWbE6jetr-X9ntrGMLw6dwGspKBj1XNtL4P5gqX4,
315
315
  ccxt/async_support/poloniex.py,sha256=dTLebALH02oksjxkRzd9iw8L_f6LE-R7ye5syj6o4b4,103052
316
316
  ccxt/async_support/poloniexfutures.py,sha256=g3UO7uueR0KtJbkG3O88UsSTsU2IqwTqlIdzo9wY6mM,80443
317
317
  ccxt/async_support/probit.py,sha256=UruCE3NPDPXM2VoWa8Rk6vy5wEPM9wauOLd3RvGGmk8,76726
318
- ccxt/async_support/timex.py,sha256=NNPVbKW_MOsBqcTxJ9IrF37nPoNoN0m1ds26KtFq2J4,72482
318
+ ccxt/async_support/timex.py,sha256=qDoEICGWZ7sGFtjXBEJnTDUuEMdZz7seUkQ9_tsyr90,72372
319
319
  ccxt/async_support/tokocrypto.py,sha256=wHqN41XmrFlmy1CpNvb0yZnZvF8WQAZQ98wtwMHaa5g,123588
320
320
  ccxt/async_support/tradeogre.py,sha256=2WdZ9y6osj4usU2aF0Go7LzHyVb6MPRMk6p9uJoyjE0,24362
321
321
  ccxt/async_support/upbit.py,sha256=T1UUNP7VyzOZPheoxOnC5f6U_stotJAU_xQczyNrW6c,86028
@@ -330,7 +330,7 @@ ccxt/async_support/yobit.py,sha256=YtkLczlb641VjUYTfEMfS-BPUTdXQTHAPkearuXkXDQ,5
330
330
  ccxt/async_support/zaif.py,sha256=-ZTr8M2JaIRCL90VrbCDXBMAsZwbiwsFChSQ2rWODuQ,29044
331
331
  ccxt/async_support/zonda.py,sha256=Z4gA6o0bF_4MarQ5KiR2Zwi2wpmOuZTHS1JChAtNWjo,83114
332
332
  ccxt/async_support/base/__init__.py,sha256=aVYSsFi--b4InRs9zDN_wtCpj8odosAB726JdUHavrk,67
333
- ccxt/async_support/base/exchange.py,sha256=prvh2wWtFOsy1RJJu6rjZdO3pXERc6uuUmO8E67vKIc,113443
333
+ ccxt/async_support/base/exchange.py,sha256=jKS-8YGNqKzbRDuD5wo8464UXLTUhPeTXUiaiI1_SIU,113443
334
334
  ccxt/async_support/base/throttler.py,sha256=tvDVcdRUVYi8fZRlEcnqtgzcgB_KMUMRs5Pu8tuU-tU,1847
335
335
  ccxt/async_support/base/ws/__init__.py,sha256=uockzpLuwntKGZbs5EOWFe-Zg-k6Cj7GhNJLc_RX0so,1791
336
336
  ccxt/async_support/base/ws/aiohttp_client.py,sha256=5IEiT0elWI9a7Vr-KV0jgmlbpLJWBzIlrLaCkTKGaqY,5752
@@ -344,10 +344,10 @@ ccxt/async_support/base/ws/order_book_side.py,sha256=GhnGUt78pJ-AYL_Dq9produGjmB
344
344
  ccxt/base/__init__.py,sha256=eTx1OE3HJjspFUQjGm6LBhaQiMKJnXjkdP-JUXknyQ0,1320
345
345
  ccxt/base/decimal_to_precision.py,sha256=fgWRBzRTtsf3r2INyS4f7WHlzgjB5YM1ekiwqD21aac,6634
346
346
  ccxt/base/errors.py,sha256=Pad-6ugvGUwhoYuKUliX-N7FTrcnKCQGFjsaq2tMn0I,4610
347
- ccxt/base/exchange.py,sha256=g121OcO3nh1_4mJr2iFIaKfg4pEUCFK9dLACrKhHM7w,301089
347
+ ccxt/base/exchange.py,sha256=nnsBDSDEeOQZhpjtJogbkCWStKk57GDDatgIKe1BSm0,301504
348
348
  ccxt/base/precise.py,sha256=koce64Yrp6vFbGijJtUt-QQ6XhJgeGTCksZ871FPp_A,8886
349
349
  ccxt/base/types.py,sha256=jxuyz7pMvNPfV_iOHhHdI_41AH0_ZTtmDn9BxaKw5Fk,9796
350
- ccxt/pro/__init__.py,sha256=V0j8hSds7T6EXe72TyqZIZjCCclDgnjFBKZ6iGdrlgE,7710
350
+ ccxt/pro/__init__.py,sha256=y4HCofxJOMHyqIa39MKeGJ9GsyewWQXk1372pJk5yDo,7710
351
351
  ccxt/pro/alpaca.py,sha256=xh1yg1Ok-Zh_Mfx-MBjNrfJDs6MUU0exFfEj3GuQPC4,27631
352
352
  ccxt/pro/ascendex.py,sha256=QueLgISoIxgGSOta2W7En4pwAsEXbTP5q5ef4UjpTQQ,37524
353
353
  ccxt/pro/bequant.py,sha256=33OEUWBi4D9-2w8CmkwN3aF1qS-AlLqX3pxrWwNbXPY,1552
@@ -367,7 +367,7 @@ ccxt/pro/bitopro.py,sha256=eGge1vzVXPx1FGZc1cm5i_MzBKlRkWH2ZKuIzrR3G2Q,18798
367
367
  ccxt/pro/bitpanda.py,sha256=ELrhfFKN9YJJdmm9wBf-vpk6WsXGWGf-SyJdqm-E_Lg,415
368
368
  ccxt/pro/bitrue.py,sha256=0-aa3Q8oGLnq71fJQYLyy0jI3NHHTFJuMQAyM0XRLFY,16246
369
369
  ccxt/pro/bitstamp.py,sha256=tysJpRxfVnZKp-_xgfIhsOVh3ilnQQhXjV-grzqz3QM,20964
370
- ccxt/pro/bitvavo.py,sha256=zsUnPPvcZqPRWRp8znCF2AogBykNH7tMBaaSoPtnGQ0,60245
370
+ ccxt/pro/bitvavo.py,sha256=pTFgoLsWL9xX6Zc0bOZrFUlDTz8P4bmVR5fyNIGHXTg,60246
371
371
  ccxt/pro/blockchaincom.py,sha256=yRJ4m0mTG5FSbkdH4QvuXNnBvLv9kDMGbAMwpcJnyDI,29648
372
372
  ccxt/pro/blofin.py,sha256=pALlkuzdFZuxCaSxYfqog98x7BM8G0nqUTCke4WfUt0,31345
373
373
  ccxt/pro/bybit.py,sha256=PjSEQaOmO7BZNh5Df3USmVmhI1X6qVw0hXN8qfvcp9s,108243
@@ -650,8 +650,8 @@ ccxt/test/tests_async.py,sha256=IOkbqZXUViJ1KtDIlE63EZaU3z31_OR2iI6yL0azKL0,8500
650
650
  ccxt/test/tests_helpers.py,sha256=z5TiaK0WyUCmM_uGTFz7cgMNqNwG_SMI9qk7yec5ces,9693
651
651
  ccxt/test/tests_init.py,sha256=GodMIrJue4KBHHqD4vSPZxokPWpxbZIuEp19UdxlFAg,1166
652
652
  ccxt/test/tests_sync.py,sha256=c9hEBBjaLRJ-rqGiR-SpVUXcFJsvrZ7mxhLKb7TJWEc,84062
653
- ccxt-4.4.16.dist-info/LICENSE.txt,sha256=EIb9221AhMHV7xF1_55STFdKTFsnJVJYkRpY2Lnvo5w,1068
654
- ccxt-4.4.16.dist-info/METADATA,sha256=UTl6TtqIlPvC-LUKa7Lb1qHJfbnEqBdMK49Vr3BjOPI,114487
655
- ccxt-4.4.16.dist-info/WHEEL,sha256=z9j0xAa_JmUKMpmz72K0ZGALSM_n-wQVmGbleXx2VHg,110
656
- ccxt-4.4.16.dist-info/top_level.txt,sha256=CkQDuCTDKNcImPV60t36G6MdYfxsAPNiSaEwifVoVMo,5
657
- ccxt-4.4.16.dist-info/RECORD,,
653
+ ccxt-4.4.17.dist-info/LICENSE.txt,sha256=EIb9221AhMHV7xF1_55STFdKTFsnJVJYkRpY2Lnvo5w,1068
654
+ ccxt-4.4.17.dist-info/METADATA,sha256=Tkq8FceEGI26fo00lFCMOOCZ5z4wxFZpDTz1ZQXpTkw,114487
655
+ ccxt-4.4.17.dist-info/WHEEL,sha256=z9j0xAa_JmUKMpmz72K0ZGALSM_n-wQVmGbleXx2VHg,110
656
+ ccxt-4.4.17.dist-info/top_level.txt,sha256=CkQDuCTDKNcImPV60t36G6MdYfxsAPNiSaEwifVoVMo,5
657
+ ccxt-4.4.17.dist-info/RECORD,,
File without changes