ccxt 4.4.10__py2.py3-none-any.whl → 4.4.11__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.10'
25
+ __version__ = '4.4.11'
26
26
 
27
27
  # ----------------------------------------------------------------------------
28
28
 
ccxt/abstract/binance.py CHANGED
@@ -703,6 +703,7 @@ class ImplicitAPI:
703
703
  papi_post_listenkey = papiPostListenKey = Entry('listenKey', 'papi', 'POST', {'cost': 1})
704
704
  papi_post_asset_collection = papiPostAssetCollection = Entry('asset-collection', 'papi', 'POST', {'cost': 3})
705
705
  papi_post_margin_repay_debt = papiPostMarginRepayDebt = Entry('margin/repay-debt', 'papi', 'POST', {'cost': 0.4})
706
+ papi_post_um_feeburn = papiPostUmFeeBurn = Entry('um/feeBurn', 'papi', 'POST', {'cost': 1})
706
707
  papi_put_listenkey = papiPutListenKey = Entry('listenKey', 'papi', 'PUT', {'cost': 1})
707
708
  papi_delete_um_order = papiDeleteUmOrder = Entry('um/order', 'papi', 'DELETE', {'cost': 1})
708
709
  papi_delete_um_conditional_order = papiDeleteUmConditionalOrder = Entry('um/conditional/order', 'papi', 'DELETE', {'cost': 1})
@@ -703,6 +703,7 @@ class ImplicitAPI:
703
703
  papi_post_listenkey = papiPostListenKey = Entry('listenKey', 'papi', 'POST', {'cost': 1})
704
704
  papi_post_asset_collection = papiPostAssetCollection = Entry('asset-collection', 'papi', 'POST', {'cost': 3})
705
705
  papi_post_margin_repay_debt = papiPostMarginRepayDebt = Entry('margin/repay-debt', 'papi', 'POST', {'cost': 0.4})
706
+ papi_post_um_feeburn = papiPostUmFeeBurn = Entry('um/feeBurn', 'papi', 'POST', {'cost': 1})
706
707
  papi_put_listenkey = papiPutListenKey = Entry('listenKey', 'papi', 'PUT', {'cost': 1})
707
708
  papi_delete_um_order = papiDeleteUmOrder = Entry('um/order', 'papi', 'DELETE', {'cost': 1})
708
709
  papi_delete_um_conditional_order = papiDeleteUmConditionalOrder = Entry('um/conditional/order', 'papi', 'DELETE', {'cost': 1})
@@ -755,6 +755,7 @@ class ImplicitAPI:
755
755
  papi_post_listenkey = papiPostListenKey = Entry('listenKey', 'papi', 'POST', {'cost': 1})
756
756
  papi_post_asset_collection = papiPostAssetCollection = Entry('asset-collection', 'papi', 'POST', {'cost': 3})
757
757
  papi_post_margin_repay_debt = papiPostMarginRepayDebt = Entry('margin/repay-debt', 'papi', 'POST', {'cost': 0.4})
758
+ papi_post_um_feeburn = papiPostUmFeeBurn = Entry('um/feeBurn', 'papi', 'POST', {'cost': 1})
758
759
  papi_put_listenkey = papiPutListenKey = Entry('listenKey', 'papi', 'PUT', {'cost': 1})
759
760
  papi_delete_um_order = papiDeleteUmOrder = Entry('um/order', 'papi', 'DELETE', {'cost': 1})
760
761
  papi_delete_um_conditional_order = papiDeleteUmConditionalOrder = Entry('um/conditional/order', 'papi', 'DELETE', {'cost': 1})
@@ -703,6 +703,7 @@ class ImplicitAPI:
703
703
  papi_post_listenkey = papiPostListenKey = Entry('listenKey', 'papi', 'POST', {'cost': 1})
704
704
  papi_post_asset_collection = papiPostAssetCollection = Entry('asset-collection', 'papi', 'POST', {'cost': 3})
705
705
  papi_post_margin_repay_debt = papiPostMarginRepayDebt = Entry('margin/repay-debt', 'papi', 'POST', {'cost': 0.4})
706
+ papi_post_um_feeburn = papiPostUmFeeBurn = Entry('um/feeBurn', 'papi', 'POST', {'cost': 1})
706
707
  papi_put_listenkey = papiPutListenKey = Entry('listenKey', 'papi', 'PUT', {'cost': 1})
707
708
  papi_delete_um_order = papiDeleteUmOrder = Entry('um/order', 'papi', 'DELETE', {'cost': 1})
708
709
  papi_delete_um_conditional_order = papiDeleteUmConditionalOrder = Entry('um/conditional/order', 'papi', 'DELETE', {'cost': 1})
@@ -4,7 +4,7 @@
4
4
 
5
5
  # -----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.4.10'
7
+ __version__ = '4.4.11'
8
8
 
9
9
  # -----------------------------------------------------------------------------
10
10
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  # -----------------------------------------------------------------------------
4
4
 
5
- __version__ = '4.4.10'
5
+ __version__ = '4.4.11'
6
6
 
7
7
  # -----------------------------------------------------------------------------
8
8
 
@@ -1116,6 +1116,7 @@ class binance(Exchange, ImplicitAPI):
1116
1116
  'listenKey': 1, # 1
1117
1117
  'asset-collection': 3,
1118
1118
  'margin/repay-debt': 0.4, # Weight(Order): 0.4 =>(1000 / (50 * 0.4)) * 60 = 3000
1119
+ 'um/feeBurn': 1,
1119
1120
  },
1120
1121
  'put': {
1121
1122
  'listenKey': 1, # 1
@@ -1435,7 +1435,7 @@ class bitget(Exchange, ImplicitAPI):
1435
1435
  },
1436
1436
  'sandboxMode': False,
1437
1437
  'networks': {
1438
- 'TRX': 'TRC20',
1438
+ 'TRC20': 'TRC20',
1439
1439
  'ERC20': 'ERC20',
1440
1440
  'BEP20': 'BSC',
1441
1441
  'ARB': 'ArbitrumOne',
ccxt/async_support/htx.py CHANGED
@@ -1237,6 +1237,7 @@ class htx(Exchange, ImplicitAPI):
1237
1237
  # https://github.com/ccxt/ccxt/issues/6081
1238
1238
  # https://github.com/ccxt/ccxt/issues/3365
1239
1239
  # https://github.com/ccxt/ccxt/issues/2873
1240
+ 'NGL': 'GFNGL',
1240
1241
  'GET': 'THEMIS', # conflict with GET(Guaranteed Entrance Token, GET Protocol)
1241
1242
  'GTC': 'GAMECOM', # conflict with Gitcoin and Gastrocoin
1242
1243
  'HIT': 'HITCHAIN',
@@ -1248,6 +1249,7 @@ class htx(Exchange, ImplicitAPI):
1248
1249
  'SBTC': 'SUPERBITCOIN',
1249
1250
  'SOUL': 'SOULSAVER',
1250
1251
  'BIFI': 'BITCOINFILE', # conflict with Beefy.Finance https://github.com/ccxt/ccxt/issues/8706
1252
+ 'FUD': 'FTX Users\' Debt',
1251
1253
  },
1252
1254
  })
1253
1255
 
@@ -6854,6 +6856,10 @@ class htx(Exchange, ImplicitAPI):
6854
6856
  async def set_leverage(self, leverage: Int, symbol: Str = None, params={}):
6855
6857
  """
6856
6858
  set the level of leverage for a market
6859
+ :see: https://huobiapi.github.io/docs/usdt_swap/v1/en/#isolated-switch-leverage
6860
+ :see: https://huobiapi.github.io/docs/usdt_swap/v1/en/#cross-switch-leverage
6861
+ :see: https://huobiapi.github.io/docs/coin_margined_swap/v1/en/#switch-leverage
6862
+ :see: https://huobiapi.github.io/docs/dm/v1/en/#switch-leverage # Coin-m futures
6857
6863
  :param float leverage: the rate of leverage
6858
6864
  :param str symbol: unified market symbol
6859
6865
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -66,6 +66,7 @@ class kraken(Exchange, ImplicitAPI):
66
66
  'createStopMarketOrder': True,
67
67
  'createStopOrder': True,
68
68
  'createTrailingAmountOrder': True,
69
+ 'createTrailingPercentOrder': True,
69
70
  'editOrder': True,
70
71
  'fetchBalance': True,
71
72
  'fetchBorrowInterest': False,
@@ -456,7 +457,9 @@ class kraken(Exchange, ImplicitAPI):
456
457
  'EGeneral:Internal error': ExchangeNotAvailable,
457
458
  'EGeneral:Temporary lockout': DDoSProtection,
458
459
  'EGeneral:Permission denied': PermissionDenied,
460
+ 'EGeneral:Invalid arguments:price': InvalidOrder,
459
461
  'EOrder:Unknown order': InvalidOrder,
462
+ 'EOrder:Invalid price:Invalid price argument': InvalidOrder,
460
463
  'EOrder:Order minimum not met': InvalidOrder,
461
464
  'EGeneral:Invalid arguments': BadRequest,
462
465
  'ESession:Invalid session': AuthenticationError,
@@ -1397,8 +1400,8 @@ class kraken(Exchange, ImplicitAPI):
1397
1400
 
1398
1401
  async def create_order(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, params={}):
1399
1402
  """
