ccxt 4.0.35__py2.py3-none-any.whl → 4.0.38__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.0.35'
25
+ __version__ = '4.0.38'
26
26
 
27
27
  # ----------------------------------------------------------------------------
28
28
 
ccxt/abstract/binance.py CHANGED
@@ -298,8 +298,9 @@ class ImplicitAPI:
298
298
  sapi_post_loan_vip_repay = sapiPostLoanVipRepay = Entry('loan/vip/repay', 'sapi', 'POST', {'cost': 40})
299
299
  sapi_post_convert_getquote = sapiPostConvertGetQuote = Entry('convert/getQuote', 'sapi', 'POST', {'cost': 20.001})
300
300
  sapi_post_convert_acceptquote = sapiPostConvertAcceptQuote = Entry('convert/acceptQuote', 'sapi', 'POST', {'cost': 3.3335})
301
- sapi_post_portfolio_auto_collection = sapiPostPortfolioAutoCollection = Entry('portfolio/auto-collection', 'sapi', 'POST', {'cost': 0.6667})
302
- sapi_post_portfolio_bnb_transfer = sapiPostPortfolioBnbTransfer = Entry('portfolio/bnb-transfer', 'sapi', 'POST', {'cost': 0.6667})
301
+ sapi_post_portfolio_auto_collection = sapiPostPortfolioAutoCollection = Entry('portfolio/auto-collection', 'sapi', 'POST', {'cost': 150})
302
+ sapi_post_portfolio_asset_collection = sapiPostPortfolioAssetCollection = Entry('portfolio/asset-collection', 'sapi', 'POST', {'cost': 6})
303
+ sapi_post_portfolio_bnb_transfer = sapiPostPortfolioBnbTransfer = Entry('portfolio/bnb-transfer', 'sapi', 'POST', {'cost': 150})
303
304
  sapi_post_portfolio_repay_futures_switch = sapiPostPortfolioRepayFuturesSwitch = Entry('portfolio/repay-futures-switch', 'sapi', 'POST', {'cost': 150})
304
305
  sapi_post_portfolio_repay_futures_negative_balance = sapiPostPortfolioRepayFuturesNegativeBalance = Entry('portfolio/repay-futures-negative-balance', 'sapi', 'POST', {'cost': 150})
305
306
  sapi_post_lending_auto_invest_plan_add = sapiPostLendingAutoInvestPlanAdd = Entry('lending/auto-invest/plan/add', 'sapi', 'POST', {'cost': 0.1})
@@ -492,6 +493,8 @@ class ImplicitAPI:
492
493
  eapiprivate_get_usertrades = eapiPrivateGetUserTrades = Entry('userTrades', 'eapiPrivate', 'GET', {'cost': 5})
493
494
  eapiprivate_get_exerciserecord = eapiPrivateGetExerciseRecord = Entry('exerciseRecord', 'eapiPrivate', 'GET', {'cost': 5})
494
495
  eapiprivate_get_bill = eapiPrivateGetBill = Entry('bill', 'eapiPrivate', 'GET', {'cost': 1})
496
+ eapiprivate_get_income_asyn = eapiPrivateGetIncomeAsyn = Entry('income/asyn', 'eapiPrivate', 'GET', {'cost': 5})
497
+ eapiprivate_get_income_asyn_id = eapiPrivateGetIncomeAsynId = Entry('income/asyn/id', 'eapiPrivate', 'GET', {'cost': 5})
495
498
  eapiprivate_get_marginaccount = eapiPrivateGetMarginAccount = Entry('marginAccount', 'eapiPrivate', 'GET', {'cost': 3})
496
499
  eapiprivate_get_mmp = eapiPrivateGetMmp = Entry('mmp', 'eapiPrivate', 'GET', {'cost': 1})
497
500
  eapiprivate_get_countdowncancelall = eapiPrivateGetCountdownCancelAll = Entry('countdownCancelAll', 'eapiPrivate', 'GET', {'cost': 1})
@@ -298,8 +298,9 @@ class ImplicitAPI:
298
298
  sapi_post_loan_vip_repay = sapiPostLoanVipRepay = Entry('loan/vip/repay', 'sapi', 'POST', {'cost': 40})
299
299
  sapi_post_convert_getquote = sapiPostConvertGetQuote = Entry('convert/getQuote', 'sapi', 'POST', {'cost': 20.001})
300
300
  sapi_post_convert_acceptquote = sapiPostConvertAcceptQuote = Entry('convert/acceptQuote', 'sapi', 'POST', {'cost': 3.3335})
301
- sapi_post_portfolio_auto_collection = sapiPostPortfolioAutoCollection = Entry('portfolio/auto-collection', 'sapi', 'POST', {'cost': 0.6667})
302
- sapi_post_portfolio_bnb_transfer = sapiPostPortfolioBnbTransfer = Entry('portfolio/bnb-transfer', 'sapi', 'POST', {'cost': 0.6667})
301
+ sapi_post_portfolio_auto_collection = sapiPostPortfolioAutoCollection = Entry('portfolio/auto-collection', 'sapi', 'POST', {'cost': 150})
302
+ sapi_post_portfolio_asset_collection = sapiPostPortfolioAssetCollection = Entry('portfolio/asset-collection', 'sapi', 'POST', {'cost': 6})
303
+ sapi_post_portfolio_bnb_transfer = sapiPostPortfolioBnbTransfer = Entry('portfolio/bnb-transfer', 'sapi', 'POST', {'cost': 150})
303
304
  sapi_post_portfolio_repay_futures_switch = sapiPostPortfolioRepayFuturesSwitch = Entry('portfolio/repay-futures-switch', 'sapi', 'POST', {'cost': 150})
304
305
  sapi_post_portfolio_repay_futures_negative_balance = sapiPostPortfolioRepayFuturesNegativeBalance = Entry('portfolio/repay-futures-negative-balance', 'sapi', 'POST', {'cost': 150})
305
306
  sapi_post_lending_auto_invest_plan_add = sapiPostLendingAutoInvestPlanAdd = Entry('lending/auto-invest/plan/add', 'sapi', 'POST', {'cost': 0.1})
@@ -492,6 +493,8 @@ class ImplicitAPI:
492
493
  eapiprivate_get_usertrades = eapiPrivateGetUserTrades = Entry('userTrades', 'eapiPrivate', 'GET', {'cost': 5})
493
494
  eapiprivate_get_exerciserecord = eapiPrivateGetExerciseRecord = Entry('exerciseRecord', 'eapiPrivate', 'GET', {'cost': 5})
494
495
  eapiprivate_get_bill = eapiPrivateGetBill = Entry('bill', 'eapiPrivate', 'GET', {'cost': 1})
496
+ eapiprivate_get_income_asyn = eapiPrivateGetIncomeAsyn = Entry('income/asyn', 'eapiPrivate', 'GET', {'cost': 5})
497
+ eapiprivate_get_income_asyn_id = eapiPrivateGetIncomeAsynId = Entry('income/asyn/id', 'eapiPrivate', 'GET', {'cost': 5})
495
498
  eapiprivate_get_marginaccount = eapiPrivateGetMarginAccount = Entry('marginAccount', 'eapiPrivate', 'GET', {'cost': 3})
496
499
  eapiprivate_get_mmp = eapiPrivateGetMmp = Entry('mmp', 'eapiPrivate', 'GET', {'cost': 1})
497
500
  eapiprivate_get_countdowncancelall = eapiPrivateGetCountdownCancelAll = Entry('countdownCancelAll', 'eapiPrivate', 'GET', {'cost': 1})
@@ -298,8 +298,9 @@ class ImplicitAPI:
298
298
  sapi_post_loan_vip_repay = sapiPostLoanVipRepay = Entry('loan/vip/repay', 'sapi', 'POST', {'cost': 40})
299
299
  sapi_post_convert_getquote = sapiPostConvertGetQuote = Entry('convert/getQuote', 'sapi', 'POST', {'cost': 20.001})
300
300
  sapi_post_convert_acceptquote = sapiPostConvertAcceptQuote = Entry('convert/acceptQuote', 'sapi', 'POST', {'cost': 3.3335})
301
- sapi_post_portfolio_auto_collection = sapiPostPortfolioAutoCollection = Entry('portfolio/auto-collection', 'sapi', 'POST', {'cost': 0.6667})
302
- sapi_post_portfolio_bnb_transfer = sapiPostPortfolioBnbTransfer = Entry('portfolio/bnb-transfer', 'sapi', 'POST', {'cost': 0.6667})
301
+ sapi_post_portfolio_auto_collection = sapiPostPortfolioAutoCollection = Entry('portfolio/auto-collection', 'sapi', 'POST', {'cost': 150})
302
+ sapi_post_portfolio_asset_collection = sapiPostPortfolioAssetCollection = Entry('portfolio/asset-collection', 'sapi', 'POST', {'cost': 6})
303
+ sapi_post_portfolio_bnb_transfer = sapiPostPortfolioBnbTransfer = Entry('portfolio/bnb-transfer', 'sapi', 'POST', {'cost': 150})
303
304
  sapi_post_portfolio_repay_futures_switch = sapiPostPortfolioRepayFuturesSwitch = Entry('portfolio/repay-futures-switch', 'sapi', 'POST', {'cost': 150})
304
305
  sapi_post_portfolio_repay_futures_negative_balance = sapiPostPortfolioRepayFuturesNegativeBalance = Entry('portfolio/repay-futures-negative-balance', 'sapi', 'POST', {'cost': 150})
