ccxt 4.4.20__py2.py3-none-any.whl → 4.4.21__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.20'
25
+ __version__ = '4.4.21'
26
26
 
27
27
  # ----------------------------------------------------------------------------
28
28
 
ccxt/abstract/bybit.py CHANGED
@@ -163,6 +163,7 @@ class ImplicitAPI:
163
163
  private_get_v5_user_del_submember = privateGetV5UserDelSubmember = Entry('v5/user/del-submember', 'private', 'GET', {'cost': 5})
164
164
  private_get_v5_user_submembers = privateGetV5UserSubmembers = Entry('v5/user/submembers', 'private', 'GET', {'cost': 5})
165
165
  private_get_v5_spot_lever_token_order_record = privateGetV5SpotLeverTokenOrderRecord = Entry('v5/spot-lever-token/order-record', 'private', 'GET', {'cost': 1})
166
+ private_get_v5_spot_margin_trade_interest_rate_history = privateGetV5SpotMarginTradeInterestRateHistory = Entry('v5/spot-margin-trade/interest-rate-history', 'private', 'GET', {'cost': 5})
166
167
  private_get_v5_spot_margin_trade_state = privateGetV5SpotMarginTradeState = Entry('v5/spot-margin-trade/state', 'private', 'GET', {'cost': 5})
167
168
  private_get_v5_spot_cross_margin_trade_loan_info = privateGetV5SpotCrossMarginTradeLoanInfo = Entry('v5/spot-cross-margin-trade/loan-info', 'private', 'GET', {'cost': 1})
168
169
  private_get_v5_spot_cross_margin_trade_account = privateGetV5SpotCrossMarginTradeAccount = Entry('v5/spot-cross-margin-trade/account', 'private', 'GET', {'cost': 1})
ccxt/abstract/kucoin.py CHANGED
@@ -20,6 +20,7 @@ class ImplicitAPI:
20
20
  public_get_mark_price_symbol_current = publicGetMarkPriceSymbolCurrent = Entry('mark-price/{symbol}/current', 'public', 'GET', {'cost': 3})
21
21
  public_get_mark_price_all_symbols = publicGetMarkPriceAllSymbols = Entry('mark-price/all-symbols', 'public', 'GET', {'cost': 3})
22
22
  public_get_margin_config = publicGetMarginConfig = Entry('margin/config', 'public', 'GET', {'cost': 25})
23
+ public_get_announcements = publicGetAnnouncements = Entry('announcements', 'public', 'GET', {'cost': 20})
23
24
  public_post_bullet_public = publicPostBulletPublic = Entry('bullet-public', 'public', 'POST', {'cost': 15})
24
25
  private_get_user_info = privateGetUserInfo = Entry('user-info', 'private', 'GET', {'cost': 30})
25
26
  private_get_accounts = privateGetAccounts = Entry('accounts', 'private', 'GET', {'cost': 7.5})
@@ -20,6 +20,7 @@ class ImplicitAPI:
20
20
  public_get_mark_price_symbol_current = publicGetMarkPriceSymbolCurrent = Entry('mark-price/{symbol}/current', 'public', 'GET', {'cost': 3})
21
21
  public_get_mark_price_all_symbols = publicGetMarkPriceAllSymbols = Entry('mark-price/all-symbols', 'public', 'GET', {'cost': 3})
22
22
  public_get_margin_config = publicGetMarginConfig = Entry('margin/config', 'public', 'GET', {'cost': 25})
23
+ public_get_announcements = publicGetAnnouncements = Entry('announcements', 'public', 'GET', {'cost': 20})
23
24
  public_post_bullet_public = publicPostBulletPublic = Entry('bullet-public', 'public', 'POST', {'cost': 15})
24
25
  private_get_user_info = privateGetUserInfo = Entry('user-info', 'private', 'GET', {'cost': 30})
25
26
  private_get_accounts = privateGetAccounts = Entry('accounts', 'private', 'GET', {'cost': 7.5})
ccxt/abstract/okx.py CHANGED
@@ -153,6 +153,9 @@ class ImplicitAPI:
153
153
  private_get_account_fixed_loan_borrowing_limit = privateGetAccountFixedLoanBorrowingLimit = Entry('account/fixed-loan/borrowing-limit', 'private', 'GET', {'cost': 4})
154
154
  private_get_account_fixed_loan_borrowing_quote = privateGetAccountFixedLoanBorrowingQuote = Entry('account/fixed-loan/borrowing-quote', 'private', 'GET', {'cost': 5})
155
155
  private_get_account_fixed_loan_borrowing_orders_list = privateGetAccountFixedLoanBorrowingOrdersList = Entry('account/fixed-loan/borrowing-orders-list', 'private', 'GET', {'cost': 5})
156
+ private_get_account_spot_manual_borrow_repay = privateGetAccountSpotManualBorrowRepay = Entry('account/spot-manual-borrow-repay', 'private', 'GET', {'cost': 10})
157
+ private_get_account_set_auto_repay = privateGetAccountSetAutoRepay = Entry('account/set-auto-repay', 'private', 'GET', {'cost': 4})
158
+ private_get_account_spot_borrow_repay_history = privateGetAccountSpotBorrowRepayHistory = Entry('account/spot-borrow-repay-history', 'private', 'GET', {'cost': 4})
156
159
  private_get_users_subaccount_list = privateGetUsersSubaccountList = Entry('users/subaccount/list', 'private', 'GET', {'cost': 10})
157
160
  private_get_account_subaccount_balances = privateGetAccountSubaccountBalances = Entry('account/subaccount/balances', 'private', 'GET', {'cost': 3.3333333333333335})
158
161
  private_get_asset_subaccount_balances = privateGetAssetSubaccountBalances = Entry('asset/subaccount/balances', 'private', 'GET', {'cost': 3.3333333333333335})
@@ -4,7 +4,7 @@
4
4
 
5
5
  # -----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.4.20'
7
+ __version__ = '4.4.21'
8
8
 
9
9
  # -----------------------------------------------------------------------------
10
10
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  # -----------------------------------------------------------------------------
4
4
 
5
- __version__ = '4.4.20'
5
+ __version__ = '4.4.21'
6
6
 
7
7
  # -----------------------------------------------------------------------------
8
8
 
@@ -11138,15 +11138,6 @@ class binance(Exchange, ImplicitAPI):
11138
11138
  #
11139
11139
  return self.parse_borrow_rate_history(response, code, since, limit)
11140
11140
 
11141
- def parse_borrow_rate_history(self, response, code, since, limit):
11142
- result = []
11143
- for i in range(0, len(response)):
11144
- item = response[i]
11145
- borrowRate = self.parse_borrow_rate(item)
11146
- result.append(borrowRate)
11147
- sorted = self.sort_by(result, 'timestamp')
11148
- return self.filter_by_currency_since_limit(sorted, code, since, limit)
11149
-
11150
11141
  def parse_borrow_rate(self, info, currency: Currency = None):
11151
11142
  #
11152
11143
  # {
@@ -4981,7 +4981,7 @@ class bingx(Exchange, ImplicitAPI):
4981
4981
  async def withdraw(self, code: str, amount: float, address: str, tag=None, params={}):
4982
4982
  """
4983
4983
  make a withdrawal
4984
- :see: https://bingx-api.github.io/docs/#/common/account-api.html#Withdraw
4984
+ :see: https://bingx-api.github.io/docs/#/en-us/spot/wallet-api.html#Withdraw
4985
4985
  :param str code: unified currency code
4986
4986
  :param float amount: the amount to withdraw
4987
4987
  :param str address: the address to withdraw to
@@ -4990,6 +4990,8 @@ class bingx(Exchange, ImplicitAPI):
4990
4990
  :param int [params.walletType]: 1 fund account, 2 standard account, 3 perpetual account
4991
4991
  :returns dict: a `transaction structure <https://docs.ccxt.com/#/?id=transaction-structure>`
4992
4992
  """
4993
+ tag, params = self.handle_withdraw_tag_and_params(tag, params)
4994
+ self.check_address(address)
4993
4995
  await self.load_markets()
4994
4996
  currency = self.currency(code)
4995
4997
  walletType = self.safe_integer(params, 'walletType')
@@ -5006,6 +5008,8 @@ class bingx(Exchange, ImplicitAPI):
5006
5008
  network = self.safe_string_upper(params, 'network')
5007
5009
  if network is not None:
5008
5010
  request['network'] = self.network_code_to_id(network)
5011
+ if tag is not None:
5012
+ request['addressTag'] = tag
5009
5013
  params = self.omit(params, ['walletType', 'network'])
5010
5014
  response = await self.walletsV1PrivatePostCapitalWithdrawApply(self.extend(request, params))
