详细分析 ▾
运行时依赖
版本
- Initial release: analyze Uniswap v3/v4 pool data including liquidity, tick ranges, fee tiers, and TVL. - Supports querying on-chain pool state using viem, including `slot0` and `liquidity`. - Includes utilities for price and tick conversion. - Offers liquidity distribution analysis across ticks. - Accepts `chainId` for multi-chain support with configurable endpoints.
安装命令
点击复制技能文档
Overview
This skill covers querying and analyzing Uniswap v3/v4 pool state on-chain using viem.
Key Concepts
- sqrtPriceX96: Encoded price format used by Uniswap v3/v4. Convert with
price = (sqrtPriceX96 / 2^96)^2 - Ticks: Discrete price points defining liquidity ranges. Tick spacing depends on fee tier.
- Liquidity: The
Lvalue representing active liquidity at the current tick.
Fee Tiers (v3)
| Fee (bps) | Tick Spacing | Typical Use |
|---|---|---|
| 1 (0.01%) | 1 | Stablecoin pairs |
| 5 (0.05%) | 10 | Correlated pairs |
| 30 (0.30%) | 60 | Standard pairs |
| 100 (1.00%) | 200 | Exotic pairs |
Querying Pool State
Use the Uniswap v3 Pool ABI to read on-chain state:
import { createPublicClient, http } from "viem"; import { mainnet } from "viem/chains";const client = createPublicClient({ chain: mainnet, transport: http(process.env.ETHEREUM_RPC_URL), });
// Read slot0 for current price and tick const [ sqrtPriceX96, tick, observationIndex, observationCardinality, observationCardinalityNext, feeProtocol, unlocked, ] = await client.readContract({ address: poolAddress, abi: poolAbi, functionName: "slot0", });
// Read liquidity const liquidity = await client.readContract({ address: poolAddress, abi: poolAbi, functionName: "liquidity", });
Price Conversion
function sqrtPriceX96ToPrice( sqrtPriceX96: bigint, decimals0: number, decimals1: number, ): number { const price = Number(sqrtPriceX96) / 2 * 96; return (price price 10 decimals0) / 10 decimals1; }
function tickToPrice( tick: number, decimals0: number, decimals1: number, ): number { return (1.0001 tick 10 decimals0) / 10 decimals1; }
Liquidity Distribution
To analyze liquidity distribution across ticks:
- Query
tickBitmapto find initialized ticks - For each initialized tick, read
ticks(tickIndex)to getliquidityNet - Walk from
MIN_TICKtoMAX_TICK, accumulating net liquidity changes - Plot cumulative liquidity vs price for the distribution
Multi-chain Support
Always accept a chainId parameter. Use the shared chain config from packages/common/ to resolve:
- RPC URL
- Pool factory address
- Quoter address
- Subgraph endpoint (if available)