ccxt-ir 4.9.2__py2.py3-none-any.whl → 4.9.4__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/arzplus.py +1 -0
- ccxt/abstract/hamtapay.py +6 -0
- ccxt/arzplus.py +123 -1
- ccxt/async_support/__init__.py +3 -1
- ccxt/async_support/arzplus.py +123 -1
- ccxt/async_support/base/exchange.py +1 -1
- ccxt/async_support/hamtapay.py +285 -0
- ccxt/base/exchange.py +1 -1
- ccxt/hamtapay.py +285 -0
- ccxt/pro/__init__.py +1 -1
- {ccxt_ir-4.9.2.dist-info → ccxt_ir-4.9.4.dist-info}/METADATA +8 -8
- {ccxt_ir-4.9.2.dist-info → ccxt_ir-4.9.4.dist-info}/RECORD +16 -13
- {ccxt_ir-4.9.2.dist-info → ccxt_ir-4.9.4.dist-info}/WHEEL +0 -0
- {ccxt_ir-4.9.2.dist-info → ccxt_ir-4.9.4.dist-info}/licenses/LICENSE.txt +0 -0
- {ccxt_ir-4.9.2.dist-info → ccxt_ir-4.9.4.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.4'
|
|
26
26
|
|
|
27
27
|
# ----------------------------------------------------------------------------
|
|
28
28
|
|
|
@@ -158,6 +158,7 @@ from ccxt.foxbit import foxbit # noqa: F4
|
|
|
158
158
|
from ccxt.gate import gate # noqa: F401
|
|
159
159
|
from ccxt.gateio import gateio # noqa: F401
|
|
160
160
|
from ccxt.gemini import gemini # noqa: F401
|
|
161
|
+
from ccxt.hamtapay import hamtapay # noqa: F401
|
|
161
162
|
from ccxt.hashkey import hashkey # noqa: F401
|
|
162
163
|
from ccxt.hibachi import hibachi # noqa: F401
|
|
163
164
|
from ccxt.hitbtc import hitbtc # noqa: F401
|
|
@@ -296,6 +297,7 @@ exchanges = [
|
|
|
296
297
|
'gate',
|
|
297
298
|
'gateio',
|
|
298
299
|
'gemini',
|
|
300
|
+
'hamtapay',
|
|
299
301
|
'hashkey',
|
|
300
302
|
'hibachi',
|
|
301
303
|
'hitbtc',
|
ccxt/abstract/arzplus.py
CHANGED
|
@@ -5,3 +5,4 @@ class ImplicitAPI:
|
|
|
5
5
|
public_get_api_v1_market_symbols = publicGetApiV1MarketSymbols = Entry('api/v1/market/symbols', 'public', 'GET', {'cost': 1})
|
|
6
6
|
public_get_api_v1_market_tradingview_ohlcv = publicGetApiV1MarketTradingviewOhlcv = Entry('api/v1/market/tradingview/ohlcv', 'public', 'GET', {'cost': 1})
|
|
7
7
|
public_get_api_v1_market_depth = publicGetApiV1MarketDepth = Entry('api/v1/market/depth', 'public', 'GET', {'cost': 1})
|
|
8
|
+
public_get_api_v1_market_irt_info = publicGetApiV1MarketIrtInfo = Entry('api/v1/market/irt/info', 'public', 'GET', {'cost': 1})
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
from ccxt.base.types import Entry
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class ImplicitAPI:
|
|
5
|
+
public_get_financial_api_market = publicGetFinancialApiMarket = Entry('/financial/api/market', 'public', 'GET', {'cost': 1})
|
|
6
|
+
public_get_financial_api_vitrin_prices = publicGetFinancialApiVitrinPrices = Entry('/financial/api/vitrin/prices', 'public', 'GET', {'cost': 1})
|
ccxt/arzplus.py
CHANGED
|
@@ -103,6 +103,7 @@ class arzplus(Exchange, ImplicitAPI):
|
|
|
103
103
|
'api/v1/market/symbols': 1,
|
|
104
104
|
'api/v1/market/tradingview/ohlcv': 1,
|
|
105
105
|
'api/v1/market/depth': 1,
|
|
106
|
+
'api/v1/market/irt/info': 1,
|
|
106
107
|
},
|
|
107
108
|
},
|
|
108
109
|
},
|
|
@@ -128,10 +129,19 @@ class arzplus(Exchange, ImplicitAPI):
|
|
|
128
129
|
'enable': 'true',
|
|
129
130
|
}
|
|
130
131
|
response = self.publicGetApiV1MarketSymbols(request)
|
|
132
|
+
otcMarkets = self.publicGetApiV1MarketIrtInfo(request)
|
|
131
133
|
result = []
|
|
132
134
|
for i in range(0, len(response)):
|
|
133
135
|
market = self.parse_market(response[i])
|
|
134
136
|
result.append(market)
|
|
137
|
+
for i in range(0, len(otcMarkets)):
|
|
138
|
+
marketdata = otcMarkets[i]
|
|
139
|
+
marketdata['quote'] = 'IRT'
|
|
140
|
+
marketdata['id'] = 'OTC_' + marketdata['symbol'] + marketdata['quote']
|
|
141
|
+
parsedMarket = self.parse_otc_markets(marketdata)
|
|
142
|
+
result.append(parsedMarket)
|
|
143
|
+
if params['type']:
|
|
144
|
+
return self.filter_by_array(result, 'type', params['type'], False)
|
|
135
145
|
return result
|
|
136
146
|
|
|
137
147
|
def parse_market(self, market) -> Market:
|
|
@@ -230,6 +240,70 @@ class arzplus(Exchange, ImplicitAPI):
|
|
|
230
240
|
'info': market,
|
|
231
241
|
}
|
|
232
242
|
|
|
243
|
+
def parse_otc_markets(self, market) -> Any:
|
|
244
|
+
# {
|
|
245
|
+
# symbol: "BTC",
|
|
246
|
+
# ask: "13877900000",
|
|
247
|
+
# bid: "13860999995",
|
|
248
|
+
# name: "bitcoin"
|
|
249
|
+
# },
|
|
250
|
+
baseAsset = self.safe_string(market, 'symbol')
|
|
251
|
+
quoteAsset = self.safe_string(market, 'quote')
|
|
252
|
+
baseId = baseAsset
|
|
253
|
+
quoteId = quoteAsset
|
|
254
|
+
base = self.safe_currency_code(baseId)
|
|
255
|
+
quote = self.safe_currency_code(quoteId)
|
|
256
|
+
id = self.safe_string(market, 'id')
|
|
257
|
+
return {
|
|
258
|
+
'id': id,
|
|
259
|
+
'symbol': base + '/' + quote,
|
|
260
|
+
'base': base,
|
|
261
|
+
'quote': quote,
|
|
262
|
+
'settle': None,
|
|
263
|
+
'baseId': baseId,
|
|
264
|
+
'quoteId': quoteId,
|
|
265
|
+
'settleId': None,
|
|
266
|
+
'type': 'otc',
|
|
267
|
+
'spot': True,
|
|
268
|
+
'margin': False,
|
|
269
|
+
'swap': False,
|
|
270
|
+
'future': False,
|
|
271
|
+
'option': False,
|
|
272
|
+
'active': True,
|
|
273
|
+
'contract': False,
|
|
274
|
+
'linear': None,
|
|
275
|
+
'inverse': None,
|
|
276
|
+
'contractSize': None,
|
|
277
|
+
'expiry': None,
|
|
278
|
+
'expiryDatetime': None,
|
|
279
|
+
'strike': None,
|
|
280
|
+
'optionType': None,
|
|
281
|
+
'precision': {
|
|
282
|
+
'amount': None,
|
|
283
|
+
'price': None,
|
|
284
|
+
},
|
|
285
|
+
'limits': {
|
|
286
|
+
'leverage': {
|
|
287
|
+
'min': None,
|
|
288
|
+
'max': None,
|
|
289
|
+
},
|
|
290
|
+
'amount': {
|
|
291
|
+
'min': None,
|
|
292
|
+
'max': None,
|
|
293
|
+
},
|
|
294
|
+
'price': {
|
|
295
|
+
'min': None,
|
|
296
|
+
'max': None,
|
|
297
|
+
},
|
|
298
|
+
'cost': {
|
|
299
|
+
'min': None,
|
|
300
|
+
'max': None,
|
|
301
|
+
},
|
|
302
|
+
},
|
|
303
|
+
'created': None,
|
|
304
|
+
'info': market,
|
|
305
|
+
}
|
|
306
|
+
|
|
233
307
|
def fetch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
|
|
234
308
|
"""
|
|
235
309
|
fetches price tickers for multiple markets, statistical information calculated over the past 24 hours for each market
|
|
@@ -241,8 +315,18 @@ class arzplus(Exchange, ImplicitAPI):
|
|
|
241
315
|
self.load_markets()
|
|
242
316
|
if symbols is not None:
|
|
243
317
|
symbols = self.market_symbols(symbols)
|
|
244
|
-
response = self.publicGetApiV1MarketSymbols(params)
|
|
245
318
|
result = {}
|
|
319
|
+
if params['type'] == 'otc':
|
|
320
|
+
otcMarkets = self.publicGetApiV1MarketIrtInfo(params)
|
|
321
|
+
for i in range(0, len(otcMarkets)):
|
|
322
|
+
marketdata = otcMarkets[i]
|
|
323
|
+
marketdata['quote'] = 'IRT'
|
|
324
|
+
marketdata['id'] = 'OTC_' + marketdata['symbol'] + marketdata['quote']
|
|
325
|
+
parsedMarket = self.parse_otc_ticker(marketdata)
|
|
326
|
+
symbol = parsedMarket['symbol']
|
|
327
|
+
result[symbol] = parsedMarket
|
|
328
|
+
return self.filter_by_array_tickers(result, 'symbol', symbols)
|
|
329
|
+
response = self.publicGetApiV1MarketSymbols(params)
|
|
246
330
|
for i in range(0, len(response)):
|
|
247
331
|
request = {
|
|
248
332
|
'symbol': response[i]['name'],
|
|
@@ -339,6 +423,44 @@ class arzplus(Exchange, ImplicitAPI):
|
|
|
339
423
|
'info': ticker,
|
|
340
424
|
}, market)
|
|
341
425
|
|
|
426
|
+
def parse_otc_ticker(self, ticker, market: Market = None) -> Ticker:
|
|
427
|
+
# {
|
|
428
|
+
# id: "BTCUSDT",
|
|
429
|
+
# symbol: "BTC",
|
|
430
|
+
# ask: "13877900000",
|
|
431
|
+
# bid: "13860999995",
|
|
432
|
+
# name: "bitcoin"
|
|
433
|
+
# quote: "IRT"
|
|
434
|
+
# }
|
|
435
|
+
marketType = 'otc'
|
|
436
|
+
marketId = self.safe_string(ticker, 'id')
|
|
437
|
+
symbol = self.safe_symbol(marketId, market, None, marketType)
|
|
438
|
+
bid = self.safe_float(ticker, 'bid', 0)
|
|
439
|
+
ask = self.safe_float(ticker, 'ask', 0)
|
|
440
|
+
last = self.safe_float(ticker, 'ask', 0)
|
|
441
|
+
return self.safe_ticker({
|
|
442
|
+
'symbol': symbol,
|
|
443
|
+
'timestamp': None,
|
|
444
|
+
'datetime': None,
|
|
445
|
+
'high': None,
|
|
446
|
+
'low': None,
|
|
447
|
+
'bid': bid,
|
|
448
|
+
'bidVolume': None,
|
|
449
|
+
'ask': ask,
|
|
450
|
+
'askVolume': None,
|
|
451
|
+
'vwap': None,
|
|
452
|
+
'open': last,
|
|
453
|
+
'close': last,
|
|
454
|
+
'last': last,
|
|
455
|
+
'previousClose': None,
|
|
456
|
+
'change': None,
|
|
457
|
+
'percentage': None,
|
|
458
|
+
'average': None,
|
|
459
|
+
'baseVolume': None,
|
|
460
|
+
'quoteVolume': None,
|
|
461
|
+
'info': ticker,
|
|
462
|
+
}, market)
|
|
463
|
+
|
|
342
464
|
def fetch_ohlcv(self, symbol: str, timeframe='1h', since: Int = None, limit: Int = None, params={}) -> List[list]:
|
|
343
465
|
"""
|
|
344
466
|
fetches historical candlestick data containing the open, high, low, and close price, and the volume of a market
|
ccxt/async_support/__init__.py
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
# -----------------------------------------------------------------------------
|
|
6
6
|
|
|
7
|
-
__version__ = '4.9.
|
|
7
|
+
__version__ = '4.9.4'
|
|
8
8
|
|
|
9
9
|
# -----------------------------------------------------------------------------
|
|
10
10
|
|
|
@@ -138,6 +138,7 @@ from ccxt.async_support.foxbit import foxbit
|
|
|
138
138
|
from ccxt.async_support.gate import gate # noqa: F401
|
|
139
139
|
from ccxt.async_support.gateio import gateio # noqa: F401
|
|
140
140
|
from ccxt.async_support.gemini import gemini # noqa: F401
|
|
141
|
+
from ccxt.async_support.hamtapay import hamtapay # noqa: F401
|
|
141
142
|
from ccxt.async_support.hashkey import hashkey # noqa: F401
|
|
142
143
|
from ccxt.async_support.hibachi import hibachi # noqa: F401
|
|
143
144
|
from ccxt.async_support.hitbtc import hitbtc # noqa: F401
|
|
@@ -276,6 +277,7 @@ exchanges = [
|
|
|
276
277
|
'gate',
|
|
277
278
|
'gateio',
|
|
278
279
|
'gemini',
|
|
280
|
+
'hamtapay',
|
|
279
281
|
'hashkey',
|
|
280
282
|
'hibachi',
|
|
281
283
|
'hitbtc',
|
ccxt/async_support/arzplus.py
CHANGED
|
@@ -103,6 +103,7 @@ class arzplus(Exchange, ImplicitAPI):
|
|
|
103
103
|
'api/v1/market/symbols': 1,
|
|
104
104
|
'api/v1/market/tradingview/ohlcv': 1,
|
|
105
105
|
'api/v1/market/depth': 1,
|
|
106
|
+
'api/v1/market/irt/info': 1,
|
|
106
107
|
},
|
|
107
108
|
},
|
|
108
109
|
},
|
|
@@ -128,10 +129,19 @@ class arzplus(Exchange, ImplicitAPI):
|
|
|
128
129
|
'enable': 'true',
|
|
129
130
|
}
|
|
130
131
|
response = await self.publicGetApiV1MarketSymbols(request)
|
|
132
|
+
otcMarkets = await self.publicGetApiV1MarketIrtInfo(request)
|
|
131
133
|
result = []
|
|
132
134
|
for i in range(0, len(response)):
|
|
133
135
|
market = self.parse_market(response[i])
|
|
134
136
|
result.append(market)
|
|
137
|
+
for i in range(0, len(otcMarkets)):
|
|
138
|
+
marketdata = otcMarkets[i]
|
|
139
|
+
marketdata['quote'] = 'IRT'
|
|
140
|
+
marketdata['id'] = 'OTC_' + marketdata['symbol'] + marketdata['quote']
|
|
141
|
+
parsedMarket = self.parse_otc_markets(marketdata)
|
|
142
|
+
result.append(parsedMarket)
|
|
143
|
+
if params['type']:
|
|
144
|
+
return self.filter_by_array(result, 'type', params['type'], False)
|
|
135
145
|
return result
|
|
136
146
|
|
|
137
147
|
def parse_market(self, market) -> Market:
|
|
@@ -230,6 +240,70 @@ class arzplus(Exchange, ImplicitAPI):
|
|
|
230
240
|
'info': market,
|
|
231
241
|
}
|
|
232
242
|
|
|
243
|
+
def parse_otc_markets(self, market) -> Any:
|
|
244
|
+
# {
|
|
245
|
+
# symbol: "BTC",
|
|
246
|
+
# ask: "13877900000",
|
|
247
|
+
# bid: "13860999995",
|
|
248
|
+
# name: "bitcoin"
|
|
249
|
+
# },
|
|
250
|
+
baseAsset = self.safe_string(market, 'symbol')
|
|
251
|
+
quoteAsset = self.safe_string(market, 'quote')
|
|
252
|
+
baseId = baseAsset
|
|
253
|
+
quoteId = quoteAsset
|
|
254
|
+
base = self.safe_currency_code(baseId)
|
|
255
|
+
quote = self.safe_currency_code(quoteId)
|
|
256
|
+
id = self.safe_string(market, 'id')
|
|
257
|
+
return {
|
|
258
|
+
'id': id,
|
|
259
|
+
'symbol': base + '/' + quote,
|
|
260
|
+
'base': base,
|
|
261
|
+
'quote': quote,
|
|
262
|
+
'settle': None,
|
|
263
|
+
'baseId': baseId,
|
|
264
|
+
'quoteId': quoteId,
|
|
265
|
+
'settleId': None,
|
|
266
|
+
'type': 'otc',
|
|
267
|
+
'spot': True,
|
|
268
|
+
'margin': False,
|
|
269
|
+
'swap': False,
|
|
270
|
+
'future': False,
|
|
271
|
+
'option': False,
|
|
272
|
+
'active': True,
|
|
273
|
+
'contract': False,
|
|
274
|
+
'linear': None,
|
|
275
|
+
'inverse': None,
|
|
276
|
+
'contractSize': None,
|
|
277
|
+
'expiry': None,
|
|
278
|
+
'expiryDatetime': None,
|
|
279
|
+
'strike': None,
|
|
280
|
+
'optionType': None,
|
|
281
|
+
'precision': {
|
|
282
|
+
'amount': None,
|
|
283
|
+
'price': None,
|
|
284
|
+
},
|
|
285
|
+
'limits': {
|
|
286
|
+
'leverage': {
|
|
287
|
+
'min': None,
|
|
288
|
+
'max': None,
|
|
289
|
+
},
|
|
290
|
+
'amount': {
|
|
291
|
+
'min': None,
|
|
292
|
+
'max': None,
|
|
293
|
+
},
|
|
294
|
+
'price': {
|
|
295
|
+
'min': None,
|
|
296
|
+
'max': None,
|
|
297
|
+
},
|
|
298
|
+
'cost': {
|
|
299
|
+
'min': None,
|
|
300
|
+
'max': None,
|
|
301
|
+
},
|
|
302
|
+
},
|
|
303
|
+
'created': None,
|
|
304
|
+
'info': market,
|
|
305
|
+
}
|
|
306
|
+
|
|
233
307
|
async def fetch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
|
|
234
308
|
"""
|
|
235
309
|
fetches price tickers for multiple markets, statistical information calculated over the past 24 hours for each market
|
|
@@ -241,8 +315,18 @@ class arzplus(Exchange, ImplicitAPI):
|
|
|
241
315
|
await self.load_markets()
|
|
242
316
|
if symbols is not None:
|
|
243
317
|
symbols = self.market_symbols(symbols)
|
|
244
|
-
response = await self.publicGetApiV1MarketSymbols(params)
|
|
245
318
|
result = {}
|
|
319
|
+
if params['type'] == 'otc':
|
|
320
|
+
otcMarkets = await self.publicGetApiV1MarketIrtInfo(params)
|
|
321
|
+
for i in range(0, len(otcMarkets)):
|
|
322
|
+
marketdata = otcMarkets[i]
|
|
323
|
+
marketdata['quote'] = 'IRT'
|
|
324
|
+
marketdata['id'] = 'OTC_' + marketdata['symbol'] + marketdata['quote']
|
|
325
|
+
parsedMarket = self.parse_otc_ticker(marketdata)
|
|
326
|
+
symbol = parsedMarket['symbol']
|
|
327
|
+
result[symbol] = parsedMarket
|
|
328
|
+
return self.filter_by_array_tickers(result, 'symbol', symbols)
|
|
329
|
+
response = await self.publicGetApiV1MarketSymbols(params)
|
|
246
330
|
for i in range(0, len(response)):
|
|
247
331
|
request = {
|
|
248
332
|
'symbol': response[i]['name'],
|
|
@@ -339,6 +423,44 @@ class arzplus(Exchange, ImplicitAPI):
|
|
|
339
423
|
'info': ticker,
|
|
340
424
|
}, market)
|
|
341
425
|
|
|
426
|
+
def parse_otc_ticker(self, ticker, market: Market = None) -> Ticker:
|
|
427
|
+
# {
|
|
428
|
+
# id: "BTCUSDT",
|
|
429
|
+
# symbol: "BTC",
|
|
430
|
+
# ask: "13877900000",
|
|
431
|
+
# bid: "13860999995",
|
|
432
|
+
# name: "bitcoin"
|
|
433
|
+
# quote: "IRT"
|
|
434
|
+
# }
|
|
435
|
+
marketType = 'otc'
|
|
436
|
+
marketId = self.safe_string(ticker, 'id')
|
|
437
|
+
symbol = self.safe_symbol(marketId, market, None, marketType)
|
|
438
|
+
bid = self.safe_float(ticker, 'bid', 0)
|
|
439
|
+
ask = self.safe_float(ticker, 'ask', 0)
|
|
440
|
+
last = self.safe_float(ticker, 'ask', 0)
|
|
441
|
+
return self.safe_ticker({
|
|
442
|
+
'symbol': symbol,
|
|
443
|
+
'timestamp': None,
|
|
444
|
+
'datetime': None,
|
|
445
|
+
'high': None,
|
|
446
|
+
'low': None,
|
|
447
|
+
'bid': bid,
|
|
448
|
+
'bidVolume': None,
|
|
449
|
+
'ask': ask,
|
|
450
|
+
'askVolume': None,
|
|
451
|
+
'vwap': None,
|
|
452
|
+
'open': last,
|
|
453
|
+
'close': last,
|
|
454
|
+
'last': last,
|
|
455
|
+
'previousClose': None,
|
|
456
|
+
'change': None,
|
|
457
|
+
'percentage': None,
|
|
458
|
+
'average': None,
|
|
459
|
+
'baseVolume': None,
|
|
460
|
+
'quoteVolume': None,
|
|
461
|
+
'info': ticker,
|
|
462
|
+
}, market)
|
|
463
|
+
|
|
342
464
|
async def fetch_ohlcv(self, symbol: str, timeframe='1h', since: Int = None, limit: Int = None, params={}) -> List[list]:
|
|
343
465
|
"""
|
|
344
466
|
fetches historical candlestick data containing the open, high, low, and close price, and the volume of a market
|
|
@@ -0,0 +1,285 @@
|
|
|
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.hamtapay import ImplicitAPI
|
|
8
|
+
from ccxt.base.types import Any, Market, Strings, Ticker, Tickers
|
|
9
|
+
from typing import List
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class hamtapay(Exchange, ImplicitAPI):
|
|
13
|
+
|
|
14
|
+
def describe(self) -> Any:
|
|
15
|
+
return self.deep_extend(super(hamtapay, self).describe(), {
|
|
16
|
+
'id': 'hamtapay',
|
|
17
|
+
'name': 'Hamtapay',
|
|
18
|
+
'countries': ['IR'],
|
|
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': False,
|
|
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
|
+
'fetchL3OrderBook': 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
|
+
'setLeverage': False,
|
|
82
|
+
'setMarginMode': False,
|
|
83
|
+
'transfer': False,
|
|
84
|
+
'withdraw': False,
|
|
85
|
+
},
|
|
86
|
+
'comment': 'This comment is optional',
|
|
87
|
+
'urls': {
|
|
88
|
+
'logo': 'https://cdn.arz.digital/cr-odin/img/exchanges/hamtapay/64x64.png',
|
|
89
|
+
'api': {
|
|
90
|
+
'public': 'https://api.hamtapay.org',
|
|
91
|
+
},
|
|
92
|
+
'www': 'https://hamtapay.net/',
|
|
93
|
+
'doc': [
|
|
94
|
+
'https://hamtapay.net/',
|
|
95
|
+
],
|
|
96
|
+
},
|
|
97
|
+
'api': {
|
|
98
|
+
'public': {
|
|
99
|
+
'get': {
|
|
100
|
+
'/financial/api/market': 1,
|
|
101
|
+
'/financial/api/vitrin/prices': 1,
|
|
102
|
+
},
|
|
103
|
+
},
|
|
104
|
+
},
|
|
105
|
+
'fees': {
|
|
106
|
+
'trading': {
|
|
107
|
+
'tierBased': False,
|
|
108
|
+
'percentage': True,
|
|
109
|
+
'maker': self.parse_number('0.001'),
|
|
110
|
+
'taker': self.parse_number('0.001'),
|
|
111
|
+
},
|
|
112
|
+
},
|
|
113
|
+
})
|
|
114
|
+
|
|
115
|
+
async def fetch_markets(self, params={}) -> List[Market]:
|
|
116
|
+
"""
|
|
117
|
+
retrieves data on all markets for hamtapay
|
|
118
|
+
https://api.hamtapay.org/financial/api/market
|
|
119
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
120
|
+
:returns dict[]: an array of objects representing market data
|
|
121
|
+
"""
|
|
122
|
+
response = await self.publicGetFinancialApiMarket(params)
|
|
123
|
+
result = []
|
|
124
|
+
marketData = self.safe_list(response, 'data', [])
|
|
125
|
+
for i in range(0, len(marketData)):
|
|
126
|
+
market = self.parse_market(marketData[i])
|
|
127
|
+
result.append(market)
|
|
128
|
+
return result
|
|
129
|
+
|
|
130
|
+
def parse_market(self, market) -> Market:
|
|
131
|
+
# {
|
|
132
|
+
# "symbol": "USDT-IRT",
|
|
133
|
+
# "base": "USDT",
|
|
134
|
+
# "quote": "IRT",
|
|
135
|
+
# "base_currency_decimals": 3,
|
|
136
|
+
# "quote_currency_decimals": 0,
|
|
137
|
+
# "amount_decimals": 0,
|
|
138
|
+
# "price_decimals": 0
|
|
139
|
+
# }
|
|
140
|
+
baseId = self.safe_string(market, 'base')
|
|
141
|
+
quoteId = self.safe_string(market, 'quote')
|
|
142
|
+
base = self.safe_currency_code(baseId)
|
|
143
|
+
quote = self.safe_currency_code(quoteId)
|
|
144
|
+
id = self.safe_string(market, 'symbol')
|
|
145
|
+
return {
|
|
146
|
+
'id': id,
|
|
147
|
+
'symbol': base + '/' + quote,
|
|
148
|
+
'base': base,
|
|
149
|
+
'quote': quote,
|
|
150
|
+
'settle': None,
|
|
151
|
+
'baseId': baseId,
|
|
152
|
+
'quoteId': quoteId,
|
|
153
|
+
'settleId': None,
|
|
154
|
+
'type': 'otc',
|
|
155
|
+
'spot': False,
|
|
156
|
+
'margin': False,
|
|
157
|
+
'swap': False,
|
|
158
|
+
'future': False,
|
|
159
|
+
'option': False,
|
|
160
|
+
'active': True,
|
|
161
|
+
'contract': False,
|
|
162
|
+
'linear': None,
|
|
163
|
+
'inverse': None,
|
|
164
|
+
'contractSize': None,
|
|
165
|
+
'expiry': None,
|
|
166
|
+
'expiryDatetime': None,
|
|
167
|
+
'strike': None,
|
|
168
|
+
'optionType': None,
|
|
169
|
+
'precision': {
|
|
170
|
+
'amount': None,
|
|
171
|
+
'price': None,
|
|
172
|
+
},
|
|
173
|
+
'limits': {
|
|
174
|
+
'leverage': {
|
|
175
|
+
'min': None,
|
|
176
|
+
'max': None,
|
|
177
|
+
},
|
|
178
|
+
'amount': {
|
|
179
|
+
'min': None,
|
|
180
|
+
'max': None,
|
|
181
|
+
},
|
|
182
|
+
'price': {
|
|
183
|
+
'min': None,
|
|
184
|
+
'max': None,
|
|
185
|
+
},
|
|
186
|
+
'cost': {
|
|
187
|
+
'min': None,
|
|
188
|
+
'max': None,
|
|
189
|
+
},
|
|
190
|
+
},
|
|
191
|
+
'created': None,
|
|
192
|
+
'info': market,
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
async def fetch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
|
|
196
|
+
"""
|
|
197
|
+
fetches price tickers for multiple markets, statistical information calculated over the past 24 hours for each market
|
|
198
|
+
https://api.hamtapay.org/financial/api/vitrin/prices
|
|
199
|
+
:param str[]|None symbols: unified symbols of the markets to fetch the ticker for, all market tickers are returned if not assigned
|
|
200
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
201
|
+
:returns dict: a dictionary of `ticker structures <https://docs.ccxt.com/#/?id=ticker-structure>`
|
|
202
|
+
"""
|
|
203
|
+
await self.load_markets()
|
|
204
|
+
if symbols is not None:
|
|
205
|
+
symbols = self.market_symbols(symbols)
|
|
206
|
+
response = await self.publicGetFinancialApiVitrinPrices(params)
|
|
207
|
+
data = self.safe_dict(response, 'data', {})
|
|
208
|
+
result = {}
|
|
209
|
+
quotes = ['IRT', 'USDT']
|
|
210
|
+
for i in range(0, len(quotes)):
|
|
211
|
+
current_qoute = quotes[i]
|
|
212
|
+
corresponding_data = self.safe_dict(data, current_qoute, {})
|
|
213
|
+
for j in range(0, corresponding_data):
|
|
214
|
+
current_base = list(corresponding_data.keys())[j]
|
|
215
|
+
current_ticker = corresponding_data[current_base]
|
|
216
|
+
current_ticker['base'] = current_base
|
|
217
|
+
current_ticker['quote'] = current_qoute
|
|
218
|
+
current_ticker['symbol'] = current_base + '/' + current_qoute
|
|
219
|
+
current_ticker['id'] = current_base + '-' + current_qoute
|
|
220
|
+
result[current_ticker['symbol']] = self.parse_ticker(current_ticker)
|
|
221
|
+
return self.filter_by_array_tickers(result, 'symbol', symbols)
|
|
222
|
+
|
|
223
|
+
async def fetch_ticker(self, symbol: str, params={}) -> Ticker:
|
|
224
|
+
"""
|
|
225
|
+
fetches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
|
|
226
|
+
https://hamtapay.com/management/all-coins/?format=json
|
|
227
|
+
:param str symbol: unified symbol of the market to fetch the ticker for
|
|
228
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
229
|
+
:returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
|
|
230
|
+
"""
|
|
231
|
+
ticker = await self.fetch_tickers([symbol])
|
|
232
|
+
return ticker[symbol]
|
|
233
|
+
|
|
234
|
+
def parse_ticker(self, ticker, market: Market = None) -> Ticker:
|
|
235
|
+
# {
|
|
236
|
+
# "id": "USDT-IRT",
|
|
237
|
+
# "symbol": "USDT/IRT",
|
|
238
|
+
# "base": "USDT",
|
|
239
|
+
# "quote": "IRT",
|
|
240
|
+
# "min_price_24h": "111702",
|
|
241
|
+
# "max_price_24h": "115872",
|
|
242
|
+
# "market_price": "115942",
|
|
243
|
+
# "buy_price": "117101",
|
|
244
|
+
# "sell_price": "114782",
|
|
245
|
+
# "change_rate_24h": 3.29,
|
|
246
|
+
# "amount_decimals": 0,
|
|
247
|
+
# "price_decimals": 0,
|
|
248
|
+
# "status": "ACTIVE"
|
|
249
|
+
# }
|
|
250
|
+
marketType = 'otc'
|
|
251
|
+
marketId = self.safe_string(ticker, 'id')
|
|
252
|
+
symbol = self.safe_symbol(marketId, market, None, marketType)
|
|
253
|
+
last = self.safe_float(ticker, 'buy_price', 0)
|
|
254
|
+
change = self.safe_float(ticker, 'change_rate_24h', 0)
|
|
255
|
+
ask = self.safe_float(ticker, 'buy_price', 0)
|
|
256
|
+
bid = self.safe_float(ticker, 'sell_price', 0)
|
|
257
|
+
high = self.safe_float(ticker, 'max_price_24h', 0)
|
|
258
|
+
low = self.safe_float(ticker, 'min_price_24h', 0)
|
|
259
|
+
return self.safe_ticker({
|
|
260
|
+
'symbol': symbol,
|
|
261
|
+
'timestamp': None,
|
|
262
|
+
'datetime': None,
|
|
263
|
+
'high': high,
|
|
264
|
+
'low': low,
|
|
265
|
+
'bid': bid,
|
|
266
|
+
'bidVolume': None,
|
|
267
|
+
'ask': ask,
|
|
268
|
+
'askVolume': None,
|
|
269
|
+
'vwap': None,
|
|
270
|
+
'open': None,
|
|
271
|
+
'close': last,
|
|
272
|
+
'last': last,
|
|
273
|
+
'previousClose': None,
|
|
274
|
+
'change': None,
|
|
275
|
+
'percentage': change,
|
|
276
|
+
'average': None,
|
|
277
|
+
'baseVolume': None,
|
|
278
|
+
'quoteVolume': None,
|
|
279
|
+
'info': ticker,
|
|
280
|
+
}, market)
|
|
281
|
+
|
|
282
|
+
def sign(self, path, api='public', method='GET', params={}, headers=None, body=None):
|
|
283
|
+
url = self.urls['api']['public'] + '/' + path
|
|
284
|
+
headers = {'Content-Type': 'application/json'}
|
|
285
|
+
return {'url': url, 'method': method, 'body': body, 'headers': headers}
|
ccxt/base/exchange.py
CHANGED
ccxt/hamtapay.py
ADDED
|
@@ -0,0 +1,285 @@
|
|
|
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.hamtapay import ImplicitAPI
|
|
8
|
+
from ccxt.base.types import Any, Market, Strings, Ticker, Tickers
|
|
9
|
+
from typing import List
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class hamtapay(Exchange, ImplicitAPI):
|
|
13
|
+
|
|
14
|
+
def describe(self) -> Any:
|
|
15
|
+
return self.deep_extend(super(hamtapay, self).describe(), {
|
|
16
|
+
'id': 'hamtapay',
|
|
17
|
+
'name': 'Hamtapay',
|
|
18
|
+
'countries': ['IR'],
|
|
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': False,
|
|
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
|
+
'fetchL3OrderBook': 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
|
+
'setLeverage': False,
|
|
82
|
+
'setMarginMode': False,
|
|
83
|
+
'transfer': False,
|
|
84
|
+
'withdraw': False,
|
|
85
|
+
},
|
|
86
|
+
'comment': 'This comment is optional',
|
|
87
|
+
'urls': {
|
|
88
|
+
'logo': 'https://cdn.arz.digital/cr-odin/img/exchanges/hamtapay/64x64.png',
|
|
89
|
+
'api': {
|
|
90
|
+
'public': 'https://api.hamtapay.org',
|
|
91
|
+
},
|
|
92
|
+
'www': 'https://hamtapay.net/',
|
|
93
|
+
'doc': [
|
|
94
|
+
'https://hamtapay.net/',
|
|
95
|
+
],
|
|
96
|
+
},
|
|
97
|
+
'api': {
|
|
98
|
+
'public': {
|
|
99
|
+
'get': {
|
|
100
|
+
'/financial/api/market': 1,
|
|
101
|
+
'/financial/api/vitrin/prices': 1,
|
|
102
|
+
},
|
|
103
|
+
},
|
|
104
|
+
},
|
|
105
|
+
'fees': {
|
|
106
|
+
'trading': {
|
|
107
|
+
'tierBased': False,
|
|
108
|
+
'percentage': True,
|
|
109
|
+
'maker': self.parse_number('0.001'),
|
|
110
|
+
'taker': self.parse_number('0.001'),
|
|
111
|
+
},
|
|
112
|
+
},
|
|
113
|
+
})
|
|
114
|
+
|
|
115
|
+
def fetch_markets(self, params={}) -> List[Market]:
|
|
116
|
+
"""
|
|
117
|
+
retrieves data on all markets for hamtapay
|
|
118
|
+
https://api.hamtapay.org/financial/api/market
|
|
119
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
120
|
+
:returns dict[]: an array of objects representing market data
|
|
121
|
+
"""
|
|
122
|
+
response = self.publicGetFinancialApiMarket(params)
|
|
123
|
+
result = []
|
|
124
|
+
marketData = self.safe_list(response, 'data', [])
|
|
125
|
+
for i in range(0, len(marketData)):
|
|
126
|
+
market = self.parse_market(marketData[i])
|
|
127
|
+
result.append(market)
|
|
128
|
+
return result
|
|
129
|
+
|
|
130
|
+
def parse_market(self, market) -> Market:
|
|
131
|
+
# {
|
|
132
|
+
# "symbol": "USDT-IRT",
|
|
133
|
+
# "base": "USDT",
|
|
134
|
+
# "quote": "IRT",
|
|
135
|
+
# "base_currency_decimals": 3,
|
|
136
|
+
# "quote_currency_decimals": 0,
|
|
137
|
+
# "amount_decimals": 0,
|
|
138
|
+
# "price_decimals": 0
|
|
139
|
+
# }
|
|
140
|
+
baseId = self.safe_string(market, 'base')
|
|
141
|
+
quoteId = self.safe_string(market, 'quote')
|
|
142
|
+
base = self.safe_currency_code(baseId)
|
|
143
|
+
quote = self.safe_currency_code(quoteId)
|
|
144
|
+
id = self.safe_string(market, 'symbol')
|
|
145
|
+
return {
|
|
146
|
+
'id': id,
|
|
147
|
+
'symbol': base + '/' + quote,
|
|
148
|
+
'base': base,
|
|
149
|
+
'quote': quote,
|
|
150
|
+
'settle': None,
|
|
151
|
+
'baseId': baseId,
|
|
152
|
+
'quoteId': quoteId,
|
|
153
|
+
'settleId': None,
|
|
154
|
+
'type': 'otc',
|
|
155
|
+
'spot': False,
|
|
156
|
+
'margin': False,
|
|
157
|
+
'swap': False,
|
|
158
|
+
'future': False,
|
|
159
|
+
'option': False,
|
|
160
|
+
'active': True,
|
|
161
|
+
'contract': False,
|
|
162
|
+
'linear': None,
|
|
163
|
+
'inverse': None,
|
|
164
|
+
'contractSize': None,
|
|
165
|
+
'expiry': None,
|
|
166
|
+
'expiryDatetime': None,
|
|
167
|
+
'strike': None,
|
|
168
|
+
'optionType': None,
|
|
169
|
+
'precision': {
|
|
170
|
+
'amount': None,
|
|
171
|
+
'price': None,
|
|
172
|
+
},
|
|
173
|
+
'limits': {
|
|
174
|
+
'leverage': {
|
|
175
|
+
'min': None,
|
|
176
|
+
'max': None,
|
|
177
|
+
},
|
|
178
|
+
'amount': {
|
|
179
|
+
'min': None,
|
|
180
|
+
'max': None,
|
|
181
|
+
},
|
|
182
|
+
'price': {
|
|
183
|
+
'min': None,
|
|
184
|
+
'max': None,
|
|
185
|
+
},
|
|
186
|
+
'cost': {
|
|
187
|
+
'min': None,
|
|
188
|
+
'max': None,
|
|
189
|
+
},
|
|
190
|
+
},
|
|
191
|
+
'created': None,
|
|
192
|
+
'info': market,
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
def fetch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
|
|
196
|
+
"""
|
|
197
|
+
fetches price tickers for multiple markets, statistical information calculated over the past 24 hours for each market
|
|
198
|
+
https://api.hamtapay.org/financial/api/vitrin/prices
|
|
199
|
+
:param str[]|None symbols: unified symbols of the markets to fetch the ticker for, all market tickers are returned if not assigned
|
|
200
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
201
|
+
:returns dict: a dictionary of `ticker structures <https://docs.ccxt.com/#/?id=ticker-structure>`
|
|
202
|
+
"""
|
|
203
|
+
self.load_markets()
|
|
204
|
+
if symbols is not None:
|
|
205
|
+
symbols = self.market_symbols(symbols)
|
|
206
|
+
response = self.publicGetFinancialApiVitrinPrices(params)
|
|
207
|
+
data = self.safe_dict(response, 'data', {})
|
|
208
|
+
result = {}
|
|
209
|
+
quotes = ['IRT', 'USDT']
|
|
210
|
+
for i in range(0, len(quotes)):
|
|
211
|
+
current_qoute = quotes[i]
|
|
212
|
+
corresponding_data = self.safe_dict(data, current_qoute, {})
|
|
213
|
+
for j in range(0, corresponding_data):
|
|
214
|
+
current_base = list(corresponding_data.keys())[j]
|
|
215
|
+
current_ticker = corresponding_data[current_base]
|
|
216
|
+
current_ticker['base'] = current_base
|
|
217
|
+
current_ticker['quote'] = current_qoute
|
|
218
|
+
current_ticker['symbol'] = current_base + '/' + current_qoute
|
|
219
|
+
current_ticker['id'] = current_base + '-' + current_qoute
|
|
220
|
+
result[current_ticker['symbol']] = self.parse_ticker(current_ticker)
|
|
221
|
+
return self.filter_by_array_tickers(result, 'symbol', symbols)
|
|
222
|
+
|
|
223
|
+
def fetch_ticker(self, symbol: str, params={}) -> Ticker:
|
|
224
|
+
"""
|
|
225
|
+
fetches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
|
|
226
|
+
https://hamtapay.com/management/all-coins/?format=json
|
|
227
|
+
:param str symbol: unified symbol of the market to fetch the ticker for
|
|
228
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
229
|
+
:returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
|
|
230
|
+
"""
|
|
231
|
+
ticker = self.fetch_tickers([symbol])
|
|
232
|
+
return ticker[symbol]
|
|
233
|
+
|
|
234
|
+
def parse_ticker(self, ticker, market: Market = None) -> Ticker:
|
|
235
|
+
# {
|
|
236
|
+
# "id": "USDT-IRT",
|
|
237
|
+
# "symbol": "USDT/IRT",
|
|
238
|
+
# "base": "USDT",
|
|
239
|
+
# "quote": "IRT",
|
|
240
|
+
# "min_price_24h": "111702",
|
|
241
|
+
# "max_price_24h": "115872",
|
|
242
|
+
# "market_price": "115942",
|
|
243
|
+
# "buy_price": "117101",
|
|
244
|
+
# "sell_price": "114782",
|
|
245
|
+
# "change_rate_24h": 3.29,
|
|
246
|
+
# "amount_decimals": 0,
|
|
247
|
+
# "price_decimals": 0,
|
|
248
|
+
# "status": "ACTIVE"
|
|
249
|
+
# }
|
|
250
|
+
marketType = 'otc'
|
|
251
|
+
marketId = self.safe_string(ticker, 'id')
|
|
252
|
+
symbol = self.safe_symbol(marketId, market, None, marketType)
|
|
253
|
+
last = self.safe_float(ticker, 'buy_price', 0)
|
|
254
|
+
change = self.safe_float(ticker, 'change_rate_24h', 0)
|
|
255
|
+
ask = self.safe_float(ticker, 'buy_price', 0)
|
|
256
|
+
bid = self.safe_float(ticker, 'sell_price', 0)
|
|
257
|
+
high = self.safe_float(ticker, 'max_price_24h', 0)
|
|
258
|
+
low = self.safe_float(ticker, 'min_price_24h', 0)
|
|
259
|
+
return self.safe_ticker({
|
|
260
|
+
'symbol': symbol,
|
|
261
|
+
'timestamp': None,
|
|
262
|
+
'datetime': None,
|
|
263
|
+
'high': high,
|
|
264
|
+
'low': low,
|
|
265
|
+
'bid': bid,
|
|
266
|
+
'bidVolume': None,
|
|
267
|
+
'ask': ask,
|
|
268
|
+
'askVolume': None,
|
|
269
|
+
'vwap': None,
|
|
270
|
+
'open': None,
|
|
271
|
+
'close': last,
|
|
272
|
+
'last': last,
|
|
273
|
+
'previousClose': None,
|
|
274
|
+
'change': None,
|
|
275
|
+
'percentage': change,
|
|
276
|
+
'average': None,
|
|
277
|
+
'baseVolume': None,
|
|
278
|
+
'quoteVolume': None,
|
|
279
|
+
'info': ticker,
|
|
280
|
+
}, market)
|
|
281
|
+
|
|
282
|
+
def sign(self, path, api='public', method='GET', params={}, headers=None, body=None):
|
|
283
|
+
url = self.urls['api']['public'] + '/' + path
|
|
284
|
+
headers = {'Content-Type': 'application/json'}
|
|
285
|
+
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.4
|
|
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
|
-
[](https://www.npmjs.com/package/ccxt) [](https://npmjs.com/package/ccxt) [](https://pypi.python.org/pypi/ccxt) [](https://www.nuget.org/packages/ccxt) [](https://godoc.org/github.com/ccxt/ccxt/go/v4) [](https://discord.gg/ccxt) [](https://www.npmjs.com/package/ccxt) [](https://npmjs.com/package/ccxt) [](https://pypi.python.org/pypi/ccxt) [](https://www.nuget.org/packages/ccxt) [](https://godoc.org/github.com/ccxt/ccxt/go/v4) [](https://discord.gg/ccxt) [](https://github.com/ccxt/ccxt/wiki/Exchange-Markets) [](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
|
|
|
@@ -305,20 +305,20 @@ console.log(version, Object.keys(exchanges));
|
|
|
305
305
|
All-in-one browser bundle (dependencies included), served from a CDN of your choice:
|
|
306
306
|
|
|
307
307
|
<<<<<<< HEAD
|
|
308
|
-
* jsDelivr: https://cdn.jsdelivr.net/npm/ccxt@4.9.
|
|
309
|
-
* unpkg: https://unpkg.com/ccxt@4.9.
|
|
308
|
+
* jsDelivr: https://cdn.jsdelivr.net/npm/ccxt@4.9.4/dist/ccxt.browser.min.js
|
|
309
|
+
* unpkg: https://unpkg.com/ccxt@4.9.4/dist/ccxt.browser.min.js
|
|
310
310
|
=======
|
|
311
|
-
* jsDelivr: https://cdn.jsdelivr.net/npm/ccxt@4.9.
|
|
312
|
-
* unpkg: https://unpkg.com/ccxt@4.9.
|
|
311
|
+
* jsDelivr: https://cdn.jsdelivr.net/npm/ccxt@4.9.4/dist/ccxt.browser.min.js
|
|
312
|
+
* unpkg: https://unpkg.com/ccxt@4.9.4/dist/ccxt.browser.min.js
|
|
313
313
|
>>>>>>> master
|
|
314
314
|
|
|
315
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.
|
|
316
316
|
|
|
317
317
|
```HTML
|
|
318
318
|
<<<<<<< HEAD
|
|
319
|
-
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/ccxt@4.9.
|
|
319
|
+
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/ccxt@4.9.4/dist/ccxt.browser.min.js"></script>
|
|
320
320
|
=======
|
|
321
|
-
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/ccxt@4.9.
|
|
321
|
+
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/ccxt@4.9.4/dist/ccxt.browser.min.js"></script>
|
|
322
322
|
>>>>>>> master
|
|
323
323
|
console.log (ccxt.exchanges) // print all available exchanges
|
|
324
324
|
```
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
ccxt/__init__.py,sha256=
|
|
1
|
+
ccxt/__init__.py,sha256=w1h0bnnuycVejBX4N8DyQMZL1J1zWrEBTrvpY_3gwxw,19407
|
|
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
|
|
5
5
|
ccxt/apex.py,sha256=TuOp4vnCczdRG__9thnb3RIidoVeUDZbOSGbusjJG78,82740
|
|
6
6
|
ccxt/arzinja.py,sha256=WWyJIG9aKJzeMRCTI77e5Ipu_aSeJMTFcUMPDUDtnnU,10380
|
|
7
|
-
ccxt/arzplus.py,sha256=
|
|
7
|
+
ccxt/arzplus.py,sha256=oMK5bsQZpCtjwDgHJuZ2n-S_pi00M7z73ypipeWrFKY,20489
|
|
8
8
|
ccxt/ascendex.py,sha256=unk7MeeQkmgT2YxCXKXG81z2ylcS_r6a7IuvnxnlOT8,158696
|
|
9
9
|
ccxt/bequant.py,sha256=9rBVB2Wg9YMmgYiCqS1NSxiftPWmL97FdaNLVPb3Zpo,1218
|
|
10
10
|
ccxt/bigone.py,sha256=npNA3D64dxi8JBG26lb3HI644ysSN-MNcIF3ZqAg_VI,95652
|
|
@@ -73,6 +73,7 @@ ccxt/foxbit.py,sha256=ixfTx1r8cTojMIPMPkJYKrPwwq6RnW8zAP1Y5LZxfKw,85198
|
|
|
73
73
|
ccxt/gate.py,sha256=AePkMpd4rKP4GoxClgM4qJ6fCrszgTzwrl_ZmJw6Yig,353292
|
|
74
74
|
ccxt/gateio.py,sha256=7KbnH56kBK0tb_CN-wT10jaF5DfTrnHarhu27eknsLI,484
|
|
75
75
|
ccxt/gemini.py,sha256=Tz6iwN1-MM7tyoikqOdOfycx0QpKzf_OVbbtBJf5qks,83632
|
|
76
|
+
ccxt/hamtapay.py,sha256=BFzDrB2aNQnWO6mCHZsmjD_ikbIZ-LTppcCwHlYVDWg,11015
|
|
76
77
|
ccxt/hashkey.py,sha256=_UWPVcZ7ogSIc2e9hoJSIDxjVpPyG1-ITtW_1GUAgK4,193017
|
|
77
78
|
ccxt/hibachi.py,sha256=4yOuKncE9fKenemc0fZ0QhY1NWQi0uX4IOY8KTvXqUA,85804
|
|
78
79
|
ccxt/hitbtc.py,sha256=6d71BjWGR-ye1qZ0xvbQo3tYZKVy8hJ3cinOvze9upE,159666
|
|
@@ -141,7 +142,7 @@ ccxt/abstract/afratether.py,sha256=zEsgTMPKRDnJJ3ep96hwz4mgpYNzewgy1RvR0yCyte0,2
|
|
|
141
142
|
ccxt/abstract/alpaca.py,sha256=Kzns2Wa5gcCAXWMyJBfPHSDbGEutqAirjNWtC1OGEx8,10939
|
|
142
143
|
ccxt/abstract/apex.py,sha256=5MEOlGygn8R2m08fcySJ0xo18I2AKMBtg_hoQTD5XTI,3150
|
|
143
144
|
ccxt/abstract/arzinja.py,sha256=qzS0oCl7n7yEQIRWRwQHqMOzO0N_wp7SDa9izxmTJTI,143
|
|
144
|
-
ccxt/abstract/arzplus.py,sha256=
|
|
145
|
+
ccxt/abstract/arzplus.py,sha256=PyEm_csnZFxbuKaEr4a4MK-bPek9xQogjTi4qUmv25s,600
|
|
145
146
|
ccxt/abstract/ascendex.py,sha256=5A8Zgq77jsdHlEzlTW_2nDybUUVfNVVOu6BgY3TWqRM,11394
|
|
146
147
|
ccxt/abstract/bequant.py,sha256=OTBtNu3DQeAqAC_Lbi0NePUs-ZQQllcLrVDI2G04nwQ,15601
|
|
147
148
|
ccxt/abstract/bigone.py,sha256=ChHXrnz1zHqLHJn162SxjfgbO8ocQppy7lXWGsHEtcI,4887
|
|
@@ -210,6 +211,7 @@ ccxt/abstract/foxbit.py,sha256=WOWT5EgFTLf0iPfLhCIyTaYHYgnTpMXr-zQoIsY74KM,2937
|
|
|
210
211
|
ccxt/abstract/gate.py,sha256=MrRMycFEpZKJ6yC7qi0p_qcwZtU9WJi5bBbVllskGoA,45044
|
|
211
212
|
ccxt/abstract/gateio.py,sha256=MrRMycFEpZKJ6yC7qi0p_qcwZtU9WJi5bBbVllskGoA,45044
|
|
212
213
|
ccxt/abstract/gemini.py,sha256=xmvbbzRylYVFn6B7EvSAm5cO75IFRCHQI5v9jGyhgoM,7014
|
|
214
|
+
ccxt/abstract/hamtapay.py,sha256=AALsMyKYpN8xWLNT9GkvmdsaDruV9zIYPc63SnzsIR0,333
|
|
213
215
|
ccxt/abstract/hashkey.py,sha256=EqAJjMUC8X2xjW0eYTnEvJO_VY5zVRppqDQx6Wsy97E,9016
|
|
214
216
|
ccxt/abstract/hibachi.py,sha256=w3tjXXnCaVxeiiKztbVjCI2OSCF3kUo6YSSQLBrj2QI,2769
|
|
215
217
|
ccxt/abstract/hitbtc.py,sha256=OTBtNu3DQeAqAC_Lbi0NePUs-ZQQllcLrVDI2G04nwQ,15601
|
|
@@ -272,13 +274,13 @@ ccxt/abstract/xt.py,sha256=n3eX1cItL_J0j8prOViV-C_tRwIFv_GO8JTvZZw8jv8,27837
|
|
|
272
274
|
ccxt/abstract/yobit.py,sha256=8ycfCO8ORFly9hc0Aa47sZyX4_ZKPXS9h9yJzI-uQ7Q,1339
|
|
273
275
|
ccxt/abstract/zaif.py,sha256=m15WHdl3gYy0GOXNZ8NEH8eE7sVh8c0T_ITNuU8vXeU,3935
|
|
274
276
|
ccxt/abstract/zonda.py,sha256=X-hCW0SdX3YKZWixDyW-O2211M58Rno8kKJ6quY7rw4,7183
|
|
275
|
-
ccxt/async_support/__init__.py,sha256=
|
|
277
|
+
ccxt/async_support/__init__.py,sha256=kLXzFgmLmapGzCZFqvMnPFttXhaaYI6qiie1P6zNsII,19500
|
|
276
278
|
ccxt/async_support/abantether.py,sha256=uLWn1i6gE8dtZr9BXmXfyT0Y-MzYYZU1DDeXGjFngAM,12064
|
|
277
279
|
ccxt/async_support/afratether.py,sha256=JC9ro3QrE8vE4YUm51xqwciSQhHfTPb98Mw1r6cJyvg,10869
|
|
278
280
|
ccxt/async_support/alpaca.py,sha256=oFpSnAjX-faRgTN4d5rwHa08WRaCkwiAbHGZ7JBe6Ww,81140
|
|
279
281
|
ccxt/async_support/apex.py,sha256=ouj8uyC4f8Ar3IowHxbrPTBp-g2ctheo5ir_YLsg-Gg,83228
|
|
280
282
|
ccxt/async_support/arzinja.py,sha256=0hYBzTWdYFQLediwhzqsffSgT2-D8z3lQUfeLa3TYig,10442
|
|
281
|
-
ccxt/async_support/arzplus.py,sha256=
|
|
283
|
+
ccxt/async_support/arzplus.py,sha256=0pHRjDYsrMlrB23SY688XrGKo9CePrJzIc8WSJdBxDo,20605
|
|
282
284
|
ccxt/async_support/ascendex.py,sha256=Nrivs8jnl5lN2IYpGG_Z23QDqUOAqDd0C_0Nv10bnm8,159533
|
|
283
285
|
ccxt/async_support/bequant.py,sha256=-O1NDzEwsG1L2H17ZzcJw7ZHvDt8s-47bgqzjixYkjc,1232
|
|
284
286
|
ccxt/async_support/bigone.py,sha256=DHFeRhLG4itPK0hSuL-MofawQ6-abN0LVVtiGeQXgCQ,96106
|
|
@@ -347,6 +349,7 @@ ccxt/async_support/foxbit.py,sha256=Mnb-we3Gy-iflG7driSnD3A4CL9ytVanDvXoX1h6Lgg,
|
|
|
347
349
|
ccxt/async_support/gate.py,sha256=t5iTFzkJVS14V9Prgoqi6achMXMlKKLZ7TQwP2zphxw,355257
|
|
348
350
|
ccxt/async_support/gateio.py,sha256=Sy9taiR0_0k4oh5GHjTjpwuCzskKiCCEQljuz7OxDVs,498
|
|
349
351
|
ccxt/async_support/gemini.py,sha256=t5is53SzmwonojZ6szxaPaGt-3ShwE6wh6nA0lB7L7M,84156
|
|
352
|
+
ccxt/async_support/hamtapay.py,sha256=tcvRpng1iCESclUr8EwfSWUZtVwozGQ_hwUxEuYYbkY,11071
|
|
350
353
|
ccxt/async_support/hashkey.py,sha256=MIp7RB82pOCLxVCH23VTh9ve__prU-EbdbrRYJ98xhI,193859
|
|
351
354
|
ccxt/async_support/hibachi.py,sha256=bePZjCNOkXjd7sSUIMGQd5FVl-EtWtlYwlruW46G81A,86311
|
|
352
355
|
ccxt/async_support/hitbtc.py,sha256=QpnR5OiablBy8tdb-XK1irLYBUX3gGtRiJKoV8Lldwc,160730
|
|
@@ -410,7 +413,7 @@ ccxt/async_support/yobit.py,sha256=FBI7ajvxprTYUqX8zosd7-LntDft8vIEjRTHng5ry8Y,5
|
|
|
410
413
|
ccxt/async_support/zaif.py,sha256=mh0PETLMTJV509zhT7jukddg6S7YhvwhCT7zqxC6YLA,31364
|
|
411
414
|
ccxt/async_support/zonda.py,sha256=7hmHotE5JBd8034d1ZbX3oIeWIpQFrQb8aK-dP3Btx0,85327
|
|
412
415
|
ccxt/async_support/base/__init__.py,sha256=aVYSsFi--b4InRs9zDN_wtCpj8odosAB726JdUHavrk,67
|
|
413
|
-
ccxt/async_support/base/exchange.py,sha256=
|
|
416
|
+
ccxt/async_support/base/exchange.py,sha256=Y6jP5wFmQdR8y6u0zoDAS-BMtJgmIaBPb_oYIhqoyhI,121268
|
|
414
417
|
ccxt/async_support/base/throttler.py,sha256=tvDVcdRUVYi8fZRlEcnqtgzcgB_KMUMRs5Pu8tuU-tU,1847
|
|
415
418
|
ccxt/async_support/base/ws/__init__.py,sha256=uockzpLuwntKGZbs5EOWFe-Zg-k6Cj7GhNJLc_RX0so,1791
|
|
416
419
|
ccxt/async_support/base/ws/cache.py,sha256=xf2VOtfUwloxSlIQ39M1RGZHWQzyS9IGhB5NX6cDcAc,8370
|
|
@@ -422,10 +425,10 @@ ccxt/async_support/base/ws/order_book_side.py,sha256=GhnGUt78pJ-AYL_Dq9produGjmB
|
|
|
422
425
|
ccxt/base/__init__.py,sha256=eTx1OE3HJjspFUQjGm6LBhaQiMKJnXjkdP-JUXknyQ0,1320
|
|
423
426
|
ccxt/base/decimal_to_precision.py,sha256=3XI30u9YudHbTA438397u5rkdlXa3atxwZEfUus3C4k,6803
|
|
424
427
|
ccxt/base/errors.py,sha256=OGhWNvNtRlJOzFx-n1x3ZjTnaPpfWH0Vc0xACS-MeDw,5012
|
|
425
|
-
ccxt/base/exchange.py,sha256=
|
|
428
|
+
ccxt/base/exchange.py,sha256=1u1bA1Xfoi9k310ojZDeg9PB4F6Pqn8nw41He-LNeVs,334337
|
|
426
429
|
ccxt/base/precise.py,sha256=koce64Yrp6vFbGijJtUt-QQ6XhJgeGTCksZ871FPp_A,8886
|
|
427
430
|
ccxt/base/types.py,sha256=Gvbogh9i7pPH7Z18xesYeDPribqqwq8uKpOv-YODFBs,11505
|
|
428
|
-
ccxt/pro/__init__.py,sha256=
|
|
431
|
+
ccxt/pro/__init__.py,sha256=Az0dxwypdBa7xD1CvEP6pjmg57xwpSqLA9gYB-z-Kpw,11463
|
|
429
432
|
ccxt/pro/alpaca.py,sha256=REAEZxdv2pY8xjxBGCBca3nPKpIdleVqr-IVpuVmADg,27637
|
|
430
433
|
ccxt/pro/apex.py,sha256=FLBaLN2FESIh9gqHPVwf0IkkIHpxGHHUcFwgBGBEkrA,42018
|
|
431
434
|
ccxt/pro/ascendex.py,sha256=P0DnIMIA-BIGxyoEQBLGtjH-whRhkPbhe8gU2s5V238,37526
|
|
@@ -748,8 +751,8 @@ ccxt/test/tests_async.py,sha256=D5ZDYYW635E2LFEhJt7HfIjbFVCQl3WSBEFnR-QEQzM,9549
|
|
|
748
751
|
ccxt/test/tests_helpers.py,sha256=egM69A2ZFYeVF5hwC1Qt-c5DOeClY5bv4jowmceeFV8,9736
|
|
749
752
|
ccxt/test/tests_init.py,sha256=qM0-Gb0h0p6CANWTkyYZI7wl-iYOcrPur7aj_OKh7m0,1212
|
|
750
753
|
ccxt/test/tests_sync.py,sha256=Rr72cGmoKqbUIIEJJAGh2_QhBc4rIZlBxVtGCQVd4BE,94440
|
|
751
|
-
ccxt_ir-4.9.
|
|
752
|
-
ccxt_ir-4.9.
|
|
753
|
-
ccxt_ir-4.9.
|
|
754
|
-
ccxt_ir-4.9.
|
|
755
|
-
ccxt_ir-4.9.
|
|
754
|
+
ccxt_ir-4.9.4.dist-info/licenses/LICENSE.txt,sha256=EIb9221AhMHV7xF1_55STFdKTFsnJVJYkRpY2Lnvo5w,1068
|
|
755
|
+
ccxt_ir-4.9.4.dist-info/METADATA,sha256=G0Yv5h7WC6mM7LKMCHul38NL9zLBdWNcgsmJjeCcBhU,139254
|
|
756
|
+
ccxt_ir-4.9.4.dist-info/WHEEL,sha256=JNWh1Fm1UdwIQV075glCn4MVuCRs0sotJIq-J6rbxCU,109
|
|
757
|
+
ccxt_ir-4.9.4.dist-info/top_level.txt,sha256=CkQDuCTDKNcImPV60t36G6MdYfxsAPNiSaEwifVoVMo,5
|
|
758
|
+
ccxt_ir-4.9.4.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|