5011
5015
  data = self.safe_value(response, 'data')
@@ -385,6 +385,7 @@ class bybit(Exchange, ImplicitAPI):
385
385
  # spot leverage token
386
386
  'v5/spot-lever-token/order-record': 1, # 50/s => cost = 50 / 50 = 1
387
387
  # spot margin trade
388
+ 'v5/spot-margin-trade/interest-rate-history': 5,
388
389
  'v5/spot-margin-trade/state': 5,
389
390
  'v5/spot-cross-margin-trade/loan-info': 1, # 50/s => cost = 50 / 50 = 1
390
391
  'v5/spot-cross-margin-trade/account': 1, # 50/s => cost = 50 / 50 = 1
@@ -6776,12 +6777,22 @@ class bybit(Exchange, ImplicitAPI):
6776
6777
  # "timestamp": 1666734490778
6777
6778
  # }
6778
6779
  #
6780
+ # fetchBorrowRateHistory
6781
+ # {
6782
+ # "timestamp": 1721469600000,
6783
+ # "currency": "USDC",
6784
+ # "hourlyBorrowRate": "0.000014621596",
6785
+ # "vipLevel": "No VIP"
6786
+ # }
6787
+ #
6779
6788
  timestamp = self.safe_integer(info, 'timestamp')
6780
- currencyId = self.safe_string(info, 'coin')
6789
+ currencyId = self.safe_string_2(info, 'coin', 'currency')
6790
+ hourlyBorrowRate = self.safe_number(info, 'hourlyBorrowRate')
6791
+ period = 3600000 if (hourlyBorrowRate is not None) else 86400000 # 1h or 1d
6781
6792
  return {
6782
6793
  'currency': self.safe_currency_code(currencyId, currency),
6783
- 'rate': self.safe_number(info, 'interestRate'),
6784
- 'period': 86400000, # Daily
6794
+ 'rate': self.safe_number(info, 'interestRate', hourlyBorrowRate),
6795
+ 'period': period, # Daily
6785
6796
  'timestamp': timestamp,
6786
6797
  'datetime': self.iso8601(timestamp),
6787
6798
  'info': info,
@@ -6831,6 +6842,53 @@ class bybit(Exchange, ImplicitAPI):
6831
6842
  interest = self.parse_borrow_interests(rows, None)
6832
6843
  return self.filter_by_currency_since_limit(interest, code, since, limit)
6833
6844
 
6845
+ async def fetch_borrow_rate_history(self, code: str, since: Int = None, limit: Int = None, params={}):
6846
+ """
6847
+ retrieves a history of a currencies borrow interest rate at specific time slots
6848
+ :see: https://bybit-exchange.github.io/docs/v5/spot-margin-uta/historical-interest
6849
+ :param str code: unified currency code
6850
+ :param int [since]: timestamp for the earliest borrow rate
6851
+ :param int [limit]: the maximum number of `borrow rate structures <https://docs.ccxt.com/#/?id=borrow-rate-structure>` to retrieve
6852
+ :param dict [params]: extra parameters specific to the exchange API endpoint
6853
+ :param int [params.until]: the latest time in ms to fetch entries for
6854
+ :returns dict[]: an array of `borrow rate structures <https://docs.ccxt.com/#/?id=borrow-rate-structure>`
6855
+ """
6856
+ await self.load_markets()
6857
+ currency = self.currency(code)
6858
+ request: dict = {
6859
+ 'currency': currency['id'],
6860
+ }
6861
+ if since is None:
6862
+ since = self.milliseconds() - 86400000 * 30 # last 30 days
6863
+ request['startTime'] = since
6864
+ endTime = self.safe_integer_2(params, 'until', 'endTime')
6865
+ params = self.omit(params, ['until'])
6866
+ if endTime is None:
6867
+ endTime = since + 86400000 * 30 # since + 30 days
6868
+ request['endTime'] = endTime
6869
+ response = await self.privateGetV5SpotMarginTradeInterestRateHistory(self.extend(request, params))
6870
+ #
6871
+ # {
6872
+ # "retCode": 0,
6873
+ # "retMsg": "OK",
6874
+ # "result": {
6875
+ # "list": [
6876
+ # {
6877
+ # "timestamp": 1721469600000,
6878
+ # "currency": "USDC",
6879
+ # "hourlyBorrowRate": "0.000014621596",
6880
+ # "vipLevel": "No VIP"
6881
+ # }
6882
+ # ]
6883
+ # },
6884
+ # "retExtInfo": "{}",
6885
+ # "time": 1721899048991
6886
+ # }
6887
+ #
6888
+ data = self.safe_dict(response, 'result')
6889
+ rows = self.safe_list(data, 'list', [])
6890
+ return self.parse_borrow_rate_history(rows, code, since, limit)
6891
+
6834
6892
  def parse_borrow_interest(self, info: dict, market: Market = None):
6835
6893
  #
6836
6894
  # {
ccxt/async_support/htx.py CHANGED
@@ -1628,6 +1628,10 @@ class htx(Exchange, ImplicitAPI):
1628
1628
  async def fetch_markets(self, params={}) -> List[Market]:
1629
1629
  """
1630
1630
  retrieves data on all markets for huobi
1631
+ :see: https://huobiapi.github.io/docs/spot/v1/en/#get-all-supported-trading-symbol-v1-deprecated
1632
+ :see: https://huobiapi.github.io/docs/dm/v1/en/#get-contract-info
1633
+ :see: https://huobiapi.github.io/docs/coin_margined_swap/v1/en/#query-swap-info
1634
+ :see: https://huobiapi.github.io/docs/usdt_swap/v1/en/#general-query-swap-info
1631
1635
  :param dict [params]: extra parameters specific to the exchange API endpoint
1632
1636
  :returns dict[]: an array of objects representing market data
1633
1637
  """
@@ -1651,7 +1655,19 @@ class htx(Exchange, ImplicitAPI):
1651
1655
  allMarkets = self.array_concat(allMarkets, promises[i])
1652
1656
  return allMarkets
1653
1657
 
1654
- async def fetch_markets_by_type_and_sub_type(self, type, subType, params={}):
1658
+ async def fetch_markets_by_type_and_sub_type(self, type: Str, subType: Str, params={}):
1659
+ """
1660
+ * @ignore
1661
+ retrieves data on all markets of a certain type and/or subtype
1662
+ :see: https://huobiapi.github.io/docs/spot/v1/en/#get-all-supported-trading-symbol-v1-deprecated
1663
+ :see: https://huobiapi.github.io/docs/dm/v1/en/#get-contract-info
1664
+ :see: https://huobiapi.github.io/docs/coin_margined_swap/v1/en/#query-swap-info
1665
+ :see: https://huobiapi.github.io/docs/usdt_swap/v1/en/#general-query-swap-info
1666
+ :param str [type]: 'spot', 'swap' or 'future'
1667
+ :param str [subType]: 'linear' or 'inverse'
1668
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1669
+ :returns dict[]: an array of objects representing market data
1670
+ """
1655
1671
  isSpot = (type == 'spot')
1656
1672
  request: dict = {}
1657
1673
  response = None
@@ -3015,7 +3031,15 @@ class htx(Exchange, ImplicitAPI):
3015
3031
  'code': None,
3016
3032
  }
3017
3033
 
3018
- async def fetch_account_id_by_type(self, type, marginMode=None, symbol=None, params={}):
3034
+ async def fetch_account_id_by_type(self, type: str, marginMode: Str = None, symbol: Str = None, params={}):
3035
+ """
3036
+ fetch all the accounts by a type and marginModeassociated with a profile
3037
+ :see: https://huobiapi.github.io/docs/spot/v1/en/#get-all-accounts-of-the-current-user
3038
+ :param str type: 'spot', 'swap' or 'future
3039
+ :param str [marginMode]: 'cross' or 'isolated'
3040
+ :param dict [params]: extra parameters specific to the exchange API endpoint
3041
+ :returns dict: a dictionary of `account structures <https://docs.ccxt.com/#/?id=account-structure>` indexed by the account type
3042
+ """
3019
3043
  accounts = await self.load_accounts()
3020
3044
  accountId = self.safe_value_2(params, 'accountId', 'account-id')
3021
3045
  if accountId is not None:
@@ -639,17 +639,17 @@ class hyperliquid(Exchange, ImplicitAPI):
639
639
  code = self.safe_currency_code(self.safe_string(balance, 'coin'))
640
640
  account = self.account()
641
641
  total = self.safe_string(balance, 'total')
642
- free = self.safe_string(balance, 'hold')
642
+ used = self.safe_string(balance, 'hold')
643
643
  account['total'] = total
