---
# System prepended metadata

title: Enzyme Protocol v2 架構

---

# Enzyme Protocol v2 架構
https://docs.enzyme.finance/architecture/persistent-architecture


v2核心目標：
可持續升級的基金平台

---

- 永久架構
    - 永久持續的架構,不會因為版本不同而更改
    - 合約
        - Dispatcher
        - VaultProxy
- 版本架構
    - Core
    - Extensions
    - Plugins
    - Infrastructure
    - Interfaces

---

## 永久架構

基金必須擁有的：
- token balances
- 投資者部份
- 存取控制

---

## VaultProxy
可升級的合約 EIP-1822 proxy pattern
VaultProxy指定並且使用VaultLib中的邏輯
VaultLib會在每次升級重新部署,並且在migration時替換

### VaultLibBaseCore 
VaultLibBaseCore 合約定義VaultProxy必須有的狀態和邏輯
- ERC20 整合 (SharesTokenBase)
- 能被 Dispatcher 呼叫的函式(使用 IProxiableVault)
- 核心控制角色
    - owner (基金擁有者) - 一般使用者
    - accessor (optional 讓非基金擁有者能migrate基金) - 官方
    - creator (Dispatcher 合約,唯一角色能夠更新accessor 和 vaultLib 值) - 官方
    - migrator

VaultLibBaseCore 可被延伸, 加入 VaultLibBaseN(繼承)
```
abstract contract VaultLibBase1 is VaultLibBaseCore

//
abstract contract VaultLibBase2 is VaultLibBase1
```

發布版本會提供VaultLib(由最新的VaultLibBaseN延伸)

---

## Dispatcher

Dispatcher不可更新的合約

功能：
- 部署新的VaultProxy
- migrate VaultProxy從舊版本到新版本
- 維持全局狀態
    - 版本
    - Enzyme Council
    - symbol value for fund shares tokens

Dispatcher 儲存 currentFundDeployer(對負責部署和遷移資金的最新版本合約的通用引用),只有一個msg.sender可以使用此功能來部署或migrate VaultProxy

---

## 版本架構

### Core
#### FundDeployer
使用者創建基金和標注migration(升級基金)
FundDeployer部署 配置合約(ComptrollerProxy)給每一個基金,連結到 VaultProxy 實體

機制：
當releaseStatus設定為Paused,所有對VaultProxy寫入的功能會被禁止 -> 當bug出現時能即時保護合約

#### ComptrollerProxy
每個基金創立時候會部署一個ComptrollerProxy合約(儲存版本配置)
所有對VaultProxy進行的狀態改變(持有,份額狀態),必須經過ComptrollerProxy

### VaultLib
“VaultLib”合約包含附加到此版本的“VaultProxy”實例的存儲佈局、事件簽名和邏輯。
該版本有 1 個共享的“VaultLib”。

---

## 擴展 Extension
擴展通過添加額外種類的功能來擴展核心合約的邏輯。
它們是半信任的，因為它們被有選擇地授予對“VaultProxy”實例的狀態更改調用的訪問權限。
為了進行這樣的狀態改變調用，必須滿足兩個條件：
1. 擴展功能必須已被`ComptrollerProxy`通過帶有`allowsPermissionedVaultAction`修飾符的函數調用，該修飾符打開調用`ComptrollerProxy`到`VaultProxy`的狀態變化。
2. 狀態改變調用必須通過`ComptrollerProxy`回傳，並委託給`PermissionedVaultActionLib`來確定是否允許調用Extension執行這樣的動作。
這種範式確保擴展只能對“VaultProxy”執行狀態更改操作，前提是它被“VaultProxy”的相應“ComptrollerProxy”調用，並且如果擴展被允許進行此類更改。
雖然這對於當前版本來說似乎有點矯枉過正，其中擴展都是受信任和審計的，但它減少了審計表面積（例如，`PolicyManager` 沒有允許的操作）並為後續版本打開大門，以允許任意擴展。
在此版本中，共有三個擴展。所有基金每個擴展共享一份合同。

### 集成管理器
`IntegrationManager` 允許通過 DeFi 協議（例如 Uniswap、Kyber、Compound、Chai）的“適配器”將基金資產交換為其他資產。
它以幾乎不受信任的方式處理這些適配器插件（它確實依賴適配器根據用戶輸入報告預期花費和接收的資產），根據預期值驗證花費和接收的資產價值，並為政策實施提供機會在資產交換之前和之後運行的鉤子(hooks)。

### 策略管理器
`PolicyManager` 允許通過“策略”進行狀態驗證，這些策略實現了在購買股份和在 `IntegrationManager` 中進行交換時調用的鉤子
策略中不涉及信任，因為“PolicyManager”無法訪問更改狀態的保險庫操作。

### 費用管理器
“費用管理器”允許“費用”根據其內部邏輯來決定基金份額的鑄造、銷毀或轉讓。
與 `PolicyManager` 一樣，`FeeManager` 在核心邏輯的不同點調用鉤子，即在購買份額、贖回份額時，以及在特定函數上調用“持續”鉤子（例如，對於每增長一次的 `ManagementFee`堵塞）。

## 插件
上面的每個擴展都使用插件。 `IntegrationManager` 使用“適配器”，`PolicyManager` 使用“策略”，而 `FeeManager` 使用“費用”。
允許的插件都在其各自的擴展中的註冊表中定義。
與擴展一樣，後續版本的計劃是為第三方開發開放這些插件。

### 基礎設施 Infrastructure
除了“核心”和“擴展”發布級合約，還有完全解耦的“基礎設施”合約，理論上可以在發布之間循環使用。目前，該類別僅包含與資產價格和價值相關的合約，但它也可以包含諸如即將發布的將實施協議費用的合約。
#### 值解釋器(ValueInterpreter)
ValueInterpreter 是各種價格饋送的單一聚合點，用於根據輸出資產計算一個或多個輸入資產金額的價值。
此版本中有兩類資產：
- 基礎資產(primitives) —— 有直接利率的資產，用於將一種基礎資產轉換為任何其他基礎資產（例如，WETH、MLN 等）
- 衍生資產(derivatives) —— 用機率構成的資產（例如 Chai、Compound cTokens、Uniswap 池代幣等）
ValueInterpreter 決定資產是原始資產還是衍生資產，並執行邏輯以使用相應的價格饋送來確定輸出資產的價值。
此版本中的每個類別只有一個受支持的價格饋送，因此兩者都被硬編碼為不可變變量。

#### 基礎資產價格資料 ChainlinkPriceFeed (IPrimitivePriceFeed)
ChainlinkPriceFeed 提供基礎資產之間的所有轉換。該提要向其 Chainlink 聚合器註冊資產，從而定義發布的原始資產領域。

#### 聚合衍生資產價格資料(AggregatedDerivativePriceFeed) 
AggregatedDerivativePriceFeed 作為一個中央註冊表，將衍生品映射到相應的價格源，並從中獲取匯率。
有幾個單獨的價格饋送提供衍生品對其標的資產的實際匯率。每個都繼承了 IDerivativePriceFeed 來為 AggregatedDerivativePriceFeed 提供一個標準接口來註冊衍生映射和抓取率。例如，CompoundPriceFeed、ChaiPriceFeed

#### 界面(接口) Interface
外部合約的所有接口都包含在 release/interfaces/ 目錄中。
內部合約的接口（例如 IFundDeployer ）保存在它們所引用的合約旁邊。這些是窄接口，僅包含其他非插件、發布級合約（即上面“核心”和“擴展”部分中的那些）所需的功能。這個想法是對合約之間交互的內部發布表面積有一個方便的視覺參考。