ccxt-ir 4.6.1__py2.py3-none-any.whl → 4.7.0__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 CHANGED
@@ -22,7 +22,7 @@
22
22
 
23
23
  # ----------------------------------------------------------------------------
24
24
 
25
- __version__ = '4.6.1'
25
+ __version__ = '4.7.0'
26
26
 
27
27
  # ----------------------------------------------------------------------------
28
28
 
@@ -203,6 +203,7 @@ from ccxt.tabdeal import tabdeal # noqa: F4
203
203
  from ccxt.tetherland import tetherland # noqa: F401
204
204
  from ccxt.timex import timex # noqa: F401
205
205
  from ccxt.tokocrypto import tokocrypto # noqa: F401
206
+ from ccxt.toobit import toobit # noqa: F401
206
207
  from ccxt.tradeogre import tradeogre # noqa: F401
207
208
  from ccxt.twox import twox # noqa: F401
208
209
  from ccxt.ubitex import ubitex # noqa: F401
@@ -338,6 +339,7 @@ exchanges = [
338
339
  'tetherland',
339
340
  'timex',
340
341
  'tokocrypto',
342
+ 'toobit',
341
343
  'tradeogre',
342
344
  'twox',
343
345
  'ubitex',
@@ -0,0 +1,6 @@
1
+ from ccxt.base.types import Entry
2
+
3
+
4
+ class ImplicitAPI:
5
+ public_get_quote_v1_ticker_24hr = publicGetQuoteV1Ticker24hr = Entry('quote/v1/ticker/24hr', 'public', 'GET', {'cost': 1})
6
+ public_get_quote_v1_klines = publicGetQuoteV1Klines = Entry('quote/v1/klines', 'public', 'GET', {'cost': 1})
@@ -4,7 +4,7 @@
4
4
 
5
5
  # -----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.6.1'
7
+ __version__ = '4.7.0'
8
8
 
9
9
  # -----------------------------------------------------------------------------
10
10
 
@@ -183,6 +183,7 @@ from ccxt.async_support.tabdeal import tabdeal
183
183
  from ccxt.async_support.tetherland import tetherland # noqa: F401
184
184
  from ccxt.async_support.timex import timex # noqa: F401
185
185
  from ccxt.async_support.tokocrypto import tokocrypto # noqa: F401
186
+ from ccxt.async_support.toobit import toobit # noqa: F401
186
187
  from ccxt.async_support.tradeogre import tradeogre # noqa: F401
187
188
  from ccxt.async_support.twox import twox # noqa: F401
188
189
  from ccxt.async_support.ubitex import ubitex # noqa: F401
@@ -318,6 +319,7 @@ exchanges = [
318
319
  'tetherland',
319
320
  'timex',
320
321
  'tokocrypto',
322
+ 'toobit',
321
323
  'tradeogre',
322
324
  'twox',
323
325
  'ubitex',
@@ -2,7 +2,7 @@
2
2
 
3
3
  # -----------------------------------------------------------------------------
4
4
 
5
- __version__ = '4.6.1'
5
+ __version__ = '4.7.0'
6
6
 
7
7
  # -----------------------------------------------------------------------------
8
8
 
@@ -367,8 +367,6 @@ class bit24(Exchange, ImplicitAPI):
367
367
  def sign(self, path, api='public', method='GET', params={}, headers=None, body=None):
368
368
  query = self.omit(params, self.extract_params(path))
369
369
  url = self.urls['api'][api] + '/' + self.implode_params(path, params)
370
- if query > 0:
371
- queryString = self.urlencode(query)
372
- url += '?' + queryString
370
+ url = url + '?' + self.urlencode(query)
373
371
  headers = {'Content-Type': 'application/json'}
374
372
  return {'url': url, 'method': method, 'body': body, 'headers': headers}
@@ -250,7 +250,6 @@ class exir(Exchange, ImplicitAPI):
250
250
  }
251
251
  response = await self.publicGetV2Ticker(request)
252
252
  response['symbol'] = market['id']
253
- response['time'] = response['timestamp']
254
253
  ticker = self.parse_ticker(response)
255
254
  return ticker
256
255
 
@@ -0,0 +1,367 @@
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.base.exchange import Exchange
7
+ from ccxt.abstract.toobit import ImplicitAPI
8
+ from ccxt.base.types import Any, Int, Market, Strings, Ticker, Tickers
9
+ from typing import List
10
+
11
+
12
+ class toobit(Exchange, ImplicitAPI):
13
+
14
+ def describe(self) -> Any:
15
+ return self.deep_extend(super(toobit, self).describe(), {
16
+ 'id': 'toobit',
17
+ 'name': 'Toobit',
18
+ 'countries': ['KY'], # Cayman Islands
19
+ 'rateLimit': 1000,
20
+ 'version': '1',
21
+ 'certified': False,
22
+ 'pro': False,
23
+ 'has': {
24
+ 'CORS': None,
25
+ 'spot': True,
26
+ 'margin': False,
27
+ 'swap': True,
28
+ 'future': False,
29
+ 'option': False,
30
+ 'addMargin': False,
31
+ 'cancelAllOrders': False,
32
+ 'cancelOrder': False,
33
+ 'cancelOrders': False,
34
+ 'createDepositAddress': False,
35
+ 'createOrder': False,
36
+ 'createStopLimitOrder': False,
37
+ 'createStopMarketOrder': False,
38
+ 'createStopOrder': False,
39
+ 'editOrder': False,
40
+ 'fetchBalance': False,
41
+ 'fetchBorrowInterest': False,
42
+ 'fetchBorrowRateHistories': False,
43
+ 'fetchBorrowRateHistory': False,
44
+ 'fetchClosedOrders': False,
45
+ 'fetchCrossBorrowRate': False,
46
+ 'fetchCrossBorrowRates': False,
47
+ 'fetchCurrencies': False,
48
+ 'fetchDepositAddress': False,
49
+ 'fetchDeposits': False,
50
+ 'fetchFundingHistory': False,
51
+ 'fetchFundingRate': False,
52
+ 'fetchFundingRateHistory': False,
53
+ 'fetchFundingRates': False,
54
+ 'fetchIndexOHLCV': False,
55
+ 'fetchIsolatedBorrowRate': False,
56
+ 'fetchIsolatedBorrowRates': False,
57
+ 'fetchL2OrderBook': False,
58
+ 'fetchLedger': False,
59
+ 'fetchLedgerEntry': False,
60
+ 'fetchLeverageTiers': False,
61
+ 'fetchMarkets': True,
62
+ 'fetchMarkOHLCV': False,
63
+ 'fetchMyTrades': False,
64
+ 'fetchOHLCV': True,
65
+ 'fetchOpenInterestHistory': False,
66
+ 'fetchOpenOrders': False,
67
+ 'fetchOrder': False,
68
+ 'fetchOrderBook': True,
69
+ 'fetchOrders': False,
70
+ 'fetchOrderTrades': 'emulated',
71
+ 'fetchPositions': False,
72
+ 'fetchPremiumIndexOHLCV': False,
73
+ 'fetchTicker': True,
74
+ 'fetchTickers': True,
75
+ 'fetchTime': False,
76
+ 'fetchTrades': False,
77
+ 'fetchTradingFee': False,
78
+ 'fetchTradingFees': False,
79
+ 'fetchWithdrawals': False,
80
+ 'setLeverage': False,
81
+ 'setMarginMode': False,
82
+ 'transfer': False,
83
+ 'withdraw': False,
84
+ },
85
+ 'comment': 'This comment is optional',
86
+ 'urls': {
87
+ 'logo': 'https://toobit-docs.github.io/apidocs/spot/v1/en/images/logo.svg',
88
+ 'api': {
89
+ 'public': 'https://api.toobit.com',
90
+ },
91
+ 'www': 'https://www.toobit.com/',
92
+ 'doc': [
93
+ 'https://toobit-docs.github.io/apidocs/spot/v1/en/#change-log',
94
+ ],
95
+ },
96
+ 'timeframes': {
97
+ '1m': '1m',
98
+ '3m': '3m',
99
+ '5m': '5m',
100
+ '15m': '15m',
101
+ '30m': '30m',
102
+ '1h': '1h',
103
+ '2h': '2h',
104
+ '4h': '4h',
105
+ '6h': '6h',
106
+ '12h': '12h',
107
+ '1d': '1d',
108
+ '1w': '1w',
109
+ '1M': '1M',
110
+ },
111
+ 'api': {
112
+ 'public': {
113
+ 'get': {
114
+ 'quote/v1/ticker/24hr': 1,
115
+ 'quote/v1/klines': 1,
116
+ },
117
+ },
118
+ },
119
+ 'fees': {
120
+ 'trading': {
121
+ 'tierBased': False,
122
+ 'percentage': True,
123
+ 'maker': self.parse_number('0.001'),
124
+ 'taker': self.parse_number('0.001'),
125
+ },
126
+ },
127
+ })
128
+
129
+ async def fetch_markets(self, params={}) -> List[Market]:
130
+ """
131
+ retrieves data on all markets for toobit
132
+ https://apidocs.toobit.io/#tickers
133
+ :param dict [params]: extra parameters specific to the exchange API endpoint
134
+ :returns dict[]: an array of objects representing market data
135
+ """
136
+ response = await self.publicGetQuoteV1Ticker24hr()
137
+ result = []
138
+ for i in range(0, len(response)):
139
+ volume = self.safe_float(response[i], 'v')
140
+ symbol = self.safe_value(response[i], 's')
141
+ if volume == 0 or symbol == 'TESTA1S3TESTX8Z9':
142
+ continue
143
+ market = self.parse_market(response[i])
144
+ result.append(market)
145
+ return result
146
+
147
+ def parse_market(self, market) -> Market:
148
+ # {
149
+ # t: 1757164008834,
150
+ # s: "BTCUSDT",
151
+ # c: "110895.06",
152
+ # h: "113310.01",
153
+ # l: "110219.01",
154
+ # o: "112951.99",
155
+ # v: "3893.406649",
156
+ # qv: "433374169.27969515",
157
+ # pc: "-2056.93",
158
+ # pcp: "-0.0182"
159
+ # }
160
+ symbol = self.safe_value(market, 's')
161
+ baseId = symbol
162
+ quoteId = None
163
+ if symbol.endswith('USDT'):
164
+ baseId = symbol[0:-4]
165
+ quoteId = 'USDT'
166
+ elif symbol.endswith('USDC'):
167
+ baseId = symbol[0:-4]
168
+ quoteId = 'USDC'
169
+ id = symbol
170
+ base = self.safe_currency_code(baseId)
171
+ quote = self.safe_currency_code(quoteId)
172
+ baseId = baseId.lower()
173
+ quoteId = quoteId.lower()
174
+ return {
175
+ 'id': id,
176
+ 'symbol': base + '/' + quote,
177
+ 'base': base,
178
+ 'quote': quote,
179
+ 'settle': None,
180
+ 'baseId': baseId,
181
+ 'quoteId': quoteId,
182
+ 'settleId': None,
183
+ 'type': 'spot',
184
+ 'spot': True,
185
+ 'margin': False,
186
+ 'swap': False,
187
+ 'future': False,
188
+ 'option': False,
189
+ 'active': True,
190
+ 'contract': False,
191
+ 'linear': None,
192
+ 'inverse': None,
193
+ 'contractSize': None,
194
+ 'expiry': None,
195
+ 'expiryDatetime': None,
196
+ 'strike': None,
197
+ 'optionType': None,
198
+ 'precision': {
199
+ 'amount': None,
200
+ 'price': None,
201
+ },
202
+ 'limits': {
203
+ 'leverage': {
204
+ 'min': None,
205
+ 'max': None,
206
+ },
207
+ 'amount': {
208
+ 'min': None,
209
+ 'max': None,
210
+ },
211
+ 'price': {
212
+ 'min': None,
213
+ 'max': None,
214
+ },
215
+ 'cost': {
216
+ 'min': None,
217
+ 'max': None,
218
+ },
219
+ },
220
+ 'created': None,
221
+ 'info': market,
222
+ }
223
+
224
+ async def fetch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
225
+ """
226
+ fetches price tickers for multiple markets, statistical information calculated over the past 24 hours for each market
227
+ https://apidocs.toobit.io/#tickers
228
+ :param str[]|None symbols: unified symbols of the markets to fetch the ticker for, all market tickers are returned if not assigned
229
+ :param dict [params]: extra parameters specific to the exchange API endpoint
230
+ :returns dict: a dictionary of `ticker structures <https://docs.ccxt.com/#/?id=ticker-structure>`
231
+ """
232
+ await self.load_markets()
233
+ if symbols is not None:
234
+ symbols = self.market_symbols(symbols)
235
+ response = await self.publicGetQuoteV1Ticker24hr()
236
+ result = {}
237
+ for i in range(0, len(response)):
238
+ volume = self.safe_float(response[i], 'v')
239
+ if volume == 0:
240
+ continue
241
+ ticker = self.parse_ticker(response[i])
242
+ symbol = ticker['symbol']
243
+ result[symbol] = ticker
244
+ return self.filter_by_array_tickers(result, 'symbol', symbols)
245
+
246
+ async def fetch_ticker(self, symbol: str, params={}) -> Ticker:
247
+ """
248
+ fetches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
249
+ https://apidocs.toobit.io/#ticker
250
+ :param str symbol: unified symbol of the market to fetch the ticker for
251
+ :param dict [params]: extra parameters specific to the exchange API endpoint
252
+ :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
253
+ """
254
+ await self.load_markets()
255
+ market = self.market(symbol)
256
+ request = {
257
+ 'symbol': market['id'],
258
+ }
259
+ response = await self.publicGetQuoteV1Ticker24hr(request)
260
+ ticker = self.parse_ticker(response[0])
261
+ return ticker
262
+
263
+ def parse_ticker(self, ticker, market: Market = None) -> Ticker:
264
+ # {
265
+ # t: 1757164008834,
266
+ # s: "BTCUSDT",
267
+ # c: "110895.06",
268
+ # h: "113310.01",
269
+ # l: "110219.01",
270
+ # o: "112951.99",
271
+ # v: "3893.406649",
272
+ # qv: "433374169.27969515",
273
+ # pc: "-2056.93",
274
+ # pcp: "-0.0182"
275
+ # }
276
+ marketType = 'spot'
277
+ symbol = self.safe_value(ticker, 's')
278
+ marketId = symbol
279
+ symbol = self.safe_symbol(marketId, market, None, marketType)
280
+ high = self.safe_float(ticker, 'h')
281
+ low = self.safe_float(ticker, 'l')
282
+ open = self.safe_float(ticker, 'o')
283
+ close = self.safe_float(ticker, 'c')
284
+ last = self.safe_float(ticker, 'c')
285
+ change = self.safe_float(ticker, 'pcp')
286
+ priceChange = self.safe_float(ticker, 'pc')
287
+ baseVolume = self.safe_float(ticker, 'v')
288
+ quoteVolume = self.safe_float(ticker, 'qv')
289
+ datetime = self.safe_string(ticker, 't')
290
+ bid = self.safe_float(ticker, 'b', 0)
291
+ ask = self.safe_float(ticker, 'a', 0)
292
+ return self.safe_ticker({
293
+ 'symbol': symbol,
294
+ 'timestamp': datetime,
295
+ 'datetime': self.parse8601(datetime),
296
+ 'high': high,
297
+ 'low': low,
298
+ 'bid': bid,
299
+ 'bidVolume': None,
300
+ 'ask': ask,
301
+ 'askVolume': None,
302
+ 'vwap': None,
303
+ 'open': open,
304
+ 'close': close,
305
+ 'last': last,
306
+ 'previousClose': None,
307
+ 'change': priceChange,
308
+ 'percentage': change,
309
+ 'average': None,
310
+ 'baseVolume': baseVolume,
311
+ 'quoteVolume': quoteVolume,
312
+ 'info': ticker,
313
+ }, market)
314
+
315
+ async def fetch_ohlcv(self, symbol: str, timeframe='1h', since: Int = None, limit: Int = None, params={}) -> List[list]:
316
+ """
317
+ fetches historical candlestick data containing the open, high, low, and close price, and the volume of a market
318
+ https://apidocs.toobit.io/#chart
319
+ :param str symbol: unified symbol of the market to fetch OHLCV data for
320
+ :param str timeframe: the length of time each candle represents
321
+ :param int [since]: timestamp in ms of the earliest candle to fetch
322
+ :param int [limit]: the maximum amount of candles to fetch
323
+ :param dict [params]: extra parameters specific to the exchange API endpoint
324
+ :returns int[][]: A list of candles ordered, open, high, low, close, volume
325
+ """
326
+ await self.load_markets()
327
+ market = self.market(symbol)
328
+ endTime = Date.now()
329
+ request = {
330
+ 'symbol': market['id'],
331
+ 'from': (endTime - (24 * 60 * 60 * 1000)),
332
+ 'to': endTime,
333
+ 'interval': self.safe_string(self.timeframes, timeframe, timeframe),
334
+ }
335
+ if since is not None:
336
+ request['from'] = since
337
+ if timeframe is not None:
338
+ request['interval'] = self.safe_string(self.timeframes, timeframe, timeframe)
339
+ response = await self.publicGetQuoteV1Klines(request)
340
+ ohlcvs = []
341
+ for i in range(0, len(response)):
342
+ candle = response[i]
343
+ ts = self.safe_timestamp(candle, 0)
344
+ open = self.safe_float(candle, 1)
345
+ high = self.safe_float(candle, 2)
346
+ low = self.safe_float(candle, 3)
347
+ close = self.safe_float(candle, 4)
348
+ volume = self.safe_float(candle, 5)
349
+ ohlcvs.append([
350
+ ts,
351
+ open,
352
+ high,
353
+ low,
354
+ close,
355
+ volume,
356
+ ])
357
+ return self.parse_ohlcvs(ohlcvs, market, timeframe, since, limit)
358
+
359
+ def sign(self, path, api='public', method='GET', params={}, headers=None, body=None):
360
+ query = self.omit(params, self.extract_params(path))
361
+ url = self.urls['api']['public'] + '/' + path
362
+ if path == 'quote/v1/ticker/24hr':
363
+ url = url + '?' + self.urlencode(query)
364
+ if path == 'quote/v1/klines':
365
+ url = url + '?' + self.urlencode(query)
366
+ headers = {'Content-Type': 'application/json'}
367
+ return {'url': url, 'method': method, 'body': body, 'headers': headers}
ccxt/base/exchange.py CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  # -----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.6.1'
7
+ __version__ = '4.7.0'
8
8
 
9
9
  # -----------------------------------------------------------------------------
10
10
 
ccxt/bit24.py CHANGED
@@ -367,8 +367,6 @@ class bit24(Exchange, ImplicitAPI):
367
367
  def sign(self, path, api='public', method='GET', params={}, headers=None, body=None):
368
368
  query = self.omit(params, self.extract_params(path))
369
369
  url = self.urls['api'][api] + '/' + self.implode_params(path, params)
370
- if query > 0:
371
- queryString = self.urlencode(query)
372
- url += '?' + queryString
370
+ url = url + '?' + self.urlencode(query)
373
371
  headers = {'Content-Type': 'application/json'}
374
372
  return {'url': url, 'method': method, 'body': body, 'headers': headers}
ccxt/exir.py CHANGED
@@ -250,7 +250,6 @@ class exir(Exchange, ImplicitAPI):
250
250
  }
