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

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 (275) hide show
  1. package/build/abi/pancakeswap-infinity/cl-pool-manager.json +80 -0
  2. package/build/dex/balancer-v3/balancer-v3-pool.js +53 -11
  3. package/build/dex/balancer-v3/balancer-v3-pool.js.map +1 -1
  4. package/build/dex/balancer-v3/getOnChainState.d.ts +3 -1
  5. package/build/dex/balancer-v3/getOnChainState.js +48 -9
  6. package/build/dex/balancer-v3/getOnChainState.js.map +1 -1
  7. package/build/dex/balancer-v3/types.d.ts +9 -1
  8. package/build/dex/deth/dETH.d.ts +2 -0
  9. package/build/dex/deth/dETH.js +33 -20
  10. package/build/dex/deth/dETH.js.map +1 -1
  11. package/build/dex/etherfi.js +7 -6
  12. package/build/dex/etherfi.js.map +1 -1
  13. package/build/dex/fluid-dex/scripts/measure-calc-time.js +178 -0
  14. package/build/dex/fluid-dex/scripts/measure-calc-time.js.map +1 -0
  15. package/build/dex/index.d.ts +4 -1
  16. package/build/dex/index.js +33 -0
  17. package/build/dex/index.js.map +1 -1
  18. package/build/dex/lido/lido.d.ts +1 -4
  19. package/build/dex/lido/lido.js +2 -16
  20. package/build/dex/lido/lido.js.map +1 -1
  21. package/build/dex/{infusion → pancakeswap-infinity}/config.d.ts +2 -2
  22. package/build/dex/pancakeswap-infinity/config.js +14 -0
  23. package/build/dex/pancakeswap-infinity/config.js.map +1 -0
  24. package/build/dex/pancakeswap-infinity/encoder.d.ts +4 -0
  25. package/build/dex/pancakeswap-infinity/encoder.js +230 -0
  26. package/build/dex/pancakeswap-infinity/encoder.js.map +1 -0
  27. package/build/dex/pancakeswap-infinity/pancakeswap-infinity.d.ts +21 -0
  28. package/build/dex/pancakeswap-infinity/pancakeswap-infinity.js +102 -0
  29. package/build/dex/pancakeswap-infinity/pancakeswap-infinity.js.map +1 -0
  30. package/build/dex/pancakeswap-infinity/subgraph.d.ts +7 -0
  31. package/build/dex/pancakeswap-infinity/subgraph.js +62 -0
  32. package/build/dex/pancakeswap-infinity/subgraph.js.map +1 -0
  33. package/build/dex/pancakeswap-infinity/types.d.ts +39 -0
  34. package/build/dex/pancakeswap-infinity/types.js.map +1 -0
  35. package/build/dex/swell/swell.js +1 -5
  36. package/build/dex/swell/swell.js.map +1 -1
  37. package/build/dex/uniswap-v4/api-go/compare-pricing.d.ts +1 -0
  38. package/build/dex/uniswap-v4/api-go/compare-pricing.js +187 -0
  39. package/build/dex/uniswap-v4/api-go/compare-pricing.js.map +1 -0
  40. package/build/dex/uniswap-v4/api-go/compare-states.d.ts +1 -0
  41. package/build/dex/uniswap-v4/api-go/compare-states.js +149 -0
  42. package/build/dex/uniswap-v4/api-go/compare-states.js.map +1 -0
  43. package/build/dex/uniswap-v4/api-go/fetch-pool-key.d.ts +0 -0
  44. package/build/dex/uniswap-v4/api-go/fetch-pool-key.js +140 -0
  45. package/build/dex/uniswap-v4/api-go/fetch-pool-key.js.map +1 -0
  46. package/build/executor/Executor01BytecodeBuilder.js +35 -10
  47. package/build/executor/Executor01BytecodeBuilder.js.map +1 -1
  48. package/build/executor/Executor02BytecodeBuilder.js +36 -10
  49. package/build/executor/Executor02BytecodeBuilder.js.map +1 -1
  50. package/build/executor/Executor03BytecodeBuilder.js +28 -1
  51. package/build/executor/Executor03BytecodeBuilder.js.map +1 -1
  52. package/build/executor/ExecutorBytecodeBuilder.js +5 -0
  53. package/build/executor/ExecutorBytecodeBuilder.js.map +1 -1
  54. package/build/pools-helper.js +3 -3
  55. package/build/pools-helper.js.map +1 -1
  56. package/build/types.d.ts +1 -1
  57. package/package.json +3 -2
  58. package/build/abi/BProtocol.json +0 -1155
  59. package/build/abi/Jarvis.json +0 -1172
  60. package/build/abi/MStableAsset.json +0 -1545
  61. package/build/abi/OneInchLp.json +0 -1304
  62. package/build/abi/Onebit.json +0 -736
  63. package/build/abi/Shell.json +0 -1294
  64. package/build/abi/TraderJoeV2Router.json +0 -50
  65. package/build/abi/idle-dao/idle-cdo-factory.json +0 -38
  66. package/build/abi/idle-dao/idle-cdo.json +0 -1245
  67. package/build/abi/infusion/InfusionFactory.json +0 -147
  68. package/build/abi/infusion/InfusionPair.json +0 -658
  69. package/build/abi/infusion/InfusionRouter.json +0 -442
  70. package/build/abi/maker-psm/pot.json +0 -322
  71. package/build/abi/maker-psm/psm.json +0 -243
  72. package/build/abi/maker-psm/vat.json +0 -363
  73. package/build/abi/nomiswap-v2/nomiswap-v2-pool.json +0 -773
  74. package/build/abi/quick-perps/fast-price-events.json +0 -70
  75. package/build/abi/quick-perps/fast-price-feed.json +0 -741
  76. package/build/abi/quick-perps/reader.json +0 -313
  77. package/build/abi/quick-perps/vault-price-feed.json +0 -323
  78. package/build/abi/quick-perps/vault.json +0 -1953
  79. package/build/abi/uniswap-v2/excalibur-pool.json +0 -881
  80. package/build/abi/uniswap-v2/mdex-factory.json +0 -759
  81. package/build/abi/wUSDM.json +0 -757
  82. package/build/abi/zrx.v2.json +0 -1967
  83. package/build/abi/zrx.v3.json +0 -3454
  84. package/build/abi/zrx.v4.json +0 -2193
  85. package/build/dex/OneInchLp.d.ts +0 -24
  86. package/build/dex/OneInchLp.js +0 -43
  87. package/build/dex/OneInchLp.js.map +0 -1
  88. package/build/dex/bProtocol/bProtocol.d.ts +0 -15
  89. package/build/dex/bProtocol/bProtocol.js +0 -56
  90. package/build/dex/bProtocol/bProtocol.js.map +0 -1
  91. package/build/dex/bProtocol/types.d.ts +0 -11
  92. package/build/dex/bProtocol/types.js +0 -8
  93. package/build/dex/bProtocol/types.js.map +0 -1
  94. package/build/dex/ekubo/pools/base-pool.d.ts +0 -47
  95. package/build/dex/ekubo/pools/base-pool.js +0 -184
  96. package/build/dex/ekubo/pools/base-pool.js.map +0 -1
  97. package/build/dex/ekubo/pools/iface.d.ts +0 -46
  98. package/build/dex/ekubo/pools/iface.js +0 -75
  99. package/build/dex/ekubo/pools/iface.js.map +0 -1
  100. package/build/dex/ekubo/pools/math/price.d.ts +0 -7
  101. package/build/dex/ekubo/pools/math/price.js +0 -112
  102. package/build/dex/ekubo/pools/math/price.js.map +0 -1
  103. package/build/dex/ekubo/pools/oracle-pool.d.ts +0 -10
  104. package/build/dex/ekubo/pools/oracle-pool.js +0 -19
  105. package/build/dex/ekubo/pools/oracle-pool.js.map +0 -1
  106. package/build/dex/ekubo/pools/pool-utils.d.ts +0 -44
  107. package/build/dex/ekubo/pools/pool-utils.js +0 -240
  108. package/build/dex/ekubo/pools/pool-utils.js.map +0 -1
  109. package/build/dex/idle-dao/config.d.ts +0 -5
  110. package/build/dex/idle-dao/config.js +0 -24
  111. package/build/dex/idle-dao/config.js.map +0 -1
  112. package/build/dex/idle-dao/idle-dao.d.ts +0 -42
  113. package/build/dex/idle-dao/idle-dao.js +0 -279
  114. package/build/dex/idle-dao/idle-dao.js.map +0 -1
  115. package/build/dex/idle-dao/token_list.d.ts +0 -4
  116. package/build/dex/idle-dao/token_list.js +0 -289
  117. package/build/dex/idle-dao/token_list.js.map +0 -1
  118. package/build/dex/idle-dao/tokens.d.ts +0 -9
  119. package/build/dex/idle-dao/tokens.js +0 -68
  120. package/build/dex/idle-dao/tokens.js.map +0 -1
  121. package/build/dex/idle-dao/types.d.ts +0 -35
  122. package/build/dex/idle-dao/types.js +0 -11
  123. package/build/dex/idle-dao/types.js.map +0 -1
  124. package/build/dex/idle-dao/utils.d.ts +0 -8
  125. package/build/dex/idle-dao/utils.js +0 -149
  126. package/build/dex/idle-dao/utils.js.map +0 -1
  127. package/build/dex/infusion/config.js +0 -20
  128. package/build/dex/infusion/config.js.map +0 -1
  129. package/build/dex/infusion/infusion-stable-pool.d.ts +0 -4
  130. package/build/dex/infusion/infusion-stable-pool.js +0 -74
  131. package/build/dex/infusion/infusion-stable-pool.js.map +0 -1
  132. package/build/dex/infusion/infusion.d.ts +0 -51
  133. package/build/dex/infusion/infusion.js +0 -500
  134. package/build/dex/infusion/infusion.js.map +0 -1
  135. package/build/dex/infusion/types.d.ts +0 -45
  136. package/build/dex/infusion/types.js.map +0 -1
  137. package/build/dex/infusion/utils/isStablePair.d.ts +0 -2
  138. package/build/dex/infusion/utils/isStablePair.js +0 -18
  139. package/build/dex/infusion/utils/isStablePair.js.map +0 -1
  140. package/build/dex/jarvis.d.ts +0 -56
  141. package/build/dex/jarvis.js +0 -163
  142. package/build/dex/jarvis.js.map +0 -1
  143. package/build/dex/mStable.d.ts +0 -44
  144. package/build/dex/mStable.js +0 -75
  145. package/build/dex/mStable.js.map +0 -1
  146. package/build/dex/maker-psm/config.d.ts +0 -11
  147. package/build/dex/maker-psm/config.js +0 -53
  148. package/build/dex/maker-psm/config.js.map +0 -1
  149. package/build/dex/maker-psm/maker-psm.d.ts +0 -103
  150. package/build/dex/maker-psm/maker-psm.js +0 -493
  151. package/build/dex/maker-psm/maker-psm.js.map +0 -1
  152. package/build/dex/maker-psm/types.d.ts +0 -39
  153. package/build/dex/maker-psm/types.js +0 -3
  154. package/build/dex/maker-psm/types.js.map +0 -1
  155. package/build/dex/onebit/onebit.d.ts +0 -16
  156. package/build/dex/onebit/onebit.js +0 -61
  157. package/build/dex/onebit/onebit.js.map +0 -1
  158. package/build/dex/onebit/types.d.ts +0 -14
  159. package/build/dex/onebit/types.js +0 -8
  160. package/build/dex/onebit/types.js.map +0 -1
  161. package/build/dex/quick-perps/config.d.ts +0 -11
  162. package/build/dex/quick-perps/config.js +0 -27
  163. package/build/dex/quick-perps/config.js.map +0 -1
  164. package/build/dex/quick-perps/fast-price-feed.d.ts +0 -26
  165. package/build/dex/quick-perps/fast-price-feed.js +0 -184
  166. package/build/dex/quick-perps/fast-price-feed.js.map +0 -1
  167. package/build/dex/quick-perps/pool.d.ts +0 -21
  168. package/build/dex/quick-perps/pool.js +0 -229
  169. package/build/dex/quick-perps/pool.js.map +0 -1
  170. package/build/dex/quick-perps/quick-perps.d.ts +0 -53
  171. package/build/dex/quick-perps/quick-perps.js +0 -247
  172. package/build/dex/quick-perps/quick-perps.js.map +0 -1
  173. package/build/dex/quick-perps/types.d.ts +0 -98
  174. package/build/dex/quick-perps/types.js +0 -3
  175. package/build/dex/quick-perps/types.js.map +0 -1
  176. package/build/dex/quick-perps/usdq.d.ts +0 -15
  177. package/build/dex/quick-perps/usdq.js +0 -62
  178. package/build/dex/quick-perps/usdq.js.map +0 -1
  179. package/build/dex/quick-perps/vault-price-feed.d.ts +0 -43
  180. package/build/dex/quick-perps/vault-price-feed.js +0 -203
  181. package/build/dex/quick-perps/vault-price-feed.js.map +0 -1
  182. package/build/dex/quick-perps/vault-utils.d.ts +0 -8
  183. package/build/dex/quick-perps/vault-utils.js +0 -42
  184. package/build/dex/quick-perps/vault-utils.js.map +0 -1
  185. package/build/dex/quick-perps/vault.d.ts +0 -46
  186. package/build/dex/quick-perps/vault.js +0 -182
  187. package/build/dex/quick-perps/vault.js.map +0 -1
  188. package/build/dex/se-vlr/config.d.ts +0 -3
  189. package/build/dex/se-vlr/config.js +0 -24
  190. package/build/dex/se-vlr/config.js.map +0 -1
  191. package/build/dex/se-vlr/se-vlr-pool.d.ts +0 -39
  192. package/build/dex/se-vlr/se-vlr-pool.js +0 -70
  193. package/build/dex/se-vlr/se-vlr-pool.js.map +0 -1
  194. package/build/dex/se-vlr/se-vlr.d.ts +0 -35
  195. package/build/dex/se-vlr/se-vlr.js +0 -131
  196. package/build/dex/se-vlr/se-vlr.js.map +0 -1
  197. package/build/dex/se-vlr/types.d.ts +0 -6
  198. package/build/dex/se-vlr/types.js +0 -3
  199. package/build/dex/se-vlr/types.js.map +0 -1
  200. package/build/dex/shell.d.ts +0 -25
  201. package/build/dex/shell.js +0 -41
  202. package/build/dex/shell.js.map +0 -1
  203. package/build/dex/solidly/forks-override/aerodrome.d.ts +0 -14
  204. package/build/dex/solidly/forks-override/aerodrome.js +0 -46
  205. package/build/dex/solidly/forks-override/aerodrome.js.map +0 -1
  206. package/build/dex/solidly/forks-override/chronos.d.ts +0 -23
  207. package/build/dex/solidly/forks-override/chronos.js +0 -141
  208. package/build/dex/solidly/forks-override/chronos.js.map +0 -1
  209. package/build/dex/solidly/forks-override/usdfi.d.ts +0 -8
  210. package/build/dex/solidly/forks-override/usdfi.js +0 -15
  211. package/build/dex/solidly/forks-override/usdfi.js.map +0 -1
  212. package/build/dex/solidly/forks-override/velocimeter.d.ts +0 -23
  213. package/build/dex/solidly/forks-override/velocimeter.js +0 -77
  214. package/build/dex/solidly/forks-override/velocimeter.js.map +0 -1
  215. package/build/dex/trader-joe-v2.d.ts +0 -40
  216. package/build/dex/trader-joe-v2.js +0 -74
  217. package/build/dex/trader-joe-v2.js.map +0 -1
  218. package/build/dex/uniswap-v2/dfyn.d.ts +0 -19
  219. package/build/dex/uniswap-v2/dfyn.js +0 -61
  220. package/build/dex/uniswap-v2/dfyn.js.map +0 -1
  221. package/build/dex/uniswap-v2/excalibur.d.ts +0 -24
  222. package/build/dex/uniswap-v2/excalibur.js +0 -47
  223. package/build/dex/uniswap-v2/excalibur.js.map +0 -1
  224. package/build/dex/uniswap-v2/mdex.d.ts +0 -24
  225. package/build/dex/uniswap-v2/mdex.js +0 -50
  226. package/build/dex/uniswap-v2/mdex.js.map +0 -1
  227. package/build/dex/uniswap-v2/nomiswap-v2.d.ts +0 -24
  228. package/build/dex/uniswap-v2/nomiswap-v2.js +0 -57
  229. package/build/dex/uniswap-v2/nomiswap-v2.js.map +0 -1
  230. package/build/dex/uniswap-v3/scripts/bench-all-dexes.js +0 -160
  231. package/build/dex/uniswap-v3/scripts/bench-all-dexes.js.map +0 -1
  232. package/build/dex/uniswap-v3/uniswap-v3-new.d.ts +0 -94
  233. package/build/dex/uniswap-v3/uniswap-v3-new.js +0 -923
  234. package/build/dex/uniswap-v3/uniswap-v3-new.js.map +0 -1
  235. package/build/dex/uniswap-v4/contract-math/Position.d.ts +0 -3
  236. package/build/dex/uniswap-v4/contract-math/Position.js +0 -10
  237. package/build/dex/uniswap-v4/contract-math/Position.js.map +0 -1
  238. package/build/dex/usual-bond/config.d.ts +0 -3
  239. package/build/dex/usual-bond/config.js +0 -13
  240. package/build/dex/usual-bond/config.js.map +0 -1
  241. package/build/dex/usual-bond/types.d.ts +0 -7
  242. package/build/dex/usual-bond/types.js +0 -3
  243. package/build/dex/usual-bond/types.js.map +0 -1
  244. package/build/dex/usual-bond/usual-bond.d.ts +0 -35
  245. package/build/dex/usual-bond/usual-bond.js +0 -176
  246. package/build/dex/usual-bond/usual-bond.js.map +0 -1
  247. package/build/dex/wusdm/config.d.ts +0 -3
  248. package/build/dex/wusdm/config.js +0 -43
  249. package/build/dex/wusdm/config.js.map +0 -1
  250. package/build/dex/wusdm/constants.d.ts +0 -2
  251. package/build/dex/wusdm/constants.js +0 -6
  252. package/build/dex/wusdm/constants.js.map +0 -1
  253. package/build/dex/wusdm/types.d.ts +0 -18
  254. package/build/dex/wusdm/types.js +0 -11
  255. package/build/dex/wusdm/types.js.map +0 -1
  256. package/build/dex/wusdm/wusdm-pool.d.ts +0 -21
  257. package/build/dex/wusdm/wusdm-pool.js +0 -74
  258. package/build/dex/wusdm/wusdm-pool.js.map +0 -1
  259. package/build/dex/wusdm/wusdm.d.ts +0 -46
  260. package/build/dex/wusdm/wusdm.js +0 -243
  261. package/build/dex/wusdm/wusdm.js.map +0 -1
  262. package/build/dex/zerox/config.d.ts +0 -2
  263. package/build/dex/zerox/config.js +0 -33
  264. package/build/dex/zerox/config.js.map +0 -1
  265. package/build/dex/zerox/index.d.ts +0 -22
  266. package/build/dex/zerox/index.js +0 -225
  267. package/build/dex/zerox/index.js.map +0 -1
  268. package/build/dex/zerox/order.d.ts +0 -88
  269. package/build/dex/zerox/order.js +0 -53
  270. package/build/dex/zerox/order.js.map +0 -1
  271. package/build/dex/zerox/types.d.ts +0 -73
  272. package/build/dex/zerox/types.js +0 -21
  273. package/build/dex/zerox/types.js.map +0 -1
  274. /package/build/dex/{uniswap-v3/scripts/bench-all-dexes.d.ts → fluid-dex/scripts/measure-calc-time.d.ts} +0 -0
  275. /package/build/dex/{infusion → pancakeswap-infinity}/types.js +0 -0
