@paraswap/dex-lib 4.8.26 → 4.8.28-uni-v3-rust.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 (299) hide show
  1. package/build/dex/balancer-v2/balancer-v2.d.ts +0 -1
  2. package/build/dex/balancer-v2/balancer-v2.js +0 -4
  3. package/build/dex/balancer-v2/balancer-v2.js.map +1 -1
  4. package/build/dex/bebop/bebop.d.ts +0 -1
  5. package/build/dex/bebop/bebop.js +0 -8
  6. package/build/dex/bebop/bebop.js.map +1 -1
  7. package/build/dex/cables/cables.d.ts +0 -1
  8. package/build/dex/cables/cables.js +0 -3
  9. package/build/dex/cables/cables.js.map +1 -1
  10. package/build/dex/curve-v1/curve-v1.d.ts +0 -1
  11. package/build/dex/curve-v1/curve-v1.js +0 -4
  12. package/build/dex/curve-v1/curve-v1.js.map +1 -1
  13. package/build/dex/curve-v1-factory/curve-v1-factory.d.ts +0 -1
  14. package/build/dex/curve-v1-factory/curve-v1-factory.js +0 -4
  15. package/build/dex/curve-v1-factory/curve-v1-factory.js.map +1 -1
  16. package/build/dex/curve-v2/curve-v2.d.ts +0 -1
  17. package/build/dex/curve-v2/curve-v2.js +0 -4
  18. package/build/dex/curve-v2/curve-v2.js.map +1 -1
  19. package/build/dex/hashflow/hashflow.d.ts +0 -1
  20. package/build/dex/hashflow/hashflow.js +0 -5
  21. package/build/dex/hashflow/hashflow.js.map +1 -1
  22. package/build/dex/idex.d.ts +1 -2
  23. package/build/dex/lite-psm/lite-psm.d.ts +0 -1
  24. package/build/dex/lite-psm/lite-psm.js +0 -3
  25. package/build/dex/lite-psm/lite-psm.js.map +1 -1
  26. package/build/dex/native/native.d.ts +0 -1
  27. package/build/dex/native/native.js +0 -6
  28. package/build/dex/native/native.js.map +1 -1
  29. package/build/dex/paraswap-limit-orders/paraswap-limit-orders.d.ts +0 -1
  30. package/build/dex/paraswap-limit-orders/paraswap-limit-orders.js +0 -5
  31. package/build/dex/paraswap-limit-orders/paraswap-limit-orders.js.map +1 -1
  32. package/build/dex/solidly-v3/solidly-v3.d.ts +0 -1
  33. package/build/dex/solidly-v3/solidly-v3.js +0 -4
  34. package/build/dex/solidly-v3/solidly-v3.js.map +1 -1
  35. package/build/dex/uniswap-v3/contract-math/native-bridge.d.ts +15 -0
  36. package/build/dex/uniswap-v3/contract-math/native-bridge.js +71 -0
  37. package/build/dex/uniswap-v3/contract-math/native-bridge.js.map +1 -0
  38. package/build/dex/uniswap-v3/scripts/measure-calc-time.js +222 -110
  39. package/build/dex/uniswap-v3/scripts/measure-calc-time.js.map +1 -1
  40. package/build/dex/uniswap-v3/uniswap-v3-pool.d.ts +3 -0
  41. package/build/dex/uniswap-v3/uniswap-v3-pool.js +6 -0
  42. package/build/dex/uniswap-v3/uniswap-v3-pool.js.map +1 -1
  43. package/build/dex/uniswap-v3/uniswap-v3.d.ts +8 -4
  44. package/build/dex/uniswap-v3/uniswap-v3.js +8 -9
  45. package/build/dex/uniswap-v3/uniswap-v3.js.map +1 -1
  46. package/build/dex/uniswap-v4/api-go/compare-pricing.d.ts +1 -0
  47. package/build/dex/uniswap-v4/api-go/compare-pricing.js +187 -0
  48. package/build/dex/uniswap-v4/api-go/compare-pricing.js.map +1 -0
  49. package/build/dex/uniswap-v4/api-go/compare-states.d.ts +1 -0
  50. package/build/dex/uniswap-v4/api-go/compare-states.js +149 -0
  51. package/build/dex/uniswap-v4/api-go/compare-states.js.map +1 -0
  52. package/build/dex/uniswap-v4/api-go/fetch-pool-key.d.ts +0 -0
  53. package/build/dex/uniswap-v4/api-go/fetch-pool-key.js +140 -0
  54. package/build/dex/uniswap-v4/api-go/fetch-pool-key.js.map +1 -0
  55. package/build/implementations/local-paraswap-sdk.js +9 -4
  56. package/build/implementations/local-paraswap-sdk.js.map +1 -1
  57. package/build/pricing-helper.d.ts +1 -1
  58. package/build/pricing-helper.js +2 -2
  59. package/build/pricing-helper.js.map +1 -1
  60. package/build/tenderly-simulation.d.ts +221 -0
  61. package/build/tenderly-simulation.js +517 -0
  62. package/build/tenderly-simulation.js.map +1 -0
  63. package/native/Cargo.lock +279 -0
  64. package/native/Cargo.toml +21 -0
  65. package/native/build.rs +5 -0
  66. package/native/package-lock.json +32 -0
  67. package/native/package.json +20 -0
  68. package/native/src/config.rs +40 -0
  69. package/native/src/lib.rs +216 -0
  70. package/native/src/math/bit_math.rs +177 -0
  71. package/native/src/math/full_math.rs +217 -0
  72. package/native/src/math/liquidity_math.rs +72 -0
  73. package/native/src/math/mod.rs +10 -0
  74. package/native/src/math/oracle.rs +493 -0
  75. package/native/src/math/sqrt_price_math.rs +272 -0
  76. package/native/src/math/swap_math.rs +306 -0
  77. package/native/src/math/tick.rs +239 -0
  78. package/native/src/math/tick_bitmap.rs +292 -0
  79. package/native/src/math/tick_math.rs +321 -0
  80. package/native/src/math/unsafe_math.rs +67 -0
  81. package/native/src/pool_state.rs +36 -0
  82. package/native/src/query_outputs.rs +379 -0
  83. package/package.json +2 -1
  84. package/build/abi/BProtocol.json +0 -1155
  85. package/build/abi/Jarvis.json +0 -1172
  86. package/build/abi/MStableAsset.json +0 -1545
  87. package/build/abi/OneInchLp.json +0 -1304
  88. package/build/abi/Onebit.json +0 -736
  89. package/build/abi/Shell.json +0 -1294
  90. package/build/abi/TraderJoeV2Router.json +0 -50
  91. package/build/abi/idle-dao/idle-cdo-factory.json +0 -38
  92. package/build/abi/idle-dao/idle-cdo.json +0 -1245
  93. package/build/abi/infusion/InfusionFactory.json +0 -147
  94. package/build/abi/infusion/InfusionPair.json +0 -658
  95. package/build/abi/infusion/InfusionRouter.json +0 -442
  96. package/build/abi/maker-psm/pot.json +0 -322
  97. package/build/abi/maker-psm/psm.json +0 -243
  98. package/build/abi/maker-psm/vat.json +0 -363
  99. package/build/abi/nomiswap-v2/nomiswap-v2-pool.json +0 -773
  100. package/build/abi/quick-perps/fast-price-events.json +0 -70
  101. package/build/abi/quick-perps/fast-price-feed.json +0 -741
  102. package/build/abi/quick-perps/reader.json +0 -313
  103. package/build/abi/quick-perps/vault-price-feed.json +0 -323
  104. package/build/abi/quick-perps/vault.json +0 -1953
  105. package/build/abi/uniswap-v2/excalibur-pool.json +0 -881
  106. package/build/abi/uniswap-v2/mdex-factory.json +0 -759
  107. package/build/abi/wUSDM.json +0 -757
  108. package/build/abi/zrx.v2.json +0 -1967
  109. package/build/abi/zrx.v3.json +0 -3454
  110. package/build/abi/zrx.v4.json +0 -2193
  111. package/build/dex/OneInchLp.d.ts +0 -24
  112. package/build/dex/OneInchLp.js +0 -43
  113. package/build/dex/OneInchLp.js.map +0 -1
  114. package/build/dex/bProtocol/bProtocol.d.ts +0 -15
  115. package/build/dex/bProtocol/bProtocol.js +0 -56
  116. package/build/dex/bProtocol/bProtocol.js.map +0 -1
  117. package/build/dex/bProtocol/types.d.ts +0 -11
  118. package/build/dex/bProtocol/types.js +0 -8
  119. package/build/dex/bProtocol/types.js.map +0 -1
  120. package/build/dex/ekubo/pools/base-pool.d.ts +0 -47
  121. package/build/dex/ekubo/pools/base-pool.js +0 -184
  122. package/build/dex/ekubo/pools/base-pool.js.map +0 -1
  123. package/build/dex/ekubo/pools/iface.d.ts +0 -46
  124. package/build/dex/ekubo/pools/iface.js +0 -75
  125. package/build/dex/ekubo/pools/iface.js.map +0 -1
  126. package/build/dex/ekubo/pools/math/price.d.ts +0 -7
  127. package/build/dex/ekubo/pools/math/price.js +0 -112
  128. package/build/dex/ekubo/pools/math/price.js.map +0 -1
  129. package/build/dex/ekubo/pools/oracle-pool.d.ts +0 -10
  130. package/build/dex/ekubo/pools/oracle-pool.js +0 -19
  131. package/build/dex/ekubo/pools/oracle-pool.js.map +0 -1
  132. package/build/dex/ekubo/pools/pool-utils.d.ts +0 -44
  133. package/build/dex/ekubo/pools/pool-utils.js +0 -240
  134. package/build/dex/ekubo/pools/pool-utils.js.map +0 -1
  135. package/build/dex/idle-dao/config.d.ts +0 -5
  136. package/build/dex/idle-dao/config.js +0 -24
  137. package/build/dex/idle-dao/config.js.map +0 -1
  138. package/build/dex/idle-dao/idle-dao.d.ts +0 -42
  139. package/build/dex/idle-dao/idle-dao.js +0 -279
  140. package/build/dex/idle-dao/idle-dao.js.map +0 -1
  141. package/build/dex/idle-dao/token_list.d.ts +0 -4
  142. package/build/dex/idle-dao/token_list.js +0 -289
  143. package/build/dex/idle-dao/token_list.js.map +0 -1
  144. package/build/dex/idle-dao/tokens.d.ts +0 -9
  145. package/build/dex/idle-dao/tokens.js +0 -68
  146. package/build/dex/idle-dao/tokens.js.map +0 -1
  147. package/build/dex/idle-dao/types.d.ts +0 -35
  148. package/build/dex/idle-dao/types.js +0 -11
  149. package/build/dex/idle-dao/types.js.map +0 -1
  150. package/build/dex/idle-dao/utils.d.ts +0 -8
  151. package/build/dex/idle-dao/utils.js +0 -149
  152. package/build/dex/idle-dao/utils.js.map +0 -1
  153. package/build/dex/infusion/config.d.ts +0 -3
  154. package/build/dex/infusion/config.js +0 -20
  155. package/build/dex/infusion/config.js.map +0 -1
  156. package/build/dex/infusion/infusion-stable-pool.d.ts +0 -4
  157. package/build/dex/infusion/infusion-stable-pool.js +0 -74
  158. package/build/dex/infusion/infusion-stable-pool.js.map +0 -1
  159. package/build/dex/infusion/infusion.d.ts +0 -51
  160. package/build/dex/infusion/infusion.js +0 -500
  161. package/build/dex/infusion/infusion.js.map +0 -1
  162. package/build/dex/infusion/types.d.ts +0 -45
  163. package/build/dex/infusion/types.js +0 -3
  164. package/build/dex/infusion/types.js.map +0 -1
  165. package/build/dex/infusion/utils/isStablePair.d.ts +0 -2
  166. package/build/dex/infusion/utils/isStablePair.js +0 -18
  167. package/build/dex/infusion/utils/isStablePair.js.map +0 -1
  168. package/build/dex/jarvis.d.ts +0 -56
  169. package/build/dex/jarvis.js +0 -163
  170. package/build/dex/jarvis.js.map +0 -1
  171. package/build/dex/mStable.d.ts +0 -44
  172. package/build/dex/mStable.js +0 -75
  173. package/build/dex/mStable.js.map +0 -1
  174. package/build/dex/maker-psm/config.d.ts +0 -11
  175. package/build/dex/maker-psm/config.js +0 -53
  176. package/build/dex/maker-psm/config.js.map +0 -1
  177. package/build/dex/maker-psm/maker-psm.d.ts +0 -103
  178. package/build/dex/maker-psm/maker-psm.js +0 -493
  179. package/build/dex/maker-psm/maker-psm.js.map +0 -1
  180. package/build/dex/maker-psm/types.d.ts +0 -39
  181. package/build/dex/maker-psm/types.js +0 -3
  182. package/build/dex/maker-psm/types.js.map +0 -1
  183. package/build/dex/onebit/onebit.d.ts +0 -16
  184. package/build/dex/onebit/onebit.js +0 -61
  185. package/build/dex/onebit/onebit.js.map +0 -1
  186. package/build/dex/onebit/types.d.ts +0 -14
  187. package/build/dex/onebit/types.js +0 -8
  188. package/build/dex/onebit/types.js.map +0 -1
  189. package/build/dex/quick-perps/config.d.ts +0 -11
  190. package/build/dex/quick-perps/config.js +0 -27
  191. package/build/dex/quick-perps/config.js.map +0 -1
  192. package/build/dex/quick-perps/fast-price-feed.d.ts +0 -26
  193. package/build/dex/quick-perps/fast-price-feed.js +0 -184
  194. package/build/dex/quick-perps/fast-price-feed.js.map +0 -1
  195. package/build/dex/quick-perps/pool.d.ts +0 -21
  196. package/build/dex/quick-perps/pool.js +0 -229
  197. package/build/dex/quick-perps/pool.js.map +0 -1
  198. package/build/dex/quick-perps/quick-perps.d.ts +0 -53
  199. package/build/dex/quick-perps/quick-perps.js +0 -247
  200. package/build/dex/quick-perps/quick-perps.js.map +0 -1
  201. package/build/dex/quick-perps/types.d.ts +0 -98
  202. package/build/dex/quick-perps/types.js +0 -3
  203. package/build/dex/quick-perps/types.js.map +0 -1
  204. package/build/dex/quick-perps/usdq.d.ts +0 -15
  205. package/build/dex/quick-perps/usdq.js +0 -62
  206. package/build/dex/quick-perps/usdq.js.map +0 -1
  207. package/build/dex/quick-perps/vault-price-feed.d.ts +0 -43
  208. package/build/dex/quick-perps/vault-price-feed.js +0 -203
  209. package/build/dex/quick-perps/vault-price-feed.js.map +0 -1
  210. package/build/dex/quick-perps/vault-utils.d.ts +0 -8
  211. package/build/dex/quick-perps/vault-utils.js +0 -42
  212. package/build/dex/quick-perps/vault-utils.js.map +0 -1
  213. package/build/dex/quick-perps/vault.d.ts +0 -46
  214. package/build/dex/quick-perps/vault.js +0 -182
  215. package/build/dex/quick-perps/vault.js.map +0 -1
  216. package/build/dex/se-vlr/config.d.ts +0 -3
  217. package/build/dex/se-vlr/config.js +0 -24
  218. package/build/dex/se-vlr/config.js.map +0 -1
  219. package/build/dex/se-vlr/se-vlr-pool.d.ts +0 -39
  220. package/build/dex/se-vlr/se-vlr-pool.js +0 -70
  221. package/build/dex/se-vlr/se-vlr-pool.js.map +0 -1
  222. package/build/dex/se-vlr/se-vlr.d.ts +0 -35
  223. package/build/dex/se-vlr/se-vlr.js +0 -131
  224. package/build/dex/se-vlr/se-vlr.js.map +0 -1
  225. package/build/dex/se-vlr/types.d.ts +0 -6
  226. package/build/dex/se-vlr/types.js +0 -3
  227. package/build/dex/se-vlr/types.js.map +0 -1
  228. package/build/dex/shell.d.ts +0 -25
  229. package/build/dex/shell.js +0 -41
  230. package/build/dex/shell.js.map +0 -1
  231. package/build/dex/solidly/forks-override/aerodrome.d.ts +0 -14
  232. package/build/dex/solidly/forks-override/aerodrome.js +0 -46
  233. package/build/dex/solidly/forks-override/aerodrome.js.map +0 -1
  234. package/build/dex/solidly/forks-override/chronos.d.ts +0 -23
  235. package/build/dex/solidly/forks-override/chronos.js +0 -141
  236. package/build/dex/solidly/forks-override/chronos.js.map +0 -1
  237. package/build/dex/solidly/forks-override/usdfi.d.ts +0 -8
  238. package/build/dex/solidly/forks-override/usdfi.js +0 -15
  239. package/build/dex/solidly/forks-override/usdfi.js.map +0 -1
  240. package/build/dex/solidly/forks-override/velocimeter.d.ts +0 -23
  241. package/build/dex/solidly/forks-override/velocimeter.js +0 -77
  242. package/build/dex/solidly/forks-override/velocimeter.js.map +0 -1
  243. package/build/dex/trader-joe-v2.d.ts +0 -40
  244. package/build/dex/trader-joe-v2.js +0 -74
  245. package/build/dex/trader-joe-v2.js.map +0 -1
  246. package/build/dex/uniswap-v2/dfyn.d.ts +0 -19
  247. package/build/dex/uniswap-v2/dfyn.js +0 -61
  248. package/build/dex/uniswap-v2/dfyn.js.map +0 -1
  249. package/build/dex/uniswap-v2/excalibur.d.ts +0 -24
  250. package/build/dex/uniswap-v2/excalibur.js +0 -47
  251. package/build/dex/uniswap-v2/excalibur.js.map +0 -1
  252. package/build/dex/uniswap-v2/mdex.d.ts +0 -24
  253. package/build/dex/uniswap-v2/mdex.js +0 -50
  254. package/build/dex/uniswap-v2/mdex.js.map +0 -1
  255. package/build/dex/uniswap-v2/nomiswap-v2.d.ts +0 -24
  256. package/build/dex/uniswap-v2/nomiswap-v2.js +0 -57
  257. package/build/dex/uniswap-v2/nomiswap-v2.js.map +0 -1
  258. package/build/dex/uniswap-v3/uniswap-v3-new.d.ts +0 -94
  259. package/build/dex/uniswap-v3/uniswap-v3-new.js +0 -923
  260. package/build/dex/uniswap-v3/uniswap-v3-new.js.map +0 -1
  261. package/build/dex/uniswap-v4/contract-math/Position.d.ts +0 -3
  262. package/build/dex/uniswap-v4/contract-math/Position.js +0 -10
  263. package/build/dex/uniswap-v4/contract-math/Position.js.map +0 -1
  264. package/build/dex/usual-bond/config.d.ts +0 -3
  265. package/build/dex/usual-bond/config.js +0 -13
  266. package/build/dex/usual-bond/config.js.map +0 -1
  267. package/build/dex/usual-bond/types.d.ts +0 -7
  268. package/build/dex/usual-bond/types.js +0 -3
  269. package/build/dex/usual-bond/types.js.map +0 -1
  270. package/build/dex/usual-bond/usual-bond.d.ts +0 -35
  271. package/build/dex/usual-bond/usual-bond.js +0 -176
  272. package/build/dex/usual-bond/usual-bond.js.map +0 -1
  273. package/build/dex/wusdm/config.d.ts +0 -3
  274. package/build/dex/wusdm/config.js +0 -43
  275. package/build/dex/wusdm/config.js.map +0 -1
  276. package/build/dex/wusdm/constants.d.ts +0 -2
  277. package/build/dex/wusdm/constants.js +0 -6
  278. package/build/dex/wusdm/constants.js.map +0 -1
  279. package/build/dex/wusdm/types.d.ts +0 -18
  280. package/build/dex/wusdm/types.js +0 -11
  281. package/build/dex/wusdm/types.js.map +0 -1
  282. package/build/dex/wusdm/wusdm-pool.d.ts +0 -21
  283. package/build/dex/wusdm/wusdm-pool.js +0 -74
  284. package/build/dex/wusdm/wusdm-pool.js.map +0 -1
  285. package/build/dex/wusdm/wusdm.d.ts +0 -46
  286. package/build/dex/wusdm/wusdm.js +0 -243
  287. package/build/dex/wusdm/wusdm.js.map +0 -1
  288. package/build/dex/zerox/config.d.ts +0 -2
  289. package/build/dex/zerox/config.js +0 -33
  290. package/build/dex/zerox/config.js.map +0 -1
  291. package/build/dex/zerox/index.d.ts +0 -22
  292. package/build/dex/zerox/index.js +0 -225
  293. package/build/dex/zerox/index.js.map +0 -1
  294. package/build/dex/zerox/order.d.ts +0 -88
  295. package/build/dex/zerox/order.js +0 -53
  296. package/build/dex/zerox/order.js.map +0 -1
  297. package/build/dex/zerox/types.d.ts +0 -73
  298. package/build/dex/zerox/types.js +0 -21
  299. package/build/dex/zerox/types.js.map +0 -1
