@lidofinance/lsv-cli 1.0.0-alpha.23 → 1.0.0-alpha.25
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 +15 -44
- package/dist/abi/BlsHarness.js +232 -0
- package/dist/abi/BlsHarness.js.map +1 -0
- package/dist/abi/CLProofVerifier.js +47 -79
- package/dist/abi/CLProofVerifier.js.map +1 -1
- package/dist/abi/Dashboard.js +618 -196
- package/dist/abi/Dashboard.js.map +1 -1
- package/dist/abi/LidoLocator.js +7 -7
- package/dist/abi/LidoLocator.js.map +1 -1
- package/dist/abi/{Delegation.js → OperatorGrid.js} +466 -1067
- package/dist/abi/OperatorGrid.js.map +1 -0
- package/dist/abi/PredepositGuarantee.js +69 -13
- package/dist/abi/PredepositGuarantee.js.map +1 -1
- package/dist/abi/StEth.js +341 -341
- package/dist/abi/StEth.js.map +1 -1
- package/dist/abi/StakingVault.js +207 -73
- package/dist/abi/StakingVault.js.map +1 -1
- package/dist/abi/VaultFactory.js +67 -104
- package/dist/abi/VaultFactory.js.map +1 -1
- package/dist/abi/VaultHub.js +347 -237
- package/dist/abi/VaultHub.js.map +1 -1
- package/dist/abi/WstEth.js +478 -0
- package/dist/abi/WstEth.js.map +1 -0
- package/dist/abi/index.js +5 -2
- package/dist/abi/index.js.map +1 -1
- package/dist/configs/constants.js +2 -2
- package/dist/configs/constants.js.map +1 -1
- package/dist/configs/deployed.js +21 -47
- package/dist/configs/deployed.js.map +1 -1
- package/dist/configs/envs.js +5 -6
- package/dist/configs/envs.js.map +1 -1
- package/dist/configs/utils.js +4 -8
- package/dist/configs/utils.js.map +1 -1
- package/dist/contracts/blsHarness.js +24 -0
- package/dist/contracts/blsHarness.js.map +1 -0
- package/dist/contracts/clProofVerifier.js +4 -10
- package/dist/contracts/clProofVerifier.js.map +1 -1
- package/dist/contracts/index.js +3 -1
- package/dist/contracts/index.js.map +1 -1
- package/dist/contracts/locator.js +3 -3
- package/dist/contracts/locator.js.map +1 -1
- package/dist/contracts/operator-grid.js +17 -0
- package/dist/contracts/operator-grid.js.map +1 -0
- package/dist/contracts/pdg.js +2 -2
- package/dist/contracts/pdg.js.map +1 -1
- package/dist/contracts/reportChecker.js +4 -5
- package/dist/contracts/reportChecker.js.map +1 -1
- package/dist/contracts/steth.js +3 -3
- package/dist/contracts/steth.js.map +1 -1
- package/dist/contracts/token-manager.js +3 -3
- package/dist/contracts/token-manager.js.map +1 -1
- package/dist/contracts/vault-factory.js +2 -2
- package/dist/contracts/vault-factory.js.map +1 -1
- package/dist/contracts/vault-hub.js +3 -3
- package/dist/contracts/vault-hub.js.map +1 -1
- package/dist/contracts/vault-viewer.js +4 -6
- package/dist/contracts/vault-viewer.js.map +1 -1
- package/dist/contracts/vault.js +2 -2
- package/dist/contracts/vault.js.map +1 -1
- package/dist/contracts/voting.js +3 -3
- package/dist/contracts/voting.js.map +1 -1
- package/dist/contracts/wsteth.js +18 -0
- package/dist/contracts/wsteth.js.map +1 -0
- package/dist/features/advanced-config.js +3 -2
- package/dist/features/advanced-config.js.map +1 -1
- package/dist/features/dashboard.js +131 -0
- package/dist/features/dashboard.js.map +1 -0
- package/dist/features/index.js +8 -4
- package/dist/features/index.js.map +1 -1
- package/dist/features/operator-grid.js +57 -0
- package/dist/features/operator-grid.js.map +1 -0
- package/dist/features/pdg.js +79 -0
- package/dist/features/pdg.js.map +1 -0
- package/dist/features/vault-factory.js +33 -6
- package/dist/features/vault-factory.js.map +1 -1
- package/dist/features/vault-hub.js +81 -0
- package/dist/features/vault-hub.js.map +1 -0
- package/dist/features/vault.js +54 -0
- package/dist/features/vault.js.map +1 -0
- package/dist/features/voting.js +5 -9
- package/dist/features/voting.js.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/programs/account.js +107 -5
- package/dist/programs/account.js.map +1 -1
- package/dist/programs/config.js +2 -2
- package/dist/programs/config.js.map +1 -1
- package/dist/programs/dashboard/config.js +63 -17
- package/dist/programs/dashboard/config.js.map +1 -1
- package/dist/programs/dashboard/main.js +0 -7
- package/dist/programs/dashboard/main.js.map +1 -1
- package/dist/programs/dashboard/read.js +64 -42
- package/dist/programs/dashboard/read.js.map +1 -1
- package/dist/programs/dashboard/write.js +259 -155
- package/dist/programs/dashboard/write.js.map +1 -1
- package/dist/programs/hub/config.js +28 -32
- package/dist/programs/hub/config.js.map +1 -1
- package/dist/programs/hub/main.js +0 -7
- package/dist/programs/hub/main.js.map +1 -1
- package/dist/programs/hub/read.js +30 -35
- package/dist/programs/hub/read.js.map +1 -1
- package/dist/programs/hub/write.js +148 -40
- package/dist/programs/hub/write.js.map +1 -1
- package/dist/programs/index.js +1 -1
- package/dist/programs/index.js.map +1 -1
- package/dist/programs/operator-grid/config.js +81 -0
- package/dist/programs/operator-grid/config.js.map +1 -0
- package/dist/programs/operator-grid/index.js.map +1 -0
- package/dist/programs/operator-grid/main.js +5 -0
- package/dist/programs/operator-grid/main.js.map +1 -0
- package/dist/programs/operator-grid/read.js +24 -0
- package/dist/programs/operator-grid/read.js.map +1 -0
- package/dist/programs/operator-grid/write.js +109 -0
- package/dist/programs/operator-grid/write.js.map +1 -0
- package/dist/programs/pdg/config.js +49 -13
- package/dist/programs/pdg/config.js.map +1 -1
- package/dist/programs/pdg/main.js +0 -7
- package/dist/programs/pdg/main.js.map +1 -1
- package/dist/programs/pdg/read.js +20 -3
- package/dist/programs/pdg/read.js.map +1 -1
- package/dist/programs/pdg/write.js +147 -82
- package/dist/programs/pdg/write.js.map +1 -1
- package/dist/programs/pdg-helpers.js +155 -38
- package/dist/programs/pdg-helpers.js.map +1 -1
- package/dist/programs/report.js +66 -78
- package/dist/programs/report.js.map +1 -1
- package/dist/programs/vault/config.js +6 -2
- package/dist/programs/vault/config.js.map +1 -1
- package/dist/programs/vault/main.js +0 -7
- package/dist/programs/vault/main.js.map +1 -1
- package/dist/programs/vault/read.js +16 -44
- package/dist/programs/vault/read.js.map +1 -1
- package/dist/programs/vault/write.js +117 -33
- package/dist/programs/vault/write.js.map +1 -1
- package/dist/programs/vault-factory/main.js +0 -7
- package/dist/programs/vault-factory/main.js.map +1 -1
- package/dist/programs/vault-factory/read.js +17 -19
- package/dist/programs/vault-factory/read.js.map +1 -1
- package/dist/programs/vault-factory/write.js +30 -52
- package/dist/programs/vault-factory/write.js.map +1 -1
- package/dist/programs/vault-viewer/main.js +2 -2
- package/dist/programs/vault-viewer/main.js.map +1 -1
- package/dist/programs/voting.js +8 -23
- package/dist/programs/voting.js.map +1 -1
- package/dist/providers/wallet.js +4 -4
- package/dist/providers/wallet.js.map +1 -1
- package/dist/utils/arguments.js +44 -1
- package/dist/utils/arguments.js.map +1 -1
- package/dist/utils/bls.js +101 -0
- package/dist/utils/bls.js.map +1 -0
- package/dist/utils/commands/dashboard.js +103 -0
- package/dist/utils/commands/dashboard.js.map +1 -0
- package/dist/utils/commands/index.js +2 -0
- package/dist/utils/commands/index.js.map +1 -0
- package/dist/utils/contract.js +54 -15
- package/dist/utils/contract.js.map +1 -1
- package/dist/utils/data-validators.js +7 -22
- package/dist/utils/data-validators.js.map +1 -1
- package/dist/utils/error-handler.js +5 -2
- package/dist/utils/error-handler.js.map +1 -1
- package/dist/utils/fetchCL.js +57 -0
- package/dist/utils/fetchCL.js.map +1 -0
- package/dist/utils/get-deposit-data-root.js +3 -3
- package/dist/utils/health.js +69 -7
- package/dist/utils/health.js.map +1 -1
- package/dist/utils/index.js +6 -1
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/ipfs.js +54 -0
- package/dist/utils/ipfs.js.map +1 -0
- package/dist/utils/logging/console.js +23 -0
- package/dist/utils/logging/console.js.map +1 -0
- package/dist/utils/logging/constants.js +12 -0
- package/dist/utils/logging/constants.js.map +1 -0
- package/dist/utils/logging/index.js +2 -0
- package/dist/utils/logging/index.js.map +1 -0
- package/dist/utils/prompts/dashboard.js +63 -0
- package/dist/utils/prompts/dashboard.js.map +1 -0
- package/dist/utils/prompts/index.js +2 -1
- package/dist/utils/prompts/index.js.map +1 -1
- package/dist/utils/prompts/operations.js +41 -0
- package/dist/utils/prompts/operations.js.map +1 -0
- package/dist/utils/prompts/predeposit-guarantee.js +10 -13
- package/dist/utils/prompts/predeposit-guarantee.js.map +1 -1
- package/dist/utils/prompts/vault.js +4 -1
- package/dist/utils/prompts/vault.js.map +1 -1
- package/dist/utils/proof/create-proof.js +6 -30
- package/dist/utils/proof/create-proof.js.map +1 -1
- package/dist/utils/proof/first-validator-gindex.js +2 -1
- package/dist/utils/proof/first-validator-gindex.js.map +1 -1
- package/dist/utils/proof/merkle-utils.js +15 -3
- package/dist/utils/proof/merkle-utils.js.map +1 -1
- package/dist/utils/proof/report-proof.js +11 -6
- package/dist/utils/proof/report-proof.js.map +1 -1
- package/dist/utils/read-programs-by-abi.js +2 -2
- package/dist/utils/read-programs-by-abi.js.map +1 -1
- package/dist/utils/report.js +17 -17
- package/dist/utils/report.js.map +1 -1
- package/dist/utils/required-lock.js +21 -0
- package/dist/utils/required-lock.js.map +1 -0
- package/dist/version/index.js +1 -1
- package/package.json +10 -4
- package/dist/abi/Delegation.js.map +0 -1
- package/dist/contracts/delegation.js +0 -11
- package/dist/contracts/delegation.js.map +0 -1
- package/dist/features/dashboard-delegation.js +0 -25
- package/dist/features/dashboard-delegation.js.map +0 -1
- package/dist/programs/delegation/config.js +0 -33
- package/dist/programs/delegation/config.js.map +0 -1
- package/dist/programs/delegation/index.js.map +0 -1
- package/dist/programs/delegation/main.js +0 -12
- package/dist/programs/delegation/main.js.map +0 -1
- package/dist/programs/delegation/read.js +0 -104
- package/dist/programs/delegation/read.js.map +0 -1
- package/dist/programs/delegation/write.js +0 -323
- package/dist/programs/delegation/write.js.map +0 -1
- package/dist/utils/parse-string.js +0 -20
- package/dist/utils/parse-string.js.map +0 -1
- package/dist/utils/prompts/delegation-dashboard.js +0 -29
- package/dist/utils/prompts/delegation-dashboard.js.map +0 -1
- /package/dist/programs/{delegation → operator-grid}/index.js +0 -0
package/dist/utils/arguments.js
CHANGED
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
import { program } from 'commander';
|
|
2
|
-
import { parseEther } from 'viem';
|
|
2
|
+
import { isAddress, parseEther } from 'viem';
|
|
3
|
+
import { toHex } from './proof/merkle-utils.js';
|
|
4
|
+
const toCamelCase = (str) => str.replace(/_([a-z])/g, (_, char) => char.toUpperCase());
|
|
3
5
|
export const stringToBigIntArray = (value) => {
|
|
4
6
|
return value.split(',').map(BigInt);
|
|
5
7
|
};
|
|
8
|
+
export const stringToBigIntArrayWei = (value) => {
|
|
9
|
+
return value.split(',').map(etherToWei);
|
|
10
|
+
};
|
|
6
11
|
export const jsonToPermit = (value) => {
|
|
7
12
|
return JSON.parse(value);
|
|
8
13
|
};
|
|
@@ -21,4 +26,42 @@ export const stringToNumber = (value) => {
|
|
|
21
26
|
}
|
|
22
27
|
return parseInt(value);
|
|
23
28
|
};
|
|
29
|
+
export const parseTiers = (value) => {
|
|
30
|
+
return JSON.parse(value);
|
|
31
|
+
};
|
|
32
|
+
export const parseTier = (value) => {
|
|
33
|
+
return JSON.parse(value);
|
|
34
|
+
};
|
|
35
|
+
export const parseDepositArray = (str) => {
|
|
36
|
+
const trimmed = str.trim();
|
|
37
|
+
if (!trimmed) {
|
|
38
|
+
return [];
|
|
39
|
+
}
|
|
40
|
+
const parsed = JSON.parse('[' + trimmed + ']', (key, value) => {
|
|
41
|
+
if (key === '')
|
|
42
|
+
return value; // root array
|
|
43
|
+
if (key === 'amount')
|
|
44
|
+
return BigInt(value) * BigInt(10 ** 9); // to wei
|
|
45
|
+
if (typeof value === 'string') {
|
|
46
|
+
return toHex(value);
|
|
47
|
+
}
|
|
48
|
+
return value;
|
|
49
|
+
});
|
|
50
|
+
// Convert keys to camelCase
|
|
51
|
+
const camelCased = parsed.map((obj) => {
|
|
52
|
+
const newObj = {};
|
|
53
|
+
for (const key in obj) {
|
|
54
|
+
const camelKey = toCamelCase(key);
|
|
55
|
+
newObj[camelKey] = obj[key];
|
|
56
|
+
}
|
|
57
|
+
return newObj;
|
|
58
|
+
});
|
|
59
|
+
return camelCased;
|
|
60
|
+
};
|
|
61
|
+
export const stringToAddress = (value) => {
|
|
62
|
+
if (!isAddress(value)) {
|
|
63
|
+
program.error('Address value must be a valid address', { exitCode: 1 });
|
|
64
|
+
}
|
|
65
|
+
return value;
|
|
66
|
+
};
|
|
24
67
|
//# sourceMappingURL=arguments.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arguments.js","sourceRoot":"","sources":["../../utils/arguments.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"arguments.js","sourceRoot":"","sources":["../../utils/arguments.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { pad, bytesToHex } from 'viem';
|
|
2
|
+
import { mainnet, sepolia, hoodi } from 'viem/chains';
|
|
3
|
+
import { fromHexString, ByteVectorType, ContainerType, UintNumberType, } from '@chainsafe/ssz';
|
|
4
|
+
import { PublicKey, Signature, verify } from '@chainsafe/blst';
|
|
5
|
+
import { toHex } from './proof/merkle-utils.js';
|
|
6
|
+
import { getChain } from '../configs/index.js';
|
|
7
|
+
const FORK_VERSION_BY_CHAIN = {
|
|
8
|
+
[sepolia.id]: '0x90000069', // https://github.com/eth-clients/sepolia
|
|
9
|
+
[hoodi.id]: '0x10000910', // https://github.com/eth-clients/hoodi
|
|
10
|
+
[mainnet.id]: '0x00000000', // https://github.com/eth-clients/mainnet
|
|
11
|
+
};
|
|
12
|
+
export const computeDepositDomainByForkVersion = (forkVersion) => {
|
|
13
|
+
const ZERO_HASH = Buffer.alloc(32, 0);
|
|
14
|
+
const DOMAIN_DEPOSIT = Uint8Array.from([3, 0, 0, 0]);
|
|
15
|
+
const forkVersionUint8Array = fromHexString(forkVersion);
|
|
16
|
+
const Root = new ByteVectorType(32);
|
|
17
|
+
const Bytes4 = new ByteVectorType(4);
|
|
18
|
+
const Version = Bytes4;
|
|
19
|
+
const ForkData = new ContainerType({
|
|
20
|
+
currentVersion: Version,
|
|
21
|
+
genesisValidatorsRoot: Root,
|
|
22
|
+
}, { typeName: 'ForkData', jsonCase: 'eth2' });
|
|
23
|
+
const computeDomain = (domainType, forkVersion, genesisValidatorRoot) => {
|
|
24
|
+
const forkDataRoot = computeForkDataRoot(forkVersion, genesisValidatorRoot);
|
|
25
|
+
const domain = new Uint8Array(32);
|
|
26
|
+
domain.set(domainType, 0);
|
|
27
|
+
domain.set(forkDataRoot.slice(0, 28), 4);
|
|
28
|
+
return domain;
|
|
29
|
+
};
|
|
30
|
+
const computeForkDataRoot = (currentVersion, genesisValidatorsRoot) => {
|
|
31
|
+
return ForkData.hashTreeRoot({ currentVersion, genesisValidatorsRoot });
|
|
32
|
+
};
|
|
33
|
+
return computeDomain(DOMAIN_DEPOSIT, forkVersionUint8Array, ZERO_HASH);
|
|
34
|
+
};
|
|
35
|
+
export const computeDepositDomain = () => {
|
|
36
|
+
const forkByChain = FORK_VERSION_BY_CHAIN[getChain().id];
|
|
37
|
+
if (!forkByChain) {
|
|
38
|
+
throw new Error(`Fork version not found for chain ${getChain().id}`);
|
|
39
|
+
}
|
|
40
|
+
return computeDepositDomainByForkVersion(forkByChain);
|
|
41
|
+
};
|
|
42
|
+
const computeDepositMessageRoot = (pubkey, withdrawalCredentials, amount) => {
|
|
43
|
+
const Bytes48 = new ByteVectorType(48);
|
|
44
|
+
const Bytes32 = new ByteVectorType(32);
|
|
45
|
+
const UintNum64 = new UintNumberType(8);
|
|
46
|
+
const Root = new ByteVectorType(32);
|
|
47
|
+
const Domain = Bytes32;
|
|
48
|
+
const BLSPubkey = Bytes48;
|
|
49
|
+
const DepositMessage = new ContainerType({ pubkey: BLSPubkey, withdrawalCredentials: Bytes32, amount: UintNum64 }, { typeName: 'DepositMessage', jsonCase: 'eth2' });
|
|
50
|
+
const SigningData = new ContainerType({
|
|
51
|
+
objectRoot: Root,
|
|
52
|
+
domain: Domain,
|
|
53
|
+
}, { typeName: 'SigningData', jsonCase: 'eth2' });
|
|
54
|
+
const depositMessage = {
|
|
55
|
+
pubkey: BLSPubkey.fromJson(toHex(pubkey)),
|
|
56
|
+
withdrawalCredentials: Bytes32.fromJson(toHex(withdrawalCredentials)),
|
|
57
|
+
amount: UintNum64.fromJson(amount / 1000000000n),
|
|
58
|
+
};
|
|
59
|
+
const domain = computeDepositDomain();
|
|
60
|
+
return SigningData.hashTreeRoot({
|
|
61
|
+
objectRoot: DepositMessage.hashTreeRoot(depositMessage),
|
|
62
|
+
domain,
|
|
63
|
+
});
|
|
64
|
+
};
|
|
65
|
+
export const isValidBLSDeposit = (deposit, withdrawalCredentials) => {
|
|
66
|
+
const signningRoot = computeDepositMessageRoot(deposit.pubkey, withdrawalCredentials, deposit.amount);
|
|
67
|
+
const isBLSValid = verify(signningRoot, PublicKey.fromHex(deposit.pubkey), Signature.fromHex(deposit.signature), true, true);
|
|
68
|
+
return isBLSValid;
|
|
69
|
+
};
|
|
70
|
+
export const expandBLSSignature = (signature, pubkey) => {
|
|
71
|
+
const pubkeyY = PublicKey.fromHex(pubkey).toBytes(false).slice(48);
|
|
72
|
+
// pad Y.a to 32 bytes to match Fp struct
|
|
73
|
+
const pubkeyY_a = bytesToHex(pad(pubkeyY.slice(0, 16), { dir: 'left', size: 32 }));
|
|
74
|
+
const pubkeyY_b = bytesToHex(pad(pubkeyY.slice(16), { dir: 'left', size: 32 }));
|
|
75
|
+
const signatureY = Signature.fromHex(signature).toBytes(false).slice(96);
|
|
76
|
+
// first Fp of Y coordinate is last 48 bytes of signature
|
|
77
|
+
const sigY_c0 = signatureY.slice(48);
|
|
78
|
+
const sigY_c0_a = bytesToHex(pad(sigY_c0.slice(0, 16), {
|
|
79
|
+
dir: 'left',
|
|
80
|
+
size: 32,
|
|
81
|
+
}));
|
|
82
|
+
const sigY_c0_b = bytesToHex(pad(sigY_c0.slice(16), { dir: 'left', size: 32 }));
|
|
83
|
+
// second Fp is 48 bytes before first one
|
|
84
|
+
const sigY_c1 = signatureY.slice(0, 48);
|
|
85
|
+
const sigY_c1_a = bytesToHex(pad(sigY_c1.slice(0, 16), {
|
|
86
|
+
dir: 'left',
|
|
87
|
+
size: 32,
|
|
88
|
+
}));
|
|
89
|
+
const sigY_c1_b = bytesToHex(pad(sigY_c1.slice(16), { dir: 'left', size: 32 }));
|
|
90
|
+
return {
|
|
91
|
+
pubkey,
|
|
92
|
+
pubkeyY_a,
|
|
93
|
+
pubkeyY_b,
|
|
94
|
+
signature,
|
|
95
|
+
sigY_c0_a,
|
|
96
|
+
sigY_c0_b,
|
|
97
|
+
sigY_c1_a,
|
|
98
|
+
sigY_c1_b,
|
|
99
|
+
};
|
|
100
|
+
};
|
|
101
|
+
//# sourceMappingURL=bls.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bls.js","sourceRoot":"","sources":["../../utils/bls.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { callWriteMethodWithReceipt, confirmBurn, confirmOperation, getRequiredLockByShares, } from '../index.js';
|
|
2
|
+
import { formatEther } from 'viem';
|
|
3
|
+
import { getDashboardContract, getStethContract, } from '../../contracts/index.js';
|
|
4
|
+
import { callReadMethodSilent, fetchAndCalculateVaultHealthWithNewValue, logError, showSpinner, confirmMint, logInfo, } from '../index.js';
|
|
5
|
+
import { getAccount } from '../../providers/index.js';
|
|
6
|
+
const confirmLock = async (amountOfSharesWei, dashboardAddress) => {
|
|
7
|
+
const contract = getDashboardContract(dashboardAddress);
|
|
8
|
+
const { requiredLock, currentLock } = await getRequiredLockByShares(dashboardAddress, formatEther(amountOfSharesWei));
|
|
9
|
+
const currentWallet = getAccount();
|
|
10
|
+
const LOCK_ROLE = await callReadMethodSilent(contract, 'LOCK_ROLE');
|
|
11
|
+
const currentLockRoles = await callReadMethodSilent(contract, 'getRoleMembers', [LOCK_ROLE]);
|
|
12
|
+
const isLockRole = currentLockRoles.includes(currentWallet.address);
|
|
13
|
+
if (requiredLock > currentLock) {
|
|
14
|
+
logInfo(`Required lock: ${formatEther(requiredLock)} shares, current lock: ${formatEther(currentLock)} shares.
|
|
15
|
+
Auto-lock will be applied to enable minting the required number of shares. LOCK_ROLE is required.`);
|
|
16
|
+
if (!isLockRole) {
|
|
17
|
+
logError("You don't have a LOCK_ROLE. Please add yourself to the LOCK_ROLE.");
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
const confirm = await confirmOperation('Do you want to continue?');
|
|
21
|
+
if (!confirm)
|
|
22
|
+
return confirm;
|
|
23
|
+
}
|
|
24
|
+
return true;
|
|
25
|
+
};
|
|
26
|
+
export const mintSteth = async (contract, recipient, amountOfSteth) => {
|
|
27
|
+
const stethContract = await getStethContract();
|
|
28
|
+
const amountOfShares = await callReadMethodSilent(stethContract, 'getSharesByPooledEth', [amountOfSteth]);
|
|
29
|
+
await mintShares(contract, recipient, amountOfShares, 'mintStETH');
|
|
30
|
+
};
|
|
31
|
+
export const mintShares = async (contract, recipient, amountOfShares, method) => {
|
|
32
|
+
const type = method === 'mintShares'
|
|
33
|
+
? 'shares'
|
|
34
|
+
: method === 'mintStETH'
|
|
35
|
+
? 'stETH'
|
|
36
|
+
: 'wstETH';
|
|
37
|
+
const remainingMintingCapacity = await callReadMethodSilent(contract, 'remainingMintingCapacity', [0n]);
|
|
38
|
+
if (remainingMintingCapacity < amountOfShares) {
|
|
39
|
+
logError(`Cannot mint more shares than the vault can mint. Mintable: ${remainingMintingCapacity}`);
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
const isConfirmedLock = await confirmLock(amountOfShares, contract.address);
|
|
43
|
+
if (!isConfirmedLock)
|
|
44
|
+
return;
|
|
45
|
+
const hideSpinner = showSpinner();
|
|
46
|
+
const { currentVaultHealth, newVaultHealth, newLiabilityShares, liabilityShares, valueInStethWei, } = await fetchAndCalculateVaultHealthWithNewValue(contract, amountOfShares, 'mint');
|
|
47
|
+
const vault = await callReadMethodSilent(contract, 'stakingVault');
|
|
48
|
+
hideSpinner();
|
|
49
|
+
const confirm = await confirmMint({
|
|
50
|
+
vaultAddress: vault,
|
|
51
|
+
recipient,
|
|
52
|
+
amountOfMint: amountOfShares,
|
|
53
|
+
amountOfMintInStethWei: valueInStethWei,
|
|
54
|
+
newLiabilityShares: newLiabilityShares,
|
|
55
|
+
currentLiabilityShares: liabilityShares,
|
|
56
|
+
newHealthRatio: newVaultHealth.healthRatio,
|
|
57
|
+
currentHealthRatio: currentVaultHealth.healthRatio,
|
|
58
|
+
newIsHealthy: newVaultHealth.isHealthy,
|
|
59
|
+
currentIsHealthy: currentVaultHealth.isHealthy,
|
|
60
|
+
type,
|
|
61
|
+
});
|
|
62
|
+
if (!confirm)
|
|
63
|
+
return;
|
|
64
|
+
await callWriteMethodWithReceipt(contract, method, [
|
|
65
|
+
recipient,
|
|
66
|
+
amountOfShares,
|
|
67
|
+
]);
|
|
68
|
+
};
|
|
69
|
+
export const burnSteth = async (contract, amountOfSteth) => {
|
|
70
|
+
const stethContract = await getStethContract();
|
|
71
|
+
const amountOfShares = await callReadMethodSilent(stethContract, 'getSharesByPooledEth', [amountOfSteth]);
|
|
72
|
+
await burnShares(contract, amountOfShares, 'burnStETH');
|
|
73
|
+
};
|
|
74
|
+
export const burnShares = async (contract, amountOfShares, method) => {
|
|
75
|
+
const type = method === 'burnShares'
|
|
76
|
+
? 'shares'
|
|
77
|
+
: method === 'burnStETH'
|
|
78
|
+
? 'stETH'
|
|
79
|
+
: 'wstETH';
|
|
80
|
+
const liabilityShares = await callReadMethodSilent(contract, 'liabilityShares');
|
|
81
|
+
if (amountOfShares > liabilityShares) {
|
|
82
|
+
logError('Cannot burn more shares than the vault has');
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
const { currentVaultHealth, newVaultHealth, newLiabilityShares, valueInStethWei, } = await fetchAndCalculateVaultHealthWithNewValue(contract, amountOfShares, 'burn');
|
|
86
|
+
const vault = await callReadMethodSilent(contract, 'stakingVault');
|
|
87
|
+
const confirm = await confirmBurn({
|
|
88
|
+
vaultAddress: vault,
|
|
89
|
+
amountOfBurn: amountOfShares,
|
|
90
|
+
amountOfBurnInStethWei: valueInStethWei,
|
|
91
|
+
newLiabilityShares: newLiabilityShares,
|
|
92
|
+
currentLiabilityShares: liabilityShares,
|
|
93
|
+
newHealthRatio: newVaultHealth.healthRatio,
|
|
94
|
+
currentHealthRatio: currentVaultHealth.healthRatio,
|
|
95
|
+
newIsHealthy: newVaultHealth.isHealthy,
|
|
96
|
+
currentIsHealthy: currentVaultHealth.isHealthy,
|
|
97
|
+
type,
|
|
98
|
+
});
|
|
99
|
+
if (!confirm)
|
|
100
|
+
return;
|
|
101
|
+
await callWriteMethodWithReceipt(contract, method, [amountOfShares]);
|
|
102
|
+
};
|
|
103
|
+
//# sourceMappingURL=dashboard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../../utils/commands/dashboard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../utils/commands/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC"}
|
package/dist/utils/contract.js
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { waitForTransactionReceipt } from 'viem/actions';
|
|
2
2
|
import { getAccount, getPublicClient } from '../providers/index.js';
|
|
3
3
|
import { getChain } from '../configs/index.js';
|
|
4
|
-
import { showSpinner } from '
|
|
5
|
-
import { waitForTransactionReceipt } from 'viem/actions';
|
|
4
|
+
import { showSpinner, printError, logResult } from './index.js';
|
|
6
5
|
export const callSimulateWriteMethod = async (contract, methodName, payload, value) => {
|
|
7
6
|
const hideSpinner = showSpinner({
|
|
8
7
|
type: 'bouncingBall',
|
|
@@ -21,14 +20,14 @@ export const callSimulateWriteMethod = async (contract, methodName, payload, val
|
|
|
21
20
|
catch (err) {
|
|
22
21
|
hideSpinner();
|
|
23
22
|
printError(err, `Error when simulating write method "${methodName}"`);
|
|
24
|
-
|
|
23
|
+
throw err;
|
|
25
24
|
}
|
|
26
25
|
};
|
|
27
26
|
export const callWriteMethod = async (contract, methodName, payload, value) => {
|
|
28
27
|
const simulateResult = await callSimulateWriteMethod(contract, methodName, payload, value);
|
|
29
28
|
if (!simulateResult) {
|
|
30
29
|
printError(new Error('Simulation failed'), `Error when simulating write method "${methodName}"`);
|
|
31
|
-
|
|
30
|
+
throw new Error('Simulation failed');
|
|
32
31
|
}
|
|
33
32
|
const hideSpinner = showSpinner();
|
|
34
33
|
try {
|
|
@@ -39,31 +38,71 @@ export const callWriteMethod = async (contract, methodName, payload, value) => {
|
|
|
39
38
|
value,
|
|
40
39
|
});
|
|
41
40
|
hideSpinner();
|
|
42
|
-
|
|
41
|
+
logResult({
|
|
42
|
+
'Method name': methodName,
|
|
43
|
+
Contract: contract.address,
|
|
44
|
+
Transaction: tx,
|
|
45
|
+
});
|
|
43
46
|
return tx;
|
|
44
47
|
}
|
|
45
48
|
catch (err) {
|
|
46
49
|
hideSpinner();
|
|
47
50
|
printError(err, `Error when calling write method "${methodName}"`);
|
|
48
|
-
|
|
51
|
+
throw err;
|
|
49
52
|
}
|
|
50
53
|
};
|
|
51
54
|
export const callReadMethod = async (contract, methodName, ...payload) => {
|
|
52
55
|
const hideSpinner = showSpinner();
|
|
56
|
+
const isSilent = payload[payload.length - 1]?.silent ?? false;
|
|
53
57
|
try {
|
|
54
58
|
const method = contract.read[methodName];
|
|
55
|
-
const result = await method?.(payload
|
|
59
|
+
const result = await method?.(...payload);
|
|
56
60
|
hideSpinner();
|
|
61
|
+
if (isSilent)
|
|
62
|
+
return result;
|
|
63
|
+
const base = {
|
|
64
|
+
'Method name': methodName,
|
|
65
|
+
Contract: contract.address,
|
|
66
|
+
};
|
|
57
67
|
// TODO: do message better or show in called place
|
|
58
|
-
|
|
68
|
+
if (Array.isArray(result)) {
|
|
69
|
+
logResult({
|
|
70
|
+
...base,
|
|
71
|
+
Result: result
|
|
72
|
+
.map((r) => (typeof r === 'bigint' ? r.toString() : String(r)))
|
|
73
|
+
.join(', '),
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
else if (typeof result === 'object' && result !== null) {
|
|
77
|
+
// Expand result object into multiple rows
|
|
78
|
+
const expandedResult = {};
|
|
79
|
+
for (const [k, v] of Object.entries(result)) {
|
|
80
|
+
expandedResult[k] = typeof v === 'bigint' ? v.toString() : String(v);
|
|
81
|
+
}
|
|
82
|
+
logResult({
|
|
83
|
+
...base,
|
|
84
|
+
...expandedResult,
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
logResult({
|
|
89
|
+
...base,
|
|
90
|
+
Result: typeof result === 'bigint' ? result.toString() : result,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
59
93
|
return result;
|
|
60
94
|
}
|
|
61
95
|
catch (err) {
|
|
62
96
|
hideSpinner();
|
|
63
|
-
printError(err, `Error when calling read method
|
|
64
|
-
|
|
97
|
+
printError(err, `Error when calling read method ${methodName}@${contract.address}`);
|
|
98
|
+
throw err;
|
|
65
99
|
}
|
|
66
100
|
};
|
|
101
|
+
export const callReadMethodSilent = async (contract, methodName, ...payload) => {
|
|
102
|
+
return callReadMethod(contract, methodName, ...payload, {
|
|
103
|
+
silent: true,
|
|
104
|
+
});
|
|
105
|
+
};
|
|
67
106
|
export const isContractAddress = async (address) => {
|
|
68
107
|
const publicClient = getPublicClient();
|
|
69
108
|
const bytecode = await publicClient.getCode({
|
|
@@ -74,8 +113,6 @@ export const isContractAddress = async (address) => {
|
|
|
74
113
|
export const callWriteMethodWithReceipt = async (contract, methodName, payload, value) => {
|
|
75
114
|
const publicClient = getPublicClient();
|
|
76
115
|
const tx = await callWriteMethod(contract, methodName, payload, value);
|
|
77
|
-
if (!tx)
|
|
78
|
-
return;
|
|
79
116
|
const hideSpinner = showSpinner({
|
|
80
117
|
type: 'bouncingBar',
|
|
81
118
|
message: 'Waiting for transaction receipt...',
|
|
@@ -83,7 +120,9 @@ export const callWriteMethodWithReceipt = async (contract, methodName, payload,
|
|
|
83
120
|
try {
|
|
84
121
|
const receipt = await waitForTransactionReceipt(publicClient, { hash: tx });
|
|
85
122
|
hideSpinner();
|
|
86
|
-
|
|
123
|
+
logResult({
|
|
124
|
+
'Method name': methodName,
|
|
125
|
+
Contract: contract.address,
|
|
87
126
|
'Transaction status': receipt.status,
|
|
88
127
|
'Transaction block number': Number(receipt.blockNumber),
|
|
89
128
|
'Transaction gas used': Number(receipt.gasUsed),
|
|
@@ -93,7 +132,7 @@ export const callWriteMethodWithReceipt = async (contract, methodName, payload,
|
|
|
93
132
|
catch (err) {
|
|
94
133
|
hideSpinner();
|
|
95
134
|
printError(err, 'Error when waiting for transaction receipt');
|
|
96
|
-
|
|
135
|
+
throw err;
|
|
97
136
|
}
|
|
98
137
|
};
|
|
99
138
|
//# sourceMappingURL=contract.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contract.js","sourceRoot":"","sources":["../../utils/contract.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"contract.js","sourceRoot":"","sources":["../../utils/contract.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,22 +1,8 @@
|
|
|
1
1
|
import { isAddress } from 'viem';
|
|
2
2
|
export const validateConfig = (config) => {
|
|
3
3
|
const errors = {};
|
|
4
|
-
if (
|
|
5
|
-
errors.
|
|
6
|
-
}
|
|
7
|
-
if (typeof config.privateKey !== 'string' || !config.privateKey) {
|
|
8
|
-
errors.privateKey = 'Invalid privateKey: must be a non-empty string.';
|
|
9
|
-
}
|
|
10
|
-
if (typeof config.chainId !== 'number' || isNaN(config.chainId)) {
|
|
11
|
-
errors.chainId = 'Invalid chainId: must be a string representing a number.';
|
|
12
|
-
}
|
|
13
|
-
if (typeof config.lidoLocator !== 'string' ||
|
|
14
|
-
!isAddress(config.lidoLocator)) {
|
|
15
|
-
errors.lidoLocator =
|
|
16
|
-
'Invalid lidoLocator: must be a valid Ethereum address.';
|
|
17
|
-
}
|
|
18
|
-
if (typeof config.accounting !== 'string' || !isAddress(config.accounting)) {
|
|
19
|
-
errors.accounting = 'Invalid accounting: must be a valid Ethereum address.';
|
|
4
|
+
if (isNaN(config.CHAIN_ID)) {
|
|
5
|
+
errors.CHAIN_ID = 'Invalid chainId: must be in config.';
|
|
20
6
|
}
|
|
21
7
|
return errors;
|
|
22
8
|
};
|
|
@@ -36,14 +22,13 @@ export const isValidUrl = (value) => {
|
|
|
36
22
|
return false;
|
|
37
23
|
}
|
|
38
24
|
};
|
|
39
|
-
export const transformAddressesToArray = (payload
|
|
40
|
-
return
|
|
41
|
-
if (!
|
|
42
|
-
acc[
|
|
25
|
+
export const transformAddressesToArray = (payload) => {
|
|
26
|
+
return payload.reduce((acc, role) => {
|
|
27
|
+
if (!acc[role.role]) {
|
|
28
|
+
acc[role.role] = [role.account];
|
|
43
29
|
return acc;
|
|
44
30
|
}
|
|
45
|
-
|
|
46
|
-
acc[key] = value.map((item) => item.trim());
|
|
31
|
+
acc[role.role]?.push(role.account);
|
|
47
32
|
return acc;
|
|
48
33
|
}, {});
|
|
49
34
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-validators.js","sourceRoot":"","sources":["../../utils/data-validators.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAIjC,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"data-validators.js","sourceRoot":"","sources":["../../utils/data-validators.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAIjC,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,MAAc,EAAE,EAAE;IAC/C,MAAM,MAAM,GAAG,EAAkC,CAAC;IAElD,IAAI,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC3B,MAAM,CAAC,QAAQ,GAAG,qCAAqC,CAAC;IAC1D,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,KAAyB,EAAW,EAAE;IAC/D,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,UAAU,IAAI,GAAG,EAAE,CAAC;QACtB,OAAO,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;IAED,IAAI,CAAC;QACH,uCAAuC;QACvC,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,OAAyB,EAAE,EAAE;IACrE,OAAO,OAAO,CAAC,MAAM,CACnB,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;QACZ,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACpB,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAChC,OAAO,GAAG,CAAC;QACb,CAAC;QAED,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnC,OAAO,GAAG,CAAC;IACb,CAAC,EACD,EAA8B,CAC/B,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,OAAyB,EAAE,EAAE;IAChE,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QAC9C,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,IAAY,EAAE,EAAE;YACpC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;gBACrB,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,KAAK,IAAI,yBAAyB,CAAC,CAAC;YACrD,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,GAAG,CAAC;IACb,CAAC,EAAE,EAAc,CAAC,CAAC;AACrB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,OAAyB,EAAE,EAAE;IAC9D,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QAC9C,oEAAoE;QACpE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAE,CAAC,EAAE,CAAC;YAC9B,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,yBAAyB,CAAC,CAAC;QAC5C,CAAC;QAED,OAAO,GAAG,CAAC;IACb,CAAC,EAAE,EAAc,CAAC,CAAC;AACrB,CAAC,CAAC"}
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import { program } from '../command/index.js';
|
|
2
|
+
import { logError } from './index.js';
|
|
2
3
|
export const printError = (err, message) => {
|
|
3
4
|
if (err instanceof Error) {
|
|
4
|
-
|
|
5
|
+
logError(message);
|
|
6
|
+
program.error(`${err.message}`, { exitCode: 1 });
|
|
5
7
|
}
|
|
6
8
|
else {
|
|
7
|
-
|
|
9
|
+
logError(message);
|
|
10
|
+
program.error(`${err}`, { exitCode: 1 });
|
|
8
11
|
}
|
|
9
12
|
};
|
|
10
13
|
//# sourceMappingURL=error-handler.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error-handler.js","sourceRoot":"","sources":["../../utils/error-handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,GAAY,EAAE,OAAe,EAAE,EAAE;IAC1D,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;QACzB,
|
|
1
|
+
{"version":3,"file":"error-handler.js","sourceRoot":"","sources":["../../utils/error-handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEjC,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,GAAY,EAAE,OAAe,EAAE,EAAE;IAC1D,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;QACzB,QAAQ,CAAC,OAAO,CAAC,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;IACnD,CAAC;SAAM,CAAC;QACN,QAAQ,CAAC,OAAO,CAAC,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,GAAG,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;IAC3C,CAAC;AACH,CAAC,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { getConfig } from '../configs/index.js';
|
|
2
|
+
import { printError } from './index.js';
|
|
3
|
+
const endpoints = {
|
|
4
|
+
genesis: 'eth/v1/beacon/genesis',
|
|
5
|
+
beaconHeader: (blockId) => `eth/v1/beacon/headers/${blockId}`,
|
|
6
|
+
beaconHeadersByParentRoot: (parentRoot) => `eth/v1/beacon/headers?parent_root=${parentRoot}`,
|
|
7
|
+
state: (stateId) => `eth/v2/debug/beacon/states/${stateId}`,
|
|
8
|
+
};
|
|
9
|
+
export const SupportedFork = {
|
|
10
|
+
capella: 'capella',
|
|
11
|
+
deneb: 'deneb',
|
|
12
|
+
electra: 'electra',
|
|
13
|
+
};
|
|
14
|
+
export const fetchBeaconHeader = async (stateId, clURL) => {
|
|
15
|
+
const url = clURL || getConfig().CL_URL;
|
|
16
|
+
try {
|
|
17
|
+
const beaconHeaderResp = await fetch(`${url}${endpoints.beaconHeader(stateId)}`);
|
|
18
|
+
return beaconHeaderResp.json();
|
|
19
|
+
}
|
|
20
|
+
catch (error) {
|
|
21
|
+
printError(error, 'Error fetching beacon header');
|
|
22
|
+
throw error;
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
export const fetchBeaconState = async (stateId, clURL) => {
|
|
26
|
+
const url = clURL || getConfig().CL_URL;
|
|
27
|
+
try {
|
|
28
|
+
const beaconStateResp = await fetch(`${url}${endpoints.state(stateId)}`, {
|
|
29
|
+
headers: { accept: 'application/octet-stream' },
|
|
30
|
+
});
|
|
31
|
+
const { headers } = beaconStateResp;
|
|
32
|
+
const forkName = headers.get('eth-consensus-version');
|
|
33
|
+
// Checks
|
|
34
|
+
if (!(forkName in SupportedFork))
|
|
35
|
+
throw new Error(`Fork name [${forkName}] is not supported`);
|
|
36
|
+
const stateBodyBytes = await beaconStateResp.arrayBuffer();
|
|
37
|
+
if (!stateBodyBytes)
|
|
38
|
+
throw new Error('Beacon state body bytes are not found');
|
|
39
|
+
return { stateBodyBytes, forkName };
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
printError(error, 'Error fetching beacon state');
|
|
43
|
+
throw error;
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
export const fetchBeaconHeaderByParentRoot = async (parentRoot, clURL) => {
|
|
47
|
+
const url = clURL || getConfig().CL_URL;
|
|
48
|
+
try {
|
|
49
|
+
const beaconHeaderResp = await fetch(`${url}${endpoints.beaconHeadersByParentRoot(parentRoot)}`);
|
|
50
|
+
return beaconHeaderResp.json();
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
printError(error, 'Error fetching beacon header by parent root');
|
|
54
|
+
throw error;
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
//# sourceMappingURL=fetchCL.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetchCL.js","sourceRoot":"","sources":["../../utils/fetchCL.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAWnC,MAAM,SAAS,GAAG;IAChB,OAAO,EAAE,uBAAuB;IAChC,YAAY,EAAE,CAAC,OAAgB,EAAU,EAAE,CACzC,yBAAyB,OAAO,EAAE;IACpC,yBAAyB,EAAE,CAAC,UAAmB,EAAU,EAAE,CACzD,qCAAqC,UAAU,EAAE;IACnD,KAAK,EAAE,CAAC,OAAgB,EAAU,EAAE,CAAC,8BAA8B,OAAO,EAAE;CAC7E,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,SAAS;CACnB,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,EAAE,OAAgB,EAAE,KAAc,EAAE,EAAE;IAC1E,MAAM,GAAG,GAAG,KAAK,IAAI,SAAS,EAAE,CAAC,MAAM,CAAC;IAExC,IAAI,CAAC;QACH,MAAM,gBAAgB,GAAG,MAAM,KAAK,CAClC,GAAG,GAAG,GAAG,SAAS,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,CAC3C,CAAC;QAEF,OAAO,gBAAgB,CAAC,IAAI,EAAE,CAAC;IACjC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,UAAU,CAAC,KAAK,EAAE,8BAA8B,CAAC,CAAC;QAClD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,EACnC,OAAgB,EAChB,KAAc,EAIb,EAAE;IACH,MAAM,GAAG,GAAG,KAAK,IAAI,SAAS,EAAE,CAAC,MAAM,CAAC;IAExC,IAAI,CAAC;QACH,MAAM,eAAe,GAAG,MAAM,KAAK,CAAC,GAAG,GAAG,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE;YACvE,OAAO,EAAE,EAAE,MAAM,EAAE,0BAA0B,EAAE;SAChD,CAAC,CAAC;QAEH,MAAM,EAAE,OAAO,EAAE,GAAG,eAAe,CAAC;QACpC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAC1B,uBAAuB,CACM,CAAC;QAEhC,SAAS;QACT,IAAI,CAAC,CAAC,QAAQ,IAAI,aAAa,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,cAAc,QAAQ,oBAAoB,CAAC,CAAC;QAE9D,MAAM,cAAc,GAAG,MAAM,eAAe,CAAC,WAAW,EAAE,CAAC;QAC3D,IAAI,CAAC,cAAc;YACjB,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;QAE3D,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC;IACtC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,UAAU,CAAC,KAAK,EAAE,6BAA6B,CAAC,CAAC;QACjD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,6BAA6B,GAAG,KAAK,EAChD,UAAmB,EACnB,KAAc,EACd,EAAE;IACF,MAAM,GAAG,GAAG,KAAK,IAAI,SAAS,EAAE,CAAC,MAAM,CAAC;IAExC,IAAI,CAAC;QACH,MAAM,gBAAgB,GAAG,MAAM,KAAK,CAClC,GAAG,GAAG,GAAG,SAAS,CAAC,yBAAyB,CAAC,UAAU,CAAC,EAAE,CAC3D,CAAC;QAEF,OAAO,gBAAgB,CAAC,IAAI,EAAE,CAAC;IACjC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,UAAU,CAAC,KAAK,EAAE,6CAA6C,CAAC,CAAC;QAEjE,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC,CAAC"}
|
|
@@ -3,14 +3,14 @@ import { fromHex, sha256Concat, encodeGweiAsLittleEndian8, } from './proof/index
|
|
|
3
3
|
* - pubkey: bytes
|
|
4
4
|
* - withdrawalCredentials: bytes
|
|
5
5
|
* - signature: bytes
|
|
6
|
-
* -
|
|
6
|
+
* - amountETH: bigint or string (in ETH)
|
|
7
7
|
*/
|
|
8
8
|
export const computeDepositDataRoot = (pubkey, withdrawalCredentials, signature, amountWei) => {
|
|
9
9
|
const pubkeyBytes = fromHex(pubkey);
|
|
10
10
|
const withdrawalCredentialsBytes = fromHex(withdrawalCredentials);
|
|
11
11
|
const signatureBytes = fromHex(signature);
|
|
12
|
-
// 1) Convert amount from
|
|
13
|
-
const amountWeiBN = typeof amountWei
|
|
12
|
+
// 1) Convert amount from ETH to gwei
|
|
13
|
+
const amountWeiBN = typeof amountWei !== 'bigint' ? BigInt(amountWei) : amountWei;
|
|
14
14
|
const amountGwei = amountWeiBN / 1000000000n;
|
|
15
15
|
// 2) Get 8 bytes little-endian
|
|
16
16
|
const amountLE64 = encodeGweiAsLittleEndian8(amountGwei);
|