@paraswap/dex-lib 4.8.37-native-dex-math.1 → 4.8.37

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 (305) hide show
  1. package/build/abi/pancakeswap-infinity/cl-pool-manager.json +80 -0
  2. package/build/dex/aave-gsm/config.js +2 -2
  3. package/build/dex/fluid-dex/scripts/measure-calc-time.js +178 -0
  4. package/build/dex/fluid-dex/scripts/measure-calc-time.js.map +1 -0
  5. package/build/dex/idex.d.ts +1 -1
  6. package/build/dex/index.js +2 -0
  7. package/build/dex/index.js.map +1 -1
  8. package/build/dex/{infusion → pancakeswap-infinity}/config.d.ts +2 -2
  9. package/build/dex/pancakeswap-infinity/config.js +14 -0
  10. package/build/dex/pancakeswap-infinity/config.js.map +1 -0
  11. package/build/dex/pancakeswap-infinity/encoder.d.ts +4 -0
  12. package/build/dex/pancakeswap-infinity/encoder.js +218 -0
  13. package/build/dex/pancakeswap-infinity/encoder.js.map +1 -0
  14. package/build/dex/pancakeswap-infinity/pancakeswap-infinity.d.ts +21 -0
  15. package/build/dex/pancakeswap-infinity/pancakeswap-infinity.js +102 -0
  16. package/build/dex/pancakeswap-infinity/pancakeswap-infinity.js.map +1 -0
  17. package/build/dex/pancakeswap-infinity/subgraph.d.ts +7 -0
  18. package/build/dex/pancakeswap-infinity/subgraph.js +64 -0
  19. package/build/dex/pancakeswap-infinity/subgraph.js.map +1 -0
  20. package/build/dex/pancakeswap-infinity/types.d.ts +39 -0
  21. package/build/dex/pancakeswap-infinity/types.js.map +1 -0
  22. package/build/dex/pancakeswap-v3/pancakeswap-v3-pool.d.ts +0 -2
  23. package/build/dex/pancakeswap-v3/pancakeswap-v3-pool.js +0 -5
  24. package/build/dex/pancakeswap-v3/pancakeswap-v3-pool.js.map +1 -1
  25. package/build/dex/pancakeswap-v3/pancakeswap-v3.d.ts +3 -6
  26. package/build/dex/pancakeswap-v3/pancakeswap-v3.js +9 -85
  27. package/build/dex/pancakeswap-v3/pancakeswap-v3.js.map +1 -1
  28. package/build/dex/solidly-v3/solidly-v3-pool.d.ts +0 -3
  29. package/build/dex/solidly-v3/solidly-v3-pool.js +0 -8
  30. package/build/dex/solidly-v3/solidly-v3-pool.js.map +1 -1
  31. package/build/dex/solidly-v3/solidly-v3.d.ts +2 -5
  32. package/build/dex/solidly-v3/solidly-v3.js +8 -84
  33. package/build/dex/solidly-v3/solidly-v3.js.map +1 -1
  34. package/build/dex/uniswap-v3/scripts/measure-calc-time.js +110 -222
  35. package/build/dex/uniswap-v3/scripts/measure-calc-time.js.map +1 -1
  36. package/build/dex/uniswap-v3/types.d.ts +0 -1
  37. package/build/dex/uniswap-v3/types.js.map +1 -1
  38. package/build/dex/uniswap-v3/uniswap-v3-pool.d.ts +0 -2
  39. package/build/dex/uniswap-v3/uniswap-v3-pool.js +0 -5
  40. package/build/dex/uniswap-v3/uniswap-v3-pool.js.map +1 -1
  41. package/build/dex/uniswap-v3/uniswap-v3.d.ts +3 -11
  42. package/build/dex/uniswap-v3/uniswap-v3.js +9 -86
  43. package/build/dex/uniswap-v3/uniswap-v3.js.map +1 -1
  44. package/build/dex/uniswap-v4/api-go/compare-pricing.d.ts +1 -0
  45. package/build/dex/uniswap-v4/api-go/compare-pricing.js +187 -0
  46. package/build/dex/uniswap-v4/api-go/compare-pricing.js.map +1 -0
  47. package/build/dex/uniswap-v4/api-go/compare-states.d.ts +1 -0
  48. package/build/dex/uniswap-v4/api-go/compare-states.js +149 -0
  49. package/build/dex/uniswap-v4/api-go/compare-states.js.map +1 -0
  50. package/build/dex/uniswap-v4/api-go/fetch-pool-key.d.ts +0 -0
  51. package/build/dex/uniswap-v4/api-go/fetch-pool-key.js +140 -0
  52. package/build/dex/uniswap-v4/api-go/fetch-pool-key.js.map +1 -0
  53. package/build/dex/uniswap-v4/types.d.ts +0 -1
  54. package/build/dex/uniswap-v4/uniswap-v4-pool-manager.d.ts +0 -2
  55. package/build/dex/uniswap-v4/uniswap-v4-pool-manager.js +0 -3
  56. package/build/dex/uniswap-v4/uniswap-v4-pool-manager.js.map +1 -1
  57. package/build/dex/uniswap-v4/uniswap-v4-pool.d.ts +0 -3
  58. package/build/dex/uniswap-v4/uniswap-v4-pool.js +0 -18
  59. package/build/dex/uniswap-v4/uniswap-v4-pool.js.map +1 -1
  60. package/build/dex/uniswap-v4/uniswap-v4.d.ts +1 -3
  61. package/build/dex/uniswap-v4/uniswap-v4.js +14 -74
  62. package/build/dex/uniswap-v4/uniswap-v4.js.map +1 -1
  63. package/build/pricing-helper.d.ts +1 -1
  64. package/build/pricing-helper.js +2 -2
  65. package/build/pricing-helper.js.map +1 -1
  66. package/package.json +3 -3
  67. package/build/abi/BProtocol.json +0 -1155
  68. package/build/abi/Jarvis.json +0 -1172
  69. package/build/abi/MStableAsset.json +0 -1545
  70. package/build/abi/OneInchLp.json +0 -1304
  71. package/build/abi/Onebit.json +0 -736
  72. package/build/abi/Shell.json +0 -1294
  73. package/build/abi/TraderJoeV2Router.json +0 -50
  74. package/build/abi/idle-dao/idle-cdo-factory.json +0 -38
  75. package/build/abi/idle-dao/idle-cdo.json +0 -1245
  76. package/build/abi/infusion/InfusionFactory.json +0 -147
  77. package/build/abi/infusion/InfusionPair.json +0 -658
  78. package/build/abi/infusion/InfusionRouter.json +0 -442
  79. package/build/abi/maker-psm/pot.json +0 -322
  80. package/build/abi/maker-psm/psm.json +0 -243
  81. package/build/abi/maker-psm/vat.json +0 -363
  82. package/build/abi/nomiswap-v2/nomiswap-v2-pool.json +0 -773
  83. package/build/abi/quick-perps/fast-price-events.json +0 -70
  84. package/build/abi/quick-perps/fast-price-feed.json +0 -741
  85. package/build/abi/quick-perps/reader.json +0 -313
  86. package/build/abi/quick-perps/vault-price-feed.json +0 -323
  87. package/build/abi/quick-perps/vault.json +0 -1953
  88. package/build/abi/uniswap-v2/excalibur-pool.json +0 -881
  89. package/build/abi/uniswap-v2/mdex-factory.json +0 -759
  90. package/build/abi/wUSDM.json +0 -757
  91. package/build/abi/zrx.v2.json +0 -1967
  92. package/build/abi/zrx.v3.json +0 -3454
  93. package/build/abi/zrx.v4.json +0 -2193
  94. package/build/dex/OneInchLp.d.ts +0 -24
  95. package/build/dex/OneInchLp.js +0 -43
  96. package/build/dex/OneInchLp.js.map +0 -1
  97. package/build/dex/bProtocol/bProtocol.d.ts +0 -15
  98. package/build/dex/bProtocol/bProtocol.js +0 -56
  99. package/build/dex/bProtocol/bProtocol.js.map +0 -1
  100. package/build/dex/bProtocol/types.d.ts +0 -11
  101. package/build/dex/bProtocol/types.js +0 -8
  102. package/build/dex/bProtocol/types.js.map +0 -1
  103. package/build/dex/ekubo/pools/base-pool.d.ts +0 -47
  104. package/build/dex/ekubo/pools/base-pool.js +0 -184
  105. package/build/dex/ekubo/pools/base-pool.js.map +0 -1
  106. package/build/dex/ekubo/pools/iface.d.ts +0 -46
  107. package/build/dex/ekubo/pools/iface.js +0 -75
  108. package/build/dex/ekubo/pools/iface.js.map +0 -1
  109. package/build/dex/ekubo/pools/math/price.d.ts +0 -7
  110. package/build/dex/ekubo/pools/math/price.js +0 -112
  111. package/build/dex/ekubo/pools/math/price.js.map +0 -1
  112. package/build/dex/ekubo/pools/oracle-pool.d.ts +0 -10
  113. package/build/dex/ekubo/pools/oracle-pool.js +0 -19
  114. package/build/dex/ekubo/pools/oracle-pool.js.map +0 -1
  115. package/build/dex/ekubo/pools/pool-utils.d.ts +0 -44
  116. package/build/dex/ekubo/pools/pool-utils.js +0 -240
  117. package/build/dex/ekubo/pools/pool-utils.js.map +0 -1
  118. package/build/dex/idle-dao/config.d.ts +0 -5
  119. package/build/dex/idle-dao/config.js +0 -24
  120. package/build/dex/idle-dao/config.js.map +0 -1
  121. package/build/dex/idle-dao/idle-dao.d.ts +0 -42
  122. package/build/dex/idle-dao/idle-dao.js +0 -279
  123. package/build/dex/idle-dao/idle-dao.js.map +0 -1
  124. package/build/dex/idle-dao/token_list.d.ts +0 -4
  125. package/build/dex/idle-dao/token_list.js +0 -289
  126. package/build/dex/idle-dao/token_list.js.map +0 -1
  127. package/build/dex/idle-dao/tokens.d.ts +0 -9
  128. package/build/dex/idle-dao/tokens.js +0 -68
  129. package/build/dex/idle-dao/tokens.js.map +0 -1
  130. package/build/dex/idle-dao/types.d.ts +0 -35
  131. package/build/dex/idle-dao/types.js +0 -11
  132. package/build/dex/idle-dao/types.js.map +0 -1
  133. package/build/dex/idle-dao/utils.d.ts +0 -8
  134. package/build/dex/idle-dao/utils.js +0 -149
  135. package/build/dex/idle-dao/utils.js.map +0 -1
  136. package/build/dex/infusion/config.js +0 -20
  137. package/build/dex/infusion/config.js.map +0 -1
  138. package/build/dex/infusion/infusion-stable-pool.d.ts +0 -4
  139. package/build/dex/infusion/infusion-stable-pool.js +0 -74
  140. package/build/dex/infusion/infusion-stable-pool.js.map +0 -1
  141. package/build/dex/infusion/infusion.d.ts +0 -51
  142. package/build/dex/infusion/infusion.js +0 -500
  143. package/build/dex/infusion/infusion.js.map +0 -1
  144. package/build/dex/infusion/types.d.ts +0 -45
  145. package/build/dex/infusion/types.js.map +0 -1
  146. package/build/dex/infusion/utils/isStablePair.d.ts +0 -2
  147. package/build/dex/infusion/utils/isStablePair.js +0 -18
  148. package/build/dex/infusion/utils/isStablePair.js.map +0 -1
  149. package/build/dex/jarvis.d.ts +0 -56
  150. package/build/dex/jarvis.js +0 -163
  151. package/build/dex/jarvis.js.map +0 -1
  152. package/build/dex/mStable.d.ts +0 -44
  153. package/build/dex/mStable.js +0 -75
  154. package/build/dex/mStable.js.map +0 -1
  155. package/build/dex/maker-psm/config.d.ts +0 -11
  156. package/build/dex/maker-psm/config.js +0 -53
  157. package/build/dex/maker-psm/config.js.map +0 -1
  158. package/build/dex/maker-psm/maker-psm.d.ts +0 -103
  159. package/build/dex/maker-psm/maker-psm.js +0 -493
  160. package/build/dex/maker-psm/maker-psm.js.map +0 -1
  161. package/build/dex/maker-psm/types.d.ts +0 -39
  162. package/build/dex/maker-psm/types.js +0 -3
  163. package/build/dex/maker-psm/types.js.map +0 -1
  164. package/build/dex/onebit/onebit.d.ts +0 -16
  165. package/build/dex/onebit/onebit.js +0 -61
  166. package/build/dex/onebit/onebit.js.map +0 -1
  167. package/build/dex/onebit/types.d.ts +0 -14
  168. package/build/dex/onebit/types.js +0 -8
  169. package/build/dex/onebit/types.js.map +0 -1
  170. package/build/dex/quick-perps/config.d.ts +0 -11
  171. package/build/dex/quick-perps/config.js +0 -27
  172. package/build/dex/quick-perps/config.js.map +0 -1
  173. package/build/dex/quick-perps/fast-price-feed.d.ts +0 -26
  174. package/build/dex/quick-perps/fast-price-feed.js +0 -184
  175. package/build/dex/quick-perps/fast-price-feed.js.map +0 -1
  176. package/build/dex/quick-perps/pool.d.ts +0 -21
  177. package/build/dex/quick-perps/pool.js +0 -229
  178. package/build/dex/quick-perps/pool.js.map +0 -1
  179. package/build/dex/quick-perps/quick-perps.d.ts +0 -53
  180. package/build/dex/quick-perps/quick-perps.js +0 -247
  181. package/build/dex/quick-perps/quick-perps.js.map +0 -1
  182. package/build/dex/quick-perps/types.d.ts +0 -98
  183. package/build/dex/quick-perps/types.js +0 -3
  184. package/build/dex/quick-perps/types.js.map +0 -1
  185. package/build/dex/quick-perps/usdq.d.ts +0 -15
  186. package/build/dex/quick-perps/usdq.js +0 -62
  187. package/build/dex/quick-perps/usdq.js.map +0 -1
  188. package/build/dex/quick-perps/vault-price-feed.d.ts +0 -43
  189. package/build/dex/quick-perps/vault-price-feed.js +0 -203
  190. package/build/dex/quick-perps/vault-price-feed.js.map +0 -1
  191. package/build/dex/quick-perps/vault-utils.d.ts +0 -8
  192. package/build/dex/quick-perps/vault-utils.js +0 -42
  193. package/build/dex/quick-perps/vault-utils.js.map +0 -1
  194. package/build/dex/quick-perps/vault.d.ts +0 -46
  195. package/build/dex/quick-perps/vault.js +0 -182
  196. package/build/dex/quick-perps/vault.js.map +0 -1
  197. package/build/dex/se-vlr/config.d.ts +0 -3
  198. package/build/dex/se-vlr/config.js +0 -24
  199. package/build/dex/se-vlr/config.js.map +0 -1
  200. package/build/dex/se-vlr/se-vlr-pool.d.ts +0 -39
  201. package/build/dex/se-vlr/se-vlr-pool.js +0 -70
  202. package/build/dex/se-vlr/se-vlr-pool.js.map +0 -1
  203. package/build/dex/se-vlr/se-vlr.d.ts +0 -35
  204. package/build/dex/se-vlr/se-vlr.js +0 -131
  205. package/build/dex/se-vlr/se-vlr.js.map +0 -1
  206. package/build/dex/se-vlr/types.d.ts +0 -6
  207. package/build/dex/se-vlr/types.js +0 -3
  208. package/build/dex/se-vlr/types.js.map +0 -1
  209. package/build/dex/shell.d.ts +0 -25
  210. package/build/dex/shell.js +0 -41
  211. package/build/dex/shell.js.map +0 -1
  212. package/build/dex/solidly/forks-override/aerodrome.d.ts +0 -14
  213. package/build/dex/solidly/forks-override/aerodrome.js +0 -46
  214. package/build/dex/solidly/forks-override/aerodrome.js.map +0 -1
  215. package/build/dex/solidly/forks-override/chronos.d.ts +0 -23
  216. package/build/dex/solidly/forks-override/chronos.js +0 -141
  217. package/build/dex/solidly/forks-override/chronos.js.map +0 -1
  218. package/build/dex/solidly/forks-override/usdfi.d.ts +0 -8
  219. package/build/dex/solidly/forks-override/usdfi.js +0 -15
  220. package/build/dex/solidly/forks-override/usdfi.js.map +0 -1
  221. package/build/dex/solidly/forks-override/velocimeter.d.ts +0 -23
  222. package/build/dex/solidly/forks-override/velocimeter.js +0 -77
  223. package/build/dex/solidly/forks-override/velocimeter.js.map +0 -1
  224. package/build/dex/trader-joe-v2.d.ts +0 -40
  225. package/build/dex/trader-joe-v2.js +0 -74
  226. package/build/dex/trader-joe-v2.js.map +0 -1
  227. package/build/dex/uniswap-v2/dfyn.d.ts +0 -19
  228. package/build/dex/uniswap-v2/dfyn.js +0 -61
  229. package/build/dex/uniswap-v2/dfyn.js.map +0 -1
  230. package/build/dex/uniswap-v2/excalibur.d.ts +0 -24
  231. package/build/dex/uniswap-v2/excalibur.js +0 -47
  232. package/build/dex/uniswap-v2/excalibur.js.map +0 -1
  233. package/build/dex/uniswap-v2/mdex.d.ts +0 -24
  234. package/build/dex/uniswap-v2/mdex.js +0 -50
  235. package/build/dex/uniswap-v2/mdex.js.map +0 -1
  236. package/build/dex/uniswap-v2/nomiswap-v2.d.ts +0 -24
  237. package/build/dex/uniswap-v2/nomiswap-v2.js +0 -57
  238. package/build/dex/uniswap-v2/nomiswap-v2.js.map +0 -1
  239. package/build/dex/uniswap-v3/scripts/bench-all-dexes.js +0 -160
  240. package/build/dex/uniswap-v3/scripts/bench-all-dexes.js.map +0 -1
  241. package/build/dex/uniswap-v3/uniswap-v3-new.d.ts +0 -94
  242. package/build/dex/uniswap-v3/uniswap-v3-new.js +0 -923
  243. package/build/dex/uniswap-v3/uniswap-v3-new.js.map +0 -1
  244. package/build/dex/uniswap-v4/contract-math/Position.d.ts +0 -3
  245. package/build/dex/uniswap-v4/contract-math/Position.js +0 -10
  246. package/build/dex/uniswap-v4/contract-math/Position.js.map +0 -1
  247. package/build/dex/usual-bond/config.d.ts +0 -3
  248. package/build/dex/usual-bond/config.js +0 -13
  249. package/build/dex/usual-bond/config.js.map +0 -1
  250. package/build/dex/usual-bond/types.d.ts +0 -7
  251. package/build/dex/usual-bond/types.js +0 -3
  252. package/build/dex/usual-bond/types.js.map +0 -1
  253. package/build/dex/usual-bond/usual-bond.d.ts +0 -35
  254. package/build/dex/usual-bond/usual-bond.js +0 -176
  255. package/build/dex/usual-bond/usual-bond.js.map +0 -1
  256. package/build/dex/wusdm/config.d.ts +0 -3
  257. package/build/dex/wusdm/config.js +0 -43
  258. package/build/dex/wusdm/config.js.map +0 -1
  259. package/build/dex/wusdm/constants.d.ts +0 -2
  260. package/build/dex/wusdm/constants.js +0 -6
  261. package/build/dex/wusdm/constants.js.map +0 -1
  262. package/build/dex/wusdm/types.d.ts +0 -18
  263. package/build/dex/wusdm/types.js +0 -11
  264. package/build/dex/wusdm/types.js.map +0 -1
  265. package/build/dex/wusdm/wusdm-pool.d.ts +0 -21
  266. package/build/dex/wusdm/wusdm-pool.js +0 -74
  267. package/build/dex/wusdm/wusdm-pool.js.map +0 -1
  268. package/build/dex/wusdm/wusdm.d.ts +0 -46
  269. package/build/dex/wusdm/wusdm.js +0 -243
  270. package/build/dex/wusdm/wusdm.js.map +0 -1
  271. package/build/dex/zerox/config.d.ts +0 -2
  272. package/build/dex/zerox/config.js +0 -33
  273. package/build/dex/zerox/config.js.map +0 -1
  274. package/build/dex/zerox/index.d.ts +0 -22
  275. package/build/dex/zerox/index.js +0 -225
  276. package/build/dex/zerox/index.js.map +0 -1
  277. package/build/dex/zerox/order.d.ts +0 -88
  278. package/build/dex/zerox/order.js +0 -53
  279. package/build/dex/zerox/order.js.map +0 -1
  280. package/build/dex/zerox/types.d.ts +0 -73
  281. package/build/dex/zerox/types.js +0 -21
  282. package/build/dex/zerox/types.js.map +0 -1
  283. package/native/Cargo.lock +0 -331
  284. package/native/Cargo.toml +0 -22
  285. package/native/build.rs +0 -5
  286. package/native/package-lock.json +0 -32
  287. package/native/package.json +0 -20
  288. package/native/src/config.rs +0 -73
  289. package/native/src/lib.rs +0 -528
  290. package/native/src/math/bit_math.rs +0 -177
  291. package/native/src/math/full_math.rs +0 -217
  292. package/native/src/math/liquidity_math.rs +0 -72
  293. package/native/src/math/mod.rs +0 -10
  294. package/native/src/math/oracle.rs +0 -493
  295. package/native/src/math/sqrt_price_math.rs +0 -272
  296. package/native/src/math/swap_math.rs +0 -306
  297. package/native/src/math/tick.rs +0 -239
  298. package/native/src/math/tick_bitmap.rs +0 -312
  299. package/native/src/math/tick_math.rs +0 -321
  300. package/native/src/math/unsafe_math.rs +0 -67
  301. package/native/src/pool_state.rs +0 -41
  302. package/native/src/query_outputs.rs +0 -379
  303. package/native/src/v4_query_outputs.rs +0 -255
  304. /package/build/dex/{uniswap-v3/scripts/bench-all-dexes.d.ts → fluid-dex/scripts/measure-calc-time.d.ts} +0 -0
  305. /package/build/dex/{infusion → pancakeswap-infinity}/types.js +0 -0
