ERC7540:异步ERC4626金库

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

ERC7540:异步ERC4626金库
一键发币: 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 存款

  1. 存款请求: 用户调用 depositRequest(),将资产转入金库并排队。 - 待处理 状态
  2. 事件发出: 金库发出 DepositRequested()
  3. 完成存款: 金库处理请求。 — 可领取 状态
  4. 存款: 用户调用 depositmint 并获得份额或代币。 - 已领取 状态

生命周期:

4.2 赎回

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

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翻译整理,转载请标明出处

免责声明:本站资源仅用于学习目的,也不应被视为投资建议,读者在采取任何行动之前应自行研究并对自己的决定承担全部责任。