Skip to content

Commit

Permalink
Use in-range liquidity in UniswapV3DataSource
Browse files Browse the repository at this point in the history
- Fixes issue #1
  • Loading branch information
TylerEther committed Aug 15, 2021
1 parent 8b3b7b3 commit a184713
Showing 1 changed file with 19 additions and 13 deletions.
32 changes: 19 additions & 13 deletions contracts/data/UniswapV3DataSource.sol
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ import "@openzeppelin/contracts/token/ERC20/ERC20.sol";

import "@uniswap/v3-periphery/contracts/libraries/OracleLibrary.sol";
import "@uniswap/v3-periphery/contracts/libraries/PoolAddress.sol";
import "@uniswap/v3-periphery/contracts/libraries/LiquidityAmounts.sol";
import '@uniswap/v3-core/contracts/interfaces/IUniswapV3Pool.sol';

contract UniswapV3DataSource is IDataSource {

Expand Down Expand Up @@ -36,27 +38,31 @@ contract UniswapV3DataSource is IDataSource {

price = OracleLibrary.getQuoteAtTick(timeWeightedAverageTick, uint128(10**(ERC20(token).decimals())), token, baseToken());

tokenLiquidity = ERC20(token).balanceOf(poolAddress);
baseLiquidity = ERC20(baseToken()).balanceOf(poolAddress);
uint128 liquidity = IUniswapV3Pool(poolAddress).liquidity();

success = true;
}
uint160 sqrtRatioAX96 = TickMath.getSqrtRatioAtTick(timeWeightedAverageTick);
uint160 sqrtRatioBX96 = TickMath.getSqrtRatioAtTick(timeWeightedAverageTick + 1);

function fetchPrice(address token) override virtual public view returns(bool success, uint256 price) {
address poolAddress = PoolAddress.computeAddress(uniswapFactory, PoolAddress.getPoolKey(token, baseToken(), uniswapPoolFee));
uint256 amount0 = LiquidityAmounts.getAmount0ForLiquidity(sqrtRatioAX96, sqrtRatioBX96, liquidity);
uint256 amount1 = LiquidityAmounts.getAmount1ForLiquidity(sqrtRatioAX96, sqrtRatioBX96, liquidity);

int24 timeWeightedAverageTick = OracleLibrary.consult(poolAddress, observationPeriod);
if (IUniswapV3Pool(poolAddress).token0() == token) {
tokenLiquidity = amount0;
baseLiquidity = amount1;
} else {
tokenLiquidity = amount1;
baseLiquidity = amount0;
}

price = OracleLibrary.getQuoteAtTick(timeWeightedAverageTick, uint128(10**(ERC20(token).decimals())), token, baseToken());
success = true;
}

function fetchLiquidity(address token) override virtual public view returns(bool success, uint256 tokenLiquidity, uint256 baseLiquidity) {
address poolAddress = PoolAddress.computeAddress(uniswapFactory, PoolAddress.getPoolKey(token, baseToken(), uniswapPoolFee));
function fetchPrice(address token) override virtual public view returns(bool success, uint256 price) {
(success, price,,) = fetchPriceAndLiquidity(token);
}

tokenLiquidity = ERC20(token).balanceOf(poolAddress);
baseLiquidity = ERC20(baseToken()).balanceOf(poolAddress);
success = true;
function fetchLiquidity(address token) override virtual public view returns(bool success, uint256 tokenLiquidity, uint256 baseLiquidity) {
(success,, tokenLiquidity, baseLiquidity) = fetchPriceAndLiquidity(token);
}

}

0 comments on commit a184713

Please sign in to comment.