如果你希望仅用十几分钟就在以太坊上部署一个“会生息”的 DeFi 金库,本文将带你完整实践。我们从零开始铸造底层资产代币,再把资产封装成 ERC-4626 代币化金库,实现 存、取、收息 全流程。所有代码均可在线运行,无需额外插件。
核心关键词:ERC-4626、代币化金库、收益聚合器、DeFi 代币标准、以太坊开发、收益凭证、底层资产、智能合约、Yield Farming、OpenZeppelin
实操总览
一条链、两个合约、三步部署、五分钟交互,完成「Money Legos」里的资产收益层。
- 时间估算:15–20 分钟
- 工具:Remix IDE、MetaMask、Goerli 或本地测试网
- 语言:Solidity 0.8.20
- 依赖:OpenZeppelin 4.9+
Step 1:项目骨架预览
在 Remix IDE 新建两个文件:
- Token.sol:底层 ERC-20 资产
- Vault.sol:收益凭证金库,符合 ERC-4626 规范
目录极简,方便读者直接复制粘贴运行。
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);
}
}关键点
Ownable保障只能合约拥有者额外增发- 初始 200,000 CVT 全部给到部署者,便于后续测试
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;
}
}代码解读
继承
- ERC4626 为我们预制了
deposit、mint、redeem、withdraw的全部逻辑 - 只需重写两个钩子函数就能自定义费用模型
- ERC4626 为我们预制了
关键函数
afterDeposit():当资产转入金库后,可立即开始生息逻辑beforeWithdraw():在提款前清算收益、扣除费用(示例留空,读者可自行扩展)
Step 4:快速部署与测试
4.1 编译
Remix 左侧点击 “Solidity Compiler”,选择 0.8.20 编译。
若 GitHub 连接失败,可将 OpenZeppelin 下载到本地 node_modules 后手动 import。
4.2 部署流程
- 环境选择 Injected Provider-Metamask
- 先部署
CovToken,记好合约地址 再部署
YieldVault,参数_asset:填入刚刚的 CVT 地址_entryFeeBasisPoints:示例 100 = 1%_entryFeeRecipient:填入自身或其他地址
Step 5:存入 & 收取收益凭证 vCVT
5.1 钱包切换
- 账户 1:持有 200,000 CVT,负责授权
- 账户 2:用户角色,需先接收 200 枚 CVT
5.2 授权
调用 CVT 合约 approve(vaultAddress, amount),允许金库划转。
5.3 存款
调用 vault deposit(200 * 10 ** decimals(), account2),成功后账户 2 收到 198 vCVT(扣除 1% 费用)。
👉 实时查看年利率与实际收益差距,点击解锁隐藏数据
Step 6:赎回与提款
- 赎回:
redeem(vCVT_BALANCE, account2, account2) - 提款:
withdraw(underlying_amount, account2, account2)
在测试网中,为了立刻看到收益差异,金库内部可手动调用 afterDeposit() 把额外利息加进去。当用户提币时,就能看到钱包里 CVT > 200 的结果,证明利息已入账。
常见问题 FAQ
1. ERC-4626 与 Yearn 有什么区别?
Yearn 是最大的收益聚合器,其底层 yVault 已升级为 ERC-4626。该标准让不同协议“可互换”,多前端可一键接入任何兼容金库。
2. 为什么手续费会影响兑换率? previewDeposit 会扣减费用,导致用户拿到的 share 小于理论值,从而抑制一次性大额套利。
3. 借贷协议能不能直接用 ERC-4626?
完全可以,Compound v3、AAVE GHO 均计划采用。标准化的 maxDeposit、maxRedeem 让额度管理更安全。
4. 怎样在 Remix 找不到 OpenZeppelin?
可先从 OpenZeppelin Wizard 下载对应合约,或在 Remix “File Explorer” 加入 GitHub Workspaces 导入路径。
5. 生产环境该注意哪些风险?
- 收益策略可组合,应审计所有底层合约
afterDeposit与beforeWithdraw中避免外部调用漏洞- 为高 TVL 金库引入多签和紧急跑路机制
结语与下一步
恭喜!你已掌握从 资产代币 到 代币化金库 的全流程:
编写 → 部署 → 存取 → 提息。下一步可用真实策略(质押 LP、借贷)填充 afterDeposit 逻辑,真正实现去中心化的被动收益。
继续深挖 ERC-4626 生态,你会惊喜地发现:同一套接口,既能做高 APY 的机池,也能做质押 ETH 的流动性质押衍生代币。链上金融的乐高,因标准而无限扩张。祝你玩赚 DeFi、永续生息!