MEDIUM severity: The vulnerability in the `payExecutionFee()` function of the `GasUtils` contract allows malicious ke. The vulnerability in the `payExecutionFee()` function of the `GasUtils` contract allows malicious keepers to drain out all execution fees paid by users, regardless of the actual execution cost. This is due to the failure to consider EIP-150, which reserves 1/64 of the gas for the caller contract.\n\...

Vulnerable code:
```\nfunction payExecutionFee(\n    DataStore dataStore,\n    EventEmitter eventEmitter,\n    StrictBank bank,\n    uint256 executionFee,\n    uint256 startingGas,\n    address keeper,\n    address user\n) external {\n    uint256 gasUsed = startingGas * 64 / 63;\n    uint256 executionFeeForKeeper = adjustGasUsage(dataStore, gasUsed) * tx.gasprice;\n\n    if (executionFeeForKeeper > executionFee) {\n        executionFeeForKeeper = executionFee;\n    }\n\n    bank.transferOutNativeToken(\n        keeper,\n        executionFeeForKeeper\n    );\n\n    emitKeeperExecutionFee(eventEmitter, keeper, executionFeeForKeeper);\n\n    uint256 refundFeeAmount = executionFee - executionFeeForKeeper;\n    if (refundFeeAmount == 0) {\n        return;\n    }\n\n    bank.transferOutNativeToken(\n        user,\n        refundFeeAmount\n    );\n\n    emitExecutionFeeRefund(eventEmitter, user, refundFeeAmount);\n}\n```\n```\nFile: contracts/exchange/DepositHandler.sol\n\nfunction executeDeposit(\n    bytes32 key,\n    OracleUtils.SetPricesParams calldata oracleParams\n) external\n    globalNonReentrant\n    onlyOrderKeeper\n    withOraclePrices(oracle, dataStore, eventEmitter, oracleParams)\n{\n    uint256 startingGas = gasleft();\n\n    try this._executeDeposit(\n        key,\n        oracleParams,\n        msg.sender\n    ) {\n    } catch (bytes memory reasonBytes) {\n        // rest of code\n    }\n}\n\nfunction _executeDeposit(\n    bytes32 key,\n    OracleUtils.SetPricesParams memory oracleParams,\n    address keeper\n) external onlySelf {\n    uint256 startingGas = gasleft();\n    // rest of code\n\n    ExecuteDepositUtils.executeDeposit(params);\n}\n\nFile: contracts/deposit/ExecuteDepositUtils.sol\n\nfunction executeDeposit(ExecuteDepositParams memory params) external {\n    // rest of code\n\n    GasUtils.payExecutionFee(\n        params.dataStore,\n        params.eventEmitter,\n        params.depositVault,\n        deposit.executionFee(),\n        params.startingGas,\n        params.keeper,\n        deposit.account()\n    );\n}\n\nFile: contracts/gas/GasUtils.sol\n\nfunction payExecutionFee(\n    DataStore dataStore,\n    EventEmitter eventEmitter,\n    StrictBank bank,\n    uint256 executionFee,\n    uint256 startingGas,\n    address keeper,\n    address user\n) external {\n    uint256 gasUsed = startingGas - gasleft();\n    uint256 executionFeeForKeeper = adjustGasUsage(dataStore, gasUsed) * tx.gasprice;\n\n    if (executionFeeForKeeper > executionFee) {\n        executionFeeForKeeper = executionFee;\n    }\n\n    bank.transferOutNativeToken(\n        keeper,\n        executionFeeForKeeper\n    );\n\n    emitKeeperExecutionFee(eventEmitter, keeper, executionFeeForKeeper);\n\n    uint256 refundFeeAmount = executionFee - executionFeeForKeeper;\n    if (refundFeeAmount == 0) {\n        return;\n    }\n\n    bank.transferOutNativeToken(\n        user,\n        refundFeeAmount\n    );\n\n    emitExecutionFeeRefund(eventEmitter, user, refundFeeAmount);\n}\n\nfunction adjustGasUsage(DataStore dataStore, uint256 gasUsed) internal view returns (uint256) {\n    // rest of code\n    uint256 baseGasLimit = dataStore.getUint(Keys.EXECUTION_GAS_FEE_BASE_AMOUNT);\n    // rest of code\n    uint256 multiplierFactor = data\n```\n```\nEXECUTION_GAS_FEE_BASE_AMOUNT = 0\nEXECUTION_GAS_FEE_MULTIPLIER_FACTOR = 1\n\nexecution_fee_user_has_paid = 200000  # Gwei\ntx.gasprice = 1  # Gwei\nactual_used_gas = 100000  # K Gwei\n```\n```\nstartingGas = 164000\n```\n```\nuint256 gasUsed = startingGas - gasleft();\ngasUsed = 164K - (164K - 100K) * 63 / 64;\ngasUsed = 101K\n```\n```\nexecutionFeeForKeeper = 101K * tx.gasprice\nexecutionFeeForKeeper = 101K * 1 Gwei\nexecutionFeeForKeeper = 101K Gwei\n\nrefundFeeForUser = 200K - 101K\nrefundFeeForUser = 99K Gwei\n```\n```\nuint256 gasUsed = startingGas - gasleft();\ngasUsed = 6500K - (6500K - 100K) * 63 / 64;\ngasUsed = 200K\n```\n```\nexecutionFeeForKeeper = 200000 * tx.gasprice\nexecutionFeeForKeeper = 200000 * 1\nexecutionFeeForKeeper = 200000 Gwei\n\nrefundFeeForUser = 200000 - 200000\nrefundFeeForUser = 0\nrefundFeeForUser = 0 Gwei\n```