ccxt-ir 4.12.3 → 4.13.0

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.
package/dist/cjs/ccxt.js CHANGED
@@ -50,6 +50,7 @@ var bitteam = require('./src/bitteam.js');
50
50
  var bittrade = require('./src/bittrade.js');
51
51
  var bitunix = require('./src/bitunix.js');
52
52
  var bitvavo = require('./src/bitvavo.js');
53
+ var bitwana = require('./src/bitwana.js');
53
54
  var blockchaincom = require('./src/blockchaincom.js');
54
55
  var blofin = require('./src/blofin.js');
55
56
  var btcalpha = require('./src/btcalpha.js');
@@ -239,7 +240,7 @@ var xt$1 = require('./src/pro/xt.js');
239
240
 
240
241
  //-----------------------------------------------------------------------------
241
242
  // this is updated by vss.js when building
242
- const version = '4.12.3';
243
+ const version = '4.13.0';
243
244
  Exchange["default"].ccxtVersion = version;
244
245
  const exchanges = {
245
246
  'abantether': abantether["default"],
@@ -280,6 +281,7 @@ const exchanges = {
280
281
  'bittrade': bittrade["default"],
281
282
  'bitunix': bitunix["default"],
282
283
  'bitvavo': bitvavo["default"],
284
+ 'bitwana': bitwana["default"],
283
285
  'blockchaincom': blockchaincom["default"],
284
286
  'blofin': blofin["default"],
285
287
  'btcalpha': btcalpha["default"],
@@ -558,6 +560,7 @@ exports.bitteam = bitteam["default"];
558
560
  exports.bittrade = bittrade["default"];
559
561
  exports.bitunix = bitunix["default"];
560
562
  exports.bitvavo = bitvavo["default"];
563
+ exports.bitwana = bitwana["default"];
561
564
  exports.blockchaincom = blockchaincom["default"];
562
565
  exports.blofin = blofin["default"];
563
566
  exports.btcalpha = btcalpha["default"];
@@ -1 +1 @@
1
- { "type": "commonjs" }
1
+ { "type": "commonjs" }
@@ -0,0 +1,11 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var Exchange$1 = require('../base/Exchange.js');
6
+
7
+ // ----------------------------------------------------------------------------
8
+ class Exchange extends Exchange$1["default"] {
9
+ }
10
+
11
+ exports["default"] = Exchange;
@@ -0,0 +1,420 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var bitwana$1 = require('./abstract/bitwana.js');
6
+
7
+ // ----------------------------------------------------------------------------
8
+ // ---------------------------------------------------------------------------
9
+ /**
10
+ * @class bitwana
11
+ * @augments Exchange
12
+ * @description Set rateLimit to 1000 if fully verified
13
+ */
14
+ class bitwana extends bitwana$1["default"] {
15
+ marketTypeToSymbol(base, quote, marketType = 'spot') {
16
+ return base + '/' + quote;
17
+ }
18
+ describe() {
19
+ return this.deepExtend(super.describe(), {
20
+ 'id': 'bitwana',
21
+ 'name': 'Bitwana',
22
+ 'countries': ['IR'],
23
+ 'rateLimit': 1000,
24
+ 'version': '1',
25
+ 'certified': false,
26
+ 'pro': false,
27
+ 'has': {
28
+ 'CORS': undefined,
29
+ 'spot': true,
30
+ 'margin': false,
31
+ 'swap': false,
32
+ 'future': false,
33
+ 'option': false,
34
+ 'addMargin': false,
35
+ 'cancelAllOrders': false,
36
+ 'cancelOrder': false,
37
+ 'cancelOrders': false,
38
+ 'createDepositAddress': false,
39
+ 'createOrder': false,
40
+ 'createStopLimitOrder': false,
41
+ 'createStopMarketOrder': false,
42
+ 'createStopOrder': false,
43
+ 'editOrder': false,
44
+ 'fetchBalance': false,
45
+ 'fetchBorrowInterest': false,
46
+ 'fetchBorrowRateHistories': false,
47
+ 'fetchBorrowRateHistory': false,
48
+ 'fetchClosedOrders': false,
49
+ 'fetchCrossBorrowRate': false,
50
+ 'fetchCrossBorrowRates': false,
51
+ 'fetchCurrencies': false,
52
+ 'fetchDepositAddress': false,
53
+ 'fetchDeposits': false,
54
+ 'fetchFundingHistory': false,
55
+ 'fetchFundingRate': false,
56
+ 'fetchFundingRateHistory': false,
57
+ 'fetchFundingRates': false,
58
+ 'fetchIndexOHLCV': false,
59
+ 'fetchIsolatedBorrowRate': false,
60
+ 'fetchIsolatedBorrowRates': false,
61
+ 'fetchL2OrderBook': false,
62
+ 'fetchL3OrderBook': false,
63
+ 'fetchLedger': false,
64
+ 'fetchLedgerEntry': false,
65
+ 'fetchLeverageTiers': false,
66
+ 'fetchMarkets': true,
67
+ 'fetchMarkOHLCV': false,
68
+ 'fetchMyTrades': false,
69
+ 'fetchOHLCV': false,
70
+ 'fetchOpenInterestHistory': false,
71
+ 'fetchOpenOrders': false,
72
+ 'fetchOrder': false,
73
+ 'fetchOrderBook': false,
74
+ 'fetchOrders': false,
75
+ 'fetchOrderTrades': 'emulated',
76
+ 'fetchPositions': false,
77
+ 'fetchPremiumIndexOHLCV': false,
78
+ 'fetchTicker': true,
79
+ 'fetchTickers': true,
80
+ 'fetchTime': false,
81
+ 'fetchTrades': false,
82
+ 'fetchTradingFee': false,
83
+ 'fetchTradingFees': false,
84
+ 'fetchWithdrawals': false,
85
+ 'otc': true,
86
+ 'setLeverage': false,
87
+ 'setMarginMode': false,
88
+ 'transfer': false,
89
+ 'withdraw': false,
90
+ },
91
+ 'comment': 'This comment is optional',
92
+ 'urls': {
93
+ 'logo': 'https://cdn.arz.digital/cr-odin/img/exchanges/bitwana/64x64.png',
94
+ 'api': {
95
+ 'public': 'https://bitwana.com',
96
+ },
97
+ 'www': 'https://bitwana.com/',
98
+ 'doc': [
99
+ 'https://bitwana.com/',
100
+ ],
101
+ },
102
+ 'api': {
103
+ 'public': {
104
+ 'get': {
105
+ 'api/1/markets': 1,
106
+ 'api/1/markets/{id}': 1,
107
+ },
108
+ },
109
+ },
110
+ 'fees': {},
111
+ });
112
+ }
113
+ parseSpotMarket(market) {
114
+ // {
115
+ // "id": "BTC_IRT",
116
+ // "symbol": "بیت‌کوین-تومان",
117
+ // "base": "BTC",
118
+ // "quote": "IRT",
119
+ // "buyPrice": "10222846365",
120
+ // "sellPrice": "10233403625",
121
+ // "userOrderPricePrecision": 0,
122
+ // "quantityPrecision": 6,
123
+ // "minimumOrder": 100000,
124
+ // "maximumOrder": 300000000,
125
+ // "lastTradedPrice": "10249911984",
126
+ // "lowestPrice": "10063564406",
127
+ // "highestPrice": "10320391247",
128
+ // "sourceVolume": "0.036557",
129
+ // "destinationVolume": "371770611.78",
130
+ // "tradingEnabled": true,
131
+ // "otcEnabled": false,
132
+ // }
133
+ const id = this.safeString(market, 'id');
134
+ const baseId = this.safeString(market, 'base');
135
+ const quoteId = this.safeString(market, 'quote');
136
+ const base = this.safeCurrencyCode(baseId);
137
+ const quote = this.safeCurrencyCode(quoteId);
138
+ return {
139
+ 'id': id,
140
+ 'symbol': this.marketTypeToSymbol(base, quote, 'spot'),
141
+ 'base': base,
142
+ 'quote': quote,
143
+ 'settle': undefined,
144
+ 'baseId': baseId,
145
+ 'quoteId': quoteId,
146
+ 'settleId': undefined,
147
+ 'type': 'spot',
148
+ 'spot': true,
149
+ 'margin': false,
150
+ 'swap': false,
151
+ 'future': false,
152
+ 'option': false,
153
+ 'active': true,
154
+ 'contract': false,
155
+ 'linear': undefined,
156
+ 'inverse': undefined,
157
+ 'contractSize': undefined,
158
+ 'expiry': undefined,
159
+ 'expiryDatetime': undefined,
160
+ 'strike': undefined,
161
+ 'optionType': undefined,
162
+ 'precision': {
163
+ 'amount': this.safeInteger(market, 'quantityPrecision'),
164
+ 'price': this.safeInteger(market, 'userOrderPricePrecision'),
165
+ },
166
+ 'limits': {
167
+ 'leverage': {
168
+ 'min': undefined,
169
+ 'max': undefined,
170
+ },
171
+ 'amount': {
172
+ 'min': undefined,
173
+ 'max': undefined,
174
+ },
175
+ 'price': {
176
+ 'min': undefined,
177
+ 'max': undefined,
178
+ },
179
+ 'cost': {
180
+ 'min': this.safeNumber(market, 'minimumOrder'),
181
+ 'max': this.safeNumber(market, 'maximumOrder'),
182
+ },
183
+ },
184
+ 'created': undefined,
185
+ 'info': market,
186
+ };
187
+ }
188
+ parseOtcMarket(market) {
189
+ const rawId = this.safeString(market, 'id');
190
+ const baseId = this.safeString(market, 'base');
191
+ const quoteId = this.safeString(market, 'quote');
192
+ const base = this.safeCurrencyCode(baseId);
193
+ const quote = this.safeCurrencyCode(quoteId);
194
+ return {
195
+ 'id': rawId + '_OTC',
196
+ 'symbol': this.marketTypeToSymbol(base, quote, 'otc'),
197
+ 'base': base,
198
+ 'quote': quote,
199
+ 'settle': undefined,
200
+ 'baseId': baseId,
201
+ 'quoteId': quoteId,
202
+ 'settleId': undefined,
203
+ 'type': 'otc',
204
+ 'spot': false,
205
+ 'margin': false,
206
+ 'swap': false,
207
+ 'future': false,
208
+ 'option': false,
209
+ 'active': true,
210
+ 'contract': false,
211
+ 'linear': undefined,
212
+ 'inverse': undefined,
213
+ 'contractSize': undefined,
214
+ 'expiry': undefined,
215
+ 'expiryDatetime': undefined,
216
+ 'strike': undefined,
217
+ 'optionType': undefined,
218
+ 'precision': {
219
+ 'amount': this.safeInteger(market, 'quantityPrecision'),
220
+ 'price': this.safeInteger(market, 'userOrderPricePrecision'),
221
+ },
222
+ 'limits': {
223
+ 'leverage': {
224
+ 'min': undefined,
225
+ 'max': undefined,
226
+ },
227
+ 'amount': {
228
+ 'min': undefined,
229
+ 'max': undefined,
230
+ },
231
+ 'price': {
232
+ 'min': undefined,
233
+ 'max': undefined,
234
+ },
235
+ 'cost': {
236
+ 'min': this.safeNumber(market, 'minimumOrder'),
237
+ 'max': this.safeNumber(market, 'maximumOrder'),
238
+ },
239
+ },
240
+ 'created': undefined,
241
+ 'info': market,
242
+ };
243
+ }
244
+ async fetchMarkets(params = {}) {
245
+ /**
246
+ * @method
247
+ * @name bitwana#fetchMarkets
248
+ * @description retrieves data on all markets for bitwana
249
+ * @see https://bitwana.com/api/1/markets?with_price=true
250
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
251
+ * @returns {object[]} an array of objects representing market data
252
+ */
253
+ const marketType = this.safeString(params, 'type', 'spot');
254
+ const request = {
255
+ 'with_price': true,
256
+ };
257
+ const response = await this.publicGetApi1Markets(this.extend(request, params));
258
+ const markets = this.safeList(response, 'content', []);
259
+ const result = [];
260
+ for (let i = 0; i < markets.length; i++) {
261
+ const market = markets[i];
262
+ if (marketType === 'otc') {
263
+ result.push(this.parseOtcMarket(market));
264
+ }
265
+ else {
266
+ result.push(this.parseSpotMarket(market));
267
+ }
268
+ }
269
+ return result;
270
+ }
271
+ async fetchTickers(symbols = undefined, params = {}) {
272
+ /**
273
+ * @method
274
+ * @name bitwana#fetchTickers
275
+ * @description fetches price tickers for multiple markets, statistical information calculated over the past 24 hours for each market
276
+ * @see https://bitwana.com/api/1/markets?with_price=true
277
+ * @param {string[]|undefined} symbols unified symbols of the markets to fetch the ticker for, all market tickers are returned if not assigned
278
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
279
+ * @returns {object} a dictionary of [ticker structures]{@link https://docs.ccxt.com/#/?id=ticker-structure}
280
+ */
281
+ const marketType = this.safeString(params, 'type', 'spot');
282
+ await this.loadMarkets(false, { 'type': marketType });
283
+ if (symbols !== undefined) {
284
+ symbols = this.marketSymbols(symbols);
285
+ }
286
+ const request = {
287
+ 'with_price': true,
288
+ };
289
+ const response = await this.publicGetApi1Markets(this.extend(request, params));
290
+ const markets = this.safeList(response, 'content', []);
291
+ const result = {};
292
+ for (let i = 0; i < markets.length; i++) {
293
+ const market = markets[i];
294
+ if (marketType === 'otc') {
295
+ const otcTicker = this.parseOtcTicker(market);
296
+ result[otcTicker['symbol']] = otcTicker;
297
+ }
298
+ else {
299
+ const spotTicker = this.parseSpotTicker(market);
300
+ result[spotTicker['symbol']] = spotTicker;
301
+ }
302
+ }
303
+ return this.filterByArrayTickers(result, 'symbol', symbols);
304
+ }
305
+ async fetchTicker(symbol, params = {}) {
306
+ /**
307
+ * @method
308
+ * @name bitwana#fetchTicker
309
+ * @description fetches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
310
+ * @see https://bitwana.com/api/1/markets/BTC_IRT?with_price=true
311
+ * @param {string} symbol unified symbol of the market to fetch the ticker for
312
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
313
+ * @returns {object} a [ticker structure]{@link https://docs.ccxt.com/#/?id=ticker-structure}
314
+ */
315
+ const marketType = this.safeString(params, 'type', 'spot');
316
+ await this.loadMarkets(false, { 'type': marketType });
317
+ const market = this.market(symbol);
318
+ const request = {
319
+ 'id': this.safeString(market['info'], 'id'),
320
+ 'with_price': true,
321
+ };
322
+ const response = await this.publicGetApi1MarketsId(this.extend(request, params));
323
+ const ticker = this.safeDict(response, 'content');
324
+ if (marketType === 'otc') {
325
+ return this.parseOtcTicker(ticker, market);
326
+ }
327
+ return this.parseSpotTicker(ticker, market);
328
+ }
329
+ parseSpotTicker(ticker, market = undefined) {
330
+ const baseId = this.safeString(ticker, 'base');
331
+ const quoteId = this.safeString(ticker, 'quote');
332
+ const base = this.safeCurrencyCode(baseId);
333
+ const quote = this.safeCurrencyCode(quoteId);
334
+ let symbol = this.marketTypeToSymbol(base, quote, 'spot');
335
+ if (market !== undefined) {
336
+ symbol = market['symbol'];
337
+ }
338
+ const high = this.safeNumber(ticker, 'highestPrice');
339
+ const low = this.safeNumber(ticker, 'lowestPrice');
340
+ const bid = this.safeNumber(ticker, 'buyPrice');
341
+ const ask = this.safeNumber(ticker, 'sellPrice');
342
+ const last = this.safeNumber(ticker, 'lastTradedPrice');
343
+ const change = this.safeNumber(ticker, 'changePrice');
344
+ const percentage = this.safeNumber(ticker, 'changeRate');
345
+ const baseVolume = this.safeNumber(ticker, 'sourceVolume');
346
+ const quoteVolume = this.safeNumber(ticker, 'destinationVolume');
347
+ return this.safeTicker({
348
+ 'symbol': symbol,
349
+ 'timestamp': undefined,
350
+ 'datetime': undefined,
351
+ 'high': high,
352
+ 'low': low,
353
+ 'bid': bid,
354
+ 'bidVolume': undefined,
355
+ 'ask': ask,
356
+ 'askVolume': undefined,
357
+ 'vwap': undefined,
358
+ 'open': undefined,
359
+ 'close': last,
360
+ 'last': last,
361
+ 'previousClose': undefined,
362
+ 'change': change,
363
+ 'percentage': percentage,
364
+ 'average': undefined,
365
+ 'baseVolume': baseVolume,
366
+ 'quoteVolume': quoteVolume,
367
+ 'info': ticker,
368
+ }, market);
369
+ }
370
+ parseOtcTicker(ticker, market = undefined) {
371
+ const baseId = this.safeString(ticker, 'base');
372
+ const quoteId = this.safeString(ticker, 'quote');
373
+ const base = this.safeCurrencyCode(baseId);
374
+ const quote = this.safeCurrencyCode(quoteId);
375
+ let symbol = this.marketTypeToSymbol(base, quote, 'otc');
376
+ if (market !== undefined) {
377
+ symbol = market['symbol'];
378
+ }
379
+ const high = this.safeNumber(ticker, 'highestPrice');
380
+ const low = this.safeNumber(ticker, 'lowestPrice');
381
+ const bid = this.safeNumber(ticker, 'buyPrice');
382
+ const ask = this.safeNumber(ticker, 'sellPrice');
383
+ const last = this.safeNumber(ticker, 'lastTradedPrice');
384
+ const change = this.safeNumber(ticker, 'changePrice');
385
+ const percentage = this.safeNumber(ticker, 'changeRate');
386
+ return this.safeTicker({
387
+ 'symbol': symbol,
388
+ 'timestamp': undefined,
389
+ 'datetime': undefined,
390
+ 'high': high,
391
+ 'low': low,
392
+ 'bid': bid,
393
+ 'bidVolume': undefined,
394
+ 'ask': ask,
395
+ 'askVolume': undefined,
396
+ 'vwap': undefined,
397
+ 'open': undefined,
398
+ 'close': last,
399
+ 'last': last,
400
+ 'previousClose': undefined,
401
+ 'change': change,
402
+ 'percentage': percentage,
403
+ 'average': undefined,
404
+ 'baseVolume': undefined,
405
+ 'quoteVolume': undefined,
406
+ 'info': ticker,
407
+ }, market);
408
+ }
409
+ sign(path, api = 'public', method = 'GET', params = {}, headers = undefined, body = undefined) {
410
+ const query = this.omit(params, this.extractParams(path));
411
+ let url = this.urls['api'][api] + '/' + this.implodeParams(path, params);
412
+ if (Object.keys(query).length) {
413
+ url += '?' + this.urlencode(query);
414
+ }
415
+ headers = { 'Content-Type': 'application/json' };
416
+ return { 'url': url, 'method': method, 'body': body, 'headers': headers };
417
+ }
418
+ }
419
+
420
+ exports["default"] = bitwana;
@@ -79,7 +79,6 @@ class hamtapay extends hamtapay$1["default"] {
79
79
  'fetchTradingFee': false,
80
80
  'fetchTradingFees': false,
81
81
  'fetchWithdrawals': false,
82
- 'otc': true,
83
82
  'setLeverage': false,
84
83
  'setMarginMode': false,
85
84
  'transfer': false,
@@ -89,7 +88,7 @@ class hamtapay extends hamtapay$1["default"] {
89
88
  'urls': {
90
89
  'logo': 'https://cdn.arz.digital/cr-odin/img/exchanges/hamtapay/64x64.png',
91
90
  'api': {
92
- 'public': 'https://oapi.hamtapay.org',
91
+ 'public': 'https://api.hamtapay.org',
93
92
  },
94
93
  'www': 'https://hamtapay.net/',
95
94
  'doc': [
@@ -100,7 +99,7 @@ class hamtapay extends hamtapay$1["default"] {
100
99
  'public': {
101
100
  'get': {
102
101
  '/financial/api/market': 1,
103
- '/financial/api/market/{symbol}': 1,
102
+ '/financial/api/vitrin/prices': 1,
104
103
  },
105
104
  },
106
105
  },
@@ -119,7 +118,7 @@ class hamtapay extends hamtapay$1["default"] {
119
118
  * @method
120
119
  * @name hamtapay#fetchMarkets
121
120
  * @description retrieves data on all markets for hamtapay
122
- * @see https://oapi.hamtapay.org/financial/api/market
121
+ * @see https://api.hamtapay.org/financial/api/market
123
122
  * @param {object} [params] extra parameters specific to the exchange API endpoint
124
123
  * @returns {object[]} an array of objects representing market data
125
124
  */
@@ -172,8 +171,8 @@ class hamtapay extends hamtapay$1["default"] {
172
171
  'strike': undefined,
173
172
  'optionType': undefined,
174
173
  'precision': {
175
- 'amount': this.safeInteger(market, 'amount_decimals'),
176
- 'price': this.safeInteger(market, 'price_decimals'),
174
+ 'amount': undefined,
175
+ 'price': undefined,
177
176
  },
178
177
  'limits': {
179
178
  'leverage': {
@@ -202,7 +201,7 @@ class hamtapay extends hamtapay$1["default"] {
202
201
  * @method
203
202
  * @name hamtapay#fetchTickers
204
203
  * @description fetches price tickers for multiple markets, statistical information calculated over the past 24 hours for each market
205
- * @see https://oapi.hamtapay.org/financial/api/market
204
+ * @see https://api.hamtapay.org/financial/api/vitrin/prices
206
205
  * @param {string[]|undefined} symbols unified symbols of the markets to fetch the ticker for, all market tickers are returned if not assigned
207
206
  * @param {object} [params] extra parameters specific to the exchange API endpoint
208
207
  * @returns {object} a dictionary of [ticker structures]{@link https://docs.ccxt.com/#/?id=ticker-structure}
@@ -211,12 +210,23 @@ class hamtapay extends hamtapay$1["default"] {
211
210
  if (symbols !== undefined) {
212
211
  symbols = this.marketSymbols(symbols);
213
212
  }
214
- const response = await this.publicGetFinancialApiMarket(params);
215
- const data = this.safeList(response, 'data', []);
213
+ const response = await this.publicGetFinancialApiVitrinPrices(params);
214
+ const data = this.safeDict(response, 'data', {});
216
215
  const result = {};
217
- for (let i = 0; i < data.length; i++) {
218
- const ticker = this.parseTicker(data[i]);
219
- result[ticker['symbol']] = ticker;
216
+ const quotes = ['IRT', 'USDT'];
217
+ for (let i = 0; i < quotes.length; i++) {
218
+ const current_qoute = quotes[i];
219
+ const corresponding_data = this.safeDict(data, current_qoute, {});
220
+ const baseSymbols = Object.keys(corresponding_data);
221
+ for (let j = 0; j < baseSymbols.length; j++) {
222
+ const current_base = baseSymbols[j];
223
+ const current_ticker = corresponding_data[current_base];
224
+ current_ticker['base'] = current_base;
225
+ current_ticker['quote'] = current_qoute;
226
+ current_ticker['symbol'] = current_base + '/' + current_qoute;
227
+ current_ticker['id'] = current_base + '-' + current_qoute;
228
+ result[current_ticker['symbol']] = this.parseTicker(current_ticker);
229
+ }
220
230
  }
221
231
  return this.filterByArrayTickers(result, 'symbol', symbols);
222
232
  }
@@ -225,42 +235,48 @@ class hamtapay extends hamtapay$1["default"] {
225
235
  * @method
226
236
  * @name hamtapay#fetchTicker
227
237
  * @description fetches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
228
- * @see https://oapi.hamtapay.org/financial/api/market/{symbol}
238
+ * @see https://hamtapay.com/management/all-coins/?format=json
229
239
  * @param {string} symbol unified symbol of the market to fetch the ticker for
230
240
  * @param {object} [params] extra parameters specific to the exchange API endpoint
231
241
  * @returns {object} a [ticker structure]{@link https://docs.ccxt.com/#/?id=ticker-structure}
232
242
  */
233
- await this.loadMarkets();
234
- const market = this.market(symbol);
235
- const request = {
236
- 'symbol': market['id'],
237
- };
238
- const response = await this.publicGetFinancialApiMarketSymbol(this.extend(request, params));
239
- const ticker = this.safeDict(response, 'data', response);
240
- return this.parseTicker(ticker, market);
243
+ const ticker = await this.fetchTickers([symbol]);
244
+ return ticker[symbol];
241
245
  }
242
246
  parseTicker(ticker, market = undefined) {
247
+ // {
248
+ // "id": "USDT-IRT",
249
+ // "symbol": "USDT/IRT",
250
+ // "base": "USDT",
251
+ // "quote": "IRT",
252
+ // "min_price_24h": "111702",
253
+ // "max_price_24h": "115872",
254
+ // "market_price": "115942",
255
+ // "buy_price": "117101",
256
+ // "sell_price": "114782",
257
+ // "change_rate_24h": 3.29,
258
+ // "amount_decimals": 0,
259
+ // "price_decimals": 0,
260
+ // "status": "ACTIVE"
261
+ // }
243
262
  const marketType = 'otc';
244
- const marketId = this.safeString2(ticker, 'id', 'symbol');
245
- const baseId = this.safeString(ticker, 'base');
246
- const quoteId = this.safeString(ticker, 'quote');
247
- const base = this.safeCurrencyCode(baseId);
248
- const quote = this.safeCurrencyCode(quoteId);
249
- let symbol = this.safeSymbol(marketId, market, undefined, marketType);
250
- if ((baseId !== undefined) && (quoteId !== undefined)) {
251
- symbol = base + '/' + quote;
252
- }
253
- const last = this.safeFloat(ticker, 'last_price');
254
- const percentage = this.safeFloat(ticker, 'percent_change_24h');
263
+ const marketId = this.safeString(ticker, 'id');
264
+ const symbol = this.safeSymbol(marketId, market, undefined, marketType);
265
+ const last = this.safeFloat(ticker, 'buy_price', 0);
266
+ const change = this.safeFloat(ticker, 'change_rate_24h', 0);
267
+ const ask = this.safeFloat(ticker, 'buy_price', 0);
268
+ const bid = this.safeFloat(ticker, 'sell_price', 0);
269
+ const high = this.safeFloat(ticker, 'max_price_24h', 0);
270
+ const low = this.safeFloat(ticker, 'min_price_24h', 0);
255
271
  return this.safeTicker({
256
272
  'symbol': symbol,
257
273
  'timestamp': undefined,
258
274
  'datetime': undefined,
259
- 'high': undefined,
260
- 'low': undefined,
261
- 'bid': undefined,
275
+ 'high': high,
276
+ 'low': low,
277
+ 'bid': bid,
262
278
  'bidVolume': undefined,
263
- 'ask': undefined,
279
+ 'ask': ask,
264
280
  'askVolume': undefined,
265
281
  'vwap': undefined,
266
282
  'open': undefined,
@@ -268,7 +284,7 @@ class hamtapay extends hamtapay$1["default"] {
268
284
  'last': last,
269
285
  'previousClose': undefined,
270
286
  'change': undefined,
271
- 'percentage': percentage,
287
+ 'percentage': change,
272
288
  'average': undefined,
273
289
  'baseVolume': undefined,
274
290
  'quoteVolume': undefined,
@@ -276,15 +292,7 @@ class hamtapay extends hamtapay$1["default"] {
276
292
  }, market);
277
293
  }
278
294
  sign(path, api = 'public', method = 'GET', params = {}, headers = undefined, body = undefined) {
279
- const query = this.omit(params, this.extractParams(path));
280
- let normalizedPath = path;
281
- while (normalizedPath.length && normalizedPath[0] === '/') {
282
- normalizedPath = normalizedPath.slice(1);
283
- }
284
- let url = this.urls['api']['public'] + '/' + this.implodeParams(normalizedPath, params);
285
- if (Object.keys(query).length) {
286
- url += '?' + this.urlencode(query);
287
- }
295
+ const url = this.urls['api']['public'] + '/' + path;
288
296
  headers = {
289
297
  'Content-Type': 'application/json',
290
298
  'Origin': 'https://hamtapay.net',