ccxt 4.5.18 → 4.5.20

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 (152) hide show
  1. package/README.md +7 -6
  2. package/dist/ccxt.browser.min.js +40 -16
  3. package/dist/cjs/_virtual/index.cjs.js +1459 -9
  4. package/dist/cjs/ccxt.js +8 -2
  5. package/dist/cjs/src/abstract/dydx.js +11 -0
  6. package/dist/cjs/src/base/Exchange.js +164 -10
  7. package/dist/cjs/src/base/ws/Client.js +3 -1
  8. package/dist/cjs/src/binance.js +8 -1
  9. package/dist/cjs/src/bingx.js +20 -0
  10. package/dist/cjs/src/bitget.js +43 -41
  11. package/dist/cjs/src/bybit.js +21 -23
  12. package/dist/cjs/src/deribit.js +6 -0
  13. package/dist/cjs/src/dydx.js +2454 -0
  14. package/dist/cjs/src/gate.js +4 -4
  15. package/dist/cjs/src/hibachi.js +1 -1
  16. package/dist/cjs/src/hyperliquid.js +207 -9
  17. package/dist/cjs/src/kucoin.js +711 -109
  18. package/dist/cjs/src/mexc.js +2 -3
  19. package/dist/cjs/src/pro/binance.js +59 -144
  20. package/dist/cjs/src/pro/dydx.js +418 -0
  21. package/dist/cjs/src/pro/kraken.js +4 -3
  22. package/dist/cjs/src/pro/xt.js +218 -4
  23. package/dist/cjs/src/protobuf/mexc/compiled.cjs.js +1 -0
  24. package/dist/cjs/src/static_dependencies/dydx-v4-client/cosmos/base/v1beta1/coin.js +56 -0
  25. package/dist/cjs/src/static_dependencies/dydx-v4-client/cosmos/crypto/multisig/v1beta1/multisig.js +56 -0
  26. package/dist/cjs/src/static_dependencies/dydx-v4-client/cosmos/crypto/secp256k1/keys.js +48 -0
  27. package/dist/cjs/src/static_dependencies/dydx-v4-client/cosmos/tx/signing/v1beta1/signing.js +343 -0
  28. package/dist/cjs/src/static_dependencies/dydx-v4-client/cosmos/tx/v1beta1/tx.js +717 -0
  29. package/dist/cjs/src/static_dependencies/dydx-v4-client/dydxprotocol/accountplus/tx.js +60 -0
  30. package/dist/cjs/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/clob_pair.js +45 -0
  31. package/dist/cjs/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/order.js +380 -0
  32. package/dist/cjs/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/order_removals.js +72 -0
  33. package/dist/cjs/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/tx.js +211 -0
  34. package/dist/cjs/src/static_dependencies/dydx-v4-client/dydxprotocol/sending/transfer.js +195 -0
  35. package/dist/cjs/src/static_dependencies/dydx-v4-client/dydxprotocol/sending/tx.js +49 -0
  36. package/dist/cjs/src/static_dependencies/dydx-v4-client/dydxprotocol/subaccounts/subaccount.js +57 -0
  37. package/dist/cjs/src/static_dependencies/dydx-v4-client/google/protobuf/any.js +56 -0
  38. package/dist/cjs/src/static_dependencies/dydx-v4-client/helpers.js +79 -0
  39. package/dist/cjs/src/static_dependencies/dydx-v4-client/long/index.cjs.js +9 -0
  40. package/dist/cjs/src/static_dependencies/dydx-v4-client/onboarding.js +59 -0
  41. package/dist/cjs/src/static_dependencies/dydx-v4-client/registry.js +39 -0
  42. package/dist/cjs/src/static_dependencies/noble-hashes/pbkdf2.js +69 -0
  43. package/dist/cjs/src/static_dependencies/noble-hashes/ripemd160.js +108 -0
  44. package/dist/cjs/src/static_dependencies/noble-hashes/utils.js +50 -1
  45. package/dist/cjs/src/static_dependencies/scure-base/index.js +29 -0
  46. package/dist/cjs/src/static_dependencies/scure-bip32/index.js +278 -0
  47. package/dist/cjs/src/static_dependencies/scure-bip39/index.js +97 -0
  48. package/dist/cjs/src/static_dependencies/scure-bip39/wordlists/english.js +2060 -0
  49. package/dist/cjs/src/static_dependencies/zklink/zklink-sdk-web.js +2 -0
  50. package/dist/cjs/src/toobit.js +2 -1
  51. package/js/ccxt.d.ts +8 -2
  52. package/js/ccxt.js +6 -2
  53. package/js/src/abstract/binance.d.ts +7 -0
  54. package/js/src/abstract/binancecoinm.d.ts +7 -0
  55. package/js/src/abstract/binanceus.d.ts +7 -0
  56. package/js/src/abstract/binanceusdm.d.ts +7 -0
  57. package/js/src/abstract/bitget.d.ts +1 -0
  58. package/js/src/abstract/dydx.d.ts +61 -0
  59. package/js/src/abstract/dydx.js +11 -0
  60. package/js/src/abstract/kucoin.d.ts +1 -1
  61. package/js/src/abstract/kucoinfutures.d.ts +1 -1
  62. package/js/src/base/Exchange.d.ts +7 -0
  63. package/js/src/base/Exchange.js +163 -10
  64. package/js/src/base/ws/Client.js +3 -1
  65. package/js/src/binance.js +8 -1
  66. package/js/src/bingx.js +20 -0
  67. package/js/src/bitget.d.ts +3 -3
  68. package/js/src/bitget.js +43 -41
  69. package/js/src/bybit.d.ts +3 -3
  70. package/js/src/bybit.js +21 -23
  71. package/js/src/deribit.js +6 -0
  72. package/js/src/dydx.d.ts +364 -0
  73. package/js/src/dydx.js +2453 -0
  74. package/js/src/gate.d.ts +2 -2
  75. package/js/src/gate.js +4 -4
  76. package/js/src/hibachi.js +1 -1
  77. package/js/src/hyperliquid.d.ts +17 -0
  78. package/js/src/hyperliquid.js +207 -9
  79. package/js/src/kucoin.d.ts +48 -1
  80. package/js/src/kucoin.js +711 -109
  81. package/js/src/mexc.js +2 -3
  82. package/js/src/pro/binance.d.ts +2 -2
  83. package/js/src/pro/binance.js +59 -144
  84. package/js/src/pro/dydx.d.ts +81 -0
  85. package/js/src/pro/dydx.js +417 -0
  86. package/js/src/pro/kraken.js +4 -3
  87. package/js/src/pro/xt.d.ts +85 -2
  88. package/js/src/pro/xt.js +218 -4
  89. package/js/src/static_dependencies/dydx-v4-client/cosmos/base/v1beta1/coin.d.ts +90 -0
  90. package/js/src/static_dependencies/dydx-v4-client/cosmos/base/v1beta1/coin.js +163 -0
  91. package/js/src/static_dependencies/dydx-v4-client/cosmos/crypto/multisig/keys.d.ts +26 -0
  92. package/js/src/static_dependencies/dydx-v4-client/cosmos/crypto/multisig/keys.js +51 -0
  93. package/js/src/static_dependencies/dydx-v4-client/cosmos/crypto/multisig/v1beta1/multisig.d.ts +48 -0
  94. package/js/src/static_dependencies/dydx-v4-client/cosmos/crypto/multisig/v1beta1/multisig.js +85 -0
  95. package/js/src/static_dependencies/dydx-v4-client/cosmos/crypto/secp256k1/keys.d.ts +40 -0
  96. package/js/src/static_dependencies/dydx-v4-client/cosmos/crypto/secp256k1/keys.js +77 -0
  97. package/js/src/static_dependencies/dydx-v4-client/cosmos/tx/signing/v1beta1/signing.d.ts +162 -0
  98. package/js/src/static_dependencies/dydx-v4-client/cosmos/tx/signing/v1beta1/signing.js +329 -0
  99. package/js/src/static_dependencies/dydx-v4-client/cosmos/tx/v1beta1/tx.d.ts +460 -0
  100. package/js/src/static_dependencies/dydx-v4-client/cosmos/tx/v1beta1/tx.js +698 -0
  101. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/accountplus/tx.d.ts +127 -0
  102. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/accountplus/tx.js +286 -0
  103. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/block_rate_limit_config.d.ts +66 -0
  104. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/block_rate_limit_config.js +109 -0
  105. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/clob_pair.d.ts +127 -0
  106. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/clob_pair.js +257 -0
  107. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/equity_tier_limit_config.d.ts +48 -0
  108. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/equity_tier_limit_config.js +93 -0
  109. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/finalize_block.d.ts +23 -0
  110. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/finalize_block.js +43 -0
  111. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/liquidations.d.ts +92 -0
  112. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/liquidations.js +164 -0
  113. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/liquidations_config.d.ts +124 -0
  114. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/liquidations_config.js +196 -0
  115. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/matches.d.ts +159 -0
  116. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/matches.js +324 -0
  117. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/order.d.ts +546 -0
  118. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/order.js +872 -0
  119. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/order_removals.d.ts +84 -0
  120. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/order_removals.js +181 -0
  121. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/tx.d.ts +397 -0
  122. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/tx.js +757 -0
  123. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/sending/transfer.d.ts +120 -0
  124. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/sending/transfer.js +246 -0
  125. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/sending/tx.d.ts +79 -0
  126. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/sending/tx.js +147 -0
  127. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/subaccounts/asset_position.d.ts +32 -0
  128. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/subaccounts/asset_position.js +59 -0
  129. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/subaccounts/perpetual_position.d.ts +34 -0
  130. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/subaccounts/perpetual_position.js +66 -0
  131. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/subaccounts/subaccount.d.ts +62 -0
  132. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/subaccounts/subaccount.js +111 -0
  133. package/js/src/static_dependencies/dydx-v4-client/google/protobuf/any.d.ts +207 -0
  134. package/js/src/static_dependencies/dydx-v4-client/google/protobuf/any.js +50 -0
  135. package/js/src/static_dependencies/dydx-v4-client/helpers.d.ts +82 -0
  136. package/js/src/static_dependencies/dydx-v4-client/helpers.js +172 -0
  137. package/js/src/static_dependencies/dydx-v4-client/long/index.cjs +1473 -0
  138. package/js/src/static_dependencies/dydx-v4-client/long/index.d.cts +2 -0
  139. package/js/src/static_dependencies/dydx-v4-client/onboarding.d.ts +35 -0
  140. package/js/src/static_dependencies/dydx-v4-client/onboarding.js +56 -0
  141. package/js/src/static_dependencies/dydx-v4-client/registry.d.ts +7 -0
  142. package/js/src/static_dependencies/dydx-v4-client/registry.js +36 -0
  143. package/js/src/static_dependencies/noble-hashes/utils.d.ts +1 -0
  144. package/js/src/static_dependencies/noble-hashes/utils.js +4 -0
  145. package/js/src/static_dependencies/scure-bip32/index.d.ts +49 -0
  146. package/js/src/static_dependencies/scure-bip32/index.js +295 -0
  147. package/js/src/static_dependencies/scure-bip39/index.d.ts +54 -0
  148. package/js/src/static_dependencies/scure-bip39/index.js +140 -0
  149. package/js/src/static_dependencies/scure-bip39/wordlists/english.d.ts +1 -0
  150. package/js/src/static_dependencies/scure-bip39/wordlists/english.js +2054 -0
  151. package/js/src/toobit.js +2 -1
  152. package/package.json +9 -3
