ccxt 4.4.18__py2.py3-none-any.whl → 4.4.19__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.18'
25
+ __version__ = '4.4.19'
26
26
 
27
27
  # ----------------------------------------------------------------------------
28
28
 
ccxt/abstract/binance.py CHANGED
@@ -482,6 +482,7 @@ class ImplicitAPI:
482
482
  fapipublic_get_constituents = fapiPublicGetConstituents = Entry('constituents', 'fapiPublic', 'GET', {'cost': 2})
483
483
  fapipublic_get_apitradingstatus = fapiPublicGetApiTradingStatus = Entry('apiTradingStatus', 'fapiPublic', 'GET', {'cost': 1, 'noSymbol': 10})
484
484
  fapipublic_get_lvtklines = fapiPublicGetLvtKlines = Entry('lvtKlines', 'fapiPublic', 'GET', {'cost': 1})
485
+ fapipublic_get_convert_exchangeinfo = fapiPublicGetConvertExchangeInfo = Entry('convert/exchangeInfo', 'fapiPublic', 'GET', {'cost': 4})
485
486
  fapidata_get_delivery_price = fapiDataGetDeliveryPrice = Entry('delivery-price', 'fapiData', 'GET', {'cost': 1})
486
487
  fapidata_get_openinteresthist = fapiDataGetOpenInterestHist = Entry('openInterestHist', 'fapiData', 'GET', {'cost': 1})
487
488
  fapidata_get_toplongshortaccountratio = fapiDataGetTopLongShortAccountRatio = Entry('topLongShortAccountRatio', 'fapiData', 'GET', {'cost': 1})
@@ -526,6 +527,7 @@ class ImplicitAPI:
526
527
  fapiprivate_get_feeburn = fapiPrivateGetFeeBurn = Entry('feeBurn', 'fapiPrivate', 'GET', {'cost': 1})
527
528
  fapiprivate_get_symbolconfig = fapiPrivateGetSymbolConfig = Entry('symbolConfig', 'fapiPrivate', 'GET', {'cost': 5})
528
529
  fapiprivate_get_accountconfig = fapiPrivateGetAccountConfig = Entry('accountConfig', 'fapiPrivate', 'GET', {'cost': 5})
530
+ fapiprivate_get_convert_orderstatus = fapiPrivateGetConvertOrderStatus = Entry('convert/orderStatus', 'fapiPrivate', 'GET', {'cost': 5})
529
531
  fapiprivate_post_batchorders = fapiPrivatePostBatchOrders = Entry('batchOrders', 'fapiPrivate', 'POST', {'cost': 5})
530
532
  fapiprivate_post_positionside_dual = fapiPrivatePostPositionSideDual = Entry('positionSide/dual', 'fapiPrivate', 'POST', {'cost': 1})
531
533
  fapiprivate_post_positionmargin = fapiPrivatePostPositionMargin = Entry('positionMargin', 'fapiPrivate', 'POST', {'cost': 1})
@@ -538,6 +540,8 @@ class ImplicitAPI:
538
540
  fapiprivate_post_apireferral_customization = fapiPrivatePostApiReferralCustomization = Entry('apiReferral/customization', 'fapiPrivate', 'POST', {'cost': 1})
539
541
  fapiprivate_post_apireferral_usercustomization = fapiPrivatePostApiReferralUserCustomization = Entry('apiReferral/userCustomization', 'fapiPrivate', 'POST', {'cost': 1})
540
542
  fapiprivate_post_feeburn = fapiPrivatePostFeeBurn = Entry('feeBurn', 'fapiPrivate', 'POST', {'cost': 1})
543
+ fapiprivate_post_convert_getquote = fapiPrivatePostConvertGetQuote = Entry('convert/getQuote', 'fapiPrivate', 'POST', {'cost': 200})
544
+ fapiprivate_post_convert_acceptquote = fapiPrivatePostConvertAcceptQuote = Entry('convert/acceptQuote', 'fapiPrivate', 'POST', {'cost': 20})
541
545
  fapiprivate_put_listenkey = fapiPrivatePutListenKey = Entry('listenKey', 'fapiPrivate', 'PUT', {'cost': 1})
542
546
  fapiprivate_put_order = fapiPrivatePutOrder = Entry('order', 'fapiPrivate', 'PUT', {'cost': 1})
543
547
  fapiprivate_put_batchorders = fapiPrivatePutBatchOrders = Entry('batchOrders', 'fapiPrivate', 'PUT', {'cost': 5})
@@ -482,6 +482,7 @@ class ImplicitAPI:
482
482
  fapipublic_get_constituents = fapiPublicGetConstituents = Entry('constituents', 'fapiPublic', 'GET', {'cost': 2})
483
483
  fapipublic_get_apitradingstatus = fapiPublicGetApiTradingStatus = Entry('apiTradingStatus', 'fapiPublic', 'GET', {'cost': 1, 'noSymbol': 10})
484
484
  fapipublic_get_lvtklines = fapiPublicGetLvtKlines = Entry('lvtKlines', 'fapiPublic', 'GET', {'cost': 1})
485
+ fapipublic_get_convert_exchangeinfo = fapiPublicGetConvertExchangeInfo = Entry('convert/exchangeInfo', 'fapiPublic', 'GET', {'cost': 4})
485
486
  fapidata_get_delivery_price = fapiDataGetDeliveryPrice = Entry('delivery-price', 'fapiData', 'GET', {'cost': 1})
486
487
  fapidata_get_openinteresthist = fapiDataGetOpenInterestHist = Entry('openInterestHist', 'fapiData', 'GET', {'cost': 1})
487
488
  fapidata_get_toplongshortaccountratio = fapiDataGetTopLongShortAccountRatio = Entry('topLongShortAccountRatio', 'fapiData', 'GET', {'cost': 1})
@@ -526,6 +527,7 @@ class ImplicitAPI:
526
527
  fapiprivate_get_feeburn = fapiPrivateGetFeeBurn = Entry('feeBurn', 'fapiPrivate', 'GET', {'cost': 1})
527
528
  fapiprivate_get_symbolconfig = fapiPrivateGetSymbolConfig = Entry('symbolConfig', 'fapiPrivate', 'GET', {'cost': 5})
528
529
  fapiprivate_get_accountconfig = fapiPrivateGetAccountConfig = Entry('accountConfig', 'fapiPrivate', 'GET', {'cost': 5})
530
+ fapiprivate_get_convert_orderstatus = fapiPrivateGetConvertOrderStatus = Entry('convert/orderStatus', 'fapiPrivate', 'GET', {'cost': 5})
529
531
  fapiprivate_post_batchorders = fapiPrivatePostBatchOrders = Entry('batchOrders', 'fapiPrivate', 'POST', {'cost': 5})
530
532
  fapiprivate_post_positionside_dual = fapiPrivatePostPositionSideDual = Entry('positionSide/dual', 'fapiPrivate', 'POST', {'cost': 1})
531
533
  fapiprivate_post_positionmargin = fapiPrivatePostPositionMargin = Entry('positionMargin', 'fapiPrivate', 'POST', {'cost': 1})
@@ -538,6 +540,8 @@ class ImplicitAPI:
538
540
  fapiprivate_post_apireferral_customization = fapiPrivatePostApiReferralCustomization = Entry('apiReferral/customization', 'fapiPrivate', 'POST', {'cost': 1})
539
541
  fapiprivate_post_apireferral_usercustomization = fapiPrivatePostApiReferralUserCustomization = Entry('apiReferral/userCustomization', 'fapiPrivate', 'POST', {'cost': 1})
540
542
  fapiprivate_post_feeburn = fapiPrivatePostFeeBurn = Entry('feeBurn', 'fapiPrivate', 'POST', {'cost': 1})
543
+ fapiprivate_post_convert_getquote = fapiPrivatePostConvertGetQuote = Entry('convert/getQuote', 'fapiPrivate', 'POST', {'cost': 200})
544
+ fapiprivate_post_convert_acceptquote = fapiPrivatePostConvertAcceptQuote = Entry('convert/acceptQuote', 'fapiPrivate', 'POST', {'cost': 20})
541
545
  fapiprivate_put_listenkey = fapiPrivatePutListenKey = Entry('listenKey', 'fapiPrivate', 'PUT', {'cost': 1})
542
546
  fapiprivate_put_order = fapiPrivatePutOrder = Entry('order', 'fapiPrivate', 'PUT', {'cost': 1})
543
547
  fapiprivate_put_batchorders = fapiPrivatePutBatchOrders = Entry('batchOrders', 'fapiPrivate', 'PUT', {'cost': 5})
@@ -534,6 +534,7 @@ class ImplicitAPI:
534
534
  fapipublic_get_constituents = fapiPublicGetConstituents = Entry('constituents', 'fapiPublic', 'GET', {'cost': 2})
535
535
  fapipublic_get_apitradingstatus = fapiPublicGetApiTradingStatus = Entry('apiTradingStatus', 'fapiPublic', 'GET', {'cost': 1, 'noSymbol': 10})
536
536
  fapipublic_get_lvtklines = fapiPublicGetLvtKlines = Entry('lvtKlines', 'fapiPublic', 'GET', {'cost': 1})
