@paraswap/dex-lib 3.8.1 → 3.8.3-integral-dex

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 (262) hide show
  1. package/.vscode/launch.json +9 -49
  2. package/.vscode/settings.json +2 -1
  3. package/build/abi/Uncompressor.json +250 -0
  4. package/build/abi/integral/factory.json +333 -0
  5. package/build/abi/integral/oracle.json +501 -0
  6. package/build/abi/integral/pool.json +1041 -0
  7. package/build/abi/{wombat/pool.json → integral/relayer.json} +720 -473
  8. package/build/abi/oswap/oswap.abi.json +452 -0
  9. package/build/config.js +1 -1
  10. package/build/dex/aave-v1/aave-v1.d.ts +1 -2
  11. package/build/dex/aave-v1/aave-v1.js +0 -23
  12. package/build/dex/aave-v1/aave-v1.js.map +1 -1
  13. package/build/dex/compound.js +1 -1
  14. package/build/dex/compound.js.map +1 -1
  15. package/build/dex/curve-v1-factory/config.js +10 -47
  16. package/build/dex/curve-v1-factory/config.js.map +1 -1
  17. package/build/dex/curve-v1-factory/curve-v1-factory.d.ts +2 -2
  18. package/build/dex/curve-v1-factory/curve-v1-factory.js +36 -96
  19. package/build/dex/curve-v1-factory/curve-v1-factory.js.map +1 -1
  20. package/build/dex/curve-v1-factory/price-handlers/functions/constants.js.map +1 -1
  21. package/build/dex/curve-v1-factory/price-handlers/functions/get_dx.js +1 -13
  22. package/build/dex/curve-v1-factory/price-handlers/functions/get_dx.js.map +1 -1
  23. package/build/dex/curve-v1-factory/state-polling-pools/custom-pool-polling.d.ts +2 -2
  24. package/build/dex/curve-v1-factory/state-polling-pools/custom-pool-polling.js +1 -1
  25. package/build/dex/curve-v1-factory/state-polling-pools/custom-pool-polling.js.map +1 -1
  26. package/build/dex/curve-v1-factory/state-polling-pools/factory-pool-polling.js +1 -1
  27. package/build/dex/curve-v1-factory/state-polling-pools/factory-pool-polling.js.map +1 -1
  28. package/build/dex/curve-v1-factory/state-polling-pools/pool-polling-base.d.ts +3 -4
  29. package/build/dex/curve-v1-factory/state-polling-pools/pool-polling-base.js +9 -24
  30. package/build/dex/curve-v1-factory/state-polling-pools/pool-polling-base.js.map +1 -1
  31. package/build/dex/curve-v1-factory/types.d.ts +4 -20
  32. package/build/dex/curve-v1-factory/types.js +3 -11
  33. package/build/dex/curve-v1-factory/types.js.map +1 -1
  34. package/build/dex/curve-v1-stable-ng/config.js +0 -18
  35. package/build/dex/curve-v1-stable-ng/config.js.map +1 -1
  36. package/build/dex/etherfi/etherfi.d.ts +26 -0
  37. package/build/dex/etherfi/etherfi.js +96 -0
  38. package/build/dex/etherfi/etherfi.js.map +1 -0
  39. package/build/dex/index.js +21 -3
  40. package/build/dex/index.js.map +1 -1
  41. package/build/dex/integral/config.d.ts +4 -0
  42. package/build/dex/integral/config.js +20 -0
  43. package/build/dex/integral/config.js.map +1 -0
  44. package/build/dex/integral/context.d.ts +40 -0
  45. package/build/dex/integral/context.js +158 -0
  46. package/build/dex/integral/context.js.map +1 -0
  47. package/build/dex/integral/helpers.d.ts +17 -0
  48. package/build/dex/integral/helpers.js +157 -0
  49. package/build/dex/integral/helpers.js.map +1 -0
  50. package/build/dex/integral/integral-factory.d.ts +21 -0
  51. package/build/dex/integral/integral-factory.js +92 -0
  52. package/build/dex/integral/integral-factory.js.map +1 -0
  53. package/build/dex/integral/integral-pool.d.ts +46 -0
  54. package/build/dex/integral/integral-pool.js +143 -0
  55. package/build/dex/integral/integral-pool.js.map +1 -0
  56. package/build/dex/integral/integral-pricing.d.ts +18 -0
  57. package/build/dex/integral/integral-pricing.js +114 -0
  58. package/build/dex/integral/integral-pricing.js.map +1 -0
  59. package/build/dex/integral/integral-relayer.d.ts +39 -0
  60. package/build/dex/integral/integral-relayer.js +189 -0
  61. package/build/dex/integral/integral-relayer.js.map +1 -0
  62. package/build/dex/integral/integral-token.d.ts +24 -0
  63. package/build/dex/integral/integral-token.js +56 -0
  64. package/build/dex/integral/integral-token.js.map +1 -0
  65. package/build/dex/integral/integral.d.ts +41 -0
  66. package/build/dex/integral/integral.js +377 -0
  67. package/build/dex/integral/integral.js.map +1 -0
  68. package/build/dex/integral/types.d.ts +84 -0
  69. package/build/dex/integral/types.js +9 -0
  70. package/build/dex/integral/types.js.map +1 -0
  71. package/build/dex/integral/utils-e2e.d.ts +9 -0
  72. package/build/dex/integral/utils-e2e.js +131 -0
  73. package/build/dex/integral/utils-e2e.js.map +1 -0
  74. package/build/dex/integral/utils.d.ts +17 -0
  75. package/build/dex/integral/utils.js +94 -0
  76. package/build/dex/integral/utils.js.map +1 -0
  77. package/build/dex/oswap/config.d.ts +5 -0
  78. package/build/dex/oswap/config.js +31 -0
  79. package/build/dex/oswap/config.js.map +1 -0
  80. package/build/dex/oswap/oswap-pool.d.ts +51 -0
  81. package/build/dex/oswap/oswap-pool.js +150 -0
  82. package/build/dex/oswap/oswap-pool.js.map +1 -0
  83. package/build/dex/oswap/oswap.d.ts +46 -0
  84. package/build/dex/oswap/oswap.js +266 -0
  85. package/build/dex/oswap/oswap.js.map +1 -0
  86. package/build/dex/oswap/types.d.ts +20 -0
  87. package/build/dex/oswap/types.js +3 -0
  88. package/build/dex/oswap/types.js.map +1 -0
  89. package/build/dex/platypus/platypus.d.ts +1 -2
  90. package/build/dex/platypus/platypus.js +0 -45
  91. package/build/dex/platypus/platypus.js.map +1 -1
  92. package/build/dex/sdai/config.d.ts +11 -0
  93. package/build/dex/sdai/config.js +21 -0
  94. package/build/dex/sdai/config.js.map +1 -0
  95. package/build/dex/sdai/constants.d.ts +2 -0
  96. package/build/dex/sdai/constants.js +6 -0
  97. package/build/dex/sdai/constants.js.map +1 -0
  98. package/build/dex/sdai/scripts/validate-state.js +102 -0
  99. package/build/dex/sdai/scripts/validate-state.js.map +1 -0
  100. package/build/dex/sdai/sdai-pool.d.ts +16 -0
  101. package/build/dex/sdai/sdai-pool.js +85 -0
  102. package/build/dex/sdai/sdai-pool.js.map +1 -0
  103. package/build/dex/sdai/sdai.d.ts +51 -0
  104. package/build/dex/sdai/sdai.js +172 -0
  105. package/build/dex/sdai/sdai.js.map +1 -0
  106. package/build/dex/sdai/types.d.ts +21 -0
  107. package/build/dex/sdai/types.js +11 -0
  108. package/build/dex/sdai/types.js.map +1 -0
  109. package/build/dex/sdai/utils.d.ts +4 -0
  110. package/build/dex/sdai/utils.js +39 -0
  111. package/build/dex/sdai/utils.js.map +1 -0
  112. package/build/dex/stable-pool.js +8 -1
  113. package/build/dex/stable-pool.js.map +1 -1
  114. package/build/dex/swaap-v1/swaap-v1.d.ts +1 -2
  115. package/build/dex/swaap-v1/swaap-v1.js +0 -14
  116. package/build/dex/swaap-v1/swaap-v1.js.map +1 -1
  117. package/build/dex/uniswap-v3/contract-math/Oracle.js +4 -4
  118. package/build/dex/uniswap-v3/contract-math/Oracle.js.map +1 -1
  119. package/build/executor/compressor/Compressor.d.ts +23 -0
  120. package/build/executor/compressor/Compressor.js +144 -0
  121. package/build/executor/compressor/Compressor.js.map +1 -0
  122. package/build/executor/compressor/compress.d.ts +17 -0
  123. package/build/executor/compressor/compress.js +187 -0
  124. package/build/executor/compressor/compress.js.map +1 -0
  125. package/build/executor/compressor/compress_functions/addressSubstitution.d.ts +6 -0
  126. package/build/executor/compressor/compress_functions/addressSubstitution.js +29 -0
  127. package/build/executor/compressor/compress_functions/addressSubstitution.js.map +1 -0
  128. package/build/executor/compressor/compress_functions/addressSubstitutionFromObject.d.ts +10 -0
  129. package/build/executor/compressor/compress_functions/addressSubstitutionFromObject.js +40 -0
  130. package/build/executor/compressor/compress_functions/addressSubstitutionFromObject.js.map +1 -0
  131. package/build/executor/compressor/compress_functions/byteSubstitution.d.ts +11 -0
  132. package/build/executor/compressor/compress_functions/byteSubstitution.js +64 -0
  133. package/build/executor/compressor/compress_functions/byteSubstitution.js.map +1 -0
  134. package/build/executor/compressor/compress_functions/ffSubstitution.d.ts +7 -0
  135. package/build/executor/compressor/compress_functions/ffSubstitution.js +54 -0
  136. package/build/executor/compressor/compress_functions/ffSubstitution.js.map +1 -0
  137. package/build/executor/compressor/compress_functions/findLongestAndSubstitute.d.ts +8 -0
  138. package/build/executor/compressor/compress_functions/findLongestAndSubstitute.js +67 -0
  139. package/build/executor/compressor/compress_functions/findLongestAndSubstitute.js.map +1 -0
  140. package/build/executor/compressor/compress_functions/findLongestAndSubstitute_old.d.ts +8 -0
  141. package/build/executor/compressor/compress_functions/findLongestAndSubstitute_old.js +61 -0
  142. package/build/executor/compressor/compress_functions/findLongestAndSubstitute_old.js.map +1 -0
  143. package/build/executor/compressor/compress_functions/reverseAddressSubstitution.d.ts +6 -0
  144. package/build/executor/compressor/compress_functions/reverseAddressSubstitution.js +37 -0
  145. package/build/executor/compressor/compress_functions/reverseAddressSubstitution.js.map +1 -0
  146. package/build/executor/compressor/compress_functions/searchUnusedBytes.d.ts +9 -0
  147. package/build/executor/compressor/compress_functions/searchUnusedBytes.js +33 -0
  148. package/build/executor/compressor/compress_functions/searchUnusedBytes.js.map +1 -0
  149. package/build/executor/compressor/fetchSaved.js +17 -0
  150. package/build/executor/compressor/fetchSaved.js.map +1 -0
  151. package/build/executor/compressor/utils/computeCostL2.d.ts +2 -0
  152. package/build/executor/compressor/utils/computeCostL2.js +14 -0
  153. package/build/executor/compressor/utils/computeCostL2.js.map +1 -0
  154. package/build/executor/compressor/utils/findLongestDuplicatedString.d.ts +2 -0
  155. package/build/executor/compressor/utils/findLongestDuplicatedString.js +30 -0
  156. package/build/executor/compressor/utils/findLongestDuplicatedString.js.map +1 -0
  157. package/build/executor/compressor/utils/getAllIndexes.d.ts +2 -0
  158. package/build/executor/compressor/utils/getAllIndexes.js +12 -0
  159. package/build/executor/compressor/utils/getAllIndexes.js.map +1 -0
  160. package/build/executor/compressor/utils/getByteForAddress.d.ts +2 -0
  161. package/build/executor/compressor/utils/getByteForAddress.js +14 -0
  162. package/build/executor/compressor/utils/getByteForAddress.js.map +1 -0
  163. package/build/executor/compressor/utils/intTo2Bytes.d.ts +2 -0
  164. package/build/executor/compressor/utils/intTo2Bytes.js +14 -0
  165. package/build/executor/compressor/utils/intTo2Bytes.js.map +1 -0
  166. package/build/executor/compressor/utils/intTo3Bytes.d.ts +2 -0
  167. package/build/executor/compressor/utils/intTo3Bytes.js +18 -0
  168. package/build/executor/compressor/utils/intTo3Bytes.js.map +1 -0
  169. package/build/executor/compressor/utils/intToByte.d.ts +2 -0
  170. package/build/executor/compressor/utils/intToByte.js +10 -0
  171. package/build/executor/compressor/utils/intToByte.js.map +1 -0
  172. package/build/generic-swap-transaction-builder.js +3 -1
  173. package/build/generic-swap-transaction-builder.js.map +1 -1
  174. package/build/router/simpleswap.js +3 -1
  175. package/build/router/simpleswap.js.map +1 -1
  176. package/package.json +2 -2
  177. package/src/abi/BProtocol.json +1155 -0
  178. package/src/abi/Jarvis.json +1172 -0
  179. package/src/abi/MStableAsset.json +1545 -0
  180. package/src/abi/OneInchLp.json +1304 -0
  181. package/src/abi/Onebit.json +736 -0
  182. package/src/abi/Shell.json +1294 -0
  183. package/src/abi/TraderJoeV2Router.json +50 -0
  184. package/src/abi/integral/factory.json +333 -0
  185. package/src/abi/integral/oracle.json +501 -0
  186. package/src/abi/integral/pool.json +1041 -0
  187. package/src/abi/integral/relayer.json +1536 -0
  188. package/src/abi/zrx.v2.json +1967 -0
  189. package/src/abi/zrx.v3.json +3454 -0
  190. package/src/abi/zrx.v4.json +2193 -0
  191. package/src/config.ts +1 -1
  192. package/src/dex/OneInchLp.ts +84 -0
  193. package/src/dex/bProtocol/bProtocol-e2e.test.ts +93 -0
  194. package/src/dex/bProtocol/bProtocol.ts +108 -0
  195. package/src/dex/bProtocol/types.ts +13 -0
  196. package/src/dex/curve-v1-factory/config.ts +10 -47
  197. package/src/dex/curve-v1-factory/curve-v1-factory-e2e.test.ts +16 -92
  198. package/src/dex/curve-v1-factory/curve-v1-factory-integration.test.ts +5 -125
  199. package/src/dex/curve-v1-factory/curve-v1-factory.ts +45 -137
  200. package/src/dex/curve-v1-factory/price-handlers/functions/constants.ts +2 -0
  201. package/src/dex/curve-v1-factory/price-handlers/functions/get_dx.ts +1 -24
  202. package/src/dex/curve-v1-factory/state-polling-pools/custom-pool-polling.ts +2 -3
  203. package/src/dex/curve-v1-factory/state-polling-pools/factory-pool-polling.ts +0 -1
  204. package/src/dex/curve-v1-factory/state-polling-pools/pool-polling-base.ts +10 -31
  205. package/src/dex/curve-v1-factory/types.ts +6 -22
  206. package/src/dex/curve-v1-stable-ng/config.ts +0 -18
  207. package/src/dex/curve-v1-stable-ng/curve-v1-stable-ng-e2e.test.ts +0 -17
  208. package/src/dex/index.ts +20 -3
  209. package/src/dex/integral/config.ts +20 -0
  210. package/src/dex/integral/context.ts +287 -0
  211. package/src/dex/integral/integral-e2e.test.ts +86 -0
  212. package/src/dex/integral/integral-events.test.ts +412 -0
  213. package/src/dex/integral/integral-factory.ts +146 -0
  214. package/src/dex/integral/integral-integration.test.ts +221 -0
  215. package/src/dex/integral/integral-pool.ts +198 -0
  216. package/src/dex/integral/integral-pricing.ts +190 -0
  217. package/src/dex/integral/integral-relayer.ts +285 -0
  218. package/src/dex/integral/integral-token.ts +95 -0
  219. package/src/dex/integral/integral.ts +523 -0
  220. package/src/dex/integral/test-artifacts/configs.json +1 -0
  221. package/src/dex/integral/test-artifacts/logs.json +1 -0
  222. package/src/dex/integral/test-artifacts/states.json +1 -0
  223. package/src/dex/integral/types.ts +88 -0
  224. package/src/dex/integral/utils-e2e.ts +194 -0
  225. package/src/dex/integral/utils.ts +146 -0
  226. package/src/dex/jarvis.ts +262 -0
  227. package/src/dex/mStable.ts +147 -0
  228. package/src/dex/onebit/onebit.ts +113 -0
  229. package/src/dex/onebit/types.ts +17 -0
  230. package/src/dex/shell.ts +84 -0
  231. package/src/dex/trader-joe-v2.ts +148 -0
  232. package/src/dex/uniswap-v3/contract-math/Oracle.ts +5 -4
  233. package/src/dex/zerox/config.ts +31 -0
  234. package/src/dex/zerox/index.ts +328 -0
  235. package/src/dex/zerox/order.ts +62 -0
  236. package/src/dex/zerox/types.ts +82 -0
  237. package/src/dex/zerox/zerox-e2e.test.ts +110 -0
  238. package/src/generic-swap-transaction-builder.ts +3 -1
  239. package/src/router/simpleswap.ts +3 -1
  240. package/tests/constants-e2e.ts +1 -1
  241. package/tests/utils-e2e.ts +0 -2
  242. package/.vscode/tasks.json +0 -15
  243. package/build/abi/uniswap-v3/AlienBaseV3Router.abi.json +0 -52
  244. package/build/dex/aave-v2/tokens-avalanche.json +0 -44
  245. package/build/dex/aave-v2/tokens-mainnet.json +0 -188
  246. package/build/dex/aave-v2/tokens-polygon.json +0 -44
  247. package/build/dex/maker-psm/scripts/gem.abi.json +0 -136
  248. package/build/dex/maker-psm/scripts/validate-state.js +0 -185
  249. package/build/dex/maker-psm/scripts/validate-state.js.map +0 -1
  250. package/build/dex/maker-psm/scripts/vat.abi.json +0 -243
  251. package/build/dex/solidly-v3/scripts/check-event-pool-event.js +0 -53
  252. package/build/dex/solidly-v3/scripts/check-event-pool-event.js.map +0 -1
  253. package/build/dex/uniswap-v3/forks/alien-base-v3/alien-base-v3.d.ts +0 -17
  254. package/build/dex/uniswap-v3/forks/alien-base-v3/alien-base-v3.js +0 -64
  255. package/build/dex/uniswap-v3/forks/alien-base-v3/alien-base-v3.js.map +0 -1
  256. package/build/dex/uniswap-v3/forks/alien-v3/alien-v3.d.ts +0 -17
  257. package/build/dex/uniswap-v3/forks/alien-v3/alien-v3.js +0 -79
  258. package/build/dex/uniswap-v3/forks/alien-v3/alien-v3.js.map +0 -1
  259. package/src/abi/curve-v1-factory/CurveV1Router.abi.json +0 -331
  260. package/src/dex/curve-v1-factory/optimizer.ts +0 -61
  261. /package/build/dex/{solidly-v3/scripts/check-event-pool-event.d.ts → sdai/scripts/validate-state.d.ts} +0 -0
  262. /package/build/{dex/maker-psm/scripts/validate-state.d.ts → executor/compressor/fetchSaved.d.ts} +0 -0
