ccxt 4.3.69 → 4.3.71

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 (187) hide show
  1. package/README.md +7 -6
  2. package/dist/ccxt.browser.min.js +13 -10
  3. package/dist/cjs/ccxt.js +8 -1
  4. package/dist/cjs/src/abstract/paradex.js +9 -0
  5. package/dist/cjs/src/ascendex.js +1 -1
  6. package/dist/cjs/src/base/Exchange.js +55 -0
  7. package/dist/cjs/src/binance.js +1 -1
  8. package/dist/cjs/src/blofin.js +63 -6
  9. package/dist/cjs/src/bybit.js +1 -1
  10. package/dist/cjs/src/coinbaseinternational.js +168 -2
  11. package/dist/cjs/src/cryptocom.js +9 -1
  12. package/dist/cjs/src/hitbtc.js +1 -1
  13. package/dist/cjs/src/paradex.js +2075 -0
  14. package/dist/cjs/src/poloniex.js +1 -0
  15. package/dist/cjs/src/pro/bequant.js +4 -0
  16. package/dist/cjs/src/pro/blofin.js +665 -0
  17. package/dist/cjs/src/pro/coinbaseinternational.js +154 -9
  18. package/dist/cjs/src/pro/cryptocom.js +3 -1
  19. package/dist/cjs/src/pro/hitbtc.js +26 -8
  20. package/dist/cjs/src/pro/okx.js +7 -0
  21. package/dist/cjs/src/pro/paradex.js +365 -0
  22. package/dist/cjs/src/pro/poloniex.js +37 -12
  23. package/dist/cjs/src/pro/woo.js +5 -4
  24. package/dist/cjs/src/static_dependencies/noble-curves/abstract/poseidon.js +100 -0
  25. package/dist/cjs/src/static_dependencies/noble-curves/abstract/weierstrass.js +1 -0
  26. package/dist/cjs/src/static_dependencies/scure-starknet/index.js +284 -0
  27. package/dist/cjs/src/static_dependencies/starknet/constants.js +60 -0
  28. package/dist/cjs/src/static_dependencies/starknet/types/calldata.js +26 -0
  29. package/dist/cjs/src/static_dependencies/starknet/types/lib/contract/abi.js +8 -0
  30. package/dist/cjs/src/static_dependencies/starknet/types/lib/contract/index.js +13 -0
  31. package/dist/cjs/src/static_dependencies/starknet/types/lib/index.js +56 -0
  32. package/dist/cjs/src/static_dependencies/starknet/types/typedData.js +19 -0
  33. package/dist/cjs/src/static_dependencies/starknet/utils/assert.js +15 -0
  34. package/dist/cjs/src/static_dependencies/starknet/utils/cairoDataTypes/felt.js +44 -0
  35. package/dist/cjs/src/static_dependencies/starknet/utils/cairoDataTypes/uint256.js +122 -0
  36. package/dist/cjs/src/static_dependencies/starknet/utils/cairoDataTypes/uint512.js +137 -0
  37. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/byteArray.js +61 -0
  38. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/cairo.js +218 -0
  39. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/enum/CairoCustomEnum.js +57 -0
  40. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/enum/CairoOption.js +64 -0
  41. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/enum/CairoResult.js +63 -0
  42. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/formatter.js +66 -0
  43. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/index.js +281 -0
  44. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/parser/index.js +33 -0
  45. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/parser/parser-0-1.1.0.js +37 -0
  46. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/parser/parser-2.0.0.js +40 -0
  47. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/propertyOrder.js +156 -0
  48. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/requestParser.js +250 -0
  49. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/responseParser.js +215 -0
  50. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/tuple.js +112 -0
  51. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/validate.js +206 -0
  52. package/dist/cjs/src/static_dependencies/starknet/utils/encode.js +58 -0
  53. package/dist/cjs/src/static_dependencies/starknet/utils/hash/classHash.js +57 -0
  54. package/dist/cjs/src/static_dependencies/starknet/utils/merkle.js +76 -0
  55. package/dist/cjs/src/static_dependencies/starknet/utils/num.js +92 -0
  56. package/dist/cjs/src/static_dependencies/starknet/utils/selector.js +48 -0
  57. package/dist/cjs/src/static_dependencies/starknet/utils/shortString.js +101 -0
  58. package/dist/cjs/src/static_dependencies/starknet/utils/typedData.js +334 -0
  59. package/dist/cjs/src/woo.js +4 -2
  60. package/js/ccxt.d.ts +11 -2
  61. package/js/ccxt.js +8 -2
  62. package/js/src/abstract/coinbaseinternational.d.ts +1 -1
  63. package/js/src/abstract/paradex.d.ts +43 -0
  64. package/js/src/abstract/paradex.js +11 -0
  65. package/js/src/ascendex.js +1 -1
  66. package/js/src/base/Exchange.d.ts +8 -0
  67. package/js/src/base/Exchange.js +51 -0
  68. package/js/src/binance.js +1 -1
  69. package/js/src/blofin.d.ts +1 -1
  70. package/js/src/blofin.js +63 -6
  71. package/js/src/bybit.js +1 -1
  72. package/js/src/coinbaseinternational.d.ts +6 -1
  73. package/js/src/coinbaseinternational.js +168 -2
  74. package/js/src/cryptocom.js +10 -2
  75. package/js/src/hitbtc.js +1 -1
  76. package/js/src/paradex.d.ts +76 -0
  77. package/js/src/paradex.js +2075 -0
  78. package/js/src/poloniex.js +1 -0
  79. package/js/src/pro/bequant.js +4 -0
  80. package/js/src/pro/blofin.d.ts +39 -0
  81. package/js/src/pro/blofin.js +668 -0
  82. package/js/src/pro/coinbaseinternational.d.ts +5 -1
  83. package/js/src/pro/coinbaseinternational.js +155 -10
  84. package/js/src/pro/cryptocom.js +4 -2
  85. package/js/src/pro/hitbtc.d.ts +1 -1
  86. package/js/src/pro/hitbtc.js +26 -8
  87. package/js/src/pro/okx.js +7 -0
  88. package/js/src/pro/paradex.d.ts +15 -0
  89. package/js/src/pro/paradex.js +366 -0
  90. package/js/src/pro/poloniex.js +37 -12
  91. package/js/src/pro/woo.js +5 -4
  92. package/js/src/static_dependencies/noble-curves/abstract/weierstrass.d.ts +24 -0
  93. package/js/src/static_dependencies/noble-curves/abstract/weierstrass.js +1 -1
  94. package/js/src/static_dependencies/scure-starknet/index.d.ts +79 -0
  95. package/js/src/static_dependencies/scure-starknet/index.js +323 -0
  96. package/js/src/static_dependencies/starknet/constants.d.ts +61 -0
  97. package/js/src/static_dependencies/starknet/constants.js +67 -0
  98. package/js/src/static_dependencies/starknet/index.d.ts +7 -0
  99. package/js/src/static_dependencies/starknet/index.js +50 -0
  100. package/js/src/static_dependencies/starknet/types/cairoEnum.d.ts +2 -0
  101. package/js/src/static_dependencies/starknet/types/cairoEnum.js +7 -0
  102. package/js/src/static_dependencies/starknet/types/calldata.d.ts +19 -0
  103. package/js/src/static_dependencies/starknet/types/calldata.js +28 -0
  104. package/js/src/static_dependencies/starknet/types/index.d.ts +13 -0
  105. package/js/src/static_dependencies/starknet/types/index.js +16 -0
  106. package/js/src/static_dependencies/starknet/types/lib/contract/abi.d.ts +71 -0
  107. package/js/src/static_dependencies/starknet/types/lib/contract/abi.js +13 -0
  108. package/js/src/static_dependencies/starknet/types/lib/contract/index.d.ts +24 -0
  109. package/js/src/static_dependencies/starknet/types/lib/contract/index.js +16 -0
  110. package/js/src/static_dependencies/starknet/types/lib/contract/legacy.d.ts +33 -0
  111. package/js/src/static_dependencies/starknet/types/lib/contract/legacy.js +7 -0
  112. package/js/src/static_dependencies/starknet/types/lib/contract/sierra.d.ts +52 -0
  113. package/js/src/static_dependencies/starknet/types/lib/contract/sierra.js +7 -0
  114. package/js/src/static_dependencies/starknet/types/lib/index.d.ts +248 -0
  115. package/js/src/static_dependencies/starknet/types/lib/index.js +52 -0
  116. package/js/src/static_dependencies/starknet/types/typedData.d.ts +44 -0
  117. package/js/src/static_dependencies/starknet/types/typedData.js +19 -0
  118. package/js/src/static_dependencies/starknet/utils/address.d.ts +53 -0
  119. package/js/src/static_dependencies/starknet/utils/address.js +89 -0
  120. package/js/src/static_dependencies/starknet/utils/assert.d.ts +7 -0
  121. package/js/src/static_dependencies/starknet/utils/assert.js +17 -0
  122. package/js/src/static_dependencies/starknet/utils/cairoDataTypes/felt.d.ts +6 -0
  123. package/js/src/static_dependencies/starknet/utils/cairoDataTypes/felt.js +43 -0
  124. package/js/src/static_dependencies/starknet/utils/cairoDataTypes/uint256.d.ts +72 -0
  125. package/js/src/static_dependencies/starknet/utils/cairoDataTypes/uint256.js +117 -0
  126. package/js/src/static_dependencies/starknet/utils/cairoDataTypes/uint512.d.ts +76 -0
  127. package/js/src/static_dependencies/starknet/utils/cairoDataTypes/uint512.js +136 -0
  128. package/js/src/static_dependencies/starknet/utils/calldata/byteArray.d.ts +32 -0
  129. package/js/src/static_dependencies/starknet/utils/calldata/byteArray.js +59 -0
  130. package/js/src/static_dependencies/starknet/utils/calldata/cairo.d.ts +183 -0
  131. package/js/src/static_dependencies/starknet/utils/calldata/cairo.js +229 -0
  132. package/js/src/static_dependencies/starknet/utils/calldata/enum/CairoCustomEnum.d.ts +38 -0
  133. package/js/src/static_dependencies/starknet/utils/calldata/enum/CairoCustomEnum.js +57 -0
  134. package/js/src/static_dependencies/starknet/utils/calldata/enum/CairoOption.d.ts +35 -0
  135. package/js/src/static_dependencies/starknet/utils/calldata/enum/CairoOption.js +64 -0
  136. package/js/src/static_dependencies/starknet/utils/calldata/enum/CairoResult.d.ts +34 -0
  137. package/js/src/static_dependencies/starknet/utils/calldata/enum/CairoResult.js +63 -0
  138. package/js/src/static_dependencies/starknet/utils/calldata/enum/index.d.ts +3 -0
  139. package/js/src/static_dependencies/starknet/utils/calldata/enum/index.js +9 -0
  140. package/js/src/static_dependencies/starknet/utils/calldata/formatter.d.ts +9 -0
  141. package/js/src/static_dependencies/starknet/utils/calldata/formatter.js +67 -0
  142. package/js/src/static_dependencies/starknet/utils/calldata/index.d.ts +89 -0
  143. package/js/src/static_dependencies/starknet/utils/calldata/index.js +280 -0
  144. package/js/src/static_dependencies/starknet/utils/calldata/parser/index.d.ts +5 -0
  145. package/js/src/static_dependencies/starknet/utils/calldata/parser/index.js +30 -0
  146. package/js/src/static_dependencies/starknet/utils/calldata/parser/interface.d.ts +20 -0
  147. package/js/src/static_dependencies/starknet/utils/calldata/parser/interface.js +8 -0
  148. package/js/src/static_dependencies/starknet/utils/calldata/parser/parser-0-1.1.0.d.ts +24 -0
  149. package/js/src/static_dependencies/starknet/utils/calldata/parser/parser-0-1.1.0.js +36 -0
  150. package/js/src/static_dependencies/starknet/utils/calldata/parser/parser-2.0.0.d.ts +23 -0
  151. package/js/src/static_dependencies/starknet/utils/calldata/parser/parser-2.0.0.js +40 -0
  152. package/js/src/static_dependencies/starknet/utils/calldata/propertyOrder.d.ts +2 -0
  153. package/js/src/static_dependencies/starknet/utils/calldata/propertyOrder.js +155 -0
  154. package/js/src/static_dependencies/starknet/utils/calldata/requestParser.d.ts +11 -0
  155. package/js/src/static_dependencies/starknet/utils/calldata/requestParser.js +248 -0
  156. package/js/src/static_dependencies/starknet/utils/calldata/responseParser.d.ts +11 -0
  157. package/js/src/static_dependencies/starknet/utils/calldata/responseParser.js +214 -0
  158. package/js/src/static_dependencies/starknet/utils/calldata/tuple.d.ts +6 -0
  159. package/js/src/static_dependencies/starknet/utils/calldata/tuple.js +113 -0
  160. package/js/src/static_dependencies/starknet/utils/calldata/validate.d.ts +6 -0
  161. package/js/src/static_dependencies/starknet/utils/calldata/validate.js +208 -0
  162. package/js/src/static_dependencies/starknet/utils/encode.d.ts +207 -0
  163. package/js/src/static_dependencies/starknet/utils/encode.js +282 -0
  164. package/js/src/static_dependencies/starknet/utils/hash/classHash.d.ts +57 -0
  165. package/js/src/static_dependencies/starknet/utils/hash/classHash.js +224 -0
  166. package/js/src/static_dependencies/starknet/utils/hash/index.d.ts +6 -0
  167. package/js/src/static_dependencies/starknet/utils/hash/index.js +13 -0
  168. package/js/src/static_dependencies/starknet/utils/json.d.ts +24 -0
  169. package/js/src/static_dependencies/starknet/utils/json.js +43 -0
  170. package/js/src/static_dependencies/starknet/utils/merkle.d.ts +35 -0
  171. package/js/src/static_dependencies/starknet/utils/merkle.js +84 -0
  172. package/js/src/static_dependencies/starknet/utils/num.d.ts +182 -0
  173. package/js/src/static_dependencies/starknet/utils/num.js +244 -0
  174. package/js/src/static_dependencies/starknet/utils/selector.d.ts +48 -0
  175. package/js/src/static_dependencies/starknet/utils/selector.js +85 -0
  176. package/js/src/static_dependencies/starknet/utils/shortString.d.ts +57 -0
  177. package/js/src/static_dependencies/starknet/utils/shortString.js +96 -0
  178. package/js/src/static_dependencies/starknet/utils/starknetId.d.ts +113 -0
  179. package/js/src/static_dependencies/starknet/utils/starknetId.js +265 -0
  180. package/js/src/static_dependencies/starknet/utils/typedData.d.ts +54 -0
  181. package/js/src/static_dependencies/starknet/utils/typedData.js +321 -0
  182. package/js/src/static_dependencies/starknet/utils/uint256.d.ts +21 -0
  183. package/js/src/static_dependencies/starknet/utils/uint256.js +32 -0
  184. package/js/src/static_dependencies/starknet/utils/url.d.ts +29 -0
  185. package/js/src/static_dependencies/starknet/utils/url.js +70 -0
  186. package/js/src/woo.js +4 -2
  187. package/package.json +1 -1
