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

interface IM00MainnetBridgeFacet {
    struct BridgeConfig {
        address chain138BatchEmitter;
        address chain138Mirror;
        address mainnetCheckpoint;
        address mainnetMirror;
        address mainnetTether;
        address rwaTokenFactory;
        address rwaTokenRegistry;
    }

    event MainnetBridgeWired(BridgeConfig config);
    event BatchCommittedOnHub(uint64 indexed batchId, bytes32 paymentsRoot, uint256 checkpointBlock);
    event OutboundMirrorScheduled(bytes32 indexed txHash, uint256 blockNumber);
    event InboundCheckpointAck(uint64 indexed batchId, bytes32 paymentsRoot);

    function wireMainnetBridge(BridgeConfig calldata cfg) external;
    function getMainnetBridgeConfig() external view returns (BridgeConfig memory);
    function commitBatchOn138(
        uint64 batchId,
        bytes32 paymentsRoot,
        uint256 checkpointBlock,
        uint256 startBlock,
        uint16 txCount,
        bytes32[] calldata txHashes
    ) external;
    function sendBatchToMainnet(uint64 batchId, bytes calldata encodedCheckpointPayload, uint256 linkFee)
        external
        returns (bytes32 ccipMessageId);
    function scheduleMirrorToMainnet(
        bytes32 txHash,
        address from,
        address to,
        uint256 value,
        uint256 blockNumber,
        uint256 blockTimestamp,
        uint256 gasUsed,
        bool success,
        bytes calldata data
    ) external;
    function ackInboundCheckpoint(uint64 batchId, bytes32 paymentsRoot) external;
}
