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/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 parse_ws_trade(self, trade, market=None):
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.safe_string(trade, 'event_id')
119
+ id = self.safe_string_2(trade, 'event_id', 'tid')
87
120
  priceString = self.safe_string(trade, 'price')
88
- amountString = self.safe_string(trade, 'quantity')
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
- output_string = json_stringify(stored_output)
820
- error_message = message + ' expected ' + output_string + ' received: ' + calculated_string
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: ' + output_string + ' stored value: ' + calculated_string
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 and '/' in argv.symbol else None
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
- output_string = json_stringify(stored_output)
819
- error_message = message + ' expected ' + output_string + ' received: ' + calculated_string
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: ' + output_string + ' stored value: ' + calculated_string
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 and '/' in argv.symbol else None
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.36
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 **Nugget**](https://www.nuget.org/packages/ccxt) (netstandard 2.0)
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.36/dist/ccxt.browser.js
262
- * unpkg: https://unpkg.com/ccxt@4.2.36/dist/ccxt.browser.js
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.36/dist/ccxt.browser.js"></script>
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 **Nugget**](https://www.nuget.org/packages/ccxt) (netstandard 2.0 and netstandard 2.1)
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=nw8BWM1iSYkb2Eg6TgcAGWahJK9uqGB-HE0RcV6hnHU,15344
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=nUtUrcDHCmAd-Oe9daCMtToq4nA8-TTMoSnlyXlGoH8,527193
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=DiLqellmNSYTlcUTLG1LW4fmsHSZMMisgQlB5mMdb2c,156332
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=_YmRrVokb5eFgFPJDki1uTb8ljlk81ZHRvUNqtQlhXk,122483
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=7ualqJZyd0esibR809gJiHnToyu0lYd-In5kzjEiAmI,358672
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=N_9sguUcjjy8ihKNmGSMwbLavPX5RShHEC1LSAB-sYI,19315
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=74dnbDU93Iidmf83gPUNVOR4WfTNPyeN28diSYzkKbM,15067
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=VlYyjYykQgkjACWmxz6ajJCwavQXUvPSH7sNkxukEA8,529243
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=JIaHUGBtABQbwoLNkSzYd-XcNNu1ffxAdirBzW3FEM0,157060
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=eeTxqmdcUbbmHaHNXLfI2GHhDf4A5TK4Q8JNPzb2ULQ,123025
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=KAP3vmLPJqviIjTKwW9xSRZe0oLXc_6ddamrKLAnTVk,360170
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=aUmUoZOUAD6H41-YgyVjaKXRpA2B_gVj6iD2zfQmFqo,88134
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=AgEqDDNArE0sfeynAU0kTWOHaIOsdJdJrzDM4xnGAxA,238680
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=Bc0LdT-LgdH4NinvRXouH5TQUxKL_W93Ojv_zKregJY,6675
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=Q04Kpgvk1jKRpvgOz3munQt8PyctME5cpOPGKn55HGM,25446
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=imoL91iWMQNEwCaXXTg8maMBMk2mQYCNpmHmF3iXFXY,70428
401
- ccxt/test/test_sync.py,sha256=waj2pKN2WHQvzk5H74pf1xMYI166Zq5j40z2W6DTgoI,69481
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.36.dist-info/METADATA,sha256=KqijfE7Zn3IVchoRxMaT4UDi7jL2KQxUuuY203vjFdw,106869
436
- ccxt-4.2.36.dist-info/WHEEL,sha256=P2T-6epvtXQ2cBOE_U1K4_noqlJFN3tj15djMgEu4NM,110
437
- ccxt-4.2.36.dist-info/top_level.txt,sha256=CkQDuCTDKNcImPV60t36G6MdYfxsAPNiSaEwifVoVMo,5
438
- ccxt-4.2.36.dist-info/RECORD,,
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