在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這個池子進行交換。
池子 | TRUMP | USDC |
7XzVsjqTebULfkUofTDH5gDdZDmxacPmPuTfHa1n9kuh | 6p6xgHyF7AeE6TZkSmFsko444wqoP15icUSqi2jfGiPN | EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v |
例如我們查看這個交易,簡單起見,讓我們忽略交易中的其他指令,只查看Raydium 部分。找到Raydium CPMM: swapBaseInput :

在Input Accounts 中,我們能看到輸入代幣為USDC,輸出代幣為TRUMP。在Solana 生態的AMM 中,LP Pair 可以簡單的透過Token Account 來表示,而不需要創建一個新的合約程序並部署(例如以太坊中常用的工廠合約)。在交易發生時,直接與Raydium 的CPMM Program 來交互,Solana 程式將透過傳入的池子地址、代幣地址等來修改相應的Token Account 的狀態,來進行swap 操作。
例如上述的swapBaseInput 指令,程式碼在這裡能夠找到。經過一系列前置檢查後,具體能夠換到多少目標代幣,透過ConstantProductCurve.swap_base_input_without_fees中進行了計算:

其中所用到的公式為:

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

上述算式經過數學轉換後,能得到Δ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 開發課程中找到: DEX Development Practice - Uniswap Code Analysis - How Uniswap works - ZAN
但需要注意,與CPMM 類似的,由於Solana 鏈的特性,Raydium CLMM 不需要對每個池子單獨部署一個合約,所以也沒有工廠合約的概念。這一點不同於Uniswap。
CLMM 允許流動性提供者在註入資金時選定一個價格範圍,資金將僅在所選範圍內分佈:

對於集中流動性池來說,代幣分別分別存在於當前價格的兩側,上圖所選的價格範圍包含了當前價格,所以會將資金分別分配給池子中的兩種代幣。
我們也可以只注入某一種代幣,來提供所謂的單邊流動性(如下圖)。這有些類似傳統金融模式中的限價單,LP 的資金只有在代幣價格達到某種範圍時才會被利用,不過這種模式要考慮的風險點也更多。

一般來說,對於價格波動小的池子,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 能夠收穫更多的交易費用。

與CLMM 相似的,池子中的代幣同樣在當前價格的兩側分佈,一個代幣僅需要提供單邊流動性。但根據Bin 的概念,目前啟動的Bin(顯示了當前的交換價格)則擁有兩種代幣。即:
- 目前啟動的Bin:其中存在兩種代幣,在當前Bin 中交換代幣將按照固定價格進行,並且0 滑點;
- 其他Bin:在目前啟動的Bin 兩側分佈,分別僅存在單一代幣。
在目前啟動的Bin 中的代幣量發生變化時,如果某一方代幣減少為0,則DLMM 會將目前啟動的Bin,根據池子中的實際情況,設定為其左側或右側的下一個Bin。依此來推動池子中的價格變動。
當LP 提供流動性時,DLMM 提供了3 中策略,分別是Spot、Curve 和Bid Ask
- 其中Spot 最普世,基本上所有的流動性池都比較合適,算是一種最簡單的流動性策略。
- Curve 則更適合那些價格變動非常小的池子,例如穩定幣對。這些池子中的價格波動非常小,就像它的形狀所透露的那樣,把LP 的資金集中分佈在此區間內,能夠最大限度的吃滿交易費。
- Bid Ask 則更適合那些價格波動非常大的池子。人們總是傾向於在這種池子中進行更多的套利交易,價格可能很難集中在某一小段範圍內。這種策略通常需要LP 經常調整自己的部位,來避免價格脫離自己所設定的資金範圍。由於涉及到對市場的判斷力,這通常並不容易。
總結
AMM 作為Web3 金融領域的重要組成部分,透過其獨特的機制和創新,推動去中心化金融的普及和發展。隨著科技的不斷進步和生態系統的完善,AMM 預計在未來發揮更大的作用,進一步改變傳統金融的格局。