@@ -0,0 +1,187 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const dotenv_1 = __importDefault(require("dotenv"));
7
+ dotenv_1.default.config();
8
+ const axios_1 = __importDefault(require("axios"));
9
+ const fs_1 = __importDefault(require("fs"));
10
+ const path_1 = __importDefault(require("path"));
11
+ const constants_1 = require("../../../constants");
12
+ const config_1 = require("../config");
13
+ const uniswap_v4_pool_1 = require("../uniswap-v4-pool");
14
+ const dex_helper_1 = require("../../../dex-helper");
15
+ const uniswap_v4_pool_math_1 = require("../contract-math/uniswap-v4-pool-math");
16
+ const core_1 = require("@paraswap/core");
17
+ const abi_1 = require("@ethersproject/abi");
18
+ const decoders_1 = require("../../../lib/decoders");
19
+ const quoter_abi_json_1 = __importDefault(require("../../../abi/uniswap-v4/quoter.abi.json"));
20
+ const POOL_ID = '0x54c72c46df32f2cc455e84e41e191b26ed73a29452cdd3d82f511097af9f427e';
21
+ const CHAIN_ID = constants_1.Network.MAINNET;
22
+ const DEX_KEY = 'UniswapV4';
23
+ const API_DEX_KEY = 'uniswapv4'; // cspell:disable-line
24
+ const CONFIG = config_1.UniswapV4Config[DEX_KEY][CHAIN_ID];
25
+ const POOL_KEY_CACHE_FILE = path_1.default.join(__dirname, 'pool_key_cache.json');
26
+ // ETH/WBTC pool: token0=ETH(0x0), token1=WBTC
27
+ // Swap 1 ETH -> WBTC (zeroForOne=true, SELL)
28
+ const AMOUNT = 1000000000000000000000n; // 1000 ETH (18 decimals)
29
+ function loadPoolKeyFromCache() {
30
+ try {
31
+ const raw = fs_1.default.readFileSync(POOL_KEY_CACHE_FILE, 'utf-8');
32
+ const cache = JSON.parse(raw);
33
+ return cache[CHAIN_ID]?.[POOL_ID] ?? null;
34
+ }
35
+ catch {
36
+ return null;
37
+ }
38
+ }
39
+ async function generateRpcPoolState(poolKey, blockNumber) {
40
+ const dexHelper = new dex_helper_1.DummyDexHelper(CHAIN_ID);
41
+ const logger = dexHelper.getLogger(DEX_KEY);
42
+ const pool = new uniswap_v4_pool_1.UniswapV4Pool(dexHelper, DEX_KEY, CHAIN_ID, CONFIG, logger, '', POOL_ID, poolKey.token0.id.toLowerCase(), poolKey.token1.id.toLowerCase(), poolKey.feeTier, poolKey.hooks, poolKey.tickSpacing);
43
+ return pool.generateState(blockNumber);
44
+ }
45
+ function adaptApiToPoolState(api) {
46
+ const ticks = {};
47
+ for (const [idx, tick] of Object.entries(api.dexData.ticks)) {
48
+ ticks[idx] = {
49
+ liquidityGross: BigInt(tick.liquidityGross),
50
+ liquidityNet: BigInt(tick.liquidityNet),
51
+ };
52
+ }
53
+ const tickBitmap = {};
54
+ for (const [idx, val] of Object.entries(api.dexData.tickBitmap)) {
55
+ if (val !== '0') {
56
+ tickBitmap[idx] = BigInt(val);
57
+ }
58
+ }
59
+ return {
60
+ id: api.poolId,
61
+ token0: api.tokens[0],
62
+ token1: api.tokens[1],
63
+ fee: String(api.swapFee),
64
+ hooks: api.dexData.hooks,
65
+ feeGrowthGlobal0X128: 0n,
66
+ feeGrowthGlobal1X128: 0n,
67
+ liquidity: BigInt(api.liquidity),
68
+ slot0: {
69
+ sqrtPriceX96: BigInt(api.dexData.sqrtPriceX96),
70
+ tick: BigInt(api.dexData.tick),
71
+ protocolFee: BigInt(api.dexData.protocolFee),
72
+ lpFee: BigInt(api.swapFee),
73
+ },
74
+ tickSpacing: api.dexData.tickSpacing,
75
+ ticks,
76
+ tickBitmap,
77
+ isValid: true,
78
+ };
79
+ }
80
+ function buildPool(poolKey) {
81
+ return {
82
+ id: POOL_ID,
83
+ key: {
84
+ currency0: poolKey.token0.id.toLowerCase(),
85
+ currency1: poolKey.token1.id.toLowerCase(),
86
+ fee: poolKey.feeTier,
87
+ tickSpacing: Number(poolKey.tickSpacing),
88
+ hooks: poolKey.hooks,
89
+ },
90
+ };
91
+ }
92
+ function getOutputs(pool, state, amounts, zeroForOne, side) {
93
+ try {
94
+ return uniswap_v4_pool_math_1.uniswapV4PoolMath.queryOutputs(pool, state, amounts, zeroForOne, side);
95
+ }
96
+ catch (e) {
97
+ // eslint-disable-next-line no-console
98
+ console.error('queryOutputs error:', e);
99
+ return null;
100
+ }
101
+ }
102
+ async function queryPriceFromRpc(dexHelper, pool, amounts, zeroForOne, side, blockNumber) {
103
+ const quoterIface = new abi_1.Interface(quoter_abi_json_1.default);
104
+ const quoterAddress = CONFIG.quoter;
105
+ const funcName = side === core_1.SwapSide.SELL ? 'quoteExactInputSingle' : 'quoteExactOutputSingle';
106
+ const calls = amounts.map(amount => ({
107
+ target: quoterAddress,
108
+ callData: quoterIface.encodeFunctionData(funcName, [
109
+ {
110
+ poolKey: pool.key,
111
+ zeroForOne,
112
+ exactAmount: amount.toString(),
113
+ hookData: '0x',
114
+ },
115
+ ]),
116
+ decodeFunction: (result) => {
117
+ return (0, decoders_1.generalDecoder)(result, ['uint256', 'uint256'], 0n, value => BigInt(value[0].toString()));
118
+ },
119
+ }));
120
+ const results = await dexHelper.multiWrapper.tryAggregate(false, calls, blockNumber);
121
+ return results.map(result => (result.success ? result.returnData : 0n));
122
+ }
123
+ /* eslint-disable no-console */
124
+ async function main() {
125
+ const poolKey = loadPoolKeyFromCache();
126
+ if (!poolKey) {
127
+ console.error('Pool key not found in cache. Run fetch-pool-key.ts first.');
128
+ process.exit(1);
129
+ }
130
+ console.log('Loaded pool key from cache');
131
+ const dexHelper = new dex_helper_1.DummyDexHelper(CHAIN_ID);
132
+ const latestBlock = await dexHelper.provider.getBlockNumber();
133
+ console.log(`Latest block: ${latestBlock}`);
134
+ const pool = buildPool(poolKey);
135
+ const amounts = [AMOUNT];
136
+ const zeroForOne = true;
137
+ const side = core_1.SwapSide.SELL;
138
+ const apiPoolId = `${CHAIN_ID}:${API_DEX_KEY}:${POOL_ID}`;
139
+ const apiGenerateUrl = `http://api-go.staging.paraswap.io/api/v1/pool/generate-state?poolId=${apiPoolId}`;
140
+ const apiCachedUrl = `http://api-go.staging.paraswap.io/api/v1/pool/state?poolId=${apiPoolId}`;
141
+ console.log('\nFetching all states & querying on-chain quoter...');
142
+ const [apiGenResp, apiCachedResp, rpcState, onChainOutputs] = await Promise.all([
143
+ axios_1.default.get(apiGenerateUrl, { timeout: 30_000 }),
144
+ axios_1.default.get(apiCachedUrl, { timeout: 30_000 }),
145
+ generateRpcPoolState(poolKey, latestBlock),
146
+ queryPriceFromRpc(dexHelper, pool, amounts, zeroForOne, side, latestBlock),
147
+ ]);
148
+ const apiGenData = apiGenResp.data;
149
+ const apiCachedData = apiCachedResp.data;
150
+ const apiGenState = adaptApiToPoolState(apiGenData);
151
+ const apiCachedState = adaptApiToPoolState(apiCachedData);
152
+ console.log(`Blocks — RPC: ${latestBlock}, API generate: ${apiGenData.blockNumber}, API cached: ${apiCachedData.blockNumber}`);
153
+ console.log(`\n=== Pricing Comparison ===`);
154
+ console.log(`Pool: ETH/WBTC (${POOL_ID.slice(0, 10)}...)`);
155
+ console.log(`Direction: ${zeroForOne ? 'token0 -> token1' : 'token1 -> token0'} (${side === core_1.SwapSide.SELL ? 'SELL' : 'BUY'})`);
156
+ console.log(`Amount in: ${AMOUNT} (${Number(AMOUNT) / 1e18} ETH)\n`);
157
+ const rpcStateOutputs = getOutputs(pool, rpcState, amounts, zeroForOne, side);
158
+ const apiGenOutputs = getOutputs(pool, apiGenState, amounts, zeroForOne, side);
159
+ const apiCachedOutputs = getOutputs(pool, apiCachedState, amounts, zeroForOne, side);
160
+ function formatOutput(label, output, baseline) {
161
+ if (output === null) {
162
+ console.log(` ${label} FAILED`);
163
+ return;
164
+ }
165
+ const diff = output - baseline;
166
+ const pct = baseline !== 0n ? (Number(diff) / Number(baseline)) * 100 : 0;
167
+ console.log(` ${label} ${output} (${Number(output) / 1e8} WBTC) diff: ${diff} (${pct.toFixed(6)}%)`);
168
+ }
169
+ for (let i = 0; i < amounts.length; i++) {
170
+ const onChain = onChainOutputs[i];
171
+ const fromRpc = rpcStateOutputs ? rpcStateOutputs[i] : null;
172
+ const fromApiGen = apiGenOutputs ? apiGenOutputs[i] : null;
173
+ const fromApiCached = apiCachedOutputs ? apiCachedOutputs[i] : null;
174
+ console.log(` Amount: ${amounts[i]} (${Number(amounts[i]) / 1e18} ETH)`);
175
+ console.log(` On-chain quoter: ${onChain} (${Number(onChain) / 1e8} WBTC) [baseline]`);
176
+ formatOutput('RPC state math: ', fromRpc, onChain);
177
+ formatOutput('API generated: ', fromApiGen, onChain);
178
+ formatOutput('API cached: ', fromApiCached, onChain);
179
+ }
180
+ }
181
+ /* eslint-enable no-console */
182
+ main().catch(err => {
183
+ // eslint-disable-next-line no-console
184
+ console.error('Error:', err.message);
185
+ process.exit(1);
186
+ });
187
+ //# sourceMappingURL=compare-pricing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compare-pricing.js","sourceRoot":"","sources":["../../../../src/dex/uniswap-v4/api-go/compare-pricing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,149 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const dotenv_1 = __importDefault(require("dotenv"));
7
+ dotenv_1.default.config();
8
+ const axios_1 = __importDefault(require("axios"));
9
+ const fs_1 = __importDefault(require("fs"));
10
+ const path_1 = __importDefault(require("path"));
11
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
12
+ const { diffString } = require('json-diff');
13
+ const constants_1 = require("../../../constants");
14
+ const config_1 = require("../config");
15
+ const uniswap_v4_pool_1 = require("../uniswap-v4-pool");
16
+ const dex_helper_1 = require("../../../dex-helper");
17
+ const POOL_ID = '0x54c72c46df32f2cc455e84e41e191b26ed73a29452cdd3d82f511097af9f427e';
18
+ const CHAIN_ID = constants_1.Network.MAINNET;
19
+ const DEX_KEY = 'UniswapV4';
20
+ const API_DEX_KEY = 'uniswapv4'; // cspell:disable-line
21
+ const CONFIG = config_1.UniswapV4Config[DEX_KEY][CHAIN_ID];
22
+ const POOL_KEY_CACHE_FILE = path_1.default.join(__dirname, 'pool_key_cache.json');
23
+ function loadPoolKeyFromCache() {
24
+ try {
25
+ const raw = fs_1.default.readFileSync(POOL_KEY_CACHE_FILE, 'utf-8');
26
+ const cache = JSON.parse(raw);
27
+ return cache[CHAIN_ID]?.[POOL_ID] ?? null;
28
+ }
29
+ catch {
30
+ return null;
31
+ }
32
+ }
33
+ async function generatePoolState(poolKey, blockNumber) {
34
+ const dexHelper = new dex_helper_1.DummyDexHelper(CHAIN_ID);
35
+ const logger = dexHelper.getLogger(DEX_KEY);
36
+ const pool = new uniswap_v4_pool_1.UniswapV4Pool(dexHelper, DEX_KEY, CHAIN_ID, CONFIG, logger, '', POOL_ID, poolKey.token0.id.toLowerCase(), poolKey.token1.id.toLowerCase(), poolKey.feeTier, poolKey.hooks, poolKey.tickSpacing);
37
+ return pool.generateState(blockNumber);
38
+ }
39
+ function serializePoolState(state) {
40
+ const ticks = {};
41
+ for (const [idx, tick] of Object.entries(state.ticks)) {
42
+ ticks[idx] = {
43
+ liquidityGross: tick.liquidityGross.toString(),
44
+ liquidityNet: tick.liquidityNet.toString(),
45
+ };
46
+ }
47
+ const tickBitmap = {};
48
+ for (const [idx, val] of Object.entries(state.tickBitmap)) {
49
+ tickBitmap[idx] = val.toString();
50
+ }
51
+ return {
52
+ id: state.id,
53
+ token0: state.token0,
54
+ token1: state.token1,
55
+ fee: state.fee,
56
+ hooks: state.hooks,
57
+ liquidity: state.liquidity.toString(),
58
+ slot0: {
59
+ sqrtPriceX96: state.slot0.sqrtPriceX96.toString(),
60
+ tick: state.slot0.tick.toString(),
61
+ protocolFee: state.slot0.protocolFee.toString(),
62
+ lpFee: state.slot0.lpFee.toString(),
63
+ },
64
+ tickSpacing: state.tickSpacing,
65
+ ticks,
66
+ tickBitmap,
67
+ };
68
+ }
69
+ function adaptApiToSerializedState(api) {
70
+ const ticks = {};
71
+ for (const [idx, tick] of Object.entries(api.dexData.ticks)) {
72
+ ticks[idx] = {
73
+ liquidityGross: tick.liquidityGross,
74
+ liquidityNet: tick.liquidityNet,
75
+ };
76
+ }
77
+ // Filter tickBitmap: only keep non-zero entries
78
+ const tickBitmap = {};
79
+ for (const [idx, val] of Object.entries(api.dexData.tickBitmap)) {
80
+ if (val !== '0') {
81
+ tickBitmap[idx] = val;
82
+ }
83
+ }
84
+ return {
85
+ id: api.poolId,
86
+ token0: api.tokens[0],
87
+ token1: api.tokens[1],
88
+ fee: String(api.swapFee),
89
+ hooks: api.dexData.hooks,
90
+ liquidity: String(api.liquidity),
91
+ slot0: {
92
+ sqrtPriceX96: String(api.dexData.sqrtPriceX96),
93
+ tick: String(api.dexData.tick),
94
+ protocolFee: String(api.dexData.protocolFee),
95
+ lpFee: String(api.swapFee),
96
+ },
97
+ tickSpacing: api.dexData.tickSpacing,
98
+ ticks,
99
+ tickBitmap,
100
+ };
101
+ }
102
+ /* eslint-disable no-console */
103
+ async function main() {
104
+ const poolKey = loadPoolKeyFromCache();
105
+ if (!poolKey) {
106
+ console.error('Pool key not found in cache. Run fetch-pool-key.ts first to populate the cache.');
107
+ process.exit(1);
108
+ }
109
+ console.log('Loaded pool key from cache');
110
+ const dexHelper = new dex_helper_1.DummyDexHelper(CHAIN_ID);
111
+ const latestBlock = await dexHelper.provider.getBlockNumber();
112
+ console.log(`Latest block: ${latestBlock}`);
113
+ const apiPoolId = `${CHAIN_ID}:${API_DEX_KEY}:${POOL_ID}`;
114
+ const apiGenerateUrl = `http://api-go.staging.paraswap.io/api/v1/pool/generate-state?poolId=${apiPoolId}`;
115
+ const apiCachedUrl = `http://api-go.staging.paraswap.io/api/v1/pool/state?poolId=${apiPoolId}`;
116
+ console.log('\nFetching all states...');
117
+ const [apiGenResp, apiCachedResp, rpcState] = await Promise.all([
118
+ axios_1.default.get(apiGenerateUrl, { timeout: 30_000 }),
119
+ axios_1.default.get(apiCachedUrl, { timeout: 30_000 }),
120
+ generatePoolState(poolKey, latestBlock),
121
+ ]);
122
+ const apiGenData = apiGenResp.data;
123
+ const apiCachedData = apiCachedResp.data;
124
+ console.log(`Blocks — RPC: ${latestBlock}, API generate: ${apiGenData.blockNumber}, API cached: ${apiCachedData.blockNumber}`);
125
+ const serializedRpc = serializePoolState(rpcState);
126
+ const serializedApiGen = adaptApiToSerializedState(apiGenData);
127
+ const serializedApiCached = adaptApiToSerializedState(apiCachedData);
128
+ // RPC vs API generated
129
+ console.log('\n=== RPC state vs API generated state ===\n');
130
+ const diff1 = diffString(serializedRpc, serializedApiGen, { color: true });
131
+ console.log(diff1 || 'States are identical.');
132
+ // RPC vs API cached
133
+ console.log('\n=== RPC state vs API cached state ===\n');
134
+ const diff2 = diffString(serializedRpc, serializedApiCached, { color: true });
135
+ console.log(diff2 || 'States are identical.');
136
+ // API generated vs API cached
137
+ console.log('\n=== API generated vs API cached ===\n');
138
+ const diff3 = diffString(serializedApiGen, serializedApiCached, {
139
+ color: true,
140
+ });
141
+ console.log(diff3 || 'States are identical.');
142
+ }
143
+ /* eslint-enable no-console */
144
+ main().catch(err => {
145
+ // eslint-disable-next-line no-console
146
+ console.error('Error:', err.message);
147
+ process.exit(1);
148
+ });
149
+ //# sourceMappingURL=compare-states.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compare-states.js","sourceRoot":"","sources":["../../../../src/dex/uniswap-v4/api-go/compare-states.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,140 @@
1
+ "use strict";
2
+ // import dotenv from 'dotenv';
3
+ // dotenv.config();
4
+ // import axios from 'axios';
5
+ // import fs from 'fs';
6
+ // import path from 'path';
7
+ // import { UniswapV4Config } from '../config';
8
+ // import { Network } from '../../../constants';
9
+ // import { UniswapV4Pool } from '../uniswap-v4-pool';
10
+ // import { DummyDexHelper } from '../../../dex-helper';
11
+ // import { PoolState } from '../types';
12
+ // const POOL_ID =
13
+ // '0x54c72c46df32f2cc455e84e41e191b26ed73a29452cdd3d82f511097af9f427e';
14
+ // const CHAIN_ID = Network.MAINNET;
15
+ // const DEX_KEY = 'UniswapV4';
16
+ // const CONFIG = UniswapV4Config[DEX_KEY][CHAIN_ID];
17
+ // const SUBGRAPH_ID = CONFIG.subgraphURL;
18
+ // const POOL_KEY_CACHE_FILE = path.join(__dirname, 'pool_key_cache.json');
19
+ // interface PoolKey {
20
+ // id: string;
21
+ // token0: { id: string };
22
+ // token1: { id: string };
23
+ // feeTier: string;
24
+ // tickSpacing: string;
25
+ // hooks: string;
26
+ // }
27
+ // type PoolKeyCache = Record<string, Record<string, PoolKey>>;
28
+ // interface GraphQLResponse {
29
+ // data: { pool: PoolKey | null };
30
+ // errors?: { message: string }[];
31
+ // }
32
+ // function loadCache(): PoolKeyCache {
33
+ // try {
34
+ // const raw = fs.readFileSync(POOL_KEY_CACHE_FILE, 'utf-8');
35
+ // return JSON.parse(raw) as PoolKeyCache;
36
+ // } catch {
37
+ // return {};
38
+ // }
39
+ // }
40
+ // function loadPoolKeyFromCache(): PoolKey | null {
41
+ // const cache = loadCache();
42
+ // return cache[CHAIN_ID]?.[POOL_ID] ?? null;
43
+ // }
44
+ // function savePoolKeyToCache(pool: PoolKey): void {
45
+ // const cache = loadCache();
46
+ // if (!cache[CHAIN_ID]) {
47
+ // cache[CHAIN_ID] = {};
48
+ // }
49
+ // cache[CHAIN_ID][POOL_ID] = pool;
50
+ // fs.writeFileSync(POOL_KEY_CACHE_FILE, JSON.stringify(cache, null, 2));
51
+ // }
52
+ // async function fetchPoolKey(apiKey: string): Promise<PoolKey> {
53
+ // const url = `https://gateway-arbitrum.network.thegraph.com/api/${apiKey}/subgraphs/id/${SUBGRAPH_ID}`;
54
+ // const query = `{
55
+ // pool(id: "${POOL_ID}") {
56
+ // id
57
+ // token0 {
58
+ // id
59
+ // }
60
+ // token1 {
61
+ // id
62
+ // }
63
+ // feeTier
64
+ // tickSpacing
65
+ // hooks
66
+ // }
67
+ // }`;
68
+ // const resp = await axios.post<GraphQLResponse>(
69
+ // url,
70
+ // { query },
71
+ // { timeout: 30_000 },
72
+ // );
73
+ // if (resp.data.errors?.length) {
74
+ // throw new Error(`Subgraph error: ${resp.data.errors[0].message}`);
75
+ // }
76
+ // if (!resp.data.data.pool) {
77
+ // throw new Error(`Pool ${POOL_ID} not found`);
78
+ // }
79
+ // return resp.data.data.pool;
80
+ // }
81
+ // function bigintReplacer(_key: string, value: unknown): unknown {
82
+ // return typeof value === 'bigint' ? value.toString() : value;
83
+ // }
84
+ // function saveState(state: PoolState, blockNumber: number): void {
85
+ // const filename = `${CHAIN_ID}-${POOL_ID}-${blockNumber}.json`;
86
+ // const filepath = path.join(__dirname, filename);
87
+ // fs.writeFileSync(filepath, JSON.stringify(state, bigintReplacer, 2));
88
+ // console.log('State saved to:', filepath);
89
+ // }
90
+ // async function generatePoolState(
91
+ // poolKey: PoolKey,
92
+ // blockNumber: number,
93
+ // ): Promise<PoolState> {
94
+ // const dexHelper = new DummyDexHelper(CHAIN_ID);
95
+ // const logger = dexHelper.getLogger(DEX_KEY);
96
+ // const pool = new UniswapV4Pool(
97
+ // dexHelper,
98
+ // DEX_KEY,
99
+ // CHAIN_ID,
100
+ // CONFIG,
101
+ // logger,
102
+ // '',
103
+ // POOL_ID,
104
+ // poolKey.token0.id.toLowerCase(),
105
+ // poolKey.token1.id.toLowerCase(),
106
+ // poolKey.feeTier,
107
+ // poolKey.hooks,
108
+ // poolKey.tickSpacing,
109
+ // );
110
+ // return pool.generateState(blockNumber);
111
+ // }
112
+ // async function main() {
113
+ // const apiKey = 'b2f021e3ecdb7de925add6d3563e753e';
114
+ // if (!apiKey) {
115
+ // console.error('Error: THEGRAPH_API_KEY environment variable is required');
116
+ // process.exit(1);
117
+ // }
118
+ // // Step 1: Get pool key (from cache or subgraph)
119
+ // let poolKey = loadPoolKeyFromCache();
120
+ // if (poolKey) {
121
+ // console.log('Loaded pool key from cache:', POOL_KEY_CACHE_FILE);
122
+ // } else {
123
+ // console.log(`Fetching pool key for ${POOL_ID} from subgraph...`);
124
+ // poolKey = await fetchPoolKey(apiKey);
125
+ // savePoolKeyToCache(poolKey);
126
+ // console.log('Pool key cached to:', POOL_KEY_CACHE_FILE);
127
+ // }
128
+ // console.log(poolKey);
129
+ // // Step 2: Get latest block number and generate state
130
+ // const dexHelper = new DummyDexHelper(CHAIN_ID);
131
+ // const latestBlock = await dexHelper.provider.getBlockNumber();
132
+ // console.log(`\nGenerating state at block ${latestBlock}...`);
133
+ // const state = await generatePoolState(poolKey, latestBlock);
134
+ // saveState(state, latestBlock);
135
+ // }
136
+ // main().catch(err => {
137
+ // console.error('Error:', err.message);
138
+ // process.exit(1);
139
+ // });
140
+ //# sourceMappingURL=fetch-pool-key.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch-pool-key.js","sourceRoot":"","sources":["../../../../src/dex/uniswap-v4/api-go/fetch-pool-key.ts"],"names":[],"mappings":";AAAA,+BAA+B;AAC/B,mBAAmB;AAEnB,6BAA6B;AAC7B,uBAAuB;AACvB,2BAA2B;AAC3B,+CAA+C;AAC/C,gDAAgD;AAChD,sDAAsD;AACtD,wDAAwD;AACxD,wCAAwC;AAExC,kBAAkB;AAClB,0EAA0E;AAE1E,oCAAoC;AACpC,+BAA+B;AAC/B,qDAAqD;AACrD,0CAA0C;AAE1C,2EAA2E;AAE3E,sBAAsB;AACtB,gBAAgB;AAChB,4BAA4B;AAC5B,4BAA4B;AAC5B,qBAAqB;AACrB,yBAAyB;AACzB,mBAAmB;AACnB,IAAI;AAEJ,+DAA+D;AAE/D,8BAA8B;AAC9B,oCAAoC;AACpC,oCAAoC;AACpC,IAAI;AAEJ,uCAAuC;AACvC,UAAU;AACV,iEAAiE;AACjE,8CAA8C;AAC9C,cAAc;AACd,iBAAiB;AACjB,MAAM;AACN,IAAI;AAEJ,oDAAoD;AACpD,+BAA+B;AAC/B,+CAA+C;AAC/C,IAAI;AAEJ,qDAAqD;AACrD,+BAA+B;AAC/B,4BAA4B;AAC5B,4BAA4B;AAC5B,MAAM;AACN,qCAAqC;AACrC,2EAA2E;AAC3E,IAAI;AAEJ,kEAAkE;AAClE,2GAA2G;AAE3G,qBAAqB;AACrB,6BAA6B;AAC7B,SAAS;AACT,eAAe;AACf,WAAW;AACX,QAAQ;AACR,eAAe;AACf,WAAW;AACX,QAAQ;AACR,cAAc;AACd,kBAAkB;AAClB,YAAY;AACZ,MAAM;AACN,MAAM;AAEN,oDAAoD;AACpD,WAAW;AACX,iBAAiB;AACjB,2BAA2B;AAC3B,OAAO;AAEP,oCAAoC;AACpC,yEAAyE;AACzE,MAAM;AAEN,gCAAgC;AAChC,oDAAoD;AACpD,MAAM;AAEN,gCAAgC;AAChC,IAAI;AAEJ,mEAAmE;AACnE,iEAAiE;AACjE,IAAI;AAEJ,oEAAoE;AACpE,mEAAmE;AACnE,qDAAqD;AACrD,0EAA0E;AAC1E,8CAA8C;AAC9C,IAAI;AAEJ,oCAAoC;AACpC,sBAAsB;AACtB,yBAAyB;AACzB,0BAA0B;AAC1B,oDAAoD;AACpD,iDAAiD;AAEjD,oCAAoC;AACpC,iBAAiB;AACjB,eAAe;AACf,gBAAgB;AAChB,cAAc;AACd,cAAc;AACd,UAAU;AACV,eAAe;AACf,uCAAuC;AACvC,uCAAuC;AACvC,uBAAuB;AACvB,qBAAqB;AACrB,2BAA2B;AAC3B,OAAO;AAEP,4CAA4C;AAC5C,IAAI;AAEJ,0BAA0B;AAC1B,uDAAuD;AACvD,mBAAmB;AACnB,iFAAiF;AACjF,uBAAuB;AACvB,MAAM;AAEN,qDAAqD;AACrD,0CAA0C;AAC1C,mBAAmB;AACnB,uEAAuE;AACvE,aAAa;AACb,wEAAwE;AACxE,4CAA4C;AAC5C,mCAAmC;AACnC,+DAA+D;AAC/D,MAAM;AACN,0BAA0B;AAE1B,0DAA0D;AAC1D,oDAAoD;AACpD,mEAAmE;AACnE,kEAAkE;AAElE,iEAAiE;AACjE,mCAAmC;AACnC,IAAI;AAEJ,wBAAwB;AACxB,0CAA0C;AAC1C,qBAAqB;AACrB,MAAM"}
@@ -30,7 +30,9 @@ class Executor01BytecodeBuilder extends ExecutorBytecodeBuilder_1.ExecutorByteco
30
30
  const isEthSrc = (0, utils_1.isETHAddress)(srcToken);
