本文详细介绍了Uniswap V2中协议费的收集机制,包括费用计算的数学公式、代码实现以及影响因素。文章还指出了在流动性提供者调用mint
或burn
时收集费用的效率问题,并通过示例和代码片段深入解释了_mintFee
函数的工作方式。
Uniswap V2 旨在将 1/6 的交换手续费收归协议。由于交换手续费为 0.3%,因此 1/6 的手续费为 0.05%。所以每笔交易的 0.05% 将会归协议所有。
尽管这个功能实际上并没有被激活,但我们还是讨论这个功能,毕竟一些分叉可能会使用它。此外,这个计算很容易出错,现在花时间理解它将有助于你在类似计算中捕捉错误。
你需要熟悉 Uniswap V2 Book 中的所有前面的章节,才能跟上后面的内容。
在每笔交易中收取 0.05% 的手续费效率低下,因为这需要额外的代币转移。转移 ERC20 代币需要更新存储,因此将代币转移到两个地址而不是一个会产生更高的成本。
因此,当流动性提供者调用 burn 或 mint 时收取手续费。由于这些操作相对于 [交换代币](swapping tokens) 来说是不频繁的,这将节省 gas 费用。为了收取 mintFee
,合约计算自上次发生以来收集的手续费,并铸造足够的 LP 代币到受益地址,使受益人有权获得 1/6 的手续费。
为避免术语混淆,我们将“费用”称为在交换过程中从交易者那里收取的 0.3%,而“mintFee”则是 0.3% 费用的 1/6。是的,这两者都使用费用这个词并不是很好,但这就是我们必须处理的内容。
流动性是池中代币余额乘积的平方根。这个公式的理由在 Uniswap V2 交换函数文章中有所讨论。一些文献将其称为 $\sqrt{k}$,其中 $k = xy$,$x$ 和 $y$ 是池中的代币余额($x$ 和 $y$ 的储备)。我们用 $\ell$ 来表示流动性,因为它写起来比 $\sqrt{k}$ 短。
为了使这个有效,Uniswap V2 依赖以下两个不变性:
mint()
和 burn()
,池的流动性只能增加。mint()
或 burn()
交易以来流动性增加的情况,池知道收集了多少手续费。这些将是写好的 不变性测试,但目前我们将理所当然地认为它们是真实的。
假设在 $t_1$ 时池中有 10 个 token0
和 10 个 token1
。
经过大量交易和手续费收集后,$t_2$ 时新的池余额为 40 个 token0
和 40 个 token1
。
流动性被测量为两个代币的乘积的平方根,即 $\ell = \sqrt{k}$。在 $t_1$ 时流动性为 10,在 $t_2$ 时流动性为 40...
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!