本文介绍了 ERC7540 标准,它是在 ERC4626 vault 标准基础上引入的异步执行层,通过引入请求(request)机制,将 deposits 和 withdraws 拆分为 request, fulfill, claim 三个阶段,从而解决异步处理的问题,例如 Centrifuge 协议处理异步存取款的场景,同时介绍了其核心概念、接口、实现工作流程以及应用案例。
ERC7540 引入了一个基于 ERC4626 金库标准的异步执行层。由一个 RWA 项目 —— Centrifuge 协议开发,该协议需要处理异步的存款/取款。
他们的系统使用他们自己的 Centrifuge 链来首先处理存款/取款请求,然后将消息传回以太坊,在那里创建请求的用户收到他们的份额代币(分级代币)。这一过程的异步性质需要额外的保障措施,以便用户不会在他们的请求被 Centrifuge 链处理之前立即收到代币。**
回顾 ERC4626
function deposit(uint256 assets, address receiver) external returns (uint256 shares);
function mint(uint256 shares, address receiver) external returns (uint256 assets);
------------------------------------------------------------------------------------------------------------
function withdraw(
uint256 assets,
address receiver,
address owner
) external returns (uint256 shares);
function redeem(
uint256 shares,
address receiver,
address owner
) external returns (uint256 assets);Ï
与 ERC-4626 中存款和取款立即处理不同,ERC-7540 引入了一个基于请求的系统:
depositRequest
,将他们的资产排队等待未来处理。redeemRequest
,将他们的份额排队等待未来资产赎回。每个请求都经历以下生命周期阶段:
角色:
其他:
function requestDeposit(uint256 assets, address controller, address owner) external returns (uint256 requestId);
function fulfillDeposit(address controller, uint256 assets) external onlyOwner returns (uint256 shares)
function deposit(uint256 assets, address receiver, address controller) external returns (uint256 shares);
------------------------------------------------------------------------------------------------------------
function requestRedeem(uint256 shares, address controller, address owner) external returns (uint256 requestId);
function fulfillRedeem(address controller, uint256 shares) external onlyOwner returns (uint256 assets)
function redeem(uint256 shares, address receiver, address controller) external returns (uint256 asset);
fulfillDeposit 和 fulfillRedeem 由不同的项目定义
基于 参考实现
depositRequest()
,将资产转移到金库并对金额进行排队。 - 待处理 状态DepositRequested()
deposit
或 mint
,如果存在,则获取份额或代币。 - 已声明状态redeemRequest()
,将份额代币转账到金库中 - 待处理 状态RedeemRequested()
redeem
或 withdraw
并获取资产。 - 已声明状态以 Lagoon 为例:
官方网站:https://app.lagoon.finance/
存款流程
Init
$.depositEpochId = 1;
$.redeemEpochId = 2;
lastDepositRequestId[Alice] = 0
epochs[1] = {
settleId: 0,
depositRequest[Alice]: 0
}
settles[1] = {
totalSupply: 0,
totalAssets: 0,
pendingAssets: 0,
pendingShares: 0
}
$.depositSettleId = 1;
$.redeemSettleId = 2;
RequestDeposit
depositEpochId = 1;
lastDepositRequestId[Alice] = 1 //always equal to $.depositEpochId
epochs[1] = {
settleId: 0,
depositRequest[Alice]: 100 USDC
}
UpdateNewTotalAssets
depositEpochId = 3 // +2
depositSettleId = 1
epochs[1] = {
settleId: 1, // $.depositSettleId => epoch[$.depositEpochId].settleId
depositRequest: {
[Alice]: 100
}
}
settles[1] = {
totalSupply: 0,
totalAssets: 0,
pendingAssets: 100,
pendingShares: 0
}
lastDepositRequestId[Alice] = 1 no change
lastDepositEpochIdSettled = 0
$.totalAssets = 100 //100 is newTotalAssets is param
SettleDeposit
_convertShares: at settle level to calculate
depositEpochId = 3 //no change
depositSettleId = 3 // +2
lastDepositEpochIdSettled = 1 // depositEpochId - 2
settles[1] = {
totalSupply: 100000000000000, // 100 * 10^12
totalAssets: 100, // $.totalAssets, set by updateTotalAssets
pendingAssets: 100,
pendingShares: 100000000000000 // 通过convertToShares计算得到的shares数量
}
--------------------------------------------------------------------------------
其他细节
requestDeposit
UpdateNewTotalAssets
之前 : 用户可以随时 requestDeposit
;UpdateNewTotalAssets
之后 和 SettleDeposit
之前 : depositEpochId + 2,这意味着一个新的生命周期开始了,存在一个待处理的结算请求。用户不能执行 requestDeposit
settleDeposit
之后:可以执行 requestDeposit 或 deposit(claim)
- 原文链接: blog.blockmagnates.com/e...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!