31
31
  const isEthDest = (0, utils_1.isETHAddress)(destToken);
32
32
  const exchangeParam = exchangeParams[exchangeParamIndex];
33
- const { dexFuncHasRecipient, needWrapNative, specialDexFlag, specialDexSupportsInsertFromAmount, swappedAmountNotPresentInExchangeData, preSwapUnwrapCalldata, sendEthButSupportsInsertFromAmount, } = exchangeParam;
33
+ const { dexFuncHasRecipient, needWrapNative, needUnwrapNative, specialDexFlag, specialDexSupportsInsertFromAmount, swappedAmountNotPresentInExchangeData, sendEthButSupportsInsertFromAmount, } = exchangeParam;
34
+ const isWETHSrc = !!needUnwrapNative && this.dexHelper.config.isWETH(srcToken);
35
+ const isWETHDest = !!needUnwrapNative && this.dexHelper.config.isWETH(destToken);
34
36
  const needWrap = needWrapNative && isEthSrc && maybeWethCallData?.deposit;
35
37
  const needUnwrap = needWrapNative && isEthDest && maybeWethCallData?.withdraw;
36
38
  const isSpecialDex = specialDexFlag !== undefined && specialDexFlag !== types_1.SpecialDex.DEFAULT;
@@ -59,12 +61,20 @@ class Executor01BytecodeBuilder extends ExecutorBytecodeBuilder_1.ExecutorByteco
59
61
  ? types_1.Flag.DONT_INSERT_FROM_AMOUNT_CHECK_SRC_TOKEN_BALANCE_AFTER_SWAP