1400
- :see: https://docs.kraken.com/rest/#tag/Spot-Trading/operation/addOrder
1401
1403
  create a trade order
1404
+ :see: https://docs.kraken.com/api/docs/rest-api/add-order
1402
1405
  :param str symbol: unified symbol of the market to create an order in
1403
1406
  :param str type: 'market' or 'limit'
1404
1407
  :param str side: 'buy' or 'sell'
@@ -1410,7 +1413,9 @@ class kraken(Exchange, ImplicitAPI):
1410
1413
  :param float [params.stopLossPrice]: *margin only* the price that a stop loss order is triggered at
1411
1414
  :param float [params.takeProfitPrice]: *margin only* the price that a take profit order is triggered at
1412
1415
  :param str [params.trailingAmount]: *margin only* the quote amount to trail away from the current market price
1416
+ :param str [params.trailingPercent]: *margin only* the percent to trail away from the current market price
1413
1417
  :param str [params.trailingLimitAmount]: *margin only* the quote amount away from the trailingAmount
1418
+ :param str [params.trailingLimitPercent]: *margin only* the percent away from the trailingAmount
1414
1419
  :param str [params.offset]: *margin only* '+' or '-' whether you want the trailingLimitAmount value to be positive or negative, default is negative '-'
1415
1420
  :param str [params.trigger]: *margin only* the activation price type, 'last' or 'index', default is 'last'
1416
1421
  :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
@@ -1717,8 +1722,11 @@ class kraken(Exchange, ImplicitAPI):
1717
1722
  isTakeProfitTriggerOrder = takeProfitTriggerPrice is not None
1718
1723
  isStopLossOrTakeProfitTrigger = isStopLossTriggerOrder or isTakeProfitTriggerOrder
1719
1724
  trailingAmount = self.safe_string(params, 'trailingAmount')
1725
+ trailingPercent = self.safe_string(params, 'trailingPercent')
1720
1726
  trailingLimitAmount = self.safe_string(params, 'trailingLimitAmount')
1727
+ trailingLimitPercent = self.safe_string(params, 'trailingLimitPercent')
1721
1728
  isTrailingAmountOrder = trailingAmount is not None
1729
+ isTrailingPercentOrder = trailingPercent is not None
1722
1730
  isLimitOrder = type.endswith('limit') # supporting limit, stop-loss-limit, take-profit-limit, etc
1723
1731
  isMarketOrder = type == 'market'
1724
1732
  cost = self.safe_string(params, 'cost')
@@ -1750,19 +1758,30 @@ class kraken(Exchange, ImplicitAPI):
1750
1758
  request['ordertype'] = 'take-profit'
1751
1759
  if isLimitOrder:
1752
1760
  request['price2'] = self.price_to_precision(symbol, price)
1753
- elif isTrailingAmountOrder:
1761
+ elif isTrailingAmountOrder or isTrailingPercentOrder:
1762
+ trailingPercentString = None
1763
+ if isTrailingPercentOrder:
1764
+ trailingPercentString = trailingPercent if (trailingPercent.endswith('%')) else '+' + (self.number_to_string(trailingPercent) + '%')
1765
+ trailingAmountString = '+' + trailingAmount if (trailingAmount is not None) else None # must use + for self
1766
+ offset = self.safe_string(params, 'offset', '-') # can use + or - for self
1767
+ trailingLimitAmountString = offset + self.number_to_string(trailingLimitAmount) if (trailingLimitAmount is not None) else None
1754
1768
  trailingActivationPriceType = self.safe_string(params, 'trigger', 'last')
1755
- trailingAmountString = '+' + trailingAmount
1756
1769
  request['trigger'] = trailingActivationPriceType
1757
- if isLimitOrder or (trailingLimitAmount is not None):
1758
- offset = self.safe_string(params, 'offset', '-')
1759
- trailingLimitAmountString = offset + self.number_to_string(trailingLimitAmount)
1760
- request['price'] = trailingAmountString
1761
- request['price2'] = trailingLimitAmountString
1770
+ if isLimitOrder or (trailingLimitAmount is not None) or (trailingLimitPercent is not None):
1762
1771
  request['ordertype'] = 'trailing-stop-limit'
1772
+ if trailingLimitPercent is not None:
1773
+ trailingLimitPercentString = trailingLimitPercent if (trailingLimitPercent.endswith('%')) else (self.number_to_string(trailingLimitPercent) + '%')
1774
+ request['price'] = trailingPercentString
1775
+ request['price2'] = trailingLimitPercentString
1776
+ elif trailingLimitAmount is not None:
1777
+ request['price'] = trailingAmountString
1778
+ request['price2'] = trailingLimitAmountString
1763
1779
  else:
1764
- request['price'] = trailingAmountString
1765
1780
  request['ordertype'] = 'trailing-stop'
1781
+ if trailingPercent is not None:
1782
+ request['price'] = trailingPercentString
1783
+ else:
1784
+ request['price'] = trailingAmountString
1766
1785
  if reduceOnly:
1767
1786
  if method == 'createOrderWs':
1768
1787
  request['reduce_only'] = True # ws request can't have stringified bool
@@ -1789,7 +1808,7 @@ class kraken(Exchange, ImplicitAPI):
1789
1808
  request['oflags'] = extendedPostFlags
1790
1809
  if (flags is not None) and not ('oflags' in request):
1791
1810
  request['oflags'] = flags
1792
- params = self.omit(params, ['timeInForce', 'reduceOnly', 'stopLossPrice', 'takeProfitPrice', 'trailingAmount', 'trailingLimitAmount', 'offset'])
1811
+ params = self.omit(params, ['timeInForce', 'reduceOnly', 'stopLossPrice', 'takeProfitPrice', 'trailingAmount', 'trailingPercent', 'trailingLimitAmount', 'trailingLimitPercent', 'offset'])
1793
1812
  return [request, params]
1794
1813
 
1795
1814
  async def edit_order(self, id: str, symbol: str, type: OrderType, side: OrderSide, amount: Num = None, price: Num = None, params={}):
@@ -2916,11 +2935,15 @@ class kraken(Exchange, ImplicitAPI):
2916
2935
  # urlencodeNested is used to address https://github.com/ccxt/ccxt/issues/12872
2917
2936
  url += '?' + self.urlencode_nested(params)
2918
2937
  elif api == 'private':
2938
+ price = self.safe_string(params, 'price')
2939
+ isTriggerPercent = False
2940
+ if price is not None:
2941
+ isTriggerPercent = True if (price.endswith('%')) else False
2919
2942
  isCancelOrderBatch = (path == 'CancelOrderBatch')
2920
2943
  self.check_required_credentials()
2921
2944
  nonce = str(self.nonce())
2922
2945
  # urlencodeNested is used to address https://github.com/ccxt/ccxt/issues/12872
2923
- if isCancelOrderBatch:
2946
+ if isCancelOrderBatch or isTriggerPercent:
2924
2947
  body = self.json(self.extend({'nonce': nonce}, params))
2925
2948
  else:
2926
2949
  body = self.urlencode_nested(self.extend({'nonce': nonce}, params))
@@ -2933,9 +2956,8 @@ class kraken(Exchange, ImplicitAPI):
2933
2956
  headers = {
2934
2957
  'API-Key': self.apiKey,
2935
2958
  'API-Sign': signature,
2936
- # 'Content-Type': 'application/x-www-form-urlencoded',
2937
2959
  }
2938
- if isCancelOrderBatch:
2960
+ if isCancelOrderBatch or isTriggerPercent:
2939
2961
  headers['Content-Type'] = 'application/json'
2940
2962
  else:
2941
2963
  headers['Content-Type'] = 'application/x-www-form-urlencoded'
@@ -3616,23 +3616,29 @@ class mexc(Exchange, ImplicitAPI):
3616
3616
  :param int [since]: the earliest time in ms to fetch trades for
3617
3617
  :param int [limit]: the maximum number of trades structures to retrieve
3618
3618
  :param dict [params]: extra parameters specific to the exchange API endpoint
3619
+ :param int [params.until]: the latest time in ms to fetch trades for
3619
3620
  :returns Trade[]: a list of `trade structures <https://docs.ccxt.com/#/?id=trade-structure>`
