ccxt 4.2.97__py2.py3-none-any.whl → 4.2.99__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.2.97'
25
+ __version__ = '4.2.99'
26
26
 
27
27
  # ----------------------------------------------------------------------------
28
28
 
@@ -4,7 +4,7 @@
4
4
 
5
5
  # -----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.2.97'
7
+ __version__ = '4.2.99'
8
8
 
9
9
  # -----------------------------------------------------------------------------
10
10
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  # -----------------------------------------------------------------------------
4
4
 
5
- __version__ = '4.2.97'
5
+ __version__ = '4.2.99'
6
6
 
7
7
  # -----------------------------------------------------------------------------
8
8
 
@@ -1416,6 +1416,7 @@ class coinbase(Exchange, ImplicitAPI):
1416
1416
  contractExpiryType = self.safe_string(futureProductDetails, 'contract_expiry_type')
1417
1417
  contractSize = self.safe_number(futureProductDetails, 'contract_size')
1418
1418
  contractExpire = self.safe_string(futureProductDetails, 'contract_expiry')
1419
+ expireTimestamp = self.parse8601(contractExpire)
1419
1420
  isSwap = (contractExpiryType == 'PERPETUAL')
1420
1421
  baseId = self.safe_string(futureProductDetails, 'contract_root_unit')
1421
1422
  quoteId = self.safe_string(market, 'quote_currency_id')
@@ -1429,7 +1430,7 @@ class coinbase(Exchange, ImplicitAPI):
1429
1430
  symbol = symbol + ':' + quote
1430
1431
  else:
1431
1432
  type = 'future'
1432
- symbol = symbol + ':' + quote + '-' + self.yymmdd(contractExpire)
1433
+ symbol = symbol + ':' + quote + '-' + self.yymmdd(expireTimestamp)
1433
1434
  takerFeeRate = self.safe_number(feeTier, 'taker_fee_rate')
1434
1435
  makerFeeRate = self.safe_number(feeTier, 'maker_fee_rate')
1435
1436
  taker = takerFeeRate if takerFeeRate else self.parse_number('0.06')
@@ -1456,7 +1457,7 @@ class coinbase(Exchange, ImplicitAPI):
1456
1457
  'taker': taker,
1457
1458
  'maker': maker,
1458
1459
  'contractSize': contractSize,
1459
- 'expiry': self.parse8601(contractExpire),
1460
+ 'expiry': expireTimestamp,
1460
1461
  'expiryDatetime': contractExpire,
1461
1462
  'strike': None,
1462
1463
  'optionType': None,
@@ -4048,6 +4049,30 @@ class coinbase(Exchange, ImplicitAPI):
4048
4049
  'takeProfitPrice': None,
4049
4050
  })
4050
4051
 
4052
+ def create_auth_token(self, seconds: Int, method: Str = None, url: Str = None):
4053
+ # it may not work for v2
4054
+ uri = None
4055
+ if url is not None:
4056
+ uri = method + ' ' + url.replace('https://', '')
4057
+ quesPos = uri.find('?')
4058
+ # Due to we use mb_strpos, quesPos could be False in php. In that case, the quesPos >= 0 is True
4059
+ # Also it's not possible that the question mark is first character, only check > 0 here.
4060
+ if quesPos > 0:
4061
+ uri = uri[0:quesPos]
4062
+ nonce = self.random_bytes(16)
4063
+ request = {
4064
+ 'aud': ['retail_rest_api_proxy'],
4065
+ 'iss': 'coinbase-cloud',
4066
+ 'nbf': seconds,
4067
+ 'exp': seconds + 120,
4068
+ 'sub': self.apiKey,
4069
+ 'iat': seconds,
4070
+ }
4071
+ if uri is not None:
4072
+ request['uri'] = uri
4073
+ token = self.jwt(request, self.encode(self.secret), 'sha256', False, {'kid': self.apiKey, 'nonce': nonce, 'alg': 'ES256'})
4074
+ return token
4075
+
4051
4076
  def sign(self, path, api=[], method='GET', params={}, headers=None, body=None):
4052
4077
  version = api[0]
4053
4078
  signed = api[1] == 'private'
@@ -4087,24 +4112,26 @@ class coinbase(Exchange, ImplicitAPI):
4087
4112
  if isCloudAPiKey:
4088
4113
  if self.apiKey.startswith('-----BEGIN'):
4089
4114
  raise ArgumentsRequired(self.id + ' apiKey should contain the name(eg: organizations/3b910e93....) and not the public key')
