時間:2023-08-10|瀏覽:302
但uniswap里沒有掛單這個設計,取而代之的是流動性資金池充當所有交易的對手盤。
流動性資金池是包含了需要交易的兩種幣,比如ETH和USDT。比如一個流動性池里有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)。
以上就是uniswap交易的基本模式。
下面來講這個流動性資金池的設計。
創世流動性之后再添加dx和dy,如果按系統默認值去添加,都會受dx/dy=x/y的約束。
添加流動性后,uniswap會給用戶返回一個erc20代幣,這就是lptoken。
lptoken的總量是變化的,添加流動性就會鑄造新的lptoken,即增發,而贖回流動性則會銷毀lptoken。
假設創世流動性里用戶注入了x個ETH和y個usdt,則創世鑄造lptoken的數量=sqrt(x*y)。(注:sqrt是開方;注:代碼里的公式是sqrt(x*y)-1000*10^-18,這個1000*10^-18是個啥不管它,我沒研究,反正這么小無所謂)
創世流動性之后,有用戶添加了(dx,dy)個幣的流動性,并且dx/dy=x/y,則系統新鑄造出d(lptoken數量)=dx/x*鑄造前lptoken的總量,返回給用戶。
但如果(dx-ddx)/dy=x/y(注:ddx>0),新鑄造的d(lptoken數量)=dy/y*鑄前總量,而這ddx個幣則相當于捐贈給了所有的lptoken持有者。
如果dx/(dy-ddy)=x/y(注:ddy>0),則新鑄造的d(lptoken數量)=dx/x*鑄前總量。ddy變成了捐贈。
可以總結為:添加流動性獲得的lptoken數量=min(dx/x*鑄前總額,dy/y*鑄前總額)。(注:min是取最小值函數)
在極端情況下,有人誤打了dx>0個幣,但dy=0個幣,則不會鑄造新的lptoken,dx全部變成了現有lptoken里的成分,捐贈給了所有現有lptoken的用戶。
這種誤打幣到某個lptoken合約地址,是經常會發生的。
假設現在一個交易對(eth/usdt)的流動性有x個eth,y個usdt,現在有用戶銷毀z個token,則用戶可以得到eth和usdt的數量分別是:dx=(z/總lptoken)*x,dy=(z/總lptoken)*y
lptoken的成分包括了兩種幣,如eth/usdt交易對的lptoken就包括了eth和usdt兩種幣。
隨著流動性資金池里成分不一樣,lptoken的價值也不一樣。
用戶在uniswap交易,是需要付0.3%的手續費。比如用戶用dy個usdt去eth/usdt交易對買dx個eth。
uniswap首先會扣除用戶0.3%*dy的本金,然后去計算該給用戶的dx,在給完用戶dx后,這0.3%*dy的本金會注入到lptoken的成分里,相當于lptoken增值了。
lptoken會獲得所有的捐贈收益,比如用戶誤將dx個ETH轉入了eth/usdt這個pair的lptoken合約地址,dx個eth就會變成捐贈給lptoken,增加了lptoken的價值。
感謝Plancker?Dao成員李世勝對本文的貢獻