@@ -0,0 +1,365 @@
1
+ 'use strict';
2
+
3
+ var paradex$1 = require('../paradex.js');
4
+ var Cache = require('../base/ws/Cache.js');
5
+
6
+ // ---------------------------------------------------------------------------
7
+ // ---------------------------------------------------------------------------
8
+ class paradex extends paradex$1 {
9
+ describe() {
10
+ return this.deepExtend(super.describe(), {
11
+ 'has': {
12
+ 'ws': true,
13
+ 'watchTicker': true,
14
+ 'watchTickers': true,
15
+ 'watchOrderBook': true,
16
+ 'watchOrders': false,
17
+ 'watchTrades': true,
18
+ 'watchBalance': false,
19
+ 'watchOHLCV': false,
20
+ },
21
+ 'urls': {
22
+ 'logo': 'https://x.com/tradeparadex/photo',
23
+ 'api': {
24
+ 'ws': 'wss://ws.api.prod.paradex.trade/v1',
25
+ },
26
+ 'test': {
27
+ 'ws': 'wss://ws.api.testnet.paradex.trade/v1',
28
+ },
29
+ 'www': 'https://www.paradex.trade/',
30
+ 'doc': 'https://docs.api.testnet.paradex.trade/',
31
+ 'fees': 'https://docs.paradex.trade/getting-started/trading-fees',
32
+ 'referral': '',
33
+ },
34
+ 'options': {},
35
+ 'streaming': {},
36
+ });
37
+ }
38
+ async watchTrades(symbol, since = undefined, limit = undefined, params = {}) {
39
+ /**
40
+ * @method
41
+ * @name paradex#watchTrades
42
+ * @description get the list of most recent trades for a particular symbol
43
+ * @see https://docs.api.testnet.paradex.trade/#sub-trades-market_symbol-operation
44
+ * @param {string} symbol unified symbol of the market to fetch trades for
45
+ * @param {int} [since] timestamp in ms of the earliest trade to fetch
46
+ * @param {int} [limit] the maximum amount of trades to fetch
47
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
48
+ * @returns {object[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=public-trades}
49
+ */
50
+ await this.loadMarkets();
51
+ let messageHash = 'trades.';
52
+ if (symbol !== undefined) {
53
+ const market = this.market(symbol);
54
+ messageHash += market['id'];
55
+ }
56
+ else {
57
+ messageHash += 'ALL';
58
+ }
59
+ const url = this.urls['api']['ws'];
60
+ const request = {
61
+ 'jsonrpc': '2.0',
62
+ 'method': 'subscribe',
63
+ 'params': {
64
+ 'channel': messageHash,
65
+ },
66
+ };
67
+ const trades = await this.watch(url, messageHash, this.deepExtend(request, params), messageHash);
68
+ if (this.newUpdates) {
69
+ limit = trades.getLimit(symbol, limit);
70
+ }
71
+ return this.filterBySinceLimit(trades, since, limit, 'timestamp', true);
72
+ }
73
+ handleTrade(client, message) {
74
+ //
75
+ // {
76
+ // "jsonrpc": "2.0",
77
+ // "method": "subscription",
78
+ // "params": {
79
+ // "channel": "trades.ALL",
80
+ // "data": {
81
+ // "id": "1718179273230201709233240002",
82
+ // "market": "kBONK-USD-PERP",
83
+ // "side": "BUY",
84
+ // "size": "34028",
85
+ // "price": "0.028776",
86
+ // "created_at": 1718179273230,
87
+ // "trade_type": "FILL"
88
+ // }
89
+ // }
90
+ // }
91
+ //
92
+ const params = this.safeDict(message, 'params', {});
93
+ const data = this.safeDict(params, 'data', {});
94
+ const parsedTrade = this.parseTrade(data);
95
+ const symbol = parsedTrade['symbol'];
96
+ const messageHash = this.safeString(params, 'channel');
97
+ let stored = this.safeValue(this.trades, symbol);
98
+ if (stored === undefined) {
99
+ stored = new Cache.ArrayCache(this.safeInteger(this.options, 'tradesLimit', 1000));
100
+ this.trades[symbol] = stored;
101
+ }
102
+ stored.append(parsedTrade);
103
+ client.resolve(stored, messageHash);
104
+ return message;
105
+ }
106
+ async watchOrderBook(symbol, limit = undefined, params = {}) {
107
+ /**
108
+ * @method
109
+ * @name paradex#watchOrderBook
110
+ * @description watches information on open orders with bid (buy) and ask (sell) prices, volumes and other data
111
+ * @see https://docs.api.testnet.paradex.trade/#sub-order_book-market_symbol-snapshot-15-refresh_rate-operation
112
+ * @param {string} symbol unified symbol of the market to fetch the order book for
113
+ * @param {int} [limit] the maximum amount of order book entries to return
114
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
115
+ * @returns {object} A dictionary of [order book structures]{@link https://docs.ccxt.com/#/?id=order-book-structure} indexed by market symbols
116
+ */
117
+ const market = this.market(symbol);
118
+ const messageHash = 'order_book.' + market['id'] + '.snapshot@15@100ms';
119
+ const url = this.urls['api']['ws'];
120
+ const request = {
121
+ 'jsonrpc': '2.0',
122
+ 'method': 'subscribe',
123
+ 'params': {
124
+ 'channel': messageHash,
125
+ },
126
+ };
127
+ const orderbook = await this.watch(url, messageHash, this.deepExtend(request, params), messageHash);
128
+ return orderbook.limit();
129
+ }
130
+ handleOrderBook(client, message) {
131
+ //
132
+ // {
133
+ // "jsonrpc": "2.0",
134
+ // "method": "subscription",
135
+ // "params": {
136
+ // "channel": "order_book.BTC-USD-PERP.snapshot@15@50ms",
137
+ // "data": {
138
+ // "seq_no": 14127815,
139
+ // "market": "BTC-USD-PERP",
140
+ // "last_updated_at": 1718267837265,
141
+ // "update_type": "s",
142
+ // "inserts": [
143
+ // {
144
+ // "side": "BUY",
145
+ // "price": "67629.7",
146
+ // "size": "0.992"
147
+ // },
148
+ // {
149
+ // "side": "SELL",
150
+ // "price": "69378.6",
151
+ // "size": "3.137"
152
+ // }
153
+ // ],
154
+ // "updates": [],
155
+ // "deletes": []
156
+ // }
157
+ // }
158
+ // }
159
+ //
160
+ const params = this.safeDict(message, 'params', {});
161
+ const data = this.safeDict(params, 'data', {});
162
+ const marketId = this.safeString(data, 'market');
163
+ const market = this.safeMarket(marketId);
164
+ const timestamp = this.safeInteger(data, 'last_updated_at');
165
+ const symbol = market['symbol'];
166
+ if (!(symbol in this.orderbooks)) {
167
+ this.orderbooks[symbol] = this.orderBook();
168
+ }
169
+ const orderbookData = {
170
+ 'bids': [],
171
+ 'asks': [],
172
+ };
173
+ const inserts = this.safeList(data, 'inserts');
174
+ for (let i = 0; i < inserts.length; i++) {
175
+ const insert = this.safeDict(inserts, i);
176
+ const side = this.safeString(insert, 'side');
177
+ const price = this.safeString(insert, 'price');
178
+ const size = this.safeString(insert, 'size');
179
+ if (side === 'BUY') {
180
+ orderbookData['bids'].push([price, size]);
181
+ }
182
+ else {
183
+ orderbookData['asks'].push([price, size]);
184
+ }
185
+ }
186
+ const orderbook = this.orderbooks[symbol];
187
+ const snapshot = this.parseOrderBook(orderbookData, symbol, timestamp, 'bids', 'asks');
188
+ snapshot['nonce'] = this.safeNumber(data, 'seq_no');
189
+ orderbook.reset(snapshot);
190
+ const messageHash = this.safeString(params, 'channel');
191
+ client.resolve(orderbook, messageHash);
192
+ }
193
+ async watchTicker(symbol, params = {}) {
194
+ /**
195
+ * @method
196
+ * @name paradex#watchTicker
197
+ * @description watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
198
+ * @see https://docs.api.testnet.paradex.trade/#sub-markets_summary-operation
199
+ * @param {string} symbol unified symbol of the market to fetch the ticker for
200
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
201
+ * @returns {object} a [ticker structure]{@link https://docs.ccxt.com/#/?id=ticker-structure}
202
+ */
203
+ await this.loadMarkets();
204
+ symbol = this.symbol(symbol);
205
+ const channel = 'markets_summary';
206
+ const url = this.urls['api']['ws'];
207
+ const request = {
208
+ 'jsonrpc': '2.0',
209
+ 'method': 'subscribe',
210
+ 'params': {
211
+ 'channel': channel,
212
+ },
213
+ };
214
+ const messageHash = channel + '.' + symbol;
215
+ return await this.watch(url, messageHash, this.deepExtend(request, params), messageHash);
216
+ }
217
+ async watchTickers(symbols = undefined, params = {}) {
218
+ /**
219
+ * @method
220
+ * @name paradex#watchTickers
221
+ * @description watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for all markets of a specific list
222
+ * @param {string[]} symbols unified symbol of the market to fetch the ticker for
223
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
224
+ * @returns {object} a [ticker structure]{@link https://docs.ccxt.com/#/?id=ticker-structure}
225
+ */
226
+ symbols = this.marketSymbols(symbols);
227
+ const channel = 'markets_summary';
228
+ const url = this.urls['api']['ws'];
229
+ const request = {
230
+ 'jsonrpc': '2.0',
231
+ 'method': 'subscribe',
232
+ 'params': {
233
+ 'channel': channel,
234
+ },
235
+ };
236
+ const messageHashes = [];
237
+ if (Array.isArray(symbols)) {
238
+ for (let i = 0; i < symbols.length; i++) {
239
+ const messageHash = channel + '.' + symbols[i];
240
+ messageHashes.push(messageHash);
241
+ }
242
+ }
243
+ else {
244
+ messageHashes.push(channel);
245
+ }
246
+ const newTickers = await this.watchMultiple(url, messageHashes, this.deepExtend(request, params), messageHashes);
247
+ if (this.newUpdates) {
248
+ const result = {};
249
+ result[newTickers['symbol']] = newTickers;
250
+ return result;
251
+ }
252
+ return this.filterByArray(this.tickers, 'symbol', symbols);
253
+ }
254
+ handleTicker(client, message) {
255
+ //
256
+ // {
257
+ // "jsonrpc": "2.0",
258
+ // "method": "subscription",
259
+ // "params": {
260
+ // "channel": "markets_summary",
261
+ // "data": {
262
+ // "symbol": "ORDI-USD-PERP",
263
+ // "oracle_price": "49.80885481",
264
+ // "mark_price": "49.80885481",
265
+ // "last_traded_price": "62.038",
266
+ // "bid": "49.822",
267
+ // "ask": "58.167",
268
+ // "volume_24h": "0",
269
+ // "total_volume": "54542628.66054200416",
270
+ // "created_at": 1718334307698,
271
+ // "underlying_price": "47.93",
272
+ // "open_interest": "6999.5",
273
+ // "funding_rate": "0.03919997509811",
274
+ // "price_change_rate_24h": ""
275
+ // }
276
+ // }
277
+ // }
278
+ //
279
+ const params = this.safeDict(message, 'params', {});
280
+ const data = this.safeDict(params, 'data', {});
281
+ const marketId = this.safeString(data, 'symbol');
282
+ const market = this.safeMarket(marketId);
283
+ const symbol = market['symbol'];
284
+ const channel = this.safeString(params, 'channel');
285
+ const messageHash = channel + '.' + symbol;
286
+ const ticker = this.parseTicker(data, market);
287
+ this.tickers[symbol] = ticker;
288
+ client.resolve(ticker, channel);
289
+ client.resolve(ticker, messageHash);
290
+ return message;
291
+ }
292
+ handleErrorMessage(client, message) {
293
+ //
294
+ // {
295
+ // "jsonrpc": "2.0",
296
+ // "id": 0,
297
+ // "error": {
298
+ // "code": -32600,
299
+ // "message": "invalid subscribe request",
300
+ // "data": "invalid channel"
301
+ // },
302
+ // "usIn": 1718179125962419,
303
+ // "usDiff": 76,
304
+ // "usOut": 1718179125962495
305
+ // }
306
+ //
307
+ const error = this.safeDict(message, 'error');
308
+ if (error === undefined) {
309
+ return true;
310
+ }
311
+ else {
312
+ const errorCode = this.safeString(error, 'code');
313
+ if (errorCode !== undefined) {
314
+ const feedback = this.id + ' ' + this.json(error);
315
+ this.throwExactlyMatchedException(this.exceptions['exact'], '-32600', feedback);
316
+ const messageString = this.safeValue(error, 'message');
317
+ if (messageString !== undefined) {
318
+ this.throwBroadlyMatchedException(this.exceptions['broad'], messageString, feedback);
319
+ }
320
+ }
321
+ return false;
322
+ }
323
+ }
324
+ handleMessage(client, message) {
325
+ if (!this.handleErrorMessage(client, message)) {
326
+ return;
327
+ }
328
+ //
329
+ // {
330
+ // "jsonrpc": "2.0",
331
+ // "method": "subscription",
332
+ // "params": {
333
+ // "channel": "trades.ALL",
334
+ // "data": {
335
+ // "id": "1718179273230201709233240002",
336
+ // "market": "kBONK-USD-PERP",
337
+ // "side": "BUY",
338
+ // "size": "34028",
339
+ // "price": "0.028776",
340
+ // "created_at": 1718179273230,
341
+ // "trade_type": "FILL"
342
+ // }
343
+ // }
344
+ // }
345
+ //
346
+ const data = this.safeDict(message, 'params');
347
+ if (data !== undefined) {
348
+ const channel = this.safeString(data, 'channel');
349
+ const parts = channel.split('.');
350
+ const name = this.safeString(parts, 0);
351
+ const methods = {
352
+ 'trades': this.handleTrade,
353
+ 'order_book': this.handleOrderBook,
354
+ 'markets_summary': this.handleTicker,
355
+ // ...
356
+ };
357
+ const method = this.safeValue(methods, name);
358
+ if (method !== undefined) {
359
+ method.call(this, client, message);
360
+ }
361
+ }
362
+ }
363
+ }
364
+
365
+ module.exports = paradex;
@@ -1176,15 +1176,7 @@ class poloniex extends poloniex$1 {
1176
1176
  this.handleAuthenticate(client, message);
1177
1177
  }
