@paraswap/dex-lib 4.7.25 → 4.7.26-balancer-v3-block-timestamp.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 (300) hide show
  1. package/build/abi/PendleRouterStatic.json +19 -0
  2. package/build/abi/{MStableAsset.json → apex-defi/ApexDefiFactory.abi.json} +992 -788
  3. package/build/abi/{BProtocol.json → apex-defi/ApexDefiRouter.abi.json} +539 -574
  4. package/build/abi/apex-defi/ApexDefiToken.abi.json +229 -0
  5. package/build/abi/apex-defi/ApexDefiWrapper.abi.json +92 -0
  6. package/build/abi/{OneInchLp.json → apex-defi/ApexDefiWrapperFactory.abi.json} +577 -774
  7. package/build/abi/ekubo-v3/core.json +797 -0
  8. package/build/abi/ekubo-v3/mev-capture-router.json +936 -0
  9. package/build/abi/ekubo-v3/quote-data-fetcher.json +161 -0
  10. package/build/abi/ekubo-v3/twamm-data-fetcher.json +216 -0
  11. package/build/abi/ekubo-v3/twamm.json +613 -0
  12. package/build/abi/pangolin-v3/PangolinV3StateMulticall.abi.json +796 -0
  13. package/build/abi/pendle/pendle-deployer.abi.json +520 -0
  14. package/build/abi/pendle/pendle-oracle.abi.json +413 -0
  15. package/build/abi/ring-v2/few-wrapped-token.json +587 -0
  16. package/build/abi/ring-v2/ring-v2-factory.json +125 -0
  17. package/build/abi/ring-v2/ring-v2-pool.json +461 -0
  18. package/build/abi/ring-v2/ring-v2-router.json +332 -0
  19. package/build/abi/stabull/stabull-curve.json +738 -0
  20. package/build/abi/stabull/stabull-router.json +76 -0
  21. package/build/abi/uniswap-v4/hooks/SpotDynamicFeeManager.json +26 -0
  22. package/build/abi/uniswap-v4/hooks/SpotHook.json +54 -0
  23. package/build/abi/uniswap-v4/hooks/SpotPolicyManager.json +45 -0
  24. package/build/abi/uniswap-v4/hooks/cabalcoin-hook.abi.json +682 -0
  25. package/build/abi/uniswap-v4/hooks/fee-hook.abi.json +1335 -0
  26. package/build/dex/aave-pt-to-underlying/aave-pt-to-underlying-factory.d.ts +29 -0
  27. package/build/dex/aave-pt-to-underlying/aave-pt-to-underlying-factory.js +153 -0
  28. package/build/dex/aave-pt-to-underlying/aave-pt-to-underlying-factory.js.map +1 -0
  29. package/build/dex/{usual-bond/usual-bond.d.ts → aave-pt-to-underlying/aave-pt-to-underlying.d.ts} +23 -18
  30. package/build/dex/aave-pt-to-underlying/aave-pt-to-underlying.js +323 -0
  31. package/build/dex/aave-pt-to-underlying/aave-pt-to-underlying.js.map +1 -0
  32. package/build/dex/aave-pt-to-underlying/config.d.ts +3 -0
  33. package/build/dex/aave-pt-to-underlying/config.js +24 -0
  34. package/build/dex/aave-pt-to-underlying/config.js.map +1 -0
  35. package/build/dex/aave-pt-to-underlying/constants.d.ts +2 -0
  36. package/build/dex/aave-pt-to-underlying/constants.js +6 -0
  37. package/build/dex/aave-pt-to-underlying/constants.js.map +1 -0
  38. package/build/dex/aave-pt-to-underlying/types.d.ts +24 -0
  39. package/build/dex/aave-pt-to-underlying/types.js.map +1 -0
  40. package/build/dex/aave-pt-to-usdc/aave-pt-to-usdc.d.ts +39 -0
  41. package/build/dex/aave-pt-to-usdc/aave-pt-to-usdc.js +244 -0
  42. package/build/dex/aave-pt-to-usdc/aave-pt-to-usdc.js.map +1 -0
  43. package/build/dex/aave-pt-to-usdc/config.d.ts +3 -0
  44. package/build/dex/aave-pt-to-usdc/config.js +47 -0
  45. package/build/dex/aave-pt-to-usdc/config.js.map +1 -0
  46. package/build/dex/aave-pt-to-usdc/constants.d.ts +2 -0
  47. package/build/dex/aave-pt-to-usdc/constants.js +6 -0
  48. package/build/dex/aave-pt-to-usdc/constants.js.map +1 -0
  49. package/build/dex/aave-pt-to-usdc/types.d.ts +22 -0
  50. package/build/dex/aave-pt-to-usdc/types.js.map +1 -0
  51. package/build/dex/apex-defi/apex-defi-factory.d.ts +26 -0
  52. package/build/dex/apex-defi/apex-defi-factory.js +53 -0
  53. package/build/dex/apex-defi/apex-defi-factory.js.map +1 -0
  54. package/build/dex/apex-defi/apex-defi-pool.d.ts +55 -0
  55. package/build/dex/apex-defi/apex-defi-pool.js +247 -0
  56. package/build/dex/apex-defi/apex-defi-pool.js.map +1 -0
  57. package/build/dex/apex-defi/apex-defi-wrapper-factory.d.ts +57 -0
  58. package/build/dex/apex-defi/apex-defi-wrapper-factory.js +250 -0
  59. package/build/dex/apex-defi/apex-defi-wrapper-factory.js.map +1 -0
  60. package/build/dex/apex-defi/apex-defi.d.ts +97 -0
  61. package/build/dex/apex-defi/apex-defi.js +1021 -0
  62. package/build/dex/apex-defi/apex-defi.js.map +1 -0
  63. package/build/dex/apex-defi/config.d.ts +4 -0
  64. package/build/dex/apex-defi/config.js +138 -0
  65. package/build/dex/apex-defi/config.js.map +1 -0
  66. package/build/dex/apex-defi/types.d.ts +32 -0
  67. package/build/dex/apex-defi/types.js +3 -0
  68. package/build/dex/{usual-bond → apex-defi}/types.js.map +1 -1
  69. package/build/dex/apex-defi/utils.d.ts +46 -0
  70. package/build/dex/apex-defi/utils.js +133 -0
  71. package/build/dex/apex-defi/utils.js.map +1 -0
  72. package/build/dex/balancer-v3/balancer-v3-pool.js +2 -3
  73. package/build/dex/balancer-v3/balancer-v3-pool.js.map +1 -1
  74. package/build/dex/balancer-v3/balancer-v3.d.ts +0 -1
  75. package/build/dex/balancer-v3/balancer-v3.js +13 -13
  76. package/build/dex/balancer-v3/balancer-v3.js.map +1 -1
  77. package/build/dex/balancer-v3/hooks/balancer-hook-event-subscriber.js +1 -1
  78. package/build/dex/balancer-v3/hooks/balancer-hook-event-subscriber.js.map +1 -1
  79. package/build/dex/ekubo-v3/config.d.ts +13 -0
  80. package/build/dex/ekubo-v3/config.js +23 -0
  81. package/build/dex/ekubo-v3/config.js.map +1 -0
  82. package/build/dex/ekubo-v3/ekubo-v3-pool-manager.d.ts +34 -0
  83. package/build/dex/ekubo-v3/ekubo-v3-pool-manager.js +421 -0
  84. package/build/dex/ekubo-v3/ekubo-v3-pool-manager.js.map +1 -0
  85. package/build/dex/ekubo-v3/ekubo-v3.d.ts +38 -0
  86. package/build/dex/ekubo-v3/ekubo-v3.js +274 -0
  87. package/build/dex/ekubo-v3/ekubo-v3.js.map +1 -0
  88. package/build/dex/ekubo-v3/pools/base.d.ts +42 -0
  89. package/build/dex/ekubo-v3/pools/base.js +307 -0
  90. package/build/dex/ekubo-v3/pools/base.js.map +1 -0
  91. package/build/dex/ekubo-v3/pools/full-range.d.ts +25 -0
  92. package/build/dex/ekubo-v3/pools/full-range.js +105 -0
  93. package/build/dex/ekubo-v3/pools/full-range.js.map +1 -0
  94. package/build/dex/ekubo-v3/pools/math/constants.d.ts +12 -0
  95. package/build/dex/ekubo-v3/pools/math/constants.js +16 -0
  96. package/build/dex/ekubo-v3/pools/math/constants.js.map +1 -0
  97. package/build/dex/ekubo-v3/pools/math/delta.d.ts +2 -0
  98. package/build/dex/ekubo-v3/pools/math/delta.js +51 -0
  99. package/build/dex/ekubo-v3/pools/math/delta.js.map +1 -0
  100. package/build/dex/ekubo-v3/pools/math/sqrt-ratio.d.ts +8 -0
  101. package/build/dex/ekubo-v3/pools/math/sqrt-ratio.js +113 -0
  102. package/build/dex/ekubo-v3/pools/math/sqrt-ratio.js.map +1 -0
  103. package/build/dex/ekubo-v3/pools/math/swap.d.ts +18 -0
  104. package/build/dex/ekubo-v3/pools/math/swap.js +128 -0
  105. package/build/dex/ekubo-v3/pools/math/swap.js.map +1 -0
  106. package/build/dex/ekubo-v3/pools/math/tick.d.ts +8 -0
  107. package/build/dex/ekubo-v3/pools/math/tick.js +129 -0
  108. package/build/dex/ekubo-v3/pools/math/tick.js.map +1 -0
  109. package/build/dex/ekubo-v3/pools/math/twamm/exp2.d.ts +1 -0
  110. package/build/dex/ekubo-v3/pools/math/twamm/exp2.js +86 -0
  111. package/build/dex/ekubo-v3/pools/math/twamm/exp2.js.map +1 -0
  112. package/build/dex/ekubo-v3/pools/math/twamm/sqrt-ratio.d.ts +1 -0
  113. package/build/dex/ekubo-v3/pools/math/twamm/sqrt-ratio.js +56 -0
  114. package/build/dex/ekubo-v3/pools/math/twamm/sqrt-ratio.js.map +1 -0
  115. package/build/dex/ekubo-v3/pools/mev-capture.d.ts +8 -0
  116. package/build/dex/ekubo-v3/pools/mev-capture.js +42 -0
  117. package/build/dex/ekubo-v3/pools/mev-capture.js.map +1 -0
  118. package/build/dex/ekubo-v3/pools/oracle.d.ts +8 -0
  119. package/build/dex/ekubo-v3/pools/oracle.js +18 -0
  120. package/build/dex/ekubo-v3/pools/oracle.js.map +1 -0
  121. package/build/dex/ekubo-v3/pools/pool.d.ts +56 -0
  122. package/build/dex/ekubo-v3/pools/pool.js +88 -0
  123. package/build/dex/ekubo-v3/pools/pool.js.map +1 -0
  124. package/build/dex/ekubo-v3/pools/stableswap.d.ts +22 -0
  125. package/build/dex/ekubo-v3/pools/stableswap.js +123 -0
  126. package/build/dex/ekubo-v3/pools/stableswap.js.map +1 -0
  127. package/build/dex/ekubo-v3/pools/twamm.d.ts +40 -0
  128. package/build/dex/ekubo-v3/pools/twamm.js +265 -0
  129. package/build/dex/ekubo-v3/pools/twamm.js.map +1 -0
  130. package/build/dex/ekubo-v3/pools/utils.d.ts +62 -0
  131. package/build/dex/ekubo-v3/pools/utils.js +160 -0
  132. package/build/dex/ekubo-v3/pools/utils.js.map +1 -0
  133. package/build/dex/ekubo-v3/types.d.ts +58 -0
  134. package/build/dex/ekubo-v3/types.js +3 -0
  135. package/build/dex/ekubo-v3/types.js.map +1 -0
  136. package/build/dex/ekubo-v3/utils.d.ts +10 -0
  137. package/build/dex/ekubo-v3/utils.js +54 -0
  138. package/build/dex/ekubo-v3/utils.js.map +1 -0
  139. package/build/dex/infusion/infusion-stable-pool.d.ts +1 -1
  140. package/build/dex/infusion/infusion-stable-pool.js +1 -1
  141. package/build/dex/infusion/infusion-stable-pool.js.map +1 -1
  142. package/build/dex/infusion/infusion.d.ts +3 -3
  143. package/build/dex/infusion/infusion.js +65 -104
  144. package/build/dex/infusion/infusion.js.map +1 -1
  145. package/build/dex/maker-psm/maker-psm-event-pool.d.ts +43 -0
  146. package/build/dex/maker-psm/maker-psm-event-pool.js +132 -0
  147. package/build/dex/maker-psm/maker-psm-event-pool.js.map +1 -0
  148. package/build/dex/miro-migrator/miro-migrator-state.d.ts +27 -0
  149. package/build/dex/miro-migrator/miro-migrator-state.js +89 -0
  150. package/build/dex/miro-migrator/miro-migrator-state.js.map +1 -0
  151. package/build/dex/solidly/forks-override/aerodrome.d.ts +1 -1
  152. package/build/dex/solidly/forks-override/aerodrome.js +18 -14
  153. package/build/dex/solidly/forks-override/aerodrome.js.map +1 -1
  154. package/build/dex/{usual-bond → stabull}/config.d.ts +1 -1
  155. package/build/dex/stabull/config.js +177 -0
  156. package/build/dex/stabull/config.js.map +1 -0
  157. package/build/dex/{se-vlr/se-vlr-pool.d.ts → stabull/stabull-pool.d.ts} +13 -6
  158. package/build/dex/stabull/stabull-pool.js +113 -0
  159. package/build/dex/stabull/stabull-pool.js.map +1 -0
  160. package/build/dex/stabull/stabull.d.ts +55 -0
  161. package/build/dex/stabull/stabull.js +286 -0
  162. package/build/dex/stabull/stabull.js.map +1 -0
  163. package/build/dex/stabull/types.d.ts +21 -0
  164. package/build/dex/stabull/types.js +3 -0
  165. package/build/dex/stabull/types.js.map +1 -0
  166. package/build/dex/uniswap-v3/forks/pangolin-v3/utils.d.ts +4 -0
  167. package/build/dex/uniswap-v3/forks/pangolin-v3/utils.js +56 -0
  168. package/build/dex/uniswap-v3/forks/pangolin-v3/utils.js.map +1 -0
  169. package/build/dex/uniswap-v4/contract-math/Position.d.ts +6 -0
  170. package/build/dex/uniswap-v4/contract-math/Position.js +29 -0
  171. package/build/dex/uniswap-v4/contract-math/Position.js.map +1 -1
  172. package/build/dex/uniswap-v4/hooks/arena.d.ts +6 -0
  173. package/build/dex/uniswap-v4/hooks/arena.js +10 -0
  174. package/build/dex/uniswap-v4/hooks/arena.js.map +1 -0
  175. package/build/dex/uniswap-v4/hooks/base-fee/base-fee-hook.d.ts +0 -0
  176. package/build/dex/uniswap-v4/hooks/base-fee/base-fee-hook.js +2 -0
  177. package/build/dex/uniswap-v4/hooks/base-fee/base-fee-hook.js.map +1 -0
  178. package/build/dex/uniswap-v4/hooks/cabalcoin-hook/cabalcoin-hook-pool.d.ts +7 -0
  179. package/build/dex/uniswap-v4/hooks/cabalcoin-hook/cabalcoin-hook-pool.js +28 -0
  180. package/build/dex/uniswap-v4/hooks/cabalcoin-hook/cabalcoin-hook-pool.js.map +1 -0
  181. package/build/dex/uniswap-v4/hooks/cabalcoin-hook/types.d.ts +0 -0
  182. package/build/dex/uniswap-v4/hooks/cabalcoin-hook/types.js +2 -0
  183. package/build/dex/uniswap-v4/hooks/cabalcoin-hook/types.js.map +1 -0
  184. package/build/dex/uniswap-v4/hooks/fee-hook/fee-hook-pool.d.ts +7 -0
  185. package/build/dex/uniswap-v4/hooks/fee-hook/fee-hook-pool.js +28 -0
  186. package/build/dex/uniswap-v4/hooks/fee-hook/fee-hook-pool.js.map +1 -0
  187. package/build/dex/uniswap-v4/hooks/fee-hook/types.d.ts +0 -0
  188. package/build/dex/uniswap-v4/hooks/fee-hook/types.js +2 -0
  189. package/build/dex/uniswap-v4/hooks/fee-hook/types.js.map +1 -0
  190. package/build/dex/uniswap-v4/hooks/index.d.ts +1 -0
  191. package/build/dex/uniswap-v4/hooks/index.js +18 -0
  192. package/build/dex/uniswap-v4/hooks/index.js.map +1 -0
  193. package/build/dex/uniswap-v4/hooks/spot.d.ts +15 -0
  194. package/build/dex/uniswap-v4/hooks/spot.js +109 -0
  195. package/build/dex/uniswap-v4/hooks/spot.js.map +1 -0
  196. package/build/dex/uniswap-v4/hooks/template.d.ts +150 -0
  197. package/build/dex/uniswap-v4/hooks/template.js +104 -0
  198. package/build/dex/uniswap-v4/hooks/template.js.map +1 -0
  199. package/build/dex/usdc-transmuter/usdc-transmuter-pool.d.ts +26 -0
  200. package/build/dex/usdc-transmuter/usdc-transmuter-pool.js +75 -0
  201. package/build/dex/usdc-transmuter/usdc-transmuter-pool.js.map +1 -0
  202. package/build/dex/usual/usual-usdc-usdc.d.ts +17 -0
  203. package/build/dex/usual/usual-usdc-usdc.js +59 -0
  204. package/build/dex/usual/usual-usdc-usdc.js.map +1 -0
  205. package/build/dex/{se-vlr → yo}/config.d.ts +1 -1
  206. package/build/dex/yo/config.js +21 -0
  207. package/build/dex/yo/config.js.map +1 -0
  208. package/build/dex/yo/types.d.ts +13 -0
  209. package/build/dex/yo/types.js +3 -0
  210. package/build/dex/{se-vlr → yo}/types.js.map +1 -1
  211. package/build/dex/yo/yo-pool.d.ts +13 -0
  212. package/build/dex/yo/yo-pool.js +26 -0
  213. package/build/dex/yo/yo-pool.js.map +1 -0
  214. package/build/dex/yo/yo.d.ts +39 -0
  215. package/build/dex/yo/yo.js +248 -0
  216. package/build/dex/yo/yo.js.map +1 -0
  217. package/build/implementations/api-paraswap-sdk.d.ts +25 -0
  218. package/build/implementations/api-paraswap-sdk.js +102 -0
  219. package/build/implementations/api-paraswap-sdk.js.map +1 -0
  220. package/package.json +1 -1
  221. package/build/abi/Jarvis.json +0 -1172
  222. package/build/abi/Onebit.json +0 -736
  223. package/build/abi/Shell.json +0 -1294
  224. package/build/abi/TraderJoeV2Router.json +0 -50
  225. package/build/abi/wUSDM.json +0 -757
  226. package/build/abi/zrx.v2.json +0 -1967
  227. package/build/abi/zrx.v3.json +0 -3454
  228. package/build/abi/zrx.v4.json +0 -2193
  229. package/build/dex/OneInchLp.d.ts +0 -24
  230. package/build/dex/OneInchLp.js +0 -43
  231. package/build/dex/OneInchLp.js.map +0 -1
  232. package/build/dex/bProtocol/bProtocol.d.ts +0 -15
  233. package/build/dex/bProtocol/bProtocol.js +0 -56
  234. package/build/dex/bProtocol/bProtocol.js.map +0 -1
  235. package/build/dex/bProtocol/types.d.ts +0 -11
  236. package/build/dex/bProtocol/types.js +0 -8
  237. package/build/dex/bProtocol/types.js.map +0 -1
  238. package/build/dex/jarvis.d.ts +0 -56
  239. package/build/dex/jarvis.js +0 -163
  240. package/build/dex/jarvis.js.map +0 -1
  241. package/build/dex/mStable.d.ts +0 -44
  242. package/build/dex/mStable.js +0 -75
  243. package/build/dex/mStable.js.map +0 -1
  244. package/build/dex/onebit/onebit.d.ts +0 -16
  245. package/build/dex/onebit/onebit.js +0 -61
  246. package/build/dex/onebit/onebit.js.map +0 -1
  247. package/build/dex/onebit/types.d.ts +0 -14
  248. package/build/dex/onebit/types.js +0 -8
  249. package/build/dex/onebit/types.js.map +0 -1
  250. package/build/dex/se-vlr/config.js +0 -24
  251. package/build/dex/se-vlr/config.js.map +0 -1
  252. package/build/dex/se-vlr/se-vlr-pool.js +0 -70
  253. package/build/dex/se-vlr/se-vlr-pool.js.map +0 -1
  254. package/build/dex/se-vlr/se-vlr.d.ts +0 -35
  255. package/build/dex/se-vlr/se-vlr.js +0 -131
  256. package/build/dex/se-vlr/se-vlr.js.map +0 -1
  257. package/build/dex/se-vlr/types.d.ts +0 -6
  258. package/build/dex/shell.d.ts +0 -25
  259. package/build/dex/shell.js +0 -41
  260. package/build/dex/shell.js.map +0 -1
  261. package/build/dex/trader-joe-v2.d.ts +0 -40
  262. package/build/dex/trader-joe-v2.js +0 -74
  263. package/build/dex/trader-joe-v2.js.map +0 -1
  264. package/build/dex/uniswap-v3/uniswap-v3-new.d.ts +0 -94
  265. package/build/dex/uniswap-v3/uniswap-v3-new.js +0 -923
  266. package/build/dex/uniswap-v3/uniswap-v3-new.js.map +0 -1
  267. package/build/dex/usual-bond/config.js +0 -13
  268. package/build/dex/usual-bond/config.js.map +0 -1
  269. package/build/dex/usual-bond/types.d.ts +0 -7
  270. package/build/dex/usual-bond/usual-bond.js +0 -176
  271. package/build/dex/usual-bond/usual-bond.js.map +0 -1
  272. package/build/dex/wusdm/config.d.ts +0 -3
  273. package/build/dex/wusdm/config.js +0 -43
  274. package/build/dex/wusdm/config.js.map +0 -1
  275. package/build/dex/wusdm/constants.d.ts +0 -2
  276. package/build/dex/wusdm/constants.js +0 -6
  277. package/build/dex/wusdm/constants.js.map +0 -1
  278. package/build/dex/wusdm/types.d.ts +0 -18
  279. package/build/dex/wusdm/types.js +0 -11
  280. package/build/dex/wusdm/types.js.map +0 -1
  281. package/build/dex/wusdm/wusdm-pool.d.ts +0 -21
  282. package/build/dex/wusdm/wusdm-pool.js +0 -74
  283. package/build/dex/wusdm/wusdm-pool.js.map +0 -1
  284. package/build/dex/wusdm/wusdm.d.ts +0 -46
  285. package/build/dex/wusdm/wusdm.js +0 -243
  286. package/build/dex/wusdm/wusdm.js.map +0 -1
  287. package/build/dex/zerox/config.d.ts +0 -2
  288. package/build/dex/zerox/config.js +0 -33
  289. package/build/dex/zerox/config.js.map +0 -1
  290. package/build/dex/zerox/index.d.ts +0 -22
  291. package/build/dex/zerox/index.js +0 -225
  292. package/build/dex/zerox/index.js.map +0 -1
  293. package/build/dex/zerox/order.d.ts +0 -88
  294. package/build/dex/zerox/order.js +0 -53
  295. package/build/dex/zerox/order.js.map +0 -1
  296. package/build/dex/zerox/types.d.ts +0 -73
  297. package/build/dex/zerox/types.js +0 -21
  298. package/build/dex/zerox/types.js.map +0 -1
  299. /package/build/dex/{se-vlr → aave-pt-to-underlying}/types.js +0 -0
  300. /package/build/dex/{usual-bond → aave-pt-to-usdc}/types.js +0 -0
