跳至主要內容
Change page

ERC-7540 非同步代幣化金庫標準

簡介

ERC-7540 擴充了 ERC-4626 代幣化金庫標準,新增對非同步存款與贖回流程的支援。它引入了「先請求後申領」的模式:使用者首先提交請求(鎖定其資產或份額),然後在金庫處理完畢後申領結果。

當金庫無法在單筆交易中立即結算時,就需要此功能,例如:

  • 真實世界資產 (RWA) 協定,如代幣化國債、私人信貸以及其他具有 T+1 或 T+2 結算週期的資產
  • 信用評估在鏈下發生的抵押不足借貸
  • 跨鏈金庫策略,其中橋接會引入延遲
  • 具有解除綁定期的流動性質押代幣

金庫可以選擇僅在存款、僅在贖回或兩者皆採用非同步。這種靈活性讓金庫開發者只需在底層策略需要時加入非同步流程,同時保持另一端為同步。

先決條件

為了更了解本頁面,我們建議您先閱讀代幣標準、ERC-20 以及 ERC-4626。

ERC-4626 與 ERC-7540 比較

在 ERC-4626 中,存款是原子化結算的:投資者發送資產並在單筆交易中收回份額。

ERC-4626 synchronous deposit flow

ERC-7540 將此分為兩個步驟。投資者首先呼叫 requestDeposit() 來鎖定資產,然後等待金庫管理者處理請求。一旦完成,投資者呼叫 deposit() 來申領其份額。匯率是在完成時決定的,而不是在請求時。

ERC-7540 asynchronous deposit flow

贖回流程的運作方式相同:requestRedeem() 鎖定份額,一旦完成,投資者呼叫 redeem() 來申領資產。

ERC-7540 函式與功能

ERC-7540 繼承了完整的 ERC-4626 介面,但將 deposit/mint/withdraw/redeem 重新用作申領函式。新的 requestDeposit 和 requestRedeem 函式負責處理初始請求步驟。

每個請求會經歷三個狀態:待處理(已提交,等待處理)、可申領(已完成並定價)以及已申領(投資者已領取其份額或資產)。

Request lifecycle: Pending, Claimable, Claimed

存款請求流程

requestDeposit

function requestDeposit(uint256 assets, address controller, address owner) external returns (uint256 requestId)

將 assets 從 owner 轉帳到金庫並提交存款請求。controller 地址獲得該請求的控制權。回傳一個識別請求批次的 requestId。

pendingDepositRequest

function pendingDepositRequest(uint256 requestId, address controller) external view returns (uint256 assets)

回傳給定 controller 和 requestId 的待處理(尚未可申領)存款請求中的 assets 數量。

claimableDepositRequest

function claimableDepositRequest(uint256 requestId, address controller) external view returns (uint256 assets)

回傳給定 controller 和 requestId 的可申領(已完成但尚未申領)存款請求中的 assets 數量。

申領存款

一旦存款請求變為可申領,使用者即可呼叫標準的 ERC-4626 deposit 或 mint 函式來申領其份額。在 ERC-7540 中,這些函式不再轉帳資產(這在請求時已經發生)。它們只會向接收者鑄造份額。

贖回請求流程

requestRedeem

function requestRedeem(uint256 shares, address controller, address owner) external returns (uint256 requestId)

鎖定來自 owner 的 shares 並提交贖回請求。controller 地址獲得該請求的控制權。

pendingRedeemRequest

function pendingRedeemRequest(uint256 requestId, address controller) external view returns (uint256 shares)

回傳給定 controller 和 requestId 的待處理贖回請求中的 shares 數量。

claimableRedeemRequest

function claimableRedeemRequest(uint256 requestId, address controller) external view returns (uint256 shares)

回傳給定 controller 和 requestId 的可申領贖回請求中的 shares 數量。

申領贖回

一旦贖回請求變為可申領,使用者即可呼叫標準的 ERC-4626 redeem 或 withdraw 函式來申領其資產。

操作員管理

ERC-7540 包含一個操作員模式(來自 ERC-6909 (在新分頁開啟)),允許第三方代表使用者管理請求。

setOperator

function setOperator(address operator, bool approved) external returns (bool)

核准或撤銷 operator 代表 msg.sender 執行存款/贖回請求與申領。

isOperator

function isOperator(address controller, address operator) external view returns (bool)

回傳 operator 是否獲准代表 controller 執行操作。

請求 ID

請求 ID 用於區分不同批次的請求。所有共用相同 requestId 的請求都是同質化的:它們會一起在狀態之間轉換,並獲得相同的匯率。

當金庫對所有請求回傳 requestId = 0 時,只有 controller 地址能區分請求狀態。來自同一控制者的多個請求將被彙總。

事件

DepositRequest 事件

當透過 requestDeposit 提交存款請求時,必須 (MUST) 觸發此事件。

event DepositRequest(
    address indexed controller,
    address indexed owner,
    uint256 indexed requestId,
    address sender,
    uint256 assets
)

RedeemRequest 事件

當透過 requestRedeem 提交贖回請求時,必須 (MUST) 觸發此事件。

event RedeemRequest(
    address indexed controller,
    address indexed owner,
    uint256 indexed requestId,
    address sender,
    uint256 shares
)

OperatorSet 事件

當透過 setOperator 核准或撤銷操作員時,必須 (MUST) 觸發此事件。

event OperatorSet(
    address indexed controller,
    address indexed operator,
    bool approved
)

預覽函式

預覽函式必須僅針對非同步的流程進行回滾,因為在請求完成之前無法得知匯率。在非同步存款金庫中,previewDeposit 和 previewMint 必須 (MUST) 回滾,而 previewRedeem 和 previewWithdraw 則保持與 ERC-4626 中相同的運作方式(對於非同步贖回金庫則反之亦然)。這是與 ERC-4626 的一個關鍵行為差異。

延伸閱讀