WooFi oracle can fail to validate its price with Chainlink price feed
The price precision that the WooOracle uses is 8. However, if the quote token is an expensive token or the base token is a very cheap token, then the price will be too less in decimals and even "0" in some cases. This will lead to inefficient trades or inability to compare the woofi price with chainlink price due to chainlink price return with "0" value.\\nFirst, let's see how the chainlink price is calculated:\\n```\\nfunction _cloPriceInQuote(address _fromToken, address _toToken)\\n        internal\\n        view\\n        returns (uint256 refPrice, uint256 refTimestamp)\\n    {\\n        address baseOracle = clOracles[_fromToken].oracle;\\n        if (baseOracle == address(0)) {\\n            return (0, 0);\\n        }\\n        address quoteOracle = clOracles[_toToken].oracle;\\n        uint8 quoteDecimal = clOracles[_toToken].decimal;\\n\\n        (, int256 rawBaseRefPrice, , uint256 baseUpdatedAt, ) = AggregatorV3Interface(baseOracle).latestRoundData();\\n        (, int256 rawQuoteRefPrice, , uint256 quoteUpdatedAt, ) = AggregatorV3Interface(quoteOracle).latestRoundData();\\n        uint256 baseRefPrice = uint256(rawBaseRefPrice);\\n        uint256 quoteRefPrice = uint256(rawQuoteRefPrice);\\n\\n        // NOTE: Assume wooracle token decimal is same as chainlink token decimal.\\n        uint256 ceoff = uint256(10)**quoteDecimal;\\n        refPrice = (baseRefPrice * ceoff) / quoteRefPrice;\\n        refTimestamp = baseUpdatedAt >= quoteUpdatedAt ? quoteUpdatedAt : baseUpdatedAt;\\n    }\\n```\\n\\nNow, let's assume the quote token is WBTC price of 60,000$ and the baseToken is tokenX that has the price of 0.0001$. When the final price is calculated atrefPrice because of the divisions in solidity, the result will be "0" as follows: 60_000 * 1e8 * 1e8 / 0.0001 * 1e8 = 0\\nso the return amount will be "0".\\nWhen the derived chainlink price is compared with woofi oracle if the chainlink price is "0" then the `woPriceInBound` will be set to "true" assuming the chainlink price is not set. However, in our case that's not the case, the price returnt "0" because of divisions:\\n```\\n-> bool woPriceInBound = cloPrice_ == 0 ||\\n            ((cloPrice_ * (1e18 - bound)) / 1e18 <= woPrice_ && woPrice_ <= (cloPrice_ * (1e18 + bound)) / 1e18);\\n\\n        if (woFeasible) {\\n            priceOut = woPrice_;\\n            feasible = woPriceInBound;\\n        }\\n```\\n\\nIn such scenario, the chainlink comparison between woofi and chainlink price will not give correct results. The oracle will not be able to detect whether the chainlink price is in "bound" with the woofi's returnt price.\\nThis also applies if a baseToken price crushes. If the token price gets very less due to market, regardless of the quoteToken being WBTC or USDC the above scenario can happen.
Precision of "8" is not enough on most of the cases. I'd suggest return the oracle price in "18" decimals to get more room on rounding.
Oracle will fail to do a validation of its price with the chainlink price.
```\\nfunction _cloPriceInQuote(address _fromToken, address _toToken)\\n        internal\\n        view\\n        returns (uint256 refPrice, uint256 refTimestamp)\\n    {\\n        address baseOracle = clOracles[_fromToken].oracle;\\n        if (baseOracle == address(0)) {\\n            return (0, 0);\\n        }\\n        address quoteOracle = clOracles[_toToken].oracle;\\n        uint8 quoteDecimal = clOracles[_toToken].decimal;\\n\\n        (, int256 rawBaseRefPrice, , uint256 baseUpdatedAt, ) = AggregatorV3Interface(baseOracle).latestRoundData();\\n        (, int256 rawQuoteRefPrice, , uint256 quoteUpdatedAt, ) = AggregatorV3Interface(quoteOracle).latestRoundData();\\n        uint256 baseRefPrice = uint256(rawBaseRefPrice);\\n        uint256 quoteRefPrice = uint256(rawQuoteRefPrice);\\n\\n        // NOTE: Assume wooracle token decimal is same as chainlink token decimal.\\n        uint256 ceoff = uint256(10)**quoteDecimal;\\n        refPrice = (baseRefPrice * ceoff) / quoteRefPrice;\\n        refTimestamp = baseUpdatedAt >= quoteUpdatedAt ? quoteUpdatedAt : baseUpdatedAt;\\n    }\\n```\\n