ERC7540:异步ERC4626金库
ERC7540基于ERC4626金库标准引入了一个异步执行层。由一个RWA项目——Centrifuge协议开发,该协议需要处理异步存款/取款。

一键发币: Aptos | X Layer | SUI | SOL | BNB | ETH | BASE | ARB | OP | Polygon | Avalanche | 用AI学区块链开发
ERC7540基于ERC4626金库标准引入了一个异步执行层。由一个RWA项目——Centrifuge协议开发,该协议需要处理异步存款/取款。
他们的系统首先使用自己的Centrifuge链来处理存款/取款请求,然后将消息传回以太坊,创建请求的用户会收到他们的份额代币(tranche代币)。这个过程的异步性质需要额外的保障措施,以确保 用户在请求被Centrifuge链处理之前不会立即收到代币。
1、回顾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);Ï
2、核心概念和接口
与ERC-4626不同,ERC-7540引入了基于请求的系统:
- 存款请求: 用户提交
depositRequest
,将资产排队等待以后处理。 - 赎回请求: 用户提交
redeemRequest
,将份额排队等待以后兑换资产。
每个请求都会经历以下生命周期阶段:
- 待处理: 请求已提交,等待处理。
- 可领取: 请求已处理,准备让用户领取。
- 已领取: 用户已领取请求所产生的资产或份额。
角色:
- operator: 被授权处理排队请求的实体。
- Controller: 用户
其他:
- RequestId: 所有请求都通过 requestId 进行区分。
- 具有相同 requestId 的请求是可互换的(份额和资产之间的汇率相同)
- 具有不同 RequestIds 的请求是完全独立的
- 不同 RequestIds 的请求没有处理顺序要求
3、核心接口
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 由不同的项目定义
4、实现流程
基于 参考实现
4.1 存款
- 存款请求: 用户调用
depositRequest()
,将资产转入金库并排队。 - 待处理 状态 - 事件发出: 金库发出
DepositRequested()
- 完成存款: 金库处理请求。 — 可领取 状态
- 存款: 用户调用
deposit
或mint
并获得份额或代币。 - 已领取 状态

生命周期:

4.2 赎回
- 工作流程
- 赎回请求: 用户调用
redeemRequest()
,将份额代币转入金库 - 待处理 状态 - 事件发出: 金库发出
RedeemRequested()
- 完成赎回: 金库处理赎回请求。 — 可领取 状态
- 赎回: 用户调用
redeem
或withdraw
并获得资产。 - 已领取 状态

5、应用
以 Lagoon 为例:
- 金库支持多种代币
- Lagon 使用 ERC20 作为份额代币。
- 收益来源。Lagoon 策略专注于链上协议(策略包括 DEX 上的 LP、在资金市场中借贷资产、利用固定收益协议进行 LP 或获取固定利率、购买脱钩资产并使用赎回用于 LRT/LST。)
5.1 架构

- Vault。管理存款、取款和底层资产会计的智能合约
- Oracle。负责计算和更新金库的总价值
- Curator。在支持的链上部署金库。
5.2 工作流程


6、实现细节
存款流程
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(领取)
原文链接:ERC7540 — Asynchronous ERC4626 Vault
DefiPlot翻译整理,转载请标明出处
免责声明:本站资源仅用于学习目的,也不应被视为投资建议,读者在采取任何行动之前应自行研究并对自己的决定承担全部责任。