免费

让 Claude 5 分钟读懂一个 Uniswap V3 池子

Uniswap V3 池子的 liquidity 字段不是钱也不是深度,让 Claude 帮你把每个字段读懂。


每个玩 DeFi 的人都会看 Uniswap V3 池子。但池子页面上那一堆数字里,至少有一个字段几乎所有人第一次都会看错 —— 而且这个错够大,能让你以为一个 1 亿美元的池子有 32 亿亿的"流动性"。

这篇用 smarts MCP 配上 Claude,5 分钟把一个池子从头到尾读一遍。用真实数据,主网 USDC/WETH 0.05% 这个池子。

一句话拉出整池子状态

接好 smarts MCP 之后,Claude 直接调 get_uniswap_v3_pool,slug 写 univ3-usdc-weth-eth,返回这堆东西:

protocol: Uniswap V3
pair: USDC/WETH
fee: 0.05%
price:
  1 WETH in USDC: 2310.3381
  1 USDC in WETH: 0.00043283
tick: 198868
liquidity: 3243712254364037809
liquidity_note: Uniswap V3 sqrt-formula virtual liquidity
                at the current tick. Not a USD amount and
                not the depth available to swap.
tvl_usd: 100,645,897.62
tokens:
  token0: USDC (decimals 6)
  token1: WETH (decimals 18)
block_number: 24959248

数据本身很简单,关键是每个字段都有坑。一个一个拆。

token0、token1 不是按业务习惯排的

很多人以为 USDC/WETH 池子里 USDC 是"主货币",WETH 是"被定价的资产"。错。Uniswap V3 用合约里 token0、token1 的顺序完全是按地址十六进制大小排的。USDC 地址 0xa0b8... 比 WETH 的 0xc02a... 小,所以 token0 = USDC,token1 = WETH。

这个排序决定了所有内部数学:价格的方向、tick 的方向、流动性怎么计。一旦你换了池子,比如 WETH/DAI,token0、token1 的角色可能颠倒过来,所有"是 ETH 在涨还是 ETH 在跌"的判断都得重做。

让 Claude 读这个池子的好处之一:它直接给你两个方向都标好的价格,省掉自己脑算"这个 tick 对应的是谁兑谁"的痛苦。

fee 0.05% 意味着这是个"稳定对"池

Uniswap V3 上常见的 fee 档是 0.01% / 0.05% / 0.30% / 1.00%。

  • 0.01%:稳定币对稳定币(USDC/USDT)
  • 0.05%:高度相关的资产(USDC/WETH 这种深度大、波动可控的对)
  • 0.30%:一般币对
  • 1.00%:长尾、波动大的币对

USDC/WETH 用 0.05% 而不是 0.30%,背后假设是"波动有限+量大",做市商靠走量赚钱不靠手续费厚。

知道这一点,看到一个新池子是 1% fee 你就知道:要么是新币要么是没人关心的对。

price 是当前 tick 直接换算出来的,不是"上一笔成交价"

V3 池子的状态里没有"上一笔成交价"这个独立字段。当前价格直接由 slot0.sqrtPriceX96 决定,tick 是它的对数表达。换句话说:只要没人交易,价格就一直挂在那里,跟 CEX 的"上次成交"完全是两个模型。

(想看历史价格得用 V3 内置的 oracle —— 池子状态里有一组 observation 累加器可以反推 TWAP,那是另外一套机制。)

这次拉到的 1 WETH = 2310.34 USDC,是池子的"当前定价",下一笔交易会从这个价位开始把价格沿曲线推到新的 tick。

tick 是对数价格的离散坐标

tick: 198868 这个数字第一次看会迷。直觉上你觉得它是某种价格,但它本身不是美元。

V3 把价格做了对数离散化:raw_price = 1.0001^tick,这里的 raw_price 是 token1 的 wei 数 / token0 的 wei 数(不是显示价格)。要变成"1 ETH 多少 USDC"还得乘 10^(decimals_token0 - decimals_token1) 校正。198868 这个 tick 校正完正好对应 1 ETH ≈ 2310 USDC。