537
+ fapipublic_get_convert_exchangeinfo = fapiPublicGetConvertExchangeInfo = Entry('convert/exchangeInfo', 'fapiPublic', 'GET', {'cost': 4})
537
538
  fapidata_get_delivery_price = fapiDataGetDeliveryPrice = Entry('delivery-price', 'fapiData', 'GET', {'cost': 1})
538
539
  fapidata_get_openinteresthist = fapiDataGetOpenInterestHist = Entry('openInterestHist', 'fapiData', 'GET', {'cost': 1})
539
540
  fapidata_get_toplongshortaccountratio = fapiDataGetTopLongShortAccountRatio = Entry('topLongShortAccountRatio', 'fapiData', 'GET', {'cost': 1})
@@ -578,6 +579,7 @@ class ImplicitAPI:
578
579
  fapiprivate_get_feeburn = fapiPrivateGetFeeBurn = Entry('feeBurn', 'fapiPrivate', 'GET', {'cost': 1})
579
580
  fapiprivate_get_symbolconfig = fapiPrivateGetSymbolConfig = Entry('symbolConfig', 'fapiPrivate', 'GET', {'cost': 5})
580
581
  fapiprivate_get_accountconfig = fapiPrivateGetAccountConfig = Entry('accountConfig', 'fapiPrivate', 'GET', {'cost': 5})
582
+ fapiprivate_get_convert_orderstatus = fapiPrivateGetConvertOrderStatus = Entry('convert/orderStatus', 'fapiPrivate', 'GET', {'cost': 5})
581
583
  fapiprivate_post_batchorders = fapiPrivatePostBatchOrders = Entry('batchOrders', 'fapiPrivate', 'POST', {'cost': 5})
582
584
  fapiprivate_post_positionside_dual = fapiPrivatePostPositionSideDual = Entry('positionSide/dual', 'fapiPrivate', 'POST', {'cost': 1})
583
585
  fapiprivate_post_positionmargin = fapiPrivatePostPositionMargin = Entry('positionMargin', 'fapiPrivate', 'POST', {'cost': 1})
@@ -590,6 +592,8 @@ class ImplicitAPI:
590
592
  fapiprivate_post_apireferral_customization = fapiPrivatePostApiReferralCustomization = Entry('apiReferral/customization', 'fapiPrivate', 'POST', {'cost': 1})
591
593
  fapiprivate_post_apireferral_usercustomization = fapiPrivatePostApiReferralUserCustomization = Entry('apiReferral/userCustomization', 'fapiPrivate', 'POST', {'cost': 1})
592
594
  fapiprivate_post_feeburn = fapiPrivatePostFeeBurn = Entry('feeBurn', 'fapiPrivate', 'POST', {'cost': 1})
595
+ fapiprivate_post_convert_getquote = fapiPrivatePostConvertGetQuote = Entry('convert/getQuote', 'fapiPrivate', 'POST', {'cost': 200})
596
+ fapiprivate_post_convert_acceptquote = fapiPrivatePostConvertAcceptQuote = Entry('convert/acceptQuote', 'fapiPrivate', 'POST', {'cost': 20})
593
597
  fapiprivate_put_listenkey = fapiPrivatePutListenKey = Entry('listenKey', 'fapiPrivate', 'PUT', {'cost': 1})
594
598
  fapiprivate_put_order = fapiPrivatePutOrder = Entry('order', 'fapiPrivate', 'PUT', {'cost': 1})
595
599
  fapiprivate_put_batchorders = fapiPrivatePutBatchOrders = Entry('batchOrders', 'fapiPrivate', 'PUT', {'cost': 5})
@@ -482,6 +482,7 @@ class ImplicitAPI:
482
482
  fapipublic_get_constituents = fapiPublicGetConstituents = Entry('constituents', 'fapiPublic', 'GET', {'cost': 2})
483
483
  fapipublic_get_apitradingstatus = fapiPublicGetApiTradingStatus = Entry('apiTradingStatus', 'fapiPublic', 'GET', {'cost': 1, 'noSymbol': 10})
484
484
  fapipublic_get_lvtklines = fapiPublicGetLvtKlines = Entry('lvtKlines', 'fapiPublic', 'GET', {'cost': 1})
485
+ fapipublic_get_convert_exchangeinfo = fapiPublicGetConvertExchangeInfo = Entry('convert/exchangeInfo', 'fapiPublic', 'GET', {'cost': 4})
485
486
  fapidata_get_delivery_price = fapiDataGetDeliveryPrice = Entry('delivery-price', 'fapiData', 'GET', {'cost': 1})
486
487
  fapidata_get_openinteresthist = fapiDataGetOpenInterestHist = Entry('openInterestHist', 'fapiData', 'GET', {'cost': 1})
487
488
  fapidata_get_toplongshortaccountratio = fapiDataGetTopLongShortAccountRatio = Entry('topLongShortAccountRatio', 'fapiData', 'GET', {'cost': 1})
@@ -526,6 +527,7 @@ class ImplicitAPI:
526
527
  fapiprivate_get_feeburn = fapiPrivateGetFeeBurn = Entry('feeBurn', 'fapiPrivate', 'GET', {'cost': 1})
527
528
  fapiprivate_get_symbolconfig = fapiPrivateGetSymbolConfig = Entry('symbolConfig', 'fapiPrivate', 'GET', {'cost': 5})
528
529
  fapiprivate_get_accountconfig = fapiPrivateGetAccountConfig = Entry('accountConfig', 'fapiPrivate', 'GET', {'cost': 5})
530
+ fapiprivate_get_convert_orderstatus = fapiPrivateGetConvertOrderStatus = Entry('convert/orderStatus', 'fapiPrivate', 'GET', {'cost': 5})
529
531
  fapiprivate_post_batchorders = fapiPrivatePostBatchOrders = Entry('batchOrders', 'fapiPrivate', 'POST', {'cost': 5})
530
532
  fapiprivate_post_positionside_dual = fapiPrivatePostPositionSideDual = Entry('positionSide/dual', 'fapiPrivate', 'POST', {'cost': 1})
531
533
  fapiprivate_post_positionmargin = fapiPrivatePostPositionMargin = Entry('positionMargin', 'fapiPrivate', 'POST', {'cost': 1})
@@ -538,6 +540,8 @@ class ImplicitAPI:
538
540
  fapiprivate_post_apireferral_customization = fapiPrivatePostApiReferralCustomization = Entry('apiReferral/customization', 'fapiPrivate', 'POST', {'cost': 1})
539
541
  fapiprivate_post_apireferral_usercustomization = fapiPrivatePostApiReferralUserCustomization = Entry('apiReferral/userCustomization', 'fapiPrivate', 'POST', {'cost': 1})
540
542
  fapiprivate_post_feeburn = fapiPrivatePostFeeBurn = Entry('feeBurn', 'fapiPrivate', 'POST', {'cost': 1})
543
+ fapiprivate_post_convert_getquote = fapiPrivatePostConvertGetQuote = Entry('convert/getQuote', 'fapiPrivate', 'POST', {'cost': 200})
544
+ fapiprivate_post_convert_acceptquote = fapiPrivatePostConvertAcceptQuote = Entry('convert/acceptQuote', 'fapiPrivate', 'POST', {'cost': 20})
541
545
  fapiprivate_put_listenkey = fapiPrivatePutListenKey = Entry('listenKey', 'fapiPrivate', 'PUT', {'cost': 1})
542
546
  fapiprivate_put_order = fapiPrivatePutOrder = Entry('order', 'fapiPrivate', 'PUT', {'cost': 1})
543
547
  fapiprivate_put_batchorders = fapiPrivatePutBatchOrders = Entry('batchOrders', 'fapiPrivate', 'PUT', {'cost': 5})
@@ -219,6 +219,7 @@ class ImplicitAPI:
219
219
  futuresprivate_delete_withdrawals_withdrawalid = futuresPrivateDeleteWithdrawalsWithdrawalId = Entry('withdrawals/{withdrawalId}', 'futuresPrivate', 'DELETE', {'cost': 1})
220
220
  futuresprivate_delete_cancel_transfer_out = futuresPrivateDeleteCancelTransferOut = Entry('cancel/transfer-out', 'futuresPrivate', 'DELETE', {'cost': 1})
221
221
  futuresprivate_delete_sub_api_key = futuresPrivateDeleteSubApiKey = Entry('sub/api-key', 'futuresPrivate', 'DELETE', {'cost': 1})
222
+ futuresprivate_delete_orders_multi_cancel = futuresPrivateDeleteOrdersMultiCancel = Entry('orders/multi-cancel', 'futuresPrivate', 'DELETE', {'cost': 20})
222
223
  webexchange_get_currency_currency_chain_info = webExchangeGetCurrencyCurrencyChainInfo = Entry('currency/currency/chain-info', 'webExchange', 'GET', {'cost': 1})
223
224
  webexchange_get_contract_symbol_funding_rates = webExchangeGetContractSymbolFundingRates = Entry('contract/{symbol}/funding-rates', 'webExchange', 'GET', {'cost': 1})
