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 CHANGED
@@ -22,7 +22,7 @@
22
22
 
23
23
  # ----------------------------------------------------------------------------
24
24
 
25
- __version__ = '4.9.2'
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
@@ -4,7 +4,7 @@
4
4
 
5
5
  # -----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.9.2'
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',
@@ -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
@@ -2,7 +2,7 @@
2
2
 
3
3
  # -----------------------------------------------------------------------------
4
4
 
5
- __version__ = '4.9.2'
5
+ __version__ = '4.9.4'
6
6
 
7
7
  # -----------------------------------------------------------------------------
8
8
 
@@ -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
@@ -4,7 +4,7 @@
4
4
 
5
5
  # -----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.9.2'
7
+ __version__ = '4.9.4'
8
8
 
9
9
  # -----------------------------------------------------------------------------
10
10
 
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
@@ -4,7 +4,7 @@
4
4
 
5
5
  # ----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.9.2'
7
+ __version__ = '4.9.4'
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.2
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
- [![NPM Downloads](https://img.shields.io/npm/dy/ccxt.svg)](https://www.npmjs.com/package/ccxt) [![npm](https://img.shields.io/npm/v/ccxt.svg)](https://npmjs.com/package/ccxt) [![PyPI](https://img.shields.io/pypi/v/ccxt.svg)](https://pypi.python.org/pypi/ccxt) [![NuGet version](https://img.shields.io/nuget/v/ccxt)](https://www.nuget.org/packages/ccxt) [![GoDoc](https://pkg.go.dev/badge/github.com/ccxt/ccxt/go/v4?utm_source=godoc)](https://godoc.org/github.com/ccxt/ccxt/go/v4) [![Discord](https://img.shields.io/discord/690203284119617602?logo=discord&logoColor=white)](https://discord.gg/ccxt) [![Supported Exchanges](https://img.shields.io/badge/exchanges-136-blue.svg)](https://github.com/ccxt/ccxt/wiki/Exchange-Markets) [![Follow CCXT at x.com](https://img.shields.io/twitter/follow/ccxt_official.svg?style=social&label=CCXT)](https://x.com/ccxt_official)
65
+ [![NPM Downloads](https://img.shields.io/npm/dy/ccxt.svg)](https://www.npmjs.com/package/ccxt) [![npm](https://img.shields.io/npm/v/ccxt.svg)](https://npmjs.com/package/ccxt) [![PyPI](https://img.shields.io/pypi/v/ccxt.svg)](https://pypi.python.org/pypi/ccxt) [![NuGet version](https://img.shields.io/nuget/v/ccxt)](https://www.nuget.org/packages/ccxt) [![GoDoc](https://pkg.go.dev/badge/github.com/ccxt/ccxt/go/v4?utm_source=godoc)](https://godoc.org/github.com/ccxt/ccxt/go/v4) [![Discord](https://img.shields.io/discord/690203284119617602?logo=discord&logoColor=white)](https://discord.gg/ccxt) [![Supported Exchanges](https://img.shields.io/badge/exchanges-137-blue.svg)](https://github.com/ccxt/ccxt/wiki/Exchange-Markets) [![Follow CCXT at x.com](https://img.shields.io/twitter/follow/ccxt_official.svg?style=social&label=CCXT)](https://x.com/ccxt_official)
66
66
 
67
67
  A `JavaScript` / `Python` / `PHP` / `C#` / `Go` library for cryptocurrency trading and e-commerce with support for many bitcoin/ether/altcoin exchange markets and merchant APIs.
68
68
 
@@ -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.2/dist/ccxt.browser.min.js
309
- * unpkg: https://unpkg.com/ccxt@4.9.2/dist/ccxt.browser.min.js
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.2/dist/ccxt.browser.min.js
312
- * unpkg: https://unpkg.com/ccxt@4.9.2/dist/ccxt.browser.min.js
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.2/dist/ccxt.browser.min.js"></script>
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.2/dist/ccxt.browser.min.js"></script>
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=QzwBiBzyjWnkXx8b2egfWJcj3BFnKLPvqMnr8YBbtEY,19308
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=420PpbvE0OnFpob9heC99Q7iV70Pvkjhp7Qx6YIY5TE,16368
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=mStEPNekMs6_4Gw7do5l6yYTg9s8Pn4GFOoTsdVNEeM,468
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=5P4KOKbi5B_E2cStpleCUNRIAk7qa4_a2xmHAnbSAU8,19391
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=GYpUZFt425DKuqfskPt5EygtWOPWtk_9iOMhSvoDdAQ,16472
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=2QCRefb5mOABe8SX-XCDFopJRSrhzzRomu3Yf-xW8rU,121268
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=NsCIpXOyjWdyeW8Ex5-e_KzKmF1KNnrKGGQCtwoO7j0,334337
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=9i8BY28fSnXqz3OufTv0FKGHvQ4Gjwpeb5G_tVl0hJc,11463
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.2.dist-info/licenses/LICENSE.txt,sha256=EIb9221AhMHV7xF1_55STFdKTFsnJVJYkRpY2Lnvo5w,1068
752
- ccxt_ir-4.9.2.dist-info/METADATA,sha256=EjdeTpD2aHxIFY3rFC-Ngmf-RIJxzh1SK-_Cx3T6NQs,139254
753
- ccxt_ir-4.9.2.dist-info/WHEEL,sha256=JNWh1Fm1UdwIQV075glCn4MVuCRs0sotJIq-J6rbxCU,109
754
- ccxt_ir-4.9.2.dist-info/top_level.txt,sha256=CkQDuCTDKNcImPV60t36G6MdYfxsAPNiSaEwifVoVMo,5
755
- ccxt_ir-4.9.2.dist-info/RECORD,,
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,,