为什么搞得这么绕?因为对数化之后,做市商可以只在某个价格区间挂流动性,比如"只在 2200~2400 之间做市",离散 tick 就是用来标这个区间的。这是 V3 区别于 V2 的核心创新 —— 集中流动性。

实战里你不需要会算 tick,但你要知道:tick 越大不代表价格越高(取决于谁是 token0),tick 跳一格的价格变化是 0.01%。

liquidity 字段:最容易看错的就是它

最大的坑:liquidity: 3243712254364037809

这个数字 19 位,看起来像 wei 量级。但它不是钱

它是 Uniswap V3 数学里的"虚拟流动性"L —— 一个用来表达 sqrt-price 区间内做市曲线斜率的内部参数。它单位都不是 USD,跟池子真实持有的钱没有可比关系。

工具返回里专门加了 liquidity_note 提醒:

Uniswap V3 sqrt-formula virtual liquidity at the current tick. Not a USD amount and not the depth available to swap.

为什么强调"也不是 swap 深度"?因为另一个常见误解是把 liquidity 当成"我现在能在这个池子里换多少钱不滑点"。也不对。V3 的 swap 深度是分段算的:在当前 tick range 内用现在这个 L 走 sqrt-price 公式;一旦交易量把价格推到 tick 边界,就跨进下一个 range,换上那个 range 自己的 L 接着算。每跨一格边界就换一次 L,直到交易量用完。所以"能换多少钱不滑点"取决于路径上每个 range 各自挂了多少 L —— 单看 slot0 这个数字一无所知。

记住一句话就够了:liquidity 字段的数字别用来跟 USD 比、别用来比池子之间的"深度",那是误导

TVL:池子里真实有多少钱

tvl_usd: 100,645,897.62。这才是池子里真实持有的钱。

这个数字怎么来的?池子合约里实际持有的 USDC 数量 + WETH 数量,分别乘以从 DefiLlama 拿来的当前美元价格,加起来就是 TVL。

跟前面的 liquidity 一对比就清楚了:

字段 数值 含义
liquidity 3.24 × 10¹⁸ V3 数学内部参数,无单位
tvl_usd $100,645,897 池子里真实持有的钱

这俩在文献里都翻译成"流动性",但说的是不同的东西。讲故事看 TVL,做数学看 liquidity,永远不要混。

block_number:你看的是某个区块的快照

最后一个细节:block_number: 24959248

链上数据永远是带区块号的快照。Claude 拉过来的所有这些字段,是同一个区块里同步读出来的。这意味着两件事:

  1. 价格、流动性、TVL 之间是一致的(不会出现"价格是 5 分钟前的,TVL 是现在的"这种漂移)
  2. 你下一秒看可能就变了

写监控、写套利逻辑这是最关键的属性 —— 你拉一次数据得到的是一致的世界视图,不需要担心字段之间的时差。

把这些用起来

知道了上面这些,你能做的事就多了:

  • 检查池子健康:拉 token0、token1 的真实余额(不是 liquidity 字段),看跟 TVL 数学是否对得上。如果余额很大但价格离公允价远,可能有套利空间
  • 跨 fee tier 比价:USDC/WETH 在 0.05% 和 0.30% 两个 fee 档都有池子,价格通常贴得很近,差太多也是套利信号
  • 跨链对比:以太坊主网 USDC/WETH 跟 Base 上的 USDC/WETH 价格能差多少,反映了桥的成本和流动性
  • 挂单监控:追踪 tick 变动,知道"价格越过了某个边界"

这些过去都得装 web3.py、写脚本、维护 ABI、租 RPC。现在 Claude + MCP 全是对话级别的操作,问什么 Claude 就读什么。

不会数学也能看懂池子

V3 的数学模型有点门槛,sqrtPriceX96、tick、L、集中流动性这些概念劝退过不少人。但实战里你 90% 的需求是"读懂这个池子现在什么状态、有没有钱、价格是什么",不需要会推公式。

让 Claude 当你的 V3 翻译器,把那些虚拟流动性、tick 编码翻成"1 ETH = 2310 USDC,池子里有 1 亿美元"这种人话。剩下的判断你自己做。