@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.
Files changed (81) hide show
  1. package/lib/clients/DlobWebsocketClient.d.ts +82 -0
  2. package/lib/clients/DlobWebsocketClient.js +226 -0
  3. package/lib/clients/DlobWebsocketClient.js.map +1 -0
  4. package/lib/clients/swiftClient.js +1 -0
  5. package/lib/clients/swiftClient.js.map +1 -1
  6. package/lib/common-ui-utils/commonUiUtils.d.ts +22 -3
  7. package/lib/common-ui-utils/commonUiUtils.js +15 -8
  8. package/lib/common-ui-utils/commonUiUtils.js.map +1 -1
  9. package/lib/common-ui-utils/market.d.ts +5 -0
  10. package/lib/common-ui-utils/market.js +19 -11
  11. package/lib/common-ui-utils/market.js.map +1 -1
  12. package/lib/common-ui-utils/order.d.ts +8 -1
  13. package/lib/common-ui-utils/order.js +3 -2
  14. package/lib/common-ui-utils/order.js.map +1 -1
  15. package/lib/common-ui-utils/user.d.ts +5 -0
  16. package/lib/common-ui-utils/user.js +58 -3
  17. package/lib/common-ui-utils/user.js.map +1 -1
  18. package/lib/constants/markets.d.ts +4 -0
  19. package/lib/constants/markets.js +5 -1
  20. package/lib/constants/markets.js.map +1 -1
  21. package/lib/constants/superstake.js.map +1 -1
  22. package/lib/drift/Drift/clients/AuthorityDrift/DriftL2OrderbookManager.d.ts +1 -1
  23. package/lib/drift/Drift/clients/AuthorityDrift/DriftL2OrderbookManager.js.map +1 -1
  24. package/lib/drift/Drift/clients/AuthorityDrift/index.d.ts +1 -1
  25. package/lib/drift/Drift/clients/AuthorityDrift/index.js.map +1 -1
  26. package/lib/drift/Drift/clients/CentralServerDrift/index.d.ts +3 -2
  27. package/lib/drift/Drift/clients/CentralServerDrift/index.js +52 -49
  28. package/lib/drift/Drift/clients/CentralServerDrift/index.js.map +1 -1
  29. package/lib/drift/Drift/data/PollingDlob.d.ts +1 -1
  30. package/lib/drift/Drift/data/PollingDlob.js.map +1 -1
  31. package/lib/drift/base/actions/trade/editOrder.d.ts +3 -0
  32. package/lib/drift/base/actions/trade/editOrder.js.map +1 -1
  33. package/lib/drift/base/actions/trade/index.d.ts +1 -0
  34. package/lib/drift/base/actions/trade/index.js +1 -0
  35. package/lib/drift/base/actions/trade/index.js.map +1 -1
  36. package/lib/drift/base/actions/trade/margin.d.ts +24 -0
  37. package/lib/drift/base/actions/trade/margin.js +48 -0
  38. package/lib/drift/base/actions/trade/margin.js.map +1 -0
  39. package/lib/drift/base/actions/trade/openPerpOrder/auction.d.ts +3 -1
  40. package/lib/drift/base/actions/trade/openPerpOrder/auction.js +2 -2
  41. package/lib/drift/base/actions/trade/openPerpOrder/auction.js.map +1 -1
  42. package/lib/drift/base/actions/trade/openPerpOrder/dlobServer/index.d.ts +2 -6
  43. package/lib/drift/base/actions/trade/openPerpOrder/dlobServer/index.js.map +1 -1
  44. package/lib/drift/base/actions/trade/openPerpOrder/openPerpMarketOrder/index.d.ts +6 -3
  45. package/lib/drift/base/actions/trade/openPerpOrder/openPerpMarketOrder/index.js +6 -6
  46. package/lib/drift/base/actions/trade/openPerpOrder/openPerpMarketOrder/index.js.map +1 -1
  47. package/lib/drift/base/actions/trade/openPerpOrder/openPerpNonMarketOrder/index.d.ts +2 -0
  48. package/lib/drift/base/actions/trade/openPerpOrder/openPerpNonMarketOrder/index.js +3 -2
  49. package/lib/drift/base/actions/trade/openPerpOrder/openPerpNonMarketOrder/index.js.map +1 -1
  50. package/lib/drift/base/actions/trade/openPerpOrder/openSwiftOrder/index.js +2 -1
  51. package/lib/drift/base/actions/trade/openPerpOrder/openSwiftOrder/index.js.map +1 -1
  52. package/lib/drift/base/actions/trade/swap.d.ts +18 -11
  53. package/lib/drift/base/actions/trade/swap.js +40 -17
  54. package/lib/drift/base/actions/trade/swap.js.map +1 -1
  55. package/lib/index.d.ts +1 -0
  56. package/lib/index.js +1 -0
  57. package/lib/index.js.map +1 -1
  58. package/lib/utils/MultiplexWebSocket.d.ts +4 -2
  59. package/lib/utils/MultiplexWebSocket.js +18 -9
  60. package/lib/utils/MultiplexWebSocket.js.map +1 -1
  61. package/lib/utils/ResultSlotIncrementer.d.ts +31 -0
  62. package/lib/utils/ResultSlotIncrementer.js +83 -0
  63. package/lib/utils/ResultSlotIncrementer.js.map +1 -0
  64. package/lib/utils/index.d.ts +3 -1
  65. package/lib/utils/index.js +7 -1
  66. package/lib/utils/index.js.map +1 -1
  67. package/lib/utils/math.js +1 -1
  68. package/lib/utils/math.js.map +1 -1
  69. package/lib/utils/orderbook/constants.d.ts +2 -0
  70. package/lib/utils/orderbook/constants.js +5 -0
  71. package/lib/utils/orderbook/constants.js.map +1 -0
  72. package/lib/utils/orderbook/index.d.ts +38 -59
  73. package/lib/utils/orderbook/index.js +285 -1
  74. package/lib/utils/orderbook/index.js.map +1 -1
  75. package/lib/utils/orderbook/types.d.ts +101 -0
  76. package/lib/utils/orderbook/types.js +9 -0
  77. package/lib/utils/orderbook/types.js.map +1 -0
  78. package/lib/utils/signedMsgs.d.ts +1 -0
  79. package/lib/utils/signedMsgs.js +10 -0
  80. package/lib/utils/signedMsgs.js.map +1 -0
  81. package/package.json +1 -1
