ERC-4626:Vault Token 标准详解

本文介绍了 Vault 的概念,以及 Tokenised Vaults 的概念。

什么是 Vault

Vault 是一种智能合约,允许用户存入 token 并收到 shares 作为回报。vault 的所有者通过将 token 投资于 DeFi 协议来产生收益,从而管理运营。

在区块链中,vault 就像一个 储蓄账户保险箱,因为它确保资产受到保护,类似于 Open Zeppelin 安全标准,这对任何 ERC-4626 tokenized vault 来说至关重要,你可以在其中存储资产,但具有一些额外的好处。在传统的储蓄账户中,当你存钱时,银行可能会随着时间的推移给你利息,但在 DeFi 生态系统中,你以 vault token 的形式获得回报。同样,在区块链 vault 中,你存入 token(如加密资产),这些 token 的价值可能会增长或产生奖励(如利息或收益),如 ERC-4626 tokenized vault 标准所定义。

然而,与银行不同的是,当你存入 vault 时,你会收到可以增值的 vault token。作为回报,你会得到 vault 的 shares。这些 shares 代表你在 vault 中的所有权。

现实世界的类比

想象一下,vault 就像一个 仓库,用于存储 葡萄酒桶,可以被认为是支持 DeFi 生态系统中流动性的有形资产。它是这样运作的:

  • 你和其他人可以将葡萄酒存入 tokenized vault。
  • 仓库不会仅仅跟踪谁的酒在哪里,而是会给你 token 或 shares,按照 ERC-4626 tokenized vault 标准发行,代表你存储的葡萄酒的数量。
  • 随着时间的推移,仓库里的葡萄酒会随着时间的推移变得更有价值,就像 DeFi 应用程序中的流动性会增值一样。你持有的 shares 也会增值,因为它们代表的葡萄酒现在更有价值。
  • 当你想取出一些葡萄酒时,你可以交还一些 shares,仓库会给你这些 shares 当时价值的葡萄酒数量,类似于 DeFi 生态系统中流动性的管理方式。

什么是 Tokenised Vaults?

tokenised vault 是一种 vault,其中 vault 内资产的所有权由 token 表示。当用户将资产存入 vault 时,会向他们发放这些 token,它们代表 vault 总价值的一部分,如 erc-4626 标准所定义。

  • Tokenised:意味着 vault 资产的所有权由 token 表示,符合 ERC-4626 tokenized vault 标准。
  • Vault:是一个池或容器,用于存放加密货币或 token 等资产,这些资产可能会产生利息、奖励或某种收益。

本质上,当你将资产存入 vault 时,你会收到 token 作为回报,这些 token 代表你在 vault 中的份额。这些 token 反映了你投入 vault 的价值以及 vault 随着时间的推移可能获得的任何额外收益(利息、奖励等)。

Tokenised Vaults 的真实世界类比

想象一下一个 金库,你和其他人可以在其中存放金条。vault 不会给你实际的金条所有权证明,而是给你 黄金 token。这些 token 代表你在 vault 总黄金供应量中的份额,作为 ERC-4626 tokenized vault 上下文中的 vault token。如果 vault 找到更多的黄金或黄金价值增加,你的 token 就会变得更有价值。稍后,当你决定提取时,你可以用这些 token 兑换等量的黄金(或其价值)。

ERC-4626 背景

在 DeFi(去中心化金融)领域,有许多不同类型的 token,每种 token 都有自己的一套规则和工作方式。这种多样性对于试图构建 DeFi 应用程序的开发人员来说可能具有挑战性,例如你可以在其中使用许多不同 token 的平台。

例如,当开发人员创建一个需要处理来自各种 DeFi 协议(如 Compound 或 Aave)的多种类型 token 的应用程序时,他们必须进行大量研究。他们需要了解每种 token 的工作原理,特别是人们如何从中赚钱,因为这些信息必须被编程到应用程序中。

在 ERC-4626 之前,没有针对借贷、staking 和 yield farming vault 的标准化。每个在其应用程序中实现 vault 功能的协议都使用自己的方法和策略来创建 vault,遵循 vault 标准。vault 没有标准化,这导致了时间和开发资源的浪费,突出了对 ERC-4626 tokenized vault 标准的需求。每个协议都有自己的接口、自己的适配器和自己的策略来创建 vault。

为了解决上述问题,ERC-4626 提出了“具有单个底层 EIP-20 token 的 Tokenised Vaults”的想法,它是 ERC-20 token 的扩展,你也可以存入和取出你的 token,并且随着时间的推移,你的存款资产也会获得收益。

