@drift-labs/common 1.0.0

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 (400) hide show
  1. package/lib/Config.d.ts +26 -0
  2. package/lib/Config.js +29 -0
  3. package/lib/Config.js.map +1 -0
  4. package/lib/EnvironmentConstants.d.ts +40 -0
  5. package/lib/EnvironmentConstants.js +64 -0
  6. package/lib/EnvironmentConstants.js.map +1 -0
  7. package/lib/actions/actionHelpers/accountDeletionHelpers.d.ts +16 -0
  8. package/lib/actions/actionHelpers/accountDeletionHelpers.js +151 -0
  9. package/lib/actions/actionHelpers/accountDeletionHelpers.js.map +1 -0
  10. package/lib/actions/actionHelpers/actionHelpers.d.ts +13 -0
  11. package/lib/actions/actionHelpers/actionHelpers.js +8 -0
  12. package/lib/actions/actionHelpers/actionHelpers.js.map +1 -0
  13. package/lib/chartConstants.d.ts +2 -0
  14. package/lib/chartConstants.js +14 -0
  15. package/lib/chartConstants.js.map +1 -0
  16. package/lib/clients/candleClient.d.ts +74 -0
  17. package/lib/clients/candleClient.js +364 -0
  18. package/lib/clients/candleClient.js.map +1 -0
  19. package/lib/clients/dataApiWsClient.d.ts +33 -0
  20. package/lib/clients/dataApiWsClient.js +118 -0
  21. package/lib/clients/dataApiWsClient.js.map +1 -0
  22. package/lib/clients/index.d.ts +1 -0
  23. package/lib/clients/index.js +19 -0
  24. package/lib/clients/index.js.map +1 -0
  25. package/lib/clients/marketDataFeed.d.ts +42 -0
  26. package/lib/clients/marketDataFeed.js +422 -0
  27. package/lib/clients/marketDataFeed.js.map +1 -0
  28. package/lib/clients/redisClient.d.ts +89 -0
  29. package/lib/clients/redisClient.js +647 -0
  30. package/lib/clients/redisClient.js.map +1 -0
  31. package/lib/clients/swiftClient.d.ts +57 -0
  32. package/lib/clients/swiftClient.js +289 -0
  33. package/lib/clients/swiftClient.js.map +1 -0
  34. package/lib/clients/tvFeed.d.ts +63 -0
  35. package/lib/clients/tvFeed.js +351 -0
  36. package/lib/clients/tvFeed.js.map +1 -0
  37. package/lib/common-ui-utils/commonUiUtils.d.ts +211 -0
  38. package/lib/common-ui-utils/commonUiUtils.js +624 -0
  39. package/lib/common-ui-utils/commonUiUtils.js.map +1 -0
  40. package/lib/common-ui-utils/index.d.ts +6 -0
  41. package/lib/common-ui-utils/index.js +23 -0
  42. package/lib/common-ui-utils/index.js.map +1 -0
  43. package/lib/common-ui-utils/market.d.ts +27 -0
  44. package/lib/common-ui-utils/market.js +80 -0
  45. package/lib/common-ui-utils/market.js.map +1 -0
  46. package/lib/common-ui-utils/order.d.ts +11 -0
  47. package/lib/common-ui-utils/order.js +161 -0
  48. package/lib/common-ui-utils/order.js.map +1 -0
  49. package/lib/common-ui-utils/settings/settings.d.ts +51 -0
  50. package/lib/common-ui-utils/settings/settings.js +84 -0
  51. package/lib/common-ui-utils/settings/settings.js.map +1 -0
  52. package/lib/common-ui-utils/trading.d.ts +56 -0
  53. package/lib/common-ui-utils/trading.js +200 -0
  54. package/lib/common-ui-utils/trading.js.map +1 -0
  55. package/lib/common-ui-utils/user.d.ts +13 -0
  56. package/lib/common-ui-utils/user.js +124 -0
  57. package/lib/common-ui-utils/user.js.map +1 -0
  58. package/lib/constants/autogenerated/driftErrors.json +1787 -0
  59. package/lib/constants/autogenerated/jup-v4-error-codes.json +67 -0
  60. package/lib/constants/autogenerated/jup-v6-error-codes.json +115 -0
  61. package/lib/constants/dev.d.ts +15 -0
  62. package/lib/constants/dev.js +19 -0
  63. package/lib/constants/dev.js.map +1 -0
  64. package/lib/constants/geoblockList.d.ts +4 -0
  65. package/lib/constants/geoblockList.js +32 -0
  66. package/lib/constants/geoblockList.js.map +1 -0
  67. package/lib/constants/index.d.ts +9 -0
  68. package/lib/constants/index.js +26 -0
  69. package/lib/constants/index.js.map +1 -0
  70. package/lib/constants/markets.d.ts +1 -0
  71. package/lib/constants/markets.js +5 -0
  72. package/lib/constants/markets.js.map +1 -0
  73. package/lib/constants/misc.d.ts +23 -0
  74. package/lib/constants/misc.js +27 -0
  75. package/lib/constants/misc.js.map +1 -0
  76. package/lib/constants/orders.d.ts +12 -0
  77. package/lib/constants/orders.js +79 -0
  78. package/lib/constants/orders.js.map +1 -0
  79. package/lib/constants/pools.d.ts +5 -0
  80. package/lib/constants/pools.js +9 -0
  81. package/lib/constants/pools.js.map +1 -0
  82. package/lib/constants/predictionMarket.d.ts +3 -0
  83. package/lib/constants/predictionMarket.js +7 -0
  84. package/lib/constants/predictionMarket.js.map +1 -0
  85. package/lib/constants/superstake.d.ts +22 -0
  86. package/lib/constants/superstake.js +45 -0
  87. package/lib/constants/superstake.js.map +1 -0
  88. package/lib/constants/trade.d.ts +2 -0
  89. package/lib/constants/trade.js +9 -0
  90. package/lib/constants/trade.js.map +1 -0
  91. package/lib/drift/Drift/clients/AuthorityDrift/DriftL2OrderbookManager.d.ts +68 -0
  92. package/lib/drift/Drift/clients/AuthorityDrift/DriftL2OrderbookManager.js +146 -0
  93. package/lib/drift/Drift/clients/AuthorityDrift/DriftL2OrderbookManager.js.map +1 -0
  94. package/lib/drift/Drift/clients/AuthorityDrift/DriftOperations/index.d.ts +204 -0
  95. package/lib/drift/Drift/clients/AuthorityDrift/DriftOperations/index.js +530 -0
  96. package/lib/drift/Drift/clients/AuthorityDrift/DriftOperations/index.js.map +1 -0
  97. package/lib/drift/Drift/clients/AuthorityDrift/DriftOperations/types.d.ts +90 -0
  98. package/lib/drift/Drift/clients/AuthorityDrift/DriftOperations/types.js +3 -0
  99. package/lib/drift/Drift/clients/AuthorityDrift/DriftOperations/types.js.map +1 -0
  100. package/lib/drift/Drift/clients/AuthorityDrift/SubscriptionManager.d.ts +139 -0
  101. package/lib/drift/Drift/clients/AuthorityDrift/SubscriptionManager.js +287 -0
  102. package/lib/drift/Drift/clients/AuthorityDrift/SubscriptionManager.js.map +1 -0
  103. package/lib/drift/Drift/clients/AuthorityDrift/index.d.ts +242 -0
  104. package/lib/drift/Drift/clients/AuthorityDrift/index.js +503 -0
  105. package/lib/drift/Drift/clients/AuthorityDrift/index.js.map +1 -0
  106. package/lib/drift/Drift/clients/CentralServerDrift.d.ts +91 -0
  107. package/lib/drift/Drift/clients/CentralServerDrift.js +326 -0
  108. package/lib/drift/Drift/clients/CentralServerDrift.js.map +1 -0
  109. package/lib/drift/Drift/clients/index.d.ts +3 -0
  110. package/lib/drift/Drift/clients/index.js +20 -0
  111. package/lib/drift/Drift/clients/index.js.map +1 -0
  112. package/lib/drift/Drift/constants/blockchain.d.ts +24 -0
  113. package/lib/drift/Drift/constants/blockchain.js +32 -0
  114. package/lib/drift/Drift/constants/blockchain.js.map +1 -0
  115. package/lib/drift/Drift/constants/errors.d.ts +6 -0
  116. package/lib/drift/Drift/constants/errors.js +14 -0
  117. package/lib/drift/Drift/constants/errors.js.map +1 -0
  118. package/lib/drift/Drift/constants/index.d.ts +3 -0
  119. package/lib/drift/Drift/constants/index.js +20 -0
  120. package/lib/drift/Drift/constants/index.js.map +1 -0
  121. package/lib/drift/Drift/constants/orderbook.d.ts +7 -0
  122. package/lib/drift/Drift/constants/orderbook.js +10 -0
  123. package/lib/drift/Drift/constants/orderbook.js.map +1 -0
  124. package/lib/drift/Drift/data/PollingDlob.d.ts +154 -0
  125. package/lib/drift/Drift/data/PollingDlob.js +387 -0
  126. package/lib/drift/Drift/data/PollingDlob.js.map +1 -0
  127. package/lib/drift/Drift/data/index.d.ts +1 -0
  128. package/lib/drift/Drift/data/index.js +18 -0
  129. package/lib/drift/Drift/data/index.js.map +1 -0
  130. package/lib/drift/Drift/index.d.ts +4 -0
  131. package/lib/drift/Drift/index.js +21 -0
  132. package/lib/drift/Drift/index.js.map +1 -0
  133. package/lib/drift/Drift/stores/MarkPriceCache.d.ts +27 -0
  134. package/lib/drift/Drift/stores/MarkPriceCache.js +59 -0
  135. package/lib/drift/Drift/stores/MarkPriceCache.js.map +1 -0
  136. package/lib/drift/Drift/stores/OraclePriceCache.d.ts +21 -0
  137. package/lib/drift/Drift/stores/OraclePriceCache.js +57 -0
  138. package/lib/drift/Drift/stores/OraclePriceCache.js.map +1 -0
  139. package/lib/drift/Drift/stores/UserAccountCache.d.ts +49 -0
  140. package/lib/drift/Drift/stores/UserAccountCache.js +107 -0
  141. package/lib/drift/Drift/stores/UserAccountCache.js.map +1 -0
  142. package/lib/drift/Drift/stores/index.d.ts +3 -0
  143. package/lib/drift/Drift/stores/index.js +20 -0
  144. package/lib/drift/Drift/stores/index.js.map +1 -0
  145. package/lib/drift/base/actions/index.d.ts +4 -0
  146. package/lib/drift/base/actions/index.js +21 -0
  147. package/lib/drift/base/actions/index.js.map +1 -0
  148. package/lib/drift/base/actions/perp/index.d.ts +2 -0
  149. package/lib/drift/base/actions/perp/index.js +19 -0
  150. package/lib/drift/base/actions/perp/index.js.map +1 -0
  151. package/lib/drift/base/actions/perp/settleFunding.d.ts +25 -0
  152. package/lib/drift/base/actions/perp/settleFunding.js +41 -0
  153. package/lib/drift/base/actions/perp/settleFunding.js.map +1 -0
  154. package/lib/drift/base/actions/perp/settlePnl.d.ts +35 -0
  155. package/lib/drift/base/actions/perp/settlePnl.js +44 -0
  156. package/lib/drift/base/actions/perp/settlePnl.js.map +1 -0
  157. package/lib/drift/base/actions/spot/borrow.d.ts +1 -0
  158. package/lib/drift/base/actions/spot/borrow.js +8 -0
  159. package/lib/drift/base/actions/spot/borrow.js.map +1 -0
  160. package/lib/drift/base/actions/spot/deposit.d.ts +40 -0
  161. package/lib/drift/base/actions/spot/deposit.js +82 -0
  162. package/lib/drift/base/actions/spot/deposit.js.map +1 -0
  163. package/lib/drift/base/actions/spot/index.d.ts +3 -0
  164. package/lib/drift/base/actions/spot/index.js +20 -0
  165. package/lib/drift/base/actions/spot/index.js.map +1 -0
  166. package/lib/drift/base/actions/spot/withdraw.d.ts +16 -0
  167. package/lib/drift/base/actions/spot/withdraw.js +39 -0
  168. package/lib/drift/base/actions/spot/withdraw.js.map +1 -0
  169. package/lib/drift/base/actions/trade/cancelOrder.d.ts +47 -0
  170. package/lib/drift/base/actions/trade/cancelOrder.js +55 -0
  171. package/lib/drift/base/actions/trade/cancelOrder.js.map +1 -0
  172. package/lib/drift/base/actions/trade/editOrder.d.ts +55 -0
  173. package/lib/drift/base/actions/trade/editOrder.js +35 -0
  174. package/lib/drift/base/actions/trade/editOrder.js.map +1 -0
  175. package/lib/drift/base/actions/trade/index.d.ts +4 -0
  176. package/lib/drift/base/actions/trade/index.js +21 -0
  177. package/lib/drift/base/actions/trade/index.js.map +1 -0
  178. package/lib/drift/base/actions/trade/openPerpOrder/index.d.ts +3 -0
  179. package/lib/drift/base/actions/trade/openPerpOrder/index.js +20 -0
  180. package/lib/drift/base/actions/trade/openPerpOrder/index.js.map +1 -0
  181. package/lib/drift/base/actions/trade/openPerpOrder/openPerpMarketOrder/index.d.ts +84 -0
  182. package/lib/drift/base/actions/trade/openPerpOrder/openPerpMarketOrder/index.js +293 -0
  183. package/lib/drift/base/actions/trade/openPerpOrder/openPerpMarketOrder/index.js.map +1 -0
  184. package/lib/drift/base/actions/trade/openPerpOrder/openPerpNonMarketOrder/index.d.ts +19 -0
  185. package/lib/drift/base/actions/trade/openPerpOrder/openPerpNonMarketOrder/index.js +161 -0
  186. package/lib/drift/base/actions/trade/openPerpOrder/openPerpNonMarketOrder/index.js.map +1 -0
  187. package/lib/drift/base/actions/trade/openPerpOrder/openSwiftOrder/index.d.ts +166 -0
  188. package/lib/drift/base/actions/trade/openPerpOrder/openSwiftOrder/index.js +156 -0
  189. package/lib/drift/base/actions/trade/openPerpOrder/openSwiftOrder/index.js.map +1 -0
  190. package/lib/drift/base/actions/trade/swap.d.ts +62 -0
  191. package/lib/drift/base/actions/trade/swap.js +60 -0
  192. package/lib/drift/base/actions/trade/swap.js.map +1 -0
  193. package/lib/drift/base/actions/user/create.d.ts +75 -0
  194. package/lib/drift/base/actions/user/create.js +104 -0
  195. package/lib/drift/base/actions/user/create.js.map +1 -0
  196. package/lib/drift/base/actions/user/delete.d.ts +47 -0
  197. package/lib/drift/base/actions/user/delete.js +39 -0
  198. package/lib/drift/base/actions/user/delete.js.map +1 -0
  199. package/lib/drift/base/actions/user/index.d.ts +1 -0
  200. package/lib/drift/base/actions/user/index.js +18 -0
  201. package/lib/drift/base/actions/user/index.js.map +1 -0
  202. package/lib/drift/base/constants/accountNames.d.ts +1 -0
  203. package/lib/drift/base/constants/accountNames.js +13 -0
  204. package/lib/drift/base/constants/accountNames.js.map +1 -0
  205. package/lib/drift/base/details/index.d.ts +2 -0
  206. package/lib/drift/base/details/index.js +19 -0
  207. package/lib/drift/base/details/index.js.map +1 -0
  208. package/lib/drift/base/details/market/funding.d.ts +9 -0
  209. package/lib/drift/base/details/market/funding.js +50 -0
  210. package/lib/drift/base/details/market/funding.js.map +1 -0
  211. package/lib/drift/base/details/market/index.d.ts +2 -0
  212. package/lib/drift/base/details/market/index.js +19 -0
  213. package/lib/drift/base/details/market/index.js.map +1 -0
  214. package/lib/drift/base/details/market/openInterest.d.ts +5 -0
  215. package/lib/drift/base/details/market/openInterest.js +12 -0
  216. package/lib/drift/base/details/market/openInterest.js.map +1 -0
  217. package/lib/drift/base/details/user/balances.d.ts +40 -0
  218. package/lib/drift/base/details/user/balances.js +39 -0
  219. package/lib/drift/base/details/user/balances.js.map +1 -0
  220. package/lib/drift/base/details/user/index.d.ts +4 -0
  221. package/lib/drift/base/details/user/index.js +21 -0
  222. package/lib/drift/base/details/user/index.js.map +1 -0
  223. package/lib/drift/base/details/user/marginInfo.d.ts +29 -0
  224. package/lib/drift/base/details/user/marginInfo.js +49 -0
  225. package/lib/drift/base/details/user/marginInfo.js.map +1 -0
  226. package/lib/drift/base/details/user/orders.d.ts +3 -0
  227. package/lib/drift/base/details/user/orders.js +11 -0
  228. package/lib/drift/base/details/user/orders.js.map +1 -0
  229. package/lib/drift/base/details/user/positions.d.ts +70 -0
  230. package/lib/drift/base/details/user/positions.js +146 -0
  231. package/lib/drift/base/details/user/positions.js.map +1 -0
  232. package/lib/drift/cli.d.ts +25 -0
  233. package/lib/drift/cli.js +900 -0
  234. package/lib/drift/cli.js.map +1 -0
  235. package/lib/drift/constants/apiUrls.d.ts +27 -0
  236. package/lib/drift/constants/apiUrls.js +31 -0
  237. package/lib/drift/constants/apiUrls.js.map +1 -0
  238. package/lib/drift/example.d.ts +19 -0
  239. package/lib/drift/example.js +249 -0
  240. package/lib/drift/example.js.map +1 -0
  241. package/lib/drift/index.d.ts +3 -0
  242. package/lib/drift/index.js +20 -0
  243. package/lib/drift/index.js.map +1 -0
  244. package/lib/drift/utils/auctionParamsResponseMapper.d.ts +45 -0
  245. package/lib/drift/utils/auctionParamsResponseMapper.js +148 -0
  246. package/lib/drift/utils/auctionParamsResponseMapper.js.map +1 -0
  247. package/lib/drift/utils/funding.d.ts +2 -0
  248. package/lib/drift/utils/funding.js +9 -0
  249. package/lib/drift/utils/funding.js.map +1 -0
  250. package/lib/drift/utils/index.d.ts +3 -0
  251. package/lib/drift/utils/index.js +23 -0
  252. package/lib/drift/utils/index.js.map +1 -0
  253. package/lib/drift/utils/orderParams.d.ts +48 -0
  254. package/lib/drift/utils/orderParams.js +140 -0
  255. package/lib/drift/utils/orderParams.js.map +1 -0
  256. package/lib/index.d.ts +45 -0
  257. package/lib/index.js +68 -0
  258. package/lib/index.js.map +1 -0
  259. package/lib/serializableTypes.d.ts +961 -0
  260. package/lib/serializableTypes.js +3887 -0
  261. package/lib/serializableTypes.js.map +1 -0
  262. package/lib/types/MarketId.d.ts +26 -0
  263. package/lib/types/MarketId.js +64 -0
  264. package/lib/types/MarketId.js.map +1 -0
  265. package/lib/types/Superstake.d.ts +7 -0
  266. package/lib/types/Superstake.js +3 -0
  267. package/lib/types/Superstake.js.map +1 -0
  268. package/lib/types/UIEnv.d.ts +26 -0
  269. package/lib/types/UIEnv.js +49 -0
  270. package/lib/types/UIEnv.js.map +1 -0
  271. package/lib/types/UIMarket.d.ts +94 -0
  272. package/lib/types/UIMarket.js +224 -0
  273. package/lib/types/UIMarket.js.map +1 -0
  274. package/lib/types/candles.d.ts +4 -0
  275. package/lib/types/candles.js +9 -0
  276. package/lib/types/candles.js.map +1 -0
  277. package/lib/types/dataServer.d.ts +53 -0
  278. package/lib/types/dataServer.js +3 -0
  279. package/lib/types/dataServer.js.map +1 -0
  280. package/lib/types/historyServer.d.ts +38 -0
  281. package/lib/types/historyServer.js +11 -0
  282. package/lib/types/historyServer.js.map +1 -0
  283. package/lib/types/index.d.ts +12 -0
  284. package/lib/types/index.js +29 -0
  285. package/lib/types/index.js.map +1 -0
  286. package/lib/types/leaderboard.d.ts +80 -0
  287. package/lib/types/leaderboard.js +11 -0
  288. package/lib/types/leaderboard.js.map +1 -0
  289. package/lib/types/remote-configs.d.ts +61 -0
  290. package/lib/types/remote-configs.js +3 -0
  291. package/lib/types/remote-configs.js.map +1 -0
  292. package/lib/types/trade.d.ts +18 -0
  293. package/lib/types/trade.js +3 -0
  294. package/lib/types/trade.js.map +1 -0
  295. package/lib/types/user.d.ts +40 -0
  296. package/lib/types/user.js +3 -0
  297. package/lib/types/user.js.map +1 -0
  298. package/lib/types/utility.d.ts +15 -0
  299. package/lib/types/utility.js +3 -0
  300. package/lib/types/utility.js.map +1 -0
  301. package/lib/utils/CircularBuffers/CircularBuffer.d.ts +22 -0
  302. package/lib/utils/CircularBuffers/CircularBuffer.js +73 -0
  303. package/lib/utils/CircularBuffers/CircularBuffer.js.map +1 -0
  304. package/lib/utils/CircularBuffers/UniqueCircularBuffer.d.ts +19 -0
  305. package/lib/utils/CircularBuffers/UniqueCircularBuffer.js +78 -0
  306. package/lib/utils/CircularBuffers/UniqueCircularBuffer.js.map +1 -0
  307. package/lib/utils/CircularBuffers/index.d.ts +2 -0
  308. package/lib/utils/CircularBuffers/index.js +19 -0
  309. package/lib/utils/CircularBuffers/index.js.map +1 -0
  310. package/lib/utils/MultiplexWebSocket.d.ts +95 -0
  311. package/lib/utils/MultiplexWebSocket.js +416 -0
  312. package/lib/utils/MultiplexWebSocket.js.map +1 -0
  313. package/lib/utils/NumLib.d.ts +106 -0
  314. package/lib/utils/NumLib.js +300 -0
  315. package/lib/utils/NumLib.js.map +1 -0
  316. package/lib/utils/SharedInterval.d.ts +21 -0
  317. package/lib/utils/SharedInterval.js +47 -0
  318. package/lib/utils/SharedInterval.js.map +1 -0
  319. package/lib/utils/SlotBasedResultValidator.d.ts +9 -0
  320. package/lib/utils/SlotBasedResultValidator.js +27 -0
  321. package/lib/utils/SlotBasedResultValidator.js.map +1 -0
  322. package/lib/utils/Stopwatch.d.ts +15 -0
  323. package/lib/utils/Stopwatch.js +31 -0
  324. package/lib/utils/Stopwatch.js.map +1 -0
  325. package/lib/utils/StrictEventEmitter.d.ts +15 -0
  326. package/lib/utils/StrictEventEmitter.js +55 -0
  327. package/lib/utils/StrictEventEmitter.js.map +1 -0
  328. package/lib/utils/WalletConnectionState.d.ts +31 -0
  329. package/lib/utils/WalletConnectionState.js +83 -0
  330. package/lib/utils/WalletConnectionState.js.map +1 -0
  331. package/lib/utils/assert.d.ts +1 -0
  332. package/lib/utils/assert.js +10 -0
  333. package/lib/utils/assert.js.map +1 -0
  334. package/lib/utils/candles/Candle.d.ts +94 -0
  335. package/lib/utils/candles/Candle.js +580 -0
  336. package/lib/utils/candles/Candle.js.map +1 -0
  337. package/lib/utils/candles/types.d.ts +8 -0
  338. package/lib/utils/candles/types.js +3 -0
  339. package/lib/utils/candles/types.js.map +1 -0
  340. package/lib/utils/dlob-server/DlobServerWebsocketUtils.d.ts +57 -0
  341. package/lib/utils/dlob-server/DlobServerWebsocketUtils.js +137 -0
  342. package/lib/utils/dlob-server/DlobServerWebsocketUtils.js.map +1 -0
  343. package/lib/utils/driftEvents.d.ts +10 -0
  344. package/lib/utils/driftEvents.js +123 -0
  345. package/lib/utils/driftEvents.js.map +1 -0
  346. package/lib/utils/equalityChecks.d.ts +12 -0
  347. package/lib/utils/equalityChecks.js +71 -0
  348. package/lib/utils/equalityChecks.js.map +1 -0
  349. package/lib/utils/featureFlags.d.ts +3 -0
  350. package/lib/utils/featureFlags.js +7 -0
  351. package/lib/utils/featureFlags.js.map +1 -0
  352. package/lib/utils/geoblock/index.d.ts +4 -0
  353. package/lib/utils/geoblock/index.js +20 -0
  354. package/lib/utils/geoblock/index.js.map +1 -0
  355. package/lib/utils/index.d.ts +181 -0
  356. package/lib/utils/index.js +608 -0
  357. package/lib/utils/index.js.map +1 -0
  358. package/lib/utils/insuranceFund.d.ts +15 -0
  359. package/lib/utils/insuranceFund.js +84 -0
  360. package/lib/utils/insuranceFund.js.map +1 -0
  361. package/lib/utils/logger.d.ts +5 -0
  362. package/lib/utils/logger.js +53 -0
  363. package/lib/utils/logger.js.map +1 -0
  364. package/lib/utils/math.d.ts +10 -0
  365. package/lib/utils/math.js +89 -0
  366. package/lib/utils/math.js.map +1 -0
  367. package/lib/utils/orderbook/index.d.ts +65 -0
  368. package/lib/utils/orderbook/index.js +80 -0
  369. package/lib/utils/orderbook/index.js.map +1 -0
  370. package/lib/utils/pollingSequenceGuard.d.ts +9 -0
  371. package/lib/utils/pollingSequenceGuard.js +24 -0
  372. package/lib/utils/pollingSequenceGuard.js.map +1 -0
  373. package/lib/utils/priority-fees/PriorityFeeCalculator.d.ts +24 -0
  374. package/lib/utils/priority-fees/PriorityFeeCalculator.js +53 -0
  375. package/lib/utils/priority-fees/PriorityFeeCalculator.js.map +1 -0
  376. package/lib/utils/priority-fees/PriorityFeeStrategies.d.ts +5 -0
  377. package/lib/utils/priority-fees/PriorityFeeStrategies.js +43 -0
  378. package/lib/utils/priority-fees/PriorityFeeStrategies.js.map +1 -0
  379. package/lib/utils/priority-fees/index.d.ts +2 -0
  380. package/lib/utils/priority-fees/index.js +19 -0
  381. package/lib/utils/priority-fees/index.js.map +1 -0
  382. package/lib/utils/priorityFees.d.ts +14 -0
  383. package/lib/utils/priorityFees.js +68 -0
  384. package/lib/utils/priorityFees.js.map +1 -0
  385. package/lib/utils/rpcLatency.d.ts +7 -0
  386. package/lib/utils/rpcLatency.js +49 -0
  387. package/lib/utils/rpcLatency.js.map +1 -0
  388. package/lib/utils/rxjs.d.ts +11 -0
  389. package/lib/utils/rxjs.js +24 -0
  390. package/lib/utils/rxjs.js.map +1 -0
  391. package/lib/utils/s3Buckets.d.ts +43 -0
  392. package/lib/utils/s3Buckets.js +108 -0
  393. package/lib/utils/s3Buckets.js.map +1 -0
  394. package/lib/utils/superstake.d.ts +86 -0
  395. package/lib/utils/superstake.js +224 -0
  396. package/lib/utils/superstake.js.map +1 -0
  397. package/lib/utils/token.d.ts +16 -0
  398. package/lib/utils/token.js +44 -0
  399. package/lib/utils/token.js.map +1 -0
  400. package/package.json +87 -0
