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

import "../interfaces/ISeason1.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/ERC4626.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";

/// @notice Test-only sAERE stand-in: the exact OpenZeppelin ERC-4626 base that
///         the live sAERE extends. Proves the distributor's
///         deposit(assets, receiver) delivery path without the live vault's
///         dead-share bootstrap. Its deposit() pulls WAERE from the caller
///         (the distributor) and mints shares to the receiver (the claimant).
contract MockSAERE is ERC4626 {
    constructor(IERC20 asset_) ERC20("Mock Staked AERE", "msAERE") ERC4626(asset_) {}
}

/// @notice Test-only settable humanity oracle.
contract MockHumanityOracle is IHumanityOracle {
    mapping(address => bool) public human;
    function set(address a, bool v) external { human[a] = v; }
    function isVerifiedHuman(address account) external view returns (bool) {
        return human[account];
    }
}

/// @notice Test-only settable boolean flag oracle (passkey presence).
contract MockAccountFlag is IAccountFlag {
    mapping(address => bool) public flagged;
    function set(address a, bool v) external { flagged[a] = v; }
    function isFlagged(address account) external view returns (bool) {
        return flagged[account];
    }
}

/// @notice Test-only payable sink that just accepts native AERE.
contract MockSink {
    event Received(address from, uint256 amount);
    receive() external payable { emit Received(msg.sender, msg.value); }
}

/// @notice Test-only claim relayer that reverts on receiving native AERE,
///         used to exercise the distributor's liquid-transfer failure path.
contract RejectingReceiver {
    // no receive/fallback -> any value transfer to it reverts
}