60
62
  : types_1.Flag.INSERT_FROM_AMOUNT_CHECK_SRC_TOKEN_BALANCE_AFTER_SWAP; // 8 or 11
61
63
  }
62
- // Actual srcToken is eth, because we'll unwrap weth before swap.
63
- // Need to check balance, some dexes don't have 1:1 ETH -> custom_ETH rate
64
- if (preSwapUnwrapCalldata) {
64
+ // DEX operates on native ETH; we unwrap WETH to ETH before the call, then
65
+ // check WETH src balance (should be 0) after. Some DEXes don't have a 1:1
66
+ // ETH -> custom_ETH rate.
67
+ if (isWETHSrc) {
65
68
  dexFlag =
66
69
  types_1.Flag.SEND_ETH_EQUAL_TO_FROM_AMOUNT_CHECK_SRC_TOKEN_BALANCE_AFTER_SWAP;
67
70
  }
71
+ else if (isWETHDest) {
72
+ // DEX returns native ETH; wrap after. Check ETH balance post-swap so the
73
+ // wrap amount can be picked up from it.
74
+ dexFlag = forcePreventInsertFromAmount
75
+ ? types_1.Flag.DONT_INSERT_FROM_AMOUNT_CHECK_ETH_BALANCE_AFTER_SWAP
76
+ : types_1.Flag.INSERT_FROM_AMOUNT_CHECK_ETH_BALANCE_AFTER_SWAP;
77
+ }
68
78
  return {
69
79
  dexFlag,
70
80
  approveFlag,
@@ -89,10 +99,12 @@ class Executor01BytecodeBuilder extends ExecutorBytecodeBuilder_1.ExecutorByteco
89
99
  const swap = priceRoute.bestRoute[routeIndex].swaps[swapIndex];
90
100
  const { srcToken, destToken } = swap;
91
101
  const exchangeParam = exchangeParams[exchangeParamIndex];
92
- const { dexFuncHasRecipient, needWrapNative, specialDexFlag, specialDexSupportsInsertFromAmount, swappedAmountNotPresentInExchangeData, sendEthButSupportsInsertFromAmount, preSwapUnwrapCalldata, } = exchangeParam;
102
+ const { dexFuncHasRecipient, needWrapNative, needUnwrapNative, specialDexFlag, specialDexSupportsInsertFromAmount, swappedAmountNotPresentInExchangeData, sendEthButSupportsInsertFromAmount, } = exchangeParam;
93
103
  const isLastSwap = swapIndex === priceRoute.bestRoute[routeIndex].swaps.length - 1;
94
104
  const isEthSrc = (0, utils_1.isETHAddress)(srcToken);
95
105
  const isEthDest = (0, utils_1.isETHAddress)(destToken);
106
+ const isWETHSrc = !!needUnwrapNative && this.dexHelper.config.isWETH(srcToken);
107
+ const isWETHDest = !!needUnwrapNative && this.dexHelper.config.isWETH(destToken);
96
108
  const isSpecialDex = specialDexFlag !== undefined && specialDexFlag !== types_1.SpecialDex.DEFAULT;
97
109
  const forcePreventInsertFromAmount = swappedAmountNotPresentInExchangeData ||
98
110
  (isSpecialDex && !specialDexSupportsInsertFromAmount);
@@ -139,12 +151,15 @@ class Executor01BytecodeBuilder extends ExecutorBytecodeBuilder_1.ExecutorByteco
139
151
  ? types_1.Flag.DONT_INSERT_FROM_AMOUNT_DONT_CHECK_BALANCE_AFTER_SWAP // 0
140
152
  : types_1.Flag.INSERT_FROM_AMOUNT_DONT_CHECK_BALANCE_AFTER_SWAP; // 3
141
153
  }
142
- // Actual srcToken is eth, because we'll unwrap weth before swap.
143
- // Need to check balance, some dexes don't have 1:1 ETH -> custom_ETH rate
144
- if (preSwapUnwrapCalldata) {
154
+ if (isWETHSrc) {
145
155
  dexFlag =
146
156
  types_1.Flag.SEND_ETH_EQUAL_TO_FROM_AMOUNT_CHECK_SRC_TOKEN_BALANCE_AFTER_SWAP;
147
157
  }
158
+ else if (isWETHDest) {
159
+ dexFlag = forcePreventInsertFromAmount
160
+ ? types_1.Flag.DONT_INSERT_FROM_AMOUNT_CHECK_ETH_BALANCE_AFTER_SWAP
161
+ : types_1.Flag.INSERT_FROM_AMOUNT_CHECK_ETH_BALANCE_AFTER_SWAP;
162
+ }
148
163
  return {
149
164
  dexFlag,
150
165
  approveFlag,
@@ -165,13 +180,23 @@ class Executor01BytecodeBuilder extends ExecutorBytecodeBuilder_1.ExecutorByteco
165
180
  isLastSwap: index === priceRoute.bestRoute[0].swaps.length - 1,
166
181
  flag: flags.dexes[index],
167
182
  });
168
- if (curExchangeParam.preSwapUnwrapCalldata) {
169
- const withdrawCallData = this.buildUnwrapEthCallData(this.getWETHAddress(curExchangeParam), curExchangeParam.preSwapUnwrapCalldata);
183
+ const isWETHSrcUnwrap = !!curExchangeParam.needUnwrapNative &&
184
+ this.dexHelper.config.isWETH(swap.srcToken);
185
+ const isWETHDestWrap = !!curExchangeParam.needUnwrapNative &&
186
+ this.dexHelper.config.isWETH(swap.destToken);
187
+ if (isWETHSrcUnwrap) {
188
+ const withdrawCallData = this.buildUnwrapEthCallData(this.getWETHAddress(curExchangeParam), this.erc20Interface.encodeFunctionData('withdraw', [
189
+ swap.swapExchanges[0].srcAmount,
190
+ ]));
170
191
  swapCallData = hexConcat([withdrawCallData, dexCallData]);
171
192
  }
172
193
  else {
173
194
  swapCallData = hexConcat([dexCallData]);
174
195
  }
196
+ if (isWETHDestWrap) {
197
+ const depositCallData = this.buildWrapEthCallData(this.getWETHAddress(curExchangeParam), this.erc20Interface.encodeFunctionData('deposit'), types_1.Flag.SEND_ETH_EQUAL_TO_FROM_AMOUNT_DONT_CHECK_BALANCE_AFTER_SWAP);
198
+ swapCallData = hexConcat([swapCallData, depositCallData]);
199
+ }
175
200
  if (curExchangeParam.transferSrcTokenBeforeSwap) {
176
201
  const transferCallData = this.buildTransferCallData(this.erc20Interface.encodeFunctionData('transfer', [
177
202
  curExchangeParam.transferSrcTokenBeforeSwap,