ccxt 4.3.19__py2.py3-none-any.whl → 4.3.20__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
ccxt/__init__.py CHANGED
@@ -22,7 +22,7 @@
22
22
 
23
23
  # ----------------------------------------------------------------------------
24
24
 
25
- __version__ = '4.3.19'
25
+ __version__ = '4.3.20'
26
26
 
27
27
  # ----------------------------------------------------------------------------
28
28
 
ccxt/abstract/bitget.py CHANGED
@@ -101,6 +101,9 @@ class ImplicitAPI:
101
101
  private_spot_get_v2_spot_account_subaccount_assets = privateSpotGetV2SpotAccountSubaccountAssets = Entry('v2/spot/account/subaccount-assets', ['private', 'spot'], 'GET', {'cost': 2})
102
102
  private_spot_get_v2_spot_account_bills = privateSpotGetV2SpotAccountBills = Entry('v2/spot/account/bills', ['private', 'spot'], 'GET', {'cost': 2})
103
103
  private_spot_get_v2_spot_account_transferrecords = privateSpotGetV2SpotAccountTransferRecords = Entry('v2/spot/account/transferRecords', ['private', 'spot'], 'GET', {'cost': 1})
104
+ private_spot_get_v2_account_funding_assets = privateSpotGetV2AccountFundingAssets = Entry('v2/account/funding-assets', ['private', 'spot'], 'GET', {'cost': 2})
105
+ private_spot_get_v2_account_bot_assets = privateSpotGetV2AccountBotAssets = Entry('v2/account/bot-assets', ['private', 'spot'], 'GET', {'cost': 2})
106
+ private_spot_get_v2_account_all_account_balance = privateSpotGetV2AccountAllAccountBalance = Entry('v2/account/all-account-balance', ['private', 'spot'], 'GET', {'cost': 20})
104
107
  private_spot_get_v2_spot_wallet_deposit_address = privateSpotGetV2SpotWalletDepositAddress = Entry('v2/spot/wallet/deposit-address', ['private', 'spot'], 'GET', {'cost': 2})
105
108
  private_spot_get_v2_spot_wallet_deposit_records = privateSpotGetV2SpotWalletDepositRecords = Entry('v2/spot/wallet/deposit-records', ['private', 'spot'], 'GET', {'cost': 2})
106
109
  private_spot_get_v2_spot_wallet_withdrawal_records = privateSpotGetV2SpotWalletWithdrawalRecords = Entry('v2/spot/wallet/withdrawal-records', ['private', 'spot'], 'GET', {'cost': 2})
@@ -4,7 +4,7 @@
4
4
 
5
5
  # -----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.3.19'
7
+ __version__ = '4.3.20'
8
8
 
9
9
  # -----------------------------------------------------------------------------
10
10
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  # -----------------------------------------------------------------------------
4
4
 
5
- __version__ = '4.3.19'
5
+ __version__ = '4.3.20'
6
6
 
7
7
  # -----------------------------------------------------------------------------
8
8
 
@@ -1841,6 +1841,8 @@ class Exchange(BaseExchange):
1841
1841
  response = None
1842
1842
  if method == 'fetchAccounts':
1843
1843
  response = await getattr(self, method)(params)
1844
+ elif method == 'getLeverageTiersPaginated':
1845
+ response = await getattr(self, method)(symbol, params)
1844
1846
  else:
1845
1847
  response = await getattr(self, method)(symbol, since, maxEntriesPerRequest, params)
1846
1848
  errors = 0
@@ -332,6 +332,9 @@ class bitget(Exchange, ImplicitAPI):
332
332
  'v2/spot/account/subaccount-assets': 2,
333
333
  'v2/spot/account/bills': 2,
334
334
  'v2/spot/account/transferRecords': 1,
335
+ 'v2/account/funding-assets': 2,
336
+ 'v2/account/bot-assets': 2,
337
+ 'v2/account/all-account-balance': 20,
335
338
  'v2/spot/wallet/deposit-address': 2,
336
339
  'v2/spot/wallet/deposit-records': 2,
337
340
  'v2/spot/wallet/withdrawal-records': 2,
@@ -7582,6 +7582,33 @@ class bybit(Exchange, ImplicitAPI):
7582
7582
  'datetime': self.iso8601(timestamp),
7583
7583
  })
7584
7584
 
7585
+ async def get_leverage_tiers_paginated(self, symbol: Str = None, params={}):
7586
+ await self.load_markets()
7587
+ market = None
7588
+ if symbol is not None:
7589
+ market = self.market(symbol)
7590
+ paginate = False
7591
+ paginate, params = self.handle_option_and_params(params, 'getLeverageTiersPaginated', 'paginate')
7592
+ if paginate:
7593
+ return await self.fetch_paginated_call_cursor('getLeverageTiersPaginated', symbol, None, None, params, 'nextPageCursor', 'cursor', None, 100)
7594
+ subType = None
7595
+ subType, params = self.handle_sub_type_and_params('getLeverageTiersPaginated', market, params, 'linear')
7596
+ request = {
7597
+ 'category': subType,
7598
+ }
7599
+ response = await self.publicGetV5MarketRiskLimit(self.extend(request, params))
7600
+ result = self.add_pagination_cursor_to_result(response)
7601
+ first = self.safe_dict(result, 0)
7602
+ total = len(result)
7603
+ lastIndex = total - 1
7604
+ last = self.safe_dict(result, lastIndex)
7605
+ cursorValue = self.safe_string(first, 'nextPageCursor')
7606
+ last['info'] = {
7607
+ 'nextPageCursor': cursorValue,
7608
+ }
7609
+ result[lastIndex] = last
7610
+ return result
7611
+
7585
7612
  async def fetch_leverage_tiers(self, symbols: Strings = None, params={}):
7586
7613
  """
7587
7614
  :see: https://bybit-exchange.github.io/docs/v5/market/risk-limit
@@ -7589,22 +7616,18 @@ class bybit(Exchange, ImplicitAPI):
7589
7616
  :param str[] [symbols]: a list of unified market symbols
7590
7617
  :param dict [params]: extra parameters specific to the exchange API endpoint
7591
7618
  :param str [params.subType]: market subType, ['linear', 'inverse'], default is 'linear'
7619
+ :param boolean [params.paginate]: default False, when True will automatically paginate by calling self endpoint multiple times. See in the docs all the [available parameters](https://github.com/ccxt/ccxt/wiki/Manual#pagination-params)
7592
7620
  :returns dict: a dictionary of `leverage tiers structures <https://docs.ccxt.com/#/?id=leverage-tiers-structure>`, indexed by market symbols
7593
7621
  """
7594
7622
  await self.load_markets()
7595
7623
  market = None
7624
+ symbol = None
7596
7625
  if symbols is not None:
7597
7626
  market = self.market(symbols[0])
7598
7627
  if market['spot']:
7599
7628
  raise NotSupported(self.id + ' fetchLeverageTiers() is not supported for spot market')
7600
- subType = None
7601
- subType, params = self.handle_sub_type_and_params('fetchTickers', market, params, 'linear')
7602
- request = {
7603
- 'category': subType,
7604
- }
7605
- response = await self.publicGetV5MarketRiskLimit(self.extend(request, params))
7606
- result = self.safe_dict(response, 'result', {})
7607
- data = self.safe_list(result, 'list', [])
7629
+ symbol = market['symbol']
7630
+ data = await self.get_leverage_tiers_paginated(symbol, self.extend({'paginate': True, 'paginationCalls': 20}, params))
7608
7631
  symbols = self.market_symbols(symbols)
