簡介 Curve Stablecoin 原理及架構

林瑋宸 Albert Lin
Taipei Ethereum Meetup
15 min readFeb 27, 2023

--

Curve Finance 不管是在 Stablecoin Swap 的 AMM Algorithm, 或是廣為被其他人效法的 veToken 經濟模型設計,都是 DeFi 領域極具代表性的創新。去年底 Curve Finance 提出他們的穩定幣白皮書,不禁讓人好奇這次他們又會為 DeFi 生態端出什麼新的菜色。在研究過程有一些心得和理解,希望可以幫助大家更了解 Curve 穩定幣的設計。

Curve 穩定幣類型及解決問題

Curve Finance 穩定幣設計上是屬於超額抵押類型的穩定幣。這類穩定幣是藉由把其他資產譬如 ETH 當成抵押品,根據特定的利率及抵押品的價值去 mint (或 borrow)出穩定幣。最著名的 Protocol 就是 MakerDAO 的 DAI。把 ETH 當成抵押品抵押到 MakerDAO 中,並借出 MakerDAO 的穩定幣 DAI 。在這裡只是抵押的對象改成 Curve Finance 來借出 Curve 穩定幣。

Figure1:

清算問題

此種類型的穩定幣架構都會有清算(Liquidation)機制。清算是指當抵押品價格下降到特定價格時,造成抵押品價值可能無法支撐借出的穩定幣。此時抵押品(全部或部分)會以較優惠的價格拍賣出去,藉此填補借出穩定幣的缺口。目前的清算模式存在幾個問題:

  • 當鯨魚的資產被清算時,會有很多抵押品流入市場,易造成市場波動。
  • 大部分情形下清算者會把清算後的抵押品賣掉來獲利,這舉會造成抵押品價格再次下降,而又造成另一波的清算。
  • 清算者通常會去 CEX/DEX 賣掉拍賣來的抵押品。若交易所缺乏流動性會造成借貸平台的壞帳 (例子)。
  • 被清算後使用者將會承受永久損失。即便抵押品價格回升,抵押品也已經被清算無法恢復。

有鑑於此 Curve 在設計穩定幣時希望可以透過以下方式來改善清算問題。

  • 不依賴外部的 DEXs。因為 DEX liquidity 是無法掌控。
  • 當清算發生時盡量減少用戶的損失。
  • 逐步清算用戶的抵押品,並在價格反彈時將其轉換回來。

Curve Stablecoin Overall Architecture

上圖是白皮書中的架構圖,大約可以分成兩的區塊。

  • Controller 和 LLAMMA 主要負責抵押品清算相關的工作(上圖藍色框框的部分)。
  • Monetray Policy,PegKeeper 和 Stable Pool 主要負責錨定穩定幣在 1 USD 的相關工作(上圖綠色框框的部分)。

本篇文章內容主要會著重在 Contoller 跟 LLAMMA 介紹,但 Monetray Policy 相關工作也會有簡單的說明。所以讓我們從今天的重頭戲 LLAMMA 開始吧!

LLAMMA (Lending-Liquidating AMM Algorithm)

LLAMMA 全名是 Lending-Liquidating AMM Algorithm,顧名思義是一種跟借貸及清算有關的 AMM 演算法。Curve 主要是用這套演算法來清算抵押品

AMM 代表會有一個根據 LLAMMA 演算法的 Swap Pool,這裡我們先稱之 LLAMMA Pool。使用者可以透過 Controller 把他們的抵押品 deposit 進去 LLAMMA Pool 並 mint 出穩定幣。LLAMMA Pool 中的資產就是抵押品及 Curve 穩定幣。以下文章中我們統一使用 crvUSD 代稱 Curve 穩定幣,並使用 ETH 當作抵押品來舉例。

LLAMMA Pool 最大的特色是當抵押品(ETH)價格低於某個特定價格時,Pool 中的抵押品會逐漸變成 crvUSD。反之若高於某特定價格則 crvUSD 會逐漸變成抵押品(ETH)。

