ccxt-ir 4.9.22__py2.py3-none-any.whl → 4.9.23__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 +3 -1
- ccxt/abstract/iranexchange.py +6 -0
- ccxt/async_support/__init__.py +3 -1
- ccxt/async_support/base/exchange.py +1 -1
- ccxt/async_support/iranexchange.py +383 -0
- ccxt/base/exchange.py +1 -1
- ccxt/iranexchange.py +383 -0
- ccxt/pro/__init__.py +1 -1
- {ccxt_ir-4.9.22.dist-info → ccxt_ir-4.9.23.dist-info}/METADATA +4 -4
- {ccxt_ir-4.9.22.dist-info → ccxt_ir-4.9.23.dist-info}/RECORD +13 -10
- {ccxt_ir-4.9.22.dist-info → ccxt_ir-4.9.23.dist-info}/WHEEL +0 -0
- {ccxt_ir-4.9.22.dist-info → ccxt_ir-4.9.23.dist-info}/licenses/LICENSE.txt +0 -0
- {ccxt_ir-4.9.22.dist-info → ccxt_ir-4.9.23.dist-info}/top_level.txt +0 -0
ccxt/__init__.py
CHANGED
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
|
|
23
23
|
# ----------------------------------------------------------------------------
|
|
24
24
|
|
|
25
|
-
__version__ = '4.9.
|
|
25
|
+
__version__ = '4.9.23'
|
|
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})
|
ccxt/async_support/__init__.py
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
# -----------------------------------------------------------------------------
|
|
6
6
|
|
|
7
|
-
__version__ = '4.9.
|
|
7
|
+
__version__ = '4.9.23'
|
|
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',
|
|
@@ -0,0 +1,383 @@
|
|
|
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
|
+
if params['id'] is not None:
|
|
381
|
+
url = self.urls['api']['public'] + '/' + path + '/' + params['id']
|
|
382
|
+
headers = {'Content-Type': 'application/json'}
|
|
383
|
+
return {'url': url, 'method': method, 'body': body, 'headers': headers}
|
ccxt/base/exchange.py
CHANGED
ccxt/iranexchange.py
ADDED
|
@@ -0,0 +1,383 @@
|
|
|
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
|
+
if params['id'] is not None:
|
|
381
|
+
url = self.urls['api']['public'] + '/' + path + '/' + params['id']
|
|
382
|
+
headers = {'Content-Type': 'application/json'}
|
|
383
|
+
return {'url': url, 'method': method, 'body': body, 'headers': headers}
|
ccxt/pro/__init__.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ccxt-ir
|
|
3
|
-
Version: 4.9.
|
|
3
|
+
Version: 4.9.23
|
|
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.
|
|
308
|
-
- unpkg: https://unpkg.com/ccxt@4.9.
|
|
307
|
+
- jsDelivr: https://cdn.jsdelivr.net/npm/ccxt@4.9.23/dist/ccxt.browser.min.js
|
|
308
|
+
- unpkg: https://unpkg.com/ccxt@4.9.23/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.
|
|
313
|
+
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/ccxt@4.9.23/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=
|
|
1
|
+
ccxt/__init__.py,sha256=P1qXOyks2llgimI3T9H2E4HrM875ynuqCa1_cdASMk8,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=EcDYtik_Ff0UEU2kVCxGmBaXUtkBXOEGwLvAkIV4GjM,14212
|
|
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=
|
|
295
|
+
ccxt/async_support/__init__.py,sha256=kSdAnC4Ul8X2STDsqSz0WULuRx_GrDhmmgDVF_e4Gu0,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=TKTjWtCTrWIDphCdlP0on56WoEnc3DZ_Wgn2ucFaDYk,14274
|
|
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=
|
|
443
|
+
ccxt/async_support/base/exchange.py,sha256=GYKR2VvJha9QjOEwTlySmjwSwVZm0nho5i1g7AZvYcE,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=
|
|
455
|
+
ccxt/base/exchange.py,sha256=yn_y4bm3nwmR-B_xHSR9liAEvHWkBmtqZb3Hp9OsZHk,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=
|
|
458
|
+
ccxt/pro/__init__.py,sha256=nD-6u0CrGfgwwQS0sFXwM6L_ViaQScbgooyMlRpAuBE,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.
|
|
779
|
-
ccxt_ir-4.9.
|
|
780
|
-
ccxt_ir-4.9.
|
|
781
|
-
ccxt_ir-4.9.
|
|
782
|
-
ccxt_ir-4.9.
|
|
781
|
+
ccxt_ir-4.9.23.dist-info/licenses/LICENSE.txt,sha256=EIb9221AhMHV7xF1_55STFdKTFsnJVJYkRpY2Lnvo5w,1068
|
|
782
|
+
ccxt_ir-4.9.23.dist-info/METADATA,sha256=uvOCO8Di383xmVmQ-cc5knczW_W_C7MgGNZhI2pwzZU,138934
|
|
783
|
+
ccxt_ir-4.9.23.dist-info/WHEEL,sha256=JNWh1Fm1UdwIQV075glCn4MVuCRs0sotJIq-J6rbxCU,109
|
|
784
|
+
ccxt_ir-4.9.23.dist-info/top_level.txt,sha256=CkQDuCTDKNcImPV60t36G6MdYfxsAPNiSaEwifVoVMo,5
|
|
785
|
+
ccxt_ir-4.9.23.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|