7609
7632
  return self.parse_leverage_tiers(data, symbols, 'symbol')
7610
7633
 
@@ -7630,9 +7653,12 @@ class bybit(Exchange, ImplicitAPI):
7630
7653
  for i in range(0, len(keys)):
7631
7654
  marketId = keys[i]
7632
7655
  entry = grouped[marketId]
7656
+ for j in range(0, len(entry)):
7657
+ id = self.safe_integer(entry[j], 'id')
7658
+ entry[j]['id'] = id
7633
7659
  market = self.safe_market(marketId, None, None, 'contract')
7634
7660
  symbol = market['symbol']
7635
- tiers[symbol] = self.parse_market_leverage_tiers(entry, market)
7661
+ tiers[symbol] = self.parse_market_leverage_tiers(self.sort_by(entry, 'id'), market)
7636
7662
  return tiers
7637
7663
 
7638
7664
  def parse_market_leverage_tiers(self, info, market: Market = None):
@@ -3925,47 +3925,62 @@ class coinex(Exchange, ImplicitAPI):
3925
3925
  async def fetch_leverage_tiers(self, symbols: Strings = None, params={}):
3926
3926
  """
3927
3927
  retrieve information on the maximum leverage, and maintenance margin for trades of varying trade sizes
3928
- :see: https://viabtc.github.io/coinex_api_en_doc/futures/#docsfutures001_http007_market_limit
3928
+ :see: https://docs.coinex.com/api/v2/futures/market/http/list-market-position-level
3929
3929
  :param str[]|None symbols: list of unified market symbols
3930
3930
  :param dict [params]: extra parameters specific to the exchange API endpoint
3931
3931
  :returns dict: a dictionary of `leverage tiers structures <https://docs.ccxt.com/#/?id=leverage-tiers-structure>`, indexed by market symbols
3932
3932
  """
3933
3933
  await self.load_markets()
3934
- response = await self.v1PerpetualPublicGetMarketLimitConfig(params)
3934
+ request = {}
3935
+ if symbols is not None:
3936
+ marketIds = self.market_ids(symbols)
3937
+ request['market'] = ','.join(marketIds)
3938
+ response = await self.v2PublicGetFuturesPositionLevel(self.extend(request, params))
3935
3939
  #
3936
3940
  # {
3937
3941
  # "code": 0,
3938
- # "data": {
3939
- # "BTCUSD": [
3940
- # ["500001", "100", "0.005"],
3941
- # ["1000001", "50", "0.01"],
3942
- # ["2000001", "30", "0.015"],
3943
- # ["5000001", "20", "0.02"],
3944
- # ["10000001", "15", "0.025"],
3945
- # ["20000001", "10", "0.03"]
3946
- # ],
3947
- # ...
3948
- # },
3942
+ # "data": [
3943
+ # {
3944
+ # "level": [
3945
+ # {
3946
+ # "amount": "20001",
3947
+ # "leverage": "20",
3948
+ # "maintenance_margin_rate": "0.02",
3949
+ # "min_initial_margin_rate": "0.05"
3950
+ # },
3951
+ # {
3952
+ # "amount": "50001",
3953
+ # "leverage": "10",
3954
+ # "maintenance_margin_rate": "0.04",
3955
+ # "min_initial_margin_rate": "0.1"
3956
+ # },
3957
+ # ],
3958
+ # "market": "MINAUSDT"
3959
+ # },
3960
+ # ],
3949
3961
  # "message": "OK"
3950
3962
  # }
3951
3963
  #
3952
- data = self.safe_value(response, 'data', {})
3953
- return self.parse_leverage_tiers(data, symbols, None)
3964
+ data = self.safe_list(response, 'data', [])
3965
+ return self.parse_leverage_tiers(data, symbols, 'market')
3954
3966
 
3955
- def parse_market_leverage_tiers(self, item, market: Market = None):
3967
+ def parse_market_leverage_tiers(self, info, market: Market = None):
3956
3968
  tiers = []
3969
+ brackets = self.safe_list(info, 'level', [])
3957
3970
  minNotional = 0
3958
- for j in range(0, len(item)):
3959
- bracket = item[j]
3960
- maxNotional = self.safe_number(bracket, 0)
3971
+ for i in range(0, len(brackets)):
3972
+ tier = brackets[i]
3973
+ marketId = self.safe_string(info, 'market')
3974
+ market = self.safe_market(marketId, market, None, 'swap')
3975
+ maxNotional = self.safe_number(tier, 'amount')
3961
3976
  tiers.append({
3962
- 'tier': j + 1,
3977
+ 'tier': self.sum(i, 1),
3963
3978
  'currency': market['base'] if market['linear'] else market['quote'],
3964
3979
  'minNotional': minNotional,
3965
3980
  'maxNotional': maxNotional,
3966
- 'maintenanceMarginRate': self.safe_number(bracket, 2),
3967
- 'maxLeverage': self.safe_integer(bracket, 1),
3968
- 'info': bracket,
3981
+ 'maintenanceMarginRate': self.safe_number(tier, 'maintenance_margin_rate'),
3982
+ 'maxLeverage': self.safe_integer(tier, 'leverage'),
3983
+ 'info': tier,
3969
3984
  })
3970
3985
  minNotional = maxNotional
3971
3986
  return tiers