1178
1178
  else if (type === undefined) {
1179
- const data = this.safeValue(message, 'data');
1180
- const item = this.safeValue(data, 0);
1181
- const orderId = this.safeString(item, 'orderId');
1182
- if (orderId === '0') {
1183
- this.handleErrorMessage(client, item);
1184
- }
1185
- else {
1186
- this.handleOrderRequest(client, message);
1187
- }
1179
+ this.handleOrderRequest(client, message);
1188
1180
  }
1189
1181
  else {
1190
1182
  const data = this.safeValue(message, 'data', []);
@@ -1212,12 +1204,45 @@ class poloniex extends poloniex$1 {
1212
1204
  // "event": "error",
1213
1205
  // "message": "Platform in maintenance mode"
1214
1206
  // }
1207
+ // {
1208
+ // "id":"1722386782048",
1209
+ // "data":[
1210
+ // {
1211
+ // "orderId":0,
1212
+ // "clientOrderId":null,
1213
+ // "message":"available insufficient",
1214
+ // "code":21721
1215
+ // }
1216
+ // ]
1217
+ // }
1215
1218
  //
1219
+ const id = this.safeString(message, 'id');
1216
1220
  const event = this.safeString(message, 'event');
1217
- const orderId = this.safeString(message, 'orderId');
1221
+ const data = this.safeList(message, 'data');
1222
+ const first = this.safeDict(data, 0);
1223
+ const orderId = this.safeString(first, 'orderId');
1218
1224
  if ((event === 'error') || (orderId === '0')) {
1219
- const error = this.safeString(message, 'message');
1220
- throw new errors.ExchangeError(this.id + ' error: ' + this.json(error));
1225
+ try {
1226
+ const error = this.safeString(first, 'message');
1227
+ const code = this.safeString(first, 'code');
1228
+ const feedback = this.id + ' ' + this.json(message);
1229
+ this.throwExactlyMatchedException(this.exceptions['exact'], code, feedback);
1230
+ this.throwBroadlyMatchedException(this.exceptions['broad'], error, feedback);
1231
+ throw new errors.ExchangeError(feedback);
1232
+ }
1233
+ catch (e) {
1234
+ if (e instanceof errors.AuthenticationError) {
1235
+ const messageHash = 'authenticated';
1236
+ client.reject(e, messageHash);
1237
+ if (messageHash in client.subscriptions) {
1238
+ delete client.subscriptions[messageHash];
1239
+ }
1240
+ }
1241
+ else {
1242
+ client.reject(e, id);
1243
+ }
1244
+ return true;
1245
+ }
1221
1246
  }
1222
1247
  return false;
1223
1248
  }
@@ -27,7 +27,7 @@ class woo extends woo$1 {
27
27
  'api': {
28
28
  'ws': {
29
29
  'public': 'wss://wss.woo.org/ws/stream',
30
- 'private': 'wss://wss.woo.network/v2/ws/private/stream',
30
+ 'private': 'wss://wss.woo.org/v2/ws/private/stream',
31
31
  },
32
32
  },
33
33
  'test': {
@@ -72,7 +72,8 @@ class woo extends woo$1 {
72
72
  return newValue;
73
73
  }
74
74
  async watchPublic(messageHash, message) {
75
- const url = this.urls['api']['ws']['public'] + '/' + this.uid;
75
+ const urlUid = (this.uid) ? '/' + this.uid : '';
76
+ const url = this.urls['api']['ws']['public'] + urlUid;
76
77
  const requestId = this.requestId(url);
77
78
  const subscribe = {
78
79
  'id': requestId,
@@ -466,7 +467,7 @@ class woo extends woo$1 {
466
467
  const marketId = this.safeString(trade, 'symbol');
467
468
  market = this.safeMarket(marketId, market);
468
469
  const symbol = market['symbol'];
469
- const price = this.safeString(trade, 'executedPrice', 'price');
470
+ const price = this.safeString2(trade, 'executedPrice', 'price');
470
471
  const amount = this.safeString2(trade, 'executedQuantity', 'size');
471
472
  const cost = Precise["default"].stringMul(price, amount);
472
473
  const side = this.safeStringLower(trade, 'side');
@@ -504,7 +505,7 @@ class woo extends woo$1 {
504
505
  checkRequiredUid(error = true) {
505
506
  if (!this.uid) {
506
507
  if (error) {
507
- throw new errors.AuthenticationError(this.id + ' requires `uid` credential');
508
+ throw new errors.AuthenticationError(this.id + ' requires `uid` credential (woox calls it `application_id`)');
508
509
  }
509
510
  else {
510
511
  return false;
@@ -0,0 +1,100 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var modular = require('./modular.js');
6
+
7
+ /*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */
8
+ function validateOpts(opts) {
9
+ const { Fp } = opts;
10
+ modular.validateField(Fp);
11
+ for (const i of ['t', 'roundsFull', 'roundsPartial']) {
12
+ if (typeof opts[i] !== 'number' || !Number.isSafeInteger(opts[i]))
13
+ throw new Error(`Poseidon: invalid param ${i}=${opts[i]} (${typeof opts[i]})`);
14
+ }
15
+ if (opts.reversePartialPowIdx !== undefined && typeof opts.reversePartialPowIdx !== 'boolean')
16
+ throw new Error(`Poseidon: invalid param reversePartialPowIdx=${opts.reversePartialPowIdx}`);
17
+ // Default is 5, but by some reasons stark uses 3
18
+ let sboxPower = opts.sboxPower;
19
+ if (sboxPower === undefined)
20
+ sboxPower = 5;
21
+ if (typeof sboxPower !== 'number' || !Number.isSafeInteger(sboxPower))
22
+ throw new Error(`Poseidon wrong sboxPower=${sboxPower}`);
23
+ const _sboxPower = BigInt(sboxPower);
24
+ let sboxFn = (n) => modular.FpPow(Fp, n, _sboxPower);
25
+ // Unwrapped sbox power for common cases (195->142μs)
26
+ if (sboxPower === 3)
27
+ sboxFn = (n) => Fp.mul(Fp.sqrN(n), n);
28
+ else if (sboxPower === 5)
29
+ sboxFn = (n) => Fp.mul(Fp.sqrN(Fp.sqrN(n)), n);
30
+ if (opts.roundsFull % 2 !== 0)
31
+ throw new Error(`Poseidon roundsFull is not even: ${opts.roundsFull}`);
32
+ const rounds = opts.roundsFull + opts.roundsPartial;
33
+ if (!Array.isArray(opts.roundConstants) || opts.roundConstants.length !== rounds)
34
+ throw new Error('Poseidon: wrong round constants');
35
+ const roundConstants = opts.roundConstants.map((rc) => {
36
+ if (!Array.isArray(rc) || rc.length !== opts.t)
37
+ throw new Error(`Poseidon wrong round constants: ${rc}`);
38
+ return rc.map((i) => {
39
+ if (typeof i !== 'bigint' || !Fp.isValid(i))
40
+ throw new Error(`Poseidon wrong round constant=${i}`);
41
+ return Fp.create(i);
42
+ });
43
+ });
44
+ // MDS is TxT matrix
45
+ if (!Array.isArray(opts.mds) || opts.mds.length !== opts.t)
46
+ throw new Error('Poseidon: wrong MDS matrix');
47
+ const mds = opts.mds.map((mdsRow) => {
48
+ if (!Array.isArray(mdsRow) || mdsRow.length !== opts.t)
49
+ throw new Error(`Poseidon MDS matrix row: ${mdsRow}`);
50
+ return mdsRow.map((i) => {
51
+ if (typeof i !== 'bigint')
52
+ throw new Error(`Poseidon MDS matrix value=${i}`);
53
+ return Fp.create(i);
54
+ });
55
+ });
56
+ return Object.freeze({ ...opts, rounds, sboxFn, roundConstants, mds });
57
+ }
58
+ function poseidon(opts) {
59
+ const { t, Fp, rounds, sboxFn, reversePartialPowIdx } = validateOpts(opts);
60
+ const halfRoundsFull = Math.floor(opts.roundsFull / 2);
61
+ const partialIdx = reversePartialPowIdx ? t - 1 : 0;
62
+ const poseidonRound = (values, isFull, idx) => {
63
+ values = values.map((i, j) => Fp.add(i, opts.roundConstants[idx][j]));
64
+ if (isFull)
65
+ values = values.map((i) => sboxFn(i));
66
+ else
67
+ values[partialIdx] = sboxFn(values[partialIdx]);
68
+ // Matrix multiplication
69
+ values = opts.mds.map((i) => i.reduce((acc, i, j) => Fp.add(acc, Fp.mulN(i, values[j])), Fp.ZERO));
70
+ return values;
71
+ };
72
+ const poseidonHash = function poseidonHash(values) {
73
+ if (!Array.isArray(values) || values.length !== t)
74
+ throw new Error(`Poseidon: wrong values (expected array of bigints with length ${t})`);
75
+ values = values.map((i) => {
76
+ if (typeof i !== 'bigint')
77
+ throw new Error(`Poseidon: wrong value=${i} (${typeof i})`);
78
+ return Fp.create(i);
79
+ });
80
+ let round = 0;
81
+ // Apply r_f/2 full rounds.
82
+ for (let i = 0; i < halfRoundsFull; i++)
83
+ values = poseidonRound(values, true, round++);
84
+ // Apply r_p partial rounds.
85
+ for (let i = 0; i < opts.roundsPartial; i++)
86
+ values = poseidonRound(values, false, round++);
87
+ // Apply r_f/2 full rounds.
88
+ for (let i = 0; i < halfRoundsFull; i++)
89
+ values = poseidonRound(values, true, round++);
90
+ if (round !== rounds)
91
+ throw new Error(`Poseidon: wrong number of rounds: last round=${round}, total=${rounds}`);
92
+ return values;
93
+ };
94
+ // For verification in tests
95
+ poseidonHash.roundConstants = opts.roundConstants;
96
+ return poseidonHash;
97
+ }
98
+
99
+ exports.poseidon = poseidon;
100
+ exports.validateOpts = validateOpts;
@@ -1012,6 +1012,7 @@ function mapToCurveSimpleSWU(Fp, opts) {
1012
1012
  };
1013
1013
  }
1014
1014
 
1015
+ exports.DER = DER;
1015
1016
  exports.SWUFpSqrtRatio = SWUFpSqrtRatio;
1016
1017
  exports.mapToCurveSimpleSWU = mapToCurveSimpleSWU;
1017
1018
  exports.weierstrass = weierstrass;