@lidofinance/lido-ethereum-sdk
Version:
<div style="display: flex;" align="center"> <h1 align="center">Lido Ethereum SDK</h1> </div>
80 lines • 3.3 kB
JavaScript
;
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