// SPDX-License-Identifier: MIT
pragma solidity 0.8.23;

/// @title MockSP1VerifierAlwaysAccepts — TEST-ONLY. NEVER DEPLOY.
/// @notice Stands in for the SP1 gateway so a test can isolate a verifier
///         contract's GATE LOGIC (public-value binding, anchor bind, replay,
///         commitment re-derivation) from the Groth16 check itself.
///
/// @dev    Using this is only legitimate when the real verifier's verdict on the
///         real proof has been established SEPARATELY. In the
///         AereOutboundVerifierV2 fix, that separate leg is a live `eth_call`
///         against the REAL SP1VerifierGateway 0x9ca479C8…70628 showing it accepts
///         the attack proof for the V1-design vkey. This mock then shows what the
///         V1 contract does once that check has passed. It is NOT a claim that the
///         cryptography was verified here.
///
///         The canonical SP1 `verifyProof` returns nothing and reverts on failure,
///         so "accept" is simply "do not revert". That asymmetry is exactly why the
///         constructor of the real contract rejects a code-less verifier: an EOA
///         would "accept" every proof.
contract MockSP1VerifierAlwaysAccepts {
    function verifyProof(bytes32, bytes calldata, bytes calldata) external view {
        // no-op: accepts everything
    }
}

/// @title MockSP1VerifierAlwaysReverts — TEST-ONLY. NEVER DEPLOY.
/// @notice The opposite stand-in: models an invalid/tampered proof.
contract MockSP1VerifierAlwaysReverts {
    error MockProofRejected();

    function verifyProof(bytes32, bytes calldata, bytes calldata) external pure {
        revert MockProofRejected();
    }
}
