@paraswap/dex-lib 3.11.8 → 3.11.10-stader.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 (266) hide show
  1. package/.idea/aws.xml +17 -0
  2. package/.idea/codeStyles/Project.xml +19 -0
  3. package/.idea/codeStyles/codeStyleConfig.xml +5 -0
  4. package/.idea/misc.xml +6 -0
  5. package/.idea/modules.xml +8 -0
  6. package/.idea/paraswap-dex-lib.iml +9 -0
  7. package/.idea/prettier.xml +7 -0
  8. package/.idea/vcs.xml +6 -0
  9. package/build/abi/SSPM.json +829 -0
  10. package/build/abi/StaderOracle.json +2170 -0
  11. package/build/abi/{inception/inception-ineth-pool.json → cables/CablesMainnetRFQ.json} +511 -490
  12. package/build/abi/integral/factory.json +333 -0
  13. package/build/abi/integral/oracle.json +501 -0
  14. package/build/abi/integral/pool.json +1041 -0
  15. package/build/abi/{wombat/pool.json → integral/relayer.json} +720 -473
  16. package/build/dex/aave-v1/aave-v1.d.ts +1 -2
  17. package/build/dex/aave-v1/aave-v1.js +0 -23
  18. package/build/dex/aave-v1/aave-v1.js.map +1 -1
  19. package/build/dex/cables/cables.d.ts +59 -0
  20. package/build/dex/cables/cables.js +614 -0
  21. package/build/dex/cables/cables.js.map +1 -0
  22. package/build/dex/cables/config.d.ts +4 -0
  23. package/build/dex/cables/config.js +15 -0
  24. package/build/dex/cables/config.js.map +1 -0
  25. package/build/dex/cables/constants.d.ts +20 -0
  26. package/build/dex/cables/constants.js +24 -0
  27. package/build/dex/cables/constants.js.map +1 -0
  28. package/build/dex/cables/rate-fetcher.d.ts +34 -0
  29. package/build/dex/cables/rate-fetcher.js +106 -0
  30. package/build/dex/cables/rate-fetcher.js.map +1 -0
  31. package/build/dex/cables/types.d.ts +113 -0
  32. package/build/dex/cables/types.js +19 -0
  33. package/build/dex/cables/types.js.map +1 -0
  34. package/build/dex/cables/validators.d.ts +5 -0
  35. package/build/dex/cables/validators.js +49 -0
  36. package/build/dex/cables/validators.js.map +1 -0
  37. package/build/dex/fluid-dex/fluid-dex-generate-pool.d.ts +49 -0
  38. package/build/dex/fluid-dex/fluid-dex-generate-pool.js +104 -0
  39. package/build/dex/fluid-dex/fluid-dex-generate-pool.js.map +1 -0
  40. package/build/dex/index.js +2 -0
  41. package/build/dex/index.js.map +1 -1
  42. package/build/dex/integral/config.d.ts +4 -0
  43. package/build/dex/integral/config.js +20 -0
  44. package/build/dex/integral/config.js.map +1 -0
  45. package/build/dex/integral/context.d.ts +40 -0
  46. package/build/dex/integral/context.js +158 -0
  47. package/build/dex/integral/context.js.map +1 -0
  48. package/build/dex/integral/integral-factory.d.ts +24 -0
  49. package/build/dex/integral/integral-factory.js +95 -0
  50. package/build/dex/integral/integral-factory.js.map +1 -0
  51. package/build/dex/integral/integral-pool.d.ts +50 -0
  52. package/build/dex/integral/integral-pool.js +149 -0
  53. package/build/dex/integral/integral-pool.js.map +1 -0
  54. package/build/dex/integral/integral-pricing.d.ts +18 -0
  55. package/build/dex/integral/integral-pricing.js +114 -0
  56. package/build/dex/integral/integral-pricing.js.map +1 -0
  57. package/build/dex/integral/integral-relayer.d.ts +42 -0
  58. package/build/dex/integral/integral-relayer.js +192 -0
  59. package/build/dex/integral/integral-relayer.js.map +1 -0
  60. package/build/dex/integral/integral-token.d.ts +27 -0
  61. package/build/dex/integral/integral-token.js +59 -0
  62. package/build/dex/integral/integral-token.js.map +1 -0
  63. package/build/dex/integral/integral.d.ts +41 -0
  64. package/build/dex/integral/integral.js +376 -0
  65. package/build/dex/integral/integral.js.map +1 -0
  66. package/build/dex/integral/types.d.ts +85 -0
  67. package/build/dex/integral/types.js +9 -0
  68. package/build/dex/integral/types.js.map +1 -0
  69. package/build/dex/integral/utils-e2e.d.ts +9 -0
  70. package/build/dex/integral/utils-e2e.js +131 -0
  71. package/build/dex/integral/utils-e2e.js.map +1 -0
  72. package/build/dex/integral/utils.d.ts +17 -0
  73. package/build/dex/integral/utils.js +94 -0
  74. package/build/dex/integral/utils.js.map +1 -0
  75. package/build/dex/jarvis.d.ts +1 -2
  76. package/build/dex/jarvis.js +0 -58
  77. package/build/dex/jarvis.js.map +1 -1
  78. package/build/dex/pancakeswap-v3/pancakeswap-v3-pool.d.ts +0 -1
  79. package/build/dex/pancakeswap-v3/pancakeswap-v3-pool.js +0 -20
  80. package/build/dex/pancakeswap-v3/pancakeswap-v3-pool.js.map +1 -1
  81. package/build/dex/pancakeswap-v3/pancakeswap-v3.js +0 -4
  82. package/build/dex/pancakeswap-v3/pancakeswap-v3.js.map +1 -1
  83. package/build/dex/platypus/platypus.d.ts +1 -2
  84. package/build/dex/platypus/platypus.js +0 -45
  85. package/build/dex/platypus/platypus.js.map +1 -1
  86. package/build/dex/stable-pool.js +8 -1
  87. package/build/dex/stable-pool.js.map +1 -1
  88. package/build/dex/{usual-m-usd0 → stader}/config.d.ts +1 -1
  89. package/build/dex/stader/config.js +14 -0
  90. package/build/dex/stader/config.js.map +1 -0
  91. package/build/dex/stader/stader-pool.d.ts +18 -0
  92. package/build/dex/stader/stader-pool.js +47 -0
  93. package/build/dex/stader/stader-pool.js.map +1 -0
  94. package/build/dex/stader/stader.d.ts +42 -0
  95. package/build/dex/stader/stader.js +171 -0
  96. package/build/dex/stader/stader.js.map +1 -0
  97. package/build/dex/stader/types.d.ts +13 -0
  98. package/build/dex/stader/types.js +8 -0
  99. package/build/dex/stader/types.js.map +1 -0
  100. package/build/dex/stader/utils.d.ts +4 -0
  101. package/build/dex/stader/utils.js +24 -0
  102. package/build/dex/stader/utils.js.map +1 -0
  103. package/build/dex/swaap-v1/swaap-v1.d.ts +1 -2
  104. package/build/dex/swaap-v1/swaap-v1.js +0 -14
  105. package/build/dex/swaap-v1/swaap-v1.js.map +1 -1
  106. package/build/dex/trader-joe-v2.1/optimizer.d.ts +2 -0
  107. package/build/dex/{balancer-v3 → trader-joe-v2.1}/optimizer.js +16 -17
  108. package/build/dex/trader-joe-v2.1/optimizer.js.map +1 -0
  109. package/build/dex/uniswap-v3/uniswap-v3-pool.d.ts +0 -1
  110. package/build/dex/uniswap-v3/uniswap-v3-pool.js +0 -20
  111. package/build/dex/uniswap-v3/uniswap-v3-pool.js.map +1 -1
  112. package/build/dex/uniswap-v3/uniswap-v3.js +0 -5
  113. package/build/dex/uniswap-v3/uniswap-v3.js.map +1 -1
  114. package/build/dex/zerox/index.d.ts +26 -4
  115. package/build/dex/zerox/index.js +42 -50
  116. package/build/dex/zerox/index.js.map +1 -1
  117. package/build/dex/zerox/types.d.ts +0 -29
  118. package/build/dex/zerox/types.js +1 -8
  119. package/build/dex/zerox/types.js.map +1 -1
  120. package/package.json +1 -1
  121. package/src/abi/SSPM.json +829 -0
  122. package/src/abi/StaderOracle.json +2170 -0
  123. package/src/dex/index.ts +2 -0
  124. package/src/dex/pancakeswap-v3/pancakeswap-v3-pool.ts +0 -30
  125. package/src/dex/pancakeswap-v3/pancakeswap-v3.ts +0 -10
  126. package/src/dex/stader/config.ts +13 -0
  127. package/src/dex/stader/stader-e2e.test.ts +74 -0
  128. package/src/dex/stader/stader-events.test.ts +64 -0
  129. package/src/dex/stader/stader-integration.test.ts +240 -0
  130. package/src/dex/stader/stader-pool.ts +68 -0
  131. package/src/dex/stader/stader.ts +240 -0
  132. package/src/dex/stader/types.ts +16 -0
  133. package/src/dex/stader/utils.ts +34 -0
  134. package/src/dex/uniswap-v3/uniswap-v3-pool.ts +0 -30
  135. package/src/dex/uniswap-v3/uniswap-v3.ts +0 -11
  136. package/tests/constants-e2e.ts +5 -0
  137. package/.vscode/launch.json +0 -53
  138. package/.vscode/settings.json +0 -2
  139. package/.vscode/tasks.json +0 -15
  140. package/build/abi/balancer-v3/batch-router.json +0 -989
  141. package/build/abi/balancer-v3/router.json +0 -1792
  142. package/build/abi/balancer-v3/vault-extension.json +0 -2834
  143. package/build/abi/inception/inception-ratio-feed.json +0 -329
  144. package/build/abi/inception/inception-vault.json +0 -991
  145. package/build/abi/permit2.json +0 -581
  146. package/build/abi/uniswap-v3/AlienBaseV3Router.abi.json +0 -52
  147. package/build/abi/usual-m-smart-m/usualM.abi.json +0 -483
  148. package/build/abi/usual-m-usd0/usualCollateralDao.abi.json +0 -681
  149. package/build/dex/aave-v2/tokens-avalanche.json +0 -44
  150. package/build/dex/aave-v2/tokens-mainnet.json +0 -188
  151. package/build/dex/aave-v2/tokens-polygon.json +0 -44
  152. package/build/dex/balancer-v3/abi/balancerBatchRouter.d.ts +0 -729
  153. package/build/dex/balancer-v3/abi/balancerBatchRouter.js +0 -732
  154. package/build/dex/balancer-v3/abi/balancerBatchRouter.js.map +0 -1
  155. package/build/dex/balancer-v3/abi/balancerRouter.d.ts +0 -1406
  156. package/build/dex/balancer-v3/abi/balancerRouter.js +0 -1175
  157. package/build/dex/balancer-v3/abi/balancerRouter.js.map +0 -1
  158. package/build/dex/balancer-v3/abi/vaultExtension.V3.d.ts +0 -2081
  159. package/build/dex/balancer-v3/abi/vaultExtension.V3.js +0 -1851
  160. package/build/dex/balancer-v3/abi/vaultExtension.V3.js.map +0 -1
  161. package/build/dex/balancer-v3/balancer-v3-pool.d.ts +0 -80
  162. package/build/dex/balancer-v3/balancer-v3-pool.js +0 -461
  163. package/build/dex/balancer-v3/balancer-v3-pool.js.map +0 -1
  164. package/build/dex/balancer-v3/balancer-v3-sepolia-pools.d.ts +0 -34
  165. package/build/dex/balancer-v3/balancer-v3-sepolia-pools.js +0 -406
  166. package/build/dex/balancer-v3/balancer-v3-sepolia-pools.js.map +0 -1
  167. package/build/dex/balancer-v3/balancer-v3.d.ts +0 -57
  168. package/build/dex/balancer-v3/balancer-v3.js +0 -383
  169. package/build/dex/balancer-v3/balancer-v3.js.map +0 -1
  170. package/build/dex/balancer-v3/config.d.ts +0 -8
  171. package/build/dex/balancer-v3/config.js +0 -24
  172. package/build/dex/balancer-v3/config.js.map +0 -1
  173. package/build/dex/balancer-v3/getGasCost.d.ts +0 -2
  174. package/build/dex/balancer-v3/getGasCost.js +0 -41
  175. package/build/dex/balancer-v3/getGasCost.js.map +0 -1
  176. package/build/dex/balancer-v3/getOnChainState.d.ts +0 -10
  177. package/build/dex/balancer-v3/getOnChainState.js +0 -164
  178. package/build/dex/balancer-v3/getOnChainState.js.map +0 -1
  179. package/build/dex/balancer-v3/getPoolsApi.d.ts +0 -2
  180. package/build/dex/balancer-v3/getPoolsApi.js +0 -81
  181. package/build/dex/balancer-v3/getPoolsApi.js.map +0 -1
  182. package/build/dex/balancer-v3/getTopPoolsApi.d.ts +0 -13
  183. package/build/dex/balancer-v3/getTopPoolsApi.js +0 -62
  184. package/build/dex/balancer-v3/getTopPoolsApi.js.map +0 -1
  185. package/build/dex/balancer-v3/optimizer.d.ts +0 -2
  186. package/build/dex/balancer-v3/optimizer.js.map +0 -1
  187. package/build/dex/balancer-v3/stablePool.d.ts +0 -7
  188. package/build/dex/balancer-v3/stablePool.js +0 -73
  189. package/build/dex/balancer-v3/stablePool.js.map +0 -1
  190. package/build/dex/balancer-v3/types.d.ts +0 -62
  191. package/build/dex/balancer-v3/types.js +0 -3
  192. package/build/dex/balancer-v3/types.js.map +0 -1
  193. package/build/dex/balancer-v3/weightedPool.d.ts +0 -1
  194. package/build/dex/balancer-v3/weightedPool.js +0 -6
  195. package/build/dex/balancer-v3/weightedPool.js.map +0 -1
  196. package/build/dex/inception/config.d.ts +0 -4
  197. package/build/dex/inception/config.js +0 -109
  198. package/build/dex/inception/config.js.map +0 -1
  199. package/build/dex/inception/inception-event-pool.d.ts +0 -16
  200. package/build/dex/inception/inception-event-pool.js +0 -49
  201. package/build/dex/inception/inception-event-pool.js.map +0 -1
  202. package/build/dex/inception/inception.d.ts +0 -43
  203. package/build/dex/inception/inception.js +0 -180
  204. package/build/dex/inception/inception.js.map +0 -1
  205. package/build/dex/inception/tokens.d.ts +0 -9
  206. package/build/dex/inception/tokens.js +0 -28
  207. package/build/dex/inception/tokens.js.map +0 -1
  208. package/build/dex/inception/types.d.ts +0 -22
  209. package/build/dex/inception/types.js +0 -3
  210. package/build/dex/inception/types.js.map +0 -1
  211. package/build/dex/inception/utils.d.ts +0 -7
  212. package/build/dex/inception/utils.js +0 -58
  213. package/build/dex/inception/utils.js.map +0 -1
  214. package/build/dex/maker-psm/scripts/gem.abi.json +0 -136
  215. package/build/dex/maker-psm/scripts/validate-state.d.ts +0 -0
  216. package/build/dex/maker-psm/scripts/validate-state.js +0 -185
  217. package/build/dex/maker-psm/scripts/validate-state.js.map +0 -1
  218. package/build/dex/maker-psm/scripts/vat.abi.json +0 -243
  219. package/build/dex/solidly-v3/scripts/check-event-pool-event.d.ts +0 -1
  220. package/build/dex/solidly-v3/scripts/check-event-pool-event.js +0 -53
  221. package/build/dex/solidly-v3/scripts/check-event-pool-event.js.map +0 -1
  222. package/build/dex/uniswap-v3/forks/alien-base-v3/alien-base-v3.d.ts +0 -17
  223. package/build/dex/uniswap-v3/forks/alien-base-v3/alien-base-v3.js +0 -64
  224. package/build/dex/uniswap-v3/forks/alien-base-v3/alien-base-v3.js.map +0 -1
  225. package/build/dex/uniswap-v3/forks/alien-v3/alien-v3.d.ts +0 -17
  226. package/build/dex/uniswap-v3/forks/alien-v3/alien-v3.js +0 -79
  227. package/build/dex/uniswap-v3/forks/alien-v3/alien-v3.js.map +0 -1
  228. package/build/dex/uniswap-v3/uniswap-v3-pricing.d.ts +0 -4
  229. package/build/dex/uniswap-v3/uniswap-v3-pricing.js +0 -43
  230. package/build/dex/uniswap-v3/uniswap-v3-pricing.js.map +0 -1
  231. package/build/dex/uniswap-v3/uniswap-v3-worker.d.ts +0 -1
  232. package/build/dex/uniswap-v3/uniswap-v3-worker.js +0 -10
  233. package/build/dex/uniswap-v3/uniswap-v3-worker.js.map +0 -1
  234. package/build/dex/usual/types.d.ts +0 -13
  235. package/build/dex/usual/types.js +0 -3
  236. package/build/dex/usual/types.js.map +0 -1
  237. package/build/dex/usual/usual-bond.d.ts +0 -18
  238. package/build/dex/usual/usual-bond.js +0 -52
  239. package/build/dex/usual/usual-bond.js.map +0 -1
  240. package/build/dex/usual/usual-m-smart-m.d.ts +0 -17
  241. package/build/dex/usual/usual-m-smart-m.js +0 -50
  242. package/build/dex/usual/usual-m-smart-m.js.map +0 -1
  243. package/build/dex/usual/usual-m-usd0.d.ts +0 -17
  244. package/build/dex/usual/usual-m-usd0.js +0 -51
  245. package/build/dex/usual/usual-m-usd0.js.map +0 -1
  246. package/build/dex/usual/usual.d.ts +0 -27
  247. package/build/dex/usual/usual.js +0 -125
  248. package/build/dex/usual/usual.js.map +0 -1
  249. package/build/dex/usual-m-smart-m/config.d.ts +0 -3
  250. package/build/dex/usual-m-smart-m/config.js +0 -13
  251. package/build/dex/usual-m-smart-m/config.js.map +0 -1
  252. package/build/dex/usual-m-smart-m/types.d.ts +0 -7
  253. package/build/dex/usual-m-smart-m/types.js +0 -3
  254. package/build/dex/usual-m-smart-m/types.js.map +0 -1
  255. package/build/dex/usual-m-smart-m/usual-m-smart-m.d.ts +0 -35
  256. package/build/dex/usual-m-smart-m/usual-m-smart-m.js +0 -161
  257. package/build/dex/usual-m-smart-m/usual-m-smart-m.js.map +0 -1
  258. package/build/dex/usual-m-usd0/config.js +0 -14
  259. package/build/dex/usual-m-usd0/config.js.map +0 -1
  260. package/build/dex/usual-m-usd0/types.d.ts +0 -8
  261. package/build/dex/usual-m-usd0/types.js +0 -3
  262. package/build/dex/usual-m-usd0/types.js.map +0 -1
  263. package/build/dex/usual-m-usd0/usual-m-usd0.d.ts +0 -35
  264. package/build/dex/usual-m-usd0/usual-m-usd0.js +0 -159
  265. package/build/dex/usual-m-usd0/usual-m-usd0.js.map +0 -1
  266. package/src/dex/balancer-v3/balancer-v3-sepolia-pools.ts +0 -404
