```\nfunction _validatePrepayment(uint256 opIndex, UserOperation calldata userOp, UserOpInfo memory outOpInfo)\nprivate returns (uint256 validationData, uint256 paymasterValidationData) {\n\n    uint256 preGas = gasleft();\n    MemoryUserOp memory mUserOp = outOpInfo.mUserOp;\n    _copyUserOpToMemory(userOp, mUserOp);\n    outOpInfo.userOpHash = getUserOpHash(userOp);\n\n    // validate all numeric values in userOp are well below 128 bit, so they can safely be added\n    // and multiplied without causing overflow\n    uint256 maxGasValues = mUserOp.preVerificationGas | mUserOp.verificationGasLimit | mUserOp.callGasLimit |\n    userOp.maxFeePerGas | userOp.maxPriorityFeePerGas;\n    require(maxGasValues <= type(uint120).max, "AA94 gas values overflow");\n\n    uint256 gasUsedByValidateAccountPrepayment;\n    (uint256 requiredPreFund) = _getRequiredPrefund(mUserOp);\n    (gasUsedByValidateAccountPrepayment, validationData) = _validateAccountPrepayment(opIndex, userOp, outOpInfo, requiredPreFund);\n\n    if (!_validateAndUpdateNonce(mUserOp.sender, mUserOp.nonce)) {\n        revert FailedOp(opIndex, "AA25 invalid account nonce");\n    }\n\n    //a "marker" where account opcode validation is done and paymaster opcode validation is about to start\n    // (used only by off-chain simulateValidation)\n    numberMarker();\n\n    bytes memory context;\n    if (mUserOp.paymaster != address(0)) {\n        (context, paymasterValidationData) = _validatePaymasterPrepayment(opIndex, userOp, outOpInfo, requiredPreFund, gasUsedByValidateAccountPrepayment);\n    }\nunchecked {\n    uint256 gasUsed = preGas - gasleft();\n\n    if (userOp.verificationGasLimit < gasUsed) {\n        revert FailedOp(opIndex, "AA40 over verificationGasLimit");\n    }\n    outOpInfo.prefund = requiredPreFund;\n    outOpInfo.contextOffset = getOffsetOfMemoryBytes(context);\n    outOpInfo.preOpGas = preGas - gasleft() + userOp.preVerificationGas;\n}\n}\n```\n