package/native/src/lib.rs DELETED
@@ -1,528 +0,0 @@
1
- pub mod config;
2
- pub mod math;
3
- pub mod pool_state;
4
- pub mod query_outputs;
5
- pub mod v4_query_outputs;
6
-
7
- use ethnum::{I256, U256};
8
- use napi::bindgen_prelude::*;
9
- use napi_derive::napi;
10
- use rayon::prelude::*;
11
- use std::collections::HashMap;
12
-
13
- /// Set the number of threads rayon uses for parallel queries.
14
- /// Call once at startup. Defaults to all available cores if not called.
15
- #[napi]
16
- pub fn set_thread_count(n: u32) {
17
- rayon::ThreadPoolBuilder::new()
18
- .num_threads(n as usize)
19
- .build_global()
20
- .ok();
21
- }
22
-
23
- use config::MathVariant;
24
- use math::oracle::OracleObservation;
25
- use math::tick::TickInfo;
26
- use pool_state::PoolState;
27
-
28
- // ---- NAPI type definitions for JS interop ----
29
-
30
- #[napi(object)]
31
- pub struct JsTickEntry {
32
- pub key: i32,
33
- pub liquidity_gross: BigInt,
34
- pub liquidity_net: BigInt,
35
- }
36
-
37
- #[napi(object)]
38
- pub struct JsBitmapEntry {
39
- pub key: i32,
40
- pub value: BigInt,
41
- }
42
-
43
- #[napi(object)]
44
- pub struct JsObservationEntry {
45
- pub key: i32,
46
- pub block_timestamp: BigInt,
47
- pub tick_cumulative: BigInt,
48
- pub seconds_per_liquidity_cumulative_x128: BigInt,
49
- pub initialized: bool,
50
- }
51
-
52
- #[napi(object)]
53
- pub struct JsPoolStateInit {
54
- pub variant: String,
55
- pub bitmap_range: i32,
56
- pub block_timestamp: BigInt,
57
- pub tick_spacing: BigInt,
58
- pub fee: BigInt,
59
- pub sqrt_price_x96: BigInt,
60
- pub tick: BigInt,
61
- pub observation_index: i32,
62
- pub observation_cardinality: i32,
63
- pub observation_cardinality_next: i32,
64
- pub fee_protocol: BigInt,
65
- pub liquidity: BigInt,
66
- pub max_liquidity_per_tick: BigInt,
67
- pub start_tick_bitmap: BigInt,
68
- pub lowest_known_tick: BigInt,
69
- pub highest_known_tick: BigInt,
70
- pub tick_bitmap: Vec<JsBitmapEntry>,
71
- pub ticks: Vec<JsTickEntry>,
72
- pub observations: Vec<JsObservationEntry>,
73
- }
74
-
75
- #[napi(object)]
76
- pub struct JsOutputResult {
77
- pub outputs: Vec<BigInt>,
78
- pub tick_counts: Vec<i32>,
79
- }
80
-
81
- // ---- Conversion helpers ----
82
- // napi::bindgen_prelude::BigInt stores { sign_bit: bool, words: Vec<u64> }
83
- // words are little-endian u64 limbs.
84
-
85
- fn bigint_to_u256(bi: &BigInt) -> U256 {
86
- let words = &bi.words;
87
- let low = words.first().copied().unwrap_or(0) as u128
88
- | (words.get(1).copied().unwrap_or(0) as u128) << 64;
89
- let high = words.get(2).copied().unwrap_or(0) as u128
90
- | (words.get(3).copied().unwrap_or(0) as u128) << 64;
91
- U256::from_words(high, low)
92
- }
93
-
94
- fn bigint_to_i256(bi: &BigInt) -> I256 {
95
- let u = bigint_to_u256(bi);
96
- let val = u.as_i256();
97
- if bi.sign_bit {
98
- -val
99
- } else {
100
- val
101
- }
102
- }
103
-
104
- fn u256_to_bigint(val: U256) -> BigInt {
105
- let (high, low) = val.into_words();
106
- let mut words = vec![
107
- low as u64,
108
- (low >> 64) as u64,
109
- high as u64,
110
- (high >> 64) as u64,
111
- ];
112
- // Trim trailing zeros for cleaner representation
113
- while words.len() > 1 && *words.last().unwrap() == 0 {
114
- words.pop();
115
- }
116
- BigInt {
117
- sign_bit: false,
118
- words,
119
- }
120
- }
121
-
122
- // ---- The main NAPI class ----
123
-
124
- #[napi]
125
- pub struct RustPoolHandle {
126
- state: PoolState,
127
- }
128
-
129
- #[napi]
130
- impl RustPoolHandle {
131
- /// Create a new Rust-owned pool state from JS data.
132
- #[napi(factory)]
133
- pub fn create(init: JsPoolStateInit) -> Result<Self> {
134
- let variant = MathVariant::from_str(&init.variant);
135
-
136
- let mut tick_bitmap = HashMap::with_capacity(init.tick_bitmap.len());
137
- for entry in &init.tick_bitmap {
138
- tick_bitmap.insert(entry.key as i16, bigint_to_u256(&entry.value));
139
- }
140
-
141
- let mut ticks = HashMap::with_capacity(init.ticks.len());
142
- for entry in &init.ticks {
143
- ticks.insert(
144
- entry.key,
145
- TickInfo {
146
- liquidity_gross: bigint_to_u256(&entry.liquidity_gross),
147
- liquidity_net: bigint_to_i256(&entry.liquidity_net),
148
- initialized: true,
149
- },
150
- );
151
- }
152
-
153
- let mut observations = HashMap::with_capacity(init.observations.len());
154
- for entry in &init.observations {
155
- observations.insert(
156
- entry.key as u16,
157
- OracleObservation {
158
- block_timestamp: bigint_to_u256(&entry.block_timestamp),
159
- tick_cumulative: bigint_to_i256(&entry.tick_cumulative),
160
- seconds_per_liquidity_cumulative_x128: bigint_to_u256(
161
- &entry.seconds_per_liquidity_cumulative_x128,
162
- ),
163
- initialized: entry.initialized,
164
- },
165
- );
166
- }
167
-
168
- let start_tick_bitmap = bigint_to_i256(&init.start_tick_bitmap);
169
-
170
- // bitmap_range is the total half-width (TICK_BITMAP_BUFFER + TICK_BITMAP_TO_USE)
171
- // passed from TS since it varies per DEX and per network.
172
- let start_i16 = start_tick_bitmap.as_i32() as i16;
173
- let range = init.bitmap_range as i16;
174
- let bitmap_range_lower = start_i16 - range;
175
- let bitmap_range_upper = start_i16 + range;
176
-
177
- Ok(Self {
178
- state: PoolState {
179
- block_timestamp: bigint_to_u256(&init.block_timestamp),
180
- tick_spacing: bigint_to_i256(&init.tick_spacing),
181
- fee: bigint_to_u256(&init.fee),
182
- sqrt_price_x96: bigint_to_u256(&init.sqrt_price_x96),
183
- tick: bigint_to_i256(&init.tick),
184
- observation_index: init.observation_index as u16,
185
- observation_cardinality: init.observation_cardinality as u16,
186
- observation_cardinality_next: init.observation_cardinality_next as u16,
187
- fee_protocol: bigint_to_u256(&init.fee_protocol),
188
- liquidity: bigint_to_u256(&init.liquidity),
189
- max_liquidity_per_tick: bigint_to_u256(&init.max_liquidity_per_tick),
190
- tick_bitmap,
191
- ticks,
192
- observations,
193
- start_tick_bitmap,
194
- lowest_known_tick: bigint_to_i256(&init.lowest_known_tick),
195
- highest_known_tick: bigint_to_i256(&init.highest_known_tick),
196
- bitmap_range_lower,
197
- bitmap_range_upper,
198
- variant,
199
- },
200
- })
201
- }
202
-
203
- /// HOT PATH: Price N amounts in one call (BigInt version).
204
- /// side: 0 = SELL, 1 = BUY
205
- #[napi]
206
- pub fn query_outputs(
207
- &self,
208
- amounts: Vec<BigInt>,
209
- zero_for_one: bool,
210
- side: u8,
211
- ) -> Result<JsOutputResult> {
212
- let amounts_u256: Vec<U256> = amounts.iter().map(|a| bigint_to_u256(a)).collect();
213
-
214
- let result = std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| {
215
- query_outputs::query_outputs(&self.state, &amounts_u256, zero_for_one, side)
216
- }));
217
-
218
- match result {
219
- Ok(output) => {
220
- let outputs: Vec<BigInt> =
221
- output.outputs.iter().map(|v| u256_to_bigint(*v)).collect();
222
-
223
- Ok(JsOutputResult {
224
- outputs,
225
- tick_counts: output.tick_counts,
226
- })
227
- }
228
- Err(panic_info) => {
229
- let msg = if let Some(s) = panic_info.downcast_ref::<&str>() {
230
- s.to_string()
231
- } else if let Some(s) = panic_info.downcast_ref::<String>() {
232
- s.clone()
233
- } else {
234
- "Unknown panic in query_outputs".to_string()
235
- };
236
- Err(Error::new(Status::GenericFailure, msg))
237
- }
238
- }
239
- }
240
-
241
- }
242
-
243
- // ---- Pool Registry: batch parallel queries ----
244
-
245
- fn build_pool_state(init: &JsPoolStateInit) -> Result<PoolState> {
246
- let variant = MathVariant::from_str(&init.variant);
247
-
248
- let mut tick_bitmap = HashMap::with_capacity(init.tick_bitmap.len());
249
- for entry in &init.tick_bitmap {
250
- tick_bitmap.insert(entry.key as i16, bigint_to_u256(&entry.value));
251
- }
252
-
253
- let mut ticks = HashMap::with_capacity(init.ticks.len());
254
- for entry in &init.ticks {
255
- ticks.insert(
256
- entry.key,
257
- TickInfo {
258
- liquidity_gross: bigint_to_u256(&entry.liquidity_gross),
259
- liquidity_net: bigint_to_i256(&entry.liquidity_net),
260
- initialized: true,
261
- },
262
- );
263
- }
264
-
265
- let mut observations = HashMap::with_capacity(init.observations.len());
266
- for entry in &init.observations {
267
- observations.insert(
268
- entry.key as u16,
269
- OracleObservation {
270
- block_timestamp: bigint_to_u256(&entry.block_timestamp),
271
- tick_cumulative: bigint_to_i256(&entry.tick_cumulative),
272
- seconds_per_liquidity_cumulative_x128: bigint_to_u256(
273
- &entry.seconds_per_liquidity_cumulative_x128,
274
- ),
275
- initialized: entry.initialized,
276
- },
277
- );
278
- }
279
-
280
- let start_tick_bitmap = bigint_to_i256(&init.start_tick_bitmap);
281
- let start_i16 = start_tick_bitmap.as_i32() as i16;
282
- let range = init.bitmap_range as i16;
283
-
284
- Ok(PoolState {
285
- block_timestamp: bigint_to_u256(&init.block_timestamp),
286
- tick_spacing: bigint_to_i256(&init.tick_spacing),
287
- fee: bigint_to_u256(&init.fee),
288
- sqrt_price_x96: bigint_to_u256(&init.sqrt_price_x96),
289
- tick: bigint_to_i256(&init.tick),
290
- observation_index: init.observation_index as u16,
291
- observation_cardinality: init.observation_cardinality as u16,
292
- observation_cardinality_next: init.observation_cardinality_next as u16,
293
- fee_protocol: bigint_to_u256(&init.fee_protocol),
294
- liquidity: bigint_to_u256(&init.liquidity),
295
- max_liquidity_per_tick: bigint_to_u256(&init.max_liquidity_per_tick),
296
- tick_bitmap,
297
- ticks,
298
- observations,
299
- start_tick_bitmap,
300
- lowest_known_tick: bigint_to_i256(&init.lowest_known_tick),
301
- highest_known_tick: bigint_to_i256(&init.highest_known_tick),
302
- bitmap_range_lower: start_i16 - range,
303
- bitmap_range_upper: start_i16 + range,
304
- variant,
305
- })
306
- }
307
-
308
- #[napi(object)]
309
- pub struct JsPoolQueryResult {
310
- pub key: String,
311
- pub outputs: Vec<BigInt>,
312
- pub tick_counts: Vec<i32>,
313
- }
314
-
315
- #[napi]
316
- pub struct RustPoolRegistry {
317
- pools: HashMap<String, PoolState>,
318
- }
319
-
320
- #[napi]
321
- impl RustPoolRegistry {
322
- #[napi(constructor)]
323
- pub fn new() -> Self {
324
- Self {
325
- pools: HashMap::new(),
326
- }
327
- }
328
-
329
- /// Register or update a pool.
330
- #[napi]
331
- pub fn set_pool(&mut self, key: String, init: JsPoolStateInit) -> Result<()> {
332
- let state = build_pool_state(&init)?;
333
- self.pools.insert(key, state);
334
- Ok(())
335
- }
336
-
337
- /// Remove a pool.
338
- #[napi]
339
- pub fn remove_pool(&mut self, key: String) {
340
- self.pools.remove(&key);
341
- }
342
-
343
- /// Query multiple pools in parallel. Returns results for all registered pools
344
- /// whose keys are in the provided list.
345
- /// Each pool is queried with the SAME amounts and direction.
346
- #[napi]
347
- pub fn query_many(
348
- &self,
349
- keys: Vec<String>,
350
- amounts: Vec<BigInt>,
351
- zero_for_one: bool,
352
- side: u8,
353
- ) -> Result<Vec<JsPoolQueryResult>> {
354
- let amounts_u256: Vec<U256> = amounts.iter().map(|a| bigint_to_u256(a)).collect();
355
-
356
- // Collect references to pools that exist
357
- let pool_refs: Vec<(&str, &PoolState)> = keys
358
- .iter()
359
- .filter_map(|k| self.pools.get(k).map(|p| (k.as_str(), p)))
360
- .collect();
361
-
362
- // Run all pool queries in parallel using rayon
363
- let results: Vec<Result<JsPoolQueryResult>> = pool_refs
364
- .par_iter()
365
- .map(|(key, pool)| {
366
- let result = std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| {
367
- query_outputs::query_outputs(pool, &amounts_u256, zero_for_one, side)
368
- }));
369
-
370
- match result {
371
- Ok(output) => {
372
- let outputs: Vec<BigInt> =
373
- output.outputs.iter().map(|v| u256_to_bigint(*v)).collect();
374
- Ok(JsPoolQueryResult {
375
- key: key.to_string(),
376
- outputs,
377
- tick_counts: output.tick_counts,
378
- })
379
- }
380
- Err(_) => Ok(JsPoolQueryResult {
381
- key: key.to_string(),
382
- outputs: vec![],
383
- tick_counts: vec![],
384
- }),
385
- }
386
- })
387
- .collect();
388
-
389
- results.into_iter().collect()
390
- }
391
-
392
- #[napi]
393
- pub fn pool_count(&self) -> u32 {
394
- self.pools.len() as u32
395
- }
396
- }
397
-
398
- // ---- V4 Pool Registry ----
399
-
400
- #[napi(object)]
401
- pub struct JsV4PoolStateInit {
402
- pub sqrt_price_x96: BigInt,
403
- pub tick: BigInt,
404
- pub protocol_fee: BigInt,
405
- pub lp_fee: BigInt,
406
- pub liquidity: BigInt,
407
- pub tick_spacing: BigInt,
408
- pub fee_growth_global0_x128: BigInt,
409
- pub fee_growth_global1_x128: BigInt,
410
- pub bitmap_range: i32,
411
- pub start_tick_bitmap: BigInt,
412
- pub tick_bitmap: Vec<JsBitmapEntry>,
413
- pub ticks: Vec<JsTickEntry>,
414
- }
415
-
416
- #[napi(object)]
417
- pub struct JsV4QueryResult {
418
- pub key: String,
419
- pub outputs: Vec<BigInt>,
420
- }
421
-
422
- fn build_v4_pool_state(init: &JsV4PoolStateInit) -> v4_query_outputs::V4PoolState {
423
- let mut tick_bitmap = HashMap::with_capacity(init.tick_bitmap.len());
424
- for entry in &init.tick_bitmap {
425
- tick_bitmap.insert(entry.key as i16, bigint_to_u256(&entry.value));
426
- }
427
-
428
- let mut ticks = HashMap::with_capacity(init.ticks.len());
429
- for entry in &init.ticks {
430
- ticks.insert(
431
- entry.key,
432
- TickInfo {
433
- liquidity_gross: bigint_to_u256(&entry.liquidity_gross),
434
- liquidity_net: bigint_to_i256(&entry.liquidity_net),
435
- initialized: true,
436
- },
437
- );
438
- }
439
-
440
- v4_query_outputs::V4PoolState {
441
- sqrt_price_x96: bigint_to_u256(&init.sqrt_price_x96),
442
- tick: bigint_to_i256(&init.tick),
443
- protocol_fee: bigint_to_u256(&init.protocol_fee),
444
- lp_fee: bigint_to_u256(&init.lp_fee),
445
- liquidity: bigint_to_u256(&init.liquidity),
446
- tick_spacing: bigint_to_i256(&init.tick_spacing),
447
- fee_growth_global0_x128: bigint_to_u256(&init.fee_growth_global0_x128),
448
- fee_growth_global1_x128: bigint_to_u256(&init.fee_growth_global1_x128),
449
- tick_bitmap,
450
- ticks,
451
- }
452
- }
453
-
454
- #[napi]
455
- pub struct RustV4PoolRegistry {
456
- pools: HashMap<String, (v4_query_outputs::V4PoolState, I256)>, // state + tickSpacing
457
- }
458
-
459
- #[napi]
460
- impl RustV4PoolRegistry {
461
- #[napi(constructor)]
462
- pub fn new() -> Self {
463
- Self {
464
- pools: HashMap::new(),
465
- }
466
- }
467
-
468
- #[napi]
469
- pub fn set_pool(&mut self, key: String, init: JsV4PoolStateInit) {
470
- let tick_spacing = bigint_to_i256(&init.tick_spacing);
471
- let state = build_v4_pool_state(&init);
472
- self.pools.insert(key, (state, tick_spacing));
473
- }
474
-
475
- #[napi]
476
- pub fn remove_pool(&mut self, key: String) {
477
- self.pools.remove(&key);
478
- }
479
-
480
- #[napi]
481
- pub fn query_many(
482
- &self,
483
- keys: Vec<String>,
484
- amounts: Vec<BigInt>,
485
- zero_for_one: bool,
486
- side: u8,
487
- ) -> Vec<JsV4QueryResult> {
488
- let amounts_u256: Vec<U256> = amounts.iter().map(|a| bigint_to_u256(a)).collect();
489
-
490
- let pool_refs: Vec<(&str, &v4_query_outputs::V4PoolState, I256)> = keys
491
- .iter()
492
- .filter_map(|k| {
493
- self.pools
494
- .get(k)
495
- .map(|(p, ts)| (k.as_str(), p, *ts))
496
- })
497
- .collect();
498
-
499
- pool_refs
500
- .par_iter()
501
- .map(|(key, pool, tick_spacing)| {
502
- let result = std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| {
503
- v4_query_outputs::query_outputs(pool, *tick_spacing, &amounts_u256, zero_for_one, side)
504
- }));
505
-
506
- match result {
507
- Ok(outputs) => {
508
- let bigint_outputs: Vec<BigInt> =
509
- outputs.iter().map(|v| u256_to_bigint(*v)).collect();
510
- JsV4QueryResult {
511
- key: key.to_string(),
512
- outputs: bigint_outputs,
513
- }
514
- }
515
- Err(_) => JsV4QueryResult {
516
- key: key.to_string(),
517
- outputs: vec![],
518
- },
519
- }
520
- })
521
- .collect()
522
- }
523
-
524
- #[napi]
525
- pub fn pool_count(&self) -> u32 {
526
- self.pools.len() as u32
527
- }
528
- }
@@ -1,177 +0,0 @@
1
- use ethnum::U256;
2
-
3
- /// Returns the index of the most significant bit of the number,
4
- /// where the least significant bit is at index 0 and the most significant bit is at index 255.
5
- ///
6
- /// Panics if x is zero.
7
- pub fn most_significant_bit(x: U256) -> u8 {
8
- assert!(x > U256::ZERO, "x must be > 0");
9
- let mut x = x;
10
- let mut r: u8 = 0;
11
-
12
- if x >= U256::from_words(1, 0) {
13
- x >>= 128;
14
- r += 128;
15
- }
16
- if x >= U256::from(0x10000000000000000u128) {
17
- x >>= 64;
18
- r += 64;
19
- }
20
- if x >= U256::from(0x100000000u128) {
21
- x >>= 32;
22
- r += 32;
23
- }
24
- if x >= U256::from(0x10000u64) {
25
- x >>= 16;
26
- r += 16;
27
- }
28
- if x >= U256::from(0x100u64) {
29
- x >>= 8;
30
- r += 8;
31
- }
32
- if x >= U256::from(0x10u64) {
33
- x >>= 4;
34
- r += 4;
35
- }
36
- if x >= U256::from(0x4u64) {
37
- x >>= 2;
38
- r += 2;
39
- }
40
- if x >= U256::from(0x2u64) {
41
- r += 1;
42
- }
43
-
44
- r
45
- }
46
-
47
- /// Returns the index of the least significant bit of the number,
48
- /// where the least significant bit is at index 0 and the most significant bit is at index 255.
49
- ///
50
- /// Panics if x is zero.
51
- pub fn least_significant_bit(x: U256) -> u8 {
52
- assert!(x > U256::ZERO, "x must be > 0");
53
- let mut x = x;
54
- let mut r: u8 = 255;
55
-
56
- let max_uint128: U256 = U256::new(u128::MAX);
57
- let max_uint64: U256 = U256::from(u64::MAX);
58
- let max_uint32: U256 = U256::from(u32::MAX as u64);
59
- let max_uint16: U256 = U256::from(u16::MAX as u64);
60
- let max_uint8: U256 = U256::from(u8::MAX as u64);
61
-
62
- if (x & max_uint128) > U256::ZERO {
63
- r -= 128;
64
- } else {
65
- x >>= 128;
66
- }
67
- if (x & max_uint64) > U256::ZERO {
68
- r -= 64;
69
- } else {
70
- x >>= 64;
71
- }
72
- if (x & max_uint32) > U256::ZERO {
73
- r -= 32;
74
- } else {
75
- x >>= 32;
76
- }
77
- if (x & max_uint16) > U256::ZERO {
78
- r -= 16;
79
- } else {
80
- x >>= 16;
81
- }
82
- if (x & max_uint8) > U256::ZERO {
83
- r -= 8;
84
- } else {
85
- x >>= 8;
86
- }
87
- if (x & U256::from(0xFu64)) > U256::ZERO {
88
- r -= 4;
89
- } else {
90
- x >>= 4;
91
- }
92
- if (x & U256::from(0x3u64)) > U256::ZERO {
93
- r -= 2;
94
- } else {
95
- x >>= 2;
96
- }
97
- if (x & U256::ONE) > U256::ZERO {
98
- r -= 1;
99
- }
100
-
101
- r
102
- }
103
-
104
- #[cfg(test)]
105
- mod tests {
106
- use super::*;
107
-
108
- #[test]
109
- fn test_msb_one() {
110
- assert_eq!(most_significant_bit(U256::ONE), 0);
111
- }
112
-
113
- #[test]
114
- fn test_msb_two() {
115
- assert_eq!(most_significant_bit(U256::from(2u64)), 1);
116
- }
117
-
118
- #[test]
119
- fn test_msb_powers_of_two() {
120
- for i in 0..=255u8 {
121
- let x = U256::ONE << i;
122
- assert_eq!(most_significant_bit(x), i);
123
- }
124
- }
125
-
126
- #[test]
127
- fn test_msb_max() {
128
- assert_eq!(most_significant_bit(U256::MAX), 255);
129
- }
130
-
131
- #[test]
132
- #[should_panic]
133
- fn test_msb_zero_panics() {
134
- most_significant_bit(U256::ZERO);
135
- }
136
-
137
- #[test]
138
- fn test_lsb_one() {
139
- assert_eq!(least_significant_bit(U256::ONE), 0);
140
- }
141
-
142
- #[test]
143
- fn test_lsb_two() {
144
- assert_eq!(least_significant_bit(U256::from(2u64)), 1);
145
- }
146
-
147
- #[test]
148
- fn test_lsb_powers_of_two() {
149
- for i in 0..=255u8 {
150
- let x = U256::ONE << i;
151
- assert_eq!(least_significant_bit(x), i);
152
- }
153
- }
154
-
155
- #[test]
156
- fn test_lsb_max() {
157
- assert_eq!(least_significant_bit(U256::MAX), 0);
158
- }
159
-
160
- #[test]
161
- #[should_panic]
162
- fn test_lsb_zero_panics() {
163
- least_significant_bit(U256::ZERO);
164
- }
165
-
166
- #[test]
167
- fn test_msb_mixed() {
168
- assert_eq!(most_significant_bit(U256::from(10u64)), 3);
169
- assert_eq!(most_significant_bit(U256::from(24u64)), 4);
170
- }
171
-
172
- #[test]
173
- fn test_lsb_mixed() {
174
- assert_eq!(least_significant_bit(U256::from(10u64)), 1);
175
- assert_eq!(least_significant_bit(U256::from(24u64)), 3);
176
- }
177
- }