Oracle Price miss matched when E-mode uses single oracle
AAVE3 can turn on single oracle use on any E-mode category. When that is done collateral and the borrowed assets will be valued based on a single oracle price. When this is done the prices used in AaveLeverageStrategyExtension can differ from those used internally in AAVE3.\\nThis can lead to an increased risk of liquidation and failures to re-balance properly.\\nThere is currently no accounting for single oracle use in the AaveLeverageStragyExtension, if AAVE3 turns it on the extension will simply continue using its current oracles without accounting for the different prices.\\nWhen re-balancing the following code calculate the netBorrowLimit/netRepayLimit:\\n```\\n        if (_isLever) {\\n            uint256 netBorrowLimit = _actionInfo.collateralValue\\n                .preciseMul(maxLtvRaw.mul(10 ** 14))\\n                .preciseMul(PreciseUnitMath.preciseUnit().sub(execution.unutilizedLeveragePercentage));\\n\\n            return netBorrowLimit\\n                .sub(_actionInfo.borrowValue)\\n                .preciseDiv(_actionInfo.collateralPrice);\\n        } else {\\n            uint256 netRepayLimit = _actionInfo.collateralValue\\n                .preciseMul(liquidationThresholdRaw.mul(10 ** 14))\\n                .preciseMul(PreciseUnitMath.preciseUnit().sub(execution.unutilizedLeveragePercentage));\\n\\n            return _actionInfo.collateralBalance\\n                .preciseMul(netRepayLimit.sub(_actionInfo.borrowValue)) \\n                .preciseDiv(netRepayLimit);\\n        \\n```\\n\\nThe `_actionInfo.collateralValue` and `_adminInfo.borrowValue` are `_getAndValidateLeverageInfo()` where they are both retrieved based on the current set chainlink oracle.\\nWhen E-mode uses a single oracle price a de-pegging of one of the assets will lead to incorrect values of `netBorrowLimit` and `netRepayLimit` depending on which asset is de-pegging.\\n`collateralValue` or `borrowValue` can be either larger or smaller than how they are valued internally in AAVE3.
Aave3LeverageStrategyExtension should take single oracle usage into account. `_calcualteMaxBorrowCollateral` should check if there is a discrepancy and adjust such that the `execute.unutilizedLeveragePercentage` safety parameter is honored.
When Levering\\nIf `collateralValue` is to valued higher than internally in AAVE3 OR If `borrowValue` is to valued lower than internally in AAVE3:\\nThe `netBorrowLimit` is larger than it should be we are essentially going to overriding `execute.unutilizedLeveragePercentage` and attempting to borrow more than we should.\\nIf `collateralValue` is valued lower than internally in AAVE3 OR If `borrowValue` is to valued higher than internally in AAVE3:\\nThe `netBorrowLimit` is smaller than it should be, we are not borrowing as much as we should. Levering up takes longer.\\nWhen Delevering\\nIf `collateralValue` is to valued higher than internally in AAVE3 OR If `borrowValue` is to valued lower than internally in AAVE3:\\nWe will withdraw more collateral and repay more than specified by `execution.unutilizedLeveragePercentage`.\\nIf `collateralValue` is valued lower than internally in AAVE3 OR If `borrowValue` is to valued higher than internally in AAVE3:\\nWe withdraw less and repay less debt than we should. This means that both `ripcord()` and `disengage()` are not functioning as they, they will not delever as fast they should. We can look at it as `execution.unutilizedLeveragePercentage` not being throttled.\\nThe above consequences show that important functionality is not working as expected. "overriding" `execution.unutilizedLeveragePercentage` is a serious safety concern.
```\\n        if (_isLever) {\\n            uint256 netBorrowLimit = _actionInfo.collateralValue\\n                .preciseMul(maxLtvRaw.mul(10 ** 14))\\n                .preciseMul(PreciseUnitMath.preciseUnit().sub(execution.unutilizedLeveragePercentage));\\n\\n            return netBorrowLimit\\n                .sub(_actionInfo.borrowValue)\\n                .preciseDiv(_actionInfo.collateralPrice);\\n        } else {\\n            uint256 netRepayLimit = _actionInfo.collateralValue\\n                .preciseMul(liquidationThresholdRaw.mul(10 ** 14))\\n                .preciseMul(PreciseUnitMath.preciseUnit().sub(execution.unutilizedLeveragePercentage));\\n\\n            return _actionInfo.collateralBalance\\n                .preciseMul(netRepayLimit.sub(_actionInfo.borrowValue)) \\n                .preciseDiv(netRepayLimit);\\n        \\n```\\n