4090
- # it may not work for v2
4091
- uri = method + ' ' + url.replace('https://', '')
4092
- quesPos = uri.find('?')
4093
- # Due to we use mb_strpos, quesPos could be False in php. In that case, the quesPos >= 0 is True
4094
- # Also it's not possible that the question mark is first character, only check > 0 here.
4095
- if quesPos > 0:
4096
- uri = uri[0:quesPos]
4097
- nonce = self.random_bytes(16)
4098
- request = {
4099
- 'aud': ['retail_rest_api_proxy'],
4100
- 'iss': 'coinbase-cloud',
4101
- 'nbf': seconds,
4102
- 'exp': seconds + 120,
4103
- 'sub': self.apiKey,
4104
- 'uri': uri,
4105
- 'iat': seconds,
4106
- }
4107
- token = self.jwt(request, self.encode(self.secret), 'sha256', False, {'kid': self.apiKey, 'nonce': nonce, 'alg': 'ES256'})
4115
+ # # it may not work for v2
4116
+ # uri = method + ' ' + url.replace('https://', '')
4117
+ # quesPos = uri.find('?')
4118
+ # # Due to we use mb_strpos, quesPos could be False in php. In that case, the quesPos >= 0 is True
4119
+ # # Also it's not possible that the question mark is first character, only check > 0 here.
4120
+ # if quesPos > 0:
4121
+ # uri = uri[0:quesPos]
4122
+ # }
4123
+ # nonce = self.random_bytes(16)
4124
+ # request = {
4125
+ # 'aud': ['retail_rest_api_proxy'],
4126
+ # 'iss': 'coinbase-cloud',
4127
+ # 'nbf': seconds,
4128
+ # 'exp': seconds + 120,
4129
+ # 'sub': self.apiKey,
4130
+ # 'uri': uri,
4131
+ # 'iat': seconds,
4132
+ # }
4133
+ token = self.create_auth_token(seconds, method, url)
4134
+ # token = self.jwt(request, self.encode(self.secret), 'sha256', False, {'kid': self.apiKey, 'nonce': nonce, 'alg': 'ES256'})
4108
4135
  authorizationString = 'Bearer ' + token
4109
4136
  else:
4110
4137
  timestampString = str(self.seconds())
@@ -1501,9 +1501,10 @@ class kraken(Exchange, ImplicitAPI):
1501
1501
  # }
1502
1502
  #
1503
1503
  description = self.safe_dict(order, 'descr', {})
1504
+ orderDescriptionObj = self.safe_dict(order, 'descr') # can be null
1504
1505
  orderDescription = None
1505
- if description is not None:
1506
- orderDescription = self.safe_string(description, 'order')
1506
+ if orderDescriptionObj is not None:
1507
+ orderDescription = self.safe_string(orderDescriptionObj, 'order')
1507
1508
  else:
1508
1509
  orderDescription = self.safe_string(order, 'descr')
1509
1510
  side = None
@@ -1564,8 +1565,8 @@ class kraken(Exchange, ImplicitAPI):
1564
1565
  fee['currency'] = market['base']
1565
1566
  status = self.parse_order_status(self.safe_string(order, 'status'))
1566
1567
  id = self.safe_string_2(order, 'id', 'txid')
1567
- if (id is None) or (id[0:1] == '['):
1568
- txid = self.safe_value(order, 'txid')
1568
+ if (id is None) or (id.startswith('[')):
1569
+ txid = self.safe_list(order, 'txid')
1569
1570
  id = self.safe_string(txid, 0)
1570
1571
  clientOrderId = self.safe_string(order, 'userref')
1571
1572
  rawTrades = self.safe_value(order, 'trades', [])
ccxt/base/exchange.py CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  # -----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.2.97'
7
+ __version__ = '4.2.99'
8
8
 
9
9
  # -----------------------------------------------------------------------------
10
10
 
ccxt/coinbase.py CHANGED
@@ -1415,6 +1415,7 @@ class coinbase(Exchange, ImplicitAPI):
1415
1415
  contractExpiryType = self.safe_string(futureProductDetails, 'contract_expiry_type')
1416
1416
  contractSize = self.safe_number(futureProductDetails, 'contract_size')
1417
1417
  contractExpire = self.safe_string(futureProductDetails, 'contract_expiry')
1418
+ expireTimestamp = self.parse8601(contractExpire)
1418
1419
  isSwap = (contractExpiryType == 'PERPETUAL')
1419
1420
  baseId = self.safe_string(futureProductDetails, 'contract_root_unit')