644
- account['used'] = free
644
+ account['used'] = used
645
645
  spotBalances[code] = account
646
646
  return self.safe_balance(spotBalances)
647
647
  data = self.safe_dict(response, 'marginSummary', {})
648
648
  result: dict = {
649
649
  'info': response,
650
650
  'USDC': {
651
- 'total': self.safe_float(data, 'accountValue'),
652
- 'used': self.safe_float(data, 'totalMarginUsed'),
651
+ 'total': self.safe_number(data, 'accountValue'),
652
+ 'free': self.safe_number(response, 'withdrawable'),
653
653
  },
654
654
  }
655
655
  timestamp = self.safe_integer(response, 'time')
@@ -2113,10 +2113,11 @@ class hyperliquid(Exchange, ImplicitAPI):
2113
2113
  leverage = self.safe_dict(entry, 'leverage', {})
2114
2114
  marginMode = self.safe_string(leverage, 'type')
2115
2115
  isIsolated = (marginMode == 'isolated')
2116
- size = self.safe_number(entry, 'szi')
2116
+ size = self.safe_string(entry, 'szi')
2117
2117
  side = None
2118
2118
  if size is not None:
2119
- side = 'long' if (size > 0) else 'short'
2119
+ side = 'long' if Precise.string_gt(size, '0') else 'short'
2120
+ size = Precise.string_abs(size)
2120
2121
  unrealizedPnl = self.safe_number(entry, 'unrealizedPnl')
2121
2122
  initialMargin = self.safe_number(entry, 'marginUsed')
2122
2123
  percentage = unrealizedPnl / initialMargin * 100
@@ -184,6 +184,7 @@ class kucoin(Exchange, ImplicitAPI):
184
184
  'mark-price/{symbol}/current': 3, # 2PW
185
185
  'mark-price/all-symbols': 3,
186
186
  'margin/config': 25, # 25SW
187
+ 'announcements': 20, # 20W
187
188
  },
188
189
  'post': {
189
190
  # ws
@@ -473,6 +474,7 @@ class kucoin(Exchange, ImplicitAPI):
473
474
  'precisionMode': TICK_SIZE,
474
475
  'exceptions': {
475
476
  'exact': {
477
+ 'The order does not exist.': OrderNotFound,
476
478
  'order not exist': OrderNotFound,
477
479
  'order not exist.': OrderNotFound, # duplicated error temporarily
478
480
  'order_not_exist': OrderNotFound, # {"code":"order_not_exist","msg":"order_not_exist"} ¯\_(ツ)_/¯
@@ -673,6 +675,7 @@ class kucoin(Exchange, ImplicitAPI):
673
675
  'currencies/{currency}': 'v3',
674
676
  'symbols': 'v2',
675
677
  'mark-price/all-symbols': 'v3',
678
+ 'announcements': 'v3',
676
679
  },
677
680
  },
678
681
  'private': {
@@ -1530,38 +1533,28 @@ class kucoin(Exchange, ImplicitAPI):
1530
1533
  # "chain": "ERC20"
1531
1534
  # }
1532
1535
  #
1536
+ minWithdrawFee = self.safe_number(fee, 'withdrawMinFee')
1533
1537
  result: dict = {
1534
1538
  'info': fee,
1535
1539
  'withdraw': {
1540
+ 'fee': minWithdrawFee,
1541
+ 'percentage': False,
1542
+ },
1543
+ 'deposit': {
1536
1544
  'fee': None,
1537
1545
  'percentage': None,
1538
1546
  },
1547
+ 'networks': {},
1548
+ }
1549
+ networkId = self.safe_string(fee, 'chain')
1550
+ networkCode = self.network_id_to_code(networkId, self.safe_string(currency, 'code'))
1551
+ result['networks'][networkCode] = {
1552
+ 'withdraw': minWithdrawFee,
1539
1553
  'deposit': {
1540
1554
  'fee': None,
1541
1555
  'percentage': None,
1542
1556
  },
1543
- 'networks': {},
1544
1557
  }
1545
- isWithdrawEnabled = self.safe_bool(fee, 'isWithdrawEnabled', True)
1546
- minFee = None
1547
- if isWithdrawEnabled:
1548
- result['withdraw']['percentage'] = False
1549
- chains = self.safe_list(fee, 'chains', [])
1550
- for i in range(0, len(chains)):
1551
- chain = chains[i]
1552
- networkId = self.safe_string(chain, 'chainId')
1553
- networkCode = self.network_id_to_code(networkId, self.safe_string(currency, 'code'))
1554
- withdrawFee = self.safe_string(chain, 'withdrawalMinFee')
1555
- if minFee is None or (Precise.string_lt(withdrawFee, minFee)):
1556
- minFee = withdrawFee
1557
- result['networks'][networkCode] = {
1558
- 'withdraw': self.parse_number(withdrawFee),
1559
- 'deposit': {
1560
- 'fee': None,
1561
- 'percentage': None,
1562
- },
1563
- }
1564
- result['withdraw']['fee'] = self.parse_number(minFee)
1565
1558
  return result
1566
1559
 
1567
1560
  def is_futures_method(self, methodName, params):
@@ -2921,7 +2914,7 @@ class kucoin(Exchange, ImplicitAPI):
2921
2914
  },
2922
2915
  'status': status,
2923
2916
  'lastTradeTimestamp': None,
2924
- 'average': None,
2917
+ 'average': self.safe_string(order, 'avgDealPrice'),
2925
2918
  'trades': None,
2926
2919
  }, market)
2927
2920
 
@@ -4154,15 +4147,6 @@ class kucoin(Exchange, ImplicitAPI):
4154
4147
  return config['v1']
4155
4148
  return self.safe_value(config, 'cost', 1)
4156
4149
 
4157
- def parse_borrow_rate_history(self, response, code, since, limit):
4158
- result = []
4159
- for i in range(0, len(response)):
4160
- item = response[i]
4161
- borrowRate = self.parse_borrow_rate(item)
4162
- result.append(borrowRate)
4163
- sorted = self.sort_by(result, 'timestamp')
4164
- return self.filter_by_currency_since_limit(sorted, code, since, limit)
4165
-
4166
4150
  def parse_borrow_rate(self, info, currency: Currency = None):
4167
4151
  #
4168
4152
  # {
@@ -2103,8 +2103,8 @@ class kucoinfutures(kucoin, ImplicitAPI):
2103
2103
  amount = self.safe_string(order, 'size')
2104
2104
  filled = self.safe_string(order, 'filledSize')
2105
2105
  cost = self.safe_string(order, 'filledValue')
2106
- average = None
2107
- if Precise.string_gt(filled, '0'):
2106
+ average = self.safe_string(order, 'avgDealPrice')
2107
+ if (average is None) and Precise.string_gt(filled, '0'):
2108
2108
  contractSize = self.safe_string(market, 'contractSize')
2109
2109
  if market['linear']:
2110
2110
  average = Precise.string_div(cost, Precise.string_mul(contractSize, filled))
ccxt/async_support/okx.py CHANGED
@@ -18,6 +18,7 @@ from ccxt.base.errors import AccountSuspended
18
18
  from ccxt.base.errors import ArgumentsRequired
19
19
  from ccxt.base.errors import BadRequest
20
20
  from ccxt.base.errors import BadSymbol
21
+ from ccxt.base.errors import OperationRejected
21
22
  from ccxt.base.errors import ManualInteractionNeeded
22
23
  from ccxt.base.errors import InsufficientFunds
23
24
  from ccxt.base.errors import InvalidAddress
@@ -379,6 +380,9 @@ class okx(Exchange, ImplicitAPI):
379
380
  'account/fixed-loan/borrowing-limit': 4,
380
381
  'account/fixed-loan/borrowing-quote': 5,
381
382
  'account/fixed-loan/borrowing-orders-list': 5,
383
+ 'account/spot-manual-borrow-repay': 10,
384
+ 'account/set-auto-repay': 4,
385
+ 'account/spot-borrow-repay-history': 4,
382
386
  # subaccount
383
387
  'users/subaccount/list': 10,
384
388
  'account/subaccount/balances': 10 / 3,
@@ -910,6 +914,11 @@ class okx(Exchange, ImplicitAPI):
910
914
  '59301': ExchangeError, # Margin adjustment failed for exceeding the max limit
911
915
  '59313': ExchangeError, # Unable to repay. You haven't borrowed any {ccy} {ccyPair} in Quick margin mode.
912
916
  '59401': ExchangeError, # Holdings already reached the limit
