UNPKG

@lidofinance/lido-ethereum-sdk

Version:

<div style="display: flex;" align="center"> <h1 align="center">Lido Ethereum SDK</h1> </div>

80 lines 3.3 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getVaultData = exports.getReportProofs = exports.getReportProofByVaults = exports.getReportProofByVault = void 0; const merkle_tree_1 = require("@openzeppelin/merkle-tree"); const ipfs_js_1 = require("./ipfs.js"); const snake_to_camel_js_1 = require("../../common/utils/snake-to-camel.js"); const getReportProofByVault = async (args) => { const { vault } = args; const IPFSReportData = await (0, ipfs_js_1.fetchIPFS)(args); const merkleTree = merkle_tree_1.StandardMerkleTree.load({ ...IPFSReportData, values: IPFSReportData.values.map(({ treeIndex, value }) => { return { value, treeIndex: Number(treeIndex), }; }), }); const vaultIndex = IPFSReportData.values.findIndex(({ value }) => value[0].toLowerCase() === vault.toLowerCase()); if (vaultIndex < 0) { throw new Error(`Vault ${vault} not found in report`); } const reportData = (0, exports.getVaultData)(IPFSReportData, vault, args.cid); return { ...reportData, proof: merkleTree.getProof(vaultIndex), }; }; exports.getReportProofByVault = getReportProofByVault; const getReportProofByVaults = async (args) => { const { vaults } = args; const proofs = await Promise.all(vaults.map((vault) => (0, exports.getReportProofByVault)({ ...args, vault }))); return proofs; }; exports.getReportProofByVaults = getReportProofByVaults; const getReportProofs = async (args) => { const report = await (0, ipfs_js_1.fetchIPFS)(args); const vaultReports = report.values.map((value) => (0, exports.getVaultData)(report, value.value[0], args.cid).data); const vaults = vaultReports.map((vault) => vault.vaultAddress); const proofs = await Promise.all(vaults.map((vault) => (0, exports.getReportProofByVault)({ ...args, vault: vault }))); return proofs; }; exports.getReportProofs = getReportProofs; const getVaultData = (report, vault, cid) => { const match = report.values.find((entry) => entry.value[0]?.toLowerCase() === vault.toLowerCase()); if (!match) throw new Error('Vault not found'); const leaf = report.tree[Number(match.treeIndex)]; if (!leaf) throw new Error('Leaf not found'); const data = { vaultAddress: '', fee: '', totalValueWei: '', liabilityShares: '', maxLiabilityShares: '', slashingReserve: '', }; const extraData = report.extraValues[vault]; for (const [fieldName, index] of Object.entries(report.leafIndexToData)) { const valueByIndex = match.value[index]; if (valueByIndex === undefined) { throw new Error(`Missing value at index ${index} for field "${fieldName}"`); } const camelCaseFieldName = (0, snake_to_camel_js_1.snakeToCamel)(fieldName); data[camelCaseFieldName] = valueByIndex.toString(); } return { data, extraData, leaf, refSlot: report.refSlot, blockNumber: Number(report.blockNumber), timestamp: report.timestamp, prevTreeCID: report.prevTreeCID, cid, }; }; exports.getVaultData = getVaultData; //# sourceMappingURL=report-proof.js.map