224
225
  broker_get_broker_nd_info = brokerGetBrokerNdInfo = Entry('broker/nd/info', 'broker', 'GET', {'cost': 2})
@@ -4,7 +4,7 @@
4
4
 
5
5
  # -----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.4.18'
7
+ __version__ = '4.4.19'
8
8
 
9
9
  # -----------------------------------------------------------------------------
10
10
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  # -----------------------------------------------------------------------------
4
4
 
5
- __version__ = '4.4.18'
5
+ __version__ = '4.4.19'
6
6
 
7
7
  # -----------------------------------------------------------------------------
8
8
 
@@ -828,6 +828,7 @@ class binance(Exchange, ImplicitAPI):
828
828
  'constituents': 2,
829
829
  'apiTradingStatus': {'cost': 1, 'noSymbol': 10},
830
830
  'lvtKlines': 1,
831
+ 'convert/exchangeInfo': 4,
831
832
  },
832
833
  },
833
834
  'fapiData': {
@@ -881,6 +882,7 @@ class binance(Exchange, ImplicitAPI):
881
882
  'feeBurn': 1,
882
883
  'symbolConfig': 5,
883
884
  'accountConfig': 5,
885
+ 'convert/orderStatus': 5,
884
886
  },
885
887
  'post': {
886
888
  'batchOrders': 5,
@@ -896,6 +898,8 @@ class binance(Exchange, ImplicitAPI):
896
898
  'apiReferral/customization': 1,
897
899
  'apiReferral/userCustomization': 1,
898
900
  'feeBurn': 1,
901
+ 'convert/getQuote': 200, # 360 requests per hour
902
+ 'convert/acceptQuote': 20,
899
903
  },
900
904
  'put': {
901
905
  'listenKey': 1,
@@ -3162,14 +3166,15 @@ class binance(Exchange, ImplicitAPI):
3162
3166
  fees = self.fees
3163
3167
  linear = None
3164
3168
  inverse = None
3165
- strike = self.safe_string(market, 'strikePrice')
3166
3169
  symbol = base + '/' + quote
3170
+ strike = None
3167
3171
  if contract:
3168
3172
  if swap:
3169
3173
  symbol = symbol + ':' + settle
3170
3174
  elif future:
3171
3175
  symbol = symbol + ':' + settle + '-' + self.yymmdd(expiry)
3172
3176
  elif option:
3177
+ strike = self.number_to_string(self.parse_to_numeric(self.safe_string(market, 'strikePrice')))
3173
3178
  symbol = symbol + ':' + settle + '-' + self.yymmdd(expiry) + '-' + strike + '-' + self.safe_string(optionParts, 3)
3174
3179
  contractSize = self.safe_number_2(market, 'contractSize', 'unit', self.parse_number('1'))
3175
3180
  linear = settle == quote
@@ -5947,11 +5952,21 @@ class binance(Exchange, ImplicitAPI):
5947
5952
  if isPortfolioMargin:
5948
5953
  request['quantity'] = self.parse_to_numeric(amount)
5949
5954
  else:
5950
- request['quantity'] = self.amount_to_precision(symbol, amount)
5955
+ marketAmountPrecision = self.safe_string(market['precision'], 'amount')
5956
+ isPrecisionAvailable = (marketAmountPrecision is not None)
5957
+ if isPrecisionAvailable:
5958
+ request['quantity'] = self.amount_to_precision(symbol, amount)
5959
+ else:
5960
+ request['quantity'] = self.parse_to_numeric(amount) # some options don't have the precision available
5951
5961
  if priceIsRequired and not isPriceMatch:
5952
5962
  if price is None:
5953
5963
  raise InvalidOrder(self.id + ' createOrder() requires a price argument for a ' + type + ' order')
5954
- request['price'] = self.price_to_precision(symbol, price)
5964
+ pricePrecision = self.safe_string(market['precision'], 'price')
5965
+ isPricePrecisionAvailable = (pricePrecision is not None)
5966
+ if isPricePrecisionAvailable:
5967
+ request['price'] = self.price_to_precision(symbol, price)
5968
+ else:
5969
+ request['price'] = self.parse_to_numeric(price) # some options don't have the precision available
5955
5970
  if stopPriceIsRequired:
5956
5971
  if market['contract']:
5957
5972
  if stopPrice is None:
@@ -509,6 +509,7 @@ class bingx(Exchange, ImplicitAPI):
509
509
  },
510
510
  'networks': {
511
511
  'ARB': 'ARBITRUM',
512
+ 'MATIC': 'POLYGON',
512
513
  },
513
514
  },
514
515
  })
@@ -772,7 +773,7 @@ class bingx(Exchange, ImplicitAPI):
772
773
  isActive = False
773
774
  if (self.safe_string(market, 'apiStateOpen') == 'true') and (self.safe_string(market, 'apiStateClose') == 'true'):
774
775
  isActive = True # swap active
775
- elif self.safe_bool(market, 'apiStateSell') and self.safe_bool(market, 'apiStateBuy') and (self.safe_number(market, 'status') == 1):
776
+ elif self.safe_bool(market, 'apiStateSell') and self.safe_bool(market, 'apiStateBuy') and (self.safe_string(market, 'status') == '1'):
776
777
  isActive = True # spot active
777
778
  isInverse = None if (spot) else checkIsInverse
778
779
  isLinear = None if (spot) else checkIsLinear
@@ -1445,7 +1445,7 @@ class bitget(Exchange, ImplicitAPI):
1445
1445
  'ARB': 'ArbitrumOne',
1446
1446
  'ZKSYNC': 'zkSyncEra',
1447
1447
  'STARKNET': 'Starknet',
1448
- 'APT': 'APTOS',
1448
+ 'APT': 'Aptos',
1449
1449
  'MATIC': 'Polygon',
1450
1450
  'VIC': 'VICTION',
1451
1451
  'AVAXC': 'C-Chain',
ccxt/async_support/htx.py CHANGED
@@ -1254,6 +1254,16 @@ class htx(Exchange, ImplicitAPI):
1254
1254
  })
1255
1255
 
1256
1256
  async def fetch_status(self, params={}):
1257
+ """
1258
+ the latest known information on the availability of the exchange API
1259
+ :see: https://huobiapi.github.io/docs/spot/v1/en/#get-system-status
1260
+ :see: https://huobiapi.github.io/docs/dm/v1/en/#get-system-status
1261
+ :see: https://huobiapi.github.io/docs/coin_margined_swap/v1/en/#get-system-status
1262
+ :see: https://huobiapi.github.io/docs/usdt_swap/v1/en/#get-system-status
1263
+ :see: https://huobiapi.github.io/docs/usdt_swap/v1/en/#query-whether-the-system-is-available # contractPublicGetHeartbeat
1264
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1265
+ :returns dict: a `status structure <https://docs.ccxt.com/#/?id=exchange-status-structure>`
1266
+ """
1257
1267
  await self.load_markets()
1258
1268
  marketType = None
1259
1269
  marketType, params = self.handle_market_type_and_params('fetchStatus', None, params)
@@ -1465,6 +1475,8 @@ class htx(Exchange, ImplicitAPI):
1465
1475
  async def fetch_time(self, params={}):
1466
1476
  """
1467
1477
  fetches the current integer timestamp in milliseconds from the exchange server
1478
+ :see: https://huobiapi.github.io/docs/spot/v1/en/#get-current-timestamp
1479
+ :see: https://huobiapi.github.io/docs/coin_margined_swap/v1/en/#get-current-system-timestamp
1468
1480
  :param dict [params]: extra parameters specific to the exchange API endpoint
1469
1481
  :returns int: the current integer timestamp in milliseconds from the exchange server
1470
1482
  """
@@ -1511,6 +1523,7 @@ class htx(Exchange, ImplicitAPI):
1511
1523
  async def fetch_trading_fee(self, symbol: str, params={}) -> TradingFeeInterface:
