本文介绍了 Vault 的概念,以及 Tokenised Vaults 的概念。
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 生态系统中流动性的有形资产。它是这样运作的:
tokenised vault 是一种 vault,其中 vault 内资产的所有权由 token 表示。当用户将资产存入 vault 时,会向他们发放这些 token,它们代表 vault 总价值的一部分,如 erc-4626 标准所定义。
本质上,当你将资产存入 vault 时,你会收到 token 作为回报,这些 token 代表你在 vault 中的份额。这些 token 反映了你投入 vault 的价值以及 vault 随着时间的推移可能获得的任何额外收益(利息、奖励等)。
想象一下一个 金库,你和其他人可以在其中存放金条。vault 不会给你实际的金条所有权证明,而是给你 黄金 token。这些 token 代表你在 vault 总黄金供应量中的份额,作为 ERC-4626 tokenized vault 上下文中的 vault token。如果 vault 找到更多的黄金或黄金价值增加,你的 token 就会变得更有价值。稍后,当你决定提取时,你可以用这些 token 兑换等量的黄金(或其价值)。
在 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 是去中心化金融 (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 包含不同的函数和事件,让我们逐一讨论它们
function asset() public view returns (address assetTokenAddress)
/*
此函数返回用于 vault 的底层 token 的地址,
用于记账、存入和提取。
*/ // 此注释是 ERC-4626 标准文档的一部分。
function totalAssets() public view returns (uint256)
//此函数返回存储到 vault 中的总资产。
function convertToShares(uint256 assets) public view returns (uint256 shares)
/*
将给定数量的资产转换为等效数量的 shares。
用例:了解将为某个资产存款铸造多少 shares。
*/
function convertToAssets(uint256 shares) public view returns (uint256 assets) /* 根据 ERC-4626 tokenized vault 中定义的汇率,将给定数量的 shares 转换为等效数量的资产。 */
用例:了解在赎回一定数量的 shares 时将收到多少资产。
*/
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。
*/
function maxDeposit(address receiver) public view returns (uint256 maxAssets)
/*
返回 vault 允许为接收者地址存入的最大资产数量。
*/
function previewDeposit(uint256 assets) public view returns (uint256 shares)
/*
如果存入特定数量的资产,则提供将铸造的 shares 数量的估计值。
*/
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。
*/
function maxMint(address receiver) public view returns (uint256 maxShares)
/*
返回可以为接收者铸造的最大 shares 数量。
用例:检查可以为给定地址铸造多少 shares。
*/
function previewMint(uint256 shares) public view returns (uint256 assets) // 提供铸造特定数量的 yield-bearing token 所需的资产数量的估计值。
返回:根据 ERC-4626 tokenized vault 标准,你需要提供以铸造指定数量的 shares 的资产数量。
用例:在铸造特定数量的 shares 之前,你可以使用此方法在 ERC-4626 tokenized vault 的上下文中检查你需要提供多少资产。
*/
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。这些方法应单独执行。
*/
function maxWithdraw(address owner) public view returns (uint256 maxAssets) /* 根据 ERC-4626 tokenized vault 标准,返回可以为所有者提取的最大资产数量。 */
用例:查看所有者可以提取 vault 多少资产。
*/
function previewWithdraw(uint256 assets) public view returns (uint256 shares)
/*
提供如果提取特定数量的资产将销毁的 shares 数量的估计值
返回:将销毁以支付提款的 shares 数量。
用例:在提取资产之前,你可以使用此方法查看将销毁多少 shares 以赎回请求的资产数量。
*/
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。这些方法应单独执行。
*/
function maxRedeem(address owner) public view returns (uint256 maxShares)
/*
返回所有者可以赎回的最大 shares 数量。
用例:检查可以从 vault 中为给定地址赎回多少 shares。
*/
function previewRedeem(uint256 shares) public view returns (uint256 assets)
/*
提供如果你赎回特定数量的 shares 将收到的资产数量的估计值。
返回:你将为指定数量的 shares 收到的资产数量。
用例:在赎回一定数量的 shares 之前,你可以使用此方法查看你将获得多少资产作为回报。
*/
event Deposit(
address indexed sender,
address indexed owner,
uint256 assets,
uint256 shares
)
event Withdraw(
address indexed sender,
address indexed receiver,
address indexed owner,
uint256 assets,
uint256 shares
)
- 原文链接: blog.blockmagnates.com/e...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!