1420
1421
  quoteId = self.safe_string(market, 'quote_currency_id')
@@ -1428,7 +1429,7 @@ class coinbase(Exchange, ImplicitAPI):
1428
1429
  symbol = symbol + ':' + quote
1429
1430
  else:
1430
1431
  type = 'future'
1431
- symbol = symbol + ':' + quote + '-' + self.yymmdd(contractExpire)
1432
+ symbol = symbol + ':' + quote + '-' + self.yymmdd(expireTimestamp)
1432
1433
  takerFeeRate = self.safe_number(feeTier, 'taker_fee_rate')
1433
1434
  makerFeeRate = self.safe_number(feeTier, 'maker_fee_rate')
1434
1435
  taker = takerFeeRate if takerFeeRate else self.parse_number('0.06')
@@ -1455,7 +1456,7 @@ class coinbase(Exchange, ImplicitAPI):
1455
1456
  'taker': taker,
1456
1457
  'maker': maker,
1457
1458
  'contractSize': contractSize,
1458
- 'expiry': self.parse8601(contractExpire),
1459
+ 'expiry': expireTimestamp,
1459
1460
  'expiryDatetime': contractExpire,
1460
1461
  'strike': None,
1461
1462
  'optionType': None,
@@ -4047,6 +4048,30 @@ class coinbase(Exchange, ImplicitAPI):
4047
4048
  'takeProfitPrice': None,
4048
4049
  })
4049
4050
 
4051
+ def create_auth_token(self, seconds: Int, method: Str = None, url: Str = None):
4052
+ # it may not work for v2
4053
+ uri = None
4054
+ if url is not None:
4055
+ uri = method + ' ' + url.replace('https://', '')
4056
+ quesPos = uri.find('?')
4057
+ # Due to we use mb_strpos, quesPos could be False in php. In that case, the quesPos >= 0 is True
4058
+ # Also it's not possible that the question mark is first character, only check > 0 here.
4059
+ if quesPos > 0:
4060
+ uri = uri[0:quesPos]
4061
+ nonce = self.random_bytes(16)
4062
+ request = {
4063
+ 'aud': ['retail_rest_api_proxy'],
4064
+ 'iss': 'coinbase-cloud',
4065
+ 'nbf': seconds,
4066
+ 'exp': seconds + 120,
4067
+ 'sub': self.apiKey,
4068
+ 'iat': seconds,
4069
+ }
4070
+ if uri is not None:
4071
+ request['uri'] = uri
4072
+ token = self.jwt(request, self.encode(self.secret), 'sha256', False, {'kid': self.apiKey, 'nonce': nonce, 'alg': 'ES256'})
4073
+ return token
4074
+
4050
4075
  def sign(self, path, api=[], method='GET', params={}, headers=None, body=None):
4051
4076
  version = api[0]
4052
4077
  signed = api[1] == 'private'
@@ -4086,24 +4111,26 @@ class coinbase(Exchange, ImplicitAPI):
4086
4111
  if isCloudAPiKey:
4087
4112
  if self.apiKey.startswith('-----BEGIN'):
4088
4113
  raise ArgumentsRequired(self.id + ' apiKey should contain the name(eg: organizations/3b910e93....) and not the public key')
4089
- # it may not work for v2
4090
- uri = method + ' ' + url.replace('https://', '')
4091
- quesPos = uri.find('?')
4092
- # Due to we use mb_strpos, quesPos could be False in php. In that case, the quesPos >= 0 is True
4093
- # Also it's not possible that the question mark is first character, only check > 0 here.
4094
- if quesPos > 0:
4095
- uri = uri[0:quesPos]
4096
- nonce = self.random_bytes(16)
4097
- request = {
4098
- 'aud': ['retail_rest_api_proxy'],
4099
- 'iss': 'coinbase-cloud',
4100
- 'nbf': seconds,
4101
- 'exp': seconds + 120,
4102
- 'sub': self.apiKey,
4103
- 'uri': uri,
4104
- 'iat': seconds,
4105
- }
4106
- token = self.jwt(request, self.encode(self.secret), 'sha256', False, {'kid': self.apiKey, 'nonce': nonce, 'alg': 'ES256'})
4114
+ # # it may not work for v2
4115
+ # uri = method + ' ' + url.replace('https://', '')
4116
+ # quesPos = uri.find('?')
4117
+ # # Due to we use mb_strpos, quesPos could be False in php. In that case, the quesPos >= 0 is True
4118
+ # # Also it's not possible that the question mark is first character, only check > 0 here.
4119
+ # if quesPos > 0:
4120
+ # uri = uri[0:quesPos]
4121
+ # }
4122
+ # nonce = self.random_bytes(16)
4123
+ # request = {
4124
+ # 'aud': ['retail_rest_api_proxy'],
4125
+ # 'iss': 'coinbase-cloud',
4126
+ # 'nbf': seconds,
4127
+ # 'exp': seconds + 120,
4128
+ # 'sub': self.apiKey,
4129
+ # 'uri': uri,
4130
+ # 'iat': seconds,
4131
+ # }
4132
+ token = self.create_auth_token(seconds, method, url)
4133
+ # token = self.jwt(request, self.encode(self.secret), 'sha256', False, {'kid': self.apiKey, 'nonce': nonce, 'alg': 'ES256'})
4107
4134
  authorizationString = 'Bearer ' + token
