Solana 生態 AMM 調研

本文將分別介紹 Solana 生態中的幾個重要的 AMM 實現,希望能夠對 LP(Liquidity Provider,流動性提供者)如何選擇自己的投資策略提供一些幫助。

作者:ZAN Team

原用標題:Web3 新手系列:Solana 生態 AMM 調研

封面:Solana

在 Web3 行業的現狀中,與 DeFi 有關的產品佔據了絕對的市場。而在這其中,AMM(Automated Market Maker,自動做市商)作為關鍵的一環,是 Web3 金融方面變化的有力推動者。

本文將分別介紹 Solana 生態中的幾個重要的 AMM 實現,希望能夠對 LP(Liquidity Provider,流動性提供者)如何選擇自己的投資策略提供一些幫助。

CPMM

CPMM (Constant Product Market Maker)  作為最基本的 AMM 實現,在許多產品中有實現。這裡用 Raydium 推出的基於恆定乘積的 AMM 來舉例。

恆定乘積即池子中兩種代幣的供應量具有固定乘積:X * Y = k。

對於流動性提供者來說,當任何人往池子中添加流動性(添加資產)時,CPMM 會自動給錢包地址創建關聯賬戶併發放 LP Token(每個代幣對都有屬於自己的 LP Token Mint),此 LP Token 用於證明該錢包地址持有某個池子的份額,並且將會在流動性提供者提款時銷燬相應的 Token。

CPMM 的鏈上程序使用 Anchor 開發,程序代碼在 https://github.com/raydium-io/raydium-cp-swap  能夠找到。下面我們來簡單確認下它是如何實現恆定乘積的。

首先,用戶在使用 Raydium 的 CPMM 交換代幣時,將會觸發 swap 相關指令。舉例來說(僅為了說明情況,本文不對任何 Token 負責):當用戶想使用 USDC 交換 TRUMP 時,可以通過 TRUMP-USDC 這個池子進行交換。

池子TRUMPUSDC
7XzVsjqTebULfkUofTDH5gDdZDmxacPmPuTfHa1n9kuh6p6xgHyF7AeE6TZkSmFsko444wqoP15icUSqi2jfGiPNEPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v

例如我們查看這個交易 https://solscan.io/tx/59moeTFTHzdU8ogWBG5R5fUqa4UcoGpnSUcxQAEDsA3N8PuKcaqb1tDLJgexj5CG4PgyW2PUWfRmB1hhwxHg511w),簡單起見,讓我們忽略交易中的其他指令,只查看 Raydium 部分。找到 Raydium CPMM: swapBaseInput:

SwapBaseInput 指令(數據來源:solscan.io)

在 Input Accounts 中,我們能看到輸入代幣為 USDC,輸出代幣為 TRUMP。在 Solana 生態的 AMM 中,LP Pair 可以簡單地通過 Token Account 來表示,而不需要創建一個新的合約程序並部署(例如以太坊中常用的工廠合約)。在交易發生時,直接與 Raydium 的 CPMM Program 來交互,Solana 程序將通過傳入的池子地址、代幣地址等來修改相應的 Token Account 的狀態,來進行 swap 操作。