305
306
  sapi_post_lending_auto_invest_plan_add = sapiPostLendingAutoInvestPlanAdd = Entry('lending/auto-invest/plan/add', 'sapi', 'POST', {'cost': 0.1})
@@ -492,6 +493,8 @@ class ImplicitAPI:
492
493
  eapiprivate_get_usertrades = eapiPrivateGetUserTrades = Entry('userTrades', 'eapiPrivate', 'GET', {'cost': 5})
493
494
  eapiprivate_get_exerciserecord = eapiPrivateGetExerciseRecord = Entry('exerciseRecord', 'eapiPrivate', 'GET', {'cost': 5})
494
495
  eapiprivate_get_bill = eapiPrivateGetBill = Entry('bill', 'eapiPrivate', 'GET', {'cost': 1})
496
+ eapiprivate_get_income_asyn = eapiPrivateGetIncomeAsyn = Entry('income/asyn', 'eapiPrivate', 'GET', {'cost': 5})
497
+ eapiprivate_get_income_asyn_id = eapiPrivateGetIncomeAsynId = Entry('income/asyn/id', 'eapiPrivate', 'GET', {'cost': 5})
495
498
  eapiprivate_get_marginaccount = eapiPrivateGetMarginAccount = Entry('marginAccount', 'eapiPrivate', 'GET', {'cost': 3})
496
499
  eapiprivate_get_mmp = eapiPrivateGetMmp = Entry('mmp', 'eapiPrivate', 'GET', {'cost': 1})
497
500
  eapiprivate_get_countdowncancelall = eapiPrivateGetCountdownCancelAll = Entry('countdownCancelAll', 'eapiPrivate', 'GET', {'cost': 1})
@@ -298,8 +298,9 @@ class ImplicitAPI:
298
298
  sapi_post_loan_vip_repay = sapiPostLoanVipRepay = Entry('loan/vip/repay', 'sapi', 'POST', {'cost': 40})
299
299
  sapi_post_convert_getquote = sapiPostConvertGetQuote = Entry('convert/getQuote', 'sapi', 'POST', {'cost': 20.001})
300
300
  sapi_post_convert_acceptquote = sapiPostConvertAcceptQuote = Entry('convert/acceptQuote', 'sapi', 'POST', {'cost': 3.3335})
301
- sapi_post_portfolio_auto_collection = sapiPostPortfolioAutoCollection = Entry('portfolio/auto-collection', 'sapi', 'POST', {'cost': 0.6667})
302
- sapi_post_portfolio_bnb_transfer = sapiPostPortfolioBnbTransfer = Entry('portfolio/bnb-transfer', 'sapi', 'POST', {'cost': 0.6667})
301
+ sapi_post_portfolio_auto_collection = sapiPostPortfolioAutoCollection = Entry('portfolio/auto-collection', 'sapi', 'POST', {'cost': 150})
302
+ sapi_post_portfolio_asset_collection = sapiPostPortfolioAssetCollection = Entry('portfolio/asset-collection', 'sapi', 'POST', {'cost': 6})
303
+ sapi_post_portfolio_bnb_transfer = sapiPostPortfolioBnbTransfer = Entry('portfolio/bnb-transfer', 'sapi', 'POST', {'cost': 150})
303
304
  sapi_post_portfolio_repay_futures_switch = sapiPostPortfolioRepayFuturesSwitch = Entry('portfolio/repay-futures-switch', 'sapi', 'POST', {'cost': 150})
304
305
  sapi_post_portfolio_repay_futures_negative_balance = sapiPostPortfolioRepayFuturesNegativeBalance = Entry('portfolio/repay-futures-negative-balance', 'sapi', 'POST', {'cost': 150})
305
306
  sapi_post_lending_auto_invest_plan_add = sapiPostLendingAutoInvestPlanAdd = Entry('lending/auto-invest/plan/add', 'sapi', 'POST', {'cost': 0.1})
@@ -492,6 +493,8 @@ class ImplicitAPI:
492
493
  eapiprivate_get_usertrades = eapiPrivateGetUserTrades = Entry('userTrades', 'eapiPrivate', 'GET', {'cost': 5})
493
494
  eapiprivate_get_exerciserecord = eapiPrivateGetExerciseRecord = Entry('exerciseRecord', 'eapiPrivate', 'GET', {'cost': 5})
494
495
  eapiprivate_get_bill = eapiPrivateGetBill = Entry('bill', 'eapiPrivate', 'GET', {'cost': 1})
496
+ eapiprivate_get_income_asyn = eapiPrivateGetIncomeAsyn = Entry('income/asyn', 'eapiPrivate', 'GET', {'cost': 5})
497
+ eapiprivate_get_income_asyn_id = eapiPrivateGetIncomeAsynId = Entry('income/asyn/id', 'eapiPrivate', 'GET', {'cost': 5})
495
498
  eapiprivate_get_marginaccount = eapiPrivateGetMarginAccount = Entry('marginAccount', 'eapiPrivate', 'GET', {'cost': 3})
496
499
  eapiprivate_get_mmp = eapiPrivateGetMmp = Entry('mmp', 'eapiPrivate', 'GET', {'cost': 1})
497
500
  eapiprivate_get_countdowncancelall = eapiPrivateGetCountdownCancelAll = Entry('countdownCancelAll', 'eapiPrivate', 'GET', {'cost': 1})
ccxt/abstract/gate.py CHANGED
@@ -136,6 +136,8 @@ class ImplicitAPI:
136
136
  private_margin_patch_loans_loan_id = privateMarginPatchLoansLoanId = Entry('loans/{loan_id}', ['private', 'margin'], 'PATCH', {'cost': 1.5})
137
137
  private_margin_patch_loan_records_loan_record_id = privateMarginPatchLoanRecordsLoanRecordId = Entry('loan_records/{loan_record_id}', ['private', 'margin'], 'PATCH', {'cost': 1.5})
138
138
  private_margin_delete_loans_loan_id = privateMarginDeleteLoansLoanId = Entry('loans/{loan_id}', ['private', 'margin'], 'DELETE', {'cost': 1.5})
139
+ private_flash_swap_get_currencies = privateFlash_swapGetCurrencies = Entry('currencies', ['private', 'flash_swap'], 'GET', {'cost': 1.5})
140
+ private_flash_swap_get_currency_pairs = privateFlash_swapGetCurrencyPairs = Entry('currency_pairs', ['private', 'flash_swap'], 'GET', {'cost': 1.5})
139
141
  private_flash_swap_get_orders = privateFlash_swapGetOrders = Entry('orders', ['private', 'flash_swap'], 'GET', {'cost': 1.5})
140
142
  private_flash_swap_get_orders_order_id = privateFlash_swapGetOrdersOrderId = Entry('orders/{order_id}', ['private', 'flash_swap'], 'GET', {'cost': 1.5})
141
143
  private_flash_swap_post_orders = privateFlash_swapPostOrders = Entry('orders', ['private', 'flash_swap'], 'POST', {'cost': 1.5})
ccxt/abstract/gateio.py CHANGED
@@ -136,6 +136,8 @@ class ImplicitAPI:
136
136
  private_margin_patch_loans_loan_id = privateMarginPatchLoansLoanId = Entry('loans/{loan_id}', ['private', 'margin'], 'PATCH', {'cost': 1.5})
137
137
  private_margin_patch_loan_records_loan_record_id = privateMarginPatchLoanRecordsLoanRecordId = Entry('loan_records/{loan_record_id}', ['private', 'margin'], 'PATCH', {'cost': 1.5})
138
138
  private_margin_delete_loans_loan_id = privateMarginDeleteLoansLoanId = Entry('loans/{loan_id}', ['private', 'margin'], 'DELETE', {'cost': 1.5})
139
+ private_flash_swap_get_currencies = privateFlash_swapGetCurrencies = Entry('currencies', ['private', 'flash_swap'], 'GET', {'cost': 1.5})
140
+ private_flash_swap_get_currency_pairs = privateFlash_swapGetCurrencyPairs = Entry('currency_pairs', ['private', 'flash_swap'], 'GET', {'cost': 1.5})
139
141
  private_flash_swap_get_orders = privateFlash_swapGetOrders = Entry('orders', ['private', 'flash_swap'], 'GET', {'cost': 1.5})
140
142
  private_flash_swap_get_orders_order_id = privateFlash_swapGetOrdersOrderId = Entry('orders/{order_id}', ['private', 'flash_swap'], 'GET', {'cost': 1.5})
141
143
  private_flash_swap_post_orders = privateFlash_swapPostOrders = Entry('orders', ['private', 'flash_swap'], 'POST', {'cost': 1.5})
ccxt/abstract/okex.py CHANGED
@@ -215,6 +215,7 @@ class ImplicitAPI:
215
215
  private_post_account_set_riskoffset_type = privatePostAccountSetRiskOffsetType = Entry('account/set-riskOffset-type', 'private', 'POST', {'cost': 2})
216
216
  private_post_account_activate_option = privatePostAccountActivateOption = Entry('account/activate-option', 'private', 'POST', {'cost': 4})
217
217
  private_post_account_set_auto_loan = privatePostAccountSetAutoLoan = Entry('account/set-auto-loan', 'private', 'POST', {'cost': 4})
218
+ private_post_account_set_account_level = privatePostAccountSetAccountLevel = Entry('account/set-account-level', 'private', 'POST', {'cost': 4})
218
219
  private_post_account_mmp_reset = privatePostAccountMmpReset = Entry('account/mmp-reset', 'private', 'POST', {'cost': 4})
219
220
  private_post_account_mmp_config = privatePostAccountMmpConfig = Entry('account/mmp-config', 'private', 'POST', {'cost': 100})