1512
1524
  """
1513
1525
  fetch the trading fees for a market
1526
+ :see: https://huobiapi.github.io/docs/spot/v1/en/#get-current-fee-rate-applied-to-the-user
1514
1527
  :param str symbol: unified market symbol
1515
1528
  :param dict [params]: extra parameters specific to the exchange API endpoint
1516
1529
  :returns dict: a `fee structure <https://docs.ccxt.com/#/?id=fee-structure>`
@@ -1554,6 +1567,13 @@ class htx(Exchange, ImplicitAPI):
1554
1567
  return result
1555
1568
 
1556
1569
  async def fetch_trading_limits_by_id(self, id: str, params={}):
1570
+ """
1571
+ * @ignore
1572
+ :see: https://huobiapi.github.io/docs/spot/v1/en/#get-current-fee-rate-applied-to-the-user
1573
+ :param str id: market id
1574
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1575
+ :returns dict: the limits object of a market structure
1576
+ """
1557
1577
  request: dict = {
1558
1578
  'symbol': id,
1559
1579
  }
@@ -1880,6 +1880,10 @@ class hyperliquid(Exchange, ImplicitAPI):
1880
1880
  statuses: dict = {
1881
1881
  'triggered': 'open',
1882
1882
  'filled': 'closed',
1883
+ 'open': 'open',
1884
+ 'canceled': 'canceled',
1885
+ 'rejected': 'rejected',
1886
+ 'marginCanceled': 'canceled',
1883
1887
  }
1884
1888
  return self.safe_string(statuses, status, status)
1885
1889
 
@@ -4725,7 +4725,7 @@ class kucoin(Exchange, ImplicitAPI):
4725
4725
  headers = headers if (headers is not None) else {}
4726
4726
  url = self.urls['api'][api]
4727
4727
  if not self.is_empty(query):
4728
- if (method == 'GET') or (method == 'DELETE'):
4728
+ if ((method == 'GET') or (method == 'DELETE')) and (path != 'orders/multi-cancel'):
4729
4729
  endpoint += '?' + self.rawencode(query)
4730
4730
  else:
4731
4731
  body = self.json(query)
@@ -46,6 +46,7 @@ class kucoinfutures(kucoin, ImplicitAPI):
46
46
  'addMargin': True,
47
47
  'cancelAllOrders': True,
48
48
  'cancelOrder': True,
49
+ 'cancelOrders': True,
49
50
  'closeAllPositions': False,
50
51
  'closePosition': True,
51
52
  'closePositions': False,
@@ -217,6 +218,7 @@ class kucoinfutures(kucoin, ImplicitAPI):
217
218
  'stopOrders': 1,
218
219
  'sub/api-key': 1,
219
220
  'orders/client-order/{clientOid}': 1,
221
+ 'orders/multi-cancel': 20,
220
222
  },
221
223
  },
222
224
  'webExchange': {
@@ -1584,6 +1586,61 @@ class kucoinfutures(kucoin, ImplicitAPI):
1584
1586
  #
1585
1587
  return self.safe_value(response, 'data')
1586
1588
 
1589
+ async def cancel_orders(self, ids, symbol: Str = None, params={}):
1590
+ """
1591
+ cancel multiple orders
1592
+ :see: https://www.kucoin.com/docs/rest/futures-trading/orders/batch-cancel-orders
1593
+ :param str[] ids: order ids
1594
+ :param str symbol: unified symbol of the market the order was made in
1595
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1596
+ :param str[] [params.clientOrderIds]: client order ids
1597
+ :returns dict: an list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
1598
+ """
1599
+ await self.load_markets()
1600
+ market = None
1601
+ if symbol is not None:
1602
+ market = self.market(symbol)
1603
+ ordersRequests = []
1604
+ clientOrderIds = self.safe_list_2(params, 'clientOrderIds', 'clientOids', [])
1605
+ params = self.omit(params, ['clientOrderIds', 'clientOids'])
1606
+ useClientorderId = False
1607
+ for i in range(0, len(clientOrderIds)):
1608
+ useClientorderId = True
1609
+ if symbol is None:
1610
+ raise ArgumentsRequired(self.id + ' cancelOrders() requires a symbol argument when cancelling by clientOrderIds')
1611
+ ordersRequests.append({
1612
+ 'symbol': market['id'],
1613
+ 'clientOid': self.safe_string(clientOrderIds, i),
1614
+ })
1615
+ for i in range(0, len(ids)):
1616
+ ordersRequests.append(ids[i])
1617
+ requestKey = 'clientOidsList' if useClientorderId else 'orderIdsList'
1618
+ request: dict = {}
1619
+ request[requestKey] = ordersRequests
1620
+ response = await self.futuresPrivateDeleteOrdersMultiCancel(self.extend(request, params))
1621
+ #
1622
+ # {
1623
+ # "code": "200000",
1624
+ # "data":
1625
+ # [
1626
+ # {
1627
+ # "orderId": "80465574458560512",
1628
+ # "clientOid": null,
1629
+ # "code": "200",
1630
+ # "msg": "success"
1631
+ # },
1632
+ # {
1633
+ # "orderId": "80465575289094144",
1634
+ # "clientOid": null,
1635
+ # "code": "200",
1636
+ # "msg": "success"
1637
+ # }
1638
+ # ]
1639
+ # }
1640
+ #
1641
+ orders = self.safe_list(response, 'data', [])
1642
+ return self.parse_orders(orders, market)
1643
+
1587
1644
  async def cancel_all_orders(self, symbol: Str = None, params={}):
1588
1645
  """
1589
1646
  cancel all open orders
ccxt/base/exchange.py CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  # -----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.4.18'
7
+ __version__ = '4.4.19'
8
8
 
9
9
  # -----------------------------------------------------------------------------
10
10
 
ccxt/base/types.py CHANGED
@@ -360,6 +360,17 @@ class MarketMarginModes(TypedDict):
360
360
  cross: bool
361
361
  isolated: bool
362
362
 
363
+ class MinMax(TypedDict):
364
+ min: Num
365
+ max: Num
366
+
367
+ class MarketLimits(TypedDict):
368
+ amount: Optional[MinMax]
369
+ cost: Optional[MinMax]
370
+ leverage: Optional[MinMax]
371
+ price: Optional[MinMax]
372
+ market: Optional[MinMax]
373
+
363
374
  class MarketInterface(TypedDict):
364
375
  info: Dict[str, Any]
365
376
  id: Str
@@ -393,7 +404,7 @@ class MarketInterface(TypedDict):
393
404
  tierBased: bool
394
405
  feeSide: Str
395
406
  precision: Any
396
- limits: Any
407
+ limits: MarketLimits
397
408
  created: Int
398
409
 
399
410
  class Limit(TypedDict):
ccxt/binance.py CHANGED
@@ -827,6 +827,7 @@ class binance(Exchange, ImplicitAPI):
827
827
  'constituents': 2,
828
828
  'apiTradingStatus': {'cost': 1, 'noSymbol': 10},
829
829
  'lvtKlines': 1,
830
+ 'convert/exchangeInfo': 4,
830
831
  },
831
832
  },
832
833
  'fapiData': {
@@ -880,6 +881,7 @@ class binance(Exchange, ImplicitAPI):
880
881
  'feeBurn': 1,
881
882
  'symbolConfig': 5,
882
883
  'accountConfig': 5,
884
+ 'convert/orderStatus': 5,
883
885
  },
884
886
  'post': {
885
887
  'batchOrders': 5,
@@ -895,6 +897,8 @@ class binance(Exchange, ImplicitAPI):
895
897
  'apiReferral/customization': 1,
896
898
  'apiReferral/userCustomization': 1,
897
899
  'feeBurn': 1,
900
+ 'convert/getQuote': 200, # 360 requests per hour
901
+ 'convert/acceptQuote': 20,
898
902
  },
899
903
  'put': {
900
904
  'listenKey': 1,
@@ -3161,14 +3165,15 @@ class binance(Exchange, ImplicitAPI):
3161
3165
  fees = self.fees
3162
3166
  linear = None
3163
3167
  inverse = None
3164
- strike = self.safe_string(market, 'strikePrice')
3165
3168
  symbol = base + '/' + quote
3169
+ strike = None
3166
3170
  if contract:
3167
3171
  if swap:
3168
3172
  symbol = symbol + ':' + settle
3169
3173
  elif future:
3170
3174
  symbol = symbol + ':' + settle + '-' + self.yymmdd(expiry)
3171
3175
  elif option:
3176
+ strike = self.number_to_string(self.parse_to_numeric(self.safe_string(market, 'strikePrice')))
3172
3177
  symbol = symbol + ':' + settle + '-' + self.yymmdd(expiry) + '-' + strike + '-' + self.safe_string(optionParts, 3)
3173
3178
  contractSize = self.safe_number_2(market, 'contractSize', 'unit', self.parse_number('1'))
3174
3179
  linear = settle == quote
@@ -5946,11 +5951,21 @@ class binance(Exchange, ImplicitAPI):
5946
5951
  if isPortfolioMargin:
5947
5952
  request['quantity'] = self.parse_to_numeric(amount)
5948
5953
  else:
5949
- request['quantity'] = self.amount_to_precision(symbol, amount)
5954
+ marketAmountPrecision = self.safe_string(market['precision'], 'amount')
5955
+ isPrecisionAvailable = (marketAmountPrecision is not None)
5956
+ if isPrecisionAvailable:
5957
+ request['quantity'] = self.amount_to_precision(symbol, amount)
5958
+ else:
5959
+ request['quantity'] = self.parse_to_numeric(amount) # some options don't have the precision available
5950
5960
  if priceIsRequired and not isPriceMatch:
5951
5961
  if price is None:
5952
5962
  raise InvalidOrder(self.id + ' createOrder() requires a price argument for a ' + type + ' order')
5953
- request['price'] = self.price_to_precision(symbol, price)
5963
+ pricePrecision = self.safe_string(market['precision'], 'price')
5964
+ isPricePrecisionAvailable = (pricePrecision is not None)
5965
+ if isPricePrecisionAvailable:
5966
+ request['price'] = self.price_to_precision(symbol, price)
5967
+ else:
5968
+ request['price'] = self.parse_to_numeric(price) # some options don't have the precision available
5954
5969
  if stopPriceIsRequired:
5955
5970
  if market['contract']:
5956
5971
  if stopPrice is None:
ccxt/bingx.py CHANGED
@@ -508,6 +508,7 @@ class bingx(Exchange, ImplicitAPI):
508
508
  },
