ccxt 4.3.70 → 4.3.72
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -5
- package/dist/ccxt.browser.min.js +13 -10
- package/dist/cjs/ccxt.js +6 -1
- package/dist/cjs/src/abstract/paradex.js +9 -0
- package/dist/cjs/src/base/Exchange.js +49 -0
- package/dist/cjs/src/paradex.js +2075 -0
- package/dist/cjs/src/pro/bequant.js +4 -0
- package/dist/cjs/src/pro/paradex.js +365 -0
- package/dist/cjs/src/static_dependencies/noble-curves/abstract/poseidon.js +100 -0
- package/dist/cjs/src/static_dependencies/noble-curves/abstract/weierstrass.js +1 -0
- package/dist/cjs/src/static_dependencies/scure-starknet/index.js +284 -0
- package/dist/cjs/src/static_dependencies/starknet/constants.js +60 -0
- package/dist/cjs/src/static_dependencies/starknet/types/calldata.js +26 -0
- package/dist/cjs/src/static_dependencies/starknet/types/lib/contract/abi.js +8 -0
- package/dist/cjs/src/static_dependencies/starknet/types/lib/contract/index.js +13 -0
- package/dist/cjs/src/static_dependencies/starknet/types/lib/index.js +56 -0
- package/dist/cjs/src/static_dependencies/starknet/types/typedData.js +19 -0
- package/dist/cjs/src/static_dependencies/starknet/utils/assert.js +15 -0
- package/dist/cjs/src/static_dependencies/starknet/utils/cairoDataTypes/felt.js +44 -0
- package/dist/cjs/src/static_dependencies/starknet/utils/cairoDataTypes/uint256.js +122 -0
- package/dist/cjs/src/static_dependencies/starknet/utils/cairoDataTypes/uint512.js +137 -0
- package/dist/cjs/src/static_dependencies/starknet/utils/calldata/byteArray.js +61 -0
- package/dist/cjs/src/static_dependencies/starknet/utils/calldata/cairo.js +218 -0
- package/dist/cjs/src/static_dependencies/starknet/utils/calldata/enum/CairoCustomEnum.js +57 -0
- package/dist/cjs/src/static_dependencies/starknet/utils/calldata/enum/CairoOption.js +64 -0
- package/dist/cjs/src/static_dependencies/starknet/utils/calldata/enum/CairoResult.js +63 -0
- package/dist/cjs/src/static_dependencies/starknet/utils/calldata/formatter.js +66 -0
- package/dist/cjs/src/static_dependencies/starknet/utils/calldata/index.js +281 -0
- package/dist/cjs/src/static_dependencies/starknet/utils/calldata/parser/index.js +33 -0
- package/dist/cjs/src/static_dependencies/starknet/utils/calldata/parser/parser-0-1.1.0.js +37 -0
- package/dist/cjs/src/static_dependencies/starknet/utils/calldata/parser/parser-2.0.0.js +40 -0
- package/dist/cjs/src/static_dependencies/starknet/utils/calldata/propertyOrder.js +156 -0
- package/dist/cjs/src/static_dependencies/starknet/utils/calldata/requestParser.js +250 -0
- package/dist/cjs/src/static_dependencies/starknet/utils/calldata/responseParser.js +215 -0
- package/dist/cjs/src/static_dependencies/starknet/utils/calldata/tuple.js +112 -0
- package/dist/cjs/src/static_dependencies/starknet/utils/calldata/validate.js +206 -0
- package/dist/cjs/src/static_dependencies/starknet/utils/encode.js +58 -0
- package/dist/cjs/src/static_dependencies/starknet/utils/hash/classHash.js +57 -0
- package/dist/cjs/src/static_dependencies/starknet/utils/merkle.js +76 -0
- package/dist/cjs/src/static_dependencies/starknet/utils/num.js +92 -0
- package/dist/cjs/src/static_dependencies/starknet/utils/selector.js +48 -0
- package/dist/cjs/src/static_dependencies/starknet/utils/shortString.js +101 -0
- package/dist/cjs/src/static_dependencies/starknet/utils/typedData.js +334 -0
- package/dist/cjs/src/woo.js +4 -2
- package/examples/js/cli.js +8 -4
- package/js/ccxt.d.ts +8 -2
- package/js/ccxt.js +6 -2
- package/js/src/abstract/paradex.d.ts +43 -0
- package/js/src/abstract/paradex.js +11 -0
- package/js/src/base/Exchange.d.ts +7 -0
- package/js/src/base/Exchange.js +45 -0
- package/js/src/base/types.d.ts +10 -10
- package/js/src/paradex.d.ts +76 -0
- package/js/src/paradex.js +2075 -0
- package/js/src/pro/bequant.js +4 -0
- package/js/src/pro/paradex.d.ts +15 -0
- package/js/src/pro/paradex.js +366 -0
- package/js/src/static_dependencies/noble-curves/abstract/weierstrass.d.ts +24 -0
- package/js/src/static_dependencies/noble-curves/abstract/weierstrass.js +1 -1
- package/js/src/static_dependencies/scure-starknet/index.d.ts +79 -0
- package/js/src/static_dependencies/scure-starknet/index.js +323 -0
- package/js/src/static_dependencies/starknet/constants.d.ts +61 -0
- package/js/src/static_dependencies/starknet/constants.js +67 -0
- package/js/src/static_dependencies/starknet/index.d.ts +7 -0
- package/js/src/static_dependencies/starknet/index.js +50 -0
- package/js/src/static_dependencies/starknet/types/cairoEnum.d.ts +2 -0
- package/js/src/static_dependencies/starknet/types/cairoEnum.js +7 -0
- package/js/src/static_dependencies/starknet/types/calldata.d.ts +19 -0
- package/js/src/static_dependencies/starknet/types/calldata.js +28 -0
- package/js/src/static_dependencies/starknet/types/index.d.ts +13 -0
- package/js/src/static_dependencies/starknet/types/index.js +16 -0
- package/js/src/static_dependencies/starknet/types/lib/contract/abi.d.ts +71 -0
- package/js/src/static_dependencies/starknet/types/lib/contract/abi.js +13 -0
- package/js/src/static_dependencies/starknet/types/lib/contract/index.d.ts +24 -0
- package/js/src/static_dependencies/starknet/types/lib/contract/index.js +16 -0
- package/js/src/static_dependencies/starknet/types/lib/contract/legacy.d.ts +33 -0
- package/js/src/static_dependencies/starknet/types/lib/contract/legacy.js +7 -0
- package/js/src/static_dependencies/starknet/types/lib/contract/sierra.d.ts +52 -0
- package/js/src/static_dependencies/starknet/types/lib/contract/sierra.js +7 -0
- package/js/src/static_dependencies/starknet/types/lib/index.d.ts +248 -0
- package/js/src/static_dependencies/starknet/types/lib/index.js +52 -0
- package/js/src/static_dependencies/starknet/types/typedData.d.ts +44 -0
- package/js/src/static_dependencies/starknet/types/typedData.js +19 -0
- package/js/src/static_dependencies/starknet/utils/address.d.ts +53 -0
- package/js/src/static_dependencies/starknet/utils/address.js +89 -0
- package/js/src/static_dependencies/starknet/utils/assert.d.ts +7 -0
- package/js/src/static_dependencies/starknet/utils/assert.js +17 -0
- package/js/src/static_dependencies/starknet/utils/cairoDataTypes/felt.d.ts +6 -0
- package/js/src/static_dependencies/starknet/utils/cairoDataTypes/felt.js +43 -0
- package/js/src/static_dependencies/starknet/utils/cairoDataTypes/uint256.d.ts +72 -0
- package/js/src/static_dependencies/starknet/utils/cairoDataTypes/uint256.js +117 -0
- package/js/src/static_dependencies/starknet/utils/cairoDataTypes/uint512.d.ts +76 -0
- package/js/src/static_dependencies/starknet/utils/cairoDataTypes/uint512.js +136 -0
- package/js/src/static_dependencies/starknet/utils/calldata/byteArray.d.ts +32 -0
- package/js/src/static_dependencies/starknet/utils/calldata/byteArray.js +59 -0
- package/js/src/static_dependencies/starknet/utils/calldata/cairo.d.ts +183 -0
- package/js/src/static_dependencies/starknet/utils/calldata/cairo.js +229 -0
- package/js/src/static_dependencies/starknet/utils/calldata/enum/CairoCustomEnum.d.ts +38 -0
- package/js/src/static_dependencies/starknet/utils/calldata/enum/CairoCustomEnum.js +57 -0
- package/js/src/static_dependencies/starknet/utils/calldata/enum/CairoOption.d.ts +35 -0
- package/js/src/static_dependencies/starknet/utils/calldata/enum/CairoOption.js +64 -0
- package/js/src/static_dependencies/starknet/utils/calldata/enum/CairoResult.d.ts +34 -0
- package/js/src/static_dependencies/starknet/utils/calldata/enum/CairoResult.js +63 -0
- package/js/src/static_dependencies/starknet/utils/calldata/enum/index.d.ts +3 -0
- package/js/src/static_dependencies/starknet/utils/calldata/enum/index.js +9 -0
- package/js/src/static_dependencies/starknet/utils/calldata/formatter.d.ts +9 -0
- package/js/src/static_dependencies/starknet/utils/calldata/formatter.js +67 -0
- package/js/src/static_dependencies/starknet/utils/calldata/index.d.ts +89 -0
- package/js/src/static_dependencies/starknet/utils/calldata/index.js +280 -0
- package/js/src/static_dependencies/starknet/utils/calldata/parser/index.d.ts +5 -0
- package/js/src/static_dependencies/starknet/utils/calldata/parser/index.js +30 -0
- package/js/src/static_dependencies/starknet/utils/calldata/parser/interface.d.ts +20 -0
- package/js/src/static_dependencies/starknet/utils/calldata/parser/interface.js +8 -0
- package/js/src/static_dependencies/starknet/utils/calldata/parser/parser-0-1.1.0.d.ts +24 -0
- package/js/src/static_dependencies/starknet/utils/calldata/parser/parser-0-1.1.0.js +36 -0
- package/js/src/static_dependencies/starknet/utils/calldata/parser/parser-2.0.0.d.ts +23 -0
- package/js/src/static_dependencies/starknet/utils/calldata/parser/parser-2.0.0.js +40 -0
- package/js/src/static_dependencies/starknet/utils/calldata/propertyOrder.d.ts +2 -0
- package/js/src/static_dependencies/starknet/utils/calldata/propertyOrder.js +155 -0
- package/js/src/static_dependencies/starknet/utils/calldata/requestParser.d.ts +11 -0
- package/js/src/static_dependencies/starknet/utils/calldata/requestParser.js +248 -0
- package/js/src/static_dependencies/starknet/utils/calldata/responseParser.d.ts +11 -0
- package/js/src/static_dependencies/starknet/utils/calldata/responseParser.js +214 -0
- package/js/src/static_dependencies/starknet/utils/calldata/tuple.d.ts +6 -0
- package/js/src/static_dependencies/starknet/utils/calldata/tuple.js +113 -0
- package/js/src/static_dependencies/starknet/utils/calldata/validate.d.ts +6 -0
- package/js/src/static_dependencies/starknet/utils/calldata/validate.js +208 -0
- package/js/src/static_dependencies/starknet/utils/encode.d.ts +207 -0
- package/js/src/static_dependencies/starknet/utils/encode.js +282 -0
- package/js/src/static_dependencies/starknet/utils/hash/classHash.d.ts +57 -0
- package/js/src/static_dependencies/starknet/utils/hash/classHash.js +224 -0
- package/js/src/static_dependencies/starknet/utils/hash/index.d.ts +6 -0
- package/js/src/static_dependencies/starknet/utils/hash/index.js +13 -0
- package/js/src/static_dependencies/starknet/utils/json.d.ts +24 -0
- package/js/src/static_dependencies/starknet/utils/json.js +43 -0
- package/js/src/static_dependencies/starknet/utils/merkle.d.ts +35 -0
- package/js/src/static_dependencies/starknet/utils/merkle.js +84 -0
- package/js/src/static_dependencies/starknet/utils/num.d.ts +182 -0
- package/js/src/static_dependencies/starknet/utils/num.js +244 -0
- package/js/src/static_dependencies/starknet/utils/selector.d.ts +48 -0
- package/js/src/static_dependencies/starknet/utils/selector.js +85 -0
- package/js/src/static_dependencies/starknet/utils/shortString.d.ts +57 -0
- package/js/src/static_dependencies/starknet/utils/shortString.js +96 -0
- package/js/src/static_dependencies/starknet/utils/starknetId.d.ts +113 -0
- package/js/src/static_dependencies/starknet/utils/starknetId.js +265 -0
- package/js/src/static_dependencies/starknet/utils/typedData.d.ts +54 -0
- package/js/src/static_dependencies/starknet/utils/typedData.js +321 -0
- package/js/src/static_dependencies/starknet/utils/uint256.d.ts +21 -0
- package/js/src/static_dependencies/starknet/utils/uint256.js +32 -0
- package/js/src/static_dependencies/starknet/utils/url.d.ts +29 -0
- package/js/src/static_dependencies/starknet/utils/url.js +70 -0
- package/js/src/woo.js +4 -2
- package/package.json +1 -1
|
@@ -20,6 +20,10 @@ class bequant extends hitbtc {
|
|
|
20
20
|
'api': {
|
|
21
21
|
'public': 'https://api.bequant.io/api/3',
|
|
22
22
|
'private': 'https://api.bequant.io/api/3',
|
|
23
|
+
'ws': {
|
|
24
|
+
'public': 'wss://api.bequant.io/api/3/ws/public',
|
|
25
|
+
'private': 'wss://api.bequant.io/api/3/ws/trading',
|
|
26
|
+
},
|
|
23
27
|
},
|
|
24
28
|
'www': 'https://bequant.io',
|
|
25
29
|
'doc': [
|
|
@@ -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;
|
|
@@ -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;
|