@paraswap/dex-lib 4.8.45 → 5.0.0-native-dex-math.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 (295) hide show
  1. package/README.md +3 -3
  2. package/build/abi/BProtocol.json +1155 -0
  3. package/build/abi/Jarvis.json +1172 -0
  4. package/build/abi/MStableAsset.json +1545 -0
  5. package/build/abi/OneInchLp.json +1304 -0
  6. package/build/abi/Onebit.json +736 -0
  7. package/build/abi/Shell.json +1294 -0
  8. package/build/abi/TraderJoeV2Router.json +50 -0
  9. package/build/abi/idle-dao/idle-cdo-factory.json +38 -0
  10. package/build/abi/idle-dao/idle-cdo.json +1245 -0
  11. package/build/abi/infusion/InfusionFactory.json +147 -0
  12. package/build/abi/infusion/InfusionPair.json +658 -0
  13. package/build/abi/infusion/InfusionRouter.json +442 -0
  14. package/build/abi/maker-psm/pot.json +322 -0
  15. package/build/abi/maker-psm/psm.json +243 -0
  16. package/build/abi/maker-psm/vat.json +363 -0
  17. package/build/abi/nomiswap-v2/nomiswap-v2-pool.json +773 -0
  18. package/build/abi/quick-perps/fast-price-events.json +70 -0
  19. package/build/abi/quick-perps/fast-price-feed.json +741 -0
  20. package/build/abi/quick-perps/reader.json +313 -0
  21. package/build/abi/quick-perps/vault-price-feed.json +323 -0
  22. package/build/abi/quick-perps/vault.json +1953 -0
  23. package/build/abi/uniswap-v2/excalibur-pool.json +881 -0
  24. package/build/abi/uniswap-v2/mdex-factory.json +759 -0
  25. package/build/abi/wUSDM.json +757 -0
  26. package/build/abi/zrx.v2.json +1967 -0
  27. package/build/abi/zrx.v3.json +3454 -0
  28. package/build/abi/zrx.v4.json +2193 -0
  29. package/build/dex/OneInchLp.d.ts +24 -0
  30. package/build/dex/OneInchLp.js +43 -0
  31. package/build/dex/OneInchLp.js.map +1 -0
  32. package/build/dex/aave-gsm/config.js +2 -2
  33. package/build/dex/bProtocol/bProtocol.d.ts +15 -0
  34. package/build/dex/bProtocol/bProtocol.js +56 -0
  35. package/build/dex/bProtocol/bProtocol.js.map +1 -0
  36. package/build/dex/bProtocol/types.d.ts +11 -0
  37. package/build/dex/bProtocol/types.js +8 -0
  38. package/build/dex/bProtocol/types.js.map +1 -0
  39. package/build/dex/ekubo/pools/base-pool.d.ts +47 -0
  40. package/build/dex/ekubo/pools/base-pool.js +184 -0
  41. package/build/dex/ekubo/pools/base-pool.js.map +1 -0
  42. package/build/dex/ekubo/pools/iface.d.ts +46 -0
  43. package/build/dex/ekubo/pools/iface.js +75 -0
  44. package/build/dex/ekubo/pools/iface.js.map +1 -0
  45. package/build/dex/ekubo/pools/math/price.d.ts +7 -0
  46. package/build/dex/ekubo/pools/math/price.js +112 -0
  47. package/build/dex/ekubo/pools/math/price.js.map +1 -0
  48. package/build/dex/ekubo/pools/oracle-pool.d.ts +10 -0
  49. package/build/dex/ekubo/pools/oracle-pool.js +19 -0
  50. package/build/dex/ekubo/pools/oracle-pool.js.map +1 -0
  51. package/build/dex/ekubo/pools/pool-utils.d.ts +44 -0
  52. package/build/dex/ekubo/pools/pool-utils.js +240 -0
  53. package/build/dex/ekubo/pools/pool-utils.js.map +1 -0
  54. package/build/dex/idex.d.ts +1 -1
  55. package/build/dex/idle-dao/config.d.ts +5 -0
  56. package/build/dex/idle-dao/config.js +24 -0
  57. package/build/dex/idle-dao/config.js.map +1 -0
  58. package/build/dex/idle-dao/idle-dao.d.ts +42 -0
  59. package/build/dex/idle-dao/idle-dao.js +279 -0
  60. package/build/dex/idle-dao/idle-dao.js.map +1 -0
  61. package/build/dex/idle-dao/token_list.d.ts +4 -0
  62. package/build/dex/idle-dao/token_list.js +289 -0
  63. package/build/dex/idle-dao/token_list.js.map +1 -0
  64. package/build/dex/idle-dao/tokens.d.ts +9 -0
  65. package/build/dex/idle-dao/tokens.js +68 -0
  66. package/build/dex/idle-dao/tokens.js.map +1 -0
  67. package/build/dex/idle-dao/types.d.ts +35 -0
  68. package/build/dex/idle-dao/types.js +11 -0
  69. package/build/dex/idle-dao/types.js.map +1 -0
  70. package/build/dex/idle-dao/utils.d.ts +8 -0
  71. package/build/dex/idle-dao/utils.js +149 -0
  72. package/build/dex/idle-dao/utils.js.map +1 -0
  73. package/build/dex/infusion/config.d.ts +3 -0
  74. package/build/dex/infusion/config.js +20 -0
  75. package/build/dex/infusion/config.js.map +1 -0
  76. package/build/dex/infusion/infusion-stable-pool.d.ts +4 -0
  77. package/build/dex/infusion/infusion-stable-pool.js +74 -0
  78. package/build/dex/infusion/infusion-stable-pool.js.map +1 -0
  79. package/build/dex/infusion/infusion.d.ts +51 -0
  80. package/build/dex/infusion/infusion.js +500 -0
  81. package/build/dex/infusion/infusion.js.map +1 -0
  82. package/build/dex/infusion/types.d.ts +45 -0
  83. package/build/dex/infusion/types.js +3 -0
  84. package/build/dex/infusion/types.js.map +1 -0
  85. package/build/dex/infusion/utils/isStablePair.d.ts +2 -0
  86. package/build/dex/infusion/utils/isStablePair.js +18 -0
  87. package/build/dex/infusion/utils/isStablePair.js.map +1 -0
  88. package/build/dex/jarvis.d.ts +56 -0
  89. package/build/dex/jarvis.js +163 -0
  90. package/build/dex/jarvis.js.map +1 -0
  91. package/build/dex/mStable.d.ts +44 -0
  92. package/build/dex/mStable.js +75 -0
  93. package/build/dex/mStable.js.map +1 -0
  94. package/build/dex/maker-psm/config.d.ts +11 -0
  95. package/build/dex/maker-psm/config.js +53 -0
  96. package/build/dex/maker-psm/config.js.map +1 -0
  97. package/build/dex/maker-psm/maker-psm.d.ts +103 -0
  98. package/build/dex/maker-psm/maker-psm.js +493 -0
  99. package/build/dex/maker-psm/maker-psm.js.map +1 -0
  100. package/build/dex/maker-psm/types.d.ts +39 -0
  101. package/build/dex/maker-psm/types.js +3 -0
  102. package/build/dex/maker-psm/types.js.map +1 -0
  103. package/build/dex/onebit/onebit.d.ts +16 -0
  104. package/build/dex/onebit/onebit.js +61 -0
  105. package/build/dex/onebit/onebit.js.map +1 -0
  106. package/build/dex/onebit/types.d.ts +14 -0
  107. package/build/dex/onebit/types.js +8 -0
  108. package/build/dex/onebit/types.js.map +1 -0
  109. package/build/dex/pancakeswap-v3/pancakeswap-v3-pool.d.ts +2 -0
  110. package/build/dex/pancakeswap-v3/pancakeswap-v3-pool.js +5 -0
  111. package/build/dex/pancakeswap-v3/pancakeswap-v3-pool.js.map +1 -1
  112. package/build/dex/pancakeswap-v3/pancakeswap-v3.d.ts +6 -3
  113. package/build/dex/pancakeswap-v3/pancakeswap-v3.js +85 -9
  114. package/build/dex/pancakeswap-v3/pancakeswap-v3.js.map +1 -1
  115. package/build/dex/quick-perps/config.d.ts +11 -0
  116. package/build/dex/quick-perps/config.js +27 -0
  117. package/build/dex/quick-perps/config.js.map +1 -0
  118. package/build/dex/quick-perps/fast-price-feed.d.ts +26 -0
  119. package/build/dex/quick-perps/fast-price-feed.js +184 -0
  120. package/build/dex/quick-perps/fast-price-feed.js.map +1 -0
  121. package/build/dex/quick-perps/pool.d.ts +21 -0
  122. package/build/dex/quick-perps/pool.js +229 -0
  123. package/build/dex/quick-perps/pool.js.map +1 -0
  124. package/build/dex/quick-perps/quick-perps.d.ts +53 -0
  125. package/build/dex/quick-perps/quick-perps.js +247 -0
  126. package/build/dex/quick-perps/quick-perps.js.map +1 -0
  127. package/build/dex/quick-perps/types.d.ts +98 -0
  128. package/build/dex/quick-perps/types.js +3 -0
  129. package/build/dex/quick-perps/types.js.map +1 -0
  130. package/build/dex/quick-perps/usdq.d.ts +15 -0
  131. package/build/dex/quick-perps/usdq.js +62 -0
  132. package/build/dex/quick-perps/usdq.js.map +1 -0
  133. package/build/dex/quick-perps/vault-price-feed.d.ts +43 -0
  134. package/build/dex/quick-perps/vault-price-feed.js +203 -0
  135. package/build/dex/quick-perps/vault-price-feed.js.map +1 -0
  136. package/build/dex/quick-perps/vault-utils.d.ts +8 -0
  137. package/build/dex/quick-perps/vault-utils.js +42 -0
  138. package/build/dex/quick-perps/vault-utils.js.map +1 -0
  139. package/build/dex/quick-perps/vault.d.ts +46 -0
  140. package/build/dex/quick-perps/vault.js +182 -0
  141. package/build/dex/quick-perps/vault.js.map +1 -0
  142. package/build/dex/se-vlr/config.d.ts +3 -0
  143. package/build/dex/se-vlr/config.js +24 -0
  144. package/build/dex/se-vlr/config.js.map +1 -0
  145. package/build/dex/se-vlr/se-vlr-pool.d.ts +39 -0
  146. package/build/dex/se-vlr/se-vlr-pool.js +70 -0
  147. package/build/dex/se-vlr/se-vlr-pool.js.map +1 -0
  148. package/build/dex/se-vlr/se-vlr.d.ts +35 -0
  149. package/build/dex/se-vlr/se-vlr.js +131 -0
  150. package/build/dex/se-vlr/se-vlr.js.map +1 -0
  151. package/build/dex/se-vlr/types.d.ts +6 -0
  152. package/build/dex/se-vlr/types.js +3 -0
  153. package/build/dex/se-vlr/types.js.map +1 -0
  154. package/build/dex/shell.d.ts +25 -0
  155. package/build/dex/shell.js +41 -0
  156. package/build/dex/shell.js.map +1 -0
  157. package/build/dex/solidly/forks-override/aerodrome.d.ts +14 -0
  158. package/build/dex/solidly/forks-override/aerodrome.js +46 -0
  159. package/build/dex/solidly/forks-override/aerodrome.js.map +1 -0
  160. package/build/dex/solidly/forks-override/chronos.d.ts +23 -0
  161. package/build/dex/solidly/forks-override/chronos.js +141 -0
  162. package/build/dex/solidly/forks-override/chronos.js.map +1 -0
  163. package/build/dex/solidly/forks-override/usdfi.d.ts +8 -0
  164. package/build/dex/solidly/forks-override/usdfi.js +15 -0
  165. package/build/dex/solidly/forks-override/usdfi.js.map +1 -0
  166. package/build/dex/solidly/forks-override/velocimeter.d.ts +23 -0
  167. package/build/dex/solidly/forks-override/velocimeter.js +77 -0
  168. package/build/dex/solidly/forks-override/velocimeter.js.map +1 -0
  169. package/build/dex/solidly-v3/solidly-v3-pool.d.ts +3 -0
  170. package/build/dex/solidly-v3/solidly-v3-pool.js +8 -0
  171. package/build/dex/solidly-v3/solidly-v3-pool.js.map +1 -1
  172. package/build/dex/solidly-v3/solidly-v3.d.ts +5 -2
  173. package/build/dex/solidly-v3/solidly-v3.js +84 -8
  174. package/build/dex/solidly-v3/solidly-v3.js.map +1 -1
  175. package/build/dex/tessera/types.d.ts +3 -0
  176. package/build/dex/tessera/types.js +3 -0
  177. package/build/dex/tessera/types.js.map +1 -0
  178. package/build/dex/trader-joe-v2.d.ts +40 -0
  179. package/build/dex/trader-joe-v2.js +74 -0
  180. package/build/dex/trader-joe-v2.js.map +1 -0
  181. package/build/dex/uniswap-v2/dfyn.d.ts +19 -0
  182. package/build/dex/uniswap-v2/dfyn.js +61 -0
  183. package/build/dex/uniswap-v2/dfyn.js.map +1 -0
  184. package/build/dex/uniswap-v2/excalibur.d.ts +24 -0
  185. package/build/dex/uniswap-v2/excalibur.js +47 -0
  186. package/build/dex/uniswap-v2/excalibur.js.map +1 -0
  187. package/build/dex/uniswap-v2/mdex.d.ts +24 -0
  188. package/build/dex/uniswap-v2/mdex.js +50 -0
  189. package/build/dex/uniswap-v2/mdex.js.map +1 -0
  190. package/build/dex/uniswap-v2/nomiswap-v2.d.ts +24 -0
  191. package/build/dex/uniswap-v2/nomiswap-v2.js +57 -0
  192. package/build/dex/uniswap-v2/nomiswap-v2.js.map +1 -0
  193. package/build/dex/uniswap-v3/scripts/bench-all-dexes.js +160 -0
  194. package/build/dex/uniswap-v3/scripts/bench-all-dexes.js.map +1 -0
  195. package/build/dex/uniswap-v3/scripts/measure-calc-time.js +222 -110
  196. package/build/dex/uniswap-v3/scripts/measure-calc-time.js.map +1 -1
  197. package/build/dex/uniswap-v3/types.d.ts +1 -0
  198. package/build/dex/uniswap-v3/types.js.map +1 -1
  199. package/build/dex/uniswap-v3/uniswap-v3-new.d.ts +94 -0
  200. package/build/dex/uniswap-v3/uniswap-v3-new.js +923 -0
  201. package/build/dex/uniswap-v3/uniswap-v3-new.js.map +1 -0
  202. package/build/dex/uniswap-v3/uniswap-v3-pool.d.ts +2 -0
  203. package/build/dex/uniswap-v3/uniswap-v3-pool.js +5 -0
  204. package/build/dex/uniswap-v3/uniswap-v3-pool.js.map +1 -1
  205. package/build/dex/uniswap-v3/uniswap-v3.d.ts +11 -3
  206. package/build/dex/uniswap-v3/uniswap-v3.js +86 -9
  207. package/build/dex/uniswap-v3/uniswap-v3.js.map +1 -1
  208. package/build/dex/uniswap-v4/contract-math/Position.d.ts +3 -0
  209. package/build/dex/uniswap-v4/contract-math/Position.js +10 -0
  210. package/build/dex/uniswap-v4/contract-math/Position.js.map +1 -0
  211. package/build/dex/uniswap-v4/types.d.ts +1 -0
  212. package/build/dex/uniswap-v4/uniswap-v4-pool-manager.d.ts +2 -0
  213. package/build/dex/uniswap-v4/uniswap-v4-pool-manager.js +3 -0
  214. package/build/dex/uniswap-v4/uniswap-v4-pool-manager.js.map +1 -1
  215. package/build/dex/uniswap-v4/uniswap-v4-pool.d.ts +3 -0
  216. package/build/dex/uniswap-v4/uniswap-v4-pool.js +18 -0
  217. package/build/dex/uniswap-v4/uniswap-v4-pool.js.map +1 -1
  218. package/build/dex/uniswap-v4/uniswap-v4.d.ts +3 -1
  219. package/build/dex/uniswap-v4/uniswap-v4.js +74 -14
  220. package/build/dex/uniswap-v4/uniswap-v4.js.map +1 -1
  221. package/build/dex/usual-bond/config.d.ts +3 -0
  222. package/build/dex/usual-bond/config.js +13 -0
  223. package/build/dex/usual-bond/config.js.map +1 -0
  224. package/build/dex/usual-bond/types.d.ts +7 -0
  225. package/build/dex/usual-bond/types.js +3 -0
  226. package/build/dex/usual-bond/types.js.map +1 -0
  227. package/build/dex/usual-bond/usual-bond.d.ts +35 -0
  228. package/build/dex/usual-bond/usual-bond.js +176 -0
  229. package/build/dex/usual-bond/usual-bond.js.map +1 -0
  230. package/build/dex/wusdm/config.d.ts +3 -0
  231. package/build/dex/wusdm/config.js +43 -0
  232. package/build/dex/wusdm/config.js.map +1 -0
  233. package/build/dex/wusdm/constants.d.ts +2 -0
  234. package/build/dex/wusdm/constants.js +6 -0
  235. package/build/dex/wusdm/constants.js.map +1 -0
  236. package/build/dex/wusdm/types.d.ts +18 -0
  237. package/build/dex/wusdm/types.js +11 -0
  238. package/build/dex/wusdm/types.js.map +1 -0
  239. package/build/dex/wusdm/wusdm-pool.d.ts +21 -0
  240. package/build/dex/wusdm/wusdm-pool.js +74 -0
  241. package/build/dex/wusdm/wusdm-pool.js.map +1 -0
  242. package/build/dex/wusdm/wusdm.d.ts +46 -0
  243. package/build/dex/wusdm/wusdm.js +243 -0
  244. package/build/dex/wusdm/wusdm.js.map +1 -0
  245. package/build/dex/zerox/config.d.ts +2 -0
  246. package/build/dex/zerox/config.js +33 -0
  247. package/build/dex/zerox/config.js.map +1 -0
  248. package/build/dex/zerox/index.d.ts +22 -0
  249. package/build/dex/zerox/index.js +225 -0
  250. package/build/dex/zerox/index.js.map +1 -0
  251. package/build/dex/zerox/order.d.ts +88 -0
  252. package/build/dex/zerox/order.js +53 -0
  253. package/build/dex/zerox/order.js.map +1 -0
  254. package/build/dex/zerox/types.d.ts +73 -0
  255. package/build/dex/zerox/types.js +21 -0
  256. package/build/dex/zerox/types.js.map +1 -0
  257. package/build/lens.js +1 -1
  258. package/build/pricing-helper.d.ts +1 -1
  259. package/build/pricing-helper.js +2 -2
  260. package/build/pricing-helper.js.map +1 -1
  261. package/native/Cargo.lock +331 -0
  262. package/native/Cargo.toml +22 -0
  263. package/native/build.rs +5 -0
  264. package/native/package-lock.json +32 -0
  265. package/native/package.json +20 -0
  266. package/native/src/config.rs +73 -0
  267. package/native/src/lib.rs +528 -0
  268. package/native/src/math/bit_math.rs +177 -0
  269. package/native/src/math/full_math.rs +217 -0
  270. package/native/src/math/liquidity_math.rs +72 -0
  271. package/native/src/math/mod.rs +10 -0
  272. package/native/src/math/oracle.rs +493 -0
  273. package/native/src/math/sqrt_price_math.rs +272 -0
  274. package/native/src/math/swap_math.rs +306 -0
  275. package/native/src/math/tick.rs +239 -0
  276. package/native/src/math/tick_bitmap.rs +312 -0
  277. package/native/src/math/tick_math.rs +321 -0
  278. package/native/src/math/unsafe_math.rs +67 -0
  279. package/native/src/pool_state.rs +41 -0
  280. package/native/src/query_outputs.rs +379 -0
  281. package/native/src/v4_query_outputs.rs +255 -0
  282. package/package.json +21 -5
  283. package/build/abi/pancakeswap-infinity/cl-pool-manager.json +0 -80
  284. package/build/dex/fluid-dex/scripts/measure-calc-time.js +0 -178
  285. package/build/dex/fluid-dex/scripts/measure-calc-time.js.map +0 -1
  286. package/build/dex/uniswap-v4/api-go/compare-pricing.d.ts +0 -1
  287. package/build/dex/uniswap-v4/api-go/compare-pricing.js +0 -187
  288. package/build/dex/uniswap-v4/api-go/compare-pricing.js.map +0 -1
  289. package/build/dex/uniswap-v4/api-go/compare-states.d.ts +0 -1
  290. package/build/dex/uniswap-v4/api-go/compare-states.js +0 -149
  291. package/build/dex/uniswap-v4/api-go/compare-states.js.map +0 -1
  292. package/build/dex/uniswap-v4/api-go/fetch-pool-key.d.ts +0 -0
  293. package/build/dex/uniswap-v4/api-go/fetch-pool-key.js +0 -140
  294. package/build/dex/uniswap-v4/api-go/fetch-pool-key.js.map +0 -1
  295. /package/build/dex/{fluid-dex/scripts/measure-calc-time.d.ts → uniswap-v3/scripts/bench-all-dexes.d.ts} +0 -0
