feat(libraries): add oracle helper for twap consumers

This commit is contained in:
dualfroz committed 2026-08-25 17:12:00 +02:00
1 parent e1f3128e5b
commit 2214801143
1 file changed
+45
+45
View File
@@ -0,0 +1,45 @@
// SPDX-License-Identifier: MIT
pragma solidity 0.8.36;
import {IFluxClPool} from "../interfaces/IFluxClPool.sol";
import {TickMath} from "./TickMath.sol";
import {FullMath} from "./FullMath.sol";
/// @title Time weighted average tick and price quotes derived from pool observations.
library OracleLibrary {
function consult(address pool, uint32 secondsAgo) internal view returns (int24 arithmeticMeanTick) {
require(secondsAgo != 0, "OracleLibrary: PERIOD");
uint32[] memory secondsAgos = new uint32[](2);
secondsAgos[0] = secondsAgo;
secondsAgos[1] = 0;
(int56[] memory tickCumulatives,) = IFluxClPool(pool).observe(secondsAgos);
int56 tickCumulativesDelta = tickCumulatives[1] - tickCumulatives[0];
arithmeticMeanTick = int24(tickCumulativesDelta / int56(uint56(secondsAgo)));
if (tickCumulativesDelta < 0 && (tickCumulativesDelta % int56(uint56(secondsAgo)) != 0)) {
arithmeticMeanTick--;
}
}
function getQuoteAtTick(int24 tick, uint128 baseAmount, address baseToken, address quoteToken)
internal
pure
returns (uint256 quoteAmount)
{
uint160 sqrtRatioX96 = TickMath.getSqrtRatioAtTick(tick);
if (sqrtRatioX96 <= type(uint128).max) {
uint256 ratioX192 = uint256(sqrtRatioX96) * sqrtRatioX96;
quoteAmount = baseToken < quoteToken
? FullMath.mulDiv(ratioX192, baseAmount, 1 << 192)
: FullMath.mulDiv(1 << 192, baseAmount, ratioX192);
} else {
uint256 ratioX128 = FullMath.mulDiv(sqrtRatioX96, sqrtRatioX96, 1 << 64);
quoteAmount = baseToken < quoteToken
? FullMath.mulDiv(ratioX128, baseAmount, 1 << 128)
: FullMath.mulDiv(1 << 128, baseAmount, ratioX128);
}
}
}