interface IOptimismPortal {
    function disputeGameFactory() external view returns (IDisputeGameFactory);
    function respectedGameType() external view returns (GameType);
    // we don't care if the root was blacklisted, this only applies to withdrawals
    //function disputeGameBlacklist(IDisputeGame game) external view returns (bool);
}
..snip
function getStorageValues(
    bytes memory context,
    GatewayRequest memory req,
    bytes memory proof
) external view returns (bytes[] memory, uint8 exitCode) {
    uint256 gameIndex1 = abi.decode(context, (uint256));
    GatewayProof memory p = abi.decode(proof, (GatewayProof));
    (, , IDisputeGame gameProxy, uint256 blockNumber) = _gameFinder.gameAtIndex(
        _portal,
        _minAgeSec,
        _gameTypeBitMask,
        p.gameIndex
    );
    require(blockNumber != 0, "OPFault: invalid game");
    // @audit No blacklist check here
    // ...
    return GatewayVM.evalRequest(req, ProofSequence(0, p.outputRootProof.stateRoot, p.proofs, p.order, _hooks));
}
/// @notice A mapping of dispute game addresses to whether or not they are blacklisted.
mapping(IDisputeGame => bool) public disputeGameBlacklist;
/// @notice Blacklists a dispute game. Should only be used in the event that a dispute game resolves incorrectly.
/// @param _disputeGame Dispute game to blacklist.
function blacklistDisputeGame(IDisputeGame _disputeGame) external {
    if (msg.sender != guardian()) revert Unauthorized();
    disputeGameBlacklist[_disputeGame] = true;
    emit DisputeGameBlacklisted(_disputeGame);
}
