ccxt 4.2.44 → 4.2.46
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/CHANGELOG.md +3099 -8415
- package/README.md +4 -4
- package/change.sh +4 -2
- package/dist/ccxt.browser.js +1242 -195
- package/dist/ccxt.browser.min.js +7 -7
- package/dist/cjs/ccxt.js +1 -1
- package/dist/cjs/src/base/Exchange.js +48 -0
- package/dist/cjs/src/base/ws/Cache.js +13 -5
- package/dist/cjs/src/base/ws/OrderBook.js +2 -2
- package/dist/cjs/src/binance.js +407 -21
- package/dist/cjs/src/bingx.js +43 -5
- package/dist/cjs/src/bitfinex2.js +1 -0
- package/dist/cjs/src/bithumb.js +5 -0
- package/dist/cjs/src/bitstamp.js +1 -1
- package/dist/cjs/src/btcturk.js +11 -0
- package/dist/cjs/src/bybit.js +96 -43
- package/dist/cjs/src/coinbase.js +228 -38
- package/dist/cjs/src/coincheck.js +11 -0
- package/dist/cjs/src/coinmate.js +114 -1
- package/dist/cjs/src/coinspot.js +7 -0
- package/dist/cjs/src/cryptocom.js +2 -2
- package/dist/cjs/src/deribit.js +1 -1
- package/dist/cjs/src/hitbtc.js +2 -0
- package/dist/cjs/src/idex.js +60 -1
- package/dist/cjs/src/latoken.js +3 -0
- package/dist/cjs/src/mercado.js +3 -0
- package/dist/cjs/src/oceanex.js +3 -0
- package/dist/cjs/src/okx.js +1 -0
- package/dist/cjs/src/pro/bitget.js +12 -8
- package/dist/cjs/src/pro/bitmart.js +11 -11
- package/dist/cjs/src/pro/bitmex.js +4 -4
- package/dist/cjs/src/pro/cex.js +2 -2
- package/dist/cjs/src/pro/gate.js +76 -42
- package/dist/cjs/src/pro/gemini.js +4 -3
- package/dist/cjs/src/pro/hitbtc.js +1 -0
- package/dist/cjs/src/probit.js +3 -3
- package/dist/cjs/src/timex.js +65 -0
- package/js/ccxt.d.ts +1 -1
- package/js/ccxt.js +1 -1
- package/js/src/abstract/bequant.d.ts +2 -0
- package/js/src/abstract/bitcoincom.d.ts +2 -0
- package/js/src/abstract/bithumb.d.ts +5 -0
- package/js/src/abstract/coinbase.d.ts +1 -0
- package/js/src/abstract/coinmate.d.ts +12 -0
- package/js/src/abstract/fmfwio.d.ts +2 -0
- package/js/src/abstract/hitbtc.d.ts +2 -0
- package/js/src/abstract/hitbtc3.d.ts +2 -0
- package/js/src/abstract/okx.d.ts +1 -0
- package/js/src/base/Exchange.d.ts +12 -6
- package/js/src/base/Exchange.js +48 -0
- package/js/src/base/ws/Cache.d.ts +5 -1
- package/js/src/base/ws/Cache.js +13 -5
- package/js/src/base/ws/OrderBook.d.ts +5 -1
- package/js/src/base/ws/OrderBook.js +3 -3
- package/js/src/binance.d.ts +2 -1
- package/js/src/binance.js +407 -21
- package/js/src/bingx.d.ts +2 -1
- package/js/src/bingx.js +43 -5
- package/js/src/bitfinex2.js +1 -0
- package/js/src/bithumb.js +5 -0
- package/js/src/bitstamp.js +1 -1
- package/js/src/btcturk.js +11 -0
- package/js/src/bybit.d.ts +4 -1
- package/js/src/bybit.js +96 -43
- package/js/src/coinbase.d.ts +10 -4
- package/js/src/coinbase.js +228 -38
- package/js/src/coincheck.js +11 -0
- package/js/src/coinmate.d.ts +3 -1
- package/js/src/coinmate.js +114 -1
- package/js/src/coinspot.js +7 -0
- package/js/src/cryptocom.js +2 -2
- package/js/src/deribit.js +1 -1
- package/js/src/hitbtc.js +2 -0
- package/js/src/idex.d.ts +14 -0
- package/js/src/idex.js +60 -1
- package/js/src/latoken.js +3 -0
- package/js/src/mercado.js +3 -0
- package/js/src/oceanex.js +3 -0
- package/js/src/okx.js +1 -0
- package/js/src/pro/bitget.js +12 -8
- package/js/src/pro/bitmart.js +11 -11
- package/js/src/pro/bitmex.js +4 -4
- package/js/src/pro/cex.js +2 -2
- package/js/src/pro/gate.d.ts +4 -0
- package/js/src/pro/gate.js +76 -42
- package/js/src/pro/gemini.js +4 -3
- package/js/src/pro/hitbtc.js +1 -0
- package/js/src/probit.js +3 -3
- package/js/src/timex.d.ts +14 -0
- package/js/src/timex.js +65 -0
- package/package.json +1 -1
- package/skip-tests.json +4 -0
package/js/src/pro/gate.js
CHANGED
|
@@ -275,6 +275,7 @@ export default class gate extends gateRest {
|
|
|
275
275
|
/**
|
|
276
276
|
* @method
|
|
277
277
|
* @name gate#watchTicker
|
|
278
|
+
* @see https://www.gate.io/docs/developers/apiv4/ws/en/#tickers-channel
|
|
278
279
|
* @description watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
|
|
279
280
|
* @param {string} symbol unified symbol of the market to fetch the ticker for
|
|
280
281
|
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
@@ -283,45 +284,21 @@ export default class gate extends gateRest {
|
|
|
283
284
|
await this.loadMarkets();
|
|
284
285
|
const market = this.market(symbol);
|
|
285
286
|
symbol = market['symbol'];
|
|
286
|
-
|
|
287
|
-
const
|
|
288
|
-
|
|
289
|
-
const [topic, query] = this.handleOptionAndParams(params, 'watchTicker', 'name', 'tickers');
|
|
290
|
-
const channel = messageType + '.' + topic;
|
|
291
|
-
const messageHash = 'ticker:' + symbol;
|
|
292
|
-
const payload = [marketId];
|
|
293
|
-
return await this.subscribePublic(url, messageHash, payload, channel, query);
|
|
287
|
+
params['callerMethodName'] = 'watchTicker';
|
|
288
|
+
const result = await this.watchTickers([symbol], params);
|
|
289
|
+
return this.safeValue(result, symbol);
|
|
294
290
|
}
|
|
295
291
|
async watchTickers(symbols = undefined, params = {}) {
|
|
296
292
|
/**
|
|
297
293
|
* @method
|
|
298
294
|
* @name gate#watchTickers
|
|
295
|
+
* @see https://www.gate.io/docs/developers/apiv4/ws/en/#tickers-channel
|
|
299
296
|
* @description watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for all markets of a specific list
|
|
300
297
|
* @param {string[]} symbols unified symbol of the market to fetch the ticker for
|
|
301
298
|
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
302
299
|
* @returns {object} a [ticker structure]{@link https://docs.ccxt.com/#/?id=ticker-structure}
|
|
303
300
|
*/
|
|
304
|
-
await this.
|
|
305
|
-
symbols = this.marketSymbols(symbols);
|
|
306
|
-
if (symbols === undefined) {
|
|
307
|
-
throw new ArgumentsRequired(this.id + ' watchTickers requires symbols');
|
|
308
|
-
}
|
|
309
|
-
const market = this.market(symbols[0]);
|
|
310
|
-
const messageType = this.getTypeByMarket(market);
|
|
311
|
-
const marketIds = this.marketIds(symbols);
|
|
312
|
-
const [topic, query] = this.handleOptionAndParams(params, 'watchTicker', 'method', 'tickers');
|
|
313
|
-
const channel = messageType + '.' + topic;
|
|
314
|
-
const messageHash = 'tickers';
|
|
315
|
-
const url = this.getUrlByMarket(market);
|
|
316
|
-
const ticker = await this.subscribePublic(url, messageHash, marketIds, channel, query);
|
|
317
|
-
let result = {};
|
|
318
|
-
if (this.newUpdates) {
|
|
319
|
-
result[ticker['symbol']] = ticker;
|
|
320
|
-
}
|
|
321
|
-
else {
|
|
322
|
-
result = this.tickers;
|
|
323
|
-
}
|
|
324
|
-
return this.filterByArray(result, 'symbol', symbols, true);
|
|
301
|
+
return await this.subscribeWatchTickersAndBidsAsks(symbols, 'watchTickers', this.extend({ 'method': 'tickers' }, params));
|
|
325
302
|
}
|
|
326
303
|
handleTicker(client, message) {
|
|
327
304
|
//
|
|
@@ -341,6 +318,24 @@ export default class gate extends gateRest {
|
|
|
341
318
|
// "low_24h": "42721.03"
|
|
342
319
|
// }
|
|
343
320
|
// }
|
|
321
|
+
//
|
|
322
|
+
this.handleTickerAndBidAsk('ticker', client, message);
|
|
323
|
+
}
|
|
324
|
+
async watchBidsAsks(symbols = undefined, params = {}) {
|
|
325
|
+
/**
|
|
326
|
+
* @method
|
|
327
|
+
* @name gate#watchBidsAsks
|
|
328
|
+
* @see https://www.gate.io/docs/developers/apiv4/ws/en/#best-bid-or-ask-price
|
|
329
|
+
* @see https://www.gate.io/docs/developers/apiv4/ws/en/#order-book-channel
|
|
330
|
+
* @description watches best bid & ask for symbols
|
|
331
|
+
* @param {string[]} symbols unified symbol of the market to fetch the ticker for
|
|
332
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
333
|
+
* @returns {object} a [ticker structure]{@link https://docs.ccxt.com/#/?id=ticker-structure}
|
|
334
|
+
*/
|
|
335
|
+
return await this.subscribeWatchTickersAndBidsAsks(symbols, 'watchBidsAsks', this.extend({ 'method': 'book_ticker' }, params));
|
|
336
|
+
}
|
|
337
|
+
handleBidAsk(client, message) {
|
|
338
|
+
//
|
|
344
339
|
// {
|
|
345
340
|
// "time": 1671363004,
|
|
346
341
|
// "time_ms": 1671363004235,
|
|
@@ -357,24 +352,63 @@ export default class gate extends gateRest {
|
|
|
357
352
|
// }
|
|
358
353
|
// }
|
|
359
354
|
//
|
|
355
|
+
this.handleTickerAndBidAsk('bidask', client, message);
|
|
356
|
+
}
|
|
357
|
+
async subscribeWatchTickersAndBidsAsks(symbols = undefined, callerMethodName = undefined, params = {}) {
|
|
358
|
+
await this.loadMarkets();
|
|
359
|
+
[callerMethodName, params] = this.handleParamString(params, 'callerMethodName', callerMethodName);
|
|
360
|
+
symbols = this.marketSymbols(symbols, undefined, false);
|
|
361
|
+
const market = this.market(symbols[0]);
|
|
362
|
+
const messageType = this.getTypeByMarket(market);
|
|
363
|
+
const marketIds = this.marketIds(symbols);
|
|
364
|
+
let channelName = undefined;
|
|
365
|
+
[channelName, params] = this.handleOptionAndParams(params, callerMethodName, 'method');
|
|
366
|
+
const url = this.getUrlByMarket(market);
|
|
367
|
+
const channel = messageType + '.' + channelName;
|
|
368
|
+
const isWatchTickers = callerMethodName.indexOf('watchTicker') >= 0;
|
|
369
|
+
const prefix = isWatchTickers ? 'ticker' : 'bidask';
|
|
370
|
+
const messageHashes = [];
|
|
371
|
+
for (let i = 0; i < symbols.length; i++) {
|
|
372
|
+
const symbol = symbols[i];
|
|
373
|
+
messageHashes.push(prefix + ':' + symbol);
|
|
374
|
+
}
|
|
375
|
+
const tickerOrBidAsk = await this.subscribePublicMultiple(url, messageHashes, marketIds, channel, params);
|
|
376
|
+
if (this.newUpdates) {
|
|
377
|
+
const items = {};
|
|
378
|
+
items[tickerOrBidAsk['symbol']] = tickerOrBidAsk;
|
|
379
|
+
return items;
|
|
380
|
+
}
|
|
381
|
+
const result = isWatchTickers ? this.tickers : this.bidsasks;
|
|
382
|
+
return this.filterByArray(result, 'symbol', symbols, true);
|
|
383
|
+
}
|
|
384
|
+
handleTickerAndBidAsk(objectName, client, message) {
|
|
360
385
|
const channel = this.safeString(message, 'channel');
|
|
361
386
|
const parts = channel.split('.');
|
|
362
387
|
const rawMarketType = this.safeString(parts, 0);
|
|
363
388
|
const marketType = (rawMarketType === 'futures') ? 'contract' : 'spot';
|
|
364
|
-
let
|
|
365
|
-
if (
|
|
366
|
-
|
|
389
|
+
let results = [];
|
|
390
|
+
if (marketType === 'contract') {
|
|
391
|
+
results = this.safeList(message, 'result', []);
|
|
367
392
|
}
|
|
368
|
-
|
|
369
|
-
const
|
|
370
|
-
|
|
393
|
+
else {
|
|
394
|
+
const rawTicker = this.safeDict(message, 'result', {});
|
|
395
|
+
results = [rawTicker];
|
|
396
|
+
}
|
|
397
|
+
const isTicker = (objectName === 'ticker'); // whether ticker or bid-ask
|
|
398
|
+
for (let i = 0; i < results.length; i++) {
|
|
399
|
+
const rawTicker = results[i];
|
|
400
|
+
const marketId = this.safeString(rawTicker, 's');
|
|
371
401
|
const market = this.safeMarket(marketId, undefined, '_', marketType);
|
|
372
|
-
const
|
|
373
|
-
const symbol =
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
402
|
+
const parsedItem = this.parseTicker(rawTicker, market);
|
|
403
|
+
const symbol = parsedItem['symbol'];
|
|
404
|
+
if (isTicker) {
|
|
405
|
+
this.tickers[symbol] = parsedItem;
|
|
406
|
+
}
|
|
407
|
+
else {
|
|
408
|
+
this.bidsasks[symbol] = parsedItem;
|
|
409
|
+
}
|
|
410
|
+
const messageHash = objectName + ':' + symbol;
|
|
411
|
+
client.resolve(parsedItem, messageHash);
|
|
378
412
|
}
|
|
379
413
|
}
|
|
380
414
|
async watchTrades(symbol, since = undefined, limit = undefined, params = {}) {
|
|
@@ -1175,7 +1209,7 @@ export default class gate extends gateRest {
|
|
|
1175
1209
|
'orders': this.handleOrder,
|
|
1176
1210
|
'positions': this.handlePositions,
|
|
1177
1211
|
'tickers': this.handleTicker,
|
|
1178
|
-
'book_ticker': this.
|
|
1212
|
+
'book_ticker': this.handleBidAsk,
|
|
1179
1213
|
'trades': this.handleTrades,
|
|
1180
1214
|
'order_book_update': this.handleOrderBook,
|
|
1181
1215
|
'balances': this.handleBalance,
|
package/js/src/pro/gemini.js
CHANGED
|
@@ -463,10 +463,11 @@ export default class gemini extends geminiRest {
|
|
|
463
463
|
const market = this.safeMarket(marketId.toLowerCase());
|
|
464
464
|
const symbol = market['symbol'];
|
|
465
465
|
const messageHash = 'orderbook:' + symbol;
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
466
|
+
if (!(symbol in this.orderbooks)) {
|
|
467
|
+
const ob = this.orderBook();
|
|
468
|
+
this.orderbooks[symbol] = ob;
|
|
469
469
|
}
|
|
470
|
+
const orderbook = this.orderbooks[symbol];
|
|
470
471
|
const bids = orderbook['bids'];
|
|
471
472
|
const asks = orderbook['asks'];
|
|
472
473
|
for (let i = 0; i < rawOrderBookChanges.length; i++) {
|
package/js/src/pro/hitbtc.js
CHANGED
|
@@ -411,6 +411,7 @@ export default class hitbtc extends hitbtcRest {
|
|
|
411
411
|
const messageHash = channel + '::' + symbol;
|
|
412
412
|
client.resolve(newTickers, messageHash);
|
|
413
413
|
}
|
|
414
|
+
client.resolve(newTickers, 'tickers');
|
|
414
415
|
const messageHashes = this.findMessageHashes(client, 'tickers::');
|
|
415
416
|
for (let i = 0; i < messageHashes.length; i++) {
|
|
416
417
|
const messageHash = messageHashes[i];
|
package/js/src/probit.js
CHANGED
|
@@ -1592,12 +1592,12 @@ export default class probit extends Exchange {
|
|
|
1592
1592
|
const currencyId = this.safeString(transaction, 'currency_id');
|
|
1593
1593
|
const code = this.safeCurrencyCode(currencyId);
|
|
1594
1594
|
const status = this.parseTransactionStatus(this.safeString(transaction, 'status'));
|
|
1595
|
-
const
|
|
1595
|
+
const feeCostString = this.safeString(transaction, 'fee');
|
|
1596
1596
|
let fee = undefined;
|
|
1597
|
-
if (
|
|
1597
|
+
if (feeCostString !== undefined && feeCostString !== '0') {
|
|
1598
1598
|
fee = {
|
|
1599
1599
|
'currency': code,
|
|
1600
|
-
'cost':
|
|
1600
|
+
'cost': this.parseNumber(feeCostString),
|
|
1601
1601
|
};
|
|
1602
1602
|
}
|
|
1603
1603
|
return {
|
package/js/src/timex.d.ts
CHANGED
|
@@ -67,6 +67,20 @@ export default class timex extends Exchange {
|
|
|
67
67
|
parseTrade(trade: any, market?: Market): Trade;
|
|
68
68
|
parseOHLCV(ohlcv: any, market?: Market): OHLCV;
|
|
69
69
|
parseOrder(order: any, market?: Market): Order;
|
|
70
|
+
fetchDepositAddress(code: string, params?: {}): Promise<{
|
|
71
|
+
info: any;
|
|
72
|
+
currency: string;
|
|
73
|
+
address: string;
|
|
74
|
+
tag: any;
|
|
75
|
+
network: any;
|
|
76
|
+
}>;
|
|
77
|
+
parseDepositAddress(depositAddress: any, currency?: Currency): {
|
|
78
|
+
info: any;
|
|
79
|
+
currency: string;
|
|
80
|
+
address: string;
|
|
81
|
+
tag: any;
|
|
82
|
+
network: any;
|
|
83
|
+
};
|
|
70
84
|
sign(path: any, api?: string, method?: string, params?: {}, headers?: any, body?: any): {
|
|
71
85
|
url: string;
|
|
72
86
|
method: string;
|
package/js/src/timex.js
CHANGED
|
@@ -44,6 +44,9 @@ export default class timex extends Exchange {
|
|
|
44
44
|
'fetchCrossBorrowRates': false,
|
|
45
45
|
'fetchCurrencies': true,
|
|
46
46
|
'fetchDeposit': false,
|
|
47
|
+
'fetchDepositAddress': true,
|
|
48
|
+
'fetchDepositAddresses': false,
|
|
49
|
+
'fetchDepositAddressesByNetwork': false,
|
|
47
50
|
'fetchDeposits': true,
|
|
48
51
|
'fetchFundingHistory': false,
|
|
49
52
|
'fetchFundingRate': false,
|
|
@@ -1524,7 +1527,69 @@ export default class timex extends Exchange {
|
|
|
1524
1527
|
'trades': rawTrades,
|
|
1525
1528
|
}, market);
|
|
1526
1529
|
}
|
|
1530
|
+
async fetchDepositAddress(code, params = {}) {
|
|
1531
|
+
/**
|
|
1532
|
+
* @method
|
|
1533
|
+
* @name timex#fetchDepositAddress
|
|
1534
|
+
* @description fetch the deposit address for a currency associated with this account, does not accept params["network"]
|
|
1535
|
+
* @param {string} code unified currency code
|
|
1536
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
1537
|
+
* @returns {object} an [address structure]{@link https://docs.ccxt.com/#/?id=address-structure}
|
|
1538
|
+
*/
|
|
1539
|
+
await this.loadMarkets();
|
|
1540
|
+
const currency = this.currency(code);
|
|
1541
|
+
const request = {
|
|
1542
|
+
'symbol': currency['code'],
|
|
1543
|
+
};
|
|
1544
|
+
const response = await this.currenciesGetSSymbol(this.extend(request, params));
|
|
1545
|
+
//
|
|
1546
|
+
// {
|
|
1547
|
+
// id: '1',
|
|
1548
|
+
// currency: {
|
|
1549
|
+
// symbol: 'BTC',
|
|
1550
|
+
// name: 'Bitcoin',
|
|
1551
|
+
// address: '0x8370fbc6ddec1e18b4e41e72ed943e238458487c',
|
|
1552
|
+
// decimals: '8',
|
|
1553
|
+
// tradeDecimals: '20',
|
|
1554
|
+
// fiatSymbol: 'BTC',
|
|
1555
|
+
// depositEnabled: true,
|
|
1556
|
+
// withdrawalEnabled: true,
|
|
1557
|
+
// transferEnabled: true,
|
|
1558
|
+
// active: true
|
|
1559
|
+
// }
|
|
1560
|
+
// }
|
|
1561
|
+
//
|
|
1562
|
+
const data = this.safeDict(response, 'currency', {});
|
|
1563
|
+
return this.parseDepositAddress(data, currency);
|
|
1564
|
+
}
|
|
1565
|
+
parseDepositAddress(depositAddress, currency = undefined) {
|
|
1566
|
+
//
|
|
1567
|
+
// {
|
|
1568
|
+
// symbol: 'BTC',
|
|
1569
|
+
// name: 'Bitcoin',
|
|
1570
|
+
// address: '0x8370fbc6ddec1e18b4e41e72ed943e238458487c',
|
|
1571
|
+
// decimals: '8',
|
|
1572
|
+
// tradeDecimals: '20',
|
|
1573
|
+
// fiatSymbol: 'BTC',
|
|
1574
|
+
// depositEnabled: true,
|
|
1575
|
+
// withdrawalEnabled: true,
|
|
1576
|
+
// transferEnabled: true,
|
|
1577
|
+
// active: true
|
|
1578
|
+
// }
|
|
1579
|
+
//
|
|
1580
|
+
const currencyId = this.safeString(depositAddress, 'symbol');
|
|
1581
|
+
return {
|
|
1582
|
+
'info': depositAddress,
|
|
1583
|
+
'currency': this.safeCurrencyCode(currencyId, currency),
|
|
1584
|
+
'address': this.safeString(depositAddress, 'address'),
|
|
1585
|
+
'tag': undefined,
|
|
1586
|
+
'network': undefined,
|
|
1587
|
+
};
|
|
1588
|
+
}
|
|
1527
1589
|
sign(path, api = 'public', method = 'GET', params = {}, headers = undefined, body = undefined) {
|
|
1590
|
+
const paramsToExtract = this.extractParams(path);
|
|
1591
|
+
path = this.implodeParams(path, params);
|
|
1592
|
+
params = this.omit(params, paramsToExtract);
|
|
1528
1593
|
let url = this.urls['api']['rest'] + '/' + api + '/' + path;
|
|
1529
1594
|
if (Object.keys(params).length) {
|
|
1530
1595
|
url += '?' + this.urlencodeWithArrayRepeat(params);
|
package/package.json
CHANGED
package/skip-tests.json
CHANGED
|
@@ -356,6 +356,8 @@
|
|
|
356
356
|
}
|
|
357
357
|
},
|
|
358
358
|
"onetrading": {
|
|
359
|
+
"skip": true,
|
|
360
|
+
"until": "2024-02-18",
|
|
359
361
|
"skipWs": true,
|
|
360
362
|
"skipMethods": {
|
|
361
363
|
"fetchOrderBook": "some bid might be lower than next bid",
|
|
@@ -707,6 +709,8 @@
|
|
|
707
709
|
}
|
|
708
710
|
},
|
|
709
711
|
"coinsph": {
|
|
712
|
+
"skip": true,
|
|
713
|
+
"until": "2024-02-20",
|
|
710
714
|
"skipMethods": {
|
|
711
715
|
"loadMarkets": {
|
|
712
716
|
"taker":"messed",
|