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.
Files changed (99) hide show
  1. package/README.md +8 -12
  2. package/dist/ccxt.browser.min.js +3 -3
  3. package/dist/cjs/ccxt.js +1 -1
  4. package/dist/cjs/src/apex.js +21 -31
  5. package/dist/cjs/src/ascendex.js +26 -5
  6. package/dist/cjs/src/base/Exchange.js +26 -3
  7. package/dist/cjs/src/base/functions/encode.js +1 -1
  8. package/dist/cjs/src/bigone.js +22 -14
  9. package/dist/cjs/src/binance.js +8 -0
  10. package/dist/cjs/src/bingx.js +16 -40
  11. package/dist/cjs/src/bitfinex.js +128 -88
  12. package/dist/cjs/src/bitget.js +60 -71
  13. package/dist/cjs/src/bitmart.js +7 -2
  14. package/dist/cjs/src/bitmex.js +12 -4
  15. package/dist/cjs/src/bitopro.js +5 -1
  16. package/dist/cjs/src/bitrue.js +2 -1
  17. package/dist/cjs/src/bitso.js +1 -1
  18. package/dist/cjs/src/bitteam.js +2 -0
  19. package/dist/cjs/src/bitvavo.js +28 -10
  20. package/dist/cjs/src/btcalpha.js +1 -1
  21. package/dist/cjs/src/btcmarkets.js +1 -1
  22. package/dist/cjs/src/btcturk.js +1 -1
  23. package/dist/cjs/src/bybit.js +34 -16
  24. package/dist/cjs/src/coinbase.js +4 -17
  25. package/dist/cjs/src/coinex.js +1 -0
  26. package/dist/cjs/src/coinlist.js +1 -0
  27. package/dist/cjs/src/coinone.js +1 -0
  28. package/dist/cjs/src/delta.js +4 -0
  29. package/dist/cjs/src/deribit.js +1 -0
  30. package/dist/cjs/src/hollaex.js +1 -0
  31. package/dist/cjs/src/htx.js +9 -5
  32. package/dist/cjs/src/huobijp.js +1 -0
  33. package/dist/cjs/src/hyperliquid.js +16 -0
  34. package/dist/cjs/src/kraken.js +2 -0
  35. package/dist/cjs/src/okx.js +2 -3
  36. package/dist/cjs/src/oxfun.js +21 -1
  37. package/dist/cjs/src/poloniex.js +1 -0
  38. package/dist/cjs/src/pro/binance.js +3 -3
  39. package/dist/cjs/src/pro/coinbase.js +43 -62
  40. package/dist/cjs/src/pro/hyperliquid.js +10 -2
  41. package/dist/cjs/src/pro/upbit.js +43 -0
  42. package/dist/cjs/src/timex.js +2 -2
  43. package/dist/cjs/src/upbit.js +43 -21
  44. package/dist/cjs/src/whitebit.js +65 -12
  45. package/js/ccxt.d.ts +1 -1
  46. package/js/ccxt.js +1 -1
  47. package/js/src/abstract/bitmart.d.ts +1 -0
  48. package/js/src/apex.js +21 -31
  49. package/js/src/ascendex.js +26 -5
  50. package/js/src/base/Exchange.d.ts +2 -1
  51. package/js/src/base/Exchange.js +26 -3
  52. package/js/src/base/functions/encode.d.ts +1 -1
  53. package/js/src/base/functions/encode.js +1 -1
  54. package/js/src/bigone.js +22 -14
  55. package/js/src/binance.js +8 -0
  56. package/js/src/bingx.d.ts +1 -1
  57. package/js/src/bingx.js +16 -40
  58. package/js/src/bitfinex.js +128 -88
  59. package/js/src/bitget.d.ts +1 -0
  60. package/js/src/bitget.js +60 -71
  61. package/js/src/bitmart.d.ts +1 -0
  62. package/js/src/bitmart.js +7 -2
  63. package/js/src/bitmex.js +12 -4
  64. package/js/src/bitopro.js +5 -1
  65. package/js/src/bitrue.js +2 -1
  66. package/js/src/bitso.js +1 -1
  67. package/js/src/bitteam.js +2 -0
  68. package/js/src/bitvavo.js +28 -10
  69. package/js/src/btcalpha.js +1 -1
  70. package/js/src/btcmarkets.js +1 -1
  71. package/js/src/btcturk.js +1 -1
  72. package/js/src/bybit.js +34 -16
  73. package/js/src/coinbase.d.ts +0 -2
  74. package/js/src/coinbase.js +4 -17
  75. package/js/src/coinex.js +1 -0
  76. package/js/src/coinlist.js +1 -0
  77. package/js/src/coinone.js +1 -0
  78. package/js/src/delta.js +4 -0
  79. package/js/src/deribit.js +1 -0
  80. package/js/src/hollaex.js +1 -0
  81. package/js/src/htx.js +9 -5
  82. package/js/src/huobijp.js +1 -0
  83. package/js/src/hyperliquid.js +16 -0
  84. package/js/src/kraken.js +2 -0
  85. package/js/src/okx.js +2 -3
  86. package/js/src/oxfun.d.ts +10 -0
  87. package/js/src/oxfun.js +21 -1
  88. package/js/src/poloniex.js +1 -0
  89. package/js/src/pro/binance.js +3 -3
  90. package/js/src/pro/coinbase.d.ts +4 -3
  91. package/js/src/pro/coinbase.js +43 -60
  92. package/js/src/pro/hyperliquid.js +10 -2
  93. package/js/src/pro/upbit.d.ts +16 -1
  94. package/js/src/pro/upbit.js +43 -0
  95. package/js/src/timex.js +2 -2
  96. package/js/src/upbit.d.ts +42 -20
  97. package/js/src/upbit.js +43 -21
  98. package/js/src/whitebit.js +65 -12
  99. 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.parseNumber(tickSize),
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.safeStringUpper(params, 'network');
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': 'emulated',
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
  // {
