// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import {CheckpointStorage} from "../storage/CheckpointStorage.sol";
import {CheckpointLeaf} from "../libraries/CheckpointLeaf.sol";

/**
 * @title IChain138MainnetCheckpoint
 * @notice Public API for wallets, indexers, and integrators.
 */
interface IChain138MainnetCheckpoint {
    event CheckpointSubmitted(
        uint64 indexed batchId,
        uint256 indexed checkpointBlock,
        bytes32 indexed paymentsRoot,
        uint16 txCount,
        uint32 flags,
        bytes32 contentURI
    );

    event ExtensionRegistered(bytes32 indexed extensionId, address module, uint32 hooks);
    event ExtensionRevoked(bytes32 indexed extensionId);

    function getLatestCheckpoint() external view returns (CheckpointStorage.CheckpointHeader memory);

    function getCheckpoint(uint64 batchId) external view returns (CheckpointStorage.CheckpointHeader memory);

    function getLatestBatchId() external view returns (uint64);

    function latestCheckpointBlock() external view returns (uint256);

    function getConfig()
        external
        view
        returns (
            uint16 batchSize,
            uint32 maxBatchWaitSeconds,
            uint256 minPaymentValueWei,
            bool requireValidatorSigs,
            bool allowCalldataOnlySubmit,
            bool allowCCIPIngress
        );

    function verifyPaymentInBatch(
        uint64 batchId,
        CheckpointLeaf.PaymentLeafV1 calldata leaf,
        bytes32[] calldata proof
    ) external view returns (bool);

    function isTxIncluded(bytes32 txHash) external view returns (bool included, uint64 batchId);

    function submitCheckpoint(
        CheckpointStorage.CheckpointHeader calldata header,
        bytes calldata validatorSignatures,
        bytes32[] calldata txHashes,
        bytes calldata extensionData
    ) external;

    function submitCheckpointCommitment(
        CheckpointStorage.CheckpointHeader calldata header,
        bytes calldata validatorSignatures,
        bytes32 contentURI,
        bytes calldata extensionData
    ) external;

    function registerExtension(bytes32 extensionId, address module, uint32 hooks) external;

    function setConfig(
        uint16 batchSize,
        uint32 maxBatchWaitSeconds,
        uint256 minPaymentValueWei,
        bool requireValidatorSigs,
        bool allowCalldataOnlySubmit,
        bool allowCCIPIngress
    ) external;
}
