Files
pacahh/contracts/swapx_pricefeed.sol.bak
2025-09-04 02:48:34 +02:00

59 lines
2.1 KiB
Solidity
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "@uniswap/v3-core/contracts/libraries/FullMath.sol";
/// @notice Minimal interface for a Uniswap V3 pool (to access slot0)
interface IUniswapV3Pool {
function safelyGetStateOfAMM()
external
view
returns (
uint160 sqrtPrice, // The current sqrt(price) as a Q64.96 value
int24 tick,
uint16 lastFee,
uint8 pluginConfig,
uint128 activeLiquidity,
uint24 nextTick,
uint24 previousTick
);
}
/// @title USDC Quote for SWAPx
/// @notice Returns the USDC price (scaled to 18 decimals) of 1 token,
/// assuming a pool where token0 is USDC and token1 is the token of interest.
/// The pool is hardcoded as well as the token addresses.
contract UsdcQuoteV3 {
// Hardcoded addresses
address public constant POOL_ADDRESS = 0x467865E7Ce29E7ED8f362D51Fd7141117B234b44;
// token0 is USDC
address public constant USDC = 0x29219dd400f2Bf60E5a23d13Be72B486D4038894;
// token1 is the token to be priced (assumed to have 18 decimals)
address public constant TOKEN = 0xA04BC7140c26fc9BB1F36B1A604C7A5a88fb0E70;
// Constant representing 2^192 used for fixedpoint math
uint256 public constant Q192 = 2**192;
function getSqrtPrice() public view returns (uint256 price) {
IUniswapV3Pool pool = IUniswapV3Pool(POOL_ADDRESS);
(uint160 sqrtPrice,,,,,,) = pool.safelyGetStateOfAMM();
price = sqrtPrice;
}
/**
* @notice Returns the USDC price (scaled to 18 decimals) for exactly 1 TOKEN.
*
* @return amount18 The USDC amount (scaled to 18 decimals) per 1 TOKEN.
*/
function getLatestPrice(address token) external view returns (uint256 amount18) {
uint256 sqrtPrice = getSqrtPrice();
uint256 numerator1 = uint256(sqrtPrice) * uint256(sqrtPrice);
uint256 directPrice = FullMath.mulDiv(numerator1, 10**6, 1 << 192);
require(directPrice > 0, "Direct price is zero");
amount18 = 1e36 / directPrice;
}
}