251
251
  response = self.publicGetV2Ticker(request)
252
252
  response['symbol'] = market['id']
253
- response['time'] = response['timestamp']
254
253
  ticker = self.parse_ticker(response)
255
254
  return ticker
256
255
 
ccxt/pro/__init__.py CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  # ----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.6.1'
7
+ __version__ = '4.7.0'
8
8
 
9
9
  # ----------------------------------------------------------------------------
10
10
 
ccxt/toobit.py ADDED
@@ -0,0 +1,367 @@
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.base.exchange import Exchange
7
+ from ccxt.abstract.toobit import ImplicitAPI
8
+ from ccxt.base.types import Any, Int, Market, Strings, Ticker, Tickers
9
+ from typing import List
10
+
11
+
12
+ class toobit(Exchange, ImplicitAPI):
13
+
14
+ def describe(self) -> Any:
15
+ return self.deep_extend(super(toobit, self).describe(), {
16
+ 'id': 'toobit',
17
+ 'name': 'Toobit',
18
+ 'countries': ['KY'], # Cayman Islands
19
+ 'rateLimit': 1000,
20
+ 'version': '1',
21
+ 'certified': False,
22
+ 'pro': False,
23
+ 'has': {
24
+ 'CORS': None,
25
+ 'spot': True,
26
+ 'margin': False,
27
+ 'swap': True,
28
+ 'future': False,
29
+ 'option': False,
30
+ 'addMargin': False,
31
+ 'cancelAllOrders': False,
32
+ 'cancelOrder': False,
33
+ 'cancelOrders': False,
34
+ 'createDepositAddress': False,
35
+ 'createOrder': False,
36
+ 'createStopLimitOrder': False,
37
+ 'createStopMarketOrder': False,
38
+ 'createStopOrder': False,
39
+ 'editOrder': False,
40
+ 'fetchBalance': False,
41
+ 'fetchBorrowInterest': False,
42
+ 'fetchBorrowRateHistories': False,
43
+ 'fetchBorrowRateHistory': False,
44
+ 'fetchClosedOrders': False,
45
+ 'fetchCrossBorrowRate': False,
46
+ 'fetchCrossBorrowRates': False,
47
+ 'fetchCurrencies': False,
48
+ 'fetchDepositAddress': False,
49
+ 'fetchDeposits': False,
50
+ 'fetchFundingHistory': False,
51
+ 'fetchFundingRate': False,
52
+ 'fetchFundingRateHistory': False,
53
+ 'fetchFundingRates': False,
54
+ 'fetchIndexOHLCV': False,
55
+ 'fetchIsolatedBorrowRate': False,
56
+ 'fetchIsolatedBorrowRates': False,
57
+ 'fetchL2OrderBook': False,
58
+ 'fetchLedger': False,
59
+ 'fetchLedgerEntry': False,
60
+ 'fetchLeverageTiers': False,
61
+ 'fetchMarkets': True,
62
+ 'fetchMarkOHLCV': False,
63
+ 'fetchMyTrades': False,
64
+ 'fetchOHLCV': True,
65
+ 'fetchOpenInterestHistory': False,
66
+ 'fetchOpenOrders': False,
67
+ 'fetchOrder': False,
68
+ 'fetchOrderBook': True,
69
+ 'fetchOrders': False,
70
+ 'fetchOrderTrades': 'emulated',
71
+ 'fetchPositions': False,
72
+ 'fetchPremiumIndexOHLCV': False,
73
+ 'fetchTicker': True,
74
+ 'fetchTickers': True,
75
+ 'fetchTime': False,
76
+ 'fetchTrades': False,
77
+ 'fetchTradingFee': False,
78
+ 'fetchTradingFees': False,
79
+ 'fetchWithdrawals': False,
80
+ 'setLeverage': False,
81
+ 'setMarginMode': False,
82
+ 'transfer': False,
83
+ 'withdraw': False,
84
+ },
85
+ 'comment': 'This comment is optional',
86
+ 'urls': {
87
+ 'logo': 'https://toobit-docs.github.io/apidocs/spot/v1/en/images/logo.svg',
88
+ 'api': {
89
+ 'public': 'https://api.toobit.com',
90
+ },
91
+ 'www': 'https://www.toobit.com/',
92
+ 'doc': [
93
+ 'https://toobit-docs.github.io/apidocs/spot/v1/en/#change-log',
94
+ ],
95
+ },
96
+ 'timeframes': {
97
+ '1m': '1m',
98
+ '3m': '3m',
99
+ '5m': '5m',
100
+ '15m': '15m',
101
+ '30m': '30m',
102
+ '1h': '1h',
103
+ '2h': '2h',
104
+ '4h': '4h',
105
+ '6h': '6h',
106
+ '12h': '12h',
107
+ '1d': '1d',
108
+ '1w': '1w',
109
+ '1M': '1M',
110
+ },
111
+ 'api': {
112
+ 'public': {
113
+ 'get': {
114
+ 'quote/v1/ticker/24hr': 1,
115
+ 'quote/v1/klines': 1,
116
+ },
117
+ },
118
+ },
119
+ 'fees': {
120
+ 'trading': {
121
+ 'tierBased': False,
122
+ 'percentage': True,
123
+ 'maker': self.parse_number('0.001'),
124
+ 'taker': self.parse_number('0.001'),
125
+ },
126
+ },
127
+ })
128
+
129
+ def fetch_markets(self, params={}) -> List[Market]:
130
+ """
131
+ retrieves data on all markets for toobit
132
+ https://apidocs.toobit.io/#tickers
133
+ :param dict [params]: extra parameters specific to the exchange API endpoint
134
+ :returns dict[]: an array of objects representing market data
135
+ """
136
+ response = self.publicGetQuoteV1Ticker24hr()
137
+ result = []
138
+ for i in range(0, len(response)):
139
+ volume = self.safe_float(response[i], 'v')
140
+ symbol = self.safe_value(response[i], 's')
141
+ if volume == 0 or symbol == 'TESTA1S3TESTX8Z9':
142
+ continue
143
+ market = self.parse_market(response[i])
144
+ result.append(market)
145
+ return result
146
+
147
+ def parse_market(self, market) -> Market:
148
+ # {
149
+ # t: 1757164008834,
150
+ # s: "BTCUSDT",
151
+ # c: "110895.06",
152
+ # h: "113310.01",
153
+ # l: "110219.01",
154
+ # o: "112951.99",
155
+ # v: "3893.406649",
156
+ # qv: "433374169.27969515",
157
+ # pc: "-2056.93",
158
+ # pcp: "-0.0182"
159
+ # }
160
+ symbol = self.safe_value(market, 's')
161
+ baseId = symbol
162
+ quoteId = None
163
+ if symbol.endswith('USDT'):
164
+ baseId = symbol[0:-4]
165
+ quoteId = 'USDT'
166
+ elif symbol.endswith('USDC'):
167
+ baseId = symbol[0:-4]
168
+ quoteId = 'USDC'
169
+ id = symbol
170
+ base = self.safe_currency_code(baseId)
171
+ quote = self.safe_currency_code(quoteId)
172
+ baseId = baseId.lower()
173
+ quoteId = quoteId.lower()
174
+ return {
175
+ 'id': id,
176
+ 'symbol': base + '/' + quote,
177
+ 'base': base,
178
+ 'quote': quote,
179
+ 'settle': None,
180
+ 'baseId': baseId,
181
+ 'quoteId': quoteId,
182
+ 'settleId': None,
183
+ 'type': 'spot',
184
+ 'spot': True,
185
+ 'margin': False,
186
+ 'swap': False,
187
+ 'future': False,
188
+ 'option': False,
189
+ 'active': True,
190
+ 'contract': False,
191
+ 'linear': None,
192
+ 'inverse': None,
193
+ 'contractSize': None,
194
+ 'expiry': None,
195
+ 'expiryDatetime': None,
196
+ 'strike': None,
197
+ 'optionType': None,
198
+ 'precision': {
199
+ 'amount': None,
200
+ 'price': None,
201
+ },
202
+ 'limits': {
203
+ 'leverage': {
204
+ 'min': None,
205
+ 'max': None,
206
+ },
207
+ 'amount': {
208
+ 'min': None,
209
+ 'max': None,
210
+ },
211
+ 'price': {
212
+ 'min': None,
213
+ 'max': None,
214
+ },
215
+ 'cost': {
216
+ 'min': None,
217
+ 'max': None,
218
+ },
219
+ },
220
+ 'created': None,
221
+ 'info': market,
222
+ }
223
+
224
+ def fetch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
225
+ """
226
+ fetches price tickers for multiple markets, statistical information calculated over the past 24 hours for each market
227
+ https://apidocs.toobit.io/#tickers
228
+ :param str[]|None symbols: unified symbols of the markets to fetch the ticker for, all market tickers are returned if not assigned
229
+ :param dict [params]: extra parameters specific to the exchange API endpoint
230
+ :returns dict: a dictionary of `ticker structures <https://docs.ccxt.com/#/?id=ticker-structure>`
231
+ """
232
+ self.load_markets()
233
+ if symbols is not None:
234
+ symbols = self.market_symbols(symbols)
235
+ response = self.publicGetQuoteV1Ticker24hr()
236
+ result = {}
237
+ for i in range(0, len(response)):
238
+ volume = self.safe_float(response[i], 'v')
239
+ if volume == 0:
240
+ continue
241
+ ticker = self.parse_ticker(response[i])
242
+ symbol = ticker['symbol']
243
+ result[symbol] = ticker
244
+ return self.filter_by_array_tickers(result, 'symbol', symbols)
245
+
246
+ def fetch_ticker(self, symbol: str, params={}) -> Ticker:
247
+ """
248
+ fetches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
249
+ https://apidocs.toobit.io/#ticker
250
+ :param str symbol: unified symbol of the market to fetch the ticker for
251
+ :param dict [params]: extra parameters specific to the exchange API endpoint
252
+ :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
253
+ """
254
+ self.load_markets()
255
+ market = self.market(symbol)
256
+ request = {
257
+ 'symbol': market['id'],
258
+ }
259
+ response = self.publicGetQuoteV1Ticker24hr(request)
260
+ ticker = self.parse_ticker(response[0])
261
+ return ticker
262
+
263
+ def parse_ticker(self, ticker, market: Market = None) -> Ticker:
264
+ # {
265
+ # t: 1757164008834,
266
+ # s: "BTCUSDT",
267
+ # c: "110895.06",
268
+ # h: "113310.01",
269
+ # l: "110219.01",
270
+ # o: "112951.99",
271
+ # v: "3893.406649",
272
+ # qv: "433374169.27969515",
273
+ # pc: "-2056.93",
274
+ # pcp: "-0.0182"
275
+ # }
276
+ marketType = 'spot'
277
+ symbol = self.safe_value(ticker, 's')
278
+ marketId = symbol
279
+ symbol = self.safe_symbol(marketId, market, None, marketType)
280
+ high = self.safe_float(ticker, 'h')
281
+ low = self.safe_float(ticker, 'l')
282
+ open = self.safe_float(ticker, 'o')
283
+ close = self.safe_float(ticker, 'c')
284
+ last = self.safe_float(ticker, 'c')
285
+ change = self.safe_float(ticker, 'pcp')
286
+ priceChange = self.safe_float(ticker, 'pc')
287
+ baseVolume = self.safe_float(ticker, 'v')
288
+ quoteVolume = self.safe_float(ticker, 'qv')
289
+ datetime = self.safe_string(ticker, 't')
290
+ bid = self.safe_float(ticker, 'b', 0)
291
+ ask = self.safe_float(ticker, 'a', 0)
292
+ return self.safe_ticker({
293
+ 'symbol': symbol,
294
+ 'timestamp': datetime,
295
+ 'datetime': self.parse8601(datetime),
296
+ 'high': high,
297
+ 'low': low,
298
+ 'bid': bid,
299
+ 'bidVolume': None,
300
+ 'ask': ask,
301
+ 'askVolume': None,
302
+ 'vwap': None,
303
+ 'open': open,
304
+ 'close': close,
305
+ 'last': last,
306
+ 'previousClose': None,
307
+ 'change': priceChange,
308
+ 'percentage': change,
309
+ 'average': None,
310
+ 'baseVolume': baseVolume,
311
+ 'quoteVolume': quoteVolume,
312
+ 'info': ticker,
313
+ }, market)
314
+
315
+ def fetch_ohlcv(self, symbol: str, timeframe='1h', since: Int = None, limit: Int = None, params={}) -> List[list]:
316
+ """
317
+ fetches historical candlestick data containing the open, high, low, and close price, and the volume of a market
318
+ https://apidocs.toobit.io/#chart
319
+ :param str symbol: unified symbol of the market to fetch OHLCV data for
320
+ :param str timeframe: the length of time each candle represents
321
+ :param int [since]: timestamp in ms of the earliest candle to fetch
322
+ :param int [limit]: the maximum amount of candles to fetch
323
+ :param dict [params]: extra parameters specific to the exchange API endpoint
324
+ :returns int[][]: A list of candles ordered, open, high, low, close, volume
325
+ """
326
+ self.load_markets()
327
+ market = self.market(symbol)
328
+ endTime = Date.now()
329
+ request = {
330
+ 'symbol': market['id'],
331
+ 'from': (endTime - (24 * 60 * 60 * 1000)),
332
+ 'to': endTime,
333
+ 'interval': self.safe_string(self.timeframes, timeframe, timeframe),
334
+ }
335
+ if since is not None:
336
+ request['from'] = since
337
+ if timeframe is not None:
338
+ request['interval'] = self.safe_string(self.timeframes, timeframe, timeframe)
339
+ response = self.publicGetQuoteV1Klines(request)
340
+ ohlcvs = []
341
+ for i in range(0, len(response)):
342
+ candle = response[i]
343
+ ts = self.safe_timestamp(candle, 0)
344
+ open = self.safe_float(candle, 1)
345
+ high = self.safe_float(candle, 2)
346
+ low = self.safe_float(candle, 3)
347
+ close = self.safe_float(candle, 4)
348
+ volume = self.safe_float(candle, 5)
349
+ ohlcvs.append([
350
+ ts,
351
+ open,
352
+ high,
353
+ low,
354
+ close,
355
+ volume,
356
+ ])
357
+ return self.parse_ohlcvs(ohlcvs, market, timeframe, since, limit)
358
+
359
+ def sign(self, path, api='public', method='GET', params={}, headers=None, body=None):
360
+ query = self.omit(params, self.extract_params(path))
361
+ url = self.urls['api']['public'] + '/' + path
362
+ if path == 'quote/v1/ticker/24hr':
363
+ url = url + '?' + self.urlencode(query)
364
+ if path == 'quote/v1/klines':
365
+ url = url + '?' + self.urlencode(query)
366
+ headers = {'Content-Type': 'application/json'}
367
+ return {'url': url, 'method': method, 'body': body, 'headers': headers}
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ccxt-ir
3
- Version: 4.6.1
3
+ Version: 4.7.0
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
@@ -62,7 +62,7 @@ Dynamic: summary
62
62
 
