ccxt 4.3.23__py2.py3-none-any.whl → 4.3.24__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.

Potentially problematic release.


This version of ccxt might be problematic. Click here for more details.

ccxt/__init__.py CHANGED
@@ -22,7 +22,7 @@
22
22
 
23
23
  # ----------------------------------------------------------------------------
24
24
 
25
- __version__ = '4.3.23'
25
+ __version__ = '4.3.24'
26
26
 
27
27
  # ----------------------------------------------------------------------------
28
28
 
@@ -119,8 +119,9 @@ from ccxt.btcturk import btcturk # noqa: F4
119
119
  from ccxt.bybit import bybit # noqa: F401
120
120
  from ccxt.cex import cex # noqa: F401
121
121
  from ccxt.coinbase import coinbase # noqa: F401
122
+ from ccxt.coinbaseadvanced import coinbaseadvanced # noqa: F401
123
+ from ccxt.coinbaseexchange import coinbaseexchange # noqa: F401
122
124
  from ccxt.coinbaseinternational import coinbaseinternational # noqa: F401
123
- from ccxt.coinbasepro import coinbasepro # noqa: F401
124
125
  from ccxt.coincheck import coincheck # noqa: F401
125
126
  from ccxt.coinex import coinex # noqa: F401
126
127
  from ccxt.coinlist import coinlist # noqa: F401
