Skip to content

Commit abb78ee

Browse files
committed
fixed oracle overflow revert
1 parent 2d31c9a commit abb78ee

3 files changed

Lines changed: 43 additions & 8 deletions

File tree

contracts/oracles/UniswapV2Oracle.sol

Lines changed: 41 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import {Initializable} from "@openzeppelin/contracts-upgradeable/proxy/utils/Ini
77

88
import {IUniswapV2Factory} from "@uniswap/v2-core/contracts/interfaces/IUniswapV2Factory.sol";
99
import {IUniswapV2Pair} from "@uniswap/v2-core/contracts/interfaces/IUniswapV2Pair.sol";
10-
import {UniswapV2OracleLibrary} from "@uniswap/v2-periphery/contracts/libraries/UniswapV2OracleLibrary.sol";
1110

1211
import {ArrayHelper} from "../libs/arrays/ArrayHelper.sol";
1312

@@ -23,7 +22,6 @@ import {ArrayHelper} from "../libs/arrays/ArrayHelper.sol";
2322
*/
2423
abstract 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
}

contracts/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@solarity/solidity-lib",
3-
"version": "2.6.0",
3+
"version": "2.6.1",
44
"license": "MIT",
55
"author": "Distributed Lab",
66
"readme": "README.md",

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@solarity/solidity-lib",
3-
"version": "2.6.0",
3+
"version": "2.6.1",
44
"license": "MIT",
55
"author": "Distributed Lab",
66
"description": "Solidity Library by Distributed Lab",

0 commit comments

Comments
 (0)