例如上述的 swapBaseInput 指令,代碼在這裡 (https://github.com/raydium-io/raydium-cp-swap/blob/master/programs/cp-swap/src/instructions/swap_base_input.rs#L76)能夠找到。經過一系列前置檢查後,具體能夠換到多少目標代幣,通過 

ConstantProductCurve.swap_base_input_without_fees 中進行了計算:pub fn swap_base_input_without_fees(    source_amount: u128,    swap_source_amount: u128,    swap_destination_amount: u128,) -> u128 {    // (x + delta_x) * (y - delta_y) = x * y    // delta_y = (delta_x * y) / (x + delta_x)    let numerator = source_amount.checked_mul(swap_destination_amount).unwrap();    let denominator = swap_source_amount.checked_add(source_amount).unwrap();    let destinsation_amount_swapped = numerator.checked_div(denominator).unwrap();    destinsation_amount_swapped}

其中用到的公式為:

(x+Δx)(y−Δy)=x⋅y

即 TokenX 和 TokenY 在總量各自變化後,其乘積應保持不便。公式左邊為變化後的乘積,右邊為變化前的乘積。

X 和 Y 的總量前後變化(圖表來源 www.desmos.com)

上述算式通過數學轉換後,能得到 Δy(即我們能夠換到的 y 代幣的數量)的轉換公式

也就是代碼中的 delta_y = (delta_x * y) / (x + delta_x) 部分。注意這裡的計算並不包含手續費,其已經在 swap_base_input 的前置邏輯中扣除過了。

CLMM

CLMM (Concentrated Liquidity Market Maker) 同樣是 Raydium 推出的 AMM,它類似於 Uniswap V3,每個代幣對同樣有多個費用層級,能夠分別創建一個對應層級的池子。

由於 CLMM 的實現參考了 Uniswap V3,所以在學習它時,很多概念和實現方式都可以參考 Uniswap 的實現。它也繼承了 Uniswap 的概念例如 tick、多費率層級、集中流動性等。更多內容可以在 ZAN 推出的 DEX 開發課程中找到:https://zan.top/web3/resources/courses/dapp-advanced/Uniswap-Code-Analysis---How-Uniswap-works-20240511

但是需要注意,與 CPMM 類似的,由於 Solana 鏈的特性,Raydium CLMM 不需要對每個池子單獨部署一個合約,所以也沒有工廠合約的概念。這一點不同於 Uniswap。

CLMM 允許流動性提供者在注入資金時選定一個價格範圍,資金將僅在所選範圍內分佈:

選擇價格範圍(圖源:raydium.io)

對於集中流動性池來說,代幣分別分別存在於當前價格的兩側,上圖所選的價格範圍包含了當前價格,所以會將資金分別分配給池子中的兩種代幣。

我們也可以只注入某一種代幣,來提供所謂的單邊流動性(如下圖)。這有些類似於傳統金融模式中的限價單,LP 的資金只有在代幣價格達到某種範圍時才會被利用,不過這種模式要考慮的風險點也更多。

提供單邊流動性(圖源:raydium.io)

一般來說,對於價格波動小的池子,LP 傾向於選擇小一點的範圍;反之對於那些價格波動非常劇烈的池子,則傾向於選擇大一點的範圍。這樣的目的是為了儘量不讓當前價格脫離自己所選擇的價格範圍,造成太多無常損失。

需要注意,集中流動性雖然可以讓 LP 的資金利用率更高,但也對 LP 的金融意識提出了更高的要求,LP 需要更積極的管理自己的流動性。如果 LP 應對不力,那麼鏈上頻繁的波動將很容易導致 LP 遭受嚴重的無常損失。

DLMM

DLMM (Dynamic Liquidity Market Maker)  是 Meteora 推出的 AMM 產品,它也屬於 Uniswap V3 的一種,和上文提到的 CLMM 也非常相似,DLMM 也允許 LP 將自己的資金集中在當前價格附近的一定範圍內。不過 DLMM 在具體實現時有些不同,並且提供了一些特色功能。

DLMM 中提供了 Bin 的概念,池子將從基礎價格開始,每隔一小段 Bin step 作為一個 Bin 存在。如果交易發生在同一個 Bin 內,那麼交易者將享受到零滑點。這可以極大增加交易量和交易成功率,理論上 LP 能夠收穫更多的交易費用。

SOL-USDC 流動性分佈(圖源 www.meteora.ag)

與 CLMM 相似的,池子中的代幣同樣在當前價格的兩側分佈,一個代幣僅需要提供單邊流動性。但根據 Bin 的概念,當前激活的 Bin(表明了當前的交換價格)則擁有兩種代幣。即:

  • 當前激活的 Bin:其中存在兩種代幣,在當前 Bin 中交換代幣將按照固定價格進行,並且 0 滑點;
  • 其他 Bin:在當前激活的 Bin 兩側分佈,分別僅存在單個代幣。

在當前激活的 Bin 中的代幣量發生變化時,如果某一方代幣減少為 0,則 DLMM 會將當前激活的 Bin,根據池子中的實際情況,設定為其左側或右側的下一個 Bin。依此來推動池子中的價格變化。

在 LP 提供流動性時,DLMM 提供了 3 種策略,分別是 Spot、Curve 和 Bid Ask

3 種策略(圖源 www.meteora.ag)
  • 其中 Spot 最普世,基本上所有的流動性池都比較合適,算是一種最簡單的流動性策略。
  • Curve 則更適合那些價格變化非常小的池子,例如穩定幣對。這些池子中的價格波動非常小,就像它的形狀所透露的那樣,把 LP 的資金集中分佈在此區間內,能夠最大限度的吃滿交易費。
  • Bid Ask 則更適合那些價格波動非常大的池子。人們總是傾向於在這種池子中進行更多的套利交易,價格可能很難集中在某一小段範圍內。這種策略通常需要 LP 頻繁調整自己的倉位,來避免價格脫離自己所設定的資金範圍。由於涉及到對市場的判斷力,這通常並不容易。

總結

AMM 作為 Web3 金融領域的重要組成部分,通過其獨特的機制和創新,推動去中心化金融的普及和發展。隨著技術的不斷進步和生態系統的完善,AMM 有望在未來發揮更大的作用,進一步改變傳統金融的格局。

免責聲明:作為區塊鏈信息平臺,本站所發佈文章僅代表作者及嘉賓個人觀點,與 Web3Caff 立場無關。文章內的信息僅供參考,均不構成任何投資建議及要約,並請您遵守所在國家或地區的相關法律法規。

來源
免責聲明:以上內容僅為作者觀點,不代表Followin的任何立場,不構成與Followin相關的任何投資建議。
喜歡
收藏
評論