ChainlinkFactory will pay non-requested versions keeper fees
Protocol definition: `Requested versions will pay out a keeper fee, non-requested versions will not.` But ChainlinkFactory ignores `numRequested`, which pays for both.\\nProtocol definition: `Requested versions will pay out a keeper fee, non-requested versions will not.`\\n```\\n    /// @notice Commits the price to specified version\\n    /// @dev Accepts both requested and non-requested versions.\\n    ///      Requested versions will pay out a keeper fee, non-requested versions will not.\\n    ///      Accepts any publish time in the underlying price message, as long as it is within the validity window,\\n    ///      which means its possible for publish times to be slightly out of order with respect to versions.\\n    ///      Batched updates are supported by passing in a list of price feed ids along with a valid batch update data.\\n    /// @param ids The list of price feed ids to commit\\n    /// @param version The oracle version to commit\\n    /// @param data The update data to commit\\n    function commit(bytes32[] memory ids, uint256 version, bytes calldata data) external payable {\\n```\\n\\ncommit()->_handleKeeperFee()->_applicableValue() `ChainlinkFactory._applicableValue ()` implements the following:\\n```\\n    function _applicableValue(uint256, bytes memory data) internal view override returns (uint256) {\\n        bytes[] memory payloads = abi.decode(data, (bytes[]));\\n        uint256 totalFeeAmount = 0;\\n        for (uint256 i = 0; i < payloads.length; i++) {\\n            (, bytes memory report) = abi.decode(payloads[i], (bytes32[3], bytes));\\n            (Asset memory fee, ,) = feeManager.getFeeAndReward(address(this), report, feeTokenAddress);\\n            totalFeeAmount += fee.amount;\\n        }\\n        return totalFeeAmount;\\n    }\\n```\\n\\nThe above method ignores the first parameter `numRequested`. This way, whether it is `Requested versions` or not, you will pay `keeper fees`. Violating `non-requested versions will not pay`
It is recommended that only `Requested versions` keeper fees'\\n```\\n// Remove the line below\\n   function _applicableValue(uint256 , bytes memory data) internal view override returns (uint256) {\\n// Add the line below\\n   function _applicableValue(uint256 numRequested, bytes memory data) internal view override returns (uint256) {\\n        bytes[] memory payloads = abi.decode(data, (bytes[]));\\n        uint256 totalFeeAmount = 0;\\n        for (uint256 i = 0; i < payloads.length; i// Add the line below\\n// Add the line below\\n) {\\n            (, bytes memory report) = abi.decode(payloads[i], (bytes32[3], bytes));\\n            (Asset memory fee, ,) = feeManager.getFeeAndReward(address(this), report, feeTokenAddress);\\n            totalFeeAmount // Add the line below\\n= fee.amount;\\n        }\\n// Remove the line below\\n       return totalFeeAmount;\\n// Add the line below\\n       return totalFeeAmount * numRequested / payloads.length ;\\n    }\\n```\\n
If `non-requested versions` will pay as well, it is easy to maliciously submit `non-requested` maliciously consume `ChainlinkFactory` fees balance (Note that needs at least one numRequested to call `_handleKeeperFee()` )
```\\n    /// @notice Commits the price to specified version\\n    /// @dev Accepts both requested and non-requested versions.\\n    ///      Requested versions will pay out a keeper fee, non-requested versions will not.\\n    ///      Accepts any publish time in the underlying price message, as long as it is within the validity window,\\n    ///      which means its possible for publish times to be slightly out of order with respect to versions.\\n    ///      Batched updates are supported by passing in a list of price feed ids along with a valid batch update data.\\n    /// @param ids The list of price feed ids to commit\\n    /// @param version The oracle version to commit\\n    /// @param data The update data to commit\\n    function commit(bytes32[] memory ids, uint256 version, bytes calldata data) external payable {\\n```\\n