@@ -0,0 +1,177 @@
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
+ }
@@ -0,0 +1,217 @@
1
+ use ethnum::U256;
2
+
3
+ /// Calculates floor(a * b / denominator).
4
+ ///
5
+ /// The TS version uses BigInt which has arbitrary precision, so `a * b` never
6
+ /// overflows. We replicate this by widening to 512-bit via two U256 halves.
7
+ ///
8
+ /// Panics if the result exceeds U256::MAX or denominator is zero.
9
+ pub fn mul_div(a: U256, b: U256, denominator: U256) -> U256 {
10
+ assert!(denominator > U256::ZERO, "denominator must be > 0");
11
+ let (lo, hi) = widening_mul(a, b);
12
+ let (quot, _) = div_512_by_256(lo, hi, denominator);
13
+ quot
14
+ }
15
+
16
+ /// Calculates ceil(a * b / denominator).
17
+ ///
18
+ /// Panics if the result exceeds U256::MAX or denominator is zero.
19
+ pub fn mul_div_rounding_up(a: U256, b: U256, denominator: U256) -> U256 {
20
+ assert!(denominator > U256::ZERO, "denominator must be > 0");
21
+ // result = (a * b + denominator - 1) / denominator
22
+ let (lo, hi) = widening_mul(a, b);
23
+ // add (denominator - 1) to the 512-bit product
24
+ let addend = denominator - U256::ONE;
25
+ let (lo2, carry) = lo.overflowing_add(addend);
26
+ let hi2 = if carry { hi + U256::ONE } else { hi };
27
+ let (quot, _) = div_512_by_256(lo2, hi2, denominator);
28
+ quot
29
+ }
30
+
31
+ /// Returns (lo, hi) such that a * b = hi * 2^256 + lo.
32
+ fn widening_mul(a: U256, b: U256) -> (U256, U256) {
33
+ let mask128 = (U256::ONE << 128) - U256::ONE;
34
+
35
+ let a_lo = a & mask128;
36
+ let a_hi = a >> 128;
37
+ let b_lo = b & mask128;
38
+ let b_hi = b >> 128;
39
+
40
+ let p0: U256 = a_lo * b_lo;
41
+ let p1: U256 = a_lo * b_hi;
42
+ let p2: U256 = a_hi * b_lo;
43
+ let p3: U256 = a_hi * b_hi;
44
+
45
+ let lo: U256 = p0;
46
+ let hi: U256 = p3;
47
+
48
+ // Add p1 << 128
49
+ let p1_lo = p1 << 128;
50
+ let p1_hi = p1 >> 128;
51
+ let (lo, c1) = lo.overflowing_add(p1_lo);
52
+ let hi = hi + p1_hi + if c1 { U256::ONE } else { U256::ZERO };
53
+
54
+ // Add p2 << 128
55
+ let p2_lo = p2 << 128;
56
+ let p2_hi = p2 >> 128;
57
+ let (lo, c2) = lo.overflowing_add(p2_lo);
58
+ let hi = hi + p2_hi + if c2 { U256::ONE } else { U256::ZERO };
59
+
60
+ (lo, hi)
61
+ }
62
+
63
+ /// Divides a 512-bit number (lo + hi * 2^256) by a 256-bit denominator.
64
+ /// Returns (quotient, remainder). Panics if quotient overflows U256.
65
+ fn div_512_by_256(lo: U256, hi: U256, d: U256) -> (U256, U256) {
66
+ assert!(d > U256::ZERO, "division by zero");
67
+
68
+ if hi == U256::ZERO {
69
+ return (lo / d, lo % d);
70
+ }
71
+
72
+ assert!(hi < d, "mul_div result overflows U256");
73
+
74
+ // Split lo into two 128-bit halves and do two rounds of division.
75
+ let mask128 = (U256::ONE << 128) - U256::ONE;
76
+ let lo_hi = (lo >> 128) & mask128;
77
+ let lo_lo = lo & mask128;
78
+
79
+ // First round: divide (hi * 2^128 + lo_hi) by d
80
+ let (q_hi, r1) = div_384_by_256(lo_hi, hi, d);
81
+
82
+ // Second round: divide (r1 * 2^128 + lo_lo) by d
83
+ let (q_lo, rem) = div_384_by_256(lo_lo, r1, d);
84
+
85
+ let quotient = (q_hi << 128) + q_lo;
86
+ (quotient, rem)
87
+ }
88
+
89
+ /// Divides (hi * 2^128 + lo_128) by d, where hi < d and lo_128 < 2^128.
90
+ /// Returns (quotient, remainder).
91
+ fn div_384_by_256(lo_128: U256, hi: U256, d: U256) -> (U256, U256) {
92
+ let mask128 = (U256::ONE << 128) - U256::ONE;
93
+ let hi_upper = hi >> 128;
94
+
95
+ if hi_upper == U256::ZERO {
96
+ // hi fits in 128 bits, so hi * 2^128 + lo_128 fits in 256 bits
97
+ let numerator = (hi << 128) | lo_128;
98
+ return (numerator / d, numerator % d);
99
+ }
100
+
101
+ // hi doesn't fit in 128 bits. Use bit-by-bit long division.
102
+ // The quotient fits in at most ~129 bits (since hi < d).
103
+ let _ = mask128;
104
+ let mut remainder = hi;
105
+ let mut quotient = U256::ZERO;
106
+
107
+ for i in (0..128).rev() {
108
+ let bit = (lo_128 >> i) & U256::ONE;
109
+
110
+ // Check if shifting left would overflow
111
+ let overflow = remainder >> 255 != U256::ZERO;
112
+ remainder = (remainder << 1) | bit;
113
+
114
+ if overflow || remainder >= d {
115
+ remainder = remainder.wrapping_sub(d);
116
+ quotient = quotient | (U256::ONE << i);
117
+ }
118
+ }
119
+
120
+ (quotient, remainder)
121
+ }
122
+
123
+ #[cfg(test)]
124
+ mod tests {
125
+ use super::*;
126
+
127
+ #[test]
128
+ fn test_mul_div_simple() {
129
+ assert_eq!(
130
+ mul_div(U256::from(6u64), U256::from(7u64), U256::from(3u64)),
131
+ U256::from(14u64)
132
+ );
133
+ }
134
+
135
+ #[test]
136
+ fn test_mul_div_large() {
137
+ assert_eq!(
138
+ mul_div(U256::MAX, U256::ONE, U256::ONE),
139
+ U256::MAX
140
+ );
141
+ }
142
+
143
+ #[test]
144
+ fn test_mul_div_rounding_up_exact() {
145
+ assert_eq!(
146
+ mul_div_rounding_up(U256::from(6u64), U256::from(7u64), U256::from(3u64)),
147
+ U256::from(14u64)
148
+ );
149
+ }
150
+
151
+ #[test]
152
+ fn test_mul_div_rounding_up_rounds() {
153
+ // 5 * 7 / 3 = 35/3 = 11.666... -> ceil = 12
154
+ assert_eq!(
155
+ mul_div_rounding_up(U256::from(5u64), U256::from(7u64), U256::from(3u64)),
156
+ U256::from(12u64)
157
+ );
158
+ }
159
+
160
+ #[test]
161
+ fn test_mul_div_floor() {
162
+ // 5 * 7 / 3 = 35/3 = 11.666... -> floor = 11
163
+ assert_eq!(
164
+ mul_div(U256::from(5u64), U256::from(7u64), U256::from(3u64)),
165
+ U256::from(11u64)
166
+ );
167
+ }
168
+
169
+ #[test]
170
+ fn test_mul_div_large_product() {
171
+ let a = U256::ONE << 200;
172
+ let b = U256::ONE << 200;
173
+ let d = U256::ONE << 200;
174
+ assert_eq!(mul_div(a, b, d), U256::ONE << 200);
175
+ }
176
+
177
+ #[test]
178
+ fn test_mul_div_max_times_max() {
179
+ assert_eq!(mul_div(U256::MAX, U256::MAX, U256::MAX), U256::MAX);
180
+ }
181
+
182
+ #[test]
183
+ #[should_panic]
184
+ fn test_mul_div_overflow() {
185
+ mul_div(U256::MAX, U256::MAX, U256::ONE);
186
+ }
187
+
188
+ #[test]
189
+ fn test_mul_div_rounding_up_large() {
190
+ let a = U256::ONE << 128;
191
+ let b = U256::ONE << 128;
192
+ let d = (U256::ONE << 128) + U256::ONE;
193
+ let result = mul_div_rounding_up(a, b, d);
194
+ assert!(result > U256::ZERO);
195
+ }
196
+
197
+ #[test]
198
+ fn test_widening_mul_simple() {
199
+ let (lo, hi) = widening_mul(U256::from(3u64), U256::from(7u64));
200
+ assert_eq!(lo, U256::from(21u64));
201
+ assert_eq!(hi, U256::ZERO);
202
+ }
203
+
204
+ #[test]
205
+ fn test_widening_mul_large() {
206
+ let (lo, hi) = widening_mul(U256::MAX, U256::from(2u64));
207
+ assert_eq!(hi, U256::ONE);
208
+ assert_eq!(lo, U256::MAX - U256::ONE);
209
+ }
210
+
211
+ #[test]
212
+ fn test_mul_div_uniswap_style() {
213
+ // Test case from Uniswap V3: mulDiv(Q128, Q128, Q128) = Q128
214
+ let q128 = U256::ONE << 128;
215
+ assert_eq!(mul_div(q128, q128, q128), q128);
216
+ }
217
+ }
@@ -0,0 +1,72 @@
1
+ use ethnum::{I256, U256};
2
+
3
+ /// Adds a signed liquidity delta to an unsigned liquidity value.
4
+ ///
5
+ /// In Solidity, when y < 0:
6
+ /// z = x - uint128(-y); require(z < x)
7
+ /// When y >= 0:
8
+ /// z = x + uint128(y); require(z >= x)
9
+ ///
10
+ /// Panics with "LS" if y < 0 and the subtraction underflows.
11
+ /// Panics with "LA" if y >= 0 and the addition overflows.
12
+ pub fn add_delta(x: U256, y: I256) -> U256 {
13
+ let mask_128: U256 = (U256::ONE << 128) - U256::ONE;
14
+
15
+ if y < I256::ZERO {
16
+ // _y = BigInt.asUintN(128, -y)
17
+ // (-y) is positive I256; reinterpret as U256 and mask to 128 bits
18
+ let neg_y_u256 = (-y).as_u256();
19
+ let _y = neg_y_u256 & mask_128;
20
+ let z = x.checked_sub(_y).expect("LS");
21
+ assert!(z < x, "LS");
22
+ z
23
+ } else {
24
+ // _y = BigInt.asUintN(128, y)
25
+ let _y = y.as_u256() & mask_128;
26
+ let z = x.checked_add(_y).expect("LA");
27
+ assert!(z >= x, "LA");
28
+ z
29
+ }
30
+ }
31
+
32
+ #[cfg(test)]
33
+ mod tests {
34
+ use super::*;
35
+
36
+ #[test]
37
+ fn test_add_positive_delta() {
38
+ let x = U256::from(100u64);
39
+ let y = I256::new(50);
40
+ assert_eq!(add_delta(x, y), U256::from(150u64));
41
+ }
42
+
43
+ #[test]
44
+ fn test_add_negative_delta() {
45
+ let x = U256::from(100u64);
46
+ let y = I256::new(-50);
47
+ assert_eq!(add_delta(x, y), U256::from(50u64));
48
+ }
49
+
50
+ #[test]
51
+ fn test_add_zero_delta() {
52
+ let x = U256::from(100u64);
53
+ let y = I256::ZERO;
54
+ assert_eq!(add_delta(x, y), U256::from(100u64));
55
+ }
56
+
57
+ #[test]
58
+ #[should_panic(expected = "LS")]
59
+ fn test_subtract_too_much() {
60
+ let x = U256::from(50u64);
61
+ let y = I256::new(-100);
62
+ add_delta(x, y);
63
+ }
64
+
65
+ #[test]
66
+ #[should_panic(expected = "LA")]
67
+ fn test_add_overflow() {
68
+ let x = U256::MAX;
69
+ let y = I256::new(1);
70
+ add_delta(x, y);
71
+ }
72
+ }
@@ -0,0 +1,10 @@
1
+ pub mod bit_math;
2
+ pub mod full_math;
3
+ pub mod liquidity_math;
4
+ pub mod sqrt_price_math;
5
+ pub mod swap_math;
6
+ pub mod tick;
7
+ pub mod tick_bitmap;
8
+ pub mod tick_math;
9
+ pub mod unsafe_math;
10
+ pub mod oracle;