509
509
  'networks': {
510
510
  'ARB': 'ARBITRUM',
511
+ 'MATIC': 'POLYGON',
511
512
  },
512
513
  },
513
514
  })
@@ -771,7 +772,7 @@ class bingx(Exchange, ImplicitAPI):
771
772
  isActive = False
772
773
  if (self.safe_string(market, 'apiStateOpen') == 'true') and (self.safe_string(market, 'apiStateClose') == 'true'):
773
774
  isActive = True # swap active
774
- elif self.safe_bool(market, 'apiStateSell') and self.safe_bool(market, 'apiStateBuy') and (self.safe_number(market, 'status') == 1):
775
+ elif self.safe_bool(market, 'apiStateSell') and self.safe_bool(market, 'apiStateBuy') and (self.safe_string(market, 'status') == '1'):
775
776
  isActive = True # spot active
776
777
  isInverse = None if (spot) else checkIsInverse
777
778
  isLinear = None if (spot) else checkIsLinear
ccxt/bitget.py CHANGED
@@ -1444,7 +1444,7 @@ class bitget(Exchange, ImplicitAPI):
1444
1444
  'ARB': 'ArbitrumOne',
1445
1445
  'ZKSYNC': 'zkSyncEra',
1446
1446
  'STARKNET': 'Starknet',
1447
- 'APT': 'APTOS',
1447
+ 'APT': 'Aptos',
1448
1448
  'MATIC': 'Polygon',
1449
1449
  'VIC': 'VICTION',
1450
1450
  'AVAXC': 'C-Chain',
ccxt/htx.py CHANGED
@@ -1253,6 +1253,16 @@ class htx(Exchange, ImplicitAPI):
1253
1253
  })
1254
1254
 
1255
1255
  def fetch_status(self, params={}):
1256
+ """
1257
+ the latest known information on the availability of the exchange API
1258
+ :see: https://huobiapi.github.io/docs/spot/v1/en/#get-system-status
1259
+ :see: https://huobiapi.github.io/docs/dm/v1/en/#get-system-status
1260
+ :see: https://huobiapi.github.io/docs/coin_margined_swap/v1/en/#get-system-status
1261
+ :see: https://huobiapi.github.io/docs/usdt_swap/v1/en/#get-system-status
1262
+ :see: https://huobiapi.github.io/docs/usdt_swap/v1/en/#query-whether-the-system-is-available # contractPublicGetHeartbeat
1263
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1264
+ :returns dict: a `status structure <https://docs.ccxt.com/#/?id=exchange-status-structure>`
1265
+ """
1256
1266
  self.load_markets()
1257
1267
  marketType = None
1258
1268
  marketType, params = self.handle_market_type_and_params('fetchStatus', None, params)
@@ -1464,6 +1474,8 @@ class htx(Exchange, ImplicitAPI):
1464
1474
  def fetch_time(self, params={}):
1465
1475
  """
1466
1476
  fetches the current integer timestamp in milliseconds from the exchange server
1477
+ :see: https://huobiapi.github.io/docs/spot/v1/en/#get-current-timestamp
1478
+ :see: https://huobiapi.github.io/docs/coin_margined_swap/v1/en/#get-current-system-timestamp
1467
1479
  :param dict [params]: extra parameters specific to the exchange API endpoint
1468
1480
  :returns int: the current integer timestamp in milliseconds from the exchange server
1469
1481
  """
@@ -1510,6 +1522,7 @@ class htx(Exchange, ImplicitAPI):
1510
1522
  def fetch_trading_fee(self, symbol: str, params={}) -> TradingFeeInterface:
1511
1523
  """
1512
1524
  fetch the trading fees for a market
1525
+ :see: https://huobiapi.github.io/docs/spot/v1/en/#get-current-fee-rate-applied-to-the-user
1513
1526
  :param str symbol: unified market symbol
1514
1527
  :param dict [params]: extra parameters specific to the exchange API endpoint
1515
1528
  :returns dict: a `fee structure <https://docs.ccxt.com/#/?id=fee-structure>`
@@ -1553,6 +1566,13 @@ class htx(Exchange, ImplicitAPI):
1553
1566
  return result
1554
1567
 
1555
1568
  def fetch_trading_limits_by_id(self, id: str, params={}):
1569
+ """
1570
+ * @ignore
1571
+ :see: https://huobiapi.github.io/docs/spot/v1/en/#get-current-fee-rate-applied-to-the-user
1572
+ :param str id: market id
1573
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1574
+ :returns dict: the limits object of a market structure
1575
+ """
1556
1576
  request: dict = {
1557
1577
  'symbol': id,
1558
1578
  }
ccxt/hyperliquid.py CHANGED
@@ -1879,6 +1879,10 @@ class hyperliquid(Exchange, ImplicitAPI):
1879
1879
  statuses: dict = {
1880
1880
  'triggered': 'open',
1881
1881
  'filled': 'closed',
1882
+ 'open': 'open',
1883
+ 'canceled': 'canceled',
1884
+ 'rejected': 'rejected',
1885
+ 'marginCanceled': 'canceled',
1882
1886
  }
1883
1887
  return self.safe_string(statuses, status, status)
1884
1888
 
ccxt/kucoin.py CHANGED
@@ -4724,7 +4724,7 @@ class kucoin(Exchange, ImplicitAPI):
4724
4724
  headers = headers if (headers is not None) else {}
4725
4725
  url = self.urls['api'][api]
4726
4726
  if not self.is_empty(query):
4727
- if (method == 'GET') or (method == 'DELETE'):
4727
+ if ((method == 'GET') or (method == 'DELETE')) and (path != 'orders/multi-cancel'):
4728
4728
  endpoint += '?' + self.rawencode(query)
4729
4729
  else:
4730
4730
  body = self.json(query)
ccxt/kucoinfutures.py CHANGED
@@ -46,6 +46,7 @@ class kucoinfutures(kucoin, ImplicitAPI):
46
46
  'addMargin': True,
47
47
  'cancelAllOrders': True,
48
48
  'cancelOrder': True,
49
+ 'cancelOrders': True,
49
50
  'closeAllPositions': False,
50
51
  'closePosition': True,
51
52
  'closePositions': False,
@@ -217,6 +218,7 @@ class kucoinfutures(kucoin, ImplicitAPI):
217
218
  'stopOrders': 1,
218
219
  'sub/api-key': 1,
219
220
  'orders/client-order/{clientOid}': 1,
221
+ 'orders/multi-cancel': 20,
220
222
  },
221
223
  },
222
224
  'webExchange': {
@@ -1584,6 +1586,61 @@ class kucoinfutures(kucoin, ImplicitAPI):
1584
1586
  #
1585
1587
  return self.safe_value(response, 'data')
1586
1588
 
1589
+ def cancel_orders(self, ids, symbol: Str = None, params={}):
1590
+ """
1591
+ cancel multiple orders
1592
+ :see: https://www.kucoin.com/docs/rest/futures-trading/orders/batch-cancel-orders
1593
+ :param str[] ids: order ids
1594
+ :param str symbol: unified symbol of the market the order was made in
1595
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1596
+ :param str[] [params.clientOrderIds]: client order ids
1597
+ :returns dict: an list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
1598
+ """
1599
+ self.load_markets()
1600
+ market = None
1601
+ if symbol is not None:
1602
+ market = self.market(symbol)
1603
+ ordersRequests = []
1604
+ clientOrderIds = self.safe_list_2(params, 'clientOrderIds', 'clientOids', [])
1605
+ params = self.omit(params, ['clientOrderIds', 'clientOids'])
1606
+ useClientorderId = False
1607
+ for i in range(0, len(clientOrderIds)):
1608
+ useClientorderId = True
1609
+ if symbol is None:
1610
+ raise ArgumentsRequired(self.id + ' cancelOrders() requires a symbol argument when cancelling by clientOrderIds')
1611
+ ordersRequests.append({
1612
+ 'symbol': market['id'],
1613
+ 'clientOid': self.safe_string(clientOrderIds, i),
1614
+ })
1615
+ for i in range(0, len(ids)):
1616
+ ordersRequests.append(ids[i])
1617
+ requestKey = 'clientOidsList' if useClientorderId else 'orderIdsList'
1618
+ request: dict = {}
1619
+ request[requestKey] = ordersRequests
1620
+ response = self.futuresPrivateDeleteOrdersMultiCancel(self.extend(request, params))
1621
+ #
1622
+ # {
1623
+ # "code": "200000",
1624
+ # "data":
1625
+ # [
1626
+ # {
1627
+ # "orderId": "80465574458560512",
1628
+ # "clientOid": null,
1629
+ # "code": "200",
1630
+ # "msg": "success"
1631
+ # },
1632
+ # {
1633
+ # "orderId": "80465575289094144",
1634
+ # "clientOid": null,
1635
+ # "code": "200",
1636
+ # "msg": "success"
1637
+ # }
1638
+ # ]
1639
+ # }
1640
+ #
1641
+ orders = self.safe_list(response, 'data', [])
1642
+ return self.parse_orders(orders, market)
1643
+
1587
1644
  def cancel_all_orders(self, symbol: Str = None, params={}):
1588
1645
  """
