之前一直不知道 PancakeSwap Infinity 是個啥,今天靜下心來好好的閱讀一下文檔,以下均爲個人理解
▰▰▰▰▰▰
V2/V3 協議已經好多年,相信大家已經非常熟悉了,而 Infinity (可認爲是 V4) 相比之前更加具有靈活性、開放性,有三大特色
單例架構 - 所有流動性池子都在一個合約 Vault 中,是一個大型金庫
閃電記賬 - 利用 EIP-1153 特性先計算後結賬,多跳交易也有獨特的優勢,還省 Gas
HOOK - 在整個池子的生平週期(即池初始化、交換、添加流動性、移除流動性等),可增加自定義功能,比如你是某某會員就可以給你低 fee
▰▰▰▰▰▰
那麼在交易的過程中與 V2/V3 有什麼區別呢?
V2/V3 像是一臺**自動售貨機**:你投幣,機器掉商品,必須即時兩清
Infinity 像是一個**擁有超級賬本的銀行**:你進門(Lock),在裏面可以存錢、取錢、換匯,哪怕中間過程資金流轉了一萬次,銀行只記賬。在當你出門時(Unlock),進行結算你的賬戶餘額是不是平了
▰▰▰▰▰▰
詳細筆記
接下來就是對文檔的解讀筆記,也是更加深入的學習 (代碼前邏輯向)
▰▰
會計層 & Vault 金庫
這個協議的核心就是 Vault,所有 Pool 都在這個金庫合約中,通過 “先記賬後結算” 的方式,如果是多跳交易(Hop 1 -> Hop 2 -> Hop 3),中間過程不需要實際轉移代幣,只需要最後轉賬結算淨差額即可,大大節省了 Gas
交易的流程步驟爲:vault.lock() 從金庫獲得鎖,金庫會以 lockAcquired(……) 回調 (類似 V2/V3 的閃電貸回調),接下來你可以將所有需要的過程如 Swap、modifyLiquidity改變流動性的操作在這裏面進行,最後通過take(), settle(), mint() or burn() 這四種方法一種來與保險庫覈對最終餘額
其中 BalanceDelta 這個 delta 就像就像一張賬單,記錄了你欠 Pool 多少錢,或者 Pool 欠你多少錢,根據 delta 的正負來決定資金流向,delta.amount0() > 0 或 delta.amount0() < 0 中來進行你的操作
通常大於 0 意味着協議欠了你代幣,你可以 vault.take 拿走代幣,或者可以 mint 存入金庫以及 clear 清除餘額差額 (歸歸歸歸歸零) 一般 gas 成本超過 erc20 價值時才使用此功能
小於 0 那就是你欠池子代幣,你需要通過 vault.sync(…) 同步狀態,然後將代幣轉移至金庫,最後使用 settle() 結賬,讓金庫或者說會計來比較代幣餘額進行結算。
這個過程好比去山姆超市,你刷會員進入了超市,選擇了牛奶、牛肉、牛鞭,你已經開始欠了超市欠,最後你走到收銀臺進行覈算,轉賬支付,最後進行收款覈銷。
官網示例代碼

▰▰
PoolManager 池管理
如果說 Vault 是一個**巨型金庫(負責資金託管)**,那麼 PoolManager 就是管理金庫規則和計算所有交易結果的**中央處理器(負責業務邏輯)**。
PoolManager 也是一個單例合約,Infinity 這次有兩種 AMM 邏輯,CLPoolManager 和 BinPoolManager
- CLPoolManager 就是之前 V3 的集中流動性,大家也非常熟悉了,有 Tick、sqrtPriceX96 等一系列概念
- BinPoolManager 就是目前非常熱門的流動性賬本 Liquidity Book 類型了,它非常類似於 V3 的集中流動性,但是將流動性分配到不同的離散的 Bins 中,每個分檔被分配一個固定的價格。流動性提供者可以向一個或多個分檔提供流動性。
官網有一個很好的圖來解釋這個

雖然有兩個不同的邏輯,但是在 Infinity 中,所有池將被封裝在一個 PoolManager 合約中(CL Bin 兩個合約地址),其中:
PoolKey 是一個結構體,描述每個池
PoolId 是一個 bytes32 類型值,從 PoolKey 派生出 PoolId
Initializing 用來初始化池子
包括所有主要的流動性事件如 swap、modifyLiquidities 等都在這個合約中進行
▰▰
Infinity Universal Router 和 Permit2
官網還說明了高效的 Infinity Universal Router 和 Permit 2,它可以快速的授權以及在 v2、v3、
Infinity 進行交換流程,感興趣的可以單獨去研究文檔哈
| Vault | 0x238a358808379702088667322f80aC48bAd5e6c4 |
| CLPoolManager | 0xa0FfB9c1CE1Fe56963B0321B32E7A0302114058b |
| BinPoolManager | 0xC697d2898e0D09264376196696c51D7aBbbAA4a9 |
| CLPositionManager | 0x55f4c8abA71A1e923edC303eb4fEfF14608cC226 |
| CLQuoter | 0xd0737C9762912dD34c3271197E362Aa736Df0926 |
| BinQuoter | 0xC631f4B0Fc2Dd68AD45f74B2942628db117dD359 |
| MixedQuoter | 0x2dCbF7B985c8C5C931818e4E107bAe8aaC8dAB7C |