让我们深入研究 ERC-4626

什么是 ERC-4626?

ERC-4626 是去中心化金融 (DeFi) 中 tokenized vault 的标准,它利用以太坊区块链进行流动性和资产管理。它是一组特定的规则或指南,用于规范 vault 的行为方式,以便它们在去中心化的世界中具有可预测性且易于交互。

ERC-4626 构建于 ERC-20 之上,ERC-4626 标准为 yield-bearing token 引入了新功能。它本质上扩展了 ERC-20 token 标准以创建 tokenized vault。在 ERC-4626 vault 中,当你存入资产时收到的 token(称为 vault token)代表你在 vault 中的股份。vault shares) 是 ERC-20 token。这意味着这些 vault share token 可以像其他 ERC-20 token 一样使用(你可以交易它们、转移它们或在其他 DeFi 应用程序中使用它们)。

ERC-4626 的工作原理

  • 你将 ERC20 token(资产)存入 vault
  • 你得到 ERC-4626 token(vault shares)作为回报,这些 token 符合 ERC-20 标准。
  • vault 产生收益:随着时间的推移,vault 会获得奖励,类似于你的储蓄账户可能赚取利息的方式。
  • 随着 tokenized vault 中资产的增值,你的 shares 价值也会增长。:随着 vault 中资产价值的增长,你的 shares 也会增长,因为它们代表了该 yield-bearing vault 的一部分。
  • 你可以随时从 vault 中提取你的 yield-bearing token。:当你准备好时,你交还你的 shares 并提取你最初的 token(加上任何赚取的额外收益)。
  • 计算收益的公式因资产类型和收益类型而异。一个常见的公式是将收入除以投资价值,然后乘以 100 以获得百分比数字。

ERC-4626 包含不同的函数和事件,让我们逐一讨论它们

函数:

  • asset
function asset() public view returns (address assetTokenAddress)
/*
此函数返回用于 vault 的底层 token 的地址,
用于记账、存入和提取。
*/ // 此注释是 ERC-4626 标准文档的一部分。
  • totalAssets:
function totalAssets() public view returns (uint256)
//此函数返回存储到 vault 中的总资产。
  • convertToShares
function convertToShares(uint256 assets) public view returns (uint256 shares)
/*
将给定数量的资产转换为等效数量的 shares。
用例:了解将为某个资产存款铸造多少 shares。
*/
  • convertToAssets
function convertToAssets(uint256 shares) public view returns (uint256 assets) /* 根据 ERC-4626 tokenized vault 中定义的汇率,将给定数量的 shares 转换为等效数量的资产。 */
用例:了解在赎回一定数量的 shares 时将收到多少资产。
*/
  • deposit
function deposit(uint256 assets, address receiver) public returns (uint256 shares)
/*
将一定数量的资产存入 vault,并将等效数量的 vault shares 给予接收者。
返回:为存款铸造的 shares 数量。
必须发出 Deposit 事件才能符合 ERC-4626 标准。
必须支持 EIP-20 approve/transferFrom 作为存款流程中的资产。 MAY 支持额外的流程,其中底层 token 在存款执行之前由 Vault 合约拥有,并在存款期间进行核算。
如果所有资产都无法存入(由于达到存款上限、滑点、用户未批准足够的基础 token 给 Vault 合约等),则必须恢复。
请注意,大多数实现都需要预先批准 Vault 与 Vault 的底层资产 token。
*/
  • maxDeposit
function maxDeposit(address receiver) public view returns (uint256 maxAssets)
/*
返回 vault 允许为接收者地址存入的最大资产数量。
*/
  • previewDeposit
function previewDeposit(uint256 assets) public view returns (uint256 shares)
/*
如果存入特定数量的资产,则提供将铸造的 shares 数量的估计值。
*/
  • mint
function mint(uint256 shares, address receiver) public returns (uint256 assets)
/*
为接收者铸造特定数量的 shares,并将等效数量的资产存入 vault。
返回:铸造过程所需的资产数量。
必须发出 Deposit 事件。
必须支持 EIP-20 approve / transferFrom 作为铸造流程中的资产。 MAY 支持额外的流程,其中底层 token 在铸造执行之前由 Vault 合约拥有,并在铸造期间进行核算。
如果无法铸造所有 shares(由于达到存款上限、滑点、用户未批准足够的基础 token 给 Vault 合约等),则必须恢复,从而确保符合 ERC-20 标准和 ERC-4626 tokenized vault 标准。
请注意,大多数实现都需要预先批准 Vault 与 Vault 的底层资产 token。
*/
  • maxMint // 此函数对于管理 erc-4626 标准中的 yield-bearing token 至关重要。
