From c9f56c34c5637253668d445dccead2d63fb06da2 Mon Sep 17 00:00:00 2001 From: Rooh Afza <96720500+r0ohafza@users.noreply.github.com> Date: Tue, 18 Oct 2022 12:40:50 -0700 Subject: [PATCH] fix: scale reserves to 18 decimals (#41) * fix: scale reserves to 18 decimals * fix: scale reserves to 18 decimals * remove unused import --- src/uniswap/UniV2LPOracle.sol | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/src/uniswap/UniV2LPOracle.sol b/src/uniswap/UniV2LPOracle.sol index 431a4e1..5f58eca 100644 --- a/src/uniswap/UniV2LPOracle.sol +++ b/src/uniswap/UniV2LPOracle.sol @@ -5,6 +5,7 @@ import {IERC20} from "../utils/IERC20.sol"; import {IOracle} from "../core/IOracle.sol"; import {IUniswapV2Pair} from "./IUniswapV2Pair.sol"; import {FixedPointMathLib} from "solmate/utils/FixedPointMathLib.sol"; + /** @title Uniswap v2 LP Oracle @notice Price oracle for uniswap v2 LP Tokens @@ -41,23 +42,25 @@ contract UniV2LpOracle is IOracle { address token0 = IUniswapV2Pair(pair).token0(); address token1 = IUniswapV2Pair(pair).token1(); - uint decimalSum = IERC20(token0).decimals() + IERC20(token1).decimals(); + (uint r0, uint r1,) = IUniswapV2Pair(pair).getReserves(); + + uint decimals0 = IERC20(token0).decimals(); + uint decimals1 = IERC20(token1).decimals(); - uint scale; - if (decimalSum > 18) scale = decimalSum - 18; + if (decimals0 <= 18) + r0 = r0 * 10 ** (18 - decimals0); + else r0 = r0 / 10 ** (decimals0 - 18); - (uint r0, uint r1,) = IUniswapV2Pair(pair).getReserves(); + if (decimals1 <= 18) + r1 = r1 * 10 ** (18 - decimals1); + else r1 = r1 / 10 ** (decimals1 - 18); // 2 * sqrt(r0 * r1 * p0 * p1) / totalSupply return FixedPointMathLib.sqrt( r0 - .mulDivDown(r1, 10 ** scale) - .mulDivDown( - oracle.getPrice(token0), - (scale == 0 ? 10 ** decimalSum : 1e18) - ) + .mulWadDown(r1) + .mulWadDown(oracle.getPrice(token0)) .mulWadDown(oracle.getPrice(token1)) - ) - .mulDivDown(2e27, IUniswapV2Pair(pair).totalSupply()); + ).mulDivDown(2e27, IUniswapV2Pair(pair).totalSupply()); } } \ No newline at end of file