1589
1646
  cancel all open orders
ccxt/pro/__init__.py CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  # ----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.4.18'
7
+ __version__ = '4.4.19'
8
8
 
9
9
  # ----------------------------------------------------------------------------
10
10
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ccxt
3
- Version: 4.4.18
3
+ Version: 4.4.19
4
4
  Summary: A JavaScript / TypeScript / Python / C# / PHP cryptocurrency trading library with support for 100+ exchanges
5
5
  Home-page: https://ccxt.com
6
6
  Author: Igor Kroitor
@@ -271,13 +271,13 @@ console.log(version, Object.keys(exchanges));
271
271
 
272
272
  All-in-one browser bundle (dependencies included), served from a CDN of your choice:
273
273
 
274
- * jsDelivr: https://cdn.jsdelivr.net/npm/ccxt@4.4.18/dist/ccxt.browser.min.js
275
- * unpkg: https://unpkg.com/ccxt@4.4.18/dist/ccxt.browser.min.js
274
+ * jsDelivr: https://cdn.jsdelivr.net/npm/ccxt@4.4.19/dist/ccxt.browser.min.js
275
+ * unpkg: https://unpkg.com/ccxt@4.4.19/dist/ccxt.browser.min.js
276
276
 
277
277
  CDNs are not updated in real-time and may have delays. Defaulting to the most recent version without specifying the version number is not recommended. Please, keep in mind that we are not responsible for the correct operation of those CDN servers.
278
278
 
279
279
  ```HTML
280
- <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/ccxt@4.4.18/dist/ccxt.browser.min.js"></script>
280
+ <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/ccxt@4.4.19/dist/ccxt.browser.min.js"></script>
281
281
  ```
282
282
 
283
283
  Creates a global `ccxt` object:
@@ -1,14 +1,14 @@
1
- ccxt/__init__.py,sha256=THfwR6NDwcGgdxz9vzmqx7Vy37R5UXGRP5Y3qwJpfDo,16486
1
+ ccxt/__init__.py,sha256=nIc9lUBZ_0lF8VidDP8krXR31Gk45Y2HfLFe1sdodfk,16486
2
2
  ccxt/ace.py,sha256=3KFlbRm6N9hXsKUsgZbQCFPZT5WGLm4HOjR19Q3uPts,42419
3
3
  ccxt/alpaca.py,sha256=nVQJ8vG4JrjEvMlu_nPoyR2lBq41j9Z2smPq95nDhng,47504
4
4
  ccxt/ascendex.py,sha256=aJ5_UysmRijYUvjenq5EDLldl2JUO6lXGofJ_NqPvJU,151676
5
5
  ccxt/bequant.py,sha256=RBiAmaTbL35DgiV3Hl6uchLUd78V0z1T9riTlNsrpdc,1174
6
6
  ccxt/bigone.py,sha256=mPYt5d9L4nCRnxwhVpwoBcpLLkt5E0ptOVzkveR_F28,91249
7
- ccxt/binance.py,sha256=E42-WB-h_tDxnrLO91lGmu1XSjXhEz6CJa7reSnwv3w,656225
7
+ ccxt/binance.py,sha256=LOW0PigowIqFQAD0tou4RQYjEYRFdp5xZH77AjWr26E,657204
8
8
  ccxt/binancecoinm.py,sha256=arFnEh8mErSyi23eVPWE4iwoT7PWQyxGGVJCKCy6UJY,1702
9
9
  ccxt/binanceus.py,sha256=HRsk0fIoi8AAFdzRCUMkkXUGLqBrf0guUOfUxupHFeY,9202
10
10
  ccxt/binanceusdm.py,sha256=bAPcJj5HLxoCdPolriM8sJpoTBwbV78vBTbKRmWhNP4,2632
11
- ccxt/bingx.py,sha256=tVF-rcE6N-hAqn9BvsA5rO6wPe9XjGnq8MOuMoIFtd8,252027
11
+ ccxt/bingx.py,sha256=qmG7fgs6ZmcsPSPjHrMcb5HLvONn1d6Z7DSJn9Q83Dg,252069
12
12
  ccxt/bit2c.py,sha256=Y_YHvg90Sq3CayQ2lr1_wLYwz4wGR7G3NJARiv_jX8M,37254
13
13
  ccxt/bitbank.py,sha256=npoyV3c8uJ36nKofSzpMri590Yj_DIH0FAZg8o2EW6Y,43709
14
14
  ccxt/bitbay.py,sha256=xAIjzGRDVGwoy-Gygd99H0YN4wiaz_0lR0Z14oxaaxc,478
@@ -17,7 +17,7 @@ ccxt/bitcoincom.py,sha256=PyWIl4nC4jp5Uba2lI1At0N_hhNyWD0DoZC_MSyL_s4,502
17
17
  ccxt/bitfinex.py,sha256=iJYewoNbVSB1UCfrTqzXBECMBhOc5IMECI3Ssuo3dN0,73666
18
18
  ccxt/bitfinex2.py,sha256=9ad6ebvgThHIBhFmfp0MZIhyYkGBoIrudoLyyiz8cQ4,160817
19
19
  ccxt/bitflyer.py,sha256=nh1EDzO66S-Ps9xBy-U4CErt6Q06E77wbWF_aTRw6RI,41663
20
- ccxt/bitget.py,sha256=XRd-BZbOvu12RTQoYdE1dCqng8_lM5AkGH9fTWdAU-4,428677
20
+ ccxt/bitget.py,sha256=pV31_03aZZhbyul8LOdOaCR00eC5bFRgBXUBta_SrPs,428677
21
21
  ccxt/bithumb.py,sha256=8oTnFWi8Ai9fnm5FPXvNmaUAVJEOqYi-18VC23cWmXY,47935
22
22
  ccxt/bitmart.py,sha256=8D8pFVsaEMJZ5PQuheTigQ_-BEfHyvieIxwlM9o1-Yw,222097
23
23
  ccxt/bitmex.py,sha256=w87ovaOQNJxtycsW4N7dpDzyh5AAPo5qnNS3TyBjppk,127407
@@ -63,17 +63,17 @@ ccxt/hashkey.py,sha256=LMV9wPTn2_qT2om74OdF-IfHreaySxNHOilsNDrgB7Q,192148
63
63
  ccxt/hitbtc.py,sha256=K9K0bcRffitBmnRgKKwRR09WCFE6Yj58FbwrJW6LlKU,153613
64
64
  ccxt/hitbtc3.py,sha256=qRAr4Zvaju9IQWRZUohdoN7xRnzIMPq8AyYb3gPv-Is,455
65
65
  ccxt/hollaex.py,sha256=bGaqSEwR42i1etwXgSYbluStoyKcIbuj4Qx-YQkVUhM,76255
66
- ccxt/htx.py,sha256=a44Qg0Jf12QM9FRdpjM5zxB569l-CRsOzmhKvNzKEAE,433157
66
+ ccxt/htx.py,sha256=AtHi2kswFSP9NBSWSjIqQeDoBPDeyTsQPElnaGkTcaM,434498
67
67
  ccxt/huobi.py,sha256=4vaG7IRN7fyjaJ_ac6S-njlHOfSEN5de7aq0noznxYw,438
68
68
  ccxt/huobijp.py,sha256=Kw1HQhoox1qp-bEiGpCcJSg1UAhPVLRRi-BRbQLMljI,89741
69
- ccxt/hyperliquid.py,sha256=OrUSVmr0fL0y4h8sSZGhNWS2kcPvmeCLs0yVxMt8WDo,123008
69
+ ccxt/hyperliquid.py,sha256=SIdQrgUPv3FTAKCFADgys-_x7uS8AO9kWqHMtEILaPw,123150
70
70
  ccxt/idex.py,sha256=2yiYt-w39o3gQs3-byp83GQYSD4DSlZTN1Ixieettt0,73307
71
71
  ccxt/independentreserve.py,sha256=q8wUCbDnhxc_JiOTS7xcGsLp_EdmZTMe3QvLVB6oB-0,37899
72
72
  ccxt/indodax.py,sha256=QPH7sQzhqOFwq6g_xCAMcgnrpVVRl49zf_uolywxuX8,54798
73
73
  ccxt/kraken.py,sha256=qOJz1jNl7wKqvonYdPCqWIbj7uKfsPY1qSVXllc5w6Y,135904
74
74
  ccxt/krakenfutures.py,sha256=dbreVGrjMD7AY6xai0eazuvnUpTXTD7wLDVT9VDD5Qk,119839
75
- ccxt/kucoin.py,sha256=tdNUENPhjXh6xJm5ybDQhQTrCC0x6WDzrcFeGZiQFYU,231781
76
- ccxt/kucoinfutures.py,sha256=DDzCt5NCzYR7O8HbEZFr389-EOerZZkzhSnM1cLvJf0,136962
75
+ ccxt/kucoin.py,sha256=Bfhrue_5ZiJNzetgqOJvsiOxDZwN4qAyXewZEepqtLE,231819
76
+ ccxt/kucoinfutures.py,sha256=fgSjDKPyDixiQnmCpjTnBazjqWVg15ziKgBAp2Xq9kM,139376
77
77
  ccxt/kuna.py,sha256=wL4QciCkKXgOSnmMP2mkSq9HlL7Gsz-c2s75rH5YZkA,96074
