@velocity-exchange/sdk 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1046) hide show
  1. package/CHANGELOG.md +51 -0
  2. package/lib/browser/accounts/basicUserAccountSubscriber.d.ts +18 -0
  3. package/lib/browser/accounts/basicUserAccountSubscriber.js +18 -0
  4. package/lib/browser/accounts/basicUserStatsAccountSubscriber.d.ts +18 -0
  5. package/lib/browser/accounts/basicUserStatsAccountSubscriber.js +18 -0
  6. package/lib/browser/accounts/bulkAccountLoader.d.ts +52 -0
  7. package/lib/browser/accounts/bulkAccountLoader.js +51 -0
  8. package/lib/browser/accounts/bulkUserStatsSubscription.d.ts +9 -2
  9. package/lib/browser/accounts/bulkUserStatsSubscription.js +9 -2
  10. package/lib/browser/accounts/bulkUserSubscription.d.ts +8 -2
  11. package/lib/browser/accounts/bulkUserSubscription.js +8 -2
  12. package/lib/browser/accounts/customizedCadenceBulkAccountLoader.d.ts +37 -0
  13. package/lib/browser/accounts/customizedCadenceBulkAccountLoader.js +37 -0
  14. package/lib/browser/accounts/fetch.d.ts +59 -2
  15. package/lib/browser/accounts/fetch.js +57 -2
  16. package/lib/browser/accounts/grpcAccountSubscriber.d.ts +30 -0
  17. package/lib/browser/accounts/grpcAccountSubscriber.js +30 -0
  18. package/lib/browser/accounts/grpcInsuranceFundStakeAccountSubscriber.d.ts +16 -0
  19. package/lib/browser/accounts/grpcInsuranceFundStakeAccountSubscriber.js +16 -0
  20. package/lib/browser/accounts/grpcMultiAccountSubscriber.d.ts +60 -1
  21. package/lib/browser/accounts/grpcMultiAccountSubscriber.js +118 -37
  22. package/lib/browser/accounts/grpcMultiUserAccountSubscriber.d.ts +32 -0
  23. package/lib/browser/accounts/grpcMultiUserAccountSubscriber.js +40 -12
  24. package/lib/browser/accounts/grpcProgramAccountSubscriber.d.ts +33 -0
  25. package/lib/browser/accounts/grpcProgramAccountSubscriber.js +33 -0
  26. package/lib/browser/accounts/grpcUserAccountSubscriber.d.ts +15 -0
  27. package/lib/browser/accounts/grpcUserAccountSubscriber.js +15 -0
  28. package/lib/browser/accounts/grpcUserStatsAccountSubscriber.d.ts +15 -0
  29. package/lib/browser/accounts/grpcUserStatsAccountSubscriber.js +15 -0
  30. package/lib/browser/accounts/grpcVelocityClientAccountSubscriber.d.ts +41 -0
  31. package/lib/browser/accounts/grpcVelocityClientAccountSubscriber.js +41 -0
  32. package/lib/browser/accounts/grpcVelocityClientAccountSubscriberV2.d.ts +116 -0
  33. package/lib/browser/accounts/grpcVelocityClientAccountSubscriberV2.js +152 -1
  34. package/lib/browser/accounts/laserProgramAccountSubscriber.d.ts +34 -0
  35. package/lib/browser/accounts/laserProgramAccountSubscriber.js +34 -0
  36. package/lib/browser/accounts/oneShotUserAccountSubscriber.d.ts +19 -0
  37. package/lib/browser/accounts/oneShotUserAccountSubscriber.js +19 -0
  38. package/lib/browser/accounts/oneShotUserStatsAccountSubscriber.d.ts +19 -0
  39. package/lib/browser/accounts/oneShotUserStatsAccountSubscriber.js +19 -0
  40. package/lib/browser/accounts/pollingInsuranceFundStakeAccountSubscriber.d.ts +31 -0
  41. package/lib/browser/accounts/pollingInsuranceFundStakeAccountSubscriber.js +31 -0
  42. package/lib/browser/accounts/pollingOracleAccountSubscriber.d.ts +19 -0
  43. package/lib/browser/accounts/pollingOracleAccountSubscriber.js +21 -2
  44. package/lib/browser/accounts/pollingTokenAccountSubscriber.d.ts +22 -0
  45. package/lib/browser/accounts/pollingTokenAccountSubscriber.js +22 -0
  46. package/lib/browser/accounts/pollingUserAccountSubscriber.d.ts +32 -0
  47. package/lib/browser/accounts/pollingUserAccountSubscriber.js +32 -0
  48. package/lib/browser/accounts/pollingUserStatsAccountSubscriber.d.ts +22 -0
  49. package/lib/browser/accounts/pollingUserStatsAccountSubscriber.js +22 -0
  50. package/lib/browser/accounts/pollingVelocityClientAccountSubscriber.d.ts +83 -0
  51. package/lib/browser/accounts/pollingVelocityClientAccountSubscriber.js +84 -1
  52. package/lib/browser/accounts/testBulkAccountLoader.d.ts +8 -0
  53. package/lib/browser/accounts/testBulkAccountLoader.js +8 -0
  54. package/lib/browser/accounts/types.d.ts +149 -0
  55. package/lib/browser/accounts/types.js +13 -0
  56. package/lib/browser/accounts/utils.d.ts +18 -0
  57. package/lib/browser/accounts/utils.js +32 -16
  58. package/lib/browser/accounts/webSocketAccountSubscriber.d.ts +41 -0
  59. package/lib/browser/accounts/webSocketAccountSubscriber.js +41 -0
  60. package/lib/browser/accounts/webSocketAccountSubscriberV2.d.ts +31 -0
  61. package/lib/browser/accounts/webSocketAccountSubscriberV2.js +31 -23
  62. package/lib/browser/accounts/webSocketInsuranceFundStakeAccountSubscriber.d.ts +27 -0
  63. package/lib/browser/accounts/webSocketInsuranceFundStakeAccountSubscriber.js +27 -0
  64. package/lib/browser/accounts/webSocketProgramAccountSubscriber.d.ts +36 -0
  65. package/lib/browser/accounts/webSocketProgramAccountSubscriber.js +36 -0
  66. package/lib/browser/accounts/webSocketProgramAccountSubscriberV2.d.ts +21 -0
  67. package/lib/browser/accounts/webSocketProgramAccountSubscriberV2.js +25 -0
  68. package/lib/browser/accounts/webSocketProgramAccountsSubscriberV2.d.ts +21 -0
  69. package/lib/browser/accounts/webSocketProgramAccountsSubscriberV2.js +21 -0
  70. package/lib/browser/accounts/webSocketUserAccountSubscriber.d.ts +26 -0
  71. package/lib/browser/accounts/webSocketUserAccountSubscriber.js +26 -0
  72. package/lib/browser/accounts/webSocketUserStatsAccountSubsriber.d.ts +20 -0
  73. package/lib/browser/accounts/webSocketUserStatsAccountSubsriber.js +20 -0
  74. package/lib/browser/accounts/webSocketVelocityClientAccountSubscriber.d.ts +121 -0
  75. package/lib/browser/accounts/webSocketVelocityClientAccountSubscriber.js +123 -2
  76. package/lib/browser/accounts/webSocketVelocityClientAccountSubscriberV2.d.ts +96 -0
  77. package/lib/browser/accounts/webSocketVelocityClientAccountSubscriberV2.js +108 -0
  78. package/lib/browser/accounts/websocketProgramUserAccountSubscriber.d.ts +28 -0
  79. package/lib/browser/accounts/websocketProgramUserAccountSubscriber.js +33 -0
  80. package/lib/browser/addresses/marketAddresses.d.ts +10 -0
  81. package/lib/browser/addresses/marketAddresses.js +10 -0
  82. package/lib/browser/addresses/pda.d.ts +214 -2
  83. package/lib/browser/addresses/pda.js +217 -5
  84. package/lib/browser/adminClient.d.ts +2136 -4
  85. package/lib/browser/adminClient.js +2150 -4
  86. package/lib/browser/auctionSubscriber/auctionSubscriber.d.ts +15 -0
  87. package/lib/browser/auctionSubscriber/auctionSubscriber.js +15 -0
  88. package/lib/browser/auctionSubscriber/auctionSubscriberGrpc.d.ts +19 -0
  89. package/lib/browser/auctionSubscriber/auctionSubscriberGrpc.js +19 -0
  90. package/lib/browser/auctionSubscriber/index.d.ts +6 -0
  91. package/lib/browser/auctionSubscriber/index.js +6 -0
  92. package/lib/browser/auctionSubscriber/types.d.ts +7 -0
  93. package/lib/browser/blockhashSubscriber/BlockhashSubscriber.d.ts +33 -0
  94. package/lib/browser/blockhashSubscriber/BlockhashSubscriber.js +33 -0
  95. package/lib/browser/blockhashSubscriber/index.d.ts +5 -0
  96. package/lib/browser/blockhashSubscriber/index.js +5 -0
  97. package/lib/browser/blockhashSubscriber/types.d.ts +5 -0
  98. package/lib/browser/clock/clockSubscriber.d.ts +24 -0
  99. package/lib/browser/clock/clockSubscriber.js +22 -0
  100. package/lib/browser/config.d.ts +58 -4
  101. package/lib/browser/config.js +88 -21
  102. package/lib/browser/constants/numericConstants.d.ts +67 -0
  103. package/lib/browser/constants/numericConstants.js +68 -1
  104. package/lib/browser/constants/perpMarkets.d.ts +10 -0
  105. package/lib/browser/constants/perpMarkets.js +40 -908
  106. package/lib/browser/constants/spotMarkets.d.ts +13 -0
  107. package/lib/browser/constants/spotMarkets.js +16 -742
  108. package/lib/browser/constants/txConstants.d.ts +1 -0
  109. package/lib/browser/constants/txConstants.js +1 -0
  110. package/lib/browser/core/VelocityCore.d.ts +285 -8
  111. package/lib/browser/core/VelocityCore.js +281 -8
  112. package/lib/browser/core/instructions/deposit.d.ts +22 -0
  113. package/lib/browser/core/instructions/deposit.js +22 -0
  114. package/lib/browser/core/instructions/fill.d.ts +17 -0
  115. package/lib/browser/core/instructions/fill.js +17 -0
  116. package/lib/browser/core/instructions/funding.d.ts +12 -0
  117. package/lib/browser/core/instructions/funding.js +12 -0
  118. package/lib/browser/core/instructions/liquidation.d.ts +18 -0
  119. package/lib/browser/core/instructions/liquidation.js +18 -0
  120. package/lib/browser/core/instructions/orders.d.ts +28 -0
  121. package/lib/browser/core/instructions/orders.js +28 -0
  122. package/lib/browser/core/instructions/perpOrders.d.ts +106 -0
  123. package/lib/browser/core/instructions/perpOrders.js +106 -0
  124. package/lib/browser/core/instructions/settlement.d.ts +14 -0
  125. package/lib/browser/core/instructions/settlement.js +14 -0
  126. package/lib/browser/core/instructions/trigger.d.ts +15 -0
  127. package/lib/browser/core/instructions/trigger.js +15 -0
  128. package/lib/browser/core/instructions/withdraw.d.ts +21 -0
  129. package/lib/browser/core/instructions/withdraw.js +21 -0
  130. package/lib/browser/core/remainingAccounts.d.ts +47 -3
  131. package/lib/browser/core/remainingAccounts.js +20 -0
  132. package/lib/browser/core/signedMsg.d.ts +38 -0
  133. package/lib/browser/core/signedMsg.js +33 -0
  134. package/lib/browser/decode/customCoder.d.ts +39 -3
  135. package/lib/browser/decode/customCoder.js +45 -3
  136. package/lib/browser/decode/user.d.ts +22 -0
  137. package/lib/browser/decode/user.js +22 -0
  138. package/lib/browser/dlob/DLOB.d.ts +502 -53
  139. package/lib/browser/dlob/DLOB.js +540 -98
  140. package/lib/browser/dlob/DLOBNode.d.ts +86 -4
  141. package/lib/browser/dlob/DLOBNode.js +37 -4
  142. package/lib/browser/dlob/DLOBSubscriber.d.ts +39 -12
  143. package/lib/browser/dlob/DLOBSubscriber.js +42 -12
  144. package/lib/browser/dlob/NodeList.d.ts +69 -0
  145. package/lib/browser/dlob/NodeList.js +66 -0
  146. package/lib/browser/dlob/orderBookLevels.d.ts +106 -13
  147. package/lib/browser/dlob/orderBookLevels.js +84 -14
  148. package/lib/browser/dlob/types.d.ts +15 -0
  149. package/lib/browser/events/eventList.d.ts +14 -0
  150. package/lib/browser/events/eventList.js +14 -0
  151. package/lib/browser/events/eventSubscriber.d.ts +87 -10
  152. package/lib/browser/events/eventSubscriber.js +93 -8
  153. package/lib/browser/events/eventsServerLogProvider.d.ts +22 -0
  154. package/lib/browser/events/eventsServerLogProvider.js +27 -0
  155. package/lib/browser/events/fetchLogs.d.ts +31 -0
  156. package/lib/browser/events/fetchLogs.js +46 -1
  157. package/lib/browser/events/parse.d.ts +23 -0
  158. package/lib/browser/events/parse.js +23 -0
  159. package/lib/browser/events/pollingLogProvider.d.ts +24 -0
  160. package/lib/browser/events/pollingLogProvider.js +24 -0
  161. package/lib/browser/events/sort.d.ts +11 -0
  162. package/lib/browser/events/sort.js +12 -0
  163. package/lib/browser/events/txEventCache.d.ts +13 -3
  164. package/lib/browser/events/txEventCache.js +19 -7
  165. package/lib/browser/events/types.d.ts +118 -2
  166. package/lib/browser/events/types.js +11 -0
  167. package/lib/browser/events/webSocketLogProvider.d.ts +23 -0
  168. package/lib/browser/events/webSocketLogProvider.js +28 -0
  169. package/lib/browser/factory/oracleClient.js +2 -2
  170. package/lib/browser/idl/velocity.d.ts +4 -4
  171. package/lib/browser/idl/velocity.json +4 -4
  172. package/lib/browser/keypair.d.ts +8 -0
  173. package/lib/browser/keypair.js +8 -0
  174. package/lib/browser/marginCalculation.d.ts +134 -2
  175. package/lib/browser/marginCalculation.js +121 -0
  176. package/lib/browser/math/amm.d.ts +348 -29
  177. package/lib/browser/math/amm.js +310 -32
  178. package/lib/browser/math/auction.d.ts +95 -19
  179. package/lib/browser/math/auction.js +118 -28
  180. package/lib/browser/math/bankruptcy.d.ts +46 -0
  181. package/lib/browser/math/bankruptcy.js +89 -1
  182. package/lib/browser/math/builder.d.ts +64 -8
  183. package/lib/browser/math/builder.js +71 -9
  184. package/lib/browser/math/conversion.d.ts +21 -0
  185. package/lib/browser/math/conversion.js +21 -0
  186. package/lib/browser/math/exchangeStatus.d.ts +91 -0
  187. package/lib/browser/math/exchangeStatus.js +106 -3
  188. package/lib/browser/math/funding.d.ts +57 -20
  189. package/lib/browser/math/funding.js +63 -23
  190. package/lib/browser/math/insurance.d.ts +62 -0
  191. package/lib/browser/math/insurance.js +62 -0
  192. package/lib/browser/math/liquidation.d.ts +127 -11
  193. package/lib/browser/math/liquidation.js +182 -19
  194. package/lib/browser/math/margin.d.ts +79 -13
  195. package/lib/browser/math/margin.js +80 -14
  196. package/lib/browser/math/market.d.ts +135 -15
  197. package/lib/browser/math/market.js +145 -17
  198. package/lib/browser/math/oracles.d.ts +113 -0
  199. package/lib/browser/math/oracles.js +118 -1
  200. package/lib/browser/math/orders.d.ts +115 -10
  201. package/lib/browser/math/orders.js +130 -19
  202. package/lib/browser/math/position.d.ts +80 -33
  203. package/lib/browser/math/position.js +80 -33
  204. package/lib/browser/math/repeg.d.ts +48 -10
  205. package/lib/browser/math/repeg.js +48 -10
  206. package/lib/browser/math/spotBalance.d.ts +200 -5
  207. package/lib/browser/math/spotBalance.js +239 -10
  208. package/lib/browser/math/spotMarket.d.ts +36 -3
  209. package/lib/browser/math/spotMarket.js +36 -3
  210. package/lib/browser/math/spotPosition.d.ts +72 -0
  211. package/lib/browser/math/spotPosition.js +62 -0
  212. package/lib/browser/math/state.d.ts +31 -0
  213. package/lib/browser/math/state.js +31 -0
  214. package/lib/browser/math/superStake.d.ts +126 -2
  215. package/lib/browser/math/superStake.js +123 -3
  216. package/lib/browser/math/tiers.d.ts +29 -0
  217. package/lib/browser/math/tiers.js +29 -0
  218. package/lib/browser/math/trade.d.ts +102 -51
  219. package/lib/browser/math/trade.js +101 -55
  220. package/lib/browser/math/utils.d.ts +71 -9
  221. package/lib/browser/math/utils.js +71 -9
  222. package/lib/browser/memcmp.d.ts +94 -0
  223. package/lib/browser/memcmp.js +103 -2
  224. package/lib/browser/oracles/oracleClientCache.d.ts +16 -0
  225. package/lib/browser/oracles/oracleClientCache.js +16 -0
  226. package/lib/browser/oracles/oracleId.d.ts +31 -0
  227. package/lib/browser/oracles/oracleId.js +39 -8
  228. package/lib/browser/oracles/prelaunchOracleClient.d.ts +20 -0
  229. package/lib/browser/oracles/prelaunchOracleClient.js +20 -0
  230. package/lib/browser/oracles/pythClient.d.ts +31 -0
  231. package/lib/browser/oracles/pythClient.js +32 -1
  232. package/lib/browser/oracles/pythLazerClient.d.ts +34 -0
  233. package/lib/browser/oracles/pythLazerClient.js +35 -1
  234. package/lib/browser/oracles/quoteAssetOracleClient.d.ts +18 -0
  235. package/lib/browser/oracles/quoteAssetOracleClient.js +18 -0
  236. package/lib/browser/oracles/strictOraclePrice.d.ts +21 -0
  237. package/lib/browser/oracles/strictOraclePrice.js +21 -0
  238. package/lib/browser/oracles/types.d.ts +45 -0
  239. package/lib/browser/oracles/utils.d.ts +20 -0
  240. package/lib/browser/oracles/utils.js +20 -0
  241. package/lib/browser/orderParams.d.ts +42 -4
  242. package/lib/browser/orderParams.js +42 -4
  243. package/lib/browser/orderSubscriber/OrderSubscriber.d.ts +56 -0
  244. package/lib/browser/orderSubscriber/OrderSubscriber.js +56 -0
  245. package/lib/browser/orderSubscriber/PollingSubscription.d.ts +11 -0
  246. package/lib/browser/orderSubscriber/PollingSubscription.js +11 -0
  247. package/lib/browser/orderSubscriber/WebsocketSubscription.d.ts +18 -0
  248. package/lib/browser/orderSubscriber/WebsocketSubscription.js +18 -0
  249. package/lib/browser/orderSubscriber/grpcSubscription.d.ts +16 -0
  250. package/lib/browser/orderSubscriber/grpcSubscription.js +16 -0
  251. package/lib/browser/orderSubscriber/types.d.ts +9 -0
  252. package/lib/browser/priorityFee/averageOverSlotsStrategy.d.ts +1 -0
  253. package/lib/browser/priorityFee/averageOverSlotsStrategy.js +1 -0
  254. package/lib/browser/priorityFee/averageStrategy.d.ts +1 -0
  255. package/lib/browser/priorityFee/averageStrategy.js +1 -0
  256. package/lib/browser/priorityFee/ewmaStrategy.d.ts +10 -0
  257. package/lib/browser/priorityFee/ewmaStrategy.js +10 -0
  258. package/lib/browser/priorityFee/heliusPriorityFeeMethod.d.ts +13 -0
  259. package/lib/browser/priorityFee/heliusPriorityFeeMethod.js +9 -2
  260. package/lib/browser/priorityFee/maxOverSlotsStrategy.d.ts +1 -0
  261. package/lib/browser/priorityFee/maxOverSlotsStrategy.js +1 -0
  262. package/lib/browser/priorityFee/maxStrategy.d.ts +1 -0
  263. package/lib/browser/priorityFee/maxStrategy.js +1 -0
  264. package/lib/browser/priorityFee/priorityFeeSubscriber.d.ts +39 -0
  265. package/lib/browser/priorityFee/priorityFeeSubscriber.js +39 -0
  266. package/lib/browser/priorityFee/priorityFeeSubscriberMap.d.ts +20 -1
  267. package/lib/browser/priorityFee/priorityFeeSubscriberMap.js +21 -2
  268. package/lib/browser/priorityFee/solanaPriorityFeeMethod.d.ts +12 -0
  269. package/lib/browser/priorityFee/solanaPriorityFeeMethod.js +10 -0
  270. package/lib/browser/priorityFee/types.d.ts +32 -0
  271. package/lib/browser/priorityFee/types.js +5 -0
  272. package/lib/browser/priorityFee/velocityPriorityFeeMethod.d.ts +11 -0
  273. package/lib/browser/priorityFee/velocityPriorityFeeMethod.js +8 -0
  274. package/lib/browser/slot/SlotSubscriber.d.ts +18 -0
  275. package/lib/browser/slot/SlotSubscriber.js +16 -0
  276. package/lib/browser/slot/SlothashSubscriber.d.ts +26 -0
  277. package/lib/browser/slot/SlothashSubscriber.js +25 -1
  278. package/lib/browser/tx/baseTxSender.d.ts +163 -0
  279. package/lib/browser/tx/baseTxSender.js +174 -6
  280. package/lib/browser/tx/blockhashFetcher/baseBlockhashFetcher.d.ts +12 -0
  281. package/lib/browser/tx/blockhashFetcher/baseBlockhashFetcher.js +12 -0
  282. package/lib/browser/tx/blockhashFetcher/cachedBlockhashFetcher.d.ts +15 -0
  283. package/lib/browser/tx/blockhashFetcher/cachedBlockhashFetcher.js +15 -0
  284. package/lib/browser/tx/blockhashFetcher/types.d.ts +4 -0
  285. package/lib/browser/tx/fastSingleTxSender.d.ts +47 -0
  286. package/lib/browser/tx/fastSingleTxSender.js +48 -1
  287. package/lib/browser/tx/forwardOnlyTxSender.d.ts +48 -0
  288. package/lib/browser/tx/forwardOnlyTxSender.js +48 -0
  289. package/lib/browser/tx/reportTransactionError.d.ts +18 -6
  290. package/lib/browser/tx/reportTransactionError.js +18 -6
  291. package/lib/browser/tx/retryTxSender.d.ts +40 -0
  292. package/lib/browser/tx/retryTxSender.js +39 -0
  293. package/lib/browser/tx/txHandler.d.ts +146 -35
  294. package/lib/browser/tx/txHandler.js +132 -32
  295. package/lib/browser/tx/txParamProcessor.d.ts +47 -0
  296. package/lib/browser/tx/txParamProcessor.js +47 -0
  297. package/lib/browser/tx/types.d.ts +46 -0
  298. package/lib/browser/tx/types.js +5 -0
  299. package/lib/browser/tx/utils.d.ts +26 -0
  300. package/lib/browser/tx/utils.js +26 -0
  301. package/lib/browser/tx/whileValidTxSender.d.ts +82 -0
  302. package/lib/browser/tx/whileValidTxSender.js +81 -0
  303. package/lib/browser/types.d.ts +781 -13
  304. package/lib/browser/types.js +126 -9
  305. package/lib/browser/user.d.ts +645 -84
  306. package/lib/browser/user.js +779 -96
  307. package/lib/browser/userMap/PollingSubscription.d.ts +10 -0
  308. package/lib/browser/userMap/PollingSubscription.js +14 -2
  309. package/lib/browser/userMap/WebsocketSubscription.d.ts +9 -0
  310. package/lib/browser/userMap/WebsocketSubscription.js +9 -0
  311. package/lib/browser/userMap/grpcSubscription.d.ts +8 -0
  312. package/lib/browser/userMap/grpcSubscription.js +8 -0
  313. package/lib/browser/userMap/referrerMap.d.ts +72 -2
  314. package/lib/browser/userMap/referrerMap.js +84 -2
  315. package/lib/browser/userMap/revenueShareEscrowMap.d.ts +37 -10
  316. package/lib/browser/userMap/revenueShareEscrowMap.js +38 -11
  317. package/lib/browser/userMap/userMap.d.ts +81 -3
  318. package/lib/browser/userMap/userMap.js +81 -4
  319. package/lib/browser/userMap/userMapConfig.d.ts +23 -0
  320. package/lib/browser/userMap/userStatsMap.d.ts +22 -0
  321. package/lib/browser/userMap/userStatsMap.js +22 -0
  322. package/lib/browser/userName.d.ts +16 -0
  323. package/lib/browser/userName.js +16 -0
  324. package/lib/browser/userStats.d.ts +28 -1
  325. package/lib/browser/userStats.js +28 -1
  326. package/lib/browser/util/TransactionConfirmationManager.d.ts +33 -0
  327. package/lib/browser/util/TransactionConfirmationManager.js +33 -0
  328. package/lib/browser/util/chainClock.d.ts +24 -0
  329. package/lib/browser/util/chainClock.js +20 -0
  330. package/lib/browser/util/computeUnits.d.ts +32 -0
  331. package/lib/browser/util/computeUnits.js +32 -0
  332. package/lib/browser/util/digest.d.ts +17 -0
  333. package/lib/browser/util/digest.js +17 -0
  334. package/lib/browser/util/ed25519Utils.d.ts +12 -2
  335. package/lib/browser/util/ed25519Utils.js +12 -2
  336. package/lib/browser/util/promiseTimeout.d.ts +9 -0
  337. package/lib/browser/util/promiseTimeout.js +9 -0
  338. package/lib/browser/velocityClient.d.ts +3322 -215
  339. package/lib/browser/velocityClient.js +3412 -245
  340. package/lib/browser/wallet.d.ts +37 -0
  341. package/lib/browser/wallet.js +37 -0
  342. package/lib/node/accounts/basicUserAccountSubscriber.d.ts +18 -0
  343. package/lib/node/accounts/basicUserAccountSubscriber.d.ts.map +1 -1
  344. package/lib/node/accounts/basicUserAccountSubscriber.js +18 -0
  345. package/lib/node/accounts/basicUserStatsAccountSubscriber.d.ts +18 -0
  346. package/lib/node/accounts/basicUserStatsAccountSubscriber.d.ts.map +1 -1
  347. package/lib/node/accounts/basicUserStatsAccountSubscriber.js +18 -0
  348. package/lib/node/accounts/bulkAccountLoader.d.ts +52 -0
  349. package/lib/node/accounts/bulkAccountLoader.d.ts.map +1 -1
  350. package/lib/node/accounts/bulkAccountLoader.js +51 -0
  351. package/lib/node/accounts/bulkUserStatsSubscription.d.ts +9 -2
  352. package/lib/node/accounts/bulkUserStatsSubscription.d.ts.map +1 -1
  353. package/lib/node/accounts/bulkUserStatsSubscription.js +9 -2
  354. package/lib/node/accounts/bulkUserSubscription.d.ts +8 -2
  355. package/lib/node/accounts/bulkUserSubscription.d.ts.map +1 -1
  356. package/lib/node/accounts/bulkUserSubscription.js +8 -2
  357. package/lib/node/accounts/customizedCadenceBulkAccountLoader.d.ts +37 -0
  358. package/lib/node/accounts/customizedCadenceBulkAccountLoader.d.ts.map +1 -1
  359. package/lib/node/accounts/customizedCadenceBulkAccountLoader.js +37 -0
  360. package/lib/node/accounts/fetch.d.ts +59 -2
  361. package/lib/node/accounts/fetch.d.ts.map +1 -1
  362. package/lib/node/accounts/fetch.js +57 -2
  363. package/lib/node/accounts/grpcAccountSubscriber.d.ts +30 -0
  364. package/lib/node/accounts/grpcAccountSubscriber.d.ts.map +1 -1
  365. package/lib/node/accounts/grpcAccountSubscriber.js +30 -0
  366. package/lib/node/accounts/grpcInsuranceFundStakeAccountSubscriber.d.ts +16 -0
  367. package/lib/node/accounts/grpcInsuranceFundStakeAccountSubscriber.d.ts.map +1 -1
  368. package/lib/node/accounts/grpcInsuranceFundStakeAccountSubscriber.js +16 -0
  369. package/lib/node/accounts/grpcMultiAccountSubscriber.d.ts +60 -1
  370. package/lib/node/accounts/grpcMultiAccountSubscriber.d.ts.map +1 -1
  371. package/lib/node/accounts/grpcMultiAccountSubscriber.js +118 -37
  372. package/lib/node/accounts/grpcMultiUserAccountSubscriber.d.ts +32 -0
  373. package/lib/node/accounts/grpcMultiUserAccountSubscriber.d.ts.map +1 -1
  374. package/lib/node/accounts/grpcMultiUserAccountSubscriber.js +40 -12
  375. package/lib/node/accounts/grpcProgramAccountSubscriber.d.ts +33 -0
  376. package/lib/node/accounts/grpcProgramAccountSubscriber.d.ts.map +1 -1
  377. package/lib/node/accounts/grpcProgramAccountSubscriber.js +33 -0
  378. package/lib/node/accounts/grpcUserAccountSubscriber.d.ts +15 -0
  379. package/lib/node/accounts/grpcUserAccountSubscriber.d.ts.map +1 -1
  380. package/lib/node/accounts/grpcUserAccountSubscriber.js +15 -0
  381. package/lib/node/accounts/grpcUserStatsAccountSubscriber.d.ts +15 -0
  382. package/lib/node/accounts/grpcUserStatsAccountSubscriber.d.ts.map +1 -1
  383. package/lib/node/accounts/grpcUserStatsAccountSubscriber.js +15 -0
  384. package/lib/node/accounts/grpcVelocityClientAccountSubscriber.d.ts +41 -0
  385. package/lib/node/accounts/grpcVelocityClientAccountSubscriber.d.ts.map +1 -1
  386. package/lib/node/accounts/grpcVelocityClientAccountSubscriber.js +41 -0
  387. package/lib/node/accounts/grpcVelocityClientAccountSubscriberV2.d.ts +116 -0
  388. package/lib/node/accounts/grpcVelocityClientAccountSubscriberV2.d.ts.map +1 -1
  389. package/lib/node/accounts/grpcVelocityClientAccountSubscriberV2.js +152 -1
  390. package/lib/node/accounts/laserProgramAccountSubscriber.d.ts +34 -0
  391. package/lib/node/accounts/laserProgramAccountSubscriber.d.ts.map +1 -1
  392. package/lib/node/accounts/laserProgramAccountSubscriber.js +34 -0
  393. package/lib/node/accounts/oneShotUserAccountSubscriber.d.ts +19 -0
  394. package/lib/node/accounts/oneShotUserAccountSubscriber.d.ts.map +1 -1
  395. package/lib/node/accounts/oneShotUserAccountSubscriber.js +19 -0
  396. package/lib/node/accounts/oneShotUserStatsAccountSubscriber.d.ts +19 -0
  397. package/lib/node/accounts/oneShotUserStatsAccountSubscriber.d.ts.map +1 -1
  398. package/lib/node/accounts/oneShotUserStatsAccountSubscriber.js +19 -0
  399. package/lib/node/accounts/pollingInsuranceFundStakeAccountSubscriber.d.ts +31 -0
  400. package/lib/node/accounts/pollingInsuranceFundStakeAccountSubscriber.d.ts.map +1 -1
  401. package/lib/node/accounts/pollingInsuranceFundStakeAccountSubscriber.js +31 -0
  402. package/lib/node/accounts/pollingOracleAccountSubscriber.d.ts +19 -0
  403. package/lib/node/accounts/pollingOracleAccountSubscriber.d.ts.map +1 -1
  404. package/lib/node/accounts/pollingOracleAccountSubscriber.js +21 -2
  405. package/lib/node/accounts/pollingTokenAccountSubscriber.d.ts +22 -0
  406. package/lib/node/accounts/pollingTokenAccountSubscriber.d.ts.map +1 -1
  407. package/lib/node/accounts/pollingTokenAccountSubscriber.js +22 -0
  408. package/lib/node/accounts/pollingUserAccountSubscriber.d.ts +32 -0
  409. package/lib/node/accounts/pollingUserAccountSubscriber.d.ts.map +1 -1
  410. package/lib/node/accounts/pollingUserAccountSubscriber.js +32 -0
  411. package/lib/node/accounts/pollingUserStatsAccountSubscriber.d.ts +22 -0
  412. package/lib/node/accounts/pollingUserStatsAccountSubscriber.d.ts.map +1 -1
  413. package/lib/node/accounts/pollingUserStatsAccountSubscriber.js +22 -0
  414. package/lib/node/accounts/pollingVelocityClientAccountSubscriber.d.ts +83 -0
  415. package/lib/node/accounts/pollingVelocityClientAccountSubscriber.d.ts.map +1 -1
  416. package/lib/node/accounts/pollingVelocityClientAccountSubscriber.js +84 -1
  417. package/lib/node/accounts/testBulkAccountLoader.d.ts +8 -0
  418. package/lib/node/accounts/testBulkAccountLoader.d.ts.map +1 -1
  419. package/lib/node/accounts/testBulkAccountLoader.js +8 -0
  420. package/lib/node/accounts/types.d.ts +149 -0
  421. package/lib/node/accounts/types.d.ts.map +1 -1
  422. package/lib/node/accounts/types.js +13 -0
  423. package/lib/node/accounts/utils.d.ts +18 -0
  424. package/lib/node/accounts/utils.d.ts.map +1 -1
  425. package/lib/node/accounts/utils.js +32 -16
  426. package/lib/node/accounts/webSocketAccountSubscriber.d.ts +41 -0
  427. package/lib/node/accounts/webSocketAccountSubscriber.d.ts.map +1 -1
  428. package/lib/node/accounts/webSocketAccountSubscriber.js +41 -0
  429. package/lib/node/accounts/webSocketAccountSubscriberV2.d.ts +31 -0
  430. package/lib/node/accounts/webSocketAccountSubscriberV2.d.ts.map +1 -1
  431. package/lib/node/accounts/webSocketAccountSubscriberV2.js +31 -23
  432. package/lib/node/accounts/webSocketInsuranceFundStakeAccountSubscriber.d.ts +27 -0
  433. package/lib/node/accounts/webSocketInsuranceFundStakeAccountSubscriber.d.ts.map +1 -1
  434. package/lib/node/accounts/webSocketInsuranceFundStakeAccountSubscriber.js +27 -0
  435. package/lib/node/accounts/webSocketProgramAccountSubscriber.d.ts +36 -0
  436. package/lib/node/accounts/webSocketProgramAccountSubscriber.d.ts.map +1 -1
  437. package/lib/node/accounts/webSocketProgramAccountSubscriber.js +36 -0
  438. package/lib/node/accounts/webSocketProgramAccountSubscriberV2.d.ts +21 -0
  439. package/lib/node/accounts/webSocketProgramAccountSubscriberV2.d.ts.map +1 -1
  440. package/lib/node/accounts/webSocketProgramAccountSubscriberV2.js +25 -0
  441. package/lib/node/accounts/webSocketProgramAccountsSubscriberV2.d.ts +21 -0
  442. package/lib/node/accounts/webSocketProgramAccountsSubscriberV2.d.ts.map +1 -1
  443. package/lib/node/accounts/webSocketProgramAccountsSubscriberV2.js +21 -0
  444. package/lib/node/accounts/webSocketUserAccountSubscriber.d.ts +26 -0
  445. package/lib/node/accounts/webSocketUserAccountSubscriber.d.ts.map +1 -1
  446. package/lib/node/accounts/webSocketUserAccountSubscriber.js +26 -0
  447. package/lib/node/accounts/webSocketUserStatsAccountSubsriber.d.ts +20 -0
  448. package/lib/node/accounts/webSocketUserStatsAccountSubsriber.d.ts.map +1 -1
  449. package/lib/node/accounts/webSocketUserStatsAccountSubsriber.js +20 -0
  450. package/lib/node/accounts/webSocketVelocityClientAccountSubscriber.d.ts +121 -0
  451. package/lib/node/accounts/webSocketVelocityClientAccountSubscriber.d.ts.map +1 -1
  452. package/lib/node/accounts/webSocketVelocityClientAccountSubscriber.js +123 -2
  453. package/lib/node/accounts/webSocketVelocityClientAccountSubscriberV2.d.ts +96 -0
  454. package/lib/node/accounts/webSocketVelocityClientAccountSubscriberV2.d.ts.map +1 -1
  455. package/lib/node/accounts/webSocketVelocityClientAccountSubscriberV2.js +108 -0
  456. package/lib/node/accounts/websocketProgramUserAccountSubscriber.d.ts +28 -0
  457. package/lib/node/accounts/websocketProgramUserAccountSubscriber.d.ts.map +1 -1
  458. package/lib/node/accounts/websocketProgramUserAccountSubscriber.js +33 -0
  459. package/lib/node/addresses/marketAddresses.d.ts +10 -0
  460. package/lib/node/addresses/marketAddresses.d.ts.map +1 -1
  461. package/lib/node/addresses/marketAddresses.js +10 -0
  462. package/lib/node/addresses/pda.d.ts +214 -2
  463. package/lib/node/addresses/pda.d.ts.map +1 -1
  464. package/lib/node/addresses/pda.js +217 -5
  465. package/lib/node/adminClient.d.ts +2136 -4
  466. package/lib/node/adminClient.d.ts.map +1 -1
  467. package/lib/node/adminClient.js +2150 -4
  468. package/lib/node/auctionSubscriber/auctionSubscriber.d.ts +15 -0
  469. package/lib/node/auctionSubscriber/auctionSubscriber.d.ts.map +1 -1
  470. package/lib/node/auctionSubscriber/auctionSubscriber.js +15 -0
  471. package/lib/node/auctionSubscriber/auctionSubscriberGrpc.d.ts +19 -0
  472. package/lib/node/auctionSubscriber/auctionSubscriberGrpc.d.ts.map +1 -1
  473. package/lib/node/auctionSubscriber/auctionSubscriberGrpc.js +19 -0
  474. package/lib/node/auctionSubscriber/index.d.ts +6 -0
  475. package/lib/node/auctionSubscriber/index.d.ts.map +1 -1
  476. package/lib/node/auctionSubscriber/index.js +6 -0
  477. package/lib/node/auctionSubscriber/types.d.ts +7 -0
  478. package/lib/node/auctionSubscriber/types.d.ts.map +1 -1
  479. package/lib/node/blockhashSubscriber/BlockhashSubscriber.d.ts +33 -0
  480. package/lib/node/blockhashSubscriber/BlockhashSubscriber.d.ts.map +1 -1
  481. package/lib/node/blockhashSubscriber/BlockhashSubscriber.js +33 -0
  482. package/lib/node/blockhashSubscriber/index.d.ts +5 -0
  483. package/lib/node/blockhashSubscriber/index.d.ts.map +1 -1
  484. package/lib/node/blockhashSubscriber/index.js +5 -0
  485. package/lib/node/blockhashSubscriber/types.d.ts +5 -0
  486. package/lib/node/blockhashSubscriber/types.d.ts.map +1 -1
  487. package/lib/node/clock/clockSubscriber.d.ts +24 -0
  488. package/lib/node/clock/clockSubscriber.d.ts.map +1 -1
  489. package/lib/node/clock/clockSubscriber.js +22 -0
  490. package/lib/node/config.d.ts +58 -4
  491. package/lib/node/config.d.ts.map +1 -1
  492. package/lib/node/config.js +88 -21
  493. package/lib/node/constants/numericConstants.d.ts +67 -0
  494. package/lib/node/constants/numericConstants.d.ts.map +1 -1
  495. package/lib/node/constants/numericConstants.js +68 -1
  496. package/lib/node/constants/perpMarkets.d.ts +10 -0
  497. package/lib/node/constants/perpMarkets.d.ts.map +1 -1
  498. package/lib/node/constants/perpMarkets.js +40 -908
  499. package/lib/node/constants/spotMarkets.d.ts +13 -0
  500. package/lib/node/constants/spotMarkets.d.ts.map +1 -1
  501. package/lib/node/constants/spotMarkets.js +16 -742
  502. package/lib/node/constants/txConstants.d.ts +1 -0
  503. package/lib/node/constants/txConstants.d.ts.map +1 -1
  504. package/lib/node/constants/txConstants.js +1 -0
  505. package/lib/node/core/VelocityCore.d.ts +285 -8
  506. package/lib/node/core/VelocityCore.d.ts.map +1 -1
  507. package/lib/node/core/VelocityCore.js +281 -8
  508. package/lib/node/core/instructions/deposit.d.ts +22 -0
  509. package/lib/node/core/instructions/deposit.d.ts.map +1 -1
  510. package/lib/node/core/instructions/deposit.js +22 -0
  511. package/lib/node/core/instructions/fill.d.ts +17 -0
  512. package/lib/node/core/instructions/fill.d.ts.map +1 -1
  513. package/lib/node/core/instructions/fill.js +17 -0
  514. package/lib/node/core/instructions/funding.d.ts +12 -0
  515. package/lib/node/core/instructions/funding.d.ts.map +1 -1
  516. package/lib/node/core/instructions/funding.js +12 -0
  517. package/lib/node/core/instructions/liquidation.d.ts +18 -0
  518. package/lib/node/core/instructions/liquidation.d.ts.map +1 -1
  519. package/lib/node/core/instructions/liquidation.js +18 -0
  520. package/lib/node/core/instructions/orders.d.ts +28 -0
  521. package/lib/node/core/instructions/orders.d.ts.map +1 -1
  522. package/lib/node/core/instructions/orders.js +28 -0
  523. package/lib/node/core/instructions/perpOrders.d.ts +106 -0
  524. package/lib/node/core/instructions/perpOrders.d.ts.map +1 -1
  525. package/lib/node/core/instructions/perpOrders.js +106 -0
  526. package/lib/node/core/instructions/settlement.d.ts +14 -0
  527. package/lib/node/core/instructions/settlement.d.ts.map +1 -1
  528. package/lib/node/core/instructions/settlement.js +14 -0
  529. package/lib/node/core/instructions/trigger.d.ts +15 -0
  530. package/lib/node/core/instructions/trigger.d.ts.map +1 -1
  531. package/lib/node/core/instructions/trigger.js +15 -0
  532. package/lib/node/core/instructions/withdraw.d.ts +21 -0
  533. package/lib/node/core/instructions/withdraw.d.ts.map +1 -1
  534. package/lib/node/core/instructions/withdraw.js +21 -0
  535. package/lib/node/core/remainingAccounts.d.ts +47 -3
  536. package/lib/node/core/remainingAccounts.d.ts.map +1 -1
  537. package/lib/node/core/remainingAccounts.js +20 -0
  538. package/lib/node/core/signedMsg.d.ts +38 -0
  539. package/lib/node/core/signedMsg.d.ts.map +1 -1
  540. package/lib/node/core/signedMsg.js +33 -0
  541. package/lib/node/decode/customCoder.d.ts +39 -3
  542. package/lib/node/decode/customCoder.d.ts.map +1 -1
  543. package/lib/node/decode/customCoder.js +45 -3
  544. package/lib/node/decode/user.d.ts +22 -0
  545. package/lib/node/decode/user.d.ts.map +1 -1
  546. package/lib/node/decode/user.js +22 -0
  547. package/lib/node/dlob/DLOB.d.ts +502 -53
  548. package/lib/node/dlob/DLOB.d.ts.map +1 -1
  549. package/lib/node/dlob/DLOB.js +540 -98
  550. package/lib/node/dlob/DLOBNode.d.ts +86 -4
  551. package/lib/node/dlob/DLOBNode.d.ts.map +1 -1
  552. package/lib/node/dlob/DLOBNode.js +37 -4
  553. package/lib/node/dlob/DLOBSubscriber.d.ts +39 -12
  554. package/lib/node/dlob/DLOBSubscriber.d.ts.map +1 -1
  555. package/lib/node/dlob/DLOBSubscriber.js +42 -12
  556. package/lib/node/dlob/NodeList.d.ts +69 -0
  557. package/lib/node/dlob/NodeList.d.ts.map +1 -1
  558. package/lib/node/dlob/NodeList.js +66 -0
  559. package/lib/node/dlob/orderBookLevels.d.ts +106 -13
  560. package/lib/node/dlob/orderBookLevels.d.ts.map +1 -1
  561. package/lib/node/dlob/orderBookLevels.js +84 -14
  562. package/lib/node/dlob/types.d.ts +15 -0
  563. package/lib/node/dlob/types.d.ts.map +1 -1
  564. package/lib/node/events/eventList.d.ts +14 -0
  565. package/lib/node/events/eventList.d.ts.map +1 -1
  566. package/lib/node/events/eventList.js +14 -0
  567. package/lib/node/events/eventSubscriber.d.ts +87 -10
  568. package/lib/node/events/eventSubscriber.d.ts.map +1 -1
  569. package/lib/node/events/eventSubscriber.js +93 -8
  570. package/lib/node/events/eventsServerLogProvider.d.ts +22 -0
  571. package/lib/node/events/eventsServerLogProvider.d.ts.map +1 -1
  572. package/lib/node/events/eventsServerLogProvider.js +27 -0
  573. package/lib/node/events/fetchLogs.d.ts +31 -0
  574. package/lib/node/events/fetchLogs.d.ts.map +1 -1
  575. package/lib/node/events/fetchLogs.js +46 -1
  576. package/lib/node/events/parse.d.ts +23 -0
  577. package/lib/node/events/parse.d.ts.map +1 -1
  578. package/lib/node/events/parse.js +23 -0
  579. package/lib/node/events/pollingLogProvider.d.ts +24 -0
  580. package/lib/node/events/pollingLogProvider.d.ts.map +1 -1
  581. package/lib/node/events/pollingLogProvider.js +24 -0
  582. package/lib/node/events/sort.d.ts +11 -0
  583. package/lib/node/events/sort.d.ts.map +1 -1
  584. package/lib/node/events/sort.js +12 -0
  585. package/lib/node/events/txEventCache.d.ts +13 -3
  586. package/lib/node/events/txEventCache.d.ts.map +1 -1
  587. package/lib/node/events/txEventCache.js +19 -7
  588. package/lib/node/events/types.d.ts +118 -2
  589. package/lib/node/events/types.d.ts.map +1 -1
  590. package/lib/node/events/types.js +11 -0
  591. package/lib/node/events/webSocketLogProvider.d.ts +23 -0
  592. package/lib/node/events/webSocketLogProvider.d.ts.map +1 -1
  593. package/lib/node/events/webSocketLogProvider.js +28 -0
  594. package/lib/node/factory/oracleClient.js +2 -2
  595. package/lib/node/idl/velocity.d.ts +4 -4
  596. package/lib/node/idl/velocity.d.ts.map +1 -1
  597. package/lib/node/idl/velocity.json +4 -4
  598. package/lib/node/keypair.d.ts +8 -0
  599. package/lib/node/keypair.d.ts.map +1 -1
  600. package/lib/node/keypair.js +8 -0
  601. package/lib/node/marginCalculation.d.ts +134 -2
  602. package/lib/node/marginCalculation.d.ts.map +1 -1
  603. package/lib/node/marginCalculation.js +121 -0
  604. package/lib/node/math/amm.d.ts +348 -29
  605. package/lib/node/math/amm.d.ts.map +1 -1
  606. package/lib/node/math/amm.js +310 -32
  607. package/lib/node/math/auction.d.ts +95 -19
  608. package/lib/node/math/auction.d.ts.map +1 -1
  609. package/lib/node/math/auction.js +118 -28
  610. package/lib/node/math/bankruptcy.d.ts +46 -0
  611. package/lib/node/math/bankruptcy.d.ts.map +1 -1
  612. package/lib/node/math/bankruptcy.js +89 -1
  613. package/lib/node/math/builder.d.ts +64 -8
  614. package/lib/node/math/builder.d.ts.map +1 -1
  615. package/lib/node/math/builder.js +71 -9
  616. package/lib/node/math/conversion.d.ts +21 -0
  617. package/lib/node/math/conversion.d.ts.map +1 -1
  618. package/lib/node/math/conversion.js +21 -0
  619. package/lib/node/math/exchangeStatus.d.ts +91 -0
  620. package/lib/node/math/exchangeStatus.d.ts.map +1 -1
  621. package/lib/node/math/exchangeStatus.js +106 -3
  622. package/lib/node/math/funding.d.ts +57 -20
  623. package/lib/node/math/funding.d.ts.map +1 -1
  624. package/lib/node/math/funding.js +63 -23
  625. package/lib/node/math/insurance.d.ts +62 -0
  626. package/lib/node/math/insurance.d.ts.map +1 -1
  627. package/lib/node/math/insurance.js +62 -0
  628. package/lib/node/math/liquidation.d.ts +127 -11
  629. package/lib/node/math/liquidation.d.ts.map +1 -1
  630. package/lib/node/math/liquidation.js +182 -19
  631. package/lib/node/math/margin.d.ts +79 -13
  632. package/lib/node/math/margin.d.ts.map +1 -1
  633. package/lib/node/math/margin.js +80 -14
  634. package/lib/node/math/market.d.ts +135 -15
  635. package/lib/node/math/market.d.ts.map +1 -1
  636. package/lib/node/math/market.js +145 -17
  637. package/lib/node/math/oracles.d.ts +113 -0
  638. package/lib/node/math/oracles.d.ts.map +1 -1
  639. package/lib/node/math/oracles.js +118 -1
  640. package/lib/node/math/orders.d.ts +115 -10
  641. package/lib/node/math/orders.d.ts.map +1 -1
  642. package/lib/node/math/orders.js +130 -19
  643. package/lib/node/math/position.d.ts +80 -33
  644. package/lib/node/math/position.d.ts.map +1 -1
  645. package/lib/node/math/position.js +80 -33
  646. package/lib/node/math/repeg.d.ts +48 -10
  647. package/lib/node/math/repeg.d.ts.map +1 -1
  648. package/lib/node/math/repeg.js +48 -10
  649. package/lib/node/math/spotBalance.d.ts +200 -5
  650. package/lib/node/math/spotBalance.d.ts.map +1 -1
  651. package/lib/node/math/spotBalance.js +239 -10
  652. package/lib/node/math/spotMarket.d.ts +36 -3
  653. package/lib/node/math/spotMarket.d.ts.map +1 -1
  654. package/lib/node/math/spotMarket.js +36 -3
  655. package/lib/node/math/spotPosition.d.ts +72 -0
  656. package/lib/node/math/spotPosition.d.ts.map +1 -1
  657. package/lib/node/math/spotPosition.js +62 -0
  658. package/lib/node/math/state.d.ts +31 -0
  659. package/lib/node/math/state.d.ts.map +1 -1
  660. package/lib/node/math/state.js +31 -0
  661. package/lib/node/math/superStake.d.ts +126 -2
  662. package/lib/node/math/superStake.d.ts.map +1 -1
  663. package/lib/node/math/superStake.js +123 -3
  664. package/lib/node/math/tiers.d.ts +29 -0
  665. package/lib/node/math/tiers.d.ts.map +1 -1
  666. package/lib/node/math/tiers.js +29 -0
  667. package/lib/node/math/trade.d.ts +102 -51
  668. package/lib/node/math/trade.d.ts.map +1 -1
  669. package/lib/node/math/trade.js +101 -55
  670. package/lib/node/math/utils.d.ts +71 -9
  671. package/lib/node/math/utils.d.ts.map +1 -1
  672. package/lib/node/math/utils.js +71 -9
  673. package/lib/node/memcmp.d.ts +94 -0
  674. package/lib/node/memcmp.d.ts.map +1 -1
  675. package/lib/node/memcmp.js +103 -2
  676. package/lib/node/oracles/oracleClientCache.d.ts +16 -0
  677. package/lib/node/oracles/oracleClientCache.d.ts.map +1 -1
  678. package/lib/node/oracles/oracleClientCache.js +16 -0
  679. package/lib/node/oracles/oracleId.d.ts +31 -0
  680. package/lib/node/oracles/oracleId.d.ts.map +1 -1
  681. package/lib/node/oracles/oracleId.js +39 -8
  682. package/lib/node/oracles/prelaunchOracleClient.d.ts +20 -0
  683. package/lib/node/oracles/prelaunchOracleClient.d.ts.map +1 -1
  684. package/lib/node/oracles/prelaunchOracleClient.js +20 -0
  685. package/lib/node/oracles/pythClient.d.ts +31 -0
  686. package/lib/node/oracles/pythClient.d.ts.map +1 -1
  687. package/lib/node/oracles/pythClient.js +32 -1
  688. package/lib/node/oracles/pythLazerClient.d.ts +34 -0
  689. package/lib/node/oracles/pythLazerClient.d.ts.map +1 -1
  690. package/lib/node/oracles/pythLazerClient.js +35 -1
  691. package/lib/node/oracles/quoteAssetOracleClient.d.ts +18 -0
  692. package/lib/node/oracles/quoteAssetOracleClient.d.ts.map +1 -1
  693. package/lib/node/oracles/quoteAssetOracleClient.js +18 -0
  694. package/lib/node/oracles/strictOraclePrice.d.ts +21 -0
  695. package/lib/node/oracles/strictOraclePrice.d.ts.map +1 -1
  696. package/lib/node/oracles/strictOraclePrice.js +21 -0
  697. package/lib/node/oracles/types.d.ts +45 -0
  698. package/lib/node/oracles/types.d.ts.map +1 -1
  699. package/lib/node/oracles/utils.d.ts +20 -0
  700. package/lib/node/oracles/utils.d.ts.map +1 -1
  701. package/lib/node/oracles/utils.js +20 -0
  702. package/lib/node/orderParams.d.ts +42 -4
  703. package/lib/node/orderParams.d.ts.map +1 -1
  704. package/lib/node/orderParams.js +42 -4
  705. package/lib/node/orderSubscriber/OrderSubscriber.d.ts +56 -0
  706. package/lib/node/orderSubscriber/OrderSubscriber.d.ts.map +1 -1
  707. package/lib/node/orderSubscriber/OrderSubscriber.js +56 -0
  708. package/lib/node/orderSubscriber/PollingSubscription.d.ts +11 -0
  709. package/lib/node/orderSubscriber/PollingSubscription.d.ts.map +1 -1
  710. package/lib/node/orderSubscriber/PollingSubscription.js +11 -0
  711. package/lib/node/orderSubscriber/WebsocketSubscription.d.ts +18 -0
  712. package/lib/node/orderSubscriber/WebsocketSubscription.d.ts.map +1 -1
  713. package/lib/node/orderSubscriber/WebsocketSubscription.js +18 -0
  714. package/lib/node/orderSubscriber/grpcSubscription.d.ts +16 -0
  715. package/lib/node/orderSubscriber/grpcSubscription.d.ts.map +1 -1
  716. package/lib/node/orderSubscriber/grpcSubscription.js +16 -0
  717. package/lib/node/orderSubscriber/types.d.ts +9 -0
  718. package/lib/node/orderSubscriber/types.d.ts.map +1 -1
  719. package/lib/node/priorityFee/averageOverSlotsStrategy.d.ts +1 -0
  720. package/lib/node/priorityFee/averageOverSlotsStrategy.d.ts.map +1 -1
  721. package/lib/node/priorityFee/averageOverSlotsStrategy.js +1 -0
  722. package/lib/node/priorityFee/averageStrategy.d.ts +1 -0
  723. package/lib/node/priorityFee/averageStrategy.d.ts.map +1 -1
  724. package/lib/node/priorityFee/averageStrategy.js +1 -0
  725. package/lib/node/priorityFee/ewmaStrategy.d.ts +10 -0
  726. package/lib/node/priorityFee/ewmaStrategy.d.ts.map +1 -1
  727. package/lib/node/priorityFee/ewmaStrategy.js +10 -0
  728. package/lib/node/priorityFee/heliusPriorityFeeMethod.d.ts +13 -0
  729. package/lib/node/priorityFee/heliusPriorityFeeMethod.d.ts.map +1 -1
  730. package/lib/node/priorityFee/heliusPriorityFeeMethod.js +9 -2
  731. package/lib/node/priorityFee/maxOverSlotsStrategy.d.ts +1 -0
  732. package/lib/node/priorityFee/maxOverSlotsStrategy.d.ts.map +1 -1
  733. package/lib/node/priorityFee/maxOverSlotsStrategy.js +1 -0
  734. package/lib/node/priorityFee/maxStrategy.d.ts +1 -0
  735. package/lib/node/priorityFee/maxStrategy.d.ts.map +1 -1
  736. package/lib/node/priorityFee/maxStrategy.js +1 -0
  737. package/lib/node/priorityFee/priorityFeeSubscriber.d.ts +39 -0
  738. package/lib/node/priorityFee/priorityFeeSubscriber.d.ts.map +1 -1
  739. package/lib/node/priorityFee/priorityFeeSubscriber.js +39 -0
  740. package/lib/node/priorityFee/priorityFeeSubscriberMap.d.ts +20 -1
  741. package/lib/node/priorityFee/priorityFeeSubscriberMap.d.ts.map +1 -1
  742. package/lib/node/priorityFee/priorityFeeSubscriberMap.js +21 -2
  743. package/lib/node/priorityFee/solanaPriorityFeeMethod.d.ts +12 -0
  744. package/lib/node/priorityFee/solanaPriorityFeeMethod.d.ts.map +1 -1
  745. package/lib/node/priorityFee/solanaPriorityFeeMethod.js +10 -0
  746. package/lib/node/priorityFee/types.d.ts +32 -0
  747. package/lib/node/priorityFee/types.d.ts.map +1 -1
  748. package/lib/node/priorityFee/types.js +5 -0
  749. package/lib/node/priorityFee/velocityPriorityFeeMethod.d.ts +11 -0
  750. package/lib/node/priorityFee/velocityPriorityFeeMethod.d.ts.map +1 -1
  751. package/lib/node/priorityFee/velocityPriorityFeeMethod.js +8 -0
  752. package/lib/node/slot/SlotSubscriber.d.ts +18 -0
  753. package/lib/node/slot/SlotSubscriber.d.ts.map +1 -1
  754. package/lib/node/slot/SlotSubscriber.js +16 -0
  755. package/lib/node/slot/SlothashSubscriber.d.ts +26 -0
  756. package/lib/node/slot/SlothashSubscriber.d.ts.map +1 -1
  757. package/lib/node/slot/SlothashSubscriber.js +25 -1
  758. package/lib/node/tx/baseTxSender.d.ts +163 -0
  759. package/lib/node/tx/baseTxSender.d.ts.map +1 -1
  760. package/lib/node/tx/baseTxSender.js +174 -6
  761. package/lib/node/tx/blockhashFetcher/baseBlockhashFetcher.d.ts +12 -0
  762. package/lib/node/tx/blockhashFetcher/baseBlockhashFetcher.d.ts.map +1 -1
  763. package/lib/node/tx/blockhashFetcher/baseBlockhashFetcher.js +12 -0
  764. package/lib/node/tx/blockhashFetcher/cachedBlockhashFetcher.d.ts +15 -0
  765. package/lib/node/tx/blockhashFetcher/cachedBlockhashFetcher.d.ts.map +1 -1
  766. package/lib/node/tx/blockhashFetcher/cachedBlockhashFetcher.js +15 -0
  767. package/lib/node/tx/blockhashFetcher/types.d.ts +4 -0
  768. package/lib/node/tx/blockhashFetcher/types.d.ts.map +1 -1
  769. package/lib/node/tx/fastSingleTxSender.d.ts +47 -0
  770. package/lib/node/tx/fastSingleTxSender.d.ts.map +1 -1
  771. package/lib/node/tx/fastSingleTxSender.js +48 -1
  772. package/lib/node/tx/forwardOnlyTxSender.d.ts +48 -0
  773. package/lib/node/tx/forwardOnlyTxSender.d.ts.map +1 -1
  774. package/lib/node/tx/forwardOnlyTxSender.js +48 -0
  775. package/lib/node/tx/reportTransactionError.d.ts +18 -6
  776. package/lib/node/tx/reportTransactionError.d.ts.map +1 -1
  777. package/lib/node/tx/reportTransactionError.js +18 -6
  778. package/lib/node/tx/retryTxSender.d.ts +40 -0
  779. package/lib/node/tx/retryTxSender.d.ts.map +1 -1
  780. package/lib/node/tx/retryTxSender.js +39 -0
  781. package/lib/node/tx/txHandler.d.ts +146 -35
  782. package/lib/node/tx/txHandler.d.ts.map +1 -1
  783. package/lib/node/tx/txHandler.js +132 -32
  784. package/lib/node/tx/txParamProcessor.d.ts +47 -0
  785. package/lib/node/tx/txParamProcessor.d.ts.map +1 -1
  786. package/lib/node/tx/txParamProcessor.js +47 -0
  787. package/lib/node/tx/types.d.ts +46 -0
  788. package/lib/node/tx/types.d.ts.map +1 -1
  789. package/lib/node/tx/types.js +5 -0
  790. package/lib/node/tx/utils.d.ts +26 -0
  791. package/lib/node/tx/utils.d.ts.map +1 -1
  792. package/lib/node/tx/utils.js +26 -0
  793. package/lib/node/tx/whileValidTxSender.d.ts +82 -0
  794. package/lib/node/tx/whileValidTxSender.d.ts.map +1 -1
  795. package/lib/node/tx/whileValidTxSender.js +81 -0
  796. package/lib/node/types.d.ts +781 -13
  797. package/lib/node/types.d.ts.map +1 -1
  798. package/lib/node/types.js +126 -9
  799. package/lib/node/user.d.ts +645 -84
  800. package/lib/node/user.d.ts.map +1 -1
  801. package/lib/node/user.js +779 -96
  802. package/lib/node/userMap/PollingSubscription.d.ts +10 -0
  803. package/lib/node/userMap/PollingSubscription.d.ts.map +1 -1
  804. package/lib/node/userMap/PollingSubscription.js +14 -2
  805. package/lib/node/userMap/WebsocketSubscription.d.ts +9 -0
  806. package/lib/node/userMap/WebsocketSubscription.d.ts.map +1 -1
  807. package/lib/node/userMap/WebsocketSubscription.js +9 -0
  808. package/lib/node/userMap/grpcSubscription.d.ts +8 -0
  809. package/lib/node/userMap/grpcSubscription.d.ts.map +1 -1
  810. package/lib/node/userMap/grpcSubscription.js +8 -0
  811. package/lib/node/userMap/referrerMap.d.ts +72 -2
  812. package/lib/node/userMap/referrerMap.d.ts.map +1 -1
  813. package/lib/node/userMap/referrerMap.js +84 -2
  814. package/lib/node/userMap/revenueShareEscrowMap.d.ts +37 -10
  815. package/lib/node/userMap/revenueShareEscrowMap.d.ts.map +1 -1
  816. package/lib/node/userMap/revenueShareEscrowMap.js +38 -11
  817. package/lib/node/userMap/userMap.d.ts +81 -3
  818. package/lib/node/userMap/userMap.d.ts.map +1 -1
  819. package/lib/node/userMap/userMap.js +81 -4
  820. package/lib/node/userMap/userMapConfig.d.ts +23 -0
  821. package/lib/node/userMap/userMapConfig.d.ts.map +1 -1
  822. package/lib/node/userMap/userStatsMap.d.ts +22 -0
  823. package/lib/node/userMap/userStatsMap.d.ts.map +1 -1
  824. package/lib/node/userMap/userStatsMap.js +22 -0
  825. package/lib/node/userName.d.ts +16 -0
  826. package/lib/node/userName.d.ts.map +1 -1
  827. package/lib/node/userName.js +16 -0
  828. package/lib/node/userStats.d.ts +28 -1
  829. package/lib/node/userStats.d.ts.map +1 -1
  830. package/lib/node/userStats.js +28 -1
  831. package/lib/node/util/TransactionConfirmationManager.d.ts +33 -0
  832. package/lib/node/util/TransactionConfirmationManager.d.ts.map +1 -1
  833. package/lib/node/util/TransactionConfirmationManager.js +33 -0
  834. package/lib/node/util/chainClock.d.ts +24 -0
  835. package/lib/node/util/chainClock.d.ts.map +1 -1
  836. package/lib/node/util/chainClock.js +20 -0
  837. package/lib/node/util/computeUnits.d.ts +32 -0
  838. package/lib/node/util/computeUnits.d.ts.map +1 -1
  839. package/lib/node/util/computeUnits.js +32 -0
  840. package/lib/node/util/digest.d.ts +17 -0
  841. package/lib/node/util/digest.d.ts.map +1 -1
  842. package/lib/node/util/digest.js +17 -0
  843. package/lib/node/util/ed25519Utils.d.ts +12 -2
  844. package/lib/node/util/ed25519Utils.d.ts.map +1 -1
  845. package/lib/node/util/ed25519Utils.js +12 -2
  846. package/lib/node/util/promiseTimeout.d.ts +9 -0
  847. package/lib/node/util/promiseTimeout.d.ts.map +1 -1
  848. package/lib/node/util/promiseTimeout.js +9 -0
  849. package/lib/node/velocityClient.d.ts +3322 -215
  850. package/lib/node/velocityClient.d.ts.map +1 -1
  851. package/lib/node/velocityClient.js +3412 -245
  852. package/lib/node/wallet.d.ts +37 -0
  853. package/lib/node/wallet.d.ts.map +1 -1
  854. package/lib/node/wallet.js +37 -0
  855. package/package.json +2 -1
  856. package/src/accounts/basicUserAccountSubscriber.ts +18 -0
  857. package/src/accounts/basicUserStatsAccountSubscriber.ts +18 -0
  858. package/src/accounts/bulkAccountLoader.ts +52 -0
  859. package/src/accounts/bulkUserStatsSubscription.ts +9 -2
  860. package/src/accounts/bulkUserSubscription.ts +8 -2
  861. package/src/accounts/customizedCadenceBulkAccountLoader.ts +37 -0
  862. package/src/accounts/fetch.ts +59 -2
  863. package/src/accounts/grpcAccountSubscriber.ts +30 -0
  864. package/src/accounts/grpcInsuranceFundStakeAccountSubscriber.ts +16 -0
  865. package/src/accounts/grpcMultiAccountSubscriber.ts +121 -38
  866. package/src/accounts/grpcMultiUserAccountSubscriber.ts +49 -11
  867. package/src/accounts/grpcProgramAccountSubscriber.ts +33 -0
  868. package/src/accounts/grpcUserAccountSubscriber.ts +15 -0
  869. package/src/accounts/grpcUserStatsAccountSubscriber.ts +15 -0
  870. package/src/accounts/grpcVelocityClientAccountSubscriber.ts +41 -0
  871. package/src/accounts/grpcVelocityClientAccountSubscriberV2.ts +160 -1
  872. package/src/accounts/laserProgramAccountSubscriber.ts +34 -0
  873. package/src/accounts/oneShotUserAccountSubscriber.ts +19 -0
  874. package/src/accounts/oneShotUserStatsAccountSubscriber.ts +19 -0
  875. package/src/accounts/pollingInsuranceFundStakeAccountSubscriber.ts +31 -0
  876. package/src/accounts/pollingOracleAccountSubscriber.ts +21 -2
  877. package/src/accounts/pollingTokenAccountSubscriber.ts +22 -0
  878. package/src/accounts/pollingUserAccountSubscriber.ts +32 -0
  879. package/src/accounts/pollingUserStatsAccountSubscriber.ts +22 -0
  880. package/src/accounts/pollingVelocityClientAccountSubscriber.ts +84 -1
  881. package/src/accounts/testBulkAccountLoader.ts +8 -0
  882. package/src/accounts/types.ts +149 -0
  883. package/src/accounts/utils.ts +42 -24
  884. package/src/accounts/webSocketAccountSubscriber.ts +41 -0
  885. package/src/accounts/webSocketAccountSubscriberV2.ts +31 -23
  886. package/src/accounts/webSocketInsuranceFundStakeAccountSubscriber.ts +27 -0
  887. package/src/accounts/webSocketProgramAccountSubscriber.ts +36 -0
  888. package/src/accounts/webSocketProgramAccountSubscriberV2.ts +26 -0
  889. package/src/accounts/webSocketProgramAccountsSubscriberV2.ts +21 -0
  890. package/src/accounts/webSocketUserAccountSubscriber.ts +26 -0
  891. package/src/accounts/webSocketUserStatsAccountSubsriber.ts +20 -0
  892. package/src/accounts/webSocketVelocityClientAccountSubscriber.ts +127 -2
  893. package/src/accounts/webSocketVelocityClientAccountSubscriberV2.ts +110 -0
  894. package/src/accounts/websocketProgramUserAccountSubscriber.ts +33 -0
  895. package/src/addresses/marketAddresses.ts +10 -0
  896. package/src/addresses/pda.ts +228 -12
  897. package/src/adminClient.ts +2156 -4
  898. package/src/auctionSubscriber/auctionSubscriber.ts +15 -0
  899. package/src/auctionSubscriber/auctionSubscriberGrpc.ts +19 -0
  900. package/src/auctionSubscriber/index.ts +6 -0
  901. package/src/auctionSubscriber/types.ts +7 -0
  902. package/src/blockhashSubscriber/BlockhashSubscriber.ts +33 -0
  903. package/src/blockhashSubscriber/index.ts +5 -0
  904. package/src/blockhashSubscriber/types.ts +5 -4
  905. package/src/clock/clockSubscriber.ts +24 -0
  906. package/src/config.ts +109 -22
  907. package/src/constants/numericConstants.ts +70 -0
  908. package/src/constants/perpMarkets.ts +45 -960
  909. package/src/constants/spotMarkets.ts +23 -793
  910. package/src/constants/txConstants.ts +1 -0
  911. package/src/core/VelocityCore.ts +286 -8
  912. package/src/core/instructions/deposit.ts +22 -0
  913. package/src/core/instructions/fill.ts +17 -0
  914. package/src/core/instructions/funding.ts +12 -0
  915. package/src/core/instructions/liquidation.ts +18 -0
  916. package/src/core/instructions/orders.ts +28 -0
  917. package/src/core/instructions/perpOrders.ts +106 -0
  918. package/src/core/instructions/settlement.ts +14 -0
  919. package/src/core/instructions/trigger.ts +15 -0
  920. package/src/core/instructions/withdraw.ts +21 -0
  921. package/src/core/remainingAccounts.ts +47 -3
  922. package/src/core/signedMsg.ts +38 -0
  923. package/src/decode/customCoder.ts +46 -3
  924. package/src/decode/user.ts +22 -0
  925. package/src/dlob/DLOB.ts +668 -97
  926. package/src/dlob/DLOBNode.ts +98 -6
  927. package/src/dlob/DLOBSubscriber.ts +49 -12
  928. package/src/dlob/NodeList.ts +69 -0
  929. package/src/dlob/orderBookLevels.ts +108 -14
  930. package/src/dlob/types.ts +15 -0
  931. package/src/events/eventList.ts +14 -0
  932. package/src/events/eventSubscriber.ts +100 -19
  933. package/src/events/eventsServerLogProvider.ts +28 -0
  934. package/src/events/fetchLogs.ts +52 -2
  935. package/src/events/parse.ts +23 -0
  936. package/src/events/pollingLogProvider.ts +24 -0
  937. package/src/events/sort.ts +12 -0
  938. package/src/events/txEventCache.ts +19 -7
  939. package/src/events/types.ts +131 -11
  940. package/src/events/webSocketLogProvider.ts +29 -0
  941. package/src/factory/oracleClient.ts +2 -2
  942. package/src/idl/velocity.json +4 -4
  943. package/src/idl/velocity.ts +4 -4
  944. package/src/keypair.ts +8 -0
  945. package/src/marginCalculation.ts +153 -2
  946. package/src/math/amm.ts +371 -36
  947. package/src/math/auction.ts +139 -30
  948. package/src/math/bankruptcy.ts +104 -1
  949. package/src/math/builder.ts +74 -8
  950. package/src/math/conversion.ts +21 -0
  951. package/src/math/exchangeStatus.ts +117 -2
  952. package/src/math/funding.ts +63 -23
  953. package/src/math/insurance.ts +62 -0
  954. package/src/math/liquidation.ts +227 -17
  955. package/src/math/margin.ts +80 -14
  956. package/src/math/market.ts +148 -17
  957. package/src/math/oracles.ts +124 -0
  958. package/src/math/orders.ts +141 -19
  959. package/src/math/position.ts +80 -33
  960. package/src/math/repeg.ts +48 -10
  961. package/src/math/spotBalance.ts +252 -12
  962. package/src/math/spotMarket.ts +36 -3
  963. package/src/math/spotPosition.ts +72 -0
  964. package/src/math/state.ts +31 -0
  965. package/src/math/superStake.ts +126 -3
  966. package/src/math/tiers.ts +29 -0
  967. package/src/math/trade.ts +125 -55
  968. package/src/math/utils.ts +71 -9
  969. package/src/memcmp.ts +104 -2
  970. package/src/oracles/oracleClientCache.ts +16 -0
  971. package/src/oracles/oracleId.ts +39 -6
  972. package/src/oracles/prelaunchOracleClient.ts +20 -0
  973. package/src/oracles/pythClient.ts +32 -1
  974. package/src/oracles/pythLazerClient.ts +35 -1
  975. package/src/oracles/quoteAssetOracleClient.ts +18 -0
  976. package/src/oracles/strictOraclePrice.ts +21 -0
  977. package/src/oracles/types.ts +45 -0
  978. package/src/oracles/utils.ts +20 -0
  979. package/src/orderParams.ts +42 -4
  980. package/src/orderSubscriber/OrderSubscriber.ts +56 -0
  981. package/src/orderSubscriber/PollingSubscription.ts +11 -0
  982. package/src/orderSubscriber/WebsocketSubscription.ts +18 -0
  983. package/src/orderSubscriber/grpcSubscription.ts +16 -0
  984. package/src/orderSubscriber/types.ts +9 -0
  985. package/src/priorityFee/averageOverSlotsStrategy.ts +1 -0
  986. package/src/priorityFee/averageStrategy.ts +1 -0
  987. package/src/priorityFee/ewmaStrategy.ts +10 -0
  988. package/src/priorityFee/heliusPriorityFeeMethod.ts +13 -2
  989. package/src/priorityFee/maxOverSlotsStrategy.ts +1 -0
  990. package/src/priorityFee/maxStrategy.ts +1 -0
  991. package/src/priorityFee/priorityFeeSubscriber.ts +39 -0
  992. package/src/priorityFee/priorityFeeSubscriberMap.ts +21 -2
  993. package/src/priorityFee/solanaPriorityFeeMethod.ts +12 -0
  994. package/src/priorityFee/types.ts +33 -15
  995. package/src/priorityFee/velocityPriorityFeeMethod.ts +11 -0
  996. package/src/slot/SlotSubscriber.ts +18 -0
  997. package/src/slot/SlothashSubscriber.ts +27 -1
  998. package/src/tx/baseTxSender.ts +185 -5
  999. package/src/tx/blockhashFetcher/baseBlockhashFetcher.ts +12 -0
  1000. package/src/tx/blockhashFetcher/cachedBlockhashFetcher.ts +15 -0
  1001. package/src/tx/blockhashFetcher/types.ts +4 -0
  1002. package/src/tx/fastSingleTxSender.ts +58 -4
  1003. package/src/tx/forwardOnlyTxSender.ts +48 -0
  1004. package/src/tx/reportTransactionError.ts +18 -6
  1005. package/src/tx/retryTxSender.ts +40 -0
  1006. package/src/tx/txHandler.ts +146 -35
  1007. package/src/tx/txParamProcessor.ts +47 -0
  1008. package/src/tx/types.ts +46 -0
  1009. package/src/tx/utils.ts +26 -0
  1010. package/src/tx/whileValidTxSender.ts +82 -0
  1011. package/src/types.ts +777 -24
  1012. package/src/user.ts +869 -110
  1013. package/src/userMap/PollingSubscription.ts +16 -2
  1014. package/src/userMap/WebsocketSubscription.ts +9 -0
  1015. package/src/userMap/grpcSubscription.ts +8 -0
  1016. package/src/userMap/referrerMap.ts +92 -3
  1017. package/src/userMap/revenueShareEscrowMap.ts +38 -11
  1018. package/src/userMap/userMap.ts +82 -4
  1019. package/src/userMap/userMapConfig.ts +23 -10
  1020. package/src/userMap/userStatsMap.ts +22 -0
  1021. package/src/userName.ts +16 -0
  1022. package/src/userStats.ts +28 -1
  1023. package/src/util/TransactionConfirmationManager.ts +33 -0
  1024. package/src/util/chainClock.ts +24 -0
  1025. package/src/util/computeUnits.ts +32 -0
  1026. package/src/util/digest.ts +17 -0
  1027. package/src/util/ed25519Utils.ts +12 -2
  1028. package/src/util/promiseTimeout.ts +9 -0
  1029. package/src/velocityClient.ts +3439 -249
  1030. package/src/wallet.ts +37 -0
  1031. package/tests/VelocityCore/builder_escrow.test.ts +121 -0
  1032. package/tests/amm/test.ts +102 -0
  1033. package/tests/builder/builderFee.test.ts +42 -0
  1034. package/tests/dlob/tickSizeStandardization.ts +545 -0
  1035. package/tests/exchangeStatus/test.ts +45 -0
  1036. package/tests/liquidation/test.ts +125 -0
  1037. package/tests/oracles/mmOracleGate.test.ts +379 -0
  1038. package/tests/oracles/pythPegSnap.test.ts +76 -0
  1039. package/tests/sdkParity/enumParity.test.ts +84 -0
  1040. package/tests/sdkParity/marginCategoryFill.test.ts +143 -0
  1041. package/tests/sdkParity/memcmpOffsets.test.ts +139 -0
  1042. package/tests/spot/test.ts +55 -0
  1043. package/tests/user/bankruptcy.ts +165 -0
  1044. package/tests/user/feeAndWithdrawLimits.ts +284 -0
  1045. package/tests/user/getMarginCalculation.ts +226 -1
  1046. package/tests/user/test.ts +8 -4