@@ -0,0 +1,503 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.AuthorityDrift = void 0;
13
+ const sdk_1 = require("@drift-labs/sdk");
14
+ const web3_js_1 = require("@solana/web3.js");
15
+ const commonUiUtils_1 = require("../../../../common-ui-utils/commonUiUtils");
16
+ const constants_1 = require("../../constants");
17
+ const types_1 = require("../../../../types");
18
+ const market_1 = require("../../../../common-ui-utils/market");
19
+ const PollingDlob_1 = require("../../data/PollingDlob");
20
+ const EnvironmentConstants_1 = require("../../../../EnvironmentConstants");
21
+ const MarkPriceCache_1 = require("../../stores/MarkPriceCache");
22
+ const OraclePriceCache_1 = require("../../stores/OraclePriceCache");
23
+ const DriftL2OrderbookManager_1 = require("./DriftL2OrderbookManager");
24
+ const UserAccountCache_1 = require("../../stores/UserAccountCache");
25
+ const utils_1 = require("../../../../utils");
26
+ const geoblock_1 = require("../../../../utils/geoblock");
27
+ const sdk_2 = require("@drift-labs/sdk");
28
+ const SubscriptionManager_1 = require("./SubscriptionManager");
29
+ const DriftOperations_1 = require("./DriftOperations");
30
+ const Config_1 = require("../../../../Config");
31
+ const errors_1 = require("../../constants/errors");
32
+ const orderbook_1 = require("../../constants/orderbook");
33
+ /**
34
+ * Decorator that prevents method execution if the user is geographically blocked.
35
+ * Throws a GeoBlockError if the user is blocked.
36
+ *
37
+ * @param target - The class prototype
38
+ * @param propertyName - The method name
39
+ * @param descriptor - The method descriptor
40
+ */
41
+ function enforceGeoBlock(_target, propertyName, descriptor) {
42
+ const originalMethod = descriptor.value;
43
+ descriptor.value = function (...args) {
44
+ if (this._isGeoBlocked) {
45
+ throw new errors_1.GeoBlockError(propertyName);
46
+ }
47
+ return originalMethod.apply(this, args);
48
+ };
49
+ return descriptor;
50
+ }
51
+ /**
52
+ * A Drift client that is used to subscribe to all accounts for a given authority.
53
+ *
54
+ * This is useful for applications that want to subscribe to all user accounts for a given authority,
55
+ * such as a UI to trade on Drift or a wallet application that allows trading on Drift.
56
+ */
57
+ class AuthorityDrift {
58
+ /**
59
+ * @param solanaRpcEndpoint - The Solana RPC endpoint to use for reading RPC data.
60
+ * @param driftEnv - The drift environment to use for the drift client.
61
+ * @param authority - The authority (wallet) whose user accounts to subscribe to.
62
+ * @param tradableMarkets - The markets that are tradable through this client.
63
+ * @param selectedTradeMarket - The active trade market to use for the drift client. This is used to subscribe to the market account, oracle data and mark price more frequently compared to the other markets.
64
+ * @param additionalDriftClientConfig - Additional DriftClient config to use for the DriftClient.
65
+ */
66
+ constructor(config) {
67
+ var _a, _b, _c, _d, _e, _f;
68
+ /**
69
+ * Subscription to the polling DLOB data.
70
+ */
71
+ this.pollingDlobSubscription = null;
72
+ /**
73
+ * Subscription to the orderbook data.
74
+ */
75
+ this.orderbookSubscription = null;
76
+ /**
77
+ * Stores whether the user is geographically blocked from using the service.
78
+ * This is checked during subscription and cached for decorator use.
79
+ */
80
+ this._isGeoBlocked = false;
81
+ /**
82
+ * The selected trade market to use for the drift client. This is used to subscribe to the market account,
83
+ * oracle data and mark price more frequently compared to the other markets.
84
+ *
85
+ * Example usage:
86
+ * - When the UI wants to display the orderbook of this market.
87
+ * - When the user is interacting with the trade form to trade on this market.
88
+ */
89
+ this.selectedTradeMarket = null;
90
+ /**
91
+ * The markets that are tradable through this client. This affects oracle price, mark price and market account subscriptions.
92
+ */
93
+ this._tradableMarkets = [];
94
+ this._spotMarketConfigs = [];
95
+ this._perpMarketConfigs = [];
96
+ // set up tradable markets
97
+ this.selectedTradeMarket = (_a = config.selectedTradeMarket) !== null && _a !== void 0 ? _a : null;
98
+ const perpTradableMarkets = sdk_1.PerpMarkets[config.driftEnv].map((marketConfig) => types_1.MarketId.createPerpMarket(marketConfig.marketIndex));
99
+ const spotTradableMarkets = sdk_1.SpotMarkets[config.driftEnv].map((marketConfig) => types_1.MarketId.createSpotMarket(marketConfig.marketIndex));
100
+ this._tradableMarkets = (_b = config.tradableMarkets) !== null && _b !== void 0 ? _b : [
101
+ ...perpTradableMarkets,
102
+ ...spotTradableMarkets,
103
+ ];
104
+ this._spotMarketConfigs = spotTradableMarkets.map((market) => market_1.MARKET_UTILS.getMarketConfig(config.driftEnv, sdk_1.MarketType.SPOT, market.marketIndex));
105
+ this._perpMarketConfigs = perpTradableMarkets.map((market) => market_1.MARKET_UTILS.getMarketConfig(config.driftEnv, sdk_1.MarketType.PERP, market.marketIndex));
106
+ // set up Drift endpoints
107
+ const driftDlobServerHttpUrlToUse = (_c = config.driftDlobServerHttpUrl) !== null && _c !== void 0 ? _c : EnvironmentConstants_1.EnvironmentConstants.dlobServerHttpUrl[config.driftEnv === 'devnet' ? 'dev' : 'mainnet'];
108
+ const swiftServerUrlToUse = EnvironmentConstants_1.EnvironmentConstants.swiftServerUrl[config.driftEnv === 'devnet' ? 'staging' : 'mainnet'];
109
+ const orderbookWebsocketUrlToUse = (_e = (_d = config.orderbookConfig) === null || _d === void 0 ? void 0 : _d.dlobWebSocketUrl) !== null && _e !== void 0 ? _e : EnvironmentConstants_1.EnvironmentConstants.dlobServerWsUrl[config.driftEnv === 'devnet' ? 'dev' : 'mainnet'];
110
+ this._driftEndpoints = {
111
+ dlobServerHttpUrl: driftDlobServerHttpUrlToUse,
112
+ swiftServerUrl: swiftServerUrlToUse,
113
+ orderbookWebsocketUrl: orderbookWebsocketUrlToUse,
114
+ };
115
+ // we set this up because SerializableTypes
116
+ (0, Config_1.Initialize)(config.driftEnv);
117
+ // set up clients and stores
118
+ const driftClient = this.setupDriftClient(config);
119
+ this.initializePollingDlob(driftDlobServerHttpUrlToUse);
120
+ this.initializeStores(driftClient);
121
+ this.initializeOrderbookManager(orderbookWebsocketUrlToUse, (_f = config.orderbookConfig) === null || _f === void 0 ? void 0 : _f.orderbookGrouping);
122
+ this.initializePriorityFeeSubscriber(config.priorityFeeSubscriberConfig);
123
+ this.initializeManagers(driftDlobServerHttpUrlToUse, swiftServerUrlToUse);
124
+ }
125
+ get driftClient() {
126
+ return this._driftClient;
127
+ }
128
+ get authority() {
129
+ return this._driftClient.wallet.publicKey;
130
+ }
131
+ get pollingDlob() {
132
+ return this._pollingDlob;
133
+ }
134
+ get oraclePriceCache() {
135
+ return this._oraclePriceCache.store;
136
+ }
137
+ get markPriceCache() {
138
+ return this._markPriceCache.store;
139
+ }
140
+ get userAccountCache() {
141
+ return this._userAccountCache.store;
142
+ }
143
+ get orderbookCache() {
144
+ return this._orderbookManager.store;
145
+ }
146
+ get orderbookManager() {
147
+ return this._orderbookManager;
148
+ }
149
+ get tradableMarkets() {
150
+ return this._tradableMarkets;
151
+ }
152
+ /**
153
+ * Gets the current geoblock status of the user.
154
+ *
155
+ * @returns True if the user is geographically blocked, false otherwise
156
+ */
157
+ get isGeoBlocked() {
158
+ return this._isGeoBlocked;
159
+ }
160
+ /**
161
+ * The public endpoints that can be used to retrieve Drift data / interact with the Drift program.
162
+ */
163
+ get driftEndpoints() {
164
+ return this._driftEndpoints;
165
+ }
166
+ set tradableMarkets(tradableMarkets) {
167
+ this._tradableMarkets = tradableMarkets;
168
+ this._spotMarketConfigs = tradableMarkets
169
+ .filter((market) => !market.isPerp)
170
+ .map((market) => market_1.MARKET_UTILS.getMarketConfig(this._driftClient.env, sdk_1.MarketType.SPOT, market.marketIndex));
171
+ this._perpMarketConfigs = tradableMarkets
172
+ .filter((market) => market.isPerp)
173
+ .map((market) => market_1.MARKET_UTILS.getMarketConfig(this._driftClient.env, sdk_1.MarketType.PERP, market.marketIndex));
174
+ }
175
+ get spotMarketConfigs() {
176
+ return this._spotMarketConfigs;
177
+ }
178
+ get perpMarketConfigs() {
179
+ return this._perpMarketConfigs;
180
+ }
181
+ initializeStores(driftClient) {
182
+ this._markPriceCache = new MarkPriceCache_1.MarkPriceCache();
183
+ this._oraclePriceCache = new OraclePriceCache_1.OraclePriceCache();
184
+ this._userAccountCache = new UserAccountCache_1.UserAccountCache(driftClient, this._oraclePriceCache, this._markPriceCache);
185
+ }
186
+ initializeOrderbookManager(orderbookWebsocketUrl, orderbookGrouping = orderbook_1.DEFAULT_ORDERBOOK_GROUPING) {
187
+ this._orderbookManager = new DriftL2OrderbookManager_1.DriftL2OrderbookManager({
188
+ wsUrl: orderbookWebsocketUrl,
189
+ subscriptionConfig: this.selectedTradeMarket
190
+ ? {
191
+ ...orderbook_1.DEFAULT_ORDERBOOK_SUBSCRIPTION_CONFIG,
192
+ grouping: orderbookGrouping,
193
+ marketId: this.selectedTradeMarket,
194
+ }
195
+ : undefined,
196
+ });
197
+ }
198
+ initializePollingDlob(driftDlobServerHttpUrl) {
199
+ this._pollingDlob = new PollingDlob_1.PollingDlob({
200
+ driftDlobServerHttpUrl: driftDlobServerHttpUrl,
201
+ });
202
+ }
203
+ initializePriorityFeeSubscriber(config) {
204
+ // Convert tradable markets to DriftMarketInfo format for priority fee subscriber
205
+ const driftMarkets = this._tradableMarkets.map((market) => ({
206
+ marketType: market.marketTypeStr,
207
+ marketIndex: market.marketIndex,
208
+ }));
209
+ const priorityFeeConfig = {
210
+ connection: this.driftClient.connection,
211
+ priorityFeeMethod: sdk_2.PriorityFeeMethod.SOLANA,
212
+ driftMarkets,
213
+ addresses: constants_1.HIGH_ACTIVITY_MARKET_ACCOUNTS,
214
+ ...config,
215
+ };
216
+ this.priorityFeeSubscriber = new sdk_2.PriorityFeeSubscriber(priorityFeeConfig);
217
+ }
218
+ setupDriftClient(config) {
219
+ var _a, _b, _c, _d, _e;
220
+ const driftEnv = config.driftEnv;
221
+ const connection = new web3_js_1.Connection(config.solanaRpcEndpoint);
222
+ const driftProgramID = new web3_js_1.PublicKey(sdk_1.DRIFT_PROGRAM_ID);
223
+ const accountLoader = new sdk_1.CustomizedCadenceBulkAccountLoader(connection, constants_1.DEFAULT_ACCOUNT_LOADER_COMMITMENT, constants_1.DEFAULT_ACCOUNT_LOADER_POLLING_FREQUENCY_MS);
224
+ this.accountLoader = accountLoader;
225
+ const wallet = (_a = config.wallet) !== null && _a !== void 0 ? _a : commonUiUtils_1.COMMON_UI_UTILS.createPlaceholderIWallet();
226
+ const skipInitialUsersLoad = !config.wallet;
227
+ const perpMarkets = (_c = (_b = config.tradableMarkets) === null || _b === void 0 ? void 0 : _b.filter((market) => market.isPerp).map((market) => market_1.MARKET_UTILS.getMarketConfig(driftEnv, sdk_1.MarketType.PERP, market.marketIndex))) !== null && _c !== void 0 ? _c : sdk_1.PerpMarkets[driftEnv];
228
+ const spotMarkets = (_e = (_d = config.tradableMarkets) === null || _d === void 0 ? void 0 : _d.filter((market) => !market.isPerp).map((market) => market_1.MARKET_UTILS.getMarketConfig(driftEnv, sdk_1.MarketType.SPOT, market.marketIndex))) !== null && _e !== void 0 ? _e : sdk_1.SpotMarkets[driftEnv];
229
+ const { perpMarketIndexes, spotMarketIndexes, oracleInfos } = (0, sdk_1.getMarketsAndOraclesForSubscription)(driftEnv, perpMarkets, spotMarkets);
230
+ const driftClientConfig = {
231
+ env: driftEnv,
232
+ connection,
233
+ wallet,
234
+ programID: driftProgramID,
235
+ enableMetricsEvents: false,
236
+ accountSubscription: {
237
+ type: 'polling',
238
+ accountLoader,
239
+ },
240
+ userStats: true,
241
+ includeDelegates: true,
242
+ skipLoadUsers: skipInitialUsersLoad,
243
+ delistedMarketSetting: sdk_1.DelistedMarketSetting.Unsubscribe,
244
+ perpMarketIndexes,
245
+ spotMarketIndexes,
246
+ oracleInfos,
247
+ ...config.additionalDriftClientConfig,
248
+ };
249
+ this._driftClient = new sdk_1.DriftClient(driftClientConfig);
250
+ const txSender = new sdk_1.WhileValidTxSender({
251
+ connection,
252
+ wallet,
253
+ additionalConnections: [],
254
+ additionalTxSenderCallbacks: [],
255
+ txHandler: this._driftClient.txHandler,
256
+ confirmationStrategy: constants_1.DEFAULT_TX_SENDER_CONFIRMATION_STRATEGY,
257
+ retrySleep: constants_1.DEFAULT_TX_SENDER_RETRY_INTERVAL,
258
+ });
259
+ this._driftClient.txSender = txSender;
260
+ return this._driftClient;
261
+ }
262
+ setupOrderbookManager() {
263
+ this.orderbookSubscription = this._orderbookManager.onUpdate((orderbookData) => {
264
+ var _a;
265
+ const marketKey = new types_1.MarketId(orderbookData.marketIndex, utils_1.ENUM_UTILS.toObj(orderbookData.marketType)).key;
266
+ const markPrice = orderbookData.markPrice;
267
+ this._markPriceCache.updateMarkPrices({
268
+ marketKey,
269
+ markPrice,
270
+ bestAsk: orderbookData.bestAskPrice,
271
+ bestBid: orderbookData.bestBidPrice,
272
+ lastUpdateSlot: (_a = orderbookData.slot) !== null && _a !== void 0 ? _a : 0,
273
+ });
274
+ this._oraclePriceCache.updateOraclePrices({
275
+ ...orderbookData.oracleData,
276
+ marketKey,
277
+ });
278
+ });
279
+ }
280
+ setupPollingDlob() {
281
+ // DriftL2OrderbookManager will handle the fetching of data for the selected trade market through websocket
282
+ this._pollingDlob.addInterval(constants_1.PollingCategory.USER_INVOLVED, PollingDlob_1.POLLING_INTERVALS.BACKGROUND_DEEP, PollingDlob_1.POLLING_DEPTHS.DEEP); // markets that the user is involved in
283
+ this._pollingDlob.addInterval(constants_1.PollingCategory.USER_NOT_INVOLVED, PollingDlob_1.POLLING_INTERVALS.BACKGROUND_SHALLOW, PollingDlob_1.POLLING_DEPTHS.SHALLOW); // markets that the user is not involved in
284
+ // add all markets to the user-not-involved interval first, until user-involved markets are known
285
+ this._pollingDlob.addMarketsToInterval(constants_1.PollingCategory.USER_NOT_INVOLVED, this._tradableMarkets.map((market) => market.key));
286
+ this.pollingDlobSubscription = this._pollingDlob
287
+ .onData()
288
+ .subscribe((data) => {
289
+ const updatedMarkPrices = data.map((marketData) => {
290
+ var _a;
291
+ return {
292
+ marketKey: marketData.marketId.key,
293
+ markPrice: marketData.data.markPrice,
294
+ bestBid: marketData.data.bestBidPrice,
295
+ bestAsk: marketData.data.bestAskPrice,
296
+ lastUpdateSlot: (_a = marketData.data.slot) !== null && _a !== void 0 ? _a : 0,
297
+ };
298
+ });
299
+ const updatedOraclePrices = data.map((marketData) => {
300
+ return {
301
+ marketKey: marketData.marketId.key,
302
+ ...marketData.data.oracleData,
303
+ };
304
+ });
305
+ this._markPriceCache.updateMarkPrices(...updatedMarkPrices);
306
+ this._oraclePriceCache.updateOraclePrices(...updatedOraclePrices);
307
+ });
308
+ }
309
+ initializeManagers(dlobServerHttpUrl, swiftServerUrl) {
310
+ // Initialize trading operations
311
+ this.driftOperations = new DriftOperations_1.DriftOperations(this._driftClient, () => this._userAccountCache, dlobServerHttpUrl, swiftServerUrl, () => this.priorityFeeSubscriber.getCustomStrategyResult());
312
+ // Initialize subscription manager with all subscription and market operations
313
+ this.subscriptionManager = new SubscriptionManager_1.SubscriptionManager(this._driftClient, this.accountLoader, this._pollingDlob, this._orderbookManager, this._userAccountCache, this._tradableMarkets, this.selectedTradeMarket);
314
+ }
315
+ unsubscribeFromPollingDlob() {
316
+ var _a;
317
+ (_a = this.pollingDlobSubscription) === null || _a === void 0 ? void 0 : _a.unsubscribe();
318
+ this.pollingDlobSubscription = null;
319
+ this._pollingDlob.stop();
320
+ }
321
+ unsubscribeFromOrderbook() {
322
+ var _a;
323
+ (_a = this.orderbookSubscription) === null || _a === void 0 ? void 0 : _a.unsubscribe();
324
+ this.orderbookSubscription = null;
325
+ this._orderbookManager.unsubscribe();
326
+ }
327
+ async subscribe() {
328
+ const handleGeoBlock = async () => {
329
+ var _a;
330
+ try {
331
+ this._isGeoBlocked = (_a = (await (0, geoblock_1.checkGeoBlock)())) !== null && _a !== void 0 ? _a : false;
332
+ }
333
+ catch (error) {
334
+ console.warn('Failed to check geoblock status:', error);
335
+ this._isGeoBlocked = false; // Default to not blocked if check fails
336
+ }
337
+ };
338
+ // async logic that doesn't require DriftClient to be subscribed
339
+ const handleGeoBlockPromise = handleGeoBlock();
340
+ const pollingDlobStartPromise = this._pollingDlob.start();
341
+ const priorityFeeSubscribePromise = this.priorityFeeSubscriber.subscribe();
342
+ const orderbookSubscribePromise = this._orderbookManager.subscribe();
343
+ await this._driftClient.subscribe();
344
+ // filter out markets that are delisted
345
+ const actualTradableMarkets = this._tradableMarkets.filter((market) => {
346
+ const marketAccount = market.isPerp
347
+ ? this._driftClient.getPerpMarketAccount(market.marketIndex)
348
+ : this._driftClient.getSpotMarketAccount(market.marketIndex);
349
+ if (!marketAccount ||
350
+ constants_1.DELISTED_MARKET_STATUSES.some((marketStatus) => utils_1.ENUM_UTILS.match(marketAccount.status, marketStatus))) {
351
+ return false;
352
+ }
353
+ return true;
354
+ });
355
+ this._tradableMarkets = actualTradableMarkets;
356
+ this.subscriptionManager.updateTradableMarkets(actualTradableMarkets);
357
+ this.setupPollingDlob();
358
+ this.setupOrderbookManager();
359
+ const subscribeToNonWhitelistedButUserInvolvedMarketsPromise = this.subscriptionManager.subscribeToNonWhitelistedButUserInvolvedMarkets(this._driftClient.getUsers());
360
+ await Promise.all([
361
+ pollingDlobStartPromise,
362
+ subscribeToNonWhitelistedButUserInvolvedMarketsPromise,
363
+ priorityFeeSubscribePromise,
364
+ handleGeoBlockPromise,
365
+ orderbookSubscribePromise,
366
+ ]);
367
+ this.subscriptionManager.subscribeToAllUsersUpdates();
368
+ // TODO: subscribe to oracle price updates from drift client?
369
+ }
370
+ async unsubscribe() {
371
+ this.unsubscribeFromPollingDlob();
372
+ this.unsubscribeFromOrderbook();
373
+ this._userAccountCache.destroy();
374
+ this._markPriceCache.destroy();
375
+ this._orderbookManager.destroy();
376
+ const driftClientUnsubscribePromise = this._driftClient.unsubscribe();
377
+ const priorityFeeUnsubscribePromise = this.priorityFeeSubscriber.unsubscribe();
378
+ await Promise.all([driftClientUnsubscribePromise, priorityFeeUnsubscribePromise].filter(Boolean));
379
+ this.pollingDlobSubscription = null;
380
+ }
381
+ onOraclePricesUpdate(callback) {
382
+ return this._oraclePriceCache.onUpdate(callback);
383
+ }
384
+ onMarkPricesUpdate(callback) {
385
+ return this._markPriceCache.onUpdate(callback);
386
+ }
387
+ onUserAccountUpdate(callback) {
388
+ return this._userAccountCache.onUpdate(callback);
389
+ }
390
+ onOrderbookUpdate(callback) {
391
+ return this._orderbookManager.onUpdate(callback);
392
+ }
393
+ /**
394
+ * Updates the authority (wallet) for the drift client and reestablishes subscriptions.
395
+ *
396
+ * @param wallet - The new wallet to use as authority
397
+ * @param activeSubAccountId - Optional subaccount ID to switch to after wallet update
398
+ */
399
+ async updateAuthority(wallet, activeSubAccountId) {
400
+ return this.subscriptionManager.updateAuthority(wallet, activeSubAccountId);
401
+ }
402
+ /**
403
+ * Updates the selected trade market and optimizes subscription polling.
404
+ *
405
+ * @param newSelectedTradeMarket - The new market to prioritize for trading
406
+ */
407
+ updateSelectedTradeMarket(newSelectedTradeMarket) {
408
+ const isNewSelectedTradeMarket = !!newSelectedTradeMarket !== !!this.selectedTradeMarket || // only one of them is null
409
+ (!!newSelectedTradeMarket && // or both are not null and are different
410
+ !!this.selectedTradeMarket &&
411
+ !this.selectedTradeMarket.equals(newSelectedTradeMarket));
412
+ if (!isNewSelectedTradeMarket) {
413
+ return;
414
+ }
415
+ // Update the local reference
416
+ this.selectedTradeMarket = newSelectedTradeMarket;
417
+ // Delegate to subscription manager for all polling optimization
418
+ this.subscriptionManager.updateSelectedTradeMarket(newSelectedTradeMarket);
419
+ }
420
+ /**
421
+ * Creates a new user account and deposits initial collateral.
422
+ *
423
+ * @param params - Parameters for creating user and depositing collateral
424
+ * @returns Promise resolving to transaction signature and user account public key
425
+ */
426
+ async createUserAndDeposit(params) {
427
+ return this.driftOperations.createUserAndDeposit(params);
428
+ }
429
+ /**
430
+ * Deposits collateral into a user's spot market position.
431
+ *
432
+ * @param params - Parameters for the deposit operation
433
+ * @returns Promise resolving to the transaction signature
434
+ */
435
+ async deposit(params) {
436
+ return this.driftOperations.deposit(params);
437
+ }
438
+ /**
439
+ * Withdraws collateral from a user's spot market position.
440
+ *
441
+ * @param params - Parameters for the withdrawal operation
442
+ * @returns Promise resolving to the transaction signature
443
+ */
444
+ async withdraw(params) {
445
+ return this.driftOperations.withdraw(params);
446
+ }
447
+ /**
448
+ * Opens a perpetual market order.
449
+ *
450
+ * @param params - Parameters for the perp order
451
+ * @returns Promise resolving to the transaction signature
452
+ */
453
+ async openPerpOrder(params) {
454
+ return this.driftOperations.openPerpOrder(params);
455
+ }
456
+ /**
457
+ * Executes a swap between two spot markets.
458
+ *
459
+ * @param params - Parameters for the swap operation
460
+ * @returns Promise resolving to the transaction signature
461
+ */
462
+ async swap(params) {
463
+ return this.driftOperations.swap(params);
464
+ }
465
+ async getSwapQuote(params) {
466
+ return this.driftOperations.getSwapQuote(params);
467
+ }
468
+ /**
469
+ * Settles profit and loss for a perpetual position.
470
+ *
471
+ * @param params - Parameters for the settle PnL operation
472
+ * @returns Promise resolving to the transaction signature
473
+ */
474
+ async settleAccountPnl(params) {
475
+ return this.driftOperations.settleAccountPnl(params);
476
+ }
477
+ /**
478
+ * Deletes a user account from the Drift protocol.
479
+ *
480
+ * @param subAccountId - The ID of the sub-account to delete
481
+ * @returns Promise resolving to the transaction signature of the deletion
482
+ */
483
+ async deleteUser(subAccountId) {
484
+ return this.driftOperations.deleteUser(subAccountId);
485
+ }
486
+ /**
487
+ * Cancels a list of open orders.
488
+ *
489
+ * @param params - See `CancelOrdersParams`
490
+ * @returns Promise resolving to the transaction signature of the cancellation
491
+ */
492
+ async cancelOrders(params) {
493
+ return this.driftOperations.cancelOrders(params);
494
+ }
495
+ }
496
+ exports.AuthorityDrift = AuthorityDrift;
497
+ __decorate([
498
+ enforceGeoBlock,
499
+ __metadata("design:type", Function),
500
+ __metadata("design:paramtypes", [Object]),
501
+ __metadata("design:returntype", Promise)
502
+ ], AuthorityDrift.prototype, "openPerpOrder", null);
503
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/drift/Drift/clients/AuthorityDrift/index.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\tCustomizedCadenceBulkAccountLoader,\n\tDelistedMarketSetting,\n\tDRIFT_PROGRAM_ID,\n\tDriftClient,\n\tDriftClientConfig,\n\tDriftEnv,\n\tgetMarketsAndOraclesForSubscription,\n\tIWallet,\n\tMarketType,\n\tPerpMarketConfig,\n\tPerpMarkets,\n\tQuoteResponse,\n\tSpotMarketConfig,\n\tSpotMarkets,\n\tSwapMode,\n\tUser,\n\tWhileValidTxSender,\n} from '@drift-labs/sdk';\nimport { Connection, PublicKey, TransactionSignature } 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\tDELISTED_MARKET_STATUSES,\n\tHIGH_ACTIVITY_MARKET_ACCOUNTS,\n\tPollingCategory,\n} from '../../constants';\nimport { MarketId } from '../../../../types';\nimport { MARKET_UTILS } from '../../../../common-ui-utils/market';\nimport {\n\tPOLLING_DEPTHS,\n\tPOLLING_INTERVALS,\n\tPollingDlob,\n} from '../../data/PollingDlob';\nimport { EnvironmentConstants } from '../../../../EnvironmentConstants';\nimport { MarkPriceLookup, MarkPriceCache } from '../../stores/MarkPriceCache';\nimport {\n\tOraclePriceLookup,\n\tOraclePriceCache,\n} from '../../stores/OraclePriceCache';\nimport { DriftL2OrderbookManager } from './DriftL2OrderbookManager';\nimport { Subscription } from 'rxjs';\nimport {\n\tEnhancedAccountData,\n\tUserAccountCache,\n\tUserAccountLookup,\n} from '../../stores/UserAccountCache';\nimport { ENUM_UTILS } from '../../../../utils';\nimport { checkGeoBlock } from '../../../../utils/geoblock';\nimport {\n\tPriorityFeeSubscriber,\n\tPriorityFeeSubscriberConfig,\n\tPriorityFeeMethod,\n} from '@drift-labs/sdk';\nimport { SubscriptionManager } from './SubscriptionManager';\nimport { DriftOperations } from './DriftOperations';\nimport {\n\tCreateUserAndDepositParams,\n\tDepositParams,\n\tWithdrawParams,\n\tPerpOrderParams,\n\tSwapParams,\n\tSettleAccountPnlParams,\n\tCancelOrdersParams,\n} from './DriftOperations/types';\nimport { Initialize } from '../../../../Config';\nimport { L2WithOracleAndMarketData } from '../../../../utils/orderbook';\nimport { GeoBlockError } from '../../constants/errors';\nimport {\n\tDEFAULT_ORDERBOOK_GROUPING,\n\tDEFAULT_ORDERBOOK_SUBSCRIPTION_CONFIG,\n} from '../../constants/orderbook';\nimport { SwiftOrderResult } from '../../../base/actions/trade/openPerpOrder/openSwiftOrder';\nimport { OrderbookGrouping } from '../../../../utils/dlob-server/DlobServerWebsocketUtils';\n\n/**\n * Decorator that prevents method execution if the user is geographically blocked.\n * Throws a GeoBlockError if the user is blocked.\n *\n * @param target - The class prototype\n * @param propertyName - The method name\n * @param descriptor - The method descriptor\n */\nfunction enforceGeoBlock(\n\t_target: any,\n\tpropertyName: string,\n\tdescriptor: PropertyDescriptor\n): PropertyDescriptor {\n\tconst originalMethod = descriptor.value;\n\n\tdescriptor.value = function (this: AuthorityDrift, ...args: any[]) {\n\t\tif (this._isGeoBlocked) {\n\t\t\tthrow new GeoBlockError(propertyName);\n\t\t}\n\t\treturn originalMethod.apply(this, args);\n\t};\n\n\treturn descriptor;\n}\n\nexport interface AuthorityDriftConfig {\n\tsolanaRpcEndpoint: string;\n\tdriftEnv: DriftEnv;\n\twallet?: IWallet;\n\tdriftDlobServerHttpUrl?: string;\n\ttradableMarkets?: MarketId[];\n\tselectedTradeMarket?: MarketId;\n\tadditionalDriftClientConfig?: Partial<Omit<DriftClientConfig, 'env'>>;\n\tpriorityFeeSubscriberConfig?: Partial<PriorityFeeSubscriberConfig>;\n\torderbookConfig?: {\n\t\tdlobWebSocketUrl?: string;\n\t\torderbookGrouping?: OrderbookGrouping;\n\t};\n}\n\n/**\n * A Drift client that is used to subscribe to all accounts for a given authority.\n *\n * This is useful for applications that want to subscribe to all user accounts for a given authority,\n * such as a UI to trade on Drift or a wallet application that allows trading on Drift.\n */\nexport class AuthorityDrift {\n\t/**\n\t * Handles all Drift program interactions e.g. trading, read account details, etc.\n\t */\n\tprivate _driftClient!: DriftClient;\n\n\t/**\n\t * Handles bulk account loading from the RPC.\n\t */\n\tprivate accountLoader!: CustomizedCadenceBulkAccountLoader;\n\n\t/**\n\t * Handles polling the DLOB server for mark price and oracle price data for markets.\n\t * It is also the fallback source for orderbook data, if the websocket DLOB subscriber is unavailable.\n\t */\n\tprivate _pollingDlob!: PollingDlob;\n\n\t/**\n\t * Subscription to the polling DLOB data.\n\t */\n\tprivate pollingDlobSubscription: Subscription | null = null;\n\n\t/**\n\t * Subscription to the orderbook data.\n\t */\n\tprivate orderbookSubscription: Subscription | null = null;\n\n\t/**\n\t * Handles all trading operations including deposits, withdrawals, and position management.\n\t */\n\tprivate driftOperations!: DriftOperations;\n\n\t/**\n\t * Manages all subscription operations including user accounts, market subscriptions, and polling optimization.\n\t */\n\tprivate subscriptionManager!: SubscriptionManager;\n\n\t/**\n\t * Stores the fetched mark prices for all tradable markets.\n\t * Mark price sources includes:\n\t * - Websocket DLOB subscriber (active market, derived when fetching orderbook data)\n\t * - Polling DLOB server (all non-active markets)\n\t */\n\tprivate _markPriceCache!: MarkPriceCache;\n\n\t/**\n\t * Stores the fetched oracle prices for all tradable markets.\n\t * Oracle price sources includes:\n\t * - DriftClient oracle account subscriptions\n\t * - Polling DLOB server (all non-active markets)\n\t */\n\tprivate _oraclePriceCache!: OraclePriceCache;\n\n\t/**\n\t * Stores the fetched user account data for all user accounts.\n\t */\n\tprivate _userAccountCache!: UserAccountCache;\n\n\t/**\n\t * Manages real-time orderbook subscriptions via websocket.\n\t */\n\tprivate _orderbookManager!: DriftL2OrderbookManager;\n\n\t/**\n\t * Handles priority fee tracking and calculation for optimized transaction costs.\n\t */\n\tprivate priorityFeeSubscriber!: PriorityFeeSubscriber;\n\n\t/**\n\t * Stores whether the user is geographically blocked from using the service.\n\t * This is checked during subscription and cached for decorator use.\n\t */\n\tprotected _isGeoBlocked: boolean = false;\n\n\t/**\n\t * The selected trade market to use for the drift client. This is used to subscribe to the market account,\n\t * oracle data and mark price more frequently compared to the other markets.\n\t *\n\t * Example usage:\n\t * - When the UI wants to display the orderbook of this market.\n\t * - When the user is interacting with the trade form to trade on this market.\n\t */\n\tprivate selectedTradeMarket: MarketId | null = null;\n\n\t/**\n\t * The markets that are tradable through this client. This affects oracle price, mark price and market account subscriptions.\n\t */\n\tprivate _tradableMarkets: MarketId[] = [];\n\n\tprivate _spotMarketConfigs: SpotMarketConfig[] = [];\n\tprivate _perpMarketConfigs: PerpMarketConfig[] = [];\n\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\torderbookWebsocketUrl: string;\n\t};\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 authority - The authority (wallet) whose user accounts to subscribe to.\n\t * @param tradableMarkets - The markets that are tradable through this client.\n\t * @param selectedTradeMarket - The active trade market to use for the drift client. This is used to subscribe to the market account, oracle data and mark price more frequently compared to the other markets.\n\t * @param additionalDriftClientConfig - Additional DriftClient config to use for the DriftClient.\n\t */\n\tconstructor(config: AuthorityDriftConfig) {\n\t\t// set up tradable markets\n\t\tthis.selectedTradeMarket = config.selectedTradeMarket ?? null;\n\n\t\tconst perpTradableMarkets = PerpMarkets[config.driftEnv].map(\n\t\t\t(marketConfig) => MarketId.createPerpMarket(marketConfig.marketIndex)\n\t\t);\n\t\tconst spotTradableMarkets = SpotMarkets[config.driftEnv].map(\n\t\t\t(marketConfig) => MarketId.createSpotMarket(marketConfig.marketIndex)\n\t\t);\n\n\t\tthis._tradableMarkets = config.tradableMarkets ?? [\n\t\t\t...perpTradableMarkets,\n\t\t\t...spotTradableMarkets,\n\t\t];\n\t\tthis._spotMarketConfigs = spotTradableMarkets.map((market) =>\n\t\t\tMARKET_UTILS.getMarketConfig(\n\t\t\t\tconfig.driftEnv,\n\t\t\t\tMarketType.SPOT,\n\t\t\t\tmarket.marketIndex\n\t\t\t)\n\t\t);\n\t\tthis._perpMarketConfigs = perpTradableMarkets.map((market) =>\n\t\t\tMARKET_UTILS.getMarketConfig(\n\t\t\t\tconfig.driftEnv,\n\t\t\t\tMarketType.PERP,\n\t\t\t\tmarket.marketIndex\n\t\t\t)\n\t\t);\n\n\t\t// set up Drift endpoints\n\t\tconst driftDlobServerHttpUrlToUse =\n\t\t\tconfig.driftDlobServerHttpUrl ??\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\tconst orderbookWebsocketUrlToUse =\n\t\t\tconfig.orderbookConfig?.dlobWebSocketUrl ??\n\t\t\tEnvironmentConstants.dlobServerWsUrl[\n\t\t\t\tconfig.driftEnv === 'devnet' ? 'dev' : 'mainnet'\n\t\t\t];\n\t\tthis._driftEndpoints = {\n\t\t\tdlobServerHttpUrl: driftDlobServerHttpUrlToUse,\n\t\t\tswiftServerUrl: swiftServerUrlToUse,\n\t\t\torderbookWebsocketUrl: orderbookWebsocketUrlToUse,\n\t\t};\n\n\t\t// we set this up because SerializableTypes\n\t\tInitialize(config.driftEnv);\n\n\t\t// set up clients and stores\n\t\tconst driftClient = this.setupDriftClient(config);\n\t\tthis.initializePollingDlob(driftDlobServerHttpUrlToUse);\n\t\tthis.initializeStores(driftClient);\n\t\tthis.initializeOrderbookManager(\n\t\t\torderbookWebsocketUrlToUse,\n\t\t\tconfig.orderbookConfig?.orderbookGrouping\n\t\t);\n\t\tthis.initializePriorityFeeSubscriber(config.priorityFeeSubscriberConfig);\n\t\tthis.initializeManagers(driftDlobServerHttpUrlToUse, swiftServerUrlToUse);\n\t}\n\n\tpublic get driftClient(): DriftClient {\n\t\treturn this._driftClient;\n\t}\n\n\tpublic get authority(): PublicKey {\n\t\treturn this._driftClient.wallet.publicKey;\n\t}\n\n\tpublic get pollingDlob(): PollingDlob {\n\t\treturn this._pollingDlob;\n\t}\n\n\tpublic get oraclePriceCache(): OraclePriceLookup {\n\t\treturn this._oraclePriceCache.store;\n\t}\n\n\tpublic get markPriceCache(): MarkPriceLookup {\n\t\treturn this._markPriceCache.store;\n\t}\n\n\tpublic get userAccountCache(): UserAccountLookup {\n\t\treturn this._userAccountCache.store;\n\t}\n\n\tpublic get orderbookCache(): L2WithOracleAndMarketData | null {\n\t\treturn this._orderbookManager.store;\n\t}\n\n\tpublic get orderbookManager(): DriftL2OrderbookManager {\n\t\treturn this._orderbookManager;\n\t}\n\n\tpublic get tradableMarkets(): MarketId[] {\n\t\treturn this._tradableMarkets;\n\t}\n\n\t/**\n\t * Gets the current geoblock status of the user.\n\t *\n\t * @returns True if the user is geographically blocked, false otherwise\n\t */\n\tpublic get isGeoBlocked(): boolean {\n\t\treturn this._isGeoBlocked;\n\t}\n\n\t/**\n\t * The public endpoints that can be used to retrieve Drift data / interact with the Drift program.\n\t */\n\tpublic get driftEndpoints(): {\n\t\tdlobServerHttpUrl: string;\n\t\tswiftServerUrl: string;\n\t} {\n\t\treturn this._driftEndpoints;\n\t}\n\n\tprivate set tradableMarkets(tradableMarkets: MarketId[]) {\n\t\tthis._tradableMarkets = tradableMarkets;\n\t\tthis._spotMarketConfigs = tradableMarkets\n\t\t\t.filter((market) => !market.isPerp)\n\t\t\t.map((market) =>\n\t\t\t\tMARKET_UTILS.getMarketConfig(\n\t\t\t\t\tthis._driftClient.env,\n\t\t\t\t\tMarketType.SPOT,\n\t\t\t\t\tmarket.marketIndex\n\t\t\t\t)\n\t\t\t);\n\t\tthis._perpMarketConfigs = tradableMarkets\n\t\t\t.filter((market) => market.isPerp)\n\t\t\t.map((market) =>\n\t\t\t\tMARKET_UTILS.getMarketConfig(\n\t\t\t\t\tthis._driftClient.env,\n\t\t\t\t\tMarketType.PERP,\n\t\t\t\t\tmarket.marketIndex\n\t\t\t\t)\n\t\t\t);\n\t}\n\n\tpublic get spotMarketConfigs(): SpotMarketConfig[] {\n\t\treturn this._spotMarketConfigs;\n\t}\n\n\tpublic get perpMarketConfigs(): PerpMarketConfig[] {\n\t\treturn this._perpMarketConfigs;\n\t}\n\n\tprivate initializeStores(driftClient: DriftClient) {\n\t\tthis._markPriceCache = new MarkPriceCache();\n\t\tthis._oraclePriceCache = new OraclePriceCache();\n\t\tthis._userAccountCache = new UserAccountCache(\n\t\t\tdriftClient,\n\t\t\tthis._oraclePriceCache,\n\t\t\tthis._markPriceCache\n\t\t);\n\t}\n\n\tprivate initializeOrderbookManager(\n\t\torderbookWebsocketUrl: string,\n\t\torderbookGrouping: OrderbookGrouping = DEFAULT_ORDERBOOK_GROUPING\n\t) {\n\t\tthis._orderbookManager = new DriftL2OrderbookManager({\n\t\t\twsUrl: orderbookWebsocketUrl,\n\t\t\tsubscriptionConfig: this.selectedTradeMarket\n\t\t\t\t? {\n\t\t\t\t\t\t...DEFAULT_ORDERBOOK_SUBSCRIPTION_CONFIG,\n\t\t\t\t\t\tgrouping: orderbookGrouping,\n\t\t\t\t\t\tmarketId: this.selectedTradeMarket,\n\t\t\t\t }\n\t\t\t\t: undefined,\n\t\t});\n\t}\n\n\tprivate initializePollingDlob(driftDlobServerHttpUrl: string) {\n\t\tthis._pollingDlob = new PollingDlob({\n\t\t\tdriftDlobServerHttpUrl: driftDlobServerHttpUrl,\n\t\t});\n\t}\n\n\tprivate initializePriorityFeeSubscriber(\n\t\tconfig?: Partial<PriorityFeeSubscriberConfig>\n\t) {\n\t\t// Convert tradable markets to DriftMarketInfo format for priority fee subscriber\n\t\tconst driftMarkets = this._tradableMarkets.map((market) => ({\n\t\t\tmarketType: market.marketTypeStr,\n\t\t\tmarketIndex: market.marketIndex,\n\t\t}));\n\n\t\tconst priorityFeeConfig: PriorityFeeSubscriberConfig = {\n\t\t\tconnection: this.driftClient.connection,\n\t\t\tpriorityFeeMethod: PriorityFeeMethod.SOLANA,\n\t\t\tdriftMarkets,\n\t\t\taddresses: HIGH_ACTIVITY_MARKET_ACCOUNTS,\n\t\t\t...config,\n\t\t};\n\n\t\tthis.priorityFeeSubscriber = new PriorityFeeSubscriber(priorityFeeConfig);\n\t}\n\n\tprivate setupDriftClient(\n\t\tconfig: Omit<AuthorityDriftConfig, 'onUserAccountUpdate'>\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\t\tthis.accountLoader = accountLoader;\n\n\t\tconst wallet = config.wallet ?? COMMON_UI_UTILS.createPlaceholderIWallet();\n\t\tconst skipInitialUsersLoad = !config.wallet;\n\n\t\tconst perpMarkets =\n\t\t\tconfig.tradableMarkets\n\t\t\t\t?.filter((market) => market.isPerp)\n\t\t\t\t.map((market) =>\n\t\t\t\t\tMARKET_UTILS.getMarketConfig(\n\t\t\t\t\t\tdriftEnv,\n\t\t\t\t\t\tMarketType.PERP,\n\t\t\t\t\t\tmarket.marketIndex\n\t\t\t\t\t)\n\t\t\t\t) ?? PerpMarkets[driftEnv];\n\t\tconst spotMarkets =\n\t\t\tconfig.tradableMarkets\n\t\t\t\t?.filter((market) => !market.isPerp)\n\t\t\t\t.map((market) =>\n\t\t\t\t\tMARKET_UTILS.getMarketConfig(\n\t\t\t\t\t\tdriftEnv,\n\t\t\t\t\t\tMarketType.SPOT,\n\t\t\t\t\t\tmarket.marketIndex\n\t\t\t\t\t)\n\t\t\t\t) ?? SpotMarkets[driftEnv];\n\t\tconst { perpMarketIndexes, spotMarketIndexes, oracleInfos } =\n\t\t\tgetMarketsAndOraclesForSubscription(driftEnv, perpMarkets, spotMarkets);\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: true,\n\t\t\tincludeDelegates: true,\n\t\t\tskipLoadUsers: skipInitialUsersLoad,\n\t\t\tdelistedMarketSetting: DelistedMarketSetting.Unsubscribe,\n\t\t\tperpMarketIndexes,\n\t\t\tspotMarketIndexes,\n\t\t\toracleInfos,\n\t\t\t...config.additionalDriftClientConfig,\n\t\t};\n\t\tthis._driftClient = new DriftClient(driftClientConfig);\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\treturn this._driftClient;\n\t}\n\n\tprivate setupOrderbookManager() {\n\t\tthis.orderbookSubscription = this._orderbookManager.onUpdate(\n\t\t\t(orderbookData) => {\n\t\t\t\tconst marketKey = new MarketId(\n\t\t\t\t\torderbookData.marketIndex,\n\t\t\t\t\tENUM_UTILS.toObj(orderbookData.marketType as string) as MarketType\n\t\t\t\t).key;\n\n\t\t\t\tconst markPrice = orderbookData.markPrice;\n\n\t\t\t\tthis._markPriceCache.updateMarkPrices({\n\t\t\t\t\tmarketKey,\n\t\t\t\t\tmarkPrice,\n\t\t\t\t\tbestAsk: orderbookData.bestAskPrice,\n\t\t\t\t\tbestBid: orderbookData.bestBidPrice,\n\t\t\t\t\tlastUpdateSlot: orderbookData.slot ?? 0,\n\t\t\t\t});\n\n\t\t\t\tthis._oraclePriceCache.updateOraclePrices({\n\t\t\t\t\t...orderbookData.oracleData,\n\t\t\t\t\tmarketKey,\n\t\t\t\t});\n\t\t\t}\n\t\t);\n\t}\n\n\tprivate setupPollingDlob() {\n\t\t// DriftL2OrderbookManager will handle the fetching of data for the selected trade market through websocket\n\n\t\tthis._pollingDlob.addInterval(\n\t\t\tPollingCategory.USER_INVOLVED,\n\t\t\tPOLLING_INTERVALS.BACKGROUND_DEEP,\n\t\t\tPOLLING_DEPTHS.DEEP\n\t\t); // markets that the user is involved in\n\t\tthis._pollingDlob.addInterval(\n\t\t\tPollingCategory.USER_NOT_INVOLVED,\n\t\t\tPOLLING_INTERVALS.BACKGROUND_SHALLOW,\n\t\t\tPOLLING_DEPTHS.SHALLOW\n\t\t); // markets that the user is not involved in\n\n\t\t// add all markets to the user-not-involved interval first, until user-involved markets are known\n\t\tthis._pollingDlob.addMarketsToInterval(\n\t\t\tPollingCategory.USER_NOT_INVOLVED,\n\t\t\tthis._tradableMarkets.map((market) => market.key)\n\t\t);\n\n\t\tthis.pollingDlobSubscription = this._pollingDlob\n\t\t\t.onData()\n\t\t\t.subscribe((data) => {\n\t\t\t\tconst updatedMarkPrices = data.map((marketData) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tmarketKey: marketData.marketId.key,\n\t\t\t\t\t\tmarkPrice: marketData.data.markPrice,\n\t\t\t\t\t\tbestBid: marketData.data.bestBidPrice,\n\t\t\t\t\t\tbestAsk: marketData.data.bestAskPrice,\n\t\t\t\t\t\tlastUpdateSlot: marketData.data.slot ?? 0,\n\t\t\t\t\t};\n\t\t\t\t});\n\t\t\t\tconst updatedOraclePrices = data.map((marketData) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tmarketKey: marketData.marketId.key,\n\t\t\t\t\t\t...marketData.data.oracleData,\n\t\t\t\t\t};\n\t\t\t\t});\n\n\t\t\t\tthis._markPriceCache.updateMarkPrices(...updatedMarkPrices);\n\t\t\t\tthis._oraclePriceCache.updateOraclePrices(...updatedOraclePrices);\n\t\t\t});\n\t}\n\n\tprivate initializeManagers(\n\t\tdlobServerHttpUrl: string,\n\t\tswiftServerUrl: string\n\t) {\n\t\t// Initialize trading operations\n\t\tthis.driftOperations = new DriftOperations(\n\t\t\tthis._driftClient,\n\t\t\t() => this._userAccountCache,\n\t\t\tdlobServerHttpUrl,\n\t\t\tswiftServerUrl,\n\t\t\t() => this.priorityFeeSubscriber.getCustomStrategyResult()\n\t\t);\n\n\t\t// Initialize subscription manager with all subscription and market operations\n\t\tthis.subscriptionManager = new SubscriptionManager(\n\t\t\tthis._driftClient,\n\t\t\tthis.accountLoader,\n\t\t\tthis._pollingDlob,\n\t\t\tthis._orderbookManager,\n\t\t\tthis._userAccountCache,\n\t\t\tthis._tradableMarkets,\n\t\t\tthis.selectedTradeMarket\n\t\t);\n\t}\n\n\tprivate unsubscribeFromPollingDlob() {\n\t\tthis.pollingDlobSubscription?.unsubscribe();\n\t\tthis.pollingDlobSubscription = null;\n\n\t\tthis._pollingDlob.stop();\n\t}\n\n\tprivate unsubscribeFromOrderbook() {\n\t\tthis.orderbookSubscription?.unsubscribe();\n\t\tthis.orderbookSubscription = null;\n\n\t\tthis._orderbookManager.unsubscribe();\n\t}\n\n\tpublic async subscribe() {\n\t\tconst handleGeoBlock = async () => {\n\t\t\ttry {\n\t\t\t\tthis._isGeoBlocked = (await checkGeoBlock()) ?? false;\n\t\t\t} catch (error) {\n\t\t\t\tconsole.warn('Failed to check geoblock status:', error);\n\t\t\t\tthis._isGeoBlocked = false; // Default to not blocked if check fails\n\t\t\t}\n\t\t};\n\n\t\t// async logic that doesn't require DriftClient to be subscribed\n\t\tconst handleGeoBlockPromise = handleGeoBlock();\n\t\tconst pollingDlobStartPromise = this._pollingDlob.start();\n\t\tconst priorityFeeSubscribePromise = this.priorityFeeSubscriber.subscribe();\n\t\tconst orderbookSubscribePromise = this._orderbookManager.subscribe();\n\n\t\tawait this._driftClient.subscribe();\n\n\t\t// filter out markets that are delisted\n\t\tconst actualTradableMarkets = this._tradableMarkets.filter((market) => {\n\t\t\tconst marketAccount = market.isPerp\n\t\t\t\t? this._driftClient.getPerpMarketAccount(market.marketIndex)\n\t\t\t\t: this._driftClient.getSpotMarketAccount(market.marketIndex);\n\n\t\t\tif (\n\t\t\t\t!marketAccount ||\n\t\t\t\tDELISTED_MARKET_STATUSES.some((marketStatus) =>\n\t\t\t\t\tENUM_UTILS.match(marketAccount.status, marketStatus)\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn true;\n\t\t});\n\n\t\tthis._tradableMarkets = actualTradableMarkets;\n\t\tthis.subscriptionManager.updateTradableMarkets(actualTradableMarkets);\n\t\tthis.setupPollingDlob();\n\t\tthis.setupOrderbookManager();\n\n\t\tconst subscribeToNonWhitelistedButUserInvolvedMarketsPromise =\n\t\t\tthis.subscriptionManager.subscribeToNonWhitelistedButUserInvolvedMarkets(\n\t\t\t\tthis._driftClient.getUsers()\n\t\t\t);\n\n\t\tawait Promise.all([\n\t\t\tpollingDlobStartPromise,\n\t\t\tsubscribeToNonWhitelistedButUserInvolvedMarketsPromise,\n\t\t\tpriorityFeeSubscribePromise,\n\t\t\thandleGeoBlockPromise,\n\t\t\torderbookSubscribePromise,\n\t\t]);\n\n\t\tthis.subscriptionManager.subscribeToAllUsersUpdates();\n\n\t\t// TODO: subscribe to oracle price updates from drift client?\n\t}\n\n\tpublic async unsubscribe() {\n\t\tthis.unsubscribeFromPollingDlob();\n\t\tthis.unsubscribeFromOrderbook();\n\t\tthis._userAccountCache.destroy();\n\t\tthis._markPriceCache.destroy();\n\t\tthis._orderbookManager.destroy();\n\n\t\tconst driftClientUnsubscribePromise = this._driftClient.unsubscribe();\n\t\tconst priorityFeeUnsubscribePromise =\n\t\t\tthis.priorityFeeSubscriber.unsubscribe();\n\n\t\tawait Promise.all(\n\t\t\t[driftClientUnsubscribePromise, priorityFeeUnsubscribePromise].filter(\n\t\t\t\tBoolean\n\t\t\t)\n\t\t);\n\n\t\tthis.pollingDlobSubscription = null;\n\t}\n\n\tpublic onOraclePricesUpdate(\n\t\tcallback: (oraclePrice: OraclePriceLookup) => void\n\t) {\n\t\treturn this._oraclePriceCache.onUpdate(callback);\n\t}\n\n\tpublic onMarkPricesUpdate(callback: (markPrice: MarkPriceLookup) => void) {\n\t\treturn this._markPriceCache.onUpdate(callback);\n\t}\n\n\tpublic onUserAccountUpdate(\n\t\tcallback: (userAccount: EnhancedAccountData) => void\n\t) {\n\t\treturn this._userAccountCache.onUpdate(callback);\n\t}\n\n\tpublic onOrderbookUpdate(\n\t\tcallback: (orderbook: L2WithOracleAndMarketData) => void\n\t) {\n\t\treturn this._orderbookManager.onUpdate(callback);\n\t}\n\n\t/**\n\t * Updates the authority (wallet) for the drift client and reestablishes subscriptions.\n\t *\n\t * @param wallet - The new wallet to use as authority\n\t * @param activeSubAccountId - Optional subaccount ID to switch to after wallet update\n\t */\n\tpublic async updateAuthority(wallet: IWallet, activeSubAccountId?: number) {\n\t\treturn this.subscriptionManager.updateAuthority(wallet, activeSubAccountId);\n\t}\n\n\t/**\n\t * Updates the selected trade market and optimizes subscription polling.\n\t *\n\t * @param newSelectedTradeMarket - The new market to prioritize for trading\n\t */\n\tpublic updateSelectedTradeMarket(newSelectedTradeMarket: MarketId | null) {\n\t\tconst isNewSelectedTradeMarket =\n\t\t\t!!newSelectedTradeMarket !== !!this.selectedTradeMarket || // only one of them is null\n\t\t\t(!!newSelectedTradeMarket && // or both are not null and are different\n\t\t\t\t!!this.selectedTradeMarket &&\n\t\t\t\t!this.selectedTradeMarket.equals(newSelectedTradeMarket));\n\n\t\tif (!isNewSelectedTradeMarket) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Update the local reference\n\t\tthis.selectedTradeMarket = newSelectedTradeMarket;\n\n\t\t// Delegate to subscription manager for all polling optimization\n\t\tthis.subscriptionManager.updateSelectedTradeMarket(newSelectedTradeMarket);\n\t}\n\n\t/**\n\t * Creates a new user account and deposits initial collateral.\n\t *\n\t * @param params - Parameters for creating user and depositing collateral\n\t * @returns Promise resolving to transaction signature and user account public key\n\t */\n\tpublic async createUserAndDeposit(\n\t\tparams: CreateUserAndDepositParams\n\t): Promise<{\n\t\ttxSig: TransactionSignature;\n\t\tuser: User;\n\t}> {\n\t\treturn this.driftOperations.createUserAndDeposit(params);\n\t}\n\n\t/**\n\t * Deposits collateral into a user's spot market position.\n\t *\n\t * @param params - Parameters for the deposit operation\n\t * @returns Promise resolving to the transaction signature\n\t */\n\tpublic async deposit(params: DepositParams): Promise<TransactionSignature> {\n\t\treturn this.driftOperations.deposit(params);\n\t}\n\n\t/**\n\t * Withdraws collateral from a user's spot market position.\n\t *\n\t * @param params - Parameters for the withdrawal operation\n\t * @returns Promise resolving to the transaction signature\n\t */\n\tpublic async withdraw(params: WithdrawParams): Promise<TransactionSignature> {\n\t\treturn this.driftOperations.withdraw(params);\n\t}\n\n\t/**\n\t * Opens a perpetual market order.\n\t *\n\t * @param params - Parameters for the perp order\n\t * @returns Promise resolving to the transaction signature\n\t */\n\t@enforceGeoBlock\n\tpublic async openPerpOrder(\n\t\tparams: PerpOrderParams\n\t): Promise<TransactionSignature | SwiftOrderResult> {\n\t\treturn this.driftOperations.openPerpOrder(params);\n\t}\n\n\t/**\n\t * Executes a swap between two spot markets.\n\t *\n\t * @param params - Parameters for the swap operation\n\t * @returns Promise resolving to the transaction signature\n\t */\n\tpublic async swap(params: SwapParams): Promise<TransactionSignature> {\n\t\treturn this.driftOperations.swap(params);\n\t}\n\n\tpublic async getSwapQuote(\n\t\tparams: Omit<SwapParams, 'jupiterQuote'> & {\n\t\t\tslippageBps?: number;\n\t\t\tswapMode?: SwapMode;\n\t\t\tonlyDirectRoutes?: boolean;\n\t\t}\n\t): Promise<QuoteResponse> {\n\t\treturn this.driftOperations.getSwapQuote(params);\n\t}\n\n\t/**\n\t * Settles profit and loss for a perpetual position.\n\t *\n\t * @param params - Parameters for the settle PnL operation\n\t * @returns Promise resolving to the transaction signature\n\t */\n\tpublic async settleAccountPnl(\n\t\tparams: SettleAccountPnlParams\n\t): Promise<TransactionSignature> {\n\t\treturn this.driftOperations.settleAccountPnl(params);\n\t}\n\n\t/**\n\t * Deletes a user account from the Drift protocol.\n\t *\n\t * @param subAccountId - The ID of the sub-account to delete\n\t * @returns Promise resolving to the transaction signature of the deletion\n\t */\n\tpublic async deleteUser(subAccountId: number): Promise<TransactionSignature> {\n\t\treturn this.driftOperations.deleteUser(subAccountId);\n\t}\n\n\t/**\n\t * Cancels a list of open orders.\n\t *\n\t * @param params - See `CancelOrdersParams`\n\t * @returns Promise resolving to the transaction signature of the cancellation\n\t */\n\tpublic async cancelOrders(\n\t\tparams: CancelOrdersParams\n\t): Promise<TransactionSignature> {\n\t\treturn this.driftOperations.cancelOrders(params);\n\t}\n}\n"]}