220
221
  private_post_users_subaccount_modify_apikey = privatePostUsersSubaccountModifyApikey = Entry('users/subaccount/modify-apikey', 'private', 'POST', {'cost': 10})
ccxt/abstract/okex5.py CHANGED
@@ -215,6 +215,7 @@ class ImplicitAPI:
215
215
  private_post_account_set_riskoffset_type = privatePostAccountSetRiskOffsetType = Entry('account/set-riskOffset-type', 'private', 'POST', {'cost': 2})
216
216
  private_post_account_activate_option = privatePostAccountActivateOption = Entry('account/activate-option', 'private', 'POST', {'cost': 4})
217
217
  private_post_account_set_auto_loan = privatePostAccountSetAutoLoan = Entry('account/set-auto-loan', 'private', 'POST', {'cost': 4})
218
+ private_post_account_set_account_level = privatePostAccountSetAccountLevel = Entry('account/set-account-level', 'private', 'POST', {'cost': 4})
218
219
  private_post_account_mmp_reset = privatePostAccountMmpReset = Entry('account/mmp-reset', 'private', 'POST', {'cost': 4})
219
220
  private_post_account_mmp_config = privatePostAccountMmpConfig = Entry('account/mmp-config', 'private', 'POST', {'cost': 100})
220
221
  private_post_users_subaccount_modify_apikey = privatePostUsersSubaccountModifyApikey = Entry('users/subaccount/modify-apikey', 'private', 'POST', {'cost': 10})
ccxt/abstract/okx.py CHANGED
@@ -215,6 +215,7 @@ class ImplicitAPI:
215
215
  private_post_account_set_riskoffset_type = privatePostAccountSetRiskOffsetType = Entry('account/set-riskOffset-type', 'private', 'POST', {'cost': 2})
216
216
  private_post_account_activate_option = privatePostAccountActivateOption = Entry('account/activate-option', 'private', 'POST', {'cost': 4})
217
217
  private_post_account_set_auto_loan = privatePostAccountSetAutoLoan = Entry('account/set-auto-loan', 'private', 'POST', {'cost': 4})
218
+ private_post_account_set_account_level = privatePostAccountSetAccountLevel = Entry('account/set-account-level', 'private', 'POST', {'cost': 4})
218
219
  private_post_account_mmp_reset = privatePostAccountMmpReset = Entry('account/mmp-reset', 'private', 'POST', {'cost': 4})
219
220
  private_post_account_mmp_config = privatePostAccountMmpConfig = Entry('account/mmp-config', 'private', 'POST', {'cost': 100})
220
221
  private_post_users_subaccount_modify_apikey = privatePostUsersSubaccountModifyApikey = Entry('users/subaccount/modify-apikey', 'private', 'POST', {'cost': 10})
@@ -4,7 +4,7 @@
4
4
 
5
5
  # -----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.0.35'
7
+ __version__ = '4.0.38'
8
8
 
9
9
  # -----------------------------------------------------------------------------
10
10
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  # -----------------------------------------------------------------------------
4
4
 
5
- __version__ = '4.0.35'
5
+ __version__ = '4.0.38'
6
6
 
7
7
  # -----------------------------------------------------------------------------
8
8
 
@@ -599,7 +599,7 @@ class Exchange(BaseExchange):
599
599
  value = self.safe_value(entry, key)
600
600
  if value and (value >= since):
601
601
  result.append(entry)
602
- if tail:
602
+ if tail and limit is not None:
603
603
  return self.arraySlice(result, -limit)
604
604
  return self.filter_by_limit(result, limit, key)
605
605
 
@@ -620,7 +620,7 @@ class Exchange(BaseExchange):
620
620
  secondCondition = entryKeyGESince if sinceIsDefined else True
621
621
  if firstCondition and secondCondition:
622
622
  result.append(entry)
623
- if tail:
623
+ if tail and limit is not None:
624
624
  return self.arraySlice(result, -limit)
625
625
  return self.filter_by_limit(result, limit, key)
626
626
 
@@ -2281,6 +2281,9 @@ class Exchange(BaseExchange):
2281
2281
  async def watch_my_trades(self, symbol: Optional[str] = None, since: Optional[int] = None, limit: Optional[int] = None, params={}):
2282
2282
  raise NotSupported(self.id + ' watchMyTrades() is not supported yet')
2283
2283
 
2284
+ async def fetch_ohlcv_ws(self, symbol: str, timeframe: str = '1m', since: Optional[int] = None, limit: Optional[int] = None, params={}):
2285
+ raise NotSupported(self.id + ' fetchOHLCVWs() is not supported yet')
2286
+
2284
2287
  async def fetch_deposits_withdrawals(self, code: Optional[str] = None, since: Optional[int] = None, limit: Optional[int] = None, params={}):
2285
2288
  """
2286
2289
  fetch history of deposits and withdrawals
@@ -542,8 +542,9 @@ class binance(Exchange, ImplicitAPI):
542
542
  'loan/vip/repay': 40, # Weight(UID): 6000 => cost = 0.006667 * 6000 = 40
543
543
  'convert/getQuote': 20.001,
544
544
  'convert/acceptQuote': 3.3335,
545
- 'portfolio/auto-collection': 0.6667, # Weight(UID): 100 => cost = 0.006667 * 100 = 0.6667
546
- 'portfolio/bnb-transfer': 0.6667, # Weight(UID): 100 => cost = 0.006667 * 100 = 0.6667
545
+ 'portfolio/auto-collection': 150, # Weight(IP): 1500 => cost = 0.1 * 1500 = 150
546
+ 'portfolio/asset-collection': 6, # Weight(IP): 60 => cost = 0.1 * 60 = 6
547
+ 'portfolio/bnb-transfer': 150, # Weight(IP): 1500 => cost = 0.1 * 1500 = 150
547
548
  'portfolio/repay-futures-switch': 150, # Weight(IP): 1500 => cost = 0.1 * 1500 = 150
548
549
  'portfolio/repay-futures-negative-balance': 150, # Weight(IP): 1500 => cost = 0.1 * 1500 = 150
549
550
  'lending/auto-invest/plan/add': 0.1, # Weight(IP): 1 => cost = 0.1 * 1 = 0.1
@@ -818,6 +819,8 @@ class binance(Exchange, ImplicitAPI):
818
819
  'userTrades': 5,
819
820
  'exerciseRecord': 5,
820
821
  'bill': 1,
822
+ 'income/asyn': 5,
823
+ 'income/asyn/id': 5,
821
824
  'marginAccount': 3,
822
825
  'mmp': 1,
823
826
  'countdownCancelAll': 1,
@@ -3640,7 +3643,7 @@ class binance(Exchange, ImplicitAPI):
3640
3643
  if postOnly:
3641
3644
  uppercaseType = 'LIMIT_MAKER'
3642
3645
  request['type'] = uppercaseType
3643
- stopPrice = self.safe_number(params, 'stopPrice')
3646
+ stopPrice = self.safe_number_2(params, 'stopPrice', 'triggerPrice')
3644
3647
  if stopPrice is not None:
3645
3648
  if uppercaseType == 'MARKET':
3646
3649
  uppercaseType = 'STOP_LOSS'
@@ -3070,30 +3070,30 @@ class coinex(Exchange, ImplicitAPI):
3070
3070
 
3071
3071
  async def set_leverage(self, leverage, symbol: Optional[str] = None, params={}):
3072
3072
  """
3073
+ see https://viabtc.github.io/coinex_api_en_doc/futures/#docsfutures001_http014_adjust_leverage
3073
3074
  set the level of leverage for a market
3074
3075
  :param float leverage: the rate of leverage
3075
3076
  :param str symbol: unified market symbol
3076
3077
  :param dict [params]: extra parameters specific to the coinex api endpoint
3078
+ :param str [params.marginMode]: 'cross' or 'isolated'(default is 'cross')
3077
3079
  :returns dict: response from the exchange
