ccxt-ir 4.13.1 → 4.14.1

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.
@@ -0,0 +1,309 @@
1
+ // ----------------------------------------------------------------------------
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
+ // EDIT THE CORRESPONDENT .ts FILE INSTEAD
6
+
7
+ // ---------------------------------------------------------------------------
8
+ import Exchange from './base/Exchange.js';
9
+ // ---------------------------------------------------------------------------
10
+ /**
11
+ * @class saraf
12
+ * @augments Exchange
13
+ * @description Set rateLimit to 1000 if fully verified
14
+ */
15
+ export default class saraf extends Exchange {
16
+ describe() {
17
+ return this.deepExtend(super.describe(), {
18
+ 'id': 'saraf',
19
+ 'name': 'Saraf',
20
+ 'countries': ['IR'],
21
+ 'rateLimit': 1000,
22
+ 'version': '3',
23
+ 'certified': false,
24
+ 'pro': false,
25
+ 'has': {
26
+ 'CORS': undefined,
27
+ 'spot': false,
28
+ 'margin': false,
29
+ 'swap': false,
30
+ 'future': false,
31
+ 'option': false,
32
+ 'addMargin': false,
33
+ 'cancelAllOrders': false,
34
+ 'cancelOrder': false,
35
+ 'cancelOrders': false,
36
+ 'createDepositAddress': false,
37
+ 'createOrder': false,
38
+ 'createStopLimitOrder': false,
39
+ 'createStopMarketOrder': false,
40
+ 'createStopOrder': false,
41
+ 'editOrder': false,
42
+ 'fetchBalance': false,
43
+ 'fetchBorrowInterest': false,
44
+ 'fetchBorrowRateHistories': false,
45
+ 'fetchBorrowRateHistory': false,
46
+ 'fetchClosedOrders': false,
47
+ 'fetchCrossBorrowRate': false,
48
+ 'fetchCrossBorrowRates': false,
49
+ 'fetchCurrencies': false,
50
+ 'fetchDepositAddress': false,
51
+ 'fetchDeposits': false,
52
+ 'fetchFundingHistory': false,
53
+ 'fetchFundingRate': false,
54
+ 'fetchFundingRateHistory': false,
55
+ 'fetchFundingRates': false,
56
+ 'fetchIndexOHLCV': false,
57
+ 'fetchIsolatedBorrowRate': false,
58
+ 'fetchIsolatedBorrowRates': false,
59
+ 'fetchL2OrderBook': false,
60
+ 'fetchL3OrderBook': false,
61
+ 'fetchLedger': false,
62
+ 'fetchLedgerEntry': false,
63
+ 'fetchLeverageTiers': false,
64
+ 'fetchMarkets': true,
65
+ 'fetchMarkOHLCV': false,
66
+ 'fetchMyTrades': false,
67
+ 'fetchOHLCV': false,
68
+ 'fetchOpenInterestHistory': false,
69
+ 'fetchOpenOrders': false,
70
+ 'fetchOrder': false,
71
+ 'fetchOrderBook': false,
72
+ 'fetchOrders': false,
73
+ 'fetchOrderTrades': 'emulated',
74
+ 'fetchPositions': false,
75
+ 'fetchPremiumIndexOHLCV': false,
76
+ 'fetchTicker': true,
77
+ 'fetchTickers': true,
78
+ 'fetchTime': false,
79
+ 'fetchTrades': false,
80
+ 'fetchTradingFee': false,
81
+ 'fetchTradingFees': false,
82
+ 'fetchWithdrawals': false,
83
+ 'otc': true,
84
+ 'setLeverage': false,
85
+ 'setMarginMode': false,
86
+ 'transfer': false,
87
+ 'withdraw': false,
88
+ },
89
+ 'options': {
90
+ 'defaultType': 'otc',
91
+ },
92
+ 'urls': {
93
+ 'logo': 'https://cdn.arz.digital/cr-odin/img/exchanges/saraf/64x64.png',
94
+ 'api': {
95
+ 'public': 'https://api.saraf.app',
96
+ },
97
+ 'www': 'https://saraf.app',
98
+ 'doc': [
99
+ 'https://saraf.app',
100
+ ],
101
+ },
102
+ 'api': {
103
+ 'public': {
104
+ 'get': {
105
+ 'v1/prices/listed': 1,
106
+ },
107
+ },
108
+ },
109
+ 'fees': {
110
+ 'trading': {
111
+ 'tierBased': false,
112
+ 'percentage': true,
113
+ 'maker': this.parseNumber('0'),
114
+ 'taker': this.parseNumber('0'),
115
+ },
116
+ },
117
+ });
118
+ }
119
+ parseMarket(market) {
120
+ const baseId = this.safeString(market, 's');
121
+ const quoteId = 'IRT';
122
+ const base = this.safeCurrencyCode(baseId);
123
+ const quote = this.safeCurrencyCode(quoteId);
124
+ return {
125
+ 'id': baseId,
126
+ 'symbol': base + '/' + quote,
127
+ 'base': base,
128
+ 'quote': quote,
129
+ 'settle': undefined,
130
+ 'baseId': baseId,
131
+ 'quoteId': quoteId,
132
+ 'settleId': undefined,
133
+ 'type': 'otc',
134
+ 'spot': false,
135
+ 'margin': false,
136
+ 'swap': false,
137
+ 'future': false,
138
+ 'option': false,
139
+ 'active': this.safeBool(market, 'ct', true),
140
+ 'contract': false,
141
+ 'linear': undefined,
142
+ 'inverse': undefined,
143
+ 'contractSize': undefined,
144
+ 'expiry': undefined,
145
+ 'expiryDatetime': undefined,
146
+ 'strike': undefined,
147
+ 'optionType': undefined,
148
+ 'precision': {
149
+ 'amount': undefined,
150
+ 'price': this.safeInteger(market, 'r'),
151
+ },
152
+ 'limits': {
153
+ 'leverage': {
154
+ 'min': undefined,
155
+ 'max': undefined,
156
+ },
157
+ 'amount': {
158
+ 'min': undefined,
159
+ 'max': undefined,
160
+ },
161
+ 'price': {
162
+ 'min': undefined,
163
+ 'max': undefined,
164
+ },
165
+ 'cost': {
166
+ 'min': undefined,
167
+ 'max': undefined,
168
+ },
169
+ },
170
+ 'created': undefined,
171
+ 'info': market,
172
+ };
173
+ }
174
+ async fetchMarkets(params = {}) {
175
+ /**
176
+ * @method
177
+ * @name saraf#fetchMarkets
178
+ * @description retrieves data on all markets for saraf
179
+ * @see https://api.saraf.app/v3/prices/crypto
180
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
181
+ * @returns {object[]} an array of objects representing market data
182
+ */
183
+ const response = await this.publicGetV1PricesListed(params);
184
+ const price = this.safeDict(response, 'price', {});
185
+ const items = this.safeDict(price, 'Items', {});
186
+ const lastUpdateTime = this.safeInteger(price, 'lastUpdateTime');
187
+ const itemKeys = Object.keys(items);
188
+ const result = [];
189
+ for (let i = 0; i < itemKeys.length; i++) {
190
+ const item = this.safeDict(items, itemKeys[i], {});
191
+ item['lastUpdateTime'] = lastUpdateTime;
192
+ const baseId = this.safeString(item, 's');
193
+ if ((baseId === undefined) || (baseId === 'IRT')) {
194
+ continue;
195
+ }
196
+ result.push(this.parseMarket(item));
197
+ }
198
+ return result;
199
+ }
200
+ async fetchTickers(symbols = undefined, params = {}) {
201
+ /**
202
+ * @method
203
+ * @name saraf#fetchTickers
204
+ * @description fetches price tickers for multiple markets
205
+ * @see https://api.saraf.app/v3/prices/crypto
206
+ * @param {string[]|undefined} symbols unified symbols of the markets to fetch the ticker for, all market tickers are returned if not assigned
207
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
208
+ * @returns {object} a dictionary of [ticker structures]{@link https://docs.ccxt.com/#/?id=ticker-structure}
209
+ */
210
+ await this.loadMarkets();
211
+ if (symbols !== undefined) {
212
+ symbols = this.marketSymbols(symbols);
213
+ }
214
+ const response = await this.publicGetV1PricesListed(params);
215
+ const price = this.safeDict(response, 'price', {});
216
+ const items = this.safeDict(price, 'Items', {});
217
+ const lastUpdateTime = this.safeInteger(price, 'lastUpdateTime');
218
+ const itemKeys = Object.keys(items);
219
+ const result = {};
220
+ for (let i = 0; i < itemKeys.length; i++) {
221
+ const item = this.safeDict(items, itemKeys[i], {});
222
+ item['lastUpdateTime'] = lastUpdateTime;
223
+ const baseId = this.safeString(item, 's');
224
+ if ((baseId === undefined) || (baseId === 'IRT') || (baseId === 'FIXED')) {
225
+ continue;
226
+ }
227
+ const ticker = this.parseTicker(item);
228
+ result[ticker['symbol']] = ticker;
229
+ }
230
+ return this.filterByArrayTickers(result, 'symbol', symbols);
231
+ }
232
+ async fetchTicker(symbol, params = {}) {
233
+ /**
234
+ * @method
235
+ * @name saraf#fetchTicker
236
+ * @description fetches a price ticker, a statistical calculation for a specific market
237
+ * @see https://api.saraf.app/v3/prices/crypto
238
+ * @param {string} symbol unified symbol of the market to fetch the ticker for
239
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
240
+ * @returns {object} a [ticker structure]{@link https://docs.ccxt.com/#/?id=ticker-structure}
241
+ */
242
+ const tickers = await this.fetchTickers([symbol], params);
243
+ return tickers[symbol];
244
+ }
245
+ parseTicker(ticker, market = undefined) {
246
+ const baseId = this.safeString(ticker, 's');
247
+ const quoteId = 'IRT';
248
+ const base = this.safeCurrencyCode(baseId);
249
+ const quote = this.safeCurrencyCode(quoteId);
250
+ const symbol = base + '/' + quote;
251
+ const history = this.safeList(ticker, 'h', []);
252
+ let high = undefined;
253
+ let low = undefined;
254
+ let open = undefined;
255
+ if (history.length > 0) {
256
+ high = this.safeNumber(history, 0);
257
+ low = this.safeNumber(history, 0);
258
+ open = this.safeNumber(history, history.length - 1);
259
+ for (let i = 1; i < history.length; i++) {
260
+ const price = this.safeNumber(history, i);
261
+ high = Math.max(high, price);
262
+ low = Math.min(low, price);
263
+ }
264
+ }
265
+ const last = this.safeNumber(ticker, 'p');
266
+ const percentage = this.safeNumber(ticker, 'c');
267
+ const timestamp = this.safeInteger2(ticker, 'ut', 'lastUpdateTime');
268
+ let change = undefined;
269
+ if ((last !== undefined) && (open !== undefined)) {
270
+ change = last - open;
271
+ }
272
+ if (market === undefined) {
273
+ market = this.safeMarketStructure(this.parseMarket(ticker));
274
+ }
275
+ return this.safeTicker({
276
+ 'symbol': symbol,
277
+ 'timestamp': timestamp,
278
+ 'datetime': this.iso8601(timestamp),
279
+ 'high': high,
280
+ 'low': low,
281
+ 'bid': undefined,
282
+ 'bidVolume': undefined,
283
+ 'ask': undefined,
284
+ 'askVolume': undefined,
285
+ 'vwap': undefined,
286
+ 'open': open,
287
+ 'close': last,
288
+ 'last': last,
289
+ 'previousClose': undefined,
290
+ 'change': change,
291
+ 'percentage': percentage,
292
+ 'average': undefined,
293
+ 'baseVolume': undefined,
294
+ 'quoteVolume': undefined,
295
+ 'info': ticker,
296
+ }, market);
297
+ }
298
+ sign(path, api = 'public', method = 'GET', params = {}, headers = undefined, body = undefined) {
299
+ const query = this.omit(params, this.extractParams(path));
300
+ let url = this.urls['api'][api] + '/' + this.implodeParams(path, params);
301
+ if (Object.keys(query).length) {
302
+ url += '?' + this.urlencode(query);
303
+ }
304
+ headers = {
305
+ 'Content-Type': 'application/json',
306
+ };
307
+ return { 'url': url, 'method': method, 'body': body, 'headers': headers };
308
+ }
309
+ }
@@ -5,7 +5,7 @@ export function deflate(data: any, opts: any, cb: any): () => void;
5
5
  * @param opts The compression options