3620
3621
  """
3621
3622
  if symbol is None:
3622
3623
  raise ArgumentsRequired(self.id + ' fetchMyTrades() requires a symbol argument')
3623
3624
  await self.load_markets()
3624
3625
  market = self.market(symbol)
3625
- marketType, query = self.handle_market_type_and_params('fetchMyTrades', market, params)
3626
+ marketType: Str = None
3627
+ marketType, params = self.handle_market_type_and_params('fetchMyTrades', market, params)
3626
3628
  request: dict = {
3627
3629
  'symbol': market['id'],
3628
3630
  }
3629
3631
  trades = None
3630
3632
  if marketType == 'spot':
3631
3633
  if since is not None:
3632
- request['start_time'] = since
3634
+ request['startTime'] = since
3633
3635
  if limit is not None:
3634
3636
  request['limit'] = limit
3635
- trades = await self.spotPrivateGetMyTrades(self.extend(request, query))
3637
+ until = self.safe_integer(params, 'until')
3638
+ if until is not None:
3639
+ params = self.omit(params, 'until')
3640
+ request['endTime'] = until
3641
+ trades = await self.spotPrivateGetMyTrades(self.extend(request, params))
3636
3642
  #
3637
3643
  # spot
3638
3644
  #
@@ -3662,7 +3668,7 @@ class mexc(Exchange, ImplicitAPI):
3662
3668
  request['end_time'] = self.sum(since, self.options['maxTimeTillEnd'])
3663
3669
  if limit is not None:
3664
3670
  request['page_size'] = limit
3665
- response = await self.contractPrivateGetOrderListOrderDeals(self.extend(request, query))
3671
+ response = await self.contractPrivateGetOrderListOrderDeals(self.extend(request, params))
3666
3672
  #
3667
3673
  # {
3668
3674
  # "success": True,
ccxt/async_support/okx.py CHANGED
@@ -18,6 +18,7 @@ from ccxt.base.errors import AccountSuspended
18
18
  from ccxt.base.errors import ArgumentsRequired
19
19
  from ccxt.base.errors import BadRequest
20
20
  from ccxt.base.errors import BadSymbol
21
+ from ccxt.base.errors import ManualInteractionNeeded
21
22
  from ccxt.base.errors import InsufficientFunds
22
23
  from ccxt.base.errors import InvalidAddress
23
24
  from ccxt.base.errors import InvalidOrder
@@ -600,6 +601,7 @@ class okx(Exchange, ImplicitAPI):
600
601
  # General Class
601
602
  '1': ExchangeError, # Operation failed
602
603
  '2': ExchangeError, # Bulk operation partially succeeded
604
+ '4088': ManualInteractionNeeded, # {"code":"4088","data":[],"msg":"You can’t trade or deposit until you’ve verified your identity again. Head to Identity Verification to complete it."}
603
605
  '50000': BadRequest, # Body can not be empty
604
606
  '50001': OnMaintenance, # Matching engine upgrading. Please try again later
605
607
  '50002': BadRequest, # Json data format error
ccxt/base/exchange.py CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  # -----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.4.10'
7
+ __version__ = '4.4.11'
8
8
 
9
9
  # -----------------------------------------------------------------------------
10
10
 
ccxt/binance.py CHANGED
@@ -1115,6 +1115,7 @@ class binance(Exchange, ImplicitAPI):
1115
1115
  'listenKey': 1, # 1
1116
1116
  'asset-collection': 3,
1117
1117
  'margin/repay-debt': 0.4, # Weight(Order): 0.4 =>(1000 / (50 * 0.4)) * 60 = 3000
1118
+ 'um/feeBurn': 1,
1118
1119
  },
1119
1120
  'put': {
1120
1121
  'listenKey': 1, # 1
ccxt/bitget.py CHANGED
@@ -1434,7 +1434,7 @@ class bitget(Exchange, ImplicitAPI):
1434
1434
  },
1435
1435
  'sandboxMode': False,
1436
1436
  'networks': {
1437
- 'TRX': 'TRC20',
1437
+ 'TRC20': 'TRC20',
1438
1438
  'ERC20': 'ERC20',
1439
1439
  'BEP20': 'BSC',
1440
1440
  'ARB': 'ArbitrumOne',
ccxt/htx.py CHANGED
@@ -1236,6 +1236,7 @@ class htx(Exchange, ImplicitAPI):
1236
1236
  # https://github.com/ccxt/ccxt/issues/6081
1237
1237
  # https://github.com/ccxt/ccxt/issues/3365
1238
1238
  # https://github.com/ccxt/ccxt/issues/2873
1239
+ 'NGL': 'GFNGL',
1239
1240
  'GET': 'THEMIS', # conflict with GET(Guaranteed Entrance Token, GET Protocol)
1240
1241
  'GTC': 'GAMECOM', # conflict with Gitcoin and Gastrocoin
1241
1242
  'HIT': 'HITCHAIN',
@@ -1247,6 +1248,7 @@ class htx(Exchange, ImplicitAPI):
1247
1248
  'SBTC': 'SUPERBITCOIN',
1248
1249
  'SOUL': 'SOULSAVER',
1249
1250
  'BIFI': 'BITCOINFILE', # conflict with Beefy.Finance https://github.com/ccxt/ccxt/issues/8706
1251
+ 'FUD': 'FTX Users\' Debt',
1250
1252
  },
1251
1253
  })
1252
1254
 
@@ -6853,6 +6855,10 @@ class htx(Exchange, ImplicitAPI):
6853
6855
  def set_leverage(self, leverage: Int, symbol: Str = None, params={}):
6854
6856
  """
6855
6857
  set the level of leverage for a market
6858
+ :see: https://huobiapi.github.io/docs/usdt_swap/v1/en/#isolated-switch-leverage
6859
+ :see: https://huobiapi.github.io/docs/usdt_swap/v1/en/#cross-switch-leverage
6860
+ :see: https://huobiapi.github.io/docs/coin_margined_swap/v1/en/#switch-leverage
6861
+ :see: https://huobiapi.github.io/docs/dm/v1/en/#switch-leverage # Coin-m futures
6856
6862
  :param float leverage: the rate of leverage
6857
6863
  :param str symbol: unified market symbol
6858
6864
  :param dict [params]: extra parameters specific to the exchange API endpoint
ccxt/kraken.py CHANGED
@@ -66,6 +66,7 @@ class kraken(Exchange, ImplicitAPI):
66
66
  'createStopMarketOrder': True,
67
67
  'createStopOrder': True,
68
68
  'createTrailingAmountOrder': True,
69
+ 'createTrailingPercentOrder': True,
69
70
  'editOrder': True,
70
71
  'fetchBalance': True,
71
72
  'fetchBorrowInterest': False,
@@ -456,7 +457,9 @@ class kraken(Exchange, ImplicitAPI):
456
457
  'EGeneral:Internal error': ExchangeNotAvailable,
457
458
  'EGeneral:Temporary lockout': DDoSProtection,
458
459
  'EGeneral:Permission denied': PermissionDenied,
460
+ 'EGeneral:Invalid arguments:price': InvalidOrder,
459
461
  'EOrder:Unknown order': InvalidOrder,
462
+ 'EOrder:Invalid price:Invalid price argument': InvalidOrder,
460
463
  'EOrder:Order minimum not met': InvalidOrder,
461
464
  'EGeneral:Invalid arguments': BadRequest,
462
465
  'ESession:Invalid session': AuthenticationError,
@@ -1397,8 +1400,8 @@ class kraken(Exchange, ImplicitAPI):
1397
1400
 
1398
1401
  def create_order(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, params={}):
