UniV3OracleImpl ​
This contract is used to get the exchange rate from from a Uniswap V3 Pool, including logic to check against TWAP max deltas.
Uses 5 secondsAgos[] values and 3 TWAP maxDeltas: e.g. [240, 60, 15, 1, 0] -> [price240to60, price60to15, price 15to1, currentPrice] delta checks: price240to60 vs currentPrice, price60to15 vs currentPrice and 15to1 vs currentPrice.
_POOL ​
contract IUniswapV3Pool _POOL
Uniswap V3 Pool to check for the exchange rate
_UNIV3_INVERT_RATE ​
bool _UNIV3_INVERT_RATE
Flag to invert the price or not (to e.g. for WETH/USDC pool return prive of USDC per 1 WETH)
_UNI_TWAP1_MAX_DELTA_PERCENT ​
uint256 _UNI_TWAP1_MAX_DELTA_PERCENT
Uniswap oracle delta for TWAP1 in 1e2 percent. If uniswap price TWAP1 is out of this delta, current price fetching reverts. E.g. for delta of TWAP 240 -> 60 vs current price
_UNI_TWAP2_MAX_DELTA_PERCENT ​
uint256 _UNI_TWAP2_MAX_DELTA_PERCENT
Uniswap oracle delta for TWAP2 in 1e2 percent. If uniswap price TWAP2 is out of this delta, current price fetching reverts. E.g. for delta of TWAP 60 -> 15 vs current price
_UNI_TWAP3_MAX_DELTA_PERCENT ​
uint256 _UNI_TWAP3_MAX_DELTA_PERCENT
Uniswap oracle delta for TWAP3 in 1e2 percent. If uniswap price TWAP3 is out of this delta, current price fetching reverts. E.g. for delta of TWAP 15 -> 1 vs current price
_UNI_SECONDS_AGO_1 ​
uint256 _UNI_SECONDS_AGO_1
Uniswap oracle seconds ago for twap, 1. value, e.g. 240
_UNI_SECONDS_AGO_2 ​
uint256 _UNI_SECONDS_AGO_2
Uniswap oracle seconds ago for twap, 2. value, e.g. 60
_UNI_SECONDS_AGO_3 ​
uint256 _UNI_SECONDS_AGO_3
Uniswap oracle seconds ago for twap, 3. value, e.g. 15
_UNI_SECONDS_AGO_4 ​
uint256 _UNI_SECONDS_AGO_4
Uniswap oracle seconds ago for twap, 4. value, e.g. 1
_UNI_SECONDS_AGO_5 ​
uint256 _UNI_SECONDS_AGO_5
Uniswap oracle seconds ago for twap, 5. value, e.g. 0
_UNI_TWAP1_INTERVAL ​
int256 _UNI_TWAP1_INTERVAL
Uniswap TWAP1 interval duration.
_UNI_TWAP2_INTERVAL ​
int256 _UNI_TWAP2_INTERVAL
Uniswap TWAP2 interval duration.
_UNI_TWAP3_INTERVAL ​
int256 _UNI_TWAP3_INTERVAL
Uniswap TWAP3 interval duration.
_UNI_TWAP4_INTERVAL ​
int256 _UNI_TWAP4_INTERVAL
Uniswap TWAP4 interval duration.
_SECONDS_AGOS_LENGTH ​
uint256 _SECONDS_AGOS_LENGTH
stored array lengths to optimize gas
_TWAP_DELTAS_LENGTH ​
uint256 _TWAP_DELTAS_LENGTH
_UNIV3_PRICE_SCALER_MULTIPLIER ​
uint256 _UNIV3_PRICE_SCALER_MULTIPLIER
constant value for price scaling to reduce gas usage
_UNIV3_INVERT_PRICE_DIVIDEND ​
uint256 _UNIV3_INVERT_PRICE_DIVIDEND
constant value for inverting price to reduce gas usage
UniV3ConstructorParams ​
struct UniV3ConstructorParams {
contract IUniswapV3Pool pool;
bool invertRate;
uint256[3] tWAPMaxDeltaPercents;
uint32[5] secondsAgos;
}
constructor ​
constructor(struct UniV3OracleImpl.UniV3ConstructorParams params_) internal
constructor sets the Uniswap V3 pool_
to check for the exchange rate and the invertRate_
flag. E.g. invertRate_
should be true if for the WETH/USDC pool it's expected that the oracle returns USDC per 1 WETH
_getUniV3ExchangeRateUnsafe ​
function _getUniV3ExchangeRateUnsafe() internal view returns (uint256 exchangeRateUnsafe_)
Get the last exchange rate from the pool's last observed value without any checks
Return Values ​
Name | Type | Description |
---|---|---|
exchangeRateUnsafe_ | uint256 | The exchange rate between the underlying asset and the peg asset in OracleUtils.RATE_OUTPUT_DECIMALS |
_getUniV3ExchangeRate ​
function _getUniV3ExchangeRate() internal view returns (uint256 exchangeRate_)
Get the last exchange rate from the pool's last observed value, checked against TWAP deviations.
Return Values ​
Name | Type | Description |
---|---|---|
exchangeRate_ | uint256 | The exchange rate between the underlying asset and the peg asset in OracleUtils.RATE_OUTPUT_DECIMALS If 0 then the fetching the price failed or a delta was invalid. |
_isInvalidTWAPDelta ​
function _isInvalidTWAPDelta(int256 exchangeRateTick_, int256 tickCumulativesDelta_, int256 interval_, int256 maxDelta_) internal pure returns (bool)
_verifies that exchangeRate_
is withinmaxDelta*
for derived price fromtickCumulativesDelta*
andinterval*
. returns true if delta is invalid*
uniV3OracleData ​
function uniV3OracleData() public view returns (contract IUniswapV3Pool uniV3Pool_, bool uniV3InvertRate_, uint32[] uniV3secondsAgos_, uint256[] uniV3TwapDeltas_, uint256 uniV3exchangeRateUnsafe_, uint256 uniV3exchangeRate_)
returns all UniV3 oracle related data as utility for easy off-chain use / block explorer in a single view method