@@ -0,0 +1,321 @@
1
+ use ethnum::{I256, U256};
2
+
3
+ pub const MIN_TICK: I256 = I256::new(-887272);
4
+ pub const MAX_TICK: I256 = I256::new(887272);
5
+ pub const MIN_SQRT_RATIO: U256 = U256::new(4295128739u128);
6
+ // 1461446703485210103287273052203988822378723970342
7
+ // = 0xFFFD8963EFD1FC6A506488495D951D5263988D26
8
+ // hi_128 = 0xFFFD8963, lo_128 = 0xEFD1FC6A506488495D951D5263988D26
9
+ pub const MAX_SQRT_RATIO: U256 =
10
+ U256::from_words(0xFFFD8963, 0xEFD1FC6A506488495D951D5263988D26);
11
+
12
+ // 2^160 - 1 = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
13
+ // hi_128 = 0xFFFFFFFF, lo_128 = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
14
+ const MASK_160: U256 = U256::from_words(0xFFFFFFFF, u128::MAX);
15
+
16
+ /// Truncate to uint160 range.
17
+ fn as_uint160(val: U256) -> U256 {
18
+ val & MASK_160
19
+ }
20
+
21
+ /// Calculates sqrt(1.0001^tick) * 2^96.
22
+ ///
23
+ /// Panics if |tick| > MAX_TICK.
24
+ pub fn get_sqrt_ratio_at_tick(tick: I256) -> U256 {
25
+ let abs_tick: U256 = if tick < I256::ZERO {
26
+ (-tick).as_u256()
27
+ } else {
28
+ tick.as_u256()
29
+ };
30
+
31
+ assert!(abs_tick <= MAX_TICK.as_u256(), "T");
32
+
33
+ let mut ratio: U256 = if (abs_tick & U256::from(0x1u64)) != U256::ZERO {
34
+ U256::new(0xfffcb933bd6fad37aa2d162d1a594001u128)
35
+ } else {
36
+ // 2^128
37
+ U256::from_words(1, 0)
38
+ };
39
+
40
+ macro_rules! apply_tick_bit {
41
+ ($bit:expr, $factor:expr) => {
42
+ if (abs_tick & U256::from($bit as u64)) != U256::ZERO {
43
+ ratio = (ratio * U256::new($factor)) >> 128;
44
+ }
45
+ };
46
+ }
47
+
48
+ apply_tick_bit!(0x2, 0xfff97272373d413259a46990580e213au128);
49
+ apply_tick_bit!(0x4, 0xfff2e50f5f656932ef12357cf3c7fdccu128);
50
+ apply_tick_bit!(0x8, 0xffe5caca7e10e4e61c3624eaa0941cd0u128);
51
+ apply_tick_bit!(0x10, 0xffcb9843d60f6159c9db58835c926644u128);
52
+ apply_tick_bit!(0x20, 0xff973b41fa98c081472e6896dfb254c0u128);
53
+ apply_tick_bit!(0x40, 0xff2ea16466c96a3843ec78b326b52861u128);
54
+ apply_tick_bit!(0x80, 0xfe5dee046a99a2a811c461f1969c3053u128);
55
+ apply_tick_bit!(0x100, 0xfcbe86c7900a88aedcffc83b479aa3a4u128);
56
+ apply_tick_bit!(0x200, 0xf987a7253ac413176f2b074cf7815e54u128);
57
+ apply_tick_bit!(0x400, 0xf3392b0822b70005940c7a398e4b70f3u128);
58
+ apply_tick_bit!(0x800, 0xe7159475a2c29b7443b29c7fa6e889d9u128);
59
+ apply_tick_bit!(0x1000, 0xd097f3bdfd2022b8845ad8f792aa5825u128);
60
+ apply_tick_bit!(0x2000, 0xa9f746462d870fdf8a65dc1f90e061e5u128);
61
+ apply_tick_bit!(0x4000, 0x70d869a156d2a1b890bb3df62baf32f7u128);
62
+ apply_tick_bit!(0x8000, 0x31be135f97d08fd981231505542fcfa6u128);
63
+ apply_tick_bit!(0x10000, 0x9aa508b5b7a84e1c677de54f3e99bc9u128);
64
+ apply_tick_bit!(0x20000, 0x5d6af8dedb81196699c329225ee604u128);
65
+ apply_tick_bit!(0x40000, 0x2216e584f5fa1ea926041bedfe98u128);
66
+ apply_tick_bit!(0x80000, 0x48a170391f7dc42444e8fa2u128);
67
+
68
+ if tick > I256::ZERO {
69
+ ratio = U256::MAX / ratio;
70
+ }
71
+
72
+ let remainder = ratio % (U256::ONE << 32);
73
+ let extra = if remainder == U256::ZERO {
74
+ U256::ZERO
75
+ } else {
76
+ U256::ONE
77
+ };
78
+ as_uint160((ratio >> 32) + extra)
79
+ }
80
+
81
+ /// Calculates the greatest tick value such that getSqrtRatioAtTick(tick) <= ratio.
82
+ ///
83
+ /// Panics if sqrtPriceX96 < MIN_SQRT_RATIO or sqrtPriceX96 >= MAX_SQRT_RATIO.
84
+ pub fn get_tick_at_sqrt_ratio(sqrt_price_x96: U256) -> I256 {
85
+ assert!(
86
+ sqrt_price_x96 >= MIN_SQRT_RATIO && sqrt_price_x96 < MAX_SQRT_RATIO,
87
+ "R"
88
+ );
89
+
90
+ let ratio = sqrt_price_x96 << 32;
91
+
92
+ let mut r = ratio;
93
+ let mut msb = U256::ZERO;
94
+
95
+ // _gt helper inline
96
+ let gt = |a: U256, b: U256| -> U256 {
97
+ if a > b { U256::ONE } else { U256::ZERO }
98
+ };
99
+
100
+ let mut f: U256 =
101
+ gt(r, U256::new(0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFu128)) << 7;
102
+ msb = msb | f;
103
+ r = r >> f;
104
+
105
+ f = gt(r, U256::from(0xFFFFFFFFFFFFFFFFu128)) << 6;
106
+ msb = msb | f;
107
+ r = r >> f;
108
+
109
+ f = gt(r, U256::from(0xFFFFFFFFu64)) << 5;
110
+ msb = msb | f;
111
+ r = r >> f;
112
+
113
+ f = gt(r, U256::from(0xFFFFu64)) << 4;
114
+ msb = msb | f;
115
+ r = r >> f;
116
+
117
+ f = gt(r, U256::from(0xFFu64)) << 3;
118
+ msb = msb | f;
119
+ r = r >> f;
120
+
121
+ f = gt(r, U256::from(0xFu64)) << 2;
122
+ msb = msb | f;
123
+ r = r >> f;
124
+
125
+ f = gt(r, U256::from(0x3u64)) << 1;
126
+ msb = msb | f;
127
+ r = r >> f;
128
+
129
+ f = gt(r, U256::ONE);
130
+ msb = msb | f;
131
+
132
+ if msb >= U256::from(128u64) {
133
+ r = ratio >> (msb - U256::from(127u64));
134
+ } else {
135
+ r = ratio << (U256::from(127u64) - msb);
136
+ }
137
+
138
+ // log_2 is int256 in Solidity. (int256(msb) - 128) << 64
139
+ let mut log_2: I256 = (msb.as_i256() - I256::from(128i32)) << 64u32;
140
+
141
+ // 14 iterations of squaring
142
+ macro_rules! log2_step {
143
+ ($shift:expr) => {
144
+ r = (r * r) >> 127;
145
+ f = r >> 128;
146
+ // f is 0 or 1 (unsigned), cast to signed for the OR into log_2
147
+ log_2 = log_2 | ((f.as_i256()) << $shift as u32);
148
+ r = r >> f;
149
+ };
150
+ }
151
+
152
+ log2_step!(63);
153
+ log2_step!(62);
154
+ log2_step!(61);
155
+ log2_step!(60);
156
+ log2_step!(59);
157
+ log2_step!(58);
158
+ log2_step!(57);
159
+ log2_step!(56);
160
+ log2_step!(55);
161
+ log2_step!(54);
162
+ log2_step!(53);
163
+ log2_step!(52);
164
+ log2_step!(51);
165
+
166
+ // Last iteration (no r >>= f after)
167
+ r = (r * r) >> 127;
168
+ f = r >> 128;
169
+ log_2 = log_2 | ((f.as_i256()) << 50u32);
170
+
171
+ // log_sqrt10001 = log_2 * 255738958999603826347141 (signed multiply)
172
+ let log_sqrt10001: I256 = log_2 * I256::new(255738958999603826347141i128);
173
+
174
+ // tickLow = int24((log_sqrt10001 - 3402992956809132418596140100660247210) >> 128)
175
+ let tick_low_raw: I256 = (log_sqrt10001
176
+ - I256::new(3402992956809132418596140100660247210i128))
177
+ >> 128u32;
178
+
179
+ // tickHi = int24((log_sqrt10001 + 291339464771989622907027621153398088495) >> 128)
180
+ let tick_hi_raw: I256 = (log_sqrt10001
181
+ + U256::new(291339464771989622907027621153398088495u128).as_i256())
182
+ >> 128u32;
183
+
184
+ let tick_low = as_int_n_24(tick_low_raw);
185
+ let tick_hi = as_int_n_24(tick_hi_raw);
186
+
187
+ if tick_low == tick_hi {
188
+ tick_low
189
+ } else if get_sqrt_ratio_at_tick(tick_hi) <= sqrt_price_x96 {
190
+ tick_hi
191
+ } else {
192
+ tick_low
193
+ }
194
+ }
195
+
196
+ /// Equivalent to BigInt.asIntN(24, x) -- truncate to 24 bits and sign-extend.
197
+ fn as_int_n_24(x: I256) -> I256 {
198
+ let mask_24 = I256::new((1i128 << 24) - 1);
199
+ let truncated = x & mask_24;
200
+ let sign_bit = I256::ONE << 23u32;
201
+ if (truncated & sign_bit) != I256::ZERO {
202
+ truncated | !mask_24
203
+ } else {
204
+ truncated
205
+ }
206
+ }
207
+
208
+ #[cfg(test)]
209
+ mod tests {
210
+ use super::*;
211
+
212
+ #[test]
213
+ fn test_constants() {
214
+ assert_eq!(MIN_TICK, I256::new(-887272));
215
+ assert_eq!(MAX_TICK, I256::new(887272));
216
+ assert_eq!(MIN_SQRT_RATIO, U256::from(4295128739u64));
217
+ }
218
+
219
+ #[test]
220
+ fn test_max_sqrt_ratio() {
221
+ let expected =
222
+ U256::from_words(0xFFFD8963, 0xEFD1FC6A506488495D951D5263988D26);
223
+ assert_eq!(MAX_SQRT_RATIO, expected);
224
+ }
225
+
226
+ #[test]
227
+ fn test_get_sqrt_ratio_at_tick_min() {
228
+ let result = get_sqrt_ratio_at_tick(MIN_TICK);
229
+ assert_eq!(result, MIN_SQRT_RATIO);
230
+ }
231
+
232
+ #[test]
233
+ fn test_get_sqrt_ratio_at_tick_max() {
234
+ let result = get_sqrt_ratio_at_tick(MAX_TICK);
235
+ assert_eq!(result, MAX_SQRT_RATIO);
236
+ }
237
+
238
+ #[test]
239
+ fn test_get_sqrt_ratio_at_tick_zero() {
240
+ let result = get_sqrt_ratio_at_tick(I256::ZERO);
241
+ let q96 = U256::ONE << 96;
242
+ assert_eq!(result, q96);
243
+ }
244
+
245
+ #[test]
246
+ fn test_get_tick_at_sqrt_ratio_min() {
247
+ let result = get_tick_at_sqrt_ratio(MIN_SQRT_RATIO);
248
+ assert_eq!(result, MIN_TICK);
249
+ }
250
+
251
+ #[test]
252
+ fn test_get_tick_at_sqrt_ratio_q96() {
253
+ let q96 = U256::ONE << 96;
254
+ let result = get_tick_at_sqrt_ratio(q96);
255
+ assert_eq!(result, I256::ZERO);
256
+ }
257
+
258
+ #[test]
259
+ fn test_roundtrip_positive_tick() {
260
+ let tick = I256::from(100i32);
261
+ let sqrt_ratio = get_sqrt_ratio_at_tick(tick);
262
+ let computed_tick = get_tick_at_sqrt_ratio(sqrt_ratio);
263
+ assert_eq!(computed_tick, tick);
264
+ }
265
+
266
+ #[test]
267
+ fn test_roundtrip_negative_tick() {
268
+ let tick = I256::from(-100i32);
269
+ let sqrt_ratio = get_sqrt_ratio_at_tick(tick);
270
+ let computed_tick = get_tick_at_sqrt_ratio(sqrt_ratio);
271
+ assert_eq!(computed_tick, tick);
272
+ }
273
+
274
+ #[test]
275
+ fn test_roundtrip_large_positive_tick() {
276
+ let tick = I256::new(887270);
277
+ let sqrt_ratio = get_sqrt_ratio_at_tick(tick);
278
+ let computed_tick = get_tick_at_sqrt_ratio(sqrt_ratio);
279
+ assert_eq!(computed_tick, tick);
280
+ }
281
+
282
+ #[test]
283
+ fn test_roundtrip_large_negative_tick() {
284
+ let tick = I256::new(-887270);
285
+ let sqrt_ratio = get_sqrt_ratio_at_tick(tick);
286
+ let computed_tick = get_tick_at_sqrt_ratio(sqrt_ratio);
287
+ assert_eq!(computed_tick, tick);
288
+ }
289
+
290
+ #[test]
291
+ #[should_panic(expected = "T")]
292
+ fn test_get_sqrt_ratio_at_tick_too_large() {
293
+ get_sqrt_ratio_at_tick(MAX_TICK + I256::ONE);
294
+ }
295
+
296
+ #[test]
297
+ #[should_panic(expected = "T")]
298
+ fn test_get_sqrt_ratio_at_tick_too_small() {
299
+ get_sqrt_ratio_at_tick(MIN_TICK - I256::ONE);
300
+ }
301
+
302
+ #[test]
303
+ #[should_panic(expected = "R")]
304
+ fn test_get_tick_at_sqrt_ratio_too_small() {
305
+ get_tick_at_sqrt_ratio(MIN_SQRT_RATIO - U256::ONE);
306
+ }
307
+
308
+ #[test]
309
+ #[should_panic(expected = "R")]
310
+ fn test_get_tick_at_sqrt_ratio_too_large() {
311
+ get_tick_at_sqrt_ratio(MAX_SQRT_RATIO);
312
+ }
313
+
314
+ #[test]
315
+ fn test_as_int_n_24() {
316
+ assert_eq!(as_int_n_24(I256::from(100i32)), I256::from(100i32));
317
+ assert_eq!(as_int_n_24(I256::from(-100i32)), I256::from(-100i32));
318
+ assert_eq!(as_int_n_24(I256::new(887272)), I256::new(887272));
319
+ assert_eq!(as_int_n_24(I256::new(-887272)), I256::new(-887272));
320
+ }
321
+ }
@@ -0,0 +1,67 @@
1
+ use ethnum::U256;
2
+
3
+ /// Divides x by y, rounding up. Does not check for division by zero.
4
+ /// Equivalent to Solidity's `(x + y - 1) / y` with unchecked arithmetic.
5
+ pub fn div_rounding_up(x: U256, y: U256) -> U256 {
6
+ (x + y - U256::ONE) / y
7
+ }
8
+
9
+ #[cfg(test)]
10
+ mod tests {
11
+ use super::*;
12
+
13
+ #[test]
14
+ fn test_exact_division() {
15
+ assert_eq!(
16
+ div_rounding_up(U256::from(10u64), U256::from(5u64)),
17
+ U256::from(2u64)
18
+ );
19
+ }
20
+
21
+ #[test]
22
+ fn test_rounds_up() {
23
+ assert_eq!(
24
+ div_rounding_up(U256::from(11u64), U256::from(5u64)),
25
+ U256::from(3u64)
26
+ );
27
+ }
28
+
29
+ #[test]
30
+ fn test_one_divided_by_one() {
31
+ assert_eq!(
32
+ div_rounding_up(U256::ONE, U256::ONE),
33
+ U256::ONE
34
+ );
35
+ }
36
+
37
+ #[test]
38
+ fn test_zero_numerator() {
39
+ assert_eq!(
40
+ div_rounding_up(U256::ZERO, U256::from(5u64)),
41
+ U256::ZERO
42
+ );
43
+ }
44
+
45
+ #[test]
46
+ fn test_large_values() {
47
+ let _x = U256::MAX;
48
+ let _y = U256::from(2u64);
49
+ // (MAX + 2 - 1) / 2 -- but MAX + 1 wraps to 0, so this is (0) / 2 = 0
50
+ // Wait, U256 arithmetic here is NOT wrapping. Let's think:
51
+ // x + y - 1 = MAX + 2 - 1 = MAX + 1 which overflows.
52
+ // But in Solidity "UnsafeMath" this is unchecked. In our TS it uses BigInt (no overflow).
53
+ // TS: (MAX + 2 - 1) / 2 = (MAX + 1) / 2 = 2^256 / 2 = 2^255.
54
+ // But U256 can't represent 2^256. The TS BigInt can though.
55
+ // Actually in the TS, x is already bounded to uint256 values that come from
56
+ // other operations, so x + y - 1 wouldn't overflow in practice.
57
+ // We skip this edge case test.
58
+ }
59
+
60
+ #[test]
61
+ fn test_rounding_by_one() {
62
+ assert_eq!(
63
+ div_rounding_up(U256::from(1u64), U256::from(3u64)),
64
+ U256::from(1u64)
65
+ );
66
+ }
67
+ }
@@ -0,0 +1,36 @@
1
+ use ethnum::{I256, U256};
2
+ use std::collections::HashMap;
3
+
4
+ use crate::config::MathVariant;
5
+ use crate::math::oracle::OracleObservation;
6
+ use crate::math::tick::TickInfo;
7
+
8
+ /// Mirrors the TS PoolState type, containing all fields needed for pricing.
9
+ /// balance0/balance1 are NOT included — they stay in JS.
10
+ #[derive(Debug, Clone)]
11
+ pub struct PoolState {
12
+ pub block_timestamp: U256,
13
+ pub tick_spacing: I256,
14
+ pub fee: U256,
15
+
16
+ // slot0
17
+ pub sqrt_price_x96: U256,
18
+ pub tick: I256,
19
+ pub observation_index: u16,
20
+ pub observation_cardinality: u16,
21
+ pub observation_cardinality_next: u16,
22
+ pub fee_protocol: U256,
23
+
24
+ pub liquidity: U256,
25
+ pub max_liquidity_per_tick: U256,
26
+
27
+ pub tick_bitmap: HashMap<i16, U256>,
28
+ pub ticks: HashMap<i32, TickInfo>,
29
+ pub observations: HashMap<u16, OracleObservation>,
30
+
31
+ pub start_tick_bitmap: I256,
32
+ pub lowest_known_tick: I256,
33
+ pub highest_known_tick: I256,
34
+
35
+ pub variant: MathVariant,
36
+ }