uniswap的LPtoken的铸造、销毁和权益
本文介绍uniswap中的lptoken的铸造,销毁和权益。
uni swap 的交易对手盘模式
在中心化交易所,用户间挂买单和卖单,交易所的撮合引擎会按时间和价格进行排序,一旦买单和卖单价格重叠,就可以成交完成交换。
但un iswap 里没有挂单这个设计,取而代之的是流动性资金池充当所有交易的对手盘。
流动性资金池是包含了需要交易的两种币,比如ETH和U SDT 。比如一个流动性池里有x个ETH和y个usdt。此时k=x*y(k是一个常数)
当用户A想用dy个usdt买ETH,在不考虑滑点的前提下,用户A买入的价格是y/x。而真实成交时,用户能买到的ETH数量dx为(不考虑0.3%的手续费):k=(x-dx)*(y+dy),dx=x-k/(y+dy)
交易所,流动性池里的资金就成了:(x-dx)个ETH和(y+dy)个Usdt,而此时ETH的价格变成了(y+dy)/(x-dx)。
以上就是un iswap 交易的基本模式。
下面来讲这个流动性资金池的设计。
lptoken铸造
在 uniswap 里对某个交易对(pa ir) 第一次添加流动性的人,可以任意对交易对的价格进行定价,即x、y和k都是这个人定的。
创世流动性之后再添加d x 和 dy ,如果按系统默认值去添加,都会受 dx/dy=x/y 的约束。
添加流动性后,uniswap会给用户返回一个erc20代币,这就是lptoken。
lp token 的总量是变化的,添加流动性就会铸造新的 lptoken ,即增发,而赎回流动性则会销毁 lptoken 。
假设创世流动性里用户注入了x个 ETH 和 y 个 usdt ,则创世铸造lp token 的数量 =sqrt(x*y) 。(注:sqrt是开方;注:代码里的公式是s qrt(x*y)-1000*10^-18 ,这个 1000*10^-18 是个啥不管它,我没研究,反正这么小无所谓)
创世流动性之后,有用户添加了 (dx,dy) 个币的流动性,并且 dx/dy=x/y ,则系统新铸造出 d(lptoken 数量 )=dx/x* 铸造前 lptoken 的总量,返回给用户。
但如果 (dx-ddx)/dy=x/y (注:dd x>0 ),新铸造的d (lptoken 数量) =dy/y* 铸前总量,而这ddx个币则相当于捐赠给了所有的lptoken持有者。
如果 dx/(dy-ddy)=x/y( 注:dd y>0) ,则新铸造的 d(lptoken 数量 )=dx/x* 铸前总量。ddy变成了捐赠。
可以总结为:添加流动性获得的lp token 数量 =min(dx/x* 铸前总额,d y/y* 铸前总额 )。(注:min是取最小值函数)
在极端情况下,有人误打了dx >0 个币,但 dy=0 个币,则不会铸造新的lp token ,d x 全部变成了现有 lptoken 里的成分,捐赠给了所有现有lp token 的用户。
这种误打币到某个 lptoken 合约地址,是经常会发生的。
lp token 销毁
当用户想赎回流动性时,需要将lptoken销毁掉。按uniswap系统的流程就可以完成销毁。
假设现在一个交易对(e th/usdt )的流动性有x个 eth ,y个 usdt ,现在有用户销毁z个 token ,则用户可以得到e th 和 usdt 的数量分别是 :d x=(z/总lptoken)*x,dy=(z/总lptoken)*y
lp token 的权益
从上面分析可以清晰地知道,lptoken代表了一个交易对的资金池的所有权,可以从这个资金池里按比例提取交易对代币的份额。
lptoken 的成分包括了两种币,如 eth/usdt 交易对的 lptoken 就包括了 eth 和 usdt 两种币。
随着流动性资金池里成分不一样, lptoken 的价值也不一样。
用户在 uniswap 交易,是需要付 0.3% 的手续费。比如用户用 dy 个 usdt 去 eth/usdt 交易对买 dx 个 eth 。
un iswap 首先会扣除用户 0.3%*dy 的本金,然后去计算该给用户的d x ,在给完用户 dx 后,这 0.3%*dy 的本金会注入到 lptoken 的成分里,相当于 lptoken 增值了。
lp token 会获得所有的捐赠收益,比如用户误将d x 个ETH转入了 eth/usdt 这个 pair 的 lptoken 合约地址,dx个eth就会变成捐赠给 lptoken ,增加了 lptoken 的价值。
感谢Plancker Dao成员李世胜对本文的贡献