package/src/dlob/DLOB.ts CHANGED
@@ -5,9 +5,9 @@
5
5
  * Used by keeper bots to identify the best maker orders to match against taker fills.
6
6
  *
7
7
  * Key types:
8
- * {@link DLOBNode} — a single order node with price/size/user info (DLOBNode.ts)
9
- * {@link DLOBSubscriber} — subscribes to on-chain accounts and keeps the DLOB live (DLOBSubscriber.ts)
10
- * {@link NodeList} — sorted linked list of DLOBNodes per side/market (NodeList.ts)
8
+ * `DLOBNode` — a single order node with price/size/user info (DLOBNode.ts)
9
+ * `DLOBSubscriber` — subscribes to on-chain accounts and keeps the DLOB live (DLOBSubscriber.ts)
10
+ * `NodeList` — sorted linked list of DLOBNodes per side/market (NodeList.ts)
11
11
  * `orderBookLevels.ts` — aggregated L2/L3 book level construction for quoting
12
12
  */
13
13
  import { getOrderSignature, NodeList } from './NodeList';
@@ -59,9 +59,12 @@ import {
59
59
  import { isFallbackAvailableLiquiditySource } from '../math/auction';
60
60
  import { convertToNumber } from '../math/conversion';
61
61
 
62
+ /** An on-chain order paired with the pubkey of its owning `User` account. */
62
63
  export type DLOBOrder = { user: PublicKey; order: Order };
64
+ /** A list of `DLOBOrder`s, e.g. the flattened output of `DLOB.getDLOBOrders`. */
63
65
  export type DLOBOrders = DLOBOrder[];
64
66
 
67
+ /** The full set of sorted `NodeList`s the DLOB maintains for one market, one per order category and side. */
65
68
  export type MarketNodeLists = {
66
69
  restingLimit: {
67
70
  ask: NodeList<'restingLimit'>;
@@ -99,11 +102,13 @@ type OrderBookCallback = () => void;
99
102
  */
100
103
  export type DLOBFilterFcn = (node: DLOBNode) => boolean;
101
104
 
105
+ /** A taker node paired with the maker node(s) it should be filled against. `makerNodes` is empty when the fill is expected to route through fallback (e.g. vAMM) liquidity or is an expiration/cancellation rather than a maker match. */
102
106
  export type NodeToFill = {
103
107
  node: DLOBNode;
104
108
  makerNodes: DLOBNode[];
105
109
  };
106
110
 
111
+ /** A trigger order whose `triggerPrice` has been crossed and is ready to be triggered on-chain. */
107
112
  export type NodeToTrigger = {
108
113
  node: TriggerOrderNode;
109
114
  };
@@ -130,13 +135,26 @@ function getUserAccountOrThrow(node: DLOBNode): string {
130
135
  return node.userAccount;
131
136
  }
132
137
 
138
+ /**
139
+ * In-memory order book. Indexes every open order it is given into per-market, per-side sorted
140
+ * `NodeList`s (see `MarketNodeLists`), and provides the crossing/fill-finding logic
141
+ * (`findNodesToFill`) and aggregated book views (`getL2`/`getL3`) that keepers and clients use to
142
+ * predict and drive on-chain fills. A `DLOB` instance is normally built once per slot (e.g. via
143
+ * `initFromUserMap`) rather than mutated indefinitely, since state changes (`insertOrder`,
144
+ * `delete`) must be paired with the caller's own bookkeeping of what's already been applied.
145
+ */
133
146
  export class DLOB {
147
+ /** Order signatures (`getOrderSignature`) currently open, keyed by market type (`'perp'`/`'spot'`). */
134
148
  openOrders = new Map<MarketTypeStr, Set<string>>();
149
+ /** Every market's `MarketNodeLists`, keyed by market type then market index. */
135
150
  orderLists = new Map<MarketTypeStr, Map<number, MarketNodeLists>>();
151
+ /** The highest slot `updateRestingLimitOrders` has processed; used to skip redundant re-promotion of taking→resting orders when called with a slot that's already been seen. */
136
152
  maxSlotForRestingLimitOrders = 0;
137
153
 
154
+ /** Set to `true` once `initFromUserMap` has successfully populated this instance; `initFromUserMap` is then a no-op. */
138
155
  initialized = false;
139
156
 
157
+ /** Constructs an empty, uninitialized `DLOB` with no orders. Call `initFromUserMap` (or `insertOrder`/`insertSignedMsgOrder`) to populate it. */
140
158
  public constructor() {
141
159
  this.init();
142
160
  }
@@ -195,6 +213,7 @@ export class DLOB {
195
213
  return marketNodeLists;
196
214
  }
197
215
 
216
+ /** Empties every order list and resets the DLOB to its freshly-constructed (uninitialized) state, including `maxSlotForRestingLimitOrders` and `initialized`. */
198
217
  public clear() {
199
218
  for (const openOrders of this.openOrders.values()) {
200
219
  openOrders.clear();
@@ -218,9 +237,15 @@ export class DLOB {
218
237
  }
219
238
 
220
239
  /**
221
- * initializes a new DLOB instance
240
+ * Populates this DLOB from every open order across every user in `userMap`. For reduce-only
241
+ * orders, the fillable amount is capped via `calculateOrderBaseAssetAmount` against the
242
+ * user's existing perp position for that market, rather than trusting the order's full
243
+ * stated `baseAssetAmount`. No-ops (returns `false` immediately) if this instance has already
244
+ * been initialized — call `clear()` first to rebuild from scratch.
222
245
  *
223
- * @returns a promise that resolves when the DLOB is initialized
246
+ * @param userMap map of all users' accounts to index orders from
247
+ * @param slot slot orders are inserted at, used to classify taking vs. resting limit orders
248
+ * @returns `true` if this call performed initialization, `false` if it was already initialized
224
249
  */
225
250
  public async initFromUserMap(
226
251
  userMap: UserMap,
@@ -258,6 +283,22 @@ export class DLOB {
258
283
  return true;
259
284
  }
260
285
 
286
+ /**
287
+ * Inserts a single on-chain order into the appropriate `NodeList` for its market/side/type.
288
+ * No-ops if the order's status isn't `open`, or if its `orderType` isn't one of the
289
+ * DLOB-supported types (`market`, `limit`, `triggerMarket`, `triggerLimit`, `oracle`).
290
+ * Lazily creates the market's `MarketNodeLists` (via `addOrderList`) on first insert for that
291
+ * market. Which list the order lands in (taking vs. resting limit, floating, market, or
292
+ * inactive trigger) is decided by `getListForOnChainOrder`.
293
+ *
294
+ * @param order the on-chain order to insert
295
+ * @param userAccount base58 pubkey string of the order's owner
296
+ * @param slot current slot, used to classify taking vs. resting limit orders
297
+ * @param baseAssetAmount remaining fillable base amount, BASE_PRECISION (1e9) — for
298
+ * reduce-only orders this should be the position-capped amount (see
299
+ * `calculateOrderBaseAssetAmount`), not the raw `order.baseAssetAmount`
300
+ * @param onInsert optional callback invoked after a successful insert
301
+ */
261
302
  public insertOrder(
262
303
  order: Order,
263
304
  userAccount: string,
@@ -297,6 +338,16 @@ export class DLOB {
297
338
  }
298
339
  }
299
340
 
341
+ /**
342
+ * Inserts an off-chain signed-message order (not yet landed on-chain) into the market's
343
+ * `signedMsg` bid/ask list, unconditionally (no status/order-type filtering, unlike
344
+ * `insertOrder`). Lazily creates the market's `MarketNodeLists` on first insert.
345
+ *
346
+ * @param order the signed-message order to insert
347
+ * @param userAccount base58 pubkey string of the order's owner
348
+ * @param baseAssetAmount remaining fillable base amount, BASE_PRECISION (1e9); defaults to `order.baseAssetAmount`
349
+ * @param onInsert optional callback invoked after insert
350
+ */
300
351
  public insertSignedMsgOrder(
301
352
  order: Order,
302
353
  userAccount: string,
@@ -323,6 +374,7 @@ export class DLOB {
323
374
  }
324
375
  }
325
376
 
377
+ /** Creates and registers an empty `MarketNodeLists` (all six order categories, both sides) for `marketIndex`, overwriting any existing lists for that market. */
326
378
  addOrderList(marketType: MarketTypeStr, marketIndex: number): void {
327
379
  this.getOrderListsForMarketType(marketType).set(marketIndex, {
328
380
  restingLimit: {
@@ -352,6 +404,17 @@ export class DLOB {
352
404
  });
353
405
  }
354
406
 
407
+ /**
408
+ * Removes an order from whichever `NodeList` it currently lives in. No-ops if the order's
409
+ * status isn't `open`. First calls `updateRestingLimitOrders(slot)` so a taking-limit order
410
+ * that has since become a resting-limit order is looked up (and removed from) the correct
411
+ * list.
412
+ *
413
+ * @param order the order to remove
414
+ * @param userAccount pubkey of the order's owner
415
+ * @param slot current slot, used to resolve which list the order is currently in
416
+ * @param onDelete optional callback invoked after a successful delete
417
+ */
355
418
  public delete(
356
419
  order: Order,
357
420
  userAccount: PublicKey,
@@ -374,6 +437,18 @@ export class DLOB {
374
437
  }
375
438
  }
376
439
 
440
+ /**
441
+ * Determines which `NodeList` an order belongs in, given its current state and the slot:
442
+ * a trigger order (`triggerMarket`/`triggerLimit`) that hasn't fired yet goes in
443
+ * `trigger.above`/`trigger.below`; a market/oracle-type order goes in `market`; a limit order
444
+ * with a non-zero `oraclePriceOffset` goes in `floatingLimit`; otherwise a limit order goes in
445
+ * `restingLimit` once its auction is complete or it's post-only (per `isRestingLimitOrder`),
446
+ * and in `takingLimit` while still auctioning.
447
+ *
448
+ * @param order the order to classify
449
+ * @param slot current slot, used to evaluate `isRestingLimitOrder`
450
+ * @returns the matching `NodeList`, or `undefined` if the order's market has no `MarketNodeLists` registered yet (e.g. `insertOrder`/`addOrderList` hasn't been called for it)
451
+ */
377
452
  public getListForOnChainOrder(
378
453
  order: Order,
379
454
  slot: number
@@ -426,6 +501,15 @@ export class DLOB {
426
501
  return list;
427
502
  }
428
503
 
504
+ /**
505
+ * Promotes any `takingLimit` orders across all perp and spot markets whose auction has since
506
+ * completed (per `isRestingLimitOrder`) into their market's `restingLimit` list. No-ops if
507
+ * `slot` is not newer than the last slot this was called with (`maxSlotForRestingLimitOrders`),
508
+ * so it is cheap to call defensively before any read that depends on resting-limit state
509
+ * being current (most getters here do so internally).
510
+ *
511
+ * @param slot current slot
512
+ */
429
513
  public updateRestingLimitOrders(slot: number): void {
430
514
  if (slot <= this.maxSlotForRestingLimitOrders) {
431
515
  return;
@@ -438,6 +522,7 @@ export class DLOB {
438
522
  this.updateRestingLimitOrdersForMarketType(slot, 'spot');
439
523
  }
440
524
 
525
+ /** Does the `takingLimit` → `restingLimit` promotion (see `updateRestingLimitOrders`) for every market of one market type. */
441
526
  updateRestingLimitOrdersForMarketType(
442
527
  slot: number,
443
528
  marketTypeStr: MarketTypeStr
@@ -478,6 +563,15 @@ export class DLOB {
478
563
  }
479
564
  }
480
565
 
566
+ /**
567
+ * Looks up an order by id/owner across every `NodeList` in the DLOB (perp and spot, all
568
+ * categories/sides) via `getNodeLists`. O(number of lists); prefer a narrower lookup (e.g.
569
+ * `NodeList.get`) if you already know the order's market/type.
570
+ *
571
+ * @param orderId the order's id (unique per user account)
572
+ * @param userAccount pubkey of the order's owner
573
+ * @returns the matching `Order`, or `undefined` if not found in any list
574
+ */
481
575
  public getOrder(orderId: number, userAccount: PublicKey): Order | undefined {
482
576
  const orderSignature = getOrderSignature(orderId, userAccount.toString());
483
577
  for (const nodeList of this.getNodeLists()) {
@@ -490,6 +584,28 @@ export class DLOB {
490
584
  return undefined;
491
585
  }
492
586
 
587
+ /**
588
+ * Top-level entry point for keepers: finds every node in one market that is currently
589
+ * fillable, combining four sources — crossing resting-limit orders
590
+ * (`findRestingLimitOrderNodesToFill`), taking (still-auctioning) orders that cross a maker or
591
+ * fallback price (`findTakingNodesToFill`), expired orders to cancel/settle
592
+ * (`findExpiredNodesToFill`), and unfillable reduce-only orders below the step size to cancel
593
+ * (`findUnfillableReduceOnlyOrdersToCancel`). Returns `[]` immediately if fills are paused for
594
+ * this market (`fillPaused`). The market's `orderTickSize` is read from `marketAccount` and
595
+ * threaded through to every price comparison below so all crossing checks agree with on-chain
596
+ * price standardization.
597
+ *
598
+ * @param marketIndex the market to scan
599
+ * @param fallbackBid best available non-DLOB bid (e.g. vAMM), PRICE_PRECISION (1e6); `undefined` disables fallback-bid crossing checks
600
+ * @param fallbackAsk best available non-DLOB ask (e.g. vAMM), PRICE_PRECISION (1e6); `undefined` disables fallback-ask crossing checks
601
+ * @param slot current slot
602
+ * @param ts current unix timestamp (seconds), used to find expired orders
603
+ * @param marketType `MarketType.PERP` or `MarketType.SPOT`; determines whether `oraclePriceData`/`marketAccount` are typed as spot or perp
604
+ * @param oraclePriceData oracle price data for the market (`MMOraclePriceData` for perp, `OraclePriceData` for spot)
605
+ * @param stateAccount global protocol state, used for pause checks and fee-tier maker rebates
606
+ * @param marketAccount the market's account, used for `orderTickSize`/`orderStepSize` and pause checks
607
+ * @returns deduplicated `NodeToFill`s (see `mergeNodesToFill`) merging resting-limit and taking-order matches, plus expired and cancel-eligible nodes appended
608
+ */
493
609
  public findNodesToFill<T extends MarketType>(
494
610
  marketIndex: number,
495
611
  fallbackBid: BN | undefined,
@@ -511,6 +627,9 @@ export class DLOB {
511
627
 
512
628
  const isAmmPaused = ammPaused(stateAccount, marketAccount);
513
629
 
630
+ const tickSize = (marketAccount as PerpMarketAccount | SpotMarketAccount)
631
+ .orderTickSize;
632
+
514
633
  const { makerRebateNumerator, makerRebateDenominator } =
515
634
  this.getMakerRebate(marketType, stateAccount, marketAccount);
516
635
 
@@ -524,7 +643,8 @@ export class DLOB {
524
643
  stateAccount,
525
644
  marketAccount,
526
645
  fallbackAsk,
527
- fallbackBid
646
+ fallbackBid,
647
+ tickSize
528
648
  );
529
649
 
530
650
  const restingLimitOrderNodesToFill: Array<NodeToFill> =
@@ -539,7 +659,8 @@ export class DLOB {
539
659
  makerRebateNumerator,
540
660
  makerRebateDenominator,
541
661
  fallbackAsk,
542
- fallbackBid
662
+ fallbackBid,
663
+ tickSize
543
664
  );
544
665
 
545
666
  // get expired market nodes
@@ -569,6 +690,18 @@ export class DLOB {
569
690
  .concat(cancelReduceOnlyNodesToFill);
570
691
  }
571
692
 
693
+ /**
694
+ * Reads the tier-0 maker rebate fraction (`makerRebateNumerator / makerRebateDenominator`)
695
+ * for a market from `stateAccount`'s perp/spot fee structure, then scales the numerator up by
696
+ * the market's `feeAdjustment` percentage if one is set. Used by `findRestingLimitOrderNodesToFill`
697
+ * to size the buffer added to fallback prices so fallback fills aren't triggered by rebate-sized
698
+ * noise.
699
+ *
700
+ * @param marketType `MarketType.PERP` or `MarketType.SPOT`
701
+ * @param stateAccount global protocol state holding the perp/spot fee tier tables
702
+ * @param marketAccount the specific market, whose optional `feeAdjustment` (percent) scales the rebate
703
+ * @returns the rebate as a numerator/denominator pair (unitless fraction, not a fixed-point BN)
704
+ */
572
705
  getMakerRebate(
573
706
  marketType: MarketType,
574
707
  stateAccount: StateAccount,
@@ -597,6 +730,16 @@ export class DLOB {
597
730
  return { makerRebateNumerator, makerRebateDenominator };
598
731
  }
599
732
 
733
+ /**
734
+ * Merges two `NodeToFill` arrays (typically resting-limit crossings and taking-order
735
+ * crossings for the same market/pass) by taker order signature, concatenating `makerNodes`
736
+ * for any taker that appears in both — e.g. an order that both crosses a resting maker and
737
+ * separately crosses fallback liquidity ends up as one `NodeToFill` with both maker sources.
738
+ *
739
+ * @param restingLimitOrderNodesToFill fills found via resting-limit crossing
740
+ * @param takingOrderNodesToFill fills found via taking-order crossing
741
+ * @returns one `NodeToFill` per distinct taker order, with all matched maker nodes combined
742
+ */
600
743
  mergeNodesToFill(
601
744
  restingLimitOrderNodesToFill: NodeToFill[],
602
745
  takingOrderNodesToFill: NodeToFill[]
@@ -631,6 +774,29 @@ export class DLOB {
631
774
  return Array.from(mergedNodesToFill.values());
632
775
  }
633
776
 
777
+ /**
778
+ * Finds resting-limit-order fills for a market: resting bids/asks that cross each other
779
+ * (`findCrossingRestingLimitOrders`), plus resting asks that cross the fallback bid and
780
+ * resting bids that cross the fallback ask (each skipped entirely if the AMM is paused).
781
+ * The fallback price on each side is tightened by the maker rebate before comparing, so a
782
+ * maker order priced exactly at the rebate-adjusted fallback isn't spuriously flagged as
783
+ * crossing (`fallbackBidWithBuffer = fallbackBid - fallbackBid * makerRebateNumerator / makerRebateDenominator`,
784
+ * and symmetrically for the ask).
785
+ *
786
+ * @param marketIndex the market to scan
787
+ * @param slot current slot
788
+ * @param marketType `MarketType.PERP` or `MarketType.SPOT`
789
+ * @param oraclePriceData oracle price data for the market
790
+ * @param isAmmPaused if true, skips fallback-crossing checks (only maker-vs-maker crossings are returned)
791
+ * @param stateAccount global protocol state, forwarded to fallback-availability checks
792
+ * @param marketAccount the market's account, forwarded to fallback-availability checks
793
+ * @param makerRebateNumerator numerator of the maker rebate fraction (see `getMakerRebate`)
794
+ * @param makerRebateDenominator denominator of the maker rebate fraction (see `getMakerRebate`)
795
+ * @param fallbackAsk best available non-DLOB ask, PRICE_PRECISION (1e6); `undefined` skips fallback-ask crossing
796
+ * @param fallbackBid best available non-DLOB bid, PRICE_PRECISION (1e6); `undefined` skips fallback-bid crossing
797
+ * @param tickSize market order tick size, PRICE_PRECISION (1e6), threaded into every price comparison; omit to fall back to no rounding
798
+ * @returns `NodeToFill`s for maker-crossing-maker and maker-crossing-fallback matches
799
+ */
634
800
  public findRestingLimitOrderNodesToFill<T extends MarketType>(
635
801
  marketIndex: number,
636
802
  slot: number,
@@ -646,7 +812,8 @@ export class DLOB {
646
812
  makerRebateNumerator: number,
647
813
  makerRebateDenominator: number,
648
814
  fallbackAsk: BN | undefined,
649
- fallbackBid: BN | undefined
815
+ fallbackBid: BN | undefined,
816
+ tickSize?: BN
650
817
  ): NodeToFill[] {
651
818
  const nodesToFill = new Array<NodeToFill>();
652
819
 
@@ -654,7 +821,8 @@ export class DLOB {
654
821
  marketIndex,
655
822
  slot,
656
823
  marketType,
657
- oraclePriceData
824
+ oraclePriceData,
825
+ tickSize
658
826
  );
659
827
 
660
828
  for (const crossingNode of crossingNodes) {
@@ -666,7 +834,9 @@ export class DLOB {
666
834
  marketIndex,
667
835
  slot,
668
836
  marketType,
669
- oraclePriceData
837
+ oraclePriceData,
838
+ undefined,
839
+ tickSize
670
840
  );
671
841
 
672
842
  const fallbackBidWithBuffer = fallbackBid.sub(
@@ -685,7 +855,8 @@ export class DLOB {
685
855
  return askPrice.lte(fallbackBidWithBuffer);
686
856
  },
687
857
  stateAccount,
688
- marketAccount
858
+ marketAccount,
859
+ tickSize
689
860
  );
690
861
 
691
862
  for (const askCrossingFallback of asksCrossingFallback) {
@@ -698,7 +869,9 @@ export class DLOB {
698
869
  marketIndex,
699
870
  slot,
700
871
  marketType,
701
- oraclePriceData
872
+ oraclePriceData,
873
+ undefined,
874
+ tickSize
702
875
  );
703
876
 
704
877
  const fallbackAskWithBuffer = fallbackAsk.add(
@@ -717,7 +890,8 @@ export class DLOB {
717
890
  return bidPrice.gte(fallbackAskWithBuffer);
718
891
  },
719
892
  stateAccount,
720
- marketAccount
893
+ marketAccount,
894
+ tickSize
721
895
  );
722
896
 
723
897
  for (const bidCrossingFallback of bidsCrossingFallback) {
@@ -728,6 +902,27 @@ export class DLOB {
728
902
  return nodesToFill;
729
903
  }
730
904
 
905
+ /**
906
+ * Finds fills for taking (still-auctioning) orders: taking asks crossing resting bids or the
907
+ * fallback bid, and taking bids crossing resting asks or the fallback ask
908
+ * (`findTakingNodesCrossingMakerNodes` / `findNodesCrossingFallbackLiquidity`). Fallback
909
+ * crossing checks are skipped entirely when `isAmmPaused`. For spot markets, a taking order is
910
+ * only allowed to cross the opposite fallback price if doing so wouldn't also require crossing
911
+ * beyond the *other* fallback price (see the inline `fallbackBid`/`fallbackAsk` guards) —
912
+ * this prevents a taking order from routing through DLOB makers priced worse than the AMM.
913
+ *
914
+ * @param marketIndex the market to scan
915
+ * @param slot current slot
916
+ * @param marketType `MarketType.PERP` or `MarketType.SPOT`
917
+ * @param oraclePriceData oracle price data for the market
918
+ * @param isAmmPaused if true, skips fallback-crossing checks
919
+ * @param state global protocol state, forwarded to fallback-availability checks
920
+ * @param marketAccount the market's account, forwarded to fallback-availability checks
921
+ * @param fallbackAsk best available non-DLOB ask, PRICE_PRECISION (1e6); `undefined` skips ask-side fallback crossing
922
+ * @param fallbackBid best available non-DLOB bid, PRICE_PRECISION (1e6); `undefined` skips bid-side fallback crossing
923
+ * @param tickSize market order tick size, PRICE_PRECISION (1e6), threaded into every price comparison; omit to fall back to no rounding
924
+ * @returns `NodeToFill`s for taking orders that cross a resting maker or fallback liquidity
925
+ */
731
926
  public findTakingNodesToFill<T extends MarketType>(
732
927
  marketIndex: number,
733
928
  slot: number,
@@ -741,7 +936,8 @@ export class DLOB {
741
936
  ? SpotMarketAccount
742
937
  : PerpMarketAccount,
743
938
  fallbackAsk: BN | undefined,
744
- fallbackBid?: BN | undefined
939
+ fallbackBid?: BN | undefined,
940
+ tickSize?: BN
745
941
  ): NodeToFill[] {
746
942
  const nodesToFill = new Array<NodeToFill>();
747
943
 
@@ -770,7 +966,8 @@ export class DLOB {
770
966
  }
771
967
  }
772
968
  return takerPrice === undefined || takerPrice.lte(makerPrice);
773
- }
969
+ },
970
+ tickSize
774
971
  );
775
972
  for (const takingAskCrossingBid of takingAsksCrossingBids) {
776
973
  nodesToFill.push(takingAskCrossingBid);
@@ -793,7 +990,8 @@ export class DLOB {
793
990
  return takerPrice === undefined || takerPrice.lte(fallbackBid);
794
991
  },
795
992
  state,
796
- marketAccount
993
+ marketAccount,
994
+ tickSize
797
995
  );
798
996
 
799
997
  for (const takingAskCrossingFallback of takingAsksCrossingFallback) {
@@ -827,7 +1025,8 @@ export class DLOB {
827
1025
  }
828
1026
 
829
1027
  return takerPrice === undefined || takerPrice.gte(makerPrice);
830
- }
1028
+ },
1029
+ tickSize
831
1030
  );
832
1031
 
833
1032
  for (const takingBidToFill of takingBidsToFill) {
@@ -851,7 +1050,8 @@ export class DLOB {
851
1050
  return takerPrice === undefined || takerPrice.gte(fallbackAsk);
852
1051
  },
853
1052
  state,
854
- marketAccount
1053
+ marketAccount,
1054
+ tickSize
855
1055
  );
856
1056
  for (const marketBidCrossingFallback of takingBidsCrossingFallback) {
857
1057
  nodesToFill.push(marketBidCrossingFallback);
@@ -861,6 +1061,28 @@ export class DLOB {
861
1061
  return nodesToFill;
862
1062
  }
863
1063
 
1064
+ /**
1065
+ * Walks `takerNodeGenerator` (taking bids or asks, sorted by arrival slot) against a fresh
1066
+ * maker-side generator (built per taker via `makerNodeGeneratorFn`, e.g.
1067
+ * `getRestingLimitBids`) and records a `NodeToFill` for every taker/maker pair that
1068
+ * `doesCross` accepts, skipping same-user matches. For each match this method also **mutates
1069
+ * DLOB state**: it applies the simulated fill to both the maker's and taker's order lists
1070
+ * (via `NodeList.update`) so subsequent iterations see updated `baseAssetAmountFilled` and a
1071
+ * taker stops matching once fully filled. Because maker nodes (sorted by price) are scanned
1072
+ * in order, `doesCross` returning false breaks out of the maker loop entirely — this is
1073
+ * correct for resting-limit makers but relies on the maker generator being price-sorted, not
1074
+ * time-sorted.
1075
+ *
1076
+ * @param marketIndex the market being scanned (used only to route signed-message taker fills into the right list)
1077
+ * @param slot current slot, forwarded to price lookups
1078
+ * @param marketType `MarketType.PERP` or `MarketType.SPOT`
1079
+ * @param oraclePriceData oracle price data for the market
1080
+ * @param takerNodeGenerator taking orders to check, e.g. from `getTakingAsks`/`getTakingBids`
1081
+ * @param makerNodeGeneratorFn factory invoked once per taker to get a fresh maker-side generator, e.g. `getRestingLimitBids`/`getRestingLimitAsks`
1082
+ * @param doesCross given the taker's price (`undefined` if it has none, e.g. still mid-auction) and the maker's price, returns whether they cross
1083
+ * @param tickSize market order tick size, PRICE_PRECISION (1e6), threaded into all price lookups
1084
+ * @returns one `NodeToFill` per matched taker/maker pair (a taker matched against multiple makers yields multiple entries, each with one maker)
1085
+ */
864
1086
  public findTakingNodesCrossingMakerNodes<T extends MarketType>(
865
1087
  marketIndex: number,
866
1088
  slot: number,
@@ -875,9 +1097,12 @@ export class DLOB {
875
1097
  marketType: T,
876
1098
  oraclePriceData: T extends { spot: unknown }
877
1099
  ? OraclePriceData
878
- : MMOraclePriceData
1100
+ : MMOraclePriceData,
1101
+ filterFcn?: DLOBFilterFcn,
1102
+ tickSize?: BN
879
1103
  ) => Generator<DLOBNode>,
880
- doesCross: (takerPrice: BN | undefined, makerPrice: BN) => boolean
1104
+ doesCross: (takerPrice: BN | undefined, makerPrice: BN) => boolean,
1105
+ tickSize?: BN
881
1106
  ): NodeToFill[] {
882
1107
  const nodesToFill = new Array<NodeToFill>();
883
1108
 
@@ -886,7 +1111,9 @@ export class DLOB {
886
1111
  marketIndex,
887
1112
  slot,
888
1113
  marketType,
889
- oraclePriceData
1114
+ oraclePriceData,
1115
+ undefined,
1116
+ tickSize
890
1117
  );
891
1118
 
892
1119
  for (const makerNode of makerNodeGenerator) {
@@ -896,8 +1123,12 @@ export class DLOB {
896
1123
  continue;
897
1124
  }
898
1125
 
899
- const makerPrice = makerNode.getPriceOrThrow(oraclePriceData, slot);
900
- const takerPrice = takerNode.getPrice(oraclePriceData, slot);
1126
+ const makerPrice = makerNode.getPriceOrThrow(
1127
+ oraclePriceData,
1128
+ slot,
1129
+ tickSize
1130
+ );
1131
+ const takerPrice = takerNode.getPrice(oraclePriceData, slot, tickSize);
901
1132
 
902
1133
  const ordersCross = doesCross(takerPrice, makerPrice);
903
1134
  if (!ordersCross) {
@@ -963,6 +1194,27 @@ export class DLOB {
963
1194
  return nodesToFill;
964
1195
  }
965
1196
 
1197
+ /**
1198
+ * Scans `nodeGenerator` for nodes that both cross the fallback price (`doesCross`, evaluated
1199
+ * against each node's `getLimitPrice`, or crossing unconditionally if the node has no limit
1200
+ * price) and have fallback liquidity actually available to fill against. For spot markets,
1201
+ * post-only orders are skipped (they can never take against the AMM) and fallback liquidity
1202
+ * is always considered available; for perp markets, availability additionally requires
1203
+ * `isFallbackAvailableLiquiditySource` (broadly: the order's auction is complete and the
1204
+ * oracle is valid enough for AMM fills). Does not mutate any order state — unlike
1205
+ * `findTakingNodesCrossingMakerNodes`, fallback fills are expected to be sized/settled
1206
+ * on-chain rather than simulated here.
1207
+ *
1208
+ * @param marketType `MarketType.PERP` or `MarketType.SPOT`
1209
+ * @param slot current slot
1210
+ * @param oraclePriceData oracle price data for the market
1211
+ * @param nodeGenerator candidate nodes to check, e.g. resting-limit or taking orders
1212
+ * @param doesCross given a node's limit price (`undefined` if it has none), returns whether it crosses the fallback price
1213
+ * @param state global protocol state, used by the perp fallback-availability check
1214
+ * @param marketAccount the market's account, used by the perp fallback-availability check
1215
+ * @param tickSize market order tick size, PRICE_PRECISION (1e6), used to resolve each node's limit price
1216
+ * @returns `NodeToFill`s with an empty `makerNodes` array (the fill is expected to route through fallback liquidity, not a DLOB maker)
1217
+ */
966
1218
  public findNodesCrossingFallbackLiquidity<T extends MarketType>(
967
1219
  marketType: T,
968
1220
  slot: number,
@@ -974,7 +1226,8 @@ export class DLOB {
974
1226
  state: StateAccount,
975
1227
  marketAccount: T extends { spot: unknown }
976
1228
  ? SpotMarketAccount
977
- : PerpMarketAccount
1229
+ : PerpMarketAccount,
1230
+ tickSize?: BN
978
1231
  ): NodeToFill[] {
979
1232
  const nodesToFill = new Array<NodeToFill>();
980
1233
 
@@ -987,7 +1240,13 @@ export class DLOB {
987
1240
  continue;
988
1241
  }
989
1242
  const nodeOrder = getOrderOrThrow(node);
990
- const nodePrice = getLimitPrice(nodeOrder, oraclePriceData, slot);
1243
+ const nodePrice = getLimitPrice(
1244
+ nodeOrder,
1245
+ oraclePriceData,
1246
+ slot,
1247
+ undefined,
1248
+ tickSize
1249
+ );
991
1250
 
992
1251
  // order crosses if there is no limit price or it crosses fallback price
993
1252
  const crosses = doesCross(nodePrice);
@@ -1016,6 +1275,20 @@ export class DLOB {
1016
1275
  return nodesToFill;
1017
1276
  }
1018
1277
 
1278
+ /**
1279
+ * Finds orders in a market that are eligible to be expired: any non-trigger, non-TIF-limit
1280
+ * order whose `maxTs` (plus a 25-second buffer for limit orders, via `isOrderExpired`) has
1281
+ * passed the given timestamp. Also proactively removes (not just reports) signed-message
1282
+ * orders whose auction window (`order.slot + order.auctionDuration`) has passed `slot`, since
1283
+ * those never landed on-chain and have no on-chain expiration to wait for.
1284
+ *
1285
+ * @param marketIndex the market to scan
1286
+ * @param ts current unix timestamp (seconds)
1287
+ * @param marketType `MarketType.PERP` or `MarketType.SPOT`
1288
+ * @param slot current slot; required if the market has any signed-message orders (throws otherwise)
1289
+ * @returns `NodeToFill`s (with empty `makerNodes`) for orders ready to expire
1290
+ * @throws if a signed-message order is present and `slot` was not provided
1291
+ */
1019
1292
  public findExpiredNodesToFill(
1020
1293
  marketIndex: number,
1021
1294
  ts: number,
@@ -1103,6 +1376,17 @@ export class DLOB {
1103
1376
  return nodesToFill;
1104
1377
  }
1105
1378
 
1379
+ /**
1380
+ * Finds reduce-only orders across every category/side in a market whose remaining
1381
+ * `baseAssetAmount` (as tracked on the node, not necessarily the order's original size) has
1382
+ * dropped below the market's minimum step size — meaning the order can never be filled again
1383
+ * and should be canceled by a keeper rather than left to linger.
1384
+ *
1385
+ * @param marketIndex the market to scan
1386
+ * @param marketType `MarketType.PERP` or `MarketType.SPOT`
1387
+ * @param stepSize market's minimum order step size, BASE_PRECISION (1e9)
1388
+ * @returns `NodeToFill`s (with empty `makerNodes`) for reduce-only orders that should be canceled
1389
+ */
1106
1390
  public findUnfillableReduceOnlyOrdersToCancel(
1107
1391
  marketIndex: number,
1108
1392
  marketType: MarketType,
@@ -1149,6 +1433,19 @@ export class DLOB {
1149
1433
 
1150
1434
  return nodesToFill;
1151
1435
  }
1436
+ /**
1437
+ * Yields taking (still-auctioning) bid nodes for a market — market-bid orders, taking-limit
1438
+ * bids, and signed-message bids not yet resting — merged in arrival order (earliest `slot`
1439
+ * first, via `getBestNode`). Calls `updateRestingLimitOrders(slot)` first so a signed-message
1440
+ * order that has since become a resting-limit order is excluded here.
1441
+ *
1442
+ * @param marketIndex the market to scan
1443
+ * @param marketType `MarketType.PERP` or `MarketType.SPOT`
1444
+ * @param slot current slot
1445
+ * @param oraclePriceData oracle price data for the market (unused for the ordering itself, forwarded to `getBestNode`)
1446
+ * @param filterFcn optional predicate; nodes it rejects are skipped and not yielded
1447
+ * @returns a generator of taking bid nodes, or an empty generator if the market has no `MarketNodeLists`
1448
+ */
1152
1449
  *getTakingBids<T extends MarketType>(
1153
1450
  marketIndex: number,
1154
1451
  marketType: T,
@@ -1188,6 +1485,7 @@ export class DLOB {
1188
1485
  );
1189
1486
  }
1190
1487
 
1488
+ /** Same as `getTakingBids`, but for the ask side. */
1191
1489
  *getTakingAsks<T extends MarketType>(
1192
1490
  marketIndex: number,
1193
1491
  marketType: T,
@@ -1227,6 +1525,7 @@ export class DLOB {
1227
1525
  );
1228
1526
  }
1229
1527
 
1528
+ /** Filters a `signedMsg` `NodeList`'s nodes by an arbitrary predicate — used to split signed-message orders into "still taking" vs. "now resting" subsets based on `isRestingLimitOrder`. */
1230
1529
  protected *signedMsgGenerator(
1231
1530
  signedMsgOrderList: NodeList<'signedMsg'>,
1232
1531
  filter: (x: DLOBNode) => boolean
@@ -1238,6 +1537,20 @@ export class DLOB {
1238
1537
  }
1239
1538
  }
1240
1539
 
1540
+ /**
1541
+ * K-way-merges multiple node generators (e.g. one per order category feeding one side of the
1542
+ * book) into a single generator ordered by `compareFcn`, skipping nodes that are already
1543
+ * fully filled (`isBaseFilled`) or rejected by `filterFcn`. This is the shared core behind
1544
+ * `getTakingBids`/`getTakingAsks`/`getRestingLimitBids`/`getRestingLimitAsks`/`getBids`/`getAsks`
1545
+ * — each just supplies a different `generatorList` and `compareFcn`.
1546
+ *
1547
+ * @param generatorList the node generators to merge; each must already be sorted per `compareFcn`
1548
+ * @param oraclePriceData oracle price data, forwarded to `compareFcn`
1549
+ * @param slot current slot, forwarded to `compareFcn`
1550
+ * @param compareFcn returns true if `bestDLOBNode` should be preferred over `currentDLOBNode`
1551
+ * @param filterFcn optional predicate; nodes it rejects are advanced past and not yielded
1552
+ * @returns a single generator yielding the merged, filtered, non-fully-filled nodes in `compareFcn` order
1553
+ */
1241
1554
  protected *getBestNode<T extends MarketTypeStr>(
1242
1555
  generatorList: Array<Generator<DLOBNode>>,
1243
1556
  oraclePriceData: T extends 'spot' ? OraclePriceData : MMOraclePriceData,
@@ -1298,6 +1611,23 @@ export class DLOB {
1298
1611
  }
1299
1612
  }
1300
1613
 
1614
+ /**
1615
+ * Yields resting-limit ask nodes for a market — `restingLimit`, `floatingLimit`, and any
1616
+ * `signedMsg` asks that have become resting — merged best-price-first (lowest ask price
1617
+ * first, ties broken by `getBestNode`'s underlying comparator). Calls
1618
+ * `updateRestingLimitOrders(slot)` first. `tickSize` is threaded into every price comparison
1619
+ * via `DLOBNode.getPriceOrThrow`, so pass the market's `orderTickSize` to match on-chain
1620
+ * price standardization — omitting it defaults to no rounding (tick of 1).
1621
+ *
1622
+ * @param marketIndex the market to scan
1623
+ * @param slot current slot
1624
+ * @param marketType `MarketType.PERP` or `MarketType.SPOT`
1625
+ * @param oraclePriceData oracle price data for the market; required for spot markets (throws if missing)
1626
+ * @param filterFcn optional predicate; nodes it rejects are skipped
1627
+ * @param tickSize market order tick size, PRICE_PRECISION (1e6); defaults to no rounding if omitted
1628
+ * @returns a generator of resting-limit ask nodes, best price first
1629
+ * @throws if `marketType` is spot and `oraclePriceData` is not provided; also throws (via `getPriceOrThrow`) if any node has no resolvable limit price
1630
+ */
1301
1631
  *getRestingLimitAsks<T extends MarketType>(
1302
1632
  marketIndex: number,
1303
1633
  slot: number,
@@ -1305,7 +1635,8 @@ export class DLOB {
1305
1635
  oraclePriceData: T extends { spot: unknown }
1306
1636
  ? OraclePriceData
1307
1637
  : MMOraclePriceData,
1308
- filterFcn?: DLOBFilterFcn
1638
+ filterFcn?: DLOBFilterFcn,
1639
+ tickSize?: BN
1309
1640
  ): Generator<DLOBNode> {
1310
1641
  if (isVariant(marketType, 'spot') && !oraclePriceData) {
1311
1642
  throw new Error('Must provide OraclePriceData to get spot asks');
@@ -1334,13 +1665,14 @@ export class DLOB {
1334
1665
  slot,
1335
1666
  (bestNode, currentNode, slot, oraclePriceData) => {
1336
1667
  return bestNode
1337
- .getPriceOrThrow(oraclePriceData, slot)
1338
- .lt(currentNode.getPriceOrThrow(oraclePriceData, slot));
1668
+ .getPriceOrThrow(oraclePriceData, slot, tickSize)
1669
+ .lt(currentNode.getPriceOrThrow(oraclePriceData, slot, tickSize));
1339
1670
  },
1340
1671
  filterFcn
1341
1672
  );
1342
1673
  }
1343
1674
 
1675
+ /** Same as `getRestingLimitAsks`, but for the bid side (merged best-price-first, highest bid first). */
1344
1676
  *getRestingLimitBids<T extends MarketType>(
1345
1677
  marketIndex: number,
1346
1678
  slot: number,
@@ -1348,7 +1680,8 @@ export class DLOB {
1348
1680
  oraclePriceData: T extends { spot: unknown }
1349
1681
  ? OraclePriceData
1350
1682
  : MMOraclePriceData,
1351
- filterFcn?: DLOBFilterFcn
1683
+ filterFcn?: DLOBFilterFcn,
1684
+ tickSize?: BN
1352
1685
  ): Generator<DLOBNode> {
1353
1686
  if (isVariant(marketType, 'spot') && !oraclePriceData) {
1354
1687
  throw new Error('Must provide OraclePriceData to get spot bids');
@@ -1377,21 +1710,28 @@ export class DLOB {
1377
1710
  slot,
1378
1711
  (bestNode, currentNode, slot, oraclePriceData) => {
1379
1712
  return bestNode
1380
- .getPriceOrThrow(oraclePriceData, slot)
1381
- .gt(currentNode.getPriceOrThrow(oraclePriceData, slot));
1713
+ .getPriceOrThrow(oraclePriceData, slot, tickSize)
1714
+ .gt(currentNode.getPriceOrThrow(oraclePriceData, slot, tickSize));
1382
1715
  },
1383
1716
  filterFcn
1384
1717
  );
1385
1718
  }
1386
1719
 
1387
1720
  /**
1388
- * This will look at both the taking and resting limit asks
1389
- * @param marketIndex
1390
- * @param fallbackAsk
1391
- * @param slot
1392
- * @param marketType
1393
- * @param oraclePriceData
1394
- * @param filterFcn
1721
+ * Merges `getTakingAsks` and `getRestingLimitAsks` into a single best-price-first generator
1722
+ * (ties broken by earliest arrival slot). Nodes with no resolvable price (e.g. still
1723
+ * mid-auction) sort as price `0` — i.e. best — since `getPrice` (not `getPriceOrThrow`) is
1724
+ * used here. Unlike `findTakingNodesToFill`/`findNodesToFill`, this does **not** merge in
1725
+ * fallback (e.g. vAMM) liquidity; the `fallbackAsk` parameter is currently unused/reserved.
1726
+ *
1727
+ * @param marketIndex the market to scan
1728
+ * @param fallbackAsk currently unused
1729
+ * @param slot current slot
1730
+ * @param marketType `MarketType.PERP` or `MarketType.SPOT`
1731
+ * @param oraclePriceData oracle price data for the market; required for spot markets (throws if missing)
1732
+ * @param filterFcn optional predicate; nodes it rejects are skipped
1733
+ * @param tickSize market order tick size, PRICE_PRECISION (1e6); defaults to no rounding if omitted
1734
+ * @returns a generator of all ask nodes (taking + resting-limit), best price first
1395
1735
  */
1396
1736
  *getAsks<T extends MarketType>(
1397
1737
  marketIndex: number,
@@ -1401,7 +1741,8 @@ export class DLOB {
1401
1741
  oraclePriceData: T extends { spot: unknown }
1402
1742
  ? OraclePriceData
1403
1743
  : MMOraclePriceData,
1404
- filterFcn?: DLOBFilterFcn
1744
+ filterFcn?: DLOBFilterFcn,
1745
+ tickSize?: BN
1405
1746
  ): Generator<DLOBNode> {
1406
1747
  if (isVariant(marketType, 'spot') && !oraclePriceData) {
1407
1748
  throw new Error('Must provide OraclePriceData to get spot asks');
@@ -1409,7 +1750,14 @@ export class DLOB {
1409
1750
 
1410
1751
  const generatorList = [
1411
1752
  this.getTakingAsks(marketIndex, marketType, slot, oraclePriceData),
1412
- this.getRestingLimitAsks(marketIndex, slot, marketType, oraclePriceData),
1753
+ this.getRestingLimitAsks(
1754
+ marketIndex,
1755
+ slot,
1756
+ marketType,
1757
+ oraclePriceData,
1758
+ undefined,
1759
+ tickSize
1760
+ ),
1413
1761
  ];
1414
1762
 
1415
1763
  yield* this.getBestNode(
@@ -1417,9 +1765,10 @@ export class DLOB {
1417
1765
  oraclePriceData,
1418
1766
  slot,
1419
1767
  (bestNode, currentNode, slot, oraclePriceData) => {
1420
- const bestNodePrice = bestNode.getPrice(oraclePriceData, slot) ?? ZERO;
1768
+ const bestNodePrice =
1769
+ bestNode.getPrice(oraclePriceData, slot, tickSize) ?? ZERO;
1421
1770
  const currentNodePrice =
1422
- currentNode.getPrice(oraclePriceData, slot) ?? ZERO;
1771
+ currentNode.getPrice(oraclePriceData, slot, tickSize) ?? ZERO;
1423
1772
 
1424
1773
  if (bestNodePrice.eq(currentNodePrice)) {
1425
1774
  return getOrderOrThrow(bestNode).slot.lt(
@@ -1434,13 +1783,19 @@ export class DLOB {
1434
1783
  }
1435
1784
 
1436
1785
  /**
1437
- * This will look at both the taking and resting limit bids
1438
- * @param marketIndex
1439
- * @param fallbackBid
1440
- * @param slot
1441
- * @param marketType
1442
- * @param oraclePriceData
1443
- * @param filterFcn
1786
+ * Merges `getTakingBids` and `getRestingLimitBids` into a single best-price-first generator
1787
+ * (ties broken by earliest arrival slot). Nodes with no resolvable price sort as `BN_MAX` —
1788
+ * i.e. worst — since a priceless bid shouldn't be preferred over a priced one. Does not merge
1789
+ * in fallback (e.g. vAMM) liquidity; the `fallbackBid` parameter is currently unused/reserved.
1790
+ *
1791
+ * @param marketIndex the market to scan
1792
+ * @param fallbackBid currently unused
1793
+ * @param slot current slot
1794
+ * @param marketType `MarketType.PERP` or `MarketType.SPOT`
1795
+ * @param oraclePriceData oracle price data for the market; required for spot markets (throws if missing)
1796
+ * @param filterFcn optional predicate; nodes it rejects are skipped
1797
+ * @param tickSize market order tick size, PRICE_PRECISION (1e6); defaults to no rounding if omitted
1798
+ * @returns a generator of all bid nodes (taking + resting-limit), best price first
1444
1799
  */
1445
1800
  *getBids<T extends MarketType>(
1446
1801
  marketIndex: number,
@@ -1450,7 +1805,8 @@ export class DLOB {
1450
1805
  oraclePriceData: T extends { spot: unknown }
1451
1806
  ? OraclePriceData
1452
1807
  : MMOraclePriceData,
1453
- filterFcn?: DLOBFilterFcn
1808
+ filterFcn?: DLOBFilterFcn,
1809
+ tickSize?: BN
1454
1810
  ): Generator<DLOBNode> {
1455
1811
  if (isVariant(marketType, 'spot') && !oraclePriceData) {
1456
1812
  throw new Error('Must provide OraclePriceData to get spot bids');
@@ -1458,7 +1814,14 @@ export class DLOB {
1458
1814
 
1459
1815
  const generatorList = [
1460
1816
  this.getTakingBids(marketIndex, marketType, slot, oraclePriceData),
1461
- this.getRestingLimitBids(marketIndex, slot, marketType, oraclePriceData),
1817
+ this.getRestingLimitBids(
1818
+ marketIndex,
1819
+ slot,
1820
+ marketType,
1821
+ oraclePriceData,
1822
+ undefined,
1823
+ tickSize
1824
+ ),
1462
1825
  ];
1463
1826
 
1464
1827
  yield* this.getBestNode(
@@ -1467,9 +1830,9 @@ export class DLOB {
1467
1830
  slot,
1468
1831
  (bestNode, currentNode, slot, oraclePriceData) => {
1469
1832
  const bestNodePrice =
1470
- bestNode.getPrice(oraclePriceData, slot) ?? BN_MAX;
1833
+ bestNode.getPrice(oraclePriceData, slot, tickSize) ?? BN_MAX;
1471
1834
  const currentNodePrice =
1472
- currentNode.getPrice(oraclePriceData, slot) ?? BN_MAX;
1835
+ currentNode.getPrice(oraclePriceData, slot, tickSize) ?? BN_MAX;
1473
1836
 
1474
1837
  if (bestNodePrice.eq(currentNodePrice)) {
1475
1838
  return getOrderOrThrow(bestNode).slot.lt(
@@ -1483,13 +1846,30 @@ export class DLOB {
1483
1846
  );
1484
1847
  }
1485
1848
 
1849
+ /**
1850
+ * Finds pairs of resting-limit asks and bids that cross each other (`bidPrice >= askPrice`),
1851
+ * assigns maker/taker roles via `determineMakerAndTaker` (post-only orders are always makers;
1852
+ * otherwise whichever order's auction finished later is the taker), and simulates the fill by
1853
+ * updating both orders' `baseAssetAmountFilled` in their `NodeList`s so subsequent iterations
1854
+ * see the reduced remaining size. Same-user matches are skipped. Because both ask and bid
1855
+ * generators are price-sorted, the inner loop `break`s as soon as `bidPrice < askPrice` for a
1856
+ * given ask, since no later (worse) bid can cross either.
1857
+ *
1858
+ * @param marketIndex the market to scan
1859
+ * @param slot current slot
1860
+ * @param marketType `MarketType.PERP` or `MarketType.SPOT`
1861
+ * @param oraclePriceData oracle price data for the market
1862
+ * @param tickSize market order tick size, PRICE_PRECISION (1e6), threaded into all price lookups
1863
+ * @returns `NodeToFill`s (taker node + one maker node each) for every crossing pair found
1864
+ */
1486
1865
  findCrossingRestingLimitOrders<T extends MarketType>(
1487
1866
  marketIndex: number,
1488
1867
  slot: number,
1489
1868
  marketType: T,
1490
1869
  oraclePriceData: T extends { spot: unknown }
1491
1870
  ? OraclePriceData
1492
- : MMOraclePriceData
1871
+ : MMOraclePriceData,
1872
+ tickSize?: BN
1493
1873
  ): NodeToFill[] {
1494
1874
  const nodesToFill = new Array<NodeToFill>();
1495
1875
 
@@ -1497,18 +1877,30 @@ export class DLOB {
1497
1877
  marketIndex,
1498
1878
  slot,
1499
1879
  marketType,
1500
- oraclePriceData
1880
+ oraclePriceData,
1881
+ undefined,
1882
+ tickSize
1501
1883
  )) {
1502
1884
  const bidGenerator = this.getRestingLimitBids(
1503
1885
  marketIndex,
1504
1886
  slot,
1505
1887
  marketType,
1506
- oraclePriceData
1888
+ oraclePriceData,
1889
+ undefined,
1890
+ tickSize
1507
1891
  );
1508
1892
 
1509
1893
  for (const bidNode of bidGenerator) {
1510
- const bidPrice = bidNode.getPriceOrThrow(oraclePriceData, slot);
1511
- const askPrice = askNode.getPriceOrThrow(oraclePriceData, slot);
1894
+ const bidPrice = bidNode.getPriceOrThrow(
1895
+ oraclePriceData,
1896
+ slot,
1897
+ tickSize
1898
+ );
1899
+ const askPrice = askNode.getPriceOrThrow(
1900
+ oraclePriceData,
1901
+ slot,
1902
+ tickSize
1903
+ );
1512
1904
 
1513
1905
  // orders don't cross
1514
1906
  if (bidPrice.lt(askPrice)) {
@@ -1573,6 +1965,16 @@ export class DLOB {
1573
1965
  return nodesToFill;
1574
1966
  }
1575
1967
 
1968
+ /**
1969
+ * Decides which of a crossing ask/bid pair is the maker and which is the taker: if both are
1970
+ * post-only, they can't be matched (`undefined`); if exactly one is post-only, it's the
1971
+ * maker; otherwise whichever order's auction window (`order.slot + order.auctionDuration`)
1972
+ * ends later is treated as the taker (it "arrived crossing" the earlier order).
1973
+ *
1974
+ * @param askNode the crossing ask node
1975
+ * @param bidNode the crossing bid node
1976
+ * @returns the assigned `{ takerNode, makerNode }`, or `undefined` if both orders are post-only and neither can take
1977
+ */
1576
1978
  determineMakerAndTaker(
1577
1979
  askNode: DLOBNode,
1578
1980
  bidNode: DLOBNode
@@ -1607,48 +2009,88 @@ export class DLOB {
1607
2009
  }
1608
2010
  }
1609
2011
 
2012
+ /**
2013
+ * Gets the best (lowest) resting-limit ask price for a market. Does not consider fallback
2014
+ * (e.g. vAMM) liquidity.
2015
+ *
2016
+ * @param marketIndex the market to query
2017
+ * @param slot current slot
2018
+ * @param marketType `MarketType.PERP` or `MarketType.SPOT`
2019
+ * @param oraclePriceData oracle price data for the market
2020
+ * @param tickSize market order tick size, PRICE_PRECISION (1e6); defaults to no rounding if omitted
2021
+ * @returns the best ask price, PRICE_PRECISION (1e6), or `undefined` if there are no resting-limit asks
2022
+ */
1610
2023
  public getBestAsk<T extends MarketType>(
1611
2024
  marketIndex: number,
1612
2025
  slot: number,
1613
2026
  marketType: T,
1614
2027
  oraclePriceData: T extends { spot: unknown }
1615
2028
  ? OraclePriceData
1616
- : MMOraclePriceData
2029
+ : MMOraclePriceData,
2030
+ tickSize?: BN
1617
2031
  ): BN | undefined {
1618
2032
  const bestAsk = this.getRestingLimitAsks(
1619
2033
  marketIndex,
1620
2034
  slot,
1621
2035
  marketType,
1622
- oraclePriceData
2036
+ oraclePriceData,
2037
+ undefined,
2038
+ tickSize
1623
2039
  ).next().value;
1624
2040
 
1625
2041
  if (bestAsk) {
1626
- return bestAsk.getPrice(oraclePriceData, slot);
2042
+ return bestAsk.getPrice(oraclePriceData, slot, tickSize);
1627
2043
  }
1628
2044
  return undefined;
1629
2045
  }
1630
2046
 
2047
+ /**
2048
+ * Gets the best (highest) resting-limit bid price for a market. Does not consider fallback
2049
+ * (e.g. vAMM) liquidity.
2050
+ *
2051
+ * @param marketIndex the market to query
2052
+ * @param slot current slot
2053
+ * @param marketType `MarketType.PERP` or `MarketType.SPOT`
2054
+ * @param oraclePriceData oracle price data for the market
2055
+ * @param tickSize market order tick size, PRICE_PRECISION (1e6); defaults to no rounding if omitted
2056
+ * @returns the best bid price, PRICE_PRECISION (1e6), or `undefined` if there are no resting-limit bids
2057
+ */
1631
2058
  public getBestBid<T extends MarketType>(
1632
2059
  marketIndex: number,
1633
2060
  slot: number,
1634
2061
  marketType: T,
1635
2062
  oraclePriceData: T extends { spot: unknown }
1636
2063
  ? OraclePriceData
1637
- : MMOraclePriceData
2064
+ : MMOraclePriceData,
2065
+ tickSize?: BN
1638
2066
  ): BN | undefined {
1639
2067
  const bestBid = this.getRestingLimitBids(
1640
2068
  marketIndex,
1641
2069
  slot,
1642
2070
  marketType,
1643
- oraclePriceData
2071
+ oraclePriceData,
2072
+ undefined,
2073
+ tickSize
1644
2074
  ).next().value;
1645
2075
 
1646
2076
  if (bestBid) {
1647
- return bestBid.getPrice(oraclePriceData, slot);
2077
+ return bestBid.getPrice(oraclePriceData, slot, tickSize);
1648
2078
  }
1649
2079
  return undefined;
1650
2080
  }
1651
2081
 
2082
+ /**
2083
+ * Yields untriggered trigger orders that would close a position in `direction`: for a `long`
2084
+ * position, short-direction orders in the `trigger.below` list (stop triggers on a price
2085
+ * drop); for a `short` position, long-direction orders in `trigger.above` (stop triggers on a
2086
+ * price rise). Includes both `triggerMarket` and `triggerLimit` order types — see
2087
+ * `getStopLossMarkets`/`getStopLossLimits` to filter to one.
2088
+ *
2089
+ * @param marketIndex the market to scan
2090
+ * @param marketType `MarketType.PERP` or `MarketType.SPOT`
2091
+ * @param direction the direction of the position being protected (not the order's own direction)
2092
+ * @returns a generator of stop-loss trigger order nodes
2093
+ */
1652
2094
  public *getStopLosses(
1653
2095
  marketIndex: number,
1654
2096
  marketType: MarketType,
@@ -1672,6 +2114,7 @@ export class DLOB {
1672
2114
  }
1673
2115
  }
1674
2116
 
2117
+ /** Same as `getStopLosses`, filtered to `triggerMarket` orders only. */
1675
2118
  public *getStopLossMarkets(
1676
2119
  marketIndex: number,
1677
2120
  marketType: MarketType,
@@ -1684,6 +2127,7 @@ export class DLOB {
1684
2127
  }
1685
2128
  }
1686
2129
 
2130
+ /** Same as `getStopLosses`, filtered to `triggerLimit` orders only. */
1687
2131
  public *getStopLossLimits(
1688
2132
  marketIndex: number,
1689
2133
  marketType: MarketType,
@@ -1696,6 +2140,18 @@ export class DLOB {
1696
2140
  }
1697
2141
  }
1698
2142
 
2143
+ /**
2144
+ * Yields untriggered trigger orders that would close a position in `direction` for profit:
2145
+ * for a `long` position, short-direction orders in `trigger.above` (take-profit on a price
2146
+ * rise); for a `short` position, long-direction orders in `trigger.below` (take-profit on a
2147
+ * price drop). Includes both `triggerMarket` and `triggerLimit` order types — see
2148
+ * `getTakeProfitMarkets`/`getTakeProfitLimits` to filter to one.
2149
+ *
2150
+ * @param marketIndex the market to scan
2151
+ * @param marketType `MarketType.PERP` or `MarketType.SPOT`
2152
+ * @param direction the direction of the position being protected (not the order's own direction)
2153
+ * @returns a generator of take-profit trigger order nodes
2154
+ */
1699
2155
  public *getTakeProfits(
1700
2156
  marketIndex: number,
1701
2157
  marketType: MarketType,
@@ -1719,6 +2175,7 @@ export class DLOB {
1719
2175
  }
1720
2176
  }
1721
2177
 
2178
+ /** Same as `getTakeProfits`, filtered to `triggerMarket` orders only. */
1722
2179
  public *getTakeProfitMarkets(
1723
2180
  marketIndex: number,
1724
2181
  marketType: MarketType,
@@ -1735,6 +2192,7 @@ export class DLOB {
1735
2192
  }
1736
2193
  }
1737
2194
 
2195
+ /** Same as `getTakeProfits`, filtered to `triggerLimit` orders only. */
1738
2196
  public *getTakeProfitLimits(
1739
2197
  marketIndex: number,
1740
2198
  marketType: MarketType,
@@ -1751,6 +2209,20 @@ export class DLOB {
1751
2209
  }
1752
2210
  }
1753
2211
 
2212
+ /**
2213
+ * Finds trigger orders whose condition is now satisfied by `triggerPrice`: `trigger.above`
2214
+ * orders with `triggerPrice > order.triggerPrice`, and `trigger.below` orders with
2215
+ * `triggerPrice < order.triggerPrice`. Both lists are sorted by trigger price with the
2216
+ * nearest-to-triggering order at `head`, so each scan walks from `head` and `break`s at the
2217
+ * first order that isn't (yet) triggered. Returns `[]` immediately if the exchange is paused.
2218
+ *
2219
+ * @param marketIndex the market to scan
2220
+ * @param slot current slot (currently unused by the scan itself, reserved for future use)
2221
+ * @param triggerPrice the price to check trigger conditions against, PRICE_PRECISION (1e6) — typically the current oracle or mark price
2222
+ * @param marketType `MarketType.PERP` or `MarketType.SPOT`
2223
+ * @param stateAccount global protocol state, used for the exchange-pause check
2224
+ * @returns `NodeToTrigger`s for every order ready to be triggered on-chain
2225
+ */
1754
2226
  public findNodesToTrigger(
1755
2227
  marketIndex: number,
1756
2228
  slot: number,
@@ -1809,6 +2281,17 @@ export class DLOB {
1809
2281
  return nodesToTrigger;
1810
2282
  }
1811
2283
 
2284
+ /**
2285
+ * Debug helper: logs the market's best bid, best ask, and mid price (all resting-limit only,
2286
+ * no fallback liquidity), along with each side's spread to the current oracle price, as a
2287
+ * percentage.
2288
+ *
2289
+ * @param velocityClient client used to resolve market accounts and oracle price data
2290
+ * @param slotSubscriber source of the current slot
2291
+ * @param marketIndex the market to print
2292
+ * @param marketType `MarketType.PERP` or `MarketType.SPOT`
2293
+ * @throws if the market currently has no resting-limit bid or ask (best bid/ask is `undefined`)
2294
+ */
1812
2295
  public printTop(
1813
2296
  velocityClient: VelocityClient,
1814
2297
  slotSubscriber: SlotSubscriber,
@@ -1918,6 +2401,7 @@ export class DLOB {
1918
2401
  }
1919
2402
  }
1920
2403
 
2404
+ /** Flattens every order across every `NodeList` (perp and spot, all categories/sides) into a single `DLOBOrders` array of `{ user, order }` pairs, in no particular cross-list order. */
1921
2405
  public getDLOBOrders(): DLOBOrders {
1922
2406
  const dlobOrders: DLOBOrders = [];
1923
2407
 
@@ -1933,6 +2417,7 @@ export class DLOB {
1933
2417
  return dlobOrders;
1934
2418
  }
1935
2419
 
2420
+ /** Yields every `NodeList` (all ten category/side combinations, per market) across every perp market, then every spot market. Used by `getOrder`/`getDLOBOrders` to walk the entire book. */
1936
2421
  *getNodeLists(): Generator<NodeList<DLOBNodeType>> {
1937
2422
  for (const [_, nodeLists] of this.getOrderListsForMarketType('perp')) {
1938
2423
  yield nodeLists.restingLimit.bid;
@@ -1962,14 +2447,20 @@ export class DLOB {
1962
2447
  }
1963
2448
 
1964
2449
  /**
1965
- * Get an L2 view of the order book for a given market.
2450
+ * Get an L2 (aggregated price/size) view of the order book for a given market: resting-limit
2451
+ * DLOB liquidity merged with any supplied fallback generators (e.g. the vAMM, via
2452
+ * `getVammL2Generator`), then bucketed into up to `depth` levels per side via `createL2Levels`.
2453
+ * Does not include taking (still-auctioning) orders — only resting-limit makers and fallback
2454
+ * liquidity are represented.
1966
2455
  *
1967
- * @param marketIndex
1968
- * @param marketType
1969
- * @param slot
1970
- * @param oraclePriceData
1971
- * @param depth how many levels of the order book to return
1972
- * @param fallbackL2Generators L2 generators for fallback liquidity e.g. vAMM {@link getVammL2Generator}
2456
+ * @param marketIndex the market to build a book for
2457
+ * @param marketType `MarketType.PERP` or `MarketType.SPOT`
2458
+ * @param slot current slot, used to resolve resting-limit order prices
2459
+ * @param oraclePriceData oracle price data for the market
2460
+ * @param depth how many price levels of the order book to return, per side
2461
+ * @param fallbackL2Generators additional non-DLOB liquidity sources to merge in, e.g. `getVammL2Generator`'s output; defaults to `[]`
2462
+ * @param tickSize market order tick size, PRICE_PRECISION (1e6), threaded into all DLOB price lookups; defaults to no rounding if omitted
2463
+ * @returns the merged `L2OrderBook`, tagged with the given `slot`
1973
2464
  */
1974
2465
  public getL2<T extends MarketType>({
1975
2466
  marketIndex,
@@ -1978,6 +2469,7 @@ export class DLOB {
1978
2469
  oraclePriceData,
1979
2470
  depth,
1980
2471
  fallbackL2Generators = [],
2472
+ tickSize,
1981
2473
  }: {
1982
2474
  marketIndex: number;
1983
2475
  marketType: T;
@@ -1987,11 +2479,20 @@ export class DLOB {
1987
2479
  : MMOraclePriceData;
1988
2480
  depth: number;
1989
2481
  fallbackL2Generators?: L2OrderBookGenerator[];
2482
+ tickSize?: BN;
1990
2483
  }): L2OrderBook {
1991
2484
  const makerAskL2LevelGenerator = getL2GeneratorFromDLOBNodes(
1992
- this.getRestingLimitAsks(marketIndex, slot, marketType, oraclePriceData),
2485
+ this.getRestingLimitAsks(
2486
+ marketIndex,
2487
+ slot,
2488
+ marketType,
2489
+ oraclePriceData,
2490
+ undefined,
2491
+ tickSize
2492
+ ),
1993
2493
  oraclePriceData,
1994
- slot
2494
+ slot,
2495
+ tickSize
1995
2496
  );
1996
2497
 
1997
2498
  const fallbackAskGenerators = fallbackL2Generators.map(
@@ -2010,9 +2511,17 @@ export class DLOB {
2010
2511
  const asks = createL2Levels(askL2LevelGenerator, depth);
2011
2512
 
2012
2513
  const makerBidGenerator = getL2GeneratorFromDLOBNodes(
2013
- this.getRestingLimitBids(marketIndex, slot, marketType, oraclePriceData),
2514
+ this.getRestingLimitBids(
2515
+ marketIndex,
2516
+ slot,
2517
+ marketType,
2518
+ oraclePriceData,
2519
+ undefined,
2520
+ tickSize
2521
+ ),
2014
2522
  oraclePriceData,
2015
- slot
2523
+ slot,
2524
+ tickSize
2016
2525
  );
2017
2526
 
2018
2527
  const fallbackBidGenerators = fallbackL2Generators.map((fallbackOrders) => {
@@ -2036,18 +2545,22 @@ export class DLOB {
2036
2545
  }
2037
2546
 
2038
2547
  /**
2039
- * Get an L3 view of the order book for a given market. Does not include fallback liquidity sources
2548
+ * Get an L3 (individual resting order) view of the order book for a given market. Only
2549
+ * resting-limit orders are included — no taking orders and no fallback (e.g. vAMM) liquidity.
2040
2550
  *
2041
- * @param marketIndex
2042
- * @param marketType
2043
- * @param slot
2044
- * @param oraclePriceData
2551
+ * @param marketIndex the market to build a book for
2552
+ * @param marketType `MarketType.PERP` or `MarketType.SPOT`
2553
+ * @param slot current slot, used to resolve resting-limit order prices
2554
+ * @param oraclePriceData oracle price data for the market
2555
+ * @param tickSize market order tick size, PRICE_PRECISION (1e6); defaults to no rounding if omitted
2556
+ * @returns the `L3OrderBook`, tagged with the given `slot`
2045
2557
  */
2046
2558
  public getL3<T extends MarketType>({
2047
2559
  marketIndex,
2048
2560
  marketType,
2049
2561
  slot,
2050
2562
  oraclePriceData,
2563
+ tickSize,
2051
2564
  }: {
2052
2565
  marketIndex: number;
2053
2566
  marketType: T;
@@ -2055,6 +2568,7 @@ export class DLOB {
2055
2568
  oraclePriceData: T extends { spot: unknown }
2056
2569
  ? OraclePriceData
2057
2570
  : MMOraclePriceData;
2571
+ tickSize?: BN;
2058
2572
  }): L3OrderBook {
2059
2573
  const bids: L3Level[] = [];
2060
2574
  const asks: L3Level[] = [];
@@ -2063,13 +2577,15 @@ export class DLOB {
2063
2577
  marketIndex,
2064
2578
  slot,
2065
2579
  marketType,
2066
- oraclePriceData
2580
+ oraclePriceData,
2581
+ undefined,
2582
+ tickSize
2067
2583
  );
2068
2584
 
2069
2585
  for (const ask of restingAsks) {
2070
2586
  const askOrder = getOrderOrThrow(ask);
2071
2587
  asks.push({
2072
- price: ask.getPriceOrThrow(oraclePriceData, slot),
2588
+ price: ask.getPriceOrThrow(oraclePriceData, slot, tickSize),
2073
2589
  size: askOrder.baseAssetAmount.sub(askOrder.baseAssetAmountFilled),
2074
2590
  maker: new PublicKey(getUserAccountOrThrow(ask)),
2075
2591
  orderId: askOrder.orderId,
@@ -2080,13 +2596,15 @@ export class DLOB {
2080
2596
  marketIndex,
2081
2597
  slot,
2082
2598
  marketType,
2083
- oraclePriceData
2599
+ oraclePriceData,
2600
+ undefined,
2601
+ tickSize
2084
2602
  );
2085
2603
 
2086
2604
  for (const bid of restingBids) {
2087
2605
  const bidOrder = getOrderOrThrow(bid);
2088
2606
  bids.push({
2089
- price: bid.getPriceOrThrow(oraclePriceData, slot),
2607
+ price: bid.getPriceOrThrow(oraclePriceData, slot, tickSize),
2090
2608
  size: bidOrder.baseAssetAmount.sub(bidOrder.baseAssetAmountFilled),
2091
2609
  maker: new PublicKey(getUserAccountOrThrow(bid)),
2092
2610
  orderId: bidOrder.orderId,
@@ -2104,12 +2622,13 @@ export class DLOB {
2104
2622
  baseAmountIn: BN,
2105
2623
  oraclePriceData: OraclePriceData,
2106
2624
  slot: number,
2107
- dlobSide: Generator<DLOBNode>
2625
+ dlobSide: Generator<DLOBNode>,
2626
+ tickSize?: BN
2108
2627
  ): BN {
2109
2628
  let runningSumQuote = ZERO;
2110
2629
  let runningSumBase = ZERO;
2111
2630
  for (const side of dlobSide) {
2112
- const price = side.getPriceOrThrow(oraclePriceData, slot); //side.order.quoteAssetAmount.div(side.order.baseAssetAmount);
2631
+ const price = side.getPriceOrThrow(oraclePriceData, slot, tickSize); //side.order.quoteAssetAmount.div(side.order.baseAssetAmount);
2113
2632
  const sideOrder = getOrderOrThrow(side);
2114
2633
  const baseAmountRemaining = sideOrder.baseAssetAmount.sub(
2115
2634
  sideOrder.baseAssetAmountFilled
@@ -2131,14 +2650,21 @@ export class DLOB {
2131
2650
  }
2132
2651
 
2133
2652
  /**
2653
+ * Estimates the quote amount that would be filled for a given base amount, walking
2654
+ * resting-limit asks (for a `long`/buy) or bids (for a `short`/sell) from best price outward
2655
+ * and summing `price * size` until `baseAmount` is consumed. Does not include fallback (e.g.
2656
+ * vAMM) liquidity or taking orders, and does not mutate any order state — this is a read-only
2657
+ * estimate, not a simulated fill.
2134
2658
  *
2135
- * @param param.marketIndex the index of the market
2136
- * @param param.marketType the type of the market
2137
- * @param param.baseAmount the base amount in to estimate
2138
- * @param param.orderDirection the direction of the trade
2139
- * @param param.slot current slot for estimating dlob node price
2140
- * @param param.oraclePriceData the oracle price data
2141
- * @returns the estimated quote amount filled: QUOTE_PRECISION
2659
+ * @param marketIndex the market to estimate against
2660
+ * @param marketType `MarketType.PERP` or `MarketType.SPOT`
2661
+ * @param baseAmount the base amount to fill, BASE_PRECISION (1e9)
2662
+ * @param orderDirection direction of the hypothetical taker order (`long` walks asks, `short` walks bids)
2663
+ * @param slot current slot, used to resolve resting-limit order prices
2664
+ * @param oraclePriceData oracle price data for the market
2665
+ * @param tickSize market order tick size, PRICE_PRECISION (1e6); defaults to no rounding if omitted
2666
+ * @returns the estimated quote amount filled, QUOTE_PRECISION (1e6); if resting liquidity is thinner than `baseAmount`, the result silently reflects only the liquidity that was actually walked (no error/flag for partial fill), and is `0` if there is no resting liquidity on that side at all
2667
+ * @throws if `orderDirection` is neither `long` nor `short`
2142
2668
  */
2143
2669
  public estimateFillWithExactBaseAmount<T extends MarketType>({
2144
2670
  marketIndex,
@@ -2147,6 +2673,7 @@ export class DLOB {
2147
2673
  orderDirection,
2148
2674
  slot,
2149
2675
  oraclePriceData,
2676
+ tickSize,
2150
2677
  }: {
2151
2678
  marketIndex: number;
2152
2679
  marketType: T;
@@ -2156,20 +2683,37 @@ export class DLOB {
2156
2683
  oraclePriceData: T extends { spot: unknown }
2157
2684
  ? OraclePriceData
2158
2685
  : MMOraclePriceData;
2686
+ tickSize?: BN;
2159
2687
  }): BN {
2160
2688
  if (isVariant(orderDirection, 'long')) {
2161
2689
  return this.estimateFillExactBaseAmountInForSide(
2162
2690
  baseAmount,
2163
2691
  oraclePriceData,
2164
2692
  slot,
2165
- this.getRestingLimitAsks(marketIndex, slot, marketType, oraclePriceData)
2693
+ this.getRestingLimitAsks(
2694
+ marketIndex,
2695
+ slot,
2696
+ marketType,
2697
+ oraclePriceData,
2698
+ undefined,
2699
+ tickSize
2700
+ ),
2701
+ tickSize
2166
2702
  );
2167
2703
  } else if (isVariant(orderDirection, 'short')) {
2168
2704
  return this.estimateFillExactBaseAmountInForSide(
2169
2705
  baseAmount,
2170
2706
  oraclePriceData,
2171
2707
  slot,
2172
- this.getRestingLimitBids(marketIndex, slot, marketType, oraclePriceData)
2708
+ this.getRestingLimitBids(
2709
+ marketIndex,
2710
+ slot,
2711
+ marketType,
2712
+ oraclePriceData,
2713
+ undefined,
2714
+ tickSize
2715
+ ),
2716
+ tickSize
2173
2717
  );
2174
2718
  }
2175
2719
  throw new Error(
@@ -2179,6 +2723,22 @@ export class DLOB {
2179
2723
  );
2180
2724
  }
2181
2725
 
2726
+ /**
2727
+ * Collects the pubkeys of up to `numMakers` distinct makers currently resting best-priced on
2728
+ * one side of the book — bids for a `long` taker, asks for a `short` taker — in best-price
2729
+ * order. Used to pick candidate maker accounts to pass as `remaining_accounts` when
2730
+ * submitting a fill instruction. A maker with multiple resting orders at different prices
2731
+ * only counts once toward `numMakers`.
2732
+ *
2733
+ * @param marketIndex the market to scan
2734
+ * @param marketType `MarketType.PERP` or `MarketType.SPOT`
2735
+ * @param direction direction of the taker order being matched (`long` collects bid-side makers, `short` collects ask-side makers)
2736
+ * @param slot current slot, used to resolve resting-limit order prices
2737
+ * @param oraclePriceData oracle price data for the market
2738
+ * @param numMakers maximum number of distinct maker pubkeys to return
2739
+ * @param tickSize market order tick size, PRICE_PRECISION (1e6); defaults to no rounding if omitted
2740
+ * @returns up to `numMakers` distinct maker `PublicKey`s, best price first
2741
+ */
2182
2742
  public getBestMakers<T extends MarketType>({
2183
2743
  marketIndex,
2184
2744
  marketType,
@@ -2186,6 +2746,7 @@ export class DLOB {
2186
2746
  slot,
2187
2747
  oraclePriceData,
2188
2748
  numMakers,
2749
+ tickSize,
2189
2750
  }: {
2190
2751
  marketIndex: number;
2191
2752
  marketType: T;
@@ -2195,15 +2756,25 @@ export class DLOB {
2195
2756
  ? OraclePriceData
2196
2757
  : MMOraclePriceData;
2197
2758
  numMakers: number;
2759
+ tickSize?: BN;
2198
2760
  }): PublicKey[] {
2199
2761
  const makers = new Map<string, PublicKey>();
2200
2762
  const generator = isVariant(direction, 'long')
2201
- ? this.getRestingLimitBids(marketIndex, slot, marketType, oraclePriceData)
2763
+ ? this.getRestingLimitBids(
2764
+ marketIndex,
2765
+ slot,
2766
+ marketType,
2767
+ oraclePriceData,
2768
+ undefined,
2769
+ tickSize
2770
+ )
2202
2771
  : this.getRestingLimitAsks(
2203
2772
  marketIndex,
2204
2773
  slot,
2205
2774
  marketType,
2206
- oraclePriceData
2775
+ oraclePriceData,
2776
+ undefined,
2777
+ tickSize
2207
2778
  );
2208
2779
 
2209
2780
  for (const node of generator) {