6
6
  * @returns The deflated version of the data
7
7
  */
8
- export function deflateSync(data: any, opts: any): Uint8Array | Uint16Array | Uint32Array;
8
+ export function deflateSync(data: any, opts: any): Uint8Array | Uint32Array | Uint16Array;
9
9
  export function inflate(data: any, opts: any, cb: any): () => void;
10
10
  /**
11
11
  * Expands DEFLATE data with no wrapper
@@ -21,7 +21,7 @@ export function gzip(data: any, opts: any, cb: any): () => void;
21
21
  * @param opts The compression options
22
22
  * @returns The gzipped version of the data
23
23
  */
24
- export function gzipSync(data: any, opts: any): Uint8Array | Uint16Array | Uint32Array;
24
+ export function gzipSync(data: any, opts: any): Uint8Array | Uint32Array | Uint16Array;
25
25
  export function gunzip(data: any, opts: any, cb: any): () => void;
26
26
  /**
27
27
  * Expands GZIP data
@@ -37,7 +37,7 @@ export function zlib(data: any, opts: any, cb: any): () => void;
37
37
  * @param opts The compression options
38
38
  * @returns The zlib-compressed version of the data
39
39
  */
40
- export function zlibSync(data: any, opts: any): Uint8Array | Uint16Array | Uint32Array;
40
+ export function zlibSync(data: any, opts: any): Uint8Array | Uint32Array | Uint16Array;
41
41
  export function unzlib(data: any, opts: any, cb: any): () => void;
