ccxt 4.4.78 → 4.4.82
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/README.md +8 -12
- package/dist/ccxt.browser.min.js +3 -3
- package/dist/cjs/ccxt.js +1 -1
- package/dist/cjs/src/apex.js +21 -31
- package/dist/cjs/src/ascendex.js +26 -5
- package/dist/cjs/src/base/Exchange.js +26 -3
- package/dist/cjs/src/base/functions/encode.js +1 -1
- package/dist/cjs/src/bigone.js +22 -14
- package/dist/cjs/src/binance.js +8 -0
- package/dist/cjs/src/bingx.js +16 -40
- package/dist/cjs/src/bitfinex.js +128 -88
- package/dist/cjs/src/bitget.js +60 -71
- package/dist/cjs/src/bitmart.js +7 -2
- package/dist/cjs/src/bitmex.js +12 -4
- package/dist/cjs/src/bitopro.js +5 -1
- package/dist/cjs/src/bitrue.js +2 -1
- package/dist/cjs/src/bitso.js +1 -1
- package/dist/cjs/src/bitteam.js +2 -0
- package/dist/cjs/src/bitvavo.js +28 -10
- package/dist/cjs/src/btcalpha.js +1 -1
- package/dist/cjs/src/btcmarkets.js +1 -1
- package/dist/cjs/src/btcturk.js +1 -1
- package/dist/cjs/src/bybit.js +34 -16
- package/dist/cjs/src/coinbase.js +4 -17
- package/dist/cjs/src/coinex.js +1 -0
- package/dist/cjs/src/coinlist.js +1 -0
- package/dist/cjs/src/coinone.js +1 -0
- package/dist/cjs/src/delta.js +4 -0
- package/dist/cjs/src/deribit.js +1 -0
- package/dist/cjs/src/hollaex.js +1 -0
- package/dist/cjs/src/htx.js +9 -5
- package/dist/cjs/src/huobijp.js +1 -0
- package/dist/cjs/src/hyperliquid.js +16 -0
- package/dist/cjs/src/kraken.js +2 -0
- package/dist/cjs/src/okx.js +2 -3
- package/dist/cjs/src/oxfun.js +21 -1
- package/dist/cjs/src/poloniex.js +1 -0
- package/dist/cjs/src/pro/binance.js +3 -3
- package/dist/cjs/src/pro/coinbase.js +43 -62
- package/dist/cjs/src/pro/hyperliquid.js +10 -2
- package/dist/cjs/src/pro/upbit.js +43 -0
- package/dist/cjs/src/timex.js +2 -2
- package/dist/cjs/src/upbit.js +43 -21
- package/dist/cjs/src/whitebit.js +65 -12
- package/js/ccxt.d.ts +1 -1
- package/js/ccxt.js +1 -1
- package/js/src/abstract/bitmart.d.ts +1 -0
- package/js/src/apex.js +21 -31
- package/js/src/ascendex.js +26 -5
- package/js/src/base/Exchange.d.ts +2 -1
- package/js/src/base/Exchange.js +26 -3
- package/js/src/base/functions/encode.d.ts +1 -1
- package/js/src/base/functions/encode.js +1 -1
- package/js/src/bigone.js +22 -14
- package/js/src/binance.js +8 -0
- package/js/src/bingx.d.ts +1 -1
- package/js/src/bingx.js +16 -40
- package/js/src/bitfinex.js +128 -88
- package/js/src/bitget.d.ts +1 -0
- package/js/src/bitget.js +60 -71
- package/js/src/bitmart.d.ts +1 -0
- package/js/src/bitmart.js +7 -2
- package/js/src/bitmex.js +12 -4
- package/js/src/bitopro.js +5 -1
- package/js/src/bitrue.js +2 -1
- package/js/src/bitso.js +1 -1
- package/js/src/bitteam.js +2 -0
- package/js/src/bitvavo.js +28 -10
- package/js/src/btcalpha.js +1 -1
- package/js/src/btcmarkets.js +1 -1
- package/js/src/btcturk.js +1 -1
- package/js/src/bybit.js +34 -16
- package/js/src/coinbase.d.ts +0 -2
- package/js/src/coinbase.js +4 -17
- package/js/src/coinex.js +1 -0
- package/js/src/coinlist.js +1 -0
- package/js/src/coinone.js +1 -0
- package/js/src/delta.js +4 -0
- package/js/src/deribit.js +1 -0
- package/js/src/hollaex.js +1 -0
- package/js/src/htx.js +9 -5
- package/js/src/huobijp.js +1 -0
- package/js/src/hyperliquid.js +16 -0
- package/js/src/kraken.js +2 -0
- package/js/src/okx.js +2 -3
- package/js/src/oxfun.d.ts +10 -0
- package/js/src/oxfun.js +21 -1
- package/js/src/poloniex.js +1 -0
- package/js/src/pro/binance.js +3 -3
- package/js/src/pro/coinbase.d.ts +4 -3
- package/js/src/pro/coinbase.js +43 -60
- package/js/src/pro/hyperliquid.js +10 -2
- package/js/src/pro/upbit.d.ts +16 -1
- package/js/src/pro/upbit.js +43 -0
- package/js/src/timex.js +2 -2
- package/js/src/upbit.d.ts +42 -20
- package/js/src/upbit.js +43 -21
- package/js/src/whitebit.js +65 -12
- package/package.json +1 -1
package/js/src/kraken.js
CHANGED
|
@@ -861,12 +861,14 @@ export default class kraken extends Exchange {
|
|
|
861
861
|
const precision = this.parseNumber(this.parsePrecision(this.safeString(currency, 'decimals')));
|
|
862
862
|
// assumes all currencies are active except those listed above
|
|
863
863
|
const active = this.safeString(currency, 'status') === 'enabled';
|
|
864
|
+
const isFiat = code.indexOf('.HOLD') >= 0;
|
|
864
865
|
result[code] = {
|
|
865
866
|
'id': id,
|
|
866
867
|
'code': code,
|
|
867
868
|
'info': currency,
|
|
868
869
|
'name': this.safeString(currency, 'altname'),
|
|
869
870
|
'active': active,
|
|
871
|
+
'type': isFiat ? 'fiat' : 'crypto',
|
|
870
872
|
'deposit': undefined,
|
|
871
873
|
'withdraw': undefined,
|
|
872
874
|
'fee': undefined,
|
package/js/src/okx.js
CHANGED
|
@@ -1646,7 +1646,6 @@ export default class okx extends Exchange {
|
|
|
1646
1646
|
}
|
|
1647
1647
|
}
|
|
1648
1648
|
}
|
|
1649
|
-
const tickSize = this.safeString(market, 'tickSz');
|
|
1650
1649
|
const fees = this.safeDict2(this.fees, type, 'trading', {});
|
|
1651
1650
|
let maxLeverage = this.safeString(market, 'lever', '1');
|
|
1652
1651
|
maxLeverage = Precise.stringMax(maxLeverage, '1');
|
|
@@ -1678,7 +1677,7 @@ export default class okx extends Exchange {
|
|
|
1678
1677
|
'created': this.safeInteger(market, 'listTime'),
|
|
1679
1678
|
'precision': {
|
|
1680
1679
|
'amount': this.safeNumber(market, 'lotSz'),
|
|
1681
|
-
'price': this.
|
|
1680
|
+
'price': this.safeNumber(market, 'tickSz'),
|
|
1682
1681
|
},
|
|
1683
1682
|
'limits': {
|
|
1684
1683
|
'leverage': {
|
|
@@ -5078,7 +5077,7 @@ export default class okx extends Exchange {
|
|
|
5078
5077
|
*/
|
|
5079
5078
|
async fetchDepositAddress(code, params = {}) {
|
|
5080
5079
|
await this.loadMarkets();
|
|
5081
|
-
const rawNetwork = this.
|
|
5080
|
+
const rawNetwork = this.safeString(params, 'network'); // some networks are like "Dora Vota Mainnet"
|
|
5082
5081
|
params = this.omit(params, 'network');
|
|
5083
5082
|
code = this.safeCurrencyCode(code);
|
|
5084
5083
|
const network = this.networkIdToCode(rawNetwork, code);
|
package/js/src/oxfun.d.ts
CHANGED
|
@@ -83,6 +83,16 @@ export default class oxfun extends Exchange {
|
|
|
83
83
|
* @returns {Order[]} an array of [funding rate structures]{@link https://docs.ccxt.com/#/?id=funding-rate-structure}
|
|
84
84
|
*/
|
|
85
85
|
fetchFundingRates(symbols?: Strings, params?: {}): Promise<FundingRates>;
|
|
86
|
+
/**
|
|
87
|
+
* @method
|
|
88
|
+
* @name oxfun#fetchFundingRate
|
|
89
|
+
* @description fetch the current funding rates for a symbol
|
|
90
|
+
* @see https://docs.ox.fun/?json#get-v3-funding-estimates
|
|
91
|
+
* @param {string} symbol unified market symbols
|
|
92
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
93
|
+
* @returns {Order[]} an array of [funding rate structures]{@link https://docs.ccxt.com/#/?id=funding-rate-structure}
|
|
94
|
+
*/
|
|
95
|
+
fetchFundingRate(symbol: string, params?: {}): Promise<FundingRate>;
|
|
86
96
|
parseFundingRate(fundingRate: any, market?: Market): FundingRate;
|
|
87
97
|
/**
|
|
88
98
|
* @method
|
package/js/src/oxfun.js
CHANGED
|
@@ -70,7 +70,7 @@ export default class oxfun extends Exchange {
|
|
|
70
70
|
'fetchDepositWithdrawFee': false,
|
|
71
71
|
'fetchDepositWithdrawFees': false,
|
|
72
72
|
'fetchFundingHistory': true,
|
|
73
|
-
'fetchFundingRate':
|
|
73
|
+
'fetchFundingRate': true,
|
|
74
74
|
'fetchFundingRateHistory': true,
|
|
75
75
|
'fetchFundingRates': true,
|
|
76
76
|
'fetchIndexOHLCV': false,
|
|
@@ -1104,6 +1104,26 @@ export default class oxfun extends Exchange {
|
|
|
1104
1104
|
const data = this.safeList(response, 'data', []);
|
|
1105
1105
|
return this.parseFundingRates(data, symbols);
|
|
1106
1106
|
}
|
|
1107
|
+
/**
|
|
1108
|
+
* @method
|
|
1109
|
+
* @name oxfun#fetchFundingRate
|
|
1110
|
+
* @description fetch the current funding rates for a symbol
|
|
1111
|
+
* @see https://docs.ox.fun/?json#get-v3-funding-estimates
|
|
1112
|
+
* @param {string} symbol unified market symbols
|
|
1113
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
1114
|
+
* @returns {Order[]} an array of [funding rate structures]{@link https://docs.ccxt.com/#/?id=funding-rate-structure}
|
|
1115
|
+
*/
|
|
1116
|
+
async fetchFundingRate(symbol, params = {}) {
|
|
1117
|
+
await this.loadMarkets();
|
|
1118
|
+
const request = {
|
|
1119
|
+
'marketCode': this.marketId(symbol),
|
|
1120
|
+
};
|
|
1121
|
+
const response = await this.publicGetV3FundingEstimates(this.extend(request, params));
|
|
1122
|
+
//
|
|
1123
|
+
const data = this.safeList(response, 'data', []);
|
|
1124
|
+
const first = this.safeDict(data, 0, {});
|
|
1125
|
+
return this.parseFundingRate(first, this.market(symbol));
|
|
1126
|
+
}
|
|
1107
1127
|
parseFundingRate(fundingRate, market = undefined) {
|
|
1108
1128
|
//
|
|
1109
1129
|
// {
|
package/js/src/poloniex.js
CHANGED
package/js/src/pro/binance.js
CHANGED
|
@@ -68,12 +68,12 @@ export default class binance extends binanceRest {
|
|
|
68
68
|
'urls': {
|
|
69
69
|
'test': {
|
|
70
70
|
'ws': {
|
|
71
|
-
'spot': 'wss://testnet.binance.vision/ws',
|
|
72
|
-
'margin': 'wss://testnet.binance.vision/ws',
|
|
71
|
+
'spot': 'wss://stream.testnet.binance.vision/ws',
|
|
72
|
+
'margin': 'wss://stream.testnet.binance.vision/ws',
|
|
73
73
|
'future': 'wss://fstream.binancefuture.com/ws',
|
|
74
74
|
'delivery': 'wss://dstream.binancefuture.com/ws',
|
|
75
75
|
'ws-api': {
|
|
76
|
-
'spot': 'wss://testnet.binance.vision/ws-api/v3',
|
|
76
|
+
'spot': 'wss://ws-api.testnet.binance.vision/ws-api/v3',
|
|
77
77
|
'future': 'wss://testnet.binancefuture.com/ws-fapi/v1',
|
|
78
78
|
'delivery': 'wss://testnet.binancefuture.com/ws-dapi/v1',
|
|
79
79
|
},
|
package/js/src/pro/coinbase.d.ts
CHANGED
|
@@ -47,7 +47,7 @@ export default class coinbase extends coinbaseRest {
|
|
|
47
47
|
* @returns {object} a [ticker structure]{@link https://docs.ccxt.com/#/?id=ticker-structure}
|
|
48
48
|
*/
|
|
49
49
|
watchTickers(symbols?: Strings, params?: {}): Promise<Tickers>;
|
|
50
|
-
handleTickers(client: any, message: any):
|
|
50
|
+
handleTickers(client: any, message: any): void;
|
|
51
51
|
parseWsTicker(ticker: any, market?: any): Ticker;
|
|
52
52
|
/**
|
|
53
53
|
* @method
|
|
@@ -107,11 +107,12 @@ export default class coinbase extends coinbaseRest {
|
|
|
107
107
|
* @returns {object} A dictionary of [order book structures]{@link https://docs.ccxt.com/#/?id=order-book-structure} indexed by market symbols
|
|
108
108
|
*/
|
|
109
109
|
watchOrderBookForSymbols(symbols: string[], limit?: Int, params?: {}): Promise<OrderBook>;
|
|
110
|
-
handleTrade(client: any, message: any):
|
|
111
|
-
handleOrder(client: any, message: any):
|
|
110
|
+
handleTrade(client: any, message: any): void;
|
|
111
|
+
handleOrder(client: any, message: any): void;
|
|
112
112
|
parseWsOrder(order: any, market?: any): Order;
|
|
113
113
|
handleOrderBookHelper(orderbook: any, updates: any): void;
|
|
114
114
|
handleOrderBook(client: any, message: any): void;
|
|
115
|
+
tryResolveUsdc(client: any, messageHash: any, result: any): void;
|
|
115
116
|
handleSubscriptionStatus(client: any, message: any): any;
|
|
116
117
|
handleHeartbeats(client: any, message: any): any;
|
|
117
118
|
handleMessage(client: any, message: any): void;
|
package/js/src/pro/coinbase.js
CHANGED
|
@@ -75,7 +75,7 @@ export default class coinbase extends coinbaseRest {
|
|
|
75
75
|
}
|
|
76
76
|
else if (symbol !== undefined) {
|
|
77
77
|
market = this.market(symbol);
|
|
78
|
-
messageHash = name + '::' +
|
|
78
|
+
messageHash = name + '::' + symbol;
|
|
79
79
|
productIds = [market['id']];
|
|
80
80
|
}
|
|
81
81
|
const url = this.urls['api']['ws'];
|
|
@@ -113,7 +113,7 @@ export default class coinbase extends coinbaseRest {
|
|
|
113
113
|
const market = this.market(symbol);
|
|
114
114
|
const marketId = market['id'];
|
|
115
115
|
productIds.push(marketId);
|
|
116
|
-
messageHashes.push(name + '::' +
|
|
116
|
+
messageHashes.push(name + '::' + symbol);
|
|
117
117
|
}
|
|
118
118
|
const url = this.urls['api']['ws'];
|
|
119
119
|
let subscribe = {
|
|
@@ -181,8 +181,11 @@ export default class coinbase extends coinbaseRest {
|
|
|
181
181
|
symbols = this.symbols;
|
|
182
182
|
}
|
|
183
183
|
const name = 'ticker_batch';
|
|
184
|
-
const
|
|
184
|
+
const ticker = await this.subscribeMultiple(name, false, symbols, params);
|
|
185
185
|
if (this.newUpdates) {
|
|
186
|
+
const tickers = {};
|
|
187
|
+
const symbol = ticker['symbol'];
|
|
188
|
+
tickers[symbol] = ticker;
|
|
186
189
|
return tickers;
|
|
187
190
|
}
|
|
188
191
|
return this.tickers;
|
|
@@ -278,7 +281,7 @@ export default class coinbase extends coinbaseRest {
|
|
|
278
281
|
//
|
|
279
282
|
//
|
|
280
283
|
const channel = this.safeString(message, 'channel');
|
|
281
|
-
const events = this.
|
|
284
|
+
const events = this.safeList(message, 'events', []);
|
|
282
285
|
const datetime = this.safeString(message, 'timestamp');
|
|
283
286
|
const timestamp = this.parse8601(datetime);
|
|
284
287
|
const newTickers = [];
|
|
@@ -287,38 +290,21 @@ export default class coinbase extends coinbaseRest {
|
|
|
287
290
|
const tickers = this.safeList(tickersObj, 'tickers', []);
|
|
288
291
|
for (let j = 0; j < tickers.length; j++) {
|
|
289
292
|
const ticker = tickers[j];
|
|
293
|
+
const wsMarketId = this.safeString(ticker, 'product_id');
|
|
294
|
+
if (wsMarketId === undefined) {
|
|
295
|
+
continue;
|
|
296
|
+
}
|
|
290
297
|
const result = this.parseWsTicker(ticker);
|
|
291
298
|
result['timestamp'] = timestamp;
|
|
292
299
|
result['datetime'] = datetime;
|
|
293
300
|
const symbol = result['symbol'];
|
|
294
301
|
this.tickers[symbol] = result;
|
|
295
|
-
const wsMarketId = this.safeString(ticker, 'product_id');
|
|
296
|
-
if (wsMarketId === undefined) {
|
|
297
|
-
continue;
|
|
298
|
-
}
|
|
299
|
-
const messageHash = channel + '::' + wsMarketId;
|
|
300
302
|
newTickers.push(result);
|
|
303
|
+
const messageHash = channel + '::' + symbol;
|
|
301
304
|
client.resolve(result, messageHash);
|
|
302
|
-
|
|
303
|
-
client.resolve(result, messageHash + 'C'); // sometimes we subscribe to BTC/USDC and coinbase returns BTC/USD
|
|
304
|
-
}
|
|
305
|
+
this.tryResolveUsdc(client, messageHash, result);
|
|
305
306
|
}
|
|
306
307
|
}
|
|
307
|
-
const messageHashes = this.findMessageHashes(client, 'ticker_batch::');
|
|
308
|
-
for (let i = 0; i < messageHashes.length; i++) {
|
|
309
|
-
const messageHash = messageHashes[i];
|
|
310
|
-
const parts = messageHash.split('::');
|
|
311
|
-
const symbolsString = parts[1];
|
|
312
|
-
const symbols = symbolsString.split(',');
|
|
313
|
-
const tickers = this.filterByArray(newTickers, 'symbol', symbols);
|
|
314
|
-
if (!this.isEmpty(tickers)) {
|
|
315
|
-
client.resolve(tickers, messageHash);
|
|
316
|
-
if (messageHash.endsWith('USD')) {
|
|
317
|
-
client.resolve(tickers, messageHash + 'C'); // sometimes we subscribe to BTC/USDC and coinbase returns BTC/USD
|
|
318
|
-
}
|
|
319
|
-
}
|
|
320
|
-
}
|
|
321
|
-
return message;
|
|
322
308
|
}
|
|
323
309
|
parseWsTicker(ticker, market = undefined) {
|
|
324
310
|
//
|
|
@@ -486,13 +472,13 @@ export default class coinbase extends coinbaseRest {
|
|
|
486
472
|
// ]
|
|
487
473
|
// }
|
|
488
474
|
//
|
|
489
|
-
const events = this.
|
|
475
|
+
const events = this.safeList(message, 'events');
|
|
490
476
|
const event = this.safeValue(events, 0);
|
|
491
|
-
const trades = this.
|
|
492
|
-
const trade = this.
|
|
477
|
+
const trades = this.safeList(event, 'trades');
|
|
478
|
+
const trade = this.safeDict(trades, 0);
|
|
493
479
|
const marketId = this.safeString(trade, 'product_id');
|
|
494
|
-
const messageHash = 'market_trades::' + marketId;
|
|
495
480
|
const symbol = this.safeSymbol(marketId);
|
|
481
|
+
const messageHash = 'market_trades::' + symbol;
|
|
496
482
|
let tradesArray = this.safeValue(this.trades, symbol);
|
|
497
483
|
if (tradesArray === undefined) {
|
|
498
484
|
const tradesLimit = this.safeInteger(this.options, 'tradesLimit', 1000);
|
|
@@ -501,17 +487,14 @@ export default class coinbase extends coinbaseRest {
|
|
|
501
487
|
}
|
|
502
488
|
for (let i = 0; i < events.length; i++) {
|
|
503
489
|
const currentEvent = events[i];
|
|
504
|
-
const currentTrades = this.
|
|
490
|
+
const currentTrades = this.safeList(currentEvent, 'trades');
|
|
505
491
|
for (let j = 0; j < currentTrades.length; j++) {
|
|
506
492
|
const item = currentTrades[i];
|
|
507
493
|
tradesArray.append(this.parseTrade(item));
|
|
508
494
|
}
|
|
509
495
|
}
|
|
510
496
|
client.resolve(tradesArray, messageHash);
|
|
511
|
-
|
|
512
|
-
client.resolve(tradesArray, messageHash + 'C'); // sometimes we subscribe to BTC/USDC and coinbase returns BTC/USD
|
|
513
|
-
}
|
|
514
|
-
return message;
|
|
497
|
+
this.tryResolveUsdc(client, messageHash, tradesArray);
|
|
515
498
|
}
|
|
516
499
|
handleOrder(client, message) {
|
|
517
500
|
//
|
|
@@ -542,7 +525,7 @@ export default class coinbase extends coinbaseRest {
|
|
|
542
525
|
// ]
|
|
543
526
|
// }
|
|
544
527
|
//
|
|
545
|
-
const events = this.
|
|
528
|
+
const events = this.safeList(message, 'events');
|
|
546
529
|
const marketIds = [];
|
|
547
530
|
if (this.orders === undefined) {
|
|
548
531
|
const limit = this.safeInteger(this.options, 'ordersLimit', 1000);
|
|
@@ -550,7 +533,7 @@ export default class coinbase extends coinbaseRest {
|
|
|
550
533
|
}
|
|
551
534
|
for (let i = 0; i < events.length; i++) {
|
|
552
535
|
const event = events[i];
|
|
553
|
-
const responseOrders = this.
|
|
536
|
+
const responseOrders = this.safeList(event, 'orders');
|
|
554
537
|
for (let j = 0; j < responseOrders.length; j++) {
|
|
555
538
|
const responseOrder = responseOrders[j];
|
|
556
539
|
const parsed = this.parseWsOrder(responseOrder);
|
|
@@ -564,14 +547,12 @@ export default class coinbase extends coinbaseRest {
|
|
|
564
547
|
}
|
|
565
548
|
for (let i = 0; i < marketIds.length; i++) {
|
|
566
549
|
const marketId = marketIds[i];
|
|
567
|
-
const
|
|
550
|
+
const symbol = this.safeSymbol(marketId);
|
|
551
|
+
const messageHash = 'user::' + symbol;
|
|
568
552
|
client.resolve(this.orders, messageHash);
|
|
569
|
-
|
|
570
|
-
client.resolve(this.orders, messageHash + 'C'); // sometimes we subscribe to BTC/USDC and coinbase returns BTC/USD
|
|
571
|
-
}
|
|
553
|
+
this.tryResolveUsdc(client, messageHash, this.orders);
|
|
572
554
|
}
|
|
573
555
|
client.resolve(this.orders, 'user');
|
|
574
|
-
return message;
|
|
575
556
|
}
|
|
576
557
|
parseWsOrder(order, market = undefined) {
|
|
577
558
|
//
|
|
@@ -648,7 +629,7 @@ export default class coinbase extends coinbaseRest {
|
|
|
648
629
|
// {
|
|
649
630
|
// "side": "bid",
|
|
650
631
|
// "event_time": "1970-01-01T00:00:00Z",
|
|
651
|
-
// "price_level": "21921.
|
|
632
|
+
// "price_level": "21921.74",
|
|
652
633
|
// "new_quantity": "0.06317902"
|
|
653
634
|
// },
|
|
654
635
|
// {
|
|
@@ -662,36 +643,38 @@ export default class coinbase extends coinbaseRest {
|
|
|
662
643
|
// ]
|
|
663
644
|
// }
|
|
664
645
|
//
|
|
665
|
-
const events = this.
|
|
646
|
+
const events = this.safeList(message, 'events');
|
|
666
647
|
const datetime = this.safeString(message, 'timestamp');
|
|
667
648
|
for (let i = 0; i < events.length; i++) {
|
|
668
649
|
const event = events[i];
|
|
669
|
-
const updates = this.
|
|
650
|
+
const updates = this.safeList(event, 'updates', []);
|
|
670
651
|
const marketId = this.safeString(event, 'product_id');
|
|
671
652
|
// sometimes we subscribe to BTC/USDC and coinbase returns BTC/USD, as they are aliases
|
|
672
653
|
const market = this.safeMarket(marketId);
|
|
673
|
-
const messageHash = 'level2::' + market['id'];
|
|
674
654
|
const symbol = market['symbol'];
|
|
655
|
+
const messageHash = 'level2::' + symbol;
|
|
675
656
|
const subscription = this.safeValue(client.subscriptions, messageHash, {});
|
|
676
657
|
const limit = this.safeInteger(subscription, 'limit');
|
|
677
658
|
const type = this.safeString(event, 'type');
|
|
678
659
|
if (type === 'snapshot') {
|
|
679
660
|
this.orderbooks[symbol] = this.orderBook({}, limit);
|
|
680
|
-
const orderbook = this.orderbooks[symbol];
|
|
681
|
-
this.handleOrderBookHelper(orderbook, updates);
|
|
682
|
-
orderbook['timestamp'] = this.parse8601(datetime);
|
|
683
|
-
orderbook['datetime'] = datetime;
|
|
684
|
-
orderbook['symbol'] = symbol;
|
|
685
|
-
client.resolve(orderbook, messageHash);
|
|
686
661
|
}
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
orderbook['datetime'] = datetime;
|
|
691
|
-
orderbook['timestamp'] = this.parse8601(datetime);
|
|
692
|
-
orderbook['symbol'] = symbol;
|
|
693
|
-
client.resolve(orderbook, messageHash);
|
|
662
|
+
// unknown bug, can't reproduce, but sometimes orderbook is undefined
|
|
663
|
+
if (!(symbol in this.orderbooks) && this.orderbooks[symbol] === undefined) {
|
|
664
|
+
continue;
|
|
694
665
|
}
|
|
666
|
+
const orderbook = this.orderbooks[symbol];
|
|
667
|
+
this.handleOrderBookHelper(orderbook, updates);
|
|
668
|
+
orderbook['timestamp'] = this.parse8601(datetime);
|
|
669
|
+
orderbook['datetime'] = datetime;
|
|
670
|
+
orderbook['symbol'] = symbol;
|
|
671
|
+
client.resolve(orderbook, messageHash);
|
|
672
|
+
this.tryResolveUsdc(client, messageHash, orderbook);
|
|
673
|
+
}
|
|
674
|
+
}
|
|
675
|
+
tryResolveUsdc(client, messageHash, result) {
|
|
676
|
+
if (messageHash.endsWith('/USD') || messageHash.endsWith('-USD')) {
|
|
677
|
+
client.resolve(result, messageHash + 'C'); // when subscribing to BTC/USDC and coinbase returns BTC/USD, so resolve USDC too
|
|
695
678
|
}
|
|
696
679
|
}
|
|
697
680
|
handleSubscriptionStatus(client, message) {
|
|
@@ -98,7 +98,11 @@ export default class hyperliquid extends hyperliquidRest {
|
|
|
98
98
|
await this.loadMarkets();
|
|
99
99
|
const [order, globalParams] = this.parseCreateEditOrderArgs(undefined, symbol, type, side, amount, price, params);
|
|
100
100
|
const orders = await this.createOrdersWs([order], globalParams);
|
|
101
|
-
|
|
101
|
+
const parsedOrder = orders[0];
|
|
102
|
+
const orderInfo = this.safeDict(parsedOrder, 'info');
|
|
103
|
+
// handle potential error here
|
|
104
|
+
this.handleErrors(undefined, undefined, undefined, undefined, undefined, this.json(orderInfo), orderInfo, undefined, undefined);
|
|
105
|
+
return parsedOrder;
|
|
102
106
|
}
|
|
103
107
|
/**
|
|
104
108
|
* @method
|
|
@@ -135,7 +139,11 @@ export default class hyperliquid extends hyperliquidRest {
|
|
|
135
139
|
const dataObject = this.safeDict(responseObject, 'data', {});
|
|
136
140
|
const statuses = this.safeList(dataObject, 'statuses', []);
|
|
137
141
|
const first = this.safeDict(statuses, 0, {});
|
|
138
|
-
|
|
142
|
+
const parsedOrder = this.parseOrder(first, market);
|
|
143
|
+
const orderInfo = this.safeDict(parsedOrder, 'info');
|
|
144
|
+
// handle potential error here
|
|
145
|
+
this.handleErrors(undefined, undefined, undefined, undefined, undefined, this.json(orderInfo), orderInfo, undefined, undefined);
|
|
146
|
+
return parsedOrder;
|
|
139
147
|
}
|
|
140
148
|
/**
|
|
141
149
|
* @method
|
package/js/src/pro/upbit.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import upbitRest from '../upbit.js';
|
|
2
|
-
import type { Int, Str, Order, OrderBook, Trade, Ticker, Balances, Tickers, Strings } from '../base/types.js';
|
|
2
|
+
import type { Int, Str, Order, OrderBook, Trade, Ticker, Balances, Tickers, Strings, OHLCV } from '../base/types.js';
|
|
3
3
|
import Client from '../base/ws/Client.js';
|
|
4
4
|
export default class upbit extends upbitRest {
|
|
5
5
|
describe(): any;
|
|
@@ -60,9 +60,24 @@ export default class upbit extends upbitRest {
|
|
|
60
60
|
* @returns {object} A dictionary of [order book structures]{@link https://docs.ccxt.com/#/?id=order-book-structure} indexed by market symbols
|
|
61
61
|
*/
|
|
62
62
|
watchOrderBook(symbol: string, limit?: Int, params?: {}): Promise<OrderBook>;
|
|
63
|
+
/**
|
|
64
|
+
* @method
|
|
65
|
+
* @name upbit#watchOHLCV
|
|
66
|
+
* @description watches information an OHLCV with timestamp, openingPrice, highPrice, lowPrice, tradePrice, baseVolume in 1s.
|
|
67
|
+
* @see https://docs.upbit.com/kr/reference/websocket-candle for Upbit KR
|
|
68
|
+
* @see https://global-docs.upbit.com/reference/websocket-candle for Upbit Global
|
|
69
|
+
* @param {string} symbol unified market symbol of the market orders were made in
|
|
70
|
+
* @param {string} timeframe specifies the OHLCV candle interval to watch. As of now, Upbit only supports 1s candles.
|
|
71
|
+
* @param {int} [since] the earliest time in ms to fetch orders for
|
|
72
|
+
* @param {int} [limit] the maximum number of order structures to retrieve
|
|
73
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
74
|
+
* @returns {OHLCV[]} a list of [OHLCV structures]{@link https://docs.ccxt.com/#/?id=ohlcv-structure}
|
|
75
|
+
*/
|
|
76
|
+
watchOHLCV(symbol: string, timeframe?: string, since?: Int, limit?: Int, params?: {}): Promise<OHLCV[]>;
|
|
63
77
|
handleTicker(client: Client, message: any): void;
|
|
64
78
|
handleOrderBook(client: Client, message: any): void;
|
|
65
79
|
handleTrades(client: Client, message: any): void;
|
|
80
|
+
handleOHLCV(client: Client, message: any): void;
|
|
66
81
|
authenticate(params?: {}): Promise<import("../base/ws/WsClient.js").default>;
|
|
67
82
|
watchPrivate(symbol: any, channel: any, messageHash: any, params?: {}): Promise<any>;
|
|
68
83
|
/**
|
package/js/src/pro/upbit.js
CHANGED
|
@@ -9,6 +9,7 @@ import upbitRest from '../upbit.js';
|
|
|
9
9
|
import { ArrayCache, ArrayCacheBySymbolById } from '../base/ws/Cache.js';
|
|
10
10
|
import { sha256 } from '../static_dependencies/noble-hashes/sha256.js';
|
|
11
11
|
import { jwt } from '../base/functions/rsa.js';
|
|
12
|
+
import { NotSupported } from '../base/errors.js';
|
|
12
13
|
// ---------------------------------------------------------------------------
|
|
13
14
|
export default class upbit extends upbitRest {
|
|
14
15
|
describe() {
|
|
@@ -20,6 +21,7 @@ export default class upbit extends upbitRest {
|
|
|
20
21
|
'watchTickers': true,
|
|
21
22
|
'watchTrades': true,
|
|
22
23
|
'watchTradesForSymbols': true,
|
|
24
|
+
'watchOHLCV': true,
|
|
23
25
|
'watchOrders': true,
|
|
24
26
|
'watchMyTrades': true,
|
|
25
27
|
'watchBalance': true,
|
|
@@ -195,6 +197,26 @@ export default class upbit extends upbitRest {
|
|
|
195
197
|
const orderbook = await this.watchPublic(symbol, 'orderbook');
|
|
196
198
|
return orderbook.limit();
|
|
197
199
|
}
|
|
200
|
+
/**
|
|
201
|
+
* @method
|
|
202
|
+
* @name upbit#watchOHLCV
|
|
203
|
+
* @description watches information an OHLCV with timestamp, openingPrice, highPrice, lowPrice, tradePrice, baseVolume in 1s.
|
|
204
|
+
* @see https://docs.upbit.com/kr/reference/websocket-candle for Upbit KR
|
|
205
|
+
* @see https://global-docs.upbit.com/reference/websocket-candle for Upbit Global
|
|
206
|
+
* @param {string} symbol unified market symbol of the market orders were made in
|
|
207
|
+
* @param {string} timeframe specifies the OHLCV candle interval to watch. As of now, Upbit only supports 1s candles.
|
|
208
|
+
* @param {int} [since] the earliest time in ms to fetch orders for
|
|
209
|
+
* @param {int} [limit] the maximum number of order structures to retrieve
|
|
210
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
211
|
+
* @returns {OHLCV[]} a list of [OHLCV structures]{@link https://docs.ccxt.com/#/?id=ohlcv-structure}
|
|
212
|
+
*/
|
|
213
|
+
async watchOHLCV(symbol, timeframe = '1s', since = undefined, limit = undefined, params = {}) {
|
|
214
|
+
if (timeframe !== '1s') {
|
|
215
|
+
throw new NotSupported(this.id + ' watchOHLCV does not support' + timeframe + ' candle.');
|
|
216
|
+
}
|
|
217
|
+
const timeFrameOHLCV = 'candle.' + timeframe;
|
|
218
|
+
return await this.watchPublic(symbol, timeFrameOHLCV);
|
|
219
|
+
}
|
|
198
220
|
handleTicker(client, message) {
|
|
199
221
|
// 2020-03-17T23:07:36.511Z "onMessage" <Buffer 7b 22 74 79 70 65 22 3a 22 74 69 63 6b 65 72 22 2c 22 63 6f 64 65 22 3a 22 42 54 43 2d 45 54 48 22 2c 22 6f 70 65 6e 69 6e 67 5f 70 72 69 63 65 22 3a ... >
|
|
200
222
|
// { type: "ticker",
|
|
@@ -321,6 +343,26 @@ export default class upbit extends upbitRest {
|
|
|
321
343
|
const messageHash = 'trade:' + marketId;
|
|
322
344
|
client.resolve(stored, messageHash);
|
|
323
345
|
}
|
|
346
|
+
handleOHLCV(client, message) {
|
|
347
|
+
// {
|
|
348
|
+
// type: 'candle.1s',
|
|
349
|
+
// code: 'KRW-USDT',
|
|
350
|
+
// candle_date_time_utc: '2025-04-22T09:50:34',
|
|
351
|
+
// candle_date_time_kst: '2025-04-22T18:50:34',
|
|
352
|
+
// opening_price: 1438,
|
|
353
|
+
// high_price: 1438,
|
|
354
|
+
// low_price: 1438,
|
|
355
|
+
// trade_price: 1438,
|
|
356
|
+
// candle_acc_trade_volume: 1145.8935,
|
|
357
|
+
// candle_acc_trade_price: 1647794.853,
|
|
358
|
+
// timestamp: 1745315434125,
|
|
359
|
+
// stream_type: 'REALTIME'
|
|
360
|
+
// }
|
|
361
|
+
const marketId = this.safeString(message, 'code');
|
|
362
|
+
const messageHash = 'candle.1s:' + marketId;
|
|
363
|
+
const ohlcv = this.parseOHLCV(message);
|
|
364
|
+
client.resolve(ohlcv, messageHash);
|
|
365
|
+
}
|
|
324
366
|
async authenticate(params = {}) {
|
|
325
367
|
this.checkRequiredCredentials();
|
|
326
368
|
const wsOptions = this.safeDict(this.options, 'ws', {});
|
|
@@ -636,6 +678,7 @@ export default class upbit extends upbitRest {
|
|
|
636
678
|
'trade': this.handleTrades,
|
|
637
679
|
'myOrder': this.handleMyOrder,
|
|
638
680
|
'myAsset': this.handleBalance,
|
|
681
|
+
'candle.1s': this.handleOHLCV,
|
|
639
682
|
};
|
|
640
683
|
const methodName = this.safeString(message, 'type');
|
|
641
684
|
const method = this.safeValue(methods, methodName);
|
package/js/src/timex.js
CHANGED
|
@@ -1556,7 +1556,7 @@ export default class timex extends Exchange {
|
|
|
1556
1556
|
'currency': feeCurrency,
|
|
1557
1557
|
};
|
|
1558
1558
|
}
|
|
1559
|
-
return {
|
|
1559
|
+
return this.safeTrade({
|
|
1560
1560
|
'info': trade,
|
|
1561
1561
|
'id': id,
|
|
1562
1562
|
'timestamp': timestamp,
|
|
@@ -1570,7 +1570,7 @@ export default class timex extends Exchange {
|
|
|
1570
1570
|
'cost': cost,
|
|
1571
1571
|
'takerOrMaker': takerOrMaker,
|
|
1572
1572
|
'fee': fee,
|
|
1573
|
-
};
|
|
1573
|
+
});
|
|
1574
1574
|
}
|
|
1575
1575
|
parseOHLCV(ohlcv, market = undefined) {
|
|
1576
1576
|
//
|