@@ -2347,12 +2347,14 @@ class phemex(Exchange, ImplicitAPI):
2347
2347
  """
2348
2348
  create a trade order
2349
2349
  :see: https://github.com/phemex/phemex-api-docs/blob/master/Public-Hedged-Perpetual-API.md#place-order
2350
+ :see: https://phemex-docs.github.io/#place-order-http-put-prefered-3
2350
2351
  :param str symbol: unified symbol of the market to create an order in
2351
2352
  :param str type: 'market' or 'limit'
2352
2353
  :param str side: 'buy' or 'sell'
2353
2354
  :param float amount: how much of currency you want to trade in units of base currency
2354
2355
  :param float [price]: the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
2355
2356
  :param dict [params]: extra parameters specific to the exchange API endpoint
2357
+ :param float [params.trigger]: trigger price for conditional orders
2356
2358
  :param dict [params.takeProfit]: *swap only* *takeProfit object in params* containing the triggerPrice at which the attached take profit order will be triggered(perpetual swap markets only)
2357
2359
  :param float [params.takeProfit.triggerPrice]: take profit trigger price
2358
2360
  :param dict [params.stopLoss]: *swap only* *stopLoss object in params* containing the triggerPrice at which the attached stop loss order will be triggered(perpetual swap markets only)
@@ -2363,7 +2365,7 @@ class phemex(Exchange, ImplicitAPI):
2363
2365
  market = self.market(symbol)
2364
2366
  requestSide = self.capitalize(side)
2365
2367
  type = self.capitalize(type)
2366
- reduceOnly = self.safe_value(params, 'reduceOnly')
2368
+ reduceOnly = self.safe_bool(params, 'reduceOnly')
2367
2369
  request = {
2368
2370
  # common
2369
2371
  'symbol': market['id'],
@@ -2404,18 +2406,24 @@ class phemex(Exchange, ImplicitAPI):
2404
2406
  else:
2405
2407
  request['clOrdID'] = clientOrderId
2406
2408
  params = self.omit(params, ['clOrdID', 'clientOrderId'])
2407
- stopPrice = self.safe_string_n(params, ['stopPx', 'stopPrice', 'triggerPrice'])
2408
- if stopPrice is not None:
2409
+ triggerPrice = self.safe_string_n(params, ['stopPx', 'stopPrice', 'triggerPrice'])
2410
+ if triggerPrice is not None:
2409
2411
  if market['settle'] == 'USDT':
2410
- request['stopPxRp'] = self.price_to_precision(symbol, stopPrice)
2412
+ request['stopPxRp'] = self.price_to_precision(symbol, triggerPrice)
2411
2413
  else:
2412
- request['stopPxEp'] = self.to_ep(stopPrice, market)
2414
+ request['stopPxEp'] = self.to_ep(triggerPrice, market)
2413
2415
  params = self.omit(params, ['stopPx', 'stopPrice', 'stopLoss', 'takeProfit', 'triggerPrice'])
2414
2416
  if market['spot']:
2415
2417
  qtyType = self.safe_value(params, 'qtyType', 'ByBase')
2416
2418
  if (type == 'Market') or (type == 'Stop') or (type == 'MarketIfTouched'):
2417
2419
  if price is not None:
2418
2420
  qtyType = 'ByQuote'
2421
+ if triggerPrice is not None:
2422
+ if type == 'Limit':
2423
+ request['ordType'] = 'StopLimit'
2424
+ elif type == 'Market':
2425
+ request['ordType'] = 'Stop'
2426
+ request['trigger'] = 'ByLastPrice'
2419
2427
  request['qtyType'] = qtyType
2420
2428
  if qtyType == 'ByQuote':
2421
2429
  cost = self.safe_number(params, 'cost')
@@ -2446,7 +2454,7 @@ class phemex(Exchange, ImplicitAPI):
2446
2454
  request['orderQtyRq'] = amount
2447
2455
  else:
2448
2456
  request['orderQty'] = self.parse_to_int(amount)
2449
- if stopPrice is not None:
2457
+ if triggerPrice is not None:
2450
2458
  triggerType = self.safe_string(params, 'triggerType', 'ByMarkPrice')
2451
2459
  request['triggerType'] = triggerType
2452
2460
  if stopLossDefined or takeProfitDefined:
ccxt/base/exchange.py CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  # -----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.3.19'
7
+ __version__ = '4.3.20'
8
8
 
9
9
  # -----------------------------------------------------------------------------
10
10
 
@@ -5559,6 +5559,8 @@ class Exchange(object):
5559
5559
  response = None
5560
5560
  if method == 'fetchAccounts':
5561
5561
  response = getattr(self, method)(params)
5562
+ elif method == 'getLeverageTiersPaginated':
5563
+ response = getattr(self, method)(symbol, params)
5562
5564
  else:
5563
5565
  response = getattr(self, method)(symbol, since, maxEntriesPerRequest, params)
5564
5566
  errors = 0
ccxt/bitget.py CHANGED
@@ -331,6 +331,9 @@ class bitget(Exchange, ImplicitAPI):
331
331
  'v2/spot/account/subaccount-assets': 2,
332
332
  'v2/spot/account/bills': 2,
333
333
  'v2/spot/account/transferRecords': 1,
334
+ 'v2/account/funding-assets': 2,
335
+ 'v2/account/bot-assets': 2,
336
+ 'v2/account/all-account-balance': 20,
334
337
  'v2/spot/wallet/deposit-address': 2,
335
338
  'v2/spot/wallet/deposit-records': 2,
336
339
  'v2/spot/wallet/withdrawal-records': 2,
ccxt/bybit.py CHANGED
@@ -7581,6 +7581,33 @@ class bybit(Exchange, ImplicitAPI):
7581
7581
  'datetime': self.iso8601(timestamp),
7582
7582
  })
7583
7583
 
7584
+ def get_leverage_tiers_paginated(self, symbol: Str = None, params={}):
7585
+ self.load_markets()
7586
+ market = None
7587
+ if symbol is not None:
7588
+ market = self.market(symbol)
7589
+ paginate = False
7590
+ paginate, params = self.handle_option_and_params(params, 'getLeverageTiersPaginated', 'paginate')
7591
+ if paginate:
7592
+ return self.fetch_paginated_call_cursor('getLeverageTiersPaginated', symbol, None, None, params, 'nextPageCursor', 'cursor', None, 100)
7593
+ subType = None
7594
+ subType, params = self.handle_sub_type_and_params('getLeverageTiersPaginated', market, params, 'linear')
7595
+ request = {
7596
+ 'category': subType,
7597
+ }
7598
+ response = self.publicGetV5MarketRiskLimit(self.extend(request, params))
7599
+ result = self.add_pagination_cursor_to_result(response)
7600
+ first = self.safe_dict(result, 0)
7601
+ total = len(result)
7602
+ lastIndex = total - 1
7603
+ last = self.safe_dict(result, lastIndex)
7604
+ cursorValue = self.safe_string(first, 'nextPageCursor')
7605
+ last['info'] = {
7606
+ 'nextPageCursor': cursorValue,
7607
+ }
7608
+ result[lastIndex] = last
7609
+ return result
7610
+
7584
7611
  def fetch_leverage_tiers(self, symbols: Strings = None, params={}):
7585
7612
  """
7586
7613
  :see: https://bybit-exchange.github.io/docs/v5/market/risk-limit
@@ -7588,22 +7615,18 @@ class bybit(Exchange, ImplicitAPI):
7588
7615
  :param str[] [symbols]: a list of unified market symbols
7589
7616
  :param dict [params]: extra parameters specific to the exchange API endpoint
7590
7617
  :param str [params.subType]: market subType, ['linear', 'inverse'], default is 'linear'
