import { Tree } from "@chainsafe/persistent-merkle-tree";
import { BLOCK_BODY_EXECUTION_PAYLOAD_GINDEX, FINALIZED_ROOT_GINDEX, FINALIZED_ROOT_GINDEX_ELECTRA, isForkPostElectra, } from "@lodestar/params";
import { ssz } from "@lodestar/types";
export function getSyncCommitteesWitness(fork, state) {
    const n1 = state.node;
    let witness;
    let currentSyncCommitteeRoot;
    let nextSyncCommitteeRoot;
    if (isForkPostElectra(fork)) {
        const n2 = n1.left;
        const n5 = n2.right;
        const n10 = n5.left;
        const n21 = n10.right;
        const n43 = n21.right;
        currentSyncCommitteeRoot = n43.left.root; // n86
        nextSyncCommitteeRoot = n43.right.root; // n87
        // Witness branch is sorted by descending gindex
        witness = [
            n21.left.root, // 42
            n10.left.root, // 20
            n5.right.root, // 11
            n2.left.root, // 4
            n1.right.root, // 3
        ];
    }
    else {
        const n3 = n1.right; // [1]0110
        const n6 = n3.left; // 1[0]110
        const n13 = n6.right; // 10[1]10
        const n27 = n13.right; // 101[1]0
        currentSyncCommitteeRoot = n27.left.root; // n54 1011[0]
        nextSyncCommitteeRoot = n27.right.root; // n55 1011[1]
        // Witness branch is sorted by descending gindex
        witness = [
            n13.left.root, // 26
            n6.left.root, // 12
            n3.right.root, // 7
            n1.left.root, // 2
        ];
    }
    return {
        witness,
        currentSyncCommitteeRoot,
        nextSyncCommitteeRoot,
    };
}
export function getNextSyncCommitteeBranch(syncCommitteesWitness) {
    // Witness branch is sorted by descending gindex
    return [syncCommitteesWitness.currentSyncCommitteeRoot, ...syncCommitteesWitness.witness];
}
export function getCurrentSyncCommitteeBranch(syncCommitteesWitness) {
    // Witness branch is sorted by descending gindex
    return [syncCommitteesWitness.nextSyncCommitteeRoot, ...syncCommitteesWitness.witness];
}
export function getFinalizedRootProof(state) {
    const finalizedRootGindex = state.epochCtx.isPostElectra() ? FINALIZED_ROOT_GINDEX_ELECTRA : FINALIZED_ROOT_GINDEX;
    return new Tree(state.node).getSingleProof(BigInt(finalizedRootGindex));
}
export function getBlockBodyExecutionHeaderProof(fork, body) {
    const bodyView = ssz[fork].BeaconBlockBody.toView(body);
    return new Tree(bodyView.node).getSingleProof(BigInt(BLOCK_BODY_EXECUTION_PAYLOAD_GINDEX));
}
//# sourceMappingURL=proofs.js.map