13.Uniswap V3 单价格区间内 Swap 机制
目录
Uniswap V3:单价格区间内 Swap 机制与数学实现
核心摘要 (Key Takeaways)
- 两步核心算法:在 Uniswap V3 的单个价格区间内执行 swap 的核心逻辑分为两步:首先,根据输入的代币数量和当前流动性,计算出交易完成后的新价格;然后,利用新旧两个价格点和流动性,计算出可以兑换出的输出代币数量。
- 基石数学关系:所有计算都基于 流动性 (L)、代币 X 数量、代币 Y 数量 和 价格 (P) 之间的恒定关系。具体来说, 和 是推导所有
swap公式的基石。 - 价格方向决定公式形态:无论是用 Y 买 X(价格上升)还是用 X 卖 Y(价格下降),其底层的数学原理是统一的。公式的具体形态(谁减谁)取决于价格的高低( vs ),最终可以抽象为统一的表达式。
1. 基础回顾:价格、Tick 与流动性
在深入 swap 逻辑之前,我们首先要回顾 Uniswap V3 的基本概念。协议通过 Tick 来离散化价格,并将 Tick 转换为实际计算中使用的 (square root price)。在一个给定的价格点 P,流动性 L 与两种代币(X 和 Y)的数量关系如下:
- 代币 X 的数量:
- 代币 Y 的数量:
2. 单价格区间内 Swap 的数学推导
当一次 swap 发生在两个价格点 (起始价格) 和 (结束价格) 之间时,我们可以计算出这期间代币数量的变化量 和 。
- 起始状态 ():
- 结束状态 ():
因此,代币数量的变化量为(此处假设价格上升,即 ):
- (代币 X 的变化量):
- (代币 Y 的变化量):
关键点:这个推导逻辑与计算整个价格区间(从 到 )的代币总量逻辑完全一致,只是价格的起点和终点不同。
3. 场景一:使用 USDC 购买 ETH (已知 \Delta Y)
这是 swap 的一个典型场景:我们知道要支付多少代币 Y (USDC),需要计算能收到多少代币 X (ETH)。
计算逻辑
-
第一步:计算新价格
- 我们已知:输入的 (USDC 数量)、当前的流动性
L、以及当前价格 。 - 目标:求解交易后的新价格 。
- 通过变换 的公式,我们可以得到:
- 我们已知:输入的 (USDC 数量)、当前的流动性
-
第二步:计算可获得的
- 现在我们已知:
L、 和刚刚计算出的 。 - 目标:求解可以兑换出的 (ETH 数量)。
- 将已知值代入 的公式即可:
- 现在我们已知:
案例:使用 42 USDC 购买 ETH
-
**初始条件:
- 交易对:ETH/USDC
- 当前价格
- 流动性提供范围: 到
- 提供的流动性:1 ETH 和 5000 USDC
- 输入 USDC
-
计算过程与结果:
- 计算新价格:执行
swap后,由于是购买 ETH,价格会上升。计算出的新价格 。 - 计算ETH数量:将 和 代入 公式,最终得到可购买到 0.00839 个 ETH。
- 计算新价格:执行
4. 场景二:卖出 ETH 换取 USDC (已知 \Delta X)
这是 swap 的反向场景:我们知道要卖出多少代币 X (ETH),需要计算能得到多少代币 Y (USDC)。
计算逻辑
-
第一步:计算新价格
- 我们已知:输入的 (ETH 数量)、当前的流动性
L、以及当前价格 。 - 目标:求解交易后的新价格 (卖出ETH,价格会下降,所以 )。
- 通过变换 的公式,我们可以推导出 的计算公式:
- 我们已知:输入的 (ETH 数量)、当前的流动性
-
第二步:计算可获得的
- 现在我们已知:
L、 和刚刚计算出的 。 - 目标:求解可以兑换出的 (USDC 数量)。
- 将已知值代入 的公式(注意价格高低顺序):
- 现在我们已知:
案例:卖出 0.01337 ETH
-
初始条件: (同上)
- 当前价格
- 流动性
L(已知) - 输入 ETH
-
计算过程与结果:
- 计算新价格:执行
swap后,由于是卖出 ETH,价格会下降(砸盘)。计算出的新价格 。 - 计算USDC数量:将 和 代入 公式,最终得到可获得 66.80 个 USDC。
- 计算新价格:执行
5. 统一公式
统一公式
无论价格是上升还是下降,swap 的数学本质是相通的。我们可以将公式抽象成一个统一的形式,用 (较高的价格) 和 (较低的价格) 来表示:
- (总是正数):
- (总是正数):
这个统一的视角揭示了 Uniswap V3 swap 的核心:在一段价格区间内的移动,本质上是在消耗一边的虚拟资产,同时补充另一边的虚拟资产,而这一切都由恒定的流动性 L 锚定。