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.
- package/README.md +7 -6
- package/dist/ccxt.browser.min.js +40 -16
- package/dist/cjs/_virtual/index.cjs.js +1459 -9
- package/dist/cjs/ccxt.js +8 -2
- package/dist/cjs/src/abstract/dydx.js +11 -0
- package/dist/cjs/src/base/Exchange.js +164 -10
- package/dist/cjs/src/base/ws/Client.js +3 -1
- package/dist/cjs/src/binance.js +8 -1
- package/dist/cjs/src/bingx.js +20 -0
- package/dist/cjs/src/bitget.js +43 -41
- package/dist/cjs/src/bybit.js +21 -23
- package/dist/cjs/src/deribit.js +6 -0
- package/dist/cjs/src/dydx.js +2454 -0
- package/dist/cjs/src/gate.js +4 -4
- package/dist/cjs/src/hibachi.js +1 -1
- package/dist/cjs/src/hyperliquid.js +207 -9
- package/dist/cjs/src/kucoin.js +711 -109
- package/dist/cjs/src/mexc.js +2 -3
- package/dist/cjs/src/pro/binance.js +59 -144
- package/dist/cjs/src/pro/dydx.js +418 -0
- package/dist/cjs/src/pro/kraken.js +4 -3
- package/dist/cjs/src/pro/xt.js +218 -4
- package/dist/cjs/src/protobuf/mexc/compiled.cjs.js +1 -0
- package/dist/cjs/src/static_dependencies/dydx-v4-client/cosmos/base/v1beta1/coin.js +56 -0
- package/dist/cjs/src/static_dependencies/dydx-v4-client/cosmos/crypto/multisig/v1beta1/multisig.js +56 -0
- package/dist/cjs/src/static_dependencies/dydx-v4-client/cosmos/crypto/secp256k1/keys.js +48 -0
- package/dist/cjs/src/static_dependencies/dydx-v4-client/cosmos/tx/signing/v1beta1/signing.js +343 -0
- package/dist/cjs/src/static_dependencies/dydx-v4-client/cosmos/tx/v1beta1/tx.js +717 -0
- package/dist/cjs/src/static_dependencies/dydx-v4-client/dydxprotocol/accountplus/tx.js +60 -0
- package/dist/cjs/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/clob_pair.js +45 -0
- package/dist/cjs/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/order.js +380 -0
- package/dist/cjs/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/order_removals.js +72 -0
- package/dist/cjs/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/tx.js +211 -0
- package/dist/cjs/src/static_dependencies/dydx-v4-client/dydxprotocol/sending/transfer.js +195 -0
- package/dist/cjs/src/static_dependencies/dydx-v4-client/dydxprotocol/sending/tx.js +49 -0
- package/dist/cjs/src/static_dependencies/dydx-v4-client/dydxprotocol/subaccounts/subaccount.js +57 -0
- package/dist/cjs/src/static_dependencies/dydx-v4-client/google/protobuf/any.js +56 -0
- package/dist/cjs/src/static_dependencies/dydx-v4-client/helpers.js +79 -0
- package/dist/cjs/src/static_dependencies/dydx-v4-client/long/index.cjs.js +9 -0
- package/dist/cjs/src/static_dependencies/dydx-v4-client/onboarding.js +59 -0
- package/dist/cjs/src/static_dependencies/dydx-v4-client/registry.js +39 -0
- package/dist/cjs/src/static_dependencies/noble-hashes/pbkdf2.js +69 -0
- package/dist/cjs/src/static_dependencies/noble-hashes/ripemd160.js +108 -0
- package/dist/cjs/src/static_dependencies/noble-hashes/utils.js +50 -1
- package/dist/cjs/src/static_dependencies/scure-base/index.js +29 -0
- package/dist/cjs/src/static_dependencies/scure-bip32/index.js +278 -0
- package/dist/cjs/src/static_dependencies/scure-bip39/index.js +97 -0
- package/dist/cjs/src/static_dependencies/scure-bip39/wordlists/english.js +2060 -0
- package/dist/cjs/src/static_dependencies/zklink/zklink-sdk-web.js +2 -0
- package/dist/cjs/src/toobit.js +2 -1
- package/js/ccxt.d.ts +8 -2
- package/js/ccxt.js +6 -2
- package/js/src/abstract/binance.d.ts +7 -0
- package/js/src/abstract/binancecoinm.d.ts +7 -0
- package/js/src/abstract/binanceus.d.ts +7 -0
- package/js/src/abstract/binanceusdm.d.ts +7 -0
- package/js/src/abstract/bitget.d.ts +1 -0
- package/js/src/abstract/dydx.d.ts +61 -0
- package/js/src/abstract/dydx.js +11 -0
- package/js/src/abstract/kucoin.d.ts +1 -1
- package/js/src/abstract/kucoinfutures.d.ts +1 -1
- package/js/src/base/Exchange.d.ts +7 -0
- package/js/src/base/Exchange.js +163 -10
- package/js/src/base/ws/Client.js +3 -1
- package/js/src/binance.js +8 -1
- package/js/src/bingx.js +20 -0
- package/js/src/bitget.d.ts +3 -3
- package/js/src/bitget.js +43 -41
- package/js/src/bybit.d.ts +3 -3
- package/js/src/bybit.js +21 -23
- package/js/src/deribit.js +6 -0
- package/js/src/dydx.d.ts +364 -0
- package/js/src/dydx.js +2453 -0
- package/js/src/gate.d.ts +2 -2
- package/js/src/gate.js +4 -4
- package/js/src/hibachi.js +1 -1
- package/js/src/hyperliquid.d.ts +17 -0
- package/js/src/hyperliquid.js +207 -9
- package/js/src/kucoin.d.ts +48 -1
- package/js/src/kucoin.js +711 -109
- package/js/src/mexc.js +2 -3
- package/js/src/pro/binance.d.ts +2 -2
- package/js/src/pro/binance.js +59 -144
- package/js/src/pro/dydx.d.ts +81 -0
- package/js/src/pro/dydx.js +417 -0
- package/js/src/pro/kraken.js +4 -3
- package/js/src/pro/xt.d.ts +85 -2
- package/js/src/pro/xt.js +218 -4
- package/js/src/static_dependencies/dydx-v4-client/cosmos/base/v1beta1/coin.d.ts +90 -0
- package/js/src/static_dependencies/dydx-v4-client/cosmos/base/v1beta1/coin.js +163 -0
- package/js/src/static_dependencies/dydx-v4-client/cosmos/crypto/multisig/keys.d.ts +26 -0
- package/js/src/static_dependencies/dydx-v4-client/cosmos/crypto/multisig/keys.js +51 -0
- package/js/src/static_dependencies/dydx-v4-client/cosmos/crypto/multisig/v1beta1/multisig.d.ts +48 -0
- package/js/src/static_dependencies/dydx-v4-client/cosmos/crypto/multisig/v1beta1/multisig.js +85 -0
- package/js/src/static_dependencies/dydx-v4-client/cosmos/crypto/secp256k1/keys.d.ts +40 -0
- package/js/src/static_dependencies/dydx-v4-client/cosmos/crypto/secp256k1/keys.js +77 -0
- package/js/src/static_dependencies/dydx-v4-client/cosmos/tx/signing/v1beta1/signing.d.ts +162 -0
- package/js/src/static_dependencies/dydx-v4-client/cosmos/tx/signing/v1beta1/signing.js +329 -0
- package/js/src/static_dependencies/dydx-v4-client/cosmos/tx/v1beta1/tx.d.ts +460 -0
- package/js/src/static_dependencies/dydx-v4-client/cosmos/tx/v1beta1/tx.js +698 -0
- package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/accountplus/tx.d.ts +127 -0
- package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/accountplus/tx.js +286 -0
- package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/block_rate_limit_config.d.ts +66 -0
- package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/block_rate_limit_config.js +109 -0
- package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/clob_pair.d.ts +127 -0
- package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/clob_pair.js +257 -0
- package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/equity_tier_limit_config.d.ts +48 -0
- package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/equity_tier_limit_config.js +93 -0
- package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/finalize_block.d.ts +23 -0
- package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/finalize_block.js +43 -0
- package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/liquidations.d.ts +92 -0
- package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/liquidations.js +164 -0
- package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/liquidations_config.d.ts +124 -0
- package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/liquidations_config.js +196 -0
- package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/matches.d.ts +159 -0
- package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/matches.js +324 -0
- package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/order.d.ts +546 -0
- package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/order.js +872 -0
- package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/order_removals.d.ts +84 -0
- package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/order_removals.js +181 -0
- package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/tx.d.ts +397 -0
- package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/tx.js +757 -0
- package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/sending/transfer.d.ts +120 -0
- package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/sending/transfer.js +246 -0
- package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/sending/tx.d.ts +79 -0
- package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/sending/tx.js +147 -0
- package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/subaccounts/asset_position.d.ts +32 -0
- package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/subaccounts/asset_position.js +59 -0
- package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/subaccounts/perpetual_position.d.ts +34 -0
- package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/subaccounts/perpetual_position.js +66 -0
- package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/subaccounts/subaccount.d.ts +62 -0
- package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/subaccounts/subaccount.js +111 -0
- package/js/src/static_dependencies/dydx-v4-client/google/protobuf/any.d.ts +207 -0
- package/js/src/static_dependencies/dydx-v4-client/google/protobuf/any.js +50 -0
- package/js/src/static_dependencies/dydx-v4-client/helpers.d.ts +82 -0
- package/js/src/static_dependencies/dydx-v4-client/helpers.js +172 -0
- package/js/src/static_dependencies/dydx-v4-client/long/index.cjs +1473 -0
- package/js/src/static_dependencies/dydx-v4-client/long/index.d.cts +2 -0
- package/js/src/static_dependencies/dydx-v4-client/onboarding.d.ts +35 -0
- package/js/src/static_dependencies/dydx-v4-client/onboarding.js +56 -0
- package/js/src/static_dependencies/dydx-v4-client/registry.d.ts +7 -0
- package/js/src/static_dependencies/dydx-v4-client/registry.js +36 -0
- package/js/src/static_dependencies/noble-hashes/utils.d.ts +1 -0
- package/js/src/static_dependencies/noble-hashes/utils.js +4 -0
- package/js/src/static_dependencies/scure-bip32/index.d.ts +49 -0
- package/js/src/static_dependencies/scure-bip32/index.js +295 -0
- package/js/src/static_dependencies/scure-bip39/index.d.ts +54 -0
- package/js/src/static_dependencies/scure-bip39/index.js +140 -0
- package/js/src/static_dependencies/scure-bip39/wordlists/english.d.ts +1 -0
- package/js/src/static_dependencies/scure-bip39/wordlists/english.js +2054 -0
- package/js/src/toobit.js +2 -1
- 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
|
|
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
|
-
|
|
1306
|
+
if (symbol !== undefined) {
|
|
1307
|
+
symbols[symbol] = true;
|
|
1308
|
+
}
|
|
1308
1309
|
}
|
|
1309
1310
|
const name = 'orders';
|
|
1310
1311
|
client.resolve(this.orders, name);
|