917
+ '59410': OperationRejected, # You can only borrow self crypto if it supports borrowing and borrowing is enabled.
918
+ '59411': InsufficientFunds, # Manual borrowing failed. Your account's free margin is insufficient
919
+ '59412': OperationRejected, # Manual borrowing failed. The amount exceeds your borrowing limit.
920
+ '59413': OperationRejected, # You didn't borrow self crypto. No repayment needed.
921
+ '59414': BadRequest, # Manual borrowing failed. The minimum borrowing limit is {param0}.needed.
913
922
  '59500': ExchangeError, # Only the APIKey of the main account has permission
914
923
  '59501': ExchangeError, # Only 50 APIKeys can be created per account
915
924
  '59502': ExchangeError, # Note name cannot be duplicate with the currently created APIKey note name
@@ -6231,15 +6240,6 @@ class okx(Exchange, ImplicitAPI):
6231
6240
  borrowRateHistories[code] = self.filter_by_currency_since_limit(borrowRateHistories[code], code, since, limit)
6232
6241
  return borrowRateHistories
6233
6242
 
6234
- def parse_borrow_rate_history(self, response, code, since, limit):
6235
- result = []
6236
- for i in range(0, len(response)):
6237
- item = response[i]
6238
- borrowRate = self.parse_borrow_rate(item)
6239
- result.append(borrowRate)
6240
- sorted = self.sort_by(result, 'timestamp')
6241
- return self.filter_by_currency_since_limit(sorted, code, since, limit)
6242
-
6243
6243
  async def fetch_borrow_rate_histories(self, codes=None, since: Int = None, limit: Int = None, params={}):
6244
6244
  """
6245
6245
  retrieves a history of a multiple currencies borrow interest rate at specific time slots, returns all currencies if no symbols passed, default is None
ccxt/base/exchange.py CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  # -----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.4.20'
7
+ __version__ = '4.4.21'
8
8
 
9
9
  # -----------------------------------------------------------------------------
10
10
 
@@ -5445,6 +5445,18 @@ class Exchange(object):
5445
5445
  interests.append(self.parse_borrow_interest(row, market))
5446
5446
  return interests
5447
5447
 
5448
+ def parse_borrow_rate(self, info, currency: Currency = None):
5449
+ raise NotSupported(self.id + ' parseBorrowRate() is not supported yet')
5450
+
5451
+ def parse_borrow_rate_history(self, response, code: Str, since: Int, limit: Int):
5452
+ result = []
5453
+ for i in range(0, len(response)):
5454
+ item = response[i]
5455
+ borrowRate = self.parse_borrow_rate(item)
5456
+ result.append(borrowRate)
5457
+ sorted = self.sort_by(result, 'timestamp')
5458
+ return self.filter_by_currency_since_limit(sorted, code, since, limit)
5459
+
5448
5460
  def parse_isolated_borrow_rates(self, info: Any):
5449
5461
  result = {}
5450
5462
  for i in range(0, len(info)):
ccxt/binance.py CHANGED
@@ -11137,15 +11137,6 @@ class binance(Exchange, ImplicitAPI):
11137
11137
  #
11138
11138
  return self.parse_borrow_rate_history(response, code, since, limit)
11139
11139
 
11140
- def parse_borrow_rate_history(self, response, code, since, limit):
11141
- result = []
11142
- for i in range(0, len(response)):
11143
- item = response[i]
11144
- borrowRate = self.parse_borrow_rate(item)
11145
- result.append(borrowRate)
11146
- sorted = self.sort_by(result, 'timestamp')
11147
- return self.filter_by_currency_since_limit(sorted, code, since, limit)
11148
-
11149
11140
  def parse_borrow_rate(self, info, currency: Currency = None):
11150
11141
  #
11151
11142
  # {
ccxt/bingx.py CHANGED
@@ -4980,7 +4980,7 @@ class bingx(Exchange, ImplicitAPI):
4980
4980
  def withdraw(self, code: str, amount: float, address: str, tag=None, params={}):
4981
4981
  """
4982
4982
  make a withdrawal
4983
- :see: https://bingx-api.github.io/docs/#/common/account-api.html#Withdraw
4983
+ :see: https://bingx-api.github.io/docs/#/en-us/spot/wallet-api.html#Withdraw
4984
4984
  :param str code: unified currency code
4985
4985
  :param float amount: the amount to withdraw
4986
4986
  :param str address: the address to withdraw to
@@ -4989,6 +4989,8 @@ class bingx(Exchange, ImplicitAPI):
4989
4989
  :param int [params.walletType]: 1 fund account, 2 standard account, 3 perpetual account
4990
4990
  :returns dict: a `transaction structure <https://docs.ccxt.com/#/?id=transaction-structure>`
4991
4991
  """
4992
+ tag, params = self.handle_withdraw_tag_and_params(tag, params)
4993
+ self.check_address(address)
4992
4994
  self.load_markets()
4993
4995
  currency = self.currency(code)
4994
4996
  walletType = self.safe_integer(params, 'walletType')
@@ -5005,6 +5007,8 @@ class bingx(Exchange, ImplicitAPI):
5005
5007
  network = self.safe_string_upper(params, 'network')
5006
5008
  if network is not None:
5007
5009
  request['network'] = self.network_code_to_id(network)
5010
+ if tag is not None:
5011
+ request['addressTag'] = tag
5008
5012
  params = self.omit(params, ['walletType', 'network'])
5009
5013
  response = self.walletsV1PrivatePostCapitalWithdrawApply(self.extend(request, params))
5010
5014
  data = self.safe_value(response, 'data')
ccxt/bybit.py CHANGED
@@ -384,6 +384,7 @@ class bybit(Exchange, ImplicitAPI):
384
384
  # spot leverage token
385
385
  'v5/spot-lever-token/order-record': 1, # 50/s => cost = 50 / 50 = 1
386
386
  # spot margin trade
387
+ 'v5/spot-margin-trade/interest-rate-history': 5,
387
388
  'v5/spot-margin-trade/state': 5,
388
389
  'v5/spot-cross-margin-trade/loan-info': 1, # 50/s => cost = 50 / 50 = 1
389
390
  'v5/spot-cross-margin-trade/account': 1, # 50/s => cost = 50 / 50 = 1
@@ -6775,12 +6776,22 @@ class bybit(Exchange, ImplicitAPI):
6775
6776
  # "timestamp": 1666734490778
6776
6777
  # }
6777
6778
  #
6779
+ # fetchBorrowRateHistory
6780
+ # {
6781
+ # "timestamp": 1721469600000,
6782
+ # "currency": "USDC",
6783
+ # "hourlyBorrowRate": "0.000014621596",
6784
+ # "vipLevel": "No VIP"
6785
+ # }
6786
+ #
6778
6787
  timestamp = self.safe_integer(info, 'timestamp')
6779
- currencyId = self.safe_string(info, 'coin')
6788
+ currencyId = self.safe_string_2(info, 'coin', 'currency')
6789
+ hourlyBorrowRate = self.safe_number(info, 'hourlyBorrowRate')
6790
+ period = 3600000 if (hourlyBorrowRate is not None) else 86400000 # 1h or 1d
6780
6791
  return {
6781
6792
  'currency': self.safe_currency_code(currencyId, currency),
6782
- 'rate': self.safe_number(info, 'interestRate'),
6783
- 'period': 86400000, # Daily
6793
+ 'rate': self.safe_number(info, 'interestRate', hourlyBorrowRate),
6794
+ 'period': period, # Daily
6784
6795
  'timestamp': timestamp,
6785
6796
  'datetime': self.iso8601(timestamp),
6786
6797
  'info': info,
@@ -6830,6 +6841,53 @@ class bybit(Exchange, ImplicitAPI):
6830
6841
  interest = self.parse_borrow_interests(rows, None)
6831
6842
  return self.filter_by_currency_since_limit(interest, code, since, limit)
6832
6843
 
6844
+ def fetch_borrow_rate_history(self, code: str, since: Int = None, limit: Int = None, params={}):
6845
+ """
6846
+ retrieves a history of a currencies borrow interest rate at specific time slots
6847
+ :see: https://bybit-exchange.github.io/docs/v5/spot-margin-uta/historical-interest
6848
+ :param str code: unified currency code
6849
+ :param int [since]: timestamp for the earliest borrow rate
6850
+ :param int [limit]: the maximum number of `borrow rate structures <https://docs.ccxt.com/#/?id=borrow-rate-structure>` to retrieve
6851
+ :param dict [params]: extra parameters specific to the exchange API endpoint
6852
+ :param int [params.until]: the latest time in ms to fetch entries for
6853
+ :returns dict[]: an array of `borrow rate structures <https://docs.ccxt.com/#/?id=borrow-rate-structure>`
6854
+ """
6855
+ self.load_markets()
6856
+ currency = self.currency(code)
6857
+ request: dict = {
6858
+ 'currency': currency['id'],
6859
+ }
6860
+ if since is None:
6861
+ since = self.milliseconds() - 86400000 * 30 # last 30 days
6862
+ request['startTime'] = since
6863
+ endTime = self.safe_integer_2(params, 'until', 'endTime')
6864
+ params = self.omit(params, ['until'])
6865
+ if endTime is None:
6866
+ endTime = since + 86400000 * 30 # since + 30 days
6867
+ request['endTime'] = endTime
6868
+ response = self.privateGetV5SpotMarginTradeInterestRateHistory(self.extend(request, params))
6869
+ #
6870
+ # {
6871
+ # "retCode": 0,
6872
+ # "retMsg": "OK",
6873
+ # "result": {
6874
+ # "list": [
6875
+ # {
6876
+ # "timestamp": 1721469600000,
6877
+ # "currency": "USDC",
6878
+ # "hourlyBorrowRate": "0.000014621596",
6879
+ # "vipLevel": "No VIP"
6880
+ # }
6881
+ # ]
6882
+ # },
6883
+ # "retExtInfo": "{}",
6884
+ # "time": 1721899048991
6885
+ # }
6886
+ #
6887
+ data = self.safe_dict(response, 'result')
6888
+ rows = self.safe_list(data, 'list', [])
6889
+ return self.parse_borrow_rate_history(rows, code, since, limit)
6890
+
6833
6891
  def parse_borrow_interest(self, info: dict, market: Market = None):
6834
6892
  #
6835
6893
  # {
ccxt/htx.py CHANGED
@@ -1627,6 +1627,10 @@ class htx(Exchange, ImplicitAPI):
1627
1627
  def fetch_markets(self, params={}) -> List[Market]:
1628
1628
  """
