@lidofinance/lsv-cli 1.2.0 → 1.3.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 (265) hide show
  1. package/README.md +58 -0
  2. package/dist/abi/Dashboard.d.ts +268 -0
  3. package/dist/abi/Dashboard.js +2 -0
  4. package/dist/abi/Dashboard.js.map +1 -1
  5. package/dist/abi/PredepositGuarantee.d.ts +357 -88
  6. package/dist/abi/PredepositGuarantee.js +31 -28
  7. package/dist/abi/PredepositGuarantee.js.map +1 -1
  8. package/dist/abi/VaultViewer.d.ts +8 -0
  9. package/dist/abi/VaultViewer.js +10 -0
  10. package/dist/abi/VaultViewer.js.map +1 -1
  11. package/dist/command/index.js +1 -0
  12. package/dist/command/index.js.map +1 -1
  13. package/dist/configs/deployed.js +27 -8
  14. package/dist/configs/deployed.js.map +1 -1
  15. package/dist/configs/index.d.ts +4 -3
  16. package/dist/configs/index.js +4 -3
  17. package/dist/configs/index.js.map +1 -1
  18. package/dist/contracts/vault-viewer.js +2 -2
  19. package/dist/features/defi-wrapper/defi-wrapper-factory.d.ts +1 -2
  20. package/dist/features/defi-wrapper/defi-wrapper-factory.js +12 -9
  21. package/dist/features/defi-wrapper/defi-wrapper-factory.js.map +1 -1
  22. package/dist/features/deposits/index.d.ts +1 -0
  23. package/dist/features/deposits/index.js +1 -0
  24. package/dist/features/deposits/index.js.map +1 -1
  25. package/dist/features/deposits/validators.d.ts +12 -0
  26. package/dist/features/deposits/validators.js +31 -0
  27. package/dist/features/deposits/validators.js.map +1 -0
  28. package/dist/features/index.d.ts +1 -0
  29. package/dist/features/index.js +1 -0
  30. package/dist/features/index.js.map +1 -1
  31. package/dist/features/lazy-oracle.js +2 -2
  32. package/dist/features/lazy-oracle.js.map +1 -1
  33. package/dist/features/mint-burn/allowance.d.ts +7 -1
  34. package/dist/features/mint-burn/allowance.js +8 -9
  35. package/dist/features/mint-burn/allowance.js.map +1 -1
  36. package/dist/features/mint-burn/burn-shares.d.ts +2 -1
  37. package/dist/features/mint-burn/burn-shares.js +4 -3
  38. package/dist/features/mint-burn/burn-shares.js.map +1 -1
  39. package/dist/features/mint-burn/burn-steth.d.ts +2 -1
  40. package/dist/features/mint-burn/burn-steth.js +4 -3
  41. package/dist/features/mint-burn/burn-steth.js.map +1 -1
  42. package/dist/features/mint-burn/mint-shares.js +4 -6
  43. package/dist/features/mint-burn/mint-shares.js.map +1 -1
  44. package/dist/features/mint-burn/mint-steth.js +4 -6
  45. package/dist/features/mint-burn/mint-steth.js.map +1 -1
  46. package/dist/features/utils/connection.d.ts +2 -0
  47. package/dist/features/utils/connection.js +14 -0
  48. package/dist/features/utils/connection.js.map +1 -0
  49. package/dist/features/utils/index.d.ts +1 -0
  50. package/dist/features/utils/index.js +1 -0
  51. package/dist/features/utils/index.js.map +1 -1
  52. package/dist/features/utils/liability-shares.js +2 -1
  53. package/dist/features/utils/liability-shares.js.map +1 -1
  54. package/dist/features/utils/report-fresh.d.ts +11 -1
  55. package/dist/features/utils/report-fresh.js +17 -14
  56. package/dist/features/utils/report-fresh.js.map +1 -1
  57. package/dist/features/vault-factory.d.ts +13 -14
  58. package/dist/features/vault-factory.js +30 -8
  59. package/dist/features/vault-factory.js.map +1 -1
  60. package/dist/features/vault-operations/connect-vault.d.ts +4 -0
  61. package/dist/features/vault-operations/connect-vault.js +21 -0
  62. package/dist/features/vault-operations/connect-vault.js.map +1 -0
  63. package/dist/features/vault-operations/create-vault.js +6 -4
  64. package/dist/features/vault-operations/create-vault.js.map +1 -1
  65. package/dist/features/vault-operations/dashboard-by-vault.js +17 -4
  66. package/dist/features/vault-operations/dashboard-by-vault.js.map +1 -1
  67. package/dist/features/vault-operations/index.d.ts +2 -0
  68. package/dist/features/vault-operations/index.js +2 -0
  69. package/dist/features/vault-operations/index.js.map +1 -1
  70. package/dist/features/vault-operations/roles.d.ts +5 -0
  71. package/dist/features/vault-operations/roles.js +65 -0
  72. package/dist/features/vault-operations/roles.js.map +1 -0
  73. package/dist/features/vault-operations/vault-info.js +9 -3
  74. package/dist/features/vault-operations/vault-info.js.map +1 -1
  75. package/dist/features/vault-operations/vault-overview.js +5 -7
  76. package/dist/features/vault-operations/vault-overview.js.map +1 -1
  77. package/dist/features/vault-operations/vault-roles.js +1 -1
  78. package/dist/features/vault-operations/vault-roles.js.map +1 -1
  79. package/dist/features/with-report.d.ts +6 -0
  80. package/dist/features/with-report.js +18 -0
  81. package/dist/features/with-report.js.map +1 -0
  82. package/dist/index.js +32 -10
  83. package/dist/index.js.map +1 -1
  84. package/dist/programs/contracts/dashboard/write.js +39 -20
  85. package/dist/programs/contracts/dashboard/write.js.map +1 -1
  86. package/dist/programs/contracts/hub/write.js +5 -1
  87. package/dist/programs/contracts/hub/write.js.map +1 -1
  88. package/dist/programs/contracts/operator-grid/write.js +1 -1
  89. package/dist/programs/contracts/operator-grid/write.js.map +1 -1
  90. package/dist/programs/contracts/vault-factory/write.js +37 -23
  91. package/dist/programs/contracts/vault-factory/write.js.map +1 -1
  92. package/dist/programs/defi-wrapper/contracts/factory/write.js +12 -14
  93. package/dist/programs/defi-wrapper/contracts/factory/write.js.map +1 -1
  94. package/dist/programs/defi-wrapper/use-cases/wrapper-operations/create-pool.js +53 -16
  95. package/dist/programs/defi-wrapper/use-cases/wrapper-operations/create-pool.js.map +1 -1
  96. package/dist/programs/defi-wrapper/use-cases/wrapper-operations/read.js +2 -2
  97. package/dist/programs/defi-wrapper/use-cases/wrapper-operations/read.js.map +1 -1
  98. package/dist/programs/pdg-helpers.js +13 -9
  99. package/dist/programs/pdg-helpers.js.map +1 -1
  100. package/dist/programs/use-cases/consolidation/write.js +2 -2
  101. package/dist/programs/use-cases/consolidation/write.js.map +1 -1
  102. package/dist/programs/use-cases/vault-operations/create-vault.js +63 -27
  103. package/dist/programs/use-cases/vault-operations/create-vault.js.map +1 -1
  104. package/dist/programs/use-cases/vault-operations/write.js +124 -26
  105. package/dist/programs/use-cases/vault-operations/write.js.map +1 -1
  106. package/dist/tests/integration/deposits.test.d.ts +1 -0
  107. package/dist/tests/integration/deposits.test.js +67 -0
  108. package/dist/tests/integration/deposits.test.js.map +1 -0
  109. package/dist/tests/integration/globalSetup.d.ts +1 -0
  110. package/dist/tests/integration/globalSetup.js +55 -0
  111. package/dist/tests/integration/globalSetup.js.map +1 -0
  112. package/dist/tests/integration/helpers/index.d.ts +3 -0
  113. package/dist/tests/integration/helpers/index.js +4 -0
  114. package/dist/tests/integration/helpers/index.js.map +1 -0
  115. package/dist/tests/integration/helpers/test-assertions.d.ts +32 -0
  116. package/dist/tests/integration/helpers/test-assertions.js +92 -0
  117. package/dist/tests/integration/helpers/test-assertions.js.map +1 -0
  118. package/dist/tests/integration/helpers/test-client.d.ts +14530 -0
  119. package/dist/tests/integration/helpers/test-client.js +73 -0
  120. package/dist/tests/integration/helpers/test-client.js.map +1 -0
  121. package/dist/tests/integration/helpers/test-config.d.ts +14 -0
  122. package/dist/tests/integration/helpers/test-config.js +62 -0
  123. package/dist/tests/integration/helpers/test-config.js.map +1 -0
  124. package/dist/tests/integration/helpers/test-setup.d.ts +12 -0
  125. package/dist/tests/integration/helpers/test-setup.js +40 -0
  126. package/dist/tests/integration/helpers/test-setup.js.map +1 -0
  127. package/dist/tests/integration/lazy-oracle.test.d.ts +1 -0
  128. package/dist/tests/integration/lazy-oracle.test.js +31 -0
  129. package/dist/tests/integration/lazy-oracle.test.js.map +1 -0
  130. package/dist/tests/integration/metrics.test.d.ts +1 -0
  131. package/dist/tests/integration/metrics.test.js +95 -0
  132. package/dist/tests/integration/metrics.test.js.map +1 -0
  133. package/dist/tests/integration/mint-burn.test.d.ts +1 -0
  134. package/dist/tests/integration/mint-burn.test.js +149 -0
  135. package/dist/tests/integration/mint-burn.test.js.map +1 -0
  136. package/dist/tests/integration/operator-grid.test.d.ts +1 -0
  137. package/dist/tests/integration/operator-grid.test.js +41 -0
  138. package/dist/tests/integration/operator-grid.test.js.map +1 -0
  139. package/dist/tests/integration/pdg.test.d.ts +1 -0
  140. package/dist/tests/integration/pdg.test.js +47 -0
  141. package/dist/tests/integration/pdg.test.js.map +1 -0
  142. package/dist/tests/integration/utils.test.d.ts +1 -0
  143. package/dist/tests/integration/utils.test.js +70 -0
  144. package/dist/tests/integration/utils.test.js.map +1 -0
  145. package/dist/tests/integration/vault-factory.test.d.ts +1 -0
  146. package/dist/tests/integration/vault-factory.test.js +29 -0
  147. package/dist/tests/integration/vault-factory.test.js.map +1 -0
  148. package/dist/tests/integration/vault-hub.test.d.ts +1 -0
  149. package/dist/tests/integration/vault-hub.test.js +71 -0
  150. package/dist/tests/integration/vault-hub.test.js.map +1 -0
  151. package/dist/tests/integration/vault-operations.test.d.ts +1 -0
  152. package/dist/tests/integration/vault-operations.test.js +151 -0
  153. package/dist/tests/integration/vault-operations.test.js.map +1 -0
  154. package/dist/tests/integration/vault-roles.test.d.ts +1 -0
  155. package/dist/tests/integration/vault-roles.test.js +44 -0
  156. package/dist/tests/integration/vault-roles.test.js.map +1 -0
  157. package/dist/tests/integration/vault.test.d.ts +1 -0
  158. package/dist/tests/integration/vault.test.js +44 -0
  159. package/dist/tests/integration/vault.test.js.map +1 -0
  160. package/dist/tests/utils/arguments.test.js +85 -4
  161. package/dist/tests/utils/arguments.test.js.map +1 -1
  162. package/dist/tests/utils/bigInt.test.js +1 -1
  163. package/dist/tests/utils/bigInt.test.js.map +1 -1
  164. package/dist/tests/utils/calculate-health.test.d.ts +1 -0
  165. package/dist/tests/utils/calculate-health.test.js +140 -0
  166. package/dist/tests/utils/calculate-health.test.js.map +1 -0
  167. package/dist/tests/utils/calculate-overview-v2.test.d.ts +1 -0
  168. package/dist/tests/utils/calculate-overview-v2.test.js +181 -0
  169. package/dist/tests/utils/calculate-overview-v2.test.js.map +1 -0
  170. package/dist/tests/utils/calculate-overview.test.js +2 -1
  171. package/dist/tests/utils/calculate-overview.test.js.map +1 -1
  172. package/dist/tests/utils/csv-file.test.d.ts +1 -0
  173. package/dist/tests/utils/csv-file.test.js +111 -0
  174. package/dist/tests/utils/csv-file.test.js.map +1 -0
  175. package/dist/tests/utils/data-validators.test.js +1 -1
  176. package/dist/tests/utils/data-validators.test.js.map +1 -1
  177. package/dist/tests/utils/error-handler.test.js +7 -16
  178. package/dist/tests/utils/error-handler.test.js.map +1 -1
  179. package/dist/tests/utils/get-commands.test.js +1 -1
  180. package/dist/tests/utils/get-commands.test.js.map +1 -1
  181. package/dist/tests/utils/get-deposit-data-root.test.js +1 -2
  182. package/dist/tests/utils/get-deposit-data-root.test.js.map +1 -1
  183. package/dist/tests/utils/get-value.test.js +1 -1
  184. package/dist/tests/utils/get-value.test.js.map +1 -1
  185. package/dist/tests/utils/health.test.js +1 -1
  186. package/dist/tests/utils/health.test.js.map +1 -1
  187. package/dist/tests/utils/interrupt-handler.test.js +2 -5
  188. package/dist/tests/utils/interrupt-handler.test.js.map +1 -1
  189. package/dist/tests/utils/ipfs.test.js +37 -24
  190. package/dist/tests/utils/ipfs.test.js.map +1 -1
  191. package/dist/tests/utils/lido-apr.test.d.ts +1 -0
  192. package/dist/tests/utils/lido-apr.test.js +95 -0
  193. package/dist/tests/utils/lido-apr.test.js.map +1 -0
  194. package/dist/tests/utils/logging.test.js +135 -15
  195. package/dist/tests/utils/logging.test.js.map +1 -1
  196. package/dist/tests/utils/merkle-utils.test.d.ts +1 -0
  197. package/dist/tests/utils/merkle-utils.test.js +231 -0
  198. package/dist/tests/utils/merkle-utils.test.js.map +1 -0
  199. package/dist/tests/utils/rebase-rewards.test.d.ts +1 -0
  200. package/dist/tests/utils/rebase-rewards.test.js +114 -0
  201. package/dist/tests/utils/rebase-rewards.test.js.map +1 -0
  202. package/dist/tests/utils/resove-path.test.js +1 -1
  203. package/dist/tests/utils/resove-path.test.js.map +1 -1
  204. package/dist/tests/utils/sleep.test.js +5 -5
  205. package/dist/tests/utils/sleep.test.js.map +1 -1
  206. package/dist/tests/utils/snake-to-camel.test.d.ts +1 -0
  207. package/dist/tests/utils/snake-to-camel.test.js +37 -0
  208. package/dist/tests/utils/snake-to-camel.test.js.map +1 -0
  209. package/dist/tests/utils/timestamp.test.d.ts +1 -0
  210. package/dist/tests/utils/timestamp.test.js +51 -0
  211. package/dist/tests/utils/timestamp.test.js.map +1 -0
  212. package/dist/utils/arguments.d.ts +2 -1
  213. package/dist/utils/arguments.js +6 -0
  214. package/dist/utils/arguments.js.map +1 -1
  215. package/dist/utils/calculate-overview-v2.d.ts +1 -2
  216. package/dist/utils/calculate-overview-v2.js +3 -6
  217. package/dist/utils/calculate-overview-v2.js.map +1 -1
  218. package/dist/utils/calculate-overview.d.ts +1 -0
  219. package/dist/utils/calculate-overview.js +1 -0
  220. package/dist/utils/calculate-overview.js.map +1 -1
  221. package/dist/utils/commands/report.d.ts +6 -1
  222. package/dist/utils/commands/report.js +6 -5
  223. package/dist/utils/commands/report.js.map +1 -1
  224. package/dist/utils/consolidation/confirms.js +2 -2
  225. package/dist/utils/consolidation/confirms.js.map +1 -1
  226. package/dist/utils/consolidation/logs.js +4 -2
  227. package/dist/utils/consolidation/logs.js.map +1 -1
  228. package/dist/utils/consolidation/pubkeys.js +2 -0
  229. package/dist/utils/consolidation/pubkeys.js.map +1 -1
  230. package/dist/utils/consolidation/types.d.ts +1 -0
  231. package/dist/utils/consolidation/validator-info.js +2 -0
  232. package/dist/utils/consolidation/validator-info.js.map +1 -1
  233. package/dist/utils/error-handler.js +2 -9
  234. package/dist/utils/error-handler.js.map +1 -1
  235. package/dist/utils/interrupt-handler.js +8 -2
  236. package/dist/utils/interrupt-handler.js.map +1 -1
  237. package/dist/utils/logging/console.js +41 -3
  238. package/dist/utils/logging/console.js.map +1 -1
  239. package/dist/utils/prompts/mint-burn/confirm-mint.js +1 -0
  240. package/dist/utils/prompts/mint-burn/confirm-mint.js.map +1 -1
  241. package/dist/utils/prompts/operations.js +4 -1
  242. package/dist/utils/prompts/operations.js.map +1 -1
  243. package/dist/utils/proof/create-proof.d.ts +5 -0
  244. package/dist/utils/proof/create-proof.js +5 -0
  245. package/dist/utils/proof/create-proof.js.map +1 -1
  246. package/dist/utils/transactions/tx-private-key.d.ts +4 -0
  247. package/dist/utils/transactions/tx-private-key.js +52 -24
  248. package/dist/utils/transactions/tx-private-key.js.map +1 -1
  249. package/dist/utils/transactions/tx-wc.d.ts +1 -0
  250. package/dist/utils/transactions/tx-wc.js +10 -19
  251. package/dist/utils/transactions/tx-wc.js.map +1 -1
  252. package/dist/utils/transactions/types.d.ts +1 -0
  253. package/dist/utils/transactions/utils.d.ts +3 -0
  254. package/dist/utils/transactions/utils.js +33 -0
  255. package/dist/utils/transactions/utils.js.map +1 -0
  256. package/dist/utils/wallet-connect.js +3 -1
  257. package/dist/utils/wallet-connect.js.map +1 -1
  258. package/dist/version/index.js +1 -1
  259. package/dist/vitest.config.d.ts +2 -0
  260. package/dist/vitest.config.js +29 -0
  261. package/dist/vitest.config.js.map +1 -0
  262. package/dist/vitest.integration.config.d.ts +2 -0
  263. package/dist/vitest.integration.config.js +39 -0
  264. package/dist/vitest.integration.config.js.map +1 -0
  265. package/package.json +14 -9