63
63
  # CCXT – CryptoCurrency eXchange Trading Library
64
64
 
65
- [![NPM Downloads](https://img.shields.io/npm/dy/ccxt.svg)](https://www.npmjs.com/package/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) [![NuGet version](https://img.shields.io/nuget/v/ccxt)](https://www.nuget.org/packages/ccxt) [![GoDoc](https://pkg.go.dev/badge/github.com/ccxt/ccxt/go/v4?utm_source=godoc)](https://godoc.org/github.com/ccxt/ccxt/go/v4) [![Discord](https://img.shields.io/discord/690203284119617602?logo=discord&logoColor=white)](https://discord.gg/ccxt) [![Supported Exchanges](https://img.shields.io/badge/exchanges-133-blue.svg)](https://github.com/ccxt/ccxt/wiki/Exchange-Markets) [![Follow CCXT at x.com](https://img.shields.io/twitter/follow/ccxt_official.svg?style=social&label=CCXT)](https://x.com/ccxt_official)
65
+ [![NPM Downloads](https://img.shields.io/npm/dy/ccxt.svg)](https://www.npmjs.com/package/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) [![NuGet version](https://img.shields.io/nuget/v/ccxt)](https://www.nuget.org/packages/ccxt) [![GoDoc](https://pkg.go.dev/badge/github.com/ccxt/ccxt/go/v4?utm_source=godoc)](https://godoc.org/github.com/ccxt/ccxt/go/v4) [![Discord](https://img.shields.io/discord/690203284119617602?logo=discord&logoColor=white)](https://discord.gg/ccxt) [![Supported Exchanges](https://img.shields.io/badge/exchanges-134-blue.svg)](https://github.com/ccxt/ccxt/wiki/Exchange-Markets) [![Follow CCXT at x.com](https://img.shields.io/twitter/follow/ccxt_official.svg?style=social&label=CCXT)](https://x.com/ccxt_official)
66
66
 
67
67
  A `JavaScript` / `Python` / `PHP` / `C#` / `Go` library for cryptocurrency trading and e-commerce with support for many bitcoin/ether/altcoin exchange markets and merchant APIs.
68
68
 
@@ -304,13 +304,22 @@ console.log(version, Object.keys(exchanges));
304
304
 
305
305
  All-in-one browser bundle (dependencies included), served from a CDN of your choice:
306
306
 
307
- * jsDelivr: https://cdn.jsdelivr.net/npm/ccxt@4.6.1/dist/ccxt.browser.min.js
308
- * unpkg: https://unpkg.com/ccxt@4.6.1/dist/ccxt.browser.min.js
307
+ <<<<<<< HEAD
308
+ * jsDelivr: https://cdn.jsdelivr.net/npm/ccxt@4.7.0/dist/ccxt.browser.min.js
309
+ * unpkg: https://unpkg.com/ccxt@4.7.0/dist/ccxt.browser.min.js
310
+ =======
311
+ * jsDelivr: https://cdn.jsdelivr.net/npm/ccxt@4.7.0/dist/ccxt.browser.min.js
312
+ * unpkg: https://unpkg.com/ccxt@4.7.0/dist/ccxt.browser.min.js
313
+ >>>>>>> master
309
314
 
310
315
  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.
311
316
 
312
317
  ```HTML
313
- <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/ccxt@4.6.1/dist/ccxt.browser.min.js"></script>
318
+ <<<<<<< HEAD
319
+ <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/ccxt@4.7.0/dist/ccxt.browser.min.js"></script>
320
+ =======
321
+ <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/ccxt@4.7.0/dist/ccxt.browser.min.js"></script>
322
+ >>>>>>> master
314
323
  console.log (ccxt.exchanges) // print all available exchanges
315
324
  ```
316
325
 
@@ -1,4 +1,4 @@
1
- ccxt/__init__.py,sha256=87Bh7lrw7oeBAP98EzDhVTNQZmueSTmQvmpPZzMxjYI,19018
1
+ ccxt/__init__.py,sha256=yVtxyPSvSaS0SlouXjUX5fs5vK0407bX6UMZlP9UOmA,19115
2
2
  ccxt/abantether.py,sha256=like8inDYyPpE3d3_93KulDhwmYwdOqZxRvoTC1-Nd0,12008
3
3
  ccxt/afratether.py,sha256=NeSpFf0zWIM5ejGgn5G9hz1-sefAv_ae7j9241WcdDk,10801
4
4
  ccxt/alpaca.py,sha256=oO0YJHxo5_1iYyGVRMbxfGyPahqzuMlE7LZ3TMYgPGo,80694
@@ -13,7 +13,7 @@ ccxt/binancecoinm.py,sha256=MCMEAmIk1WTxrda8ZuCLdMRokKTIcZioc5kC8KiWzoE,1817
13
13
  ccxt/binanceus.py,sha256=oI9FAJrJmapOdqf3mnXUULBq8tGK-VfJ2GnDYqIwXsw,9550
14
14
  ccxt/binanceusdm.py,sha256=YcuFO1VXQy7ELcN9e7tlJFKby2mOZVBqvmp924clu8U,2701
15
15
  ccxt/bingx.py,sha256=9DYikizv3bqTIVUBtNy8uOZ55mpD_Ko2pYGYTH7qAas,278454
16
- ccxt/bit24.py,sha256=bxaTqISvkEVl5wFpooHRaZfAbxyvqfUgmfH-SEyPRk0,13828
16
+ ccxt/bit24.py,sha256=xl0kxCw1otDuMKfm6pPbHYCz_liSf1GpQaZqfXzW-wg,13769
17
17
  ccxt/bit2c.py,sha256=Yyxj7tK5kRxRJPIvsQwboWi6HwPfUOAMDr1uTrEfhyQ,41190
18
18
  ccxt/bitbank.py,sha256=K1rsciFMTmfEjDdab97E9IIxfIcMSHoa9YGIepqj2pY,47781
19
19
  ccxt/bitbns.py,sha256=5GqPAa7MEbUA2BcDzlus-GGW2rjUliqeWTg4P5gm0us,50931
@@ -63,7 +63,7 @@ ccxt/digifinex.py,sha256=qmYcsm1XTAltKQeywgR0xnnbVVdTVg5Dyu9QHbFiG1I,174815
63
63
  ccxt/ellipx.py,sha256=fith62iZEIpyx0drFdQfLFxADGsum6M-NJAFrYU8b54,85916
64
64
  ccxt/eterex.py,sha256=rbKwogBAVBZh7owkNkaY5xur6Y4foab940ezbpFE6uA,10665
65
65
  ccxt/excoino.py,sha256=UzRwsJnYDSq6RqbWLme0WkRdmlWDOBDWYrRpa6YyUs8,15836
66
- ccxt/exir.py,sha256=_HmnyiWzmNTR6AN0JMFdhMJpoPYd2qZ5QH3swNICZV0,14807
66
+ ccxt/exir.py,sha256=NIp5EDp0g7Hix_gUwzpM1yW67tQ0KR2dDPdp_j1A0No,14758
67
67
  ccxt/exmo.py,sha256=rnpx2B__KkLF1TCWj_XDEsVnNbtOgJvmF6Kg1AOAS3Q,121802
68
68
  ccxt/exnovin.py,sha256=JVPKmxEHOLmGj2eeCpkKYLPLERHwu3jRbUT1PcAchMo,13035
69
69
  ccxt/farhadexchange.py,sha256=Gn6Q_3lb0KjpUGTFHuRtrrYEJOVG78N6JQmBsF6LYbo,9883
@@ -118,6 +118,7 @@ ccxt/tabdeal.py,sha256=OWR4aV5Ek3cgIk3zjXy1l04hdbLxJZxd-3icm6prAvA,14358
118
118
  ccxt/tetherland.py,sha256=W5RTlW37Kgt6rhgWT4x3Gdn_PIRDjuOhhI9k5HVmTvo,13884
119
119
  ccxt/timex.py,sha256=MiLB4GyIpEOHweaQuzIrBJyuevw3jsVvitsaK7iQ6RE,76698
120
120
  ccxt/tokocrypto.py,sha256=-q95F-FvV-dgatuZzfJNnojtNxuyyyzmTpHLyOpu8Vw,126328
121
+ ccxt/toobit.py,sha256=hFs4roZGL7KfxtFNfcHgkrZVBli7llmm_ksseK1p9ds,13737
121
122
  ccxt/tradeogre.py,sha256=Q8CSHf8QGzb37jMFhaBmc_IZ1zga0eRXFVbjhmJnyFY,33712
122
123
  ccxt/twox.py,sha256=V1PDZqRWEyV5wuclQHtfvhlJzSF7pyHns9q2JRoJaBM,12064
123
124
  ccxt/ubitex.py,sha256=Z9ThriWhEmlZwBgb7WmtIFUC_EfTa17GTyj_0SNumZA,16466
@@ -252,6 +253,7 @@ ccxt/abstract/tabdeal.py,sha256=9wPBn90yiZrWpS9lWHAbE-mvOj4rdn_0ImYwPaRN5js,418
252
253
  ccxt/abstract/tetherland.py,sha256=oeq5VUYhHg8h9IaD7bDQlTCgZfHY80WAYnO-F-esl18,174
253
254
  ccxt/abstract/timex.py,sha256=9b0CDsyjm8XrYZmhUMB1dTHUmyE9YrsZTCZrz1UTt6E,5875
254
255
  ccxt/abstract/tokocrypto.py,sha256=OF5UW4ch_Lf3-avOPgd4AD4CVrOUDUfUpSMCmxhNHlk,4094
256
+ ccxt/abstract/toobit.py,sha256=7Qeqn5TJ8GKY5Jug5ynKwktqhBSZYhc07Ht6qJcPU4Q,295
255
257
  ccxt/abstract/tradeogre.py,sha256=bDouHP2c50F6Ins5EU2-3Jw10PsIG2KK3bcKv8y7678,1676
256
258
  ccxt/abstract/twox.py,sha256=RHI1yDeSsDxNgV3YX82DZCg1p36V-6fDOcmTXaMZK6w,166
257
259
  ccxt/abstract/ubitex.py,sha256=3bN3gGo86vcA1MPvlJTOcSkf8Ql-q0gbvXJCqhB_a-Q,416
@@ -266,7 +268,7 @@ ccxt/abstract/xt.py,sha256=n3eX1cItL_J0j8prOViV-C_tRwIFv_GO8JTvZZw8jv8,27837
266
268
  ccxt/abstract/yobit.py,sha256=8ycfCO8ORFly9hc0Aa47sZyX4_ZKPXS9h9yJzI-uQ7Q,1339
267
269
  ccxt/abstract/zaif.py,sha256=m15WHdl3gYy0GOXNZ8NEH8eE7sVh8c0T_ITNuU8vXeU,3935
268
270
  ccxt/abstract/zonda.py,sha256=X-hCW0SdX3YKZWixDyW-O2211M58Rno8kKJ6quY7rw4,7183
269
- ccxt/async_support/__init__.py,sha256=eWXWajm2NseaJunUbh-YtPM4ZyK1eyDoVMBgpFpceAo,19071
271
+ ccxt/async_support/__init__.py,sha256=MQWGRDhbI9AhAbvJTV1RJcdXBXA4Vvf_jdak3NAcz_Q,19178
270
272
  ccxt/async_support/abantether.py,sha256=uLWn1i6gE8dtZr9BXmXfyT0Y-MzYYZU1DDeXGjFngAM,12064
271
273
  ccxt/async_support/afratether.py,sha256=JC9ro3QrE8vE4YUm51xqwciSQhHfTPb98Mw1r6cJyvg,10869
272
274
  ccxt/async_support/alpaca.py,sha256=oFpSnAjX-faRgTN4d5rwHa08WRaCkwiAbHGZ7JBe6Ww,81140
@@ -281,7 +283,7 @@ ccxt/async_support/binancecoinm.py,sha256=GS5wgqgwna0HcRW6f6hHjzPq5wYHAn_OArdNan
281
283
  ccxt/async_support/binanceus.py,sha256=T9ab3Y4N822a_0agKM1mAkbOX3ChmSq_ymAsY2ZmxlI,9564
282
284
  ccxt/async_support/binanceusdm.py,sha256=sdx3CYlOma49ss3XxRnZZpqkhwUa0cAz_tfP_64LOwU,2739
283
285
  ccxt/async_support/bingx.py,sha256=gFXYiuHiNfh6BEghlr6MhmoI-1wTMGrEUSgvBIhE7CU,279832
284
- ccxt/async_support/bit24.py,sha256=R-2uCYMia4fsg0T1ewNtQQfsD9dYGnkfLLKtnmp_5xc,13884
286
+ ccxt/async_support/bit24.py,sha256=qsUKq4EXY06KGc8qiJnQPGNMA0dMfcPLoIAX99K6oXU,13825
285
287
  ccxt/async_support/bit2c.py,sha256=CYx7PSZNdg3JyN08DTYRtLYPxsz8gOoYxpgN02h1LjI,41402
286
288
  ccxt/async_support/bitbank.py,sha256=UHXNZ9GG4v-3-GHVxoFSYfNaLHSkPptfRlC0MiDBGcc,48041
287
289
  ccxt/async_support/bitbns.py,sha256=L6wAlhQu7ydl8R1kph7_K6QvnMAKuvjWQd_4w7d_uzY,51185
@@ -331,7 +333,7 @@ ccxt/async_support/digifinex.py,sha256=8_STpgUHR4WFBYFgUJD7TJbH8ZOMOiqY5UZvklO2Y
331
333
  ccxt/async_support/ellipx.py,sha256=RTBLSiZGXRWtcvhvACTvhjYxudyvJx5QNfVJqqosqdQ,86224
332
334
  ccxt/async_support/eterex.py,sha256=Xs0IJgDVvJ5Es9y8gnisi9HqePYerx8zCg1h3_Y6kqM,10727
333
335
  ccxt/async_support/excoino.py,sha256=DniOpS8pwmG2e6AZVr23W6GaH9vx5k0gujjDLK70BBs,15928
334
- ccxt/async_support/exir.py,sha256=wl5IO6ZFwCYVwgcdalTMJ9di-JXZF4rxx0tbEHbj53k,14905
336
+ ccxt/async_support/exir.py,sha256=GaftMPPxGxvStLgVo0F0G3lrSKKm2VeRE6teQTB3B9Q,14856
335
337
  ccxt/async_support/exmo.py,sha256=D0WSU6GB1Pi2zcjR5zq-WGia6JubKAL__i_nZM38eKA,122525
336
338
  ccxt/async_support/exnovin.py,sha256=bKBK1SBer2hPf_p_qImAvV4JI9S64LD4eYEH_h0Sg-M,13109
337
339
  ccxt/async_support/farhadexchange.py,sha256=0B8UNuNthwDgiyFUdZPAF_e7kpuTD9Benz7FEr8pszk,9939
@@ -386,6 +388,7 @@ ccxt/async_support/tabdeal.py,sha256=_kDTQeB8pQSZKYOiBc0IoZBuIsOkwvhhhTNN8m4A0G8
386
388
  ccxt/async_support/tetherland.py,sha256=k3zpZ7j6sFJm0Rb8f5tRVz46yG8Zyc5mHwKBm2cUYfE,13940
387
389
  ccxt/async_support/timex.py,sha256=SMMswaincdUzCI8waSpCnCEMPG5zEWe6UtcE4KteJaI,77060
388
390
  ccxt/async_support/tokocrypto.py,sha256=noI2aWGN2rH71WDomTl2GeysjsNbuMbLNHKMTNvJYOs,126690
391
+ ccxt/async_support/toobit.py,sha256=hDiHHwk_7zV0yH70zuzVnQb11fPVpafBuurU5ir5aO4,13817
389
392
  ccxt/async_support/tradeogre.py,sha256=gTmxvLXyRX8Ye8OTIrpKLso9QltZ4ZOrwxHklHrvhv8,33954
390
393
  ccxt/async_support/twox.py,sha256=FEYBvRZxl-mtN3RgN_s4GzlMG1f71nNH3KRqh1s2ioU,12120
391
394
  ccxt/async_support/ubitex.py,sha256=lpLvSKKOftf7FjGRfIcJkY1sCWprmJQB-SvEvJIv_FY,16564
@@ -401,7 +404,7 @@ ccxt/async_support/yobit.py,sha256=FBI7ajvxprTYUqX8zosd7-LntDft8vIEjRTHng5ry8Y,5
401
404
  ccxt/async_support/zaif.py,sha256=mh0PETLMTJV509zhT7jukddg6S7YhvwhCT7zqxC6YLA,31364
402
405
  ccxt/async_support/zonda.py,sha256=7hmHotE5JBd8034d1ZbX3oIeWIpQFrQb8aK-dP3Btx0,85327
403
406
  ccxt/async_support/base/__init__.py,sha256=aVYSsFi--b4InRs9zDN_wtCpj8odosAB726JdUHavrk,67
404
- ccxt/async_support/base/exchange.py,sha256=bk1-QHvh69e3X7a32Nm0fwzrh8yqRVHNqZPM7U6H53Q,121268
407
+ ccxt/async_support/base/exchange.py,sha256=8da6qNt4N5ZwjLyy7T5XZaiwghbexHX3lPti67Mgzis,121268
405
408
  ccxt/async_support/base/throttler.py,sha256=tvDVcdRUVYi8fZRlEcnqtgzcgB_KMUMRs5Pu8tuU-tU,1847
406
409
  ccxt/async_support/base/ws/__init__.py,sha256=uockzpLuwntKGZbs5EOWFe-Zg-k6Cj7GhNJLc_RX0so,1791
407
410
  ccxt/async_support/base/ws/cache.py,sha256=xf2VOtfUwloxSlIQ39M1RGZHWQzyS9IGhB5NX6cDcAc,8370
@@ -413,10 +416,10 @@ ccxt/async_support/base/ws/order_book_side.py,sha256=GhnGUt78pJ-AYL_Dq9produGjmB
413
416
  ccxt/base/__init__.py,sha256=eTx1OE3HJjspFUQjGm6LBhaQiMKJnXjkdP-JUXknyQ0,1320
414
417
  ccxt/base/decimal_to_precision.py,sha256=3XI30u9YudHbTA438397u5rkdlXa3atxwZEfUus3C4k,6803
415
418
  ccxt/base/errors.py,sha256=OGhWNvNtRlJOzFx-n1x3ZjTnaPpfWH0Vc0xACS-MeDw,5012
416
- ccxt/base/exchange.py,sha256=N4RVR7YUqQaVuQatzRhVzAs47ht7cCDXmuQ-ZBcypYc,334337
419
+ ccxt/base/exchange.py,sha256=hCVro64mcaWt9mwkjXkaaOYB8lP6xiiL1e_WMP-Afog,334337
417
420
  ccxt/base/precise.py,sha256=koce64Yrp6vFbGijJtUt-QQ6XhJgeGTCksZ871FPp_A,8886
418
421
  ccxt/base/types.py,sha256=Gvbogh9i7pPH7Z18xesYeDPribqqwq8uKpOv-YODFBs,11505
419
- ccxt/pro/__init__.py,sha256=NVYtukYyHyKghPC0sfRNH8RFMdYSlGoZhPpHWpVYm6U,11463
422
+ ccxt/pro/__init__.py,sha256=y9lSdKFSFamdzxT17RIkWpyQsokPiwGndJp0NkAw2lA,11463
420
423
  ccxt/pro/alpaca.py,sha256=REAEZxdv2pY8xjxBGCBca3nPKpIdleVqr-IVpuVmADg,27637
421
424
  ccxt/pro/apex.py,sha256=FLBaLN2FESIh9gqHPVwf0IkkIHpxGHHUcFwgBGBEkrA,42018
422
425
  ccxt/pro/ascendex.py,sha256=P0DnIMIA-BIGxyoEQBLGtjH-whRhkPbhe8gU2s5V238,37526
@@ -739,8 +742,8 @@ ccxt/test/tests_async.py,sha256=D5ZDYYW635E2LFEhJt7HfIjbFVCQl3WSBEFnR-QEQzM,9549
739
742
  ccxt/test/tests_helpers.py,sha256=egM69A2ZFYeVF5hwC1Qt-c5DOeClY5bv4jowmceeFV8,9736
740
743
  ccxt/test/tests_init.py,sha256=qM0-Gb0h0p6CANWTkyYZI7wl-iYOcrPur7aj_OKh7m0,1212
741
744
  ccxt/test/tests_sync.py,sha256=Rr72cGmoKqbUIIEJJAGh2_QhBc4rIZlBxVtGCQVd4BE,94440
742
- ccxt_ir-4.6.1.dist-info/licenses/LICENSE.txt,sha256=EIb9221AhMHV7xF1_55STFdKTFsnJVJYkRpY2Lnvo5w,1068
743
- ccxt_ir-4.6.1.dist-info/METADATA,sha256=Se-khhDWMTbw9EPJCjpg_AC1kWMutH_9EjWf9O4QWLE,138930
744
- ccxt_ir-4.6.1.dist-info/WHEEL,sha256=JNWh1Fm1UdwIQV075glCn4MVuCRs0sotJIq-J6rbxCU,109
745
- ccxt_ir-4.6.1.dist-info/top_level.txt,sha256=CkQDuCTDKNcImPV60t36G6MdYfxsAPNiSaEwifVoVMo,5
746
- ccxt_ir-4.6.1.dist-info/RECORD,,
745
+ ccxt_ir-4.7.0.dist-info/licenses/LICENSE.txt,sha256=EIb9221AhMHV7xF1_55STFdKTFsnJVJYkRpY2Lnvo5w,1068
746
+ ccxt_ir-4.7.0.dist-info/METADATA,sha256=bv8Q5fUtCJ4edgRGK73c7jFCXfXgBgFGkoYaE1D19m0,139254
747
+ ccxt_ir-4.7.0.dist-info/WHEEL,sha256=JNWh1Fm1UdwIQV075glCn4MVuCRs0sotJIq-J6rbxCU,109
748
+ ccxt_ir-4.7.0.dist-info/top_level.txt,sha256=CkQDuCTDKNcImPV60t36G6MdYfxsAPNiSaEwifVoVMo,5
749
+ ccxt_ir-4.7.0.dist-info/RECORD,,