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 +1 -1
- ccxt/abstract/bybit.py +1 -0
- ccxt/abstract/kucoin.py +1 -0
- ccxt/abstract/kucoinfutures.py +1 -0
- ccxt/abstract/okx.py +3 -0
- ccxt/async_support/__init__.py +1 -1
- ccxt/async_support/base/exchange.py +1 -1
- ccxt/async_support/binance.py +0 -9
- ccxt/async_support/bingx.py +5 -1
- ccxt/async_support/bybit.py +61 -3
- ccxt/async_support/htx.py +26 -2
- ccxt/async_support/hyperliquid.py +7 -6
- ccxt/async_support/kucoin.py +15 -31
- ccxt/async_support/kucoinfutures.py +2 -2
- ccxt/async_support/okx.py +9 -9
- ccxt/base/exchange.py +13 -1
- ccxt/binance.py +0 -9
- ccxt/bingx.py +5 -1
- ccxt/bybit.py +61 -3
- ccxt/htx.py +26 -2
- ccxt/hyperliquid.py +7 -6
- ccxt/kucoin.py +15 -31
- ccxt/kucoinfutures.py +2 -2
- ccxt/okx.py +9 -9
- ccxt/pro/__init__.py +1 -1
- {ccxt-4.4.20.dist-info → ccxt-4.4.21.dist-info}/METADATA +4 -4
- {ccxt-4.4.20.dist-info → ccxt-4.4.21.dist-info}/RECORD +30 -30
- {ccxt-4.4.20.dist-info → ccxt-4.4.21.dist-info}/LICENSE.txt +0 -0
- {ccxt-4.4.20.dist-info → ccxt-4.4.21.dist-info}/WHEEL +0 -0
- {ccxt-4.4.20.dist-info → ccxt-4.4.21.dist-info}/top_level.txt +0 -0
ccxt/__init__.py
CHANGED
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})
|
ccxt/abstract/kucoinfutures.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})
|
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})
|
ccxt/async_support/__init__.py
CHANGED
ccxt/async_support/binance.py
CHANGED
@@ -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
|
# {
|
ccxt/async_support/bingx.py
CHANGED
@@ -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/#/
|
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')
|
ccxt/async_support/bybit.py
CHANGED
@@ -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.
|
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':
|
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
|
-
|
642
|
+
used = self.safe_string(balance, 'hold')
|
643
643
|
account['total'] = total
|
644
|
-
account['used'] =
|
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.
|
652
|
-
'
|
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.
|
2116
|
+
size = self.safe_string(entry, 'szi')
|
2117
2117
|
side = None
|
2118
2118
|
if size is not None:
|
2119
|
-
side = 'long' if (size
|
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
|
ccxt/async_support/kucoin.py
CHANGED
@@ -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':
|
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 =
|
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.
|
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/#/
|
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.
|
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':
|
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
|
-
|
641
|
+
used = self.safe_string(balance, 'hold')
|
642
642
|
account['total'] = total
|
643
|
-
account['used'] =
|
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.
|
651
|
-
'
|
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.
|
2115
|
+
size = self.safe_string(entry, 'szi')
|
2116
2116
|
side = None
|
2117
2117
|
if size is not None:
|
2118
|
-
side = 'long' if (size
|
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':
|
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 =
|
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
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: ccxt
|
3
|
-
Version: 4.4.
|
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.
|
275
|
-
* unpkg: https://unpkg.com/ccxt@4.4.
|
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.
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
76
|
-
ccxt/kucoinfutures.py,sha256=
|
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=
|
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=
|
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=
|
185
|
-
ccxt/abstract/kucoinfutures.py,sha256=
|
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
|
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=
|
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=
|
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
|
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=
|
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=
|
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=
|
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=
|
296
|
-
ccxt/async_support/kucoinfutures.py,sha256=
|
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=
|
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=
|
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=
|
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=
|
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.
|
655
|
-
ccxt-4.4.
|
656
|
-
ccxt-4.4.
|
657
|
-
ccxt-4.4.
|
658
|
-
ccxt-4.4.
|
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
|
File without changes
|
File without changes
|