@@ -0,0 +1,8 @@
1
+ import { DeepReadonly } from 'ts-essentials';
2
+ import { FullRangePool, FullRangePoolState } from './full-range';
3
+ import { PoolKeyed, Quote } from './pool';
4
+ import { StableswapPoolTypeConfig } from './utils';
5
+ export declare class OraclePool extends FullRangePool {
6
+ protected _quote(amount: bigint, isToken1: boolean, state: DeepReadonly<FullRangePoolState.Object>, sqrtRatioLimit?: bigint): Quote;
7
+ quoteOracle(this: PoolKeyed<StableswapPoolTypeConfig>, amount: bigint, isToken1: boolean, state: DeepReadonly<FullRangePoolState.Object>, sqrtRatioLimit?: bigint): Quote;
8
+ }
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OraclePool = void 0;
4
+ const full_range_1 = require("./full-range");
5
+ // TODO
6
+ const BASE_GAS_COST_OF_ONE_ORACLE_SWAP = 32_000;
7
+ class OraclePool extends full_range_1.FullRangePool {
8
+ _quote(amount, isToken1, state, sqrtRatioLimit) {
9
+ return this.quoteOracle(amount, isToken1, state, sqrtRatioLimit);
10
+ }
11
+ quoteOracle(amount, isToken1, state, sqrtRatioLimit) {
12
+ const fullRangeQuote = full_range_1.FullRangePool.prototype.quoteFullRange.call(this, amount, isToken1, state, sqrtRatioLimit);
13
+ fullRangeQuote.gasConsumed = BASE_GAS_COST_OF_ONE_ORACLE_SWAP;
14
+ return fullRangeQuote;
15
+ }
16
+ }
17
+ exports.OraclePool = OraclePool;
18
+ //# sourceMappingURL=oracle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oracle.js","sourceRoot":"","sources":["../../../../src/dex/ekubo-v3/pools/oracle.ts"],"names":[],"mappings":";;;AACA,6CAAiE;AAIjE,OAAO;AACP,MAAM,gCAAgC,GAAG,MAAM,CAAC;AAEhD,MAAa,UAAW,SAAQ,0BAAa;IACxB,MAAM,CACvB,MAAc,EACd,QAAiB,EACjB,KAA8C,EAC9C,cAAuB;QAEvB,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC;IACnE,CAAC;IAEM,WAAW,CAEhB,MAAc,EACd,QAAiB,EACjB,KAA8C,EAC9C,cAAuB;QAEvB,MAAM,cAAc,GAAG,0BAAa,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAChE,IAAI,EACJ,MAAM,EACN,QAAQ,EACR,KAAK,EACL,cAAc,CACf,CAAC;QAEF,cAAc,CAAC,WAAW,GAAG,gCAAgC,CAAC;QAE9D,OAAO,cAAc,CAAC;IACxB,CAAC;CACF;AA7BD,gCA6BC"}
@@ -0,0 +1,56 @@
1
+ import { Interface, Result } from '@ethersproject/abi';
2
+ import { Logger } from 'log4js';
3
+ import { DeepReadonly } from 'ts-essentials';
4
+ import { IDexHelper } from '../../../dex-helper/idex-helper';
5
+ import { StatefulEventSubscriber } from '../../../stateful-event-subscriber';
6
+ import { BlockHeader, Log } from '../../../types';
7
+ import { PoolKey, PoolTypeConfig } from './utils';
8
+ import { EventSubscriber } from '../../../dex-helper';
9
+ export type Quote<StateAfter = undefined> = {
10
+ consumedAmount: bigint;
11
+ calculatedAmount: bigint;
12
+ gasConsumed: number;
13
+ skipAhead: number;
14
+ } & (StateAfter extends undefined ? {} : {
15
+ stateAfter: StateAfter;
16
+ });
17
+ export interface PoolKeyed<C extends PoolTypeConfig> {
18
+ key: PoolKey<C>;
19
+ }
20
+ export interface IEkuboPool<C extends PoolTypeConfig> extends PoolKeyed<C>, EventSubscriber {
21
+ initializationBlockNumber(): number;
22
+ quote(amount: bigint, token: bigint, blockNumber: number): Quote;
23
+ updateState(blockNumber: number): Promise<void>;
24
+ computeTvl(): [bigint, bigint];
25
+ }
26
+ export type NamedEventHandler<State> = (args: Result, oldState: DeepReadonly<State>, blockHeader: Readonly<BlockHeader>) => DeepReadonly<State> | null;
27
+ export type AnonymousEventHandler<State> = (data: string, oldState: DeepReadonly<State>, blockHeader: Readonly<BlockHeader>) => DeepReadonly<State> | null;
28
+ export declare class NamedEventHandlers<State> {
29
+ private readonly iface;
30
+ private readonly handlers;
31
+ constructor(iface: Interface, handlers: Record<string, NamedEventHandler<State>>);
32
+ parseLog(log: Readonly<Log>, oldState: DeepReadonly<State>, blockHeader: Readonly<BlockHeader>): DeepReadonly<State> | null;
33
+ }
34
+ export declare abstract class EkuboPool<C extends PoolTypeConfig, S> extends StatefulEventSubscriber<S> implements IEkuboPool<C> {
35
+ private readonly initBlockNumber;
36
+ readonly key: PoolKey<C>;
37
+ private readonly namedEventHandlers;
38
+ private readonly anonymousEventHandlers;
39
+ protected constructor(parentName: string, dexHelper: IDexHelper, logger: Logger, initBlockNumber: number, key: PoolKey<C>, namedEventHandlers: Record<string, NamedEventHandlers<S>>, anonymousEventHandlers: Record<string, AnonymousEventHandler<S>>);
40
+ initializationBlockNumber(): number;
41
+ updateState(blockNumber: number): Promise<void>;
42
+ quote(amount: bigint, token: bigint, blockNumber: number): Quote;
43
+ computeTvl(): [bigint, bigint];
44
+ /**
45
+ * The function is called every time any of the subscribed
46
+ * addresses release log. The function accepts the current
47
+ * state, updates the state according to the log, and returns
48
+ * the updated state.
49
+ * @param state - Current state of event subscriber
50
+ * @param log - Log released by one of the subscribed addresses
51
+ * @returns Updates state of the event subscriber after the log
52
+ */
53
+ protected processLog(state: DeepReadonly<S>, log: Readonly<Log>, blockHeader: Readonly<BlockHeader>): DeepReadonly<S> | null;
54
+ protected abstract _quote(amount: bigint, isToken1: boolean, state: DeepReadonly<S>, sqrtRatioLimit?: bigint): Quote;
55
+ protected abstract _computeTvl(state: DeepReadonly<S>): [bigint, bigint];
56
+ }
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EkuboPool = exports.NamedEventHandlers = void 0;
4
+ const stateful_event_subscriber_1 = require("../../../stateful-event-subscriber");
5
+ class NamedEventHandlers {
6
+ iface;
7
+ handlers;
8
+ constructor(iface, handlers) {
9
+ this.iface = iface;
10
+ this.handlers = handlers;
11
+ }
12
+ parseLog(log, oldState, blockHeader) {
13
+ const event = this.iface.parseLog(log);
14
+ return (this.handlers[event.name]?.(event.args, oldState, blockHeader) ?? null);
15
+ }
16
+ }
17
+ exports.NamedEventHandlers = NamedEventHandlers;
18
+ class EkuboPool extends stateful_event_subscriber_1.StatefulEventSubscriber {
19
+ initBlockNumber;
20
+ key;
21
+ namedEventHandlers;
22
+ anonymousEventHandlers;
23
+ constructor(parentName, dexHelper, logger, initBlockNumber, key, namedEventHandlers, anonymousEventHandlers) {
24
+ super(parentName, key.stringId, dexHelper, logger);
25
+ this.initBlockNumber = initBlockNumber;
26
+ this.key = key;
27
+ this.namedEventHandlers = namedEventHandlers;
28
+ this.anonymousEventHandlers = anonymousEventHandlers;
29
+ this.addressesSubscribed = [
30
+ ...new Set(Object.keys(namedEventHandlers).concat(Object.keys(anonymousEventHandlers))),
31
+ ];
32
+ }
33
+ initializationBlockNumber() {
34
+ return this.initBlockNumber;
35
+ }
36
+ async updateState(blockNumber) {
37
+ this.setState(await this.generateState(blockNumber), blockNumber);
38
+ }
39
+ quote(amount, token, blockNumber) {
40
+ const isToken1 = token === this.key.token1;
41
+ if (!isToken1 && this.key.token0 !== token) {
42
+ throw new Error('Invalid token');
43
+ }
44
+ if (amount === 0n) {
45
+ return {
46
+ consumedAmount: 0n,
47
+ calculatedAmount: 0n,
48
+ gasConsumed: 0,
49
+ skipAhead: 0,
50
+ };
51
+ }
52
+ const state = this.getState(blockNumber);
53
+ if (state === null) {
54
+ throw new Error(`Quote for block number ${blockNumber} requested but state is not recent enough`);
55
+ }
56
+ const quote = this._quote(amount, isToken1, state);
57
+ if (quote.calculatedAmount === 0n) {
58
+ quote.gasConsumed = 0;
59
+ }
60
+ return quote;
61
+ }
62
+ computeTvl() {
63
+ const state = this.getStaleState();
64
+ if (state === null) {
65
+ throw new Error('pool has no state');
66
+ }
67
+ return this._computeTvl(state);
68
+ }
69
+ /**
70
+ * The function is called every time any of the subscribed
71
+ * addresses release log. The function accepts the current
72
+ * state, updates the state according to the log, and returns
73
+ * the updated state.
74
+ * @param state - Current state of event subscriber
75
+ * @param log - Log released by one of the subscribed addresses
76
+ * @returns Updates state of the event subscriber after the log
77
+ */
78
+ processLog(state, log, blockHeader) {
79
+ const emitter = log.address;
80
+ if (log.topics.length === 0) {
81
+ return this.anonymousEventHandlers[emitter]?.(log.data, state, blockHeader);
82
+ }
83
+ return (this.namedEventHandlers[emitter]?.parseLog(log, state, blockHeader) ??
84
+ null);
85
+ }
86
+ }
87
+ exports.EkuboPool = EkuboPool;
88
+ //# sourceMappingURL=pool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pool.js","sourceRoot":"","sources":["../../../../src/dex/ekubo-v3/pools/pool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import { DeepReadonly } from 'ts-essentials';
2
+ import { IDexHelper } from '../../../dex-helper/idex-helper';
3
+ import { Logger } from '../../../types';
4
+ import { EkuboContracts } from '../types';
5
+ import { EkuboPool, PoolKeyed, Quote } from './pool';
6
+ import { PoolKey, StableswapPoolTypeConfig } from './utils';
7
+ import { FullRangePoolState } from './full-range';
8
+ export declare class StableswapPool extends EkuboPool<StableswapPoolTypeConfig, FullRangePoolState.Object> {
9
+ readonly lowerPrice: bigint;
10
+ readonly upperPrice: bigint;
11
+ private readonly quoteDataFetcher;
12
+ constructor(parentName: string, dexHelper: IDexHelper, logger: Logger, contracts: EkuboContracts, initBlockNumber: number, key: PoolKey<StableswapPoolTypeConfig>);
13
+ generateState(blockNumber?: number | 'latest'): Promise<DeepReadonly<FullRangePoolState.Object>>;
14
+ protected _quote(amount: bigint, isToken1: boolean, state: DeepReadonly<FullRangePoolState.Object>, sqrtRatioLimit?: bigint): Quote;
15
+ quoteStableswap(this: PoolKeyed<StableswapPoolTypeConfig> & StableswapBounds, amount: bigint, isToken1: boolean, state: DeepReadonly<FullRangePoolState.Object>, sqrtRatioLimit?: bigint): Quote<FullRangePoolState.Object>;
16
+ protected _computeTvl(state: FullRangePoolState.Object): [bigint, bigint];
17
+ }
18
+ export interface StableswapBounds {
19
+ lowerPrice: bigint;
20
+ upperPrice: bigint;
21
+ }
22
+ export declare function computeStableswapBounds(config: StableswapPoolTypeConfig): StableswapBounds;
@@ -0,0 +1,123 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StableswapPool = void 0;
4
+ exports.computeStableswapBounds = computeStableswapBounds;
5
+ const pool_1 = require("./pool");
6
+ const swap_1 = require("./math/swap");
7
+ const tick_1 = require("./math/tick");
8
+ const utils_1 = require("./utils");
9
+ const delta_1 = require("./math/delta");
10
+ const base_1 = require("./base");
11
+ const full_range_1 = require("./full-range");
12
+ const GAS_COST_OF_ONE_STABLESWAP_SWAP = 16_818;
13
+ class StableswapPool extends pool_1.EkuboPool {
14
+ lowerPrice;
15
+ upperPrice;
16
+ quoteDataFetcher;
17
+ constructor(parentName, dexHelper, logger, contracts, initBlockNumber, key) {
18
+ const { contract: { address }, interface: iface, quoteDataFetcher, } = contracts.core;
19
+ super(parentName, dexHelper, logger, initBlockNumber, key, {
20
+ [address]: new pool_1.NamedEventHandlers(iface, {
21
+ PositionUpdated: (args, oldState) => full_range_1.FullRangePoolState.fromPositionUpdatedEvent(oldState, args.liquidityDelta.toBigInt()),
22
+ }),
23
+ }, {
24
+ [address]: data => full_range_1.FullRangePoolState.fromSwappedEvent((0, utils_1.parseSwappedEvent)(data)),
25
+ });
26
+ this.quoteDataFetcher = quoteDataFetcher;
27
+ const bounds = computeStableswapBounds(key.config.poolTypeConfig);
28
+ this.lowerPrice = bounds.lowerPrice;
29
+ this.upperPrice = bounds.upperPrice;
30
+ }
31
+ async generateState(blockNumber) {
32
+ const data = await this.quoteDataFetcher.getQuoteData([this.key.toAbi()], 0, {
33
+ blockTag: blockNumber,
34
+ });
35
+ return full_range_1.FullRangePoolState.fromQuoter(data[0]);
36
+ }
37
+ _quote(amount, isToken1, state, sqrtRatioLimit) {
38
+ return this.quoteStableswap(amount, isToken1, state, sqrtRatioLimit);
39
+ }
40
+ quoteStableswap(amount, isToken1, state, sqrtRatioLimit) {
41
+ const isIncreasing = (0, swap_1.isPriceIncreasing)(amount, isToken1);
42
+ let { sqrtRatio, liquidity } = state;
43
+ sqrtRatioLimit ??= isIncreasing ? tick_1.MAX_SQRT_RATIO : tick_1.MIN_SQRT_RATIO;
44
+ let calculatedAmount = 0n;
45
+ let initializedTicksCrossed = 0;
46
+ let amountRemaining = amount;
47
+ while (amountRemaining !== 0n && sqrtRatio !== sqrtRatioLimit) {
48
+ let stepLiquidity = liquidity;
49
+ const inRange = sqrtRatio < this.upperPrice && sqrtRatio > this.lowerPrice;
50
+ let nextTickSqrtRatio = null;
51
+ if (inRange) {
52
+ nextTickSqrtRatio = isIncreasing ? this.upperPrice : this.lowerPrice;
53
+ }
54
+ else {
55
+ stepLiquidity = 0n;
56
+ if (sqrtRatio <= this.lowerPrice) {
57
+ if (isIncreasing) {
58
+ nextTickSqrtRatio = this.lowerPrice;
59
+ }
60
+ }
61
+ else {
62
+ if (!isIncreasing) {
63
+ nextTickSqrtRatio = this.upperPrice;
64
+ }
65
+ }
66
+ }
67
+ const stepSqrtRatioLimit = nextTickSqrtRatio === null ||
68
+ nextTickSqrtRatio < sqrtRatioLimit !== isIncreasing
69
+ ? sqrtRatioLimit
70
+ : nextTickSqrtRatio;
71
+ const step = (0, swap_1.computeStep)({
72
+ fee: this.key.config.fee,
73
+ sqrtRatio,
74
+ liquidity: stepLiquidity,
75
+ isToken1,
76
+ sqrtRatioLimit: stepSqrtRatioLimit,
77
+ amount: amountRemaining,
78
+ });
79
+ amountRemaining -= step.consumedAmount;
80
+ calculatedAmount += step.calculatedAmount;
81
+ sqrtRatio = step.sqrtRatioNext;
82
+ if (sqrtRatio === nextTickSqrtRatio) {
83
+ initializedTicksCrossed++;
84
+ }
85
+ }
86
+ return {
87
+ consumedAmount: amount - amountRemaining,
88
+ calculatedAmount,
89
+ gasConsumed: GAS_COST_OF_ONE_STABLESWAP_SWAP +
90
+ (0, base_1.initializedTicksCrossedGasCosts)(initializedTicksCrossed),
91
+ skipAhead: 0,
92
+ stateAfter: {
93
+ sqrtRatio,
94
+ liquidity,
95
+ },
96
+ };
97
+ }
98
+ _computeTvl(state) {
99
+ const { sqrtRatio, liquidity } = state;
100
+ let [amount0, amount1] = [0n, 0n];
101
+ if (sqrtRatio < this.upperPrice) {
102
+ amount0 = (0, delta_1.amount0Delta)(sqrtRatio, this.upperPrice, liquidity, false);
103
+ }
104
+ if (sqrtRatio > this.lowerPrice) {
105
+ amount1 = (0, delta_1.amount1Delta)(this.lowerPrice, sqrtRatio, liquidity, false);
106
+ }
107
+ return [amount0, amount1];
108
+ }
109
+ }
110
+ exports.StableswapPool = StableswapPool;
111
+ function computeStableswapBounds(config) {
112
+ const { centerTick, amplificationFactor } = config;
113
+ const liquidityWidth = tick_1.MAX_TICK >> amplificationFactor;
114
+ const [lowerTick, upperTick] = [
115
+ centerTick - liquidityWidth,
116
+ centerTick + liquidityWidth,
117
+ ];
118
+ return {
119
+ lowerPrice: lowerTick > tick_1.MIN_TICK ? (0, tick_1.toSqrtRatio)(lowerTick) : tick_1.MIN_SQRT_RATIO,
120
+ upperPrice: upperTick < tick_1.MAX_TICK ? (0, tick_1.toSqrtRatio)(upperTick) : tick_1.MAX_SQRT_RATIO,
121
+ };
122
+ }
123
+ //# sourceMappingURL=stableswap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stableswap.js","sourceRoot":"","sources":["../../../../src/dex/ekubo-v3/pools/stableswap.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import { Logger } from 'log4js';
2
+ import { DeepReadonly } from 'ts-essentials';
3
+ import { IDexHelper } from '../../../dex-helper/idex-helper';
4
+ import { EkuboContracts, PoolInitializationState, TwammQuoteData } from '../types';
5
+ import { FullRangePoolState } from './full-range';
6
+ import { EkuboPool, Quote } from './pool';
7
+ import { PoolKey, StableswapPoolTypeConfig, SwappedEvent } from './utils';
8
+ export declare class TwammPool extends EkuboPool<StableswapPoolTypeConfig, TwammPoolState.Object> {
9
+ private readonly twammDataFetcher;
10
+ constructor(parentName: string, dexHelper: IDexHelper, logger: Logger, contracts: EkuboContracts, initBlockNumber: number, key: PoolKey<StableswapPoolTypeConfig>);
11
+ generateState(blockNumber?: number | 'latest'): Promise<DeepReadonly<TwammPoolState.Object>>;
12
+ protected _quote(amount: bigint, isToken1: boolean, state: DeepReadonly<TwammPoolState.Object>): Quote;
13
+ quoteTwamm(amount: bigint, isToken1: boolean, state: DeepReadonly<TwammPoolState.Object>, overrideTime?: bigint): Quote;
14
+ protected _computeTvl(state: TwammPoolState.Object): [bigint, bigint];
15
+ }
16
+ interface VirtualOrdersExecutedEvent {
17
+ token0SaleRate: bigint;
18
+ token1SaleRate: bigint;
19
+ }
20
+ export declare namespace TwammPoolState {
21
+ interface SaleRateDelta {
22
+ time: bigint;
23
+ saleRateDelta0: bigint;
24
+ saleRateDelta1: bigint;
25
+ }
26
+ interface Object {
27
+ fullRangePoolState: FullRangePoolState.Object;
28
+ token0SaleRate: bigint;
29
+ token1SaleRate: bigint;
30
+ lastExecutionTime: bigint;
31
+ virtualOrderDeltas: SaleRateDelta[];
32
+ }
33
+ function fromPoolInitialization(state: PoolInitializationState): DeepReadonly<Object>;
34
+ function fromQuoter(data: TwammQuoteData): DeepReadonly<Object>;
35
+ function fromSwappedEvent(oldState: DeepReadonly<Object>, ev: SwappedEvent): Object;
36
+ function fromPositionUpdatedEvent(oldState: DeepReadonly<Object>, liquidityDelta: bigint): Object | null;
37
+ function fromVirtualOrdersExecutedEvent(oldState: DeepReadonly<Object>, ev: VirtualOrdersExecutedEvent, timestamp: bigint): Object;
38
+ function fromOrderUpdatedEvent(oldState: DeepReadonly<Object>, [startTime, endTime]: [bigint, bigint], orderSaleRateDelta: bigint, isToken1: boolean): Object | null;
39
+ }
40
+ export {};
@@ -0,0 +1,265 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TwammPoolState = exports.TwammPool = void 0;
4
+ const full_range_1 = require("./full-range");
5
+ const pool_1 = require("./pool");
6
+ const constants_1 = require("./math/constants");
7
+ const sqrt_ratio_1 = require("./math/sqrt-ratio");
8
+ const tick_1 = require("./math/tick");
9
+ const sqrt_ratio_2 = require("./math/twamm/sqrt-ratio");
10
+ const utils_1 = require("./utils");
11
+ const base_1 = require("./base");
12
+ const utils_2 = require("ethers/lib/utils");
13
+ const utils_3 = require("../utils");
14
+ const SLOT_DURATION_SECS = 12n;
15
+ const BASE_GAS_COST_OF_ONE_TWAMM_SWAP = 30_716;
16
+ // TODO
17
+ const BASE_GAS_COST_OF_ONE_TWAMM_FULL_RANGE_SWAP = 19_000;
18
+ const GAS_COST_OF_ONE_VIRTUAL_ORDER_DELTA = 7_500;
19
+ const LOG_BASE_256 = Math.log(256);
20
+ class TwammPool extends pool_1.EkuboPool {
21
+ twammDataFetcher;
22
+ constructor(parentName, dexHelper, logger, contracts, initBlockNumber, key) {
23
+ const { contract: { address: coreAddress }, interface: coreIface, } = contracts.core;
24
+ const { contract: { address: twammAddress }, interface: twammIface, quoteDataFetcher: twammDataFetcher, } = contracts.twamm;
25
+ super(parentName, dexHelper, logger, initBlockNumber, key, {
26
+ [coreAddress]: new pool_1.NamedEventHandlers(coreIface, {
27
+ PositionUpdated: (args, oldState) => TwammPoolState.fromPositionUpdatedEvent(oldState, args.liquidityDelta.toBigInt()),
28
+ }),
29
+ [twammAddress]: new pool_1.NamedEventHandlers(twammIface, {
30
+ OrderUpdated: (args, oldState) => {
31
+ const orderKey = args.orderKey;
32
+ if (key.token0 !== BigInt(orderKey.token0) ||
33
+ key.token1 !== BigInt(orderKey.token1) ||
34
+ key.config.fee !== BigInt((0, utils_2.hexDataSlice)(orderKey.config, 0, 8))) {
35
+ return null;
36
+ }
37
+ const isToken1 = Boolean(Number((0, utils_2.hexDataSlice)(orderKey.config, 8, 9)));
38
+ return TwammPoolState.fromOrderUpdatedEvent(oldState, [
39
+ BigInt((0, utils_2.hexDataSlice)(orderKey.config, 16, 24)),
40
+ BigInt((0, utils_2.hexDataSlice)(orderKey.config, 24, 32)),
41
+ ], args.saleRateDelta.toBigInt(), isToken1);
42
+ },
43
+ }),
44
+ }, {
45
+ [coreAddress]: (data, oldState) => TwammPoolState.fromSwappedEvent(oldState, (0, utils_1.parseSwappedEvent)(data)),
46
+ [twammAddress]: (data, oldState, blockHeader) => TwammPoolState.fromVirtualOrdersExecutedEvent(oldState, parseVirtualOrdersExecutedEvent(data), BigInt(blockHeader.timestamp)),
47
+ });
48
+ this.twammDataFetcher = twammDataFetcher;
49
+ }
50
+ async generateState(blockNumber) {
51
+ const quoteData = await this.twammDataFetcher.getPoolState(this.key.toAbi(), {
52
+ blockTag: blockNumber,
53
+ });
54
+ return TwammPoolState.fromQuoter(quoteData);
55
+ }
56
+ _quote(amount, isToken1, state) {
57
+ return this.quoteTwamm(amount, isToken1, state);
58
+ }
59
+ quoteTwamm(amount, isToken1, state, overrideTime) {
60
+ const currentTime = overrideTime ??
61
+ (0, utils_3.bigintMax)(state.lastExecutionTime + SLOT_DURATION_SECS, BigInt(Math.floor(Date.now() / 1000)));
62
+ const fee = this.key.config.fee;
63
+ const quoteFullRangePool = full_range_1.FullRangePool.prototype.quoteFullRange.bind(this);
64
+ const liquidity = state.fullRangePoolState.liquidity;
65
+ let nextSqrtRatio = state.fullRangePoolState.sqrtRatio;
66
+ let token0SaleRate = state.token0SaleRate;
67
+ let token1SaleRate = state.token1SaleRate;
68
+ let lastExecutionTime = state.lastExecutionTime;
69
+ let virtualOrderDeltaTimesCrossed = 0;
70
+ let swapCount = 0;
71
+ let nextSaleRateDeltaIndex = state.virtualOrderDeltas.findIndex(srd => srd.time > lastExecutionTime);
72
+ let fullRangePoolState = state.fullRangePoolState;
73
+ while (lastExecutionTime != currentTime) {
74
+ const saleRateDelta = state.virtualOrderDeltas[nextSaleRateDeltaIndex];
75
+ const nextExecutionTime = saleRateDelta
76
+ ? (0, utils_3.bigintMin)(saleRateDelta.time, currentTime)
77
+ : currentTime;
78
+ const timeElapsed = nextExecutionTime - lastExecutionTime;
79
+ if (timeElapsed > constants_1.MAX_U32) {
80
+ throw new Error('Too much time passed since last execution');
81
+ }
82
+ const [amount0, amount1] = [
83
+ (token0SaleRate * BigInt(timeElapsed)) >> 32n,
84
+ (token1SaleRate * BigInt(timeElapsed)) >> 32n,
85
+ ];
86
+ if (amount0 > 0n && amount1 > 0n) {
87
+ let currentSqrtRatio = nextSqrtRatio;
88
+ if (currentSqrtRatio > tick_1.MAX_SQRT_RATIO) {
89
+ currentSqrtRatio = tick_1.MAX_SQRT_RATIO;
90
+ }
91
+ else if (currentSqrtRatio < tick_1.MIN_SQRT_RATIO) {
92
+ currentSqrtRatio = tick_1.MIN_SQRT_RATIO;
93
+ }
94
+ nextSqrtRatio = (0, sqrt_ratio_2.calculateNextSqrtRatio)(currentSqrtRatio, liquidity, token0SaleRate, token1SaleRate, timeElapsed, fee);
95
+ const [amount, isToken1] = currentSqrtRatio < nextSqrtRatio ? [amount1, true] : [amount0, false];
96
+ const quote = quoteFullRangePool(amount, isToken1, fullRangePoolState, nextSqrtRatio);
97
+ swapCount++;
98
+ fullRangePoolState = quote.stateAfter;
99
+ }
100
+ else if (amount0 > 0n || amount1 > 0n) {
101
+ const [amount, isToken1] = amount0 !== 0n ? [amount0, false] : [amount1, true];
102
+ const quote = quoteFullRangePool(amount, isToken1, fullRangePoolState);
103
+ swapCount++;
104
+ fullRangePoolState = quote.stateAfter;
105
+ nextSqrtRatio = quote.stateAfter.sqrtRatio;
106
+ }
107
+ if (saleRateDelta) {
108
+ if (saleRateDelta.time === nextExecutionTime) {
109
+ token0SaleRate += saleRateDelta.saleRateDelta0;
110
+ token1SaleRate += saleRateDelta.saleRateDelta1;
111
+ nextSaleRateDeltaIndex++;
112
+ virtualOrderDeltaTimesCrossed++;
113
+ }
114
+ }
115
+ lastExecutionTime = nextExecutionTime;
116
+ }
117
+ const finalQuote = quoteFullRangePool(amount, isToken1, fullRangePoolState);
118
+ return {
119
+ calculatedAmount: finalQuote.calculatedAmount,
120
+ consumedAmount: finalQuote.consumedAmount,
121
+ gasConsumed: BASE_GAS_COST_OF_ONE_TWAMM_SWAP +
122
+ swapCount * BASE_GAS_COST_OF_ONE_TWAMM_FULL_RANGE_SWAP +
123
+ virtualOrderDeltaTimesCrossed * GAS_COST_OF_ONE_VIRTUAL_ORDER_DELTA +
124
+ (Math.log(Number(currentTime - state.lastExecutionTime)) /
125
+ LOG_BASE_256) *
126
+ base_1.GAS_COST_OF_ONE_EXTRA_BITMAP_SLOAD,
127
+ skipAhead: finalQuote.skipAhead,
128
+ };
129
+ }
130
+ _computeTvl(state) {
131
+ return full_range_1.FullRangePoolState.computeTvl(state.fullRangePoolState);
132
+ }
133
+ }
134
+ exports.TwammPool = TwammPool;
135
+ function parseVirtualOrdersExecutedEvent(data) {
136
+ let n = BigInt(data);
137
+ const token1SaleRate = BigInt.asUintN(112, n);
138
+ n >>= 112n;
139
+ const token0SaleRate = BigInt.asUintN(112, n);
140
+ return {
141
+ token0SaleRate,
142
+ token1SaleRate,
143
+ };
144
+ }
145
+ var TwammPoolState;
146
+ (function (TwammPoolState) {
147
+ function fromPoolInitialization(state) {
148
+ return {
149
+ fullRangePoolState: full_range_1.FullRangePoolState.fromPoolInitialization(state),
150
+ token0SaleRate: 0n,
151
+ token1SaleRate: 0n,
152
+ lastExecutionTime: BigInt(state.blockHeader.timestamp),
153
+ virtualOrderDeltas: [],
154
+ };
155
+ }
156
+ TwammPoolState.fromPoolInitialization = fromPoolInitialization;
157
+ function fromQuoter(data) {
158
+ const liquidity = data.liquidity.toBigInt();
159
+ const sqrtRatioFloat = data.sqrtRatio.toBigInt();
160
+ return {
161
+ fullRangePoolState: {
162
+ sqrtRatio: (0, sqrt_ratio_1.floatSqrtRatioToFixed)(sqrtRatioFloat),
163
+ liquidity,
164
+ },
165
+ token0SaleRate: data.saleRateToken0.toBigInt(),
166
+ token1SaleRate: data.saleRateToken1.toBigInt(),
167
+ lastExecutionTime: data.lastVirtualOrderExecutionTime.toBigInt(),
168
+ virtualOrderDeltas: data.saleRateDeltas.map(srd => ({
169
+ time: srd.time.toBigInt(),
170
+ saleRateDelta0: srd.saleRateDelta0.toBigInt(),
171
+ saleRateDelta1: srd.saleRateDelta1.toBigInt(),
172
+ })),
173
+ };
174
+ }
175
+ TwammPoolState.fromQuoter = fromQuoter;
176
+ function fromSwappedEvent(oldState, ev) {
177
+ const clonedState = structuredClone(oldState);
178
+ clonedState.fullRangePoolState.liquidity = ev.liquidityAfter;
179
+ clonedState.fullRangePoolState.sqrtRatio = ev.sqrtRatioAfter;
180
+ return clonedState;
181
+ }
182
+ TwammPoolState.fromSwappedEvent = fromSwappedEvent;
183
+ function fromPositionUpdatedEvent(oldState, liquidityDelta) {
184
+ if (liquidityDelta === 0n) {
185
+ return null;
186
+ }
187
+ const clonedState = structuredClone(oldState);
188
+ clonedState.fullRangePoolState.liquidity += liquidityDelta;
189
+ return clonedState;
190
+ }
191
+ TwammPoolState.fromPositionUpdatedEvent = fromPositionUpdatedEvent;
192
+ function fromVirtualOrdersExecutedEvent(oldState, ev, timestamp) {
193
+ const clonedState = structuredClone(oldState);
194
+ clonedState.lastExecutionTime = timestamp;
195
+ clonedState.token0SaleRate = ev.token0SaleRate;
196
+ clonedState.token1SaleRate = ev.token1SaleRate;
197
+ const virtualOrderDeltas = clonedState.virtualOrderDeltas;
198
+ for (let virtualOrder = virtualOrderDeltas[0]; typeof virtualOrder !== 'undefined'; virtualOrder = virtualOrderDeltas[0]) {
199
+ if (virtualOrder.time > timestamp) {
200
+ break;
201
+ }
202
+ virtualOrderDeltas.shift();
203
+ }
204
+ return clonedState;
205
+ }
206
+ TwammPoolState.fromVirtualOrdersExecutedEvent = fromVirtualOrdersExecutedEvent;
207
+ function fromOrderUpdatedEvent(oldState, [startTime, endTime], orderSaleRateDelta, isToken1) {
208
+ if (orderSaleRateDelta === 0n) {
209
+ return null;
210
+ }
211
+ const clonedState = structuredClone(oldState);
212
+ const virtualOrderDeltas = clonedState.virtualOrderDeltas;
213
+ let startIndex = 0;
214
+ for (const [time, saleRateDelta] of [
215
+ [startTime, orderSaleRateDelta],
216
+ [endTime, -orderSaleRateDelta],
217
+ ]) {
218
+ if (time > clonedState.lastExecutionTime) {
219
+ let idx = findOrderIndex(virtualOrderDeltas, time, startIndex);
220
+ if (idx < 0) {
221
+ idx = ~idx;
222
+ virtualOrderDeltas.splice(idx, 0, {
223
+ time,
224
+ saleRateDelta0: 0n,
225
+ saleRateDelta1: 0n,
226
+ });
227
+ }
228
+ const virtualOrderDelta = virtualOrderDeltas[idx];
229
+ virtualOrderDelta[`saleRateDelta${isToken1 ? '1' : '0'}`] +=
230
+ saleRateDelta;
231
+ if (virtualOrderDelta.saleRateDelta0 === 0n &&
232
+ virtualOrderDelta.saleRateDelta1 === 0n) {
233
+ virtualOrderDeltas.splice(idx, 1);
234
+ startIndex = idx;
235
+ }
236
+ else {
237
+ startIndex = idx + 1;
238
+ }
239
+ }
240
+ else {
241
+ clonedState[`token${isToken1 ? '1' : '0'}SaleRate`] += saleRateDelta;
242
+ }
243
+ }
244
+ return clonedState;
245
+ }
246
+ TwammPoolState.fromOrderUpdatedEvent = fromOrderUpdatedEvent;
247
+ function findOrderIndex(virtualOrderDeltas, searchTime, startIndex = 0) {
248
+ let l = startIndex, r = virtualOrderDeltas.length - 1;
249
+ while (l <= r) {
250
+ const mid = Math.floor((l + r) / 2);
251
+ const midOrderTime = virtualOrderDeltas[mid].time;
252
+ if (midOrderTime === searchTime) {
253
+ return mid;
254
+ }
255
+ else if (midOrderTime < searchTime) {
256
+ l = mid + 1;
257
+ }
258
+ else {
259
+ r = mid - 1;
260
+ }
261
+ }
262
+ return ~l; // Bitwise NOT of the insertion point
263
+ }
264
+ })(TwammPoolState || (exports.TwammPoolState = TwammPoolState = {}));
265
+ //# sourceMappingURL=twamm.js.map