1399
1402
  """
1400
- :see: https://docs.kraken.com/rest/#tag/Spot-Trading/operation/addOrder
1401
1403
  create a trade order
1404
+ :see: https://docs.kraken.com/api/docs/rest-api/add-order
1402
1405
  :param str symbol: unified symbol of the market to create an order in
1403
1406
  :param str type: 'market' or 'limit'
1404
1407
  :param str side: 'buy' or 'sell'
@@ -1410,7 +1413,9 @@ class kraken(Exchange, ImplicitAPI):
1410
1413
  :param float [params.stopLossPrice]: *margin only* the price that a stop loss order is triggered at
1411
1414
  :param float [params.takeProfitPrice]: *margin only* the price that a take profit order is triggered at
1412
1415
  :param str [params.trailingAmount]: *margin only* the quote amount to trail away from the current market price
1416
+ :param str [params.trailingPercent]: *margin only* the percent to trail away from the current market price
1413
1417
  :param str [params.trailingLimitAmount]: *margin only* the quote amount away from the trailingAmount
1418
+ :param str [params.trailingLimitPercent]: *margin only* the percent away from the trailingAmount
1414
1419
  :param str [params.offset]: *margin only* '+' or '-' whether you want the trailingLimitAmount value to be positive or negative, default is negative '-'
1415
1420
  :param str [params.trigger]: *margin only* the activation price type, 'last' or 'index', default is 'last'
1416
1421
  :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
@@ -1717,8 +1722,11 @@ class kraken(Exchange, ImplicitAPI):
1717
1722
  isTakeProfitTriggerOrder = takeProfitTriggerPrice is not None
1718
1723
  isStopLossOrTakeProfitTrigger = isStopLossTriggerOrder or isTakeProfitTriggerOrder
1719
1724
  trailingAmount = self.safe_string(params, 'trailingAmount')
1725
+ trailingPercent = self.safe_string(params, 'trailingPercent')
1720
1726
  trailingLimitAmount = self.safe_string(params, 'trailingLimitAmount')
1727
+ trailingLimitPercent = self.safe_string(params, 'trailingLimitPercent')
1721
1728
  isTrailingAmountOrder = trailingAmount is not None
1729
+ isTrailingPercentOrder = trailingPercent is not None
1722
1730
  isLimitOrder = type.endswith('limit') # supporting limit, stop-loss-limit, take-profit-limit, etc
1723
1731
  isMarketOrder = type == 'market'
1724
1732
  cost = self.safe_string(params, 'cost')
@@ -1750,19 +1758,30 @@ class kraken(Exchange, ImplicitAPI):
1750
1758
  request['ordertype'] = 'take-profit'
1751
1759
  if isLimitOrder:
1752
1760
  request['price2'] = self.price_to_precision(symbol, price)
1753
- elif isTrailingAmountOrder:
1761
+ elif isTrailingAmountOrder or isTrailingPercentOrder:
1762
+ trailingPercentString = None
1763
+ if isTrailingPercentOrder:
1764
+ trailingPercentString = trailingPercent if (trailingPercent.endswith('%')) else '+' + (self.number_to_string(trailingPercent) + '%')
1765
+ trailingAmountString = '+' + trailingAmount if (trailingAmount is not None) else None # must use + for self
1766
+ offset = self.safe_string(params, 'offset', '-') # can use + or - for self
1767
+ trailingLimitAmountString = offset + self.number_to_string(trailingLimitAmount) if (trailingLimitAmount is not None) else None
1754
1768
  trailingActivationPriceType = self.safe_string(params, 'trigger', 'last')
1755
- trailingAmountString = '+' + trailingAmount
1756
1769
  request['trigger'] = trailingActivationPriceType
1757
- if isLimitOrder or (trailingLimitAmount is not None):
1758
- offset = self.safe_string(params, 'offset', '-')
1759
- trailingLimitAmountString = offset + self.number_to_string(trailingLimitAmount)
1760
- request['price'] = trailingAmountString
1761
- request['price2'] = trailingLimitAmountString
1770
+ if isLimitOrder or (trailingLimitAmount is not None) or (trailingLimitPercent is not None):
1762
1771
  request['ordertype'] = 'trailing-stop-limit'
1772
+ if trailingLimitPercent is not None:
1773
+ trailingLimitPercentString = trailingLimitPercent if (trailingLimitPercent.endswith('%')) else (self.number_to_string(trailingLimitPercent) + '%')
1774
+ request['price'] = trailingPercentString
1775
+ request['price2'] = trailingLimitPercentString
1776
+ elif trailingLimitAmount is not None:
1777
+ request['price'] = trailingAmountString
1778
+ request['price2'] = trailingLimitAmountString
1763
1779
  else:
1764
- request['price'] = trailingAmountString
1765
1780
  request['ordertype'] = 'trailing-stop'
1781
+ if trailingPercent is not None:
1782
+ request['price'] = trailingPercentString
1783
+ else:
1784
+ request['price'] = trailingAmountString
1766
1785
  if reduceOnly:
1767
1786
  if method == 'createOrderWs':
1768
1787
  request['reduce_only'] = True # ws request can't have stringified bool
@@ -1789,7 +1808,7 @@ class kraken(Exchange, ImplicitAPI):
1789
1808
  request['oflags'] = extendedPostFlags
1790
1809
  if (flags is not None) and not ('oflags' in request):
1791
1810
  request['oflags'] = flags
1792
- params = self.omit(params, ['timeInForce', 'reduceOnly', 'stopLossPrice', 'takeProfitPrice', 'trailingAmount', 'trailingLimitAmount', 'offset'])
1811
+ params = self.omit(params, ['timeInForce', 'reduceOnly', 'stopLossPrice', 'takeProfitPrice', 'trailingAmount', 'trailingPercent', 'trailingLimitAmount', 'trailingLimitPercent', 'offset'])
1793
1812
  return [request, params]
1794
1813
 
1795
1814
  def edit_order(self, id: str, symbol: str, type: OrderType, side: OrderSide, amount: Num = None, price: Num = None, params={}):
@@ -2916,11 +2935,15 @@ class kraken(Exchange, ImplicitAPI):
2916
2935
  # urlencodeNested is used to address https://github.com/ccxt/ccxt/issues/12872
2917
2936
  url += '?' + self.urlencode_nested(params)
2918
2937
  elif api == 'private':
2938
+ price = self.safe_string(params, 'price')
2939
+ isTriggerPercent = False
2940
+ if price is not None:
2941
+ isTriggerPercent = True if (price.endswith('%')) else False
2919
2942
  isCancelOrderBatch = (path == 'CancelOrderBatch')
2920
2943
  self.check_required_credentials()
2921
2944
  nonce = str(self.nonce())
2922
2945
  # urlencodeNested is used to address https://github.com/ccxt/ccxt/issues/12872
2923
- if isCancelOrderBatch:
2946
+ if isCancelOrderBatch or isTriggerPercent:
2924
2947
  body = self.json(self.extend({'nonce': nonce}, params))
2925
2948
  else:
2926
2949
  body = self.urlencode_nested(self.extend({'nonce': nonce}, params))
@@ -2933,9 +2956,8 @@ class kraken(Exchange, ImplicitAPI):
2933
2956
  headers = {
2934
2957
  'API-Key': self.apiKey,
2935
2958
  'API-Sign': signature,
2936
- # 'Content-Type': 'application/x-www-form-urlencoded',
2937
2959
  }
2938
- if isCancelOrderBatch:
2960
+ if isCancelOrderBatch or isTriggerPercent:
2939
2961
  headers['Content-Type'] = 'application/json'
2940
2962
  else:
2941
2963
  headers['Content-Type'] = 'application/x-www-form-urlencoded'
ccxt/mexc.py CHANGED
@@ -3615,23 +3615,29 @@ class mexc(Exchange, ImplicitAPI):
3615
3615
  :param int [since]: the earliest time in ms to fetch trades for
3616
3616
  :param int [limit]: the maximum number of trades structures to retrieve
3617
3617
  :param dict [params]: extra parameters specific to the exchange API endpoint
3618
+ :param int [params.until]: the latest time in ms to fetch trades for
3618
3619
  :returns Trade[]: a list of `trade structures <https://docs.ccxt.com/#/?id=trade-structure>`
3619
3620
  """
3620
3621
  if symbol is None:
3621
3622
  raise ArgumentsRequired(self.id + ' fetchMyTrades() requires a symbol argument')
3622
3623
  self.load_markets()
3623
3624
  market = self.market(symbol)
3624
- marketType, query = self.handle_market_type_and_params('fetchMyTrades', market, params)
3625
+ marketType: Str = None
3626
+ marketType, params = self.handle_market_type_and_params('fetchMyTrades', market, params)
3625
3627
  request: dict = {
3626
3628
  'symbol': market['id'],
3627
3629
  }
3628
3630
  trades = None
3629
3631
  if marketType == 'spot':
3630
3632
  if since is not None:
3631
- request['start_time'] = since
3633
+ request['startTime'] = since
3632
3634
  if limit is not None:
3633
3635
  request['limit'] = limit
3634
- trades = self.spotPrivateGetMyTrades(self.extend(request, query))
3636
+ until = self.safe_integer(params, 'until')
3637
+ if until is not None:
3638
+ params = self.omit(params, 'until')
3639
+ request['endTime'] = until
3640
+ trades = self.spotPrivateGetMyTrades(self.extend(request, params))
3635
3641
  #
3636
3642
  # spot
3637
3643
  #
@@ -3661,7 +3667,7 @@ class mexc(Exchange, ImplicitAPI):
3661
3667
  request['end_time'] = self.sum(since, self.options['maxTimeTillEnd'])
3662
3668
  if limit is not None:
3663
3669
  request['page_size'] = limit
3664
- response = self.contractPrivateGetOrderListOrderDeals(self.extend(request, query))
3670
+ response = self.contractPrivateGetOrderListOrderDeals(self.extend(request, params))
3665
3671
  #
3666
3672
  # {
3667
3673
  # "success": True,
ccxt/okx.py CHANGED
@@ -17,6 +17,7 @@ from ccxt.base.errors import AccountSuspended
17
17
  from ccxt.base.errors import ArgumentsRequired
18
18
  from ccxt.base.errors import BadRequest
19
19
  from ccxt.base.errors import BadSymbol
20
+ from ccxt.base.errors import ManualInteractionNeeded
20
21
  from ccxt.base.errors import InsufficientFunds
21
22
  from ccxt.base.errors import InvalidAddress
22
23
  from ccxt.base.errors import InvalidOrder
@@ -599,6 +600,7 @@ class okx(Exchange, ImplicitAPI):
599
600
  # General Class
600
601
  '1': ExchangeError, # Operation failed
601
602
  '2': ExchangeError, # Bulk operation partially succeeded
603
+ '4088': ManualInteractionNeeded, # {"code":"4088","data":[],"msg":"You can’t trade or deposit until you’ve verified your identity again. Head to Identity Verification to complete it."}
602
604
  '50000': BadRequest, # Body can not be empty
603
605
  '50001': OnMaintenance, # Matching engine upgrading. Please try again later
604
606
  '50002': BadRequest, # Json data format error
ccxt/pro/__init__.py CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  # ----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.4.10'
7
+ __version__ = '4.4.11'
8
8
 
9
9
  # ----------------------------------------------------------------------------
10
10
 
ccxt/pro/deribit.py CHANGED
@@ -23,6 +23,7 @@ class deribit(ccxt.async_support.deribit):
23
23
  'watchBalance': True,