3078
3080
  """
3079
- if symbol is None:
3080
- raise ArgumentsRequired(self.id + ' setLeverage() requires a symbol argument')
3081
+ self.check_required_symbol('setLeverage', symbol)
3081
3082
  await self.load_markets()
3082
- defaultMarginMode = self.safe_string_2(self.options, 'defaultMarginMode', 'marginMode')
3083
- defaultPositionType = None
3084
- if defaultMarginMode == 'isolated':
3085
- defaultPositionType = 1
3086
- elif defaultMarginMode == 'cross':
3087
- defaultPositionType = 2
3088
- positionType = self.safe_integer(params, 'position_type', defaultPositionType)
3089
- if positionType is None:
3090
- raise ArgumentsRequired(self.id + ' setLeverage() requires a position_type parameter that will transfer margin to the specified trading pair')
3091
3083
  market = self.market(symbol)
3092
- maxLeverage = self.safe_integer(market['limits']['leverage'], 'max', 100)
3093
- if market['type'] != 'swap':
3084
+ if not market['swap']:
3094
3085
  raise BadSymbol(self.id + ' setLeverage() supports swap contracts only')
3095
- if (leverage < 3) or (leverage > maxLeverage):
3096
- raise BadRequest(self.id + ' setLeverage() leverage should be between 3 and ' + str(maxLeverage) + ' for ' + symbol)
3086
+ marginMode = None
3087
+ marginMode, params = self.handle_margin_mode_and_params('setLeverage', params, 'cross')
3088
+ positionType = None
3089
+ if marginMode == 'isolated':
3090
+ positionType = 1
3091
+ elif marginMode == 'cross':
3092
+ positionType = 2
3093
+ minLeverage = self.safe_integer(market['limits']['leverage'], 'min', 1)
3094
+ maxLeverage = self.safe_integer(market['limits']['leverage'], 'max', 100)
3095
+ if (leverage < minLeverage) or (leverage > maxLeverage):
3096
+ raise BadRequest(self.id + ' setLeverage() leverage should be between ' + str(minLeverage) + ' and ' + str(maxLeverage) + ' for ' + symbol)
3097
3097
  request = {
3098
3098
  'market': market['id'],
3099
3099
  'leverage': str(leverage),
@@ -373,6 +373,8 @@ class gate(Exchange, ImplicitAPI):
373
373
  },
374
374
  'flash_swap': {
375
375
  'get': {
376
+ 'currencies': 1.5,
377
+ 'currency_pairs': 1.5,
376
378
  'orders': 1.5,
377
379
  'orders/{order_id}': 1.5,
378
380
  },
@@ -783,6 +785,7 @@ class gate(Exchange, ImplicitAPI):
783
785
  'REPAY_TOO_MUCH': ExchangeError,
784
786
  'TOO_MANY_CURRENCY_PAIRS': InvalidOrder,
785
787
  'TOO_MANY_ORDERS': InvalidOrder,
788
+ 'TOO_MANY_REQUESTS': RateLimitExceeded,
786
789
  'MIXED_ACCOUNT_TYPE': InvalidOrder,
787
790
  'AUTO_BORROW_TOO_MUCH': ExchangeError,
788
791
  'TRADE_RESTRICTED': InsufficientFunds,
ccxt/async_support/okx.py CHANGED
@@ -420,6 +420,7 @@ class okx(Exchange, ImplicitAPI):
420
420
  'account/set-riskOffset-type': 2,
421
421
  'account/activate-option': 4,
422
422
  'account/set-auto-loan': 4,
423
+ 'account/set-account-level': 4,
423
424
  'account/mmp-reset': 4,
424
425
  'account/mmp-config': 100,
425
426
  # subaccount
ccxt/base/exchange.py CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  # -----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.0.35'
7
+ __version__ = '4.0.38'
8
8
 
9
9
  # -----------------------------------------------------------------------------
10
10
 
@@ -1772,7 +1772,7 @@ class Exchange(object):
1772
1772
  value = self.safe_value(entry, key)
1773
1773
  if value and (value >= since):
1774
1774
  result.append(entry)
1775
- if tail:
1775
+ if tail and limit is not None:
1776
1776
  return self.arraySlice(result, -limit)
1777
1777
  return self.filter_by_limit(result, limit, key)
1778
1778
 
@@ -1793,7 +1793,7 @@ class Exchange(object):
1793
1793
  secondCondition = entryKeyGESince if sinceIsDefined else True
1794
1794
  if firstCondition and secondCondition:
1795
1795
  result.append(entry)
1796
- if tail:
1796
+ if tail and limit is not None:
1797
1797
  return self.arraySlice(result, -limit)
1798
1798
  return self.filter_by_limit(result, limit, key)
1799
1799
 
@@ -3454,6 +3454,9 @@ class Exchange(object):
3454
3454
  def watch_my_trades(self, symbol: Optional[str] = None, since: Optional[int] = None, limit: Optional[int] = None, params={}):
3455
3455
  raise NotSupported(self.id + ' watchMyTrades() is not supported yet')
3456
3456
 
3457
+ def fetch_ohlcv_ws(self, symbol: str, timeframe: str = '1m', since: Optional[int] = None, limit: Optional[int] = None, params={}):
3458
+ raise NotSupported(self.id + ' fetchOHLCVWs() is not supported yet')
3459
+
3457
3460
  def fetch_deposits_withdrawals(self, code: Optional[str] = None, since: Optional[int] = None, limit: Optional[int] = None, params={}):
3458
3461
  """
3459
3462
  fetch history of deposits and withdrawals
ccxt/binance.py CHANGED
@@ -541,8 +541,9 @@ class binance(Exchange, ImplicitAPI):
541
541
  'loan/vip/repay': 40, # Weight(UID): 6000 => cost = 0.006667 * 6000 = 40
542
542
  'convert/getQuote': 20.001,
543
543
  'convert/acceptQuote': 3.3335,
544
- 'portfolio/auto-collection': 0.6667, # Weight(UID): 100 => cost = 0.006667 * 100 = 0.6667
545
- 'portfolio/bnb-transfer': 0.6667, # Weight(UID): 100 => cost = 0.006667 * 100 = 0.6667
544
+ 'portfolio/auto-collection': 150, # Weight(IP): 1500 => cost = 0.1 * 1500 = 150
545
+ 'portfolio/asset-collection': 6, # Weight(IP): 60 => cost = 0.1 * 60 = 6
546
+ 'portfolio/bnb-transfer': 150, # Weight(IP): 1500 => cost = 0.1 * 1500 = 150
546
547
  'portfolio/repay-futures-switch': 150, # Weight(IP): 1500 => cost = 0.1 * 1500 = 150
547
548
  'portfolio/repay-futures-negative-balance': 150, # Weight(IP): 1500 => cost = 0.1 * 1500 = 150
548
549
  'lending/auto-invest/plan/add': 0.1, # Weight(IP): 1 => cost = 0.1 * 1 = 0.1
@@ -817,6 +818,8 @@ class binance(Exchange, ImplicitAPI):
817
818
  'userTrades': 5,
818
819
  'exerciseRecord': 5,
819
820
  'bill': 1,
821
+ 'income/asyn': 5,
822
+ 'income/asyn/id': 5,
820
823
  'marginAccount': 3,
821
824
  'mmp': 1,
822
825
  'countdownCancelAll': 1,
@@ -3639,7 +3642,7 @@ class binance(Exchange, ImplicitAPI):
3639
3642
  if postOnly:
3640
3643
  uppercaseType = 'LIMIT_MAKER'
3641
3644
  request['type'] = uppercaseType
3642
- stopPrice = self.safe_number(params, 'stopPrice')
3645
+ stopPrice = self.safe_number_2(params, 'stopPrice', 'triggerPrice')
3643
3646
  if stopPrice is not None:
3644
3647
  if uppercaseType == 'MARKET':
3645
3648
  uppercaseType = 'STOP_LOSS'
ccxt/coinex.py CHANGED
@@ -3069,30 +3069,30 @@ class coinex(Exchange, ImplicitAPI):
3069
3069
 
3070
3070
  def set_leverage(self, leverage, symbol: Optional[str] = None, params={}):
3071
3071
  """
3072
+ see https://viabtc.github.io/coinex_api_en_doc/futures/#docsfutures001_http014_adjust_leverage
3072
3073
  set the level of leverage for a market
3073
3074
  :param float leverage: the rate of leverage
3074
3075
  :param str symbol: unified market symbol
3075
3076
  :param dict [params]: extra parameters specific to the coinex api endpoint
3077
+ :param str [params.marginMode]: 'cross' or 'isolated'(default is 'cross')
3076
3078
  :returns dict: response from the exchange
3077
3079
  """
3078
- if symbol is None:
3079
- raise ArgumentsRequired(self.id + ' setLeverage() requires a symbol argument')
3080
+ self.check_required_symbol('setLeverage', symbol)
3080
3081
  self.load_markets()
3081
- defaultMarginMode = self.safe_string_2(self.options, 'defaultMarginMode', 'marginMode')
3082
- defaultPositionType = None
3083
- if defaultMarginMode == 'isolated':
3084
- defaultPositionType = 1
3085
- elif defaultMarginMode == 'cross':
3086
- defaultPositionType = 2
3087
- positionType = self.safe_integer(params, 'position_type', defaultPositionType)
3088
- if positionType is None:
3089
- raise ArgumentsRequired(self.id + ' setLeverage() requires a position_type parameter that will transfer margin to the specified trading pair')
3090
3082
  market = self.market(symbol)
3091
- maxLeverage = self.safe_integer(market['limits']['leverage'], 'max', 100)
3092
- if market['type'] != 'swap':
3083
+ if not market['swap']:
3093
3084
  raise BadSymbol(self.id + ' setLeverage() supports swap contracts only')
3094
- if (leverage < 3) or (leverage > maxLeverage):
3095
- raise BadRequest(self.id + ' setLeverage() leverage should be between 3 and ' + str(maxLeverage) + ' for ' + symbol)
3085
+ marginMode = None
3086
+ marginMode, params = self.handle_margin_mode_and_params('setLeverage', params, 'cross')
3087
+ positionType = None
3088
+ if marginMode == 'isolated':
3089
+ positionType = 1
3090
+ elif marginMode == 'cross':
3091
+ positionType = 2
3092
+ minLeverage = self.safe_integer(market['limits']['leverage'], 'min', 1)
3093
+ maxLeverage = self.safe_integer(market['limits']['leverage'], 'max', 100)
3094
+ if (leverage < minLeverage) or (leverage > maxLeverage):
3095
+ raise BadRequest(self.id + ' setLeverage() leverage should be between ' + str(minLeverage) + ' and ' + str(maxLeverage) + ' for ' + symbol)
3096
3096
  request = {
3097
3097
  'market': market['id'],
3098
3098
  'leverage': str(leverage),
ccxt/gate.py CHANGED
@@ -372,6 +372,8 @@ class gate(Exchange, ImplicitAPI):
372
372
  },