@@ -0,0 +1,412 @@
1
+ /* eslint-disable no-console */
2
+ import dotenv from 'dotenv';
3
+ dotenv.config();
4
+
5
+ import {
6
+ IntegralFactory,
7
+ OnPoolCreatedCallback,
8
+ } from '../integral/integral-factory';
9
+ import { Network } from '../../constants';
10
+ import { Address } from '../../types';
11
+ import { DummyDexHelper } from '../../dex-helper/index';
12
+ import { testEventSubscriber } from '../../../tests/utils-events';
13
+ import {
14
+ FactoryState,
15
+ PoolState,
16
+ RelayerState,
17
+ TokenState,
18
+ } from '../integral/types';
19
+ import { IntegralConfig } from './config';
20
+ import { IntegralEventPool } from './integral-pool';
21
+ import { Tokens } from '../../../tests/constants-e2e';
22
+ import { IntegralRelayer, OnPoolEnabledSetCallback } from './integral-relayer';
23
+ import ERC20ABI from '../../abi/erc20.json';
24
+ import { Interface } from 'ethers/lib/utils';
25
+ import { updateEventSubscriber, checkEventSubscriber } from './utils-e2e';
26
+ import { IntegralToken } from './integral-token';
27
+ import { IntegralContext } from './context';
28
+
29
+ jest.setTimeout(50 * 1000);
30
+ const dexKey = 'Integral';
31
+ const network = Network.MAINNET;
32
+ const dexHelper = new DummyDexHelper(network);
33
+ const logger = dexHelper.getLogger(dexKey);
34
+ const erc20Interface = new Interface(ERC20ABI);
35
+
36
+ const TEST_POOL_ADDRESS = '0x6ec472b613012a492693697FA551420E60567eA7'; // usdc-usdt pool address
37
+ const _TEST_POOLS = {
38
+ ['0x6ec472b613012a492693697FA551420E60567eA7']: ['USDC', 'USDT'],
39
+ ['0x2fe16Dd18bba26e457B7dD2080d5674312b026a2']: ['WETH', 'USDC'],
40
+ ['0x048f0e7ea2CFD522a4a058D1b1bDd574A0486c46']: ['WETH', 'USDT'],
41
+ ['0x37F6dF71b40c50b2038329CaBf5FDa3682Df1ebF']: ['WETH', 'WBTC'],
42
+ ['0x29b57D56a114aE5BE3c129240898B3321A70A300']: ['WETH', 'wstETH'],
43
+ ['0x61fA1CEe13CEEAF20C30611c5e6dA48c595F7dB2']: [
44
+ 'WETH',
45
+ '0xD33526068D116cE69F19A9ee46F0bd304F21A51f',
46
+ ], // RPL
47
+ ['0x045950A37c59d75496BB4Af68c05f9066A4C7e27']: [
48
+ 'WETH',
49
+ '0x48C3399719B582dD63eB5AADf12A40B4C3f52FA2',
50
+ ], // SWISE
51
+ ['0xbEE7Ef1adfaa628536Ebc0C1EBF082DbDC27265F']: [
52
+ 'WETH',
53
+ '0x5A98FcBEA516Cf06857215779Fd812CA3beF1B32',
54
+ ], // LDO
55
+ };
56
+ const TEST_POOLS = initTestPools();
57
+ const dummyCallback = () => {};
58
+
59
+ function initTestPools() {
60
+ return Object.entries(_TEST_POOLS).reduce<{
61
+ [poolAddress: Address]: { token0: Address; token1: Address };
62
+ }>((memo, [poolAddress, [symbolA, symbolB]]) => {
63
+ const tokenA =
64
+ (Tokens[network][symbolA] &&
65
+ Tokens[network][symbolA].address.toLowerCase()) ||
66
+ symbolA.toLowerCase();
67
+ const tokenB =
68
+ (Tokens[network][symbolB] &&
69
+ Tokens[network][symbolB].address.toLowerCase()) ||
70
+ symbolB.toLowerCase();
71
+ const [token0, token1] =
72
+ tokenA < tokenB ? [tokenA, tokenB] : [tokenB, tokenA];
73
+ memo[poolAddress] = { token0, token1 };
74
+ return memo;
75
+ }, {});
76
+ }
77
+
78
+ async function fetchFactoryState(
79
+ integralFactory: IntegralFactory,
80
+ blockNumber: number,
81
+ factoryAddress: string,
82
+ ): Promise<FactoryState> {
83
+ const message = `Integral Factory: ${factoryAddress} blockNumber ${blockNumber}`;
84
+ console.log(`Fetching state ${message}`);
85
+ return integralFactory.generateState(blockNumber);
86
+ }
87
+
88
+ async function fetchPoolState(
89
+ integralPool: IntegralEventPool,
90
+ blockNumber: number,
91
+ poolAddress: string,
92
+ ): Promise<PoolState> {
93
+ const message = `Integral Pool: ${poolAddress} blockNumber ${blockNumber}`;
94
+ console.log(`Fetching state ${message}`);
95
+ return integralPool.generateState(blockNumber);
96
+ }
97
+
98
+ async function fetchTokenState(
99
+ integralToken: IntegralToken,
100
+ blockNumber: number,
101
+ tokenAddress: string,
102
+ ): Promise<TokenState> {
103
+ const message = `ERC20 Token: ${tokenAddress} blockNumber ${blockNumber}`;
104
+ console.log(`Fetching state ${message}`);
105
+ return integralToken.generateState();
106
+ }
107
+
108
+ async function fetchRelayerState(
109
+ integralRelayer: IntegralRelayer,
110
+ blockNumber: number,
111
+ relayerAddress: string,
112
+ ): Promise<RelayerState> {
113
+ const message = `Integral Relayer: ${relayerAddress} blockNumber ${blockNumber}`;
114
+ console.log(`Fetching state ${message}`);
115
+ return integralRelayer.generateState(blockNumber);
116
+ }
117
+
118
+ // eventName -> blockNumbers
119
+ type EventMappings = Record<string, number[]>;
120
+
121
+ describe('Integral Factory Events Mainnet', function () {
122
+ const onPoolCreated: OnPoolCreatedCallback =
123
+ dummyCallback as unknown as OnPoolCreatedCallback;
124
+ let integralFactory: IntegralFactory;
125
+
126
+ const factoryAddress =
127
+ IntegralConfig[dexKey][network].factoryAddress.toLowerCase();
128
+ // poolAddress -> EventMappings
129
+ const eventsToTest: Record<Address, EventMappings> = {
130
+ [factoryAddress]: {
131
+ PairCreated: [
132
+ 14423189, 14538708, 14722391, 15001878, 16638150, 17022679, 17333304,
133
+ 19011983, 19011987, 19011992, 19012000, 19483224, 19483230, 19483234,
134
+ 19483237,
135
+ ],
136
+ },
137
+ };
138
+
139
+ beforeEach(async () => {
140
+ integralFactory = new IntegralFactory(
141
+ dexHelper,
142
+ dexKey,
143
+ factoryAddress,
144
+ onPoolCreated,
145
+ logger,
146
+ );
147
+ });
148
+
149
+ Object.entries(eventsToTest).forEach(
150
+ ([factoryAddress, events]: [string, EventMappings]) => {
151
+ describe(`Events for Factory: ${factoryAddress}`, () => {
152
+ Object.entries(events).forEach(
153
+ ([eventName, blockNumbers]: [string, number[]]) => {
154
+ describe(`${eventName}`, () => {
155
+ blockNumbers.forEach((blockNumber: number) => {
156
+ it(`State after ${blockNumber}`, async function () {
157
+ await testEventSubscriber<FactoryState>(
158
+ integralFactory,
159
+ integralFactory.addressesSubscribed,
160
+ (_blockNumber: number) =>
161
+ fetchFactoryState(
162
+ integralFactory,
163
+ _blockNumber,
164
+ factoryAddress,
165
+ ),
166
+ blockNumber,
167
+ `${dexKey}_${factoryAddress}`,
168
+ dexHelper.provider,
169
+ );
170
+ });
171
+ });
172
+ });
173
+ },
174
+ );
175
+ });
176
+ },
177
+ );
178
+ });
179
+
180
+ describe('Integral Pool Events Mainnet', function () {
181
+ let integralPool: IntegralEventPool;
182
+
183
+ const eventsToTest: Record<Address, EventMappings> = {
184
+ [TEST_POOL_ADDRESS]: {
185
+ SetSwapFee: [17022687],
186
+ SetMintFee: [],
187
+ SetBurnFee: [],
188
+ },
189
+ };
190
+
191
+ beforeEach(async () => {
192
+ integralPool = new IntegralEventPool(
193
+ dexKey,
194
+ network,
195
+ dexHelper,
196
+ TEST_POOL_ADDRESS,
197
+ TEST_POOLS[TEST_POOL_ADDRESS].token0,
198
+ TEST_POOLS[TEST_POOL_ADDRESS].token1,
199
+ logger,
200
+ );
201
+ });
202
+
203
+ Object.entries(eventsToTest).forEach(
204
+ ([poolAddress, events]: [string, EventMappings]) => {
205
+ describe(`Events for Pool: ${poolAddress}`, () => {
206
+ Object.entries(events).forEach(
207
+ ([eventName, blockNumbers]: [string, number[]]) => {
208
+ describe(`${eventName}`, () => {
209
+ blockNumbers.forEach((blockNumber: number) => {
210
+ it(`State after ${blockNumber}`, async function () {
211
+ await testEventSubscriber<PoolState>(
212
+ integralPool,
213
+ integralPool.addressesSubscribed,
214
+ (_blockNumber: number) =>
215
+ fetchPoolState(integralPool, _blockNumber, poolAddress),
216
+ blockNumber,
217
+ `${dexKey}_${poolAddress}`,
218
+ dexHelper.provider,
219
+ );
220
+ });
221
+ });
222
+ });
223
+ },
224
+ );
225
+ });
226
+ },
227
+ );
228
+ });
229
+
230
+ describe('Integral Relayer Events Mainnet', function () {
231
+ let integralRelayer: IntegralRelayer;
232
+ const onPoolEnabledSet = dummyCallback as unknown as OnPoolEnabledSetCallback;
233
+ const relayerAddress =
234
+ IntegralConfig[dexKey][network].relayerAddress.toLowerCase();
235
+
236
+ const eventsToTest: Record<Address, EventMappings> = {
237
+ [relayerAddress]: {
238
+ SwapFeeSet: [19460786],
239
+ PairEnabledSet: [19133248, 19488170, 19488805],
240
+ UnwrapWeth: [
241
+ 19117714, 19216294, 19272845, 19326496, 19361829, 19389103, 19430619,
242
+ 19473032, 19565232, 19632898, 19660246, 19757979,
243
+ ],
244
+ WrapEth: [],
245
+ },
246
+ };
247
+
248
+ beforeEach(async () => {
249
+ integralRelayer = new IntegralRelayer(
250
+ dexHelper,
251
+ dexKey,
252
+ erc20Interface,
253
+ relayerAddress,
254
+ TEST_POOLS,
255
+ onPoolEnabledSet,
256
+ logger,
257
+ );
258
+ });
259
+
260
+ Object.entries(eventsToTest).forEach(
261
+ ([relayerAddress, events]: [string, EventMappings]) => {
262
+ describe(`Events for Relayer: ${relayerAddress}`, () => {
263
+ Object.entries(events).forEach(
264
+ ([eventName, blockNumbers]: [string, number[]]) => {
265
+ describe(`${eventName}`, () => {
266
+ blockNumbers.forEach((blockNumber: number) => {
267
+ it(`State after ${blockNumber}`, async function () {
268
+ await testEventSubscriber<RelayerState>(
269
+ integralRelayer,
270
+ integralRelayer.addressesSubscribed,
271
+ (_blockNumber: number) =>
272
+ fetchRelayerState(
273
+ integralRelayer,
274
+ _blockNumber,
275
+ relayerAddress,
276
+ ),
277
+ blockNumber,
278
+ `${dexKey}_${relayerAddress}`,
279
+ dexHelper.provider,
280
+ );
281
+ });
282
+ });
283
+ });
284
+ },
285
+ );
286
+ });
287
+ },
288
+ );
289
+ });
290
+
291
+ describe('Integral Multiple Events Mainnet', function () {
292
+ let context: IntegralContext;
293
+ const onPoolEnabledSet = dummyCallback as unknown as OnPoolEnabledSetCallback;
294
+ const relayerAddress =
295
+ IntegralConfig[dexKey][network].relayerAddress.toLowerCase();
296
+
297
+ const eventsToTest: Record<Address, EventMappings> = {
298
+ ['']: {
299
+ Transfer: [
300
+ 18490280, 18567011, 18633511, 18713381, 18764112, 18831592, 18912551,
301
+ 19016598, 19117714, 19216294, 19241751, 19272845, 19326496, 19361829,
302
+ 19389103, 19430619, 19430725, 19473032, 19565232, 19632898, 19660246,
303
+ 19696426, 19701836, 19703192, 19709820, 19711173, 19715839, 19717874,
304
+ 19723287, 19724410, 19728665, 19733351, 19735237, 19738144, 19739161,
305
+ 19748150, 19748662, 19749146, 19752286, 19754012, 19757979, 19760993,
306
+ ],
307
+ },
308
+ };
309
+
310
+ beforeEach(async () => {
311
+ context = IntegralContext.initialize(
312
+ network,
313
+ 'Integral',
314
+ dexHelper,
315
+ erc20Interface,
316
+ IntegralConfig[dexKey][network].factoryAddress.toLowerCase(),
317
+ IntegralConfig[dexKey][network].relayerAddress.toLowerCase(),
318
+ );
319
+ const onTransfer = (
320
+ token: Address,
321
+ from: Address,
322
+ to: Address,
323
+ amount: bigint,
324
+ blockNumber: number,
325
+ ) => context.onTransferUpdateBalance(token, from, to, amount, blockNumber);
326
+ const tokensMap = Object.values(TEST_POOLS).reduce<{
327
+ [tokenAddress: Address]: null;
328
+ }>((memo, { token0, token1 }) => {
329
+ memo[token0.toLowerCase()] = null;
330
+ memo[token1.toLowerCase()] = null;
331
+ return memo;
332
+ }, {});
333
+ Object.keys(tokensMap).map(tokenAddress => {
334
+ context.tokens[tokenAddress] = new IntegralToken(
335
+ network,
336
+ dexHelper,
337
+ dexKey,
338
+ erc20Interface,
339
+ tokenAddress,
340
+ relayerAddress,
341
+ onTransfer,
342
+ logger,
343
+ );
344
+ });
345
+
346
+ const integralRelayer = new IntegralRelayer(
347
+ dexHelper,
348
+ dexKey,
349
+ erc20Interface,
350
+ relayerAddress.toLowerCase(),
351
+ TEST_POOLS,
352
+ onPoolEnabledSet,
353
+ logger,
354
+ );
355
+ context.relayer = integralRelayer;
356
+ });
357
+
358
+ Object.entries(eventsToTest).forEach(
359
+ ([_, events]: [string, EventMappings]) => {
360
+ describe(`Events for Pool & Relayer`, () => {
361
+ Object.entries(events).forEach(
362
+ ([eventName, blockNumbers]: [string, number[]]) => {
363
+ describe(`${eventName}`, () => {
364
+ blockNumbers.forEach((blockNumber: number) => {
365
+ it(`State after ${blockNumber}`, async function () {
366
+ await updateEventSubscriber<RelayerState>(
367
+ context.relayer,
368
+ context.relayer.addressesSubscribed,
369
+ (_blockNumber: number) =>
370
+ fetchRelayerState(
371
+ context.relayer,
372
+ _blockNumber,
373
+ relayerAddress,
374
+ ),
375
+ blockNumber,
376
+ `${dexKey}_${relayerAddress}`,
377
+ dexHelper.provider,
378
+ );
379
+ const tokenArray = Object.values(context.tokens);
380
+ await Promise.all(
381
+ tokenArray.map(async t =>
382
+ updateEventSubscriber<TokenState>(
383
+ t,
384
+ t.addressesSubscribed,
385
+ (_blockNumber: number) =>
386
+ fetchTokenState(t, _blockNumber, t.tokenAddress),
387
+ blockNumber,
388
+ `${dexKey}_${t.tokenAddress}`,
389
+ dexHelper.provider,
390
+ ),
391
+ ),
392
+ );
393
+ await checkEventSubscriber<RelayerState>(
394
+ context.relayer,
395
+ (_blockNumber: number) =>
396
+ fetchRelayerState(
397
+ context.relayer,
398
+ _blockNumber,
399
+ relayerAddress,
400
+ ),
401
+ blockNumber,
402
+ `${dexKey}_${relayerAddress}`,
403
+ );
404
+ });
405
+ });
406
+ });
407
+ },
408
+ );
409
+ });
410
+ },
411
+ );
412
+ });
@@ -0,0 +1,146 @@
1
+ import { Interface } from '@ethersproject/abi';
2
+ import { LogDescription } from 'ethers/lib/utils';
3
+ import { IDexHelper } from '../../dex-helper';
4
+ import { StatefulEventSubscriber } from '../../stateful-event-subscriber';
5
+ import { Address, BlockHeader, Log, Logger } from '../../types';
6
+ import { FactoryState } from './types';
7
+ import IntegralFactoryABI from '../../abi/integral/factory.json';
8
+ import IntegralPoolABI from '../../abi/integral/pool.json';
9
+ import { addressDecode } from '../../lib/decoders';
10
+ import { MultiCallParams } from '../../lib/multi-wrapper';
11
+
12
+ export type OnPoolCreatedCallback = (
13
+ token0: Address,
14
+ token1: Address,
15
+ poolAddress: Address,
16
+ blockNumber: number,
17
+ ) => Promise<void>;
18
+
19
+ export class IntegralFactory extends StatefulEventSubscriber<FactoryState> {
20
+ handlers: {
21
+ [event: string]: (
22
+ event: any,
23
+ state: FactoryState,
24
+ blockHeader: Readonly<BlockHeader>,
25
+ ) => Promise<FactoryState>;
26
+ } = {};
27
+
28
+ logDecoder: (log: Log) => any;
29
+
30
+ public readonly factoryIface = new Interface(IntegralFactoryABI);
31
+
32
+ constructor(
33
+ readonly dexHelper: IDexHelper,
34
+ parentName: string,
35
+ protected readonly factoryAddress: Address,
36
+ protected readonly onPoolCreated: OnPoolCreatedCallback,
37
+ logger: Logger,
38
+ mapKey: string = '',
39
+ ) {
40
+ super(parentName, `${parentName} Factory`, dexHelper, logger, true, mapKey);
41
+
42
+ this.addressesSubscribed = [factoryAddress];
43
+
44
+ this.logDecoder = (log: Log) => this.factoryIface.parseLog(log);
45
+
46
+ this.handlers['PairCreated'] = this.handlePairCreated.bind(this);
47
+ }
48
+
49
+ async generateState(blockNumber?: number | 'latest'): Promise<FactoryState> {
50
+ const factory = new this.dexHelper.web3Provider.eth.Contract(
51
+ IntegralFactoryABI as any,
52
+ this.factoryAddress,
53
+ );
54
+ const poolCountResult = await factory.methods
55
+ .allPairsLength()
56
+ .call(undefined, blockNumber);
57
+ const poolCount = Number(poolCountResult);
58
+ const poolAddressCallDatas: MultiCallParams<string>[] = [
59
+ ...Array(poolCount),
60
+ ].map((_, i) => {
61
+ return {
62
+ target: this.factoryAddress,
63
+ callData: factory.methods.allPairs(i).encodeABI(),
64
+ decodeFunction: addressDecode,
65
+ };
66
+ });
67
+ const poolAddresses =
68
+ await this.dexHelper.multiWrapper.tryAggregate<string>(
69
+ false,
70
+ poolAddressCallDatas,
71
+ blockNumber,
72
+ this.dexHelper.multiWrapper.defaultBatchSize,
73
+ false,
74
+ );
75
+
76
+ const poolIface = new Interface(IntegralPoolABI);
77
+ const poolInfosCallDatas: MultiCallParams<string>[] = poolAddresses
78
+ .map(poolAddress => {
79
+ return [
80
+ {
81
+ target: poolAddress.returnData,
82
+ callData: poolIface.encodeFunctionData('token0', []),
83
+ decodeFunction: addressDecode,
84
+ },
85
+ {
86
+ target: poolAddress.returnData,
87
+ callData: poolIface.encodeFunctionData('token1', []),
88
+ decodeFunction: addressDecode,
89
+ },
90
+ ];
91
+ })
92
+ .flat();
93
+ const poolInfos = await this.dexHelper.multiWrapper.aggregate<string>(
94
+ poolInfosCallDatas,
95
+ blockNumber,
96
+ );
97
+
98
+ const state: FactoryState = { pools: {} };
99
+ poolAddresses.forEach((poolAddress, i) => {
100
+ const tokens: [Address, Address] = [
101
+ poolInfos[i * 2].toLowerCase(),
102
+ poolInfos[i * 2 + 1].toLowerCase(),
103
+ ];
104
+ state.pools[poolAddress.returnData.toLowerCase()] = {
105
+ token0: tokens[0],
106
+ token1: tokens[1],
107
+ };
108
+ });
109
+ return state;
110
+ }
111
+
112
+ protected async processLog(
113
+ state: FactoryState,
114
+ log: Readonly<Log>,
115
+ blockHeader: Readonly<BlockHeader>,
116
+ ): Promise<FactoryState> {
117
+ const event = this.logDecoder(log);
118
+ if (event.name in this.handlers) {
119
+ return await this.handlers[event.name](event, state, blockHeader);
120
+ }
121
+
122
+ return state;
123
+ }
124
+
125
+ async handlePairCreated(
126
+ event: LogDescription,
127
+ state: FactoryState,
128
+ blockHeader: Readonly<BlockHeader>,
129
+ ) {
130
+ const tokens: [Address, Address] = [
131
+ event.args.token0.toLowerCase(),
132
+ event.args.token1.toLowerCase(),
133
+ ];
134
+ state.pools[event.args.pair.toLowerCase()] = {
135
+ token0: tokens[0],
136
+ token1: tokens[1],
137
+ };
138
+ await this.onPoolCreated(
139
+ tokens[0],
140
+ tokens[1],
141
+ event.args.pair.toLowerCase(),
142
+ blockHeader.number,
143
+ );
144
+ return state;
145
+ }
146
+ }