@drift-labs/sdk-browser 2.104.0-beta.21

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 (935) hide show
  1. package/README.md +276 -0
  2. package/VERSION +1 -0
  3. package/bun.lockb +0 -0
  4. package/get_events.ts +47 -0
  5. package/lib/browser/accounts/basicUserAccountSubscriber.d.ts +27 -0
  6. package/lib/browser/accounts/basicUserAccountSubscriber.js +38 -0
  7. package/lib/browser/accounts/bulkAccountLoader.d.ts +37 -0
  8. package/lib/browser/accounts/bulkAccountLoader.js +222 -0
  9. package/lib/browser/accounts/bulkUserStatsSubscription.d.ts +7 -0
  10. package/lib/browser/accounts/bulkUserStatsSubscription.js +21 -0
  11. package/lib/browser/accounts/bulkUserSubscription.d.ts +7 -0
  12. package/lib/browser/accounts/bulkUserSubscription.js +21 -0
  13. package/lib/browser/accounts/fetch.d.ts +6 -0
  14. package/lib/browser/accounts/fetch.js +30 -0
  15. package/lib/browser/accounts/grpcAccountSubscriber.d.ts +16 -0
  16. package/lib/browser/accounts/grpcAccountSubscriber.js +154 -0
  17. package/lib/browser/accounts/grpcDriftClientAccountSubscriber.d.ts +12 -0
  18. package/lib/browser/accounts/grpcDriftClientAccountSubscriber.js +98 -0
  19. package/lib/browser/accounts/grpcInsuranceFundStakeAccountSubscriber.d.ts +10 -0
  20. package/lib/browser/accounts/grpcInsuranceFundStakeAccountSubscriber.js +30 -0
  21. package/lib/browser/accounts/grpcProgramAccountSubscriber.d.ts +18 -0
  22. package/lib/browser/accounts/grpcProgramAccountSubscriber.js +171 -0
  23. package/lib/browser/accounts/grpcUserAccountSubscriber.d.ts +10 -0
  24. package/lib/browser/accounts/grpcUserAccountSubscriber.js +28 -0
  25. package/lib/browser/accounts/grpcUserStatsAccountSubscriber.d.ts +10 -0
  26. package/lib/browser/accounts/grpcUserStatsAccountSubscriber.js +28 -0
  27. package/lib/browser/accounts/oneShotUserAccountSubscriber.d.ts +18 -0
  28. package/lib/browser/accounts/oneShotUserAccountSubscriber.js +48 -0
  29. package/lib/browser/accounts/pollingDriftClientAccountSubscriber.d.ts +69 -0
  30. package/lib/browser/accounts/pollingDriftClientAccountSubscriber.js +418 -0
  31. package/lib/browser/accounts/pollingHighLeverageModeConfigAccountSubscriber.d.ts +29 -0
  32. package/lib/browser/accounts/pollingHighLeverageModeConfigAccountSubscriber.js +111 -0
  33. package/lib/browser/accounts/pollingInsuranceFundStakeAccountSubscriber.d.ts +29 -0
  34. package/lib/browser/accounts/pollingInsuranceFundStakeAccountSubscriber.js +110 -0
  35. package/lib/browser/accounts/pollingOracleAccountSubscriber.d.ts +27 -0
  36. package/lib/browser/accounts/pollingOracleAccountSubscriber.js +78 -0
  37. package/lib/browser/accounts/pollingTokenAccountSubscriber.d.ts +26 -0
  38. package/lib/browser/accounts/pollingTokenAccountSubscriber.js +78 -0
  39. package/lib/browser/accounts/pollingUserAccountSubscriber.d.ts +29 -0
  40. package/lib/browser/accounts/pollingUserAccountSubscriber.js +102 -0
  41. package/lib/browser/accounts/pollingUserStatsAccountSubscriber.d.ts +27 -0
  42. package/lib/browser/accounts/pollingUserStatsAccountSubscriber.js +94 -0
  43. package/lib/browser/accounts/testBulkAccountLoader.d.ts +4 -0
  44. package/lib/browser/accounts/testBulkAccountLoader.js +45 -0
  45. package/lib/browser/accounts/types.d.ts +168 -0
  46. package/lib/browser/accounts/types.js +16 -0
  47. package/lib/browser/accounts/utils.d.ts +8 -0
  48. package/lib/browser/accounts/utils.js +49 -0
  49. package/lib/browser/accounts/webSocketAccountSubscriber.d.ts +29 -0
  50. package/lib/browser/accounts/webSocketAccountSubscriber.js +149 -0
  51. package/lib/browser/accounts/webSocketDriftClientAccountSubscriber.d.ts +66 -0
  52. package/lib/browser/accounts/webSocketDriftClientAccountSubscriber.js +358 -0
  53. package/lib/browser/accounts/webSocketHighLeverageModeConfigAccountSubscriber.d.ts +23 -0
  54. package/lib/browser/accounts/webSocketHighLeverageModeConfigAccountSubscriber.js +69 -0
  55. package/lib/browser/accounts/webSocketInsuranceFundStakeAccountSubscriber.d.ts +23 -0
  56. package/lib/browser/accounts/webSocketInsuranceFundStakeAccountSubscriber.js +67 -0
  57. package/lib/browser/accounts/webSocketProgramAccountSubscriber.d.ts +32 -0
  58. package/lib/browser/accounts/webSocketProgramAccountSubscriber.js +120 -0
  59. package/lib/browser/accounts/webSocketUserAccountSubscriber.d.ts +23 -0
  60. package/lib/browser/accounts/webSocketUserAccountSubscriber.js +61 -0
  61. package/lib/browser/accounts/webSocketUserStatsAccountSubsriber.d.ts +22 -0
  62. package/lib/browser/accounts/webSocketUserStatsAccountSubsriber.js +52 -0
  63. package/lib/browser/addresses/marketAddresses.d.ts +2 -0
  64. package/lib/browser/addresses/marketAddresses.js +15 -0
  65. package/lib/browser/addresses/pda.d.ts +32 -0
  66. package/lib/browser/addresses/pda.js +211 -0
  67. package/lib/browser/adminClient.d.ts +206 -0
  68. package/lib/browser/adminClient.js +1858 -0
  69. package/lib/browser/assert/assert.d.ts +1 -0
  70. package/lib/browser/assert/assert.js +9 -0
  71. package/lib/browser/auctionSubscriber/auctionSubscriber.d.ts +14 -0
  72. package/lib/browser/auctionSubscriber/auctionSubscriber.js +32 -0
  73. package/lib/browser/auctionSubscriber/auctionSubscriberGrpc.d.ts +15 -0
  74. package/lib/browser/auctionSubscriber/auctionSubscriberGrpc.js +32 -0
  75. package/lib/browser/auctionSubscriber/index.d.ts +3 -0
  76. package/lib/browser/auctionSubscriber/index.js +19 -0
  77. package/lib/browser/auctionSubscriber/types.d.ts +14 -0
  78. package/lib/browser/auctionSubscriber/types.js +2 -0
  79. package/lib/browser/bankrun/bankrunConnection.d.ts +75 -0
  80. package/lib/browser/bankrun/bankrunConnection.js +332 -0
  81. package/lib/browser/blockhashSubscriber/BlockhashSubscriber.d.ts +27 -0
  82. package/lib/browser/blockhashSubscriber/BlockhashSubscriber.js +89 -0
  83. package/lib/browser/blockhashSubscriber/index.d.ts +1 -0
  84. package/lib/browser/blockhashSubscriber/index.js +17 -0
  85. package/lib/browser/blockhashSubscriber/types.d.ts +7 -0
  86. package/lib/browser/blockhashSubscriber/types.js +2 -0
  87. package/lib/browser/clock/clockSubscriber.d.ts +31 -0
  88. package/lib/browser/clock/clockSubscriber.js +80 -0
  89. package/lib/browser/config.d.ts +60 -0
  90. package/lib/browser/config.js +130 -0
  91. package/lib/browser/constants/numericConstants.d.ts +71 -0
  92. package/lib/browser/constants/numericConstants.js +75 -0
  93. package/lib/browser/constants/perpMarkets.d.ts +19 -0
  94. package/lib/browser/constants/perpMarkets.js +997 -0
  95. package/lib/browser/constants/spotMarkets.d.ts +24 -0
  96. package/lib/browser/constants/spotMarkets.js +470 -0
  97. package/lib/browser/constants/txConstants.d.ts +1 -0
  98. package/lib/browser/constants/txConstants.js +4 -0
  99. package/lib/browser/decode/phoenix.d.ts +7 -0
  100. package/lib/browser/decode/phoenix.js +159 -0
  101. package/lib/browser/decode/user.d.ts +4 -0
  102. package/lib/browser/decode/user.js +339 -0
  103. package/lib/browser/dlob/DLOB.d.ts +186 -0
  104. package/lib/browser/dlob/DLOB.js +1039 -0
  105. package/lib/browser/dlob/DLOBNode.d.ts +68 -0
  106. package/lib/browser/dlob/DLOBNode.js +100 -0
  107. package/lib/browser/dlob/DLOBSubscriber.d.ts +54 -0
  108. package/lib/browser/dlob/DLOBSubscriber.js +139 -0
  109. package/lib/browser/dlob/NodeList.d.ts +25 -0
  110. package/lib/browser/dlob/NodeList.js +126 -0
  111. package/lib/browser/dlob/orderBookLevels.d.ts +72 -0
  112. package/lib/browser/dlob/orderBookLevels.js +438 -0
  113. package/lib/browser/dlob/types.d.ts +18 -0
  114. package/lib/browser/dlob/types.js +2 -0
  115. package/lib/browser/driftClient.d.ts +861 -0
  116. package/lib/browser/driftClient.js +4768 -0
  117. package/lib/browser/driftClientConfig.d.ts +49 -0
  118. package/lib/browser/driftClientConfig.js +2 -0
  119. package/lib/browser/events/eventList.d.ts +22 -0
  120. package/lib/browser/events/eventList.js +80 -0
  121. package/lib/browser/events/eventSubscriber.d.ts +46 -0
  122. package/lib/browser/events/eventSubscriber.js +223 -0
  123. package/lib/browser/events/eventsServerLogProvider.d.ts +21 -0
  124. package/lib/browser/events/eventsServerLogProvider.js +121 -0
  125. package/lib/browser/events/fetchLogs.d.ts +25 -0
  126. package/lib/browser/events/fetchLogs.js +99 -0
  127. package/lib/browser/events/parse.d.ts +6 -0
  128. package/lib/browser/events/parse.js +106 -0
  129. package/lib/browser/events/pollingLogProvider.d.ts +17 -0
  130. package/lib/browser/events/pollingLogProvider.js +58 -0
  131. package/lib/browser/events/sort.d.ts +2 -0
  132. package/lib/browser/events/sort.js +24 -0
  133. package/lib/browser/events/txEventCache.d.ts +24 -0
  134. package/lib/browser/events/txEventCache.js +71 -0
  135. package/lib/browser/events/types.d.ts +79 -0
  136. package/lib/browser/events/types.js +32 -0
  137. package/lib/browser/events/webSocketLogProvider.d.ts +24 -0
  138. package/lib/browser/events/webSocketLogProvider.js +96 -0
  139. package/lib/browser/factory/bigNum.d.ts +122 -0
  140. package/lib/browser/factory/bigNum.js +457 -0
  141. package/lib/browser/factory/oracleClient.d.ts +5 -0
  142. package/lib/browser/factory/oracleClient.js +56 -0
  143. package/lib/browser/idl/drift.json +14440 -0
  144. package/lib/browser/idl/openbook.json +3854 -0
  145. package/lib/browser/idl/pyth_solana_receiver.json +628 -0
  146. package/lib/browser/idl/switchboard.json +8354 -0
  147. package/lib/browser/idl/switchboard_on_demand_30.json +4546 -0
  148. package/lib/browser/idl/token_faucet.json +142 -0
  149. package/lib/browser/index.d.ts +125 -0
  150. package/lib/browser/index.js +147 -0
  151. package/lib/browser/isomorphic/grpc.browser.d.ts +1 -0
  152. package/lib/browser/isomorphic/grpc.browser.js +8 -0
  153. package/lib/browser/isomorphic/grpc.d.ts +1 -0
  154. package/lib/browser/isomorphic/grpc.js +8 -0
  155. package/lib/browser/jupiter/jupiterClient.d.ts +302 -0
  156. package/lib/browser/jupiter/jupiterClient.js +178 -0
  157. package/lib/browser/keypair.d.ts +2 -0
  158. package/lib/browser/keypair.js +28 -0
  159. package/lib/browser/marinade/index.d.ts +12 -0
  160. package/lib/browser/marinade/index.js +36 -0
  161. package/lib/browser/marinade/types.d.ts +1963 -0
  162. package/lib/browser/marinade/types.js +1965 -0
  163. package/lib/browser/math/amm.d.ts +98 -0
  164. package/lib/browser/math/amm.js +626 -0
  165. package/lib/browser/math/auction.d.ts +23 -0
  166. package/lib/browser/math/auction.js +130 -0
  167. package/lib/browser/math/bankruptcy.d.ts +2 -0
  168. package/lib/browser/math/bankruptcy.js +31 -0
  169. package/lib/browser/math/conversion.d.ts +2 -0
  170. package/lib/browser/math/conversion.js +11 -0
  171. package/lib/browser/math/exchangeStatus.d.ts +6 -0
  172. package/lib/browser/math/exchangeStatus.js +77 -0
  173. package/lib/browser/math/fuel.d.ts +6 -0
  174. package/lib/browser/math/fuel.js +55 -0
  175. package/lib/browser/math/funding.d.ts +34 -0
  176. package/lib/browser/math/funding.js +209 -0
  177. package/lib/browser/math/insurance.d.ts +7 -0
  178. package/lib/browser/math/insurance.js +73 -0
  179. package/lib/browser/math/margin.d.ts +39 -0
  180. package/lib/browser/math/margin.js +184 -0
  181. package/lib/browser/math/market.d.ts +39 -0
  182. package/lib/browser/math/market.js +163 -0
  183. package/lib/browser/math/oracles.d.ts +14 -0
  184. package/lib/browser/math/oracles.js +134 -0
  185. package/lib/browser/math/orders.d.ts +23 -0
  186. package/lib/browser/math/orders.js +216 -0
  187. package/lib/browser/math/position.d.ts +70 -0
  188. package/lib/browser/math/position.js +225 -0
  189. package/lib/browser/math/repeg.d.ts +22 -0
  190. package/lib/browser/math/repeg.js +164 -0
  191. package/lib/browser/math/spotBalance.d.ts +83 -0
  192. package/lib/browser/math/spotBalance.js +373 -0
  193. package/lib/browser/math/spotMarket.d.ts +11 -0
  194. package/lib/browser/math/spotMarket.js +49 -0
  195. package/lib/browser/math/spotPosition.d.ts +19 -0
  196. package/lib/browser/math/spotPosition.js +78 -0
  197. package/lib/browser/math/state.d.ts +5 -0
  198. package/lib/browser/math/state.js +30 -0
  199. package/lib/browser/math/superStake.d.ts +167 -0
  200. package/lib/browser/math/superStake.js +306 -0
  201. package/lib/browser/math/tiers.d.ts +4 -0
  202. package/lib/browser/math/tiers.js +52 -0
  203. package/lib/browser/math/trade.d.ts +117 -0
  204. package/lib/browser/math/trade.js +637 -0
  205. package/lib/browser/math/userStatus.d.ts +2 -0
  206. package/lib/browser/math/userStatus.js +8 -0
  207. package/lib/browser/math/utils.d.ts +23 -0
  208. package/lib/browser/math/utils.js +112 -0
  209. package/lib/browser/memcmp.d.ts +11 -0
  210. package/lib/browser/memcmp.js +99 -0
  211. package/lib/browser/openbook/openbookV2FulfillmentConfigMap.d.ts +10 -0
  212. package/lib/browser/openbook/openbookV2FulfillmentConfigMap.js +17 -0
  213. package/lib/browser/openbook/openbookV2Subscriber.d.ts +36 -0
  214. package/lib/browser/openbook/openbookV2Subscriber.js +104 -0
  215. package/lib/browser/oracles/oracleClientCache.d.ts +9 -0
  216. package/lib/browser/oracles/oracleClientCache.js +19 -0
  217. package/lib/browser/oracles/oracleId.d.ts +4 -0
  218. package/lib/browser/oracles/oracleId.js +38 -0
  219. package/lib/browser/oracles/prelaunchOracleClient.d.ts +12 -0
  220. package/lib/browser/oracles/prelaunchOracleClient.js +24 -0
  221. package/lib/browser/oracles/pythClient.d.ts +14 -0
  222. package/lib/browser/oracles/pythClient.js +51 -0
  223. package/lib/browser/oracles/pythLazerClient.d.ts +16 -0
  224. package/lib/browser/oracles/pythLazerClient.js +61 -0
  225. package/lib/browser/oracles/pythPullClient.d.ts +19 -0
  226. package/lib/browser/oracles/pythPullClient.js +60 -0
  227. package/lib/browser/oracles/quoteAssetOracleClient.d.ts +10 -0
  228. package/lib/browser/oracles/quoteAssetOracleClient.js +21 -0
  229. package/lib/browser/oracles/strictOraclePrice.d.ts +9 -0
  230. package/lib/browser/oracles/strictOraclePrice.js +17 -0
  231. package/lib/browser/oracles/switchboardClient.d.ts +12 -0
  232. package/lib/browser/oracles/switchboardClient.js +40 -0
  233. package/lib/browser/oracles/switchboardOnDemandClient.d.ts +12 -0
  234. package/lib/browser/oracles/switchboardOnDemandClient.js +32 -0
  235. package/lib/browser/oracles/types.d.ts +23 -0
  236. package/lib/browser/oracles/types.js +2 -0
  237. package/lib/browser/orderParams.d.ts +29 -0
  238. package/lib/browser/orderParams.js +44 -0
  239. package/lib/browser/orderSubscriber/OrderSubscriber.d.ts +42 -0
  240. package/lib/browser/orderSubscriber/OrderSubscriber.js +172 -0
  241. package/lib/browser/orderSubscriber/PollingSubscription.d.ts +12 -0
  242. package/lib/browser/orderSubscriber/PollingSubscription.js +23 -0
  243. package/lib/browser/orderSubscriber/WebsocketSubscription.d.ts +23 -0
  244. package/lib/browser/orderSubscriber/WebsocketSubscription.js +67 -0
  245. package/lib/browser/orderSubscriber/grpcSubscription.d.ts +22 -0
  246. package/lib/browser/orderSubscriber/grpcSubscription.js +66 -0
  247. package/lib/browser/orderSubscriber/index.d.ts +2 -0
  248. package/lib/browser/orderSubscriber/index.js +18 -0
  249. package/lib/browser/orderSubscriber/types.d.ts +34 -0
  250. package/lib/browser/orderSubscriber/types.js +2 -0
  251. package/lib/browser/phoenix/phoenixFulfillmentConfigMap.d.ts +10 -0
  252. package/lib/browser/phoenix/phoenixFulfillmentConfigMap.js +17 -0
  253. package/lib/browser/phoenix/phoenixSubscriber.d.ts +41 -0
  254. package/lib/browser/phoenix/phoenixSubscriber.js +152 -0
  255. package/lib/browser/priorityFee/averageOverSlotsStrategy.d.ts +5 -0
  256. package/lib/browser/priorityFee/averageOverSlotsStrategy.js +16 -0
  257. package/lib/browser/priorityFee/averageStrategy.d.ts +5 -0
  258. package/lib/browser/priorityFee/averageStrategy.js +11 -0
  259. package/lib/browser/priorityFee/driftPriorityFeeMethod.d.ts +13 -0
  260. package/lib/browser/priorityFee/driftPriorityFeeMethod.js +26 -0
  261. package/lib/browser/priorityFee/ewmaStrategy.d.ts +11 -0
  262. package/lib/browser/priorityFee/ewmaStrategy.js +33 -0
  263. package/lib/browser/priorityFee/heliusPriorityFeeMethod.d.ts +20 -0
  264. package/lib/browser/priorityFee/heliusPriorityFeeMethod.js +46 -0
  265. package/lib/browser/priorityFee/index.d.ts +11 -0
  266. package/lib/browser/priorityFee/index.js +27 -0
  267. package/lib/browser/priorityFee/maxOverSlotsStrategy.d.ts +5 -0
  268. package/lib/browser/priorityFee/maxOverSlotsStrategy.js +17 -0
  269. package/lib/browser/priorityFee/maxStrategy.d.ts +7 -0
  270. package/lib/browser/priorityFee/maxStrategy.js +9 -0
  271. package/lib/browser/priorityFee/priorityFeeSubscriber.d.ts +46 -0
  272. package/lib/browser/priorityFee/priorityFeeSubscriber.js +188 -0
  273. package/lib/browser/priorityFee/priorityFeeSubscriberMap.d.ts +48 -0
  274. package/lib/browser/priorityFee/priorityFeeSubscriberMap.js +88 -0
  275. package/lib/browser/priorityFee/solanaPriorityFeeMethod.d.ts +6 -0
  276. package/lib/browser/priorityFee/solanaPriorityFeeMethod.js +21 -0
  277. package/lib/browser/priorityFee/types.d.ts +31 -0
  278. package/lib/browser/priorityFee/types.js +10 -0
  279. package/lib/browser/serum/serumFulfillmentConfigMap.d.ts +10 -0
  280. package/lib/browser/serum/serumFulfillmentConfigMap.js +17 -0
  281. package/lib/browser/serum/serumSubscriber.d.ts +32 -0
  282. package/lib/browser/serum/serumSubscriber.js +107 -0
  283. package/lib/browser/serum/types.d.ts +13 -0
  284. package/lib/browser/serum/types.js +2 -0
  285. package/lib/browser/slot/SlotSubscriber.d.ts +27 -0
  286. package/lib/browser/slot/SlotSubscriber.js +71 -0
  287. package/lib/browser/slot/SlothashSubscriber.d.ts +26 -0
  288. package/lib/browser/slot/SlothashSubscriber.js +85 -0
  289. package/lib/browser/testClient.d.ts +8 -0
  290. package/lib/browser/testClient.js +23 -0
  291. package/lib/browser/token/index.d.ts +5 -0
  292. package/lib/browser/token/index.js +15 -0
  293. package/lib/browser/tokenFaucet.d.ts +41 -0
  294. package/lib/browser/tokenFaucet.js +188 -0
  295. package/lib/browser/tx/baseTxSender.d.ts +59 -0
  296. package/lib/browser/tx/baseTxSender.js +294 -0
  297. package/lib/browser/tx/blockhashFetcher/baseBlockhashFetcher.d.ts +8 -0
  298. package/lib/browser/tx/blockhashFetcher/baseBlockhashFetcher.js +13 -0
  299. package/lib/browser/tx/blockhashFetcher/cachedBlockhashFetcher.d.ts +28 -0
  300. package/lib/browser/tx/blockhashFetcher/cachedBlockhashFetcher.js +73 -0
  301. package/lib/browser/tx/blockhashFetcher/types.d.ts +4 -0
  302. package/lib/browser/tx/blockhashFetcher/types.js +2 -0
  303. package/lib/browser/tx/fastSingleTxSender.d.ts +41 -0
  304. package/lib/browser/tx/fastSingleTxSender.js +86 -0
  305. package/lib/browser/tx/forwardOnlyTxSender.d.ts +37 -0
  306. package/lib/browser/tx/forwardOnlyTxSender.js +92 -0
  307. package/lib/browser/tx/priorityFeeCalculator.d.ts +44 -0
  308. package/lib/browser/tx/priorityFeeCalculator.js +85 -0
  309. package/lib/browser/tx/reportTransactionError.d.ts +20 -0
  310. package/lib/browser/tx/reportTransactionError.js +103 -0
  311. package/lib/browser/tx/retryTxSender.d.ts +37 -0
  312. package/lib/browser/tx/retryTxSender.js +86 -0
  313. package/lib/browser/tx/txHandler.d.ts +154 -0
  314. package/lib/browser/tx/txHandler.js +453 -0
  315. package/lib/browser/tx/txParamProcessor.d.ts +25 -0
  316. package/lib/browser/tx/txParamProcessor.js +88 -0
  317. package/lib/browser/tx/types.d.ts +29 -0
  318. package/lib/browser/tx/types.js +20 -0
  319. package/lib/browser/tx/utils.d.ts +2 -0
  320. package/lib/browser/tx/utils.js +10 -0
  321. package/lib/browser/tx/whileValidTxSender.d.ts +45 -0
  322. package/lib/browser/tx/whileValidTxSender.js +167 -0
  323. package/lib/browser/types.d.ts +1385 -0
  324. package/lib/browser/types.js +366 -0
  325. package/lib/browser/user.d.ts +411 -0
  326. package/lib/browser/user.js +2151 -0
  327. package/lib/browser/userConfig.d.ts +26 -0
  328. package/lib/browser/userConfig.js +2 -0
  329. package/lib/browser/userMap/PollingSubscription.d.ts +16 -0
  330. package/lib/browser/userMap/PollingSubscription.js +30 -0
  331. package/lib/browser/userMap/WebsocketSubscription.d.ts +27 -0
  332. package/lib/browser/userMap/WebsocketSubscription.js +45 -0
  333. package/lib/browser/userMap/grpcSubscription.d.ts +27 -0
  334. package/lib/browser/userMap/grpcSubscription.js +44 -0
  335. package/lib/browser/userMap/referrerMap.d.ts +45 -0
  336. package/lib/browser/userMap/referrerMap.js +181 -0
  337. package/lib/browser/userMap/userMap.d.ts +90 -0
  338. package/lib/browser/userMap/userMap.js +467 -0
  339. package/lib/browser/userMap/userMapConfig.d.ts +39 -0
  340. package/lib/browser/userMap/userMapConfig.js +2 -0
  341. package/lib/browser/userMap/userStatsMap.d.ts +46 -0
  342. package/lib/browser/userMap/userStatsMap.js +165 -0
  343. package/lib/browser/userName.d.ts +5 -0
  344. package/lib/browser/userName.js +21 -0
  345. package/lib/browser/userStats.d.ts +22 -0
  346. package/lib/browser/userStats.js +91 -0
  347. package/lib/browser/userStatsConfig.d.ts +25 -0
  348. package/lib/browser/userStatsConfig.js +2 -0
  349. package/lib/browser/util/TransactionConfirmationManager.d.ts +16 -0
  350. package/lib/browser/util/TransactionConfirmationManager.js +174 -0
  351. package/lib/browser/util/chainClock.d.ts +17 -0
  352. package/lib/browser/util/chainClock.js +29 -0
  353. package/lib/browser/util/computeUnits.d.ts +8 -0
  354. package/lib/browser/util/computeUnits.js +48 -0
  355. package/lib/browser/util/digest.d.ts +4 -0
  356. package/lib/browser/util/digest.js +14 -0
  357. package/lib/browser/util/promiseTimeout.d.ts +1 -0
  358. package/lib/browser/util/promiseTimeout.js +14 -0
  359. package/lib/browser/util/pythOracleUtils.d.ts +17 -0
  360. package/lib/browser/util/pythOracleUtils.js +107 -0
  361. package/lib/browser/util/tps.d.ts +2 -0
  362. package/lib/browser/util/tps.js +16 -0
  363. package/lib/browser/wallet.d.ts +11 -0
  364. package/lib/browser/wallet.js +32 -0
  365. package/lib/node/accounts/basicUserAccountSubscriber.d.ts +27 -0
  366. package/lib/node/accounts/basicUserAccountSubscriber.js +38 -0
  367. package/lib/node/accounts/bulkAccountLoader.d.ts +37 -0
  368. package/lib/node/accounts/bulkAccountLoader.js +222 -0
  369. package/lib/node/accounts/bulkUserStatsSubscription.d.ts +7 -0
  370. package/lib/node/accounts/bulkUserStatsSubscription.js +21 -0
  371. package/lib/node/accounts/bulkUserSubscription.d.ts +7 -0
  372. package/lib/node/accounts/bulkUserSubscription.js +21 -0
  373. package/lib/node/accounts/fetch.d.ts +6 -0
  374. package/lib/node/accounts/fetch.js +30 -0
  375. package/lib/node/accounts/grpcAccountSubscriber.d.ts +16 -0
  376. package/lib/node/accounts/grpcAccountSubscriber.js +154 -0
  377. package/lib/node/accounts/grpcDriftClientAccountSubscriber.d.ts +12 -0
  378. package/lib/node/accounts/grpcDriftClientAccountSubscriber.js +98 -0
  379. package/lib/node/accounts/grpcInsuranceFundStakeAccountSubscriber.d.ts +10 -0
  380. package/lib/node/accounts/grpcInsuranceFundStakeAccountSubscriber.js +30 -0
  381. package/lib/node/accounts/grpcProgramAccountSubscriber.d.ts +18 -0
  382. package/lib/node/accounts/grpcProgramAccountSubscriber.js +171 -0
  383. package/lib/node/accounts/grpcUserAccountSubscriber.d.ts +10 -0
  384. package/lib/node/accounts/grpcUserAccountSubscriber.js +28 -0
  385. package/lib/node/accounts/grpcUserStatsAccountSubscriber.d.ts +10 -0
  386. package/lib/node/accounts/grpcUserStatsAccountSubscriber.js +28 -0
  387. package/lib/node/accounts/oneShotUserAccountSubscriber.d.ts +18 -0
  388. package/lib/node/accounts/oneShotUserAccountSubscriber.js +48 -0
  389. package/lib/node/accounts/pollingDriftClientAccountSubscriber.d.ts +69 -0
  390. package/lib/node/accounts/pollingDriftClientAccountSubscriber.js +418 -0
  391. package/lib/node/accounts/pollingHighLeverageModeConfigAccountSubscriber.d.ts +29 -0
  392. package/lib/node/accounts/pollingHighLeverageModeConfigAccountSubscriber.js +111 -0
  393. package/lib/node/accounts/pollingInsuranceFundStakeAccountSubscriber.d.ts +29 -0
  394. package/lib/node/accounts/pollingInsuranceFundStakeAccountSubscriber.js +110 -0
  395. package/lib/node/accounts/pollingOracleAccountSubscriber.d.ts +27 -0
  396. package/lib/node/accounts/pollingOracleAccountSubscriber.js +78 -0
  397. package/lib/node/accounts/pollingTokenAccountSubscriber.d.ts +26 -0
  398. package/lib/node/accounts/pollingTokenAccountSubscriber.js +78 -0
  399. package/lib/node/accounts/pollingUserAccountSubscriber.d.ts +29 -0
  400. package/lib/node/accounts/pollingUserAccountSubscriber.js +102 -0
  401. package/lib/node/accounts/pollingUserStatsAccountSubscriber.d.ts +27 -0
  402. package/lib/node/accounts/pollingUserStatsAccountSubscriber.js +94 -0
  403. package/lib/node/accounts/testBulkAccountLoader.d.ts +4 -0
  404. package/lib/node/accounts/testBulkAccountLoader.js +45 -0
  405. package/lib/node/accounts/types.d.ts +168 -0
  406. package/lib/node/accounts/types.js +16 -0
  407. package/lib/node/accounts/utils.d.ts +8 -0
  408. package/lib/node/accounts/utils.js +49 -0
  409. package/lib/node/accounts/webSocketAccountSubscriber.d.ts +29 -0
  410. package/lib/node/accounts/webSocketAccountSubscriber.js +149 -0
  411. package/lib/node/accounts/webSocketDriftClientAccountSubscriber.d.ts +66 -0
  412. package/lib/node/accounts/webSocketDriftClientAccountSubscriber.js +358 -0
  413. package/lib/node/accounts/webSocketHighLeverageModeConfigAccountSubscriber.d.ts +23 -0
  414. package/lib/node/accounts/webSocketHighLeverageModeConfigAccountSubscriber.js +69 -0
  415. package/lib/node/accounts/webSocketInsuranceFundStakeAccountSubscriber.d.ts +23 -0
  416. package/lib/node/accounts/webSocketInsuranceFundStakeAccountSubscriber.js +67 -0
  417. package/lib/node/accounts/webSocketProgramAccountSubscriber.d.ts +32 -0
  418. package/lib/node/accounts/webSocketProgramAccountSubscriber.js +120 -0
  419. package/lib/node/accounts/webSocketUserAccountSubscriber.d.ts +23 -0
  420. package/lib/node/accounts/webSocketUserAccountSubscriber.js +61 -0
  421. package/lib/node/accounts/webSocketUserStatsAccountSubsriber.d.ts +22 -0
  422. package/lib/node/accounts/webSocketUserStatsAccountSubsriber.js +52 -0
  423. package/lib/node/addresses/marketAddresses.d.ts +2 -0
  424. package/lib/node/addresses/marketAddresses.js +15 -0
  425. package/lib/node/addresses/pda.d.ts +32 -0
  426. package/lib/node/addresses/pda.js +211 -0
  427. package/lib/node/adminClient.d.ts +206 -0
  428. package/lib/node/adminClient.js +1858 -0
  429. package/lib/node/assert/assert.d.ts +1 -0
  430. package/lib/node/assert/assert.js +9 -0
  431. package/lib/node/auctionSubscriber/auctionSubscriber.d.ts +14 -0
  432. package/lib/node/auctionSubscriber/auctionSubscriber.js +32 -0
  433. package/lib/node/auctionSubscriber/auctionSubscriberGrpc.d.ts +15 -0
  434. package/lib/node/auctionSubscriber/auctionSubscriberGrpc.js +32 -0
  435. package/lib/node/auctionSubscriber/index.d.ts +3 -0
  436. package/lib/node/auctionSubscriber/index.js +19 -0
  437. package/lib/node/auctionSubscriber/types.d.ts +14 -0
  438. package/lib/node/auctionSubscriber/types.js +2 -0
  439. package/lib/node/bankrun/bankrunConnection.d.ts +75 -0
  440. package/lib/node/bankrun/bankrunConnection.js +332 -0
  441. package/lib/node/blockhashSubscriber/BlockhashSubscriber.d.ts +27 -0
  442. package/lib/node/blockhashSubscriber/BlockhashSubscriber.js +89 -0
  443. package/lib/node/blockhashSubscriber/index.d.ts +1 -0
  444. package/lib/node/blockhashSubscriber/index.js +17 -0
  445. package/lib/node/blockhashSubscriber/types.d.ts +7 -0
  446. package/lib/node/blockhashSubscriber/types.js +2 -0
  447. package/lib/node/clock/clockSubscriber.d.ts +31 -0
  448. package/lib/node/clock/clockSubscriber.js +80 -0
  449. package/lib/node/config.d.ts +60 -0
  450. package/lib/node/config.js +130 -0
  451. package/lib/node/constants/numericConstants.d.ts +71 -0
  452. package/lib/node/constants/numericConstants.js +75 -0
  453. package/lib/node/constants/perpMarkets.d.ts +19 -0
  454. package/lib/node/constants/perpMarkets.js +997 -0
  455. package/lib/node/constants/spotMarkets.d.ts +24 -0
  456. package/lib/node/constants/spotMarkets.js +470 -0
  457. package/lib/node/constants/txConstants.d.ts +1 -0
  458. package/lib/node/constants/txConstants.js +4 -0
  459. package/lib/node/decode/phoenix.d.ts +7 -0
  460. package/lib/node/decode/phoenix.js +159 -0
  461. package/lib/node/decode/user.d.ts +4 -0
  462. package/lib/node/decode/user.js +339 -0
  463. package/lib/node/dlob/DLOB.d.ts +186 -0
  464. package/lib/node/dlob/DLOB.js +1039 -0
  465. package/lib/node/dlob/DLOBNode.d.ts +68 -0
  466. package/lib/node/dlob/DLOBNode.js +100 -0
  467. package/lib/node/dlob/DLOBSubscriber.d.ts +54 -0
  468. package/lib/node/dlob/DLOBSubscriber.js +139 -0
  469. package/lib/node/dlob/NodeList.d.ts +25 -0
  470. package/lib/node/dlob/NodeList.js +126 -0
  471. package/lib/node/dlob/orderBookLevels.d.ts +72 -0
  472. package/lib/node/dlob/orderBookLevels.js +438 -0
  473. package/lib/node/dlob/types.d.ts +18 -0
  474. package/lib/node/dlob/types.js +2 -0
  475. package/lib/node/driftClient.d.ts +861 -0
  476. package/lib/node/driftClient.js +4768 -0
  477. package/lib/node/driftClientConfig.d.ts +49 -0
  478. package/lib/node/driftClientConfig.js +2 -0
  479. package/lib/node/events/eventList.d.ts +22 -0
  480. package/lib/node/events/eventList.js +80 -0
  481. package/lib/node/events/eventSubscriber.d.ts +46 -0
  482. package/lib/node/events/eventSubscriber.js +223 -0
  483. package/lib/node/events/eventsServerLogProvider.d.ts +21 -0
  484. package/lib/node/events/eventsServerLogProvider.js +121 -0
  485. package/lib/node/events/fetchLogs.d.ts +25 -0
  486. package/lib/node/events/fetchLogs.js +99 -0
  487. package/lib/node/events/parse.d.ts +6 -0
  488. package/lib/node/events/parse.js +106 -0
  489. package/lib/node/events/pollingLogProvider.d.ts +17 -0
  490. package/lib/node/events/pollingLogProvider.js +58 -0
  491. package/lib/node/events/sort.d.ts +2 -0
  492. package/lib/node/events/sort.js +24 -0
  493. package/lib/node/events/txEventCache.d.ts +24 -0
  494. package/lib/node/events/txEventCache.js +71 -0
  495. package/lib/node/events/types.d.ts +79 -0
  496. package/lib/node/events/types.js +32 -0
  497. package/lib/node/events/webSocketLogProvider.d.ts +24 -0
  498. package/lib/node/events/webSocketLogProvider.js +96 -0
  499. package/lib/node/factory/bigNum.d.ts +122 -0
  500. package/lib/node/factory/bigNum.js +457 -0
  501. package/lib/node/factory/oracleClient.d.ts +5 -0
  502. package/lib/node/factory/oracleClient.js +56 -0
  503. package/lib/node/idl/drift.json +14440 -0
  504. package/lib/node/idl/openbook.json +3854 -0
  505. package/lib/node/idl/pyth_solana_receiver.json +628 -0
  506. package/lib/node/idl/switchboard.json +8354 -0
  507. package/lib/node/idl/switchboard_on_demand_30.json +4546 -0
  508. package/lib/node/idl/token_faucet.json +142 -0
  509. package/lib/node/index.d.ts +125 -0
  510. package/lib/node/index.js +147 -0
  511. package/lib/node/isomorphic/grpc.browser.d.ts +1 -0
  512. package/lib/node/isomorphic/grpc.browser.js +8 -0
  513. package/lib/node/isomorphic/grpc.d.ts +1 -0
  514. package/lib/node/isomorphic/grpc.js +8 -0
  515. package/lib/node/jupiter/jupiterClient.d.ts +302 -0
  516. package/lib/node/jupiter/jupiterClient.js +178 -0
  517. package/lib/node/keypair.d.ts +2 -0
  518. package/lib/node/keypair.js +28 -0
  519. package/lib/node/marinade/index.d.ts +12 -0
  520. package/lib/node/marinade/index.js +36 -0
  521. package/lib/node/marinade/types.d.ts +1963 -0
  522. package/lib/node/marinade/types.js +1965 -0
  523. package/lib/node/math/amm.d.ts +98 -0
  524. package/lib/node/math/amm.js +626 -0
  525. package/lib/node/math/auction.d.ts +23 -0
  526. package/lib/node/math/auction.js +130 -0
  527. package/lib/node/math/bankruptcy.d.ts +2 -0
  528. package/lib/node/math/bankruptcy.js +31 -0
  529. package/lib/node/math/conversion.d.ts +2 -0
  530. package/lib/node/math/conversion.js +11 -0
  531. package/lib/node/math/exchangeStatus.d.ts +6 -0
  532. package/lib/node/math/exchangeStatus.js +77 -0
  533. package/lib/node/math/fuel.d.ts +6 -0
  534. package/lib/node/math/fuel.js +55 -0
  535. package/lib/node/math/funding.d.ts +34 -0
  536. package/lib/node/math/funding.js +209 -0
  537. package/lib/node/math/insurance.d.ts +7 -0
  538. package/lib/node/math/insurance.js +73 -0
  539. package/lib/node/math/margin.d.ts +39 -0
  540. package/lib/node/math/margin.js +184 -0
  541. package/lib/node/math/market.d.ts +39 -0
  542. package/lib/node/math/market.js +163 -0
  543. package/lib/node/math/oracles.d.ts +14 -0
  544. package/lib/node/math/oracles.js +134 -0
  545. package/lib/node/math/orders.d.ts +23 -0
  546. package/lib/node/math/orders.js +216 -0
  547. package/lib/node/math/position.d.ts +70 -0
  548. package/lib/node/math/position.js +225 -0
  549. package/lib/node/math/repeg.d.ts +22 -0
  550. package/lib/node/math/repeg.js +164 -0
  551. package/lib/node/math/spotBalance.d.ts +83 -0
  552. package/lib/node/math/spotBalance.js +373 -0
  553. package/lib/node/math/spotMarket.d.ts +11 -0
  554. package/lib/node/math/spotMarket.js +49 -0
  555. package/lib/node/math/spotPosition.d.ts +19 -0
  556. package/lib/node/math/spotPosition.js +78 -0
  557. package/lib/node/math/state.d.ts +5 -0
  558. package/lib/node/math/state.js +30 -0
  559. package/lib/node/math/superStake.d.ts +167 -0
  560. package/lib/node/math/superStake.js +306 -0
  561. package/lib/node/math/tiers.d.ts +4 -0
  562. package/lib/node/math/tiers.js +52 -0
  563. package/lib/node/math/trade.d.ts +117 -0
  564. package/lib/node/math/trade.js +637 -0
  565. package/lib/node/math/userStatus.d.ts +2 -0
  566. package/lib/node/math/userStatus.js +8 -0
  567. package/lib/node/math/utils.d.ts +23 -0
  568. package/lib/node/math/utils.js +112 -0
  569. package/lib/node/memcmp.d.ts +11 -0
  570. package/lib/node/memcmp.js +99 -0
  571. package/lib/node/openbook/openbookV2FulfillmentConfigMap.d.ts +10 -0
  572. package/lib/node/openbook/openbookV2FulfillmentConfigMap.js +17 -0
  573. package/lib/node/openbook/openbookV2Subscriber.d.ts +36 -0
  574. package/lib/node/openbook/openbookV2Subscriber.js +104 -0
  575. package/lib/node/oracles/oracleClientCache.d.ts +9 -0
  576. package/lib/node/oracles/oracleClientCache.js +19 -0
  577. package/lib/node/oracles/oracleId.d.ts +4 -0
  578. package/lib/node/oracles/oracleId.js +38 -0
  579. package/lib/node/oracles/prelaunchOracleClient.d.ts +12 -0
  580. package/lib/node/oracles/prelaunchOracleClient.js +24 -0
  581. package/lib/node/oracles/pythClient.d.ts +14 -0
  582. package/lib/node/oracles/pythClient.js +51 -0
  583. package/lib/node/oracles/pythLazerClient.d.ts +16 -0
  584. package/lib/node/oracles/pythLazerClient.js +61 -0
  585. package/lib/node/oracles/pythPullClient.d.ts +19 -0
  586. package/lib/node/oracles/pythPullClient.js +60 -0
  587. package/lib/node/oracles/quoteAssetOracleClient.d.ts +10 -0
  588. package/lib/node/oracles/quoteAssetOracleClient.js +21 -0
  589. package/lib/node/oracles/strictOraclePrice.d.ts +9 -0
  590. package/lib/node/oracles/strictOraclePrice.js +17 -0
  591. package/lib/node/oracles/switchboardClient.d.ts +12 -0
  592. package/lib/node/oracles/switchboardClient.js +40 -0
  593. package/lib/node/oracles/switchboardOnDemandClient.d.ts +12 -0
  594. package/lib/node/oracles/switchboardOnDemandClient.js +32 -0
  595. package/lib/node/oracles/types.d.ts +23 -0
  596. package/lib/node/oracles/types.js +2 -0
  597. package/lib/node/orderParams.d.ts +29 -0
  598. package/lib/node/orderParams.js +44 -0
  599. package/lib/node/orderSubscriber/OrderSubscriber.d.ts +42 -0
  600. package/lib/node/orderSubscriber/OrderSubscriber.js +172 -0
  601. package/lib/node/orderSubscriber/PollingSubscription.d.ts +12 -0
  602. package/lib/node/orderSubscriber/PollingSubscription.js +23 -0
  603. package/lib/node/orderSubscriber/WebsocketSubscription.d.ts +23 -0
  604. package/lib/node/orderSubscriber/WebsocketSubscription.js +67 -0
  605. package/lib/node/orderSubscriber/grpcSubscription.d.ts +22 -0
  606. package/lib/node/orderSubscriber/grpcSubscription.js +66 -0
  607. package/lib/node/orderSubscriber/index.d.ts +2 -0
  608. package/lib/node/orderSubscriber/index.js +18 -0
  609. package/lib/node/orderSubscriber/types.d.ts +34 -0
  610. package/lib/node/orderSubscriber/types.js +2 -0
  611. package/lib/node/phoenix/phoenixFulfillmentConfigMap.d.ts +10 -0
  612. package/lib/node/phoenix/phoenixFulfillmentConfigMap.js +17 -0
  613. package/lib/node/phoenix/phoenixSubscriber.d.ts +41 -0
  614. package/lib/node/phoenix/phoenixSubscriber.js +152 -0
  615. package/lib/node/priorityFee/averageOverSlotsStrategy.d.ts +5 -0
  616. package/lib/node/priorityFee/averageOverSlotsStrategy.js +16 -0
  617. package/lib/node/priorityFee/averageStrategy.d.ts +5 -0
  618. package/lib/node/priorityFee/averageStrategy.js +11 -0
  619. package/lib/node/priorityFee/driftPriorityFeeMethod.d.ts +13 -0
  620. package/lib/node/priorityFee/driftPriorityFeeMethod.js +26 -0
  621. package/lib/node/priorityFee/ewmaStrategy.d.ts +11 -0
  622. package/lib/node/priorityFee/ewmaStrategy.js +33 -0
  623. package/lib/node/priorityFee/heliusPriorityFeeMethod.d.ts +20 -0
  624. package/lib/node/priorityFee/heliusPriorityFeeMethod.js +46 -0
  625. package/lib/node/priorityFee/index.d.ts +11 -0
  626. package/lib/node/priorityFee/index.js +27 -0
  627. package/lib/node/priorityFee/maxOverSlotsStrategy.d.ts +5 -0
  628. package/lib/node/priorityFee/maxOverSlotsStrategy.js +17 -0
  629. package/lib/node/priorityFee/maxStrategy.d.ts +7 -0
  630. package/lib/node/priorityFee/maxStrategy.js +9 -0
  631. package/lib/node/priorityFee/priorityFeeSubscriber.d.ts +46 -0
  632. package/lib/node/priorityFee/priorityFeeSubscriber.js +188 -0
  633. package/lib/node/priorityFee/priorityFeeSubscriberMap.d.ts +48 -0
  634. package/lib/node/priorityFee/priorityFeeSubscriberMap.js +88 -0
  635. package/lib/node/priorityFee/solanaPriorityFeeMethod.d.ts +6 -0
  636. package/lib/node/priorityFee/solanaPriorityFeeMethod.js +21 -0
  637. package/lib/node/priorityFee/types.d.ts +31 -0
  638. package/lib/node/priorityFee/types.js +10 -0
  639. package/lib/node/serum/serumFulfillmentConfigMap.d.ts +10 -0
  640. package/lib/node/serum/serumFulfillmentConfigMap.js +17 -0
  641. package/lib/node/serum/serumSubscriber.d.ts +32 -0
  642. package/lib/node/serum/serumSubscriber.js +107 -0
  643. package/lib/node/serum/types.d.ts +13 -0
  644. package/lib/node/serum/types.js +2 -0
  645. package/lib/node/slot/SlotSubscriber.d.ts +27 -0
  646. package/lib/node/slot/SlotSubscriber.js +71 -0
  647. package/lib/node/slot/SlothashSubscriber.d.ts +26 -0
  648. package/lib/node/slot/SlothashSubscriber.js +85 -0
  649. package/lib/node/testClient.d.ts +8 -0
  650. package/lib/node/testClient.js +23 -0
  651. package/lib/node/token/index.d.ts +5 -0
  652. package/lib/node/token/index.js +15 -0
  653. package/lib/node/tokenFaucet.d.ts +41 -0
  654. package/lib/node/tokenFaucet.js +188 -0
  655. package/lib/node/tx/baseTxSender.d.ts +59 -0
  656. package/lib/node/tx/baseTxSender.js +294 -0
  657. package/lib/node/tx/blockhashFetcher/baseBlockhashFetcher.d.ts +8 -0
  658. package/lib/node/tx/blockhashFetcher/baseBlockhashFetcher.js +13 -0
  659. package/lib/node/tx/blockhashFetcher/cachedBlockhashFetcher.d.ts +28 -0
  660. package/lib/node/tx/blockhashFetcher/cachedBlockhashFetcher.js +73 -0
  661. package/lib/node/tx/blockhashFetcher/types.d.ts +4 -0
  662. package/lib/node/tx/blockhashFetcher/types.js +2 -0
  663. package/lib/node/tx/fastSingleTxSender.d.ts +41 -0
  664. package/lib/node/tx/fastSingleTxSender.js +86 -0
  665. package/lib/node/tx/forwardOnlyTxSender.d.ts +37 -0
  666. package/lib/node/tx/forwardOnlyTxSender.js +92 -0
  667. package/lib/node/tx/priorityFeeCalculator.d.ts +44 -0
  668. package/lib/node/tx/priorityFeeCalculator.js +85 -0
  669. package/lib/node/tx/reportTransactionError.d.ts +20 -0
  670. package/lib/node/tx/reportTransactionError.js +103 -0
  671. package/lib/node/tx/retryTxSender.d.ts +37 -0
  672. package/lib/node/tx/retryTxSender.js +86 -0
  673. package/lib/node/tx/txHandler.d.ts +154 -0
  674. package/lib/node/tx/txHandler.js +453 -0
  675. package/lib/node/tx/txParamProcessor.d.ts +25 -0
  676. package/lib/node/tx/txParamProcessor.js +88 -0
  677. package/lib/node/tx/types.d.ts +29 -0
  678. package/lib/node/tx/types.js +20 -0
  679. package/lib/node/tx/utils.d.ts +2 -0
  680. package/lib/node/tx/utils.js +10 -0
  681. package/lib/node/tx/whileValidTxSender.d.ts +45 -0
  682. package/lib/node/tx/whileValidTxSender.js +167 -0
  683. package/lib/node/types.d.ts +1385 -0
  684. package/lib/node/types.js +366 -0
  685. package/lib/node/user.d.ts +411 -0
  686. package/lib/node/user.js +2151 -0
  687. package/lib/node/userConfig.d.ts +26 -0
  688. package/lib/node/userConfig.js +2 -0
  689. package/lib/node/userMap/PollingSubscription.d.ts +16 -0
  690. package/lib/node/userMap/PollingSubscription.js +30 -0
  691. package/lib/node/userMap/WebsocketSubscription.d.ts +27 -0
  692. package/lib/node/userMap/WebsocketSubscription.js +45 -0
  693. package/lib/node/userMap/grpcSubscription.d.ts +27 -0
  694. package/lib/node/userMap/grpcSubscription.js +44 -0
  695. package/lib/node/userMap/referrerMap.d.ts +45 -0
  696. package/lib/node/userMap/referrerMap.js +181 -0
  697. package/lib/node/userMap/userMap.d.ts +90 -0
  698. package/lib/node/userMap/userMap.js +467 -0
  699. package/lib/node/userMap/userMapConfig.d.ts +39 -0
  700. package/lib/node/userMap/userMapConfig.js +2 -0
  701. package/lib/node/userMap/userStatsMap.d.ts +46 -0
  702. package/lib/node/userMap/userStatsMap.js +165 -0
  703. package/lib/node/userName.d.ts +5 -0
  704. package/lib/node/userName.js +21 -0
  705. package/lib/node/userStats.d.ts +22 -0
  706. package/lib/node/userStats.js +91 -0
  707. package/lib/node/userStatsConfig.d.ts +25 -0
  708. package/lib/node/userStatsConfig.js +2 -0
  709. package/lib/node/util/TransactionConfirmationManager.d.ts +16 -0
  710. package/lib/node/util/TransactionConfirmationManager.js +174 -0
  711. package/lib/node/util/chainClock.d.ts +17 -0
  712. package/lib/node/util/chainClock.js +29 -0
  713. package/lib/node/util/computeUnits.d.ts +8 -0
  714. package/lib/node/util/computeUnits.js +48 -0
  715. package/lib/node/util/digest.d.ts +4 -0
  716. package/lib/node/util/digest.js +14 -0
  717. package/lib/node/util/promiseTimeout.d.ts +1 -0
  718. package/lib/node/util/promiseTimeout.js +14 -0
  719. package/lib/node/util/pythOracleUtils.d.ts +17 -0
  720. package/lib/node/util/pythOracleUtils.js +107 -0
  721. package/lib/node/util/tps.d.ts +2 -0
  722. package/lib/node/util/tps.js +16 -0
  723. package/lib/node/wallet.d.ts +11 -0
  724. package/lib/node/wallet.js +32 -0
  725. package/package.json +92 -0
  726. package/scripts/postbuild.js +95 -0
  727. package/scripts/updateVersion.js +28 -0
  728. package/src/accounts/basicUserAccountSubscriber.ts +59 -0
  729. package/src/accounts/bulkAccountLoader.ts +294 -0
  730. package/src/accounts/bulkUserStatsSubscription.ts +33 -0
  731. package/src/accounts/bulkUserSubscription.ts +33 -0
  732. package/src/accounts/fetch.ts +66 -0
  733. package/src/accounts/grpcAccountSubscriber.ts +160 -0
  734. package/src/accounts/grpcDriftClientAccountSubscriber.ts +203 -0
  735. package/src/accounts/grpcInsuranceFundStakeAccountSubscriber.ts +56 -0
  736. package/src/accounts/grpcProgramAccountSubscriber.ts +190 -0
  737. package/src/accounts/grpcUserAccountSubscriber.ts +48 -0
  738. package/src/accounts/grpcUserStatsAccountSubscriber.ts +50 -0
  739. package/src/accounts/oneShotUserAccountSubscriber.ts +68 -0
  740. package/src/accounts/pollingDriftClientAccountSubscriber.ts +644 -0
  741. package/src/accounts/pollingHighLeverageModeConfigAccountSubscriber.ts +189 -0
  742. package/src/accounts/pollingInsuranceFundStakeAccountSubscriber.ts +185 -0
  743. package/src/accounts/pollingOracleAccountSubscriber.ts +125 -0
  744. package/src/accounts/pollingTokenAccountSubscriber.ts +118 -0
  745. package/src/accounts/pollingUserAccountSubscriber.ts +160 -0
  746. package/src/accounts/pollingUserStatsAccountSubscriber.ts +156 -0
  747. package/src/accounts/testBulkAccountLoader.ts +53 -0
  748. package/src/accounts/types.ts +245 -0
  749. package/src/accounts/utils.ts +62 -0
  750. package/src/accounts/webSocketAccountSubscriber.ts +205 -0
  751. package/src/accounts/webSocketDriftClientAccountSubscriber.ts +621 -0
  752. package/src/accounts/webSocketHighLeverageModeConfigAccountSubscriber.ts +131 -0
  753. package/src/accounts/webSocketInsuranceFundStakeAccountSubscriber.ts +129 -0
  754. package/src/accounts/webSocketProgramAccountSubscriber.ts +182 -0
  755. package/src/accounts/webSocketUserAccountSubscriber.ts +104 -0
  756. package/src/accounts/webSocketUserStatsAccountSubsriber.ts +98 -0
  757. package/src/addresses/marketAddresses.ts +17 -0
  758. package/src/addresses/pda.ts +355 -0
  759. package/src/adminClient.ts +4030 -0
  760. package/src/assert/assert.ts +5 -0
  761. package/src/auctionSubscriber/auctionSubscriber.ts +66 -0
  762. package/src/auctionSubscriber/auctionSubscriberGrpc.ts +70 -0
  763. package/src/auctionSubscriber/index.ts +3 -0
  764. package/src/auctionSubscriber/types.ts +20 -0
  765. package/src/bankrun/bankrunConnection.ts +534 -0
  766. package/src/blockhashSubscriber/BlockhashSubscriber.ts +126 -0
  767. package/src/blockhashSubscriber/index.ts +1 -0
  768. package/src/blockhashSubscriber/types.ts +12 -0
  769. package/src/clock/clockSubscriber.ts +121 -0
  770. package/src/config.ts +212 -0
  771. package/src/constants/numericConstants.ts +113 -0
  772. package/src/constants/perpMarkets.ts +1084 -0
  773. package/src/constants/spotMarkets.ts +565 -0
  774. package/src/constants/txConstants.ts +1 -0
  775. package/src/decode/phoenix.ts +207 -0
  776. package/src/decode/user.ts +368 -0
  777. package/src/dlob/DLOB.ts +1897 -0
  778. package/src/dlob/DLOBNode.ts +197 -0
  779. package/src/dlob/DLOBSubscriber.ts +201 -0
  780. package/src/dlob/NodeList.ts +173 -0
  781. package/src/dlob/orderBookLevels.ts +643 -0
  782. package/src/dlob/types.ts +22 -0
  783. package/src/driftClient.ts +9032 -0
  784. package/src/driftClientConfig.ts +60 -0
  785. package/src/events/eventList.ts +97 -0
  786. package/src/events/eventSubscriber.ts +364 -0
  787. package/src/events/eventsServerLogProvider.ts +152 -0
  788. package/src/events/fetchLogs.ts +169 -0
  789. package/src/events/parse.ts +133 -0
  790. package/src/events/pollingLogProvider.ts +89 -0
  791. package/src/events/sort.ts +39 -0
  792. package/src/events/txEventCache.ts +74 -0
  793. package/src/events/types.ts +185 -0
  794. package/src/events/webSocketLogProvider.ts +121 -0
  795. package/src/factory/bigNum.ts +660 -0
  796. package/src/factory/oracleClient.ts +72 -0
  797. package/src/idl/drift.json +14440 -0
  798. package/src/idl/openbook.json +3854 -0
  799. package/src/idl/pyth.json +142 -0
  800. package/src/idl/pyth_solana_receiver.json +628 -0
  801. package/src/idl/switchboard.json +8354 -0
  802. package/src/idl/switchboard_on_demand_30.json +4546 -0
  803. package/src/idl/token_faucet.json +142 -0
  804. package/src/index.ts +127 -0
  805. package/src/isomorphic/README.md +19 -0
  806. package/src/isomorphic/grpc.browser.ts +4 -0
  807. package/src/isomorphic/grpc.node.ts +23 -0
  808. package/src/isomorphic/grpc.ts +1 -0
  809. package/src/jupiter/jupiterClient.ts +510 -0
  810. package/src/keypair.ts +24 -0
  811. package/src/marinade/idl/idl.json +1962 -0
  812. package/src/marinade/index.ts +64 -0
  813. package/src/marinade/types.ts +3925 -0
  814. package/src/math/amm.ts +1162 -0
  815. package/src/math/auction.ts +173 -0
  816. package/src/math/bankruptcy.ts +34 -0
  817. package/src/math/conversion.ts +13 -0
  818. package/src/math/exchangeStatus.ts +121 -0
  819. package/src/math/fuel.ts +70 -0
  820. package/src/math/funding.ts +342 -0
  821. package/src/math/insurance.ts +110 -0
  822. package/src/math/margin.ts +340 -0
  823. package/src/math/market.ts +336 -0
  824. package/src/math/oracles.ts +228 -0
  825. package/src/math/orders.ts +343 -0
  826. package/src/math/position.ts +324 -0
  827. package/src/math/repeg.ts +214 -0
  828. package/src/math/spotBalance.ts +630 -0
  829. package/src/math/spotMarket.ts +82 -0
  830. package/src/math/spotPosition.ts +184 -0
  831. package/src/math/state.ts +29 -0
  832. package/src/math/superStake.ts +525 -0
  833. package/src/math/tiers.ts +44 -0
  834. package/src/math/trade.ts +993 -0
  835. package/src/math/userStatus.ts +5 -0
  836. package/src/math/utils.ts +120 -0
  837. package/src/memcmp.ts +94 -0
  838. package/src/openbook/openbookV2FulfillmentConfigMap.ts +29 -0
  839. package/src/openbook/openbookV2Subscriber.ts +165 -0
  840. package/src/oracles/oracleClientCache.ts +25 -0
  841. package/src/oracles/oracleId.ts +28 -0
  842. package/src/oracles/prelaunchOracleClient.ts +37 -0
  843. package/src/oracles/pythClient.ts +85 -0
  844. package/src/oracles/pythLazerClient.ts +102 -0
  845. package/src/oracles/pythPullClient.ts +111 -0
  846. package/src/oracles/quoteAssetOracleClient.ts +25 -0
  847. package/src/oracles/strictOraclePrice.ts +19 -0
  848. package/src/oracles/switchboardClient.ts +77 -0
  849. package/src/oracles/switchboardOnDemandClient.ts +56 -0
  850. package/src/oracles/types.ts +23 -0
  851. package/src/orderParams.ts +79 -0
  852. package/src/orderSubscriber/OrderSubscriber.ts +249 -0
  853. package/src/orderSubscriber/PollingSubscription.ts +39 -0
  854. package/src/orderSubscriber/WebsocketSubscription.ts +119 -0
  855. package/src/orderSubscriber/grpcSubscription.ts +121 -0
  856. package/src/orderSubscriber/index.ts +2 -0
  857. package/src/orderSubscriber/types.ts +54 -0
  858. package/src/phoenix/phoenixFulfillmentConfigMap.ts +26 -0
  859. package/src/phoenix/phoenixSubscriber.ts +235 -0
  860. package/src/priorityFee/averageOverSlotsStrategy.ts +16 -0
  861. package/src/priorityFee/averageStrategy.ts +12 -0
  862. package/src/priorityFee/driftPriorityFeeMethod.ts +42 -0
  863. package/src/priorityFee/ewmaStrategy.ts +41 -0
  864. package/src/priorityFee/heliusPriorityFeeMethod.ts +57 -0
  865. package/src/priorityFee/index.ts +11 -0
  866. package/src/priorityFee/maxOverSlotsStrategy.ts +17 -0
  867. package/src/priorityFee/maxStrategy.ts +7 -0
  868. package/src/priorityFee/priorityFeeSubscriber.ts +251 -0
  869. package/src/priorityFee/priorityFeeSubscriberMap.ts +112 -0
  870. package/src/priorityFee/solanaPriorityFeeMethod.ts +34 -0
  871. package/src/priorityFee/types.ts +60 -0
  872. package/src/serum/serumFulfillmentConfigMap.ts +26 -0
  873. package/src/serum/serumSubscriber.ts +169 -0
  874. package/src/serum/types.ts +17 -0
  875. package/src/slot/SlotSubscriber.ts +101 -0
  876. package/src/slot/SlothashSubscriber.ts +126 -0
  877. package/src/testClient.ts +41 -0
  878. package/src/token/index.ts +13 -0
  879. package/src/tokenFaucet.ts +269 -0
  880. package/src/tx/baseTxSender.ts +477 -0
  881. package/src/tx/blockhashFetcher/baseBlockhashFetcher.ts +19 -0
  882. package/src/tx/blockhashFetcher/cachedBlockhashFetcher.ts +90 -0
  883. package/src/tx/blockhashFetcher/types.ts +5 -0
  884. package/src/tx/fastSingleTxSender.ts +142 -0
  885. package/src/tx/forwardOnlyTxSender.ts +145 -0
  886. package/src/tx/priorityFeeCalculator.ts +117 -0
  887. package/src/tx/reportTransactionError.ts +159 -0
  888. package/src/tx/retryTxSender.ts +135 -0
  889. package/src/tx/txHandler.ts +737 -0
  890. package/src/tx/txParamProcessor.ts +155 -0
  891. package/src/tx/types.ts +71 -0
  892. package/src/tx/utils.ts +11 -0
  893. package/src/tx/whileValidTxSender.ts +265 -0
  894. package/src/types.ts +1386 -0
  895. package/src/user.ts +4054 -0
  896. package/src/userConfig.ts +32 -0
  897. package/src/userMap/PollingSubscription.ts +47 -0
  898. package/src/userMap/WebsocketSubscription.ts +84 -0
  899. package/src/userMap/grpcSubscription.ts +85 -0
  900. package/src/userMap/referrerMap.ts +267 -0
  901. package/src/userMap/userMap.ts +654 -0
  902. package/src/userMap/userMapConfig.ts +63 -0
  903. package/src/userMap/userStatsMap.ts +218 -0
  904. package/src/userName.ts +21 -0
  905. package/src/userStats.ts +174 -0
  906. package/src/userStatsConfig.ts +31 -0
  907. package/src/util/TransactionConfirmationManager.ts +292 -0
  908. package/src/util/chainClock.ts +41 -0
  909. package/src/util/computeUnits.ts +65 -0
  910. package/src/util/digest.ts +11 -0
  911. package/src/util/promiseTimeout.ts +14 -0
  912. package/src/util/pythOracleUtils.ts +136 -0
  913. package/src/util/tps.ts +27 -0
  914. package/src/wallet.ts +43 -0
  915. package/tests/amm/test.ts +2092 -0
  916. package/tests/auctions/test.ts +81 -0
  917. package/tests/bn/test.ts +341 -0
  918. package/tests/ci/idl.ts +101 -0
  919. package/tests/ci/verifyConstants.ts +278 -0
  920. package/tests/decode/phoenix.ts +71 -0
  921. package/tests/decode/test.ts +266 -0
  922. package/tests/decode/userAccountBufferStrings.ts +102 -0
  923. package/tests/dlob/helpers.ts +749 -0
  924. package/tests/dlob/test.ts +6623 -0
  925. package/tests/insurance/test.ts +40 -0
  926. package/tests/spot/test.ts +226 -0
  927. package/tests/subscriber/openbook.ts +62 -0
  928. package/tests/tx/TransactionConfirmationManager.test.ts +305 -0
  929. package/tests/tx/cachedBlockhashFetcher.test.ts +96 -0
  930. package/tests/tx/priorityFeeCalculator.ts +77 -0
  931. package/tests/tx/priorityFeeStrategy.ts +95 -0
  932. package/tests/user/helpers.ts +92 -0
  933. package/tests/user/test.ts +517 -0
  934. package/tsconfig.browser.json +13 -0
  935. package/tsconfig.json +13 -0
