// SPDX-License-Identifier: MIT pragma solidity ^0.8.20; import {CheckpointExtensionBase} from "./CheckpointExtensionBase.sol"; import {CheckpointStorage} from "../storage/CheckpointStorage.sol"; /// @notice Stub for future SNARK verifier — currently checks optional proof hash commitment. contract ZkStateRootVerifierExtension is CheckpointExtensionBase { mapping(bytes32 => bool) public acceptedProofHashes; bool public requireZkProof; event ZkProofRegistered(bytes32 indexed proofHash); function HOOK_BEFORE_SUBMIT() external pure override returns (uint32) { return 1 << 0; } function HOOK_AFTER_SUBMIT() external pure override returns (uint32) { return 0; } function HOOK_ON_CCIP() external pure override returns (uint32) { return 0; } function registerProofHash(bytes32 proofHash) external { acceptedProofHashes[proofHash] = true; emit ZkProofRegistered(proofHash); } function setRequireZkProof(bool required) external { requireZkProof = required; } function beforeSubmit(CheckpointStorage.CheckpointHeader calldata header, bytes calldata data) external view { if (!requireZkProof) return; bytes32 proofHash = abi.decode(data, (bytes32)); require(acceptedProofHashes[proofHash], "zk proof"); require(proofHash != bytes32(0), "zero proof"); require(header.stateRoot != bytes32(0), "state root"); } function afterSubmit(CheckpointStorage.CheckpointHeader calldata, bytes calldata) external pure override {} function onCCIPReceive(bytes calldata) external pure override {} }