ccxt 4.2.36__py2.py3-none-any.whl → 4.2.37__py2.py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- ccxt/__init__.py +1 -1
- ccxt/abstract/bitfinex2.py +122 -122
- ccxt/async_support/__init__.py +1 -1
- ccxt/async_support/base/exchange.py +1 -1
- ccxt/async_support/binance.py +122 -55
- ccxt/async_support/bitfinex2.py +122 -122
- ccxt/async_support/bitmex.py +22 -3
- ccxt/async_support/bybit.py +11 -4
- ccxt/base/exchange.py +1 -1
- ccxt/binance.py +122 -55
- ccxt/bitfinex2.py +122 -122
- ccxt/bitmex.py +22 -3
- ccxt/bybit.py +11 -4
- ccxt/pro/__init__.py +1 -1
- ccxt/pro/gemini.py +165 -3
- ccxt/test/test_async.py +8 -6
- ccxt/test/test_sync.py +8 -6
- {ccxt-4.2.36.dist-info → ccxt-4.2.37.dist-info}/METADATA +6 -6
- {ccxt-4.2.36.dist-info → ccxt-4.2.37.dist-info}/RECORD +21 -21
- {ccxt-4.2.36.dist-info → ccxt-4.2.37.dist-info}/WHEEL +0 -0
- {ccxt-4.2.36.dist-info → ccxt-4.2.37.dist-info}/top_level.txt +0 -0
ccxt/pro/gemini.py
CHANGED
@@ -10,6 +10,7 @@ from ccxt.base.types import Int, Order, OrderBook, Str, Trade
|
|
10
10
|
from ccxt.async_support.base.ws.client import Client
|
11
11
|
from typing import List
|
12
12
|
from ccxt.base.errors import ExchangeError
|
13
|
+
from ccxt.base.errors import NotSupported
|
13
14
|
|
14
15
|
|
15
16
|
class gemini(ccxt.async_support.gemini):
|
@@ -22,9 +23,11 @@ class gemini(ccxt.async_support.gemini):
|
|
22
23
|
'watchTicker': False,
|
23
24
|
'watchTickers': False,
|
24
25
|
'watchTrades': True,
|
26
|
+
'watchTradesForSymbols': True,
|
25
27
|
'watchMyTrades': False,
|
26
28
|
'watchOrders': True,
|
27
29
|
'watchOrderBook': True,
|
30
|
+
'watchOrderBookForSymbols': True,
|
28
31
|
'watchOHLCV': True,
|
29
32
|
},
|
30
33
|
'hostname': 'api.gemini.com',
|
@@ -70,7 +73,26 @@ class gemini(ccxt.async_support.gemini):
|
|
70
73
|
limit = trades.getLimit(market['symbol'], limit)
|
71
74
|
return self.filter_by_since_limit(trades, since, limit, 'timestamp', True)
|
72
75
|
|
73
|
-
def
|
76
|
+
async def watch_trades_for_symbols(self, symbols: List[str], since: Int = None, limit: Int = None, params={}) -> List[Trade]:
|
77
|
+
"""
|
78
|
+
:see: https://docs.gemini.com/websocket-api/#multi-market-data
|
79
|
+
get the list of most recent trades for a list of symbols
|
80
|
+
:param str[] symbols: unified symbol of the market to fetch trades for
|
81
|
+
:param int [since]: timestamp in ms of the earliest trade to fetch
|
82
|
+
:param int [limit]: the maximum amount of trades to fetch
|
83
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
84
|
+
:returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=public-trades>`
|
85
|
+
"""
|
86
|
+
trades = await self.helper_for_watch_multiple_construct('trades', symbols, params)
|
87
|
+
if self.newUpdates:
|
88
|
+
first = self.safe_list(trades, 0)
|
89
|
+
tradeSymbol = self.safe_string(first, 'symbol')
|
90
|
+
limit = trades.getLimit(tradeSymbol, limit)
|
91
|
+
return self.filter_by_since_limit(trades, since, limit, 'timestamp', True)
|
92
|
+
|
93
|
+
def parse_ws_trade(self, trade, market=None) -> Trade:
|
94
|
+
#
|
95
|
+
# regular v2 trade
|
74
96
|
#
|
75
97
|
# {
|
76
98
|
# "type": "trade",
|
@@ -82,11 +104,28 @@ class gemini(ccxt.async_support.gemini):
|
|
82
104
|
# "side": "buy"
|
83
105
|
# }
|
84
106
|
#
|
107
|
+
# multi data trade
|
108
|
+
#
|
109
|
+
# {
|
110
|
+
# "type": "trade",
|
111
|
+
# "symbol": "ETHUSD",
|
112
|
+
# "tid": "1683002242170204", # self is not TS, but somewhat ID
|
113
|
+
# "price": "2299.24",
|
114
|
+
# "amount": "0.002662",
|
115
|
+
# "makerSide": "bid"
|
116
|
+
# }
|
117
|
+
#
|
85
118
|
timestamp = self.safe_integer(trade, 'timestamp')
|
86
|
-
id = self.
|
119
|
+
id = self.safe_string_2(trade, 'event_id', 'tid')
|
87
120
|
priceString = self.safe_string(trade, 'price')
|
88
|
-
amountString = self.
|
121
|
+
amountString = self.safe_string_2(trade, 'quantity', 'amount')
|
89
122
|
side = self.safe_string_lower(trade, 'side')
|
123
|
+
if side is None:
|
124
|
+
marketSide = self.safe_string_lower(trade, 'makerSide')
|
125
|
+
if marketSide == 'bid':
|
126
|
+
side = 'sell'
|
127
|
+
elif marketSide == 'ask':
|
128
|
+
side = 'buy'
|
90
129
|
marketId = self.safe_string_lower(trade, 'symbol')
|
91
130
|
symbol = self.safe_symbol(marketId, market)
|
92
131
|
return self.safe_trade({
|
@@ -182,6 +221,30 @@ class gemini(ccxt.async_support.gemini):
|
|
182
221
|
messageHash = 'trades:' + symbol
|
183
222
|
client.resolve(stored, messageHash)
|
184
223
|
|
224
|
+
def handle_trades_for_multidata(self, client: Client, trades, timestamp: Int):
|
225
|
+
if trades is not None:
|
226
|
+
tradesLimit = self.safe_integer(self.options, 'tradesLimit', 1000)
|
227
|
+
storesForSymbols = {}
|
228
|
+
for i in range(0, len(trades)):
|
229
|
+
marketId = trades[i]['symbol']
|
230
|
+
market = self.safe_market(marketId.lower())
|
231
|
+
symbol = market['symbol']
|
232
|
+
trade = self.parse_ws_trade(trades[i], market)
|
233
|
+
trade['timestamp'] = timestamp
|
234
|
+
trade['datetime'] = self.iso8601(timestamp)
|
235
|
+
stored = self.safe_value(self.trades, symbol)
|
236
|
+
if stored is None:
|
237
|
+
stored = ArrayCache(tradesLimit)
|
238
|
+
self.trades[symbol] = stored
|
239
|
+
stored.append(trade)
|
240
|
+
storesForSymbols[symbol] = stored
|
241
|
+
symbols = list(storesForSymbols.keys())
|
242
|
+
for i in range(0, len(symbols)):
|
243
|
+
symbol = symbols[i]
|
244
|
+
stored = storesForSymbols[symbol]
|
245
|
+
messageHash = 'trades:' + symbol
|
246
|
+
client.resolve(stored, messageHash)
|
247
|
+
|
185
248
|
async def watch_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}) -> List[list]:
|
186
249
|
"""
|
187
250
|
watches historical candlestick data containing the open, high, low, and close price, and the volume of a market
|
@@ -317,6 +380,83 @@ class gemini(ccxt.async_support.gemini):
|
|
317
380
|
self.orderbooks[symbol] = orderbook
|
318
381
|
client.resolve(orderbook, messageHash)
|
319
382
|
|
383
|
+
async def watch_order_book_for_symbols(self, symbols: List[str], limit: Int = None, params={}) -> OrderBook:
|
384
|
+
"""
|
385
|
+
watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
|
386
|
+
:see: https://docs.gemini.com/websocket-api/#multi-market-data
|
387
|
+
:param str[] symbols: unified array of symbols
|
388
|
+
:param int [limit]: the maximum amount of order book entries to return
|
389
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
390
|
+
:returns dict: A dictionary of `order book structures <https://docs.ccxt.com/#/?id=order-book-structure>` indexed by market symbols
|
391
|
+
"""
|
392
|
+
orderbook = await self.helper_for_watch_multiple_construct('orderbook', symbols, params)
|
393
|
+
return orderbook.limit()
|
394
|
+
|
395
|
+
async def helper_for_watch_multiple_construct(self, itemHashName: str, symbols: List[str], params={}):
|
396
|
+
await self.load_markets()
|
397
|
+
symbols = self.market_symbols(symbols, None, False, True, True)
|
398
|
+
firstMarket = self.market(symbols[0])
|
399
|
+
if not firstMarket['spot'] and not firstMarket['linear']:
|
400
|
+
raise NotSupported(self.id + ' watchMultiple supports only spot or linear-swap symbols')
|
401
|
+
messageHashes = []
|
402
|
+
marketIds = []
|
403
|
+
for i in range(0, len(symbols)):
|
404
|
+
symbol = symbols[i]
|
405
|
+
messageHash = itemHashName + ':' + symbol
|
406
|
+
messageHashes.append(messageHash)
|
407
|
+
market = self.market(symbol)
|
408
|
+
marketIds.append(market['id'])
|
409
|
+
queryStr = ','.join(marketIds)
|
410
|
+
url = self.urls['api']['ws'] + '/v1/multimarketdata?symbols=' + queryStr + '&heartbeat=true&'
|
411
|
+
if itemHashName == 'orderbook':
|
412
|
+
url += 'trades=false&bids=true&offers=true'
|
413
|
+
elif itemHashName == 'trades':
|
414
|
+
url += 'trades=true&bids=false&offers=false'
|
415
|
+
return await self.watch_multiple(url, messageHashes, None)
|
416
|
+
|
417
|
+
def handle_order_book_for_multidata(self, client: Client, rawOrderBookChanges, timestamp: Int, nonce: Int):
|
418
|
+
#
|
419
|
+
# rawOrderBookChanges
|
420
|
+
#
|
421
|
+
# [
|
422
|
+
# {
|
423
|
+
# delta: "4105123935484.817624",
|
424
|
+
# price: "0.000000001",
|
425
|
+
# reason: "initial", # initial|cancel|place
|
426
|
+
# remaining: "4105123935484.817624",
|
427
|
+
# side: "bid", # bid|ask
|
428
|
+
# symbol: "SHIBUSD",
|
429
|
+
# type: "change", # seems always change
|
430
|
+
# },
|
431
|
+
# ...
|
432
|
+
#
|
433
|
+
marketId = rawOrderBookChanges[0]['symbol']
|
434
|
+
market = self.safe_market(marketId.lower())
|
435
|
+
symbol = market['symbol']
|
436
|
+
messageHash = 'orderbook:' + symbol
|
437
|
+
orderbook = self.safe_dict(self.orderbooks, symbol)
|
438
|
+
if orderbook is None:
|
439
|
+
orderbook = self.order_book()
|
440
|
+
bids = orderbook['bids']
|
441
|
+
asks = orderbook['asks']
|
442
|
+
for i in range(0, len(rawOrderBookChanges)):
|
443
|
+
entry = rawOrderBookChanges[i]
|
444
|
+
price = self.safe_number(entry, 'price')
|
445
|
+
size = self.safe_number(entry, 'remaining')
|
446
|
+
rawSide = self.safe_string(entry, 'side')
|
447
|
+
if rawSide == 'bid':
|
448
|
+
bids.store(price, size)
|
449
|
+
else:
|
450
|
+
asks.store(price, size)
|
451
|
+
orderbook['bids'] = bids
|
452
|
+
orderbook['asks'] = asks
|
453
|
+
orderbook['symbol'] = symbol
|
454
|
+
orderbook['nonce'] = nonce
|
455
|
+
orderbook['timestamp'] = timestamp
|
456
|
+
orderbook['datetime'] = self.iso8601(timestamp)
|
457
|
+
self.orderbooks[symbol] = orderbook
|
458
|
+
client.resolve(orderbook, messageHash)
|
459
|
+
|
320
460
|
def handle_l2_updates(self, client: Client, message):
|
321
461
|
#
|
322
462
|
# {
|
@@ -393,6 +533,7 @@ class gemini(ccxt.async_support.gemini):
|
|
393
533
|
# "socket_sequence": 7
|
394
534
|
# }
|
395
535
|
#
|
536
|
+
client.lastPong = self.milliseconds()
|
396
537
|
return message
|
397
538
|
|
398
539
|
def handle_subscription(self, client: Client, message):
|
@@ -586,6 +727,27 @@ class gemini(ccxt.async_support.gemini):
|
|
586
727
|
method = self.safe_value(methods, type)
|
587
728
|
if method is not None:
|
588
729
|
method(client, message)
|
730
|
+
# handle multimarketdata
|
731
|
+
if type == 'update':
|
732
|
+
ts = self.safe_integer(message, 'timestampms', self.milliseconds())
|
733
|
+
eventId = self.safe_integer(message, 'eventId')
|
734
|
+
events = self.safe_list(message, 'events')
|
735
|
+
orderBookItems = []
|
736
|
+
collectedEventsOfTrades = []
|
737
|
+
for i in range(0, len(events)):
|
738
|
+
event = events[i]
|
739
|
+
eventType = self.safe_string(event, 'type')
|
740
|
+
isOrderBook = (eventType == 'change') and ('side' in event) and self.in_array(event['side'], ['ask', 'bid'])
|
741
|
+
if isOrderBook:
|
742
|
+
orderBookItems.append(event)
|
743
|
+
elif eventType == 'trade':
|
744
|
+
collectedEventsOfTrades.append(events[i])
|
745
|
+
lengthOb = len(orderBookItems)
|
746
|
+
if lengthOb > 0:
|
747
|
+
self.handle_order_book_for_multidata(client, orderBookItems, ts, eventId)
|
748
|
+
lengthTrades = len(collectedEventsOfTrades)
|
749
|
+
if lengthTrades > 0:
|
750
|
+
self.handle_trades_for_multidata(client, collectedEventsOfTrades, ts)
|
589
751
|
|
590
752
|
async def authenticate(self, params={}):
|
591
753
|
url = self.safe_string(params, 'url')
|
ccxt/test/test_async.py
CHANGED
@@ -816,10 +816,10 @@ class testMainClass(baseMainTestClass):
|
|
816
816
|
# --- Init of static tests functions------------------------------------------
|
817
817
|
# -----------------------------------------------------------------------------
|
818
818
|
calculated_string = json_stringify(calculated_output)
|
819
|
-
|
820
|
-
error_message = message + '
|
819
|
+
stored_string = json_stringify(stored_output)
|
820
|
+
error_message = message + ' computed ' + stored_string + ' stored: ' + calculated_string
|
821
821
|
if key is not None:
|
822
|
-
error_message = ' | ' + key + ' | ' + 'computed value: ' +
|
822
|
+
error_message = ' | ' + key + ' | ' + 'computed value: ' + stored_string + ' stored value: ' + calculated_string
|
823
823
|
assert cond, error_message
|
824
824
|
|
825
825
|
def load_markets_from_file(self, id):
|
@@ -1141,7 +1141,9 @@ class testMainClass(baseMainTestClass):
|
|
1141
1141
|
await close(exchange)
|
1142
1142
|
return True # in c# methods that will be used with promiseAll need to return something
|
1143
1143
|
|
1144
|
-
def get_number_of_tests_from_exchange(self, exchange, exchange_data):
|
1144
|
+
def get_number_of_tests_from_exchange(self, exchange, exchange_data, test_name=None):
|
1145
|
+
if test_name is not None:
|
1146
|
+
return 1
|
1145
1147
|
sum = 0
|
1146
1148
|
methods = exchange_data['methods']
|
1147
1149
|
methods_names = list(methods.keys())
|
@@ -1171,7 +1173,7 @@ class testMainClass(baseMainTestClass):
|
|
1171
1173
|
for i in range(0, len(exchanges)):
|
1172
1174
|
exchange_name = exchanges[i]
|
1173
1175
|
exchange_data = static_data[exchange_name]
|
1174
|
-
number_of_tests = self.get_number_of_tests_from_exchange(exchange, exchange_data)
|
1176
|
+
number_of_tests = self.get_number_of_tests_from_exchange(exchange, exchange_data, test_name)
|
1175
1177
|
sum = exchange.sum(sum, number_of_tests)
|
1176
1178
|
if type == 'request':
|
1177
1179
|
promises.append(self.test_exchange_request_statically(exchange_name, exchange_data, test_name))
|
@@ -1444,5 +1446,5 @@ class testMainClass(baseMainTestClass):
|
|
1444
1446
|
|
1445
1447
|
|
1446
1448
|
if __name__ == '__main__':
|
1447
|
-
symbol = argv.symbol if argv.symbol
|
1449
|
+
symbol = argv.symbol if argv.symbol else None
|
1448
1450
|
asyncio.run(testMainClass().init(argv.exchange, symbol))
|
ccxt/test/test_sync.py
CHANGED
@@ -815,10 +815,10 @@ class testMainClass(baseMainTestClass):
|
|
815
815
|
# --- Init of static tests functions------------------------------------------
|
816
816
|
# -----------------------------------------------------------------------------
|
817
817
|
calculated_string = json_stringify(calculated_output)
|
818
|
-
|
819
|
-
error_message = message + '
|
818
|
+
stored_string = json_stringify(stored_output)
|
819
|
+
error_message = message + ' computed ' + stored_string + ' stored: ' + calculated_string
|
820
820
|
if key is not None:
|
821
|
-
error_message = ' | ' + key + ' | ' + 'computed value: ' +
|
821
|
+
error_message = ' | ' + key + ' | ' + 'computed value: ' + stored_string + ' stored value: ' + calculated_string
|
822
822
|
assert cond, error_message
|
823
823
|
|
824
824
|
def load_markets_from_file(self, id):
|
@@ -1140,7 +1140,9 @@ class testMainClass(baseMainTestClass):
|
|
1140
1140
|
close(exchange)
|
1141
1141
|
return True # in c# methods that will be used with promiseAll need to return something
|
1142
1142
|
|
1143
|
-
def get_number_of_tests_from_exchange(self, exchange, exchange_data):
|
1143
|
+
def get_number_of_tests_from_exchange(self, exchange, exchange_data, test_name=None):
|
1144
|
+
if test_name is not None:
|
1145
|
+
return 1
|
1144
1146
|
sum = 0
|
1145
1147
|
methods = exchange_data['methods']
|
1146
1148
|
methods_names = list(methods.keys())
|
@@ -1170,7 +1172,7 @@ class testMainClass(baseMainTestClass):
|
|
1170
1172
|
for i in range(0, len(exchanges)):
|
1171
1173
|
exchange_name = exchanges[i]
|
1172
1174
|
exchange_data = static_data[exchange_name]
|
1173
|
-
number_of_tests = self.get_number_of_tests_from_exchange(exchange, exchange_data)
|
1175
|
+
number_of_tests = self.get_number_of_tests_from_exchange(exchange, exchange_data, test_name)
|
1174
1176
|
sum = exchange.sum(sum, number_of_tests)
|
1175
1177
|
if type == 'request':
|
1176
1178
|
promises.append(self.test_exchange_request_statically(exchange_name, exchange_data, test_name))
|
@@ -1443,5 +1445,5 @@ class testMainClass(baseMainTestClass):
|
|
1443
1445
|
|
1444
1446
|
|
1445
1447
|
if __name__ == '__main__':
|
1446
|
-
symbol = argv.symbol if argv.symbol
|
1448
|
+
symbol = argv.symbol if argv.symbol else None
|
1447
1449
|
(testMainClass().init(argv.exchange, symbol))
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: ccxt
|
3
|
-
Version: 4.2.
|
3
|
+
Version: 4.2.37
|
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
|
@@ -215,7 +215,7 @@ The easiest way to install the CCXT library is to use a package manager:
|
|
215
215
|
- [ccxt in **NPM**](https://www.npmjs.com/package/ccxt) (JavaScript / Node v7.6+)
|
216
216
|
- [ccxt in **PyPI**](https://pypi.python.org/pypi/ccxt) (Python 3.7.0+)
|
217
217
|
- [ccxt in **Packagist/Composer**](https://packagist.org/packages/ccxt/ccxt) (PHP 7.0+)
|
218
|
-
- [ccxt in **
|
218
|
+
- [ccxt in **Nuget**](https://www.nuget.org/packages/ccxt) (netstandard 2.0)
|
219
219
|
|
220
220
|
This library is shipped as an all-in-one module implementation with minimalistic dependencies and requirements:
|
221
221
|
|
@@ -258,13 +258,13 @@ console.log(version, Object.keys(exchanges));
|
|
258
258
|
|
259
259
|
All-in-one browser bundle (dependencies included), served from a CDN of your choice:
|
260
260
|
|
261
|
-
* jsDelivr: https://cdn.jsdelivr.net/npm/ccxt@4.2.
|
262
|
-
* unpkg: https://unpkg.com/ccxt@4.2.
|
261
|
+
* jsDelivr: https://cdn.jsdelivr.net/npm/ccxt@4.2.37/dist/ccxt.browser.js
|
262
|
+
* unpkg: https://unpkg.com/ccxt@4.2.37/dist/ccxt.browser.js
|
263
263
|
|
264
264
|
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.
|
265
265
|
|
266
266
|
```HTML
|
267
|
-
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/ccxt@4.2.
|
267
|
+
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/ccxt@4.2.37/dist/ccxt.browser.js"></script>
|
268
268
|
```
|
269
269
|
|
270
270
|
Creates a global `ccxt` object:
|
@@ -313,7 +313,7 @@ The library supports concurrent asynchronous mode using tools from [RecoilPHP](h
|
|
313
313
|
|
314
314
|
### .net/C#
|
315
315
|
|
316
|
-
[ccxt in C# with **
|
316
|
+
[ccxt in C# with **Nuget**](https://www.nuget.org/packages/ccxt) (netstandard 2.0 and netstandard 2.1)
|
317
317
|
```c#
|
318
318
|
using ccxt;
|
319
319
|
Console.WriteLine(ccxt.Exchanges) // check this later
|
@@ -1,10 +1,10 @@
|
|
1
|
-
ccxt/__init__.py,sha256=
|
1
|
+
ccxt/__init__.py,sha256=9u6FZ5fCadBK4ZNjfy-Oa7XbGvHR-asPylSRSp9gWwM,15344
|
2
2
|
ccxt/ace.py,sha256=pIA1Ipres_-IcaIF1hiSewvx3gLNH_19ZPykd4OO5zc,41406
|
3
3
|
ccxt/alpaca.py,sha256=Ac1M6PUcbOQIPQp5DzOX2g1bDRlHf_Nt1EeZN7QpUSE,46260
|
4
4
|
ccxt/ascendex.py,sha256=F1bh6jsHDmCyEe4zFZzzLO8OFvtIxXNcJHUKHkDtu30,143804
|
5
5
|
ccxt/bequant.py,sha256=RBiAmaTbL35DgiV3Hl6uchLUd78V0z1T9riTlNsrpdc,1174
|
6
6
|
ccxt/bigone.py,sha256=IAgG_s-RR649f6kkUzSCqb2y0BjS-TdrH6E0kK4xgbg,91948
|
7
|
-
ccxt/binance.py,sha256=
|
7
|
+
ccxt/binance.py,sha256=WJ6PtWxr4_0BentIlIlyZdgT9tS6u6kgvSn2hAjy0Uo,531456
|
8
8
|
ccxt/binancecoinm.py,sha256=pncdw6Xw2X1Po-vEvAB4nL37scoS_axGAVxetPy1YQs,1645
|
9
9
|
ccxt/binanceus.py,sha256=hdcT4OnadcdFFFjF3GtM0nWv90jqojqwdVS3xWGuW40,9163
|
10
10
|
ccxt/binanceusdm.py,sha256=KPQGlCalQ0eGlPCs2tSanOxaP8O0zFRQjGntA16Yprw,2480
|
@@ -15,13 +15,13 @@ ccxt/bitbay.py,sha256=xAIjzGRDVGwoy-Gygd99H0YN4wiaz_0lR0Z14oxaaxc,478
|
|
15
15
|
ccxt/bitbns.py,sha256=tqJs4hyNpX3TOYVkpvu9xwL1xK_7SPbv7vVxFEUZlMI,48117
|
16
16
|
ccxt/bitcoincom.py,sha256=PyWIl4nC4jp5Uba2lI1At0N_hhNyWD0DoZC_MSyL_s4,502
|
17
17
|
ccxt/bitfinex.py,sha256=euERusdR9OdwCoJNUvCXlcxHkpamXlQtgvBjY5moizA,71366
|
18
|
-
ccxt/bitfinex2.py,sha256=
|
18
|
+
ccxt/bitfinex2.py,sha256=hSNvqFO2aKOyE39QKAZxd6EUpyGL_pvW6J2yIKbTSmA,156324
|
19
19
|
ccxt/bitflyer.py,sha256=4p6VZl4A6WzKMtOzyJDkEZceCAt0vfhtPoU0dZ_avHA,40255
|
20
20
|
ccxt/bitforex.py,sha256=2jV1_cd7rFnIDjIPEda67Ks2NXG8yAcRk9-VE7IcVn0,34985
|
21
21
|
ccxt/bitget.py,sha256=7r0VP6zeV5S1BJUClvWWpv3_vmgRix6d8ufMwgIO5B0,397122
|
22
22
|
ccxt/bithumb.py,sha256=3cj2LShmu63VN3TWmDr7o5jgMjhpR7IRJAUCFCVbliQ,44968
|
23
23
|
ccxt/bitmart.py,sha256=GVgrW_vhH2hRjGoKCO-QguULSmt9OhMAOcbQiEdJ_EU,196962
|
24
|
-
ccxt/bitmex.py,sha256=
|
24
|
+
ccxt/bitmex.py,sha256=sJtmFdCRG8l0fJKQSI0E47KRn5uuZUBO8c71jdX65xg,124048
|
25
25
|
ccxt/bitopro.py,sha256=jiGmyb71Eov0mGhVYYE5ndi1A1W7nSfSzQIKZ0M9rN0,68078
|
26
26
|
ccxt/bitpanda.py,sha256=aiwPkx9lKbVzt4ggoYdq_mIbMGtg5ZtGl2yRHO5xyz8,471
|
27
27
|
ccxt/bitrue.py,sha256=iQtSKFoszrqUM31f712TF-4jbs8A6rqGbxVOdS0VkqU,135964
|
@@ -35,7 +35,7 @@ ccxt/btcalpha.py,sha256=kK9aJ5ThRe7cKyNYgxDHhhZlspbaKjmOSae-31t6QwY,35709
|
|
35
35
|
ccxt/btcbox.py,sha256=RvsTCeX1w8Ih0Xidbxpo34jr3_4HjXolLyfowx7gNIU,22801
|
36
36
|
ccxt/btcmarkets.py,sha256=rar8FR4Bcl_ocUVm_pCmI2EGBD0ZSdVyJjOG-gIGZNo,48605
|
37
37
|
ccxt/btcturk.py,sha256=Lh2ds8tK1XgqDAqGnm8PQk4EZ14n5tULdD2Om6Zrqpc,35474
|
38
|
-
ccxt/bybit.py,sha256=
|
38
|
+
ccxt/bybit.py,sha256=M167t-t9h-X2iyLrsZwEi4NR18G6TRoC50x25Pvod1Y,359108
|
39
39
|
ccxt/cex.py,sha256=Ln6zY3g6x1VN62cvEgXcXgXNW_Od2rr-s5h8-J6wSJw,69539
|
40
40
|
ccxt/coinbase.py,sha256=Aue3Pz66F2vbmANb8evIUlE8Y7Z28sN3dMaIn-snW3s,155318
|
41
41
|
ccxt/coinbasepro.py,sha256=HsA22fyWE2KVupKJdlF_J9nekeXOwDWjOC7ZceuQyEE,78234
|
@@ -117,7 +117,7 @@ ccxt/abstract/bitbay.py,sha256=aSfewvRojzmuymX6QbOnDR8v9VFqWTULMHX9Y7kKD1M,5820
|
|
117
117
|
ccxt/abstract/bitbns.py,sha256=3T3cHS7SgzGipd6F8vzPnmM0x3XNfQXEPjoInD-C1Sw,4082
|
118
118
|
ccxt/abstract/bitcoincom.py,sha256=LNKAn7NXHT8z9Jbz2fOyj5iFmk13jlhylFUNVAMZzfo,15297
|
119
119
|
ccxt/abstract/bitfinex.py,sha256=OLUXdJEycyN_qrBhPuTTOVlwu3jkqVWenoTmS-W3bOE,7605
|
120
|
-
ccxt/abstract/bitfinex2.py,sha256=
|
120
|
+
ccxt/abstract/bitfinex2.py,sha256=82sdkbjDb6D2JePGAa2yYwApDwdeF9Tvlo-hWB2ZUBs,19194
|
121
121
|
ccxt/abstract/bitflyer.py,sha256=3ngG1GJJCNMzYMWoNXCEEgLxmTl7eRf7_JU4M0P2rqo,3576
|
122
122
|
ccxt/abstract/bitforex.py,sha256=_vwOUvBfzQazUvoflGK53m8i7xRgsmzFL4qP5UzqnZ8,2789
|
123
123
|
ccxt/abstract/bitget.py,sha256=y_22qNC2wgVEitCcTp4pCr5-t2YJNhJhMjDhS4p_DWQ,88907
|
@@ -201,13 +201,13 @@ ccxt/abstract/woo.py,sha256=xilL7EbvUmJ_zBb_r1Q7cTi4bHsBQN2mFu0TGu7WHG0,8890
|
|
201
201
|
ccxt/abstract/yobit.py,sha256=8ycfCO8ORFly9hc0Aa47sZyX4_ZKPXS9h9yJzI-uQ7Q,1339
|
202
202
|
ccxt/abstract/zaif.py,sha256=m15WHdl3gYy0GOXNZ8NEH8eE7sVh8c0T_ITNuU8vXeU,3935
|
203
203
|
ccxt/abstract/zonda.py,sha256=aSfewvRojzmuymX6QbOnDR8v9VFqWTULMHX9Y7kKD1M,5820
|
204
|
-
ccxt/async_support/__init__.py,sha256=
|
204
|
+
ccxt/async_support/__init__.py,sha256=ZxI3W8Lf5JhzGCjKWB77sVBuum_QOxDNKrsZkVLwlrY,15067
|
205
205
|
ccxt/async_support/ace.py,sha256=LjNrCLc5OA9CTZ-SCNkBBeSUa144U1ayh6lSw_6GVgI,41630
|
206
206
|
ccxt/async_support/alpaca.py,sha256=Z8cGI1uazQqK7RCLCSw1JEGx03bGTJhxI1_qLQWkmKg,46472
|
207
207
|
ccxt/async_support/ascendex.py,sha256=3F04B4K4Wv8CLOVkgR4CV4IaxP8cAJ4pjRUPfCi_4YY,144544
|
208
208
|
ccxt/async_support/bequant.py,sha256=1hTwHovo1bW1XTIc8ZKjvJ-Xg6LfmpGdzT7TepykaVM,1188
|
209
209
|
ccxt/async_support/bigone.py,sha256=cSj_nr8-2nbFeSl5U_e-9OUjJftbzMUTo04Hzxaqz64,92402
|
210
|
-
ccxt/async_support/binance.py,sha256=
|
210
|
+
ccxt/async_support/binance.py,sha256=9x0tkSft8gI1nTLqmCMHgwvTzZG7bcbAMWDLHaXoV8c,533566
|
211
211
|
ccxt/async_support/binancecoinm.py,sha256=IY3RLZptQA2nmZaUYRGfTa5ZY4VMWBpFYfwHc8zTHw0,1683
|
212
212
|
ccxt/async_support/binanceus.py,sha256=c-K3Tk7LaRJjmYdCx8vBOqsx01uXrtvt0PC2ekBiD0g,9177
|
213
213
|
ccxt/async_support/binanceusdm.py,sha256=-1r4A4tmV2pCiLGO80hzq7MIIj4MTzOD7buZGv6JauA,2518
|
@@ -218,13 +218,13 @@ ccxt/async_support/bitbay.py,sha256=jcaEXi2IhYTva8ezO_SfJhwxEZk7HST4J3NaxD16BQA,
|
|
218
218
|
ccxt/async_support/bitbns.py,sha256=bOIgrLFpDIn7l2QQy_FWh5q-Z7ydVjY2RlDBm0G9hDg,48371
|
219
219
|
ccxt/async_support/bitcoincom.py,sha256=RiqwhK3RfxQ_PXTa860fphDCvwA8dalL-_rXlK85-8A,516
|
220
220
|
ccxt/async_support/bitfinex.py,sha256=NO5aqBBxsXto59Yex9xNOnIOQ_umKk9ehyvH4g4UFiQ,71806
|
221
|
-
ccxt/async_support/bitfinex2.py,sha256=
|
221
|
+
ccxt/async_support/bitfinex2.py,sha256=HhOH2coMvvDw7G_wbzIGKsipGW7_img6A1onB253_fM,157052
|
222
222
|
ccxt/async_support/bitflyer.py,sha256=eiahvUWnJS85H2-T-QSrKL0tsbjwAcr6qBm42Ex9y30,40563
|
223
223
|
ccxt/async_support/bitforex.py,sha256=FVuTzD6_PA2FvoGg6738C1SovO24514b316LMbCp3MM,35227
|
224
224
|
ccxt/async_support/bitget.py,sha256=wqh-oFDTy23HKzJwSLFt4lEUIBjhasz2NnQouTXArMs,398632
|
225
225
|
ccxt/async_support/bithumb.py,sha256=FgtgWvDa4KE3-zAF-yS2z8RjlZOGl539W3JVBc2Gjek,45198
|
226
226
|
ccxt/async_support/bitmart.py,sha256=mnNmKnV7hPErYVtgvKluGut4JpauEVWF5an_57CUyE4,197882
|
227
|
-
ccxt/async_support/bitmex.py,sha256=
|
227
|
+
ccxt/async_support/bitmex.py,sha256=0IgKUE7808dapkRxBqthirKFn-kedN8kyr_jla_IoRY,124590
|
228
228
|
ccxt/async_support/bitopro.py,sha256=JvoWFLeybWV8AM5wBhDypSBjln6UjVqjBuw5sFC30zA,68482
|
229
229
|
ccxt/async_support/bitpanda.py,sha256=2k3URBWrpnh2xHa7JiYenI7_4MW5UeOPGzetlmRkR4U,485
|
230
230
|
ccxt/async_support/bitrue.py,sha256=qdtE7UNsMsMvCLdCxEZwDHNjI7Xv7NC_BGZCoR_rRBc,136622
|
@@ -238,7 +238,7 @@ ccxt/async_support/btcalpha.py,sha256=nndjkWUlst8Gi3lSSykwPofLoWhCO7RkZcZcdSGODk
|
|
238
238
|
ccxt/async_support/btcbox.py,sha256=H2be5bi0-nhTSVoB5KWdeaNGrgbLdwQ6p6Bnrmuv4CI,22995
|
239
239
|
ccxt/async_support/btcmarkets.py,sha256=yhyvfUofxY5qyFYIZNn-HgTPNLsalpnbPaebhNS2DP4,48955
|
240
240
|
ccxt/async_support/btcturk.py,sha256=cvRZl9cIZ9LooMUQRgpXZB5pMQtFXDM1ByVPxIC5KQs,35692
|
241
|
-
ccxt/async_support/bybit.py,sha256=
|
241
|
+
ccxt/async_support/bybit.py,sha256=IiJQpcxju-ADHeDGcjSVludutkniyYH2b0r3y2LU-qA,360606
|
242
242
|
ccxt/async_support/cex.py,sha256=GxAaOy26sy8TD5Z_FRGw9P4PBU09Fhi6vi4cIQFrEZo,69889
|
243
243
|
ccxt/async_support/coinbase.py,sha256=Z1yDpY6tQkCZqXHIHRqKraK6otEvs188Gg-v-o-5RZ4,156124
|
244
244
|
ccxt/async_support/coinbasepro.py,sha256=Xr2FYaCdesVG8ogErl8uar5XTEK-mRA9IvHlObYF550,78740
|
@@ -304,7 +304,7 @@ ccxt/async_support/yobit.py,sha256=MqUDLiaMLL8kTyViJeeJNMaJpbPJH2OXcxykjSvDGio,5
|
|
304
304
|
ccxt/async_support/zaif.py,sha256=A4lhLoQNHt8EWeCH067sQrSiziNZ9nJU_-ZyVE59Xgo,28116
|
305
305
|
ccxt/async_support/zonda.py,sha256=QB54eEAetA72DKzDpYy6uCuDKaiI-PcSf6_wooW6T0s,80735
|
306
306
|
ccxt/async_support/base/__init__.py,sha256=aVYSsFi--b4InRs9zDN_wtCpj8odosAB726JdUHavrk,67
|
307
|
-
ccxt/async_support/base/exchange.py,sha256=
|
307
|
+
ccxt/async_support/base/exchange.py,sha256=lPFvwx8xvuG_wBkhznpjNjuBCfEu7xKnKTkaX5m8ywY,88134
|
308
308
|
ccxt/async_support/base/throttler.py,sha256=tvDVcdRUVYi8fZRlEcnqtgzcgB_KMUMRs5Pu8tuU-tU,1847
|
309
309
|
ccxt/async_support/base/ws/__init__.py,sha256=uockzpLuwntKGZbs5EOWFe-Zg-k6Cj7GhNJLc_RX0so,1791
|
310
310
|
ccxt/async_support/base/ws/aiohttp_client.py,sha256=Ed1765emEde2Hj8Ys6f5EjS54ZI1wQ0qIhd04eB7yhU,5751
|
@@ -318,10 +318,10 @@ ccxt/async_support/base/ws/order_book_side.py,sha256=Pxrq22nCODckJ6G1OXkYEmUunIu
|
|
318
318
|
ccxt/base/__init__.py,sha256=eTx1OE3HJjspFUQjGm6LBhaQiMKJnXjkdP-JUXknyQ0,1320
|
319
319
|
ccxt/base/decimal_to_precision.py,sha256=fgWRBzRTtsf3r2INyS4f7WHlzgjB5YM1ekiwqD21aac,6634
|
320
320
|
ccxt/base/errors.py,sha256=JBn3zTrtru7tLgyEi6MzKAUwiZe0fltQLYoJcsdP-AA,4099
|
321
|
-
ccxt/base/exchange.py,sha256=
|
321
|
+
ccxt/base/exchange.py,sha256=MR6O3WIOvprssXnKvgmaJ9ssy1wEk1QD1X-m3gIL720,238680
|
322
322
|
ccxt/base/precise.py,sha256=_xfu54sV0vWNnOfGTKRFykeuWP8mn4K1m9lk1tcllX4,8565
|
323
323
|
ccxt/base/types.py,sha256=IkX5BhJtK19kqTNKgq6LsLV0bYmS8YHDASPVOD3AC64,5886
|
324
|
-
ccxt/pro/__init__.py,sha256=
|
324
|
+
ccxt/pro/__init__.py,sha256=aWEzYF-HZC3uOagf3e_PbBwg_prJ7Wdsmd8QEnonPeY,6675
|
325
325
|
ccxt/pro/alpaca.py,sha256=wd8yRqrzCApryVuM4Q_6xZRekxI7wvPso5C_mQorsec,27164
|
326
326
|
ccxt/pro/ascendex.py,sha256=JmnteciSLZXo3gkCvu8rMc7hKI1tgRsUqlADkOpHizM,34841
|
327
327
|
ccxt/pro/bequant.py,sha256=q6i8k79WVw8JMzCB4moxXzbolx5RT242Oe-Y4ybE1Fs,1330
|
@@ -355,7 +355,7 @@ ccxt/pro/deribit.py,sha256=TPKYB-7D9oUA0Y5xFEFhYbu277rss6_psfaz8iLmws4,34331
|
|
355
355
|
ccxt/pro/exmo.py,sha256=Iy3blupA3SQccdHgfiCc3ijjCsnKFzc3IKmjvjiPewA,24508
|
356
356
|
ccxt/pro/gate.py,sha256=6K47tjMiVfe-qxo_qgbKlQbySsRt0AhIkN6FmKnQQYw,50642
|
357
357
|
ccxt/pro/gateio.py,sha256=_uBWXYQbmsHRivKnZOJDmxJ9tWLO_0HAxmOjAEUy9nE,391
|
358
|
-
ccxt/pro/gemini.py,sha256=
|
358
|
+
ccxt/pro/gemini.py,sha256=ZYuEgoOD_Raeg3HCW9QhM25k0PPXLrllkOSvbl-kHTM,33171
|
359
359
|
ccxt/pro/hitbtc.py,sha256=xKGsSrwslVm7tv2HHVs9Z5ENQbUQFcgL_0b6ATT3Dns,56116
|
360
360
|
ccxt/pro/hollaex.py,sha256=xkvPQ2h6t-Jvt1WsQC_ahKAaA6wYMvx03fnc0zqqOIg,21957
|
361
361
|
ccxt/pro/htx.py,sha256=WBz8R4_n5ZJ0pEp27Ndf2WmqpD4ax2GJiM36bqEewTk,95773
|
@@ -397,8 +397,8 @@ ccxt/static_dependencies/ecdsa/util.py,sha256=M0NQZ4dDQFTd8afSkF-7YyP9KbsXzOn-VU
|
|
397
397
|
ccxt/static_dependencies/keccak/__init__.py,sha256=mfcrTChnMXsr-JmfN2VbzscTRt9XA2RRGchfHRMYncU,45
|
398
398
|
ccxt/static_dependencies/keccak/keccak.py,sha256=RblmQEQkGpMhug0EU3hyE0kBjs1NDfGQqbwrBK7ZycY,6934
|
399
399
|
ccxt/test/__init__.py,sha256=GKPbEcj0Rrz5HG-GUm-iY1IHhDYmlvcBXZAGk6-m2CI,141
|
400
|
-
ccxt/test/test_async.py,sha256=
|
401
|
-
ccxt/test/test_sync.py,sha256=
|
400
|
+
ccxt/test/test_async.py,sha256=xcGDYOKUAVbLIKQTGkJzYPzMMQQpWj5qdCqF7K2Lar4,70485
|
401
|
+
ccxt/test/test_sync.py,sha256=4Sbz0ta3p9Tbyc08euDK4KQ3trJ6QTbJIz8vJ4EuhE0,69538
|
402
402
|
ccxt/test/base/__init__.py,sha256=ds8P0F0yUif2RRYwKNIks8Tef3j6Kg_bCAOxZJqgxtA,1816
|
403
403
|
ccxt/test/base/test_account.py,sha256=lxwZXsY8qZgomBoEiomUmWcseSp--orJx-xmm3E1vYs,978
|
404
404
|
ccxt/test/base/test_balance.py,sha256=j8pa_6EJoWadWk-JcL--gI6kUrb6wiwffchOqjBY2_A,2614
|
@@ -432,7 +432,7 @@ ccxt/test/base/test_ticker.py,sha256=AMlFK-U3W64B0QQ_zzWZC_8OflDh0PFJrs4l3iv9lFk
|
|
432
432
|
ccxt/test/base/test_trade.py,sha256=lhT9nxiSr0AEvKbdGXL9qJOkz1EiKEmA0TDfdCbubg8,2295
|
433
433
|
ccxt/test/base/test_trading_fee.py,sha256=2aDCNJtqBkTC_AieO0l1HYGq5hz5qkWlkWb9Nv_fcwk,1066
|
434
434
|
ccxt/test/base/test_transaction.py,sha256=BTbB4UHHXkrvYgwbrhh867nVRlevmIkIrz1W_odlQJI,1434
|
435
|
-
ccxt-4.2.
|
436
|
-
ccxt-4.2.
|
437
|
-
ccxt-4.2.
|
438
|
-
ccxt-4.2.
|
435
|
+
ccxt-4.2.37.dist-info/METADATA,sha256=ojffGzVcH026tF-g4UvPID0qdJfDrsdTEJa0RmLpiRc,106867
|
436
|
+
ccxt-4.2.37.dist-info/WHEEL,sha256=P2T-6epvtXQ2cBOE_U1K4_noqlJFN3tj15djMgEu4NM,110
|
437
|
+
ccxt-4.2.37.dist-info/top_level.txt,sha256=CkQDuCTDKNcImPV60t36G6MdYfxsAPNiSaEwifVoVMo,5
|
438
|
+
ccxt-4.2.37.dist-info/RECORD,,
|
File without changes
|
File without changes
|