写点什么

LP 流动性挖矿代币分红模式 dapp 系统开发原理

  • 2023-03-24
    广东
  • 本文字数:2367 字

    阅读完需:约 8 分钟

什么是 Uniswap?

uniswap 是一个进行自动化做市商的项目,该项目的特点是公平,去中心,抗审查,安全。并且 uniswap 并不会存在特殊群体,参与项目的每个人都是平等的不论你是 LP 还是 Trader。V1 的特点:

  • 支持,系统开发 I34-案例 I633-演示 53I9,不同的 ERC20token 进行交换

  • 可以加入流动矿池成为 LP 并获取奖励费用

  • 利用公式进行自动定价,每次交易过后都会进行计算定价

  • 支持私人定制的交换

每个 LP 按照一定比例输入 ERC20-ERC20 的数量之后,会获得一定数量 LPtoken,用来表示贡献度,可以根据贡献度来领取池中的奖励(奖励的来源为每次交易收取的费用)。如果想退出的话,可以将 LPtoken 进行销毁,销毁后会按照 LPtoken 的比例将两种资金进行返回。

同时可以设置限价单和限时单。

Uniswap 如何进行计算

无交易费推导

在整个计算过程中 uniswap 使用的是 x-y-k 的模型,即为无论怎样进行交易,保持交易后 x * y = k,两种代币的乘积不变。根据这个思想,进行推导

设要用Δx 数量的 x 代币交换Δy 代币,则有

(x + Δx) * (y - Δy) = k = x * y设 α = Δx / x, β = Δy / y,将其代入上式可得∴ (x + α * x) * (y - β * y) = x * y∴ (1 + α) * (1 - β) = 1∴ α = β / (1 - β), β = α / (1 + α)∴ Δy = α / (1 + α) * y = Δx / (x + Δx) * y  Δx = β / (1 - β) * x = Δy / (y - Δy) * x复制代码
复制代码

带手续费交易

在实际情况中,每一次交易都会收取一定的手续费用来交易 LP,通常手续费为交易量的 0.3%,这就表明你输入的Δx 并不是全用于计算,实际的计算值为Δx * 0.97%,剩下的作为手续费放入交易池中奖励 LP,下面是实际的推导过程:设要用Δx 数量的 x 代币交换Δy 代币,则有

设手续费的比例为ρ, 1 - ρ为γ(x + Δx * γ) * (y - Δy) = k = x * y设 α = Δx / x, β = Δy / y,将其代入上式可得∴ (x + α * x * γ) * (y - β * y) = x * y∴ (1 + α * γ) * (1 - β) = 1∴ α = β / ((1 - β) * γ), β = (α * γ) / (1 + α * γ)∴ Δy = (α * γ / (1 + α * γ)) * y = ((Δx * γ) / (x + Δx * γ)) * y  Δx = β / (1 - β) * x = Δy / (y - Δy) * (1 / γ) * x//我们假设ρ = 0.3%,所以γ = 997 / 1000∴ 上述结果可以表示为:  Δy = (997 * Δx * y) / (1000 * x + 997 * Δx)  Δx = (1000 * Δy * x) / ((y - Δy) * 997))复制代码
复制代码

通过上面推导可以看出当ρ为 0 时就成为了无手续费模式,并且可以发现一个问题,代入手续费之后整个池子的 k 只会略微变大,这是因为会有部分的费用作为手续费进入池子并不会进入交易当中。也可以理解为,你输入的Δx = 手续费 + 实际的交易的数量

在实际的交易中,会出现以下两种情况:

  • 给出交易的 x 代币数量,计算出 y 代币的数量

    在这种情况下,输入的 x 代币会有一部分作为手续费放入池中,其余部分才会被用来做交换。计算时可参考上面手续费交易的结果。

  • 给出想要的 y 代币数量,计算出所需要的 x 代币数量

    给出想要获取的 y 代币,计算所需的 x 代币数量,同时 x 代币中包含了手续费和实际交换数量。计算时可参考上面手续费交易的结果。

流动性计算

用户不仅可以进行代币的交换,同时还可以成为 LP(Liquidity provider),获取 LPtoken 用来获取池子中的利息。流动性计算的推导如下

设l = x * y表示两种代币的数量,则有//提供流动性推导设α = Δx / x,则有∴ Δy = Δx / x * y + 1  Δl = Δx / x * y∴ x' = x + Δx  y' = y + Δx * t / x + 1 //这是考虑到solidity语法在计算时的小数会进行向下取整  l' = l + Δx * l / x
//取消流动性设β = Δl / l∴ Δx = Δl * x / l  Δy = Δl * y / l∴ x' = x - Δx  y' = y - Δy  l' = l - Δl复制代码
复制代码

由于存在向下取整的计算方式,我们将提供和取消两种结合起来看之后会发现,在取消之后剩余的 x,y 的数量大于提供流动性之前,这是为了保证避免投资者通过这种方式进行获利。如果不使用向下取整的计算方式的话,其实提供和取消之后 x,y 的数量不会发生变化。同时在提供流动性之后,LP 会获取 LPtoken,LPtoken 数量等于两种代币之积(代币数量更新之后)再开根号。

滑点问题

由于 Uniswap 是在区块链上的操作,所以可能会导致你看到的价格和实际的价格会有所不同,这是由于交易的确认需要时间,并且交易的顺序不清楚。这样就会导致产生交易滑点,通常为 0.5%的滑点保护。而对于滑点的计算我们通常使用(实际成交价格 - 交易时输入的价格) / 交易时输入的价格。当计算出的值满足设定的比例时,即可完成交易。

手续费问题

由于在每笔交易时都会收取一定的手续费,这些手续费会按照 LP 的持有的 token 的比例进行分发。这是为了激励用户成为 LP 并且投入更多的资金,创造更多的流动性。从理论上来说当每一一笔交易发生的时候要将手续费分发给 LP,在进行分发的时候可能会使用一个大循环进行分配。但是在实际中这样对用户消耗的 gas 是很多的,所以这样的方法是不可行的。所以在代码中将手续费的分配放在 LP 提供流动性和移除流动性的部分,并且维持手续费公平分配的与那里很简单。每次用户进行交易的时候交易的手续费会将每单位的 LPtoken 的代币的价值提高,而 LP 在提供流动性的时候会按照当前每单位的 LPtoken 的代币的价值进行买入 LPtoken(变相地理解),举例说明:用户 A 提供流动性的时候获取了 100LPtoken,池子中有 1000tokenA,1000tokenB,这时候 1LPtoken 的价值分别是 10tokenA 和 10tokenB,在经过多次买卖后池子里面有 1100tokenA 和 1500tokenB,这时候 1LPtoken 对应 11tokenA 和 15tokenB,多出来的这部分即为手续费收益。当用户 B 想要增加流动性的时候,会按照 1LPtoken 对应 11tokenA 和 15tokenB 的比例进行生成 LPtoken,然后按照上面所说的再进行手续费的收益。

作者:用户 6134328607836

链接:https://juejin.cn/post/7213983057900961848

来源:稀土掘金

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

用户头像

还未添加个人签名 2022-05-23 加入

区块链项目开发,咨询weixin:hkkf5566

评论

发布
暂无评论
LP流动性挖矿代币分红模式dapp系统开发原理_开发微hkkf5566_InfoQ写作社区