1629
1629
  retrieves data on all markets for huobi
1630
+ :see: https://huobiapi.github.io/docs/spot/v1/en/#get-all-supported-trading-symbol-v1-deprecated
1631
+ :see: https://huobiapi.github.io/docs/dm/v1/en/#get-contract-info
1632
+ :see: https://huobiapi.github.io/docs/coin_margined_swap/v1/en/#query-swap-info
1633
+ :see: https://huobiapi.github.io/docs/usdt_swap/v1/en/#general-query-swap-info
1630
1634
  :param dict [params]: extra parameters specific to the exchange API endpoint
1631
1635
  :returns dict[]: an array of objects representing market data
1632
1636
  """
@@ -1650,7 +1654,19 @@ class htx(Exchange, ImplicitAPI):
1650
1654
  allMarkets = self.array_concat(allMarkets, promises[i])
1651
1655
  return allMarkets
1652
1656
 
1653
- def fetch_markets_by_type_and_sub_type(self, type, subType, params={}):
1657
+ def fetch_markets_by_type_and_sub_type(self, type: Str, subType: Str, params={}):
1658
+ """
1659
+ * @ignore
1660
+ retrieves data on all markets of a certain type and/or subtype
1661
+ :see: https://huobiapi.github.io/docs/spot/v1/en/#get-all-supported-trading-symbol-v1-deprecated
1662
+ :see: https://huobiapi.github.io/docs/dm/v1/en/#get-contract-info
1663
+ :see: https://huobiapi.github.io/docs/coin_margined_swap/v1/en/#query-swap-info
1664
+ :see: https://huobiapi.github.io/docs/usdt_swap/v1/en/#general-query-swap-info
1665
+ :param str [type]: 'spot', 'swap' or 'future'
1666
+ :param str [subType]: 'linear' or 'inverse'
1667
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1668
+ :returns dict[]: an array of objects representing market data
1669
+ """
1654
1670
  isSpot = (type == 'spot')
1655
1671
  request: dict = {}
1656
1672
  response = None
@@ -3014,7 +3030,15 @@ class htx(Exchange, ImplicitAPI):
3014
3030
  'code': None,
3015
3031
  }
3016
3032
 
3017
- def fetch_account_id_by_type(self, type, marginMode=None, symbol=None, params={}):
3033
+ def fetch_account_id_by_type(self, type: str, marginMode: Str = None, symbol: Str = None, params={}):
3034
+ """
3035
+ fetch all the accounts by a type and marginModeassociated with a profile
3036
+ :see: https://huobiapi.github.io/docs/spot/v1/en/#get-all-accounts-of-the-current-user
3037
+ :param str type: 'spot', 'swap' or 'future
3038
+ :param str [marginMode]: 'cross' or 'isolated'
3039
+ :param dict [params]: extra parameters specific to the exchange API endpoint
3040
+ :returns dict: a dictionary of `account structures <https://docs.ccxt.com/#/?id=account-structure>` indexed by the account type
3041
+ """
3018
3042
  accounts = self.load_accounts()
3019
3043
  accountId = self.safe_value_2(params, 'accountId', 'account-id')
3020
3044
  if accountId is not None:
ccxt/hyperliquid.py CHANGED
@@ -638,17 +638,17 @@ class hyperliquid(Exchange, ImplicitAPI):
638
638
  code = self.safe_currency_code(self.safe_string(balance, 'coin'))
639
639
  account = self.account()
640
640
  total = self.safe_string(balance, 'total')
641
- free = self.safe_string(balance, 'hold')
641
+ used = self.safe_string(balance, 'hold')
642
642
  account['total'] = total
643
- account['used'] = free
643
+ account['used'] = used
644
644
  spotBalances[code] = account
645
645
  return self.safe_balance(spotBalances)
646
646
  data = self.safe_dict(response, 'marginSummary', {})
647
647
  result: dict = {
648
648
  'info': response,
649
649
  'USDC': {
650
- 'total': self.safe_float(data, 'accountValue'),
651
- 'used': self.safe_float(data, 'totalMarginUsed'),
650
+ 'total': self.safe_number(data, 'accountValue'),
651
+ 'free': self.safe_number(response, 'withdrawable'),
652
652
  },
653
653
  }
654
654
  timestamp = self.safe_integer(response, 'time')
@@ -2112,10 +2112,11 @@ class hyperliquid(Exchange, ImplicitAPI):
2112
2112
  leverage = self.safe_dict(entry, 'leverage', {})
2113
2113
  marginMode = self.safe_string(leverage, 'type')
2114
2114
  isIsolated = (marginMode == 'isolated')
2115
- size = self.safe_number(entry, 'szi')
2115
+ size = self.safe_string(entry, 'szi')
2116
2116
  side = None
2117
2117
  if size is not None:
2118
- side = 'long' if (size > 0) else 'short'
2118
+ side = 'long' if Precise.string_gt(size, '0') else 'short'
2119
+ size = Precise.string_abs(size)
2119
2120
  unrealizedPnl = self.safe_number(entry, 'unrealizedPnl')
2120
2121
  initialMargin = self.safe_number(entry, 'marginUsed')
2121
2122
  percentage = unrealizedPnl / initialMargin * 100
ccxt/kucoin.py CHANGED
@@ -183,6 +183,7 @@ class kucoin(Exchange, ImplicitAPI):
183
183
  'mark-price/{symbol}/current': 3, # 2PW
184
184
  'mark-price/all-symbols': 3,
185
185
  'margin/config': 25, # 25SW
186
+ 'announcements': 20, # 20W
186
187
  },
187
188
  'post': {
188
189
  # ws
@@ -472,6 +473,7 @@ class kucoin(Exchange, ImplicitAPI):
472
473
  'precisionMode': TICK_SIZE,
473
474
  'exceptions': {
474
475
  'exact': {
476
+ 'The order does not exist.': OrderNotFound,
475
477
  'order not exist': OrderNotFound,
476
478
  'order not exist.': OrderNotFound, # duplicated error temporarily
477
479
  'order_not_exist': OrderNotFound, # {"code":"order_not_exist","msg":"order_not_exist"} ¯\_(ツ)_/¯
@@ -672,6 +674,7 @@ class kucoin(Exchange, ImplicitAPI):
672
674
  'currencies/{currency}': 'v3',
673
675
  'symbols': 'v2',
674
676
  'mark-price/all-symbols': 'v3',
677
+ 'announcements': 'v3',
675
678
  },
676
679
  },
677
680
  'private': {
@@ -1529,38 +1532,28 @@ class kucoin(Exchange, ImplicitAPI):
1529
1532
  # "chain": "ERC20"
1530
1533
  # }
1531
1534
  #
1535
+ minWithdrawFee = self.safe_number(fee, 'withdrawMinFee')
1532
1536
  result: dict = {
1533
1537
  'info': fee,
1534
1538
  'withdraw': {
1539
+ 'fee': minWithdrawFee,
1540
+ 'percentage': False,
1541
+ },
1542
+ 'deposit': {
1535
1543
  'fee': None,
1536
1544
  'percentage': None,
1537
1545
  },
1546
+ 'networks': {},
1547
+ }
1548
+ networkId = self.safe_string(fee, 'chain')
1549
+ networkCode = self.network_id_to_code(networkId, self.safe_string(currency, 'code'))
1550
+ result['networks'][networkCode] = {
1551
+ 'withdraw': minWithdrawFee,
1538
1552
  'deposit': {
1539
1553
  'fee': None,
1540
1554
  'percentage': None,
1541
1555
  },
1542
- 'networks': {},
1543
1556
  }
1544
- isWithdrawEnabled = self.safe_bool(fee, 'isWithdrawEnabled', True)
1545
- minFee = None
1546
- if isWithdrawEnabled:
1547
- result['withdraw']['percentage'] = False
1548
- chains = self.safe_list(fee, 'chains', [])
1549
- for i in range(0, len(chains)):
1550
- chain = chains[i]
1551
- networkId = self.safe_string(chain, 'chainId')
1552
- networkCode = self.network_id_to_code(networkId, self.safe_string(currency, 'code'))
1553
- withdrawFee = self.safe_string(chain, 'withdrawalMinFee')
1554
- if minFee is None or (Precise.string_lt(withdrawFee, minFee)):
1555
- minFee = withdrawFee
1556
- result['networks'][networkCode] = {
1557
- 'withdraw': self.parse_number(withdrawFee),
1558
- 'deposit': {
1559
- 'fee': None,
1560
- 'percentage': None,
1561
- },
1562
- }
1563
- result['withdraw']['fee'] = self.parse_number(minFee)
1564
1557
  return result
1565
1558
 
1566
1559
  def is_futures_method(self, methodName, params):
@@ -2920,7 +2913,7 @@ class kucoin(Exchange, ImplicitAPI):
2920
2913
  },
2921
2914
  'status': status,
2922
2915
  'lastTradeTimestamp': None,
2923
- 'average': None,
2916
+ 'average': self.safe_string(order, 'avgDealPrice'),
2924
2917
  'trades': None,
2925
2918
  }, market)
2926
2919
 
@@ -4153,15 +4146,6 @@ class kucoin(Exchange, ImplicitAPI):
4153
4146
  return config['v1']
4154
4147
  return self.safe_value(config, 'cost', 1)
4155
4148
 
4156
- def parse_borrow_rate_history(self, response, code, since, limit):
4157
- result = []
4158
- for i in range(0, len(response)):
4159
- item = response[i]
4160
- borrowRate = self.parse_borrow_rate(item)
4161
- result.append(borrowRate)
4162
- sorted = self.sort_by(result, 'timestamp')
4163
- return self.filter_by_currency_since_limit(sorted, code, since, limit)
4164
-
4165
4149
  def parse_borrow_rate(self, info, currency: Currency = None):
4166
4150
  #
4167
4151
  # {
ccxt/kucoinfutures.py CHANGED
@@ -2103,8 +2103,8 @@ class kucoinfutures(kucoin, ImplicitAPI):
2103
2103
  amount = self.safe_string(order, 'size')
2104
2104
  filled = self.safe_string(order, 'filledSize')
2105
2105
  cost = self.safe_string(order, 'filledValue')
2106
- average = None
2107
- if Precise.string_gt(filled, '0'):
2106
+ average = self.safe_string(order, 'avgDealPrice')
2107
+ if (average is None) and Precise.string_gt(filled, '0'):
2108
2108
  contractSize = self.safe_string(market, 'contractSize')
2109
2109
  if market['linear']:
2110
2110
  average = Precise.string_div(cost, Precise.string_mul(contractSize, filled))
ccxt/okx.py CHANGED
@@ -17,6 +17,7 @@ from ccxt.base.errors import AccountSuspended
17
17
  from ccxt.base.errors import ArgumentsRequired
18
18
  from ccxt.base.errors import BadRequest
19
19
  from ccxt.base.errors import BadSymbol
20
+ from ccxt.base.errors import OperationRejected
20
21
  from ccxt.base.errors import ManualInteractionNeeded
21
22
  from ccxt.base.errors import InsufficientFunds
22
23
  from ccxt.base.errors import InvalidAddress
@@ -378,6 +379,9 @@ class okx(Exchange, ImplicitAPI):
378
379
  'account/fixed-loan/borrowing-limit': 4,
379
380
  'account/fixed-loan/borrowing-quote': 5,
380
381
  'account/fixed-loan/borrowing-orders-list': 5,
382
+ 'account/spot-manual-borrow-repay': 10,
383
+ 'account/set-auto-repay': 4,
384
+ 'account/spot-borrow-repay-history': 4,
381
385
  # subaccount
382
386
  'users/subaccount/list': 10,
383
387
  'account/subaccount/balances': 10 / 3,
@@ -909,6 +913,11 @@ class okx(Exchange, ImplicitAPI):
909
913
  '59301': ExchangeError, # Margin adjustment failed for exceeding the max limit
910
914
  '59313': ExchangeError, # Unable to repay. You haven't borrowed any {ccy} {ccyPair} in Quick margin mode.
911
915
  '59401': ExchangeError, # Holdings already reached the limit
916
+ '59410': OperationRejected, # You can only borrow self crypto if it supports borrowing and borrowing is enabled.
917
+ '59411': InsufficientFunds, # Manual borrowing failed. Your account's free margin is insufficient
918
+ '59412': OperationRejected, # Manual borrowing failed. The amount exceeds your borrowing limit.
919
+ '59413': OperationRejected, # You didn't borrow self crypto. No repayment needed.
920
+ '59414': BadRequest, # Manual borrowing failed. The minimum borrowing limit is {param0}.needed.
912
921
  '59500': ExchangeError, # Only the APIKey of the main account has permission
913
922
  '59501': ExchangeError, # Only 50 APIKeys can be created per account
914
923
  '59502': ExchangeError, # Note name cannot be duplicate with the currently created APIKey note name
@@ -6230,15 +6239,6 @@ class okx(Exchange, ImplicitAPI):
6230
6239
  borrowRateHistories[code] = self.filter_by_currency_since_limit(borrowRateHistories[code], code, since, limit)
6231
6240
  return borrowRateHistories
6232
6241
 
6233
- def parse_borrow_rate_history(self, response, code, since, limit):
6234
- result = []
6235
- for i in range(0, len(response)):
6236
- item = response[i]
6237
- borrowRate = self.parse_borrow_rate(item)
6238
- result.append(borrowRate)
6239
- sorted = self.sort_by(result, 'timestamp')
6240
- return self.filter_by_currency_since_limit(sorted, code, since, limit)
6241
-
6242
6242
  def fetch_borrow_rate_histories(self, codes=None, since: Int = None, limit: Int = None, params={}):
6243
6243
  """