@@ -0,0 +1,1897 @@
1
+ import { getOrderSignature, NodeList } from './NodeList';
2
+ import {
3
+ BASE_PRECISION,
4
+ BN,
5
+ BN_MAX,
6
+ convertToNumber,
7
+ decodeName,
8
+ DLOBNode,
9
+ DLOBNodeType,
10
+ DriftClient,
11
+ getLimitPrice,
12
+ getVariant,
13
+ isFallbackAvailableLiquiditySource,
14
+ isOneOfVariant,
15
+ isOrderExpired,
16
+ isRestingLimitOrder,
17
+ isTriggered,
18
+ isUserProtectedMaker,
19
+ isVariant,
20
+ MarketType,
21
+ MarketTypeStr,
22
+ mustBeTriggered,
23
+ OraclePriceData,
24
+ Order,
25
+ PerpMarketAccount,
26
+ PositionDirection,
27
+ PRICE_PRECISION,
28
+ QUOTE_PRECISION,
29
+ SlotSubscriber,
30
+ SpotMarketAccount,
31
+ StateAccount,
32
+ TriggerOrderNode,
33
+ UserMap,
34
+ ZERO,
35
+ } from '..';
36
+ import { PublicKey } from '@solana/web3.js';
37
+ import { ammPaused, exchangePaused, fillPaused } from '../math/exchangeStatus';
38
+ import {
39
+ createL2Levels,
40
+ getL2GeneratorFromDLOBNodes,
41
+ L2OrderBook,
42
+ L2OrderBookGenerator,
43
+ L3Level,
44
+ L3OrderBook,
45
+ mergeL2LevelGenerators,
46
+ } from './orderBookLevels';
47
+
48
+ export type DLOBOrder = { user: PublicKey; order: Order };
49
+ export type DLOBOrders = DLOBOrder[];
50
+
51
+ export type MarketNodeLists = {
52
+ restingLimit: {
53
+ ask: NodeList<'restingLimit'>;
54
+ bid: NodeList<'restingLimit'>;
55
+ };
56
+ floatingLimit: {
57
+ ask: NodeList<'floatingLimit'>;
58
+ bid: NodeList<'floatingLimit'>;
59
+ };
60
+ takingLimit: {
61
+ ask: NodeList<'takingLimit'>;
62
+ bid: NodeList<'takingLimit'>;
63
+ };
64
+ market: {
65
+ ask: NodeList<'market'>;
66
+ bid: NodeList<'market'>;
67
+ };
68
+ trigger: {
69
+ above: NodeList<'trigger'>;
70
+ below: NodeList<'trigger'>;
71
+ };
72
+ swift: {
73
+ ask: NodeList<'swift'>;
74
+ bid: NodeList<'swift'>;
75
+ };
76
+ };
77
+
78
+ type OrderBookCallback = () => void;
79
+
80
+ /**
81
+ * Receives a DLOBNode and is expected to return true if the node should
82
+ * be taken into account when generating, or false otherwise.
83
+ *
84
+ * Currently used in functions that rely on getBestNode
85
+ */
86
+ export type DLOBFilterFcn = (node: DLOBNode) => boolean;
87
+
88
+ export type NodeToFill = {
89
+ node: DLOBNode;
90
+ makerNodes: DLOBNode[];
91
+ };
92
+
93
+ export type NodeToTrigger = {
94
+ node: TriggerOrderNode;
95
+ };
96
+
97
+ const SUPPORTED_ORDER_TYPES = [
98
+ 'market',
99
+ 'limit',
100
+ 'triggerMarket',
101
+ 'triggerLimit',
102
+ 'oracle',
103
+ ];
104
+
105
+ export class DLOB {
106
+ openOrders = new Map<MarketTypeStr, Set<string>>();
107
+ orderLists = new Map<MarketTypeStr, Map<number, MarketNodeLists>>();
108
+ maxSlotForRestingLimitOrders = 0;
109
+
110
+ initialized = false;
111
+
112
+ public constructor() {
113
+ this.init();
114
+ }
115
+
116
+ private init() {
117
+ this.openOrders.set('perp', new Set<string>());
118
+ this.openOrders.set('spot', new Set<string>());
119
+ this.orderLists.set('perp', new Map<number, MarketNodeLists>());
120
+ this.orderLists.set('spot', new Map<number, MarketNodeLists>());
121
+ }
122
+
123
+ public clear() {
124
+ for (const marketType of this.openOrders.keys()) {
125
+ this.openOrders.get(marketType).clear();
126
+ }
127
+ this.openOrders.clear();
128
+
129
+ for (const marketType of this.orderLists.keys()) {
130
+ for (const marketIndex of this.orderLists.get(marketType).keys()) {
131
+ const marketNodeLists = this.orderLists
132
+ .get(marketType)
133
+ .get(marketIndex);
134
+ for (const side of Object.keys(marketNodeLists)) {
135
+ for (const orderType of Object.keys(marketNodeLists[side])) {
136
+ marketNodeLists[side][orderType].clear();
137
+ }
138
+ }
139
+ }
140
+ }
141
+ this.orderLists.clear();
142
+
143
+ this.maxSlotForRestingLimitOrders = 0;
144
+
145
+ this.init();
146
+ }
147
+
148
+ /**
149
+ * initializes a new DLOB instance
150
+ *
151
+ * @returns a promise that resolves when the DLOB is initialized
152
+ */
153
+ public async initFromUserMap(
154
+ userMap: UserMap,
155
+ slot: number
156
+ ): Promise<boolean> {
157
+ if (this.initialized) {
158
+ return false;
159
+ }
160
+
161
+ // initialize the dlob with the user map
162
+ for (const user of userMap.values()) {
163
+ const userAccount = user.getUserAccount();
164
+ const userAccountPubkey = user.getUserAccountPublicKey();
165
+ const userAccountPubkeyString = userAccountPubkey.toString();
166
+ const protectedMaker = isUserProtectedMaker(userAccount);
167
+
168
+ for (const order of userAccount.orders) {
169
+ this.insertOrder(order, userAccountPubkeyString, slot, protectedMaker);
170
+ }
171
+ }
172
+
173
+ this.initialized = true;
174
+ return true;
175
+ }
176
+
177
+ public insertOrder(
178
+ order: Order,
179
+ userAccount: string,
180
+ slot: number,
181
+ isUserProtectedMaker: boolean,
182
+ onInsert?: OrderBookCallback
183
+ ): void {
184
+ if (isVariant(order.status, 'init')) {
185
+ return;
186
+ }
187
+
188
+ if (!isOneOfVariant(order.orderType, SUPPORTED_ORDER_TYPES)) {
189
+ return;
190
+ }
191
+
192
+ const marketType = getVariant(order.marketType) as MarketTypeStr;
193
+
194
+ if (!this.orderLists.get(marketType).has(order.marketIndex)) {
195
+ this.addOrderList(marketType, order.marketIndex);
196
+ }
197
+
198
+ if (isVariant(order.status, 'open')) {
199
+ this.openOrders
200
+ .get(marketType)
201
+ .add(getOrderSignature(order.orderId, userAccount));
202
+ }
203
+ this.getListForOnChainOrder(order, slot)?.insert(
204
+ order,
205
+ marketType,
206
+ userAccount,
207
+ isUserProtectedMaker
208
+ );
209
+
210
+ if (onInsert) {
211
+ onInsert();
212
+ }
213
+ }
214
+
215
+ public insertSwiftOrder(
216
+ order: Order,
217
+ userAccount: string,
218
+ isUserProtectedMaker: boolean,
219
+ onInsert?: OrderBookCallback
220
+ ): void {
221
+ const marketType = getVariant(order.marketType) as MarketTypeStr;
222
+ const marketIndex = order.marketIndex;
223
+ const bidOrAsk = isVariant(order.direction, 'long') ? 'bid' : 'ask';
224
+ if (!this.orderLists.get(marketType).has(order.marketIndex)) {
225
+ this.addOrderList(marketType, order.marketIndex);
226
+ }
227
+ this.openOrders
228
+ .get(marketType)
229
+ .add(getOrderSignature(order.orderId, userAccount));
230
+ this.orderLists
231
+ .get(marketType)
232
+ .get(marketIndex)
233
+ .swift[bidOrAsk].insert(
234
+ order,
235
+ marketType,
236
+ userAccount,
237
+ isUserProtectedMaker
238
+ );
239
+ if (onInsert) {
240
+ onInsert();
241
+ }
242
+ }
243
+
244
+ addOrderList(marketType: MarketTypeStr, marketIndex: number): void {
245
+ this.orderLists.get(marketType).set(marketIndex, {
246
+ restingLimit: {
247
+ ask: new NodeList('restingLimit', 'asc'),
248
+ bid: new NodeList('restingLimit', 'desc'),
249
+ },
250
+ floatingLimit: {
251
+ ask: new NodeList('floatingLimit', 'asc'),
252
+ bid: new NodeList('floatingLimit', 'desc'),
253
+ },
254
+ takingLimit: {
255
+ ask: new NodeList('takingLimit', 'asc'),
256
+ bid: new NodeList('takingLimit', 'asc'), // always sort ascending for market orders
257
+ },
258
+ market: {
259
+ ask: new NodeList('market', 'asc'),
260
+ bid: new NodeList('market', 'asc'), // always sort ascending for market orders
261
+ },
262
+ trigger: {
263
+ above: new NodeList('trigger', 'asc'),
264
+ below: new NodeList('trigger', 'desc'),
265
+ },
266
+ swift: {
267
+ ask: new NodeList('swift', 'asc'),
268
+ bid: new NodeList('swift', 'asc'),
269
+ },
270
+ });
271
+ }
272
+
273
+ public getListForOnChainOrder(
274
+ order: Order,
275
+ slot: number
276
+ ): NodeList<any> | undefined {
277
+ const isInactiveTriggerOrder =
278
+ mustBeTriggered(order) && !isTriggered(order);
279
+
280
+ let type: DLOBNodeType;
281
+ if (isInactiveTriggerOrder) {
282
+ type = 'trigger';
283
+ } else if (
284
+ isOneOfVariant(order.orderType, ['market', 'triggerMarket', 'oracle'])
285
+ ) {
286
+ type = 'market';
287
+ } else if (order.oraclePriceOffset !== 0) {
288
+ type = 'floatingLimit';
289
+ } else {
290
+ const isResting = isRestingLimitOrder(order, slot);
291
+ type = isResting ? 'restingLimit' : 'takingLimit';
292
+ }
293
+
294
+ let subType: string;
295
+ if (isInactiveTriggerOrder) {
296
+ subType = isVariant(order.triggerCondition, 'above') ? 'above' : 'below';
297
+ } else {
298
+ subType = isVariant(order.direction, 'long') ? 'bid' : 'ask';
299
+ }
300
+
301
+ const marketType = getVariant(order.marketType) as MarketTypeStr;
302
+
303
+ if (!this.orderLists.has(marketType)) {
304
+ return undefined;
305
+ }
306
+
307
+ return this.orderLists.get(marketType).get(order.marketIndex)[type][
308
+ subType
309
+ ];
310
+ }
311
+
312
+ public updateRestingLimitOrders(slot: number): void {
313
+ if (slot <= this.maxSlotForRestingLimitOrders) {
314
+ return;
315
+ }
316
+
317
+ this.maxSlotForRestingLimitOrders = slot;
318
+
319
+ this.updateRestingLimitOrdersForMarketType(slot, 'perp');
320
+
321
+ this.updateRestingLimitOrdersForMarketType(slot, 'spot');
322
+ }
323
+
324
+ updateRestingLimitOrdersForMarketType(
325
+ slot: number,
326
+ marketTypeStr: MarketTypeStr
327
+ ): void {
328
+ for (const [_, nodeLists] of this.orderLists.get(marketTypeStr)) {
329
+ const nodesToUpdate = [];
330
+ for (const node of nodeLists.takingLimit.ask.getGenerator()) {
331
+ if (!isRestingLimitOrder(node.order, slot)) {
332
+ continue;
333
+ }
334
+
335
+ nodesToUpdate.push({
336
+ side: 'ask',
337
+ node,
338
+ });
339
+ }
340
+
341
+ for (const node of nodeLists.takingLimit.bid.getGenerator()) {
342
+ if (!isRestingLimitOrder(node.order, slot)) {
343
+ continue;
344
+ }
345
+
346
+ nodesToUpdate.push({
347
+ side: 'bid',
348
+ node,
349
+ });
350
+ }
351
+
352
+ for (const nodeToUpdate of nodesToUpdate) {
353
+ const { side, node } = nodeToUpdate;
354
+ nodeLists.takingLimit[side].remove(node.order, node.userAccount);
355
+ nodeLists.restingLimit[side].insert(
356
+ node.order,
357
+ marketTypeStr,
358
+ node.userAccount
359
+ );
360
+ }
361
+ }
362
+ }
363
+
364
+ public getOrder(orderId: number, userAccount: PublicKey): Order | undefined {
365
+ const orderSignature = getOrderSignature(orderId, userAccount.toString());
366
+ for (const nodeList of this.getNodeLists()) {
367
+ const node = nodeList.get(orderSignature);
368
+ if (node) {
369
+ return node.order;
370
+ }
371
+ }
372
+
373
+ return undefined;
374
+ }
375
+
376
+ public findNodesToFill(
377
+ marketIndex: number,
378
+ fallbackBid: BN | undefined,
379
+ fallbackAsk: BN | undefined,
380
+ slot: number,
381
+ ts: number,
382
+ marketType: MarketType,
383
+ oraclePriceData: OraclePriceData,
384
+ stateAccount: StateAccount,
385
+ marketAccount: PerpMarketAccount | SpotMarketAccount
386
+ ): NodeToFill[] {
387
+ if (fillPaused(stateAccount, marketAccount)) {
388
+ return [];
389
+ }
390
+
391
+ const isAmmPaused = ammPaused(stateAccount, marketAccount);
392
+
393
+ const minAuctionDuration = isVariant(marketType, 'perp')
394
+ ? stateAccount.minPerpAuctionDuration
395
+ : 0;
396
+
397
+ const { makerRebateNumerator, makerRebateDenominator } =
398
+ this.getMakerRebate(marketType, stateAccount, marketAccount);
399
+
400
+ const takingOrderNodesToFill: Array<NodeToFill> =
401
+ this.findTakingNodesToFill(
402
+ marketIndex,
403
+ slot,
404
+ marketType,
405
+ oraclePriceData,
406
+ isAmmPaused,
407
+ minAuctionDuration,
408
+ fallbackAsk,
409
+ fallbackBid
410
+ );
411
+
412
+ const restingLimitOrderNodesToFill: Array<NodeToFill> =
413
+ this.findRestingLimitOrderNodesToFill(
414
+ marketIndex,
415
+ slot,
416
+ marketType,
417
+ oraclePriceData,
418
+ isAmmPaused,
419
+ minAuctionDuration,
420
+ makerRebateNumerator,
421
+ makerRebateDenominator,
422
+ fallbackAsk,
423
+ fallbackBid
424
+ );
425
+
426
+ // get expired market nodes
427
+ const expiredNodesToFill = this.findExpiredNodesToFill(
428
+ marketIndex,
429
+ ts,
430
+ marketType,
431
+ new BN(slot)
432
+ );
433
+
434
+ return this.mergeNodesToFill(
435
+ restingLimitOrderNodesToFill,
436
+ takingOrderNodesToFill
437
+ ).concat(expiredNodesToFill);
438
+ }
439
+
440
+ getMakerRebate(
441
+ marketType: MarketType,
442
+ stateAccount: StateAccount,
443
+ marketAccount: PerpMarketAccount | SpotMarketAccount
444
+ ): { makerRebateNumerator: number; makerRebateDenominator: number } {
445
+ let makerRebateNumerator: number;
446
+ let makerRebateDenominator: number;
447
+ if (isVariant(marketType, 'perp')) {
448
+ makerRebateNumerator =
449
+ stateAccount.perpFeeStructure.feeTiers[0].makerRebateNumerator;
450
+ makerRebateDenominator =
451
+ stateAccount.perpFeeStructure.feeTiers[0].makerRebateDenominator;
452
+ } else {
453
+ makerRebateNumerator =
454
+ stateAccount.spotFeeStructure.feeTiers[0].makerRebateNumerator;
455
+ makerRebateDenominator =
456
+ stateAccount.spotFeeStructure.feeTiers[0].makerRebateDenominator;
457
+ }
458
+
459
+ // @ts-ignore
460
+ const feeAdjustment = marketAccount.feeAdjustment || 0;
461
+ if (feeAdjustment !== 0) {
462
+ makerRebateNumerator += (makerRebateNumerator * feeAdjustment) / 100;
463
+ }
464
+
465
+ return { makerRebateNumerator, makerRebateDenominator };
466
+ }
467
+
468
+ mergeNodesToFill(
469
+ restingLimitOrderNodesToFill: NodeToFill[],
470
+ takingOrderNodesToFill: NodeToFill[]
471
+ ): NodeToFill[] {
472
+ const mergedNodesToFill = new Map<string, NodeToFill>();
473
+
474
+ const mergeNodesToFillHelper = (nodesToFillArray: NodeToFill[]) => {
475
+ nodesToFillArray.forEach((nodeToFill) => {
476
+ const nodeSignature = getOrderSignature(
477
+ nodeToFill.node.order.orderId,
478
+ nodeToFill.node.userAccount
479
+ );
480
+
481
+ if (!mergedNodesToFill.has(nodeSignature)) {
482
+ mergedNodesToFill.set(nodeSignature, {
483
+ node: nodeToFill.node,
484
+ makerNodes: [],
485
+ });
486
+ }
487
+
488
+ if (nodeToFill.makerNodes) {
489
+ mergedNodesToFill
490
+ .get(nodeSignature)
491
+ .makerNodes.push(...nodeToFill.makerNodes);
492
+ }
493
+ });
494
+ };
495
+
496
+ mergeNodesToFillHelper(restingLimitOrderNodesToFill);
497
+ mergeNodesToFillHelper(takingOrderNodesToFill);
498
+
499
+ return Array.from(mergedNodesToFill.values());
500
+ }
501
+
502
+ public findRestingLimitOrderNodesToFill(
503
+ marketIndex: number,
504
+ slot: number,
505
+ marketType: MarketType,
506
+ oraclePriceData: OraclePriceData,
507
+ isAmmPaused: boolean,
508
+ minAuctionDuration: number,
509
+ makerRebateNumerator: number,
510
+ makerRebateDenominator: number,
511
+ fallbackAsk: BN | undefined,
512
+ fallbackBid: BN | undefined
513
+ ): NodeToFill[] {
514
+ const nodesToFill = new Array<NodeToFill>();
515
+
516
+ const crossingNodes = this.findCrossingRestingLimitOrders(
517
+ marketIndex,
518
+ slot,
519
+ marketType,
520
+ oraclePriceData
521
+ );
522
+
523
+ for (const crossingNode of crossingNodes) {
524
+ nodesToFill.push(crossingNode);
525
+ }
526
+
527
+ if (fallbackBid && !isAmmPaused) {
528
+ const askGenerator = this.getRestingLimitAsks(
529
+ marketIndex,
530
+ slot,
531
+ marketType,
532
+ oraclePriceData
533
+ );
534
+
535
+ const fallbackBidWithBuffer = fallbackBid.sub(
536
+ fallbackBid.muln(makerRebateNumerator).divn(makerRebateDenominator)
537
+ );
538
+
539
+ const asksCrossingFallback = this.findNodesCrossingFallbackLiquidity(
540
+ marketType,
541
+ slot,
542
+ oraclePriceData,
543
+ askGenerator,
544
+ (askPrice) => {
545
+ return askPrice.lte(fallbackBidWithBuffer);
546
+ },
547
+ minAuctionDuration
548
+ );
549
+
550
+ for (const askCrossingFallback of asksCrossingFallback) {
551
+ nodesToFill.push(askCrossingFallback);
552
+ }
553
+ }
554
+
555
+ if (fallbackAsk && !isAmmPaused) {
556
+ const bidGenerator = this.getRestingLimitBids(
557
+ marketIndex,
558
+ slot,
559
+ marketType,
560
+ oraclePriceData
561
+ );
562
+
563
+ const fallbackAskWithBuffer = fallbackAsk.add(
564
+ fallbackAsk.muln(makerRebateNumerator).divn(makerRebateDenominator)
565
+ );
566
+
567
+ const bidsCrossingFallback = this.findNodesCrossingFallbackLiquidity(
568
+ marketType,
569
+ slot,
570
+ oraclePriceData,
571
+ bidGenerator,
572
+ (bidPrice) => {
573
+ return bidPrice.gte(fallbackAskWithBuffer);
574
+ },
575
+ minAuctionDuration
576
+ );
577
+
578
+ for (const bidCrossingFallback of bidsCrossingFallback) {
579
+ nodesToFill.push(bidCrossingFallback);
580
+ }
581
+ }
582
+
583
+ return nodesToFill;
584
+ }
585
+
586
+ public findTakingNodesToFill(
587
+ marketIndex: number,
588
+ slot: number,
589
+ marketType: MarketType,
590
+ oraclePriceData: OraclePriceData,
591
+ isAmmPaused: boolean,
592
+ minAuctionDuration: number,
593
+ fallbackAsk: BN | undefined,
594
+ fallbackBid?: BN | undefined
595
+ ): NodeToFill[] {
596
+ const nodesToFill = new Array<NodeToFill>();
597
+
598
+ let takingOrderGenerator = this.getTakingAsks(
599
+ marketIndex,
600
+ marketType,
601
+ slot,
602
+ oraclePriceData
603
+ );
604
+
605
+ const takingAsksCrossingBids = this.findTakingNodesCrossingMakerNodes(
606
+ marketIndex,
607
+ slot,
608
+ marketType,
609
+ oraclePriceData,
610
+ takingOrderGenerator,
611
+ this.getRestingLimitBids.bind(this),
612
+ (takerPrice, makerPrice) => {
613
+ if (isVariant(marketType, 'spot')) {
614
+ if (takerPrice === undefined) {
615
+ return false;
616
+ }
617
+
618
+ if (fallbackBid && makerPrice.lt(fallbackBid)) {
619
+ return false;
620
+ }
621
+ }
622
+ return takerPrice === undefined || takerPrice.lte(makerPrice);
623
+ }
624
+ );
625
+ for (const takingAskCrossingBid of takingAsksCrossingBids) {
626
+ nodesToFill.push(takingAskCrossingBid);
627
+ }
628
+
629
+ if (fallbackBid && !isAmmPaused) {
630
+ takingOrderGenerator = this.getTakingAsks(
631
+ marketIndex,
632
+ marketType,
633
+ slot,
634
+ oraclePriceData
635
+ );
636
+ const takingAsksCrossingFallback =
637
+ this.findNodesCrossingFallbackLiquidity(
638
+ marketType,
639
+ slot,
640
+ oraclePriceData,
641
+ takingOrderGenerator,
642
+ (takerPrice) => {
643
+ return takerPrice === undefined || takerPrice.lte(fallbackBid);
644
+ },
645
+ minAuctionDuration
646
+ );
647
+
648
+ for (const takingAskCrossingFallback of takingAsksCrossingFallback) {
649
+ nodesToFill.push(takingAskCrossingFallback);
650
+ }
651
+ }
652
+
653
+ takingOrderGenerator = this.getTakingBids(
654
+ marketIndex,
655
+ marketType,
656
+ slot,
657
+ oraclePriceData
658
+ );
659
+
660
+ const takingBidsToFill = this.findTakingNodesCrossingMakerNodes(
661
+ marketIndex,
662
+ slot,
663
+ marketType,
664
+ oraclePriceData,
665
+ takingOrderGenerator,
666
+ this.getRestingLimitAsks.bind(this),
667
+ (takerPrice, makerPrice) => {
668
+ if (isVariant(marketType, 'spot')) {
669
+ if (takerPrice === undefined) {
670
+ return false;
671
+ }
672
+
673
+ if (fallbackAsk && makerPrice.gt(fallbackAsk)) {
674
+ return false;
675
+ }
676
+ }
677
+
678
+ return takerPrice === undefined || takerPrice.gte(makerPrice);
679
+ }
680
+ );
681
+
682
+ for (const takingBidToFill of takingBidsToFill) {
683
+ nodesToFill.push(takingBidToFill);
684
+ }
685
+
686
+ if (fallbackAsk && !isAmmPaused) {
687
+ takingOrderGenerator = this.getTakingBids(
688
+ marketIndex,
689
+ marketType,
690
+ slot,
691
+ oraclePriceData
692
+ );
693
+ const takingBidsCrossingFallback =
694
+ this.findNodesCrossingFallbackLiquidity(
695
+ marketType,
696
+ slot,
697
+ oraclePriceData,
698
+ takingOrderGenerator,
699
+ (takerPrice) => {
700
+ return takerPrice === undefined || takerPrice.gte(fallbackAsk);
701
+ },
702
+ minAuctionDuration
703
+ );
704
+ for (const marketBidCrossingFallback of takingBidsCrossingFallback) {
705
+ nodesToFill.push(marketBidCrossingFallback);
706
+ }
707
+ }
708
+
709
+ return nodesToFill;
710
+ }
711
+
712
+ public findTakingNodesCrossingMakerNodes(
713
+ marketIndex: number,
714
+ slot: number,
715
+ marketType: MarketType,
716
+ oraclePriceData: OraclePriceData,
717
+ takerNodeGenerator: Generator<DLOBNode>,
718
+ makerNodeGeneratorFn: (
719
+ marketIndex: number,
720
+ slot: number,
721
+ marketType: MarketType,
722
+ oraclePriceData: OraclePriceData
723
+ ) => Generator<DLOBNode>,
724
+ doesCross: (takerPrice: BN | undefined, makerPrice: BN) => boolean
725
+ ): NodeToFill[] {
726
+ const nodesToFill = new Array<NodeToFill>();
727
+
728
+ for (const takerNode of takerNodeGenerator) {
729
+ const makerNodeGenerator = makerNodeGeneratorFn(
730
+ marketIndex,
731
+ slot,
732
+ marketType,
733
+ oraclePriceData
734
+ );
735
+
736
+ for (const makerNode of makerNodeGenerator) {
737
+ // Can't match orders from the same user
738
+ const sameUser = takerNode.userAccount === makerNode.userAccount;
739
+ if (sameUser) {
740
+ continue;
741
+ }
742
+
743
+ const makerPrice = makerNode.getPrice(oraclePriceData, slot);
744
+ const takerPrice = takerNode.getPrice(oraclePriceData, slot);
745
+
746
+ const ordersCross = doesCross(takerPrice, makerPrice);
747
+ if (!ordersCross) {
748
+ // market orders aren't sorted by price, they are sorted by time, so we need to traverse
749
+ // through all of em
750
+ break;
751
+ }
752
+
753
+ nodesToFill.push({
754
+ node: takerNode,
755
+ makerNodes: [makerNode],
756
+ });
757
+
758
+ const makerOrder = makerNode.order;
759
+ const takerOrder = takerNode.order;
760
+
761
+ const makerBaseRemaining = makerOrder.baseAssetAmount.sub(
762
+ makerOrder.baseAssetAmountFilled
763
+ );
764
+ const takerBaseRemaining = takerOrder.baseAssetAmount.sub(
765
+ takerOrder.baseAssetAmountFilled
766
+ );
767
+
768
+ const baseFilled = BN.min(makerBaseRemaining, takerBaseRemaining);
769
+
770
+ const newMakerOrder = { ...makerOrder };
771
+ newMakerOrder.baseAssetAmountFilled =
772
+ makerOrder.baseAssetAmountFilled.add(baseFilled);
773
+ this.getListForOnChainOrder(newMakerOrder, slot).update(
774
+ newMakerOrder,
775
+ makerNode.userAccount
776
+ );
777
+
778
+ const newTakerOrder = { ...takerOrder };
779
+ newTakerOrder.baseAssetAmountFilled =
780
+ takerOrder.baseAssetAmountFilled.add(baseFilled);
781
+ this.getListForOnChainOrder(newTakerOrder, slot).update(
782
+ newTakerOrder,
783
+ takerNode.userAccount
784
+ );
785
+
786
+ if (
787
+ newTakerOrder.baseAssetAmountFilled.eq(takerOrder.baseAssetAmount)
788
+ ) {
789
+ break;
790
+ }
791
+ }
792
+ }
793
+
794
+ return nodesToFill;
795
+ }
796
+
797
+ public findNodesCrossingFallbackLiquidity(
798
+ marketType: MarketType,
799
+ slot: number,
800
+ oraclePriceData: OraclePriceData,
801
+ nodeGenerator: Generator<DLOBNode>,
802
+ doesCross: (nodePrice: BN | undefined) => boolean,
803
+ minAuctionDuration: number
804
+ ): NodeToFill[] {
805
+ const nodesToFill = new Array<NodeToFill>();
806
+
807
+ let nextNode = nodeGenerator.next();
808
+ while (!nextNode.done) {
809
+ const node = nextNode.value;
810
+
811
+ if (isVariant(marketType, 'spot') && node.order?.postOnly) {
812
+ nextNode = nodeGenerator.next();
813
+ continue;
814
+ }
815
+
816
+ const nodePrice = getLimitPrice(node.order, oraclePriceData, slot);
817
+
818
+ // order crosses if there is no limit price or it crosses fallback price
819
+ const crosses = doesCross(nodePrice);
820
+
821
+ // fallback is available if auction is complete or it's a spot order
822
+ const fallbackAvailable =
823
+ isVariant(marketType, 'spot') ||
824
+ isFallbackAvailableLiquiditySource(
825
+ node.order,
826
+ minAuctionDuration,
827
+ slot
828
+ );
829
+
830
+ if (crosses && fallbackAvailable) {
831
+ nodesToFill.push({
832
+ node: node,
833
+ makerNodes: [], // filled by fallback
834
+ });
835
+ }
836
+
837
+ nextNode = nodeGenerator.next();
838
+ }
839
+
840
+ return nodesToFill;
841
+ }
842
+
843
+ public findExpiredNodesToFill(
844
+ marketIndex: number,
845
+ ts: number,
846
+ marketType: MarketType,
847
+ slot?: BN
848
+ ): NodeToFill[] {
849
+ const nodesToFill = new Array<NodeToFill>();
850
+
851
+ const marketTypeStr = getVariant(marketType) as MarketTypeStr;
852
+ const nodeLists = this.orderLists.get(marketTypeStr).get(marketIndex);
853
+
854
+ if (!nodeLists) {
855
+ return nodesToFill;
856
+ }
857
+
858
+ // All bids/asks that can expire
859
+ // dont try to expire limit orders with tif as its inefficient use of blockspace
860
+ const bidGenerators = [
861
+ nodeLists.takingLimit.bid.getGenerator(),
862
+ nodeLists.restingLimit.bid.getGenerator(),
863
+ nodeLists.floatingLimit.bid.getGenerator(),
864
+ nodeLists.market.bid.getGenerator(),
865
+ nodeLists.swift.bid.getGenerator(),
866
+ ];
867
+ const askGenerators = [
868
+ nodeLists.takingLimit.ask.getGenerator(),
869
+ nodeLists.restingLimit.ask.getGenerator(),
870
+ nodeLists.floatingLimit.ask.getGenerator(),
871
+ nodeLists.market.ask.getGenerator(),
872
+ nodeLists.swift.ask.getGenerator(),
873
+ ];
874
+
875
+ for (const bidGenerator of bidGenerators) {
876
+ for (const bid of bidGenerator) {
877
+ if (
878
+ bid.isSwift &&
879
+ slot.gt(bid.order.slot.addn(bid.order.auctionDuration))
880
+ ) {
881
+ this.orderLists
882
+ .get(marketTypeStr)
883
+ .get(marketIndex)
884
+ .swift.bid.remove(bid.order, bid.userAccount);
885
+ } else if (isOrderExpired(bid.order, ts, true, 25)) {
886
+ nodesToFill.push({
887
+ node: bid,
888
+ makerNodes: [],
889
+ });
890
+ }
891
+ }
892
+ }
893
+
894
+ for (const askGenerator of askGenerators) {
895
+ for (const ask of askGenerator) {
896
+ if (isOrderExpired(ask.order, ts, true, 25)) {
897
+ nodesToFill.push({
898
+ node: ask,
899
+ makerNodes: [],
900
+ });
901
+ }
902
+ }
903
+ }
904
+
905
+ return nodesToFill;
906
+ }
907
+
908
+ *getTakingBids(
909
+ marketIndex: number,
910
+ marketType: MarketType,
911
+ slot: number,
912
+ oraclePriceData: OraclePriceData,
913
+ filterFcn?: DLOBFilterFcn
914
+ ): Generator<DLOBNode> {
915
+ const marketTypeStr = getVariant(marketType) as MarketTypeStr;
916
+ const orderLists = this.orderLists.get(marketTypeStr).get(marketIndex);
917
+ if (!orderLists) {
918
+ return;
919
+ }
920
+
921
+ this.updateRestingLimitOrders(slot);
922
+
923
+ const generatorList = [
924
+ orderLists.market.bid.getGenerator(),
925
+ orderLists.takingLimit.bid.getGenerator(),
926
+ orderLists.swift.bid.getGenerator(),
927
+ ];
928
+
929
+ yield* this.getBestNode(
930
+ generatorList,
931
+ oraclePriceData,
932
+ slot,
933
+ (bestNode, currentNode) => {
934
+ return bestNode.order.slot.lt(currentNode.order.slot);
935
+ },
936
+ filterFcn
937
+ );
938
+ }
939
+
940
+ *getTakingAsks(
941
+ marketIndex: number,
942
+ marketType: MarketType,
943
+ slot: number,
944
+ oraclePriceData: OraclePriceData,
945
+ filterFcn?: DLOBFilterFcn
946
+ ): Generator<DLOBNode> {
947
+ const marketTypeStr = getVariant(marketType) as MarketTypeStr;
948
+ const orderLists = this.orderLists.get(marketTypeStr).get(marketIndex);
949
+ if (!orderLists) {
950
+ return;
951
+ }
952
+
953
+ this.updateRestingLimitOrders(slot);
954
+
955
+ const generatorList = [
956
+ orderLists.market.ask.getGenerator(),
957
+ orderLists.takingLimit.ask.getGenerator(),
958
+ orderLists.swift.ask.getGenerator(),
959
+ ];
960
+
961
+ yield* this.getBestNode(
962
+ generatorList,
963
+ oraclePriceData,
964
+ slot,
965
+ (bestNode, currentNode) => {
966
+ return bestNode.order.slot.lt(currentNode.order.slot);
967
+ },
968
+ filterFcn
969
+ );
970
+ }
971
+
972
+ protected *getBestNode(
973
+ generatorList: Array<Generator<DLOBNode>>,
974
+ oraclePriceData: OraclePriceData,
975
+ slot: number,
976
+ compareFcn: (
977
+ bestDLOBNode: DLOBNode,
978
+ currentDLOBNode: DLOBNode,
979
+ slot: number,
980
+ oraclePriceData: OraclePriceData
981
+ ) => boolean,
982
+ filterFcn?: DLOBFilterFcn
983
+ ): Generator<DLOBNode> {
984
+ const generators = generatorList.map((generator) => {
985
+ return {
986
+ next: generator.next(),
987
+ generator,
988
+ };
989
+ });
990
+
991
+ let sideExhausted = false;
992
+ while (!sideExhausted) {
993
+ const bestGenerator = generators.reduce(
994
+ (bestGenerator, currentGenerator) => {
995
+ if (currentGenerator.next.done) {
996
+ return bestGenerator;
997
+ }
998
+
999
+ if (bestGenerator.next.done) {
1000
+ return currentGenerator;
1001
+ }
1002
+
1003
+ const bestValue = bestGenerator.next.value as DLOBNode;
1004
+ const currentValue = currentGenerator.next.value as DLOBNode;
1005
+
1006
+ return compareFcn(bestValue, currentValue, slot, oraclePriceData)
1007
+ ? bestGenerator
1008
+ : currentGenerator;
1009
+ }
1010
+ );
1011
+
1012
+ if (!bestGenerator.next.done) {
1013
+ // skip this node if it's already completely filled
1014
+ if (bestGenerator.next.value.isBaseFilled()) {
1015
+ bestGenerator.next = bestGenerator.generator.next();
1016
+ continue;
1017
+ }
1018
+
1019
+ if (filterFcn && !filterFcn(bestGenerator.next.value)) {
1020
+ bestGenerator.next = bestGenerator.generator.next();
1021
+ continue;
1022
+ }
1023
+
1024
+ yield bestGenerator.next.value;
1025
+ bestGenerator.next = bestGenerator.generator.next();
1026
+ } else {
1027
+ sideExhausted = true;
1028
+ }
1029
+ }
1030
+ }
1031
+
1032
+ *getRestingLimitAsks(
1033
+ marketIndex: number,
1034
+ slot: number,
1035
+ marketType: MarketType,
1036
+ oraclePriceData: OraclePriceData,
1037
+ filterFcn?: DLOBFilterFcn
1038
+ ): Generator<DLOBNode> {
1039
+ if (isVariant(marketType, 'spot') && !oraclePriceData) {
1040
+ throw new Error('Must provide OraclePriceData to get spot asks');
1041
+ }
1042
+
1043
+ this.updateRestingLimitOrders(slot);
1044
+
1045
+ const marketTypeStr = getVariant(marketType) as MarketTypeStr;
1046
+ const nodeLists = this.orderLists.get(marketTypeStr).get(marketIndex);
1047
+
1048
+ if (!nodeLists) {
1049
+ return;
1050
+ }
1051
+
1052
+ const generatorList = [
1053
+ nodeLists.restingLimit.ask.getGenerator(),
1054
+ nodeLists.floatingLimit.ask.getGenerator(),
1055
+ ];
1056
+
1057
+ yield* this.getBestNode(
1058
+ generatorList,
1059
+ oraclePriceData,
1060
+ slot,
1061
+ (bestNode, currentNode, slot, oraclePriceData) => {
1062
+ return bestNode
1063
+ .getPrice(oraclePriceData, slot)
1064
+ .lt(currentNode.getPrice(oraclePriceData, slot));
1065
+ },
1066
+ filterFcn
1067
+ );
1068
+ }
1069
+
1070
+ *getRestingLimitBids(
1071
+ marketIndex: number,
1072
+ slot: number,
1073
+ marketType: MarketType,
1074
+ oraclePriceData: OraclePriceData,
1075
+ filterFcn?: DLOBFilterFcn
1076
+ ): Generator<DLOBNode> {
1077
+ if (isVariant(marketType, 'spot') && !oraclePriceData) {
1078
+ throw new Error('Must provide OraclePriceData to get spot bids');
1079
+ }
1080
+
1081
+ this.updateRestingLimitOrders(slot);
1082
+
1083
+ const marketTypeStr = getVariant(marketType) as MarketTypeStr;
1084
+ const nodeLists = this.orderLists.get(marketTypeStr).get(marketIndex);
1085
+
1086
+ if (!nodeLists) {
1087
+ return;
1088
+ }
1089
+
1090
+ const generatorList = [
1091
+ nodeLists.restingLimit.bid.getGenerator(),
1092
+ nodeLists.floatingLimit.bid.getGenerator(),
1093
+ ];
1094
+
1095
+ yield* this.getBestNode(
1096
+ generatorList,
1097
+ oraclePriceData,
1098
+ slot,
1099
+ (bestNode, currentNode, slot, oraclePriceData) => {
1100
+ return bestNode
1101
+ .getPrice(oraclePriceData, slot)
1102
+ .gt(currentNode.getPrice(oraclePriceData, slot));
1103
+ },
1104
+ filterFcn
1105
+ );
1106
+ }
1107
+
1108
+ /**
1109
+ * This will look at both the taking and resting limit asks
1110
+ * @param marketIndex
1111
+ * @param fallbackAsk
1112
+ * @param slot
1113
+ * @param marketType
1114
+ * @param oraclePriceData
1115
+ * @param filterFcn
1116
+ */
1117
+ *getAsks(
1118
+ marketIndex: number,
1119
+ _fallbackAsk: BN | undefined,
1120
+ slot: number,
1121
+ marketType: MarketType,
1122
+ oraclePriceData: OraclePriceData,
1123
+ filterFcn?: DLOBFilterFcn
1124
+ ): Generator<DLOBNode> {
1125
+ if (isVariant(marketType, 'spot') && !oraclePriceData) {
1126
+ throw new Error('Must provide OraclePriceData to get spot asks');
1127
+ }
1128
+
1129
+ const generatorList = [
1130
+ this.getTakingAsks(marketIndex, marketType, slot, oraclePriceData),
1131
+ this.getRestingLimitAsks(marketIndex, slot, marketType, oraclePriceData),
1132
+ ];
1133
+
1134
+ yield* this.getBestNode(
1135
+ generatorList,
1136
+ oraclePriceData,
1137
+ slot,
1138
+ (bestNode, currentNode, slot, oraclePriceData) => {
1139
+ const bestNodePrice = bestNode.getPrice(oraclePriceData, slot) ?? ZERO;
1140
+ const currentNodePrice =
1141
+ currentNode.getPrice(oraclePriceData, slot) ?? ZERO;
1142
+
1143
+ if (bestNodePrice.eq(currentNodePrice)) {
1144
+ return bestNode.order.slot.lt(currentNode.order.slot);
1145
+ }
1146
+
1147
+ return bestNodePrice.lt(currentNodePrice);
1148
+ },
1149
+ filterFcn
1150
+ );
1151
+ }
1152
+
1153
+ /**
1154
+ * This will look at both the taking and resting limit bids
1155
+ * @param marketIndex
1156
+ * @param fallbackBid
1157
+ * @param slot
1158
+ * @param marketType
1159
+ * @param oraclePriceData
1160
+ * @param filterFcn
1161
+ */
1162
+ *getBids(
1163
+ marketIndex: number,
1164
+ _fallbackBid: BN | undefined,
1165
+ slot: number,
1166
+ marketType: MarketType,
1167
+ oraclePriceData: OraclePriceData,
1168
+ filterFcn?: DLOBFilterFcn
1169
+ ): Generator<DLOBNode> {
1170
+ if (isVariant(marketType, 'spot') && !oraclePriceData) {
1171
+ throw new Error('Must provide OraclePriceData to get spot bids');
1172
+ }
1173
+
1174
+ const generatorList = [
1175
+ this.getTakingBids(marketIndex, marketType, slot, oraclePriceData),
1176
+ this.getRestingLimitBids(marketIndex, slot, marketType, oraclePriceData),
1177
+ ];
1178
+
1179
+ yield* this.getBestNode(
1180
+ generatorList,
1181
+ oraclePriceData,
1182
+ slot,
1183
+ (bestNode, currentNode, slot, oraclePriceData) => {
1184
+ const bestNodePrice =
1185
+ bestNode.getPrice(oraclePriceData, slot) ?? BN_MAX;
1186
+ const currentNodePrice =
1187
+ currentNode.getPrice(oraclePriceData, slot) ?? BN_MAX;
1188
+
1189
+ if (bestNodePrice.eq(currentNodePrice)) {
1190
+ return bestNode.order.slot.lt(currentNode.order.slot);
1191
+ }
1192
+
1193
+ return bestNodePrice.gt(currentNodePrice);
1194
+ },
1195
+ filterFcn
1196
+ );
1197
+ }
1198
+
1199
+ findCrossingRestingLimitOrders(
1200
+ marketIndex: number,
1201
+ slot: number,
1202
+ marketType: MarketType,
1203
+ oraclePriceData: OraclePriceData
1204
+ ): NodeToFill[] {
1205
+ const nodesToFill = new Array<NodeToFill>();
1206
+
1207
+ for (const askNode of this.getRestingLimitAsks(
1208
+ marketIndex,
1209
+ slot,
1210
+ marketType,
1211
+ oraclePriceData
1212
+ )) {
1213
+ const bidGenerator = this.getRestingLimitBids(
1214
+ marketIndex,
1215
+ slot,
1216
+ marketType,
1217
+ oraclePriceData
1218
+ );
1219
+
1220
+ for (const bidNode of bidGenerator) {
1221
+ const bidPrice = bidNode.getPrice(oraclePriceData, slot);
1222
+ const askPrice = askNode.getPrice(oraclePriceData, slot);
1223
+
1224
+ // orders don't cross
1225
+ if (bidPrice.lt(askPrice)) {
1226
+ break;
1227
+ }
1228
+
1229
+ const bidOrder = bidNode.order;
1230
+ const askOrder = askNode.order;
1231
+
1232
+ // Can't match orders from the same user
1233
+ const sameUser = bidNode.userAccount === askNode.userAccount;
1234
+ if (sameUser) {
1235
+ continue;
1236
+ }
1237
+
1238
+ const makerAndTaker = this.determineMakerAndTaker(askNode, bidNode);
1239
+
1240
+ // unable to match maker and taker due to post only or slot
1241
+ if (!makerAndTaker) {
1242
+ continue;
1243
+ }
1244
+
1245
+ const { takerNode, makerNode } = makerAndTaker;
1246
+
1247
+ const bidBaseRemaining = bidOrder.baseAssetAmount.sub(
1248
+ bidOrder.baseAssetAmountFilled
1249
+ );
1250
+ const askBaseRemaining = askOrder.baseAssetAmount.sub(
1251
+ askOrder.baseAssetAmountFilled
1252
+ );
1253
+
1254
+ const baseFilled = BN.min(bidBaseRemaining, askBaseRemaining);
1255
+
1256
+ const newBidOrder = { ...bidOrder };
1257
+ newBidOrder.baseAssetAmountFilled =
1258
+ bidOrder.baseAssetAmountFilled.add(baseFilled);
1259
+ this.getListForOnChainOrder(newBidOrder, slot).update(
1260
+ newBidOrder,
1261
+ bidNode.userAccount
1262
+ );
1263
+
1264
+ // ask completely filled
1265
+ const newAskOrder = { ...askOrder };
1266
+ newAskOrder.baseAssetAmountFilled =
1267
+ askOrder.baseAssetAmountFilled.add(baseFilled);
1268
+ this.getListForOnChainOrder(newAskOrder, slot).update(
1269
+ newAskOrder,
1270
+ askNode.userAccount
1271
+ );
1272
+
1273
+ nodesToFill.push({
1274
+ node: takerNode,
1275
+ makerNodes: [makerNode],
1276
+ });
1277
+
1278
+ if (newAskOrder.baseAssetAmount.eq(newAskOrder.baseAssetAmountFilled)) {
1279
+ break;
1280
+ }
1281
+ }
1282
+ }
1283
+
1284
+ return nodesToFill;
1285
+ }
1286
+
1287
+ determineMakerAndTaker(
1288
+ askNode: DLOBNode,
1289
+ bidNode: DLOBNode
1290
+ ): { takerNode: DLOBNode; makerNode: DLOBNode } | undefined {
1291
+ const askSlot = askNode.order.slot.add(
1292
+ new BN(askNode.order.auctionDuration)
1293
+ );
1294
+ const bidSlot = bidNode.order.slot.add(
1295
+ new BN(bidNode.order.auctionDuration)
1296
+ );
1297
+
1298
+ if (bidNode.order.postOnly && askNode.order.postOnly) {
1299
+ return undefined;
1300
+ } else if (bidNode.order.postOnly) {
1301
+ return {
1302
+ takerNode: askNode,
1303
+ makerNode: bidNode,
1304
+ };
1305
+ } else if (askNode.order.postOnly) {
1306
+ return {
1307
+ takerNode: bidNode,
1308
+ makerNode: askNode,
1309
+ };
1310
+ } else if (askSlot.lte(bidSlot)) {
1311
+ return {
1312
+ takerNode: bidNode,
1313
+ makerNode: askNode,
1314
+ };
1315
+ } else {
1316
+ return {
1317
+ takerNode: askNode,
1318
+ makerNode: bidNode,
1319
+ };
1320
+ }
1321
+ }
1322
+
1323
+ public getBestAsk(
1324
+ marketIndex: number,
1325
+ slot: number,
1326
+ marketType: MarketType,
1327
+ oraclePriceData: OraclePriceData
1328
+ ): BN | undefined {
1329
+ const bestAsk = this.getRestingLimitAsks(
1330
+ marketIndex,
1331
+ slot,
1332
+ marketType,
1333
+ oraclePriceData
1334
+ ).next().value;
1335
+
1336
+ if (bestAsk) {
1337
+ return bestAsk.getPrice(oraclePriceData, slot);
1338
+ }
1339
+ return undefined;
1340
+ }
1341
+
1342
+ public getBestBid(
1343
+ marketIndex: number,
1344
+ slot: number,
1345
+ marketType: MarketType,
1346
+ oraclePriceData: OraclePriceData
1347
+ ): BN | undefined {
1348
+ const bestBid = this.getRestingLimitBids(
1349
+ marketIndex,
1350
+ slot,
1351
+ marketType,
1352
+ oraclePriceData
1353
+ ).next().value;
1354
+
1355
+ if (bestBid) {
1356
+ return bestBid.getPrice(oraclePriceData, slot);
1357
+ }
1358
+ return undefined;
1359
+ }
1360
+
1361
+ public *getStopLosses(
1362
+ marketIndex: number,
1363
+ marketType: MarketType,
1364
+ direction: PositionDirection
1365
+ ): Generator<DLOBNode> {
1366
+ const marketTypeStr = getVariant(marketType) as MarketTypeStr;
1367
+ const marketNodeLists = this.orderLists.get(marketTypeStr).get(marketIndex);
1368
+
1369
+ if (isVariant(direction, 'long') && marketNodeLists.trigger.below) {
1370
+ for (const node of marketNodeLists.trigger.below.getGenerator()) {
1371
+ if (isVariant(node.order.direction, 'short')) {
1372
+ yield node;
1373
+ }
1374
+ }
1375
+ } else if (isVariant(direction, 'short') && marketNodeLists.trigger.above) {
1376
+ for (const node of marketNodeLists.trigger.above.getGenerator()) {
1377
+ if (isVariant(node.order.direction, 'long')) {
1378
+ yield node;
1379
+ }
1380
+ }
1381
+ }
1382
+ }
1383
+
1384
+ public *getStopLossMarkets(
1385
+ marketIndex: number,
1386
+ marketType: MarketType,
1387
+ direction: PositionDirection
1388
+ ): Generator<DLOBNode> {
1389
+ for (const node of this.getStopLosses(marketIndex, marketType, direction)) {
1390
+ if (isVariant(node.order.orderType, 'triggerMarket')) {
1391
+ yield node;
1392
+ }
1393
+ }
1394
+ }
1395
+
1396
+ public *getStopLossLimits(
1397
+ marketIndex: number,
1398
+ marketType: MarketType,
1399
+ direction: PositionDirection
1400
+ ): Generator<DLOBNode> {
1401
+ for (const node of this.getStopLosses(marketIndex, marketType, direction)) {
1402
+ if (isVariant(node.order.orderType, 'triggerLimit')) {
1403
+ yield node;
1404
+ }
1405
+ }
1406
+ }
1407
+
1408
+ public *getTakeProfits(
1409
+ marketIndex: number,
1410
+ marketType: MarketType,
1411
+ direction: PositionDirection
1412
+ ): Generator<DLOBNode> {
1413
+ const marketTypeStr = getVariant(marketType) as MarketTypeStr;
1414
+ const marketNodeLists = this.orderLists.get(marketTypeStr).get(marketIndex);
1415
+
1416
+ if (isVariant(direction, 'long') && marketNodeLists.trigger.above) {
1417
+ for (const node of marketNodeLists.trigger.above.getGenerator()) {
1418
+ if (isVariant(node.order.direction, 'short')) {
1419
+ yield node;
1420
+ }
1421
+ }
1422
+ } else if (isVariant(direction, 'short') && marketNodeLists.trigger.below) {
1423
+ for (const node of marketNodeLists.trigger.below.getGenerator()) {
1424
+ if (isVariant(node.order.direction, 'long')) {
1425
+ yield node;
1426
+ }
1427
+ }
1428
+ }
1429
+ }
1430
+
1431
+ public *getTakeProfitMarkets(
1432
+ marketIndex: number,
1433
+ marketType: MarketType,
1434
+ direction: PositionDirection
1435
+ ): Generator<DLOBNode> {
1436
+ for (const node of this.getTakeProfits(
1437
+ marketIndex,
1438
+ marketType,
1439
+ direction
1440
+ )) {
1441
+ if (isVariant(node.order.orderType, 'triggerMarket')) {
1442
+ yield node;
1443
+ }
1444
+ }
1445
+ }
1446
+
1447
+ public *getTakeProfitLimits(
1448
+ marketIndex: number,
1449
+ marketType: MarketType,
1450
+ direction: PositionDirection
1451
+ ): Generator<DLOBNode> {
1452
+ for (const node of this.getTakeProfits(
1453
+ marketIndex,
1454
+ marketType,
1455
+ direction
1456
+ )) {
1457
+ if (isVariant(node.order.orderType, 'triggerLimit')) {
1458
+ yield node;
1459
+ }
1460
+ }
1461
+ }
1462
+
1463
+ public findNodesToTrigger(
1464
+ marketIndex: number,
1465
+ slot: number,
1466
+ oraclePrice: BN,
1467
+ marketType: MarketType,
1468
+ stateAccount: StateAccount
1469
+ ): NodeToTrigger[] {
1470
+ if (exchangePaused(stateAccount)) {
1471
+ return [];
1472
+ }
1473
+
1474
+ const nodesToTrigger = [];
1475
+ const marketTypeStr = getVariant(marketType) as MarketTypeStr;
1476
+ const marketNodeLists = this.orderLists.get(marketTypeStr).get(marketIndex);
1477
+
1478
+ const triggerAboveList = marketNodeLists
1479
+ ? marketNodeLists.trigger.above
1480
+ : undefined;
1481
+ if (triggerAboveList) {
1482
+ for (const node of triggerAboveList.getGenerator()) {
1483
+ if (oraclePrice.gt(node.order.triggerPrice)) {
1484
+ nodesToTrigger.push({
1485
+ node: node,
1486
+ });
1487
+ } else {
1488
+ break;
1489
+ }
1490
+ }
1491
+ }
1492
+
1493
+ const triggerBelowList = marketNodeLists
1494
+ ? marketNodeLists.trigger.below
1495
+ : undefined;
1496
+ if (triggerBelowList) {
1497
+ for (const node of triggerBelowList.getGenerator()) {
1498
+ if (oraclePrice.lt(node.order.triggerPrice)) {
1499
+ nodesToTrigger.push({
1500
+ node: node,
1501
+ });
1502
+ } else {
1503
+ break;
1504
+ }
1505
+ }
1506
+ }
1507
+
1508
+ return nodesToTrigger;
1509
+ }
1510
+
1511
+ public printTop(
1512
+ driftClient: DriftClient,
1513
+ slotSubscriber: SlotSubscriber,
1514
+ marketIndex: number,
1515
+ marketType: MarketType
1516
+ ) {
1517
+ if (isVariant(marketType, 'perp')) {
1518
+ const slot = slotSubscriber.getSlot();
1519
+ const oraclePriceData =
1520
+ driftClient.getOracleDataForPerpMarket(marketIndex);
1521
+
1522
+ const bestAsk = this.getBestAsk(
1523
+ marketIndex,
1524
+ slot,
1525
+ marketType,
1526
+ oraclePriceData
1527
+ );
1528
+ const bestBid = this.getBestBid(
1529
+ marketIndex,
1530
+ slot,
1531
+ marketType,
1532
+ oraclePriceData
1533
+ );
1534
+ const mid = bestAsk.add(bestBid).div(new BN(2));
1535
+
1536
+ const bidSpread =
1537
+ (convertToNumber(bestBid, PRICE_PRECISION) /
1538
+ convertToNumber(oraclePriceData.price, PRICE_PRECISION) -
1539
+ 1) *
1540
+ 100.0;
1541
+ const askSpread =
1542
+ (convertToNumber(bestAsk, PRICE_PRECISION) /
1543
+ convertToNumber(oraclePriceData.price, PRICE_PRECISION) -
1544
+ 1) *
1545
+ 100.0;
1546
+
1547
+ const name = decodeName(
1548
+ driftClient.getPerpMarketAccount(marketIndex).name
1549
+ );
1550
+ console.log(`Market ${name} Orders`);
1551
+ console.log(
1552
+ ` Ask`,
1553
+ convertToNumber(bestAsk, PRICE_PRECISION).toFixed(3),
1554
+ `(${askSpread.toFixed(4)}%)`
1555
+ );
1556
+ console.log(` Mid`, convertToNumber(mid, PRICE_PRECISION).toFixed(3));
1557
+ console.log(
1558
+ ` Bid`,
1559
+ convertToNumber(bestBid, PRICE_PRECISION).toFixed(3),
1560
+ `(${bidSpread.toFixed(4)}%)`
1561
+ );
1562
+ } else if (isVariant(marketType, 'spot')) {
1563
+ const slot = slotSubscriber.getSlot();
1564
+ const oraclePriceData =
1565
+ driftClient.getOracleDataForPerpMarket(marketIndex);
1566
+
1567
+ const bestAsk = this.getBestAsk(
1568
+ marketIndex,
1569
+ slot,
1570
+ marketType,
1571
+ oraclePriceData
1572
+ );
1573
+ const bestBid = this.getBestBid(
1574
+ marketIndex,
1575
+ slot,
1576
+ marketType,
1577
+ oraclePriceData
1578
+ );
1579
+ const mid = bestAsk.add(bestBid).div(new BN(2));
1580
+
1581
+ const bidSpread =
1582
+ (convertToNumber(bestBid, PRICE_PRECISION) /
1583
+ convertToNumber(oraclePriceData.price, PRICE_PRECISION) -
1584
+ 1) *
1585
+ 100.0;
1586
+ const askSpread =
1587
+ (convertToNumber(bestAsk, PRICE_PRECISION) /
1588
+ convertToNumber(oraclePriceData.price, PRICE_PRECISION) -
1589
+ 1) *
1590
+ 100.0;
1591
+
1592
+ const name = decodeName(
1593
+ driftClient.getSpotMarketAccount(marketIndex).name
1594
+ );
1595
+ console.log(`Market ${name} Orders`);
1596
+ console.log(
1597
+ ` Ask`,
1598
+ convertToNumber(bestAsk, PRICE_PRECISION).toFixed(3),
1599
+ `(${askSpread.toFixed(4)}%)`
1600
+ );
1601
+ console.log(` Mid`, convertToNumber(mid, PRICE_PRECISION).toFixed(3));
1602
+ console.log(
1603
+ ` Bid`,
1604
+ convertToNumber(bestBid, PRICE_PRECISION).toFixed(3),
1605
+ `(${bidSpread.toFixed(4)}%)`
1606
+ );
1607
+ }
1608
+ }
1609
+
1610
+ public getDLOBOrders(): DLOBOrders {
1611
+ const dlobOrders: DLOBOrders = [];
1612
+
1613
+ for (const nodeList of this.getNodeLists()) {
1614
+ for (const node of nodeList.getGenerator()) {
1615
+ dlobOrders.push({
1616
+ user: new PublicKey(node.userAccount),
1617
+ order: node.order,
1618
+ });
1619
+ }
1620
+ }
1621
+
1622
+ return dlobOrders;
1623
+ }
1624
+
1625
+ *getNodeLists(): Generator<NodeList<DLOBNodeType>> {
1626
+ for (const [_, nodeLists] of this.orderLists.get('perp')) {
1627
+ yield nodeLists.restingLimit.bid;
1628
+ yield nodeLists.restingLimit.ask;
1629
+ yield nodeLists.takingLimit.bid;
1630
+ yield nodeLists.takingLimit.ask;
1631
+ yield nodeLists.market.bid;
1632
+ yield nodeLists.market.ask;
1633
+ yield nodeLists.floatingLimit.bid;
1634
+ yield nodeLists.floatingLimit.ask;
1635
+ yield nodeLists.trigger.above;
1636
+ yield nodeLists.trigger.below;
1637
+ }
1638
+
1639
+ for (const [_, nodeLists] of this.orderLists.get('spot')) {
1640
+ yield nodeLists.restingLimit.bid;
1641
+ yield nodeLists.restingLimit.ask;
1642
+ yield nodeLists.takingLimit.bid;
1643
+ yield nodeLists.takingLimit.ask;
1644
+ yield nodeLists.market.bid;
1645
+ yield nodeLists.market.ask;
1646
+ yield nodeLists.floatingLimit.bid;
1647
+ yield nodeLists.floatingLimit.ask;
1648
+ yield nodeLists.trigger.above;
1649
+ yield nodeLists.trigger.below;
1650
+ }
1651
+ }
1652
+
1653
+ /**
1654
+ * Get an L2 view of the order book for a given market.
1655
+ *
1656
+ * @param marketIndex
1657
+ * @param marketType
1658
+ * @param slot
1659
+ * @param oraclePriceData
1660
+ * @param depth how many levels of the order book to return
1661
+ * @param fallbackL2Generators L2 generators for fallback liquidity e.g. vAMM {@link getVammL2Generator}, openbook {@link SerumSubscriber}
1662
+ */
1663
+ public getL2({
1664
+ marketIndex,
1665
+ marketType,
1666
+ slot,
1667
+ oraclePriceData,
1668
+ depth,
1669
+ fallbackL2Generators = [],
1670
+ }: {
1671
+ marketIndex: number;
1672
+ marketType: MarketType;
1673
+ slot: number;
1674
+ oraclePriceData: OraclePriceData;
1675
+ depth: number;
1676
+ fallbackL2Generators?: L2OrderBookGenerator[];
1677
+ }): L2OrderBook {
1678
+ const makerAskL2LevelGenerator = getL2GeneratorFromDLOBNodes(
1679
+ this.getRestingLimitAsks(marketIndex, slot, marketType, oraclePriceData),
1680
+ oraclePriceData,
1681
+ slot
1682
+ );
1683
+
1684
+ const fallbackAskGenerators = fallbackL2Generators.map(
1685
+ (fallbackL2Generator) => {
1686
+ return fallbackL2Generator.getL2Asks();
1687
+ }
1688
+ );
1689
+
1690
+ const askL2LevelGenerator = mergeL2LevelGenerators(
1691
+ [makerAskL2LevelGenerator, ...fallbackAskGenerators],
1692
+ (a, b) => {
1693
+ return a.price.lt(b.price);
1694
+ }
1695
+ );
1696
+
1697
+ const asks = createL2Levels(askL2LevelGenerator, depth);
1698
+
1699
+ const makerBidGenerator = getL2GeneratorFromDLOBNodes(
1700
+ this.getRestingLimitBids(marketIndex, slot, marketType, oraclePriceData),
1701
+ oraclePriceData,
1702
+ slot
1703
+ );
1704
+
1705
+ const fallbackBidGenerators = fallbackL2Generators.map((fallbackOrders) => {
1706
+ return fallbackOrders.getL2Bids();
1707
+ });
1708
+
1709
+ const bidL2LevelGenerator = mergeL2LevelGenerators(
1710
+ [makerBidGenerator, ...fallbackBidGenerators],
1711
+ (a, b) => {
1712
+ return a.price.gt(b.price);
1713
+ }
1714
+ );
1715
+
1716
+ const bids = createL2Levels(bidL2LevelGenerator, depth);
1717
+
1718
+ return {
1719
+ bids,
1720
+ asks,
1721
+ slot,
1722
+ };
1723
+ }
1724
+
1725
+ /**
1726
+ * Get an L3 view of the order book for a given market. Does not include fallback liquidity sources
1727
+ *
1728
+ * @param marketIndex
1729
+ * @param marketType
1730
+ * @param slot
1731
+ * @param oraclePriceData
1732
+ */
1733
+ public getL3({
1734
+ marketIndex,
1735
+ marketType,
1736
+ slot,
1737
+ oraclePriceData,
1738
+ }: {
1739
+ marketIndex: number;
1740
+ marketType: MarketType;
1741
+ slot: number;
1742
+ oraclePriceData: OraclePriceData;
1743
+ }): L3OrderBook {
1744
+ const bids: L3Level[] = [];
1745
+ const asks: L3Level[] = [];
1746
+
1747
+ const restingAsks = this.getRestingLimitAsks(
1748
+ marketIndex,
1749
+ slot,
1750
+ marketType,
1751
+ oraclePriceData
1752
+ );
1753
+
1754
+ for (const ask of restingAsks) {
1755
+ asks.push({
1756
+ price: ask.getPrice(oraclePriceData, slot),
1757
+ size: ask.order.baseAssetAmount.sub(ask.order.baseAssetAmountFilled),
1758
+ maker: new PublicKey(ask.userAccount),
1759
+ orderId: ask.order.orderId,
1760
+ });
1761
+ }
1762
+
1763
+ const restingBids = this.getRestingLimitBids(
1764
+ marketIndex,
1765
+ slot,
1766
+ marketType,
1767
+ oraclePriceData
1768
+ );
1769
+
1770
+ for (const bid of restingBids) {
1771
+ bids.push({
1772
+ price: bid.getPrice(oraclePriceData, slot),
1773
+ size: bid.order.baseAssetAmount.sub(bid.order.baseAssetAmountFilled),
1774
+ maker: new PublicKey(bid.userAccount),
1775
+ orderId: bid.order.orderId,
1776
+ });
1777
+ }
1778
+
1779
+ return {
1780
+ bids,
1781
+ asks,
1782
+ slot,
1783
+ };
1784
+ }
1785
+
1786
+ private estimateFillExactBaseAmountInForSide(
1787
+ baseAmountIn: BN,
1788
+ oraclePriceData: OraclePriceData,
1789
+ slot: number,
1790
+ dlobSide: Generator<DLOBNode>
1791
+ ): BN {
1792
+ let runningSumQuote = ZERO;
1793
+ let runningSumBase = ZERO;
1794
+ for (const side of dlobSide) {
1795
+ const price = side.getPrice(oraclePriceData, slot); //side.order.quoteAssetAmount.div(side.order.baseAssetAmount);
1796
+ const baseAmountRemaining = side.order.baseAssetAmount.sub(
1797
+ side.order.baseAssetAmountFilled
1798
+ );
1799
+ if (runningSumBase.add(baseAmountRemaining).gt(baseAmountIn)) {
1800
+ const remainingBase = baseAmountIn.sub(runningSumBase);
1801
+ runningSumBase = runningSumBase.add(remainingBase);
1802
+ runningSumQuote = runningSumQuote.add(remainingBase.mul(price));
1803
+ break;
1804
+ } else {
1805
+ runningSumBase = runningSumBase.add(baseAmountRemaining);
1806
+ runningSumQuote = runningSumQuote.add(baseAmountRemaining.mul(price));
1807
+ }
1808
+ }
1809
+
1810
+ return runningSumQuote
1811
+ .mul(QUOTE_PRECISION)
1812
+ .div(BASE_PRECISION.mul(PRICE_PRECISION));
1813
+ }
1814
+
1815
+ /**
1816
+ *
1817
+ * @param param.marketIndex the index of the market
1818
+ * @param param.marketType the type of the market
1819
+ * @param param.baseAmount the base amount in to estimate
1820
+ * @param param.orderDirection the direction of the trade
1821
+ * @param param.slot current slot for estimating dlob node price
1822
+ * @param param.oraclePriceData the oracle price data
1823
+ * @returns the estimated quote amount filled: QUOTE_PRECISION
1824
+ */
1825
+ public estimateFillWithExactBaseAmount({
1826
+ marketIndex,
1827
+ marketType,
1828
+ baseAmount,
1829
+ orderDirection,
1830
+ slot,
1831
+ oraclePriceData,
1832
+ }: {
1833
+ marketIndex: number;
1834
+ marketType: MarketType;
1835
+ baseAmount: BN;
1836
+ orderDirection: PositionDirection;
1837
+ slot: number;
1838
+ oraclePriceData: OraclePriceData;
1839
+ }): BN {
1840
+ if (isVariant(orderDirection, 'long')) {
1841
+ return this.estimateFillExactBaseAmountInForSide(
1842
+ baseAmount,
1843
+ oraclePriceData,
1844
+ slot,
1845
+ this.getRestingLimitAsks(marketIndex, slot, marketType, oraclePriceData)
1846
+ );
1847
+ } else if (isVariant(orderDirection, 'short')) {
1848
+ return this.estimateFillExactBaseAmountInForSide(
1849
+ baseAmount,
1850
+ oraclePriceData,
1851
+ slot,
1852
+ this.getRestingLimitBids(marketIndex, slot, marketType, oraclePriceData)
1853
+ );
1854
+ }
1855
+ }
1856
+
1857
+ public getBestMakers({
1858
+ marketIndex,
1859
+ marketType,
1860
+ direction,
1861
+ slot,
1862
+ oraclePriceData,
1863
+ numMakers,
1864
+ }: {
1865
+ marketIndex: number;
1866
+ marketType: MarketType;
1867
+ direction: PositionDirection;
1868
+ slot: number;
1869
+ oraclePriceData: OraclePriceData;
1870
+ numMakers: number;
1871
+ }): PublicKey[] {
1872
+ const makers = new Map<string, PublicKey>();
1873
+ const generator = isVariant(direction, 'long')
1874
+ ? this.getRestingLimitBids(marketIndex, slot, marketType, oraclePriceData)
1875
+ : this.getRestingLimitAsks(
1876
+ marketIndex,
1877
+ slot,
1878
+ marketType,
1879
+ oraclePriceData
1880
+ );
1881
+
1882
+ for (const node of generator) {
1883
+ if (!makers.has(node.userAccount.toString())) {
1884
+ makers.set(
1885
+ node.userAccount.toString(),
1886
+ new PublicKey(node.userAccount)
1887
+ );
1888
+ }
1889
+
1890
+ if (makers.size === numMakers) {
1891
+ break;
1892
+ }
1893
+ }
1894
+
1895
+ return Array.from(makers.values());
1896
+ }
1897
+ }