聽起來挺神奇的吧!在了解這個轉換過程之前,我們需要先知道使用者把抵押品放在 Pool 中發生了什麼事情。下圖是各合約互動的示意圖,讓大家對於 LLAMMA Pool 實際在架構中扮演的角色可以有更清楚概念。

合約互動流程示意圖

Dynamic Range and Oracle Price

Band

首先 LLAMMA 將抵押品價格區間切成不同的價格區段稱之為 band。當使用者 deposit 抵押品時需要提供:

  • 抵押品數量
  • 想要存進多少個 band 中
  • 想要 mint (or borrow)出多少 crvUSD

抵押品會根據 想要存入多少 band 的數量去切分抵押品成相同數量且等分的小塊,再以目前價格及 mint 出的 crvUSD來將這些小塊存放在由 band 組成的連續價格區間中。如下圖是將 10 ETH 經計算存入 5 個 band 中的分佈情形,先將 10 ETH / 5 = 2 ETH 的五個小塊存入連續的 5 個 band 中。

此外需要注意每個 band 都會有一個 upper price (P_UP)和 lower price (P_DOWN)。同時上一個 band 的 upper price 會是 下一個 band 的 lower price 。舉例來說譬如上圖中的 band 0 的 upper price (3000)同時也是 band -1 的 lower price(3000)。每個 band 的 upper price 跟 lower price 就代表這個 band 開始清算和結束清算的價格。當價格到達 upper price 時,存放在這個 band 的抵押品就會開始清算,直到價格到達 lower price 時就結束清算(代表這個 band 的抵押品已全數變成了 crvUSD)。

Oracle Price

在 LLAMMA 中有另一個重要的角色就是 Oracle Price, Oracle Price 就是指外部的抵押品價格(可以想成是目前市場價格)。LLAMMA 設計 Oracle Price 角色來達到抵押品在特定價格會開始進行 ETH <-> crvUSD 轉換的行為。詳細如何做到我們會在後面的章節來說明。這裡我們先假設 Oracle Price 為 P_ORACLE。 LLAMMA Pool 中的價格我們假設為 P_AMM

關於 oracle 的設計,確定的是每次在獲得外部的價格後,會先做 EMA 處理才會使用此價格。以免外部價格劇烈波動造成用戶損失,另一方面也增加操縱 oracle price 的難度。因為目前服務還沒有上線,所以無法確定會用哪個服務當作 oracle source(撰寫文章當下 Curve 社群有在投票是否要針對 stablecoin 機制建立 EMA Pool)。

How to Work in LLAMMA Pool

下圖是 band 區間中的價格變化情形(用 ETH 當作抵押品)。當 ETH 價格高於 P_UP(黃色區間)時, band 區間的資產會全部變成 ETH。當 ETH 價格低於 P_DOWN(綠色區間)時, band 區間的資產會全部變成 crvUSD。當價格在 P_UPP_DOWN 之間(白色區間),資產會處於部分 ETH 和部分 crvUSD 的狀態,根據價格變化決定 ETH 和 crvUSD 所佔的比例。

中間紫色的線是指P_ORACLE 的價格變化,紅色的線是指 P_AMM 的價格變化。可以把 P_CDP_CU 想成是為了找出這個 band 的 upper price 和 lower price 所製造出來的兩條方程式。

LLAMMA pool price diagram

P_ORACLEP_AMM 相等時就會是圖中間藍色的點,此時 Pool 中的 ETH 價格跟外部的價格是一致。

Oracle Price 上漲