24
24
  'watchTicker': True,
25
25
  'watchTickers': True,
26
+ 'watchBidsAsks': True,
26
27
  'watchTrades': True,
27
28
  'watchTradesForSymbols': True,
28
29
  'watchMyTrades': True,
@@ -265,6 +266,79 @@ class deribit(ccxt.async_support.deribit):
265
266
  self.tickers[symbol] = ticker
266
267
  client.resolve(ticker, messageHash)
267
268
 
269
+ async def watch_bids_asks(self, symbols: Strings = None, params={}) -> Tickers:
270
+ """
271
+ :see: https://docs.deribit.com/#quote-instrument_name
272
+ watches best bid & ask for symbols
273
+ :param str[] [symbols]: unified symbol of the market to fetch the ticker for
274
+ :param dict [params]: extra parameters specific to the exchange API endpoint
275
+ :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
276
+ """
277
+ await self.load_markets()
278
+ symbols = self.market_symbols(symbols, None, False)
279
+ url = self.urls['api']['ws']
280
+ channels = []
281
+ for i in range(0, len(symbols)):
282
+ market = self.market(symbols[i])
283
+ channels.append('quote.' + market['id'])
284
+ message: dict = {
285
+ 'jsonrpc': '2.0',
286
+ 'method': 'public/subscribe',
287
+ 'params': {
288
+ 'channels': channels,
289
+ },
290
+ 'id': self.request_id(),
291
+ }
292
+ request = self.deep_extend(message, params)
293
+ newTickers = await self.watch_multiple(url, channels, request, channels, request)
294
+ if self.newUpdates:
295
+ tickers: dict = {}
296
+ tickers[newTickers['symbol']] = newTickers
297
+ return tickers
298
+ return self.filter_by_array(self.bidsasks, 'symbol', symbols)
299
+
300
+ def handle_bid_ask(self, client: Client, message):
301
+ #
302
+ # {
303
+ # "jsonrpc": "2.0",
304
+ # "method": "subscription",
305
+ # "params": {
306
+ # "channel": "quote.BTC_USDT",
307
+ # "data": {
308
+ # "best_bid_amount": 0.026,
309
+ # "best_ask_amount": 0.026,
310
+ # "best_bid_price": 63908,
311
+ # "best_ask_price": 63940,
312
+ # "instrument_name": "BTC_USDT",
313
+ # "timestamp": 1727765131750
314
+ # }
315
+ # }
316
+ # }
317
+ #
318
+ params = self.safe_dict(message, 'params', {})
319
+ data = self.safe_dict(params, 'data', {})
320
+ ticker = self.parse_ws_bid_ask(data)
321
+ symbol = ticker['symbol']
322
+ self.bidsasks[symbol] = ticker
323
+ messageHash = self.safe_string(params, 'channel')
324
+ client.resolve(ticker, messageHash)
325
+
326
+ def parse_ws_bid_ask(self, ticker, market=None):
327
+ marketId = self.safe_string(ticker, 'instrument_name')
328
+ market = self.safe_market(marketId, market)
329
+ symbol = self.safe_string(market, 'symbol')
330
+ timestamp = self.safe_integer(ticker, 'timestamp')
331
+ return self.safe_ticker({
332
+ 'symbol': symbol,
333
+ 'timestamp': timestamp,
334
+ 'datetime': self.iso8601(timestamp),
335
+ 'ask': self.safe_string(ticker, 'best_ask_price'),
336
+ 'askVolume': self.safe_string(ticker, 'best_ask_amount'),
337
+ 'bid': self.safe_string(ticker, 'best_bid_price'),
338
+ 'bidVolume': self.safe_string(ticker, 'best_bid_amount'),
339
+ 'info': ticker,
340
+ }, market)
341
+
268
342
  async def watch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
269
343
  """
270
344
  get the list of most recent trades for a particular symbol
@@ -862,6 +936,7 @@ class deribit(ccxt.async_support.deribit):
862
936
  }
863
937
  handlers: dict = {
864
938
  'ticker': self.handle_ticker,
939
+ 'quote': self.handle_bid_ask,
865
940
  'book': self.handle_order_book,
866
941
  'trades': self.handle_trades,
867
942
  'chart': self.handle_ohlcv,
ccxt/pro/exmo.py CHANGED
@@ -6,7 +6,7 @@
6
6
  import ccxt.async_support
7
7
  from ccxt.async_support.base.ws.cache import ArrayCache, ArrayCacheBySymbolById
8
8
  import hashlib
9
- from ccxt.base.types import Balances, Int, OrderBook, Str, Ticker, Trade
9
+ from ccxt.base.types import Balances, Int, OrderBook, Str, Strings, Ticker, Tickers, Trade
10
10
  from ccxt.async_support.base.ws.client import Client
11
11
  from typing import List
12
12
  from ccxt.base.errors import NotSupported
@@ -20,7 +20,7 @@ class exmo(ccxt.async_support.exmo):
20
20
  'ws': True,
21
21
  'watchBalance': True,
22
22
  'watchTicker': True,
23
- 'watchTickers': False,
23
+ 'watchTickers': True,
24
24
  'watchTrades': True,
25
25
  'watchMyTrades': True,
26
26
  'watchOrders': False, # TODO
@@ -199,6 +199,7 @@ class exmo(ccxt.async_support.exmo):
199
199
  async def watch_ticker(self, symbol: str, params={}) -> Ticker:
200
200
  """
201
201
  watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
202
+ :see: https://documenter.getpostman.com/view/10287440/SzYXWKPi#fd8f47bc-8517-43c0-bb60-1d61a86d4471
202
203
  :param str symbol: unified symbol of the market to fetch the ticker for
203
204
  :param dict [params]: extra parameters specific to the exchange API endpoint
204
205
  :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
@@ -218,6 +219,32 @@ class exmo(ccxt.async_support.exmo):
218
219
  request = self.deep_extend(message, params)
219
220
  return await self.watch(url, messageHash, request, messageHash, request)
220
221
 
222
+ async def watch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
223
+ """
224
+ watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for all markets of a specific list
225
+ :see: https://documenter.getpostman.com/view/10287440/SzYXWKPi#fd8f47bc-8517-43c0-bb60-1d61a86d4471
226
+ :param str[] [symbols]: unified symbol of the market to fetch the ticker for
227
+ :param dict [params]: extra parameters specific to the exchange API endpoint
228
+ :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
229
+ """
230
+ await self.load_markets()
231
+ symbols = self.market_symbols(symbols, None, False)
232
+ messageHashes = []
233
+ args = []
234
+ for i in range(0, len(symbols)):
235
+ market = self.market(symbols[i])
236
+ messageHashes.append('ticker:' + market['symbol'])
237
+ args.append('spot/ticker:' + market['id'])
238
+ url = self.urls['api']['ws']['public']
239
+ message: dict = {
240
+ 'method': 'subscribe',
241
+ 'topics': args,
242
+ 'id': self.request_id(),
243
+ }
244
+ request = self.deep_extend(message, params)
245
+ await self.watch_multiple(url, messageHashes, request, messageHashes, request)
246
+ return self.filter_by_array(self.tickers, 'symbol', symbols)
247
+
221
248
  def handle_ticker(self, client: Client, message):
222
249
  #
223
250
  # spot
ccxt/pro/okx.py CHANGED
@@ -1813,7 +1813,7 @@ class okx(ccxt.async_support.okx):
1813
1813
  tradeSymbols = list(symbols.keys())
1814
1814
  for i in range(0, len(tradeSymbols)):
1815
1815
  symbolMessageHash = messageHash + '::' + tradeSymbols[i]
1816
- client.resolve(self.orders, symbolMessageHash)
1816
+ client.resolve(self.myTrades, symbolMessageHash)
1817
1817
 
1818
1818
  def request_id(self):
1819
1819
  ts = str(self.milliseconds())
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ccxt
3
- Version: 4.4.10
3
+ Version: 4.4.11
4
4
  Summary: A JavaScript / TypeScript / Python / C# / PHP cryptocurrency trading library with support for 100+ exchanges
5
5
  Home-page: https://ccxt.com
6
6
  Author: Igor Kroitor
@@ -272,13 +272,13 @@ console.log(version, Object.keys(exchanges));
272
272
 
273
273
  All-in-one browser bundle (dependencies included), served from a CDN of your choice:
274
274
 
275
- * jsDelivr: https://cdn.jsdelivr.net/npm/ccxt@4.4.10/dist/ccxt.browser.min.js
276
- * unpkg: https://unpkg.com/ccxt@4.4.10/dist/ccxt.browser.min.js
275
+ * jsDelivr: https://cdn.jsdelivr.net/npm/ccxt@4.4.11/dist/ccxt.browser.min.js
276
+ * unpkg: https://unpkg.com/ccxt@4.4.11/dist/ccxt.browser.min.js
277
277
 
278
278
  CDNs are not updated in real-time and may have delays. Defaulting to the most recent version without specifying the version number is not recommended. Please, keep in mind that we are not responsible for the correct operation of those CDN servers.
279
279
 
