ccxt-ir 4.9.22__py2.py3-none-any.whl → 4.9.24__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
ccxt/__init__.py CHANGED
@@ -22,7 +22,7 @@
22
22
 
23
23
  # ----------------------------------------------------------------------------
24
24
 
25
- __version__ = '4.9.22'
25
+ __version__ = '4.9.24'
26
26
 
27
27
  # ----------------------------------------------------------------------------
28
28
 
@@ -172,6 +172,7 @@ from ccxt.huobi import huobi # noqa: F4
172
172
  from ccxt.hyperliquid import hyperliquid # noqa: F401
173
173
  from ccxt.independentreserve import independentreserve # noqa: F401
174
174
  from ccxt.indodax import indodax # noqa: F401
175
+ from ccxt.iranexchange import iranexchange # noqa: F401
175
176
  from ccxt.jibitex import jibitex # noqa: F401
176
177
  from ccxt.kcex import kcex # noqa: F401
177
178
  from ccxt.kifpoolme import kifpoolme # noqa: F401
@@ -319,6 +320,7 @@ exchanges = [
319
320
  'hyperliquid',
320
321
  'independentreserve',
321
322
  'indodax',
323
+ 'iranexchange',
322
324
  'jibitex',
323
325
  'kcex',
324
326
  'kifpoolme',
@@ -0,0 +1,6 @@
1
+ from ccxt.base.types import Entry
2
+
3
+
4
+ class ImplicitAPI:
5
+ public_get_v1_client_listproduct = publicGetV1ClientListProduct = Entry('v1/client/listProduct', 'public', 'GET', {'cost': 1})
6
+ public_get_v1_client_getbysymbol = publicGetV1ClientGetBySymbol = Entry('v1/client/getBySymbol', 'public', 'GET', {'cost': 1})
@@ -4,7 +4,7 @@
4
4
 
5
5
  # -----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.9.22'
7
+ __version__ = '4.9.24'
8
8
 
9
9
  # -----------------------------------------------------------------------------
10
10
 
@@ -152,6 +152,7 @@ from ccxt.async_support.huobi import huobi
152
152
  from ccxt.async_support.hyperliquid import hyperliquid # noqa: F401
153
153
  from ccxt.async_support.independentreserve import independentreserve # noqa: F401
154
154
  from ccxt.async_support.indodax import indodax # noqa: F401
155
+ from ccxt.async_support.iranexchange import iranexchange # noqa: F401
155
156
  from ccxt.async_support.jibitex import jibitex # noqa: F401
156
157
  from ccxt.async_support.kcex import kcex # noqa: F401
157
158
  from ccxt.async_support.kifpoolme import kifpoolme # noqa: F401
@@ -299,6 +300,7 @@ exchanges = [
299
300
  'hyperliquid',
300
301
  'independentreserve',
301
302
  'indodax',
303
+ 'iranexchange',
302
304
  'jibitex',
303
305
  'kcex',
304
306
  'kifpoolme',
@@ -2,7 +2,7 @@
2
2
 
3
3
  # -----------------------------------------------------------------------------
4
4
 
5
- __version__ = '4.9.22'
5
+ __version__ = '4.9.24'
6
6
 
7
7
  # -----------------------------------------------------------------------------
8
8
 
@@ -0,0 +1,384 @@
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.iranexchange import ImplicitAPI
8
+ from ccxt.base.types import Any, Market, Strings, Ticker, Tickers
9
+ from typing import List
10
+
11
+
12
+ class iranexchange(Exchange, ImplicitAPI):
13
+
14
+ def describe(self) -> Any:
15
+ return self.deep_extend(super(iranexchange, self).describe(), {
16
+ 'id': 'iranexchange',
17
+ 'name': 'Iran Exchange',
18
+ 'countries': ['IR'],
19
+ 'rateLimit': 1000,
20
+ 'version': '1',
21
+ 'certified': False,
22
+ 'pro': False,
23
+ 'timeout': 30000, # milliseconds = seconds * 1000
24
+ 'has': {
25
+ 'CORS': None,
26
+ 'spot': False,
27
+ 'margin': False,
28
+ 'swap': False,
29
+ 'future': False,
30
+ 'option': False,
31
+ 'addMargin': False,
32
+ 'cancelAllOrders': False,
33
+ 'cancelOrder': False,
34
+ 'cancelOrders': False,
35
+ 'createDepositAddress': False,
36
+ 'createOrder': False,
37
+ 'createStopLimitOrder': False,
38
+ 'createStopMarketOrder': False,
39
+ 'createStopOrder': False,
40
+ 'editOrder': False,
41
+ 'fetchBalance': False,
42
+ 'fetchBorrowInterest': False,
43
+ 'fetchBorrowRateHistories': False,
44
+ 'fetchBorrowRateHistory': False,
45
+ 'fetchClosedOrders': False,
46
+ 'fetchCrossBorrowRate': False,
47
+ 'fetchCrossBorrowRates': False,
48
+ 'fetchCurrencies': False,
49
+ 'fetchDepositAddress': False,
50
+ 'fetchDeposits': False,
51
+ 'fetchFundingHistory': False,
52
+ 'fetchFundingRate': False,
53
+ 'fetchFundingRateHistory': False,
54
+ 'fetchFundingRates': False,
55
+ 'fetchIndexOHLCV': False,
56
+ 'fetchIsolatedBorrowRate': False,
57
+ 'fetchIsolatedBorrowRates': False,
58
+ 'fetchL2OrderBook': False,
59
+ 'fetchLedger': False,
60
+ 'fetchLedgerEntry': False,
61
+ 'fetchLeverageTiers': False,
62
+ 'fetchMarkets': True,
63
+ 'fetchMarkOHLCV': False,
64
+ 'fetchMyTrades': False,
65
+ 'fetchOHLCV': False,
66
+ 'fetchOpenInterestHistory': False,
67
+ 'fetchOpenOrders': False,
68
+ 'fetchOrder': False,
69
+ 'fetchOrderBook': False,
70
+ 'fetchOrders': False,
71
+ 'fetchOrderTrades': 'emulated',
72
+ 'fetchPositions': False,
73
+ 'fetchPremiumIndexOHLCV': False,
74
+ 'fetchTicker': True,
75
+ 'fetchTickers': True,
76
+ 'fetchTime': False,
77
+ 'fetchTrades': False,
78
+ 'fetchTradingFee': False,
79
+ 'fetchTradingFees': False,
80
+ 'fetchWithdrawals': False,
81
+ 'otc': True,
82
+ 'setLeverage': False,
83
+ 'setMarginMode': False,
84
+ 'transfer': False,
85
+ 'withdraw': False,
86
+ },
87
+ 'comment': 'This comment is optional',
88
+ 'urls': {
89
+ 'logo': 'https://cdn.arz.digital/cr-odin/img/exchanges/iran-exchange/64x64.png',
90
+ 'api': {
91
+ 'public': 'https://api.iranexchange.com/api/public/modules/crypto',
92
+ },
93
+ 'www': 'https://iranexchange.com/',
94
+ 'doc': [
95
+ 'https://iranexchange.com/',
96
+ ],
97
+ },
98
+ 'api': {
99
+ 'public': {
100
+ 'get': {
101
+ 'v1/client/listProduct': 1,
102
+ 'v1/client/getBySymbol': 1,
103
+ },
104
+ },
105
+ },
106
+ 'fees': {
107
+ 'trading': {
108
+ 'tierBased': False,
109
+ 'percentage': True,
110
+ 'maker': self.parse_number('0.001'),
111
+ 'taker': self.parse_number('0.001'),
112
+ },
113
+ },
114
+ })
115
+
116
+ async def fetch_markets(self, params={}) -> List[Market]:
117
+ """
118
+ retrieves data on all markets for iranexchange
119
+ https://iranexchange.co/
120
+ :param dict [params]: extra parameters specific to the exchange API endpoint
121
+ :returns dict[]: an array of objects representing market data
122
+ """
123
+ response = await self.publicGetV1ClientListProduct()
124
+ markets = self.safe_list(response, 'data')
125
+ result = []
126
+ for i in range(0, len(markets)):
127
+ market = self.parse_market(markets[i])
128
+ result.append(market)
129
+ return result
130
+
131
+ def parse_market(self, market) -> Market:
132
+ # {
133
+ # _id: "60b08a57b202353abb592032",
134
+ # name: "Bitcoin",
135
+ # fa_name: "بیت کوین",
136
+ # symbol: "BTC",
137
+ # slug: "bitcoin",
138
+ # is_sell_to_customer_active: 1,
139
+ # is_fast_sell_to_customer_active: 1,
140
+ # is_buy_from_customer_active: 1,
141
+ # logo: "https://iranexchange.com/strapi/media/BTC_78d99b9d12.png",
142
+ # dollar_price: 89240.18,
143
+ # sell_to_iranicard_currency_price: 1234526,
144
+ # buy_from_iranicard_currency_price: 1239474,
145
+ # fast_sell_to_iranicard_currency_price: 1234526,
146
+ # buy_from_iranicard_network_list: [
147
+ # {
148
+ # network: "BTC",
149
+ # name: "Bitcoin",
150
+ # addressRegex: "^[13][a-km-zA-HJ-NP-Z1-9]{25,34}$|^[(bc1q)|(bc1p)][0-9A-Za-z]{37,62}$",
151
+ # coin: "BTC",
152
+ # withdrawEnable: True,
153
+ # depositEnable: True,
154
+ # withdrawMin: "0.000100000",
155
+ # withdrawMax: null,
156
+ # withdrawFee: "0.000100000",
157
+ # sameAddress: False,
158
+ # memoRegex: null,
159
+ # tradeEnable: True
160
+ # }
161
+ # ],
162
+ # sell_to_iranicard_network_list: [
163
+ # {
164
+ # network: "BTC",
165
+ # name: "Bitcoin",
166
+ # addressRegex: "^[13][a-km-zA-HJ-NP-Z1-9]{25,34}$|^[(bc1q)|(bc1p)][0-9A-Za-z]{37,62}$",
167
+ # coin: "BTC",
168
+ # withdrawEnable: True,
169
+ # depositEnable: True,
170
+ # withdrawMin: "0.000100000",
171
+ # withdrawMax: null,
172
+ # withdrawFee: "0.000100000",
173
+ # sameAddress: False,
174
+ # memoRegex: null,
175
+ # tradeEnable: True
176
+ # }
177
+ # ],
178
+ # is_price_maker_active: 1,
179
+ # quotation: {
180
+ # maxPrice: "90199.99",
181
+ # minPrice: "88925",
182
+ # dailyChangePercent: "-0.26"
183
+ # },
184
+ # dailyChangePercent: -0.26,
185
+ # order: 0,
186
+ # stock_status: "in_stock",
187
+ # stock_label: null,
188
+ # stock_description: null
189
+ # },
190
+ id = self.safe_string(market, 'symbol') + '_' + 'IRT'
191
+ baseId = self.safe_string(market, 'symbol')
192
+ quoteId = 'IRT'
193
+ base = self.safe_currency_code(baseId)
194
+ quote = self.safe_currency_code(quoteId)
195
+ baseId = baseId.lower()
196
+ quoteId = quoteId.lower()
197
+ return {
198
+ 'id': id,
199
+ 'symbol': base + '/' + quote,
200
+ 'base': base,
201
+ 'quote': quote,
202
+ 'settle': None,
203
+ 'baseId': baseId,
204
+ 'quoteId': quoteId,
205
+ 'settleId': None,
206
+ 'type': 'otc',
207
+ 'spot': False,
208
+ 'margin': False,
209
+ 'swap': False,
210
+ 'future': False,
211
+ 'option': False,
212
+ 'active': True,
213
+ 'contract': False,
214
+ 'linear': None,
215
+ 'inverse': None,
216
+ 'contractSize': None,
217
+ 'expiry': None,
218
+ 'expiryDatetime': None,
219
+ 'strike': None,
220
+ 'optionType': None,
221
+ 'precision': {
222
+ 'amount': None,
223
+ 'price': None,
224
+ },
225
+ 'limits': {
226
+ 'leverage': {
227
+ 'min': None,
228
+ 'max': None,
229
+ },
230
+ 'amount': {
231
+ 'min': None,
232
+ 'max': None,
233
+ },
234
+ 'price': {
235
+ 'min': None,
236
+ 'max': None,
237
+ },
238
+ 'cost': {
239
+ 'min': None,
240
+ 'max': None,
241
+ },
242
+ },
243
+ 'created': None,
244
+ 'info': market,
245
+ }
246
+
247
+ async def fetch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
248
+ """
249
+ fetches price tickers for multiple markets, statistical information calculated over the past 24 hours for each market
250
+ https://iranexchange.co/
251
+ :param str[]|None symbols: unified symbols of the markets to fetch the ticker for, all market tickers are returned if not assigned
252
+ :param dict [params]: extra parameters specific to the exchange API endpoint
253
+ :returns dict: a dictionary of `ticker structures <https://docs.ccxt.com/#/?id=ticker-structure>`
254
+ """
255
+ await self.load_markets()
256
+ if symbols is not None:
257
+ symbols = self.market_symbols(symbols)
258
+ response = await self.publicGetV1ClientListProduct()
259
+ markets = self.safe_list(response, 'data')
260
+ result = {}
261
+ for i in range(0, len(markets)):
262
+ ticker = self.parse_ticker(markets[i])
263
+ symbol = ticker['symbol']
264
+ result[symbol] = ticker
265
+ return self.filter_by_array_tickers(result, 'symbol', symbols)
266
+
267
+ async def fetch_ticker(self, symbol: str, params={}) -> Ticker:
268
+ """
269
+ fetches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
270
+ https://iranexchange.co/
271
+ :param str symbol: unified symbol of the market to fetch the ticker for
272
+ :param dict [params]: extra parameters specific to the exchange API endpoint
273
+ :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
274
+ """
275
+ await self.load_markets()
276
+ market = self.market(symbol)
277
+ request = {
278
+ 'id': market['base'],
279
+ }
280
+ response = await self.publicGetV1ClientGetBySymbol(request)
281
+ marketData = self.safe_dict(response, 'data')
282
+ ticker = self.parse_ticker(marketData)
283
+ return ticker
284
+
285
+ def parse_ticker(self, ticker, market: Market = None) -> Ticker:
286
+ # {
287
+ # _id: "60b08a57b202353abb592032",
288
+ # name: "Bitcoin",
289
+ # fa_name: "بیت کوین",
290
+ # symbol: "BTC",
291
+ # slug: "bitcoin",
292
+ # is_sell_to_customer_active: 1,
293
+ # is_fast_sell_to_customer_active: 1,
294
+ # is_buy_from_customer_active: 1,
295
+ # logo: "https://iranexchange.com/strapi/media/BTC_78d99b9d12.png",
296
+ # dollar_price: 89240.18,
297
+ # sell_to_iranicard_currency_price: 1234526,
298
+ # buy_from_iranicard_currency_price: 1239474,
299
+ # fast_sell_to_iranicard_currency_price: 1234526,
300
+ # buy_from_iranicard_network_list: [
301
+ # {
302
+ # network: "BTC",
303
+ # name: "Bitcoin",
304
+ # addressRegex: "^[13][a-km-zA-HJ-NP-Z1-9]{25,34}$|^[(bc1q)|(bc1p)][0-9A-Za-z]{37,62}$",
305
+ # coin: "BTC",
306
+ # withdrawEnable: True,
307
+ # depositEnable: True,
308
+ # withdrawMin: "0.000100000",
309
+ # withdrawMax: null,
310
+ # withdrawFee: "0.000100000",
311
+ # sameAddress: False,
312
+ # memoRegex: null,
313
+ # tradeEnable: True
314
+ # }
315
+ # ],
316
+ # sell_to_iranicard_network_list: [
317
+ # {
318
+ # network: "BTC",
319
+ # name: "Bitcoin",
320
+ # addressRegex: "^[13][a-km-zA-HJ-NP-Z1-9]{25,34}$|^[(bc1q)|(bc1p)][0-9A-Za-z]{37,62}$",
321
+ # coin: "BTC",
322
+ # withdrawEnable: True,
323
+ # depositEnable: True,
324
+ # withdrawMin: "0.000100000",
325
+ # withdrawMax: null,
326
+ # withdrawFee: "0.000100000",
327
+ # sameAddress: False,
328
+ # memoRegex: null,
329
+ # tradeEnable: True
330
+ # }
331
+ # ],
332
+ # is_price_maker_active: 1,
333
+ # quotation: {
334
+ # maxPrice: "90199.99",
335
+ # minPrice: "88925",
336
+ # dailyChangePercent: "-0.26"
337
+ # },
338
+ # dailyChangePercent: -0.26,
339
+ # order: 0,
340
+ # stock_status: "in_stock",
341
+ # stock_label: null,
342
+ # stock_description: null
343
+ # }
344
+ marketType = 'otc'
345
+ marketId = self.safe_string(ticker, 'symbol') + '_' + 'IRT'
346
+ symbol = self.safe_symbol(marketId, market, None, marketType)
347
+ quotation = self.safe_value(ticker, 'quotation', {})
348
+ high = self.safe_float(quotation, 'maxPrice', 0)
349
+ low = self.safe_float(quotation, 'minPrice', 0)
350
+ bid = self.safe_float(ticker, 'sell_to_iranicard_currency_price', 0)
351
+ ask = self.safe_float(ticker, 'buy_from_iranicard_currency_price', 0)
352
+ last = self.safe_float(ticker, 'sell_to_iranicard_currency_price', 0)
353
+ change = self.safe_float(quotation, 'dailyChangePercent', 0)
354
+ return self.safe_ticker({
355
+ 'symbol': symbol,
356
+ 'timestamp': None,
357
+ 'datetime': None,
358
+ 'high': high,
359
+ 'low': low,
360
+ 'bid': bid,
361
+ 'bidVolume': None,
362
+ 'ask': ask,
363
+ 'askVolume': None,
364
+ 'vwap': None,
365
+ 'open': last,
366
+ 'close': last,
367
+ 'last': last,
368
+ 'previousClose': None,
369
+ 'change': change,
370
+ 'percentage': change,
371
+ 'average': None,
372
+ 'baseVolume': None,
373
+ 'quoteVolume': None,
374
+ 'info': ticker,
375
+ }, market)
376
+
377
+ def sign(self, path, api='public', method='GET', params={}, headers=None, body=None):
378
+ query = self.omit(params, self.extract_params(path))
379
+ url = self.urls['api']['public'] + '/' + path + '?' + self.urlencode(query)
380
+ pair_id = self.safe_string(params, 'id')
381
+ if pair_id is not None:
382
+ url = self.urls['api']['public'] + '/' + path + '/' + pair_id
383
+ headers = {'Content-Type': 'application/json'}
384
+ 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.9.22'
7
+ __version__ = '4.9.24'
8
8
 
9
9
  # -----------------------------------------------------------------------------
10
10
 
ccxt/iranexchange.py ADDED
@@ -0,0 +1,384 @@
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.iranexchange import ImplicitAPI
8
+ from ccxt.base.types import Any, Market, Strings, Ticker, Tickers
9
+ from typing import List
10
+
11
+
12
+ class iranexchange(Exchange, ImplicitAPI):
13
+
14
+ def describe(self) -> Any:
15
+ return self.deep_extend(super(iranexchange, self).describe(), {
16
+ 'id': 'iranexchange',
17
+ 'name': 'Iran Exchange',
18
+ 'countries': ['IR'],
19
+ 'rateLimit': 1000,
20
+ 'version': '1',
21
+ 'certified': False,
22
+ 'pro': False,
23
+ 'timeout': 30000, # milliseconds = seconds * 1000
24
+ 'has': {
25
+ 'CORS': None,
26
+ 'spot': False,
27
+ 'margin': False,
28
+ 'swap': False,
29
+ 'future': False,
30
+ 'option': False,
31
+ 'addMargin': False,
32
+ 'cancelAllOrders': False,
33
+ 'cancelOrder': False,
34
+ 'cancelOrders': False,
35
+ 'createDepositAddress': False,
36
+ 'createOrder': False,
37
+ 'createStopLimitOrder': False,
38
+ 'createStopMarketOrder': False,
39
+ 'createStopOrder': False,
40
+ 'editOrder': False,
41
+ 'fetchBalance': False,
42
+ 'fetchBorrowInterest': False,
43
+ 'fetchBorrowRateHistories': False,
44
+ 'fetchBorrowRateHistory': False,
45
+ 'fetchClosedOrders': False,
46
+ 'fetchCrossBorrowRate': False,
47
+ 'fetchCrossBorrowRates': False,
48
+ 'fetchCurrencies': False,
49
+ 'fetchDepositAddress': False,
50
+ 'fetchDeposits': False,
51
+ 'fetchFundingHistory': False,
52
+ 'fetchFundingRate': False,
53
+ 'fetchFundingRateHistory': False,
54
+ 'fetchFundingRates': False,
55
+ 'fetchIndexOHLCV': False,
56
+ 'fetchIsolatedBorrowRate': False,
57
+ 'fetchIsolatedBorrowRates': False,
58
+ 'fetchL2OrderBook': False,
59
+ 'fetchLedger': False,
60
+ 'fetchLedgerEntry': False,
61
+ 'fetchLeverageTiers': False,
62
+ 'fetchMarkets': True,
63
+ 'fetchMarkOHLCV': False,
64
+ 'fetchMyTrades': False,
65
+ 'fetchOHLCV': False,
66
+ 'fetchOpenInterestHistory': False,
67
+ 'fetchOpenOrders': False,
68
+ 'fetchOrder': False,
69
+ 'fetchOrderBook': False,
70
+ 'fetchOrders': False,
71
+ 'fetchOrderTrades': 'emulated',
72
+ 'fetchPositions': False,
73
+ 'fetchPremiumIndexOHLCV': False,
74
+ 'fetchTicker': True,
75
+ 'fetchTickers': True,
76
+ 'fetchTime': False,
77
+ 'fetchTrades': False,
78
+ 'fetchTradingFee': False,
79
+ 'fetchTradingFees': False,
80
+ 'fetchWithdrawals': False,
81
+ 'otc': True,
82
+ 'setLeverage': False,
83
+ 'setMarginMode': False,
84
+ 'transfer': False,
85
+ 'withdraw': False,
86
+ },
87
+ 'comment': 'This comment is optional',
88
+ 'urls': {
89
+ 'logo': 'https://cdn.arz.digital/cr-odin/img/exchanges/iran-exchange/64x64.png',
90
+ 'api': {
91
+ 'public': 'https://api.iranexchange.com/api/public/modules/crypto',
92
+ },
93
+ 'www': 'https://iranexchange.com/',
94
+ 'doc': [
95
+ 'https://iranexchange.com/',
96
+ ],
97
+ },
98
+ 'api': {
99
+ 'public': {
100
+ 'get': {
101
+ 'v1/client/listProduct': 1,
102
+ 'v1/client/getBySymbol': 1,
103
+ },
104
+ },
105
+ },
106
+ 'fees': {
107
+ 'trading': {
108
+ 'tierBased': False,
109
+ 'percentage': True,
110
+ 'maker': self.parse_number('0.001'),
111
+ 'taker': self.parse_number('0.001'),
112
+ },
113
+ },
114
+ })
115
+
116
+ def fetch_markets(self, params={}) -> List[Market]:
117
+ """
118
+ retrieves data on all markets for iranexchange
119
+ https://iranexchange.co/
120
+ :param dict [params]: extra parameters specific to the exchange API endpoint
121
+ :returns dict[]: an array of objects representing market data
122
+ """
123
+ response = self.publicGetV1ClientListProduct()
124
+ markets = self.safe_list(response, 'data')
125
+ result = []
126
+ for i in range(0, len(markets)):
127
+ market = self.parse_market(markets[i])
128
+ result.append(market)
129
+ return result
130
+
131
+ def parse_market(self, market) -> Market:
132
+ # {
133
+ # _id: "60b08a57b202353abb592032",
134
+ # name: "Bitcoin",
135
+ # fa_name: "بیت کوین",
136
+ # symbol: "BTC",
137
+ # slug: "bitcoin",
138
+ # is_sell_to_customer_active: 1,
139
+ # is_fast_sell_to_customer_active: 1,
140
+ # is_buy_from_customer_active: 1,
141
+ # logo: "https://iranexchange.com/strapi/media/BTC_78d99b9d12.png",
142
+ # dollar_price: 89240.18,
143
+ # sell_to_iranicard_currency_price: 1234526,
144
+ # buy_from_iranicard_currency_price: 1239474,
145
+ # fast_sell_to_iranicard_currency_price: 1234526,
146
+ # buy_from_iranicard_network_list: [
147
+ # {
148
+ # network: "BTC",
149
+ # name: "Bitcoin",
150
+ # addressRegex: "^[13][a-km-zA-HJ-NP-Z1-9]{25,34}$|^[(bc1q)|(bc1p)][0-9A-Za-z]{37,62}$",
151
+ # coin: "BTC",
152
+ # withdrawEnable: True,
153
+ # depositEnable: True,
154
+ # withdrawMin: "0.000100000",
155
+ # withdrawMax: null,
156
+ # withdrawFee: "0.000100000",
157
+ # sameAddress: False,
158
+ # memoRegex: null,
159
+ # tradeEnable: True
160
+ # }
161
+ # ],
162
+ # sell_to_iranicard_network_list: [
163
+ # {
164
+ # network: "BTC",
165
+ # name: "Bitcoin",
166
+ # addressRegex: "^[13][a-km-zA-HJ-NP-Z1-9]{25,34}$|^[(bc1q)|(bc1p)][0-9A-Za-z]{37,62}$",
167
+ # coin: "BTC",
168
+ # withdrawEnable: True,
169
+ # depositEnable: True,
170
+ # withdrawMin: "0.000100000",
171
+ # withdrawMax: null,
172
+ # withdrawFee: "0.000100000",
173
+ # sameAddress: False,
174
+ # memoRegex: null,
175
+ # tradeEnable: True
176
+ # }
177
+ # ],
178
+ # is_price_maker_active: 1,
179
+ # quotation: {
180
+ # maxPrice: "90199.99",
181
+ # minPrice: "88925",
182
+ # dailyChangePercent: "-0.26"
183
+ # },
184
+ # dailyChangePercent: -0.26,
185
+ # order: 0,
186
+ # stock_status: "in_stock",
187
+ # stock_label: null,
188
+ # stock_description: null
189
+ # },
190
+ id = self.safe_string(market, 'symbol') + '_' + 'IRT'
191
+ baseId = self.safe_string(market, 'symbol')
192
+ quoteId = 'IRT'
193
+ base = self.safe_currency_code(baseId)
194
+ quote = self.safe_currency_code(quoteId)
195
+ baseId = baseId.lower()
196
+ quoteId = quoteId.lower()
197
+ return {
198
+ 'id': id,
199
+ 'symbol': base + '/' + quote,
200
+ 'base': base,
201
+ 'quote': quote,
202
+ 'settle': None,
203
+ 'baseId': baseId,
204
+ 'quoteId': quoteId,
205
+ 'settleId': None,
206
+ 'type': 'otc',
207
+ 'spot': False,
208
+ 'margin': False,
209
+ 'swap': False,
210
+ 'future': False,
211
+ 'option': False,
212
+ 'active': True,
213
+ 'contract': False,
214
+ 'linear': None,
215
+ 'inverse': None,
216
+ 'contractSize': None,
217
+ 'expiry': None,
218
+ 'expiryDatetime': None,
219
+ 'strike': None,
220
+ 'optionType': None,
221
+ 'precision': {
222
+ 'amount': None,
223
+ 'price': None,
224
+ },
225
+ 'limits': {
226
+ 'leverage': {
227
+ 'min': None,
228
+ 'max': None,
229
+ },
230
+ 'amount': {
231
+ 'min': None,
232
+ 'max': None,
233
+ },
234
+ 'price': {
235
+ 'min': None,
236
+ 'max': None,
237
+ },
238
+ 'cost': {
239
+ 'min': None,
240
+ 'max': None,
241
+ },
242
+ },
243
+ 'created': None,
244
+ 'info': market,
245
+ }
246
+
247
+ def fetch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
248
+ """
249
+ fetches price tickers for multiple markets, statistical information calculated over the past 24 hours for each market
250
+ https://iranexchange.co/
251
+ :param str[]|None symbols: unified symbols of the markets to fetch the ticker for, all market tickers are returned if not assigned
252
+ :param dict [params]: extra parameters specific to the exchange API endpoint
253
+ :returns dict: a dictionary of `ticker structures <https://docs.ccxt.com/#/?id=ticker-structure>`
254
+ """
255
+ self.load_markets()
256
+ if symbols is not None:
257
+ symbols = self.market_symbols(symbols)
258
+ response = self.publicGetV1ClientListProduct()
259
+ markets = self.safe_list(response, 'data')
260
+ result = {}
261
+ for i in range(0, len(markets)):
262
+ ticker = self.parse_ticker(markets[i])
263
+ symbol = ticker['symbol']
264
+ result[symbol] = ticker
265
+ return self.filter_by_array_tickers(result, 'symbol', symbols)
266
+
267
+ def fetch_ticker(self, symbol: str, params={}) -> Ticker:
268
+ """
269
+ fetches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
270
+ https://iranexchange.co/
271
+ :param str symbol: unified symbol of the market to fetch the ticker for
272
+ :param dict [params]: extra parameters specific to the exchange API endpoint
273
+ :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
274
+ """
275
+ self.load_markets()
276
+ market = self.market(symbol)
277
+ request = {
278
+ 'id': market['base'],
279
+ }
280
+ response = self.publicGetV1ClientGetBySymbol(request)
281
+ marketData = self.safe_dict(response, 'data')
282
+ ticker = self.parse_ticker(marketData)
283
+ return ticker
284
+
285
+ def parse_ticker(self, ticker, market: Market = None) -> Ticker:
286
+ # {
287
+ # _id: "60b08a57b202353abb592032",
288
+ # name: "Bitcoin",
289
+ # fa_name: "بیت کوین",
290
+ # symbol: "BTC",
291
+ # slug: "bitcoin",
292
+ # is_sell_to_customer_active: 1,
293
+ # is_fast_sell_to_customer_active: 1,
294
+ # is_buy_from_customer_active: 1,
295
+ # logo: "https://iranexchange.com/strapi/media/BTC_78d99b9d12.png",
296
+ # dollar_price: 89240.18,
297
+ # sell_to_iranicard_currency_price: 1234526,
298
+ # buy_from_iranicard_currency_price: 1239474,
299
+ # fast_sell_to_iranicard_currency_price: 1234526,
300
+ # buy_from_iranicard_network_list: [
301
+ # {
302
+ # network: "BTC",
303
+ # name: "Bitcoin",
304
+ # addressRegex: "^[13][a-km-zA-HJ-NP-Z1-9]{25,34}$|^[(bc1q)|(bc1p)][0-9A-Za-z]{37,62}$",
305
+ # coin: "BTC",
306
+ # withdrawEnable: True,
307
+ # depositEnable: True,
308
+ # withdrawMin: "0.000100000",
309
+ # withdrawMax: null,
310
+ # withdrawFee: "0.000100000",
311
+ # sameAddress: False,
312
+ # memoRegex: null,
313
+ # tradeEnable: True
314
+ # }
315
+ # ],
316
+ # sell_to_iranicard_network_list: [
317
+ # {
318
+ # network: "BTC",
319
+ # name: "Bitcoin",
320
+ # addressRegex: "^[13][a-km-zA-HJ-NP-Z1-9]{25,34}$|^[(bc1q)|(bc1p)][0-9A-Za-z]{37,62}$",
321
+ # coin: "BTC",
322
+ # withdrawEnable: True,
323
+ # depositEnable: True,
324
+ # withdrawMin: "0.000100000",
325
+ # withdrawMax: null,
326
+ # withdrawFee: "0.000100000",
327
+ # sameAddress: False,
328
+ # memoRegex: null,
329
+ # tradeEnable: True
330
+ # }
331
+ # ],
332
+ # is_price_maker_active: 1,
333
+ # quotation: {
334
+ # maxPrice: "90199.99",
335
+ # minPrice: "88925",
336
+ # dailyChangePercent: "-0.26"
337
+ # },
338
+ # dailyChangePercent: -0.26,
339
+ # order: 0,
340
+ # stock_status: "in_stock",
341
+ # stock_label: null,
342
+ # stock_description: null
343
+ # }
344
+ marketType = 'otc'
345
+ marketId = self.safe_string(ticker, 'symbol') + '_' + 'IRT'
346
+ symbol = self.safe_symbol(marketId, market, None, marketType)
347
+ quotation = self.safe_value(ticker, 'quotation', {})
348
+ high = self.safe_float(quotation, 'maxPrice', 0)
349
+ low = self.safe_float(quotation, 'minPrice', 0)
350
+ bid = self.safe_float(ticker, 'sell_to_iranicard_currency_price', 0)
351
+ ask = self.safe_float(ticker, 'buy_from_iranicard_currency_price', 0)
352
+ last = self.safe_float(ticker, 'sell_to_iranicard_currency_price', 0)
353
+ change = self.safe_float(quotation, 'dailyChangePercent', 0)
354
+ return self.safe_ticker({
355
+ 'symbol': symbol,
356
+ 'timestamp': None,
357
+ 'datetime': None,
358
+ 'high': high,
359
+ 'low': low,
360
+ 'bid': bid,
361
+ 'bidVolume': None,
362
+ 'ask': ask,
363
+ 'askVolume': None,
364
+ 'vwap': None,
365
+ 'open': last,
366
+ 'close': last,
367
+ 'last': last,
368
+ 'previousClose': None,
369
+ 'change': change,
370
+ 'percentage': change,
371
+ 'average': None,
372
+ 'baseVolume': None,
373
+ 'quoteVolume': None,
374
+ 'info': ticker,
375
+ }, market)
376
+
377
+ def sign(self, path, api='public', method='GET', params={}, headers=None, body=None):
378
+ query = self.omit(params, self.extract_params(path))
379
+ url = self.urls['api']['public'] + '/' + path + '?' + self.urlencode(query)
380
+ pair_id = self.safe_string(params, 'id')
381
+ if pair_id is not None:
382
+ url = self.urls['api']['public'] + '/' + path + '/' + pair_id
383
+ headers = {'Content-Type': 'application/json'}
384
+ return {'url': url, 'method': method, 'body': body, 'headers': headers}
ccxt/pro/__init__.py CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  # ----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.9.22'
7
+ __version__ = '4.9.24'
8
8
 
9
9
  # ----------------------------------------------------------------------------
10
10
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ccxt-ir
3
- Version: 4.9.22
3
+ Version: 4.9.24
4
4
  Summary: A JavaScript / TypeScript / Python / C# / PHP cryptocurrency trading library with support for 100+ exchanges
5
5
  Home-page: https://ccxt.com
6
6
  Author: Igor Kroitor
@@ -304,13 +304,13 @@ 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.9.22/dist/ccxt.browser.min.js
308
- - unpkg: https://unpkg.com/ccxt@4.9.22/dist/ccxt.browser.min.js
307
+ - jsDelivr: https://cdn.jsdelivr.net/npm/ccxt@4.9.24/dist/ccxt.browser.min.js
308
+ - unpkg: https://unpkg.com/ccxt@4.9.24/dist/ccxt.browser.min.js
309
309
 
310
310
  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
311
 
312
312
  ```HTML
313
- <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/ccxt@4.9.22/dist/ccxt.browser.min.js"></script>
313
+ <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/ccxt@4.9.24/dist/ccxt.browser.min.js"></script>
314
314
  console.log (ccxt.exchanges) // print all available exchanges
315
315
  ```
316
316
 
@@ -1,4 +1,4 @@
1
- ccxt/__init__.py,sha256=P5yypWCcC3dMQtcAij3xG7GXmOT7lrb8BTOM5Mwfdzg,20197
1
+ ccxt/__init__.py,sha256=gAD7-Mo_XbUxKZ7n4lGX2Mn4Q-KAQTiu8BH9zBitdUA,20300
2
2
  ccxt/abantether.py,sha256=PSz8vQq3Il76_K8kmw43MzFH_JDsqF9Spg2IxPoeGXE,12879
3
3
  ccxt/afratether.py,sha256=5PX0U1GQ3ylOQuQ8Mm9yIsF5J3aqfTZcp6iV87I8E_0,12245
4
4
  ccxt/alpaca.py,sha256=oO0YJHxo5_1iYyGVRMbxfGyPahqzuMlE7LZ3TMYgPGo,80694
@@ -87,6 +87,7 @@ ccxt/huobi.py,sha256=rQI8HyRj6Jt9XgJYdTbu4tzu85sv0SWT3rvO_HY8r_E,477
87
87
  ccxt/hyperliquid.py,sha256=nRrjedrxNgEuUIuH4Ml7qM9JKw9rPUjmsbylSImCw_I,160952
88
88
  ccxt/independentreserve.py,sha256=qK_Xd8oSwQ8VTKqDTSUZoxZ8rfKwd2CrfDC9JdBi6uc,44814
89
89
  ccxt/indodax.py,sha256=4UtmYm2bExkrmfpnUv-6RSEN8EAyhVWBvdDZCoLILkQ,59303
90
+ ccxt/iranexchange.py,sha256=ouoyV_RLwMEORxvreE7gNRhW0k10kqXuPKvQWsSEEWs,14251
90
91
  ccxt/jibitex.py,sha256=CH3Gb4aXfzBsfUYqKdpQVrohq9o-11AMRWZVXaZkzFk,15785
91
92
  ccxt/kcex.py,sha256=Jn711L7brdsvKKdw-yw9IOqvojxzYv1nekLJDinAEnk,11994
92
93
  ccxt/kifpoolme.py,sha256=3JS3P_yG77Se8Al1n2nhm7bxby1SAT_klUekrUC7oBo,15046
@@ -233,6 +234,7 @@ ccxt/abstract/huobi.py,sha256=X-5cH2M7ER9tYzAyepssIOlHRGr-Rx6hFX35d-zQpfQ,99311
233
234
  ccxt/abstract/hyperliquid.py,sha256=YPz-oqjy-ZkDW9chuMZM8pGIUs_5qeP3nQ-d_TSbCyw,394
234
235
  ccxt/abstract/independentreserve.py,sha256=GBa5JX6Wv9rdh2B3a0L4pHCqF6jMLQMcLSOQvAxzq1k,4975
235
236
  ccxt/abstract/indodax.py,sha256=E16v8W6Ac9kmV9hFEqf_kwV6VQmK74lc1LEUEkuDpYg,2488
237
+ ccxt/abstract/iranexchange.py,sha256=SqfxR1R4vHBnx1i0uouOfV-9YIftIJH2etFvKJPLu1g,317
236
238
  ccxt/abstract/jibitex.py,sha256=iOktSTvFEp3-kNUeZNIfEY0BPPB9bRlOS2sk7WuI4DM,454
237
239
  ccxt/abstract/kcex.py,sha256=ms_exDB-TZhRgb1qLMD1dZo7Yv6rMq-LOtDzPrc01cI,579
238
240
  ccxt/abstract/kifpoolme.py,sha256=PfROw_fjTnOYuKAaUYINVaQLgAvBpcZTpDjTOSd31XM,289
@@ -290,7 +292,7 @@ ccxt/abstract/xt.py,sha256=n3eX1cItL_J0j8prOViV-C_tRwIFv_GO8JTvZZw8jv8,27837
290
292
  ccxt/abstract/yobit.py,sha256=8ycfCO8ORFly9hc0Aa47sZyX4_ZKPXS9h9yJzI-uQ7Q,1339
291
293
  ccxt/abstract/zaif.py,sha256=m15WHdl3gYy0GOXNZ8NEH8eE7sVh8c0T_ITNuU8vXeU,3935
292
294
  ccxt/abstract/zonda.py,sha256=X-hCW0SdX3YKZWixDyW-O2211M58Rno8kKJ6quY7rw4,7183
293
- ccxt/async_support/__init__.py,sha256=9wrStwYN0WPGeUnAiPUsPsjkS0F9yut9ySffWh5Ca9E,20370
295
+ ccxt/async_support/__init__.py,sha256=JbHLLN8bpRnkhJWlc7Lv9xxr4eopFC4p1yEHkR0sXsU,20483
294
296
  ccxt/async_support/abantether.py,sha256=aNxARnFPboX8VyBLysADfJlW8d8d1CptPyf7NasyRl8,12935
295
297
  ccxt/async_support/afratether.py,sha256=fhVGoxrIbXXser4tIsCBgfVIivLnq7hpZBvzR84WgBs,12313
296
298
  ccxt/async_support/alpaca.py,sha256=oFpSnAjX-faRgTN4d5rwHa08WRaCkwiAbHGZ7JBe6Ww,81140
@@ -379,6 +381,7 @@ ccxt/async_support/huobi.py,sha256=D4CTKw-2sl7iiX3yh7hMMkhBXHvQQ3to9_tW4WKm0rA,4
379
381
  ccxt/async_support/hyperliquid.py,sha256=WwsqsDY-95I8cTzVRcZaqV-JSXoau-XsHAYfOP9nKV0,161784
380
382
  ccxt/async_support/independentreserve.py,sha256=jNDXX5VAsUKDfKRYb_qtqT4UJNimsO1mWbCDxL1lU1s,45112
381
383
  ccxt/async_support/indodax.py,sha256=gDiNbkssepp2ARs16EroBSG7DTgCHXa1GgnB3NNSd6o,59611
384
+ ccxt/async_support/iranexchange.py,sha256=PAX8W8khvH0RciPb1uHAt1pChaVwbnp_zmi9LXiY9e8,14313
382
385
  ccxt/async_support/jibitex.py,sha256=6g3MdbPusjRr7AOoIq4lUHD9GfGHpJy0ZQ-rjTu4GW4,15883
383
386
  ccxt/async_support/kcex.py,sha256=Wz7m97im7uaDOGtYrxPxerww4ZIpYHOuMMUiqwQjPkY,12056
384
387
  ccxt/async_support/kifpoolme.py,sha256=Yd0yf2sQ8j4GUN2_kzcB_DXNA4DaIW_4IEpAMpFp0NY,15120
@@ -437,7 +440,7 @@ ccxt/async_support/yobit.py,sha256=FBI7ajvxprTYUqX8zosd7-LntDft8vIEjRTHng5ry8Y,5
437
440
  ccxt/async_support/zaif.py,sha256=mh0PETLMTJV509zhT7jukddg6S7YhvwhCT7zqxC6YLA,31364
438
441
  ccxt/async_support/zonda.py,sha256=7hmHotE5JBd8034d1ZbX3oIeWIpQFrQb8aK-dP3Btx0,85327
439
442
  ccxt/async_support/base/__init__.py,sha256=aVYSsFi--b4InRs9zDN_wtCpj8odosAB726JdUHavrk,67
440
- ccxt/async_support/base/exchange.py,sha256=mNgrWUJw7zDSgndU7ivk-Gz_RUHP1NK-vGoPbuGD5e4,121269
443
+ ccxt/async_support/base/exchange.py,sha256=yHbyPazwcz3pA0bp2QHCCHuAGPAChkEpIfrz13MltRU,121269
441
444
  ccxt/async_support/base/throttler.py,sha256=tvDVcdRUVYi8fZRlEcnqtgzcgB_KMUMRs5Pu8tuU-tU,1847
442
445
  ccxt/async_support/base/ws/__init__.py,sha256=uockzpLuwntKGZbs5EOWFe-Zg-k6Cj7GhNJLc_RX0so,1791
443
446
  ccxt/async_support/base/ws/cache.py,sha256=xf2VOtfUwloxSlIQ39M1RGZHWQzyS9IGhB5NX6cDcAc,8370
@@ -449,10 +452,10 @@ ccxt/async_support/base/ws/order_book_side.py,sha256=GhnGUt78pJ-AYL_Dq9produGjmB
449
452
  ccxt/base/__init__.py,sha256=eTx1OE3HJjspFUQjGm6LBhaQiMKJnXjkdP-JUXknyQ0,1320
450
453
  ccxt/base/decimal_to_precision.py,sha256=3XI30u9YudHbTA438397u5rkdlXa3atxwZEfUus3C4k,6803
451
454
  ccxt/base/errors.py,sha256=OGhWNvNtRlJOzFx-n1x3ZjTnaPpfWH0Vc0xACS-MeDw,5012
452
- ccxt/base/exchange.py,sha256=skOqBTaLQAbLNXL0Muftn0rvmZpEjEDUJBcciXoa_kc,334338
455
+ ccxt/base/exchange.py,sha256=iRnczdquWX1r8LPTAfcP6Z9TRijvng96kFp8Xfq63SQ,334338
453
456
  ccxt/base/precise.py,sha256=koce64Yrp6vFbGijJtUt-QQ6XhJgeGTCksZ871FPp_A,8886
454
457
  ccxt/base/types.py,sha256=Gvbogh9i7pPH7Z18xesYeDPribqqwq8uKpOv-YODFBs,11505
455
- ccxt/pro/__init__.py,sha256=MYlMIUS12WLeR0ZZV4Ngmyee35EUTRxc-mzVO2Lsc3w,11464
458
+ ccxt/pro/__init__.py,sha256=R3fX-xTP8wFHKv6NUHj_PfmCKI0JYOrbYFQ0mZMSGUY,11464
456
459
  ccxt/pro/alpaca.py,sha256=REAEZxdv2pY8xjxBGCBca3nPKpIdleVqr-IVpuVmADg,27637
457
460
  ccxt/pro/apex.py,sha256=FLBaLN2FESIh9gqHPVwf0IkkIHpxGHHUcFwgBGBEkrA,42018
458
461
  ccxt/pro/ascendex.py,sha256=P0DnIMIA-BIGxyoEQBLGtjH-whRhkPbhe8gU2s5V238,37526
@@ -775,8 +778,8 @@ ccxt/test/tests_async.py,sha256=D5ZDYYW635E2LFEhJt7HfIjbFVCQl3WSBEFnR-QEQzM,9549
775
778
  ccxt/test/tests_helpers.py,sha256=egM69A2ZFYeVF5hwC1Qt-c5DOeClY5bv4jowmceeFV8,9736
776
779
  ccxt/test/tests_init.py,sha256=qM0-Gb0h0p6CANWTkyYZI7wl-iYOcrPur7aj_OKh7m0,1212
777
780
  ccxt/test/tests_sync.py,sha256=Rr72cGmoKqbUIIEJJAGh2_QhBc4rIZlBxVtGCQVd4BE,94440
778
- ccxt_ir-4.9.22.dist-info/licenses/LICENSE.txt,sha256=EIb9221AhMHV7xF1_55STFdKTFsnJVJYkRpY2Lnvo5w,1068
779
- ccxt_ir-4.9.22.dist-info/METADATA,sha256=pKiP3yKpGSuTziq5hgYr7XF62neGRHe4I_KR9aoNLyQ,138934
780
- ccxt_ir-4.9.22.dist-info/WHEEL,sha256=JNWh1Fm1UdwIQV075glCn4MVuCRs0sotJIq-J6rbxCU,109
781
- ccxt_ir-4.9.22.dist-info/top_level.txt,sha256=CkQDuCTDKNcImPV60t36G6MdYfxsAPNiSaEwifVoVMo,5
782
- ccxt_ir-4.9.22.dist-info/RECORD,,
781
+ ccxt_ir-4.9.24.dist-info/licenses/LICENSE.txt,sha256=EIb9221AhMHV7xF1_55STFdKTFsnJVJYkRpY2Lnvo5w,1068
782
+ ccxt_ir-4.9.24.dist-info/METADATA,sha256=uahPmajUx2iRLaw1_Fl40JtqQL61rUuOm43TvgtrFWY,138934
783
+ ccxt_ir-4.9.24.dist-info/WHEEL,sha256=JNWh1Fm1UdwIQV075glCn4MVuCRs0sotJIq-J6rbxCU,109
784
+ ccxt_ir-4.9.24.dist-info/top_level.txt,sha256=CkQDuCTDKNcImPV60t36G6MdYfxsAPNiSaEwifVoVMo,5
785
+ ccxt_ir-4.9.24.dist-info/RECORD,,