# [2023-03-y2k] Missing check of oracle's return value ###### tags: `sherlock`, `2023-03-y2k`, `medium` ## Summary Missing check the parameter `updatedAt` return from chainlink oracle ## Vulnerability Detail The `lastRoundData()`'s parameters according to [Chainlink](https://docs.chain.link/docs/data-feeds/price-feeds/api-reference/) are the following: ```solidity= function latestRoundData() external view returns ( uint80 roundId, // The round ID. int256 answer, // The price. uint256 startedAt, // Timestamp of when the round started. uint256 updatedAt, // Timestamp of when the round was updated. uint80 answeredInRound // The round ID of the round in which the answer was computed. ) ``` Function `ControllerPeggedAssetV2.getLatestPrice()` has 2 checks with 3 parameters `price`, `answerInRound`, `roundId` but forget to check the `updatedAt` return value which lead to the stale data from chainlink. ```solidity= function getLatestPrice(address _token) public view returns (int256) { /// ... (uint80 roundID, int256 price, , , uint80 answeredInRound) = priceFeed .latestRoundData(); uint256 decimals = priceFeed.decimals(); if (decimals < 18) { decimals = 10**(18 - (decimals)); price = price * int256(decimals); } else if (decimals == 18) { price = price; } else { decimals = 10**((decimals - 18)); price = price / int256(decimals); } if (price <= 0) revert OraclePriceZero(); if (answeredInRound < roundID) revert RoundIDOutdated(); return price; } ``` We can see the consequence about the missing check `updatedAt` in the Chainlink documentation: * [under historical price data: "A timestamp with zero value means the round is not complete and should not be used."](https://docs.chain.link/data-feeds/historical-data) ## Impact Stale return price value lead to incorrect de-peg events trigger. ## Code Snippet https://github.com/sherlock-audit/2022-12-lyra-WelToHackerLand/blob/a94da006a91aee064e4d8ccde45ae7e16275656b/contracts/GMXAdapter.sol#L192 ## Tool used Manual Review ## Recommendation Modify the function to have a check like this: ```solidity= (uint80 roundID, int256 feedPrice, , uint256 timestamp, uint80 answeredInRound) = feed.latestRoundData(); require(feedPrice > 0, "Chainlink price <= 0"); require(answeredInRound >= roundID, "Stale price"); require(timestamp != 0, "Round not complete"); ```