@@ -0,0 +1,240 @@
1
+ import { Interface, JsonFragment } from '@ethersproject/abi';
2
+ import { NumberAsString, SwapSide } from '@paraswap/core';
3
+ import {
4
+ AdapterExchangeParam,
5
+ Address,
6
+ DexExchangeParam,
7
+ ExchangePrices,
8
+ Logger,
9
+ PoolLiquidity,
10
+ PoolPrices,
11
+ Token,
12
+ TransferFeeParams,
13
+ } from '../../types';
14
+ import { IDexTxBuilder } from '../idex';
15
+ import SSPMAbi from '../../abi/SSPM.json';
16
+ import StadeOracleAbi from '../../abi/StaderOracle.json';
17
+ import { ETHER_ADDRESS, Network, NULL_ADDRESS } from '../../constants';
18
+ import { IDexHelper } from '../../dex-helper';
19
+ import { SimpleExchange } from '../simple-exchange';
20
+ import { BI_POWS } from '../../bigint-constants';
21
+ import { AsyncOrSync } from 'ts-essentials';
22
+ import { ETHxEventPool } from './stader-pool';
23
+ import { StaderData, SSPMFunctions } from './types';
24
+ import { StaderConfig } from './config';
25
+ import { WethFunctions } from '../weth/types';
26
+ import ERC20ABI from '../../abi/erc20.json';
27
+ import * as CALLDATA_GAS_COST from '../../calldata-gas-cost';
28
+ import _ from 'lodash';
29
+ import { extractReturnAmountPosition } from '../../executor/utils';
30
+ import { getDexKeysWithNetwork, isETHAddress } from '../../utils';
31
+
32
+ export class Stader
33
+ extends SimpleExchange
34
+ implements IDexTxBuilder<StaderData, any>
35
+ {
36
+ static dexKeys = ['Stader'];
37
+ ETHxAddress: string;
38
+ SSPM_Address: string;
39
+ SSPMInterface: Interface;
40
+ StaderOracleAddress: string;
41
+ StaderOracleInterface: Interface;
42
+ erc20Interface: Interface;
43
+ needWrapNative = false;
44
+ ethxPool: ETHxEventPool;
45
+ logger: Logger;
46
+ hasConstantPriceLargeAmounts: boolean = true;
47
+
48
+ public static dexKeysWithNetwork: { key: string; networks: Network[] }[] =
49
+ getDexKeysWithNetwork(_.pick(StaderConfig, ['Stader']));
50
+
51
+ constructor(
52
+ protected network: Network,
53
+ dexKey: string,
54
+ dexHelper: IDexHelper,
55
+ protected config = StaderConfig[dexKey][network],
56
+ ) {
57
+ super(dexHelper, 'Stader');
58
+ this.network = dexHelper.config.data.network;
59
+ this.ETHxAddress = this.config.ETHx.toLowerCase();
60
+ this.SSPM_Address = this.config.SSPM.toLowerCase();
61
+ this.SSPMInterface = new Interface(SSPMAbi as JsonFragment[]);
62
+ this.StaderOracleAddress = this.config.StaderOracle.toLowerCase();
63
+ this.StaderOracleInterface = new Interface(
64
+ StadeOracleAbi as JsonFragment[],
65
+ );
66
+ this.erc20Interface = new Interface(ERC20ABI);
67
+ this.logger = dexHelper.getLogger(this.dexKey);
68
+ this.ethxPool = new ETHxEventPool(
69
+ this.dexKey,
70
+ dexHelper,
71
+ this.StaderOracleAddress,
72
+ this.StaderOracleInterface,
73
+ this.logger,
74
+ );
75
+ }
76
+
77
+ getAdapterParam(
78
+ srcToken: Address,
79
+ destToken: Address,
80
+ srcAmount: NumberAsString,
81
+ destAmount: NumberAsString,
82
+ data: StaderData,
83
+ side: SwapSide,
84
+ ): AdapterExchangeParam {
85
+ return {
86
+ targetExchange: NULL_ADDRESS,
87
+ payload: '0x',
88
+ networkFee: '0',
89
+ };
90
+ }
91
+
92
+ async initializePricing(blockNumber: number) {
93
+ await this.ethxPool.initialize(blockNumber);
94
+ }
95
+
96
+ async getPricesVolume(
97
+ srcToken: Token,
98
+ destToken: Token,
99
+ amountsIn: bigint[],
100
+ side: SwapSide,
101
+ blockNumber: number,
102
+ limitPools?: string[] | undefined,
103
+ transferFees?: TransferFeeParams | undefined,
104
+ isFirstSwap?: boolean | undefined,
105
+ ): Promise<ExchangePrices<StaderData> | null> {
106
+ if (side === SwapSide.BUY) return null;
107
+ if (!this.isEligibleSwap(srcToken, destToken)) return null;
108
+
109
+ const pool = this.ethxPool;
110
+ if (!pool.getState(blockNumber)) return null;
111
+
112
+ const unitIn = BI_POWS[18];
113
+ const unitOut = pool.getPrice(blockNumber, unitIn);
114
+ const amountsOut = amountsIn.map(amountIn =>
115
+ pool.getPrice(blockNumber, amountIn),
116
+ );
117
+
118
+ return [
119
+ {
120
+ prices: amountsOut,
121
+ unit: unitOut,
122
+ data: {},
123
+ exchange: this.dexKey,
124
+ poolIdentifier: `${ETHER_ADDRESS}_${destToken.address}`.toLowerCase(),
125
+ gasCost: 120_000,
126
+ poolAddresses: [destToken.address],
127
+ },
128
+ ];
129
+ }
130
+
131
+ isEligibleSwap(srcToken: Token | string, destToken: Token | string): boolean {
132
+ const srcTokenAddress = (
133
+ typeof srcToken === 'string' ? srcToken : srcToken.address
134
+ ).toLowerCase();
135
+ const destTokenAddress = (
136
+ typeof destToken === 'string' ? destToken : destToken.address
137
+ ).toLowerCase();
138
+
139
+ return (
140
+ (isETHAddress(srcTokenAddress) || this.isWETH(srcTokenAddress)) &&
141
+ destTokenAddress === this.ETHxAddress
142
+ );
143
+ }
144
+
145
+ getDexParam(
146
+ srcToken: Address,
147
+ _destToken: Address,
148
+ srcAmount: NumberAsString,
149
+ _destAmount: NumberAsString,
150
+ _recipient: Address,
151
+ _data: StaderData,
152
+ _side: SwapSide,
153
+ ): DexExchangeParam {
154
+ if (_side === SwapSide.BUY) throw new Error(`Buy not supported`);
155
+
156
+ const swapData = this.SSPMInterface.encodeFunctionData(
157
+ SSPMFunctions.deposit,
158
+ [_recipient],
159
+ );
160
+
161
+ return {
162
+ needWrapNative: this.needWrapNative,
163
+ dexFuncHasRecipient: true,
164
+ exchangeData: swapData,
165
+ targetExchange: this.config.SSPM.toLowerCase(),
166
+ preSwapUnwrapCalldata: this.isWETH(srcToken)
167
+ ? this.erc20Interface.encodeFunctionData(WethFunctions.withdraw, [
168
+ srcAmount,
169
+ ])
170
+ : undefined,
171
+ returnAmountPos:
172
+ _side === SwapSide.SELL
173
+ ? extractReturnAmountPosition(
174
+ this.SSPMInterface,
175
+ SSPMFunctions.deposit,
176
+ )
177
+ : undefined,
178
+ };
179
+ }
180
+
181
+ async getPoolIdentifiers(
182
+ srcToken: Token,
183
+ destToken: Token,
184
+ side: SwapSide,
185
+ blockNumber: number,
186
+ ): Promise<string[]> {
187
+ if (side === SwapSide.BUY) return [];
188
+
189
+ if (!this.isEligibleSwap(srcToken, destToken)) return [];
190
+
191
+ return [`${ETHER_ADDRESS}_${destToken.address}`.toLowerCase()];
192
+ }
193
+
194
+ getCalldataGasCost(poolPrices: PoolPrices<StaderData>): number | number[] {
195
+ return CALLDATA_GAS_COST.DEX_OVERHEAD + CALLDATA_GAS_COST.LENGTH_SMALL;
196
+ }
197
+
198
+ getAdapters(side: SwapSide): { name: string; index: number }[] | null {
199
+ return null;
200
+ }
201
+
202
+ getTopPoolsForToken(
203
+ tokenAddress: string,
204
+ limit: number,
205
+ ): AsyncOrSync<PoolLiquidity[]> {
206
+ if (isETHAddress(tokenAddress) || this.isWETH(tokenAddress.toLowerCase())) {
207
+ return [
208
+ {
209
+ exchange: this.dexKey,
210
+ address: this.config.ETHx,
211
+ connectorTokens: [
212
+ {
213
+ decimals: 18,
214
+ address: this.config.ETHx,
215
+ },
216
+ ],
217
+ liquidityUSD: 1000000000,
218
+ },
219
+ ];
220
+ }
221
+
222
+ if (tokenAddress.toLowerCase() === this.ETHxAddress.toLowerCase()) {
223
+ const eth = ETHER_ADDRESS;
224
+ const weth = this.dexHelper.config.data.wrappedNativeTokenAddress;
225
+ return [eth, weth].map(t => ({
226
+ exchange: this.dexKey,
227
+ address: this.config.ETHx,
228
+ connectorTokens: [
229
+ {
230
+ decimals: 18,
231
+ address: t,
232
+ },
233
+ ],
234
+ liquidityUSD: 1000000000,
235
+ }));
236
+ }
237
+
238
+ return [];
239
+ }
240
+ }
@@ -0,0 +1,16 @@
1
+ export type ETHxPoolState = {
2
+ totalETHBalance: bigint;
3
+ totalETHXSupply: bigint;
4
+ };
5
+
6
+ export type StaderData = {};
7
+
8
+ export type DexParams = {
9
+ ETHx: string;
10
+ SSPM: string;
11
+ StaderOracle: string;
12
+ };
13
+
14
+ export enum SSPMFunctions {
15
+ deposit = 'deposit',
16
+ }
@@ -0,0 +1,34 @@
1
+ import { Contract } from 'web3-eth-contract';
2
+ import { ETHxPoolState } from './types';
3
+ import { Interface, AbiCoder } from '@ethersproject/abi';
4
+ import { BI_POWS } from '../../bigint-constants';
5
+
6
+ export async function getOnChainStateETHx(
7
+ multiContract: Contract,
8
+ poolAddress: string,
9
+ poolInterface: Interface,
10
+ blockNumber: number | 'latest',
11
+ ): Promise<ETHxPoolState> {
12
+ const coder = new AbiCoder();
13
+ const data: { returnData: any[] } = await multiContract.methods
14
+ .aggregate([
15
+ {
16
+ target: poolAddress,
17
+ callData: poolInterface.encodeFunctionData('getExchangeRate', []),
18
+ },
19
+ ])
20
+ .call({}, blockNumber);
21
+
22
+ const decodedData = coder.decode(
23
+ ['uint256', 'uint256', 'uint256'],
24
+ data.returnData[0],
25
+ );
26
+
27
+ const totalETHBalance = BigInt(decodedData[1].toString());
28
+ const totalETHXSupply = BigInt(decodedData[2].toString());
29
+
30
+ return {
31
+ totalETHBalance,
32
+ totalETHXSupply,
33
+ };
34
+ }
@@ -254,36 +254,6 @@ export class UniswapV3EventPool extends StatefulEventSubscriber<PoolState> {
254
254
  return TICK_BITMAP_TO_USE + TICK_BITMAP_BUFFER;
255
255
  }
