```\nfunction simulateValidation(UserOperation calldata userOp) external {\n    UserOpInfo memory outOpInfo;\n\n    _simulationOnlyValidations(userOp);\n    (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(0, userOp, outOpInfo);\n    StakeInfo memory paymasterInfo = _getStakeInfo(outOpInfo.mUserOp.paymaster);\n    StakeInfo memory senderInfo = _getStakeInfo(outOpInfo.mUserOp.sender);\n    StakeInfo memory factoryInfo;\n    {\n        bytes calldata initCode = userOp.initCode;\n        address factory = initCode.length >= 20 ? address(bytes20(initCode[0 : 20])) : address(0);\n        factoryInfo = _getStakeInfo(factory);\n    }\n\n    ValidationData memory data = _intersectTimeRange(validationData, paymasterValidationData);\n    address aggregator = data.aggregator;\n    bool sigFailed = aggregator == address(1);\n    ReturnInfo memory returnInfo = ReturnInfo(outOpInfo.preOpGas, outOpInfo.prefund,\n        sigFailed, data.validAfter, data.validUntil, getMemoryBytesFromOffset(outOpInfo.contextOffset));\n\n    if (aggregator != address(0) && aggregator != address(1)) {\n        AggregatorStakeInfo memory aggregatorInfo = AggregatorStakeInfo(aggregator, _getStakeInfo(aggregator));\n        revert ValidationResultWithAggregation(returnInfo, senderInfo, factoryInfo, paymasterInfo, aggregatorInfo);\n    }\n    revert ValidationResult(returnInfo, senderInfo, factoryInfo, paymasterInfo);\n\n}\n```\n