4108
4135
  else:
4109
4136
  timestampString = str(self.seconds())
ccxt/kraken.py CHANGED
@@ -1501,9 +1501,10 @@ class kraken(Exchange, ImplicitAPI):
1501
1501
  # }
1502
1502
  #
1503
1503
  description = self.safe_dict(order, 'descr', {})
1504
+ orderDescriptionObj = self.safe_dict(order, 'descr') # can be null
1504
1505
  orderDescription = None
1505
- if description is not None:
1506
- orderDescription = self.safe_string(description, 'order')
1506
+ if orderDescriptionObj is not None:
1507
+ orderDescription = self.safe_string(orderDescriptionObj, 'order')
1507
1508
  else:
1508
1509
  orderDescription = self.safe_string(order, 'descr')
1509
1510
  side = None
@@ -1564,8 +1565,8 @@ class kraken(Exchange, ImplicitAPI):
1564
1565
  fee['currency'] = market['base']
1565
1566
  status = self.parse_order_status(self.safe_string(order, 'status'))
1566
1567
  id = self.safe_string_2(order, 'id', 'txid')
1567
- if (id is None) or (id[0:1] == '['):
1568
- txid = self.safe_value(order, 'txid')
1568
+ if (id is None) or (id.startswith('[')):
1569
+ txid = self.safe_list(order, 'txid')
1569
1570
  id = self.safe_string(txid, 0)
1570
1571
  clientOrderId = self.safe_string(order, 'userref')
1571
1572
  rawTrades = self.safe_value(order, 'trades', [])
ccxt/pro/__init__.py CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  # ----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.2.97'
7
+ __version__ = '4.2.99'
8
8
 
9
9
  # ----------------------------------------------------------------------------
10
10
 
ccxt/pro/coinbase.py CHANGED
@@ -9,6 +9,7 @@ import hashlib
9
9
  from ccxt.base.types import Int, Order, OrderBook, Str, Strings, Ticker, Tickers, Trade
10
10
  from typing import List
11
11
  from ccxt.base.errors import ExchangeError
12
+ from ccxt.base.errors import ArgumentsRequired
12
13
 
13
14
 
14
15
  class coinbase(ccxt.async_support.coinbase):
@@ -77,15 +78,32 @@ class coinbase(ccxt.async_support.coinbase):
77
78
  productIds = [market['id']]
78
79
  url = self.urls['api']['ws']
79
80
  timestamp = self.number_to_string(self.seconds())
81
+ isCloudAPiKey = (self.apiKey.find('organizations/') >= 0) or (self.secret.startswith('-----BEGIN'))
80
82
  auth = timestamp + name + ','.join(productIds)
81
83
  subscribe = {
82
84
  'type': 'subscribe',
83
85
  'product_ids': productIds,
84
86
  'channel': name,
85
- 'api_key': self.apiKey,
86
- 'timestamp': timestamp,
87
- 'signature': self.hmac(self.encode(auth), self.encode(self.secret), hashlib.sha256),
87
+ # 'api_key': self.apiKey,
88
+ # 'timestamp': timestamp,
89
+ # 'signature': self.hmac(self.encode(auth), self.encode(self.secret), hashlib.sha256),
88
90
  }