280
280
  ```HTML
281
- <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/ccxt@4.4.10/dist/ccxt.browser.min.js"></script>
281
+ <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/ccxt@4.4.11/dist/ccxt.browser.min.js"></script>
282
282
  ```
283
283
 
284
284
  Creates a global `ccxt` object:
@@ -1,10 +1,10 @@
1
- ccxt/__init__.py,sha256=IBUk-5WBviaC0Z9xzG1Y_r8DMRy8-O7BnZPJoSGN-LA,16486
1
+ ccxt/__init__.py,sha256=Gax7ltl-abmr5WE-fBwP-o4TICuEFP9YFkoyKoOuvZk,16486
2
2
  ccxt/ace.py,sha256=3KFlbRm6N9hXsKUsgZbQCFPZT5WGLm4HOjR19Q3uPts,42419
3
3
  ccxt/alpaca.py,sha256=nVQJ8vG4JrjEvMlu_nPoyR2lBq41j9Z2smPq95nDhng,47504
4
4
  ccxt/ascendex.py,sha256=LIC9mnNkXzkxUWJDsgyDkL4gQUkzMHq5peHlD8EBKPw,151624
5
5
  ccxt/bequant.py,sha256=RBiAmaTbL35DgiV3Hl6uchLUd78V0z1T9riTlNsrpdc,1174
6
6
  ccxt/bigone.py,sha256=Gu9bXaa4rVRRVZEkUEKDWEUZ2Hjly22C6jrbseGv-r8,90980
7
- ccxt/binance.py,sha256=8fNpD6851N3Th5X81Os5GCmqD-eRTv2wmf2R6_T86XU,647720
7
+ ccxt/binance.py,sha256=PWeiyyXaUij99E96WS3-47uSBYmibyRzskorlS4OlAQ,647761
8
8
  ccxt/binancecoinm.py,sha256=arFnEh8mErSyi23eVPWE4iwoT7PWQyxGGVJCKCy6UJY,1702
9
9
  ccxt/binanceus.py,sha256=HRsk0fIoi8AAFdzRCUMkkXUGLqBrf0guUOfUxupHFeY,9202
10
10
  ccxt/binanceusdm.py,sha256=bAPcJj5HLxoCdPolriM8sJpoTBwbV78vBTbKRmWhNP4,2632
@@ -17,7 +17,7 @@ ccxt/bitcoincom.py,sha256=PyWIl4nC4jp5Uba2lI1At0N_hhNyWD0DoZC_MSyL_s4,502
17
17
  ccxt/bitfinex.py,sha256=w3t0YAwtOfCwLy5_w2wTq90qkTgUUyn0sqdO22zD-9U,73527
18
18
  ccxt/bitfinex2.py,sha256=4374ASOWdG6FMPEQAliCVnGX1w1ZGQrYZJHg-pb0wPs,160678
19
19
  ccxt/bitflyer.py,sha256=nh1EDzO66S-Ps9xBy-U4CErt6Q06E77wbWF_aTRw6RI,41663
20
- ccxt/bitget.py,sha256=nhZIkDsBOnvS8zbuQrxupk8JaDlfH5SsrdSK40t1GDo,424352
20
+ ccxt/bitget.py,sha256=CAecOpBVLlorL4I1S1iVfcNN57BZo8Od01FgtcLiQ94,424354
21
21
  ccxt/bithumb.py,sha256=8oTnFWi8Ai9fnm5FPXvNmaUAVJEOqYi-18VC23cWmXY,47935
22
22
  ccxt/bitmart.py,sha256=xhBbJO2vxoKdMA4MKTQfmtJ4j8DRsstCg3P2VaTyDTk,221980
23
23
  ccxt/bitmex.py,sha256=7ipuNwCEqU8KduLJIvhxxF4GLNmtP6SOsVHBnRcHH74,127309
@@ -63,14 +63,14 @@ ccxt/hashkey.py,sha256=bJAXP1YkNOB92oT0WUVpygn0eKREvW43wu7ntdN9yhI,191991
63
63
  ccxt/hitbtc.py,sha256=dY9ghNwp76I9_xhoCIH2W1jMahq7FYn5rWRDPbPnU88,153572
64
64
  ccxt/hitbtc3.py,sha256=qRAr4Zvaju9IQWRZUohdoN7xRnzIMPq8AyYb3gPv-Is,455
65
65
  ccxt/hollaex.py,sha256=2KIbenZ3vcBDN_rs2CxG5_foKLaYxJd73vVV7M8n_8E,76140
66
- ccxt/htx.py,sha256=lmvoKkvTLUUfHw-ygxh_8tg7_XU0WTSQJs_OB7O5CD0,430518
66
+ ccxt/htx.py,sha256=On5IPppcM_KQ-KdMj2K62QKyu5FJEezLF4YZUo_HxbM,430944
67
67
  ccxt/huobi.py,sha256=4vaG7IRN7fyjaJ_ac6S-njlHOfSEN5de7aq0noznxYw,438
68
68
  ccxt/huobijp.py,sha256=m9rYCCApGDtpbiqCK6Gw4GDd5EskEmho4xSemGbY1kY,89852
69
69
  ccxt/hyperliquid.py,sha256=QTly1QFJoFse-ioADxf7KRQWCvK-Ksiopemg0D9y59k,122981
70
70
  ccxt/idex.py,sha256=P2jNsxiwIlMgrfPKbtmjLJQrzFcWp_TjgJaLq793oco,73255
71
71
  ccxt/independentreserve.py,sha256=k2T7rA1zcvlHC8QpmkKYO7ik44SayiElaSpW0EsTevA,37847
72
72
  ccxt/indodax.py,sha256=o5YLVpQzm1LFWPAsvUOnvJxeBEWtaB_jQCvCOmXEw1Y,54758
73
- ccxt/kraken.py,sha256=V0hJdd8tMQXY34WVFrLde64sUguFGl7nljPIH7-uItQ,133935
73
+ ccxt/kraken.py,sha256=XbdltZVqZqZuLWxCxNfSPj6D_68aGzJxnFujNXvSPwc,135729
74
74
  ccxt/krakenfutures.py,sha256=3hMs_WJWkt5numbsdT4ip8AaY5SLLeRQe98c4N_sJrU,119709
75
75
  ccxt/kucoin.py,sha256=kD33ixY0cJKSrkAyDFhcy4Qt2nbTrjh-fBGHTwygwf0,229853
76
76
  ccxt/kucoinfutures.py,sha256=ACYvHVWNoidt5Y9taKnBLt1qs1iui7hvpkFn46WvvkE,132560
@@ -80,12 +80,12 @@ ccxt/lbank.py,sha256=Glx9CN_jdQMiUngJLYioxzwDfgFTdusdOfK53_Bg6A8,116045
80
80
  ccxt/luno.py,sha256=P3cZ_CnVyjMjDFn5e7jaev-pqs_rgmWQTsiJThRtffE,46353
81
81
  ccxt/lykke.py,sha256=gmjb8bQsPztMtoZsHxWGe_T2381HLb1ar1S667UZzIE,51411
82
82
  ccxt/mercado.py,sha256=LWCh89IzXu-yhPGqhkdPW6wqOqfO8nmbSQhAyYiSH8U,35710
83
- ccxt/mexc.py,sha256=oD19BNBNj_v3QhFLxnHMPac_n_syNRJB_Ddnd7WW0Es,249301
83
+ ccxt/mexc.py,sha256=rxYgPUGCEM7jrFmE0u4f2SjBSLxxQ2WgmtIbPxr1eJI,249595
84
84
  ccxt/ndax.py,sha256=m9MhE8i8JmaSf7Lc-I_CcvUpQ5VNTRcfYZLrFEwk3UI,109097
85
85
  ccxt/novadax.py,sha256=_xFkuZ72vHhpJb1N9h_MQHRD05GDWlqUeLQQcOp43BM,64436
86
86
  ccxt/oceanex.py,sha256=jBXRD1hZk_wa9PXVp9feistAO_jK7UvzG5zznhPQgH4,41120
87
87
  ccxt/okcoin.py,sha256=nKWsJTRprIODYHUTIoXRz6eANM2zdRPF7BHY86ExEyQ,151126
88
- ccxt/okx.py,sha256=E62h6qeOIlJVZWAa2Q2LwUgNWyUN_Gz3nC3M3TiwmLg,380303
88
+ ccxt/okx.py,sha256=SZSb6orS2-b1i8-PEEUFfJDxhu-_xgz6xxLaZH6jaxM,380566
89
89
  ccxt/onetrading.py,sha256=evWWr4z7-HglV2ma2z-R34_JYJqlr6LQT0rV_OyWKGs,88375
90
90
  ccxt/oxfun.py,sha256=iHy_pywYS8t-cbmh-AkhGc8Kfp9aMgawVr0VloKW_ik,124760
91
91
  ccxt/p2b.py,sha256=iPzHv663K8F1F0uTWEYpfQBcaqowY8MQ5tZt2ZNpoQE,54290
@@ -115,10 +115,10 @@ ccxt/abstract/alpaca.py,sha256=vgzqnRTvEnAbLYgfDzGpmVUZxRLWC8BWA6nQ16m-xXY,10382
115
115
  ccxt/abstract/ascendex.py,sha256=5A8Zgq77jsdHlEzlTW_2nDybUUVfNVVOu6BgY3TWqRM,11394
