小狐狸钱包app官方下载安卓版|crvUSD 新的清算机制LLAMMA_MarsBit

2022 年底FTX 大爆炸的同时,Curve 团队释出了最新的crvUSD 稳定币设计白皮书。在这份白皮书里面提出了新的稳定币清算机制LLAMMA (Lending-Liquidating AMM Algorithm),而这样的清算机制其实不只可以用在稳定币上面,其他有清算需求的专案也都可以参考这样的设计。除了清算机制以外,白皮书内也提及了如何跟美金锚定的稳定机制与合约PegKeeper。

本篇文章会着重解释LLAMMA 的机制,并且透过curve-stablecoin 里面的源码以及测试案例来解释crvUSD 清算机制,并且概略的提到crvUSD 的稳定机制。

前情提要​

在进入正题前,我们会先解释一些相关的概念来帮助读者进入主题,以下会先解释抵押品稳定币、DAI 的清算方式以及传统AMM 的运作方式。

抵押品稳定币​

首先crvUSD 是一个抵押品稳定币,这也代表所铸造出来的crvUSD 背后都有超过发行额度的抵押品来支撑价值,同时在抵押品价格下跌时会触发清算程序来确保稳定币背后都有足够的价值支撑,最著名的抵押品稳定币为MakerDAO 的DAI。

相对于抵押品稳定币的是算法稳定币,透过演算法而非抵押品来保证稳定币与美金的锚定,这类稳定币近期最著名的是Terra 的UST。

DAI 的清算方式​

DAI 是透过超额抵押的方式提供稳定币价值支撑的抵押品稳定币。比如说当使用者抵押3500 等值美金的ETH 时,可以铸造出2000 美金等值的DAI。但如果ETH 价格下跌到一定程度时,使用者的抵押品就会被标记成可清算。

这个清算过程中,抵押品如ETH 会用折扣的方式出售,所有人都可以来参与折扣的抵押品竞标。比如说在ETH 价格为2900 美金时,系统会以2800 美金的价格出售,这就会吸引套利者前来竞标。

当清算结束后,如果抵押品拍卖的价格比较好,其中一部分的抵押品可能就不会被清算掉,此时就会还给债务人。但是大部分的抵押品通常都会被清算导致损失惨重,即使价格回稳,但清算已经造成伤害。

预言机

接下来会讲解传统的AMM 运作方式作为LLAMMA 的特殊设计AMM 的对照参考。

传统AMM 的运作方式​

以Uniswap V3 为例,使用者可以透过Range Order 的方式来提供流动性。比如说当ETH 为3000 USD 时,使用者可以把1 ETH + 0 USD 放入Uniswap V3 里面,并且指定在3200 - 3800 USD 的区间换成USD。

预言机

当ETH 进入上述区间之后,1 ETH 就会慢慢的被换成USD,当超过3800 USD 时,所有的ETH 都会被换成USD,这个效果很像在中心化交易所当中从3200 一路挂限价单(Limit Order) 到3800 USD 的效果。

但跟限价单不同的是如果此时价格又跌回3000 后,在Uniswap v3 上面所有的USD 又会被换回ETH。

反方向来说,使用者也可以提供比如3000 USD + 0 ETH,并且指定布署在2000 - 2500 USD 的区间,当价格下跌时,USD 就会逐渐的被换成ETH,直到低于2000 USD 时,所有的USD 都会被换成ETH。

LLAMMA​

crvUSD 跟DAI 一样也是抵押品稳定币,但新设计了一种清算演算法LLAMMA,其结合AMM 的特性让抵押品在价格下跌时逐渐转移成稳定币,让原本要清偿的债务有一定程度的稳定币可以偿还,同时在价格回稳时再逐渐把稳定币换回抵押品,而不是硬生生的触发清算导致债务人的亏损。

铸造crvUSD 的时候同样的会需要存入抵押品如ETH 到智能合约来,不一样的是这个抵押品会被放入一个LLAMMA 特殊设计的AMM 当中。跟Uniswap 的Range Order 一样,刚存入抵押品到AMM 时会以单边的形式存在,而当抵押品价格下跌到一定程度时,就会逐渐换成稳定币。

举例来说当ETH 价格为3000 美金的时候,使用者可以抵押1 ETH 到系统的智能合约里面。此时系统会铸造出crvUSD 给使用者,同时抵押的1 ETH 会被类似Uniswap v3 的方式被放入一个特殊的AMM 里面,比如说流动性会被放在500-550 USD 这个区间当中,而所取得的LP 代币则会只有单边的1 ETH + 0 crvUSD 流动性。