6244
6244
  retrieves a history of a multiple currencies borrow interest rate at specific time slots, returns all currencies if no symbols passed, default is None
ccxt/pro/__init__.py CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  # ----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.4.20'
7
+ __version__ = '4.4.21'
8
8
 
9
9
  # ----------------------------------------------------------------------------
10
10
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ccxt
3
- Version: 4.4.20
3
+ Version: 4.4.21
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.20/dist/ccxt.browser.min.js
275
- * unpkg: https://unpkg.com/ccxt@4.4.20/dist/ccxt.browser.min.js
274
+ * jsDelivr: https://cdn.jsdelivr.net/npm/ccxt@4.4.21/dist/ccxt.browser.min.js
275
+ * unpkg: https://unpkg.com/ccxt@4.4.21/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.20/dist/ccxt.browser.min.js"></script>
280
+ <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/ccxt@4.4.21/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=tKK1YYAQ5sGJE0BbbzQ2i8wYvSNeMF1ow5bzLZME--I,16486
1
+ ccxt/__init__.py,sha256=4WoNKEIY3gw5EMpxclVCHaLgXWkWXNAiPXxjWMv9Nac,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=LOW0PigowIqFQAD0tou4RQYjEYRFdp5xZH77AjWr26E,657204
7
+ ccxt/binance.py,sha256=VNi-YYwFVPYENYbhv2pPRr409ciDyGqCEe01QACfftE,656817
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=qmG7fgs6ZmcsPSPjHrMcb5HLvONn1d6Z7DSJn9Q83Dg,252069
11
+ ccxt/bingx.py,sha256=zJffOn5jUmZ0ioEg4ur1G5icTuKEYWj8m-lsOR_vgXc,252247
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
@@ -35,7 +35,7 @@ ccxt/btcalpha.py,sha256=plU5SSsJn0ZMLW7I8sXb_L0Woc3-kamGMSlqPGujUzE,36751
35
35
  ccxt/btcbox.py,sha256=lvY7cgoe4tglaQiTJZ4vILmzvoEjAWxgswRuB2iYzmE,27780