@@ -0,0 +1,73 @@
1
+ import { createTestClient, http, publicActions, walletActions, parseEther, } from 'viem';
2
+ import { privateKeyToAccount } from 'viem/accounts';
3
+ /**
4
+ * Creates a test client for Anvil operations
5
+ */
6
+ export const createAnvilTestClient = (chain, rpcUrl) => {
7
+ return createTestClient({
8
+ chain,
9
+ mode: 'anvil',
10
+ transport: http(rpcUrl),
11
+ })
12
+ .extend(publicActions)
13
+ .extend(walletActions);
14
+ };
15
+ /**
16
+ * Impersonates an account and funds it with ETH
17
+ */
18
+ export const impersonateAccount = async (testClient, address, balance = parseEther('100')) => {
19
+ await testClient.impersonateAccount({ address });
20
+ await testClient.setBalance({ address, value: balance });
21
+ return address;
22
+ };
23
+ /**
24
+ * Mints ETH to an address (sets balance)
25
+ */
26
+ export const mintEth = async (testClient, address, amount) => {
27
+ await testClient.setBalance({ address, value: amount });
28
+ };
29
+ /**
30
+ * Mines a specified number of blocks
31
+ */
32
+ export const mineBlocks = async (testClient, blocks = 1) => {
33
+ await testClient.mine({ blocks });
34
+ };
35
+ /**
36
+ * Increases the time by a specified number of seconds
37
+ */
38
+ export const increaseTime = async (testClient, seconds) => {
39
+ await testClient.increaseTime({ seconds });
40
+ };
41
+ /**
42
+ * Sets the time to a specific timestamp
43
+ */
44
+ export const setTime = async (testClient, timestamp) => {
45
+ await testClient.setNextBlockTimestamp({ timestamp });
46
+ const blocks = timestamp / 12n;
47
+ await testClient.mine({ blocks: Number(blocks) });
48
+ };
49
+ /**
50
+ * Gets the current block timestamp
51
+ */
52
+ export const getCurrentTimestamp = async (testClient) => {
53
+ const block = await testClient.getBlock({ blockTag: 'latest' });
54
+ return block.timestamp;
55
+ };
56
+ /**
57
+ * Creates a wallet from a private key
58
+ */
59
+ export const getAccountFromPrivateKey = (privateKey) => {
60
+ return privateKeyToAccount(privateKey);
61
+ };
62
+ /**
63
+ * Resets Anvil state to a specific block number
64
+ * This is useful for ensuring tests don't affect each other
65
+ */
66
+ export const resetAnvilState = async (testClient, blockNumber) => {
67
+ console.info('---- Resetting Anvil state to block number ---->', blockNumber);
68
+ await testClient.reset({
69
+ blockNumber,
70
+ });
71
+ console.info('---- Resetting Anvil state done ----');
72
+ };
73
+ //# sourceMappingURL=test-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-client.js","sourceRoot":"","sources":["../../../../tests/integration/helpers/test-client.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,IAAI,EACJ,aAAa,EACb,aAAa,EAGb,UAAU,GACX,MAAM,MAAM,CAAC;AACd,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEpD;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,KAAY,EAAE,MAAc,EAAE,EAAE;IACpE,OAAO,gBAAgB,CAAC;QACtB,KAAK;QACL,IAAI,EAAE,OAAO;QACb,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC;KACxB,CAAC;SACC,MAAM,CAAC,aAAa,CAAC;SACrB,MAAM,CAAC,aAAa,CAAC,CAAC;AAC3B,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,EACrC,UAAoD,EACpD,OAAgB,EAChB,UAAkB,UAAU,CAAC,KAAK,CAAC,EACnC,EAAE;IACF,MAAM,UAAU,CAAC,kBAAkB,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;IACjD,MAAM,UAAU,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;IACzD,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,EAC1B,UAAoD,EACpD,OAAgB,EAChB,MAAc,EACd,EAAE;IACF,MAAM,UAAU,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;AAC1D,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,EAC7B,UAAoD,EACpD,MAAM,GAAG,CAAC,EACV,EAAE;IACF,MAAM,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;AACpC,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAC/B,UAAoD,EACpD,OAAe,EACf,EAAE;IACF,MAAM,UAAU,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;AAC7C,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,EAC1B,UAAoD,EACpD,SAAiB,EACjB,EAAE;IACF,MAAM,UAAU,CAAC,qBAAqB,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;IACtD,MAAM,MAAM,GAAG,SAAS,GAAG,GAAG,CAAC;IAC/B,MAAM,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AACpD,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAK,EACtC,UAAoD,EACpD,EAAE;IACF,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;IAChE,OAAO,KAAK,CAAC,SAAS,CAAC;AACzB,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,UAAkB,EAAE,EAAE;IAC7D,OAAO,mBAAmB,CAAC,UAA2B,CAAC,CAAC;AAC1D,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,EAClC,UAAoD,EACpD,WAAoB,EACpB,EAAE;IACF,OAAO,CAAC,IAAI,CAAC,kDAAkD,EAAE,WAAW,CAAC,CAAC;IAC9E,MAAM,UAAU,CAAC,KAAK,CAAC;QACrB,WAAW;KACZ,CAAC,CAAC;IACH,OAAO,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;AACvD,CAAC,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { Address } from 'viem';
2
+ export interface IntegrationTestConfig {
3
+ DEPLOYED: string;
4
+ CHAIN_ID: number;
5
+ EL_URL: string;
6
+ PRIVATE_KEY: string;
7
+ VAULT_ADDRESS: Address;
8
+ FORK_BLOCK_NUMBER?: number;
9
+ ANVIL_PORT: number;
10
+ }
11
+ /**
12
+ * Validates and loads integration test configuration from environment variables
13
+ */
14
+ export declare const loadTestConfig: () => IntegrationTestConfig;
@@ -0,0 +1,62 @@
1
+ import * as dotenv from 'dotenv';
2
+ import path from 'path';
3
+ // Load environment variables from .env.test or .env
4
+ dotenv.config({ path: path.resolve(process.cwd(), '.env.test') });
5
+ dotenv.config(); // Fallback to .env if .env.test doesn't exist
6
+ /**
7
+ * Validates and loads integration test configuration from environment variables
8
+ */
9
+ export const loadTestConfig = () => {
10
+ const DEPLOYED = process.env.DEPLOYED;
11
+ const CHAIN_ID = process.env.CHAIN_ID;
12
+ const EL_URL = process.env.EL_URL;
13
+ const PRIVATE_KEY = process.env.PRIVATE_KEY;
14
+ const VAULT_ADDRESS = process.env.VAULT_ADDRESS;
15
+ const FORK_BLOCK_NUMBER = process.env.FORK_BLOCK_NUMBER;
16
+ const ANVIL_PORT = process.env.ANVIL_PORT || '8545';
17
+ if (!DEPLOYED) {
18
+ throw new Error('DEPLOYED environment variable is required');
19
+ }
20
+ if (!CHAIN_ID) {
21
+ throw new Error('CHAIN_ID environment variable is required');
22
+ }
23
+ if (!EL_URL) {
24
+ throw new Error('EL_URL environment variable is required');
25
+ }
26
+ if (!PRIVATE_KEY) {
27
+ throw new Error('PRIVATE_KEY environment variable is required');
28
+ }
29
+ if (!VAULT_ADDRESS) {
30
+ throw new Error('VAULT_ADDRESS environment variable is required');
31
+ }
32
+ const chainId = Number(CHAIN_ID);
33
+ if (isNaN(chainId)) {
34
+ throw new Error(`Invalid CHAIN_ID: ${CHAIN_ID}`);
35
+ }
36
+ // Validate address format
37
+ if (!/^0x[a-fA-F0-9]{40}$/.test(VAULT_ADDRESS)) {
38
+ throw new Error(`Invalid VAULT_ADDRESS format: ${VAULT_ADDRESS}`);
39
+ }
40
+ // Validate private key format
41
+ if (!/^0x[a-fA-F0-9]{64}$/.test(PRIVATE_KEY)) {
42
+ throw new Error(`Invalid PRIVATE_KEY format`);
43
+ }
44
+ const forkBlockNumber = FORK_BLOCK_NUMBER
45
+ ? Number(FORK_BLOCK_NUMBER)
46
+ : undefined;
47
+ if (FORK_BLOCK_NUMBER &&
48
+ forkBlockNumber !== undefined &&
49
+ isNaN(forkBlockNumber)) {
50
+ throw new Error(`Invalid FORK_BLOCK_NUMBER: ${FORK_BLOCK_NUMBER}`);
51
+ }
52
+ return {
53
+ DEPLOYED,
54
+ CHAIN_ID: chainId,
55
+ EL_URL,
56
+ PRIVATE_KEY,
57
+ VAULT_ADDRESS: VAULT_ADDRESS,
58
+ FORK_BLOCK_NUMBER: forkBlockNumber,
59
+ ANVIL_PORT: Number(ANVIL_PORT),
60
+ };
61
+ };
62
+ //# sourceMappingURL=test-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-config.js","sourceRoot":"","sources":["../../../../tests/integration/helpers/test-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AAEjC,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,oDAAoD;AACpD,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC;AAClE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,8CAA8C;AAY/D;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,GAA0B,EAAE;IACxD,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;IACtC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;IACtC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;IAClC,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;IAC5C,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;IAChD,MAAM,iBAAiB,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IACxD,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,MAAM,CAAC;IAEpD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;IACD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;IACD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAC7D,CAAC;IACD,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAClE,CAAC;IACD,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACpE,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IACjC,IAAI,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,qBAAqB,QAAQ,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,0BAA0B;IAC1B,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;QAC/C,MAAM,IAAI,KAAK,CAAC,iCAAiC,aAAa,EAAE,CAAC,CAAC;IACpE,CAAC;IAED,8BAA8B;IAC9B,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAChD,CAAC;IAED,MAAM,eAAe,GAAG,iBAAiB;QACvC,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC;QAC3B,CAAC,CAAC,SAAS,CAAC;IAEd,IACE,iBAAiB;QACjB,eAAe,KAAK,SAAS;QAC7B,KAAK,CAAC,eAAe,CAAC,EACtB,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,8BAA8B,iBAAiB,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,OAAO;QACL,QAAQ;QACR,QAAQ,EAAE,OAAO;QACjB,MAAM;QACN,WAAW;QACX,aAAa,EAAE,aAAwB;QACvC,iBAAiB,EAAE,eAAe;QAClC,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC;KAC/B,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Sets up beforeEach hook to reset Anvil state to the fork block number
3
+ * This ensures tests don't affect each other
4
+ */
5
+ export declare const setupAnvilResetBeforeEach: () => void;
6
+ export declare const setupAnvilResetBeforeAll: () => void;
7
+ /**
8
+ * Sets up both Anvil reset and callWriteMethodWithReceipt mock
9
+ * This is the recommended setup for integration tests
10
+ */
11
+ export declare const setupIntegrationTestsBeforeEach: () => void;
12
+ export declare const setupIntegrationTestsBeforeAll: () => void;
@@ -0,0 +1,40 @@
1
+ import { beforeAll, beforeEach } from 'vitest';
2
+ import { getChain } from '../../../configs/index.js';
3
+ import { loadTestConfig } from './test-config.js';
4
+ import { createAnvilTestClient, resetAnvilState } from './test-client.js';
5
+ const resetAnvil = async () => {
6
+ const config = loadTestConfig();
7
+ const chain = await getChain();
8
+ const anvilRpcUrl = config.EL_URL;
9
+ const testClient = createAnvilTestClient(chain, anvilRpcUrl);
10
+ const forkBlockNumber = BigInt(config.FORK_BLOCK_NUMBER || 'latest');
11
+ // Reset Anvil state to the fork block number
12
+ if (testClient) {
13
+ await resetAnvilState(testClient, forkBlockNumber);
14
+ }
15
+ };
16
+ /**
17
+ * Sets up beforeEach hook to reset Anvil state to the fork block number
18
+ * This ensures tests don't affect each other
19
+ */
20
+ export const setupAnvilResetBeforeEach = () => {
21
+ beforeEach(async () => {
22
+ await resetAnvil();
23
+ });
24
+ };
25
+ export const setupAnvilResetBeforeAll = () => {
26
+ beforeAll(async () => {
27
+ await resetAnvil();
28
+ });
29
+ };
30
+ /**
31
+ * Sets up both Anvil reset and callWriteMethodWithReceipt mock
32
+ * This is the recommended setup for integration tests
33
+ */
34
+ export const setupIntegrationTestsBeforeEach = () => {
35
+ setupAnvilResetBeforeEach();
36
+ };
37
+ export const setupIntegrationTestsBeforeAll = () => {
38
+ setupAnvilResetBeforeAll();
39
+ };
40
+ //# sourceMappingURL=test-setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-setup.js","sourceRoot":"","sources":["../../../../tests/integration/helpers/test-setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAE1E,MAAM,UAAU,GAAG,KAAK,IAAI,EAAE;IAC5B,MAAM,MAAM,GAAG,cAAc,EAAE,CAAC;IAChC,MAAM,KAAK,GAAG,MAAM,QAAQ,EAAE,CAAC;IAC/B,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC;IAClC,MAAM,UAAU,GAAG,qBAAqB,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IAC7D,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC,iBAAiB,IAAI,QAAQ,CAAC,CAAC;IAErE,6CAA6C;IAC7C,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,eAAe,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;IACrD,CAAC;AACH,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,GAAG,EAAE;IAC5C,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,MAAM,UAAU,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,wBAAwB,GAAG,GAAG,EAAE;IAC3C,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,MAAM,UAAU,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,+BAA+B,GAAG,GAAG,EAAE;IAClD,yBAAyB,EAAE,CAAC;AAC9B,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,8BAA8B,GAAG,GAAG,EAAE;IACjD,wBAAwB,EAAE,CAAC;AAC7B,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,31 @@
1
+ import { describe, test, expect } from 'vitest';
2
+ import { getLazyOracleBaseInfo } from '../../features/index.js';
3
+ import { captureLogResult, isValidAddress, isValidBytes32, validateExpectedData, } from './helpers/test-assertions.js';
4
+ const EXPECTED_DATA_HOODI = {
5
+ CONTRACT_ADDRESS: '0xf41491C79C30e8f4862d3F4A5b790171adB8e04A',
6
+ LIDO_LOCATOR: '0xe2EF9536DAAAEBFf5b1c130957AB3E80056b06D8',
7
+ DEFAULT_ADMIN_ROLE: '0x0000000000000000000000000000000000000000000000000000000000000000',
8
+ UPDATE_SANITY_PARAMS_ROLE: '0x7baf7f4a9784fa74c97162de631a3eb567edeb85878cb6965945310f2c512c63',
9
+ MAX_QUARANTINE_PERIOD: '2592000 (720 hours)',
10
+ MAX_REWARD_RATIO: 65535n,
11
+ MAX_LIDO_FEE_RATE_PER_SECOND: 10000000000000000000n,
12
+ latestReportTimestamp: '1766379660 (22.12.2025 05:01 UTC)',
13
+ quarantinePeriod: '259200 (72 hours)',
14
+ maxRewardRatioBP: '350 (3.5 %)',
15
+ maxLidoFeeRatePerSecond: '180000000000000000 (0.18 ETH/s)',
16
+ };
17
+ describe('Lazy Oracle Integration Tests', () => {
18
+ test('should get lazy oracle base info and return valid data', async () => {
19
+ const data = await captureLogResult(() => getLazyOracleBaseInfo());
20
+ // Validate that data was captured
21
+ expect(data).not.toBeNull();
22
+ if (!data)
23
+ return;
24
+ validateExpectedData(data, EXPECTED_DATA_HOODI, expect);
25
+ expect(isValidAddress(data.CONTRACT_ADDRESS)).toBe(true);
26
+ expect(isValidAddress(data.LIDO_LOCATOR)).toBe(true);
27
+ expect(isValidBytes32(data.UPDATE_SANITY_PARAMS_ROLE)).toBe(true);
28
+ expect(isValidBytes32(data.DEFAULT_ADMIN_ROLE)).toBe(true);
29
+ });
30
+ });
31
+ //# sourceMappingURL=lazy-oracle.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lazy-oracle.test.js","sourceRoot":"","sources":["../../../tests/integration/lazy-oracle.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChD,OAAO,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AACjD,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,oBAAoB,GACrB,MAAM,8BAA8B,CAAC;AAEtC,MAAM,mBAAmB,GAAG;IAC1B,gBAAgB,EAAE,4CAA4C;IAC9D,YAAY,EAAE,4CAA4C;IAC1D,kBAAkB,EAChB,oEAAoE;IACtE,yBAAyB,EACvB,oEAAoE;IACtE,qBAAqB,EAAE,qBAAqB;IAC5C,gBAAgB,EAAE,MAAM;IACxB,4BAA4B,EAAE,qBAAqB;IACnD,qBAAqB,EAAE,mCAAmC;IAC1D,gBAAgB,EAAE,mBAAmB;IACrC,gBAAgB,EAAE,aAAa;IAC/B,uBAAuB,EAAE,iCAAiC;CAC3D,CAAC;AAEF,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;IAC7C,IAAI,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACxE,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAsB,GAAG,EAAE,CAC5D,qBAAqB,EAAE,CACxB,CAAC;QAEF,kCAAkC;QAClC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC5B,IAAI,CAAC,IAAI;YAAE,OAAO;QAElB,oBAAoB,CAAC,IAAI,EAAE,mBAAmB,EAAE,MAAM,CAAC,CAAC;QAExD,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzD,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAErD,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClE,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,95 @@
1
+ import { describe, test, expect, beforeAll } from 'vitest';
2
+ import { getNodeOperatorFeeRatesByBlockNumbers, getSettledGrowthsByBlockNumbers, getNodeOperatorAccruedFeeByBlockNumbers, } from '../../features/index.js';
3
+ import { getDashboardContract } from '../../contracts/index.js';
4
+ import { getPublicClient } from '../../providers/index.js';
5
+ import { loadTestConfig } from './helpers/test-config.js';
6
+ import { getDashboardByVault } from '../../features/index.js';
7
+ describe('Metrics Integration Tests', () => {
8
+ let config;
9
+ let vaultAddress;
10
+ let dashboardAddress;
11
+ let dashboardContract;
12
+ let currentBlockNumber;
13
+ beforeAll(async () => {
14
+ config = loadTestConfig();
15
+ vaultAddress = config.VAULT_ADDRESS;
16
+ // Try to get dashboard address for the vault
17
+ try {
18
+ dashboardAddress = await getDashboardByVault(vaultAddress);
19
+ if (dashboardAddress) {
20
+ dashboardContract = await getDashboardContract(dashboardAddress);
21
+ }
22
+ }
23
+ catch {
24
+ dashboardAddress = null;
25
+ dashboardContract = null;
26
+ }
27
+ // Get current block number
28
+ const publicClient = await getPublicClient();
29
+ const block = await publicClient.getBlockNumber();
30
+ currentBlockNumber = Number(block);
31
+ });
32
+ test('should get node operator fee rates by block numbers', async () => {
33
+ // Skip test if no dashboard is found
34
+ if (!dashboardAddress || !dashboardContract)
35
+ return;
36
+ // Use current block and a few blocks before
37
+ const blockNumbers = [
38
+ currentBlockNumber - 10,
39
+ currentBlockNumber - 5,
40
+ currentBlockNumber,
41
+ ].filter((bn) => bn > 0);
42
+ const feeRates = await getNodeOperatorFeeRatesByBlockNumbers(vaultAddress, blockNumbers, dashboardContract);
43
+ expect(Array.isArray(feeRates)).toBe(true);
44
+ expect(feeRates.length).toBe(blockNumbers.length);
45
+ for (const feeRate of feeRates) {
46
+ expect(typeof feeRate).toBe('bigint');
47
+ expect(feeRate).toBeGreaterThanOrEqual(0n);
48
+ }
49
+ });
50
+ test('should get settled growths by block numbers', async () => {
51
+ // Skip test if no dashboard is found
52
+ if (!dashboardAddress || !dashboardContract)
53
+ return;
54
+ // Use current block and a few blocks before
55
+ const blockNumbers = [
56
+ currentBlockNumber - 10,
57
+ currentBlockNumber - 5,
58
+ currentBlockNumber,
59
+ ].filter((bn) => bn > 0);
60
+ const settledGrowths = await getSettledGrowthsByBlockNumbers(vaultAddress, blockNumbers, dashboardContract);
61
+ expect(Array.isArray(settledGrowths)).toBe(true);
62
+ expect(settledGrowths.length).toBe(blockNumbers.length);
63
+ for (const settledGrowth of settledGrowths) {
64
+ expect(typeof settledGrowth).toBe('bigint');
65
+ expect(settledGrowth).toBeGreaterThanOrEqual(0n);
66
+ }
67
+ });
68
+ test('should get node operator accrued fees by block numbers', async () => {
69
+ // Skip test if no dashboard is found
70
+ if (!dashboardAddress || !dashboardContract)
71
+ return;
72
+ // Use current block and a few blocks before
73
+ const blockNumbers = [
74
+ currentBlockNumber - 10,
75
+ currentBlockNumber - 5,
76
+ currentBlockNumber,
77
+ ].filter((bn) => bn > 0);
78
+ const accruedFees = await getNodeOperatorAccruedFeeByBlockNumbers(vaultAddress, blockNumbers, dashboardContract);
79
+ expect(Array.isArray(accruedFees)).toBe(true);
80
+ expect(accruedFees.length).toBe(blockNumbers.length);
81
+ for (const accruedFee of accruedFees) {
82
+ expect(typeof accruedFee).toBe('bigint');
83
+ expect(accruedFee).toBeGreaterThanOrEqual(0n);
84
+ }
85
+ });
86
+ test('should handle empty block numbers array', async () => {
87
+ // Skip test if no dashboard is found
88
+ if (!dashboardAddress || !dashboardContract)
89
+ return;
90
+ const feeRates = await getNodeOperatorFeeRatesByBlockNumbers(vaultAddress, [], dashboardContract);
91
+ expect(Array.isArray(feeRates)).toBe(true);
92
+ expect(feeRates.length).toBe(0);
93
+ });
94
+ });
95
+ //# sourceMappingURL=metrics.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.test.js","sourceRoot":"","sources":["../../../tests/integration/metrics.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,149 @@
1
+ import { describe, test, expect, beforeAll } from 'vitest';
2
+ import { checkAllowance } from '../../features/index.js';
3
+ import { getDashboardContract } from '../../contracts/index.js';
4
+ import { loadTestConfig } from './helpers/test-config.js';
5
+ import { getDashboardByVault } from '../../features/index.js';
6
+ import { setupIntegrationTestsBeforeEach } from './helpers/test-setup.js';
7
+ describe('Mint-Burn Integration Tests', () => {
8
+ setupIntegrationTestsBeforeEach();
9
+ let config;
10
+ let vaultAddress;
11
+ let dashboardAddress;
12
+ let dashboardContract;
13
+ beforeAll(async () => {
14
+ config = loadTestConfig();
15
+ vaultAddress = config.VAULT_ADDRESS;
16
+ // Try to get dashboard address for the vault
17
+ try {
18
+ dashboardAddress = await getDashboardByVault(vaultAddress);
19
+ if (dashboardAddress) {
20
+ dashboardContract = await getDashboardContract(dashboardAddress);
21
+ }
22
+ }
23
+ catch {
24
+ dashboardAddress = null;
25
+ dashboardContract = null;
26
+ }
27
+ });
28
+ test('should check allowance for stETH token', async () => {
29
+ // Skip test if no dashboard is found
30
+ if (!dashboardAddress || !dashboardContract)
31
+ return;
32
+ const testAmount = 1000000000000000000n; // 1 ETH
33
+ let result;
34
+ let error;
35
+ try {
36
+ result = await checkAllowance(dashboardContract, testAmount, 'steth', false);
37
+ }
38
+ catch (err) {
39
+ error = err;
40
+ }
41
+ // Either result is defined or error is defined (but not both)
42
+ const hasResult = result !== undefined;
43
+ const hasError = error !== undefined;
44
+ expect(hasResult || hasError).toBe(true);
45
+ expect(hasResult && hasError).toBe(false);
46
+ // If error occurred, throw error
47
+ if (hasError)
48
+ throw error;
49
+ // Result can be undefined if allowance is sufficient
50
+ // or an object with receipt/tx/data if approval is needed
51
+ const isUndefined = result === undefined;
52
+ expect(isUndefined || typeof result === 'object').toBe(true);
53
+ // Check properties if result is defined
54
+ const hasReceipt = result !== undefined && 'receipt' in result;
55
+ const hasTx = result !== undefined && 'tx' in result;
56
+ expect(isUndefined || (hasReceipt && hasTx)).toBe(true);
57
+ });
58
+ test('should check allowance for wstETH token', async () => {
59
+ // Skip test if no dashboard is found
60
+ if (!dashboardAddress || !dashboardContract)
61
+ return;
62
+ const testAmount = 1000000000000000000n; // 1 ETH
63
+ let result;
64
+ let error;
65
+ try {
66
+ result = await checkAllowance(dashboardContract, testAmount, 'wsteth', false);
67
+ }
68
+ catch (err) {
69
+ error = err;
70
+ }
71
+ // Either result is defined or error is defined (but not both)
72
+ const hasResult = result !== undefined;
73
+ const hasError = error !== undefined;
74
+ expect(hasResult || hasError).toBe(true);
75
+ expect(hasResult && hasError).toBe(false);
76
+ // If error occurred, skip further checks
77
+ if (hasError)
78
+ throw error;
79
+ const isUndefined = result === undefined;
80
+ expect(isUndefined || typeof result === 'object').toBe(true);
81
+ // Check properties if result is defined
82
+ const hasReceipt = result !== undefined && 'receipt' in result;
83
+ const hasTx = result !== undefined && 'tx' in result;
84
+ expect(isUndefined || (hasReceipt && hasTx)).toBe(true);
85
+ });
86
+ test('should check allowance for shares token', async () => {
87
+ // Skip test if no dashboard is found
88
+ if (!dashboardAddress || !dashboardContract)
89
+ throw new Error('Dashboard contract not found');
90
+ const testAmount = 1000000000000000000n; // 1 share
91
+ let result;
92
+ let error;
93
+ try {
94
+ result = await checkAllowance(dashboardContract, testAmount, 'shares', false);
95
+ }
96
+ catch (err) {
97
+ error = err;
98
+ }
99
+ // Either result is defined or error is defined (but not both)
100
+ const hasResult = result !== undefined;
101
+ const hasError = error !== undefined;
102
+ expect(hasResult || hasError).toBe(true);
103
+ expect(hasResult && hasError).toBe(false);
104
+ // If error occurred, skip further checks
105
+ if (hasError)
106
+ throw error;
107
+ const isUndefined = result === undefined;
108
+ expect(isUndefined || typeof result === 'object').toBe(true);
109
+ // Check properties if result is defined
110
+ const hasReceipt = result !== undefined && 'receipt' in result;
111
+ const hasTx = result !== undefined && 'tx' in result;
112
+ expect(isUndefined || (hasReceipt && hasTx)).toBe(true);
113
+ });
114
+ test('should check allowance with populateTx flag', async () => {
115
+ // Skip test if no dashboard is found
116
+ if (!dashboardAddress || !dashboardContract)
117
+ return;
118
+ const testAmount = 1000000000000000000n; // 1 ETH
119
+ let result;
120
+ let error;
121
+ try {
122
+ result = await checkAllowance(dashboardContract, testAmount, 'steth', true);
123
+ }
124
+ catch (err) {
125
+ error = err;
126
+ }
127
+ // Either result is defined or error is defined (but not both)
128
+ const hasResult = result !== undefined;
129
+ const hasError = error !== undefined;
130
+ expect(hasResult || hasError).toBe(true);
131
+ expect(hasResult && hasError).toBe(false);
132
+ // If error occurred, skip further checks
133
+ if (hasError)
134
+ throw error;
135
+ // With populateTx, result should have data property if approval is needed
136
+ const isUndefined = result === undefined;
137
+ expect(isUndefined || typeof result === 'object').toBe(true);
138
+ // Check data property if result is defined
139
+ const hasDataProperty = result !== undefined && 'data' in result;
140
+ const hasDataValue = result !== undefined && result.data !== undefined;
141
+ const dataHasTo = result !== undefined && result.data !== undefined && 'to' in result.data;
142
+ const dataHasData = result !== undefined &&
143
+ result.data !== undefined &&
144
+ 'data' in result.data;
145
+ expect(isUndefined ||
146
+ (hasDataProperty && (!hasDataValue || (dataHasTo && dataHasData)))).toBe(true);
147
+ });
148
+ });
149
+ //# sourceMappingURL=mint-burn.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mint-burn.test.js","sourceRoot":"","sources":["../../../tests/integration/mint-burn.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAE3D,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,EAAE,+BAA+B,EAAE,MAAM,yBAAyB,CAAC;AAE1E,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;IAC3C,+BAA+B,EAAE,CAAC;IAElC,IAAI,MAAyC,CAAC;IAC9C,IAAI,YAAqB,CAAC;IAC1B,IAAI,gBAAgC,CAAC;IACrC,IAAI,iBAEI,CAAC;IAET,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,MAAM,GAAG,cAAc,EAAE,CAAC;QAC1B,YAAY,GAAG,MAAM,CAAC,aAAa,CAAC;QAEpC,6CAA6C;QAC7C,IAAI,CAAC;YACH,gBAAgB,GAAG,MAAM,mBAAmB,CAAC,YAAY,CAAC,CAAC;YAC3D,IAAI,gBAAgB,EAAE,CAAC;gBACrB,iBAAiB,GAAG,MAAM,oBAAoB,CAAC,gBAAgB,CAAC,CAAC;YACnE,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,gBAAgB,GAAG,IAAI,CAAC;YACxB,iBAAiB,GAAG,IAAI,CAAC;QAC3B,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;QACxD,qCAAqC;QACrC,IAAI,CAAC,gBAAgB,IAAI,CAAC,iBAAiB;YAAE,OAAO;QAEpD,MAAM,UAAU,GAAG,oBAAoB,CAAC,CAAC,QAAQ;QAEjD,IAAI,MAA8D,CAAC;QACnE,IAAI,KAAc,CAAC;QAEnB,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,cAAc,CAC3B,iBAAiB,EACjB,UAAU,EACV,OAAO,EACP,KAAK,CACN,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,KAAK,GAAG,GAAG,CAAC;QACd,CAAC;QAED,8DAA8D;QAC9D,MAAM,SAAS,GAAG,MAAM,KAAK,SAAS,CAAC;QACvC,MAAM,QAAQ,GAAG,KAAK,KAAK,SAAS,CAAC;QACrC,MAAM,CAAC,SAAS,IAAI,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,CAAC,SAAS,IAAI,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAE1C,iCAAiC;QACjC,IAAI,QAAQ;YAAE,MAAM,KAAK,CAAC;QAE1B,qDAAqD;QACrD,0DAA0D;QAC1D,MAAM,WAAW,GAAG,MAAM,KAAK,SAAS,CAAC;QACzC,MAAM,CAAC,WAAW,IAAI,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE7D,wCAAwC;QACxC,MAAM,UAAU,GAAG,MAAM,KAAK,SAAS,IAAI,SAAS,IAAI,MAAM,CAAC;QAC/D,MAAM,KAAK,GAAG,MAAM,KAAK,SAAS,IAAI,IAAI,IAAI,MAAM,CAAC;QACrD,MAAM,CAAC,WAAW,IAAI,CAAC,UAAU,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;QACzD,qCAAqC;QACrC,IAAI,CAAC,gBAAgB,IAAI,CAAC,iBAAiB;YAAE,OAAO;QAEpD,MAAM,UAAU,GAAG,oBAAoB,CAAC,CAAC,QAAQ;QAEjD,IAAI,MAA8D,CAAC;QACnE,IAAI,KAAc,CAAC;QAEnB,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,cAAc,CAC3B,iBAAiB,EACjB,UAAU,EACV,QAAQ,EACR,KAAK,CACN,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,KAAK,GAAG,GAAG,CAAC;QACd,CAAC;QAED,8DAA8D;QAC9D,MAAM,SAAS,GAAG,MAAM,KAAK,SAAS,CAAC;QACvC,MAAM,QAAQ,GAAG,KAAK,KAAK,SAAS,CAAC;QACrC,MAAM,CAAC,SAAS,IAAI,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,CAAC,SAAS,IAAI,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAE1C,yCAAyC;QACzC,IAAI,QAAQ;YAAE,MAAM,KAAK,CAAC;QAE1B,MAAM,WAAW,GAAG,MAAM,KAAK,SAAS,CAAC;QACzC,MAAM,CAAC,WAAW,IAAI,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE7D,wCAAwC;QACxC,MAAM,UAAU,GAAG,MAAM,KAAK,SAAS,IAAI,SAAS,IAAI,MAAM,CAAC;QAC/D,MAAM,KAAK,GAAG,MAAM,KAAK,SAAS,IAAI,IAAI,IAAI,MAAM,CAAC;QACrD,MAAM,CAAC,WAAW,IAAI,CAAC,UAAU,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;QACzD,qCAAqC;QACrC,IAAI,CAAC,gBAAgB,IAAI,CAAC,iBAAiB;YACzC,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAElD,MAAM,UAAU,GAAG,oBAAoB,CAAC,CAAC,UAAU;QAEnD,IAAI,MAA8D,CAAC;QACnE,IAAI,KAAc,CAAC;QAEnB,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,cAAc,CAC3B,iBAAiB,EACjB,UAAU,EACV,QAAQ,EACR,KAAK,CACN,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,KAAK,GAAG,GAAG,CAAC;QACd,CAAC;QAED,8DAA8D;QAC9D,MAAM,SAAS,GAAG,MAAM,KAAK,SAAS,CAAC;QACvC,MAAM,QAAQ,GAAG,KAAK,KAAK,SAAS,CAAC;QACrC,MAAM,CAAC,SAAS,IAAI,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,CAAC,SAAS,IAAI,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAE1C,yCAAyC;QACzC,IAAI,QAAQ;YAAE,MAAM,KAAK,CAAC;QAE1B,MAAM,WAAW,GAAG,MAAM,KAAK,SAAS,CAAC;QACzC,MAAM,CAAC,WAAW,IAAI,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE7D,wCAAwC;QACxC,MAAM,UAAU,GAAG,MAAM,KAAK,SAAS,IAAI,SAAS,IAAI,MAAM,CAAC;QAC/D,MAAM,KAAK,GAAG,MAAM,KAAK,SAAS,IAAI,IAAI,IAAI,MAAM,CAAC;QACrD,MAAM,CAAC,WAAW,IAAI,CAAC,UAAU,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC7D,qCAAqC;QACrC,IAAI,CAAC,gBAAgB,IAAI,CAAC,iBAAiB;YAAE,OAAO;QAEpD,MAAM,UAAU,GAAG,oBAAoB,CAAC,CAAC,QAAQ;QAEjD,IAAI,MAA8D,CAAC;QACnE,IAAI,KAAc,CAAC;QAEnB,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,cAAc,CAC3B,iBAAiB,EACjB,UAAU,EACV,OAAO,EACP,IAAI,CACL,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,KAAK,GAAG,GAAG,CAAC;QACd,CAAC;QAED,8DAA8D;QAC9D,MAAM,SAAS,GAAG,MAAM,KAAK,SAAS,CAAC;QACvC,MAAM,QAAQ,GAAG,KAAK,KAAK,SAAS,CAAC;QACrC,MAAM,CAAC,SAAS,IAAI,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,CAAC,SAAS,IAAI,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAE1C,yCAAyC;QACzC,IAAI,QAAQ;YAAE,MAAM,KAAK,CAAC;QAE1B,0EAA0E;QAC1E,MAAM,WAAW,GAAG,MAAM,KAAK,SAAS,CAAC;QACzC,MAAM,CAAC,WAAW,IAAI,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE7D,2CAA2C;QAC3C,MAAM,eAAe,GAAG,MAAM,KAAK,SAAS,IAAI,MAAM,IAAI,MAAM,CAAC;QACjE,MAAM,YAAY,GAAG,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC;QACvE,MAAM,SAAS,GACb,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC;QAC3E,MAAM,WAAW,GACf,MAAM,KAAK,SAAS;YACpB,MAAM,CAAC,IAAI,KAAK,SAAS;YACzB,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC;QACxB,MAAM,CACJ,WAAW;YACT,CAAC,eAAe,IAAI,CAAC,CAAC,YAAY,IAAI,CAAC,SAAS,IAAI,WAAW,CAAC,CAAC,CAAC,CACrE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,41 @@
1
+ import { describe, test, expect } from 'vitest';
2
+ import { getOperatorGridBaseInfo, getOperatorGridRoles } from '../../features/index.js';
3
+ import { captureLogResult, isValidAddress, isValidBytes32, validateExpectedData, } from './helpers/test-assertions.js';
4
+ const EXPECTED_DATA_HOODI = {
5
+ CONTRACT_ADDRESS: '0x501e678182bB5dF3f733281521D3f3D1aDe69917',
6
+ DEFAULT_ADMIN_ROLE: '0x0000000000000000000000000000000000000000000000000000000000000000',
7
+ DEFAULT_TIER_OPERATOR: '0xFFfFfFffFFfffFFfFFfFFFFFffFFFffffFfFFFfF',
8
+ LIDO_LOCATOR: '0xe2EF9536DAAAEBFf5b1c130957AB3E80056b06D8',
9
+ REGISTRY_ROLE: '0xa495a3428837724c7f7648cda02eb83c9c4c778c8688d6f254c7f3f80c154d55',
10
+ DEFAULT_TIER_ID: 0n,
11
+ nodeOperatorCount: 29n,
12
+ };
13
+ describe('Operator Grid Integration Tests', () => {
14
+ test('should get operator grid base info and return valid data', async () => {
15
+ const data = await captureLogResult(() => getOperatorGridBaseInfo());
16
+ // Validate that data was captured
17
+ expect(data).not.toBeNull();
18
+ if (!data)
19
+ return;
20
+ validateExpectedData(data, EXPECTED_DATA_HOODI, expect);
21
+ expect(isValidAddress(data.DEFAULT_TIER_OPERATOR)).toBe(true);
22
+ expect(isValidAddress(data.LIDO_LOCATOR)).toBe(true);
23
+ expect(isValidAddress(data.CONTRACT_ADDRESS)).toBe(true);
24
+ expect(isValidBytes32(data.REGISTRY_ROLE)).toBe(true);
25
+ expect(isValidBytes32(data.DEFAULT_ADMIN_ROLE)).toBe(true);
26
+ });
27
+ test('should get operator grid roles and return valid data', async () => {
28
+ const data = await captureLogResult(() => getOperatorGridRoles());
29
+ // Validate that data was captured
30
+ expect(data).not.toBeNull();
31
+ if (!data)
32
+ return;
33
+ // Roles data structure: first element is role name
34
+ expect(data).toBeDefined();
35
+ // Check that we have role data (Role, Keccak, Members format)
36
+ // The first key should be a role name like 'DEFAULT_ADMIN_ROLE'
37
+ const keys = Object.keys(data);
38
+ expect(keys.length).toBeGreaterThan(0);
39
+ });
40
+ });
41
+ //# sourceMappingURL=operator-grid.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operator-grid.test.js","sourceRoot":"","sources":["../../../tests/integration/operator-grid.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChD,OAAO,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AACzE,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,oBAAoB,GACrB,MAAM,8BAA8B,CAAC;AAEtC,MAAM,mBAAmB,GAAG;IAC1B,gBAAgB,EAAE,4CAA4C;IAC9D,kBAAkB,EAChB,oEAAoE;IACtE,qBAAqB,EAAE,4CAA4C;IACnE,YAAY,EAAE,4CAA4C;IAC1D,aAAa,EACX,oEAAoE;IACtE,eAAe,EAAE,EAAE;IACnB,iBAAiB,EAAE,GAAG;CACvB,CAAC;AAEF,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;IAC/C,IAAI,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QAC1E,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAsB,GAAG,EAAE,CAC5D,uBAAuB,EAAE,CAC1B,CAAC;QAEF,kCAAkC;QAClC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC5B,IAAI,CAAC,IAAI;YAAE,OAAO;QAElB,oBAAoB,CAAC,IAAI,EAAE,mBAAmB,EAAE,MAAM,CAAC,CAAC;QAExD,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9D,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrD,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEzD,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtD,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QACtE,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAsB,GAAG,EAAE,CAC5D,oBAAoB,EAAE,CACvB,CAAC;QAEF,kCAAkC;QAClC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC5B,IAAI,CAAC,IAAI;YAAE,OAAO;QAElB,mDAAmD;QACnD,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;QAE3B,8DAA8D;QAC9D,gEAAgE;QAChE,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/B,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,47 @@
1
+ import { describe, test, expect } from 'vitest';
2
+ import { getPdgBaseInfo, getPdgRoles } from '../../features/index.js';
3
+ import { captureLogResult, isValidAddress, isValidBytes32, validateExpectedData, } from './helpers/test-assertions.js';
4
+ const EXPECTED_DATA_HOODI = {
5
+ CONTRACT_ADDRESS: '0xa5F55f3402beA2B14AE15Dae1b6811457D43581d',
6
+ DEFAULT_ADMIN_ROLE: '0x0000000000000000000000000000000000000000000000000000000000000000',
7
+ RESUME_ROLE: '0xa79a6aede309e0d48bf2ef0f71355c06ad317956d4c0da2deb0dc47cc34f826c',
8
+ PAUSE_ROLE: '0x8d0e4ae4847b49935b55c99f9c3ce025c87e7c4604c35b7ae56929bd32fa5a78',
9
+ BEACON_ROOTS: '0x000F3df6D732807Ef1319fB7B8bB8522d0Beac02',
10
+ GI_FIRST_VALIDATOR_CURR: '0x0000000000000000000000000000000000000000000000000096000000000028',
11
+ GI_FIRST_VALIDATOR_PREV: '0x0000000000000000000000000000000000000000000000000096000000000028',
12
+ GI_PUBKEY_WC_PARENT: '0x0000000000000000000000000000000000000000000000000000000000000402',
13
+ GI_STATE_ROOT: '0x0000000000000000000000000000000000000000000000000000000000000b03',
14
+ MAX_SUPPORTED_WC_VERSION: 2,
15
+ MIN_SUPPORTED_WC_VERSION: 1,
16
+ PREDEPOSIT_AMOUNT: 1000000000000000000n,
17
+ PIVOT_SLOT: 0n,
18
+ isPaused: false,
19
+ resumeSinceTimestamp: 1765803516n,
20
+ };
21
+ describe('Predeposit Guarantee Integration Tests', () => {
22
+ test('should get PDG base info and return valid data', async () => {
23
+ const data = await captureLogResult(() => getPdgBaseInfo());
24
+ // Validate that data was captured
25
+ expect(data).not.toBeNull();
26
+ if (!data)
27
+ return;
28
+ validateExpectedData(data, EXPECTED_DATA_HOODI, expect);
29
+ expect(isValidBytes32(data.PAUSE_ROLE)).toBe(true);
30
+ expect(isValidBytes32(data.RESUME_ROLE)).toBe(true);
31
+ expect(isValidBytes32(data.DEFAULT_ADMIN_ROLE)).toBe(true);
32
+ expect(isValidAddress(data.CONTRACT_ADDRESS)).toBe(true);
33
+ });
34
+ test('should get PDG roles and return valid data', async () => {
35
+ const data = await captureLogResult(() => getPdgRoles());
36
+ // Validate that data was captured
37
+ expect(data).not.toBeNull();
38
+ if (!data)
39
+ return;
40
+ // The data structure contains role information
41
+ expect(data).toBeDefined();
42
+ // Check that we have role data (Role, Keccak, Members format)
43
+ const keys = Object.keys(data);
44
+ expect(keys.length).toBeGreaterThan(0);
45
+ });
46
+ });
47
+ //# sourceMappingURL=pdg.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdg.test.js","sourceRoot":"","sources":["../../../tests/integration/pdg.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvD,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,oBAAoB,GACrB,MAAM,8BAA8B,CAAC;AAEtC,MAAM,mBAAmB,GAAG;IAC1B,gBAAgB,EAAE,4CAA4C;IAC9D,kBAAkB,EAChB,oEAAoE;IACtE,WAAW,EACT,oEAAoE;IACtE,UAAU,EACR,oEAAoE;IACtE,YAAY,EAAE,4CAA4C;IAC1D,uBAAuB,EACrB,oEAAoE;IACtE,uBAAuB,EACrB,oEAAoE;IACtE,mBAAmB,EACjB,oEAAoE;IACtE,aAAa,EACX,oEAAoE;IACtE,wBAAwB,EAAE,CAAC;IAC3B,wBAAwB,EAAE,CAAC;IAC3B,iBAAiB,EAAE,oBAAoB;IACvC,UAAU,EAAE,EAAE;IACd,QAAQ,EAAE,KAAK;IACf,oBAAoB,EAAE,WAAW;CAClC,CAAC;AAEF,QAAQ,CAAC,wCAAwC,EAAE,GAAG,EAAE;IACtD,IAAI,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAChE,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAsB,GAAG,EAAE,CAC5D,cAAc,EAAE,CACjB,CAAC;QAEF,kCAAkC;QAClC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC5B,IAAI,CAAC,IAAI;YAAE,OAAO;QAElB,oBAAoB,CAAC,IAAI,EAAE,mBAAmB,EAAE,MAAM,CAAC,CAAC;QAExD,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnD,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpD,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE3D,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC5D,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAsB,GAAG,EAAE,CAC5D,WAAW,EAAE,CACd,CAAC;QAEF,kCAAkC;QAClC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC5B,IAAI,CAAC,IAAI;YAAE,OAAO;QAElB,+CAA+C;QAC/C,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;QAE3B,8DAA8D;QAC9D,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/B,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}