Files
pezkuwi-api/packages/merkleize-metadata/dist/esm/proof.mjs
T
pezkuwichain 31467f90d4 feat: add PAPI rebrand packages
- @pezkuwi/papi-utils (rebrand of @polkadot-api/utils)
- @pezkuwi/bizinikiwi-bindings (rebrand of @polkadot-api/substrate-bindings)
- @pezkuwi/metadata-builders (rebrand of @polkadot-api/metadata-builders)
- @pezkuwi/merkleize-metadata (rebrand of @polkadot-api/merkleize-metadata)

All @polkadot-api references replaced with @pezkuwi equivalents.
2026-01-22 15:40:12 +03:00

48 lines
1.4 KiB
JavaScript

const getLevelFromIdx = (idx) => Math.log2(idx + 1) | 0;
const getAncestorIdx = (from, nLevels) => (from + 1 >> nLevels) - 1;
function getProofData(leaves, knownLeavesIdxs) {
const knownLeaves = knownLeavesIdxs.map((idx) => leaves[idx]);
const startingIdx = leaves.length - 1;
const leafIdxs = knownLeavesIdxs.map((idx) => startingIdx + idx);
const proofIdxs = [];
if (leafIdxs.length) {
const nLevels = getLevelFromIdx(leafIdxs.at(-1));
const splitPosition = Math.pow(2, nLevels) - 1;
const splitIdx = leafIdxs.findIndex((x) => x >= splitPosition);
if (splitIdx > 0) {
leafIdxs.unshift(...leafIdxs.splice(splitIdx));
knownLeaves.unshift(...knownLeaves.splice(splitIdx));
}
}
let targetIdx = 0;
const traverse = (nodeIdx) => {
if (targetIdx === leafIdxs.length) {
proofIdxs.push(nodeIdx);
return;
}
const target = leafIdxs[targetIdx];
if (target === nodeIdx) {
++targetIdx;
return;
}
const currentLevel = getLevelFromIdx(nodeIdx);
const targetLevel = getLevelFromIdx(target);
if (nodeIdx !== getAncestorIdx(target, targetLevel - currentLevel)) {
proofIdxs.push(nodeIdx);
return;
}
const leftSon = 2 * nodeIdx + 1;
traverse(leftSon);
traverse(leftSon + 1);
};
traverse(0);
return {
leaves: knownLeaves,
leafIdxs,
proofIdxs
};
}
export { getProofData };
//# sourceMappingURL=proof.mjs.map