@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
@@ -1,217 +0,0 @@
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
- }
@@ -1,72 +0,0 @@
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
- }
@@ -1,10 +0,0 @@
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;