91
+ if not isCloudAPiKey:
92
+ subscribe['api_key'] = self.apiKey
93
+ subscribe['timestamp'] = timestamp
94
+ subscribe['signature'] = self.hmac(self.encode(auth), self.encode(self.secret), hashlib.sha256)
95
+ else:
96
+ if self.apiKey.startswith('-----BEGIN'):
97
+ raise ArgumentsRequired(self.id + ' apiKey should contain the name(eg: organizations/3b910e93....) and not the public key')
98
+ currentToken = self.safe_string(self.options, 'wsToken')
99
+ tokenTimestamp = self.safe_integer(self.options, 'wsTokenTimestamp', 0)
100
+ seconds = self.seconds()
101
+ if currentToken is None or tokenTimestamp + 120 < seconds:
102
+ # we should generate new token
103
+ token = self.create_auth_token(seconds)
104
+ self.options['wsToken'] = token
105
+ self.options['wsTokenTimestamp'] = seconds
106
+ subscribe['jwt'] = self.safe_string(self.options, 'wsToken')
89
107
  return await self.watch(url, messageHash, subscribe, messageHash)
90
108
 
91
109
  async def watch_ticker(self, symbol: str, params={}) -> Ticker:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ccxt
3
- Version: 4.2.97
3
+ Version: 4.2.99
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
@@ -261,13 +261,13 @@ console.log(version, Object.keys(exchanges));
261
261
 
262
262
  All-in-one browser bundle (dependencies included), served from a CDN of your choice:
263
263
 
264
- * jsDelivr: https://cdn.jsdelivr.net/npm/ccxt@4.2.97/dist/ccxt.browser.js
265
- * unpkg: https://unpkg.com/ccxt@4.2.97/dist/ccxt.browser.js
264
+ * jsDelivr: https://cdn.jsdelivr.net/npm/ccxt@4.2.99/dist/ccxt.browser.js
265
+ * unpkg: https://unpkg.com/ccxt@4.2.99/dist/ccxt.browser.js
266
266
 
267
267
  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.
268
268
 
269
269
  ```HTML
270
- <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/ccxt@4.2.97/dist/ccxt.browser.js"></script>
270
+ <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/ccxt@4.2.99/dist/ccxt.browser.js"></script>
271
271
  ```
272
272
 
273
273
  Creates a global `ccxt` object:
@@ -1,4 +1,4 @@
1
- ccxt/__init__.py,sha256=ZN744IsRAmkvkJZudVmZ_TylAFfgBrIf5GNLr3SMsZY,15656
1
+ ccxt/__init__.py,sha256=-5NsxDeHn0RjUkBgv-7ySo4B-xOnTdT1Zu4QExaa4IQ,15656
2
2
  ccxt/ace.py,sha256=yGGKYViya2zCyr1DjWhEu9mknkDAEVsobHmrvJxHfX0,41420
3
3
  ccxt/alpaca.py,sha256=6P2wAEGJQOjjoKQbzv1KvSuZvEZmOX987a1NqB7z9mk,46908
4
4
  ccxt/ascendex.py,sha256=AeDB6xaWaOGBMlsmm8886etqQ3_IOxhtvY5201sjGYc,151300
@@ -37,7 +37,7 @@ ccxt/btcmarkets.py,sha256=XOoDrXKNLvqMbNTUmTNMkQzsyy7oOh_Dw1USiJ8WjEs,51328
37
37
  ccxt/btcturk.py,sha256=p-_zpUEu0aIK5kR4PXQKnAqr9P0ajFsaszyFylUOHeE,36506
38
38
  ccxt/bybit.py,sha256=PgvPYqeTrs9z-qzhjlr6Tqy7heLOQDc1ENH_5FSlcbU,401635
39
39
  ccxt/cex.py,sha256=CfQ_1t-Em16bYl-5DmzqJzC8rxrdk9CCxq7Q0ON7vOM,69653
40
- ccxt/coinbase.py,sha256=Xq1Hm1Dshq9BRSh4aJj60-_gZsKeZoHKB_6aZwXBFzU,201676
40
+ ccxt/coinbase.py,sha256=6c4fSP4KlR9zsQAxKronfMYtL2ahC4z6LWHiwGSkWnc,202878
41
41
  ccxt/coinbaseinternational.py,sha256=RnTdgTmkia2wpMBW2pZR_yvUzWIC-7hfXFun8v6pW0k,87123
42
42
  ccxt/coinbasepro.py,sha256=JdHrR6nr9sBmxsPfiql_pRGM5y8mP4NRUV1viSCeKwU,78377
43
43
  ccxt/coincheck.py,sha256=16rD9tUt0Ww8pjSTDD1CQ28wusKil0FnFRiUvzj9FwQ,35513
@@ -69,7 +69,7 @@ ccxt/hyperliquid.py,sha256=DWU4nZGKPxZmwhPMBsXWqIJAG6b_M2ly44sa2OelhSc,92412
69
69
  ccxt/idex.py,sha256=CUitIG8A6wXceGhyJyb42SdJ7lIIK3UWHzeyrBg9v9Y,72809