116
116
  ccxt/abstract/bequant.py,sha256=OTBtNu3DQeAqAC_Lbi0NePUs-ZQQllcLrVDI2G04nwQ,15601
117
117
  ccxt/abstract/bigone.py,sha256=ChHXrnz1zHqLHJn162SxjfgbO8ocQppy7lXWGsHEtcI,4887
118
- ccxt/abstract/binance.py,sha256=bBVbWDLVNHrWooslouXQQOF5Tdru2jYHvuQdFSvjkgk,93855
119
- ccxt/abstract/binancecoinm.py,sha256=bBVbWDLVNHrWooslouXQQOF5Tdru2jYHvuQdFSvjkgk,93855
120
- ccxt/abstract/binanceus.py,sha256=zs74hB3U8Fl4uYiIlXXuxRc5-QWdEhlAh2iX1Fx-L8A,100517
121
- ccxt/abstract/binanceusdm.py,sha256=bBVbWDLVNHrWooslouXQQOF5Tdru2jYHvuQdFSvjkgk,93855
118
+ ccxt/abstract/binance.py,sha256=xPATItq927O8iMFqAhslAajMGxWlfmpWbHOQWDiFmCU,93951
119
+ ccxt/abstract/binancecoinm.py,sha256=xPATItq927O8iMFqAhslAajMGxWlfmpWbHOQWDiFmCU,93951
120
+ ccxt/abstract/binanceus.py,sha256=e7M1Py8HI1BWX5PSxz35WTsmEVPS5ZNI5TyOdYEYAlQ,100613
121
+ ccxt/abstract/binanceusdm.py,sha256=xPATItq927O8iMFqAhslAajMGxWlfmpWbHOQWDiFmCU,93951
122
122
  ccxt/abstract/bingx.py,sha256=Rb93j2sCYAi0egAE4TAAOG7XuC5XdHQaGQZC9V-meqQ,20662
123
123
  ccxt/abstract/bit2c.py,sha256=np6i756kSB5dO3Nj6POLKxkWkpYcsGg-4LS8BwPrizI,2830
124
124
  ccxt/abstract/bitbank.py,sha256=hrHsD7Uvtyy2o2lzCHau3-eNq16pnZ3-YDQ6Tq_sxYU,2735
@@ -218,13 +218,13 @@ 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=ssq_Pc6kIb-NkA4cNKiXLKBZJO6OYfrRjbF_YWCidiY,16289
221
+ ccxt/async_support/__init__.py,sha256=14BDk1kiL1YsotKP9oLDSiWj8nVvmywySk4775RgbsA,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=rSsbtR8BKtun-QFKduQ4rHr_h4rKqU0eB_-jYdWeWuM,152437
225
225
  ccxt/async_support/bequant.py,sha256=1hTwHovo1bW1XTIc8ZKjvJ-Xg6LfmpGdzT7TepykaVM,1188
226
226
  ccxt/async_support/bigone.py,sha256=0Ljt-JAt4i4Hvl7Jxd-MOggzqC0ra1v9_NlTgCbtptM,91434
227
- ccxt/async_support/binance.py,sha256=KgGBpg5BRQM6jsxONkSxvZslyaxl8lFg_AT-yYiZNQQ,650477
227
+ ccxt/async_support/binance.py,sha256=-jntdp26Spw4vW0tWGhFb5mLQ8VaCGuWaOAqQHtOxmY,650518
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
@@ -237,7 +237,7 @@ ccxt/async_support/bitcoincom.py,sha256=RiqwhK3RfxQ_PXTa860fphDCvwA8dalL-_rXlK85
237
237
  ccxt/async_support/bitfinex.py,sha256=pzyfQzUSxFYd6Ted0hNLgL545S8rFCrsoJc9Odk3zoo,73993
238
238
  ccxt/async_support/bitfinex2.py,sha256=Dn20G_rQ2Z5TdDWjjg45MiNrSuSRR8JowZ1X7Th7Nh0,161420
239
239
  ccxt/async_support/bitflyer.py,sha256=DTyHe4QBOED0xUEYoDfpGFL0sULp_3CxTXCWfDPbGbE,41971
240
- ccxt/async_support/bitget.py,sha256=vxWGB8-f-puJ9qF68cMdQdFzzM7IN7r8v2N35WCU3lM,425964
240
+ ccxt/async_support/bitget.py,sha256=zcOkulMNUCYvt5SzJc2C1ThxhbEaD56bIx1ryqKn2zw,425966
241
241
  ccxt/async_support/bithumb.py,sha256=Q0Cx_cRKZRfdpBAhQyINm63Qw3M6BRYQRiF0UqYzfis,48214
242
242
  ccxt/async_support/bitmart.py,sha256=DK5e-GZvF66oeJrwhclxlumdW9e-FUxI5PUZ0H73qxs,222972
243
243
  ccxt/async_support/bitmex.py,sha256=Kd_Mw3VuNB1PGxhpz3my295tzkAVQlT_GZVadTHR6nY,127887
@@ -283,14 +283,14 @@ ccxt/async_support/hashkey.py,sha256=xiS8FXemxDKVKQNJBtyOYG5-QaizyyGR8-I1CusmFcY
283
283
  ccxt/async_support/hitbtc.py,sha256=_CPsYQhE-1wDAOFGi4Xq9OxTqMuZ4ABwXbpSuOvMuNg,154618
284
284
  ccxt/async_support/hitbtc3.py,sha256=dmSYoD2o4av_zzbZI8HNIoj8BWxA7QozsVpy8JaOXzU,469
285
285
  ccxt/async_support/hollaex.py,sha256=msUnnbWLNeCxFW77BnfLoFWBdvQIDwV7Rtbi9TA4TYY,76574
286
- ccxt/async_support/htx.py,sha256=n_VPE6Ljf_kXxobLm4ot89JXbg-z2ijjkxr-lE_jKhY,432910
286
+ ccxt/async_support/htx.py,sha256=RpgDpDJ5LRmeBQliDvJgjvJ1VVtRZkO85DvMiWwuwLU,433336
287
287
  ccxt/async_support/huobi.py,sha256=fup0j6wQ1khAtfbb1H4CSyJAOzhxuoHMmrM6sgTuhr8,452
288
288
  ccxt/async_support/huobijp.py,sha256=OeEHn0GXQ56YGeUM21zwRqsEm8d2LD_SDspBsQMlds4,90352
289
289
  ccxt/async_support/hyperliquid.py,sha256=sjt1Z2dv2YCWdhSfOmjYLmxYhcp2zd7M-_3Wh1S4lWE,123645
290
290
  ccxt/async_support/idex.py,sha256=UcAvdMc2CP_6E8lET4rmQiIP-RaUfZHSo6pQeA17v-g,73731
291
291
  ccxt/async_support/independentreserve.py,sha256=-W-SMPkJwY9FMN5I6l5eL8cPwC0_UuqmfU5yMmyJoiw,38145
292
292
  ccxt/async_support/indodax.py,sha256=-dcr5VdpSkcLgy2KUlumm0NhGs4_mNstysIlunhF2-4,55066
293
- ccxt/async_support/kraken.py,sha256=yM19n9gMYaWdyOTb6a-BKO1KXqOEE0GD_XwYcGE9Oi0,134591
293
+ ccxt/async_support/kraken.py,sha256=rAqVk8LnAqlbUVCPelyUOjmreiCsfKh5lfwDR00WPVU,136385
294
294
  ccxt/async_support/krakenfutures.py,sha256=qtXSy52rlCa8LeqrqFWkiPvO7Og-nCoqXJlL3ZDph5A,120197
295
295
  ccxt/async_support/kucoin.py,sha256=5Tf9244VECUmOvckxH-_6ug1_i-SJimUo_LUv1XnBEc,230996
296
296
  ccxt/async_support/kucoinfutures.py,sha256=KYqgQcDQMaOEHHKA_XChoF4V6uLTHv5Qkdc44HjJwy4,133288
@@ -300,12 +300,12 @@ ccxt/async_support/lbank.py,sha256=MeqPjECSmsplCtatu7Ns6sHRwzAGP_6S5MwB2BomnXk,1
300
300
  ccxt/async_support/luno.py,sha256=WRQ5uH3Wr1HHZa9ZtcWCYdrmz-Y8proS5XOGZpBtiZo,46691
301
301
  ccxt/async_support/lykke.py,sha256=JW9HaTjFCQJzk1tbczjMGKie0BkKdZF2Kmm2Hg69qQE,51725
302
302
  ccxt/async_support/mercado.py,sha256=mb7ULqvEr9PQ7jBOpQxiufgYzwTeAfr0G2NZmrUeUgs,35952
303
- ccxt/async_support/mexc.py,sha256=M-PpAlM2E9XeKg_mjBy1hOpM8iW_MoiyKNROenvURQs,250553
303
+ ccxt/async_support/mexc.py,sha256=Ot2-4RSf1ahqd0gEBtbxdRgiqaadi_v-uJYMuFt1jsY,250847
304
304
  ccxt/async_support/ndax.py,sha256=IX7cFNjCELJIImof_jVsNzihXjCOmMyqRnlFHnzOq_w,109621
