@@ -7,7 +7,6 @@ import {Initializable} from "@openzeppelin/contracts-upgradeable/proxy/utils/Ini
77
88import {IUniswapV2Factory} from "@uniswap/v2-core/contracts/interfaces/IUniswapV2Factory.sol " ;
99import {IUniswapV2Pair} from "@uniswap/v2-core/contracts/interfaces/IUniswapV2Pair.sol " ;
10- import {UniswapV2OracleLibrary} from "@uniswap/v2-periphery/contracts/libraries/UniswapV2OracleLibrary.sol " ;
1110
1211import {ArrayHelper} from "../libs/arrays/ArrayHelper.sol " ;
1312
@@ -23,7 +22,6 @@ import {ArrayHelper} from "../libs/arrays/ArrayHelper.sol";
2322 */
2423abstract contract UniswapV2Oracle is Initializable {
2524 using EnumerableSet for EnumerableSet.AddressSet;
26- using UniswapV2OracleLibrary for address ;
2725 using ArrayHelper for uint256 [];
2826 using Math for uint256 ;
2927
@@ -70,8 +68,11 @@ abstract contract UniswapV2Oracle is Initializable {
7068 PairInfo storage pairInfo = _pairInfos[pair_];
7169 uint256 [] storage pairTimestamps = pairInfo.blockTimestamps;
7270
73- (uint256 price0Cumulative_ , uint256 price1Cumulative_ , uint256 blockTimestamp_ ) = pair_
74- .currentCumulativePrices ();
71+ (
72+ uint256 price0Cumulative_ ,
73+ uint256 price1Cumulative_ ,
74+ uint256 blockTimestamp_
75+ ) = _currentCumulativePrices (pair_);
7576
7677 if (
7778 pairTimestamps.length == 0 ||
@@ -252,8 +253,11 @@ abstract contract UniswapV2Oracle is Initializable {
252253 uint256 price0_;
253254 uint256 price1_;
254255
255- (uint256 price0Cumulative_ , uint256 price1Cumulative_ , uint256 blockTimestamp_ ) = pair_
256- .currentCumulativePrices ();
256+ (
257+ uint256 price0Cumulative_ ,
258+ uint256 price1Cumulative_ ,
259+ uint256 blockTimestamp_
260+ ) = _currentCumulativePrices (pair_);
257261
258262 price0_ =
259263 (price0Cumulative_ - price0CumulativeOld_) /
@@ -274,4 +278,35 @@ abstract contract UniswapV2Oracle is Initializable {
274278
275279 return (pair_ != address (0 ), pair_);
276280 }
281+
282+ /**
283+ * @notice The private function to get the current cumulative prices of a pair. Adopted for Solidity 0.8.0
284+ */
285+ function _currentCumulativePrices (
286+ address pair_
287+ )
288+ private
289+ view
290+ returns (uint256 price0Cumulative_ , uint256 price1Cumulative_ , uint32 blockTimestamp_ )
291+ {
292+ unchecked {
293+ blockTimestamp_ = uint32 (block .timestamp );
294+ price0Cumulative_ = IUniswapV2Pair (pair_).price0CumulativeLast ();
295+ price1Cumulative_ = IUniswapV2Pair (pair_).price1CumulativeLast ();
296+
297+ (uint112 reserve0_ , uint112 reserve1_ , uint32 timestampLast_ ) = IUniswapV2Pair (pair_)
298+ .getReserves ();
299+
300+ if (timestampLast_ != blockTimestamp_) {
301+ uint32 timeElapsed_ = blockTimestamp_ - timestampLast_;
302+
303+ price0Cumulative_ +=
304+ uint256 ((uint224 (reserve1_) << 112 ) / reserve0_) *
305+ timeElapsed_;
306+ price1Cumulative_ +=
307+ uint256 ((uint224 (reserve0_) << 112 ) / reserve1_) *
308+ timeElapsed_;
309+ }
310+ }
311+ }
277312}
0 commit comments