從上圖(LLAMMA pool price diagram)可以發現,當價格開始上升的時候(橘色線的部分),會發現紅色(P_AMM)的線會比紫色(P_ORACLE)的線上升的更快。當P_AMM > P_ORACLE 時就會產生一個套利空間,使得外部的套利者(Arbitrgeur)有動力存入 ETH 到 LLAMMA Pool 藉以交換出更多的 crvUSD 來獲利,直到 P_AMM = P_ORACLE再度達到平衡。過程中池子中的 ETH 的數量逐漸變多,crvUSD 的數量逐漸變少。當高過 P_UP 時,這個區間的就會只剩下 ETH。下圖顯示套利者在套利過程中 AMM price(P_AMM)變化情形(下圖中 X 軸表示 oracle price, Y 軸表示AMM price。為了可以更清楚表示出價格位置,分別在 X 軸和 Y 軸都列出 oracle price 的橘色線)。

當 P_AMM > P_ORACLE 時套利者會開始存入 ETH 拿出 crvUSD,P_AMM 線(紅)會開始往右移動直到 P_AMM = P_ORACLE 再度平衡。

Oracle Price 下跌

反之亦然,當上圖中(LLAMMA pool price diagram)價格開始下降時(綠色線的部分),會發現紅色(P_AMM)的線會比紫色(P_ORACLE)的線下降的更快。當P_AMM < P_ORACLE 時也會產生一個套利空間,使得外部的套利者存入 crvUSD 換取更多的 ETH,直到價格再度達到平衡。過程中池子中的 crvUSD 的數量逐漸變多,ETH 的數量逐漸變少。當低於 P_DOWN 時,這個區間的就會只剩下 crvUSD。

當 P_AMM <P_ORACLE 時套利者會開始存入 crvUSD拿出 ETH,P_AMM 線(紅)會開始往左移動直到 P_AMM = P_ORACLE 再度平衡。( X軸:oracle price, Y 軸: AMM price,橘色線: oracle price)

LLAAMA Formulas

為什麼 P_AMM 會上升或下降得比 P_OARCLE 來要快呢?這一點要從 P_AMM 的公式來看。

  • LLAMMA Invariant 其中的 I, fg 都是跟 P_ORACLE 有關的公式。表示 I, f, g 都會改變,不是固定的常數。
  • xy 則是指區間的 USD balance 和 ETH balance 。
  • y_0 是當 P_AMM = P_ORACLE = P_UP 時的 ETH balance,可以先暫時將y_0 視為一個常數(實際上他也是跟 P_ORACLE有關函式)
  • 若把 band 區間排成一個數列,會發現是一個等比級數的數列。 而 A 是決定這個等比數列的比例的數字。contract 部署時就決定 A 是多少,所以 A 也是一個是不變量。

可以發現 P_AMM 只跟參數 fg 有關,而 fg 只會跟著 P_ORACLE 變動有關(其他幾乎都是常數)。當 P_ORACLE 上升時,f 值會上升(平方關係會上升更快)且g 值會下降,P_AMM 上升的幅度會比 P_ORACLE 更多而導致 P_AMM > P_ORACLE。當 P_ORACLE 下降時,f 值會下降(平方關係會下降更快)且g 值會上升,P_AMM 下降的幅度會比 P_ORACLE 更多而導致 P_AMM < P_ORACLE。即使 LLAMMA Pool 沒有任何 swap ,P_AMM也會隨著 P_ORACLE變動,且P_AMM 的幅度都會比 P_ORACLE 更大,進而製造出一個套利空間來平衡池子的資產比例。

小結 LLAMMA

LLAMMA 是利用 P_AMM 上升和下降的幅度都大於 P_ORACLE 的方式,刻意製造一個套利空間讓外部的套利者有利可圖。當套利者去試圖平衡池子中的資產比例時,其實就是在對池子中的資產做部分清算。這樣的好處是清算是動態且持續,不會有一次清算大筆資產而導致市場波動。當價格回升時資產也會轉換回抵押品而不會造成抵押品的永久損失。

Stabilizer and Monetary Policy

講完了 LLAMMA 是如何解決清算抵押品問題,讓我們回頭簡單說明一下什麼是 PegKeeper 和 Monetary Policy 及他們是如何運作。 PegKeeper 和 Monetary Policy 則是 Curve Finance 用來錨定 crvUSD 在 1 USD 的機制。