373
373
  'flash_swap': {
374
374
  'get': {
375
+ 'currencies': 1.5,
376
+ 'currency_pairs': 1.5,
375
377
  'orders': 1.5,
376
378
  'orders/{order_id}': 1.5,
377
379
  },
@@ -782,6 +784,7 @@ class gate(Exchange, ImplicitAPI):
782
784
  'REPAY_TOO_MUCH': ExchangeError,
783
785
  'TOO_MANY_CURRENCY_PAIRS': InvalidOrder,
784
786
  'TOO_MANY_ORDERS': InvalidOrder,
787
+ 'TOO_MANY_REQUESTS': RateLimitExceeded,
785
788
  'MIXED_ACCOUNT_TYPE': InvalidOrder,
786
789
  'AUTO_BORROW_TOO_MUCH': ExchangeError,
787
790
  'TRADE_RESTRICTED': InsufficientFunds,
ccxt/okx.py CHANGED
@@ -419,6 +419,7 @@ class okx(Exchange, ImplicitAPI):
419
419
  'account/set-riskOffset-type': 2,
420
420
  'account/activate-option': 4,
421
421
  'account/set-auto-loan': 4,
422
+ 'account/set-account-level': 4,
422
423
  'account/mmp-reset': 4,
423
424
  'account/mmp-config': 100,
424
425
  # subaccount
ccxt/pro/__init__.py CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  # ----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.0.35'
7
+ __version__ = '4.0.38'
8
8
 
9
9
  # ----------------------------------------------------------------------------
10
10
 
ccxt/pro/coinex.py CHANGED
@@ -30,7 +30,8 @@ class coinex(ccxt.async_support.coinex):
30
30
  'watchMyTrades': False, # can query but can't subscribe
31
31
  'watchOrders': True,
32
32
  'watchOrderBook': True,
33
- 'watchOHLCV': False, # only for swap markets
33
+ 'watchOHLCV': True, # only for swap markets
34
+ 'fetchOHLCVWs': True,
34
35
  },