36
36
  ccxt/btcmarkets.py,sha256=WDDbtbUQ9I0odVZp8nJdIjc4-zv4li49EDSt8EqQbRU,52733
37
37
  ccxt/btcturk.py,sha256=jSA4UnD1GiJu24gXNkfb94f-zXifP5By_Ptery_cMnY,37024
38
- ccxt/bybit.py,sha256=IkafXZJVGyn8SIYAuZtQ-0S1MhTLeFkzJ6o8R0rJWgs,441554
38
+ ccxt/bybit.py,sha256=iNRDiyT7mEUMTVtM8YE9LNK3uNlxky1veaeiPWJ9qSU,444244
39
39
  ccxt/cex.py,sha256=C1j8Vk2duXt4TuKINJ7VWivVY54sOIo-FzE6dn_laWU,70211
40
40
  ccxt/coinbase.py,sha256=CNDpskULlvJ8PLjb0tXp_PifmYXYImX8ZjB4Kvx5NqY,218725
41
41
  ccxt/coinbaseadvanced.py,sha256=d5g6nRx-NCcCwZDdtp8FsI2D-pRjSvnAP9ISSKY_nCQ,538
@@ -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=AtHi2kswFSP9NBSWSjIqQeDoBPDeyTsQPElnaGkTcaM,434498
66
+ ccxt/htx.py,sha256=sQOB0CfuHYzZCmDawjaE43fxyFIid3G_8aAIDbVhoZc,436137
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=SIdQrgUPv3FTAKCFADgys-_x7uS8AO9kWqHMtEILaPw,123150
69
+ ccxt/hyperliquid.py,sha256=EbHEDjN5n7YhPSyaV2MHmW3FVslqYGXrJH_w0OLBRAM,123215
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=Bfhrue_5ZiJNzetgqOJvsiOxDZwN4qAyXewZEepqtLE,231819
76
- ccxt/kucoinfutures.py,sha256=fgSjDKPyDixiQnmCpjTnBazjqWVg15ziKgBAp2Xq9kM,139376
75
+ ccxt/kucoin.py,sha256=_MHeWS9_Zkd3AKYHPWKQVDt5_10U3pwLihdh7cTA7dU,231045
76
+ ccxt/kucoinfutures.py,sha256=I6cladqgxS2lUfcxBPgt8wrbzF7DQjAFnTJJVe4eIFM,139433
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=zFByIRV1v23oknBPkLIN0ZGaewr-siQzv84aoQRFRNA,116266
@@ -85,7 +85,7 @@ ccxt/ndax.py,sha256=EHlxGEi6RKnz2IDLdEGj8V4yVt8exliTJiP46J40a_8,110430
85
85
  ccxt/novadax.py,sha256=_xFkuZ72vHhpJb1N9h_MQHRD05GDWlqUeLQQcOp43BM,64436
86
86
  ccxt/oceanex.py,sha256=NRL1VUBdpkAZj0qFov-HB_TEwmIX6lyz3RdCW53B66A,41178
87
87
  ccxt/okcoin.py,sha256=Dvn7kOe6pvFLqkq3zA7DTWPQB6HmzoNLZ5tAeZ8gWwA,151307
88
- ccxt/okx.py,sha256=VlbeY0W1PYhi9yxabPO29-aqcqm6p6CElR48OAtPv44,384469
88
+ ccxt/okx.py,sha256=Pfxbjgxcr4fdTUCVkZrmrBsEzAvDStHh4EYSZoygwDY,384900
89
89
  ccxt/onetrading.py,sha256=0yQ1MNVcTrHlWYVU_D3FmeHkK1FT35zFans6e9KeRxA,88480
90
90
  ccxt/oxfun.py,sha256=uFrS6oO6rvyXmocqPwAxVzczg0IG-BZeqRmNcNcTTig,124875
91
91
  ccxt/p2b.py,sha256=iPzHv663K8F1F0uTWEYpfQBcaqowY8MQ5tZt2ZNpoQE,54290
@@ -145,7 +145,7 @@ ccxt/abstract/btcalpha.py,sha256=sbF4SAkTJq01QPQw4D2GMkKrPhKfFIsG-PNtMAC9WwU,138
145
145
  ccxt/abstract/btcbox.py,sha256=pifkHEayyfVN4lhO2s8oKg_wjQChwWo0g5-vw4rcm1s,931
146
146
  ccxt/abstract/btcmarkets.py,sha256=dQ2yTZ_8T2TEeAYIuKE0ATImbOLDLGSK7HbbBd8XVJQ,3690
147
147
  ccxt/abstract/btcturk.py,sha256=duM-QrB9MvGpopOtxkfbeYlY49bgvXQLiosRVmnQYFw,1777
148
- ccxt/abstract/bybit.py,sha256=LF6CubceoBU3HHAb17zz8uDIEDmJ9T_7bDrySao8txk,49941
148
+ ccxt/abstract/bybit.py,sha256=6JXcw_zXMfCEjsmrflYnWBQHG5NJWkfwd79GB6b7B0A,50134
149
149
  ccxt/abstract/cex.py,sha256=Q0NJeDuJ4Kn_mtokYqBenhXWvLIiMSVTqbgbfcLGgv4,3311
150
150
  ccxt/abstract/coinbase.py,sha256=GFXDh_Bf65Gsx_DmgOrRG2jpM3IdITE3Agqz_LZTJfo,15507
151
151
  ccxt/abstract/coinbaseadvanced.py,sha256=GFXDh_Bf65Gsx_DmgOrRG2jpM3IdITE3Agqz_LZTJfo,15507
@@ -181,8 +181,8 @@ ccxt/abstract/independentreserve.py,sha256=Cue0hud5acRs2Q6oSvQ7Rx-YWS_fuACs6uV3a
181
181
  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
- ccxt/abstract/kucoin.py,sha256=4LLJ8vPaUZ18ZxlriZvI_t42r22TWy3EEG8BLUQUsWo,28250
185
- ccxt/abstract/kucoinfutures.py,sha256=y5NeiAz8NwovciY7PHBR0stCMGT1Ljbmd5GOxdDQdU4,32155
184
+ ccxt/abstract/kucoin.py,sha256=TtBWWuTCvkABKT_x64VOjNsHyha6neX3FFH6fNpyXGA,28360
185
+ ccxt/abstract/kucoinfutures.py,sha256=gu6Xov0jFd_Zoq9hoF0qAY2OKkgzY87dmGIT0R7Y0zo,32265
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
@@ -194,7 +194,7 @@ ccxt/abstract/ndax.py,sha256=M98Ys406KT6T19Y98dXriD6YjzfglHHbnfQw-PDYWtM,11878
194
194
  ccxt/abstract/novadax.py,sha256=IvQFP_v2Q-Sx0tK2bXx4oY81rtNwC7gkc75p_E2jhKw,3093
195
195
  ccxt/abstract/oceanex.py,sha256=JoK404UCkmMG2VqMaGit6PtonyXtCixYx539SoYtYug,2307
196
196
  ccxt/abstract/okcoin.py,sha256=3NmYh-68W_4AXmkqjkf9dRaJcPgNYQG5mKZssJKT4gs,9414
197
- ccxt/abstract/okx.py,sha256=-sm_TfCw_iND9vt_xX-iPRoV7rdvEhhAH5lhduioRsg,49044
197
+ ccxt/abstract/okx.py,sha256=P4EkqVIShkCoaVO1v-DQccKyI4FYWrHLAh-4hAGsegk,49514
198
198
  ccxt/abstract/onetrading.py,sha256=TtJq4d44lrutV8wcK0lX4v0EfQ72ly6fxR-zB7-FSuI,3859
199
199
  ccxt/abstract/oxfun.py,sha256=bv4FJPe1H5ouMT_gRHVQtvV0MrMZhc3US-DMwnDM4Js,3457
200
200
  ccxt/abstract/p2b.py,sha256=XwaH1hLIi2T6RHltUwFj28Y5fbo6dc0jbjI01sVeOJw,2054