42
42
  /**
43
43
  * Expands Zlib data
@@ -61,7 +61,7 @@ export function decompressSync(data: any, out: any): any;
61
61
  * not need to be true unless decoding a binary string.
62
62
  * @returns The string encoded in UTF-8/Latin-1 binary
63
63
  */
64
- export function strToU8(str: any, latin1: any): Uint8Array | Uint16Array | Uint32Array;
64
+ export function strToU8(str: any, latin1: any): Uint8Array | Uint32Array | Uint16Array;
65
65
  /**
66
66
  * Converts a Uint8Array to a string
67
67
  * @param dat The data to decode to string
@@ -69,7 +69,7 @@ export function strToU8(str: any, latin1: any): Uint8Array | Uint16Array | Uint3
69
69
  * not need to be true unless encoding to binary string.
70
70
  * @returns The original UTF-8/Latin-1 string
71
71
  */
72
- export function strFromU8(dat: any, latin1: any): string | Uint8Array | Uint16Array | Uint32Array;
72
+ export function strFromU8(dat: any, latin1: any): string | Uint8Array | Uint32Array | Uint16Array;
73
73
  export function zip(data: any, opts: any, cb: any): () => void;
74
74
  /**
75
75
  * Synchronously creates a ZIP file. Prefer using `zip` for better performance
@@ -15,7 +15,7 @@ export declare class BigInteger {
15
15
  protected intValue(): number;
16
16
  protected byteValue(): number;
17
17
  protected shortValue(): number;
18
- protected signum(): 0 | 1 | -1;
18
+ protected signum(): 1 | 0 | -1;
19
19
  toByteArray(): number[];
20
20
  protected equals(a: BigInteger): boolean;
21
21
  protected min(a: BigInteger): BigInteger;
@@ -1,9 +1,3 @@
1
- // ----------------------------------------------------------------------------
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
- // EDIT THE CORRESPONDENT .ts FILE INSTEAD
6
-
7
1
  declare const _default: string;
8
2
  export declare namespace formatters {
9
3
  function RFC1738(value: any): string;
@@ -1,9 +1,3 @@
1
- // ----------------------------------------------------------------------------
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
- // EDIT THE CORRESPONDENT .ts FILE INSTEAD
6
-
7
1
  import formats = require("./formats.cjs");
8
2
  import parse = require("./parse.cjs");
9
3
  import stringify = require("./stringify.cjs");
@@ -1,8 +1,2 @@
1
- // ----------------------------------------------------------------------------
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
- // EDIT THE CORRESPONDENT .ts FILE INSTEAD
6
-
7
1
  declare function _exports(str: any, opts: any): any;
8
2
  export = _exports;
@@ -1,8 +1,2 @@
1
- // ----------------------------------------------------------------------------
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
- // EDIT THE CORRESPONDENT .ts FILE INSTEAD
6
-
7
1
  declare function _exports(object: any, opts: any): string;
8
2
  export = _exports;
@@ -1,9 +1,3 @@
1
- // ----------------------------------------------------------------------------
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
- // EDIT THE CORRESPONDENT .ts FILE INSTEAD
6
-
7
1
  export function arrayToObject(source: any, options: any): any;
8
2
  export function assign(target: any, source: any): any;
9
3
  export function combine(a: any, b: any): any[];
@@ -1,5 +1,5 @@
1
1
  import { Abi, FunctionAbi, RawArgs } from '../../../types/index.js';
2
2
  import { AbiParserInterface } from './interface.js';
3
3
  export declare function createAbiParser(abi: Abi): AbiParserInterface;
4
- export declare function getAbiVersion(abi: Abi): 0 | 1 | 2;
4
+ export declare function getAbiVersion(abi: Abi): 1 | 0 | 2;
5
5
  export declare function isNoConstructorValid(method: string, argsCalldata: RawArgs, abiMethod?: FunctionAbi): boolean;
package/js/test.js CHANGED
@@ -5,84 +5,80 @@
5
5
  // EDIT THE CORRESPONDENT .ts FILE INSTEAD
6
6
 
7
7
  import ccxt from './ccxt';
8
- async function testhamtapay() {
9
- const exchange = new ccxt.hamtapay({
8
+ async function testsaraf() {
9
+ const exchange = new ccxt.saraf({
10
10
  enableRateLimit: true,
11
11
  timeout: 20000,
12
12
  });
13
13
  try {
14
- const types = ['spot', 'otc'];
15
- for (let i = 0; i < types.length; i++) {
16
- const marketType = types[i];
17
- const params = { 'type': marketType };
18
- const markets = await exchange.fetchMarkets(params);
19
- console.log(marketType + ' markets count:', markets.length);
20
- console.log(marketType + ' first markets:', markets.slice(0, 10).map((market) => ({
21
- symbol: market.symbol,
22
- id: market.id,
23
- type: market.type,
24
- active: market.active,
25
- amountPrecision: market.precision && market.precision.amount,
26
- pricePrecision: market.precision && market.precision.price,
27
- })));
28
- const tickers = await exchange.fetchTickers(undefined, params);
29
- const tickerSymbols = Object.keys(tickers);
30
- console.log(marketType + ' tickers count:', tickerSymbols.length);
31
- const missingFromFetchTickers = [];
32
- const fetchTickerFailures = [];
33
- const sampleTickers = [];
34
- for (let j = 0; j < markets.length; j++) {
35
- const market = markets[j];
36
- const symbol = market.symbol;
37
- const tickerFromBulk = tickers[symbol];
38
- if (tickerFromBulk === undefined) {
39
- missingFromFetchTickers.push(symbol);
40
- continue;
41
- }
42
- if (sampleTickers.length < 10) {
43
- sampleTickers.push({
44
- symbol: tickerFromBulk.symbol,
45
- type: market.type,
46
- last: tickerFromBulk.last,
47
- bid: tickerFromBulk.bid,
48
- ask: tickerFromBulk.ask,
49
- high: tickerFromBulk.high,
50
- low: tickerFromBulk.low,
51
- baseVolume: tickerFromBulk.baseVolume,
52
- quoteVolume: tickerFromBulk.quoteVolume,
53
- });
54
- }
55
- try {
56
- const singleTicker = await exchange.fetchTicker(symbol, params);
57
- console.log('checked ' + marketType + ' ticker:', {
58
- symbol: singleTicker.symbol,
59
- type: market.type,
60
- last: singleTicker.last,
61
- bid: singleTicker.bid,
62
- ask: singleTicker.ask,
63
- });
64
- }
65
- catch (error) {
66
- fetchTickerFailures.push({
67
- symbol,
68
- type: market.type,
69
- message: error instanceof Error ? error.message : String(error),
70
- });
71
- }
14
+ const params = { 'type': 'otc' };
15
+ const markets = await exchange.fetchMarkets(params);
16
+ console.log('saraf markets count:', markets.length);
17
+ console.log('saraf first markets:', markets.slice(0, 10).map((market) => ({
18
+ symbol: market.symbol,
19
+ id: market.id,
20
+ type: market.type,
21
+ active: market.active,
22
+ amountPrecision: market.precision && market.precision.amount,
23
+ pricePrecision: market.precision && market.precision.price,
24
+ })));
25
+ const tickers = await exchange.fetchTickers(undefined, params);
26
+ const tickerSymbols = Object.keys(tickers);
27
+ console.log('saraf tickers count:', tickerSymbols.length);
28
+ const missingFromFetchTickers = [];
29
+ const fetchTickerFailures = [];
30
+ const sampleTickers = [];
31
+ for (let j = 0; j < markets.length; j++) {
32
+ const market = markets[j];
33
+ const symbol = market.symbol;
34
+ const tickerFromBulk = tickers[symbol];
35
+ if (tickerFromBulk === undefined) {
36
+ missingFromFetchTickers.push(symbol);
37
+ continue;
38
+ }
39
+ if (sampleTickers.length < 10) {
40
+ sampleTickers.push({
41
+ symbol: tickerFromBulk.symbol,
42
+ type: market.type,
43
+ last: tickerFromBulk.last,
44
+ bid: tickerFromBulk.bid,
45
+ ask: tickerFromBulk.ask,
46
+ high: tickerFromBulk.high,
47
+ low: tickerFromBulk.low,
48
+ baseVolume: tickerFromBulk.baseVolume,
49
+ quoteVolume: tickerFromBulk.quoteVolume,
50
+ });
51
+ }
52
+ try {
53
+ const singleTicker = await exchange.fetchTicker(symbol, params);
54
+ console.log('checked saraf ticker:', {
55
+ symbol: singleTicker.symbol,
56
+ type: market.type,
57
+ last: singleTicker.last,
58
+ bid: singleTicker.bid,
59
+ ask: singleTicker.ask,
60
+ });
61
+ }
62
+ catch (error) {
63
+ fetchTickerFailures.push({
64
+ symbol,
65
+ type: market.type,
66
+ message: error instanceof Error ? error.message : String(error),
67
+ });
72
68
  }
73
- console.log(marketType + ' sample bulk tickers:', sampleTickers);
74
- console.log(marketType + ' missing from fetchTickers:', missingFromFetchTickers);
75
- console.log(marketType + ' fetchTicker failures:', fetchTickerFailures);
76
- console.log(marketType + ' summary:', {
77
- marketsCount: markets.length,
78
- tickersCount: tickerSymbols.length,
79
- missingFromFetchTickersCount: missingFromFetchTickers.length,
80
- fetchTickerFailuresCount: fetchTickerFailures.length,
81
- });
82
69
  }
70
+ console.log('saraf sample bulk tickers:', sampleTickers);
71
+ console.log('saraf missing from fetchTickers:', missingFromFetchTickers);
72
+ console.log('saraf fetchTicker failures:', fetchTickerFailures);
73
+ console.log('saraf summary:', {
74
+ marketsCount: markets.length,
75
+ tickersCount: tickerSymbols.length,
76
+ missingFromFetchTickersCount: missingFromFetchTickers.length,
77
+ fetchTickerFailuresCount: fetchTickerFailures.length,
78
+ });
83
79
  }
84
80
  catch (error) {
85
- console.error('Error during testing hamtapay:', error);
81
+ console.error('Error during testing saraf:', error);
86
82
  }
87
83
  finally {
88
84
  if (exchange.close) {
@@ -90,4 +86,4 @@ async function testhamtapay() {
90
86
  }
91
87
  }
92
88
  }
93
- testhamtapay();
89
+ testsaraf();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ccxt-ir",
3
- "version": "4.13.1",
3
+ "version": "4.14.1",
4
4
  "description": "A JavaScript / TypeScript / Python / C# / PHP cryptocurrency trading library with support for 100+ exchanges",
5
5
  "unpkg": "dist/ccxt.browser.min.js",
6
6
  "type": "module",