7618
+ :param boolean [params.paginate]: default False, when True will automatically paginate by calling self endpoint multiple times. See in the docs all the [available parameters](https://github.com/ccxt/ccxt/wiki/Manual#pagination-params)
7591
7619
  :returns dict: a dictionary of `leverage tiers structures <https://docs.ccxt.com/#/?id=leverage-tiers-structure>`, indexed by market symbols
7592
7620
  """
7593
7621
  self.load_markets()
7594
7622
  market = None
7623
+ symbol = None
7595
7624
  if symbols is not None:
7596
7625
  market = self.market(symbols[0])
7597
7626
  if market['spot']:
7598
7627
  raise NotSupported(self.id + ' fetchLeverageTiers() is not supported for spot market')
7599
- subType = None
7600
- subType, params = self.handle_sub_type_and_params('fetchTickers', market, params, 'linear')
7601
- request = {
7602
- 'category': subType,
7603
- }
7604
- response = self.publicGetV5MarketRiskLimit(self.extend(request, params))
7605
- result = self.safe_dict(response, 'result', {})
7606
- data = self.safe_list(result, 'list', [])
7628
+ symbol = market['symbol']
7629
+ data = self.get_leverage_tiers_paginated(symbol, self.extend({'paginate': True, 'paginationCalls': 20}, params))
7607
7630
  symbols = self.market_symbols(symbols)
7608
7631
  return self.parse_leverage_tiers(data, symbols, 'symbol')
7609
7632
 
@@ -7629,9 +7652,12 @@ class bybit(Exchange, ImplicitAPI):
7629
7652
  for i in range(0, len(keys)):
7630
7653
  marketId = keys[i]
7631
7654
  entry = grouped[marketId]
7655
+ for j in range(0, len(entry)):
7656
+ id = self.safe_integer(entry[j], 'id')
7657
+ entry[j]['id'] = id
7632
7658
  market = self.safe_market(marketId, None, None, 'contract')
7633
7659
  symbol = market['symbol']
7634
- tiers[symbol] = self.parse_market_leverage_tiers(entry, market)
7660
+ tiers[symbol] = self.parse_market_leverage_tiers(self.sort_by(entry, 'id'), market)
7635
7661
  return tiers
7636
7662
 
7637
7663
  def parse_market_leverage_tiers(self, info, market: Market = None):
ccxt/coinex.py CHANGED
@@ -3924,47 +3924,62 @@ class coinex(Exchange, ImplicitAPI):
3924
3924
  def fetch_leverage_tiers(self, symbols: Strings = None, params={}):
3925
3925
  """
3926
3926
  retrieve information on the maximum leverage, and maintenance margin for trades of varying trade sizes
3927
- :see: https://viabtc.github.io/coinex_api_en_doc/futures/#docsfutures001_http007_market_limit
3927
+ :see: https://docs.coinex.com/api/v2/futures/market/http/list-market-position-level
3928
3928
  :param str[]|None symbols: list of unified market symbols
3929
3929
  :param dict [params]: extra parameters specific to the exchange API endpoint
3930
3930
  :returns dict: a dictionary of `leverage tiers structures <https://docs.ccxt.com/#/?id=leverage-tiers-structure>`, indexed by market symbols
3931
3931
  """
3932
3932
  self.load_markets()
3933
- response = self.v1PerpetualPublicGetMarketLimitConfig(params)
3933
+ request = {}
3934
+ if symbols is not None:
3935
+ marketIds = self.market_ids(symbols)
3936
+ request['market'] = ','.join(marketIds)
3937
+ response = self.v2PublicGetFuturesPositionLevel(self.extend(request, params))
3934
3938
  #
3935
3939
  # {
3936
3940
  # "code": 0,
3937
- # "data": {
3938
- # "BTCUSD": [
3939
- # ["500001", "100", "0.005"],
3940
- # ["1000001", "50", "0.01"],
3941
- # ["2000001", "30", "0.015"],
3942
- # ["5000001", "20", "0.02"],
3943
- # ["10000001", "15", "0.025"],
3944
- # ["20000001", "10", "0.03"]
3945
- # ],
3946
- # ...
3947
- # },
3941
+ # "data": [
3942
+ # {
3943
+ # "level": [
3944
+ # {
3945
+ # "amount": "20001",
3946
+ # "leverage": "20",
3947
+ # "maintenance_margin_rate": "0.02",
3948
+ # "min_initial_margin_rate": "0.05"
3949
+ # },
3950
+ # {
3951
+ # "amount": "50001",
3952
+ # "leverage": "10",
3953
+ # "maintenance_margin_rate": "0.04",
3954
+ # "min_initial_margin_rate": "0.1"
3955
+ # },
3956
+ # ],
3957
+ # "market": "MINAUSDT"
3958
+ # },
3959
+ # ],
3948
3960
  # "message": "OK"
3949
3961
  # }
3950
3962
  #
3951
- data = self.safe_value(response, 'data', {})
3952
- return self.parse_leverage_tiers(data, symbols, None)
3963
+ data = self.safe_list(response, 'data', [])
3964
+ return self.parse_leverage_tiers(data, symbols, 'market')
3953
3965
 
3954
- def parse_market_leverage_tiers(self, item, market: Market = None):
3966
+ def parse_market_leverage_tiers(self, info, market: Market = None):
3955
3967
  tiers = []
3968
+ brackets = self.safe_list(info, 'level', [])
3956
3969
  minNotional = 0
3957
- for j in range(0, len(item)):
3958
- bracket = item[j]
3959
- maxNotional = self.safe_number(bracket, 0)
3970
+ for i in range(0, len(brackets)):
3971
+ tier = brackets[i]
3972
+ marketId = self.safe_string(info, 'market')
3973
+ market = self.safe_market(marketId, market, None, 'swap')
3974
+ maxNotional = self.safe_number(tier, 'amount')
3960
3975
  tiers.append({
3961
- 'tier': j + 1,
3976
+ 'tier': self.sum(i, 1),
3962
3977
  'currency': market['base'] if market['linear'] else market['quote'],
3963
3978
  'minNotional': minNotional,
3964
3979
  'maxNotional': maxNotional,
3965
- 'maintenanceMarginRate': self.safe_number(bracket, 2),
3966
- 'maxLeverage': self.safe_integer(bracket, 1),
3967
- 'info': bracket,
3980
+ 'maintenanceMarginRate': self.safe_number(tier, 'maintenance_margin_rate'),
3981
+ 'maxLeverage': self.safe_integer(tier, 'leverage'),
3982
+ 'info': tier,
3968
3983
  })
3969
3984
  minNotional = maxNotional
3970
3985
  return tiers
ccxt/phemex.py CHANGED
@@ -2347,12 +2347,14 @@ class phemex(Exchange, ImplicitAPI):
2347
2347
  """
2348
2348
  create a trade order
2349
2349
  :see: https://github.com/phemex/phemex-api-docs/blob/master/Public-Hedged-Perpetual-API.md#place-order
2350
+ :see: https://phemex-docs.github.io/#place-order-http-put-prefered-3
2350
2351
  :param str symbol: unified symbol of the market to create an order in
2351
2352
  :param str type: 'market' or 'limit'
2352
2353
  :param str side: 'buy' or 'sell'
2353
2354
  :param float amount: how much of currency you want to trade in units of base currency
2354
2355
  :param float [price]: the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
2355
2356
  :param dict [params]: extra parameters specific to the exchange API endpoint
2357
+ :param float [params.trigger]: trigger price for conditional orders
2356
2358
  :param dict [params.takeProfit]: *swap only* *takeProfit object in params* containing the triggerPrice at which the attached take profit order will be triggered(perpetual swap markets only)
2357
2359
  :param float [params.takeProfit.triggerPrice]: take profit trigger price
2358
2360
  :param dict [params.stopLoss]: *swap only* *stopLoss object in params* containing the triggerPrice at which the attached stop loss order will be triggered(perpetual swap markets only)
@@ -2363,7 +2365,7 @@ class phemex(Exchange, ImplicitAPI):
2363
2365
  market = self.market(symbol)
2364
2366
  requestSide = self.capitalize(side)
2365
2367
  type = self.capitalize(type)
2366
- reduceOnly = self.safe_value(params, 'reduceOnly')
2368
+ reduceOnly = self.safe_bool(params, 'reduceOnly')
2367
2369
  request = {
2368
2370
  # common
2369
2371
  'symbol': market['id'],
@@ -2404,18 +2406,24 @@ class phemex(Exchange, ImplicitAPI):
2404
2406
  else:
2405
2407
  request['clOrdID'] = clientOrderId
2406
2408
  params = self.omit(params, ['clOrdID', 'clientOrderId'])
2407
- stopPrice = self.safe_string_n(params, ['stopPx', 'stopPrice', 'triggerPrice'])
2408
- if stopPrice is not None:
2409
+ triggerPrice = self.safe_string_n(params, ['stopPx', 'stopPrice', 'triggerPrice'])
2410
+ if triggerPrice is not None:
2409
2411
  if market['settle'] == 'USDT':
2410
- request['stopPxRp'] = self.price_to_precision(symbol, stopPrice)
2412
+ request['stopPxRp'] = self.price_to_precision(symbol, triggerPrice)
2411
2413
  else:
2412
- request['stopPxEp'] = self.to_ep(stopPrice, market)
2414
+ request['stopPxEp'] = self.to_ep(triggerPrice, market)
2413
2415
  params = self.omit(params, ['stopPx', 'stopPrice', 'stopLoss', 'takeProfit', 'triggerPrice'])
2414
2416
  if market['spot']:
2415
2417
  qtyType = self.safe_value(params, 'qtyType', 'ByBase')
2416
2418
  if (type == 'Market') or (type == 'Stop') or (type == 'MarketIfTouched'):
2417
2419
  if price is not None:
2418
2420
  qtyType = 'ByQuote'
2421
+ if triggerPrice is not None:
2422
+ if type == 'Limit':
2423
+ request['ordType'] = 'StopLimit'
2424
+ elif type == 'Market':
2425
+ request['ordType'] = 'Stop'
2426
+ request['trigger'] = 'ByLastPrice'
2419
2427
  request['qtyType'] = qtyType
2420
2428
  if qtyType == 'ByQuote':
2421
2429
  cost = self.safe_number(params, 'cost')
@@ -2446,7 +2454,7 @@ class phemex(Exchange, ImplicitAPI):
2446
2454
  request['orderQtyRq'] = amount
2447
2455
  else:
2448
2456
  request['orderQty'] = self.parse_to_int(amount)
2449
- if stopPrice is not None:
2457
+ if triggerPrice is not None:
2450
2458
  triggerType = self.safe_string(params, 'triggerType', 'ByMarkPrice')
2451
2459
  request['triggerType'] = triggerType
2452
2460
  if stopLossDefined or takeProfitDefined:
ccxt/pro/__init__.py CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  # ----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.3.19'
7
+ __version__ = '4.3.20'
8
8
 
9
9
  # ----------------------------------------------------------------------------
10
10
 
ccxt/pro/htx.py CHANGED
@@ -1772,7 +1772,7 @@ class htx(ccxt.async_support.htx):
1772
1772
  # "data": {"user-id": "35930539"}
1773
1773
  # }
1774
1774
  #
1775
- promise = client.futures['authenticated']
1775
+ promise = client.futures['auth']
1776
1776
  promise.resolve(message)
1777
1777
 
1778
1778
  def handle_error_message(self, client: Client, message):
@@ -1800,6 +1800,12 @@ class htx(ccxt.async_support.htx):
1800
1800
  # 'err-msg': "Non - single account user is not available, please check through the cross and isolated account asset interface",
1801
1801
  # "ts": 1698419490189
1802
1802
  # }
1803
+ # {
1804
+ # "action":"req",
1805
+ # "code":2002,
1806
+ # "ch":"auth",
1807
+ # "message":"auth.fail"
1808
+ # }
1803
1809
  #
1804
1810
  status = self.safe_string(message, 'status')
1805
1811
  if status == 'error':
@@ -1810,6 +1816,7 @@ class htx(ccxt.async_support.htx):
1810
1816
  errorCode = self.safe_string(message, 'err-code')
1811
1817
  try:
1812
1818
  self.throw_exactly_matched_exception(self.exceptions['ws']['exact'], errorCode, self.json(message))
1819
+ raise ExchangeError(self.json(message))
1813
1820
  except Exception as e:
1814
1821
  messageHash = self.safe_string(subscription, 'messageHash')
1815
1822
  client.reject(e, messageHash)
@@ -1817,11 +1824,12 @@ class htx(ccxt.async_support.htx):
1817
1824
  if id in client.subscriptions:
1818
1825
  del client.subscriptions[id]
1819
1826
  return False
1820
- code = self.safe_integer_2(message, 'code', 'err-code')
1821
- if code is not None and ((code != 200) and (code != 0)):
1827
+ code = self.safe_string_2(message, 'code', 'err-code')
1828
+ if code is not None and ((code != '200') and (code != '0')):
1822
1829
  feedback = self.id + ' ' + self.json(message)
1823
1830
  try:
1824
1831
  self.throw_exactly_matched_exception(self.exceptions['ws']['exact'], code, feedback)
1832
+ raise ExchangeError(feedback)
1825
1833
  except Exception as e:
1826
1834
  if isinstance(e, AuthenticationError):
1827
1835
  client.reject(e, 'auth')
@@ -2137,8 +2145,6 @@ class htx(ccxt.async_support.htx):
2137
2145
  'url': url,
2138
2146
  'hostname': hostname,
2139
2147
  }
2140
- if type == 'spot':
2141
- self.options['ws']['gunzip'] = False
2142
2148
  await self.authenticate(authParams)
2143
2149
  return await self.watch(url, messageHash, self.extend(request, params), channel, extendedSubsription)
2144
2150
 
@@ -2149,7 +2155,7 @@ class htx(ccxt.async_support.htx):
2149
2155
  if url is None or hostname is None or type is None:
2150
2156
  raise ArgumentsRequired(self.id + ' authenticate requires a url, hostname and type argument')
2151
2157
  self.check_required_credentials()
2152
- messageHash = 'authenticated'
2158
+ messageHash = 'auth'
2153
2159
  relativePath = url.replace('wss://' + hostname, '')
2154
2160
  client = self.client(url)
2155
2161
  future = client.future(messageHash)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ccxt
3
- Version: 4.3.19
3
+ Version: 4.3.20
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
@@ -264,13 +264,13 @@ console.log(version, Object.keys(exchanges));
264
264
 
265
265
  All-in-one browser bundle (dependencies included), served from a CDN of your choice:
266
266
 
267
- * jsDelivr: https://cdn.jsdelivr.net/npm/ccxt@4.3.19/dist/ccxt.browser.js
268
- * unpkg: https://unpkg.com/ccxt@4.3.19/dist/ccxt.browser.js
267
+ * jsDelivr: https://cdn.jsdelivr.net/npm/ccxt@4.3.20/dist/ccxt.browser.js
268
+ * unpkg: https://unpkg.com/ccxt@4.3.20/dist/ccxt.browser.js
269
269
 
270
270
  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.
271
271
 
272
272
  ```HTML
273
- <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/ccxt@4.3.19/dist/ccxt.browser.js"></script>
273
+ <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/ccxt@4.3.20/dist/ccxt.browser.js"></script>
274
274
  ```
275
275
 
276
276
  Creates a global `ccxt` object:
@@ -1,4 +1,4 @@
1
- ccxt/__init__.py,sha256=SxLLKiHqxsXMbuu5K2HKeahCxKy_dhsPwwQHHPA8OrE,15838
1
+ ccxt/__init__.py,sha256=xvVPh6kYJGGz6AguCbHgKs_8ehqH9q21FsCrlvY2pvA,15838
2
2
  ccxt/ace.py,sha256=IAbVQ73OhU5xdTLO6dtedqa3bSuZ63Me55Se1zotYUY,41656
3
3
  ccxt/alpaca.py,sha256=NadHil-XkNFteqE7GwzIhKCCRjQ7m0xBQBCUlKxS6Sc,47215
4
4
  ccxt/ascendex.py,sha256=lAGf_eam_1VCVOlbdUyiSZjqwhHLA0aDKippHQBoPNo,151465
@@ -17,7 +17,7 @@ ccxt/bitcoincom.py,sha256=PyWIl4nC4jp5Uba2lI1At0N_hhNyWD0DoZC_MSyL_s4,502
17
17
  ccxt/bitfinex.py,sha256=vxAmPp9rZKPLb1k8hkWjdv8r8lMx9WmdL5uRs-rZIgY,72278
18
18
  ccxt/bitfinex2.py,sha256=vM8zqvKqufDCcgXjNlUTrJf069f_-ZgLA6kdGFdlhuI,158515
19
19
  ccxt/bitflyer.py,sha256=xY72j19f0YM8CnU0UN_Kv-RteE1NdtMvs_kMxBimCVA,41397
20
- ccxt/bitget.py,sha256=d1xY5bRE5YiCiDyian-6gSXpZekcM-ANnj_8S5m2JyM,422329
20
+ ccxt/bitget.py,sha256=TjoVIoIWhz4qGN_nBzk8ftdBzJhrKGoizLtNqCJpTYQ,422511
21
21
  ccxt/bithumb.py,sha256=JPlhrlnPGyvSztPiNVHSDIx5fjVoHvPGsD8vx1yFfF8,45534
22
22
  ccxt/bitmart.py,sha256=kM0SaiFm7LMGSSh-9iHSyexet0t7C9gLnKFfyORscEU,199137
23
23
  ccxt/bitmex.py,sha256=Pr96ieP5UyvsGMTjcUScE7zktX5M0zaaFmyWxFZXGfA,126453
@@ -35,13 +35,13 @@ ccxt/btcalpha.py,sha256=gr0o6e__HMwRLaaiLpuMCEHuow4ipjwa5vCY80bgR6w,36701
35
35
  ccxt/btcbox.py,sha256=M-aOkxcyv6N3-32u1gfCWAo9_tO98mY9Z6pqNQprtYw,23492
36
36
  ccxt/btcmarkets.py,sha256=hz5nGYJUku1EjoCFGlq3Wfas-H9nInG4gKYw6kPyU74,51484
37
37
  ccxt/btcturk.py,sha256=9RFC0mCWjW_jW8Hgz5cuwb1gaeLf469FOXae4p_KQJM,36657
38
- ccxt/bybit.py,sha256=aozSzO-wzLOTJAUKAmOIqLhC5isyvrRS6lgskeY3igg,411126
38
+ ccxt/bybit.py,sha256=OCRuZpug2qrIFy97l_7xSAxRa0y8Vua1lamHxSo6IwE,412519
39
39
  ccxt/cex.py,sha256=_EDbKQQiIKS5UVztu1wrQq-WQPJxa3GnLelfOkd6O2k,69930
40
40
  ccxt/coinbase.py,sha256=xZUHwSI_MTXGGzIlH1xFzD_G-Pcl4kaoX0BCcdhZjaQ,211999
41
41
  ccxt/coinbaseinternational.py,sha256=wieWUwsLsBYAgNpvnnrKseqAE7aOw__apSP6MQK9u9E,87240
42
42
  ccxt/coinbasepro.py,sha256=SFMlNzdnl_vbE_KqnopNmj-u8As_g2D9qFmrpicNsZw,78671
43
43
  ccxt/coincheck.py,sha256=jg8KHt_XUMPlbG1BYUiSHu9-DDBWdnQwV15P9IzKqbY,35664
44
- ccxt/coinex.py,sha256=CNZElRYM-vDEMiUZw5EFWajE_owlwDRXVfIQ_U5NBbU,259658
44
+ ccxt/coinex.py,sha256=-7mAEIgzv-KooaGvrLuJM9wcIqDQefwswZMuanxcJDU,260410
45
45
  ccxt/coinlist.py,sha256=EU4jtqWALdcLG5X3m2q4xPbQ3-h5-H63Eeb_R3wW-5s,103140
46
46
  ccxt/coinmate.py,sha256=EsXu0mcAkVFwg2VOg47qr6g95a3bDPN2I9AuFQxgkQg,45946
47
47
  ccxt/coinmetro.py,sha256=tZjLAz5XufybO3BU3QGXMrLzinoY4UBhn0JIyXivnys,80700
@@ -87,7 +87,7 @@ ccxt/okx.py,sha256=CagRTsREwzicph-SCSZJtweWO9MoTolLFATlZFQK-tM,376894
87
87
  ccxt/onetrading.py,sha256=MdzNJW9ViYhpx4S5cmoVu9SCX1nD3oZYfVfnPkhhfwE,88113
88
88
  ccxt/p2b.py,sha256=FYxL36KwtaLIIQ793frJEtqtHyzm39hNK0mJEzAAH0U,54213
89
89
  ccxt/paymium.py,sha256=kuMPTXyqU98kMpKeiSMicD51bSwprXHU0WrgLlAsxGY,24244
90
- ccxt/phemex.py,sha256=xVvb1mijTiHsE0_qkC-tSvAaPWiiP3RdmAGxq8vk_Ls,218921
90
+ ccxt/phemex.py,sha256=ocgoZUZjmNRQtg8CjCUoXziqddiGQHS7vh7dMpPX_Fc,219356
91
91
  ccxt/poloniex.py,sha256=WfJ93JWxt5BiIidD2aiC09GSZI-EFhwdeBbJYZ47v1E,101991
92
92
  ccxt/poloniexfutures.py,sha256=3bxdkVWbe_T6r4IvekvM6x-Hd7cSng5SDaDjgPZSk8k,77799
93
93
  ccxt/probit.py,sha256=0WNy6ZsZq9qz7tt_V_h8lxOgvM5-PwNSJSDb3G4RUZ0,76379
@@ -122,7 +122,7 @@ ccxt/abstract/bitcoincom.py,sha256=OTBtNu3DQeAqAC_Lbi0NePUs-ZQQllcLrVDI2G04nwQ,1
122
122
  ccxt/abstract/bitfinex.py,sha256=OLUXdJEycyN_qrBhPuTTOVlwu3jkqVWenoTmS-W3bOE,7605
123
123
  ccxt/abstract/bitfinex2.py,sha256=82sdkbjDb6D2JePGAa2yYwApDwdeF9Tvlo-hWB2ZUBs,19194
124
124
  ccxt/abstract/bitflyer.py,sha256=3ngG1GJJCNMzYMWoNXCEEgLxmTl7eRf7_JU4M0P2rqo,3576
125
- ccxt/abstract/bitget.py,sha256=P03CTXQcWIxgN9ETt0YbOt2ECu8fdG5OYQNI5haugFw,89841
125
+ ccxt/abstract/bitget.py,sha256=TxCeMdFtDvfOtuwe3j4dnDlefjBDhZs4tyDSI0NPpSQ,90336
126
126
  ccxt/abstract/bithumb.py,sha256=GR7QJ6CwTBne59SaGRVj9Rdz_zecG-8imRWX7oe6MoQ,3443
127
127
  ccxt/abstract/bitmart.py,sha256=oZG8LLYf1XOBBRl5xT9fTnUDdUUHEIZjSGZ5BsQ-Ih4,14031
128
128
  ccxt/abstract/bitmex.py,sha256=v15OP-vSO_eotD6KVf1BgKrbPxCPl2eXXYIuzWF1dl4,10774
@@ -208,7 +208,7 @@ ccxt/abstract/woofipro.py,sha256=El50vWGAV-4QPIDhgSnd4egfvk246NB6vTC-8h722vs,160
208
208
  ccxt/abstract/yobit.py,sha256=8ycfCO8ORFly9hc0Aa47sZyX4_ZKPXS9h9yJzI-uQ7Q,1339
209
209
  ccxt/abstract/zaif.py,sha256=m15WHdl3gYy0GOXNZ8NEH8eE7sVh8c0T_ITNuU8vXeU,3935
210
210
  ccxt/abstract/zonda.py,sha256=aSfewvRojzmuymX6QbOnDR8v9VFqWTULMHX9Y7kKD1M,5820
211
- ccxt/async_support/__init__.py,sha256=dDyTJGlIAVXE7NcEBk5LKEP-9NWgrPmNeXoTzW9qXOw,15601
211
+ ccxt/async_support/__init__.py,sha256=FLH-v2mNsOmsPEBaRdXDO0sqmWJ-d8yugz2WmHd0TwQ,15601
212
212
  ccxt/async_support/ace.py,sha256=xVxaTocpMapAIl4ApPApw69Rd-RDuU0_vleJnVt_qhI,41880
213
213
  ccxt/async_support/alpaca.py,sha256=rjD8PdQr1B5e9hvaoTQBKVtWwHLs04e6_-gooXl4eEE,47427
214
214
  ccxt/async_support/ascendex.py,sha256=Wx99HSSvYDOqOUvTkOLOHsq7-El9IATGEpt2lp-6uec,152253
@@ -227,7 +227,7 @@ ccxt/async_support/bitcoincom.py,sha256=RiqwhK3RfxQ_PXTa860fphDCvwA8dalL-_rXlK85
227
227
  ccxt/async_support/bitfinex.py,sha256=oS5QBr6YaR5PKR2Lca0S8mEkz_mBczGfMuAIUKQ6kKU,72718
228
228
  ccxt/async_support/bitfinex2.py,sha256=aXWqz-Ub3HMd-eHyrAZEAV8FYkOX9ej-uBLG30Byn2E,159249
229
229
  ccxt/async_support/bitflyer.py,sha256=KNOVDnBONry4JUJiyPKXQvP_OkxKTluly7ZdtCl-_M0,41705
230
- ccxt/async_support/bitget.py,sha256=dIPuw5ojzdsUpWQgp5DC4uk_T5o2DqRTOfLVtuHVRQM,423953
230
+ ccxt/async_support/bitget.py,sha256=39hP1C8oT8BaAObhs7wrV4aTwnFgwr3iM0h2RlTIOng,424135
231
231
  ccxt/async_support/bithumb.py,sha256=gasefOqFJX0Aav2PWMILHS1kr1lcHhJf3OdKaXuVF6M,45764
232
232
  ccxt/async_support/bitmart.py,sha256=wKlX--oFHZI8rWzdrR8jeYvg4dWfuARfSZ67yO9JgFc,200057
233
233
  ccxt/async_support/bitmex.py,sha256=CfW7GjqbJh0dexI53Py1b2u5_EUD5IVVutY96VrRR30,127031
@@ -245,13 +245,13 @@ ccxt/async_support/btcalpha.py,sha256=U51IdY13evFeA9q6tdT-Br83yPJ5quVgF_EHho_fDM
245
245
  ccxt/async_support/btcbox.py,sha256=byG2YtL1rhzH5_vuDaKCLinCQxOppRwvgqZRQYEZCxM,23686
246
246
  ccxt/async_support/btcmarkets.py,sha256=vQQN9ITp68EYWjY8UiXFNDvL9gXUhNIZjlfZ3i7PkbA,51834
247
247
  ccxt/async_support/btcturk.py,sha256=EMrvQcRRGtO9Hu3StUvalUiaTgueI7UM86IYS0Dgj6I,36875
248
- ccxt/async_support/bybit.py,sha256=rBYEjCjrSLwY_XvPuAv0W6Yd6bNHEvmIiwGEItkR0tY,412906
248
+ ccxt/async_support/bybit.py,sha256=4wjZKMH6UthYB1qIeA0gAcoaHk71fEnQii8xPIM3-VI,414323
249
249
  ccxt/async_support/cex.py,sha256=MMVgApSlmqtfnEJHdsL4WXd7_5uFri-F0QjSWOsyoEU,70280
250
250
  ccxt/async_support/coinbase.py,sha256=vxeIN4tbnXWt6ihGSRhdwVmKtwmyI67Rk-nwoTGFUD0,213105
251
251
  ccxt/async_support/coinbaseinternational.py,sha256=fuU-h5UpO_nVs1j8KA7oGsQlP0kQefuPycZrc8ph6OQ,87794
252
252
  ccxt/async_support/coinbasepro.py,sha256=GnzjqgXso5wqAVZbkMcMjcpQ1BJ7um3BtBbhrM_X0rI,79177
253
253
  ccxt/async_support/coincheck.py,sha256=ThRQX8E3NZrGc9Z__UIb7p0AtHgnq_DBhe9GzE9SlaQ,35870
254
- ccxt/async_support/coinex.py,sha256=W8dD1d6AfJVe-YUO4QVqMK_mpWefzg8m_AJOi5P25bs,260952
254
+ ccxt/async_support/coinex.py,sha256=Dw4z9vwS-75nIOuD2VZaU8qlT6Xs0DEujKYuJy5JDCQ,261704
255
255
  ccxt/async_support/coinlist.py,sha256=MKLhRyaw0DHkpRfR-Vj9NS0SwCpYUx8nOxZJ26swIMY,103628
256
256
  ccxt/async_support/coinmate.py,sha256=lc8p0aQXu-oSf2whiqvm0QoBhDVx9wf50CcFeucdXcY,46212
257
257
  ccxt/async_support/coinmetro.py,sha256=NLqNdcJ_zXcNqaxqkrloL9PqnogbQ6OzA5e_Gl4ACtk,81020
@@ -297,7 +297,7 @@ ccxt/async_support/okx.py,sha256=iPJmMdxXbHO6Qv-uMFNMAgJt2rX-PB33Y5HWCrU1JHo,378
297
297
  ccxt/async_support/onetrading.py,sha256=Px7iH4HjaGmAVMNjLwZdD8RJwspUleMdABCGQvmoNbA,88565
298
298
  ccxt/async_support/p2b.py,sha256=KrNc3sLbHQCxbgShyqWytuQVaQfKa42Q6_HcUYNUaKI,54455
299
299
  ccxt/async_support/paymium.py,sha256=_YfQn6Xwy0k9VMVOqmDGCfI8FhN_WKmyE7Eo9jR5u9I,24432
300
- ccxt/async_support/phemex.py,sha256=Ycf7lKubSi2-7FbPw0_MbQooz1eXMEi8-u8b-HkIfx8,219733
300
+ ccxt/async_support/phemex.py,sha256=-1fIw7CsP5OvF-QCZnwYC5o7GFS3Xeza7dfIVs2xRkg,220168
301
301
  ccxt/async_support/poloniex.py,sha256=tGl5AoEd2P0K0Af6twI2uwcNV81WDe2PCN4VAPkb3nQ,102539
302
302
  ccxt/async_support/poloniexfutures.py,sha256=VL4oNy3YJXw-UsiixEsU7wzw4JTpICXu6GdFdpcAKrw,78185
303
303
  ccxt/async_support/probit.py,sha256=oRpeioq1soJtild3vH6QE7ufX1RLfyQUBCsmyQW-j3w,76771
@@ -314,7 +314,7 @@ ccxt/async_support/yobit.py,sha256=kvMIVVjf8XxE7cKt51iHtqH7zgmFKc5ZVhk1dKDtlxE,5
314
314
  ccxt/async_support/zaif.py,sha256=lzrmIYPlNJquYkK-fq9DjqS8EfiAtofXnPcTMf3XOMM,28161
315
315
  ccxt/async_support/zonda.py,sha256=bS_Oq8FVjbLxnxFVVg-_5ZlNS0CH9QxSUVKL91IR9rc,80912
316
316
  ccxt/async_support/base/__init__.py,sha256=aVYSsFi--b4InRs9zDN_wtCpj8odosAB726JdUHavrk,67
317
- ccxt/async_support/base/exchange.py,sha256=8x6aT5NaPqe1BCkA2PmEre4frqUx3o8NmrbO_dSuJIo,108501
317
+ ccxt/async_support/base/exchange.py,sha256=CagmEBQISMvrDQ7DV4hDaCF2uLSRm7aUSaFxJZR-fq0,108636
318
318
  ccxt/async_support/base/throttler.py,sha256=tvDVcdRUVYi8fZRlEcnqtgzcgB_KMUMRs5Pu8tuU-tU,1847
319
319
  ccxt/async_support/base/ws/__init__.py,sha256=uockzpLuwntKGZbs5EOWFe-Zg-k6Cj7GhNJLc_RX0so,1791
320
320
  ccxt/async_support/base/ws/aiohttp_client.py,sha256=Ed1765emEde2Hj8Ys6f5EjS54ZI1wQ0qIhd04eB7yhU,5751
@@ -328,10 +328,10 @@ ccxt/async_support/base/ws/order_book_side.py,sha256=Pxrq22nCODckJ6G1OXkYEmUunIu
328
328
  ccxt/base/__init__.py,sha256=eTx1OE3HJjspFUQjGm6LBhaQiMKJnXjkdP-JUXknyQ0,1320
329
329
  ccxt/base/decimal_to_precision.py,sha256=fgWRBzRTtsf3r2INyS4f7WHlzgjB5YM1ekiwqD21aac,6634
330
330
  ccxt/base/errors.py,sha256=FGdyULeNCNcl52gA_CNhe2dZmat9GJGkTdlIyDXAF_A,4213
331
- ccxt/base/exchange.py,sha256=ml4QLh1D8BxbAvKD7cF47iRAqd20Y_rcUAzD9kd3VdA,278037
331
+ ccxt/base/exchange.py,sha256=_VrF3CssEBRD-OJ3UeMP2yAGCEr5sFVTkCjbXKHJBs0,278166
332
332
  ccxt/base/precise.py,sha256=_xfu54sV0vWNnOfGTKRFykeuWP8mn4K1m9lk1tcllX4,8565
333
333
  ccxt/base/types.py,sha256=3hBdiD2EO7W-pwmBrDeDYMEdFGcnT0QqQZa3l8ywTVM,9027
334
- ccxt/pro/__init__.py,sha256=s7zI-Hx3_WZFV09RuMjXoofLPGmlOJD9VRmDSIpH1iM,7102
334
+ ccxt/pro/__init__.py,sha256=GZ0d9pYzkdvH7XOZGD9-O9bloc1idCpdQSJU9z1jtEQ,7102
335
335
  ccxt/pro/alpaca.py,sha256=7ePyWli0949ti5UheIn553xmnFpedrNc2W5CKauSZio,27167
336
336
  ccxt/pro/ascendex.py,sha256=fCM3EujSfJvtvffqI56UAstTtwjXFIocwukm15cF8rE,35432
337
337
  ccxt/pro/bequant.py,sha256=5zbsP8BHQTUZ8ZNL6uaACxDbUClgkOV4SYfXT_LfQVg,1351
@@ -370,7 +370,7 @@ ccxt/pro/gateio.py,sha256=_uBWXYQbmsHRivKnZOJDmxJ9tWLO_0HAxmOjAEUy9nE,391
370
370
  ccxt/pro/gemini.py,sha256=a8yZNyLnv1VI6FPhSK-d8MzG7wEX60wL8uUJrqeWmOI,36641
371
371
  ccxt/pro/hitbtc.py,sha256=JLlqcR0h6yz02FPZ2zT_hC1QEyvMwtkej4jnaDp7XE8,56284
372
372
  ccxt/pro/hollaex.py,sha256=q233J-P83OZj1DN_WRRgoq2gfur5AjlW2krlkKUoQTs,21957
373
- ccxt/pro/htx.py,sha256=mC9zvrtdCjG8dHBx_zOTlJATqsYw8wDLKm-gCe2gQck,95869
373
+ ccxt/pro/htx.py,sha256=R8vmY3fXky7p-wGUw7EPCA15Y9yYGu1pmbb9MI7aEt0,96052
374
374
  ccxt/pro/huobi.py,sha256=rKZVgYqEr-MmZzTqAk4FoJt8qWFjCi_FY0ci_mWZrL0,385
375
375
  ccxt/pro/huobijp.py,sha256=fcC66ECLwrR9LN_AYZZltoE_w9EltT5DcXimPOHKJk0,23174
376
376
  ccxt/pro/hyperliquid.py,sha256=V6ev_19ttD0jmlaejvJwTl429_K1eyt0O3mUusQcrgk,20791
@@ -531,7 +531,7 @@ ccxt/test/base/test_ticker.py,sha256=cMTIMb1oySNORUCmqI5ZzMswlEyCF6gJMah3vfvo8wQ
531
531
  ccxt/test/base/test_trade.py,sha256=PMtmB8V38dpaP-eb8h488xYMlR6D69yCOhsA1RuWrUA,2336
532
532
  ccxt/test/base/test_trading_fee.py,sha256=2aDCNJtqBkTC_AieO0l1HYGq5hz5qkWlkWb9Nv_fcwk,1066
533
533
  ccxt/test/base/test_transaction.py,sha256=BTbB4UHHXkrvYgwbrhh867nVRlevmIkIrz1W_odlQJI,1434
534
- ccxt-4.3.19.dist-info/METADATA,sha256=j1GNShZl9T2J-S_5VeF5-KL4238Y9Wp1_Xgc31U5SKE,112795
535
- ccxt-4.3.19.dist-info/WHEEL,sha256=P2T-6epvtXQ2cBOE_U1K4_noqlJFN3tj15djMgEu4NM,110
536
- ccxt-4.3.19.dist-info/top_level.txt,sha256=CkQDuCTDKNcImPV60t36G6MdYfxsAPNiSaEwifVoVMo,5
537
- ccxt-4.3.19.dist-info/RECORD,,
534
+ ccxt-4.3.20.dist-info/METADATA,sha256=wtc6qHer3HgDEF3aT7iFUTnu697rL3b2CtWp6GRO-CU,112795
535
+ ccxt-4.3.20.dist-info/WHEEL,sha256=P2T-6epvtXQ2cBOE_U1K4_noqlJFN3tj15djMgEu4NM,110
536
+ ccxt-4.3.20.dist-info/top_level.txt,sha256=CkQDuCTDKNcImPV60t36G6MdYfxsAPNiSaEwifVoVMo,5
537
+ ccxt-4.3.20.dist-info/RECORD,,
File without changes