78
78
  ccxt/latoken.py,sha256=wBhaMcTEsB316nFCxm_WbLRZ_G2Q0Vi1FK-850Q07D0,79516
79
79
  ccxt/lbank.py,sha256=bBnT07L-6RHbmWwvyxZvbAfwP7lRKe6TSrDveyLZabA,116250
@@ -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=cdJo92aSIOlXYHvbIU0WvVBlRrS_IefV3V6za1iEP_w,94066
119
- ccxt/abstract/binancecoinm.py,sha256=cdJo92aSIOlXYHvbIU0WvVBlRrS_IefV3V6za1iEP_w,94066
120
- ccxt/abstract/binanceus.py,sha256=SNd1qth5wWskdx213bTYk_ebJs-I4EcDMXZZ4K4TGWM,100728
121
- ccxt/abstract/binanceusdm.py,sha256=cdJo92aSIOlXYHvbIU0WvVBlRrS_IefV3V6za1iEP_w,94066
118
+ ccxt/abstract/binance.py,sha256=roudAE36VwI0dmXtJj0G7m1cZ1HVSaUuFrPbYMyDBXY,94630
119
+ ccxt/abstract/binancecoinm.py,sha256=roudAE36VwI0dmXtJj0G7m1cZ1HVSaUuFrPbYMyDBXY,94630
120
+ ccxt/abstract/binanceus.py,sha256=edaoGBgNO7InUxyqrCyuEZ05wO0sLe8SaFBLTfvBQl8,101292
121
+ ccxt/abstract/binanceusdm.py,sha256=roudAE36VwI0dmXtJj0G7m1cZ1HVSaUuFrPbYMyDBXY,94630
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
@@ -182,7 +182,7 @@ ccxt/abstract/indodax.py,sha256=E16v8W6Ac9kmV9hFEqf_kwV6VQmK74lc1LEUEkuDpYg,2488
182
182
  ccxt/abstract/kraken.py,sha256=AUpdQHWHZFXseHNx1-cuLqRutYwYEUVqQ7mjc0TQR_s,5883
183
183
  ccxt/abstract/krakenfutures.py,sha256=pu81cKhQgBkQd8F9-Ly3b7xQD-qQ8WLi8EUMfmAUJcM,4080
184
184
  ccxt/abstract/kucoin.py,sha256=4LLJ8vPaUZ18ZxlriZvI_t42r22TWy3EEG8BLUQUsWo,28250
185
- ccxt/abstract/kucoinfutures.py,sha256=PbtQZ9UwmJjNcQnL3e9zlSsQlWOC-WhO9grOiC4KQDw,31996
185
+ ccxt/abstract/kucoinfutures.py,sha256=y5NeiAz8NwovciY7PHBR0stCMGT1Ljbmd5GOxdDQdU4,32155
186
186
  ccxt/abstract/kuna.py,sha256=IsaLq8A4DUOlQ8Esyk0WqBU6hHm5Q4sIqhgnMIvDGX0,24579
187
187
  ccxt/abstract/latoken.py,sha256=1GqE9WxrubgZILnYvg7W_dGyui-FKeIv0bU4z1dQj1k,7168
188
188
  ccxt/abstract/lbank.py,sha256=pdut_cIcwcUhN_ZCyWJxixBc4dgeQqvENYqFCrUYrvA,8675
@@ -218,17 +218,17 @@ ccxt/abstract/xt.py,sha256=JkWvsic3L2O968BCr9H5Wd5NIbRE9aTT2A-9WbAtl0c,27146
218
218
  ccxt/abstract/yobit.py,sha256=8ycfCO8ORFly9hc0Aa47sZyX4_ZKPXS9h9yJzI-uQ7Q,1339
219
219
  ccxt/abstract/zaif.py,sha256=m15WHdl3gYy0GOXNZ8NEH8eE7sVh8c0T_ITNuU8vXeU,3935
220
220
  ccxt/abstract/zonda.py,sha256=X-hCW0SdX3YKZWixDyW-O2211M58Rno8kKJ6quY7rw4,7183
221
- ccxt/async_support/__init__.py,sha256=u3yINwWv4i6MFkxdKAwBHN2UkshEQhJbaHEyTSIq55w,16289
221
+ ccxt/async_support/__init__.py,sha256=28QGoPlZxApWrWvW6sXAEThQV1woSfOHU8ENju_4k4k,16289
222
222
  ccxt/async_support/ace.py,sha256=ucCkKaWRkILAIK9g4iEi1Q_-zmn0V89-rX8Al4WdK8s,42643
223
223
  ccxt/async_support/alpaca.py,sha256=HxonsP_MzbE7Z9r6hZ1rgmf_jPcP4H7H3z1YQgCv4qc,47716
224
224
  ccxt/async_support/ascendex.py,sha256=YcGVveIDir8A1rDak-DdS_qVO1yPwAUX9sRDwCVNX80,152489
225
225
  ccxt/async_support/bequant.py,sha256=1hTwHovo1bW1XTIc8ZKjvJ-Xg6LfmpGdzT7TepykaVM,1188
226
226
  ccxt/async_support/bigone.py,sha256=EQohpAnGnA1z4K6-6An--5WxdW6raQPrZCH2s_-WGmg,91703
227
- ccxt/async_support/binance.py,sha256=tBCGXhs4h9fLdHD1lUZJrsOCDxmI0gAe89eoLrf_MbA,659054
227
+ ccxt/async_support/binance.py,sha256=54WbvvuCTSe4LhE1ZKseMOGZ7S_QYwZV_MEOddrMh4I,660033
228
228
  ccxt/async_support/binancecoinm.py,sha256=yeE73xG5UXD_X3VPul6DMGnV_mgJfWYskpas1BUDdCU,1740
229
229
  ccxt/async_support/binanceus.py,sha256=ZkGgQGB0bWYZTz7PqBCgw22yyOZbvd7GuJAJzzgDTCA,9216
230
230
  ccxt/async_support/binanceusdm.py,sha256=8ugRkx7vyYmn67wdkEEf2f-DFMGAoC4t09usKlPVNyw,2670
231
- ccxt/async_support/bingx.py,sha256=10mn26VEuzB9EvPbb9i9dGbx5_3moC8lxprXeKi7q4Y,253345
231
+ ccxt/async_support/bingx.py,sha256=jfe9Yh7hOFF2an2yBwaePOq0i0T9biVS-Et9YgmPnbM,253387
232
232
  ccxt/async_support/bit2c.py,sha256=8gA0VW3_617LwqCNliJnhjpjtwXAGxv7FsEn9805XOc,37466
233
233
  ccxt/async_support/bitbank.py,sha256=DOBazUZetD7gxURy42C3m-T-YK-zvYIkcUjHqJggkGU,43969
234
234
  ccxt/async_support/bitbay.py,sha256=jcaEXi2IhYTva8ezO_SfJhwxEZk7HST4J3NaxD16BQA,492
@@ -237,7 +237,7 @@ ccxt/async_support/bitcoincom.py,sha256=RiqwhK3RfxQ_PXTa860fphDCvwA8dalL-_rXlK85
237
237
  ccxt/async_support/bitfinex.py,sha256=IsbRwQHzzlxspIixKuGtXvY-kwjymp626UBix_0zG04,74132
238
238
  ccxt/async_support/bitfinex2.py,sha256=QSp4PkXhNkTMHEILoQH8UipJ4EgPzNSHiDfI9y5QH7w,161559
239
239
  ccxt/async_support/bitflyer.py,sha256=DTyHe4QBOED0xUEYoDfpGFL0sULp_3CxTXCWfDPbGbE,41971
240
- ccxt/async_support/bitget.py,sha256=OJWGHwSQ-c9KXT6Hylaq_T9XKVBo16AYdM6o4B0o9x8,430325
240
+ ccxt/async_support/bitget.py,sha256=wxZz3PHbHo3hbLvnUHKBXZV365D9vUR3puoWcFtPWds,430325
241
241
  ccxt/async_support/bithumb.py,sha256=Q0Cx_cRKZRfdpBAhQyINm63Qw3M6BRYQRiF0UqYzfis,48214
242
242
  ccxt/async_support/bitmart.py,sha256=WNfWDZvw8lgzC8WGvuR67-07uqtt_woyfVPeua3IhXQ,223089
243
243
  ccxt/async_support/bitmex.py,sha256=j9ohrBbNDcfR67QnPuuqrqz3pxEHpVtb0WhRKPPCYQ8,127985
@@ -283,17 +283,17 @@ ccxt/async_support/hashkey.py,sha256=XaSBqm0eh3R_2HCbOCZWaLuqJwVg5DJbttvfFYJpNZA
283
283
  ccxt/async_support/hitbtc.py,sha256=wWHmgPCEBLf0nj-unVu1LtkRPgZvjil22I4S79a-VA8,154659
