ERC-4626 开发实战:一次编写,永续生息的去中心化金库

·

如果你希望仅用十几分钟就在以太坊上部署一个“会生息”的 DeFi 金库,本文将带你完整实践。我们从零开始铸造底层资产代币,再把资产封装成 ERC-4626 代币化金库,实现 存、取、收息 全流程。所有代码均可在线运行,无需额外插件。

核心关键词:ERC-4626、代币化金库、收益聚合器、DeFi 代币标准、以太坊开发、收益凭证、底层资产、智能合约、Yield Farming、OpenZeppelin


实操总览

一条链、两个合约、三步部署、五分钟交互,完成「Money Legos」里的资产收益层。

Step 1:项目骨架预览

在 Remix IDE 新建两个文件:

目录极简,方便读者直接复制粘贴运行。


Step 2:编写底层资产合约 Token.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

contract CovToken is ERC20, Ownable {
    constructor() ERC20("CovToken","CVT") {
        _mint(msg.sender, 200_000 * 10 ** decimals());
    }

    function mint(address to, uint256 amount) external onlyOwner {
        _mint(to, amount);
    }
}

关键点


Step 3:编写 ERC-4626 金库 Vault.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import "@openzeppelin/contracts/token/ERC20/extensions/ERC4626.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";

contract YieldVault is ERC4626, Ownable {
    uint256 public entryFeeBasisPoints; // 费用基点
    address public entryFeeRecipient;

    constructor(
        IERC20 _asset,
        uint256 _entryFeeBasisPoints,
        address _entryFeeRecipient
    ) ERC4626(_asset) ERC20("vCVT","vCovToken") {
        entryFeeBasisPoints = _entryFeeBasisPoints;
        entryFeeRecipient = _entryFeeRecipient;
    }

    /* 费用由 _entryFeeBasisPoints/_entryFeeRecipient 控制 */
    function _entryFeeBasisPoints() internal view override returns (uint256) {
        return entryFeeBasisPoints;
    }
    function _entryFeeRecipient() internal view override returns (address) {
        return entryFeeRecipient;
    }
}

代码解读

  1. 继承

    • ERC4626 为我们预制了 depositmintredeemwithdraw 的全部逻辑
    • 只需重写两个钩子函数就能自定义费用模型
  2. 关键函数

    • afterDeposit():当资产转入金库后,可立即开始生息逻辑
    • beforeWithdraw():在提款前清算收益、扣除费用(示例留空,读者可自行扩展)

Step 4:快速部署与测试

4.1 编译

Remix 左侧点击 “Solidity Compiler”,选择 0.8.20 编译。
若 GitHub 连接失败,可将 OpenZeppelin 下载到本地 node_modules 后手动 import。

4.2 部署流程

  1. 环境选择 Injected Provider-Metamask
  2. 先部署 CovToken,记好合约地址
  3. 再部署 YieldVault,参数

    • _asset:填入刚刚的 CVT 地址
    • _entryFeeBasisPoints:示例 100 = 1%
    • _entryFeeRecipient:填入自身或其他地址

👉 一键体验合约「秒级收益」的魔法时刻


Step 5:存入 & 收取收益凭证 vCVT

5.1 钱包切换

5.2 授权

调用 CVT 合约 approve(vaultAddress, amount),允许金库划转。

5.3 存款

调用 vault deposit(200 * 10 ** decimals(), account2),成功后账户 2 收到 198 vCVT(扣除 1% 费用)。

👉 实时查看年利率与实际收益差距,点击解锁隐藏数据

Step 6:赎回与提款

在测试网中,为了立刻看到收益差异,金库内部可手动调用 afterDeposit() 把额外利息加进去。当用户提币时,就能看到钱包里 CVT > 200 的结果,证明利息已入账。


常见问题 FAQ

1. ERC-4626 与 Yearn 有什么区别?
Yearn 是最大的收益聚合器,其底层 yVault 已升级为 ERC-4626。该标准让不同协议“可互换”,多前端可一键接入任何兼容金库。

2. 为什么手续费会影响兑换率?
previewDeposit 会扣减费用,导致用户拿到的 share 小于理论值,从而抑制一次性大额套利。

3. 借贷协议能不能直接用 ERC-4626?
完全可以,Compound v3、AAVE GHO 均计划采用。标准化的 maxDepositmaxRedeem 让额度管理更安全。

4. 怎样在 Remix 找不到 OpenZeppelin?
可先从 OpenZeppelin Wizard 下载对应合约,或在 Remix “File Explorer” 加入 GitHub Workspaces 导入路径。

5. 生产环境该注意哪些风险?


结语与下一步

恭喜!你已掌握从 资产代币代币化金库 的全流程:
编写 → 部署 → 存取 → 提息。下一步可用真实策略(质押 LP、借贷)填充 afterDeposit 逻辑,真正实现去中心化的被动收益。

继续深挖 ERC-4626 生态,你会惊喜地发现:同一套接口,既能做高 APY 的机池,也能做质押 ETH 的流动性质押衍生代币。链上金融的乐高,因标准而无限扩张。祝你玩赚 DeFi、永续生息!