import { blockToHeader } from "@lodestar/state-transition";
import { GENESIS_SLOT } from "../../../../constants/index.js";
import { rootHexRegex } from "../../../../execution/engine/utils.js";
import { ApiError, ValidationError } from "../../errors.js";
export function toBeaconHeaderResponse(config, block, canonical = false) {
    return {
        root: config.getForkTypes(block.message.slot).BeaconBlock.hashTreeRoot(block.message),
        canonical,
        header: {
            message: blockToHeader(config, block.message),
            signature: block.signature,
        },
    };
}
export function resolveBlockId(forkChoice, blockId) {
    blockId = String(blockId).toLowerCase();
    if (blockId === "head") {
        return forkChoice.getHead().blockRoot;
    }
    if (blockId === "genesis") {
        return GENESIS_SLOT;
    }
    if (blockId === "finalized") {
        return forkChoice.getFinalizedBlock().blockRoot;
    }
    if (blockId === "justified") {
        return forkChoice.getJustifiedBlock().blockRoot;
    }
    if (blockId.startsWith("0x")) {
        if (!rootHexRegex.test(blockId)) {
            throw new ValidationError(`Invalid block id '${blockId}'`, "blockId");
        }
        return blockId;
    }
    // block id must be slot
    const blockSlot = parseInt(blockId, 10);
    if (Number.isNaN(blockSlot) && Number.isNaN(blockSlot - 0)) {
        throw new ValidationError(`Invalid block id '${blockId}'`, "blockId");
    }
    return blockSlot;
}
export async function getBlockResponse(chain, blockId) {
    const rootOrSlot = resolveBlockId(chain.forkChoice, blockId);
    const res = typeof rootOrSlot === "string"
        ? await chain.getBlockByRoot(rootOrSlot)
        : await chain.getCanonicalBlockAtSlot(rootOrSlot);
    if (!res) {
        throw new ApiError(404, `Block not found for id '${blockId}'`);
    }
    return res;
}
//# sourceMappingURL=utils.js.map