预言机

当ETH 价格跌到550 USD 以下时,系统会开始慢慢的把ETH 换成crvUSD,当跌到500 USD 以下时,所有的流动性就会变成crvUSD。当价格跌到这个区间时,系统将会用比市场上更便宜的价格售出ETH,此时就会吸引市场上的人来到这个特殊的AMM 里面来买ETH 来获得折扣价。

因为系统会逐渐的把抵押品ETH 换成稳定币crvUSD,所以就不会像DAI 一样到硬清算门槛后就直接把所有抵押品都清算掉。更进一步的是当抵押品ETH 的价格如果回稳后,使用者的流动性又会逐渐的从稳定币crvUSD 换成ETH。

预言机

不过这个换回抵押品的过程也可能出现Path-Dependence 的问题,我们在最后的结论与疑问章节来讨论这个问题。

这边有三件事情要特别注意:

LLAMMA 跟传统AMM 的方向相反:传统AMM 放入单边资产之后,要价格提升才可以换成另外一边,而LLAMMA 的特殊AMM 则是价格下跌之后才会换成另外一个资产(稳定币)LLAMMA 需要依赖外部的预言机(Oracle) 价格:因为LLAMMA 需要卖的比外面的更便宜,所以会需引入预言机价格,才可以知道有流动性的时候要如何折扣定价来吸引套利者,外部价格跟内部价格差距越大时,LLAMMA 就会给出更多折扣。crvUSD 还是有清算机制:虽然可以透过LLAMMA 的特殊AMM 逐渐转换成稳定币,但是如果债务健康状况太糟糕,还是会有最后的清算机制

透过测试案例解释实际运作方式​

crvUSD 除了白皮书以外也释出了源码,其中的测试案例test_create_loan正好覆盖了整个借款过程,这边利用这个测试案例来解释整个流程会更容易理解。

为了得到更多资讯,我fork 了原本的源码并且在目标的测试案例里面印出了更多资讯(不太熟悉Vyper 环境,只能用比较土炮的作法),有兴趣的可以参考下面的commit 了解我做了什么修改:

https://github.com/yurenju/curve-stablecoin/commit/c3bf52353f41914deb82f1c1c97dcbc5de2d72e4

首先要先解释一下波段(band)。

波段(band)​

波段是当使用者把抵押品存入系统时,抵押品会被存入的区段,当预言机价格移动到这个区间时,使用者的抵押品就会开始被转换成稳定币。而刚开始建立AMM 时会根据预言机的价格切分波段,其中预言机价格所在的波段会是波段0 (band 0),预言机价格越低,波段编号越高。

预言机

比如说创建AMM 的时候预言机报价3000 USD,此时波段0 的价格带会是2970 - 3000,而波段1 的价格带是2970.0 - 2940.3。而由于目前价格落在波段0,所以AMM.active_band()就会回传0。

至于每个区间的价格宽度则由AMM 建构子所传入的A (Amplification) 决定,公式为:

p↑

p↓

​=A

A−1

举例来说,当价格上界p↑

​为3000 而A 为100 时,价格下界p↓

​则为:

p↓

​=A

p↑

​(A−1)

​=100

3000(100−1)

​=2970

每个波段的价格下界正好会接着上个波段的价格上界形成一个连续的流动性区间,如果想知道该波段所代表的预言机价格上下界,可以用以下两个函式查询:

AMM.p_oracle_up(band_number)AMM.p_oracle_down(band_number)

当每次有人借出crvUSD 或是有人跟AMM 交易时,系统会根据当下的外部预言机价格与目前的流动性交易情形来更新现行的区段amm.active_band。

而在active_band里面的流动性则会开始被交易,也就是抵押品可以被交易成为稳定币,反之亦然。当active_band的流动性被交易殆尽后,会跳到下一个波段继续交易,并且更新active_band到下一个波段。

存入抵押品来铸造crvUSD​

根据测试案例test_create_loan的前置条件如下:

抵押品为WETH,目前价格为3000 USD稳定币为crvUSD

使用者呼叫Controller.create_loan(collateral, debt, number_of_bands)来铸造稳定币,存入了1000 WETH,欲铸造或是说借出500,000 crvUSD,并且将流动性布署在5 个波段内:

market_controller.create_loan(1000 ETH, 500000 crvUSD, 5)

Copy