70
70
  ccxt/independentreserve.py,sha256=nRprUlIbJ2ipFavUim5Ad46oYSEz8cpqFL1gg1hN-Mg,32024
71
71
  ccxt/indodax.py,sha256=0Uv6cHkrvmLHOV5YaMMfs3Le5qwbNtAmLP2eZl_m8wo,51779
72
- ccxt/kraken.py,sha256=vRSKh5aNM2pg6LZYm74RY48M5t9RK7-UzlkNCOo9POA,123935
72
+ ccxt/kraken.py,sha256=hrbxDpIH8_oJGG4gTe2HEb3zp-vUP9jXg8I-I1h0fKg,124030
73
73
  ccxt/krakenfutures.py,sha256=2QLNQ5Jw1vc2VELeVOtGNY029lKRAovFoV2iBzb_rCw,115673
74
74
  ccxt/kucoin.py,sha256=kX0lvMbQcSnLyHuj9v6WFcetFk77k5IyNmc0X6XlXlc,214705
75
75
  ccxt/kucoinfutures.py,sha256=Mkzn3sg13r-qW_gEgt8RsrW4MezlZtX96DXJerCVw6k,118519
@@ -207,7 +207,7 @@ ccxt/abstract/woo.py,sha256=E-QXVJKVI4EOW72NX6wv99px9EyitWtd9KWvXUc9Tyo,10216
207
207
  ccxt/abstract/yobit.py,sha256=8ycfCO8ORFly9hc0Aa47sZyX4_ZKPXS9h9yJzI-uQ7Q,1339
208
208
  ccxt/abstract/zaif.py,sha256=m15WHdl3gYy0GOXNZ8NEH8eE7sVh8c0T_ITNuU8vXeU,3935
209
209
  ccxt/abstract/zonda.py,sha256=aSfewvRojzmuymX6QbOnDR8v9VFqWTULMHX9Y7kKD1M,5820
210
- ccxt/async_support/__init__.py,sha256=_JH7LXQGjp60s2Ouu75ORV80DiCQ1lPgXM57j2ccgfw,15409
210
+ ccxt/async_support/__init__.py,sha256=GTr4zx8SdICSVL1yNp97DxuBKHw9MxfXPJ8AZaQPV4M,15409
211
211
  ccxt/async_support/ace.py,sha256=kbkibefA6HaHJSNoL_MPmbPUn7n2wyruxBOR7BXmUmQ,41644
212
212
  ccxt/async_support/alpaca.py,sha256=Nsaff9RczBhiNF19RlqI6wggvEibV_2ICgB8H5Qiuck,47120
213
213
  ccxt/async_support/ascendex.py,sha256=QGyP437RJJutP1Wau_B5JyMLtvwgvaMg15zlQXDhfUE,152088
@@ -246,7 +246,7 @@ ccxt/async_support/btcmarkets.py,sha256=b6izd3cD8P3swetbESyX1N0qD3K0sZI7PX4qMjWm
246
246
  ccxt/async_support/btcturk.py,sha256=nz0nAY_whtiOupBWqdKjrYvpe6Ynu82b_SsB8kd5DC0,36724
247
247
  ccxt/async_support/bybit.py,sha256=DMTulzeqpQj-jFsY7qH2dyQbnvoXKa41awkEqWhdAFs,403379
248
248
  ccxt/async_support/cex.py,sha256=_zLkiZaE0dT7yTuJtgkFQlmuzj6M5dQQvI_VXkKsBCc,70003
249
- ccxt/async_support/coinbase.py,sha256=VEGeIYJEiZ0JvAl7cUd_bPMrm-ddXbGO-dJednAFRDc,202728
249
+ ccxt/async_support/coinbase.py,sha256=K5AYf8H7ctSqOogv9_yIcX_ve6VS6W-mSXzbTz0-s0A,203930
250
250
  ccxt/async_support/coinbaseinternational.py,sha256=d_6C7iQFn1giEh1Sr7Wm2fhG9QtGYx1pMkeJXpwjZvM,87677
251
251
  ccxt/async_support/coinbasepro.py,sha256=H32l_mejuo2ATe4_Hac3vFgRTIxSPuDDFHz2pdQOLnw,78883
252
252
  ccxt/async_support/coincheck.py,sha256=LbgeqG4WkPMXZid_LZstU6Vzv6C4-xRkt_mLb4wudGc,35719