function maxMint(address receiver) public view returns (uint256 maxShares)
/*
返回可以为接收者铸造的最大 shares 数量。
用例:检查可以为给定地址铸造多少 shares。
*/
  • previewMint
function previewMint(uint256 shares) public view returns (uint256 assets) // 提供铸造特定数量的 yield-bearing token 所需的资产数量的估计值。
返回:根据 ERC-4626 tokenized vault 标准,你需要提供以铸造指定数量的 shares 的资产数量。
用例:在铸造特定数量的 shares 之前,你可以使用此方法在 ERC-4626 tokenized vault 的上下文中检查你需要提供多少资产。
*/
  • withdraw
function withdraw(uint256 assets, address receiver, address owner) public returns (uint256 shares)
/*
从 vault 中提取一定数量的资产,并从所有者处销毁等效数量的 shares,并将资产发送给接收者。
返回:为提款而销毁的 shares 数量,可以通过以太坊生态系统中的 API 自动执行。
必须发出 Withdraw 事件。
必须支持从所有者处直接销毁 shares 的提款流程,其中所有者是 msg.sender。
必须支持从所有者处直接销毁 shares 的提款流程,其中 msg.sender 具有对所有者 shares 的 EIP-20 批准。
MAY 支持额外的流程,其中 shares 在提款执行之前转移到 Vault 合约,并在提款期间进行核算,从而增强流动性管理流程。
应该检查 msg.sender 是否可以花费所有者的资金,资产需要转换为 shares,并且应检查 shares 的 allowance。
如果无法提取所有资产(由于达到提款上限、滑点、所有者没有足够的 shares 等),则必须恢复。
请注意,某些实现可能需要在执行提款之前预先请求 Vault。这些方法应单独执行。
*/
  • maxWithdraw:此函数是 ERC-4626 tokenized vault 标准的一部分。
function maxWithdraw(address owner) public view returns (uint256 maxAssets) /* 根据 ERC-4626 tokenized vault 标准,返回可以为所有者提取的最大资产数量。 */
用例:查看所有者可以提取 vault 多少资产。
*/
  • PreviewWithdraw
function previewWithdraw(uint256 assets) public view returns (uint256 shares)
/*
提供如果提取特定数量的资产将销毁的 shares 数量的估计值
返回:将销毁以支付提款的 shares 数量。
用例:在提取资产之前,你可以使用此方法查看将销毁多少 shares 以赎回请求的资产数量。
*/
  • redeem
function redeem(uint256 shares, address receiver, address owner) public returns (uint256 assets)
/*
从所有者处销毁特定数量的 shares,并将 vault 中的相应数量的资产发送给接收者。
返回:为给定数量的 shares 赎回的资产数量。
必须发出 Withdraw 事件。
必须支持从所有者处直接销毁 shares 的赎回流程,其中所有者是 msg.sender。
必须支持从所有者处直接销毁 shares 的赎回流程,其中 msg.sender 具有对所有者 shares 的 EIP-20 批准。
MAY 支持额外的流程,其中 shares 在赎回执行之前转移到 Vault 合约,并在赎回期间进行核算。
应该检查 msg.sender 是否使用 allowance 花费所有者的资金,是否符合 ERC-4626 tokenized vault 标准。
如果无法赎回所有 shares(由于达到提款上限、滑点、所有者没有足够的 shares 等),则必须恢复,这符合 ERC-4626 tokenized vault 标准的要求。
请注意,某些实现可能需要在执行提款之前预先请求 Vault。这些方法应单独执行。
*/
  • maxRedeem
function maxRedeem(address owner) public view returns (uint256 maxShares)
/*
返回所有者可以赎回的最大 shares 数量。
用例:检查可以从 vault 中为给定地址赎回多少 shares。
*/
  • previewRedeem
function previewRedeem(uint256 shares) public view returns (uint256 assets)
/*
提供如果你赎回特定数量的 shares 将收到的资产数量的估计值。
返回:你将为指定数量的 shares 收到的资产数量。
用例:在赎回一定数量的 shares 之前,你可以使用此方法查看你将获得多少资产作为回报。
*/

事件:

  • Deposit
event Deposit(
address indexed sender,
address indexed owner,
uint256 assets,
uint256 shares
)
  • Withdraw
event Withdraw(
address indexed sender,
address indexed receiver,
address indexed owner,
uint256 assets,
uint256 shares
)

  • 原文链接: blog.blockmagnates.com/e...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 1
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
blockmagnates
blockmagnates
The New Crypto Publication on The Block