此时系统会根据抵押品数量、欲铸造的稳定币数量决定要把流动性放在哪五个波段内。要决定是哪五个波段,可以透过Controller.calculate_debt_n1(collateral, debt, bands)来得到上界的波段,再加上波段总数5 就可以取得下界。

以这个例子而言,calculate_debt_n1(1000 WETH, 500000 crvUSD, 5)所回传的上界n1 为170,总共放在五个波段内,所以下界就是174。

若想查询这个连续波段的上下界的预言机价格,可以用AMM.p_oracle_up(170)跟AMM.p_oracle_down(174)取得。这个连续的波段价格上界为543.38,下界则为516.75。这也代表当外部的预言机价格降到这个区间时,使用者存入的抵押品会在AMM 里面被以比预言机报价更便宜的价格卖出,让套利者会想要到系统内买到更便宜的抵押品获利。

存入的抵押品将会平均的布署在这五个波段上,也可以透过AMM.bands_y(band_number)来取得特定波段的抵押品数量,比如说bands_y(170)会得到该波段总共有200 WETH 的抵押品,查询170 - 174 都会是200 WETH。

跟LLAMMAS 交易折扣的WETH 抵押品​

curve-stablecoin 提供了许多方便的工具可以使用,如测试用的预言机让我们可以直接修改预言机价格进行测试。

我们可以透过price_oracle.set_price(p)来改变预言机价格。这边我们用set_price(540)把价格从3000 改成540,这也是波段170 的范围。使用p_oracle_up(170)与p_oracle_down(170)可以得知波段170 的范围约是543.38 - 537.95。

此时呼叫AMM.exchange(0, 1, in_amount, 0)可以用crvUSD 交换WETH 资产。若使用100 crvUSD 可以交换到约0.185634 WETH,平均价格为538.69 crvUSD,相较起来会比起预言机价格的540 USD 更为便宜。

假设上面这个交易没有进行,但是预言机价格调到535 USD,也就是调整到波段171 时,此时再进行同样的交易用100 crvUSD 交易WETH,则平均价格则为523.87 crvUSD,这也说明了预言机价格也会影响AMM 的内部价格,当预言机价格变低时,AMM 抛售抵押品的价格也会进一步的降低,让套利者愿意到系统里面来套利,进一步的协助债务人的债务有更多稳定币支撑。

crvUSD 的稳定机制PegKeeper​

crvUSD 除了透过LLAMMA 来执行转换与清算外,还有另外一个模组PegKeeper 合约进行稳定币的锚定功能。

这边会使用到一个Curve 一般的AMM 稳定币交易池StableSwap,里面的代币对是crvUSD 以及另外一个LP 代币如3Crv 进而组合成的MetaPool。

当crvUSD 的价格高于1 USD 时(比如说crvUSD 的使用需求增加),PegKeeper 会铸造出无抵押的crvUSD 并且注入这个StableSwap。此时套利者发现市场上的crvUSD 价格高于1 USD,但是这个StableSwap 价格却接近1 USD 时就会到StableSwap Pool 来套利,进而让市场上的crvUSD 价格下跌靠近1 USD。

当crvUSD 价格低于1 USD 时,反过来PegKeeper 可以从StableSwap 抽出资金并且销毁,并且让套利者进来重新平衡价格,让市场上的crvUSD 上涨靠近1 USD。

这个PegKeeper 合约虽然可以铸造与销毁crvUSD,但它在智能合约的逻辑限制只能够针对特定的StableSwap 池子注入与抽出crvUSD 来限制用途。

结论与疑问​

本篇文章解释了crvUSD 所提出的新清算方式LLAMMA 透过AMM 的特性进行针对债务人更友善的清算/转换方式,并且透过测试案例来一窥crvUSD 实际运作的方式,并且概略的解释了PegKeeper 透过Curve MetaPool 来进行的稳定机制。

LLAMMA 清算机制​

LLAMMA 是个新的概念,套用了AMM 的range order 特性到清算机制来,确实对于债务人更有友善,当价格回稳的时候损失的程度就会大幅降低。

相较于其他具备清算流程的稳定币与借贷平台如MakerDAO, Compound, AAVE 来说,这些平台在清算时会需要仰赖外部的去中心化交易所(DEX) 协助清算。当外部的DEX 流动性不足时,稳定币/借贷平台就有可能产生坏帐。

比如说如果有个大户持有1M 的CRV 资产作为抵押需要清算时,传统的平台会透过折扣的方式一次出清这1M 的资产,此时如果外部DEX 流动性不足导致滑价太高,让参与清算的利益不足进而降低清算者参与的意愿时,无人清算的状况下就会导致坏帐。

