← 返回 TONY'S LAB SYS:LAB/VOLATILEPAIR-2026.10
Uniswap v4 · Dynamic-fee Hook

为交易的两侧定价

VolatilePair Hook 把 ETH/USDC 的手续费拆成买、卖两份,跟着行情走。 这篇文章只讲一件事:这个天平怎么动,动多少,谁付钱。

发布于 2026-10-15 · 数据核对自 Uniswap 官方博客、开源技术规范与以太坊主网链上状态

天平:拖一下价格,看费用怎么分

价格变动 0 bp
买 ETH →
4.00 bp含临时费
← 卖 ETH
4.00 bp含临时费
−20 bp(价格跌) 0 +20 bp(价格涨)
−5bp 闸门
+5bp 闸门
永久费合计8.00 bp
临时费0.00 bp
临时费压在哪侧—
本块实际报价合计8.00 bp
价格没动:买卖两边各 4 bp,合计 8 bp。这就是池子在安静时挂出的价差。
01 / 起因

静态费用漏在哪

一个收 5 bp 固定手续费的 ETH/USDC 池,不管你买还是卖,都收这 5 bp。

ETH 在别的交易所突然涨了,池子这边的报价还没来得及跟上。谁手快,谁就按旧价把池里的 ETH 买走,转手在新的市场价上卖掉,差价落进自己口袋——这笔钱原本是 LP 的。

官方原话是:"Whoever gets there first buys cheap and keeps the difference." 池子的价格越落后,被搬走的越多。

02 / 机制

一笔手续费,是三块拼出来的

VolatilePair Hook 在每次兑换前重算费用。最终这一笔要付多少,由三块相加:

永久费

PERMANENT

买卖两侧的永久费永远加起来等于报价价差(ETH/USDC 是 8 bp)。 价格往上走,买侧涨、卖侧跌,等量平移,总量不变。这个倾斜会留到后面的区块。

step = min(skewRate × 价格变动, maxSkewStep) 买侧 = min(原值 + step, maxSkew) 卖侧 = 报价价差 − 买侧

临时费

TEMPORARY · 只作用一个区块

价格刚发生超过闸门(5 bp)的变动后,逆着这波变动做交易的那一侧要多付一笔。 它由两块组成:restore 把刚才掉下去的永久费原样加回来, capture 直接抽走这波变动的一半。

restore = 100% × 永久费涨幅 (变动 ≥ 5bp 才启动) capture = 50% × 价格变动 (变动 ≥ 5bp 才启动) 临时费 = restore + capture → 压在逆势一侧

块内加价

MID BLOCK · 同一个区块内

一个区块里第一笔之后的交易,还要按"相对本区块开盘价的位移"再加一层: 逆势方加 50% 位移,顺势方加 最多 2 bp。 顺手也削薄了三明治攻击的后腿利润。

逆势:fee = 起始费 + 50% × 块内位移 顺势:fee = 起始费 + min(4 × 块内位移, 2bp)
一个容易混的点:永久费是"跨区块"的倾斜(价格涨了 → 之后买一直贵), 临时费只活一个区块(专治刚发生的那波大波动)。两者互不相干。
03 / 参数

ETH/USDC 主网实际配置

下面这些不是举例,是部署脚本里写死、链上读得到的值。

参数值作用
restingSpread800(8 bp)安静时买卖两侧的报价价差
skewRate1.0×跨块价格动 1 bp → 倾斜 1 bp
maxSkewStep300(3 bp)单个区块最多倾斜多少
maxSkew800(8 bp)单边永久费的上限
backrunCaptureFraction50%抽走逆势方多少利润
restoreFraction100%掉下去的永久费,原样加回
门槛(两个)500(5 bp)低于此值不收临时费
midFadeRate / maxMidFade4× / 2 bp顺势交易的块内加价
tickSpacing4价格刻度粒度
04 / 演练

三个场景,从头算一遍

场景买 ETH卖 ETH说明
安静 4 bp4 bp 价格没动,合计 8 bp
价格涨 3 bp 7 bp1 bp 倾斜打满 3 bp;没到 5 bp 闸门,不触发临时费——买贵了、卖便宜了,合计仍是 8 bp
价格涨 20 bp 7 bp14 bp 倾斜仍封顶 3 bp;但过了闸门 → restore 3 bp + capture 10 bp = 13 bp 临时费压在卖侧
同区块内又涨 1% 9 bp64 bp 块内加价:顺势买封顶 +2 bp;逆势卖要加 50% 位移(50 bp),几乎劝退
注意那个反直觉的地方:价格涨了以后,卖 ETH 反而更贵。 因为永久费虽然给卖侧打了折,临时费又把它加回来了还有余—— 这正是"不让想抄回来的人立刻捡便宜"的设计意图。

另外,闸门是个硬开关:变动 4 bp 时卖侧只要 1 bp,到 5 bp 会直接跳到 6.5 bp。 不是渐变,是台阶。
05 / 链上

此刻的池子

交易对
原生 ETH / USDC(以太坊主网)
Pool ID
0x98316e8405502774a5d0a0761276b5d26505a8195c1905169864008d5e7a3eea
Hook
0x000022Ec4eBD6b12294396E852E4C3876b253Cc0
tickSpacing
4
撰写时(区块 26,195,254)读到的状态:买侧永久费 0 bp、卖侧 8 bp,倾斜已打满在卖侧, 本区块临时费为 0,池子报价约 $2,361(部署时约 $2,499)。 倾斜打满在卖侧,说明近期价格是往下走的。
两点边界:① 主网目前只有 ETH/USDC 这一个 VolatilePair 池; ② Hook 是 UUPS 可升级合约,由 Uniswap 治理控制,但因为 v4 的权限写死在地址里, 升级不能扩大权限、不能阻止 LP 提现、不能篡改兑换金额。
06 / 对照

官方那两句话,翻成人话

When the pool's price rises, buying ETH costs more and selling it costs less.
→ 这是永久费在倾斜。涨价后买侧 7 bp、卖侧 1 bp(合计仍是 8 bp)。跨区块有效。
After a big price move, trades that push the price back pay a temporary fee.
→ 这是临时费(restore + capture),只活一个区块,压在逆势一侧。涨 20 bp 时卖侧从 1 bp 变成 14 bp。
取消费用可以先看:这个机制是给 LP 的
→ 官方给的三条设计目标:给知情流加价(降低 LVR)、把 backrun 利润分一部分给 LP、减少三明治。收来的费用归 LP,不是协议抽成。
07 / 来源

都查了哪些一手材料