@@ -278,7 +278,7 @@ ccxt/async_support/hyperliquid.py,sha256=XVu7E1x3MgU6LM5WUWXCQs0i1eJD7PdBJi_7hDv
278
278
  ccxt/async_support/idex.py,sha256=UVFjkPyNlRN92W4zWt7R_og3g0a3SNfzWHKnSyZLKw0,73285
279
279
  ccxt/async_support/independentreserve.py,sha256=02gCggRgFSmIdJyG5vO-R2JXNbB3u6U1TH2cfdckhdU,32284
280
280
  ccxt/async_support/indodax.py,sha256=4ebi88kkmmJdLH1nvwds5EXNVNJV78U4CMFRSQ26ie0,52087
281
- ccxt/async_support/kraken.py,sha256=68o1Ag6M7iLfe7vqfzZs8c5UBpP5dUcGhefx4mG_XUk,124519
281
+ ccxt/async_support/kraken.py,sha256=flntvB2c5KlnAq6YGSTvvBrIRFnV0PUj9sEtTV2kAdA,124614
282
282
  ccxt/async_support/krakenfutures.py,sha256=7kXGYak9jf74JvgjE5WxNYiN3_-LdSR7MRBE14VtAHw,116143
283
283
  ccxt/async_support/kucoin.py,sha256=IM_tMGOZ3LsaxQwOs5SefBbBa07sxfSqZehEGsPqOtE,215759
284
284
  ccxt/async_support/kucoinfutures.py,sha256=wMiqQhM6OAYsekbG2srW5VD4cCo2GekQxaX3PCc1Htk,119121
@@ -313,7 +313,7 @@ ccxt/async_support/yobit.py,sha256=EgBPquMnD4GU32jnWp1FXUxlMyC1nYPtRzJCZUG_HMY,5
313
313
  ccxt/async_support/zaif.py,sha256=PaHcaNijKkhocrw6DZoSBNUjBOLNlkUYtsJvPAqkx68,28134
314
314
  ccxt/async_support/zonda.py,sha256=89EXub_DW_p4Rpza9iiW-hAaj3ucKbNdZyV2ETQ3ESY,80866
315
315
  ccxt/async_support/base/__init__.py,sha256=aVYSsFi--b4InRs9zDN_wtCpj8odosAB726JdUHavrk,67
316
- ccxt/async_support/base/exchange.py,sha256=rx2gtj2fnWTkJOGc620VB3Ptw2WuoviU-0TLwNYdRMA,91521
316
+ ccxt/async_support/base/exchange.py,sha256=GER2aYQMFG2wpdnhJJULahcZU6Kss0wKiqEfb-YT3T0,91521
317
317
  ccxt/async_support/base/throttler.py,sha256=tvDVcdRUVYi8fZRlEcnqtgzcgB_KMUMRs5Pu8tuU-tU,1847
318
318
  ccxt/async_support/base/ws/__init__.py,sha256=uockzpLuwntKGZbs5EOWFe-Zg-k6Cj7GhNJLc_RX0so,1791
319
319
  ccxt/async_support/base/ws/aiohttp_client.py,sha256=Ed1765emEde2Hj8Ys6f5EjS54ZI1wQ0qIhd04eB7yhU,5751
@@ -327,10 +327,10 @@ ccxt/async_support/base/ws/order_book_side.py,sha256=Pxrq22nCODckJ6G1OXkYEmUunIu
327
327
  ccxt/base/__init__.py,sha256=eTx1OE3HJjspFUQjGm6LBhaQiMKJnXjkdP-JUXknyQ0,1320
328
328
  ccxt/base/decimal_to_precision.py,sha256=fgWRBzRTtsf3r2INyS4f7WHlzgjB5YM1ekiwqD21aac,6634
329
329
  ccxt/base/errors.py,sha256=u_zxABGVPU_K5oLEEZQWOI0_F5Q-SAUq1g1q6AFh7IM,4107
330
- ccxt/base/exchange.py,sha256=XcZ-pZcu_v1znE3Jfn03hi9cOHIKqKbH9kesKXj7DxM,256006
330
+ ccxt/base/exchange.py,sha256=RYBUgCkmecH4BclvoWleFxEErvRLBva298fd-AjLAXA,256006
331
331
  ccxt/base/precise.py,sha256=_xfu54sV0vWNnOfGTKRFykeuWP8mn4K1m9lk1tcllX4,8565