35
36
  'urls': {
36
37
  'api': {
@@ -345,6 +346,23 @@ class coinex(ccxt.async_support.coinex):
345
346
 
346
347
  def handle_ohlcv(self, client: Client, message):
347
348
  #
349
+ # spot
350
+ # {
351
+ # error: null,
352
+ # result: [
353
+ # [
354
+ # 1673846940,
355
+ # '21148.74',
356
+ # '21148.38',
357
+ # '21148.75',
358
+ # '21138.66',
359
+ # '1.57060173',
360
+ # '33214.9138778914'
361
+ # ],
362
+ # ]
363
+ # id: 1,
364
+ # }
365
+ # swap
348
366
  # {
349
367
  # method: 'kline.update',
350
368
  # params: [
@@ -361,10 +379,16 @@ class coinex(ccxt.async_support.coinex):
361
379
  # id: null
362
380
  # }
363
381
  #
364
- candles = self.safe_value(message, 'params', [])
382
+ candles = self.safe_value_2(message, 'params', 'result', [])
365
383
  messageHash = 'ohlcv'
384
+ id = self.safe_string(message, 'id')
366
385
  ohlcvs = self.parse_ohlcvs(candles)
367
- keysLength = self.ohlcvs
386
+ if id is not None:
387
+ # spot subscription response
388
+ client.resolve(ohlcvs, messageHash)
389
+ return
390
+ keys = list(self.ohlcvs.keys())
391
+ keysLength = len(keys)
368
392
  if keysLength == 0:
369
393
  limit = self.safe_integer(self.options, 'OHLCVLimit', 1000)
370
394
  self.ohlcvs = ArrayCacheByTimestamp(limit)
@@ -485,6 +509,7 @@ class coinex(ccxt.async_support.coinex):
485
509
 
486
510
  async def watch_ohlcv(self, symbol: str, timeframe='1m', since: Optional[int] = None, limit: Optional[int] = None, params={}):
487
511
  """
512
+ see https://viabtc.github.io/coinex_api_en_doc/futures/#docsfutures002_websocket023_kline_subscribe
488
513
  watches historical candlestick data containing the open, high, low, and close price, and the volume of a market
489
514
  :param str symbol: unified symbol of the market to fetch OHLCV data for
490
515
  :param str timeframe: the length of time each candle represents
@@ -499,14 +524,17 @@ class coinex(ccxt.async_support.coinex):
499
524
  type = None
500
525
  type, params = self.handle_market_type_and_params('watchOHLCV', market, params)
501
526
  if type != 'swap':
502
- raise NotSupported(self.id + ' watchOHLCV() is only supported for swap markets')
527
+ raise NotSupported(self.id + ' watchOHLCV() is only supported for swap markets. Try using fetchOHLCV() instead')
503
528
  url = self.urls['api']['ws'][type]
504
529
  messageHash = 'ohlcv'
505
530
  watchOHLCVWarning = self.safe_value(self.options, 'watchOHLCVWarning', True)
506
531
  client = self.safe_value(self.clients, url, {})
507
- existingSubscription = self.safe_value(client.subscriptions, messageHash)
532
+ clientSub = self.safe_value(client, 'subscriptions', {})
533
+ existingSubscription = self.safe_value(clientSub, messageHash)
534
+ subSymbol = self.safe_string(existingSubscription, 'symbol')
535
+ subTimeframe = self.safe_string(existingSubscription, 'timeframe')
508
536
  # due to nature of coinex response can only watch one symbol at a time
509
- if watchOHLCVWarning and existingSubscription is not None and (existingSubscription['symbol'] != symbol or existingSubscription['timeframe'] != timeframe):
537
+ if watchOHLCVWarning and existingSubscription is not None and (subSymbol != symbol or subTimeframe != timeframe):
510
538
  raise ExchangeError(self.id + ' watchOHLCV() can only watch one symbol and timeframe at a time. To supress self warning set watchOHLCVWarning to False in options')
511
539
  timeframes = self.safe_value(self.options, 'timeframes', {})
512
540
  subscribe = {
@@ -514,7 +542,7 @@ class coinex(ccxt.async_support.coinex):
514
542
  'id': self.request_id(),
515
543
  'params': [
516
544
  market['id'],
517
- self.safe_string(timeframes, timeframe, timeframe),
545
+ self.safe_integer(timeframes, timeframe),
518
546
  ],
519
547
  }
520
548
  subscription = {
@@ -527,6 +555,48 @@ class coinex(ccxt.async_support.coinex):
527
555
  limit = ohlcvs.getLimit(symbol, limit)
528
556
  return self.filter_by_since_limit(ohlcvs, since, limit, 0)
529
557
 
558
+ async def fetch_ohlcv_ws(self, symbol, timeframe='1m', since=None, limit=None, params={}):
559
+ """
560
+ see https://viabtc.github.io/coinex_api_en_doc/spot/#docsspot004_websocket005_kline_query
561
+ query historical candlestick data containing the open, high, low, and close price, and the volume of a market
562
+ :param str symbol: unified symbol of the market to query OHLCV data for
563
+ :param str timeframe: the length of time each candle represents
564
+ :param int|None since: timestamp in ms of the earliest candle to fetch
565
+ :param int|None limit: the maximum amount of candles to fetch
566
+ :param dict params: extra parameters specific to the coinex api endpoint
567
+ :param int|None params['end']: the end time for spot markets, self.seconds() is set
568
+ :returns [[int]]: A list of candles ordered, open, high, low, close, volume
569
+ """
570
+ await self.load_markets()
571
+ market = self.market(symbol)
572
+ type, query = self.handle_market_type_and_params('fetchOHLCV', market, params)
573
+ url = self.urls['api']['ws'][type]
574
+ symbol = market['symbol']
575
+ messageHash = 'ohlcv'
576
+ timeframes = self.safe_value(self.options, 'timeframes', {})
577
+ timeframe = self.safe_string(timeframes, timeframe, timeframe)
578
+ if since is None:
579
+ since = 1640995200 # January 1, 2022
580
+ id = self.request_id()
581
+ subscribe = {
582
+ 'method': 'kline.query',
583
+ 'params': [
584
+ market['id'],
585
+ self.parse_to_int(since / 1000),
586
+ self.safe_integer(params, 'end', self.seconds()),
587
+ self.parse_to_int(timeframe),
588
+ ],
589
+ 'id': id,
590
+ }
591
+ subscription = {
592
+ 'id': id,
593
+ 'future': messageHash,
594
+ }
595
+ subscriptionHash = id
596
+ request = self.deep_extend(subscribe, query)
597
+ ohlcvs = await self.watch(url, messageHash, request, subscriptionHash, subscription)
598
+ return self.filter_by_since_limit(ohlcvs, since, limit, 0)
599
+
530
600
  def handle_delta(self, bookside, delta):
531
601
  bidAsk = self.parse_bid_ask(delta, 0, 1)
532
602
  bookside.storeArray(bidAsk)
@@ -917,6 +987,8 @@ class coinex(ccxt.async_support.coinex):
917
987
  subscription = self.safe_value(client.subscriptions, id)
918
988
  if subscription is not None:
919
989
  futureIndex = self.safe_string(subscription, 'future')
990
+ if futureIndex == 'ohlcv':
991
+ return self.handle_ohlcv(client, message)
920
992
  future = self.safe_value(client.futures, futureIndex)
921
993
  if future is not None:
922
994
  future.resolve(True)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ccxt
3
- Version: 4.0.35
3
+ Version: 4.0.38
4
4
  Summary: A JavaScript / TypeScript / Python / C# / PHP cryptocurrency trading library with support for 130+ exchanges
5
5
  Home-page: https://ccxt.com
6
6
  Author: Igor Kroitor
@@ -260,13 +260,13 @@ console.log(version, Object.keys(exchanges));
260
260
 
261
261
  All-in-one browser bundle (dependencies included), served from a CDN of your choice:
262
262
 
263
- * jsDelivr: https://cdn.jsdelivr.net/npm/ccxt@4.0.35/dist/ccxt.browser.js
264
- * unpkg: https://unpkg.com/ccxt@4.0.35/dist/ccxt.browser.js
263
+ * jsDelivr: https://cdn.jsdelivr.net/npm/ccxt@4.0.38/dist/ccxt.browser.js
264
+ * unpkg: https://unpkg.com/ccxt@4.0.38/dist/ccxt.browser.js
265
265
 
266
266
  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.
267
267
 
268
268
  ```HTML
269
- <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/ccxt@4.0.35/dist/ccxt.browser.js"></script>
269
+ <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/ccxt@4.0.38/dist/ccxt.browser.js"></script>
270
270
  ```
271
271
 
272
272
  Creates a global `ccxt` object:
@@ -1,10 +1,10 @@
1
- ccxt/__init__.py,sha256=Rs4Sg6LAVJKgGbZ6tG0L_3ra7MAxGsMkCjHNUzNevX4,15438
1
+ ccxt/__init__.py,sha256=OEXnJg5MHbafgj_KsEpQkrUM7Sorn14UhDeWQ4uaaXc,15438
2
2
  ccxt/ace.py,sha256=8uTO7fzyxHnEhE3Y8VDP2EcWxh9gjs9xPMbuXjkUA7A,41372
3
3
  ccxt/alpaca.py,sha256=_cPmZ0obENxKSzsqLu0t1Ae-rUwN8z1DUB3Af8Kh4sA,33434
4
4
  ccxt/ascendex.py,sha256=rGD9sFxbRf_lEZavZpa6UEBIeX1tMydeFZzDOaQ3s8o,132537
5
5
  ccxt/bequant.py,sha256=1wDyg1jmS1H9WkODiqztoLVhQog7R6n7MUZsOhIRwRU,1136
6
6
  ccxt/bigone.py,sha256=3hAbaUMHIttNIte0xVSLUfiV914Fj6JsuyseQ4AIVk8,75446
7
- ccxt/binance.py,sha256=50fVEF4f2YJBwchz8Di7RKfYWYInmKGr-8_eluyWnzQ,392506
7
+ ccxt/binance.py,sha256=MAjK1-hpLKspvE_oAlYoFwLjQX9HAg3PhMMt1us78BY,392689
8
8
  ccxt/binancecoinm.py,sha256=pncdw6Xw2X1Po-vEvAB4nL37scoS_axGAVxetPy1YQs,1645
9
9
  ccxt/binanceus.py,sha256=RoC8nReBHXUJzRNyqMe4vhta6gLGuh1fyFkI8FOMKBE,2151
10
10
  ccxt/binanceusdm.py,sha256=KPQGlCalQ0eGlPCs2tSanOxaP8O0zFRQjGntA16Yprw,2480
@@ -44,7 +44,7 @@ ccxt/coinbase.py,sha256=aswSRpuvEpWPGy5EdeYbz6bTFRZw5-yboIJbBPa7n7U,129413
44
44
  ccxt/coinbaseprime.py,sha256=Ygvljulxb2uKdei5yimCj1LMjLlUJNvP-G7ns1HpUFk,1219
45
45
  ccxt/coinbasepro.py,sha256=_U1ZVWUGvUdqiwn9O2ijxIh0o9pdi1qXHLq7zg7CI5Q,73870
46
46
  ccxt/coincheck.py,sha256=0Y7Z49gpWfMuFcuJXAnCHAMjh1QUpgcaR95lPTD0h9o,34219
47
- ccxt/coinex.py,sha256=76nu8OLI7okHYixp1ZAnDPjPTR8tssAvl9ejYUoJOgQ,194478
47
+ ccxt/coinex.py,sha256=gWnkRw3kQEJfE0s8FZniYDONzoNrekbiZ9CEmyTEjkc,194426
48
48
  ccxt/coinfalcon.py,sha256=0NCXdTVU5qAEROVf0GRidmONJpV1zsOr2p_PW7yK-vE,38972
49
49
  ccxt/coinmate.py,sha256=CoK00164_37RGO2hKHVPAOMZx578ADZ4eTNWZbqVhTI,39561
50
50
  ccxt/coinone.py,sha256=8wX92TU-3QPbCzgYZrEMrnFyBZyca6lbLV3GttWfxfc,35261
@@ -58,7 +58,7 @@ ccxt/digifinex.py,sha256=jbP6esId7yqvSkbzsyg66EOd8Et3UKUT4q3omKjXYDQ,150987
58
58
  ccxt/exmo.py,sha256=bZQg1t8yrKscH3FWDKd5DmGsjR9d5-vJnOIoGG1swfk,88943
59
59
  ccxt/flowbtc.py,sha256=YPvm6tbsHJJUQBspFcHuVPQfVmiWzwnVvfzRqBdQX6U,1169
60
60
  ccxt/fmfwio.py,sha256=ww13viYsuW8IzHhr3HST8uuroYsCZ2aynyG4i_SE0LU,1238
61
- ccxt/gate.py,sha256=6aMsJhZRGMKAezxYPD142E35u4nDE4NShqMa0x6G0_c,251940
61
+ ccxt/gate.py,sha256=GkqMvu9sQMIfe9TRC0d-uu0O-jDKG4JYKUFaFMwnBDs,252098
62
62
  ccxt/gateio.py,sha256=86AETJWODl_vA5VNeQRHZprmpNIY1HAxCddKZcnKSi8,445
63
63
  ccxt/gemini.py,sha256=1VOPAe_VzFnMWuCXiVgP8Ra7wl7Osp3G_dvrGX6mHec,73902
64
64
  ccxt/hitbtc.py,sha256=Xj9-g6b8vzpCm6g-FrIjFGUa2CgroKc2bLyrSP22Uj0,62285
@@ -89,7 +89,7 @@ ccxt/oceanex.py,sha256=H7iiIWo9WInk_wwxScMZBGxs2EH7kNpEui9IsLKYVAY,38242
89
89
  ccxt/okcoin.py,sha256=B5otctOYDvWkhckFWW7tfhUQsQaSbPiZh0X0eqR1K_w,177829
90
90
  ccxt/okex.py,sha256=nVDSzVztmboH593DVByjzFoOpFTzumcQFH_T9kdVKlE,434
91
91
  ccxt/okex5.py,sha256=LKTogVF1svNkqW_-Cx0AuAopu6esgFf7ucbv7CaodUg,441
92
- ccxt/okx.py,sha256=J_riuRjkz30wVGrk0Qp_VWGsG_o7wJHQjYOfIEjZMhc,297823
92
+ ccxt/okx.py,sha256=nRZ3f4unYDhq1erSGqmxuwm7grSRVSLBVJ9zyIjeMEw,297879
93
93
  ccxt/paymium.py,sha256=DIlRvOVsYZaPGDUSBZH3-DUIXf7QfHEOFyhephw48HE,23938
94
94
  ccxt/phemex.py,sha256=taCpvz-oLSrgM6OqkMXxpVw6s2THKaTWOJ06VG0BXpY,198063
95
95
  ccxt/poloniex.py,sha256=x9lkjYRnGOKkZaAJwqdtz0EUATuknHgeTkXYXSN0ez4,93495
@@ -112,10 +112,10 @@ ccxt/abstract/alpaca.py,sha256=GKGGXKJ9WzW9V3SmOX_Jjaea_QTa04Eg5nYhQgFErGI,1861
112
112
  ccxt/abstract/ascendex.py,sha256=lMrOIR7VWJXoNaA8rjCNI8p-WTYsVlpC_D4jpDg5k_8,11197
113
113
  ccxt/abstract/bequant.py,sha256=0T5QJsSdYh5qcydcL76kC78pip1XrMDvaKkpxkcBsfc,8376
114
114
  ccxt/abstract/bigone.py,sha256=kuQi7l8C_zqTHdfXiBOfDR7424mzST2OjtN9wMStkWc,2457
115
- ccxt/abstract/binance.py,sha256=Do6RXAVw6s3A7ru_NdSLbHSlRcpn2hJtRZ8sJypvHYM,77791
116
- ccxt/abstract/binancecoinm.py,sha256=Do6RXAVw6s3A7ru_NdSLbHSlRcpn2hJtRZ8sJypvHYM,77791
117
- ccxt/abstract/binanceus.py,sha256=Do6RXAVw6s3A7ru_NdSLbHSlRcpn2hJtRZ8sJypvHYM,77791
118
- ccxt/abstract/binanceusdm.py,sha256=Do6RXAVw6s3A7ru_NdSLbHSlRcpn2hJtRZ8sJypvHYM,77791
115
+ ccxt/abstract/binance.py,sha256=2aF9mTT65cyPjioK2siADelfAKui-5PiiTz2xGn1wTc,78170
116
+ ccxt/abstract/binancecoinm.py,sha256=2aF9mTT65cyPjioK2siADelfAKui-5PiiTz2xGn1wTc,78170
117
+ ccxt/abstract/binanceus.py,sha256=2aF9mTT65cyPjioK2siADelfAKui-5PiiTz2xGn1wTc,78170
118
+ ccxt/abstract/binanceusdm.py,sha256=2aF9mTT65cyPjioK2siADelfAKui-5PiiTz2xGn1wTc,78170
119
119
  ccxt/abstract/bingx.py,sha256=PJzOcIO960mxEAPy8bFEZ3vJHrqUM3hkCc-6QERkkwU,7635
120
120
  ccxt/abstract/bit2c.py,sha256=np6i756kSB5dO3Nj6POLKxkWkpYcsGg-4LS8BwPrizI,2830
121
121
  ccxt/abstract/bitbank.py,sha256=k5D8PoPW2N79K_24NL9yY0qkwaCgzi_VoYUlqnj2bs8,2606
@@ -165,8 +165,8 @@ ccxt/abstract/deribit.py,sha256=rS_982u8dOVsh2vGSB5TO7K8Tye0Alq-Rg9fYZwz8hg,1549
165
165
  ccxt/abstract/digifinex.py,sha256=2tlP2G6Niu6TSbNUcgxvXdHfln6VhAZliXV7upFwpas,9386
166
166
  ccxt/abstract/exmo.py,sha256=yq9zis5G9Qjsecs-YSHAghDjad6y52jFteWSBJZFg8o,6177
167
167
  ccxt/abstract/fmfwio.py,sha256=0T5QJsSdYh5qcydcL76kC78pip1XrMDvaKkpxkcBsfc,8376
168
- ccxt/abstract/gate.py,sha256=W3TR-RwnBznNGR5ULU4zm5jS63UELRw1I5kjMq6kPjQ,33222
169
- ccxt/abstract/gateio.py,sha256=W3TR-RwnBznNGR5ULU4zm5jS63UELRw1I5kjMq6kPjQ,33222
168
+ ccxt/abstract/gate.py,sha256=c6k6EJqNLp9CkqWq9KYjCNJUkWHr0a51S6tQ38Jwm-o,33517
169
+ ccxt/abstract/gateio.py,sha256=c6k6EJqNLp9CkqWq9KYjCNJUkWHr0a51S6tQ38Jwm-o,33517
170
170
  ccxt/abstract/gemini.py,sha256=6TyBUDw-e4b02J5ToCX0eaXQfF0Knvkf7ToLcseqcIY,6915
171
171
  ccxt/abstract/hitbtc.py,sha256=0T5QJsSdYh5qcydcL76kC78pip1XrMDvaKkpxkcBsfc,8376
172
172
  ccxt/abstract/hitbtc3.py,sha256=-bjb83y_4FGdHtHMo-naHYoI5JyltlF2M-TzjAZJ3Hg,10949
@@ -194,9 +194,9 @@ ccxt/abstract/ndax.py,sha256=M98Ys406KT6T19Y98dXriD6YjzfglHHbnfQw-PDYWtM,11878
194
194
  ccxt/abstract/novadax.py,sha256=Yy-lYKteQyZTaajK5oQTTikd5sU33cct4ZdtNxo2j30,2565
195
195
  ccxt/abstract/oceanex.py,sha256=a0xAelMYDY_J3QwwLyIX2tGQcv4z2gmX_yJyC6FqoFg,1721
196
196
  ccxt/abstract/okcoin.py,sha256=aaKdO53NvRjbEFTh8NL1YsHyaTyfApO4xkh0NQZdQWA,25825
197
- ccxt/abstract/okex.py,sha256=Ai3-UYLzyYkJOJ9OELSkvzfauEzo2cLnFTMByqSPp2w,37514
198
- ccxt/abstract/okex5.py,sha256=Ai3-UYLzyYkJOJ9OELSkvzfauEzo2cLnFTMByqSPp2w,37514
199
- ccxt/abstract/okx.py,sha256=Ai3-UYLzyYkJOJ9OELSkvzfauEzo2cLnFTMByqSPp2w,37514
197
+ ccxt/abstract/okex.py,sha256=GnlhzXwvC_WXrcCt0RzbkOxLH0FS84poBijzJNJlG1U,37662
198
+ ccxt/abstract/okex5.py,sha256=GnlhzXwvC_WXrcCt0RzbkOxLH0FS84poBijzJNJlG1U,37662
199
+ ccxt/abstract/okx.py,sha256=GnlhzXwvC_WXrcCt0RzbkOxLH0FS84poBijzJNJlG1U,37662
200
200
  ccxt/abstract/paymium.py,sha256=PvsQHHBYBGyWP4eDX_4Ezqq88FPqdSyhkdy5BPJG9s4,2752
201
201
  ccxt/abstract/phemex.py,sha256=lAk6NPuqxxPHAWTjxGDz_W3x9U88v8tjJU4uCIXykQk,12172
202
202
  ccxt/abstract/poloniex.py,sha256=zPyRTMRU_z8wnXdwFVU2a6qgrBHxveUH-lDIySfRRuk,6301
@@ -213,13 +213,13 @@ ccxt/abstract/woo.py,sha256=ah_izsOyPt18l_rl1nzgbtwpRTeAo1_MJE8_qMvdCCg,7747
213
213
  ccxt/abstract/yobit.py,sha256=8ycfCO8ORFly9hc0Aa47sZyX4_ZKPXS9h9yJzI-uQ7Q,1339
214
214
  ccxt/abstract/zaif.py,sha256=m15WHdl3gYy0GOXNZ8NEH8eE7sVh8c0T_ITNuU8vXeU,3935
215
215
  ccxt/abstract/zonda.py,sha256=VoxuPkSq8vAvKnDvOqnByhwsIf09m7yIrs8HejFrDk4,5482
216
- ccxt/async_support/__init__.py,sha256=dEy567Kh1a-AN5dYFX2hjHBEUjUlxmWIaG3K1UGgsgk,15221
216
+ ccxt/async_support/__init__.py,sha256=Uz78x7djWK85nem2ikky8IIuyE4I6OEc5SNpGf9TR_E,15221
217
217
  ccxt/async_support/ace.py,sha256=xTtzqhVgpoDI4YgR9rRTRHTV2UsQmNYNfbuJc6aBKxA,41596
218
218
  ccxt/async_support/alpaca.py,sha256=hWimV0LrPixw15-FH7lMFB6s6EMEOjDlZOhWjznzu3g,33580
219
219
  ccxt/async_support/ascendex.py,sha256=tHwC-p_ilrM8r6k7w4Q59v8-PLOGlbsUCLHeKLLwbns,133169
220
220
  ccxt/async_support/bequant.py,sha256=BbfFIcAuK3qC0huDHr44hskFTHt1SG1Pp5XSgYnaiuA,1150
221
221
  ccxt/async_support/bigone.py,sha256=rNfleAZHUqHUx20fXBH8_-rn4wpwjVDZkxERElUERcU,75844
222
- ccxt/async_support/binance.py,sha256=ea_64fyfIykLtzZnMFZSf6VCKRN-INlxpFCFxb1JiGY,393752
222
+ ccxt/async_support/binance.py,sha256=HzdTWhXLsmT3TieP31HiTVKKKePQf6_v7Mb_nLJhE0w,393935
223
223
  ccxt/async_support/binancecoinm.py,sha256=IY3RLZptQA2nmZaUYRGfTa5ZY4VMWBpFYfwHc8zTHw0,1683
224
224
  ccxt/async_support/binanceus.py,sha256=Jtyl0jtSOpdjAAAYcSUzH6YRVxe88RJ6f4_IUge5gWg,2165
225
225
  ccxt/async_support/binanceusdm.py,sha256=-1r4A4tmV2pCiLGO80hzq7MIIj4MTzOD7buZGv6JauA,2518
@@ -259,7 +259,7 @@ ccxt/async_support/coinbase.py,sha256=ylb26vPGyVuePoSUvEhKLlbdX5CYCw3HMCgBLcuG9X
259
259
  ccxt/async_support/coinbaseprime.py,sha256=M5Ez1DsFcW3-vJ-4QoZzwYBAKjAAtJnJpkfnV4sWAIc,1233
260
260
  ccxt/async_support/coinbasepro.py,sha256=Gdq6-Dn3TmzqkybYNm5C3WHou5BkRA8A2MK8JAiIHSI,74376
261
261
  ccxt/async_support/coincheck.py,sha256=scNw54Oj_iGHDPLiFjNEMGMU3ti_wKn5ltM-AD85LB8,34425
262
- ccxt/async_support/coinex.py,sha256=9D2MCCXbtWe_1csqiBHSrJt8WxJ0jxlS0xUw8ftP7vM,195376
262
+ ccxt/async_support/coinex.py,sha256=61DlAIQECxabpsGOwSXCNziM-uNikzTf9ohn7GBoAiY,195324
263
263
  ccxt/async_support/coinfalcon.py,sha256=_X3-uP5cFEkZ20pt6WgkSJIlUFcqJYdkzJJdz5tgvU0,39268
264
264
  ccxt/async_support/coinmate.py,sha256=SoCqsz6uVWFCvijivKqRDE02y7z3RXsyzC3IkXWlUAE,39809
265
265
  ccxt/async_support/coinone.py,sha256=vhygwEqCs5C-kSpTt3cwP-eLVsNMsO29ep437lipzAI,35485
@@ -273,7 +273,7 @@ ccxt/async_support/digifinex.py,sha256=vCpv_8FoZNs21uX0plWZioxdZDnTU9QQ2LngoMt84
273
273
  ccxt/async_support/exmo.py,sha256=ocg9JUh_6p3OFA_DJdhP5tVkTuYnFfgIeMqMNzvg9XY,89485
274
274
  ccxt/async_support/flowbtc.py,sha256=bCnvtcNnPxxaxqVjI1GGXKhIpz_1r4GIFWqqPokvCR0,1183
275
275
  ccxt/async_support/fmfwio.py,sha256=h4X-aN7XOxJ0ODBurN0KlnmvZFS06wrRnAbDAifxugk,1252
276
- ccxt/async_support/gate.py,sha256=tKsJhUUh0vmdQ-pNrMwfKwSqwCcxB4OFcqpYv9QUs_g,252868
276
+ ccxt/async_support/gate.py,sha256=Kl5NsEHL5N3t2970U9ygu7w3jeg1LHZn76QlCgt9ivM,253026
277
277
  ccxt/async_support/gateio.py,sha256=6_t032F9p9x5KGTjtSuqGXITzFOx-XAQBYLpsuQjzxw,459
278
278
  ccxt/async_support/gemini.py,sha256=dfyJ83asotNsCBLZAMVDn8kuQ1WliXM3hk4LVrPsU7k,74392
279
279
  ccxt/async_support/hitbtc.py,sha256=m1bOvV7lBMQWzvenbJ0uwa4Ab_tbIcqUBdq7M7L9Q_Q,62719
@@ -304,7 +304,7 @@ ccxt/async_support/oceanex.py,sha256=uZcG5DwNv6hehxF8wMuHjBIW5sxkJ0_WOgeOPBhy9Go
304
304
  ccxt/async_support/okcoin.py,sha256=WvLWTmoUs8ARk7GTglgk4BwMtTj_kWUW6nRuuHVdNVk,178293
305
305
  ccxt/async_support/okex.py,sha256=6dbtH4bC1C2x4cQUK6W62y7PuDgO3YazuFa7DYhM4Jw,448
306
306
  ccxt/async_support/okex5.py,sha256=tq41tKx06j3DDO9pu9iKInpjayVprbobVNTK8qb7hoM,455
307
- ccxt/async_support/okx.py,sha256=Pe6leu5fbJGXXh2hssD0jvmr3EPaNPFH_F0f5uBbBm8,298918
307
+ ccxt/async_support/okx.py,sha256=FRQ6gQtVP2JsD-qJ50cBEvXC9ilyoNYqWF5sDc7lxh0,298974
308
308
  ccxt/async_support/paymium.py,sha256=6GM4efJ7rngx7LQt0rFb3TbZUKzGwBi11VMA7rQD-kY,24126
309
309
  ccxt/async_support/phemex.py,sha256=yvD-lvMeTW-bi-qE4-Qk-HzDzEV39VdLb5Mqn9V8fQw,198659
310
310
  ccxt/async_support/poloniex.py,sha256=t-_OcziYnb9dH9QCgRO9_MGcyJ17fEcqKCdU3ilhkgU,93995
@@ -322,7 +322,7 @@ ccxt/async_support/yobit.py,sha256=cRJgQNE-EfjXAligG8-iKxYA-yt9tKGilGnXg1PDrbg,5
322
322
  ccxt/async_support/zaif.py,sha256=Bg4Bfk63mluMSp1_8VE4_JPZEXSb940MocZGFisG9IA,28985
323
323
  ccxt/async_support/zonda.py,sha256=9je6awNUpQAHqF8uKfqIqjXyG8CQOPmzU1xDdxzpNDo,79823
324
324
  ccxt/async_support/base/__init__.py,sha256=aVYSsFi--b4InRs9zDN_wtCpj8odosAB726JdUHavrk,67
325
- ccxt/async_support/base/exchange.py,sha256=t1sb_saLDCexjP-PqchDIGNYL8UYT2GhdiulxBkq_Wk,142779
325
+ ccxt/async_support/base/exchange.py,sha256=Ewqz_elUvxNXvef1dfpb7GufNa5n0Gey2O6nyLPdhbM,143042
326
326
  ccxt/async_support/base/throttler.py,sha256=tvDVcdRUVYi8fZRlEcnqtgzcgB_KMUMRs5Pu8tuU-tU,1847
327
327
  ccxt/async_support/base/ws/__init__.py,sha256=uockzpLuwntKGZbs5EOWFe-Zg-k6Cj7GhNJLc_RX0so,1791
328
328
  ccxt/async_support/base/ws/aiohttp_client.py,sha256=xmlZV30Vb9Kq7JCm3D5FuEmuj1zp5H4F4hrz8-Y-Ir4,4999
@@ -336,10 +336,10 @@ ccxt/async_support/base/ws/order_book_side.py,sha256=GH-475Ni0mLOx7mUDnz4jjzaGkh
336
336
  ccxt/base/__init__.py,sha256=eTx1OE3HJjspFUQjGm6LBhaQiMKJnXjkdP-JUXknyQ0,1320
337
337
  ccxt/base/decimal_to_precision.py,sha256=fgWRBzRTtsf3r2INyS4f7WHlzgjB5YM1ekiwqD21aac,6634
338
338
  ccxt/base/errors.py,sha256=-LVeTNyXvu3QEgb-p-KzMpcBgzHlvFTwDzmZK7Gfc14,3401
339
- ccxt/base/exchange.py,sha256=XEsLPjAaw-jDdIEH2ph7j2nazZqFnx8KOdx5ppM06co,182403
339
+ ccxt/base/exchange.py,sha256=vKpzU5okif_dKfMxNg-dhGJoLnBwgss8N_fmPKQj87k,182660
340
340
  ccxt/base/precise.py,sha256=_xfu54sV0vWNnOfGTKRFykeuWP8mn4K1m9lk1tcllX4,8565
341
341
  ccxt/base/types.py,sha256=be7MU-iLHhynL-GmIzPxb0SD6GIps-w3PmPN05irsAA,1406
342
- ccxt/pro/__init__.py,sha256=tzNknuXYlcKgz8XxDooeh7Ihg2ZUktbgs0-wuZeimzc,6480
342
+ ccxt/pro/__init__.py,sha256=y31FULiheoDIGYi8RV64NF59wBm1rbmpQF4IoGLFGto,6480
343
343
  ccxt/pro/alpaca.py,sha256=dHcK0EFjEkzs_nZn2DGpwMauOkw2XPKaqYezx4dcDis,26671
344
344
  ccxt/pro/ascendex.py,sha256=QVvtQlv_AZaQTaZcczXocmrf9gL1zFpsLRVcNF21qCI,34555
345
345
  ccxt/pro/bequant.py,sha256=qz8JjnpkAQY_CFiFSKGqrjjgZ2167_TBKjSJOb9NeDw,1081
@@ -366,7 +366,7 @@ ccxt/pro/cex.py,sha256=SDum2QUzd8NiQW2vzK_x-xNhE2dZbDUyCtbJ5JlKr1E,44893
366
366
  ccxt/pro/coinbase.py,sha256=hsbKjjAHSxzGVwYkG-PTB8dIzveh7FVzqI-MENejvag,22041
367
367
  ccxt/pro/coinbaseprime.py,sha256=d5lgKZ8TKAOnYCGAD9e7AYjGQhtkWoNX7Q3eUGx0zEw,1121
368
368
  ccxt/pro/coinbasepro.py,sha256=sAKw5oI0HbBVDCSEii902kSscjBGV-STPAEZjWRjYF8,30100
369
- ccxt/pro/coinex.py,sha256=aaAPnCTWQxD6tfQQgUNPjEH-vsHr3T-XxhNKL70AS4I,40987
369
+ ccxt/pro/coinex.py,sha256=ZKesOxILr6al7vzU5jCsefXg17M8Txh4Mr85NaO-QaY,44159
370
370
  ccxt/pro/cryptocom.py,sha256=U_A8PwstEObMJAJs155OA3jPKwu0mSUvV0qQuIehFWQ,29912
371
371
  ccxt/pro/currencycom.py,sha256=ytWrVfIyWSTyS1G5v6kVd1GpYrGdJg7Cw86iFFjGcdg,22094
372
372
  ccxt/pro/deribit.py,sha256=X580doobEX8u7e-GsaJOKnoqI-wS9th0W93JoukyzgY,34033
@@ -450,7 +450,7 @@ ccxt/test/base/test_ticker.py,sha256=h9AV_O6s-Ax3vB3sFoN0Mz22rMOi65i9BDv0SNejH98
450
450
  ccxt/test/base/test_trade.py,sha256=bL9o3S_TGW8Nnlxu-BYkRG8NyRzKAWrU66uO5jJCM3A,2259
451
451
  ccxt/test/base/test_trading_fee.py,sha256=yRCpLHLg_ca9JQXdZB3_pIMHgHLGEfeQF95E6d1e2Bc,1125
452
452
  ccxt/test/base/test_transaction.py,sha256=BTbB4UHHXkrvYgwbrhh867nVRlevmIkIrz1W_odlQJI,1434
453
- ccxt-4.0.35.dist-info/METADATA,sha256=TVufSRjpQ9iBz1sJ7qD4ua_Ej7argaY2TdCAXRSci7k,111485
454
- ccxt-4.0.35.dist-info/WHEEL,sha256=a-zpFRIJzOq5QfuhBzbhiA1eHTzNCJn8OdRvhdNX0Rk,110
455
- ccxt-4.0.35.dist-info/top_level.txt,sha256=CkQDuCTDKNcImPV60t36G6MdYfxsAPNiSaEwifVoVMo,5
456
- ccxt-4.0.35.dist-info/RECORD,,
453
+ ccxt-4.0.38.dist-info/METADATA,sha256=xVb_Z3LpojDbov0o7lo7gr7mSZYGuIgq1ZeBF_kAKfM,111485
454
+ ccxt-4.0.38.dist-info/WHEEL,sha256=a-zpFRIJzOq5QfuhBzbhiA1eHTzNCJn8OdRvhdNX0Rk,110
455
+ ccxt-4.0.38.dist-info/top_level.txt,sha256=CkQDuCTDKNcImPV60t36G6MdYfxsAPNiSaEwifVoVMo,5
456
+ ccxt-4.0.38.dist-info/RECORD,,
File without changes