@lidofinance/lsv-cli 1.2.0 → 1.3.1
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/report/write.js +3 -3
- package/dist/programs/use-cases/report/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 +122 -25
- 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 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { describe, test, expect, beforeAll } from 'vitest';
|
|
2
|
+
import { checkIsReportFresh, checkIsDisconnected, checkQuarantine, checkMintingCapacity, checkLiabilityShares, } from '../../features/index.js';
|
|
3
|
+
import { getDashboardContract } from '../../contracts/index.js';
|
|
4
|
+
import { loadTestConfig } from './helpers/test-config.js';
|
|
5
|
+
describe('Utils Integration Tests', () => {
|
|
6
|
+
let config;
|
|
7
|
+
let vaultAddress;
|
|
8
|
+
let dashboardAddress;
|
|
9
|
+
beforeAll(async () => {
|
|
10
|
+
config = loadTestConfig();
|
|
11
|
+
vaultAddress = config.VAULT_ADDRESS;
|
|
12
|
+
// Try to get dashboard address for the vault
|
|
13
|
+
try {
|
|
14
|
+
const { getDashboardByVault } = await import('../../features/index.js');
|
|
15
|
+
dashboardAddress = await getDashboardByVault(vaultAddress);
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
dashboardAddress = null;
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
test('should check if vault is disconnected', async () => {
|
|
22
|
+
const isDisconnected = await checkIsDisconnected(vaultAddress);
|
|
23
|
+
expect(typeof isDisconnected).toBe('boolean');
|
|
24
|
+
// Vault should be connected in test environment
|
|
25
|
+
expect(isDisconnected).toBe(false);
|
|
26
|
+
});
|
|
27
|
+
test('should check if report is fresh', async () => {
|
|
28
|
+
const result = await checkIsReportFresh({
|
|
29
|
+
vault: vaultAddress,
|
|
30
|
+
populateTx: false,
|
|
31
|
+
});
|
|
32
|
+
expect(result).toBeDefined();
|
|
33
|
+
expect(result).toHaveProperty('isFresh');
|
|
34
|
+
expect(typeof result.isFresh).toBe('boolean');
|
|
35
|
+
// In test environment, report should be fresh
|
|
36
|
+
expect(result.isFresh).toBe(true);
|
|
37
|
+
});
|
|
38
|
+
test('should check quarantine status', async () => {
|
|
39
|
+
const result = await checkQuarantine(vaultAddress);
|
|
40
|
+
expect(result).toBeDefined();
|
|
41
|
+
expect(result).toHaveProperty('quarantine');
|
|
42
|
+
expect(result).toHaveProperty('until');
|
|
43
|
+
expect(result).toHaveProperty('start');
|
|
44
|
+
expect(result).toHaveProperty('leftHours');
|
|
45
|
+
expect(result.quarantine).toBeDefined();
|
|
46
|
+
expect(result.quarantine).toHaveProperty('isActive');
|
|
47
|
+
expect(typeof result.quarantine.isActive).toBe('boolean');
|
|
48
|
+
});
|
|
49
|
+
test('should check minting capacity', async () => {
|
|
50
|
+
// Skip test if no dashboard is found
|
|
51
|
+
if (!dashboardAddress)
|
|
52
|
+
return;
|
|
53
|
+
const dashboardContract = await getDashboardContract(dashboardAddress);
|
|
54
|
+
const testAmount = 1000000000000000000n; // 1 ETH in wei
|
|
55
|
+
const result = await checkMintingCapacity(dashboardContract, testAmount);
|
|
56
|
+
expect(typeof result).toBe('boolean');
|
|
57
|
+
// Result should be true if capacity is sufficient, false otherwise
|
|
58
|
+
});
|
|
59
|
+
test('should check liability shares', async () => {
|
|
60
|
+
// Skip test if no dashboard is found
|
|
61
|
+
if (!dashboardAddress)
|
|
62
|
+
return;
|
|
63
|
+
const dashboardContract = await getDashboardContract(dashboardAddress);
|
|
64
|
+
const testAmount = 1000000000000000000n; // 1 ETH in wei
|
|
65
|
+
const result = await checkLiabilityShares(dashboardContract, testAmount);
|
|
66
|
+
expect(typeof result).toBe('boolean');
|
|
67
|
+
// Result should be true if amount <= liability shares, false otherwise
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
//# sourceMappingURL=utils.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.test.js","sourceRoot":"","sources":["../../../tests/integration/utils.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAE3D,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,eAAe,EACf,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,IAAI,MAAyC,CAAC;IAC9C,IAAI,YAAqB,CAAC;IAC1B,IAAI,gBAAgC,CAAC;IAErC,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,MAAM,GAAG,cAAc,EAAE,CAAC;QAC1B,YAAY,GAAG,MAAM,CAAC,aAAa,CAAC;QAEpC,6CAA6C;QAC7C,IAAI,CAAC;YACH,MAAM,EAAE,mBAAmB,EAAE,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;YACzD,gBAAgB,GAAG,MAAM,mBAAmB,CAAC,YAAY,CAAC,CAAC;QAC7D,CAAC;QAAC,MAAM,CAAC;YACP,gBAAgB,GAAG,IAAI,CAAC;QAC1B,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;QACvD,MAAM,cAAc,GAAG,MAAM,mBAAmB,CAAC,YAAY,CAAC,CAAC;QAE/D,MAAM,CAAC,OAAO,cAAc,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC9C,gDAAgD;QAChD,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC;YACtC,KAAK,EAAE,YAAY;YACnB,UAAU,EAAE,KAAK;SAClB,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;QAC7B,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;QACzC,MAAM,CAAC,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC9C,8CAA8C;QAC9C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;QAChD,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,YAAY,CAAC,CAAC;QAEnD,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;QAC7B,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;QAC5C,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QACvC,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QACvC,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;QAE3C,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC;QACxC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;QACrD,MAAM,CAAC,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;QAC/C,qCAAqC;QACrC,IAAI,CAAC,gBAAgB;YAAE,OAAO;QAE9B,MAAM,iBAAiB,GAAG,MAAM,oBAAoB,CAAC,gBAAgB,CAAC,CAAC;QACvE,MAAM,UAAU,GAAG,oBAAoB,CAAC,CAAC,eAAe;QAExD,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,iBAAiB,EAAE,UAAU,CAAC,CAAC;QAEzE,MAAM,CAAC,OAAO,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACtC,mEAAmE;IACrE,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;QAC/C,qCAAqC;QACrC,IAAI,CAAC,gBAAgB;YAAE,OAAO;QAE9B,MAAM,iBAAiB,GAAG,MAAM,oBAAoB,CAAC,gBAAgB,CAAC,CAAC;QACvE,MAAM,UAAU,GAAG,oBAAoB,CAAC,CAAC,eAAe;QAExD,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,iBAAiB,EAAE,UAAU,CAAC,CAAC;QAEzE,MAAM,CAAC,OAAO,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACtC,uEAAuE;IACzE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { describe, test, expect } from 'vitest';
|
|
2
|
+
import { getVaultFactoryInfo } from '../../features/index.js';
|
|
3
|
+
import { captureLogResult, isValidAddress, validateExpectedData, } from './helpers/test-assertions.js';
|
|
4
|
+
const EXPECTED_DATA_HOODI = {
|
|
5
|
+
CONTRACT_ADDRESS: '0x7Ba269a03eeD86f2f54CB04CA3b4b7626636Df4E',
|
|
6
|
+
BEACON: '0xb3e6a8B6A752d3bb905A1B3Ef12bbdeE77E8160e',
|
|
7
|
+
LIDO_LOCATOR: '0xe2EF9536DAAAEBFf5b1c130957AB3E80056b06D8',
|
|
8
|
+
};
|
|
9
|
+
describe('Vault Factory Integration Tests', () => {
|
|
10
|
+
test('should get vault factory info and return valid data', async () => {
|
|
11
|
+
const data = await captureLogResult(() => getVaultFactoryInfo());
|
|
12
|
+
// Validate that data was captured
|
|
13
|
+
expect(data).not.toBeNull();
|
|
14
|
+
if (!data)
|
|
15
|
+
return;
|
|
16
|
+
// Validate required fields exist
|
|
17
|
+
expect(data.BEACON).toBeDefined();
|
|
18
|
+
expect(isValidAddress(data.BEACON)).toBe(true);
|
|
19
|
+
expect(data.BEACON).toBe(EXPECTED_DATA_HOODI.BEACON);
|
|
20
|
+
expect(data.LIDO_LOCATOR).toBeDefined();
|
|
21
|
+
expect(isValidAddress(data.LIDO_LOCATOR)).toBe(true);
|
|
22
|
+
expect(data.LIDO_LOCATOR).toBe(EXPECTED_DATA_HOODI.LIDO_LOCATOR);
|
|
23
|
+
expect(data.CONTRACT_ADDRESS).toBeDefined();
|
|
24
|
+
expect(isValidAddress(data.CONTRACT_ADDRESS)).toBe(true);
|
|
25
|
+
expect(data.CONTRACT_ADDRESS).toBe(EXPECTED_DATA_HOODI.CONTRACT_ADDRESS);
|
|
26
|
+
validateExpectedData(data, EXPECTED_DATA_HOODI, expect);
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
//# sourceMappingURL=vault-factory.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vault-factory.test.js","sourceRoot":"","sources":["../../../tests/integration/vault-factory.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,oBAAoB,GACrB,MAAM,8BAA8B,CAAC;AAEtC,MAAM,mBAAmB,GAAG;IAC1B,gBAAgB,EAAE,4CAA4C;IAC9D,MAAM,EAAE,4CAA4C;IACpD,YAAY,EAAE,4CAA4C;CAC3D,CAAC;AAEF,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;IAC/C,IAAI,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACrE,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAsB,GAAG,EAAE,CAC5D,mBAAmB,EAAE,CACtB,CAAC;QAEF,kCAAkC;QAClC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC5B,IAAI,CAAC,IAAI;YAAE,OAAO;QAElB,iCAAiC;QACjC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;QAClC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/C,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;QAErD,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE,CAAC;QACxC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrD,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC;QAEjE,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,WAAW,EAAE,CAAC;QAC5C,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzD,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,CAAC;QAEzE,oBAAoB,CAAC,IAAI,EAAE,mBAAmB,EAAE,MAAM,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { describe, test, expect } from 'vitest';
|
|
2
|
+
import { getVaultHubBaseInfo, getVaultHubRoles } from '../../features/index.js';
|
|
3
|
+
import { captureLogResult, isValidAddress, isValidBytes32, validateExpectedData, } from './helpers/test-assertions.js';
|
|
4
|
+
const EXPECTED_DATA_HOODI = {
|
|
5
|
+
CONTRACT_ADDRESS: '0x4C9fFC325392090F789255b9948Ab1659b797964',
|
|
6
|
+
DEFAULT_ADMIN_ROLE: '0x0000000000000000000000000000000000000000000000000000000000000000',
|
|
7
|
+
LIDO: '0x3508A952176b3c15387C97BE809eaffB1982176a',
|
|
8
|
+
LIDO_LOCATOR: '0xe2EF9536DAAAEBFf5b1c130957AB3E80056b06D8',
|
|
9
|
+
PAUSE_INFINITELY: 115792089237316195423570985008687907853269984665640564039457584007913129639935n,
|
|
10
|
+
PAUSE_ROLE: '0x8d0e4ae4847b49935b55c99f9c3ce025c87e7c4604c35b7ae56929bd32fa5a78',
|
|
11
|
+
RESUME_ROLE: '0xa79a6aede309e0d48bf2ef0f71355c06ad317956d4c0da2deb0dc47cc34f826c',
|
|
12
|
+
VAULT_MASTER_ROLE: '0x479bc4a51d27fbdc8e51b5b1ebd3dcd58bd229090980bff226f8930587e69ce3',
|
|
13
|
+
MAX_RELATIVE_SHARE_LIMIT_BP: 1000n,
|
|
14
|
+
CONNECT_DEPOSIT: '1 ETH',
|
|
15
|
+
REPORT_FRESHNESS_DELTA: 172800n,
|
|
16
|
+
reportFreshnessDeltaHours: '48 hours',
|
|
17
|
+
resumeSinceTimestamp: 0n,
|
|
18
|
+
vaultsCount: 335n,
|
|
19
|
+
isPaused: false,
|
|
20
|
+
};
|
|
21
|
+
describe('Vault Hub Integration Tests', () => {
|
|
22
|
+
test('should get vault hub base info and return valid data', async () => {
|
|
23
|
+
const data = await captureLogResult(() => getVaultHubBaseInfo());
|
|
24
|
+
// Validate that data was captured
|
|
25
|
+
expect(data).not.toBeNull();
|
|
26
|
+
if (!data)
|
|
27
|
+
return;
|
|
28
|
+
// Validate required fields exist
|
|
29
|
+
expect(data.LIDO).toBeDefined();
|
|
30
|
+
expect(isValidAddress(data.LIDO)).toBe(true);
|
|
31
|
+
expect(data.LIDO).toBe(EXPECTED_DATA_HOODI.LIDO);
|
|
32
|
+
expect(data.LIDO_LOCATOR).toBeDefined();
|
|
33
|
+
expect(isValidAddress(data.LIDO_LOCATOR)).toBe(true);
|
|
34
|
+
expect(data.LIDO_LOCATOR).toBe(EXPECTED_DATA_HOODI.LIDO_LOCATOR);
|
|
35
|
+
expect(data.REPORT_FRESHNESS_DELTA).toBeDefined();
|
|
36
|
+
expect(data.REPORT_FRESHNESS_DELTA).toBe(EXPECTED_DATA_HOODI.REPORT_FRESHNESS_DELTA);
|
|
37
|
+
expect(data.vaultsCount).toBeDefined();
|
|
38
|
+
expect(data.vaultsCount).toBe(EXPECTED_DATA_HOODI.vaultsCount);
|
|
39
|
+
expect(data.isPaused).toBeDefined();
|
|
40
|
+
expect(data.isPaused).toBe(EXPECTED_DATA_HOODI.isPaused);
|
|
41
|
+
expect(data.CONTRACT_ADDRESS).toBeDefined();
|
|
42
|
+
expect(isValidAddress(data.CONTRACT_ADDRESS)).toBe(true);
|
|
43
|
+
expect(data.CONTRACT_ADDRESS).toBe(EXPECTED_DATA_HOODI.CONTRACT_ADDRESS);
|
|
44
|
+
expect(data.DEFAULT_ADMIN_ROLE).toBeDefined();
|
|
45
|
+
expect(isValidBytes32(data.DEFAULT_ADMIN_ROLE)).toBe(true);
|
|
46
|
+
expect(data.DEFAULT_ADMIN_ROLE).toBe(EXPECTED_DATA_HOODI.DEFAULT_ADMIN_ROLE);
|
|
47
|
+
expect(data.PAUSE_ROLE).toBeDefined();
|
|
48
|
+
expect(isValidBytes32(data.PAUSE_ROLE)).toBe(true);
|
|
49
|
+
expect(data.PAUSE_ROLE).toBe(EXPECTED_DATA_HOODI.PAUSE_ROLE);
|
|
50
|
+
expect(data.RESUME_ROLE).toBeDefined();
|
|
51
|
+
expect(isValidBytes32(data.RESUME_ROLE)).toBe(true);
|
|
52
|
+
expect(data.RESUME_ROLE).toBe(EXPECTED_DATA_HOODI.RESUME_ROLE);
|
|
53
|
+
expect(data.VAULT_MASTER_ROLE).toBeDefined();
|
|
54
|
+
expect(isValidBytes32(data.VAULT_MASTER_ROLE)).toBe(true);
|
|
55
|
+
expect(data.VAULT_MASTER_ROLE).toBe(EXPECTED_DATA_HOODI.VAULT_MASTER_ROLE);
|
|
56
|
+
validateExpectedData(data, EXPECTED_DATA_HOODI, expect);
|
|
57
|
+
});
|
|
58
|
+
test('should get vault hub roles and return valid data', async () => {
|
|
59
|
+
const data = await captureLogResult(() => getVaultHubRoles());
|
|
60
|
+
// Validate that data was captured
|
|
61
|
+
expect(data).not.toBeNull();
|
|
62
|
+
if (!data)
|
|
63
|
+
return;
|
|
64
|
+
// The data structure contains role information
|
|
65
|
+
expect(data).toBeDefined();
|
|
66
|
+
// Check that we have role data (Role, Keccak, Members format)
|
|
67
|
+
const keys = Object.keys(data);
|
|
68
|
+
expect(keys.length).toBeGreaterThan(0);
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
//# sourceMappingURL=vault-hub.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vault-hub.test.js","sourceRoot":"","sources":["../../../tests/integration/vault-hub.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import { describe, test, expect, beforeAll } from 'vitest';
|
|
2
|
+
import { getVaultInfoByDashboard, getVaultHealthByDashboard, getVaultOverviewByDashboard, getDashboardByVault, } from '../../features/index.js';
|
|
3
|
+
import { getDashboardContract } from '../../contracts/index.js';
|
|
4
|
+
import { loadTestConfig } from './helpers/test-config.js';
|
|
5
|
+
import { captureLogTable, isValidAddress, validateExpectedData, } from './helpers/test-assertions.js';
|
|
6
|
+
const EXPECTED_INFO_DATA_HOODI = {
|
|
7
|
+
'Vault address': '0x7FbB823699d961bD7A08cBb631bB71242ec86a56',
|
|
8
|
+
'Dashboard address': '0x318FcB0CCE93aBA9C21a1B4B38dbACcCEfF091E0',
|
|
9
|
+
'Vault Hub address': '0x4C9fFC325392090F789255b9948Ab1659b797964',
|
|
10
|
+
'LIDO Locator address': '0xe2EF9536DAAAEBFf5b1c130957AB3E80056b06D8',
|
|
11
|
+
'stETH address': '0x3508A952176b3c15387C97BE809eaffB1982176a',
|
|
12
|
+
'wstETH address': '0x7E99eE3C66636DE415D2d7C880938F2f40f94De4',
|
|
13
|
+
'Node Operator': '0x463f500FCb218d38FB35BECD20475ea75a79B7A9',
|
|
14
|
+
'Reserve Ratio, BP': 500,
|
|
15
|
+
'Reserve Ratio, %': '5.00%',
|
|
16
|
+
'Forced Rebalance Threshold, BP': 300,
|
|
17
|
+
'Forced Rebalance Threshold, %': '3.00%',
|
|
18
|
+
'Infra Fee, BP': 100,
|
|
19
|
+
'Infra Fee, %': '1.00%',
|
|
20
|
+
'Liquidity Fee, BP': 650,
|
|
21
|
+
'Liquidity Fee, %': '6.50%',
|
|
22
|
+
'Reservation Fee, BP': 0,
|
|
23
|
+
'Reservation Fee, %': '0.00%',
|
|
24
|
+
'Share Limit, Shares': '25000',
|
|
25
|
+
'Liability Shares, Shares': '0.270308321854275937',
|
|
26
|
+
'Obligations (sharesToBurn), Shares': '0',
|
|
27
|
+
'Obligations (feesToSettle), ETH': '0.000063852819183738',
|
|
28
|
+
'Total Value, ETH': '3.93',
|
|
29
|
+
'Locked, ETH': '1.274648391739846297',
|
|
30
|
+
'Max Lockable Value, ETH': '3.929936147180816262',
|
|
31
|
+
'Balance, ETH': '3.93',
|
|
32
|
+
'Settled Growth, ETH': '0',
|
|
33
|
+
'Total Minting Capacity, Shares': '2.883636485426129809',
|
|
34
|
+
'Remaining Minting Capacity, Shares': '2.613328163571853872',
|
|
35
|
+
'Withdrawable Value, ETH': '2.655287755440969965',
|
|
36
|
+
'Node Operator Fee Recipient': '0x463f500FCb218d38FB35BECD20475ea75a79B7A9',
|
|
37
|
+
'Node Operator Fee Rate, BP': 100,
|
|
38
|
+
'Node Operator Fee Rate, %': '1.00%',
|
|
39
|
+
'Node Operator Disbursable Fee, ETH': '0',
|
|
40
|
+
'Confirm Expiry': '86400 (24 hours)',
|
|
41
|
+
'Max Confirm Expiry': '2592000 (720 hours)',
|
|
42
|
+
'Min Confirm Expiry': '3600 (1 hours)',
|
|
43
|
+
};
|
|
44
|
+
const EXPECTED_OVERVIEW_DATA_HOODI = {
|
|
45
|
+
'Health Factor': '1387.9928%',
|
|
46
|
+
'Reserve Ratio, %': '5.00%',
|
|
47
|
+
'Force Rebalance Threshold, %': '3.00%',
|
|
48
|
+
'stVault Share Limit, stETH': '25401.399950970627575329',
|
|
49
|
+
'stVault Share Limit, Shares': '25000',
|
|
50
|
+
'Node Operator Fee Rate, %': '1.00%',
|
|
51
|
+
'Utilization Ratio, %': '9.3700%',
|
|
52
|
+
'Total Value, ETH': '3.93',
|
|
53
|
+
'Liability, stETH': '0.274648391739846297',
|
|
54
|
+
'Liability, Shares': '0.270308321854275937',
|
|
55
|
+
'Available To Withdrawal, ETH': '2.655287755440969965',
|
|
56
|
+
'Idle Capital, ETH': '3.93',
|
|
57
|
+
'Locked, ETH': '1.274648391739846297',
|
|
58
|
+
'Total Locked, ETH': '1.274712244559030035',
|
|
59
|
+
'Collateral, ETH': '1.274648391739846297',
|
|
60
|
+
'Recently Repaid, ETH': '0',
|
|
61
|
+
'Node Operator Accrued Fee, ETH': '0',
|
|
62
|
+
'Reserved, ETH': '0.01445517851262349',
|
|
63
|
+
'Settled Growth, ETH': '0',
|
|
64
|
+
'Total Minting Capacity, Shares': '2.883636485426129809',
|
|
65
|
+
'Total Minting Capacity, stETH': '2.929936147180816261',
|
|
66
|
+
'Remaining Minting Capacity, stETH': '2.655287755440969965',
|
|
67
|
+
'Remaining Minting Capacity, Shares': '2.613328163571853872',
|
|
68
|
+
'Unsettled Lido Fees, ETH': '0.000063852819183738',
|
|
69
|
+
'Shares to Burn, Shares': '0',
|
|
70
|
+
'Tier ID': 5n,
|
|
71
|
+
'Tier Share Limit, stETH': '25401.399950970627575329',
|
|
72
|
+
'Tier Share Limit, Shares': '25000',
|
|
73
|
+
'Group Share Limit, stETH': '50802.799901941255150658',
|
|
74
|
+
'Group Share Limit, Shares': '50000',
|
|
75
|
+
};
|
|
76
|
+
const EXPECTED_HEALTH_DATA_HOODI = {
|
|
77
|
+
'Vault Healthy': true,
|
|
78
|
+
'Health Rate': '1387.9928354399083%',
|
|
79
|
+
'Total Value, ETH': '3.93',
|
|
80
|
+
'Liability Shares': '0.270308321854275937',
|
|
81
|
+
'Liability Shares in stETH': '0.274648391739846297',
|
|
82
|
+
'Forced Rebalance Threshold, %': '3.00%',
|
|
83
|
+
};
|
|
84
|
+
describe('Vault Operations Integration Tests', () => {
|
|
85
|
+
let config;
|
|
86
|
+
let vaultAddress;
|
|
87
|
+
let dashboardAddress;
|
|
88
|
+
beforeAll(async () => {
|
|
89
|
+
config = loadTestConfig();
|
|
90
|
+
vaultAddress = config.VAULT_ADDRESS;
|
|
91
|
+
// Try to get dashboard address for the vault
|
|
92
|
+
try {
|
|
93
|
+
dashboardAddress = await getDashboardByVault(vaultAddress);
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
// Dashboard might not exist for this vault
|
|
97
|
+
dashboardAddress = null;
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
test('should get dashboard by vault if available', async () => {
|
|
101
|
+
// Skip test if no dashboard is found
|
|
102
|
+
if (!dashboardAddress)
|
|
103
|
+
return;
|
|
104
|
+
expect(dashboardAddress).toBeDefined();
|
|
105
|
+
expect(typeof dashboardAddress).toBe('string');
|
|
106
|
+
expect(isValidAddress(dashboardAddress)).toBe(true);
|
|
107
|
+
});
|
|
108
|
+
test('should get vault info by dashboard and return valid data', async () => {
|
|
109
|
+
// Skip test if no dashboard is found
|
|
110
|
+
if (!dashboardAddress)
|
|
111
|
+
return;
|
|
112
|
+
const dashboardContract = await getDashboardContract(dashboardAddress);
|
|
113
|
+
const tableData = await captureLogTable(() => getVaultInfoByDashboard(dashboardContract));
|
|
114
|
+
// Validate that data was captured
|
|
115
|
+
expect(tableData).not.toBeNull();
|
|
116
|
+
if (!tableData)
|
|
117
|
+
return;
|
|
118
|
+
// Check that we have data
|
|
119
|
+
expect(Object.keys(tableData).length).toBeGreaterThan(0);
|
|
120
|
+
validateExpectedData(tableData, EXPECTED_INFO_DATA_HOODI, expect);
|
|
121
|
+
});
|
|
122
|
+
test('should get vault health by dashboard and return valid data', async () => {
|
|
123
|
+
// Skip test if no dashboard is found
|
|
124
|
+
if (!dashboardAddress)
|
|
125
|
+
return;
|
|
126
|
+
const dashboardContract = await getDashboardContract(dashboardAddress);
|
|
127
|
+
const tableData = await captureLogTable(() => getVaultHealthByDashboard(dashboardContract));
|
|
128
|
+
// Validate that data was captured
|
|
129
|
+
expect(tableData).not.toBeNull();
|
|
130
|
+
if (!tableData)
|
|
131
|
+
return;
|
|
132
|
+
// Check that we have health data
|
|
133
|
+
expect(Object.keys(tableData).length).toBeGreaterThan(0);
|
|
134
|
+
validateExpectedData(tableData, EXPECTED_HEALTH_DATA_HOODI, expect);
|
|
135
|
+
});
|
|
136
|
+
test('should get vault overview by dashboard and return valid data', async () => {
|
|
137
|
+
// Skip test if no dashboard is found
|
|
138
|
+
if (!dashboardAddress)
|
|
139
|
+
return;
|
|
140
|
+
const dashboardContract = await getDashboardContract(dashboardAddress);
|
|
141
|
+
const tableData = await captureLogTable(() => getVaultOverviewByDashboard(dashboardContract));
|
|
142
|
+
// Validate that data was captured
|
|
143
|
+
expect(tableData).not.toBeNull();
|
|
144
|
+
if (!tableData)
|
|
145
|
+
return;
|
|
146
|
+
// Check that we have overview data
|
|
147
|
+
expect(Object.keys(tableData).length).toBeGreaterThan(0);
|
|
148
|
+
validateExpectedData(tableData, EXPECTED_OVERVIEW_DATA_HOODI, expect);
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
//# sourceMappingURL=vault-operations.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vault-operations.test.js","sourceRoot":"","sources":["../../../tests/integration/vault-operations.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { describe, test, expect, beforeAll } from 'vitest';
|
|
2
|
+
import { getVaultRolesByDashboard, getDashboardByVault } from '../../features/index.js';
|
|
3
|
+
import { getDashboardContract } from '../../contracts/index.js';
|
|
4
|
+
import { loadTestConfig } from './helpers/test-config.js';
|
|
5
|
+
import { captureLogResult } from './helpers/test-assertions.js';
|
|
6
|
+
describe('Vault Roles Integration Tests', () => {
|
|
7
|
+
let config;
|
|
8
|
+
let vaultAddress;
|
|
9
|
+
let dashboardAddress;
|
|
10
|
+
beforeAll(async () => {
|
|
11
|
+
config = loadTestConfig();
|
|
12
|
+
vaultAddress = config.VAULT_ADDRESS;
|
|
13
|
+
// Try to get dashboard address for the vault
|
|
14
|
+
try {
|
|
15
|
+
dashboardAddress = await getDashboardByVault(vaultAddress);
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
// Dashboard might not exist for this vault
|
|
19
|
+
dashboardAddress = null;
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
test('should get vault roles by dashboard and return valid data', async () => {
|
|
23
|
+
// Skip test if no dashboard is found
|
|
24
|
+
if (!dashboardAddress)
|
|
25
|
+
return;
|
|
26
|
+
const dashboardContract = await getDashboardContract(dashboardAddress);
|
|
27
|
+
const data = await captureLogResult(() => getVaultRolesByDashboard(dashboardContract));
|
|
28
|
+
// Validate that data was captured
|
|
29
|
+
expect(data).not.toBeNull();
|
|
30
|
+
if (!data)
|
|
31
|
+
return;
|
|
32
|
+
// The data structure contains role information
|
|
33
|
+
expect(data).toBeDefined();
|
|
34
|
+
// Check that we have role data (Role, Keccak, Members format)
|
|
35
|
+
// Should have multiple roles returned
|
|
36
|
+
const keys = Object.keys(data);
|
|
37
|
+
expect(keys.length).toBeGreaterThan(0);
|
|
38
|
+
// At minimum, we expect DEFAULT_ADMIN_ROLE to be present
|
|
39
|
+
// Data is in format of first row being role name
|
|
40
|
+
const hasData = Object.values(data).some((value) => value !== undefined);
|
|
41
|
+
expect(hasData).toBe(true);
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
//# sourceMappingURL=vault-roles.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vault-roles.test.js","sourceRoot":"","sources":["../../../tests/integration/vault-roles.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAE3D,OAAO,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AACzE,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAEhE,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;IAC7C,IAAI,MAAyC,CAAC;IAC9C,IAAI,YAAqB,CAAC;IAC1B,IAAI,gBAAgC,CAAC;IAErC,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;QAC7D,CAAC;QAAC,MAAM,CAAC;YACP,2CAA2C;YAC3C,gBAAgB,GAAG,IAAI,CAAC;QAC1B,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QAC3E,qCAAqC;QACrC,IAAI,CAAC,gBAAgB;YAAE,OAAO;QAE9B,MAAM,iBAAiB,GAAG,MAAM,oBAAoB,CAAC,gBAAgB,CAAC,CAAC;QACvE,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAsB,GAAG,EAAE,CAC5D,wBAAwB,CAAC,iBAAiB,CAAC,CAC5C,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,sCAAsC;QACtC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/B,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAEvC,yDAAyD;QACzD,iDAAiD;QACjD,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC;QACzE,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { describe, test, expect, beforeAll } from 'vitest';
|
|
2
|
+
import { getVaultBaseInfo } from '../../features/index.js';
|
|
3
|
+
import { loadTestConfig } from './helpers/test-config.js';
|
|
4
|
+
import { captureLogResult, isValidAddress, isValidBytes32, validateExpectedData, } from './helpers/test-assertions.js';
|
|
5
|
+
const EXPECTED_BASE_INFO_DATA_HOODI = {
|
|
6
|
+
DEPOSIT_CONTRACT: '0x00000000219ab540356cBB839Cbe05303d7705Fa',
|
|
7
|
+
CONTRACT_ADDRESS: '0x7FbB823699d961bD7A08cBb631bB71242ec86a56',
|
|
8
|
+
owner: '0x4C9fFC325392090F789255b9948Ab1659b797964',
|
|
9
|
+
pendingOwner: '0x0000000000000000000000000000000000000000',
|
|
10
|
+
depositor: '0xa5F55f3402beA2B14AE15Dae1b6811457D43581d',
|
|
11
|
+
nodeOperator: '0x463f500FCb218d38FB35BECD20475ea75a79B7A9',
|
|
12
|
+
beaconChainDepositsPaused: false,
|
|
13
|
+
initializedVersion: 1n,
|
|
14
|
+
version: 1n,
|
|
15
|
+
balance: '3.93 ETH',
|
|
16
|
+
availableBalance: '3.93 ETH',
|
|
17
|
+
stagedBalance: '0 ETH',
|
|
18
|
+
isOwnerContract: true,
|
|
19
|
+
withdrawalCredentials: '0x0200000000000000000000007fbb823699d961bd7a08cbb631bb71242ec86a56',
|
|
20
|
+
};
|
|
21
|
+
describe('Vault Integration Tests', () => {
|
|
22
|
+
let config;
|
|
23
|
+
let vaultAddress;
|
|
24
|
+
beforeAll(async () => {
|
|
25
|
+
config = loadTestConfig();
|
|
26
|
+
vaultAddress = config.VAULT_ADDRESS;
|
|
27
|
+
});
|
|
28
|
+
test('should get vault base info and return valid data', async () => {
|
|
29
|
+
const data = await captureLogResult(() => getVaultBaseInfo(vaultAddress));
|
|
30
|
+
// Validate that data was captured
|
|
31
|
+
expect(data).not.toBeNull();
|
|
32
|
+
if (!data)
|
|
33
|
+
return;
|
|
34
|
+
validateExpectedData(data, EXPECTED_BASE_INFO_DATA_HOODI, expect);
|
|
35
|
+
expect(isValidBytes32(data.withdrawalCredentials)).toBe(true);
|
|
36
|
+
expect(isValidAddress(data.CONTRACT_ADDRESS)).toBe(true);
|
|
37
|
+
expect(isValidAddress(data.nodeOperator)).toBe(true);
|
|
38
|
+
expect(isValidAddress(data.DEPOSIT_CONTRACT)).toBe(true);
|
|
39
|
+
expect(isValidAddress(data.owner)).toBe(true);
|
|
40
|
+
expect(isValidAddress(data.depositor)).toBe(true);
|
|
41
|
+
expect(isValidAddress(data.pendingOwner)).toBe(true);
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
//# sourceMappingURL=vault.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vault.test.js","sourceRoot":"","sources":["../../../tests/integration/vault.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAE3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,oBAAoB,GACrB,MAAM,8BAA8B,CAAC;AAEtC,MAAM,6BAA6B,GAAG;IACpC,gBAAgB,EAAE,4CAA4C;IAC9D,gBAAgB,EAAE,4CAA4C;IAC9D,KAAK,EAAE,4CAA4C;IACnD,YAAY,EAAE,4CAA4C;IAC1D,SAAS,EAAE,4CAA4C;IACvD,YAAY,EAAE,4CAA4C;IAC1D,yBAAyB,EAAE,KAAK;IAChC,kBAAkB,EAAE,EAAE;IACtB,OAAO,EAAE,EAAE;IACX,OAAO,EAAE,UAAU;IACnB,gBAAgB,EAAE,UAAU;IAC5B,aAAa,EAAE,OAAO;IACtB,eAAe,EAAE,IAAI;IACrB,qBAAqB,EACnB,oEAAoE;CACvE,CAAC;AAEF,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,IAAI,MAAyC,CAAC;IAC9C,IAAI,YAAqB,CAAC;IAE1B,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,MAAM,GAAG,cAAc,EAAE,CAAC;QAC1B,YAAY,GAAG,MAAM,CAAC,aAAa,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QAClE,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAsB,GAAG,EAAE,CAC5D,gBAAgB,CAAC,YAAY,CAAC,CAC/B,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,6BAA6B,EAAE,MAAM,CAAC,CAAC;QAElE,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9D,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEzD,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;QACzD,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9C,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClD,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1,16 +1,19 @@
|
|
|
1
|
-
import { describe, test, expect, beforeEach,
|
|
1
|
+
import { describe, test, expect, beforeEach, vi } from 'vitest';
|
|
2
|
+
import { mkdtempSync, rmSync, writeFileSync } from 'fs';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
import { tmpdir } from 'os';
|
|
2
5
|
import { program } from 'commander';
|
|
3
|
-
import { stringToBigIntArray, stringToBigIntArrayWei, stringToHexArray, jsonToPermit, jsonToRoleAssignment, stringToBigInt, etherToWei, stringToNumber, parseTiers, parseTier, parseDepositArray, stringToAddress, } from '../../utils/arguments.js';
|
|
6
|
+
import { stringToBigIntArray, stringToBigIntArrayWei, stringToHexArray, jsonToPermit, jsonToRoleAssignment, stringToBigInt, etherToWei, stringToNumber, parseTiers, parseTier, parseDepositArray, stringToAddress, stringTo2dArray, stringToHex, jsonFileToPubkeys, stringToNumberArray, etherToGwei, etherToWeiArray, etherToGweiArray, stringToBoolean, parseDeposit, parseValidatorTopUpArray, stringToHash, } from '../../utils/arguments.js';
|
|
4
7
|
const MOCK_HEX_ARRAY = [
|
|
5
8
|
'82f3254f7bf057539113fc6b5971d80958618a9893eea717ab5ad345e083df7fceaf55f48716409d3df5adb4f38c4900',
|
|
6
9
|
'23f3254f7bf057539113fc6b5971d80958618a1234eea717ab5ad345e083df7fceaf55f48716409d3df5adb4f38c4900',
|
|
7
10
|
];
|
|
8
|
-
|
|
11
|
+
vi.mock('commander', () => ({ program: { error: vi.fn() } }));
|
|
9
12
|
let programError;
|
|
10
13
|
beforeEach(() => {
|
|
11
14
|
// eslint-disable-next-line @typescript-eslint/unbound-method
|
|
12
15
|
programError = program.error;
|
|
13
|
-
|
|
16
|
+
vi.clearAllMocks();
|
|
14
17
|
});
|
|
15
18
|
describe('arguments utils', () => {
|
|
16
19
|
test('stringToBigIntArray', () => {
|
|
@@ -57,6 +60,34 @@ describe('arguments utils', () => {
|
|
|
57
60
|
stringToNumber('-1');
|
|
58
61
|
expect(programError).toHaveBeenCalled();
|
|
59
62
|
});
|
|
63
|
+
test('stringToBoolean valid and invalid', () => {
|
|
64
|
+
expect(stringToBoolean('true')).toBe(true);
|
|
65
|
+
expect(stringToBoolean('false')).toBe(false);
|
|
66
|
+
stringToBoolean('maybe');
|
|
67
|
+
expect(programError).toHaveBeenCalled();
|
|
68
|
+
});
|
|
69
|
+
test('stringTo2dArray', () => {
|
|
70
|
+
expect(stringTo2dArray('"a b, c d"')).toEqual([
|
|
71
|
+
['a', 'b'],
|
|
72
|
+
['c', 'd'],
|
|
73
|
+
]);
|
|
74
|
+
expect(stringTo2dArray('x y,z')).toEqual([['x', 'y'], ['z']]);
|
|
75
|
+
});
|
|
76
|
+
test('stringToHex', () => {
|
|
77
|
+
expect(stringToHex('abc')).toBe('0xabc');
|
|
78
|
+
expect(stringToHex('0x123')).toBe('0x123');
|
|
79
|
+
});
|
|
80
|
+
test('stringToNumberArray', () => {
|
|
81
|
+
expect(stringToNumberArray('1,2,3')).toEqual([1, 2, 3]);
|
|
82
|
+
});
|
|
83
|
+
test('etherToGwei helpers', () => {
|
|
84
|
+
expect(etherToGwei('1')).toBe(1000000000n);
|
|
85
|
+
expect(etherToWeiArray('1,0.5')).toEqual([
|
|
86
|
+
1000000000000000000n,
|
|
87
|
+
500000000000000000n,
|
|
88
|
+
]);
|
|
89
|
+
expect(etherToGweiArray('1,2')).toEqual([1000000000n, 2000000000n]);
|
|
90
|
+
});
|
|
60
91
|
test('parseTiers and parseTier', () => {
|
|
61
92
|
const tier = {
|
|
62
93
|
shareLimit: '1',
|
|
@@ -81,6 +112,51 @@ describe('arguments utils', () => {
|
|
|
81
112
|
expect(res[0]).toHaveProperty('pubkey', `0x${MOCK_HEX_ARRAY[0]}`);
|
|
82
113
|
expect(parseDepositArray('')).toEqual([]);
|
|
83
114
|
});
|
|
115
|
+
test('parseDeposit', () => {
|
|
116
|
+
const deposit = parseDeposit(JSON.stringify({
|
|
117
|
+
pubkey: MOCK_HEX_ARRAY[0],
|
|
118
|
+
withdrawal_credentials: MOCK_HEX_ARRAY[1],
|
|
119
|
+
deposit_data_root: MOCK_HEX_ARRAY[1],
|
|
120
|
+
amount: 2,
|
|
121
|
+
}));
|
|
122
|
+
expect(deposit).toEqual({
|
|
123
|
+
pubkey: `0x${MOCK_HEX_ARRAY[0]}`,
|
|
124
|
+
withdrawalCredentials: `0x${MOCK_HEX_ARRAY[1]}`,
|
|
125
|
+
depositDataRoot: `0x${MOCK_HEX_ARRAY[1]}`,
|
|
126
|
+
amount: 2000000000n,
|
|
127
|
+
});
|
|
128
|
+
expect(parseDeposit(' ')).toEqual({});
|
|
129
|
+
});
|
|
130
|
+
test('parseValidatorTopUpArray', () => {
|
|
131
|
+
const res = parseValidatorTopUpArray(JSON.stringify([{ pubkey: MOCK_HEX_ARRAY[0], amount: 3 }]));
|
|
132
|
+
expect(res).toEqual([
|
|
133
|
+
{ pubkey: `0x${MOCK_HEX_ARRAY[0]}`, amount: 3000000000n },
|
|
134
|
+
]);
|
|
135
|
+
expect(parseValidatorTopUpArray('')).toEqual([]);
|
|
136
|
+
});
|
|
137
|
+
test('jsonFileToPubkeys valid', () => {
|
|
138
|
+
const dir = mkdtempSync(path.join(tmpdir(), 'args-'));
|
|
139
|
+
const file = path.join(dir, 'pubkeys.json');
|
|
140
|
+
const content = { '0x01': ['0x02', '0x03'] };
|
|
141
|
+
writeFileSync(file, JSON.stringify(content));
|
|
142
|
+
try {
|
|
143
|
+
expect(jsonFileToPubkeys(file)).toEqual(content);
|
|
144
|
+
}
|
|
145
|
+
finally {
|
|
146
|
+
rmSync(dir, { recursive: true, force: true });
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
test('jsonFileToPubkeys invalid', () => {
|
|
150
|
+
const dir = mkdtempSync(path.join(tmpdir(), 'args-'));
|
|
151
|
+
const file = path.join(dir, 'pubkeys.json');
|
|
152
|
+
writeFileSync(file, JSON.stringify({ notHex: ['0x02'] }));
|
|
153
|
+
try {
|
|
154
|
+
expect(() => jsonFileToPubkeys(file)).toThrow();
|
|
155
|
+
}
|
|
156
|
+
finally {
|
|
157
|
+
rmSync(dir, { recursive: true, force: true });
|
|
158
|
+
}
|
|
159
|
+
});
|
|
84
160
|
test('stringToAddress valid', () => {
|
|
85
161
|
expect(stringToAddress('0x0000000000000000000000000000000000000001')).toBe('0x0000000000000000000000000000000000000001');
|
|
86
162
|
});
|
|
@@ -88,5 +164,10 @@ describe('arguments utils', () => {
|
|
|
88
164
|
stringToAddress('0x123');
|
|
89
165
|
expect(programError).toHaveBeenCalled();
|
|
90
166
|
});
|
|
167
|
+
test('stringToHash valid and invalid', () => {
|
|
168
|
+
expect(stringToHash('0xabc')).toBe('0xabc');
|
|
169
|
+
stringToHash('not-a-hash');
|
|
170
|
+
expect(programError).toHaveBeenCalled();
|
|
171
|
+
});
|
|
91
172
|
});
|
|
92
173
|
//# sourceMappingURL=arguments.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arguments.test.js","sourceRoot":"","sources":["../../../tests/utils/arguments.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"arguments.test.js","sourceRoot":"","sources":["../../../tests/utils/arguments.test.ts"],"names":[],"mappings":"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"}
|