@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.
- package/README.md +58 -0
- package/dist/abi/Dashboard.d.ts +268 -0
- package/dist/abi/Dashboard.js +2 -0
- package/dist/abi/Dashboard.js.map +1 -1
- package/dist/abi/PredepositGuarantee.d.ts +357 -88
- package/dist/abi/PredepositGuarantee.js +31 -28
- package/dist/abi/PredepositGuarantee.js.map +1 -1
- package/dist/abi/VaultViewer.d.ts +8 -0
- package/dist/abi/VaultViewer.js +10 -0
- package/dist/abi/VaultViewer.js.map +1 -1
- package/dist/command/index.js +1 -0
- package/dist/command/index.js.map +1 -1
- package/dist/configs/deployed.js +27 -8
- package/dist/configs/deployed.js.map +1 -1
- package/dist/configs/index.d.ts +4 -3
- package/dist/configs/index.js +4 -3
- package/dist/configs/index.js.map +1 -1
- package/dist/contracts/vault-viewer.js +2 -2
- package/dist/features/defi-wrapper/defi-wrapper-factory.d.ts +1 -2
- package/dist/features/defi-wrapper/defi-wrapper-factory.js +12 -9
- package/dist/features/defi-wrapper/defi-wrapper-factory.js.map +1 -1
- package/dist/features/deposits/index.d.ts +1 -0
- package/dist/features/deposits/index.js +1 -0
- package/dist/features/deposits/index.js.map +1 -1
- package/dist/features/deposits/validators.d.ts +12 -0
- package/dist/features/deposits/validators.js +31 -0
- package/dist/features/deposits/validators.js.map +1 -0
- package/dist/features/index.d.ts +1 -0
- package/dist/features/index.js +1 -0
- package/dist/features/index.js.map +1 -1
- package/dist/features/lazy-oracle.js +2 -2
- package/dist/features/lazy-oracle.js.map +1 -1
- package/dist/features/mint-burn/allowance.d.ts +7 -1
- package/dist/features/mint-burn/allowance.js +8 -9
- package/dist/features/mint-burn/allowance.js.map +1 -1
- package/dist/features/mint-burn/burn-shares.d.ts +2 -1
- package/dist/features/mint-burn/burn-shares.js +4 -3
- package/dist/features/mint-burn/burn-shares.js.map +1 -1
- package/dist/features/mint-burn/burn-steth.d.ts +2 -1
- package/dist/features/mint-burn/burn-steth.js +4 -3
- package/dist/features/mint-burn/burn-steth.js.map +1 -1
- package/dist/features/mint-burn/mint-shares.js +4 -6
- package/dist/features/mint-burn/mint-shares.js.map +1 -1
- package/dist/features/mint-burn/mint-steth.js +4 -6
- package/dist/features/mint-burn/mint-steth.js.map +1 -1
- package/dist/features/utils/connection.d.ts +2 -0
- package/dist/features/utils/connection.js +14 -0
- package/dist/features/utils/connection.js.map +1 -0
- package/dist/features/utils/index.d.ts +1 -0
- package/dist/features/utils/index.js +1 -0
- package/dist/features/utils/index.js.map +1 -1
- package/dist/features/utils/liability-shares.js +2 -1
- package/dist/features/utils/liability-shares.js.map +1 -1
- package/dist/features/utils/report-fresh.d.ts +11 -1
- package/dist/features/utils/report-fresh.js +17 -14
- package/dist/features/utils/report-fresh.js.map +1 -1
- package/dist/features/vault-factory.d.ts +13 -14
- package/dist/features/vault-factory.js +30 -8
- package/dist/features/vault-factory.js.map +1 -1
- package/dist/features/vault-operations/connect-vault.d.ts +4 -0
- package/dist/features/vault-operations/connect-vault.js +21 -0
- package/dist/features/vault-operations/connect-vault.js.map +1 -0
- package/dist/features/vault-operations/create-vault.js +6 -4
- package/dist/features/vault-operations/create-vault.js.map +1 -1
- package/dist/features/vault-operations/dashboard-by-vault.js +17 -4
- package/dist/features/vault-operations/dashboard-by-vault.js.map +1 -1
- package/dist/features/vault-operations/index.d.ts +2 -0
- package/dist/features/vault-operations/index.js +2 -0
- package/dist/features/vault-operations/index.js.map +1 -1
- package/dist/features/vault-operations/roles.d.ts +5 -0
- package/dist/features/vault-operations/roles.js +65 -0
- package/dist/features/vault-operations/roles.js.map +1 -0
- package/dist/features/vault-operations/vault-info.js +9 -3
- package/dist/features/vault-operations/vault-info.js.map +1 -1
- package/dist/features/vault-operations/vault-overview.js +5 -7
- package/dist/features/vault-operations/vault-overview.js.map +1 -1
- package/dist/features/vault-operations/vault-roles.js +1 -1
- package/dist/features/vault-operations/vault-roles.js.map +1 -1
- package/dist/features/with-report.d.ts +6 -0
- package/dist/features/with-report.js +18 -0
- package/dist/features/with-report.js.map +1 -0
- package/dist/index.js +32 -10
- package/dist/index.js.map +1 -1
- package/dist/programs/contracts/dashboard/write.js +39 -20
- package/dist/programs/contracts/dashboard/write.js.map +1 -1
- package/dist/programs/contracts/hub/write.js +5 -1
- package/dist/programs/contracts/hub/write.js.map +1 -1
- package/dist/programs/contracts/operator-grid/write.js +1 -1
- package/dist/programs/contracts/operator-grid/write.js.map +1 -1
- package/dist/programs/contracts/vault-factory/write.js +37 -23
- package/dist/programs/contracts/vault-factory/write.js.map +1 -1
- package/dist/programs/defi-wrapper/contracts/factory/write.js +12 -14
- package/dist/programs/defi-wrapper/contracts/factory/write.js.map +1 -1
- package/dist/programs/defi-wrapper/use-cases/wrapper-operations/create-pool.js +53 -16
- package/dist/programs/defi-wrapper/use-cases/wrapper-operations/create-pool.js.map +1 -1
- package/dist/programs/defi-wrapper/use-cases/wrapper-operations/read.js +2 -2
- package/dist/programs/defi-wrapper/use-cases/wrapper-operations/read.js.map +1 -1
- package/dist/programs/pdg-helpers.js +13 -9
- package/dist/programs/pdg-helpers.js.map +1 -1
- package/dist/programs/use-cases/consolidation/write.js +2 -2
- package/dist/programs/use-cases/consolidation/write.js.map +1 -1
- package/dist/programs/use-cases/vault-operations/create-vault.js +63 -27
- package/dist/programs/use-cases/vault-operations/create-vault.js.map +1 -1
- package/dist/programs/use-cases/vault-operations/write.js +124 -26
- package/dist/programs/use-cases/vault-operations/write.js.map +1 -1
- package/dist/tests/integration/deposits.test.d.ts +1 -0
- package/dist/tests/integration/deposits.test.js +67 -0
- package/dist/tests/integration/deposits.test.js.map +1 -0
- package/dist/tests/integration/globalSetup.d.ts +1 -0
- package/dist/tests/integration/globalSetup.js +55 -0
- package/dist/tests/integration/globalSetup.js.map +1 -0
- package/dist/tests/integration/helpers/index.d.ts +3 -0
- package/dist/tests/integration/helpers/index.js +4 -0
- package/dist/tests/integration/helpers/index.js.map +1 -0
- package/dist/tests/integration/helpers/test-assertions.d.ts +32 -0
- package/dist/tests/integration/helpers/test-assertions.js +92 -0
- package/dist/tests/integration/helpers/test-assertions.js.map +1 -0
- package/dist/tests/integration/helpers/test-client.d.ts +14530 -0
- package/dist/tests/integration/helpers/test-client.js +73 -0
- package/dist/tests/integration/helpers/test-client.js.map +1 -0
- package/dist/tests/integration/helpers/test-config.d.ts +14 -0
- package/dist/tests/integration/helpers/test-config.js +62 -0
- package/dist/tests/integration/helpers/test-config.js.map +1 -0
- package/dist/tests/integration/helpers/test-setup.d.ts +12 -0
- package/dist/tests/integration/helpers/test-setup.js +40 -0
- package/dist/tests/integration/helpers/test-setup.js.map +1 -0
- package/dist/tests/integration/lazy-oracle.test.d.ts +1 -0
- package/dist/tests/integration/lazy-oracle.test.js +31 -0
- package/dist/tests/integration/lazy-oracle.test.js.map +1 -0
- package/dist/tests/integration/metrics.test.d.ts +1 -0
- package/dist/tests/integration/metrics.test.js +95 -0
- package/dist/tests/integration/metrics.test.js.map +1 -0
- package/dist/tests/integration/mint-burn.test.d.ts +1 -0
- package/dist/tests/integration/mint-burn.test.js +149 -0
- package/dist/tests/integration/mint-burn.test.js.map +1 -0
- package/dist/tests/integration/operator-grid.test.d.ts +1 -0
- package/dist/tests/integration/operator-grid.test.js +41 -0
- package/dist/tests/integration/operator-grid.test.js.map +1 -0
- package/dist/tests/integration/pdg.test.d.ts +1 -0
- package/dist/tests/integration/pdg.test.js +47 -0
- package/dist/tests/integration/pdg.test.js.map +1 -0
- package/dist/tests/integration/utils.test.d.ts +1 -0
- package/dist/tests/integration/utils.test.js +70 -0
- package/dist/tests/integration/utils.test.js.map +1 -0
- package/dist/tests/integration/vault-factory.test.d.ts +1 -0
- package/dist/tests/integration/vault-factory.test.js +29 -0
- package/dist/tests/integration/vault-factory.test.js.map +1 -0
- package/dist/tests/integration/vault-hub.test.d.ts +1 -0
- package/dist/tests/integration/vault-hub.test.js +71 -0
- package/dist/tests/integration/vault-hub.test.js.map +1 -0
- package/dist/tests/integration/vault-operations.test.d.ts +1 -0
- package/dist/tests/integration/vault-operations.test.js +151 -0
- package/dist/tests/integration/vault-operations.test.js.map +1 -0
- package/dist/tests/integration/vault-roles.test.d.ts +1 -0
- package/dist/tests/integration/vault-roles.test.js +44 -0
- package/dist/tests/integration/vault-roles.test.js.map +1 -0
- package/dist/tests/integration/vault.test.d.ts +1 -0
- package/dist/tests/integration/vault.test.js +44 -0
- package/dist/tests/integration/vault.test.js.map +1 -0
- package/dist/tests/utils/arguments.test.js +85 -4
- package/dist/tests/utils/arguments.test.js.map +1 -1
- package/dist/tests/utils/bigInt.test.js +1 -1
- package/dist/tests/utils/bigInt.test.js.map +1 -1
- package/dist/tests/utils/calculate-health.test.d.ts +1 -0
- package/dist/tests/utils/calculate-health.test.js +140 -0
- package/dist/tests/utils/calculate-health.test.js.map +1 -0
- package/dist/tests/utils/calculate-overview-v2.test.d.ts +1 -0
- package/dist/tests/utils/calculate-overview-v2.test.js +181 -0
- package/dist/tests/utils/calculate-overview-v2.test.js.map +1 -0
- package/dist/tests/utils/calculate-overview.test.js +2 -1
- package/dist/tests/utils/calculate-overview.test.js.map +1 -1
- package/dist/tests/utils/csv-file.test.d.ts +1 -0
- package/dist/tests/utils/csv-file.test.js +111 -0
- package/dist/tests/utils/csv-file.test.js.map +1 -0
- package/dist/tests/utils/data-validators.test.js +1 -1
- package/dist/tests/utils/data-validators.test.js.map +1 -1
- package/dist/tests/utils/error-handler.test.js +7 -16
- package/dist/tests/utils/error-handler.test.js.map +1 -1
- package/dist/tests/utils/get-commands.test.js +1 -1
- package/dist/tests/utils/get-commands.test.js.map +1 -1
- package/dist/tests/utils/get-deposit-data-root.test.js +1 -2
- package/dist/tests/utils/get-deposit-data-root.test.js.map +1 -1
- package/dist/tests/utils/get-value.test.js +1 -1
- package/dist/tests/utils/get-value.test.js.map +1 -1
- package/dist/tests/utils/health.test.js +1 -1
- package/dist/tests/utils/health.test.js.map +1 -1
- package/dist/tests/utils/interrupt-handler.test.js +2 -5
- package/dist/tests/utils/interrupt-handler.test.js.map +1 -1
- package/dist/tests/utils/ipfs.test.js +37 -24
- package/dist/tests/utils/ipfs.test.js.map +1 -1
- package/dist/tests/utils/lido-apr.test.d.ts +1 -0
- package/dist/tests/utils/lido-apr.test.js +95 -0
- package/dist/tests/utils/lido-apr.test.js.map +1 -0
- package/dist/tests/utils/logging.test.js +135 -15
- package/dist/tests/utils/logging.test.js.map +1 -1
- package/dist/tests/utils/merkle-utils.test.d.ts +1 -0
- package/dist/tests/utils/merkle-utils.test.js +231 -0
- package/dist/tests/utils/merkle-utils.test.js.map +1 -0
- package/dist/tests/utils/rebase-rewards.test.d.ts +1 -0
- package/dist/tests/utils/rebase-rewards.test.js +114 -0
- package/dist/tests/utils/rebase-rewards.test.js.map +1 -0
- package/dist/tests/utils/resove-path.test.js +1 -1
- package/dist/tests/utils/resove-path.test.js.map +1 -1
- package/dist/tests/utils/sleep.test.js +5 -5
- package/dist/tests/utils/sleep.test.js.map +1 -1
- package/dist/tests/utils/snake-to-camel.test.d.ts +1 -0
- package/dist/tests/utils/snake-to-camel.test.js +37 -0
- package/dist/tests/utils/snake-to-camel.test.js.map +1 -0
- package/dist/tests/utils/timestamp.test.d.ts +1 -0
- package/dist/tests/utils/timestamp.test.js +51 -0
- package/dist/tests/utils/timestamp.test.js.map +1 -0
- package/dist/utils/arguments.d.ts +2 -1
- package/dist/utils/arguments.js +6 -0
- package/dist/utils/arguments.js.map +1 -1
- package/dist/utils/calculate-overview-v2.d.ts +1 -2
- package/dist/utils/calculate-overview-v2.js +3 -6
- package/dist/utils/calculate-overview-v2.js.map +1 -1
- package/dist/utils/calculate-overview.d.ts +1 -0
- package/dist/utils/calculate-overview.js +1 -0
- package/dist/utils/calculate-overview.js.map +1 -1
- package/dist/utils/commands/report.d.ts +6 -1
- package/dist/utils/commands/report.js +6 -5
- package/dist/utils/commands/report.js.map +1 -1
- package/dist/utils/consolidation/confirms.js +2 -2
- package/dist/utils/consolidation/confirms.js.map +1 -1
- package/dist/utils/consolidation/logs.js +4 -2
- package/dist/utils/consolidation/logs.js.map +1 -1
- package/dist/utils/consolidation/pubkeys.js +2 -0
- package/dist/utils/consolidation/pubkeys.js.map +1 -1
- package/dist/utils/consolidation/types.d.ts +1 -0
- package/dist/utils/consolidation/validator-info.js +2 -0
- package/dist/utils/consolidation/validator-info.js.map +1 -1
- package/dist/utils/error-handler.js +2 -9
- package/dist/utils/error-handler.js.map +1 -1
- package/dist/utils/interrupt-handler.js +8 -2
- package/dist/utils/interrupt-handler.js.map +1 -1
- package/dist/utils/logging/console.js +41 -3
- package/dist/utils/logging/console.js.map +1 -1
- package/dist/utils/prompts/mint-burn/confirm-mint.js +1 -0
- package/dist/utils/prompts/mint-burn/confirm-mint.js.map +1 -1
- package/dist/utils/prompts/operations.js +4 -1
- package/dist/utils/prompts/operations.js.map +1 -1
- package/dist/utils/proof/create-proof.d.ts +5 -0
- package/dist/utils/proof/create-proof.js +5 -0
- package/dist/utils/proof/create-proof.js.map +1 -1
- package/dist/utils/transactions/tx-private-key.d.ts +4 -0
- package/dist/utils/transactions/tx-private-key.js +52 -24
- package/dist/utils/transactions/tx-private-key.js.map +1 -1
- package/dist/utils/transactions/tx-wc.d.ts +1 -0
- package/dist/utils/transactions/tx-wc.js +10 -19
- package/dist/utils/transactions/tx-wc.js.map +1 -1
- package/dist/utils/transactions/types.d.ts +1 -0
- package/dist/utils/transactions/utils.d.ts +3 -0
- package/dist/utils/transactions/utils.js +33 -0
- package/dist/utils/transactions/utils.js.map +1 -0
- package/dist/utils/wallet-connect.js +3 -1
- package/dist/utils/wallet-connect.js.map +1 -1
- package/dist/version/index.js +1 -1
- package/dist/vitest.config.d.ts +2 -0
- package/dist/vitest.config.js +29 -0
- package/dist/vitest.config.js.map +1 -0
- package/dist/vitest.integration.config.d.ts +2 -0
- package/dist/vitest.integration.config.js +39 -0
- package/dist/vitest.integration.config.js.map +1 -0
- 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"}
|