@drift-labs/common 1.0.13 → 1.0.16
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/lib/clients/DlobWebsocketClient.d.ts +82 -0
- package/lib/clients/DlobWebsocketClient.js +226 -0
- package/lib/clients/DlobWebsocketClient.js.map +1 -0
- package/lib/clients/swiftClient.js +1 -0
- package/lib/clients/swiftClient.js.map +1 -1
- package/lib/common-ui-utils/commonUiUtils.d.ts +22 -3
- package/lib/common-ui-utils/commonUiUtils.js +15 -8
- package/lib/common-ui-utils/commonUiUtils.js.map +1 -1
- package/lib/common-ui-utils/market.d.ts +5 -0
- package/lib/common-ui-utils/market.js +19 -11
- package/lib/common-ui-utils/market.js.map +1 -1
- package/lib/common-ui-utils/order.d.ts +8 -1
- package/lib/common-ui-utils/order.js +3 -2
- package/lib/common-ui-utils/order.js.map +1 -1
- package/lib/common-ui-utils/user.d.ts +5 -0
- package/lib/common-ui-utils/user.js +58 -3
- package/lib/common-ui-utils/user.js.map +1 -1
- package/lib/constants/markets.d.ts +4 -0
- package/lib/constants/markets.js +5 -1
- package/lib/constants/markets.js.map +1 -1
- package/lib/constants/superstake.js.map +1 -1
- package/lib/drift/Drift/clients/AuthorityDrift/DriftL2OrderbookManager.d.ts +1 -1
- package/lib/drift/Drift/clients/AuthorityDrift/DriftL2OrderbookManager.js.map +1 -1
- package/lib/drift/Drift/clients/AuthorityDrift/index.d.ts +1 -1
- package/lib/drift/Drift/clients/AuthorityDrift/index.js.map +1 -1
- package/lib/drift/Drift/clients/CentralServerDrift/index.d.ts +3 -2
- package/lib/drift/Drift/clients/CentralServerDrift/index.js +52 -49
- package/lib/drift/Drift/clients/CentralServerDrift/index.js.map +1 -1
- package/lib/drift/Drift/data/PollingDlob.d.ts +1 -1
- package/lib/drift/Drift/data/PollingDlob.js.map +1 -1
- package/lib/drift/base/actions/trade/editOrder.d.ts +3 -0
- package/lib/drift/base/actions/trade/editOrder.js.map +1 -1
- package/lib/drift/base/actions/trade/index.d.ts +1 -0
- package/lib/drift/base/actions/trade/index.js +1 -0
- package/lib/drift/base/actions/trade/index.js.map +1 -1
- package/lib/drift/base/actions/trade/margin.d.ts +24 -0
- package/lib/drift/base/actions/trade/margin.js +48 -0
- package/lib/drift/base/actions/trade/margin.js.map +1 -0
- package/lib/drift/base/actions/trade/openPerpOrder/auction.d.ts +3 -1
- package/lib/drift/base/actions/trade/openPerpOrder/auction.js +2 -2
- package/lib/drift/base/actions/trade/openPerpOrder/auction.js.map +1 -1
- package/lib/drift/base/actions/trade/openPerpOrder/dlobServer/index.d.ts +2 -6
- package/lib/drift/base/actions/trade/openPerpOrder/dlobServer/index.js.map +1 -1
- package/lib/drift/base/actions/trade/openPerpOrder/openPerpMarketOrder/index.d.ts +6 -3
- package/lib/drift/base/actions/trade/openPerpOrder/openPerpMarketOrder/index.js +6 -6
- package/lib/drift/base/actions/trade/openPerpOrder/openPerpMarketOrder/index.js.map +1 -1
- package/lib/drift/base/actions/trade/openPerpOrder/openPerpNonMarketOrder/index.d.ts +2 -0
- package/lib/drift/base/actions/trade/openPerpOrder/openPerpNonMarketOrder/index.js +3 -2
- package/lib/drift/base/actions/trade/openPerpOrder/openPerpNonMarketOrder/index.js.map +1 -1
- package/lib/drift/base/actions/trade/openPerpOrder/openSwiftOrder/index.js +2 -1
- package/lib/drift/base/actions/trade/openPerpOrder/openSwiftOrder/index.js.map +1 -1
- package/lib/drift/base/actions/trade/swap.d.ts +18 -11
- package/lib/drift/base/actions/trade/swap.js +40 -17
- package/lib/drift/base/actions/trade/swap.js.map +1 -1
- package/lib/index.d.ts +1 -0
- package/lib/index.js +1 -0
- package/lib/index.js.map +1 -1
- package/lib/utils/MultiplexWebSocket.d.ts +4 -2
- package/lib/utils/MultiplexWebSocket.js +18 -9
- package/lib/utils/MultiplexWebSocket.js.map +1 -1
- package/lib/utils/ResultSlotIncrementer.d.ts +31 -0
- package/lib/utils/ResultSlotIncrementer.js +83 -0
- package/lib/utils/ResultSlotIncrementer.js.map +1 -0
- package/lib/utils/index.d.ts +3 -1
- package/lib/utils/index.js +7 -1
- package/lib/utils/index.js.map +1 -1
- package/lib/utils/math.js +1 -1
- package/lib/utils/math.js.map +1 -1
- package/lib/utils/orderbook/constants.d.ts +2 -0
- package/lib/utils/orderbook/constants.js +5 -0
- package/lib/utils/orderbook/constants.js.map +1 -0
- package/lib/utils/orderbook/index.d.ts +38 -59
- package/lib/utils/orderbook/index.js +285 -1
- package/lib/utils/orderbook/index.js.map +1 -1
- package/lib/utils/orderbook/types.d.ts +101 -0
- package/lib/utils/orderbook/types.js +9 -0
- package/lib/utils/orderbook/types.js.map +1 -0
- package/lib/utils/signedMsgs.d.ts +1 -0
- package/lib/utils/signedMsgs.js +10 -0
- package/lib/utils/signedMsgs.js.map +1 -0
- package/package.json +1 -1
|
@@ -60,18 +60,18 @@ class CentralServerDrift {
|
|
|
60
60
|
oracleInfos: oracleInfos.oracleInfos,
|
|
61
61
|
...config.additionalDriftClientConfig,
|
|
62
62
|
};
|
|
63
|
-
this.
|
|
64
|
-
this.markets = new markets_1.CentralServerDriftMarkets(this.
|
|
63
|
+
this._driftClient = new sdk_1.DriftClient(driftClientConfig);
|
|
64
|
+
this.markets = new markets_1.CentralServerDriftMarkets(this._driftClient);
|
|
65
65
|
const txSender = new sdk_1.WhileValidTxSender({
|
|
66
66
|
connection,
|
|
67
67
|
wallet,
|
|
68
68
|
additionalConnections: [],
|
|
69
69
|
additionalTxSenderCallbacks: [],
|
|
70
|
-
txHandler: this.
|
|
70
|
+
txHandler: this._driftClient.txHandler,
|
|
71
71
|
confirmationStrategy: constants_1.DEFAULT_TX_SENDER_CONFIRMATION_STRATEGY,
|
|
72
72
|
retrySleep: constants_1.DEFAULT_TX_SENDER_RETRY_INTERVAL,
|
|
73
73
|
});
|
|
74
|
-
this.
|
|
74
|
+
this._driftClient.txSender = txSender;
|
|
75
75
|
// set up Drift endpoints
|
|
76
76
|
const driftDlobServerHttpUrlToUse = EnvironmentConstants_1.EnvironmentConstants.dlobServerHttpUrl[config.driftEnv === 'devnet' ? 'dev' : 'mainnet'];
|
|
77
77
|
const swiftServerUrlToUse = EnvironmentConstants_1.EnvironmentConstants.swiftServerUrl[config.driftEnv === 'devnet' ? 'staging' : 'mainnet'];
|
|
@@ -80,11 +80,14 @@ class CentralServerDrift {
|
|
|
80
80
|
swiftServerUrl: swiftServerUrlToUse,
|
|
81
81
|
};
|
|
82
82
|
}
|
|
83
|
+
get driftClient() {
|
|
84
|
+
return this._driftClient;
|
|
85
|
+
}
|
|
83
86
|
async subscribe() {
|
|
84
|
-
await this.
|
|
87
|
+
await this._driftClient.subscribe();
|
|
85
88
|
}
|
|
86
89
|
async unsubscribe() {
|
|
87
|
-
await this.
|
|
90
|
+
await this._driftClient.unsubscribe();
|
|
88
91
|
}
|
|
89
92
|
/**
|
|
90
93
|
* Manages DriftClient state for transaction creation with proper setup and cleanup.
|
|
@@ -100,22 +103,22 @@ class CentralServerDrift {
|
|
|
100
103
|
*/
|
|
101
104
|
async driftClientContextWrapper(userAccountPublicKey, operation) {
|
|
102
105
|
const user = new sdk_1.User({
|
|
103
|
-
driftClient: this.
|
|
106
|
+
driftClient: this._driftClient,
|
|
104
107
|
userAccountPublicKey,
|
|
105
108
|
accountSubscription: {
|
|
106
109
|
type: 'custom',
|
|
107
|
-
userAccountSubscriber: new sdk_1.OneShotUserAccountSubscriber(this.
|
|
110
|
+
userAccountSubscriber: new sdk_1.OneShotUserAccountSubscriber(this._driftClient.program, userAccountPublicKey, undefined, undefined),
|
|
108
111
|
},
|
|
109
112
|
});
|
|
110
113
|
// Store original state
|
|
111
|
-
const originalWallet = this.
|
|
112
|
-
const originalAuthority = this.
|
|
114
|
+
const originalWallet = this._driftClient.wallet;
|
|
115
|
+
const originalAuthority = this._driftClient.authority;
|
|
113
116
|
try {
|
|
114
117
|
// Setup: Subscribe to user and configure DriftClient
|
|
115
118
|
await user.subscribe();
|
|
116
119
|
const authority = user.getUserAccount().authority;
|
|
117
|
-
this.
|
|
118
|
-
const success = await this.
|
|
120
|
+
this._driftClient.authority = authority;
|
|
121
|
+
const success = await this._driftClient.addUser(user.getUserAccount().subAccountId, authority);
|
|
119
122
|
if (!success) {
|
|
120
123
|
throw new Error('Failed to add user to DriftClient');
|
|
121
124
|
}
|
|
@@ -127,22 +130,22 @@ class CentralServerDrift {
|
|
|
127
130
|
signAllTransactions: () => Promise.reject('This is a placeholder - do not sign with this wallet'),
|
|
128
131
|
};
|
|
129
132
|
// Update wallet in all places that reference it
|
|
130
|
-
this.
|
|
133
|
+
this._driftClient.wallet = userWallet;
|
|
131
134
|
//@ts-ignore
|
|
132
|
-
this.
|
|
133
|
-
this.
|
|
135
|
+
this._driftClient.provider.wallet = userWallet;
|
|
136
|
+
this._driftClient.txHandler.updateWallet(userWallet);
|
|
134
137
|
// Execute the operation
|
|
135
138
|
const result = await operation(user);
|
|
136
139
|
return result;
|
|
137
140
|
}
|
|
138
141
|
finally {
|
|
139
142
|
// Cleanup: Always restore original state and unsubscribe
|
|
140
|
-
this.
|
|
141
|
-
this.
|
|
142
|
-
this.
|
|
143
|
+
this._driftClient.wallet = originalWallet;
|
|
144
|
+
this._driftClient.txHandler.updateWallet(originalWallet);
|
|
145
|
+
this._driftClient.authority = originalAuthority;
|
|
143
146
|
try {
|
|
144
147
|
await user.unsubscribe();
|
|
145
|
-
this.
|
|
148
|
+
this._driftClient.users.clear();
|
|
146
149
|
}
|
|
147
150
|
catch (cleanupError) {
|
|
148
151
|
console.warn('Error during cleanup:', cleanupError);
|
|
@@ -158,9 +161,9 @@ class CentralServerDrift {
|
|
|
158
161
|
* @param userAccountPublicKey - The user account public key
|
|
159
162
|
*/
|
|
160
163
|
async getUser(userAccountPublicKey) {
|
|
161
|
-
const oneShotUserAccountSubscriber = new sdk_1.OneShotUserAccountSubscriber(this.
|
|
164
|
+
const oneShotUserAccountSubscriber = new sdk_1.OneShotUserAccountSubscriber(this._driftClient.program, userAccountPublicKey, undefined, undefined);
|
|
162
165
|
const user = new sdk_1.User({
|
|
163
|
-
driftClient: this.
|
|
166
|
+
driftClient: this._driftClient,
|
|
164
167
|
userAccountPublicKey,
|
|
165
168
|
accountSubscription: {
|
|
166
169
|
type: 'custom',
|
|
@@ -175,22 +178,22 @@ class CentralServerDrift {
|
|
|
175
178
|
if (!spotMarketConfig) {
|
|
176
179
|
throw new Error(`Spot market config not found for index ${spotMarketIndex}`);
|
|
177
180
|
}
|
|
178
|
-
const userStatsAccount = await (0, sdk_1.fetchUserStatsAccount)(this.
|
|
179
|
-
const originalWallet = this.
|
|
180
|
-
const originalAuthority = this.
|
|
181
|
+
const userStatsAccount = await (0, sdk_1.fetchUserStatsAccount)(this._driftClient.connection, this._driftClient.program, authority);
|
|
182
|
+
const originalWallet = this._driftClient.wallet;
|
|
183
|
+
const originalAuthority = this._driftClient.authority;
|
|
181
184
|
const authorityWallet = {
|
|
182
185
|
publicKey: authority,
|
|
183
186
|
signTransaction: () => Promise.reject('This is a placeholder - do not sign with this wallet'),
|
|
184
187
|
signAllTransactions: () => Promise.reject('This is a placeholder - do not sign with this wallet'),
|
|
185
188
|
};
|
|
186
189
|
try {
|
|
187
|
-
this.
|
|
190
|
+
this._driftClient.wallet = authorityWallet;
|
|
188
191
|
// @ts-ignore
|
|
189
|
-
this.
|
|
190
|
-
this.
|
|
191
|
-
this.
|
|
192
|
+
this._driftClient.provider.wallet = authorityWallet;
|
|
193
|
+
this._driftClient.txHandler.updateWallet(authorityWallet);
|
|
194
|
+
this._driftClient.authority = authority;
|
|
192
195
|
return await (0, create_1.createUserAndDepositCollateralBaseTxn)({
|
|
193
|
-
driftClient: this.
|
|
196
|
+
driftClient: this._driftClient,
|
|
194
197
|
amount,
|
|
195
198
|
spotMarketConfig,
|
|
196
199
|
authority,
|
|
@@ -204,11 +207,11 @@ class CentralServerDrift {
|
|
|
204
207
|
});
|
|
205
208
|
}
|
|
206
209
|
finally {
|
|
207
|
-
this.
|
|
208
|
-
this.
|
|
210
|
+
this._driftClient.wallet = originalWallet;
|
|
211
|
+
this._driftClient.txHandler.updateWallet(originalWallet);
|
|
209
212
|
// @ts-ignore
|
|
210
|
-
this.
|
|
211
|
-
this.
|
|
213
|
+
this._driftClient.provider.wallet = originalWallet;
|
|
214
|
+
this._driftClient.authority = originalAuthority;
|
|
212
215
|
}
|
|
213
216
|
}
|
|
214
217
|
async getDepositTxn(userAccountPublicKey, amount, spotMarketIndex, options) {
|
|
@@ -218,7 +221,7 @@ class CentralServerDrift {
|
|
|
218
221
|
throw new Error(`Spot market config not found for index ${spotMarketIndex}`);
|
|
219
222
|
}
|
|
220
223
|
const depositTxn = await (0, deposit_1.createDepositTxn)({
|
|
221
|
-
driftClient: this.
|
|
224
|
+
driftClient: this._driftClient,
|
|
222
225
|
user,
|
|
223
226
|
amount: sdk_1.BigNum.from(amount, spotMarketConfig.precisionExp),
|
|
224
227
|
spotMarketConfig,
|
|
@@ -230,7 +233,7 @@ class CentralServerDrift {
|
|
|
230
233
|
async getDeleteUserTxn(userAccountPublicKey, options) {
|
|
231
234
|
return this.driftClientContextWrapper(userAccountPublicKey, async () => {
|
|
232
235
|
return (0, delete_1.deleteUserTxn)({
|
|
233
|
-
driftClient: this.
|
|
236
|
+
driftClient: this._driftClient,
|
|
234
237
|
userPublicKey: userAccountPublicKey,
|
|
235
238
|
txParams: options === null || options === void 0 ? void 0 : options.txParams,
|
|
236
239
|
});
|
|
@@ -243,7 +246,7 @@ class CentralServerDrift {
|
|
|
243
246
|
throw new Error(`Spot market config not found for index ${spotMarketIndex}`);
|
|
244
247
|
}
|
|
245
248
|
const withdrawTxn = await (0, withdraw_1.createWithdrawTxn)({
|
|
246
|
-
driftClient: this.
|
|
249
|
+
driftClient: this._driftClient,
|
|
247
250
|
user,
|
|
248
251
|
amount: sdk_1.BigNum.from(amount, spotMarketConfig.precisionExp),
|
|
249
252
|
spotMarketConfig,
|
|
@@ -257,7 +260,7 @@ class CentralServerDrift {
|
|
|
257
260
|
async getSettleFundingTxn(userAccountPublicKey, options) {
|
|
258
261
|
return this.driftClientContextWrapper(userAccountPublicKey, async (user) => {
|
|
259
262
|
const settleFundingTxn = await (0, settleFunding_1.createSettleFundingTxn)({
|
|
260
|
-
driftClient: this.
|
|
263
|
+
driftClient: this._driftClient,
|
|
261
264
|
user,
|
|
262
265
|
txParams: options === null || options === void 0 ? void 0 : options.txParams,
|
|
263
266
|
});
|
|
@@ -267,7 +270,7 @@ class CentralServerDrift {
|
|
|
267
270
|
async getSettlePnlTxn(userAccountPublicKey, marketIndexes, options) {
|
|
268
271
|
return this.driftClientContextWrapper(userAccountPublicKey, async (user) => {
|
|
269
272
|
const settlePnlTxn = await (0, settlePnl_1.createSettlePnlTxn)({
|
|
270
|
-
driftClient: this.
|
|
273
|
+
driftClient: this._driftClient,
|
|
271
274
|
user,
|
|
272
275
|
marketIndexes,
|
|
273
276
|
txParams: options === null || options === void 0 ? void 0 : options.txParams,
|
|
@@ -286,7 +289,7 @@ class CentralServerDrift {
|
|
|
286
289
|
...swiftOptions,
|
|
287
290
|
swiftServerUrl: this._driftEndpoints.swiftServerUrl,
|
|
288
291
|
},
|
|
289
|
-
driftClient: this.
|
|
292
|
+
driftClient: this._driftClient,
|
|
290
293
|
user,
|
|
291
294
|
dlobServerHttpUrl: this._driftEndpoints.dlobServerHttpUrl,
|
|
292
295
|
});
|
|
@@ -297,7 +300,7 @@ class CentralServerDrift {
|
|
|
297
300
|
...otherProps,
|
|
298
301
|
placeAndTake,
|
|
299
302
|
useSwift: false,
|
|
300
|
-
driftClient: this.
|
|
303
|
+
driftClient: this._driftClient,
|
|
301
304
|
user,
|
|
302
305
|
dlobServerHttpUrl: this._driftEndpoints.dlobServerHttpUrl,
|
|
303
306
|
});
|
|
@@ -316,7 +319,7 @@ class CentralServerDrift {
|
|
|
316
319
|
...swiftOptions,
|
|
317
320
|
swiftServerUrl: this._driftEndpoints.swiftServerUrl,
|
|
318
321
|
},
|
|
319
|
-
driftClient: this.
|
|
322
|
+
driftClient: this._driftClient,
|
|
320
323
|
user,
|
|
321
324
|
dlobServerHttpUrl: this._driftEndpoints.dlobServerHttpUrl,
|
|
322
325
|
});
|
|
@@ -326,7 +329,7 @@ class CentralServerDrift {
|
|
|
326
329
|
const openPerpNonMarketOrderTxn = await (0, openPerpNonMarketOrder_1.createOpenPerpNonMarketOrder)({
|
|
327
330
|
...otherProps,
|
|
328
331
|
useSwift: false,
|
|
329
|
-
driftClient: this.
|
|
332
|
+
driftClient: this._driftClient,
|
|
330
333
|
user,
|
|
331
334
|
dlobServerHttpUrl: this._driftEndpoints.dlobServerHttpUrl,
|
|
332
335
|
});
|
|
@@ -340,7 +343,7 @@ class CentralServerDrift {
|
|
|
340
343
|
async getEditOrderTxn(userAccountPublicKey, orderId, editOrderParams) {
|
|
341
344
|
return this.driftClientContextWrapper(userAccountPublicKey, async (user) => {
|
|
342
345
|
const editOrderTxn = await (0, editOrder_1.createEditOrderTxn)({
|
|
343
|
-
driftClient: this.
|
|
346
|
+
driftClient: this._driftClient,
|
|
344
347
|
user,
|
|
345
348
|
orderId,
|
|
346
349
|
editOrderParams,
|
|
@@ -354,7 +357,7 @@ class CentralServerDrift {
|
|
|
354
357
|
async getCancelOrdersTxn(userAccountPublicKey, orderIds) {
|
|
355
358
|
return this.driftClientContextWrapper(userAccountPublicKey, async (user) => {
|
|
356
359
|
const cancelOrdersTxn = await (0, cancelOrder_1.createCancelOrdersTxn)({
|
|
357
|
-
driftClient: this.
|
|
360
|
+
driftClient: this._driftClient,
|
|
358
361
|
user,
|
|
359
362
|
orderIds,
|
|
360
363
|
});
|
|
@@ -366,8 +369,8 @@ class CentralServerDrift {
|
|
|
366
369
|
*/
|
|
367
370
|
async getCancelAllOrdersTxn(userAccountPublicKey, marketType, marketIndex, direction) {
|
|
368
371
|
return this.driftClientContextWrapper(userAccountPublicKey, async (user) => {
|
|
369
|
-
const ix = await this.
|
|
370
|
-
const cancelAllOrdersTxn = await this.
|
|
372
|
+
const ix = await this._driftClient.getCancelOrdersIx(marketType !== null && marketType !== void 0 ? marketType : null, marketIndex !== null && marketIndex !== void 0 ? marketIndex : null, direction !== null && direction !== void 0 ? direction : null, user.getUserAccount().subAccountId);
|
|
373
|
+
const cancelAllOrdersTxn = await this._driftClient.buildTransaction(ix);
|
|
371
374
|
return cancelAllOrdersTxn;
|
|
372
375
|
});
|
|
373
376
|
}
|
|
@@ -387,7 +390,7 @@ class CentralServerDrift {
|
|
|
387
390
|
}
|
|
388
391
|
// Initialize Jupiter client
|
|
389
392
|
const jupiterClient = new sdk_1.JupiterClient({
|
|
390
|
-
connection: this.
|
|
393
|
+
connection: this._driftClient.connection,
|
|
391
394
|
});
|
|
392
395
|
// Get quote if not provided
|
|
393
396
|
let quote = options === null || options === void 0 ? void 0 : options.quote;
|
|
@@ -402,7 +405,7 @@ class CentralServerDrift {
|
|
|
402
405
|
});
|
|
403
406
|
}
|
|
404
407
|
const swapTxn = await (0, swap_1.createSwapTxn)({
|
|
405
|
-
driftClient: this.
|
|
408
|
+
driftClient: this._driftClient,
|
|
406
409
|
jupiterClient,
|
|
407
410
|
user,
|
|
408
411
|
swapFromMarketIndex: fromMarketIndex,
|
|
@@ -418,7 +421,7 @@ class CentralServerDrift {
|
|
|
418
421
|
});
|
|
419
422
|
}
|
|
420
423
|
async sendSignedTransaction(tx) {
|
|
421
|
-
return this.
|
|
424
|
+
return this._driftClient.sendTransaction(tx, undefined, undefined, true);
|
|
422
425
|
}
|
|
423
426
|
}
|
|
424
427
|
exports.CentralServerDrift = CentralServerDrift;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/drift/Drift/clients/CentralServerDrift/index.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\tBigNum,\n\tBN,\n\tCustomizedCadenceBulkAccountLoader,\n\tDelistedMarketSetting,\n\tDevnetPerpMarkets,\n\tDevnetSpotMarkets,\n\tDRIFT_PROGRAM_ID,\n\tDriftClient,\n\tDriftClientConfig,\n\tDriftEnv,\n\tfetchUserStatsAccount,\n\tgetMarketsAndOraclesForSubscription,\n\tJupiterClient,\n\tMainnetPerpMarkets,\n\tMainnetSpotMarkets,\n\tMarketType,\n\tOneShotUserAccountSubscriber,\n\tOrderTriggerCondition,\n\tPerpMarketConfig,\n\tPositionDirection,\n\tPublicKey,\n\tQuoteResponse,\n\tSpotMarketConfig,\n\tSwapMode,\n\tTxParams,\n\tUser,\n\tWhileValidTxSender,\n} from '@drift-labs/sdk';\nimport { Connection, Transaction, VersionedTransaction } from '@solana/web3.js';\nimport { COMMON_UI_UTILS } from '../../../../common-ui-utils/commonUiUtils';\nimport {\n\tDEFAULT_ACCOUNT_LOADER_COMMITMENT,\n\tDEFAULT_ACCOUNT_LOADER_POLLING_FREQUENCY_MS,\n\tDEFAULT_TX_SENDER_CONFIRMATION_STRATEGY,\n\tDEFAULT_TX_SENDER_RETRY_INTERVAL,\n} from '../../constants';\nimport { createDepositTxn } from '../../../base/actions/spot/deposit';\nimport { createWithdrawTxn } from '../../../base/actions/spot/withdraw';\nimport { createSettleFundingTxn } from '../../../base/actions/perp/settleFunding';\nimport { createSettlePnlTxn } from '../../../base/actions/perp/settlePnl';\nimport { createOpenPerpMarketOrder } from '../../../base/actions/trade/openPerpOrder/openPerpMarketOrder';\nimport {\n\tcreateOpenPerpNonMarketOrder,\n\tOpenPerpNonMarketOrderParams,\n} from '../../../base/actions/trade/openPerpOrder/openPerpNonMarketOrder';\nimport { createEditOrderTxn } from '../../../base/actions/trade/editOrder';\nimport { createCancelOrdersTxn } from '../../../base/actions/trade/cancelOrder';\nimport { createSwapTxn } from '../../../base/actions/trade/swap';\nimport { createUserAndDepositCollateralBaseTxn } from '../../../base/actions/user/create';\nimport { deleteUserTxn } from '../../../base/actions/user/delete';\nimport { TxnOrSwiftResult } from '../../../base/actions/trade/openPerpOrder/types';\nimport { WithTxnParams } from '../../../base/types';\nimport { EnvironmentConstants } from '../../../../EnvironmentConstants';\nimport {\n\tCentralServerGetOpenPerpMarketOrderTxnParams,\n\tCentralServerGetOpenPerpNonMarketOrderTxnParams,\n} from './types';\nimport { CentralServerDriftMarkets } from './markets';\n\n/**\n * A Drift client that fetches user data on-demand, while market data is continuously subscribed to.\n *\n * This is useful for an API server that fetches user data on-demand, and return transaction messages specific to a given user\n */\nexport class CentralServerDrift {\n\tprivate driftClient: DriftClient;\n\tprivate _perpMarketConfigs: PerpMarketConfig[];\n\tprivate _spotMarketConfigs: SpotMarketConfig[];\n\t/**\n\t * The public endpoints that can be used to retrieve Drift data / interact with the Drift program.\n\t */\n\tprivate _driftEndpoints: {\n\t\tdlobServerHttpUrl: string;\n\t\tswiftServerUrl: string;\n\t};\n\n\tpublic readonly markets: CentralServerDriftMarkets;\n\n\t/**\n\t * @param solanaRpcEndpoint - The Solana RPC endpoint to use for reading RPC data.\n\t * @param driftEnv - The drift environment to use for the drift client.\n\t * @param supportedPerpMarkets - The perp markets indexes to support. See https://github.com/drift-labs/protocol-v2/blob/master/sdk/src/constants/perpMarkets.ts for all available markets. It is recommended to only include markets that will be used.\n\t * @param supportedSpotMarkets - The spot markets indexes to support. See https://github.com/drift-labs/protocol-v2/blob/master/sdk/src/constants/spotMarkets.ts for all available markets. It is recommended to only include markets that will be used.\n\t */\n\tconstructor(config: {\n\t\tsolanaRpcEndpoint: string;\n\t\tdriftEnv: DriftEnv;\n\t\tsupportedPerpMarkets: number[];\n\t\tsupportedSpotMarkets: number[];\n\t\tadditionalDriftClientConfig?: Partial<Omit<DriftClientConfig, 'env'>>;\n\t}) {\n\t\tconst driftEnv = config.driftEnv;\n\n\t\tconst connection = new Connection(config.solanaRpcEndpoint);\n\t\tconst driftProgramID = new PublicKey(DRIFT_PROGRAM_ID);\n\t\tconst accountLoader = new CustomizedCadenceBulkAccountLoader(\n\t\t\tconnection,\n\t\t\tDEFAULT_ACCOUNT_LOADER_COMMITMENT,\n\t\t\tDEFAULT_ACCOUNT_LOADER_POLLING_FREQUENCY_MS\n\t\t);\n\n\t\tconst wallet = COMMON_UI_UTILS.createPlaceholderIWallet(); // use random wallet to initialize a central-server instance\n\n\t\tconst allPerpMarketConfigs =\n\t\t\tdriftEnv === 'devnet' ? DevnetPerpMarkets : MainnetPerpMarkets;\n\t\tconst allSpotMarketConfigs =\n\t\t\tdriftEnv === 'devnet' ? DevnetSpotMarkets : MainnetSpotMarkets;\n\t\tthis._perpMarketConfigs = config.supportedPerpMarkets.map((marketIndex) =>\n\t\t\tallPerpMarketConfigs.find((market) => market.marketIndex === marketIndex)\n\t\t);\n\t\tthis._spotMarketConfigs = config.supportedSpotMarkets.map((marketIndex) =>\n\t\t\tallSpotMarketConfigs.find((market) => market.marketIndex === marketIndex)\n\t\t);\n\n\t\tconst oracleInfos = getMarketsAndOraclesForSubscription(\n\t\t\tdriftEnv,\n\t\t\tthis._perpMarketConfigs,\n\t\t\tthis._spotMarketConfigs\n\t\t);\n\n\t\tconst driftClientConfig: DriftClientConfig = {\n\t\t\tenv: driftEnv,\n\t\t\tconnection,\n\t\t\twallet,\n\t\t\tprogramID: driftProgramID,\n\t\t\tenableMetricsEvents: false,\n\t\t\taccountSubscription: {\n\t\t\t\ttype: 'polling',\n\t\t\t\taccountLoader,\n\t\t\t},\n\t\t\tuserStats: false,\n\t\t\tincludeDelegates: false,\n\t\t\tskipLoadUsers: true,\n\t\t\tdelistedMarketSetting: DelistedMarketSetting.Unsubscribe,\n\t\t\tperpMarketIndexes: this._perpMarketConfigs.map(\n\t\t\t\t(market) => market.marketIndex\n\t\t\t),\n\t\t\tspotMarketIndexes: this._spotMarketConfigs.map(\n\t\t\t\t(market) => market.marketIndex\n\t\t\t),\n\t\t\toracleInfos: oracleInfos.oracleInfos,\n\t\t\t...config.additionalDriftClientConfig,\n\t\t};\n\t\tthis.driftClient = new DriftClient(driftClientConfig);\n\t\tthis.markets = new CentralServerDriftMarkets(this.driftClient);\n\n\t\tconst txSender = new WhileValidTxSender({\n\t\t\tconnection,\n\t\t\twallet,\n\t\t\tadditionalConnections: [],\n\t\t\tadditionalTxSenderCallbacks: [],\n\t\t\ttxHandler: this.driftClient.txHandler,\n\t\t\tconfirmationStrategy: DEFAULT_TX_SENDER_CONFIRMATION_STRATEGY,\n\t\t\tretrySleep: DEFAULT_TX_SENDER_RETRY_INTERVAL,\n\t\t});\n\n\t\tthis.driftClient.txSender = txSender;\n\n\t\t// set up Drift endpoints\n\t\tconst driftDlobServerHttpUrlToUse =\n\t\t\tEnvironmentConstants.dlobServerHttpUrl[\n\t\t\t\tconfig.driftEnv === 'devnet' ? 'dev' : 'mainnet'\n\t\t\t];\n\t\tconst swiftServerUrlToUse =\n\t\t\tEnvironmentConstants.swiftServerUrl[\n\t\t\t\tconfig.driftEnv === 'devnet' ? 'staging' : 'mainnet'\n\t\t\t];\n\t\tthis._driftEndpoints = {\n\t\t\tdlobServerHttpUrl: driftDlobServerHttpUrlToUse,\n\t\t\tswiftServerUrl: swiftServerUrlToUse,\n\t\t};\n\t}\n\n\tpublic async subscribe() {\n\t\tawait this.driftClient.subscribe();\n\t}\n\n\tpublic async unsubscribe() {\n\t\tawait this.driftClient.unsubscribe();\n\t}\n\n\t/**\n\t * Manages DriftClient state for transaction creation with proper setup and cleanup.\n\t * This abstraction handles:\n\t * - User creation and subscription\n\t * - Authority management\n\t * - Wallet replacement for correct transaction signing\n\t * - Cleanup and state restoration\n\t *\n\t * @param userAccountPublicKey - The user account public key\n\t * @param operation - The transaction creation operation to execute\n\t * @returns The result of the operation\n\t */\n\tprivate async driftClientContextWrapper<T>(\n\t\tuserAccountPublicKey: PublicKey,\n\t\toperation: (user: User) => Promise<T>\n\t): Promise<T> {\n\t\tconst user = new User({\n\t\t\tdriftClient: this.driftClient,\n\t\t\tuserAccountPublicKey,\n\t\t\taccountSubscription: {\n\t\t\t\ttype: 'custom',\n\t\t\t\tuserAccountSubscriber: new OneShotUserAccountSubscriber(\n\t\t\t\t\tthis.driftClient.program,\n\t\t\t\t\tuserAccountPublicKey,\n\t\t\t\t\tundefined,\n\t\t\t\t\tundefined\n\t\t\t\t),\n\t\t\t},\n\t\t});\n\n\t\t// Store original state\n\t\tconst originalWallet = this.driftClient.wallet;\n\t\tconst originalAuthority = this.driftClient.authority;\n\n\t\ttry {\n\t\t\t// Setup: Subscribe to user and configure DriftClient\n\t\t\tawait user.subscribe();\n\n\t\t\tconst authority = user.getUserAccount().authority;\n\t\t\tthis.driftClient.authority = authority;\n\n\t\t\tconst success = await this.driftClient.addUser(\n\t\t\t\tuser.getUserAccount().subAccountId,\n\t\t\t\tauthority\n\t\t\t);\n\n\t\t\tif (!success) {\n\t\t\t\tthrow new Error('Failed to add user to DriftClient');\n\t\t\t}\n\n\t\t\t// Replace wallet with user's authority to ensure correct transaction signing\n\t\t\t// This is necessary because DriftClient adds wallet.publicKey to instructions\n\t\t\tconst userWallet = {\n\t\t\t\tpublicKey: authority,\n\t\t\t\tsignTransaction: () =>\n\t\t\t\t\tPromise.reject(\n\t\t\t\t\t\t'This is a placeholder - do not sign with this wallet'\n\t\t\t\t\t),\n\t\t\t\tsignAllTransactions: () =>\n\t\t\t\t\tPromise.reject(\n\t\t\t\t\t\t'This is a placeholder - do not sign with this wallet'\n\t\t\t\t\t),\n\t\t\t};\n\n\t\t\t// Update wallet in all places that reference it\n\t\t\tthis.driftClient.wallet = userWallet;\n\t\t\t//@ts-ignore\n\t\t\tthis.driftClient.provider.wallet = userWallet;\n\t\t\tthis.driftClient.txHandler.updateWallet(userWallet);\n\n\t\t\t// Execute the operation\n\t\t\tconst result = await operation(user);\n\n\t\t\treturn result;\n\t\t} finally {\n\t\t\t// Cleanup: Always restore original state and unsubscribe\n\t\t\tthis.driftClient.wallet = originalWallet;\n\t\t\tthis.driftClient.txHandler.updateWallet(originalWallet);\n\t\t\tthis.driftClient.authority = originalAuthority;\n\n\t\t\ttry {\n\t\t\t\tawait user.unsubscribe();\n\t\t\t\tthis.driftClient.users.clear();\n\t\t\t} catch (cleanupError) {\n\t\t\t\tconsole.warn('Error during cleanup:', cleanupError);\n\t\t\t\t// Don't throw cleanup errors, but log them\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Returns a User object for a given user account public key. This fetches the user account data once.\n\t *\n\t * You may read more about the User object [here](https://github.com/drift-labs/protocol-v2/blob/master/sdk/src/user.ts)\n\t *\n\t * @param userAccountPublicKey - The user account public key\n\t */\n\tpublic async getUser(userAccountPublicKey: PublicKey): Promise<User> {\n\t\tconst oneShotUserAccountSubscriber = new OneShotUserAccountSubscriber(\n\t\t\tthis.driftClient.program,\n\t\t\tuserAccountPublicKey,\n\t\t\tundefined,\n\t\t\tundefined\n\t\t);\n\t\tconst user = new User({\n\t\t\tdriftClient: this.driftClient,\n\t\t\tuserAccountPublicKey,\n\t\t\taccountSubscription: {\n\t\t\t\ttype: 'custom',\n\t\t\t\tuserAccountSubscriber: oneShotUserAccountSubscriber,\n\t\t\t},\n\t\t});\n\t\tawait user.subscribe();\n\t\treturn user;\n\t}\n\n\tpublic async getCreateAndDepositTxn(\n\t\tauthority: PublicKey,\n\t\tamount: BN,\n\t\tspotMarketIndex: number,\n\t\toptions?: {\n\t\t\treferrerName?: string;\n\t\t\taccountName?: string;\n\t\t\tpoolId?: number;\n\t\t\tfromSubAccountId?: number;\n\t\t\tcustomMaxMarginRatio?: number;\n\t\t\ttxParams?: TxParams;\n\t\t}\n\t): Promise<{\n\t\ttransaction: VersionedTransaction | Transaction;\n\t\tuserAccountPublicKey: PublicKey;\n\t\tsubAccountId: number;\n\t}> {\n\t\tconst spotMarketConfig = this._spotMarketConfigs.find(\n\t\t\t(market) => market.marketIndex === spotMarketIndex\n\t\t);\n\n\t\tif (!spotMarketConfig) {\n\t\t\tthrow new Error(\n\t\t\t\t`Spot market config not found for index ${spotMarketIndex}`\n\t\t\t);\n\t\t}\n\n\t\tconst userStatsAccount = await fetchUserStatsAccount(\n\t\t\tthis.driftClient.connection,\n\t\t\tthis.driftClient.program,\n\t\t\tauthority\n\t\t);\n\n\t\tconst originalWallet = this.driftClient.wallet;\n\t\tconst originalAuthority = this.driftClient.authority;\n\n\t\tconst authorityWallet = {\n\t\t\tpublicKey: authority,\n\t\t\tsignTransaction: () =>\n\t\t\t\tPromise.reject('This is a placeholder - do not sign with this wallet'),\n\t\t\tsignAllTransactions: () =>\n\t\t\t\tPromise.reject('This is a placeholder - do not sign with this wallet'),\n\t\t};\n\n\t\ttry {\n\t\t\tthis.driftClient.wallet = authorityWallet;\n\t\t\t// @ts-ignore\n\t\t\tthis.driftClient.provider.wallet = authorityWallet;\n\t\t\tthis.driftClient.txHandler.updateWallet(authorityWallet);\n\t\t\tthis.driftClient.authority = authority;\n\n\t\t\treturn await createUserAndDepositCollateralBaseTxn({\n\t\t\t\tdriftClient: this.driftClient,\n\t\t\t\tamount,\n\t\t\t\tspotMarketConfig,\n\t\t\t\tauthority,\n\t\t\t\tuserStatsAccount,\n\t\t\t\treferrerName: options?.referrerName,\n\t\t\t\taccountName: options?.accountName,\n\t\t\t\tpoolId: options?.poolId,\n\t\t\t\tfromSubAccountId: options?.fromSubAccountId,\n\t\t\t\tcustomMaxMarginRatio: options?.customMaxMarginRatio,\n\t\t\t\ttxParams: options?.txParams,\n\t\t\t});\n\t\t} finally {\n\t\t\tthis.driftClient.wallet = originalWallet;\n\t\t\tthis.driftClient.txHandler.updateWallet(originalWallet);\n\t\t\t// @ts-ignore\n\t\t\tthis.driftClient.provider.wallet = originalWallet;\n\t\t\tthis.driftClient.authority = originalAuthority;\n\t\t}\n\t}\n\n\tpublic async getDepositTxn(\n\t\tuserAccountPublicKey: PublicKey,\n\t\tamount: BN,\n\t\tspotMarketIndex: number,\n\t\toptions?: {\n\t\t\ttxParams?: TxParams;\n\t\t}\n\t): Promise<VersionedTransaction | Transaction> {\n\t\treturn this.driftClientContextWrapper(\n\t\t\tuserAccountPublicKey,\n\t\t\tasync (user) => {\n\t\t\t\tconst spotMarketConfig = this._spotMarketConfigs.find(\n\t\t\t\t\t(market) => market.marketIndex === spotMarketIndex\n\t\t\t\t);\n\n\t\t\t\tif (!spotMarketConfig) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Spot market config not found for index ${spotMarketIndex}`\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst depositTxn = await createDepositTxn({\n\t\t\t\t\tdriftClient: this.driftClient,\n\t\t\t\t\tuser,\n\t\t\t\t\tamount: BigNum.from(amount, spotMarketConfig.precisionExp),\n\t\t\t\t\tspotMarketConfig,\n\t\t\t\t\ttxParams: options?.txParams,\n\t\t\t\t});\n\n\t\t\t\treturn depositTxn;\n\t\t\t}\n\t\t);\n\t}\n\n\tpublic async getDeleteUserTxn(\n\t\tuserAccountPublicKey: PublicKey,\n\t\toptions?: {\n\t\t\ttxParams?: TxParams;\n\t\t}\n\t): Promise<VersionedTransaction | Transaction> {\n\t\treturn this.driftClientContextWrapper(userAccountPublicKey, async () => {\n\t\t\treturn deleteUserTxn({\n\t\t\t\tdriftClient: this.driftClient,\n\t\t\t\tuserPublicKey: userAccountPublicKey,\n\t\t\t\ttxParams: options?.txParams,\n\t\t\t});\n\t\t});\n\t}\n\n\tpublic async getWithdrawTxn(\n\t\tuserAccountPublicKey: PublicKey,\n\t\tamount: BN,\n\t\tspotMarketIndex: number,\n\t\toptions?: {\n\t\t\tisBorrow?: boolean;\n\t\t\tisMax?: boolean;\n\t\t\ttxParams?: TxParams;\n\t\t}\n\t): Promise<VersionedTransaction | Transaction> {\n\t\treturn this.driftClientContextWrapper(\n\t\t\tuserAccountPublicKey,\n\t\t\tasync (user) => {\n\t\t\t\tconst spotMarketConfig = this._spotMarketConfigs.find(\n\t\t\t\t\t(market) => market.marketIndex === spotMarketIndex\n\t\t\t\t);\n\n\t\t\t\tif (!spotMarketConfig) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Spot market config not found for index ${spotMarketIndex}`\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst withdrawTxn = await createWithdrawTxn({\n\t\t\t\t\tdriftClient: this.driftClient,\n\t\t\t\t\tuser,\n\t\t\t\t\tamount: BigNum.from(amount, spotMarketConfig.precisionExp),\n\t\t\t\t\tspotMarketConfig,\n\t\t\t\t\tisBorrow: options?.isBorrow,\n\t\t\t\t\tisMax: options?.isMax,\n\t\t\t\t\ttxParams: options?.txParams,\n\t\t\t\t});\n\n\t\t\t\treturn withdrawTxn;\n\t\t\t}\n\t\t);\n\t}\n\n\tpublic async getSettleFundingTxn(\n\t\tuserAccountPublicKey: PublicKey,\n\t\toptions?: {\n\t\t\ttxParams?: TxParams;\n\t\t}\n\t): Promise<VersionedTransaction | Transaction> {\n\t\treturn this.driftClientContextWrapper(\n\t\t\tuserAccountPublicKey,\n\t\t\tasync (user) => {\n\t\t\t\tconst settleFundingTxn = await createSettleFundingTxn({\n\t\t\t\t\tdriftClient: this.driftClient,\n\t\t\t\t\tuser,\n\t\t\t\t\ttxParams: options?.txParams,\n\t\t\t\t});\n\n\t\t\t\treturn settleFundingTxn;\n\t\t\t}\n\t\t);\n\t}\n\n\tpublic async getSettlePnlTxn(\n\t\tuserAccountPublicKey: PublicKey,\n\t\tmarketIndexes: number[],\n\t\toptions?: {\n\t\t\ttxParams?: TxParams;\n\t\t}\n\t): Promise<VersionedTransaction | Transaction> {\n\t\treturn this.driftClientContextWrapper(\n\t\t\tuserAccountPublicKey,\n\t\t\tasync (user) => {\n\t\t\t\tconst settlePnlTxn = await createSettlePnlTxn({\n\t\t\t\t\tdriftClient: this.driftClient,\n\t\t\t\t\tuser,\n\t\t\t\t\tmarketIndexes,\n\t\t\t\t\ttxParams: options?.txParams,\n\t\t\t\t});\n\n\t\t\t\treturn settlePnlTxn;\n\t\t\t}\n\t\t);\n\t}\n\n\t// overloads for better type inference\n\tpublic async getOpenPerpMarketOrderTxn(\n\t\tparams: CentralServerGetOpenPerpMarketOrderTxnParams<true>\n\t): Promise<void>;\n\tpublic async getOpenPerpMarketOrderTxn(\n\t\tparams: CentralServerGetOpenPerpMarketOrderTxnParams<false>\n\t): Promise<Transaction | VersionedTransaction>;\n\tpublic async getOpenPerpMarketOrderTxn<T extends boolean>({\n\t\tuserAccountPublicKey,\n\t\t...rest\n\t}: CentralServerGetOpenPerpMarketOrderTxnParams<T>): Promise<\n\t\tTxnOrSwiftResult<T>\n\t> {\n\t\treturn this.driftClientContextWrapper(\n\t\t\tuserAccountPublicKey,\n\t\t\tasync (user): Promise<TxnOrSwiftResult<T>> => {\n\t\t\t\tconst { useSwift, swiftOptions, placeAndTake, ...otherProps } = rest;\n\n\t\t\t\tif (useSwift) {\n\t\t\t\t\tconst swiftOrderResult = await createOpenPerpMarketOrder({\n\t\t\t\t\t\t...otherProps,\n\t\t\t\t\t\tuseSwift: true,\n\t\t\t\t\t\tswiftOptions: {\n\t\t\t\t\t\t\t...swiftOptions,\n\t\t\t\t\t\t\tswiftServerUrl: this._driftEndpoints.swiftServerUrl,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tdriftClient: this.driftClient,\n\t\t\t\t\t\tuser,\n\t\t\t\t\t\tdlobServerHttpUrl: this._driftEndpoints.dlobServerHttpUrl,\n\t\t\t\t\t});\n\t\t\t\t\treturn swiftOrderResult as TxnOrSwiftResult<T>;\n\t\t\t\t} else {\n\t\t\t\t\tconst openPerpMarketOrderTxn = await createOpenPerpMarketOrder({\n\t\t\t\t\t\t...otherProps,\n\t\t\t\t\t\tplaceAndTake,\n\t\t\t\t\t\tuseSwift: false,\n\t\t\t\t\t\tdriftClient: this.driftClient,\n\t\t\t\t\t\tuser,\n\t\t\t\t\t\tdlobServerHttpUrl: this._driftEndpoints.dlobServerHttpUrl,\n\t\t\t\t\t});\n\t\t\t\t\treturn openPerpMarketOrderTxn as TxnOrSwiftResult<T>;\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\t}\n\n\t/**\n\t * Create a perp non-market order with amount and asset type\n\t */\n\tpublic async getOpenPerpNonMarketOrderTxn(\n\t\tparams: CentralServerGetOpenPerpNonMarketOrderTxnParams<true>\n\t): Promise<void>;\n\tpublic async getOpenPerpNonMarketOrderTxn(\n\t\tparams: CentralServerGetOpenPerpNonMarketOrderTxnParams<false>\n\t): Promise<Transaction | VersionedTransaction>;\n\tpublic async getOpenPerpNonMarketOrderTxn<T extends boolean>({\n\t\tuserAccountPublicKey,\n\t\t...rest\n\t}: WithTxnParams<\n\t\tOmit<OpenPerpNonMarketOrderParams<T>, 'driftClient' | 'user'>\n\t> & {\n\t\tuserAccountPublicKey: PublicKey;\n\t}): Promise<TxnOrSwiftResult<T>> {\n\t\treturn this.driftClientContextWrapper(\n\t\t\tuserAccountPublicKey,\n\t\t\tasync (user) => {\n\t\t\t\tconst { useSwift, swiftOptions, ...otherProps } = rest;\n\n\t\t\t\tif (useSwift) {\n\t\t\t\t\tconst swiftOrderResult = await createOpenPerpNonMarketOrder({\n\t\t\t\t\t\t...otherProps,\n\t\t\t\t\t\tuseSwift: true,\n\t\t\t\t\t\tswiftOptions: {\n\t\t\t\t\t\t\t...swiftOptions,\n\t\t\t\t\t\t\tswiftServerUrl: this._driftEndpoints.swiftServerUrl,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tdriftClient: this.driftClient,\n\t\t\t\t\t\tuser,\n\t\t\t\t\t\tdlobServerHttpUrl: this._driftEndpoints.dlobServerHttpUrl,\n\t\t\t\t\t});\n\t\t\t\t\treturn swiftOrderResult as TxnOrSwiftResult<T>;\n\t\t\t\t} else {\n\t\t\t\t\tconst openPerpNonMarketOrderTxn = await createOpenPerpNonMarketOrder({\n\t\t\t\t\t\t...otherProps,\n\t\t\t\t\t\tuseSwift: false,\n\t\t\t\t\t\tdriftClient: this.driftClient,\n\t\t\t\t\t\tuser,\n\t\t\t\t\t\tdlobServerHttpUrl: this._driftEndpoints.dlobServerHttpUrl,\n\t\t\t\t\t});\n\t\t\t\t\treturn openPerpNonMarketOrderTxn as TxnOrSwiftResult<T>;\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\t}\n\n\t/**\n\t * Create a transaction to edit an existing order\n\t */\n\tpublic async getEditOrderTxn(\n\t\tuserAccountPublicKey: PublicKey,\n\t\torderId: number,\n\t\teditOrderParams: {\n\t\t\tnewDirection?: PositionDirection;\n\t\t\tnewBaseAmount?: BN;\n\t\t\tnewLimitPrice?: BN;\n\t\t\tnewOraclePriceOffset?: number;\n\t\t\tnewTriggerPrice?: BN;\n\t\t\tnewTriggerCondition?: OrderTriggerCondition;\n\t\t\tauctionDuration?: number;\n\t\t\tauctionStartPrice?: BN;\n\t\t\tauctionEndPrice?: BN;\n\t\t\treduceOnly?: boolean;\n\t\t\tpostOnly?: boolean;\n\t\t\tbitFlags?: number;\n\t\t\tmaxTs?: BN;\n\t\t\tpolicy?: number;\n\t\t}\n\t): Promise<VersionedTransaction | Transaction> {\n\t\treturn this.driftClientContextWrapper(\n\t\t\tuserAccountPublicKey,\n\t\t\tasync (user) => {\n\t\t\t\tconst editOrderTxn = await createEditOrderTxn({\n\t\t\t\t\tdriftClient: this.driftClient,\n\t\t\t\t\tuser,\n\t\t\t\t\torderId,\n\t\t\t\t\teditOrderParams,\n\t\t\t\t});\n\n\t\t\t\treturn editOrderTxn;\n\t\t\t}\n\t\t);\n\t}\n\n\t/**\n\t * Create a transaction to cancel specific orders by their IDs\n\t */\n\tpublic async getCancelOrdersTxn(\n\t\tuserAccountPublicKey: PublicKey,\n\t\torderIds: number[]\n\t): Promise<VersionedTransaction | Transaction> {\n\t\treturn this.driftClientContextWrapper(\n\t\t\tuserAccountPublicKey,\n\t\t\tasync (user) => {\n\t\t\t\tconst cancelOrdersTxn = await createCancelOrdersTxn({\n\t\t\t\t\tdriftClient: this.driftClient,\n\t\t\t\t\tuser,\n\t\t\t\t\torderIds,\n\t\t\t\t});\n\n\t\t\t\treturn cancelOrdersTxn;\n\t\t\t}\n\t\t);\n\t}\n\n\t/**\n\t * Create a transaction to cancel all orders for a user\n\t */\n\tpublic async getCancelAllOrdersTxn(\n\t\tuserAccountPublicKey: PublicKey,\n\t\tmarketType?: MarketType,\n\t\tmarketIndex?: number,\n\t\tdirection?: PositionDirection\n\t): Promise<VersionedTransaction | Transaction> {\n\t\treturn this.driftClientContextWrapper(\n\t\t\tuserAccountPublicKey,\n\t\t\tasync (user) => {\n\t\t\t\tconst ix = await this.driftClient.getCancelOrdersIx(\n\t\t\t\t\tmarketType ?? null,\n\t\t\t\t\tmarketIndex ?? null,\n\t\t\t\t\tdirection ?? null,\n\t\t\t\t\tuser.getUserAccount().subAccountId\n\t\t\t\t);\n\n\t\t\t\tconst cancelAllOrdersTxn = await this.driftClient.buildTransaction(ix);\n\n\t\t\t\treturn cancelAllOrdersTxn;\n\t\t\t}\n\t\t);\n\t}\n\n\t/**\n\t * Create a swap transaction between two spot markets using Jupiter\n\t */\n\tpublic async getSwapTxn(\n\t\tuserAccountPublicKey: PublicKey,\n\t\tfromMarketIndex: number,\n\t\ttoMarketIndex: number,\n\t\tamount: BN,\n\t\toptions?: {\n\t\t\tslippageBps?: number;\n\t\t\tswapMode?: SwapMode;\n\t\t\tonlyDirectRoutes?: boolean;\n\t\t\tquote?: QuoteResponse;\n\t\t}\n\t): Promise<VersionedTransaction | Transaction> {\n\t\treturn this.driftClientContextWrapper(\n\t\t\tuserAccountPublicKey,\n\t\t\tasync (user) => {\n\t\t\t\tconst fromSpotMarketConfig = this._spotMarketConfigs.find(\n\t\t\t\t\t(market) => market.marketIndex === fromMarketIndex\n\t\t\t\t);\n\t\t\t\tconst toSpotMarketConfig = this._spotMarketConfigs.find(\n\t\t\t\t\t(market) => market.marketIndex === toMarketIndex\n\t\t\t\t);\n\n\t\t\t\tif (!fromSpotMarketConfig) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`From spot market config not found for index ${fromMarketIndex}`\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (!toSpotMarketConfig) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`To spot market config not found for index ${toMarketIndex}`\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// Initialize Jupiter client\n\t\t\t\tconst jupiterClient = new JupiterClient({\n\t\t\t\t\tconnection: this.driftClient.connection,\n\t\t\t\t});\n\n\t\t\t\t// Get quote if not provided\n\t\t\t\tlet quote = options?.quote;\n\t\t\t\tif (!quote) {\n\t\t\t\t\tquote = await jupiterClient.getQuote({\n\t\t\t\t\t\tinputMint: fromSpotMarketConfig.mint,\n\t\t\t\t\t\toutputMint: toSpotMarketConfig.mint,\n\t\t\t\t\t\tamount,\n\t\t\t\t\t\tslippageBps: options?.slippageBps ?? 10, // Default 0.1%\n\t\t\t\t\t\tswapMode: options?.swapMode ?? 'ExactIn',\n\t\t\t\t\t\tonlyDirectRoutes: options?.onlyDirectRoutes ?? false,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tconst swapTxn = await createSwapTxn({\n\t\t\t\t\tdriftClient: this.driftClient,\n\t\t\t\t\tjupiterClient,\n\t\t\t\t\tuser,\n\t\t\t\t\tswapFromMarketIndex: fromMarketIndex,\n\t\t\t\t\tswapToMarketIndex: toMarketIndex,\n\t\t\t\t\tamount,\n\t\t\t\t\tquote,\n\t\t\t\t\ttxParams: {\n\t\t\t\t\t\tuseSimulatedComputeUnits: true,\n\t\t\t\t\t\tcomputeUnitsBufferMultiplier: 1.5,\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\t\treturn swapTxn;\n\t\t\t}\n\t\t);\n\t}\n\n\tpublic async sendSignedTransaction(tx: VersionedTransaction | Transaction) {\n\t\treturn this.driftClient.sendTransaction(tx, undefined, undefined, true);\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/drift/Drift/clients/CentralServerDrift/index.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\tBigNum,\n\tBN,\n\tCustomizedCadenceBulkAccountLoader,\n\tDelistedMarketSetting,\n\tDevnetPerpMarkets,\n\tDevnetSpotMarkets,\n\tDRIFT_PROGRAM_ID,\n\tDriftClient,\n\tDriftClientConfig,\n\tDriftEnv,\n\tfetchUserStatsAccount,\n\tgetMarketsAndOraclesForSubscription,\n\tJupiterClient,\n\tMainnetPerpMarkets,\n\tMainnetSpotMarkets,\n\tMarketType,\n\tOneShotUserAccountSubscriber,\n\tOrderTriggerCondition,\n\tPerpMarketConfig,\n\tPositionDirection,\n\tPublicKey,\n\tQuoteResponse,\n\tSpotMarketConfig,\n\tSwapMode,\n\tTxParams,\n\tUser,\n\tWhileValidTxSender,\n} from '@drift-labs/sdk';\nimport { Connection, Transaction, VersionedTransaction } from '@solana/web3.js';\nimport { COMMON_UI_UTILS } from '../../../../common-ui-utils/commonUiUtils';\nimport {\n\tDEFAULT_ACCOUNT_LOADER_COMMITMENT,\n\tDEFAULT_ACCOUNT_LOADER_POLLING_FREQUENCY_MS,\n\tDEFAULT_TX_SENDER_CONFIRMATION_STRATEGY,\n\tDEFAULT_TX_SENDER_RETRY_INTERVAL,\n} from '../../constants';\nimport { createDepositTxn } from '../../../base/actions/spot/deposit';\nimport { createWithdrawTxn } from '../../../base/actions/spot/withdraw';\nimport { createSettleFundingTxn } from '../../../base/actions/perp/settleFunding';\nimport { createSettlePnlTxn } from '../../../base/actions/perp/settlePnl';\nimport { createOpenPerpMarketOrder } from '../../../base/actions/trade/openPerpOrder/openPerpMarketOrder';\nimport {\n\tcreateOpenPerpNonMarketOrder,\n\tOpenPerpNonMarketOrderParams,\n} from '../../../base/actions/trade/openPerpOrder/openPerpNonMarketOrder';\nimport { createEditOrderTxn } from '../../../base/actions/trade/editOrder';\nimport { createCancelOrdersTxn } from '../../../base/actions/trade/cancelOrder';\nimport { createSwapTxn } from '../../../base/actions/trade/swap';\nimport { createUserAndDepositCollateralBaseTxn } from '../../../base/actions/user/create';\nimport { deleteUserTxn } from '../../../base/actions/user/delete';\nimport { TxnOrSwiftResult } from '../../../base/actions/trade/openPerpOrder/types';\nimport { WithTxnParams } from '../../../base/types';\nimport { EnvironmentConstants } from '../../../../EnvironmentConstants';\nimport {\n\tCentralServerGetOpenPerpMarketOrderTxnParams,\n\tCentralServerGetOpenPerpNonMarketOrderTxnParams,\n} from './types';\nimport { CentralServerDriftMarkets } from './markets';\n\n/**\n * A Drift client that fetches user data on-demand, while market data is continuously subscribed to.\n *\n * This is useful for an API server that fetches user data on-demand, and return transaction messages specific to a given user\n */\nexport class CentralServerDrift {\n\tprivate _driftClient: DriftClient;\n\tprivate _perpMarketConfigs: PerpMarketConfig[];\n\tprivate _spotMarketConfigs: SpotMarketConfig[];\n\t/**\n\t * The public endpoints that can be used to retrieve Drift data / interact with the Drift program.\n\t */\n\tprivate _driftEndpoints: {\n\t\tdlobServerHttpUrl: string;\n\t\tswiftServerUrl: string;\n\t};\n\n\tpublic readonly markets: CentralServerDriftMarkets;\n\n\t/**\n\t * @param solanaRpcEndpoint - The Solana RPC endpoint to use for reading RPC data.\n\t * @param driftEnv - The drift environment to use for the drift client.\n\t * @param supportedPerpMarkets - The perp markets indexes to support. See https://github.com/drift-labs/protocol-v2/blob/master/sdk/src/constants/perpMarkets.ts for all available markets. It is recommended to only include markets that will be used.\n\t * @param supportedSpotMarkets - The spot markets indexes to support. See https://github.com/drift-labs/protocol-v2/blob/master/sdk/src/constants/spotMarkets.ts for all available markets. It is recommended to only include markets that will be used.\n\t */\n\tconstructor(config: {\n\t\tsolanaRpcEndpoint: string;\n\t\tdriftEnv: DriftEnv;\n\t\tsupportedPerpMarkets: number[];\n\t\tsupportedSpotMarkets: number[];\n\t\tadditionalDriftClientConfig?: Partial<Omit<DriftClientConfig, 'env'>>;\n\t}) {\n\t\tconst driftEnv = config.driftEnv;\n\n\t\tconst connection = new Connection(config.solanaRpcEndpoint);\n\t\tconst driftProgramID = new PublicKey(DRIFT_PROGRAM_ID);\n\t\tconst accountLoader = new CustomizedCadenceBulkAccountLoader(\n\t\t\tconnection,\n\t\t\tDEFAULT_ACCOUNT_LOADER_COMMITMENT,\n\t\t\tDEFAULT_ACCOUNT_LOADER_POLLING_FREQUENCY_MS\n\t\t);\n\n\t\tconst wallet = COMMON_UI_UTILS.createPlaceholderIWallet(); // use random wallet to initialize a central-server instance\n\n\t\tconst allPerpMarketConfigs =\n\t\t\tdriftEnv === 'devnet' ? DevnetPerpMarkets : MainnetPerpMarkets;\n\t\tconst allSpotMarketConfigs =\n\t\t\tdriftEnv === 'devnet' ? DevnetSpotMarkets : MainnetSpotMarkets;\n\t\tthis._perpMarketConfigs = config.supportedPerpMarkets.map((marketIndex) =>\n\t\t\tallPerpMarketConfigs.find((market) => market.marketIndex === marketIndex)\n\t\t);\n\t\tthis._spotMarketConfigs = config.supportedSpotMarkets.map((marketIndex) =>\n\t\t\tallSpotMarketConfigs.find((market) => market.marketIndex === marketIndex)\n\t\t);\n\n\t\tconst oracleInfos = getMarketsAndOraclesForSubscription(\n\t\t\tdriftEnv,\n\t\t\tthis._perpMarketConfigs,\n\t\t\tthis._spotMarketConfigs\n\t\t);\n\n\t\tconst driftClientConfig: DriftClientConfig = {\n\t\t\tenv: driftEnv,\n\t\t\tconnection,\n\t\t\twallet,\n\t\t\tprogramID: driftProgramID,\n\t\t\tenableMetricsEvents: false,\n\t\t\taccountSubscription: {\n\t\t\t\ttype: 'polling',\n\t\t\t\taccountLoader,\n\t\t\t},\n\t\t\tuserStats: false,\n\t\t\tincludeDelegates: false,\n\t\t\tskipLoadUsers: true,\n\t\t\tdelistedMarketSetting: DelistedMarketSetting.Unsubscribe,\n\t\t\tperpMarketIndexes: this._perpMarketConfigs.map(\n\t\t\t\t(market) => market.marketIndex\n\t\t\t),\n\t\t\tspotMarketIndexes: this._spotMarketConfigs.map(\n\t\t\t\t(market) => market.marketIndex\n\t\t\t),\n\t\t\toracleInfos: oracleInfos.oracleInfos,\n\t\t\t...config.additionalDriftClientConfig,\n\t\t};\n\t\tthis._driftClient = new DriftClient(driftClientConfig);\n\t\tthis.markets = new CentralServerDriftMarkets(this._driftClient);\n\n\t\tconst txSender = new WhileValidTxSender({\n\t\t\tconnection,\n\t\t\twallet,\n\t\t\tadditionalConnections: [],\n\t\t\tadditionalTxSenderCallbacks: [],\n\t\t\ttxHandler: this._driftClient.txHandler,\n\t\t\tconfirmationStrategy: DEFAULT_TX_SENDER_CONFIRMATION_STRATEGY,\n\t\t\tretrySleep: DEFAULT_TX_SENDER_RETRY_INTERVAL,\n\t\t});\n\n\t\tthis._driftClient.txSender = txSender;\n\n\t\t// set up Drift endpoints\n\t\tconst driftDlobServerHttpUrlToUse =\n\t\t\tEnvironmentConstants.dlobServerHttpUrl[\n\t\t\t\tconfig.driftEnv === 'devnet' ? 'dev' : 'mainnet'\n\t\t\t];\n\t\tconst swiftServerUrlToUse =\n\t\t\tEnvironmentConstants.swiftServerUrl[\n\t\t\t\tconfig.driftEnv === 'devnet' ? 'staging' : 'mainnet'\n\t\t\t];\n\t\tthis._driftEndpoints = {\n\t\t\tdlobServerHttpUrl: driftDlobServerHttpUrlToUse,\n\t\t\tswiftServerUrl: swiftServerUrlToUse,\n\t\t};\n\t}\n\n\tpublic get driftClient() {\n\t\treturn this._driftClient;\n\t}\n\n\tpublic async subscribe() {\n\t\tawait this._driftClient.subscribe();\n\t}\n\n\tpublic async unsubscribe() {\n\t\tawait this._driftClient.unsubscribe();\n\t}\n\n\t/**\n\t * Manages DriftClient state for transaction creation with proper setup and cleanup.\n\t * This abstraction handles:\n\t * - User creation and subscription\n\t * - Authority management\n\t * - Wallet replacement for correct transaction signing\n\t * - Cleanup and state restoration\n\t *\n\t * @param userAccountPublicKey - The user account public key\n\t * @param operation - The transaction creation operation to execute\n\t * @returns The result of the operation\n\t */\n\tprivate async driftClientContextWrapper<T>(\n\t\tuserAccountPublicKey: PublicKey,\n\t\toperation: (user: User) => Promise<T>\n\t): Promise<T> {\n\t\tconst user = new User({\n\t\t\tdriftClient: this._driftClient,\n\t\t\tuserAccountPublicKey,\n\t\t\taccountSubscription: {\n\t\t\t\ttype: 'custom',\n\t\t\t\tuserAccountSubscriber: new OneShotUserAccountSubscriber(\n\t\t\t\t\tthis._driftClient.program,\n\t\t\t\t\tuserAccountPublicKey,\n\t\t\t\t\tundefined,\n\t\t\t\t\tundefined\n\t\t\t\t),\n\t\t\t},\n\t\t});\n\n\t\t// Store original state\n\t\tconst originalWallet = this._driftClient.wallet;\n\t\tconst originalAuthority = this._driftClient.authority;\n\n\t\ttry {\n\t\t\t// Setup: Subscribe to user and configure DriftClient\n\t\t\tawait user.subscribe();\n\n\t\t\tconst authority = user.getUserAccount().authority;\n\t\t\tthis._driftClient.authority = authority;\n\n\t\t\tconst success = await this._driftClient.addUser(\n\t\t\t\tuser.getUserAccount().subAccountId,\n\t\t\t\tauthority\n\t\t\t);\n\n\t\t\tif (!success) {\n\t\t\t\tthrow new Error('Failed to add user to DriftClient');\n\t\t\t}\n\n\t\t\t// Replace wallet with user's authority to ensure correct transaction signing\n\t\t\t// This is necessary because DriftClient adds wallet.publicKey to instructions\n\t\t\tconst userWallet = {\n\t\t\t\tpublicKey: authority,\n\t\t\t\tsignTransaction: () =>\n\t\t\t\t\tPromise.reject(\n\t\t\t\t\t\t'This is a placeholder - do not sign with this wallet'\n\t\t\t\t\t),\n\t\t\t\tsignAllTransactions: () =>\n\t\t\t\t\tPromise.reject(\n\t\t\t\t\t\t'This is a placeholder - do not sign with this wallet'\n\t\t\t\t\t),\n\t\t\t};\n\n\t\t\t// Update wallet in all places that reference it\n\t\t\tthis._driftClient.wallet = userWallet;\n\t\t\t//@ts-ignore\n\t\t\tthis._driftClient.provider.wallet = userWallet;\n\t\t\tthis._driftClient.txHandler.updateWallet(userWallet);\n\n\t\t\t// Execute the operation\n\t\t\tconst result = await operation(user);\n\n\t\t\treturn result;\n\t\t} finally {\n\t\t\t// Cleanup: Always restore original state and unsubscribe\n\t\t\tthis._driftClient.wallet = originalWallet;\n\t\t\tthis._driftClient.txHandler.updateWallet(originalWallet);\n\t\t\tthis._driftClient.authority = originalAuthority;\n\n\t\t\ttry {\n\t\t\t\tawait user.unsubscribe();\n\t\t\t\tthis._driftClient.users.clear();\n\t\t\t} catch (cleanupError) {\n\t\t\t\tconsole.warn('Error during cleanup:', cleanupError);\n\t\t\t\t// Don't throw cleanup errors, but log them\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Returns a User object for a given user account public key. This fetches the user account data once.\n\t *\n\t * You may read more about the User object [here](https://github.com/drift-labs/protocol-v2/blob/master/sdk/src/user.ts)\n\t *\n\t * @param userAccountPublicKey - The user account public key\n\t */\n\tpublic async getUser(userAccountPublicKey: PublicKey): Promise<User> {\n\t\tconst oneShotUserAccountSubscriber = new OneShotUserAccountSubscriber(\n\t\t\tthis._driftClient.program,\n\t\t\tuserAccountPublicKey,\n\t\t\tundefined,\n\t\t\tundefined\n\t\t);\n\t\tconst user = new User({\n\t\t\tdriftClient: this._driftClient,\n\t\t\tuserAccountPublicKey,\n\t\t\taccountSubscription: {\n\t\t\t\ttype: 'custom',\n\t\t\t\tuserAccountSubscriber: oneShotUserAccountSubscriber,\n\t\t\t},\n\t\t});\n\t\tawait user.subscribe();\n\t\treturn user;\n\t}\n\n\tpublic async getCreateAndDepositTxn(\n\t\tauthority: PublicKey,\n\t\tamount: BN,\n\t\tspotMarketIndex: number,\n\t\toptions?: {\n\t\t\treferrerName?: string;\n\t\t\taccountName?: string;\n\t\t\tpoolId?: number;\n\t\t\tfromSubAccountId?: number;\n\t\t\tcustomMaxMarginRatio?: number;\n\t\t\ttxParams?: TxParams;\n\t\t}\n\t): Promise<{\n\t\ttransaction: VersionedTransaction | Transaction;\n\t\tuserAccountPublicKey: PublicKey;\n\t\tsubAccountId: number;\n\t}> {\n\t\tconst spotMarketConfig = this._spotMarketConfigs.find(\n\t\t\t(market) => market.marketIndex === spotMarketIndex\n\t\t);\n\n\t\tif (!spotMarketConfig) {\n\t\t\tthrow new Error(\n\t\t\t\t`Spot market config not found for index ${spotMarketIndex}`\n\t\t\t);\n\t\t}\n\n\t\tconst userStatsAccount = await fetchUserStatsAccount(\n\t\t\tthis._driftClient.connection,\n\t\t\tthis._driftClient.program,\n\t\t\tauthority\n\t\t);\n\n\t\tconst originalWallet = this._driftClient.wallet;\n\t\tconst originalAuthority = this._driftClient.authority;\n\n\t\tconst authorityWallet = {\n\t\t\tpublicKey: authority,\n\t\t\tsignTransaction: () =>\n\t\t\t\tPromise.reject('This is a placeholder - do not sign with this wallet'),\n\t\t\tsignAllTransactions: () =>\n\t\t\t\tPromise.reject('This is a placeholder - do not sign with this wallet'),\n\t\t};\n\n\t\ttry {\n\t\t\tthis._driftClient.wallet = authorityWallet;\n\t\t\t// @ts-ignore\n\t\t\tthis._driftClient.provider.wallet = authorityWallet;\n\t\t\tthis._driftClient.txHandler.updateWallet(authorityWallet);\n\t\t\tthis._driftClient.authority = authority;\n\n\t\t\treturn await createUserAndDepositCollateralBaseTxn({\n\t\t\t\tdriftClient: this._driftClient,\n\t\t\t\tamount,\n\t\t\t\tspotMarketConfig,\n\t\t\t\tauthority,\n\t\t\t\tuserStatsAccount,\n\t\t\t\treferrerName: options?.referrerName,\n\t\t\t\taccountName: options?.accountName,\n\t\t\t\tpoolId: options?.poolId,\n\t\t\t\tfromSubAccountId: options?.fromSubAccountId,\n\t\t\t\tcustomMaxMarginRatio: options?.customMaxMarginRatio,\n\t\t\t\ttxParams: options?.txParams,\n\t\t\t});\n\t\t} finally {\n\t\t\tthis._driftClient.wallet = originalWallet;\n\t\t\tthis._driftClient.txHandler.updateWallet(originalWallet);\n\t\t\t// @ts-ignore\n\t\t\tthis._driftClient.provider.wallet = originalWallet;\n\t\t\tthis._driftClient.authority = originalAuthority;\n\t\t}\n\t}\n\n\tpublic async getDepositTxn(\n\t\tuserAccountPublicKey: PublicKey,\n\t\tamount: BN,\n\t\tspotMarketIndex: number,\n\t\toptions?: {\n\t\t\ttxParams?: TxParams;\n\t\t}\n\t): Promise<VersionedTransaction | Transaction> {\n\t\treturn this.driftClientContextWrapper(\n\t\t\tuserAccountPublicKey,\n\t\t\tasync (user) => {\n\t\t\t\tconst spotMarketConfig = this._spotMarketConfigs.find(\n\t\t\t\t\t(market) => market.marketIndex === spotMarketIndex\n\t\t\t\t);\n\n\t\t\t\tif (!spotMarketConfig) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Spot market config not found for index ${spotMarketIndex}`\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst depositTxn = await createDepositTxn({\n\t\t\t\t\tdriftClient: this._driftClient,\n\t\t\t\t\tuser,\n\t\t\t\t\tamount: BigNum.from(amount, spotMarketConfig.precisionExp),\n\t\t\t\t\tspotMarketConfig,\n\t\t\t\t\ttxParams: options?.txParams,\n\t\t\t\t});\n\n\t\t\t\treturn depositTxn;\n\t\t\t}\n\t\t);\n\t}\n\n\tpublic async getDeleteUserTxn(\n\t\tuserAccountPublicKey: PublicKey,\n\t\toptions?: {\n\t\t\ttxParams?: TxParams;\n\t\t}\n\t): Promise<VersionedTransaction | Transaction> {\n\t\treturn this.driftClientContextWrapper(userAccountPublicKey, async () => {\n\t\t\treturn deleteUserTxn({\n\t\t\t\tdriftClient: this._driftClient,\n\t\t\t\tuserPublicKey: userAccountPublicKey,\n\t\t\t\ttxParams: options?.txParams,\n\t\t\t});\n\t\t});\n\t}\n\n\tpublic async getWithdrawTxn(\n\t\tuserAccountPublicKey: PublicKey,\n\t\tamount: BN,\n\t\tspotMarketIndex: number,\n\t\toptions?: {\n\t\t\tisBorrow?: boolean;\n\t\t\tisMax?: boolean;\n\t\t\ttxParams?: TxParams;\n\t\t}\n\t): Promise<VersionedTransaction | Transaction> {\n\t\treturn this.driftClientContextWrapper(\n\t\t\tuserAccountPublicKey,\n\t\t\tasync (user) => {\n\t\t\t\tconst spotMarketConfig = this._spotMarketConfigs.find(\n\t\t\t\t\t(market) => market.marketIndex === spotMarketIndex\n\t\t\t\t);\n\n\t\t\t\tif (!spotMarketConfig) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Spot market config not found for index ${spotMarketIndex}`\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst withdrawTxn = await createWithdrawTxn({\n\t\t\t\t\tdriftClient: this._driftClient,\n\t\t\t\t\tuser,\n\t\t\t\t\tamount: BigNum.from(amount, spotMarketConfig.precisionExp),\n\t\t\t\t\tspotMarketConfig,\n\t\t\t\t\tisBorrow: options?.isBorrow,\n\t\t\t\t\tisMax: options?.isMax,\n\t\t\t\t\ttxParams: options?.txParams,\n\t\t\t\t});\n\n\t\t\t\treturn withdrawTxn;\n\t\t\t}\n\t\t);\n\t}\n\n\tpublic async getSettleFundingTxn(\n\t\tuserAccountPublicKey: PublicKey,\n\t\toptions?: {\n\t\t\ttxParams?: TxParams;\n\t\t}\n\t): Promise<VersionedTransaction | Transaction> {\n\t\treturn this.driftClientContextWrapper(\n\t\t\tuserAccountPublicKey,\n\t\t\tasync (user) => {\n\t\t\t\tconst settleFundingTxn = await createSettleFundingTxn({\n\t\t\t\t\tdriftClient: this._driftClient,\n\t\t\t\t\tuser,\n\t\t\t\t\ttxParams: options?.txParams,\n\t\t\t\t});\n\n\t\t\t\treturn settleFundingTxn;\n\t\t\t}\n\t\t);\n\t}\n\n\tpublic async getSettlePnlTxn(\n\t\tuserAccountPublicKey: PublicKey,\n\t\tmarketIndexes: number[],\n\t\toptions?: {\n\t\t\ttxParams?: TxParams;\n\t\t}\n\t): Promise<VersionedTransaction | Transaction> {\n\t\treturn this.driftClientContextWrapper(\n\t\t\tuserAccountPublicKey,\n\t\t\tasync (user) => {\n\t\t\t\tconst settlePnlTxn = await createSettlePnlTxn({\n\t\t\t\t\tdriftClient: this._driftClient,\n\t\t\t\t\tuser,\n\t\t\t\t\tmarketIndexes,\n\t\t\t\t\ttxParams: options?.txParams,\n\t\t\t\t});\n\n\t\t\t\treturn settlePnlTxn;\n\t\t\t}\n\t\t);\n\t}\n\n\t// overloads for better type inference\n\tpublic async getOpenPerpMarketOrderTxn(\n\t\tparams: CentralServerGetOpenPerpMarketOrderTxnParams<true>\n\t): Promise<void>;\n\tpublic async getOpenPerpMarketOrderTxn(\n\t\tparams: CentralServerGetOpenPerpMarketOrderTxnParams<false>\n\t): Promise<Transaction | VersionedTransaction>;\n\tpublic async getOpenPerpMarketOrderTxn<T extends boolean>({\n\t\tuserAccountPublicKey,\n\t\t...rest\n\t}: CentralServerGetOpenPerpMarketOrderTxnParams<T>): Promise<\n\t\tTxnOrSwiftResult<T>\n\t> {\n\t\treturn this.driftClientContextWrapper(\n\t\t\tuserAccountPublicKey,\n\t\t\tasync (user): Promise<TxnOrSwiftResult<T>> => {\n\t\t\t\tconst { useSwift, swiftOptions, placeAndTake, ...otherProps } = rest;\n\n\t\t\t\tif (useSwift) {\n\t\t\t\t\tconst swiftOrderResult = await createOpenPerpMarketOrder({\n\t\t\t\t\t\t...otherProps,\n\t\t\t\t\t\tuseSwift: true,\n\t\t\t\t\t\tswiftOptions: {\n\t\t\t\t\t\t\t...swiftOptions,\n\t\t\t\t\t\t\tswiftServerUrl: this._driftEndpoints.swiftServerUrl,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tdriftClient: this._driftClient,\n\t\t\t\t\t\tuser,\n\t\t\t\t\t\tdlobServerHttpUrl: this._driftEndpoints.dlobServerHttpUrl,\n\t\t\t\t\t});\n\t\t\t\t\treturn swiftOrderResult as TxnOrSwiftResult<T>;\n\t\t\t\t} else {\n\t\t\t\t\tconst openPerpMarketOrderTxn = await createOpenPerpMarketOrder({\n\t\t\t\t\t\t...otherProps,\n\t\t\t\t\t\tplaceAndTake,\n\t\t\t\t\t\tuseSwift: false,\n\t\t\t\t\t\tdriftClient: this._driftClient,\n\t\t\t\t\t\tuser,\n\t\t\t\t\t\tdlobServerHttpUrl: this._driftEndpoints.dlobServerHttpUrl,\n\t\t\t\t\t});\n\t\t\t\t\treturn openPerpMarketOrderTxn as TxnOrSwiftResult<T>;\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\t}\n\n\t/**\n\t * Create a perp non-market order with amount and asset type\n\t */\n\tpublic async getOpenPerpNonMarketOrderTxn(\n\t\tparams: CentralServerGetOpenPerpNonMarketOrderTxnParams<true>\n\t): Promise<void>;\n\tpublic async getOpenPerpNonMarketOrderTxn(\n\t\tparams: CentralServerGetOpenPerpNonMarketOrderTxnParams<false>\n\t): Promise<Transaction | VersionedTransaction>;\n\tpublic async getOpenPerpNonMarketOrderTxn<T extends boolean>({\n\t\tuserAccountPublicKey,\n\t\t...rest\n\t}: WithTxnParams<\n\t\tOmit<OpenPerpNonMarketOrderParams<T>, 'driftClient' | 'user'>\n\t> & {\n\t\tuserAccountPublicKey: PublicKey;\n\t}): Promise<TxnOrSwiftResult<T>> {\n\t\treturn this.driftClientContextWrapper(\n\t\t\tuserAccountPublicKey,\n\t\t\tasync (user) => {\n\t\t\t\tconst { useSwift, swiftOptions, ...otherProps } = rest;\n\n\t\t\t\tif (useSwift) {\n\t\t\t\t\tconst swiftOrderResult = await createOpenPerpNonMarketOrder({\n\t\t\t\t\t\t...otherProps,\n\t\t\t\t\t\tuseSwift: true,\n\t\t\t\t\t\tswiftOptions: {\n\t\t\t\t\t\t\t...swiftOptions,\n\t\t\t\t\t\t\tswiftServerUrl: this._driftEndpoints.swiftServerUrl,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tdriftClient: this._driftClient,\n\t\t\t\t\t\tuser,\n\t\t\t\t\t\tdlobServerHttpUrl: this._driftEndpoints.dlobServerHttpUrl,\n\t\t\t\t\t});\n\t\t\t\t\treturn swiftOrderResult as TxnOrSwiftResult<T>;\n\t\t\t\t} else {\n\t\t\t\t\tconst openPerpNonMarketOrderTxn = await createOpenPerpNonMarketOrder({\n\t\t\t\t\t\t...otherProps,\n\t\t\t\t\t\tuseSwift: false,\n\t\t\t\t\t\tdriftClient: this._driftClient,\n\t\t\t\t\t\tuser,\n\t\t\t\t\t\tdlobServerHttpUrl: this._driftEndpoints.dlobServerHttpUrl,\n\t\t\t\t\t});\n\t\t\t\t\treturn openPerpNonMarketOrderTxn as TxnOrSwiftResult<T>;\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\t}\n\n\t/**\n\t * Create a transaction to edit an existing order\n\t */\n\tpublic async getEditOrderTxn(\n\t\tuserAccountPublicKey: PublicKey,\n\t\torderId: number,\n\t\teditOrderParams: {\n\t\t\tnewDirection?: PositionDirection;\n\t\t\tnewBaseAmount?: BN;\n\t\t\tnewLimitPrice?: BN;\n\t\t\tnewOraclePriceOffset?: number;\n\t\t\tnewTriggerPrice?: BN;\n\t\t\tnewTriggerCondition?: OrderTriggerCondition;\n\t\t\tauctionDuration?: number;\n\t\t\tauctionStartPrice?: BN;\n\t\t\tauctionEndPrice?: BN;\n\t\t\treduceOnly?: boolean;\n\t\t\tpostOnly?: boolean;\n\t\t\tbitFlags?: number;\n\t\t\tmaxTs?: BN;\n\t\t\tpolicy?: number;\n\t\t}\n\t): Promise<VersionedTransaction | Transaction> {\n\t\treturn this.driftClientContextWrapper(\n\t\t\tuserAccountPublicKey,\n\t\t\tasync (user) => {\n\t\t\t\tconst editOrderTxn = await createEditOrderTxn({\n\t\t\t\t\tdriftClient: this._driftClient,\n\t\t\t\t\tuser,\n\t\t\t\t\torderId,\n\t\t\t\t\teditOrderParams,\n\t\t\t\t});\n\n\t\t\t\treturn editOrderTxn;\n\t\t\t}\n\t\t);\n\t}\n\n\t/**\n\t * Create a transaction to cancel specific orders by their IDs\n\t */\n\tpublic async getCancelOrdersTxn(\n\t\tuserAccountPublicKey: PublicKey,\n\t\torderIds: number[]\n\t): Promise<VersionedTransaction | Transaction> {\n\t\treturn this.driftClientContextWrapper(\n\t\t\tuserAccountPublicKey,\n\t\t\tasync (user) => {\n\t\t\t\tconst cancelOrdersTxn = await createCancelOrdersTxn({\n\t\t\t\t\tdriftClient: this._driftClient,\n\t\t\t\t\tuser,\n\t\t\t\t\torderIds,\n\t\t\t\t});\n\n\t\t\t\treturn cancelOrdersTxn;\n\t\t\t}\n\t\t);\n\t}\n\n\t/**\n\t * Create a transaction to cancel all orders for a user\n\t */\n\tpublic async getCancelAllOrdersTxn(\n\t\tuserAccountPublicKey: PublicKey,\n\t\tmarketType?: MarketType,\n\t\tmarketIndex?: number,\n\t\tdirection?: PositionDirection\n\t): Promise<VersionedTransaction | Transaction> {\n\t\treturn this.driftClientContextWrapper(\n\t\t\tuserAccountPublicKey,\n\t\t\tasync (user) => {\n\t\t\t\tconst ix = await this._driftClient.getCancelOrdersIx(\n\t\t\t\t\tmarketType ?? null,\n\t\t\t\t\tmarketIndex ?? null,\n\t\t\t\t\tdirection ?? null,\n\t\t\t\t\tuser.getUserAccount().subAccountId\n\t\t\t\t);\n\n\t\t\t\tconst cancelAllOrdersTxn = await this._driftClient.buildTransaction(ix);\n\n\t\t\t\treturn cancelAllOrdersTxn;\n\t\t\t}\n\t\t);\n\t}\n\n\t/**\n\t * Create a swap transaction between two spot markets using Jupiter\n\t */\n\tpublic async getSwapTxn(\n\t\tuserAccountPublicKey: PublicKey,\n\t\tfromMarketIndex: number,\n\t\ttoMarketIndex: number,\n\t\tamount: BN,\n\t\toptions?: {\n\t\t\tslippageBps?: number;\n\t\t\tswapMode?: SwapMode;\n\t\t\tonlyDirectRoutes?: boolean;\n\t\t\tquote?: QuoteResponse;\n\t\t}\n\t): Promise<VersionedTransaction | Transaction> {\n\t\treturn this.driftClientContextWrapper(\n\t\t\tuserAccountPublicKey,\n\t\t\tasync (user) => {\n\t\t\t\tconst fromSpotMarketConfig = this._spotMarketConfigs.find(\n\t\t\t\t\t(market) => market.marketIndex === fromMarketIndex\n\t\t\t\t);\n\t\t\t\tconst toSpotMarketConfig = this._spotMarketConfigs.find(\n\t\t\t\t\t(market) => market.marketIndex === toMarketIndex\n\t\t\t\t);\n\n\t\t\t\tif (!fromSpotMarketConfig) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`From spot market config not found for index ${fromMarketIndex}`\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (!toSpotMarketConfig) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`To spot market config not found for index ${toMarketIndex}`\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// Initialize Jupiter client\n\t\t\t\tconst jupiterClient = new JupiterClient({\n\t\t\t\t\tconnection: this._driftClient.connection,\n\t\t\t\t});\n\n\t\t\t\t// Get quote if not provided\n\t\t\t\tlet quote = options?.quote;\n\t\t\t\tif (!quote) {\n\t\t\t\t\tquote = await jupiterClient.getQuote({\n\t\t\t\t\t\tinputMint: fromSpotMarketConfig.mint,\n\t\t\t\t\t\toutputMint: toSpotMarketConfig.mint,\n\t\t\t\t\t\tamount,\n\t\t\t\t\t\tslippageBps: options?.slippageBps ?? 10, // Default 0.1%\n\t\t\t\t\t\tswapMode: options?.swapMode ?? 'ExactIn',\n\t\t\t\t\t\tonlyDirectRoutes: options?.onlyDirectRoutes ?? false,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tconst swapTxn = await createSwapTxn({\n\t\t\t\t\tdriftClient: this._driftClient,\n\t\t\t\t\tjupiterClient,\n\t\t\t\t\tuser,\n\t\t\t\t\tswapFromMarketIndex: fromMarketIndex,\n\t\t\t\t\tswapToMarketIndex: toMarketIndex,\n\t\t\t\t\tamount,\n\t\t\t\t\tquote,\n\t\t\t\t\ttxParams: {\n\t\t\t\t\t\tuseSimulatedComputeUnits: true,\n\t\t\t\t\t\tcomputeUnitsBufferMultiplier: 1.5,\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\t\treturn swapTxn;\n\t\t\t}\n\t\t);\n\t}\n\n\tpublic async sendSignedTransaction(tx: VersionedTransaction | Transaction) {\n\t\treturn this._driftClient.sendTransaction(tx, undefined, undefined, true);\n\t}\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Observable } from 'rxjs';
|
|
2
2
|
import { MarketId, MarketKey } from '../../../types/MarketId';
|
|
3
|
-
import { L2WithOracleAndMarketData } from '../../../utils/orderbook';
|
|
3
|
+
import { L2WithOracleAndMarketData } from '../../../utils/orderbook/types';
|
|
4
4
|
export interface PollingConfig {
|
|
5
5
|
driftDlobServerHttpUrl: string;
|
|
6
6
|
indicativeLiquidityEnabled?: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PollingDlob.js","sourceRoot":"","sources":["../../../../src/drift/Drift/data/PollingDlob.ts"],"names":[],"mappings":"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","sourcesContent":["import { Subject, Observable } from 'rxjs';\nimport { MarketId, MarketKey } from '../../../types/MarketId';\nimport { L2WithOracleAndMarketData } from '../../../utils/orderbook';\nimport { PollingCategory } from '../constants/blockchain';\nimport { fetchBulkMarketsDlobL2Data } from '../../base/actions/trade/openPerpOrder/dlobServer';\n\nexport interface PollingConfig {\n\tdriftDlobServerHttpUrl: string;\n\tindicativeLiquidityEnabled?: boolean;\n\tgroupingSize?: number;\n}\n\nexport interface PollingInterval {\n\tid: string;\n\tintervalMultiplier: number;\n\tdepth: number;\n\tmarkets: Set<MarketKey>;\n\t/**\n\t * Used to track markets that were added to an interval in the current tick, so that they get polled on the next tick regardless of interval multiplier.\n\t * Otherwise, they would only get polled on the next interval, which could be a long time if the interval multiplier is high.\n\t */\n\tnewlyAddedMarkets: Set<MarketKey>;\n}\n\nexport interface MarketPollingData {\n\tmarketId: MarketId;\n\tdata: L2WithOracleAndMarketData;\n}\n\n// Predefined interval multipliers from the original React hook\nexport const POLLING_INTERVALS = {\n\tLIVE_MARKET: 1,\n\tBACKGROUND_DEEP: 3, // Can be configured to 2 for interim usage\n\tBACKGROUND_SHALLOW: 30,\n\tIDLE_1: 30,\n\tIDLE_2: 60,\n} as const;\n\nexport const POLLING_DEPTHS = {\n\tSHALLOW: 1,\n\tDEEP: 1,\n\tORDERBOOK: 100,\n} as const;\n\n/**\n * PollingDlob - A configurable market data polling system.\n * The Drift DLOB (decentralized limit orderbook) server stores the current live state of the orderbook\n * across all Drift markets. This class is used to poll the DLOB server for the markets' current mark price,\n * while oracle price data is also provided alongside.\n *\n * Example usage:\n * ```typescript\n * import { PollingDlob, MarketId } from '@drift/common';\n *\n * const pollingDlob = new PollingDlob({\n * dlobServerHttpUrl: 'https://dlob.drift.trade',\n * indicativeLiquidityEnabled: true\n * });\n *\n * // Add different polling intervals\n * pollingDlob.addInterval('live', 1, 100); // Every 1s with depth 100\n * pollingDlob.addInterval('background', 3, 1); // Every 3s with depth 1\n * pollingDlob.addInterval('idle', 30, 1); // Every 30s with depth 1\n *\n * // Add markets to intervals\n * const perpMarket = MarketId.createPerpMarket(0);\n * const spotMarket = MarketId.createSpotMarket(0);\n *\n * pollingDlob.addMarketToInterval('live', perpMarket);\n * pollingDlob.addMarketToInterval('background', spotMarket);\n *\n * // Subscribe to data updates\n * pollingDlob.onData().subscribe(marketData => {\n * marketData.forEach(({ marketId, data, intervalId }) => {\n * console.log(`Market ${marketId.key} data from ${intervalId}:`, data);\n * });\n * });\n *\n * // Subscribe to errors\n * pollingDlob.onError().subscribe(error => {\n * console.error('Polling error:', error);\n * });\n *\n * // Start polling\n * pollingDlob.start();\n *\n * // Stop when done\n * // pollingDlob.stop();\n * ```\n */\n\nexport class PollingDlob {\n\tprivate config: PollingConfig;\n\tprivate baseTickIntervalMs = 1000;\n\tprivate intervals: Map<string, PollingInterval> = new Map();\n\tprivate _marketToIntervalMap: Map<MarketKey, string> = new Map();\n\tprivate dataSubject: Subject<MarketPollingData[]> = new Subject();\n\tprivate errorSubject: Subject<Error> = new Subject();\n\tprivate isStarted = false;\n\tprivate intervalHandle: NodeJS.Timeout | null = null;\n\tprivate tickCounter = 0;\n\tprivate consecutiveEmptyResponseCount = 0;\n\tprivate consecutiveErrorCount = 0;\n\tprivate readonly maxConsecutiveEmptyResponses = 3;\n\tprivate readonly maxConsecutiveErrors = 5;\n\n\tconstructor(config: PollingConfig) {\n\t\tthis.config = {\n\t\t\tindicativeLiquidityEnabled: true,\n\t\t\t...config,\n\t\t};\n\t}\n\n\tpublic getPollingIntervalForMarket(\n\t\tmarketKey: MarketKey\n\t): PollingInterval | undefined {\n\t\tconst intervalId = this._marketToIntervalMap.get(marketKey);\n\t\tif (!intervalId) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\treturn this.intervals.get(intervalId);\n\t}\n\n\tpublic addInterval(\n\t\tid: string,\n\t\tintervalMultiplier: number,\n\t\tdepth: number\n\t): void {\n\t\tif (this.intervals.has(id)) {\n\t\t\tthrow new Error(`Interval with id '${id}' already exists`);\n\t\t}\n\n\t\tthis.intervals.set(id, {\n\t\t\tid,\n\t\t\tintervalMultiplier,\n\t\t\tdepth,\n\t\t\tmarkets: new Set(),\n\t\t\tnewlyAddedMarkets: new Set(),\n\t\t});\n\t}\n\n\tpublic removeInterval(id: string): void {\n\t\tconst interval = this.intervals.get(id);\n\t\tif (!interval) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Remove all markets from this interval\n\t\tinterval.markets.forEach((market) => {\n\t\t\tthis._marketToIntervalMap.delete(market);\n\t\t});\n\n\t\tthis.intervals.delete(id);\n\t}\n\n\t/**\n\t * Add a market to an interval.\n\t * If the market is already in an interval, it will be removed from the existing interval.\n\t * Newly added markets will be polled on the next tick regardless of interval multiplier.\n\t */\n\tpublic addMarketToInterval(intervalId: string, marketKey: MarketKey): void {\n\t\tconst interval = this.intervals.get(intervalId);\n\t\tif (!interval) {\n\t\t\tthrow new Error(`Interval with id '${intervalId}' does not exist`);\n\t\t}\n\n\t\t// Remove market from any existing interval first\n\t\tconst existingIntervalId = this._marketToIntervalMap.get(marketKey);\n\n\t\tif (existingIntervalId === intervalId) {\n\t\t\t// market is already in the interval\n\t\t\treturn;\n\t\t}\n\n\t\tif (existingIntervalId) {\n\t\t\tthis.removeMarketFromInterval(existingIntervalId, marketKey);\n\t\t}\n\n\t\tinterval.markets.add(marketKey);\n\t\t// Mark as newly added so it gets polled on the next tick\n\t\tinterval.newlyAddedMarkets.add(marketKey);\n\t\tthis._marketToIntervalMap.set(marketKey, intervalId);\n\t}\n\n\tpublic addMarketsToInterval(\n\t\tintervalId: string,\n\t\tmarketKeys: MarketKey[]\n\t): void {\n\t\tfor (const marketKey of marketKeys) {\n\t\t\tthis.addMarketToInterval(intervalId, marketKey);\n\t\t}\n\t}\n\n\tpublic removeMarketFromInterval(\n\t\tintervalId: string,\n\t\tmarketKey: MarketKey\n\t): void {\n\t\tconst interval = this.intervals.get(intervalId);\n\t\tif (!interval) {\n\t\t\treturn;\n\t\t}\n\n\t\tinterval.markets.delete(marketKey);\n\t\tinterval.newlyAddedMarkets.delete(marketKey);\n\t\tthis._marketToIntervalMap.delete(marketKey);\n\t}\n\n\tpublic getMarketInterval(marketKey: MarketKey): string | undefined {\n\t\treturn this._marketToIntervalMap.get(marketKey);\n\t}\n\n\tpublic onData(): Observable<MarketPollingData[]> {\n\t\treturn this.dataSubject.asObservable();\n\t}\n\n\tpublic onError(): Observable<Error> {\n\t\treturn this.errorSubject.asObservable();\n\t}\n\n\tpublic start(): Promise<void> {\n\t\tif (this.isStarted) {\n\t\t\treturn Promise.resolve();\n\t\t}\n\n\t\tthis.isStarted = true;\n\t\tthis.tickCounter = 0;\n\n\t\tconst firstTickPromise = this.tick();\n\n\t\tthis.intervalHandle = setInterval(() => {\n\t\t\tthis.tick();\n\t\t}, this.baseTickIntervalMs);\n\n\t\treturn firstTickPromise;\n\t}\n\n\tpublic stop(): void {\n\t\tif (!this.isStarted) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.isStarted = false;\n\n\t\tif (this.intervalHandle) {\n\t\t\tclearInterval(this.intervalHandle);\n\t\t\tthis.intervalHandle = null;\n\t\t}\n\t}\n\n\tpublic isRunning(): boolean {\n\t\treturn this.isStarted;\n\t}\n\n\tpublic getConfig(): PollingConfig {\n\t\treturn { ...this.config };\n\t}\n\n\tpublic updateConfig(newConfig: Partial<PollingConfig>): void {\n\t\tthis.config = { ...this.config, ...newConfig };\n\t}\n\n\tpublic getMarketCount(): number {\n\t\treturn this._marketToIntervalMap.size;\n\t}\n\n\tpublic getIntervalCount(): number {\n\t\treturn this.intervals.size;\n\t}\n\n\tpublic getAllMarkets(): MarketKey[] {\n\t\tconst allMarkets: MarketKey[] = [];\n\t\tthis.intervals.forEach((interval) => {\n\t\t\tallMarkets.push(...Array.from(interval.markets));\n\t\t});\n\t\treturn allMarkets;\n\t}\n\n\tpublic getMarketsForInterval(intervalId: string): MarketKey[] {\n\t\tconst interval = this.intervals.get(intervalId);\n\t\treturn interval ? Array.from(interval.markets) : [];\n\t}\n\n\tpublic getStats(): {\n\t\tisRunning: boolean;\n\t\ttickCounter: number;\n\t\tintervalCount: number;\n\t\tmarketCount: number;\n\t\tconsecutiveEmptyResponses: number;\n\t\tconsecutiveErrors: number;\n\t} {\n\t\treturn {\n\t\t\tisRunning: this.isStarted,\n\t\t\ttickCounter: this.tickCounter,\n\t\t\tintervalCount: this.intervals.size,\n\t\t\tmarketCount: this._marketToIntervalMap.size,\n\t\t\tconsecutiveEmptyResponses: this.consecutiveEmptyResponseCount,\n\t\t\tconsecutiveErrors: this.consecutiveErrorCount,\n\t\t};\n\t}\n\n\tpublic resetErrorCounters(): void {\n\t\tthis.consecutiveEmptyResponseCount = 0;\n\t\tthis.consecutiveErrorCount = 0;\n\t}\n\n\t/**\n\t * Factory method to create a PollingDlob with common interval configurations\n\t */\n\tpublic static createWithCommonIntervals(config: PollingConfig): PollingDlob {\n\t\tconst pollingDlob = new PollingDlob(config);\n\n\t\t// Add common intervals based on the original React hook\n\t\tpollingDlob.addInterval(\n\t\t\tPollingCategory.SELECTED_MARKET,\n\t\t\tPOLLING_INTERVALS.LIVE_MARKET,\n\t\t\tPOLLING_DEPTHS.ORDERBOOK\n\t\t);\n\t\tpollingDlob.addInterval(\n\t\t\tPollingCategory.USER_INVOLVED,\n\t\t\tPOLLING_INTERVALS.BACKGROUND_DEEP,\n\t\t\tPOLLING_DEPTHS.DEEP\n\t\t);\n\t\tpollingDlob.addInterval(\n\t\t\tPollingCategory.USER_NOT_INVOLVED,\n\t\t\tPOLLING_INTERVALS.BACKGROUND_SHALLOW,\n\t\t\tPOLLING_DEPTHS.SHALLOW\n\t\t);\n\n\t\treturn pollingDlob;\n\t}\n\n\tprivate async tick(): Promise<void> {\n\t\tthis.tickCounter++;\n\n\t\t// Find intervals that should be polled this tick\n\t\tconst intervalsToPoll = Array.from(this.intervals.values()).filter(\n\t\t\t(interval) => {\n\t\t\t\tconst hasMarkets = interval.markets.size > 0;\n\t\t\t\tconst hasNewlyAddedMarkets = interval.newlyAddedMarkets.size > 0;\n\t\t\t\tconst isFirstTick = this.tickCounter === 1;\n\t\t\t\tconst isRegularInterval =\n\t\t\t\t\tthis.tickCounter % interval.intervalMultiplier === 0;\n\n\t\t\t\treturn (\n\t\t\t\t\thasMarkets &&\n\t\t\t\t\t(isFirstTick || isRegularInterval || hasNewlyAddedMarkets)\n\t\t\t\t);\n\t\t\t}\n\t\t);\n\n\t\tif (intervalsToPoll.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tconst allMarketPollingData: MarketPollingData[] = [];\n\n\t\t\t// Combine all markets from different intervals into a single request\n\t\t\tconst combinedMarketRequests: {\n\t\t\t\tmarketId: MarketId;\n\t\t\t\tdepth: number;\n\t\t\t\tintervalMultiplier: number;\n\t\t\t}[] = [];\n\n\t\t\tfor (const interval of intervalsToPoll) {\n\t\t\t\tconst marketsArray = Array.from(interval.markets);\n\t\t\t\tif (marketsArray.length === 0) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tfor (const marketKey of marketsArray) {\n\t\t\t\t\tcombinedMarketRequests.push({\n\t\t\t\t\t\tmarketId: MarketId.getMarketIdFromKey(marketKey),\n\t\t\t\t\t\tdepth: interval.depth,\n\t\t\t\t\t\tintervalMultiplier: interval.intervalMultiplier,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (combinedMarketRequests.length === 0) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Make a single bulk fetch for all markets\n\t\t\tconst l2Data = await fetchBulkMarketsDlobL2Data(\n\t\t\t\tthis.config.driftDlobServerHttpUrl,\n\t\t\t\tcombinedMarketRequests.map((req) => ({\n\t\t\t\t\tmarketId: req.marketId,\n\t\t\t\t\tdepth: req.depth,\n\t\t\t\t}))\n\t\t\t);\n\n\t\t\t// Map the results back to MarketPollingData with correct interval IDs\n\t\t\tconst intervalData: MarketPollingData[] = l2Data.map((data, index) => ({\n\t\t\t\tmarketId: combinedMarketRequests[index].marketId,\n\t\t\t\tdata,\n\t\t\t}));\n\n\t\t\tallMarketPollingData.push(...intervalData);\n\n\t\t\tif (allMarketPollingData.length > 0) {\n\t\t\t\tthis.consecutiveEmptyResponseCount = 0;\n\t\t\t\tthis.consecutiveErrorCount = 0;\n\t\t\t\tthis.dataSubject.next(allMarketPollingData);\n\n\t\t\t\t// Clear newly added markets flags for intervals that were polled\n\t\t\t\tintervalsToPoll.forEach((interval) => {\n\t\t\t\t\tinterval.newlyAddedMarkets.clear();\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tthis.consecutiveEmptyResponseCount++;\n\t\t\t\tif (\n\t\t\t\t\tthis.consecutiveEmptyResponseCount >=\n\t\t\t\t\tthis.maxConsecutiveEmptyResponses\n\t\t\t\t) {\n\t\t\t\t\tthis.errorSubject.next(\n\t\t\t\t\t\tnew Error(\n\t\t\t\t\t\t\t`Received ${this.maxConsecutiveEmptyResponses} consecutive empty responses`\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthis.consecutiveErrorCount++;\n\t\t\tconst errorInstance =\n\t\t\t\terror instanceof Error ? error : new Error(String(error));\n\n\t\t\tif (this.consecutiveErrorCount >= this.maxConsecutiveErrors) {\n\t\t\t\tthis.errorSubject.next(\n\t\t\t\t\tnew Error(\n\t\t\t\t\t\t`Received ${this.maxConsecutiveErrors} consecutive errors. Latest: ${errorInstance.message}`\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tthis.errorSubject.next(errorInstance);\n\t\t\t}\n\t\t}\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"PollingDlob.js","sourceRoot":"","sources":["../../../../src/drift/Drift/data/PollingDlob.ts"],"names":[],"mappings":"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","sourcesContent":["import { Subject, Observable } from 'rxjs';\nimport { MarketId, MarketKey } from '../../../types/MarketId';\nimport { L2WithOracleAndMarketData } from '../../../utils/orderbook/types';\nimport { PollingCategory } from '../constants/blockchain';\nimport { fetchBulkMarketsDlobL2Data } from '../../base/actions/trade/openPerpOrder/dlobServer';\n\nexport interface PollingConfig {\n\tdriftDlobServerHttpUrl: string;\n\tindicativeLiquidityEnabled?: boolean;\n\tgroupingSize?: number;\n}\n\nexport interface PollingInterval {\n\tid: string;\n\tintervalMultiplier: number;\n\tdepth: number;\n\tmarkets: Set<MarketKey>;\n\t/**\n\t * Used to track markets that were added to an interval in the current tick, so that they get polled on the next tick regardless of interval multiplier.\n\t * Otherwise, they would only get polled on the next interval, which could be a long time if the interval multiplier is high.\n\t */\n\tnewlyAddedMarkets: Set<MarketKey>;\n}\n\nexport interface MarketPollingData {\n\tmarketId: MarketId;\n\tdata: L2WithOracleAndMarketData;\n}\n\n// Predefined interval multipliers from the original React hook\nexport const POLLING_INTERVALS = {\n\tLIVE_MARKET: 1,\n\tBACKGROUND_DEEP: 3, // Can be configured to 2 for interim usage\n\tBACKGROUND_SHALLOW: 30,\n\tIDLE_1: 30,\n\tIDLE_2: 60,\n} as const;\n\nexport const POLLING_DEPTHS = {\n\tSHALLOW: 1,\n\tDEEP: 1,\n\tORDERBOOK: 100,\n} as const;\n\n/**\n * PollingDlob - A configurable market data polling system.\n * The Drift DLOB (decentralized limit orderbook) server stores the current live state of the orderbook\n * across all Drift markets. This class is used to poll the DLOB server for the markets' current mark price,\n * while oracle price data is also provided alongside.\n *\n * Example usage:\n * ```typescript\n * import { PollingDlob, MarketId } from '@drift/common';\n *\n * const pollingDlob = new PollingDlob({\n * dlobServerHttpUrl: 'https://dlob.drift.trade',\n * indicativeLiquidityEnabled: true\n * });\n *\n * // Add different polling intervals\n * pollingDlob.addInterval('live', 1, 100); // Every 1s with depth 100\n * pollingDlob.addInterval('background', 3, 1); // Every 3s with depth 1\n * pollingDlob.addInterval('idle', 30, 1); // Every 30s with depth 1\n *\n * // Add markets to intervals\n * const perpMarket = MarketId.createPerpMarket(0);\n * const spotMarket = MarketId.createSpotMarket(0);\n *\n * pollingDlob.addMarketToInterval('live', perpMarket);\n * pollingDlob.addMarketToInterval('background', spotMarket);\n *\n * // Subscribe to data updates\n * pollingDlob.onData().subscribe(marketData => {\n * marketData.forEach(({ marketId, data, intervalId }) => {\n * console.log(`Market ${marketId.key} data from ${intervalId}:`, data);\n * });\n * });\n *\n * // Subscribe to errors\n * pollingDlob.onError().subscribe(error => {\n * console.error('Polling error:', error);\n * });\n *\n * // Start polling\n * pollingDlob.start();\n *\n * // Stop when done\n * // pollingDlob.stop();\n * ```\n */\n\nexport class PollingDlob {\n\tprivate config: PollingConfig;\n\tprivate baseTickIntervalMs = 1000;\n\tprivate intervals: Map<string, PollingInterval> = new Map();\n\tprivate _marketToIntervalMap: Map<MarketKey, string> = new Map();\n\tprivate dataSubject: Subject<MarketPollingData[]> = new Subject();\n\tprivate errorSubject: Subject<Error> = new Subject();\n\tprivate isStarted = false;\n\tprivate intervalHandle: NodeJS.Timeout | null = null;\n\tprivate tickCounter = 0;\n\tprivate consecutiveEmptyResponseCount = 0;\n\tprivate consecutiveErrorCount = 0;\n\tprivate readonly maxConsecutiveEmptyResponses = 3;\n\tprivate readonly maxConsecutiveErrors = 5;\n\n\tconstructor(config: PollingConfig) {\n\t\tthis.config = {\n\t\t\tindicativeLiquidityEnabled: true,\n\t\t\t...config,\n\t\t};\n\t}\n\n\tpublic getPollingIntervalForMarket(\n\t\tmarketKey: MarketKey\n\t): PollingInterval | undefined {\n\t\tconst intervalId = this._marketToIntervalMap.get(marketKey);\n\t\tif (!intervalId) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\treturn this.intervals.get(intervalId);\n\t}\n\n\tpublic addInterval(\n\t\tid: string,\n\t\tintervalMultiplier: number,\n\t\tdepth: number\n\t): void {\n\t\tif (this.intervals.has(id)) {\n\t\t\tthrow new Error(`Interval with id '${id}' already exists`);\n\t\t}\n\n\t\tthis.intervals.set(id, {\n\t\t\tid,\n\t\t\tintervalMultiplier,\n\t\t\tdepth,\n\t\t\tmarkets: new Set(),\n\t\t\tnewlyAddedMarkets: new Set(),\n\t\t});\n\t}\n\n\tpublic removeInterval(id: string): void {\n\t\tconst interval = this.intervals.get(id);\n\t\tif (!interval) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Remove all markets from this interval\n\t\tinterval.markets.forEach((market) => {\n\t\t\tthis._marketToIntervalMap.delete(market);\n\t\t});\n\n\t\tthis.intervals.delete(id);\n\t}\n\n\t/**\n\t * Add a market to an interval.\n\t * If the market is already in an interval, it will be removed from the existing interval.\n\t * Newly added markets will be polled on the next tick regardless of interval multiplier.\n\t */\n\tpublic addMarketToInterval(intervalId: string, marketKey: MarketKey): void {\n\t\tconst interval = this.intervals.get(intervalId);\n\t\tif (!interval) {\n\t\t\tthrow new Error(`Interval with id '${intervalId}' does not exist`);\n\t\t}\n\n\t\t// Remove market from any existing interval first\n\t\tconst existingIntervalId = this._marketToIntervalMap.get(marketKey);\n\n\t\tif (existingIntervalId === intervalId) {\n\t\t\t// market is already in the interval\n\t\t\treturn;\n\t\t}\n\n\t\tif (existingIntervalId) {\n\t\t\tthis.removeMarketFromInterval(existingIntervalId, marketKey);\n\t\t}\n\n\t\tinterval.markets.add(marketKey);\n\t\t// Mark as newly added so it gets polled on the next tick\n\t\tinterval.newlyAddedMarkets.add(marketKey);\n\t\tthis._marketToIntervalMap.set(marketKey, intervalId);\n\t}\n\n\tpublic addMarketsToInterval(\n\t\tintervalId: string,\n\t\tmarketKeys: MarketKey[]\n\t): void {\n\t\tfor (const marketKey of marketKeys) {\n\t\t\tthis.addMarketToInterval(intervalId, marketKey);\n\t\t}\n\t}\n\n\tpublic removeMarketFromInterval(\n\t\tintervalId: string,\n\t\tmarketKey: MarketKey\n\t): void {\n\t\tconst interval = this.intervals.get(intervalId);\n\t\tif (!interval) {\n\t\t\treturn;\n\t\t}\n\n\t\tinterval.markets.delete(marketKey);\n\t\tinterval.newlyAddedMarkets.delete(marketKey);\n\t\tthis._marketToIntervalMap.delete(marketKey);\n\t}\n\n\tpublic getMarketInterval(marketKey: MarketKey): string | undefined {\n\t\treturn this._marketToIntervalMap.get(marketKey);\n\t}\n\n\tpublic onData(): Observable<MarketPollingData[]> {\n\t\treturn this.dataSubject.asObservable();\n\t}\n\n\tpublic onError(): Observable<Error> {\n\t\treturn this.errorSubject.asObservable();\n\t}\n\n\tpublic start(): Promise<void> {\n\t\tif (this.isStarted) {\n\t\t\treturn Promise.resolve();\n\t\t}\n\n\t\tthis.isStarted = true;\n\t\tthis.tickCounter = 0;\n\n\t\tconst firstTickPromise = this.tick();\n\n\t\tthis.intervalHandle = setInterval(() => {\n\t\t\tthis.tick();\n\t\t}, this.baseTickIntervalMs);\n\n\t\treturn firstTickPromise;\n\t}\n\n\tpublic stop(): void {\n\t\tif (!this.isStarted) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.isStarted = false;\n\n\t\tif (this.intervalHandle) {\n\t\t\tclearInterval(this.intervalHandle);\n\t\t\tthis.intervalHandle = null;\n\t\t}\n\t}\n\n\tpublic isRunning(): boolean {\n\t\treturn this.isStarted;\n\t}\n\n\tpublic getConfig(): PollingConfig {\n\t\treturn { ...this.config };\n\t}\n\n\tpublic updateConfig(newConfig: Partial<PollingConfig>): void {\n\t\tthis.config = { ...this.config, ...newConfig };\n\t}\n\n\tpublic getMarketCount(): number {\n\t\treturn this._marketToIntervalMap.size;\n\t}\n\n\tpublic getIntervalCount(): number {\n\t\treturn this.intervals.size;\n\t}\n\n\tpublic getAllMarkets(): MarketKey[] {\n\t\tconst allMarkets: MarketKey[] = [];\n\t\tthis.intervals.forEach((interval) => {\n\t\t\tallMarkets.push(...Array.from(interval.markets));\n\t\t});\n\t\treturn allMarkets;\n\t}\n\n\tpublic getMarketsForInterval(intervalId: string): MarketKey[] {\n\t\tconst interval = this.intervals.get(intervalId);\n\t\treturn interval ? Array.from(interval.markets) : [];\n\t}\n\n\tpublic getStats(): {\n\t\tisRunning: boolean;\n\t\ttickCounter: number;\n\t\tintervalCount: number;\n\t\tmarketCount: number;\n\t\tconsecutiveEmptyResponses: number;\n\t\tconsecutiveErrors: number;\n\t} {\n\t\treturn {\n\t\t\tisRunning: this.isStarted,\n\t\t\ttickCounter: this.tickCounter,\n\t\t\tintervalCount: this.intervals.size,\n\t\t\tmarketCount: this._marketToIntervalMap.size,\n\t\t\tconsecutiveEmptyResponses: this.consecutiveEmptyResponseCount,\n\t\t\tconsecutiveErrors: this.consecutiveErrorCount,\n\t\t};\n\t}\n\n\tpublic resetErrorCounters(): void {\n\t\tthis.consecutiveEmptyResponseCount = 0;\n\t\tthis.consecutiveErrorCount = 0;\n\t}\n\n\t/**\n\t * Factory method to create a PollingDlob with common interval configurations\n\t */\n\tpublic static createWithCommonIntervals(config: PollingConfig): PollingDlob {\n\t\tconst pollingDlob = new PollingDlob(config);\n\n\t\t// Add common intervals based on the original React hook\n\t\tpollingDlob.addInterval(\n\t\t\tPollingCategory.SELECTED_MARKET,\n\t\t\tPOLLING_INTERVALS.LIVE_MARKET,\n\t\t\tPOLLING_DEPTHS.ORDERBOOK\n\t\t);\n\t\tpollingDlob.addInterval(\n\t\t\tPollingCategory.USER_INVOLVED,\n\t\t\tPOLLING_INTERVALS.BACKGROUND_DEEP,\n\t\t\tPOLLING_DEPTHS.DEEP\n\t\t);\n\t\tpollingDlob.addInterval(\n\t\t\tPollingCategory.USER_NOT_INVOLVED,\n\t\t\tPOLLING_INTERVALS.BACKGROUND_SHALLOW,\n\t\t\tPOLLING_DEPTHS.SHALLOW\n\t\t);\n\n\t\treturn pollingDlob;\n\t}\n\n\tprivate async tick(): Promise<void> {\n\t\tthis.tickCounter++;\n\n\t\t// Find intervals that should be polled this tick\n\t\tconst intervalsToPoll = Array.from(this.intervals.values()).filter(\n\t\t\t(interval) => {\n\t\t\t\tconst hasMarkets = interval.markets.size > 0;\n\t\t\t\tconst hasNewlyAddedMarkets = interval.newlyAddedMarkets.size > 0;\n\t\t\t\tconst isFirstTick = this.tickCounter === 1;\n\t\t\t\tconst isRegularInterval =\n\t\t\t\t\tthis.tickCounter % interval.intervalMultiplier === 0;\n\n\t\t\t\treturn (\n\t\t\t\t\thasMarkets &&\n\t\t\t\t\t(isFirstTick || isRegularInterval || hasNewlyAddedMarkets)\n\t\t\t\t);\n\t\t\t}\n\t\t);\n\n\t\tif (intervalsToPoll.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tconst allMarketPollingData: MarketPollingData[] = [];\n\n\t\t\t// Combine all markets from different intervals into a single request\n\t\t\tconst combinedMarketRequests: {\n\t\t\t\tmarketId: MarketId;\n\t\t\t\tdepth: number;\n\t\t\t\tintervalMultiplier: number;\n\t\t\t}[] = [];\n\n\t\t\tfor (const interval of intervalsToPoll) {\n\t\t\t\tconst marketsArray = Array.from(interval.markets);\n\t\t\t\tif (marketsArray.length === 0) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tfor (const marketKey of marketsArray) {\n\t\t\t\t\tcombinedMarketRequests.push({\n\t\t\t\t\t\tmarketId: MarketId.getMarketIdFromKey(marketKey),\n\t\t\t\t\t\tdepth: interval.depth,\n\t\t\t\t\t\tintervalMultiplier: interval.intervalMultiplier,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (combinedMarketRequests.length === 0) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Make a single bulk fetch for all markets\n\t\t\tconst l2Data = await fetchBulkMarketsDlobL2Data(\n\t\t\t\tthis.config.driftDlobServerHttpUrl,\n\t\t\t\tcombinedMarketRequests.map((req) => ({\n\t\t\t\t\tmarketId: req.marketId,\n\t\t\t\t\tdepth: req.depth,\n\t\t\t\t}))\n\t\t\t);\n\n\t\t\t// Map the results back to MarketPollingData with correct interval IDs\n\t\t\tconst intervalData: MarketPollingData[] = l2Data.map((data, index) => ({\n\t\t\t\tmarketId: combinedMarketRequests[index].marketId,\n\t\t\t\tdata,\n\t\t\t}));\n\n\t\t\tallMarketPollingData.push(...intervalData);\n\n\t\t\tif (allMarketPollingData.length > 0) {\n\t\t\t\tthis.consecutiveEmptyResponseCount = 0;\n\t\t\t\tthis.consecutiveErrorCount = 0;\n\t\t\t\tthis.dataSubject.next(allMarketPollingData);\n\n\t\t\t\t// Clear newly added markets flags for intervals that were polled\n\t\t\t\tintervalsToPoll.forEach((interval) => {\n\t\t\t\t\tinterval.newlyAddedMarkets.clear();\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tthis.consecutiveEmptyResponseCount++;\n\t\t\t\tif (\n\t\t\t\t\tthis.consecutiveEmptyResponseCount >=\n\t\t\t\t\tthis.maxConsecutiveEmptyResponses\n\t\t\t\t) {\n\t\t\t\t\tthis.errorSubject.next(\n\t\t\t\t\t\tnew Error(\n\t\t\t\t\t\t\t`Received ${this.maxConsecutiveEmptyResponses} consecutive empty responses`\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthis.consecutiveErrorCount++;\n\t\t\tconst errorInstance =\n\t\t\t\terror instanceof Error ? error : new Error(String(error));\n\n\t\t\tif (this.consecutiveErrorCount >= this.maxConsecutiveErrors) {\n\t\t\t\tthis.errorSubject.next(\n\t\t\t\t\tnew Error(\n\t\t\t\t\t\t`Received ${this.maxConsecutiveErrors} consecutive errors. Latest: ${errorInstance.message}`\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tthis.errorSubject.next(errorInstance);\n\t\t\t}\n\t\t}\n\t}\n}\n"]}
|
|
@@ -2,6 +2,7 @@ import { BN, DriftClient, OrderTriggerCondition, PositionDirection, User } from
|
|
|
2
2
|
import { PublicKey, Transaction, TransactionInstruction, VersionedTransaction } from '@solana/web3.js';
|
|
3
3
|
import { LimitAuctionConfig, LimitOrderParamsOrderConfig } from './openPerpOrder/types';
|
|
4
4
|
import { WithTxnParams } from '../../types';
|
|
5
|
+
import { HighLeverageOptions } from '../../../../common-ui-utils/order';
|
|
5
6
|
/**
|
|
6
7
|
* Parameters for editing an existing order
|
|
7
8
|
*/
|
|
@@ -34,6 +35,8 @@ interface EditOrderParams {
|
|
|
34
35
|
maxTs?: BN;
|
|
35
36
|
/** Order policy configuration */
|
|
36
37
|
policy?: number;
|
|
38
|
+
/** Optional high leverage options */
|
|
39
|
+
highLeverageOptions?: HighLeverageOptions;
|
|
37
40
|
}
|
|
38
41
|
export interface CreateEditOrderIxParams {
|
|
39
42
|
driftClient: DriftClient;
|