@@ -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=jkch6fN9zu-ZzvzCs1ltnQ5wZIRS5eZWdgHVXRd3q8k,16289
221
+ ccxt/async_support/__init__.py,sha256=JAzKWfNCVP_Mm8dGh6EHaYX5uuz7FcC2UlSL7ZJyG_4,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=54WbvvuCTSe4LhE1ZKseMOGZ7S_QYwZV_MEOddrMh4I,660033
227
+ ccxt/async_support/binance.py,sha256=SgNe6GCcPKMDlFex_yBmog3tSgsK8uDaSeFfaaIl1WE,659646
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=jfe9Yh7hOFF2an2yBwaePOq0i0T9biVS-Et9YgmPnbM,253387
231
+ ccxt/async_support/bingx.py,sha256=-C_zNzCkjRlRiVBHITDwwWmVj_Wh5Ps3IAu1qShRlto,253565
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
@@ -255,7 +255,7 @@ ccxt/async_support/btcalpha.py,sha256=8OefA3GsJ27eAL44yQQcRNOruHXAwTemjTPkpLKwjE
255
255
  ccxt/async_support/btcbox.py,sha256=rBXxuvdQaku5QYseQ4XSvMrCkohDefYmf-rGeS9W0IU,28004
256
256
  ccxt/async_support/btcmarkets.py,sha256=fTf_MDIM7NMwpbv6X5lYPLNg8tFKcviNiUB7N3yO6FI,53083
257
257
  ccxt/async_support/btcturk.py,sha256=Uq9rXMoDkXIy0nw1rzmw2e8eeRepcNtXKNYuw-02tkM,37242
258
- ccxt/async_support/bybit.py,sha256=p_tjVgMp360vNN8-iWLM_4xeM1E38hoDDFXIur8unv8,443573
258
+ ccxt/async_support/bybit.py,sha256=oQKaQkWplq5zwZdoq_tan7pBxJZNV4mR7DRCRrwW6s8,446281
259
259
  ccxt/async_support/cex.py,sha256=HzFy4eP5qVwbXzq96VyjgJmXxK3DWUxHqJ1nHuV28cQ,70561
260
260
  ccxt/async_support/coinbase.py,sha256=XsAHx1vPMpsWcCbz6WYlY6J68luojlE3Xw5wzsaiE7U,219879
261
261
  ccxt/async_support/coinbaseadvanced.py,sha256=Kupwnuxiu_qTjwCNV2asacoDUNFQvcaHNAznUJPhdQs,552
@@ -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=Lr7HFO46N4e0PqogaMDsVLfe8D8QhJDZBoQY0BbHR9I,436890
286
+ ccxt/async_support/htx.py,sha256=YCJv021y-Ra_OkOGLl3cLW1ts9LlKMSw1zUNJ8Dko_U,438529
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=9mXeS9Wc-lusHecsG1h9S9tp8RsUyMVkJQ07DoeCYjM,123814
289
+ ccxt/async_support/hyperliquid.py,sha256=fUwE__stgut3jt6-RQEWOUpOmIvch7fn7FbaZGkT8lg,123879
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=DSsWZ2nxE64-gX5E-0dZLWEvxSdJb-MBL9_GMaJnKvY,232998
296
- ccxt/async_support/kucoinfutures.py,sha256=5cRGLy4MKfD7gmA8GMZdv3697BD_I7WBgR-zOgxVXss,140158
295
+ ccxt/async_support/kucoin.py,sha256=PJZwMWLj-i6n7Enrv9P5aQUIpv74eP8bhBFHYiLTDMs,232224
296
+ ccxt/async_support/kucoinfutures.py,sha256=nFgYl7bvdmlFW8KYwD1sR6pOVDQSUMwc1hjkR3R4qVI,140215
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=Xc-lvLvb1VRCMOZefhegLOKXal_EDNo90ed7RKNC8Is,116978
@@ -305,7 +305,7 @@ ccxt/async_support/ndax.py,sha256=V157f9E_-NzmEwRxCpxN9Th_9TIlU9EJOgRYxLfss9E,11
305
305
  ccxt/async_support/novadax.py,sha256=YNKUM1CGFK7lpBwbxSSL1IAEJCRVsNxeITkwtw6VWCM,64804
306
306
  ccxt/async_support/oceanex.py,sha256=U9VJN3Sym8GEZUqkmIt8yDzVw9XRc-WtSj35R1Fdv_U,41516
307
307
  ccxt/async_support/okcoin.py,sha256=Vwbq1Sf1RiYHOehTkvIuet7vqskMyiFj4j-OTpjxRZg,151831
308
- ccxt/async_support/okx.py,sha256=S930QDVp31bL36zFBUIae_zSsVpdAtvA3wfXMXN3R54,386110
308
+ ccxt/async_support/okx.py,sha256=3rfWF5JiMNBKrParuyqXxPqvbqiBioSy0hrIjsX0v_8,386541
309
309
  ccxt/async_support/onetrading.py,sha256=FNOJlpBOGHu51EKhdFJPxNNHWPTIw_OcVzBf83UlR-w,88932
310
310
  ccxt/async_support/oxfun.py,sha256=26g7I24m8le35qcEqFVZGfiEv3sP3pOIu53724Bz5k0,125419
311
311
  ccxt/async_support/p2b.py,sha256=VKUX8u7gtHkKDwBjAyskScm2FEs6xxDuKLXE-jSHXwY,54532
@@ -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=suGGhZdu0Aol2eN6fjnnkI31kkovmjME7EWjgk7Um0w,113806
333
+ ccxt/async_support/base/exchange.py,sha256=mbWKqhoVeVSPZDytPXs2k1hUyeuvUp5ed7qKTTmMdAw,113806
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=jtcCuY-T2140yzFa5qy6bqE7H-d2iIpzORjjLz1oiDM,301861
347
+ ccxt/base/exchange.py,sha256=CiISD4Go18_dkM6qgJaABTFVappEa2MoQ4tvYzYzOeI,302410
348
348
  ccxt/base/precise.py,sha256=koce64Yrp6vFbGijJtUt-QQ6XhJgeGTCksZ871FPp_A,8886
349
349
  ccxt/base/types.py,sha256=ikIahyhQe32e8y89-wrlcuRNQvExWkbijP2YSlTH2WM,10033
350
- ccxt/pro/__init__.py,sha256=8Uoip4bZN5bo2Ie2I-clT-HfpfRO5A1zL-0mG6ZYfUM,7821
350
+ ccxt/pro/__init__.py,sha256=ct6WBOZqR3FgQUkHSJ_sMJ6JUt8pv9j0FRPagsFC6KI,7821
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
@@ -651,8 +651,8 @@ ccxt/test/tests_async.py,sha256=IOkbqZXUViJ1KtDIlE63EZaU3z31_OR2iI6yL0azKL0,8500
651
651
  ccxt/test/tests_helpers.py,sha256=z5TiaK0WyUCmM_uGTFz7cgMNqNwG_SMI9qk7yec5ces,9693
652
652
  ccxt/test/tests_init.py,sha256=GodMIrJue4KBHHqD4vSPZxokPWpxbZIuEp19UdxlFAg,1166
653
653
  ccxt/test/tests_sync.py,sha256=c9hEBBjaLRJ-rqGiR-SpVUXcFJsvrZ7mxhLKb7TJWEc,84062
654
- ccxt-4.4.20.dist-info/LICENSE.txt,sha256=EIb9221AhMHV7xF1_55STFdKTFsnJVJYkRpY2Lnvo5w,1068
655
- ccxt-4.4.20.dist-info/METADATA,sha256=L7MNu_B7etB4XNRqI6fQl3keyfcNwc5LVkbJYXoVbiw,114487
656
- ccxt-4.4.20.dist-info/WHEEL,sha256=z9j0xAa_JmUKMpmz72K0ZGALSM_n-wQVmGbleXx2VHg,110
657
- ccxt-4.4.20.dist-info/top_level.txt,sha256=CkQDuCTDKNcImPV60t36G6MdYfxsAPNiSaEwifVoVMo,5
658
- ccxt-4.4.20.dist-info/RECORD,,
654
+ ccxt-4.4.21.dist-info/LICENSE.txt,sha256=EIb9221AhMHV7xF1_55STFdKTFsnJVJYkRpY2Lnvo5w,1068
655
+ ccxt-4.4.21.dist-info/METADATA,sha256=tiJxpxtlhjKNRzU4xZLVXyXFg5UnaDlsPNIE0p3ia5U,114487
656
+ ccxt-4.4.21.dist-info/WHEEL,sha256=z9j0xAa_JmUKMpmz72K0ZGALSM_n-wQVmGbleXx2VHg,110
657
+ ccxt-4.4.21.dist-info/top_level.txt,sha256=CkQDuCTDKNcImPV60t36G6MdYfxsAPNiSaEwifVoVMo,5
658
+ ccxt-4.4.21.dist-info/RECORD,,
File without changes