ERC7540 - 异步 ERC4626 金库

本文介绍了 ERC7540 标准,它是在 ERC4626 vault 标准基础上引入的异步执行层,通过引入请求(request)机制,将 deposits 和 withdraws 拆分为 request, fulfill, claim 三个阶段,从而解决异步处理的问题,例如 Centrifuge 协议处理异步存取款的场景,同时介绍了其核心概念、接口、实现工作流程以及应用案例。

ERC7540 — 异步 ERC4626 金库

介绍

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,将他们的份额排队等待未来资产赎回。

每个请求都经历以下生命周期阶段:

  • 待处理:请求已提交并等待处理。
  • 可声明:请求已处理完毕,用户可以声明。
  • 已声明:用户已声明了请求产生的资产或份额。

角色:

  • operator: 负责处理排队请求的授权实体。
  • Controller: 用户

其他:

  • RequestId: 所有请求都通过 requestId 来区分。
  • 具有相同 requestId 的请求是同质的(份额和资产之间具有相同的汇率)
  • 具有不同 RequestId 的请求是完全独立的
  • 对于具有不同 RequestId 的请求,没有处理顺序要求

核心接口

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 由不同的项目定义

实现工作流程

基于 参考实现

  • 工作流程
  1. 存款请求:用户调用 depositRequest(),将资产转移到金库并对金额进行排队。 - 待处理 状态
  2. 事件发出:金库发出 DepositRequested()
  3. 完成存款:金库处理请求。— 可声明状态
  4. 存款:用户调用 depositmint,如果存在,则获取份额或代币。 - 已声明状态

  • 生命周期

赎回

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

应用

以 Lagoon 为例:

官方网站:https://app.lagoon.finance/

  1. 金库支持多代币
  2. Lagoon 采用 ERC20 作为份额代币。
  3. 收益来源。Lagoon 策略侧重于链上协议(策略包括在 DEX 上进行 LP,在货币市场上借出资产,利用固定收益协议进行 LP 或获得固定利率,购买脱钩资产并使用赎回来进行 LRT/LST。)

架构

  • 金库。管理底层资产的储蓄、取款和会计核算的智能合约
  • 预言机。负责计算和更新金库的总价值
  • 管理员。在支持的链上部署金库。

工作流程

实现细节

存款流程

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 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
blockmagnates
blockmagnates
江湖只有他的大名,没有他的介绍。