305
305
  ccxt/async_support/novadax.py,sha256=YNKUM1CGFK7lpBwbxSSL1IAEJCRVsNxeITkwtw6VWCM,64804
306
306
  ccxt/async_support/oceanex.py,sha256=nU_3t_nXz4WP0k3m5cHL3i67REZMpFSgtboeKPrwY-c,41458
307
307
  ccxt/async_support/okcoin.py,sha256=TV0xooV4DIw1M8DrMNQBsDv4fhSTEp7Xtb5WK-F9bvc,151650
308
- ccxt/async_support/okx.py,sha256=2VnKEbk15on63tJmTujIlAs9ifOby1rXgb7trdXqzf8,381890
308
+ ccxt/async_support/okx.py,sha256=W7oaFg-Uz6RcQAyrJtapwrLMgXnWkpg9BETs5GmMqsE,382153
309
309
  ccxt/async_support/onetrading.py,sha256=cZSvu7ZIavao-bqv1CgQatPfsrfXDgCt2UfxMtYsOMM,88827
310
310
  ccxt/async_support/oxfun.py,sha256=dwBuBi8-JFyU4IoNQCtq73zoiU_i6CK4vhEi2YT02Dc,125304
311
311
  ccxt/async_support/p2b.py,sha256=VKUX8u7gtHkKDwBjAyskScm2FEs6xxDuKLXE-jSHXwY,54532
@@ -330,7 +330,7 @@ ccxt/async_support/yobit.py,sha256=GQhvYrsGHQrVdTrNHQxx9isEGqUABexlllzao9HL3f8,5
330
330
  ccxt/async_support/zaif.py,sha256=-ZTr8M2JaIRCL90VrbCDXBMAsZwbiwsFChSQ2rWODuQ,29044
331
331
  ccxt/async_support/zonda.py,sha256=njWK4t42n7BowCvc3j5WKwCxEDc2Y8vi0d-yp296-q0,81883
332
332
  ccxt/async_support/base/__init__.py,sha256=aVYSsFi--b4InRs9zDN_wtCpj8odosAB726JdUHavrk,67
333
- ccxt/async_support/base/exchange.py,sha256=AHzRIOgnAkEc8EPM7ljzSsJi0YJwE8AdkeP7TCDrny4,111720
333
+ ccxt/async_support/base/exchange.py,sha256=2f2lzJRVhrxhV4BqceHQOZbRmAj824zXkL58h2Q-R8A,111720
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=f7SOePsZfGshnz-L6O5kuB8_RWLGNtHHKgq7zNJ0_q0,299018
347
+ ccxt/base/exchange.py,sha256=JxtlI0_lmff261S-1D6bIVzovfRBeuNT48xVnP_vCdg,299018
348
348
  ccxt/base/precise.py,sha256=koce64Yrp6vFbGijJtUt-QQ6XhJgeGTCksZ871FPp_A,8886
349
349
  ccxt/base/types.py,sha256=M9-wX1o2UqZxMMuLZgTGuQ8J6LpiGQsen17QhKwDc0k,9634
350
- ccxt/pro/__init__.py,sha256=G4cHpAap5m7PsePER81V6FaUZYS-vy768xmsBu8jRQo,7710
350
+ ccxt/pro/__init__.py,sha256=RqYWiGMbyRUvF4lY3Hp0p4FcemFyS8Aosg_gzWEI5iw,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
@@ -380,8 +380,8 @@ ccxt/pro/coinex.py,sha256=oONeBMtz9ylneI3vxrbf6Wt00JGey2nV1Q64O9FRHbU,56380
380
380
  ccxt/pro/coinone.py,sha256=XxJeMDbg3tSDoC3H8p9y7MB_yBR3ZN6PiQyEGaziAZs,15734
381
381
  ccxt/pro/cryptocom.py,sha256=kykIsupDkYAxQ2Eb9z4K3qa2QBayaanJR5RITiHA4zw,60174
382
382
  ccxt/pro/currencycom.py,sha256=8B9pSuPyO0ROCWOROUFoNbJBeOU3bRmlKXSj1CBMkPI,22459
383
- ccxt/pro/deribit.py,sha256=ZN3Un53CDPlInzSElsOWNHs5bxpNtsy-8kl7AdR5UyU,42915
384
- ccxt/pro/exmo.py,sha256=n44MqOwY-tSt0TFNhQKydjxRJoSbrMVBzL4NNswOZm4,24542
383
+ ccxt/pro/deribit.py,sha256=wWvy6Anwqm9F_h3nyEnX8UV4mRG2GJXH-G0Boz1KBlw,46070
384
+ ccxt/pro/exmo.py,sha256=ExNxds38W0TKiwQL5FLxFgTLRaz7QY0fi2yrLOiZ8FE,26025
385
385
  ccxt/pro/gate.py,sha256=GulP9oRrMfiP2qMXwdq4NNwPApDmBk1GNzcRyGFkA14,86198
386
386
  ccxt/pro/gateio.py,sha256=_uBWXYQbmsHRivKnZOJDmxJ9tWLO_0HAxmOjAEUy9nE,391
387
387
  ccxt/pro/gemini.py,sha256=8B8dbYPbKbZb3lzhlt8-x0oybQxOHr8Q4R_f5edLwbU,36899
@@ -403,7 +403,7 @@ ccxt/pro/luno.py,sha256=ThXkXNrLvp9BW8XXxRcbpRaw9QcLCS2f2tCqbF6qpEU,12384
403
403
  ccxt/pro/mexc.py,sha256=kVw1d5lOJlvU9lyo3545EM3j1sck3Gr5A3qznBH04Dk,50361
404
404
  ccxt/pro/ndax.py,sha256=De7ohX5Dp2PSfFmt50mGH9cB9Me53Wb-B8S6N4_Flvk,22979
405
405
  ccxt/pro/okcoin.py,sha256=h8niyeq67h-oBmxiMMy2JdNgOI0fBQuEC3QdUW4-NFs,31048
406
- ccxt/pro/okx.py,sha256=1v_4O8o3ssySs0U8WsB18HscVo4ePboA2jvfabkvSOw,101893
406
+ ccxt/pro/okx.py,sha256=qDpd2gicssg6LnVdmZsBrwU_cogrMwGQ2gZqa2JrOwA,101895
407
407
  ccxt/pro/onetrading.py,sha256=2LP1LvwbQrwsyXDPRU6_ez4fWR3htKFuzC-4CenHzhU,54817
408
408
  ccxt/pro/oxfun.py,sha256=-O1xdbfnF5Q3lC16vxc4J2NnYMhAGbafiOZTn0yEsVE,46741
409
409
  ccxt/pro/p2b.py,sha256=S-gzeaSOW_WBZdsllE75RuxCi9KGnJ25trlCt1OG0Z8,20919
@@ -650,8 +650,8 @@ ccxt/test/tests_async.py,sha256=Hfdxrjw3nP7lGyjYs35ZgTBM7pF6UIJrkZWz-ycceRw,8457
650
650
  ccxt/test/tests_helpers.py,sha256=xhOILoZ_x3RSfQjtKt6AQlkp9DkOtpTQe8GAUUZoM6s,10069
651
651
  ccxt/test/tests_init.py,sha256=eVwwUHujX9t4rjgo4TqEeg7DDhR1Hb_e2SJN8NVGyl0,998
652
652
  ccxt/test/tests_sync.py,sha256=tQNiZZi3ulprLY513aSadwieBCuNyzyRLE8nSTZIUvw,83641
653
- ccxt-4.4.10.dist-info/LICENSE.txt,sha256=EIb9221AhMHV7xF1_55STFdKTFsnJVJYkRpY2Lnvo5w,1068
654
- ccxt-4.4.10.dist-info/METADATA,sha256=VsPf8DhY3GWcd6hXkqspylXeYLp89VegEbkW9uyhKWw,114994
655
- ccxt-4.4.10.dist-info/WHEEL,sha256=z9j0xAa_JmUKMpmz72K0ZGALSM_n-wQVmGbleXx2VHg,110
656
- ccxt-4.4.10.dist-info/top_level.txt,sha256=CkQDuCTDKNcImPV60t36G6MdYfxsAPNiSaEwifVoVMo,5
657
- ccxt-4.4.10.dist-info/RECORD,,
653
+ ccxt-4.4.11.dist-info/LICENSE.txt,sha256=EIb9221AhMHV7xF1_55STFdKTFsnJVJYkRpY2Lnvo5w,1068
654
+ ccxt-4.4.11.dist-info/METADATA,sha256=TVO9IKasFQ23Jim4DhfCIJtNJzvEcemjYwW_S5k3rFY,114994
655
+ ccxt-4.4.11.dist-info/WHEEL,sha256=z9j0xAa_JmUKMpmz72K0ZGALSM_n-wQVmGbleXx2VHg,110
656
+ ccxt-4.4.11.dist-info/top_level.txt,sha256=CkQDuCTDKNcImPV60t36G6MdYfxsAPNiSaEwifVoVMo,5
657
+ ccxt-4.4.11.dist-info/RECORD,,
File without changes