金库合约是 DeFi 乐高中的基础,它允许你把基础资产(代币)质押到合约中,换取一定收益,包括以下应用场景:
- 收益农场: 在 Yearn Finance 中可以质押 USDT 获取利息。
- 借贷: 在 AAVE 中,可以出借 ETH 获取存款利息和贷款。
- 质押: 在 Lido 中,可以质押 ETH 参与 ETH 2.0 质押,得到可以生息的 stETH。
由于金库合约缺乏标准,写法五花八门,一个收益聚合器需要写很多接口对接不同的 DeFi 项目。ERC4626 代 币化金库标准(Tokenized Vault Standard)横空出世,使得 DeFi 能够轻松扩展。它具有以下优点:
- 代币化: ERC4626 继承了 ERC20,向金库存款时,将得到同样符合 ERC20 标准的金库份额,比如质押 ETH,自动获得 stETH。
- 更好的流通性: 由于代币化,你可以在不取回基础资产的情况下,利用金库份额做其他事情。拿 Lido 的 stETH 为例, 你可以用它在 Uniswap 上提供流动性或交易,而不需要取出其中的 ETH。
- 更好的可组合性: 有了标准之后,用一套接口可以和所有 ERC4626 金库交互,让基于金库的应用、插件、工具开发更容易。
- ERC20: ERC4626 继承了 ERC20,金库份额就是用 ERC20 代币代表的:用户将特定的 ERC20 基础 资产(比如 WETH)存进金库,合约会给他铸造特定数量的金库份额代币;当用户从金库中提取基 础资产时,会销毁相应数量的金库份额代币。asset() 函数会返回金库的基础资产的代币地址。
- 存款逻辑:让用户存入基础资产,并铸造相应数量的金库份额。相关函数为 deposit() 和 mint()。 deposit(uint assets, address receiver) 函数让用户存入 assets 单位的资产,并铸造相应数 量的金库份额给 receiver 地址。mint(uint shares, address receiver) 与它类似,只不过 是以将铸造的金库份额作为参数。
- 提款逻辑:让用户销毁金库份额,并提取金库中相应数量的基础资产。相关函数为 withdraw() 和 redeem(),前者以取出基础资产数量为参数,后者以销毁的金库份额为参数。
- 会计和限额逻辑:ERC4626 标准中其他的函数是为了统计金库中的资产,存款/提款限额,和存款/提 款的基础资产和金库份额数量。
TODO: erc4626/eip4626