@@ -1207,6 +1207,7 @@ export default class poloniex extends Exchange {
1207
1207
  'withdraw': withdrawEnabled,
1208
1208
  'fee': this.parseNumber(feeString),
1209
1209
  'precision': undefined,
1210
+ 'type': 'crypto',
1210
1211
  'limits': {
1211
1212
  'amount': {
1212
1213
  'min': undefined,
@@ -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
  },
@@ -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): 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): any;
111
- handleOrder(client: any, message: any): 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;
@@ -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 + '::' + market['id'];
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 + '::' + marketId);
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 tickers = await this.subscribe(name, false, symbols, params);
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.safeValue(message, 'events', []);
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
- if (messageHash.endsWith('USD')) {
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.safeValue(message, 'events');
475
+ const events = this.safeList(message, 'events');
490
476
  const event = this.safeValue(events, 0);
491
- const trades = this.safeValue(event, 'trades');
492
- const trade = this.safeValue(trades, 0);
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.safeValue(currentEvent, 'trades');
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
- if (marketId.endsWith('USD')) {
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.safeValue(message, 'events');
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.safeValue(event, 'orders');
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 messageHash = 'user::' + marketId;
550
+ const symbol = this.safeSymbol(marketId);
551
+ const messageHash = 'user::' + symbol;
568
552
  client.resolve(this.orders, messageHash);
569
- if (messageHash.endsWith('USD')) {
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.73",
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.safeValue(message, 'events');
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.safeValue(event, 'updates', []);
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
- else if (type === 'update') {
688
- const orderbook = this.orderbooks[symbol];
689
- this.handleOrderBookHelper(orderbook, updates);
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
- return orders[0];
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
- return this.parseOrder(first, market);
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
@@ -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
  /**
@@ -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
  //