簡介
Curve協議,一種基于以太坊平臺的去中心化交易所,主要聚焦于穩定幣、封裝資產等的交易。相對于其他DEX,Curve提供的交易對更集中,擁有極低的滑點和手續費,可以滿足巨額的資產交易需求。極低的滑點和手續費以及crv的生態,都使得Curve在眾多DeFi協議中能占據重要的一席之地。
StableSwap
StableSwap是Curve在白皮書中設計提出的一種穩定幣交易模型,該模型能提供極低的交易滑點和無限的流動性。
做市函數
StableSwap模型的恒定函數做市商曲線如下:
該設計理念基于融合恒定和與恒定積兩種做市模型,兼具了恒定和的低滑點以及恒定積的無限流動性的特點
推導
假設現共有n個穩定幣,則有:
給恒定和部分添上杠桿系數,并加上恒定積部分,則有:
其中系數X引入了偏度的概念,由放大系數和偏度構成,其中偏度用來衡量流動池中各代幣的平衡程度
結合以上兩式化簡即可得出公式(1)
特點
StableSwap模型的曲線兼具恒定和與恒定積的特點,在各穩定幣相對平衡的情況下,公式由恒定和占主導,曲線趨于直線,滑點較低;當在極端情況下,各穩定幣不平衡,則公式由恒定積占主導,曲線與坐標軸無交點,不會出現流動性枯竭的情況
Basepool
basepool為Curve推出的基礎兌換池,最常見的有3pool,由三種穩定幣DAI、USDC、USDT組成
basepool合約實現了基本的StableSwap交易模型
參數計算
StableSwap模型的做市曲線公式(1)中,有兩個重要的參數A與D,其中參數A為放大系數,由官方調整設置每個池子的放大系數;而參數D則為池中代幣總量,是動態變化的。在basepool合約中,參數D的計算由_get_D函數實現:
@pure
@internal
def_get_D(_xp:uint256,_amp:uint256)->uint256:
"""
Dinvariantcalculationinnon-overflowingintegeroperations
iteratively
A*sum(x_i)*n**nD=A*D*n**nD**(n1)/(n**n*prod(x_i))
比特幣單日交易費用超337萬美元,創2021年5月21日以來新高:5月4日消息,CryptoFees數據顯示,比特幣單日交易費用超337萬美元,創2021年5月21日以來新高。相比于4月23日的約37萬美元,10日飆增超9倍。[2023/5/4 14:41:36]
Convergingsolution:
D=(A*n**n*sum(x_i)-D**(n1)/(n**nprod(x_i)))/(A*n**n-1)
"""
S:uint256=0
Dprev:uint256=0
for_xin_xp:
S=_x
ifS==0:
return0
D:uint256=S
Ann:uint256=_amp*N_COINS
for_iinrange(255):
D_P:uint256=D
for_xin_xp:
D_P=D_P*D/(_x*N_COINS)#Ifdivisionby0,thiswillbeborked:onlywithdrawalwillwork.Andthatisgood
Dprev=D
D=(Ann*S/A_PRECISIOND_P*N_COINS)*D/((Ann-A_PRECISION)*D/A_PRECISION(N_COINS1)*D_P)
#Equalitywiththeprecisionof1
ifD>Dprev:
ifD-Dprev<=1:
returnD
else:
ifDprev-D<=1:
returnD
#convergencetypicallyoccursin4roundsorless,thisshouldbeunreachable!
#ifitdoeshappenthepoolisborkedandLPscanwithdrawvia`remove_liquidity`
raise
_get_D函數的算法將做市函數公式(1)以D為變量,通過牛頓迭代法計算出合適的D值,算法可謂精妙簡潔
同樣的算法還用于_get_y函數計算y值
@view
礦企Bitfarms去年共產出5167枚BTC,平均挖礦成本1萬美元:金色財經報道,比特幣礦企Bitfarms發布去年四季度和2022年全年業績報告。
數據顯示,Bitfarms去年四季度產出1434枚BTC,全年共計5167枚,自該公司成立以來到今年2月累計蟾蜍超過20,000個BTC;2022年每個BTC的平均直接生產成本為10,000美元;2022年第四季度凈虧損為1700萬美元,調整后EBITDA為正100萬美元;預計到2023年底,算力增加30%到6EH/s。(globenewswire)[2023/3/21 13:17:25]
@internal
def_get_y(i:int128,j:int128,x:uint256,_xp:uint256)->uint256:
"""
Calculatexifonemakesx=x
Donebysolvingquadraticequationiteratively.
x_1**2x_1*(sum'-(A*n**n-1)*D/(A*n**n))=D**(n1)/(n**(2*n)*prod'*A)
x_1**2b*x_1=c
x_1=(x_1**2c)/(2*x_1b)
"""
#xintheinputisconvertedtothesameprice/precision
asserti!=j#dev:samecoin
assertj>=0#dev:jbelowzero
assertj<N_COINS#dev:jaboveN_COINS
#shouldbeunreachable,butgoodforsafety
asserti>=0
asserti<N_COINS
A:uint256=self._A()
D:uint256=self._get_D(_xp,A)
Ann:uint256=A*N_COINS
c:uint256=D
S:uint256=0
_x:uint256=0
y_prev:uint256=0
for_iinrange(N_COINS):
if_i==i:
_x=x
FTX.US保險公司Relm:在FTX倒閉后資本充足,可以滿足行業需求:金色財經報道,擁有FTX.US客戶的保險公司 Relm的首席執行官Joseph Ziolkowski 表示,FTX US的保險公司Relm在FTX Trading倒閉后資本充足,可以滿足行業需求。在我們資產負債表的資產方面,我們大約95%的資產是現金或美國國庫券。
Ziolkowski表示,Relm還為因與FTX和Alameda的關系而受到損害的其他公司提供保險,但未提供更多細節。此外,我們正在積極評估我們的覆蓋范圍可能被觸發的程度,考慮到直接和間接損失的可能性,我們已經分配了一部分一般準備金用于與此市場影響相關的已知和未知索賠。[2022/12/6 21:24:57]
elif_i!=j:
_x=_xp
else:
continue
S=_x
c=c*D/(_x*N_COINS)
c=c*D*A_PRECISION/(Ann*N_COINS)
b:uint256=SD*A_PRECISION/Ann#-D
y:uint256=D
for_iinrange(255):
y_prev=y
y=(y*yc)/(2*yb-D)
#Equalitywiththeprecisionof1
ify>y_prev:
ify-y_prev<=1:
returny
else:
ify_prev-y<=1:
returny
raise
流動性
Curve池的流動性添加不同于Uniswap必須添加交易對的兩種資產,basepool可以僅添加池中某一種資產
@external
@nonreentrant('lock')
defadd_liquidity(_amounts:uint256,_min_mint_amount:uint256)->uint256:
"""
@noticeDepositcoinsintothepool
@param_amountsListofamountsofcoinstodeposit
@param_min_mint_amountMinimumamountofLPtokenstomintfromthedeposit
Alameda Research從Circle提取6500萬枚USDC:10月14日消息,Lookonchain監測數據顯示,Alameda Research今日從Circle提取6500萬枚USDC,并從FTX提取2600萬枚USDC。
昨晚美國CPI數據發布后兩小時,Alameda曾從Circle提取4600萬枚USDC,并將3700萬枚轉至幣安和FTX。之后,ETH價格上漲了9%。[2022/10/14 14:27:53]
@returnAmountofLPtokensreceivedbydepositing
"""
assertnotself.is_killed#dev:iskilled
amp:uint256=self._A()
old_balances:uint256=self.balances
#Initialinvariant
D0:uint256=self._get_D_mem(old_balances,amp)#hunya#初始狀態D0
lp_token:address=self.lp_token
token_supply:uint256=CurveToken(lp_token).totalSupply()
new_balances:uint256=old_balances
foriinrange(N_COINS):
iftoken_supply==0:
assert_amounts>0#dev:initialdepositrequiresallcoins
#balancesstoreamountsofc-tokens
new_balances=_amounts
#Invariantafterchange
D1:uint256=self._get_D_mem(new_balances,amp)#hunya#添加流動性后理論D1
assertD1>D0
#Weneedtorecalculatetheinvariantaccountingforfees
#tocalculatefairuser'sshare
D2:uint256=D1
fees:uint256=empty(uint256)
mint_amount:uint256=0
比特幣礦企Core Scientific7月出售1975枚BTC,超7月開采量754枚:8月5日消息,比特幣礦企Core Scientific于7月售出1975枚BTC,7月開采量為1221枚,超出開采量754枚。資金將用于增加數據中心相關投資,并向比特大陸支付2021年訂購的100,000臺采礦設備。Core Scientific資產負債表上仍持有1,205個比特幣和約8300萬美元的現金。
此前消息,比特幣礦企Clean Spark于7月售出426枚BTC,超7月開采量42枚。比特幣礦企Bitfarms于7月售出1623枚BTC,超7月開采量1123枚。(CoinDesk)[2022/8/6 12:05:42]
iftoken_supply>0:#hunya#非首次添加流動性進行手續費扣出
#Onlyaccountforfeesifwearenotthefirsttodeposit
fee:uint256=self.fee*N_COINS/(4*(N_COINS-1))
admin_fee:uint256=self.admin_fee
foriinrange(N_COINS):
ideal_balance:uint256=D1*old_balances/D0
difference:uint256=0
new_balance:uint256=new_balances
ifideal_balance>new_balance:
difference=ideal_balance-new_balance
else:
difference=new_balance-ideal_balance
fees=fee*difference/FEE_DENOMINATOR
self.balances=new_balance-(fees*admin_fee/FEE_DENOMINATOR)
new_balances-=fees
D2=self._get_D_mem(new_balances,amp)#hunya#扣除手續費后的D2
mint_amount=token_supply*(D2-D0)/D0#hunya#LP鑄幣量
else:
self.balances=new_balances
mint_amount=D1#Takethedustiftherewasany
assertmint_amount>=_min_mint_amount,"Slippagescrewedyou"
#Takecoinsfromthesender
foriinrange(N_COINS):
if_amounts>0:
#"safeTransferFrom"whichworksforERC20swhichreturnboolornot
_response:Bytes=raw_call(
self.coins,
concat(
method_id("transferFrom(address,address,uint256)"),
convert(msg.sender,bytes32),
convert(self,bytes32),
convert(_amounts,bytes32),
),
max_outsize=32,
)
iflen(_response)>0:
assertconvert(_response,bool)#dev:failedtransfer
#end"safeTransferFrom"
#Mintpooltokens
CurveToken(lp_token).mint(msg.sender,mint_amount)
logAddLiquidity(msg.sender,_amounts,fees,D1,token_supplymint_amount)
returnmint_amount
Metapool
metapool為basepool基礎上擴展衍生的新池,用作將新型的穩定幣向basepool的LP代幣錨定。basepool池的流動性提供者可以將basepool的LP代幣再次在metapool中添加流動性,進一步賺取額外的交易手續費收益。
metapool合約中,間接耦合了新型穩定幣和基礎池的穩定幣,在提供了不同穩定幣之間的兌換功能的同時,一定程度上分隔了新型穩定幣的風險。
穩定幣兌換
metapool合約中的exchange_underlying函數實現了穩定幣之間的相互兌換功能
@external
@nonreentrant('lock')
defexchange_underlying(i:int128,j:int128,_dx:uint256,_min_dy:uint256)->uint256:
....
#Usebase_iorbase_jiftheyare>=0
base_i:int128=i-MAX_COIN
base_j:int128=j-MAX_COIN
meta_i:int128=MAX_COIN
meta_j:int128=MAX_COIN
ifbase_i<0:
meta_i=i
ifbase_j<0:
meta_j=j
dy:uint256=0
...
ifbase_i<0orbase_j<0:#hunya#兌換中包含meta池代幣
old_balances:uint256=self.balances
xp:uint256=self._xp_mem(rates,old_balances)
x:uint256=0
ifbase_i<0:#hunya#輸入代幣為meta池代幣
x=xpdx_w_fee*rates/PRECISION
else:#hunya#輸入代幣為base池代幣
#iisfromBasePool
#Atfirst,gettheamountofpooltokens
base_inputs:uint256=empty(uint256)
base_inputs=dx_w_fee
coin_i:address=self.coins
#Depositandmeasuredelta
x=ERC20(coin_i).balanceOf(self)
Curve(base_pool).add_liquidity(base_inputs,0)#hunya#base池添加流動性
#Needtoconvertpooltokento"virtual"unitsusingrates
#dxisalsodifferentnow
dx_w_fee=ERC20(coin_i).balanceOf(self)-x
x=dx_w_fee*rates/PRECISION
#Addingnumberofpooltokens
x=xp
...
#Withdrawfromthebasepoolifneeded
ifbase_j>=0:#hunya#輸出代幣為base池代幣
out_amount:uint256=ERC20(output_coin).balanceOf(self)
Curve(base_pool).remove_liquidity_one_coin(dy,base_j,0)#hunya#base池移除流動性
dy=ERC20(output_coin).balanceOf(self)-out_amount
assertdy>=_min_dy,"Toofewcoinsinresult"
else:#hunya#純base池代幣兌換,直接調用base池exchange函數
#Ifbotharefromthebasepool
dy=ERC20(output_coin).balanceOf(self)
Curve(base_pool).exchange(base_i,base_j,dx_w_fee,_min_dy)
dy=ERC20(output_coin).balanceOf(self)-dy
...
logTokenExchangeUnderlying(msg.sender,i,_dx,j,dy)
returndy
若兌換情況涉及basepool代幣和metapool池代幣,則會通過basepool的LP添加或移除流動性來做中間流程;若只是basepool代幣的兌換,則直接調用basepool的exchange函數進行兌換。
總結
總的來看,無論是白皮書的理論設計還是代碼的算法實現都是十分優秀的,理論設計巧妙夯實,代碼算法高效簡潔。這些優秀的實現都使得Curve在穩定對價資產交易領域中有著明顯的競爭優勢。
原文作者:NathanielPopper原文編譯:Kxp,律動BlockBeats本文梳理自前《紐約時報》記者NathanielPopper在個人社交媒體平臺上的觀點.
1900/1/1 0:00:00原文作者:Denis 原文標題:《EVMcompatibilityandthefutureofblockchains》 原文編譯:谷昱,鏈捕手 以太坊在第一波“以太坊殺手”中幸存下來.
1900/1/1 0:00:00imToken將在ProjectGalaxy平臺和聯合PerpetualProtocol、XYFinance、HakkaFinance分別舉辦社區活動,共三場.
1900/1/1 0:00:00Gate.io已上線DIA/USDT永續合約實盤交易,支持1-20倍做多和做空操作,槓桿率可以在下單時自行選擇.
1900/1/1 0:00:00如果交易所提示「地址無效」,說明你輸入的「錢包地址」和你選擇的「提幣網絡」不匹配。交易所持有的代幣在轉入imToken之前,需先了解imToken是否支持該代幣.
1900/1/1 0:00:00尊敬的WEEX用戶?您好!歡迎加入WEEX全球英文EN社區!在這里您可以掌握最新的平臺動態和專業的市場洞察。同時您可以與全球的幣圈愛好者們一起交流交易策略.
1900/1/1 0:00:00