@@ -225,8 +226,9 @@ exchanges = [
225
226
  'bybit',
226
227
  'cex',
227
228
  'coinbase',
229
+ 'coinbaseadvanced',
230
+ 'coinbaseexchange',
228
231
  'coinbaseinternational',
229
- 'coinbasepro',
230
232
  'coincheck',
231
233
  'coinex',
232
234
  'coinlist',
@@ -0,0 +1,94 @@
1
+ from ccxt.base.types import Entry
2
+
3
+
4
+ class ImplicitAPI:
5
+ v2_public_get_currencies = v2PublicGetCurrencies = Entry('currencies', ['v2', 'public'], 'GET', {'cost': 10.6})
6
+ v2_public_get_currencies_crypto = v2PublicGetCurrenciesCrypto = Entry('currencies/crypto', ['v2', 'public'], 'GET', {'cost': 10.6})
7
+ v2_public_get_time = v2PublicGetTime = Entry('time', ['v2', 'public'], 'GET', {'cost': 10.6})
8
+ v2_public_get_exchange_rates = v2PublicGetExchangeRates = Entry('exchange-rates', ['v2', 'public'], 'GET', {'cost': 10.6})
9
+ v2_public_get_users_user_id = v2PublicGetUsersUserId = Entry('users/{user_id}', ['v2', 'public'], 'GET', {'cost': 10.6})
10
+ v2_public_get_prices_symbol_buy = v2PublicGetPricesSymbolBuy = Entry('prices/{symbol}/buy', ['v2', 'public'], 'GET', {'cost': 10.6})
11
+ v2_public_get_prices_symbol_sell = v2PublicGetPricesSymbolSell = Entry('prices/{symbol}/sell', ['v2', 'public'], 'GET', {'cost': 10.6})
12
+ v2_public_get_prices_symbol_spot = v2PublicGetPricesSymbolSpot = Entry('prices/{symbol}/spot', ['v2', 'public'], 'GET', {'cost': 10.6})
13
+ v2_private_get_accounts = v2PrivateGetAccounts = Entry('accounts', ['v2', 'private'], 'GET', {'cost': 10.6})
14
+ v2_private_get_accounts_account_id = v2PrivateGetAccountsAccountId = Entry('accounts/{account_id}', ['v2', 'private'], 'GET', {'cost': 10.6})
15
+ v2_private_get_accounts_account_id_addresses = v2PrivateGetAccountsAccountIdAddresses = Entry('accounts/{account_id}/addresses', ['v2', 'private'], 'GET', {'cost': 10.6})
16
+ v2_private_get_accounts_account_id_addresses_address_id = v2PrivateGetAccountsAccountIdAddressesAddressId = Entry('accounts/{account_id}/addresses/{address_id}', ['v2', 'private'], 'GET', {'cost': 10.6})
17
+ v2_private_get_accounts_account_id_addresses_address_id_transactions = v2PrivateGetAccountsAccountIdAddressesAddressIdTransactions = Entry('accounts/{account_id}/addresses/{address_id}/transactions', ['v2', 'private'], 'GET', {'cost': 10.6})
18
+ v2_private_get_accounts_account_id_transactions = v2PrivateGetAccountsAccountIdTransactions = Entry('accounts/{account_id}/transactions', ['v2', 'private'], 'GET', {'cost': 10.6})
19
+ v2_private_get_accounts_account_id_transactions_transaction_id = v2PrivateGetAccountsAccountIdTransactionsTransactionId = Entry('accounts/{account_id}/transactions/{transaction_id}', ['v2', 'private'], 'GET', {'cost': 10.6})
20
+ v2_private_get_accounts_account_id_buys = v2PrivateGetAccountsAccountIdBuys = Entry('accounts/{account_id}/buys', ['v2', 'private'], 'GET', {'cost': 10.6})
21
+ v2_private_get_accounts_account_id_buys_buy_id = v2PrivateGetAccountsAccountIdBuysBuyId = Entry('accounts/{account_id}/buys/{buy_id}', ['v2', 'private'], 'GET', {'cost': 10.6})
22
+ v2_private_get_accounts_account_id_sells = v2PrivateGetAccountsAccountIdSells = Entry('accounts/{account_id}/sells', ['v2', 'private'], 'GET', {'cost': 10.6})
23
+ v2_private_get_accounts_account_id_sells_sell_id = v2PrivateGetAccountsAccountIdSellsSellId = Entry('accounts/{account_id}/sells/{sell_id}', ['v2', 'private'], 'GET', {'cost': 10.6})
24
+ v2_private_get_accounts_account_id_deposits = v2PrivateGetAccountsAccountIdDeposits = Entry('accounts/{account_id}/deposits', ['v2', 'private'], 'GET', {'cost': 10.6})
25
+ v2_private_get_accounts_account_id_deposits_deposit_id = v2PrivateGetAccountsAccountIdDepositsDepositId = Entry('accounts/{account_id}/deposits/{deposit_id}', ['v2', 'private'], 'GET', {'cost': 10.6})
26
+ v2_private_get_accounts_account_id_withdrawals = v2PrivateGetAccountsAccountIdWithdrawals = Entry('accounts/{account_id}/withdrawals', ['v2', 'private'], 'GET', {'cost': 10.6})
27
+ v2_private_get_accounts_account_id_withdrawals_withdrawal_id = v2PrivateGetAccountsAccountIdWithdrawalsWithdrawalId = Entry('accounts/{account_id}/withdrawals/{withdrawal_id}', ['v2', 'private'], 'GET', {'cost': 10.6})
28
+ v2_private_get_payment_methods = v2PrivateGetPaymentMethods = Entry('payment-methods', ['v2', 'private'], 'GET', {'cost': 10.6})
29
+ v2_private_get_payment_methods_payment_method_id = v2PrivateGetPaymentMethodsPaymentMethodId = Entry('payment-methods/{payment_method_id}', ['v2', 'private'], 'GET', {'cost': 10.6})
30
+ v2_private_get_user = v2PrivateGetUser = Entry('user', ['v2', 'private'], 'GET', {'cost': 10.6})
31
+ v2_private_get_user_auth = v2PrivateGetUserAuth = Entry('user/auth', ['v2', 'private'], 'GET', {'cost': 10.6})
32
+ v2_private_post_accounts = v2PrivatePostAccounts = Entry('accounts', ['v2', 'private'], 'POST', {'cost': 10.6})
33
+ v2_private_post_accounts_account_id_primary = v2PrivatePostAccountsAccountIdPrimary = Entry('accounts/{account_id}/primary', ['v2', 'private'], 'POST', {'cost': 10.6})
34
+ v2_private_post_accounts_account_id_addresses = v2PrivatePostAccountsAccountIdAddresses = Entry('accounts/{account_id}/addresses', ['v2', 'private'], 'POST', {'cost': 10.6})
35
+ v2_private_post_accounts_account_id_transactions = v2PrivatePostAccountsAccountIdTransactions = Entry('accounts/{account_id}/transactions', ['v2', 'private'], 'POST', {'cost': 10.6})
36
+ v2_private_post_accounts_account_id_transactions_transaction_id_complete = v2PrivatePostAccountsAccountIdTransactionsTransactionIdComplete = Entry('accounts/{account_id}/transactions/{transaction_id}/complete', ['v2', 'private'], 'POST', {'cost': 10.6})
37
+ v2_private_post_accounts_account_id_transactions_transaction_id_resend = v2PrivatePostAccountsAccountIdTransactionsTransactionIdResend = Entry('accounts/{account_id}/transactions/{transaction_id}/resend', ['v2', 'private'], 'POST', {'cost': 10.6})
38
+ v2_private_post_accounts_account_id_buys = v2PrivatePostAccountsAccountIdBuys = Entry('accounts/{account_id}/buys', ['v2', 'private'], 'POST', {'cost': 10.6})
39
+ v2_private_post_accounts_account_id_buys_buy_id_commit = v2PrivatePostAccountsAccountIdBuysBuyIdCommit = Entry('accounts/{account_id}/buys/{buy_id}/commit', ['v2', 'private'], 'POST', {'cost': 10.6})
40
+ v2_private_post_accounts_account_id_sells = v2PrivatePostAccountsAccountIdSells = Entry('accounts/{account_id}/sells', ['v2', 'private'], 'POST', {'cost': 10.6})
41
+ v2_private_post_accounts_account_id_sells_sell_id_commit = v2PrivatePostAccountsAccountIdSellsSellIdCommit = Entry('accounts/{account_id}/sells/{sell_id}/commit', ['v2', 'private'], 'POST', {'cost': 10.6})
42
+ v2_private_post_accounts_account_id_deposits = v2PrivatePostAccountsAccountIdDeposits = Entry('accounts/{account_id}/deposits', ['v2', 'private'], 'POST', {'cost': 10.6})
43
+ v2_private_post_accounts_account_id_deposits_deposit_id_commit = v2PrivatePostAccountsAccountIdDepositsDepositIdCommit = Entry('accounts/{account_id}/deposits/{deposit_id}/commit', ['v2', 'private'], 'POST', {'cost': 10.6})
44
+ v2_private_post_accounts_account_id_withdrawals = v2PrivatePostAccountsAccountIdWithdrawals = Entry('accounts/{account_id}/withdrawals', ['v2', 'private'], 'POST', {'cost': 10.6})
45
+ v2_private_post_accounts_account_id_withdrawals_withdrawal_id_commit = v2PrivatePostAccountsAccountIdWithdrawalsWithdrawalIdCommit = Entry('accounts/{account_id}/withdrawals/{withdrawal_id}/commit', ['v2', 'private'], 'POST', {'cost': 10.6})
46
+ v2_private_put_accounts_account_id = v2PrivatePutAccountsAccountId = Entry('accounts/{account_id}', ['v2', 'private'], 'PUT', {'cost': 10.6})
47
+ v2_private_put_user = v2PrivatePutUser = Entry('user', ['v2', 'private'], 'PUT', {'cost': 10.6})
48
+ v2_private_delete_accounts_id = v2PrivateDeleteAccountsId = Entry('accounts/{id}', ['v2', 'private'], 'DELETE', {'cost': 10.6})
49
+ v2_private_delete_accounts_account_id_transactions_transaction_id = v2PrivateDeleteAccountsAccountIdTransactionsTransactionId = Entry('accounts/{account_id}/transactions/{transaction_id}', ['v2', 'private'], 'DELETE', {'cost': 10.6})
50
+ v3_public_get_brokerage_time = v3PublicGetBrokerageTime = Entry('brokerage/time', ['v3', 'public'], 'GET', {'cost': 3})
51
+ v3_public_get_brokerage_market_product_book = v3PublicGetBrokerageMarketProductBook = Entry('brokerage/market/product_book', ['v3', 'public'], 'GET', {'cost': 3})
52
+ v3_public_get_brokerage_market_products = v3PublicGetBrokerageMarketProducts = Entry('brokerage/market/products', ['v3', 'public'], 'GET', {'cost': 3})
53
+ v3_public_get_brokerage_market_products_product_id = v3PublicGetBrokerageMarketProductsProductId = Entry('brokerage/market/products/{product_id}', ['v3', 'public'], 'GET', {'cost': 3})
54
+ v3_public_get_brokerage_market_products_product_id_candles = v3PublicGetBrokerageMarketProductsProductIdCandles = Entry('brokerage/market/products/{product_id}/candles', ['v3', 'public'], 'GET', {'cost': 3})
55
+ v3_public_get_brokerage_market_products_product_id_ticker = v3PublicGetBrokerageMarketProductsProductIdTicker = Entry('brokerage/market/products/{product_id}/ticker', ['v3', 'public'], 'GET', {'cost': 3})
56
+ v3_private_get_brokerage_accounts = v3PrivateGetBrokerageAccounts = Entry('brokerage/accounts', ['v3', 'private'], 'GET', {'cost': 1})
57
+ v3_private_get_brokerage_accounts_account_uuid = v3PrivateGetBrokerageAccountsAccountUuid = Entry('brokerage/accounts/{account_uuid}', ['v3', 'private'], 'GET', {'cost': 1})
58
+ v3_private_get_brokerage_orders_historical_batch = v3PrivateGetBrokerageOrdersHistoricalBatch = Entry('brokerage/orders/historical/batch', ['v3', 'private'], 'GET', {'cost': 1})
59
+ v3_private_get_brokerage_orders_historical_fills = v3PrivateGetBrokerageOrdersHistoricalFills = Entry('brokerage/orders/historical/fills', ['v3', 'private'], 'GET', {'cost': 1})
60
+ v3_private_get_brokerage_orders_historical_order_id = v3PrivateGetBrokerageOrdersHistoricalOrderId = Entry('brokerage/orders/historical/{order_id}', ['v3', 'private'], 'GET', {'cost': 1})
61
+ v3_private_get_brokerage_products = v3PrivateGetBrokerageProducts = Entry('brokerage/products', ['v3', 'private'], 'GET', {'cost': 3})
62
+ v3_private_get_brokerage_products_product_id = v3PrivateGetBrokerageProductsProductId = Entry('brokerage/products/{product_id}', ['v3', 'private'], 'GET', {'cost': 3})
63
+ v3_private_get_brokerage_products_product_id_candles = v3PrivateGetBrokerageProductsProductIdCandles = Entry('brokerage/products/{product_id}/candles', ['v3', 'private'], 'GET', {'cost': 3})
64
+ v3_private_get_brokerage_products_product_id_ticker = v3PrivateGetBrokerageProductsProductIdTicker = Entry('brokerage/products/{product_id}/ticker', ['v3', 'private'], 'GET', {'cost': 3})
65
+ v3_private_get_brokerage_best_bid_ask = v3PrivateGetBrokerageBestBidAsk = Entry('brokerage/best_bid_ask', ['v3', 'private'], 'GET', {'cost': 3})
66
+ v3_private_get_brokerage_product_book = v3PrivateGetBrokerageProductBook = Entry('brokerage/product_book', ['v3', 'private'], 'GET', {'cost': 3})
67
+ v3_private_get_brokerage_transaction_summary = v3PrivateGetBrokerageTransactionSummary = Entry('brokerage/transaction_summary', ['v3', 'private'], 'GET', {'cost': 3})
68
+ v3_private_get_brokerage_portfolios = v3PrivateGetBrokeragePortfolios = Entry('brokerage/portfolios', ['v3', 'private'], 'GET', {'cost': 1})
69
+ v3_private_get_brokerage_portfolios_portfolio_uuid = v3PrivateGetBrokeragePortfoliosPortfolioUuid = Entry('brokerage/portfolios/{portfolio_uuid}', ['v3', 'private'], 'GET', {'cost': 1})
70
+ v3_private_get_brokerage_convert_trade_trade_id = v3PrivateGetBrokerageConvertTradeTradeId = Entry('brokerage/convert/trade/{trade_id}', ['v3', 'private'], 'GET', {'cost': 1})
71
+ v3_private_get_brokerage_cfm_balance_summary = v3PrivateGetBrokerageCfmBalanceSummary = Entry('brokerage/cfm/balance_summary', ['v3', 'private'], 'GET', {'cost': 1})
72
+ v3_private_get_brokerage_cfm_positions = v3PrivateGetBrokerageCfmPositions = Entry('brokerage/cfm/positions', ['v3', 'private'], 'GET', {'cost': 1})
73
+ v3_private_get_brokerage_cfm_positions_product_id = v3PrivateGetBrokerageCfmPositionsProductId = Entry('brokerage/cfm/positions/{product_id}', ['v3', 'private'], 'GET', {'cost': 1})
74
+ v3_private_get_brokerage_cfm_sweeps = v3PrivateGetBrokerageCfmSweeps = Entry('brokerage/cfm/sweeps', ['v3', 'private'], 'GET', {'cost': 1})
75
+ v3_private_get_brokerage_intx_portfolio_portfolio_uuid = v3PrivateGetBrokerageIntxPortfolioPortfolioUuid = Entry('brokerage/intx/portfolio/{portfolio_uuid}', ['v3', 'private'], 'GET', {'cost': 1})
76
+ v3_private_get_brokerage_intx_positions_portfolio_uuid = v3PrivateGetBrokerageIntxPositionsPortfolioUuid = Entry('brokerage/intx/positions/{portfolio_uuid}', ['v3', 'private'], 'GET', {'cost': 1})
77
+ v3_private_get_brokerage_intx_positions_portfolio_uuid_symbol = v3PrivateGetBrokerageIntxPositionsPortfolioUuidSymbol = Entry('brokerage/intx/positions/{portfolio_uuid}/{symbol}', ['v3', 'private'], 'GET', {'cost': 1})
78
+ v3_private_get_brokerage_payment_methods = v3PrivateGetBrokeragePaymentMethods = Entry('brokerage/payment_methods', ['v3', 'private'], 'GET', {'cost': 1})
79
+ v3_private_get_brokerage_payment_methods_payment_method_id = v3PrivateGetBrokeragePaymentMethodsPaymentMethodId = Entry('brokerage/payment_methods/{payment_method_id}', ['v3', 'private'], 'GET', {'cost': 1})
80
+ v3_private_post_brokerage_orders = v3PrivatePostBrokerageOrders = Entry('brokerage/orders', ['v3', 'private'], 'POST', {'cost': 1})
81
+ v3_private_post_brokerage_orders_batch_cancel = v3PrivatePostBrokerageOrdersBatchCancel = Entry('brokerage/orders/batch_cancel', ['v3', 'private'], 'POST', {'cost': 1})
82
+ v3_private_post_brokerage_orders_edit = v3PrivatePostBrokerageOrdersEdit = Entry('brokerage/orders/edit', ['v3', 'private'], 'POST', {'cost': 1})
83
+ v3_private_post_brokerage_orders_edit_preview = v3PrivatePostBrokerageOrdersEditPreview = Entry('brokerage/orders/edit_preview', ['v3', 'private'], 'POST', {'cost': 1})
84
+ v3_private_post_brokerage_orders_preview = v3PrivatePostBrokerageOrdersPreview = Entry('brokerage/orders/preview', ['v3', 'private'], 'POST', {'cost': 1})
85
+ v3_private_post_brokerage_portfolios = v3PrivatePostBrokeragePortfolios = Entry('brokerage/portfolios', ['v3', 'private'], 'POST', {'cost': 1})
86
+ v3_private_post_brokerage_portfolios_move_funds = v3PrivatePostBrokeragePortfoliosMoveFunds = Entry('brokerage/portfolios/move_funds', ['v3', 'private'], 'POST', {'cost': 1})
87
+ v3_private_post_brokerage_convert_quote = v3PrivatePostBrokerageConvertQuote = Entry('brokerage/convert/quote', ['v3', 'private'], 'POST', {'cost': 1})
88
+ v3_private_post_brokerage_convert_trade_trade_id = v3PrivatePostBrokerageConvertTradeTradeId = Entry('brokerage/convert/trade/{trade_id}', ['v3', 'private'], 'POST', {'cost': 1})
89
+ v3_private_post_brokerage_cfm_sweeps_schedule = v3PrivatePostBrokerageCfmSweepsSchedule = Entry('brokerage/cfm/sweeps/schedule', ['v3', 'private'], 'POST', {'cost': 1})
90
+ v3_private_post_brokerage_intx_allocate = v3PrivatePostBrokerageIntxAllocate = Entry('brokerage/intx/allocate', ['v3', 'private'], 'POST', {'cost': 1})
91
+ v3_private_post_brokerage_orders_close_position = v3PrivatePostBrokerageOrdersClosePosition = Entry('brokerage/orders/close_position', ['v3', 'private'], 'POST', {'cost': 1})
92
+ v3_private_put_brokerage_portfolios_portfolio_uuid = v3PrivatePutBrokeragePortfoliosPortfolioUuid = Entry('brokerage/portfolios/{portfolio_uuid}', ['v3', 'private'], 'PUT', {'cost': 1})
93
+ v3_private_delete_brokerage_portfolios_portfolio_uuid = v3PrivateDeleteBrokeragePortfoliosPortfolioUuid = Entry('brokerage/portfolios/{portfolio_uuid}', ['v3', 'private'], 'DELETE', {'cost': 1})
94
+ v3_private_delete_brokerage_cfm_sweeps = v3PrivateDeleteBrokerageCfmSweeps = Entry('brokerage/cfm/sweeps', ['v3', 'private'], 'DELETE', {'cost': 1})
@@ -4,7 +4,7 @@
4
4
 
5
5
  # -----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.3.23'
7
+ __version__ = '4.3.24'
8
8
 
9
9
  # -----------------------------------------------------------------------------
10
10
 
@@ -99,8 +99,9 @@ from ccxt.async_support.btcturk import btcturk
99
99
  from ccxt.async_support.bybit import bybit # noqa: F401
100
100
  from ccxt.async_support.cex import cex # noqa: F401
101
101
  from ccxt.async_support.coinbase import coinbase # noqa: F401
102
+ from ccxt.async_support.coinbaseadvanced import coinbaseadvanced # noqa: F401
103
+ from ccxt.async_support.coinbaseexchange import coinbaseexchange # noqa: F401
102
104
  from ccxt.async_support.coinbaseinternational import coinbaseinternational # noqa: F401
103
- from ccxt.async_support.coinbasepro import coinbasepro # noqa: F401
104
105
  from ccxt.async_support.coincheck import coincheck # noqa: F401
105
106
  from ccxt.async_support.coinex import coinex # noqa: F401
106
107
  from ccxt.async_support.coinlist import coinlist # noqa: F401
@@ -205,8 +206,9 @@ exchanges = [
205
206
  'bybit',
206
207
  'cex',
207
208
  'coinbase',
209
+ 'coinbaseadvanced',
210
+ 'coinbaseexchange',
208
211
  'coinbaseinternational',
209
- 'coinbasepro',
210
212
  'coincheck',
211
213
  'coinex',
212
214
  'coinlist',
@@ -2,7 +2,7 @@
2
2
 
3
3
  # -----------------------------------------------------------------------------
4
4
 
5
- __version__ = '4.3.23'
5
+ __version__ = '4.3.24'
6
6
 
7
7
  # -----------------------------------------------------------------------------
8
8
 
@@ -1848,8 +1848,9 @@ class Exchange(BaseExchange):
1848
1848
  errors = 0
1849
1849
  responseLength = len(response)
1850
1850
  if self.verbose:
1851
- iteration = (i + str(1))
1852
- cursorMessage = 'Cursor pagination call ' + iteration + ' method ' + method + ' response length ' + str(responseLength) + ' cursor ' + cursorValue
1851
+ cursorString = '' if (cursorValue is None) else cursorValue
1852
+ iteration = (i + 1)
1853
+ cursorMessage = 'Cursor pagination call ' + str(iteration) + ' method ' + method + ' response length ' + str(responseLength) + ' cursor ' + cursorString
1853
1854
  self.log(cursorMessage)
1854
1855
  if responseLength == 0:
1855
1856
  break
@@ -2933,6 +2933,10 @@ class bitrue(Exchange, ImplicitAPI):
2933
2933
  signPath = signPath + '/' + version + '/' + path
2934
2934
  signMessage = timestamp + method + signPath
2935
2935
  if method == 'GET':
2936
+ keys = list(params.keys())
2937
+ keysLength = len(keys)
2938
+ if keysLength > 0:
2939
+ signMessage += '?' + self.urlencode(params)
2936
2940
  signature = self.hmac(self.encode(signMessage), self.encode(self.secret), hashlib.sha256)
2937
2941
  headers = {
2938
2942
  'X-CH-APIKEY': self.apiKey,
@@ -2945,7 +2949,7 @@ class bitrue(Exchange, ImplicitAPI):
2945
2949
  'recvWindow': recvWindow,
2946
2950
  }, params)
2947
2951
  body = self.json(query)
2948
- signMessage = signMessage + json.dumps(body)
2952
+ signMessage += body
2949
2953
  signature = self.hmac(self.encode(signMessage), self.encode(self.secret), hashlib.sha256)
2950
2954
  headers = {
2951
2955
  'Content-Type': 'application/json',
@@ -0,0 +1,17 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ # PLEASE DO NOT EDIT THIS FILE, IT IS GENERATED AND WILL BE OVERWRITTEN:
4
+ # https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#how-to-contribute-code
5
+
6
+ from ccxt.async_support.coinbase import coinbase
7
+ from ccxt.abstract.coinbaseadvanced import ImplicitAPI
8
+
9
+
10
+ class coinbaseadvanced(coinbase, ImplicitAPI):
11
+
12
+ def describe(self):
13
+ return self.deep_extend(super(coinbaseadvanced, self).describe(), {
14
+ 'id': 'coinbaseadvanced',
15
+ 'name': 'Coinbase Advanced',
16
+ 'alias': True,
17
+ })
@@ -4,7 +4,7 @@
4
4
  # https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#how-to-contribute-code
5
5
 
6
6
  from ccxt.async_support.base.exchange import Exchange
7
- from ccxt.abstract.coinbasepro import ImplicitAPI
7
+ from ccxt.abstract.coinbaseexchange import ImplicitAPI
8
8
  import hashlib
9
9
  from ccxt.base.types import Account, Balances, Currencies, Currency, Int, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, TradingFees, Transaction
10
10
  from typing import List
@@ -22,12 +22,12 @@ from ccxt.base.decimal_to_precision import TICK_SIZE
22
22
  from ccxt.base.precise import Precise
23
23
 
24
24
 
25
- class coinbasepro(Exchange, ImplicitAPI):
25
+ class coinbaseexchange(Exchange, ImplicitAPI):
26
26
 
27
27
  def describe(self):
28
- return self.deep_extend(super(coinbasepro, self).describe(), {
29
- 'id': 'coinbasepro',
30
- 'name': 'Coinbase Pro(Deprecated)',
28
+ return self.deep_extend(super(coinbaseexchange, self).describe(), {
29
+ 'id': 'coinbaseexchange',
30
+ 'name': 'Coinbase Exchange',
31
31
  'countries': ['US'],
32
32
  'rateLimit': 100,
33
33
  'userAgent': self.userAgents['chrome'],
@@ -89,19 +89,19 @@ class coinbasepro(Exchange, ImplicitAPI):
89
89
  '6h': 21600,
90
90
  '1d': 86400,
91
91
  },
92
- 'hostname': 'pro.coinbase.com',
92
+ 'hostname': 'exchange.coinbase.com',
93
93
  'urls': {
94
94
  'test': {
95
- 'public': 'https://api-public.sandbox.pro.coinbase.com',
96
- 'private': 'https://api-public.sandbox.pro.coinbase.com',
95
+ 'public': 'https://api-public.sandbox.exchange.coinbase.com',
96
+ 'private': 'https://api-public.sandbox.exchange.coinbase.com',
97
97
  },
98
- 'logo': 'https://user-images.githubusercontent.com/1294454/41764625-63b7ffde-760a-11e8-996d-a6328fa9347a.jpg',
98
+ 'logo': 'https://github.com/ccxt/ccxt/assets/43336371/34a65553-88aa-4a38-a714-064bd228b97e',
99
99
  'api': {
100
100
  'public': 'https://api.{hostname}',
101
101
  'private': 'https://api.{hostname}',
102
102
  },
103
- 'www': 'https://pro.coinbase.com/',
104
- 'doc': 'https://docs.pro.coinbase.com',
103
+ 'www': 'https://coinbase.com/',
104
+ 'doc': 'https://docs.cloud.coinbase.com/exchange/docs/',
105
105
  'fees': [
106
106
  'https://docs.pro.coinbase.com/#fees',
107
107
  'https://support.pro.coinbase.com/customer/en/portal/articles/2945310-fees',
@@ -315,7 +315,7 @@ class coinbasepro(Exchange, ImplicitAPI):
315
315
 
316
316
  async def fetch_markets(self, params={}) -> List[Market]:
317
317
  """
318
- retrieves data on all markets for coinbasepro
318
+ retrieves data on all markets for coinbaseexchange
319
319
  :see: https://docs.cloud.coinbase.com/exchange/reference/exchangerestapi_getproducts
320
320
  :param dict [params]: extra parameters specific to the exchange API endpoint
321
321
  :returns dict[]: an array of objects representing market data
@@ -1047,7 +1047,7 @@ class coinbasepro(Exchange, ImplicitAPI):
1047
1047
  """
1048
1048
  :see: https://docs.cloud.coinbase.com/exchange/reference/exchangerestapi_getorder
1049
1049
  fetches information on an order made by the user
1050
- :param str symbol: not used by coinbasepro fetchOrder
1050
+ :param str symbol: not used by coinbaseexchange fetchOrder
1051
1051
  :param dict [params]: extra parameters specific to the exchange API endpoint
1052
1052
  :returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
1053
1053
  """
@@ -459,7 +459,9 @@ class coinex(Exchange, ImplicitAPI):
459
459
  'fillResponseFromRequest': True,
460
460
  },
461
461
  'accountsById': {
462
- 'spot': '0',
462
+ 'spot': 'SPOT',
463
+ 'margin': 'MARGIN',
464
+ 'swap': 'FUTURES',
463
465
  },
464
466
  'networks': {
465
467
  'BEP20': 'BSC',
@@ -3454,7 +3456,10 @@ class coinex(Exchange, ImplicitAPI):
3454
3456
  :param str [params.marginMode]: 'cross' or 'isolated' for fetching spot margin orders
3455
3457
  :returns Order[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
3456
3458
  """
3457
- return await self.fetch_orders_by_status('pending', symbol, since, limit, params)
3459
+ openOrders = await self.fetch_orders_by_status('pending', symbol, since, limit, params)
3460
+ for i in range(0, len(openOrders)):
3461
+ openOrders[i]['status'] = 'open'
3462
+ return openOrders
3458
3463
 
3459
3464
  async def fetch_closed_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
3460
3465
  """
@@ -4599,40 +4604,42 @@ class coinex(Exchange, ImplicitAPI):
4599
4604
  async def transfer(self, code: str, amount: float, fromAccount: str, toAccount: str, params={}) -> TransferEntry:
4600
4605
  """
4601
4606
  transfer currency internally between wallets on the same account
4602
- :see: https://viabtc.github.io/coinex_api_en_doc/spot/#docsspot002_account014_balance_contract_transfer
4603
- :see: https://viabtc.github.io/coinex_api_en_doc/spot/#docsspot002_account013_margin_transfer
4607
+ :see: https://docs.coinex.com/api/v2/assets/transfer/http/transfer
4604
4608
  :param str code: unified currency code
4605
4609
  :param float amount: amount to transfer
4606
4610
  :param str fromAccount: account to transfer from
4607
4611
  :param str toAccount: account to transfer to
4608
4612
  :param dict [params]: extra parameters specific to the exchange API endpoint
4613
+ :param str [params.symbol]: unified ccxt symbol, required when either the fromAccount or toAccount is margin
4609
4614
  :returns dict: a `transfer structure <https://docs.ccxt.com/#/?id=transfer-structure>`
4610
4615
  """
4611
4616
  await self.load_markets()
4612
4617
  currency = self.currency(code)
4613
4618
  amountToPrecision = self.currency_to_precision(code, amount)
4619
+ accountsById = self.safe_dict(self.options, 'accountsById', {})
4620
+ fromId = self.safe_string(accountsById, fromAccount, fromAccount)
4621
+ toId = self.safe_string(accountsById, toAccount, toAccount)
4614
4622
  request = {
4623
+ 'ccy': currency['id'],
4615
4624
  'amount': amountToPrecision,
4616
- 'coin_type': currency['id'],
4625
+ 'from_account_type': fromId,
4626
+ 'to_account_type': toId,
4617
4627
  }
4618
- response = None
4619
- if (fromAccount == 'spot') and (toAccount == 'swap'):
4620
- request['transfer_side'] = 'in' # 'in' spot to swap, 'out' swap to spot
4621
- response = await self.v1PrivatePostContractBalanceTransfer(self.extend(request, params))
4622
- elif (fromAccount == 'swap') and (toAccount == 'spot'):
4623
- request['transfer_side'] = 'out' # 'in' spot to swap, 'out' swap to spot
4624
- response = await self.v1PrivatePostContractBalanceTransfer(self.extend(request, params))
4625
- else:
4626
- accountsById = self.safe_value(self.options, 'accountsById', {})
4627
- fromId = self.safe_string(accountsById, fromAccount, fromAccount)
4628
- toId = self.safe_string(accountsById, toAccount, toAccount)
4629
- # fromAccount and toAccount must be integers for margin transfers
4630
- # spot is 0, use fetchBalance() to find the margin account id
4631
- request['from_account'] = int(fromId)
4632
- request['to_account'] = int(toId)
4633
- response = await self.v1PrivatePostMarginTransfer(self.extend(request, params))
4628
+ if (fromAccount == 'margin') or (toAccount == 'margin'):
4629
+ symbol = self.safe_string(params, 'symbol')
4630
+ if symbol is None:
4631
+ raise ArgumentsRequired(self.id + ' transfer() the symbol parameter must be defined for a margin account')
4632
+ params = self.omit(params, 'symbol')
4633
+ request['market'] = self.market_id(symbol)
4634
+ if (fromAccount != 'spot') and (toAccount != 'spot'):
4635
+ raise BadRequest(self.id + ' transfer() can only be between spot and swap, or spot and margin, either the fromAccount or toAccount must be spot')
4636
+ response = await self.v2PrivatePostAssetsTransfer(self.extend(request, params))
4634
4637
  #
4635
- # {"code": 0, "data": null, "message": "Success"}
4638
+ # {
4639
+ # "code": 0,
4640
+ # "data": {},
4641
+ # "message": "OK"
4642
+ # }
4636
4643
  #
4637
4644
  return self.extend(self.parse_transfer(response, currency), {
4638
4645
  'amount': self.parse_number(amountToPrecision),
@@ -4640,67 +4647,28 @@ class coinex(Exchange, ImplicitAPI):
4640
4647
  'toAccount': toAccount,
4641
4648
  })
4642
4649
 
4643
- def parse_transfer_status(self, status: Str) -> Str:
4650
+ def parse_transfer_status(self, status):
4644
4651
  statuses = {
4645
4652
  '0': 'ok',
4646
4653
  'SUCCESS': 'ok',
4654
+ 'OK': 'ok',
4647
4655
  }
4648
4656
  return self.safe_string(statuses, status, status)
4649
4657
 
4650
4658
  def parse_transfer(self, transfer: dict, currency: Currency = None) -> TransferEntry:
4651
- #
4652
- # fetchTransfers Swap
4653
- #
4654
- # {
4655
- # "amount": "10",
4656
- # "asset": "USDT",
4657
- # "transfer_type": "transfer_out", # from swap to spot
4658
- # "created_at": 1651633422
4659
- # },
4660
- #
4661
- # fetchTransfers Margin
4662
- #
4663
- # {
4664
- # "id": 7580062,
4665
- # "updated_at": 1653684379,
4666
- # "user_id": 3620173,
4667
- # "from_account_id": 0,
4668
- # "to_account_id": 1,
4669
- # "asset": "BTC",
4670
- # "amount": "0.00160829",
4671
- # "balance": "0.00160829",
4672
- # "transfer_type": "IN",
4673
- # "status": "SUCCESS",
4674
- # "created_at": 1653684379
4675
- # },
4676
- #
4677
- timestamp = self.safe_timestamp(transfer, 'created_at')
4678
- transferType = self.safe_string(transfer, 'transfer_type')
4679
- fromAccount = None
4680
- toAccount = None
4681
- if transferType == 'transfer_out':
4682
- fromAccount = 'swap'
4683
- toAccount = 'spot'
4684
- elif transferType == 'transfer_in':
4685
- fromAccount = 'spot'
4686
- toAccount = 'swap'
4687
- elif transferType == 'IN':
4688
- fromAccount = 'spot'
4689
- toAccount = 'margin'
4690
- elif transferType == 'OUT':
4691
- fromAccount = 'margin'
4692
- toAccount = 'spot'
4693
- currencyId = self.safe_string(transfer, 'asset')
4694
- currencyCode = self.safe_currency_code(currencyId, currency)
4659
+ timestamp = self.safe_integer(transfer, 'created_at')
4660
+ currencyId = self.safe_string(transfer, 'ccy')
4661
+ fromId = self.safe_string(transfer, 'from_account_type')
4662
+ toId = self.safe_string(transfer, 'to_account_type')
4663
+ accountsById = self.safe_value(self.options, 'accountsById', {})
4695
4664
  return {
4696
- 'info': transfer,
4697
- 'id': self.safe_string(transfer, 'id'),
4665
+ 'id': None,
4698
4666
  'timestamp': timestamp,
4699
4667
  'datetime': self.iso8601(timestamp),
4700
- 'currency': currencyCode,
4668
+ 'currency': self.safe_currency_code(currencyId, currency),
4701
4669
  'amount': self.safe_number(transfer, 'amount'),
4702
- 'fromAccount': fromAccount,
4703
- 'toAccount': toAccount,
4670
+ 'fromAccount': self.safe_string(accountsById, fromId, fromId),
4671
+ 'toAccount': self.safe_string(accountsById, toId, toId),
4704
4672
  'status': self.parse_transfer_status(self.safe_string_2(transfer, 'code', 'status')),
4705
4673
  }
4706
4674
 
@@ -4490,6 +4490,7 @@ class kucoin(Exchange, ImplicitAPI):
4490
4490
  partnerSignature = self.hmac(self.encode(partnerPayload), self.encode(partnerSecret), hashlib.sha256, 'base64')
4491
4491
  headers['KC-API-PARTNER-SIGN'] = partnerSignature
4492
4492
  headers['KC-API-PARTNER'] = partnerId
4493
+ headers['KC-API-PARTNER-VERIFY'] = 'true'
4493
4494
  if isBroker:
4494
4495
  brokerName = self.safe_string(partner, 'name')
4495
4496
  if brokerName is not None:
ccxt/base/exchange.py CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  # -----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.3.23'
7
+ __version__ = '4.3.24'
8
8
 
9
9
  # -----------------------------------------------------------------------------
10
10
 
@@ -5566,8 +5566,9 @@ class Exchange(object):
5566
5566
  errors = 0
5567
5567
  responseLength = len(response)
5568
5568
  if self.verbose:
5569
- iteration = (i + str(1))
5570
- cursorMessage = 'Cursor pagination call ' + iteration + ' method ' + method + ' response length ' + str(responseLength) + ' cursor ' + cursorValue
5569
+ cursorString = '' if (cursorValue is None) else cursorValue
5570
+ iteration = (i + 1)
5571
+ cursorMessage = 'Cursor pagination call ' + str(iteration) + ' method ' + method + ' response length ' + str(responseLength) + ' cursor ' + cursorString
5571
5572
  self.log(cursorMessage)
5572
5573
  if responseLength == 0:
5573
5574
  break
ccxt/bitrue.py CHANGED
@@ -2932,6 +2932,10 @@ class bitrue(Exchange, ImplicitAPI):
2932
2932
  signPath = signPath + '/' + version + '/' + path
2933
2933
  signMessage = timestamp + method + signPath
2934
2934
  if method == 'GET':
2935
+ keys = list(params.keys())
2936
+ keysLength = len(keys)
2937
+ if keysLength > 0:
2938
+ signMessage += '?' + self.urlencode(params)
2935
2939
  signature = self.hmac(self.encode(signMessage), self.encode(self.secret), hashlib.sha256)
2936
2940
  headers = {
2937
2941
  'X-CH-APIKEY': self.apiKey,
@@ -2944,7 +2948,7 @@ class bitrue(Exchange, ImplicitAPI):
2944
2948
  'recvWindow': recvWindow,
2945
2949
  }, params)
2946
2950
  body = self.json(query)
2947
- signMessage = signMessage + json.dumps(body)
2951
+ signMessage += body
2948
2952
  signature = self.hmac(self.encode(signMessage), self.encode(self.secret), hashlib.sha256)
2949
2953
  headers = {
2950
2954
  'Content-Type': 'application/json',
@@ -0,0 +1,17 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ # PLEASE DO NOT EDIT THIS FILE, IT IS GENERATED AND WILL BE OVERWRITTEN:
4
+ # https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#how-to-contribute-code
5
+
6
+ from ccxt.coinbase import coinbase
7
+ from ccxt.abstract.coinbaseadvanced import ImplicitAPI
8
+
9
+
10
+ class coinbaseadvanced(coinbase, ImplicitAPI):
11
+
12
+ def describe(self):
13
+ return self.deep_extend(super(coinbaseadvanced, self).describe(), {
14
+ 'id': 'coinbaseadvanced',
15
+ 'name': 'Coinbase Advanced',
16
+ 'alias': True,
17
+ })
@@ -4,7 +4,7 @@
4
4
  # https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#how-to-contribute-code
5
5
 
6
6
  from ccxt.base.exchange import Exchange
7
- from ccxt.abstract.coinbasepro import ImplicitAPI
7
+ from ccxt.abstract.coinbaseexchange import ImplicitAPI
8
8
  import hashlib
9
9
  from ccxt.base.types import Account, Balances, Currencies, Currency, Int, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, TradingFees, Transaction
10
10
  from typing import List
@@ -22,12 +22,12 @@ from ccxt.base.decimal_to_precision import TICK_SIZE
22
22
  from ccxt.base.precise import Precise
23
23
 
24
24
 
25
- class coinbasepro(Exchange, ImplicitAPI):
25
+ class coinbaseexchange(Exchange, ImplicitAPI):
26
26
 
27
27
  def describe(self):
28
- return self.deep_extend(super(coinbasepro, self).describe(), {
29
- 'id': 'coinbasepro',
30
- 'name': 'Coinbase Pro(Deprecated)',
28
+ return self.deep_extend(super(coinbaseexchange, self).describe(), {
29
+ 'id': 'coinbaseexchange',
30
+ 'name': 'Coinbase Exchange',
31
31
  'countries': ['US'],
32
32
  'rateLimit': 100,
33
33
  'userAgent': self.userAgents['chrome'],
@@ -89,19 +89,19 @@ class coinbasepro(Exchange, ImplicitAPI):
89
89
  '6h': 21600,
90
90
  '1d': 86400,
91
91
  },
92
- 'hostname': 'pro.coinbase.com',
92
+ 'hostname': 'exchange.coinbase.com',
93
93
  'urls': {
94
94
  'test': {
95
- 'public': 'https://api-public.sandbox.pro.coinbase.com',
96
- 'private': 'https://api-public.sandbox.pro.coinbase.com',
95
+ 'public': 'https://api-public.sandbox.exchange.coinbase.com',
96
+ 'private': 'https://api-public.sandbox.exchange.coinbase.com',
97
97
  },
98
- 'logo': 'https://user-images.githubusercontent.com/1294454/41764625-63b7ffde-760a-11e8-996d-a6328fa9347a.jpg',
98
+ 'logo': 'https://github.com/ccxt/ccxt/assets/43336371/34a65553-88aa-4a38-a714-064bd228b97e',
99
99
  'api': {
100
100
  'public': 'https://api.{hostname}',
101
101
  'private': 'https://api.{hostname}',
102
102
  },
103
- 'www': 'https://pro.coinbase.com/',
104
- 'doc': 'https://docs.pro.coinbase.com',
103
+ 'www': 'https://coinbase.com/',
104
+ 'doc': 'https://docs.cloud.coinbase.com/exchange/docs/',
105
105
  'fees': [
106
106
  'https://docs.pro.coinbase.com/#fees',
107
107
  'https://support.pro.coinbase.com/customer/en/portal/articles/2945310-fees',
@@ -315,7 +315,7 @@ class coinbasepro(Exchange, ImplicitAPI):
315
315
 
316
316
  def fetch_markets(self, params={}) -> List[Market]:
317
317
  """
318
- retrieves data on all markets for coinbasepro
318
+ retrieves data on all markets for coinbaseexchange
319
319
  :see: https://docs.cloud.coinbase.com/exchange/reference/exchangerestapi_getproducts
320
320
  :param dict [params]: extra parameters specific to the exchange API endpoint
321
321
  :returns dict[]: an array of objects representing market data
@@ -1047,7 +1047,7 @@ class coinbasepro(Exchange, ImplicitAPI):
1047
1047
  """
1048
1048
  :see: https://docs.cloud.coinbase.com/exchange/reference/exchangerestapi_getorder
1049
1049
  fetches information on an order made by the user
1050
- :param str symbol: not used by coinbasepro fetchOrder
1050
+ :param str symbol: not used by coinbaseexchange fetchOrder
1051
1051
  :param dict [params]: extra parameters specific to the exchange API endpoint
1052
1052
  :returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
1053
1053
  """
ccxt/coinex.py CHANGED
@@ -458,7 +458,9 @@ class coinex(Exchange, ImplicitAPI):
458
458
  'fillResponseFromRequest': True,
459
459
  },
460
460
  'accountsById': {
461
- 'spot': '0',
461
+ 'spot': 'SPOT',
462
+ 'margin': 'MARGIN',
463
+ 'swap': 'FUTURES',
462
464
  },
463
465
  'networks': {
464
466
  'BEP20': 'BSC',
@@ -3453,7 +3455,10 @@ class coinex(Exchange, ImplicitAPI):
3453
3455
  :param str [params.marginMode]: 'cross' or 'isolated' for fetching spot margin orders
3454
3456
  :returns Order[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
3455
3457
  """
3456
- return self.fetch_orders_by_status('pending', symbol, since, limit, params)
3458
+ openOrders = self.fetch_orders_by_status('pending', symbol, since, limit, params)
3459
+ for i in range(0, len(openOrders)):
3460
+ openOrders[i]['status'] = 'open'
3461
+ return openOrders
3457
3462
 
3458
3463
  def fetch_closed_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
3459
3464
  """
@@ -4598,40 +4603,42 @@ class coinex(Exchange, ImplicitAPI):
4598
4603
  def transfer(self, code: str, amount: float, fromAccount: str, toAccount: str, params={}) -> TransferEntry:
4599
4604
  """
4600
4605
  transfer currency internally between wallets on the same account
4601
- :see: https://viabtc.github.io/coinex_api_en_doc/spot/#docsspot002_account014_balance_contract_transfer
4602
- :see: https://viabtc.github.io/coinex_api_en_doc/spot/#docsspot002_account013_margin_transfer
4606
+ :see: https://docs.coinex.com/api/v2/assets/transfer/http/transfer
4603
4607
  :param str code: unified currency code
4604
4608
  :param float amount: amount to transfer
4605
4609
  :param str fromAccount: account to transfer from
4606
4610
  :param str toAccount: account to transfer to
4607
4611
  :param dict [params]: extra parameters specific to the exchange API endpoint
4612
+ :param str [params.symbol]: unified ccxt symbol, required when either the fromAccount or toAccount is margin
4608
4613
  :returns dict: a `transfer structure <https://docs.ccxt.com/#/?id=transfer-structure>`
4609
4614
  """
4610
4615
  self.load_markets()
4611
4616
  currency = self.currency(code)
4612
4617
  amountToPrecision = self.currency_to_precision(code, amount)
4618
+ accountsById = self.safe_dict(self.options, 'accountsById', {})
4619
+ fromId = self.safe_string(accountsById, fromAccount, fromAccount)
4620
+ toId = self.safe_string(accountsById, toAccount, toAccount)
4613
4621
  request = {
4622
+ 'ccy': currency['id'],
4614
4623
  'amount': amountToPrecision,
4615
- 'coin_type': currency['id'],
4624
+ 'from_account_type': fromId,
4625
+ 'to_account_type': toId,
4616
4626
  }
4617
- response = None
4618
- if (fromAccount == 'spot') and (toAccount == 'swap'):
4619
- request['transfer_side'] = 'in' # 'in' spot to swap, 'out' swap to spot
4620
- response = self.v1PrivatePostContractBalanceTransfer(self.extend(request, params))
4621
- elif (fromAccount == 'swap') and (toAccount == 'spot'):
4622
- request['transfer_side'] = 'out' # 'in' spot to swap, 'out' swap to spot
4623
- response = self.v1PrivatePostContractBalanceTransfer(self.extend(request, params))
4624
- else:
4625
- accountsById = self.safe_value(self.options, 'accountsById', {})
4626
- fromId = self.safe_string(accountsById, fromAccount, fromAccount)
4627
- toId = self.safe_string(accountsById, toAccount, toAccount)
4628
- # fromAccount and toAccount must be integers for margin transfers
4629
- # spot is 0, use fetchBalance() to find the margin account id
4630
- request['from_account'] = int(fromId)
4631
- request['to_account'] = int(toId)
4632
- response = self.v1PrivatePostMarginTransfer(self.extend(request, params))
4627
+ if (fromAccount == 'margin') or (toAccount == 'margin'):
4628
+ symbol = self.safe_string(params, 'symbol')
4629
+ if symbol is None:
4630
+ raise ArgumentsRequired(self.id + ' transfer() the symbol parameter must be defined for a margin account')
4631
+ params = self.omit(params, 'symbol')
4632
+ request['market'] = self.market_id(symbol)
4633
+ if (fromAccount != 'spot') and (toAccount != 'spot'):
4634
+ raise BadRequest(self.id + ' transfer() can only be between spot and swap, or spot and margin, either the fromAccount or toAccount must be spot')
4635
+ response = self.v2PrivatePostAssetsTransfer(self.extend(request, params))
4633
4636
  #
4634
- # {"code": 0, "data": null, "message": "Success"}
4637
+ # {
4638
+ # "code": 0,
4639
+ # "data": {},
4640
+ # "message": "OK"
4641
+ # }
4635
4642
  #
4636
4643
  return self.extend(self.parse_transfer(response, currency), {
4637
4644
  'amount': self.parse_number(amountToPrecision),
@@ -4639,67 +4646,28 @@ class coinex(Exchange, ImplicitAPI):
4639
4646
  'toAccount': toAccount,
4640
4647
  })
4641
4648
 
4642
- def parse_transfer_status(self, status: Str) -> Str:
4649
+ def parse_transfer_status(self, status):
4643
4650
  statuses = {
4644
4651
  '0': 'ok',
4645
4652
  'SUCCESS': 'ok',
4653
+ 'OK': 'ok',
4646
4654
  }
4647
4655
  return self.safe_string(statuses, status, status)
4648
4656
 
4649
4657
  def parse_transfer(self, transfer: dict, currency: Currency = None) -> TransferEntry:
4650
- #
4651
- # fetchTransfers Swap
4652
- #
4653
- # {
4654
- # "amount": "10",
4655
- # "asset": "USDT",
4656
- # "transfer_type": "transfer_out", # from swap to spot
4657
- # "created_at": 1651633422
4658
- # },
4659
- #
4660
- # fetchTransfers Margin
4661
- #
4662
- # {
4663
- # "id": 7580062,
4664
- # "updated_at": 1653684379,
4665
- # "user_id": 3620173,
4666
- # "from_account_id": 0,
4667
- # "to_account_id": 1,
4668
- # "asset": "BTC",
4669
- # "amount": "0.00160829",
4670
- # "balance": "0.00160829",
4671
- # "transfer_type": "IN",
4672
- # "status": "SUCCESS",
4673
- # "created_at": 1653684379
4674
- # },
4675
- #
4676
- timestamp = self.safe_timestamp(transfer, 'created_at')
4677
- transferType = self.safe_string(transfer, 'transfer_type')
4678
- fromAccount = None
4679
- toAccount = None
4680
- if transferType == 'transfer_out':
4681
- fromAccount = 'swap'
4682
- toAccount = 'spot'
4683
- elif transferType == 'transfer_in':
4684
- fromAccount = 'spot'
4685
- toAccount = 'swap'
4686
- elif transferType == 'IN':
4687
- fromAccount = 'spot'
4688
- toAccount = 'margin'
4689
- elif transferType == 'OUT':
4690
- fromAccount = 'margin'
4691
- toAccount = 'spot'
4692
- currencyId = self.safe_string(transfer, 'asset')
4693
- currencyCode = self.safe_currency_code(currencyId, currency)
4658
+ timestamp = self.safe_integer(transfer, 'created_at')
4659
+ currencyId = self.safe_string(transfer, 'ccy')
4660
+ fromId = self.safe_string(transfer, 'from_account_type')
4661
+ toId = self.safe_string(transfer, 'to_account_type')
4662
+ accountsById = self.safe_value(self.options, 'accountsById', {})
4694
4663
  return {
4695
- 'info': transfer,
4696
- 'id': self.safe_string(transfer, 'id'),
4664
+ 'id': None,
4697
4665
  'timestamp': timestamp,
4698
4666
  'datetime': self.iso8601(timestamp),
4699
- 'currency': currencyCode,
4667
+ 'currency': self.safe_currency_code(currencyId, currency),
4700
4668
  'amount': self.safe_number(transfer, 'amount'),
4701
- 'fromAccount': fromAccount,
4702
- 'toAccount': toAccount,
4669
+ 'fromAccount': self.safe_string(accountsById, fromId, fromId),
4670
+ 'toAccount': self.safe_string(accountsById, toId, toId),
4703
4671
  'status': self.parse_transfer_status(self.safe_string_2(transfer, 'code', 'status')),
4704
4672
  }
4705
4673
 
ccxt/kucoin.py CHANGED
@@ -4489,6 +4489,7 @@ class kucoin(Exchange, ImplicitAPI):
4489
4489
  partnerSignature = self.hmac(self.encode(partnerPayload), self.encode(partnerSecret), hashlib.sha256, 'base64')
4490
4490
  headers['KC-API-PARTNER-SIGN'] = partnerSignature
4491
4491
  headers['KC-API-PARTNER'] = partnerId
4492
+ headers['KC-API-PARTNER-VERIFY'] = 'true'
4492
4493
  if isBroker:
4493
4494
  brokerName = self.safe_string(partner, 'name')
4494
4495
  if brokerName is not None:
ccxt/pro/__init__.py CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  # ----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.3.23'
7
+ __version__ = '4.3.24'
8
8
 
9
9
  # ----------------------------------------------------------------------------
10
10
 
@@ -36,8 +36,8 @@ from ccxt.pro.blockchaincom import blockchaincom # noqa
36
36
  from ccxt.pro.bybit import bybit # noqa: F401
37
37
  from ccxt.pro.cex import cex # noqa: F401
38
38
  from ccxt.pro.coinbase import coinbase # noqa: F401
39
+ from ccxt.pro.coinbaseexchange import coinbaseexchange # noqa: F401
39
40
  from ccxt.pro.coinbaseinternational import coinbaseinternational # noqa: F401
40
- from ccxt.pro.coinbasepro import coinbasepro # noqa: F401
41
41
  from ccxt.pro.coincheck import coincheck # noqa: F401
42
42
  from ccxt.pro.coinex import coinex # noqa: F401
43
43
  from ccxt.pro.coinone import coinone # noqa: F401
@@ -103,8 +103,8 @@ exchanges = [
103
103
  'bybit',
104
104
  'cex',
105
105
  'coinbase',
106
+ 'coinbaseexchange',
106
107
  'coinbaseinternational',
107
- 'coinbasepro',
108
108
  'coincheck',
109
109
  'coinex',
110
110
  'coinone',
ccxt/pro/bitget.py CHANGED
@@ -1060,7 +1060,7 @@ class bitget(ccxt.async_support.bitget):
1060
1060
  # "executePrice": "35123", # self is limit price
1061
1061
  # "triggerType": "fill_price",
1062
1062
  # "planType": "amount",
1063
- # #### in case order had fill: ####
1063
+ # #### in case order had a partial fill: ####
1064
1064
  # fillPrice: '35123',
1065
1065
  # tradeId: '1171775539946528779',
1066
1066
  # baseVolume: '7', # field present in market order
@@ -1177,13 +1177,19 @@ class bitget(ccxt.async_support.bitget):
1177
1177
  totalAmount = None
1178
1178
  filledAmount = None
1179
1179
  cost = None
1180
+ remaining = None
1181
+ totalFilled = self.safe_string(order, 'accBaseVolume')
1180
1182
  if isSpot:
1181
1183
  if isMargin:
1182
1184
  filledAmount = self.omit_zero(self.safe_string(order, 'fillTotalAmount'))
1183
1185
  totalAmount = self.omit_zero(self.safe_string(order, 'baseSize')) # for margin trading
1184
1186
  cost = self.safe_string(order, 'quoteSize')
1185
1187
  else:
1186
- filledAmount = self.omit_zero(self.safe_string_2(order, 'accBaseVolume', 'baseVolume'))
1188
+ partialFillAmount = self.safe_string(order, 'baseVolume')
1189
+ if partialFillAmount is not None:
1190
+ filledAmount = partialFillAmount
1191
+ else:
1192
+ filledAmount = totalFilled
1187
1193
  if isMarketOrder:
1188
1194
  if isBuy:
1189
1195
  totalAmount = accBaseVolume
@@ -1199,6 +1205,7 @@ class bitget(ccxt.async_support.bitget):
1199
1205
  filledAmount = self.safe_string(order, 'baseVolume')
1200
1206
  totalAmount = self.safe_string(order, 'size')
1201
1207
  cost = self.safe_string(order, 'fillNotionalUsd')
1208
+ remaining = self.omit_zero(Precise.string_sub(totalAmount, totalFilled))
1202
1209
  return self.safe_order({
1203
1210
  'info': order,
1204
1211
  'symbol': symbol,
@@ -1217,7 +1224,7 @@ class bitget(ccxt.async_support.bitget):
1217
1224
  'cost': cost,
1218
1225
  'average': avgPrice,
1219
1226
  'filled': filledAmount,
1220
- 'remaining': None,
1227
+ 'remaining': remaining,
1221
1228
  'status': self.parse_ws_order_status(rawStatus),
1222
1229
  'fee': feeObject,
1223
1230
  'trades': None,
@@ -16,10 +16,10 @@ from ccxt.base.errors import BadRequest
16
16
  from ccxt.base.errors import BadSymbol
17
17
 
18
18
 
19
- class coinbasepro(ccxt.async_support.coinbasepro):
19
+ class coinbaseexchange(ccxt.async_support.coinbaseexchange):
20
20
 
21
21
  def describe(self):
22
- return self.deep_extend(super(coinbasepro, self).describe(), {
22
+ return self.deep_extend(super(coinbaseexchange, self).describe(), {
23
23
  'has': {
24
24
  'ws': True,
25
25
  'watchOHLCV': False, # missing on the exchange side
@@ -38,7 +38,7 @@ class coinbasepro(ccxt.async_support.coinbasepro):
38
38
  },
39
39
  'urls': {
40
40
  'api': {
41
- 'ws': 'wss://ws-feed.pro.coinbase.com',
41
+ 'ws': 'wss://ws-feed.exchange.coinbase.com',
42
42
  },
43
43
  'test': {
44
44
  'ws': 'wss://ws-feed-public.sandbox.exchange.coinbase.com',
@@ -437,7 +437,7 @@ class coinbasepro(ccxt.async_support.coinbasepro):
437
437
  # "side": "buy",
438
438
  # "order_type": "limit"
439
439
  # }
440
- parsed = super(coinbasepro, self).parse_trade(trade)
440
+ parsed = super(coinbaseexchange, self).parse_trade(trade)
441
441
  feeRate = None
442
442
  isMaker = False
443
443
  if 'maker_fee_rate' in trade:
@@ -727,7 +727,7 @@ class coinbasepro(ccxt.async_support.coinbasepro):
727
727
  #
728
728
  type = self.safe_string(ticker, 'type')
729
729
  if type is None:
730
- return super(coinbasepro, self).parse_ticker(ticker, market)
730
+ return super(coinbaseexchange, self).parse_ticker(ticker, market)
731
731
  marketId = self.safe_string(ticker, 'product_id')
732
732
  symbol = self.safe_symbol(marketId, market, '-')
733
733
  timestamp = self.parse8601(self.safe_string(ticker, 'time'))
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ccxt
3
- Version: 4.3.23
3
+ Version: 4.3.24
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
@@ -49,7 +49,7 @@ Requires-Dist: mypy ==1.6.1 ; extra == 'type'
49
49
 
50
50
  # CCXT – CryptoCurrency eXchange Trading Library
51
51
 
52
- [![Build Status](https://travis-ci.com/ccxt/ccxt.svg?branch=master)](https://travis-ci.com/ccxt/ccxt) [![npm](https://img.shields.io/npm/v/ccxt.svg)](https://npmjs.com/package/ccxt) [![PyPI](https://img.shields.io/pypi/v/ccxt.svg)](https://pypi.python.org/pypi/ccxt) [![NPM Downloads](https://img.shields.io/npm/dy/ccxt.svg)](https://www.npmjs.com/package/ccxt) [![Discord](https://img.shields.io/discord/690203284119617602?logo=discord&logoColor=white)](https://discord.gg/ccxt) [![Supported Exchanges](https://img.shields.io/badge/exchanges-104-blue.svg)](https://github.com/ccxt/ccxt/wiki/Exchange-Markets) [![Twitter Follow](https://img.shields.io/twitter/follow/ccxt_official.svg?style=social&label=CCXT)](https://twitter.com/ccxt_official)
52
+ [![Build Status](https://travis-ci.com/ccxt/ccxt.svg?branch=master)](https://travis-ci.com/ccxt/ccxt) [![npm](https://img.shields.io/npm/v/ccxt.svg)](https://npmjs.com/package/ccxt) [![PyPI](https://img.shields.io/pypi/v/ccxt.svg)](https://pypi.python.org/pypi/ccxt) [![NPM Downloads](https://img.shields.io/npm/dy/ccxt.svg)](https://www.npmjs.com/package/ccxt) [![Discord](https://img.shields.io/discord/690203284119617602?logo=discord&logoColor=white)](https://discord.gg/ccxt) [![Supported Exchanges](https://img.shields.io/badge/exchanges-105-blue.svg)](https://github.com/ccxt/ccxt/wiki/Exchange-Markets) [![Twitter Follow](https://img.shields.io/twitter/follow/ccxt_official.svg?style=social&label=CCXT)](https://twitter.com/ccxt_official)
53
53
 
54
54
  A JavaScript / Python / PHP / C# library for cryptocurrency trading and e-commerce with support for many bitcoin/ether/altcoin exchange markets and merchant APIs.
55
55
 
@@ -145,8 +145,8 @@ The CCXT library currently supports the following 98 cryptocurrency exchange mar
145
145
  | [![bybit](https://user-images.githubusercontent.com/51840849/76547799-daff5b80-649e-11ea-87fb-3be9bac08954.jpg)](https://www.bybit.com/register?affiliate_id=35953) | bybit | [Bybit](https://www.bybit.com/register?affiliate_id=35953) | [![API Version 5](https://img.shields.io/badge/5-lightgray)](https://bybit-exchange.github.io/docs/inverse/) | [![CCXT Certified](https://img.shields.io/badge/CCXT-Certified-green.svg)](https://github.com/ccxt/ccxt/wiki/Certification) | [![CCXT Pro](https://img.shields.io/badge/CCXT-Pro-black)](https://ccxt.pro) |
146
146
  | [![cex](https://user-images.githubusercontent.com/1294454/27766442-8ddc33b0-5ed8-11e7-8b98-f786aef0f3c9.jpg)](https://cex.io/r/0/up105393824/0/) | cex | [CEX.IO](https://cex.io/r/0/up105393824/0/) | [![API Version *](https://img.shields.io/badge/*-lightgray)](https://cex.io/cex-api) | | [![CCXT Pro](https://img.shields.io/badge/CCXT-Pro-black)](https://ccxt.pro) |
147
147
  | [![coinbase](https://user-images.githubusercontent.com/1294454/40811661-b6eceae2-653a-11e8-829e-10bfadb078cf.jpg)](https://www.coinbase.com/join/58cbe25a355148797479dbd2) | coinbase | [Coinbase Advanced](https://www.coinbase.com/join/58cbe25a355148797479dbd2) | [![API Version 2](https://img.shields.io/badge/2-lightgray)](https://developers.coinbase.com/api/v2) | [![CCXT Certified](https://img.shields.io/badge/CCXT-Certified-green.svg)](https://github.com/ccxt/ccxt/wiki/Certification) | [![CCXT Pro](https://img.shields.io/badge/CCXT-Pro-black)](https://ccxt.pro) |
148
+ | [![coinbaseexchange](https://github.com/ccxt/ccxt/assets/43336371/34a65553-88aa-4a38-a714-064bd228b97e)](https://coinbase.com/) | coinbaseexchange | [Coinbase Exchange](https://coinbase.com/) | [![API Version *](https://img.shields.io/badge/*-lightgray)](https://docs.cloud.coinbase.com/exchange/docs/) | | [![CCXT Pro](https://img.shields.io/badge/CCXT-Pro-black)](https://ccxt.pro) |
148
149
  | [![coinbaseinternational](https://github.com/ccxt/ccxt/assets/43336371/866ae638-6ab5-4ebf-ab2c-cdcce9545625)](https://international.coinbase.com) | coinbaseinternational | [Coinbase International](https://international.coinbase.com) | [![API Version 1](https://img.shields.io/badge/1-lightgray)](https://docs.cloud.coinbase.com/intx/docs) | [![CCXT Certified](https://img.shields.io/badge/CCXT-Certified-green.svg)](https://github.com/ccxt/ccxt/wiki/Certification) | [![CCXT Pro](https://img.shields.io/badge/CCXT-Pro-black)](https://ccxt.pro) |
149
- | [![coinbasepro](https://user-images.githubusercontent.com/1294454/41764625-63b7ffde-760a-11e8-996d-a6328fa9347a.jpg)](https://pro.coinbase.com/) | coinbasepro | [Coinbase Pro(Deprecated)](https://pro.coinbase.com/) | [![API Version *](https://img.shields.io/badge/*-lightgray)](https://docs.pro.coinbase.com) | | [![CCXT Pro](https://img.shields.io/badge/CCXT-Pro-black)](https://ccxt.pro) |
150
150
  | [![coincheck](https://user-images.githubusercontent.com/51840849/87182088-1d6d6380-c2ec-11ea-9c64-8ab9f9b289f5.jpg)](https://coincheck.com) | coincheck | [coincheck](https://coincheck.com) | [![API Version *](https://img.shields.io/badge/*-lightgray)](https://coincheck.com/documents/exchange/api) | | |
151
151
  | [![coinex](https://user-images.githubusercontent.com/51840849/87182089-1e05fa00-c2ec-11ea-8da9-cc73b45abbbc.jpg)](https://www.coinex.com/register?refer_code=yw5fz) | coinex | [CoinEx](https://www.coinex.com/register?refer_code=yw5fz) | [![API Version 1](https://img.shields.io/badge/1-lightgray)](https://docs.coinex.com/api/v2) | [![CCXT Certified](https://img.shields.io/badge/CCXT-Certified-green.svg)](https://github.com/ccxt/ccxt/wiki/Certification) | [![CCXT Pro](https://img.shields.io/badge/CCXT-Pro-black)](https://ccxt.pro) |
152
152
  | [![coinlist](https://github-production-user-asset-6210df.s3.amazonaws.com/1294454/281108917-eff2ae1d-ce8a-4b2a-950d-8678b12da965.jpg)](https://coinlist.co) | coinlist | [Coinlist](https://coinlist.co) | [![API Version 1](https://img.shields.io/badge/1-lightgray)](https://trade-docs.coinlist.co) | | |
@@ -264,13 +264,13 @@ console.log(version, Object.keys(exchanges));
264
264
 
265
265
  All-in-one browser bundle (dependencies included), served from a CDN of your choice:
266
266
 
267
- * jsDelivr: https://cdn.jsdelivr.net/npm/ccxt@4.3.23/dist/ccxt.browser.js
268
- * unpkg: https://unpkg.com/ccxt@4.3.23/dist/ccxt.browser.js
267
+ * jsDelivr: https://cdn.jsdelivr.net/npm/ccxt@4.3.24/dist/ccxt.browser.js
268
+ * unpkg: https://unpkg.com/ccxt@4.3.24/dist/ccxt.browser.js
269
269
 
270
270
  CDNs are not updated in real-time and may have delays. Defaulting to the most recent version without specifying the version number is not recommended. Please, keep in mind that we are not responsible for the correct operation of those CDN servers.
271
271
 
272
272
  ```HTML
273
- <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/ccxt@4.3.23/dist/ccxt.browser.js"></script>
273
+ <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/ccxt@4.3.24/dist/ccxt.browser.js"></script>
274
274
  ```
275
275
 
276
276
  Creates a global `ccxt` object:
@@ -1,4 +1,4 @@
1
- ccxt/__init__.py,sha256=qhNKKBQdHKfK5dbU7ivzJJCaEPH1xtXWOw36J0uTYPk,15838
1
+ ccxt/__init__.py,sha256=B1EFn-tKO_K29PcG0QEnfrDIY1jVqOL-3lliEvXsWx0,15950
2
2
  ccxt/ace.py,sha256=IAbVQ73OhU5xdTLO6dtedqa3bSuZ63Me55Se1zotYUY,41656
3
3
  ccxt/alpaca.py,sha256=NadHil-XkNFteqE7GwzIhKCCRjQ7m0xBQBCUlKxS6Sc,47215
4
4
  ccxt/ascendex.py,sha256=UjGRc4PgSi9ZNFl8greVZZZMTQxjEQRF8yF5SSUqeJM,151471
@@ -23,7 +23,7 @@ ccxt/bitmart.py,sha256=kM0SaiFm7LMGSSh-9iHSyexet0t7C9gLnKFfyORscEU,199137
23
23
  ccxt/bitmex.py,sha256=PxRDGNFOToB2fFulw0Z3XEklLhFmKF_rRfx8LpDtgoo,126584
24
24
  ccxt/bitopro.py,sha256=Ph0uhgzUJzNKji_bIs9SxbY72U7Fu-6QWr2i6WMKB7M,68522
25
25
  ccxt/bitpanda.py,sha256=aiwPkx9lKbVzt4ggoYdq_mIbMGtg5ZtGl2yRHO5xyz8,471
26
- ccxt/bitrue.py,sha256=zxBvmkbP1EwfpptdAsMonEig-79p8q5hu_I3iEebQyo,136220
26
+ ccxt/bitrue.py,sha256=IyMHMGfGwOwhi2WOy5-cPe7_GITVB22tS4JeVXClxGY,136392
27
27
  ccxt/bitso.py,sha256=ni6NTPVeUN8JODxvXR7oCG0TIc3JwEq8D-grCNpnFM8,70885
28
28
  ccxt/bitstamp.py,sha256=5_Y1RbEMxzX0H8Y9IJ3cEOyemkI_QpyUKFSW23IEp0Y,92235
29
29
  ccxt/bitteam.py,sha256=pInXxLqE5yOXly9JLKOsRx92l6SA4clnMm1oYEOzuEw,102026
@@ -38,10 +38,11 @@ ccxt/btcturk.py,sha256=9RFC0mCWjW_jW8Hgz5cuwb1gaeLf469FOXae4p_KQJM,36657
38
38
  ccxt/bybit.py,sha256=OCRuZpug2qrIFy97l_7xSAxRa0y8Vua1lamHxSo6IwE,412519
39
39
  ccxt/cex.py,sha256=_EDbKQQiIKS5UVztu1wrQq-WQPJxa3GnLelfOkd6O2k,69930
40
40
  ccxt/coinbase.py,sha256=IQu7NvSQ80m5cUlfkbHhywTdwO2n7YRXeuToXbGlYG0,212311
41
+ ccxt/coinbaseadvanced.py,sha256=d5g6nRx-NCcCwZDdtp8FsI2D-pRjSvnAP9ISSKY_nCQ,538
42
+ ccxt/coinbaseexchange.py,sha256=FeSNMY_lAzYAs3X9QmDCMSHScdyUW-nLv78AoMIPK78,78704
41
43
  ccxt/coinbaseinternational.py,sha256=wieWUwsLsBYAgNpvnnrKseqAE7aOw__apSP6MQK9u9E,87240
42
- ccxt/coinbasepro.py,sha256=SFMlNzdnl_vbE_KqnopNmj-u8As_g2D9qFmrpicNsZw,78671
43
44
  ccxt/coincheck.py,sha256=jg8KHt_XUMPlbG1BYUiSHu9-DDBWdnQwV15P9IzKqbY,35664
44
- ccxt/coinex.py,sha256=kU0Oh0ab2ph4hp06mEaTD148rmigdaXZ2UV-xJ2Kj-U,260898
45
+ ccxt/coinex.py,sha256=zce54mXGtgS1bqSrt-3IRSZdFHRtflIoqIX8dl2SaXc,259870
45
46
  ccxt/coinlist.py,sha256=EU4jtqWALdcLG5X3m2q4xPbQ3-h5-H63Eeb_R3wW-5s,103140
46
47
  ccxt/coinmate.py,sha256=EsXu0mcAkVFwg2VOg47qr6g95a3bDPN2I9AuFQxgkQg,45946
47
48
  ccxt/coinmetro.py,sha256=tZjLAz5XufybO3BU3QGXMrLzinoY4UBhn0JIyXivnys,80700
@@ -70,7 +71,7 @@ ccxt/independentreserve.py,sha256=iobtHiT8KlD1-mDJeoZCzPEPteSZz512mxgnrTnsECo,32
70
71
  ccxt/indodax.py,sha256=ulvlP7-xpQWXrBfvRn-GWMoOXr_4MBBMrkTDDgM4fbQ,51921
71
72
  ccxt/kraken.py,sha256=YKMTpaILyYw5kLQkKMH9pl9nB0ek_5NSE0ew5-cUOVQ,125472
72
73
  ccxt/krakenfutures.py,sha256=S1WRrAtZ_tibYH50N0yb4y4pe12g3yNruLaH0ZWuWw4,116835
73
- ccxt/kucoin.py,sha256=c3O5pkS_ABKhvgGg5oTzxAVGDbO8uZy7gEeEAyl81ZQ,217738
74
+ ccxt/kucoin.py,sha256=0YqwMhzxBt_cmOgZj_JPJ5tOF7QrFJXzyvBrheJiuT4,217796
74
75
  ccxt/kucoinfutures.py,sha256=x5m2yqC5ZEIaKCBmM8alKJ7tk2r9nzpMC-PcpfadnRo,124327
75
76
  ccxt/kuna.py,sha256=Q1FuK9RvZmEYN87G3bHsVhcUcclMApuFVDNv5njyaRU,95991
76
77
  ccxt/latoken.py,sha256=pMuCXETni8Ihgl4OSUNk5Ovt4D6bV61zctM45nn8cCs,79197
@@ -143,8 +144,9 @@ ccxt/abstract/btcturk.py,sha256=duM-QrB9MvGpopOtxkfbeYlY49bgvXQLiosRVmnQYFw,1777
143
144
  ccxt/abstract/bybit.py,sha256=eqKWi3rALneYXIgP62lKZDq_mRAGYNawisGPPLqQ1vk,48923
144
145
  ccxt/abstract/cex.py,sha256=Q0NJeDuJ4Kn_mtokYqBenhXWvLIiMSVTqbgbfcLGgv4,3311
145
146
  ccxt/abstract/coinbase.py,sha256=GFXDh_Bf65Gsx_DmgOrRG2jpM3IdITE3Agqz_LZTJfo,15507
147
+ ccxt/abstract/coinbaseadvanced.py,sha256=GFXDh_Bf65Gsx_DmgOrRG2jpM3IdITE3Agqz_LZTJfo,15507
148
+ ccxt/abstract/coinbaseexchange.py,sha256=eQMtsIw94xJqQO_xXmrrHdc_YFmhVZNW4OXCWv4Nx1w,7162
146
149
  ccxt/abstract/coinbaseinternational.py,sha256=wf1fF31fQ1TAVSk1X4ju6LYQc7tHI1lN5nxRnhnzsbk,4770
147
- ccxt/abstract/coinbasepro.py,sha256=eQMtsIw94xJqQO_xXmrrHdc_YFmhVZNW4OXCWv4Nx1w,7162
148
150
  ccxt/abstract/coincheck.py,sha256=3IIVmryXmzxXqi6IleUmfDZIUMOn_L_4G9Iw8BuEEGo,3417
149
151
  ccxt/abstract/coinex.py,sha256=xPxsdMIhrtHfZO7w5cW-1RpR12H20u1tTPNFaNaeXOU,34678
150
152
  ccxt/abstract/coinlist.py,sha256=t4Xc9xyWNHgHAz7nyplj8PmgrX4knA3cnk2uEJCvkQk,6538
@@ -208,7 +210,7 @@ ccxt/abstract/woofipro.py,sha256=El50vWGAV-4QPIDhgSnd4egfvk246NB6vTC-8h722vs,160
208
210
  ccxt/abstract/yobit.py,sha256=8ycfCO8ORFly9hc0Aa47sZyX4_ZKPXS9h9yJzI-uQ7Q,1339
209
211
  ccxt/abstract/zaif.py,sha256=m15WHdl3gYy0GOXNZ8NEH8eE7sVh8c0T_ITNuU8vXeU,3935
210
212
  ccxt/abstract/zonda.py,sha256=aSfewvRojzmuymX6QbOnDR8v9VFqWTULMHX9Y7kKD1M,5820
211
- ccxt/async_support/__init__.py,sha256=mOGMUDv5Hd9c9VXidll9FuEDz_82MTHXgJLZ5CEP0qQ,15601
213
+ ccxt/async_support/__init__.py,sha256=t_VwyA3nEUTkoaRHt7HUyUv8NmHmqiIHEChunLqt2Dg,15723
212
214
  ccxt/async_support/ace.py,sha256=xVxaTocpMapAIl4ApPApw69Rd-RDuU0_vleJnVt_qhI,41880
213
215
  ccxt/async_support/alpaca.py,sha256=rjD8PdQr1B5e9hvaoTQBKVtWwHLs04e6_-gooXl4eEE,47427
214
216
  ccxt/async_support/ascendex.py,sha256=w4GaR3Xm9fkIAdXostTsu0Pnw9VkRrT6ar57gU9HSHw,152259
@@ -233,7 +235,7 @@ ccxt/async_support/bitmart.py,sha256=wKlX--oFHZI8rWzdrR8jeYvg4dWfuARfSZ67yO9JgFc
233
235
  ccxt/async_support/bitmex.py,sha256=tnw76bg38oOvz-luU-c7K4A75MwSsfwJs9VrzRW5OHs,127162
234
236
  ccxt/async_support/bitopro.py,sha256=kIorVevTcOvIqfsCn0z-QXscJjIDcG3qq9_WzC6C_ks,68926
235
237
  ccxt/async_support/bitpanda.py,sha256=2k3URBWrpnh2xHa7JiYenI7_4MW5UeOPGzetlmRkR4U,485
236
- ccxt/async_support/bitrue.py,sha256=xJ3EQ_4Rgm428X4z1FyI0g9qK3Uzq8fcrEvhSubttV8,136878
238
+ ccxt/async_support/bitrue.py,sha256=WEmcqhfxpON6EoBNXvlslfID2NTyk5vRgvwQU9lt1QU,137050
237
239
  ccxt/async_support/bitso.py,sha256=z0X3fCd9sQF5YSUJIr9d9dNyLhLgl7XsU5F7DvzgO4E,71271
238
240
  ccxt/async_support/bitstamp.py,sha256=_hHTPEPF51z7HJ3Z8s037k6b0YZwdbe1nATfepEtDLc,92735
239
241
  ccxt/async_support/bitteam.py,sha256=V-Ofv3bjLcEgikZX_XNF9D941uJ9MLPla0656Q2mrUk,102358
@@ -248,10 +250,11 @@ ccxt/async_support/btcturk.py,sha256=EMrvQcRRGtO9Hu3StUvalUiaTgueI7UM86IYS0Dgj6I
248
250
  ccxt/async_support/bybit.py,sha256=4wjZKMH6UthYB1qIeA0gAcoaHk71fEnQii8xPIM3-VI,414323
249
251
  ccxt/async_support/cex.py,sha256=MMVgApSlmqtfnEJHdsL4WXd7_5uFri-F0QjSWOsyoEU,70280
250
252
  ccxt/async_support/coinbase.py,sha256=7I2rxiBGKwnC6aZ2DMajH5FEarhesMGRWK-Xhn3kL8g,213417
253
+ ccxt/async_support/coinbaseadvanced.py,sha256=Kupwnuxiu_qTjwCNV2asacoDUNFQvcaHNAznUJPhdQs,552
254
+ ccxt/async_support/coinbaseexchange.py,sha256=3wEfbKBAVn9JkOfukopSRPhM8unRA6BQLqvm5c2VLBE,79210
251
255
  ccxt/async_support/coinbaseinternational.py,sha256=fuU-h5UpO_nVs1j8KA7oGsQlP0kQefuPycZrc8ph6OQ,87794
252
- ccxt/async_support/coinbasepro.py,sha256=GnzjqgXso5wqAVZbkMcMjcpQ1BJ7um3BtBbhrM_X0rI,79177
253
256
  ccxt/async_support/coincheck.py,sha256=ThRQX8E3NZrGc9Z__UIb7p0AtHgnq_DBhe9GzE9SlaQ,35870
254
- ccxt/async_support/coinex.py,sha256=bw6uaKWePjdiGQ1lzMUjIkmsbqr39LHkqBBBGs7KoXQ,262192
257
+ ccxt/async_support/coinex.py,sha256=g_RcySMlUqdpONcOnzJgTOt3JpvMkhGVCYu2OfiHdks,261152
255
258
  ccxt/async_support/coinlist.py,sha256=MKLhRyaw0DHkpRfR-Vj9NS0SwCpYUx8nOxZJ26swIMY,103628
256
259
  ccxt/async_support/coinmate.py,sha256=lc8p0aQXu-oSf2whiqvm0QoBhDVx9wf50CcFeucdXcY,46212
257
260
  ccxt/async_support/coinmetro.py,sha256=NLqNdcJ_zXcNqaxqkrloL9PqnogbQ6OzA5e_Gl4ACtk,81020
@@ -280,7 +283,7 @@ ccxt/async_support/independentreserve.py,sha256=8UTpFWJtrfZTeMhRfNK8mGiOu0-p-JCb
280
283
  ccxt/async_support/indodax.py,sha256=Duu0r6PCzPlQLNqj2v2smCh6xE65S9LpP7wwQWa5ygM,52229
281
284
  ccxt/async_support/kraken.py,sha256=_yQEd3_OjqQBDdElH-XTPkLVe6P2tCVt0kl2BjlVnKU,126074
282
285
  ccxt/async_support/krakenfutures.py,sha256=LwIy5nZe5urJ7Yrb5_KSKtk0giBBUnQl20KlgGKXwLg,117323
283
- ccxt/async_support/kucoin.py,sha256=4QcHj101RfCQHCPai8WHg7_ZQUf_ik4Y-FqbTwFdrO0,218810
286
+ ccxt/async_support/kucoin.py,sha256=-7kAVv2ghUIBXL6QLWmuZUsgCdq2wW6cHGSFMFGDyMA,218868
284
287
  ccxt/async_support/kucoinfutures.py,sha256=3gdO1HK5avmyseAXEEiufyNifvJAUpW75mUQNYhlmzQ,124965
285
288
  ccxt/async_support/kuna.py,sha256=jcgPCS4_wHsWbBni6yuj6iMa641AYsiZr8ZBNGoxCe8,96407
286
289
  ccxt/async_support/latoken.py,sha256=eseLp2evP-Ux0BSkOTlq2CXSnHVjAWDqY26OrKMgXTQ,79673
@@ -314,7 +317,7 @@ ccxt/async_support/yobit.py,sha256=kvMIVVjf8XxE7cKt51iHtqH7zgmFKc5ZVhk1dKDtlxE,5
314
317
  ccxt/async_support/zaif.py,sha256=lzrmIYPlNJquYkK-fq9DjqS8EfiAtofXnPcTMf3XOMM,28161
315
318
  ccxt/async_support/zonda.py,sha256=bS_Oq8FVjbLxnxFVVg-_5ZlNS0CH9QxSUVKL91IR9rc,80912
316
319
  ccxt/async_support/base/__init__.py,sha256=aVYSsFi--b4InRs9zDN_wtCpj8odosAB726JdUHavrk,67
317
- ccxt/async_support/base/exchange.py,sha256=GZppbWx2n5--HTaGI1LM-zMEqcQ-NazkckJbkvb9JwU,108636
320
+ ccxt/async_support/base/exchange.py,sha256=IYH0t15nRLoVoENRTCmxOy8ClaroISPnRV0RVIvDyH0,108717
318
321
  ccxt/async_support/base/throttler.py,sha256=tvDVcdRUVYi8fZRlEcnqtgzcgB_KMUMRs5Pu8tuU-tU,1847
319
322
  ccxt/async_support/base/ws/__init__.py,sha256=uockzpLuwntKGZbs5EOWFe-Zg-k6Cj7GhNJLc_RX0so,1791
320
323
  ccxt/async_support/base/ws/aiohttp_client.py,sha256=Ed1765emEde2Hj8Ys6f5EjS54ZI1wQ0qIhd04eB7yhU,5751
@@ -328,10 +331,10 @@ ccxt/async_support/base/ws/order_book_side.py,sha256=Pxrq22nCODckJ6G1OXkYEmUunIu
328
331
  ccxt/base/__init__.py,sha256=eTx1OE3HJjspFUQjGm6LBhaQiMKJnXjkdP-JUXknyQ0,1320
329
332
  ccxt/base/decimal_to_precision.py,sha256=fgWRBzRTtsf3r2INyS4f7WHlzgjB5YM1ekiwqD21aac,6634
330
333
  ccxt/base/errors.py,sha256=FGdyULeNCNcl52gA_CNhe2dZmat9GJGkTdlIyDXAF_A,4213
331
- ccxt/base/exchange.py,sha256=m8eg-GeXbbz2gXYd7QJWN-_5bw4fQV35_kJVIFep5Wk,278172
334
+ ccxt/base/exchange.py,sha256=aKmetWxqjo5la1OpqiQnmh6dkTiopP5U_HBg2IVaCTI,278253
332
335
  ccxt/base/precise.py,sha256=_xfu54sV0vWNnOfGTKRFykeuWP8mn4K1m9lk1tcllX4,8565
333
336
  ccxt/base/types.py,sha256=3hBdiD2EO7W-pwmBrDeDYMEdFGcnT0QqQZa3l8ywTVM,9027
334
- ccxt/pro/__init__.py,sha256=0lEsKAJpqiZnKAM-TONJMbPYji1efar1BJKOZu7sY0Y,7102
337
+ ccxt/pro/__init__.py,sha256=sVg8AyzgbmwugQlnDh4ZA6H-NzqxchL4yuWNT9cx4aI,7107
335
338
  ccxt/pro/alpaca.py,sha256=7ePyWli0949ti5UheIn553xmnFpedrNc2W5CKauSZio,27167
336
339
  ccxt/pro/ascendex.py,sha256=fCM3EujSfJvtvffqI56UAstTtwjXFIocwukm15cF8rE,35432
337
340
  ccxt/pro/bequant.py,sha256=5zbsP8BHQTUZ8ZNL6uaACxDbUClgkOV4SYfXT_LfQVg,1351
@@ -343,7 +346,7 @@ ccxt/pro/bingx.py,sha256=DX-_TEWhTSi__zP865UUM0DqnEO9VO6KHysLiVr2JpE,42110
343
346
  ccxt/pro/bitcoincom.py,sha256=zAX6hiz4hS6Un8dSGp88rpnvItxQHfNmsfF0IZ2xIVA,1181
344
347
  ccxt/pro/bitfinex.py,sha256=VdvMikgWO7htYSAEKmGkDBYISWCJon1bnkv3JkV4nv0,24826
345
348
  ccxt/pro/bitfinex2.py,sha256=9_N-a4eyiOndD1_1qRDEH7_02U75K1dH7qOYu8M5xUg,42834
346
- ccxt/pro/bitget.py,sha256=NZyGOE9qDvSG1fzILmBiiTddvdF2G545S2B6Gh7mhkc,72217
349
+ ccxt/pro/bitget.py,sha256=6_z3512667AfuT18xZ8TYVad6_8wjbYh5mLIVZ4jJQw,72543
347
350
  ccxt/pro/bithumb.py,sha256=xMFS5eOYLAdqePz2Tcwu76qG_k7XbgnUjW9hKDehBjA,16799
348
351
  ccxt/pro/bitmart.py,sha256=Jyp-MyCUlvLDcMgz4Y8Dbjm8FJkjc79iLCBLgjYJHwc,62382
349
352
  ccxt/pro/bitmex.py,sha256=EJ_M666RDhhKal8umRKTbYZHCqHrrkRbWnOCzSEe3kI,68956
@@ -356,8 +359,8 @@ ccxt/pro/blockchaincom.py,sha256=Uv1ijvxvFGrqFPH6iifCk5AgQYTDsXUa5n0ktpusVjM,295
356
359
  ccxt/pro/bybit.py,sha256=FWN3ixxNYBIlHBkfD5wg5kaJ_lxLppvTDySvCvyOebI,85098
357
360
  ccxt/pro/cex.py,sha256=psU0k-icE931Z_wpkr16IdSZ2iDUwLnqJz3KUmQ5Xls,58380
358
361
  ccxt/pro/coinbase.py,sha256=j1iI52eNa-qya7Q7BZCpd1SAJQZc4LEGu25DIu0LMwo,29324
362
+ ccxt/pro/coinbaseexchange.py,sha256=vhW-SIPSaSidXkQk1WDAU1-0Vj1S9kRJl6U-5CnyPcQ,38975
359
363
  ccxt/pro/coinbaseinternational.py,sha256=4LMDA9RJhwT2T55kyryGCJBrdRgh_XBVYlJjXGS_AMc,25794
360
- ccxt/pro/coinbasepro.py,sha256=94ZXmg-Ez5tSiUYP98nu-gWvuXb-Dk4WHMVsXOR8AK0,38945
361
364
  ccxt/pro/coincheck.py,sha256=MKAPHJeVifQaCKPla-7RY86TIWyDGe4nvjRhNmi617w,7789
362
365
  ccxt/pro/coinex.py,sha256=LVgahnm6laz2e0oQP4C8ki3mLcx5Eh-uz989BFquozM,45042
363
366
  ccxt/pro/coinone.py,sha256=d0s11hTNFVFZiBD3jWWu6iRseyVsHR6dO-njqqZ2WyU,15652
@@ -531,7 +534,7 @@ ccxt/test/base/test_ticker.py,sha256=cMTIMb1oySNORUCmqI5ZzMswlEyCF6gJMah3vfvo8wQ
531
534
  ccxt/test/base/test_trade.py,sha256=PMtmB8V38dpaP-eb8h488xYMlR6D69yCOhsA1RuWrUA,2336
532
535
  ccxt/test/base/test_trading_fee.py,sha256=2aDCNJtqBkTC_AieO0l1HYGq5hz5qkWlkWb9Nv_fcwk,1066
533
536
  ccxt/test/base/test_transaction.py,sha256=BTbB4UHHXkrvYgwbrhh867nVRlevmIkIrz1W_odlQJI,1434
534
- ccxt-4.3.23.dist-info/METADATA,sha256=EXJiW5xUthaFLJf55sJpklzL97SEsm__bJx-rxz8dng,112795
535
- ccxt-4.3.23.dist-info/WHEEL,sha256=P2T-6epvtXQ2cBOE_U1K4_noqlJFN3tj15djMgEu4NM,110
536
- ccxt-4.3.23.dist-info/top_level.txt,sha256=CkQDuCTDKNcImPV60t36G6MdYfxsAPNiSaEwifVoVMo,5
537
- ccxt-4.3.23.dist-info/RECORD,,
537
+ ccxt-4.3.24.dist-info/METADATA,sha256=bv863nPYUVx5JlZGAu--tTGwa4QRxDiJZm-TEQqWsW0,112795
538
+ ccxt-4.3.24.dist-info/WHEEL,sha256=P2T-6epvtXQ2cBOE_U1K4_noqlJFN3tj15djMgEu4NM,110
539
+ ccxt-4.3.24.dist-info/top_level.txt,sha256=CkQDuCTDKNcImPV60t36G6MdYfxsAPNiSaEwifVoVMo,5
540
+ ccxt-4.3.24.dist-info/RECORD,,
File without changes
File without changes