跳至主要內容
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 重新用作申領函式。新的 requestDepositrequestRedeem 函式負責處理初始請求步驟。

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

Request lifecycle: Pending, Claimable, Claimed

存款請求流程

requestDeposit

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

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

pendingDepositRequest

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

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

claimableDepositRequest

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

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

申領存款

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

贖回請求流程

requestRedeem

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

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

pendingRedeemRequest

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

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

claimableRedeemRequest

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

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

申領贖回

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

操作員管理

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
)

預覽函式

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

延伸閱讀