而LLAMMA 因为内建了流动性的关系,当资产价值下跌时,抵押品会被逐渐的换成稳定币,而最后真的需要清算的部位就会比传统平台要小得多。以上面的例子来说1M 的CRV 在价格下跌时就会逐渐的被换成稳定币,最终真的触及硬清算门槛时,或许只剩下1% 的资产需要清算,对于外部DEX 的流动性的依赖就会低很多,加强平台的自主运作能力。

但交换代币的折扣也会带来一些隐忧。Paradigm 的首席研究员Dan Robinson 在他的Tweet提到LLAMMA 会有Path-Dependence的问题。由于LLAMMA 内部用的AMM (以下称为LLAMM)的定价p会参考外部预言机的定价po

​,我们假设外部的预言机价格来源以及AMM 都是Uniswap 来解释这个问题。

当ETH 价格从1000 USD 变化到1200 USD 的过程当中,假设LLAMM 会需要在这个区段来把稳定币换回抵押品。这个过程中LLAMM 有可能会在换回抵押品的过程中承受价差的损失,端看外部价格po

​的变化速度,我们来看价格缓慢上涨跟快速上涨的两种状况:

价格缓慢上涨:当po

​价格缓慢上涨时,LLAMM 内部的价格会参考po

​定价,用稍微高一点的价格收购ETH,比如说po

​=1000 USD时卖1010 USD ,套利者就会在Uniswap 买ETH,在LLAMM 卖ETH。ETH 卖出之后LLAMM 内部的价格就会慢慢靠近1000 USD,所以在这个缓慢上涨的流程中,LLAMM 池子可能会以些微折扣的方式买回ETH,比如说均价为1150 USD。

价格快速上涨:当po

​快速从1000 USD 上涨到1200 USD 时,快到套利者没有在这之间进行套利。此时因为po

​=1200 USD,而LLAMM 内部的价格为了要跟上外部预言机的价格,它就会用更高的价格收购ETH,就可以吸引套利者在Uniswap 买ETH 并且在LLAMM 卖ETH。如此一来转换ETH 的均价就会高于1200 USD。

如果站在LLAMM 池子的角度来说,价格缓慢上涨的状况会让收购价格比较合理,但是如果遇到快速上涨时,就会造成LLAMM 池子承受价差损失,而这个价差损失也就是债务人的损失。

当然,如果跟完全被清算相较起来,或许这样的价差损失还是比较小。但由于之中还有许多不确定的因素,还会需要更多的资讯来判断可能造成的损失程度。

总体来说,LLAMMA 确实是一个可以进一步研究的新清算方法,而且不一定是稳定币,有需要清算的场合如借贷平台或是去中心化的衍生性商品协议也可以考虑用同样的清算方式来减低债务人在清算抵押品带来的损失。

PegKeeper 稳定机制​

至于PegKeeper 透过Curve MetaPool 所进行的稳定挂勾方式,我则比较存疑。如果说DAI 是透过升息、降息的方式调整市场热度,PegKeeper 则是更为激进直接透过类似量化宽松/紧缩的方式印出钞票投到所需的市场。当然透过智能合约的限制还是会比起量化宽松更为透明,但是还需要进一步深究是否有影响市场经济所带来的副作用。

另外一方面在这个稳定锚定用的MetaPool 当中新铸造的crvUSD 是无抵押生成的,或者是说是以另外一侧的LP 代币如3crv 作为抵押生成,而透过套利者的搬运来让crvUSD 重新锚定到1 美金,实际上会损害流动性提供者的利益。因为套利者透过价差套利时,流动性提供者就作为他的对家承受损失。

这方面还不知道交易费是否足以覆盖价差的损失,可能还需要进一步的机制去补偿流动性提供者才可以完成整个稳定机制。如果没有奖励机制,要如何鼓励使用者来为crvUSD 提供稳定机制?这也是目前白皮书并没有涵盖到的概念。

结语​

但crvUSD 目前也还没有上线,相信未来这些疑问还可以进一步的被回答或是改善,也期待他们正式上线来验证他们的想法。

最后如果你对本文有任何的问题,欢迎到讨论区提出!

文末想感谢审稿人@paco0x对本文的贡献,感谢他提供了Path-Dependence 以及LLAMMA 减低外部流动性依赖的相关资讯。关于文章审稿的讨论,请见Pull Request #101。