PegKeeper

這是將 crvUSD 結合 curve pool 用來平衡 1 USD 機制。假設存在 crvUSD 與其他穩定幣的 curve pool 。

  • 當 crvUSD price > 1 USD 時:表示 curve pool 裡面的 crvUSD 太少(供不應求)。PegKeeper 可以在無抵押品的情形下 mint 出新的 crvUSD 並deposit 到 Curve Pool,以增加市場中的 crvUSD。
  • 當 crvUSD price < 1 USD 時:表示 curve pool 裡面的 crvUSD 太多(供過於求)。PegKeeper 便會開始從 curve pool 中 withdraw 之前 mint 出的 crvUSD 並 burn 掉這些 crvUSD,以減少市場中的 crvUSD。

以上行為都是被定義在 PegKeeper contract 中,PegKeeper 可以被任何的 external caller 呼叫。呼叫 PegKeeper 錨定 crvUSD 時會產生利潤,而這些利潤會以 LP token 的形式回饋給 external caller。舉例來說,假設 PegKeeper 一開始 mint 200 crvUSD,然後把這 200 crvUSD deposit 到 curve pool 拿到 300 LP token。等到 price 下降,只需要 200 LP token 就可以 withdraw 200 crvUSD。那剩下的 100 lp token 就會被 external caller 所擁有。

雖然這邊是提到各 curve pool 去跟 crvUSD 組成池子,但比較可能作法猜測會是類似 3pool 類型的 pool 跟 crvUSD 組成池子。這樣只要有一組 pegKeeper 就可以去調節 crvUSD 的價格。另外 Curve Team 可以用 CRV 投票在 crvUSD ↔ 3pool 這個池子來提高獎勵,吸引人們去抵押鑄造 crvUSD 的誘因。但這些只是個人猜測,還是要看實際上線後的情形才知道。

Monetary Policy

若 PegKeeper 已經 burn 完這些無抵押的 crvUSD 後, crvUSD 價格仍低於 1 USD 時該怎麼辦呢?Curve Finance 有另一套方法來拉高 crvUSD price,這個方法就是利用 Monetary Policy 來提高 borrowing rate。

https://www.desmos.com/calculator/cqtavnvhps?lang=en

可以看到當 price > 1 時, borrowing rate 會極小(趨近於 0) 。若 price < 1 時,borrowing rate 會上升極快。這會導致借出(mint) 出 crvUSD 的抵押者會趕快 repay ,不然抵押品可能會被清算。會發現其中 price 會影響 borrowing rate, 同樣也會影響借款的金額。當然實際會上升多快還是要等 crvUSD 正式上線後才會知道。

TL;DR

  • LLAMMA 是 Curve 是進行抵押品清算的演算法,通過在不同的價格範圍內分散抵押物來減少清算時的損失。
  • 它通過比外部價格更大的變化幅度來產生套利機會來動態清算抵押品。當價格下跌時,抵押品會變成crvUSD,價格上漲時會變回抵押品。
  • PegKeeper 鑄造或燒毀無抵押 crvUSD 降低或提高 crvUSD 價格。Monetary Policy 則是利用控制借款利率,以使 crvUSD 錨定在1美元。

Curve Finance 這套機制設計得非常精妙,很值得再繼續深入研究其中的各項實作設計。在理解 Curve 穩定幣機制時,發現 PACO 大大在研究 Curve 穩定幣方面造詣很深。從他的文章和影片都獲益良多。其中圖表都是從 PACO 的資料得來,強烈建議想要了解更深入可以去看 PACO 大大的文章和影片,我會一併放在 Reference 中。

以上是研究 Curve 穩定幣過程中自己的一些理解和整理。希望多少可以幫助大家對於 Curve 穩定幣機制有些許了解。文章中若有誤的部分還麻煩大家能不吝指教給予糾正,也歡迎一起討論交流意見。

這篇文章非常感謝 Cyan Ho 老師幫忙 review 和提供一些想法來完善文章!

--

--