360 Secure SkillHub
360 安全技能中心

Uniswap Pool Analysis

该 Skill 说明如何用 viem 读取 Uniswap v3/v4 池的链上状态,涵盖 sqrtPriceX96 与 Tick 的价格换算、费率档位与 Tick 间距对应关系、通过 tickBitmap 累积流动性分布,以及按 chainId 解析 RPC、工厂、Quoter 和子图端点的多链查询方式。

wpank
wpank
热度 78.70
最近更新 2026-05-11 16:09:51
分类:数据依赖:代码执行 / 第三方 API应用场景:数据处理 / 市场分析 / API 集成 / 研究

安装技能

复制下面的话术发给你的 Agent,它会通过 secure-skills 检索并安装该技能。

执行命令安装此 skill: npx secure-skills-cli add uniswap-pool-analysis
Metadata
name
uniswap-pool-analysis
description
Analyze Uniswap pool data including liquidity distribution, fee tiers, tick ranges, and TVL. Use when the user asks about pool metrics, liquidity analysis, or wants to query on-chain pool state.

Uniswap Pool Analysis

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 L value 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:

  1. Query tickBitmap to find initialized ticks
  2. For each initialized tick, read ticks(tickIndex) to get liquidityNet
  3. Walk from MIN_TICK to MAX_TICK, accumulating net liquidity changes
  4. 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)