332
332
  ccxt/base/types.py,sha256=x9KoAaFdEPJD2l8ottMk4xKr-tEdby77jKaAK8XcIgo,7903
333
- ccxt/pro/__init__.py,sha256=U9jsS8Wrw9LlqRpRDRNKGvTl9hZJJRHLL6Ingqtm0Lk,6999
333
+ ccxt/pro/__init__.py,sha256=Tvsdp-cOW4boltpC61tLpDqXpY5n4JCkNHyve3Ov76s,6999
334
334
  ccxt/pro/alpaca.py,sha256=7ePyWli0949ti5UheIn553xmnFpedrNc2W5CKauSZio,27167
335
335
  ccxt/pro/ascendex.py,sha256=fCM3EujSfJvtvffqI56UAstTtwjXFIocwukm15cF8rE,35432
336
336
  ccxt/pro/bequant.py,sha256=5zbsP8BHQTUZ8ZNL6uaACxDbUClgkOV4SYfXT_LfQVg,1351
@@ -354,7 +354,7 @@ ccxt/pro/bitvavo.py,sha256=5xzpVRMcI2z0r41eoN-NORr5-qQYBao_bMsH8all9Q0,56143
354
354
  ccxt/pro/blockchaincom.py,sha256=Uv1ijvxvFGrqFPH6iifCk5AgQYTDsXUa5n0ktpusVjM,29560
355
355
  ccxt/pro/bybit.py,sha256=INf7Qfo1CRR5m6yv9w6YNirE0hFOED6J1ztV9kkQ53M,75022
356
356
  ccxt/pro/cex.py,sha256=sxpyOCappmjLVOGa4CxYh1tcswHU23xz4FrTlJsjirk,58370
357
- ccxt/pro/coinbase.py,sha256=151f3WFjrU-DplD_k35KJSmJ4fmh-EQkyhDzsE5EBWQ,24508
357
+ ccxt/pro/coinbase.py,sha256=icUrGgWl5IJ7C4-XRnaIXbSRs1dgIdktiDEmSG4-iUs,25652
358
358
  ccxt/pro/coinbaseinternational.py,sha256=9Pbe6je_6nqA7SviyzmcR_4CscKdQzBYNLECOYJ4BoU,25428
359
359
  ccxt/pro/coinbasepro.py,sha256=94ZXmg-Ez5tSiUYP98nu-gWvuXb-Dk4WHMVsXOR8AK0,38945
360
360
  ccxt/pro/coincheck.py,sha256=MKAPHJeVifQaCKPla-7RY86TIWyDGe4nvjRhNmi617w,7789
@@ -529,7 +529,7 @@ ccxt/test/base/test_ticker.py,sha256=cMTIMb1oySNORUCmqI5ZzMswlEyCF6gJMah3vfvo8wQ
529
529
  ccxt/test/base/test_trade.py,sha256=PMtmB8V38dpaP-eb8h488xYMlR6D69yCOhsA1RuWrUA,2336
530
530
  ccxt/test/base/test_trading_fee.py,sha256=2aDCNJtqBkTC_AieO0l1HYGq5hz5qkWlkWb9Nv_fcwk,1066
531
531
  ccxt/test/base/test_transaction.py,sha256=BTbB4UHHXkrvYgwbrhh867nVRlevmIkIrz1W_odlQJI,1434
532
- ccxt-4.2.97.dist-info/METADATA,sha256=UV_Y4Pe4RzLGsiuEIsSYaUIoy46OYTDTASVfKGVOonw,110281
533
- ccxt-4.2.97.dist-info/WHEEL,sha256=P2T-6epvtXQ2cBOE_U1K4_noqlJFN3tj15djMgEu4NM,110
534
- ccxt-4.2.97.dist-info/top_level.txt,sha256=CkQDuCTDKNcImPV60t36G6MdYfxsAPNiSaEwifVoVMo,5
535
- ccxt-4.2.97.dist-info/RECORD,,
532
+ ccxt-4.2.99.dist-info/METADATA,sha256=wO9ND9p826hT6ik8QfzQtc15jl71LZcPtghe9GGAVng,110281
533
+ ccxt-4.2.99.dist-info/WHEEL,sha256=P2T-6epvtXQ2cBOE_U1K4_noqlJFN3tj15djMgEu4NM,110
534
+ ccxt-4.2.99.dist-info/top_level.txt,sha256=CkQDuCTDKNcImPV60t36G6MdYfxsAPNiSaEwifVoVMo,5
535
+ ccxt-4.2.99.dist-info/RECORD,,
File without changes