@@ -60,18 +60,18 @@ class CentralServerDrift {
60
60
  oracleInfos: oracleInfos.oracleInfos,
61
61
  ...config.additionalDriftClientConfig,
62
62
  };
63
- this.driftClient = new sdk_1.DriftClient(driftClientConfig);
64
- this.markets = new markets_1.CentralServerDriftMarkets(this.driftClient);
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.driftClient.txHandler,
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.driftClient.txSender = txSender;
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.driftClient.subscribe();
87
+ await this._driftClient.subscribe();
85
88
  }
86
89
  async unsubscribe() {
87
- await this.driftClient.unsubscribe();
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.driftClient,
106
+ driftClient: this._driftClient,
104
107
  userAccountPublicKey,
105
108
  accountSubscription: {
106
109
  type: 'custom',
107
- userAccountSubscriber: new sdk_1.OneShotUserAccountSubscriber(this.driftClient.program, userAccountPublicKey, undefined, undefined),
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.driftClient.wallet;
112
- const originalAuthority = this.driftClient.authority;
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.driftClient.authority = authority;
118
- const success = await this.driftClient.addUser(user.getUserAccount().subAccountId, authority);
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.driftClient.wallet = userWallet;
133
+ this._driftClient.wallet = userWallet;
131
134
  //@ts-ignore
132
- this.driftClient.provider.wallet = userWallet;
133
- this.driftClient.txHandler.updateWallet(userWallet);
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.driftClient.wallet = originalWallet;
141
- this.driftClient.txHandler.updateWallet(originalWallet);
142
- this.driftClient.authority = originalAuthority;
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.driftClient.users.clear();
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.driftClient.program, userAccountPublicKey, undefined, undefined);
164
+ const oneShotUserAccountSubscriber = new sdk_1.OneShotUserAccountSubscriber(this._driftClient.program, userAccountPublicKey, undefined, undefined);
162
165
  const user = new sdk_1.User({
163
- driftClient: this.driftClient,
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.driftClient.connection, this.driftClient.program, authority);
179
- const originalWallet = this.driftClient.wallet;
180
- const originalAuthority = this.driftClient.authority;
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.driftClient.wallet = authorityWallet;
190
+ this._driftClient.wallet = authorityWallet;
188
191
  // @ts-ignore
189
- this.driftClient.provider.wallet = authorityWallet;
190
- this.driftClient.txHandler.updateWallet(authorityWallet);
191
- this.driftClient.authority = authority;
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.driftClient,
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.driftClient.wallet = originalWallet;
208
- this.driftClient.txHandler.updateWallet(originalWallet);
210
+ this._driftClient.wallet = originalWallet;
211
+ this._driftClient.txHandler.updateWallet(originalWallet);
209
212
  // @ts-ignore
210
- this.driftClient.provider.wallet = originalWallet;
211
- this.driftClient.authority = originalAuthority;
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.driftClient,
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.driftClient,
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.driftClient,
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.driftClient,
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.driftClient,
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.driftClient,
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.driftClient,
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.driftClient,
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.driftClient,
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.driftClient,
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.driftClient,
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.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);
370
- const cancelAllOrdersTxn = await this.driftClient.buildTransaction(ix);
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.driftClient.connection,
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.driftClient,
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.driftClient.sendTransaction(tx, undefined, undefined, true);
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;