284
284
  ccxt/async_support/hitbtc3.py,sha256=dmSYoD2o4av_zzbZI8HNIoj8BWxA7QozsVpy8JaOXzU,469
285
285
  ccxt/async_support/hollaex.py,sha256=k_KeUA5jEiyA7ypOAZsYL4RBonNG6dYxb50mpvWw_qQ,76689
286
- ccxt/async_support/htx.py,sha256=302cQcXh04xpbmTL2Cvr3Mrd0F-Agzyv200O9nV4Rtw,435549
286
+ ccxt/async_support/htx.py,sha256=Lr7HFO46N4e0PqogaMDsVLfe8D8QhJDZBoQY0BbHR9I,436890
287
287
  ccxt/async_support/huobi.py,sha256=fup0j6wQ1khAtfbb1H4CSyJAOzhxuoHMmrM6sgTuhr8,452
288
288
  ccxt/async_support/huobijp.py,sha256=4Pj8qPn2xzzyvdsy08gnbiF-eSKXQNT0p6VIOVkpisM,90241
289
- ccxt/async_support/hyperliquid.py,sha256=WRSTtjvdVi68iZ67DcESlrfG8gGVwaGLK4MfZaPyYIo,123672
289
+ ccxt/async_support/hyperliquid.py,sha256=9mXeS9Wc-lusHecsG1h9S9tp8RsUyMVkJQ07DoeCYjM,123814
290
290
  ccxt/async_support/idex.py,sha256=kZiSqurgNeXRJC5CQmc_wyIMXn-6c1oL4lJL1PW1l8U,73783
291
291
  ccxt/async_support/independentreserve.py,sha256=3gzNdxXGdCm5JqGjE1vG6kTSsW2PWvCPE2xBgvqPW6s,38197
292
292
  ccxt/async_support/indodax.py,sha256=_7AbcJJmBSPMQ1E-mqOoQJXTjIXldItRMDFCdwhvFuA,55106
293
293
  ccxt/async_support/kraken.py,sha256=F1NRf8PFqrzM-XQzf81sjpAER8mz1aYIgP4M5kO_DfQ,136560
294
294
  ccxt/async_support/krakenfutures.py,sha256=Wcry7ar4Esbi_3Urp8LcnzPMsThN6KcdU6QN5YMxDCk,120327
295
- ccxt/async_support/kucoin.py,sha256=cE0IuoIdGeYcGBr19iRPHPy8dYJnJS-5cPvAENhBKX8,232960
296
- ccxt/async_support/kucoinfutures.py,sha256=gV8D1Wqt8jUNEd7O1UWuAYeqj1W8EK0MEpX6uhJ5w-k,137726
295
+ ccxt/async_support/kucoin.py,sha256=DSsWZ2nxE64-gX5E-0dZLWEvxSdJb-MBL9_GMaJnKvY,232998
296
+ ccxt/async_support/kucoinfutures.py,sha256=5cRGLy4MKfD7gmA8GMZdv3697BD_I7WBgR-zOgxVXss,140158
297
297
  ccxt/async_support/kuna.py,sha256=_8S74LqI1c5zbCbaSfJgUsVyqus9gB2OV9s3UMXkzYQ,96490
298
298
  ccxt/async_support/latoken.py,sha256=9BUu8akWtbBtAzVr_c_cYLkiLQqcJdSdkJbHmuLee-Y,79992
299
299
  ccxt/async_support/lbank.py,sha256=xWUzIsFFAV_yd0Igo3CimSys6z-AoQH88oQ0zzBb1w0,116962
@@ -330,7 +330,7 @@ ccxt/async_support/yobit.py,sha256=YtkLczlb641VjUYTfEMfS-BPUTdXQTHAPkearuXkXDQ,5
330
330
  ccxt/async_support/zaif.py,sha256=-ZTr8M2JaIRCL90VrbCDXBMAsZwbiwsFChSQ2rWODuQ,29044
331
331
  ccxt/async_support/zonda.py,sha256=Z4gA6o0bF_4MarQ5KiR2Zwi2wpmOuZTHS1JChAtNWjo,83114
332
332
  ccxt/async_support/base/__init__.py,sha256=aVYSsFi--b4InRs9zDN_wtCpj8odosAB726JdUHavrk,67
333
- ccxt/async_support/base/exchange.py,sha256=ukRA0XZr1vZzcCc5Ceif9QUbR6fU-utw7qJbS5Y3Myo,113443
333
+ ccxt/async_support/base/exchange.py,sha256=pFZsmWTOWTY89LiholOn37mlbKf0Snsc5cDEodc-7uA,113443
334
334
  ccxt/async_support/base/throttler.py,sha256=tvDVcdRUVYi8fZRlEcnqtgzcgB_KMUMRs5Pu8tuU-tU,1847
335
335
  ccxt/async_support/base/ws/__init__.py,sha256=uockzpLuwntKGZbs5EOWFe-Zg-k6Cj7GhNJLc_RX0so,1791
336
336
  ccxt/async_support/base/ws/aiohttp_client.py,sha256=5IEiT0elWI9a7Vr-KV0jgmlbpLJWBzIlrLaCkTKGaqY,5752
@@ -344,10 +344,10 @@ ccxt/async_support/base/ws/order_book_side.py,sha256=GhnGUt78pJ-AYL_Dq9produGjmB
344
344
  ccxt/base/__init__.py,sha256=eTx1OE3HJjspFUQjGm6LBhaQiMKJnXjkdP-JUXknyQ0,1320
345
345
  ccxt/base/decimal_to_precision.py,sha256=fgWRBzRTtsf3r2INyS4f7WHlzgjB5YM1ekiwqD21aac,6634
346
346
  ccxt/base/errors.py,sha256=Pad-6ugvGUwhoYuKUliX-N7FTrcnKCQGFjsaq2tMn0I,4610
347
- ccxt/base/exchange.py,sha256=w4qXTWNocoLFmbyOWbAmP5f2iR33J-O_E6i8M__Zebo,301504
347
+ ccxt/base/exchange.py,sha256=EA3lxyG1qV2-FJDJubxM06o3NdkfoKcsN9EERzZPWeo,301504
348
348
  ccxt/base/precise.py,sha256=koce64Yrp6vFbGijJtUt-QQ6XhJgeGTCksZ871FPp_A,8886
349
- ccxt/base/types.py,sha256=jxuyz7pMvNPfV_iOHhHdI_41AH0_ZTtmDn9BxaKw5Fk,9796
350
- ccxt/pro/__init__.py,sha256=8Py7DJNZ_lqMH3O0BEX0lZ7jU3HMXIcglkWoB98ql_M,7710
349
+ ccxt/base/types.py,sha256=ikIahyhQe32e8y89-wrlcuRNQvExWkbijP2YSlTH2WM,10033
350
+ ccxt/pro/__init__.py,sha256=pR6fhhB18vbkGsKk_xIxRQCaVVOSQd3zyJ5ubslgxMA,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
@@ -650,8 +650,8 @@ ccxt/test/tests_async.py,sha256=IOkbqZXUViJ1KtDIlE63EZaU3z31_OR2iI6yL0azKL0,8500
650
650
  ccxt/test/tests_helpers.py,sha256=z5TiaK0WyUCmM_uGTFz7cgMNqNwG_SMI9qk7yec5ces,9693
651
651
  ccxt/test/tests_init.py,sha256=GodMIrJue4KBHHqD4vSPZxokPWpxbZIuEp19UdxlFAg,1166
652
652
  ccxt/test/tests_sync.py,sha256=c9hEBBjaLRJ-rqGiR-SpVUXcFJsvrZ7mxhLKb7TJWEc,84062
653
- ccxt-4.4.18.dist-info/LICENSE.txt,sha256=EIb9221AhMHV7xF1_55STFdKTFsnJVJYkRpY2Lnvo5w,1068
654
- ccxt-4.4.18.dist-info/METADATA,sha256=NqPRzHKuXqRoIaLyB__Fg9seZ2KbRPANUVKm5HysILg,114487
655
- ccxt-4.4.18.dist-info/WHEEL,sha256=z9j0xAa_JmUKMpmz72K0ZGALSM_n-wQVmGbleXx2VHg,110
656
- ccxt-4.4.18.dist-info/top_level.txt,sha256=CkQDuCTDKNcImPV60t36G6MdYfxsAPNiSaEwifVoVMo,5
657
- ccxt-4.4.18.dist-info/RECORD,,
653
+ ccxt-4.4.19.dist-info/LICENSE.txt,sha256=EIb9221AhMHV7xF1_55STFdKTFsnJVJYkRpY2Lnvo5w,1068
654
+ ccxt-4.4.19.dist-info/METADATA,sha256=I10Mmg7ajks_N3qnYM_3OenZ_em64roY5EGrqdq87J0,114487
655
+ ccxt-4.4.19.dist-info/WHEEL,sha256=z9j0xAa_JmUKMpmz72K0ZGALSM_n-wQVmGbleXx2VHg,110
656
+ ccxt-4.4.19.dist-info/top_level.txt,sha256=CkQDuCTDKNcImPV60t36G6MdYfxsAPNiSaEwifVoVMo,5
657
+ ccxt-4.4.19.dist-info/RECORD,,
File without changes