@@ -0,0 +1,418 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var dydx$1 = require('../dydx.js');
6
+ var Cache = require('../base/ws/Cache.js');
7
+ var errors = require('../base/errors.js');
8
+
9
+ // ----------------------------------------------------------------------------
10
+ // ---------------------------------------------------------------------------
11
+ class dydx extends dydx$1["default"] {
12
+ describe() {
13
+ return this.deepExtend(super.describe(), {
14
+ 'has': {
15
+ 'ws': true,
16
+ 'watchBalance': false,
17
+ 'watchTicker': false,
18
+ 'watchTickers': false,
19
+ 'watchTrades': true,
20
+ 'watchOrderBook': true,
21
+ 'watchOHLCV': true,
22
+ },
23
+ 'urls': {
24
+ 'test': {
25
+ 'ws': 'wss://indexer.v4testnet.dydx.exchange/v4/ws',
26
+ },
27
+ 'api': {
28
+ 'ws': 'wss://indexer.dydx.trade/v4/ws',
29
+ },
30
+ },
31
+ 'options': {},
32
+ 'streaming': {},
33
+ 'exceptions': {},
34
+ });
35
+ }
36
+ /**
37
+ * @method
38
+ * @name dydx#watchTrades
39
+ * @description get the list of most recent trades for a particular symbol
40
+ * @see https://docs.dydx.xyz/indexer-client/websockets#trades
41
+ * @param {string} symbol unified symbol of the market to fetch trades for
42
+ * @param {int} [since] timestamp in ms of the earliest trade to fetch
43
+ * @param {int} [limit] the maximum amount of trades to fetch
44
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
45
+ * @returns {object[]} a list of [trade structures]{@link https://github.com/ccxt/ccxt/wiki/Manual#public-trades}
46
+ */
47
+ async watchTrades(symbol, since = undefined, limit = undefined, params = {}) {
48
+ await this.loadMarkets();
49
+ const url = this.urls['api']['ws'];
50
+ const market = this.market(symbol);
51
+ const messageHash = 'trade:' + market['symbol'];
52
+ const request = {
53
+ 'type': 'subscribe',
54
+ 'channel': 'v4_trades',
55
+ 'id': market['id'],
56
+ };
57
+ const trades = await this.watch(url, messageHash, this.extend(request, params), messageHash);
58
+ if (this.newUpdates) {
59
+ limit = trades.getLimit(symbol, limit);
60
+ }
61
+ return this.filterBySinceLimit(trades, since, limit, 'timestamp', true);
62
+ }
63
+ /**
64
+ * @method
65
+ * @name dydx#unWatchTrades
66
+ * @description unsubscribes from the trades channel
67
+ * @see https://docs.dydx.xyz/indexer-client/websockets#trades
68
+ * @param {string} symbol unified symbol of the market to fetch trades for
69
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
70
+ * @returns {object[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=public-trades}
71
+ */
72
+ async unWatchTrades(symbol, params = {}) {
73
+ await this.loadMarkets();
74
+ const url = this.urls['api']['ws'];
75
+ const market = this.market(symbol);
76
+ const messageHash = 'trade:' + market['symbol'];
77
+ const request = {
78
+ 'type': 'unsubscribe',
79
+ 'channel': 'v4_trades',
80
+ 'id': market['id'],
81
+ };
82
+ return await this.watch(url, messageHash, this.extend(request, params), messageHash);
83
+ }
84
+ handleTrades(client, message) {
85
+ //
86
+ // {
87
+ // "type": "subscribed",
88
+ // "connection_id": "9011edff-d8f7-47fc-bbc6-0c7b5ba7dfae",
89
+ // "message_id": 3,
90
+ // "channel": "v4_trades",
91
+ // "id": "BTC-USD",
92
+ // "contents": {
93
+ // "trades": [
94
+ // {
95
+ // "id": "02b6148d0000000200000005",
96
+ // "side": "BUY",
97
+ // "size": "0.024",
98
+ // "price": "114581",
99
+ // "type": "LIMIT",
100
+ // "createdAt": "2025-08-04T00:42:07.118Z",
101
+ // "createdAtHeight": "45487245"
102
+ // }
103
+ // ]
104
+ // }
105
+ // }
106
+ //
107
+ const marketId = this.safeString(message, 'id');
108
+ const market = this.safeMarket(marketId);
109
+ const symbol = market['symbol'];
110
+ const content = this.safeDict(message, 'contents');
111
+ const rawTrades = this.safeList(content, 'trades', []);
112
+ let stored = this.safeValue(this.trades, symbol);
113
+ if (stored === undefined) {
114
+ const limit = this.safeInteger(this.options, 'tradesLimit', 1000);
115
+ stored = new Cache.ArrayCache(limit);
116
+ this.trades[symbol] = stored;
117
+ }
118
+ const parsedTrades = this.parseTrades(rawTrades, market);
119
+ for (let i = 0; i < parsedTrades.length; i++) {
120
+ const parsed = parsedTrades[i];
121
+ stored.append(parsed);
122
+ }
123
+ const messageHash = 'trade' + ':' + symbol;
124
+ client.resolve(stored, messageHash);
125
+ }
126
+ parseWsTrade(trade, market = undefined) {
127
+ //
128
+ // {
129
+ // "id": "02b6148d0000000200000005",
130
+ // "side": "BUY",
131
+ // "size": "0.024",
132
+ // "price": "114581",
133
+ // "type": "LIMIT",
134
+ // "createdAt": "2025-08-04T00:42:07.118Z",
135
+ // "createdAtHeight": "45487245"
136
+ // }
137
+ //
138
+ const timestamp = this.parse8601(this.safeString(trade, 'createdAt'));
139
+ return this.safeTrade({
140
+ 'id': this.safeString(trade, 'id'),
141
+ 'info': trade,
142
+ 'timestamp': timestamp,
143
+ 'datetime': this.iso8601(timestamp),
144
+ 'symbol': this.safeString(market, 'symbol'),
145
+ 'order': undefined,
146
+ 'type': this.safeStringLower(trade, 'type'),
147
+ 'side': this.safeStringLower(trade, 'side'),
148
+ 'takerOrMaker': undefined,
149
+ 'price': this.safeString(trade, 'price'),
150
+ 'amount': this.safeString(trade, 'size'),
151
+ 'cost': undefined,
152
+ 'fee': undefined,
153
+ }, market);
154
+ }
155
+ /**
156
+ * @method
157
+ * @name dydx#watchOrderBook
158
+ * @description watches information on open orders with bid (buy) and ask (sell) prices, volumes and other data
159
+ * @see https://docs.dydx.xyz/indexer-client/websockets#orders
160
+ * @param {string} symbol unified symbol of the market to fetch the order book for
161
+ * @param {int} [limit] the maximum amount of order book entries to return
162
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
163
+ * @returns {object} A dictionary of [order book structures]{@link https://docs.ccxt.com/#/?id=order-book-structure} indexed by market symbols
164
+ */
165
+ async watchOrderBook(symbol, limit = undefined, params = {}) {
166
+ await this.loadMarkets();
167
+ const url = this.urls['api']['ws'];
168
+ const market = this.market(symbol);
169
+ const messageHash = 'orderbook:' + market['symbol'];
170
+ const request = {
171
+ 'type': 'subscribe',
172
+ 'channel': 'v4_orderbook',
173
+ 'id': market['id'],
174
+ };
175
+ const orderbook = await this.watch(url, messageHash, this.extend(request, params), messageHash);
176
+ return orderbook.limit();
177
+ }
178
+ /**
179
+ * @method
180
+ * @name dydx#unWatchOrderBook
181
+ * @description unWatches information on open orders with bid (buy) and ask (sell) prices, volumes and other data
182
+ * @see https://docs.dydx.xyz/indexer-client/websockets#orders
183
+ * @param {string} symbol unified array of symbols
184
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
185
+ * @returns {object} A dictionary of [order book structures]{@link https://docs.ccxt.com/#/?id=order-book-structure} indexed by market symbols
186
+ */
187
+ async unWatchOrderBook(symbol, params = {}) {
188
+ await this.loadMarkets();
189
+ const url = this.urls['api']['ws'];
190
+ const market = this.market(symbol);
191
+ const messageHash = 'orderbook:' + market['symbol'];
192
+ const request = {
193
+ 'type': 'unsubscribe',
194
+ 'channel': 'v4_orderbook',
195
+ 'id': market['id'],
196
+ };
197
+ return await this.watch(url, messageHash, this.extend(request, params), messageHash);
198
+ }
199
+ handleOrderBook(client, message) {
200
+ //
201
+ // {
202
+ // "type": "subscribed",
203
+ // "connection_id": "7af140fb-b33d-4f0e-8f4c-30f16337b360",
204
+ // "message_id": 1,
205
+ // "channel": "v4_orderbook",
206
+ // "id": "BTC-USD",
207
+ // "contents": {
208
+ // "bids": [
209
+ // {
210
+ // "price": "114623",
211
+ // "size": "0.1112"
212
+ // }
213
+ // ],
214
+ // "asks": [
215
+ // {
216
+ // "price": "114624",
217
+ // "size": "0.0872"
218
+ // }
219
+ // ]
220
+ // }
221
+ // }
222
+ //
223
+ const marketId = this.safeString(message, 'id');
224
+ const market = this.safeMarket(marketId);
225
+ const symbol = market['symbol'];
226
+ const content = this.safeDict(message, 'contents');
227
+ let orderbook = this.safeValue(this.orderbooks, symbol);
228
+ if (orderbook === undefined) {
229
+ orderbook = this.orderBook();
230
+ }
231
+ orderbook['symbol'] = symbol;
232
+ const asks = this.safeList(content, 'asks', []);
233
+ const bids = this.safeList(content, 'bids', []);
234
+ this.handleDeltas(orderbook['asks'], asks);
235
+ this.handleDeltas(orderbook['bids'], bids);
236
+ orderbook['nonce'] = this.safeInteger(message, 'message_id');
237
+ const messageHash = 'orderbook:' + symbol;
238
+ this.orderbooks[symbol] = orderbook;
239
+ client.resolve(orderbook, messageHash);
240
+ }
241
+ handleDelta(bookside, delta) {
242
+ if (Array.isArray(delta)) {
243
+ const price = this.safeFloat(delta, 0);
244
+ const amount = this.safeFloat(delta, 1);
245
+ bookside.store(price, amount);
246
+ }
247
+ else {
248
+ const bidAsk = this.parseBidAsk(delta, 'price', 'size');
249
+ bookside.storeArray(bidAsk);
250
+ }
251
+ }
252
+ /**
253
+ * @method
254
+ * @name dydx#watchOHLCV
255
+ * @description watches historical candlestick data containing the open, high, low, and close price, and the volume of a market
256
+ * @see https://docs.dydx.xyz/indexer-client/websockets#candles
257
+ * @param {string} symbol unified symbol of the market to fetch OHLCV data for
258
+ * @param {string} timeframe the length of time each candle represents
259
+ * @param {int} [since] timestamp in ms of the earliest candle to fetch
260
+ * @param {int} [limit] the maximum amount of candles to fetch
261
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
262
+ * @returns {int[][]} A list of candles ordered as timestamp, open, high, low, close, volume
263
+ */
264
+ async watchOHLCV(symbol, timeframe = '1m', since = undefined, limit = undefined, params = {}) {
265
+ await this.loadMarkets();
266
+ const url = this.urls['api']['ws'];
267
+ const market = this.market(symbol);
268
+ const messageHash = 'ohlcv:' + market['symbol'];
269
+ const resolution = this.safeString(this.timeframes, timeframe, timeframe);
270
+ const request = {
271
+ 'type': 'subscribe',
272
+ 'channel': 'v4_candles',
273
+ 'id': market['id'] + '/' + resolution,
274
+ };
275
+ const ohlcv = await this.watch(url, messageHash, this.extend(request, params), messageHash);
276
+ if (this.newUpdates) {
277
+ limit = ohlcv.getLimit(symbol, limit);
278
+ }
279
+ return this.filterBySinceLimit(ohlcv, since, limit, 0, true);
280
+ }
281
+ /**
282
+ * @method
283
+ * @name dydx#unWatchOHLCV
284
+ * @description unWatches historical candlestick data containing the open, high, low, and close price, and the volume of a market
285
+ * @see https://docs.dydx.xyz/indexer-client/websockets#candles
286
+ * @param {string} symbol unified symbol of the market to fetch OHLCV data for
287
+ * @param {string} timeframe the length of time each candle represents
288
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
289
+ * @param {object} [params.timezone] if provided, kline intervals are interpreted in that timezone instead of UTC, example '+08:00'
290
+ * @returns {int[][]} A list of candles ordered as timestamp, open, high, low, close, volume
291
+ */
292
+ async unWatchOHLCV(symbol, timeframe = '1m', params = {}) {
293
+ await this.loadMarkets();
294
+ const url = this.urls['api']['ws'];
295
+ const market = this.market(symbol);
296
+ const messageHash = 'ohlcv:' + market['symbol'];
297
+ const resolution = this.safeString(this.timeframes, timeframe, timeframe);
298
+ const request = {
299
+ 'type': 'unsubscribe',
300
+ 'channel': 'v4_candles',
301
+ 'id': market['id'] + '/' + resolution,
302
+ };
303
+ return await this.watch(url, messageHash, this.extend(request, params), messageHash);
304
+ }
305
+ handleOHLCV(client, message) {
306
+ //
307
+ // {
308
+ // "type": "subscribed",
309
+ // "connection_id": "e00b6e27-590c-4e91-a24d-b0645289434b",
310
+ // "message_id": 1,
311
+ // "channel": "v4_candles",
312
+ // "id": "BTC-USD/1MIN",
313
+ // "contents": {
314
+ // "candles": [
315
+ // {
316
+ // "startedAt": "2025-08-05T03:40:00.000Z",
317
+ // "ticker": "BTC-USD",
318
+ // "resolution": "1MIN",
319
+ // "low": "114249",
320
+ // "high": "114256",
321
+ // "open": "114256",
322
+ // "close": "114249",
323
+ // "baseTokenVolume": "0.4726",
324
+ // "usdVolume": "53996.1818",
325
+ // "trades": 7,
326
+ // "startingOpenInterest": "501.7424",
327
+ // "orderbookMidPriceOpen": "114255.5",
328
+ // "orderbookMidPriceClose": "114255.5"
329
+ // }
330
+ // ]
331
+ // }
332
+ // }
333
+ // {
334
+ // "type": "channel_data",
335
+ // "connection_id": "e00b6e27-590c-4e91-a24d-b0645289434b",
336
+ // "message_id": 3,
337
+ // "id": "BTC-USD/1MIN",
338
+ // "channel": "v4_candles",
339
+ // "version": "1.0.0",
340
+ // "contents": {
341
+ // "startedAt": "2025-08-05T03:40:00.000Z",
342
+ // "ticker": "BTC-USD",
343
+ // "resolution": "1MIN",
344
+ // "low": "114249",
345
+ // "high": "114262",
346
+ // "open": "114256",
347
+ // "close": "114261",
348
+ // "baseTokenVolume": "0.4753",
349
+ // "usdVolume": "54304.6873",
350
+ // "trades": 9,
351
+ // "startingOpenInterest": "501.7424",
352
+ // "orderbookMidPriceOpen": "114255.5",
353
+ // "orderbookMidPriceClose": "114255.5"
354
+ // }
355
+ // }
356
+ //
357
+ const id = this.safeString(message, 'id');
358
+ const part = id.split('/');
359
+ const interval = this.safeString(part, 1);
360
+ const timeframe = this.findTimeframe(interval);
361
+ const marketId = this.safeString(part, 0);
362
+ const market = this.safeMarket(marketId);
363
+ const symbol = market['symbol'];
364
+ const content = this.safeDict(message, 'contents');
365
+ const candles = this.safeList(content, 'candles');
366
+ const messageHash = 'ohlcv:' + symbol;
367
+ const ohlcv = this.safeDict(candles, 0, content);
368
+ const parsed = this.parseOHLCV(ohlcv, market);
369
+ this.ohlcvs[symbol] = this.safeValue(this.ohlcvs, symbol, {});
370
+ let stored = this.safeValue(this.ohlcvs[symbol], timeframe);
371
+ if (stored === undefined) {
372
+ const limit = this.safeInteger(this.options, 'OHLCVLimit', 1000);
373
+ stored = new Cache.ArrayCacheByTimestamp(limit);
374
+ this.ohlcvs[symbol][timeframe] = stored;
375
+ }
376
+ stored.append(parsed);
377
+ client.resolve(stored, messageHash);
378
+ }
379
+ handleErrorMessage(client, message) {
380
+ //
381
+ // {
382
+ // "type": "error",
383
+ // "message": "....",
384
+ // "connection_id": "9011edff-d8f7-47fc-bbc6-0c7b5ba7dfae",
385
+ // "message_id": 4
386
+ // }
387
+ //
388
+ try {
389
+ const msg = this.safeString(message, 'message');
390
+ throw new errors.ExchangeError(this.id + ' ' + msg);
391
+ }
392
+ catch (e) {
393
+ client.reject(e);
394
+ }
395
+ return true;
396
+ }
397
+ handleMessage(client, message) {
398
+ const type = this.safeString(message, 'type');
399
+ if (type === 'error') {
400
+ this.handleErrorMessage(client, message);
401
+ return;
402
+ }
403
+ if (type !== undefined) {
404
+ const topic = this.safeString(message, 'channel');
405
+ const methods = {
406
+ 'v4_trades': this.handleTrades,
407
+ 'v4_orderbook': this.handleOrderBook,
408
+ 'v4_candles': this.handleOHLCV,
409
+ };
410
+ const method = this.safeValue(methods, topic);
411
+ if (method !== undefined) {
412
+ method.call(this, client, message);
413
+ }
414
+ }
415
+ }
416
+ }
417
+
418
+ exports["default"] = dydx;
@@ -1243,8 +1243,7 @@ class kraken extends kraken$1["default"] {
1243
1243
  * @returns {object[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
1244
1244
  */
1245
1245
  async watchOrders(symbol = undefined, since = undefined, limit = undefined, params = {}) {
1246
- params['snap_orders'] = true;
1247
- return await this.watchPrivate('orders', symbol, since, limit, params);
1246
+ return await this.watchPrivate('orders', symbol, since, limit, this.extend(params, { 'snap_orders': true }));
1248
1247
  }
1249
1248
  handleOrders(client, message, subscription = undefined) {
1250
1249
  //
@@ -1304,7 +1303,9 @@ class kraken extends kraken$1["default"] {
1304
1303
  }
1305
1304
  }
1306
1305
  stored.append(newOrder);
1307
- symbols[symbol] = true;
1306
+ if (symbol !== undefined) {
1307
+ symbols[symbol] = true;
1308
+ }
1308
1309
  }
1309
1310
  const name = 'orders';
1310
1311
  client.resolve(this.orders, name);