256
256
 
257
- async getOrGenerateState(
258
- blockNumber: number,
259
- ): Promise<DeepReadonly<PoolState> | null> {
260
- const state = this.getState(blockNumber);
261
- if (state) {
262
- return state;
263
- }
264
-
265
- this.logger.error(
266
- `UniV3: No state found for ${this.name} ${this.addressesSubscribed[0]}, generating new one`,
267
- );
268
- try {
269
- const newState = await this.generateState(blockNumber);
270
-
271
- if (!newState) {
272
- this.logger.error(
273
- `UniV3: Could not generate state for ${this.name} ${this.addressesSubscribed[0]}`,
274
- );
275
- return null;
276
- }
277
- this.setState(newState, blockNumber);
278
- return newState;
279
- } catch (error) {
280
- this.logger.error(
281
- `UniV3: Failed to generate state for ${this.name} ${this.addressesSubscribed[0]}`,
282
- );
283
- return null;
284
- }
285
- }
286
-
287
257
  async generateState(blockNumber: number): Promise<Readonly<PoolState>> {
288
258
  const callData = this._getStateRequestCallData();
289
259
 
@@ -715,10 +715,6 @@ export class UniswapV3
715
715
 
716
716
  if (selectedPools.length === 0) return null;
717
717
 
718
- await Promise.all(
719
- selectedPools.map(pool => pool.getOrGenerateState(blockNumber)),
720
- );
721
-
722
718
  const poolsToUse = selectedPools.reduce(
723
719
  (acc, pool) => {
724
720
  let state = pool.getState(blockNumber);
@@ -726,7 +722,6 @@ export class UniswapV3
726
722
  this.logger.trace(
727
723
  `${this.dexKey}: State === null. Fallback to rpc ${pool.name}`,
728
724
  );
729
- // as we generate state (if nullified) in previous Promise.all, here should only be pools with failed initialization
730
725
  acc.poolWithoutState.push(pool);
731
726
  } else {
732
727
  acc.poolWithState.push(pool);
@@ -739,12 +734,6 @@ export class UniswapV3
739
734
  },
740
735
  );
741
736
 
742
- poolsToUse.poolWithoutState.forEach(pool => {
743
- this.logger.warn(
744
- `UniV3: Pool ${pool.name} on ${this.dexKey} has no state. Fallback to rpc`,
745
- );
746
- });
747
-
748
737
  const states = poolsToUse.poolWithState.map(
749
738
  p => p.getState(blockNumber)!,
750
739
  );
@@ -92,6 +92,10 @@ export const Tokens: {
92
92
  address: ETHER_ADDRESS,
93
93
  decimals: 18,
94
94
  },
95
+ ETHx: {
96
+ address: '0xA35b1B31Ce002FBF2058D22F30f95D405200A15b',
97
+ decimals: 18,
98
+ },
95
99
  SWETH: {
96
100
  address: '0xf951e335afb289353dc249e82926178eac7ded78',
97
101
  decimals: 18,
@@ -1625,6 +1629,7 @@ export const Holders: {
1625
1629
  sUSDS: '0xd564B3aE673CAa49D054Bf185bD72a6853763eE7',
1626
1630
  SKY: '0x0ddda327A6614130CCb20bc0097313A282176A01',
1627
1631
  MKR: '0xe9aAA7A9DDc0877626C1779AbC29993aD89A6c1f',
1632
+ ETHx: '0xFCC1A2c71F01B7f58Ed538a6B4AAa5A0724eB5A6',
1628
1633
  // Idle tokens
1629
1634
  AA_wstETH: '0xd7C1b48877A7dFA7D51cf1144c89C0A3F134F935',
1630
1635
  'AA_idle_cpPOR-USDC': '0x085c8eaccA6911fE60aE3f8FbAe5F3012E3A05Ec',
@@ -1,53 +0,0 @@
1
- {
2
- "version": "0.2.0",
3
- "configurations": [
4
- {
5
- "type": "node",
6
- "request": "launch",
7
- "name": "Current",
8
- "program": "${file}",
9
- "preLaunchTask": "npm: build",
10
- "sourceMaps": true,
11
- "smartStep": true,
12
- "internalConsoleOptions": "openOnSessionStart",
13
- "outFiles": ["${workspaceFolder}/build/**/*.js"]
14
- },
15
- {
16
- "type": "node",
17
- "request": "launch",
18
- "name": "Debug dex integration",
19
- "program": "${workspaceFolder}/node_modules/ts-node/dist/bin.js",
20
- "args": [
21
- "--project",
22
- "tsconfig.json",
23
- // "${workspaceFolder}/src/dex/algebra/scripts/validate-state.ts",
24
- "${workspaceFolder}/src/dex/camelot/camelot-pool-discovery.test.ts",
25
- // "${workspaceFolder}/src/dex/solidly-v3/scripts/check-event-pool-event.ts",
26
- // "${workspaceFolder}/scripts/dex-integration.ts",
27
- "test",
28
- "wombat"
29
- ],
30
- "console": "integratedTerminal",
31
- "internalConsoleOptions": "neverOpen",
32
- "runtimeArgs": ["--nolazy"],
33
- "sourceMaps": true,
34
- "smartStep": true,
35
- "skipFiles": ["<node_internals>/**"],
36
- "cwd": "${workspaceFolder}"
37
- },
38
- {
39
- "type": "node",
40
- "name": "Jest file",
41
- "request": "launch",
42
- "program": "${workspaceFolder}/node_modules/jest/bin/jest.js",
43
- // "program": "${workspaceFolder}/src/dex/camelot/scripts/validate-state.ts",
44
- // "args": ["src/dex/balancer-v1/balancer-v1-e2e.test.ts"],
45
- // "args": ["${relativeFile}"],
46
- "args": ["${file}"],
47
- "cwd": "${workspaceRoot}",
48
- "console": "integratedTerminal",
49
- "internalConsoleOptions": "neverOpen",
50
- "sourceMaps": true
51
- }
52
- ]
53
- }
@@ -1,2 +0,0 @@
1
- {
2
- }
@@ -1,15 +0,0 @@
1
- {
2
- "version": "2.0.0",
3
- "tasks": [
4
- {
5
- "label": "tsc: build - tsconfig.json",
6
- "type": "typescript",
7
- "tsconfig": "tsconfig.json",
8
- "problemMatcher": ["$tsc"],
9
- "group": {
10
- "kind": "build",
11
- "isDefault": true
12
- }
13
- }
14
- ]
15
- }