ERC-6229: 具有锁定期Token化的金库
具有锁定期 的ERC-4626 Token化的金库。
| Authors | Anderson Chen (@Ankarrr), Martinet Lee <martinetlee@gmail.com>, Anton Cheng <antonassocareer@gmail.com> |
|---|---|
| Created | 2022-12-21 |
| Discussion Link | https://ethereum-magicians.org/t/eip-tokenized-vaults-with-lock-in-period/12298 |
| Requires | EIP-4626 |
摘要
此标准扩展了 EIP-4626 以支持锁定期。
动机
EIP-4626 标准定义了一个 token 化的金库,允许用户(合约或 EOA)随时存入和提取底层 token。但是,存在金库需要锁定底层 token 的情况(可能是为了执行某些策略)。在锁定期内,不应允许提款或存款。此标准扩展了 EIP-4626 以支持锁定期,并在锁定期内处理计划的存款和取款。
规范
本文档中的关键词“必须”、“不得”、“必需”、“应”、“不应”、“建议”、“不建议”、“可以”和“可选”应按照 RFC 2119 和 RFC 8174 中的描述进行解释。
所有遵循此 EIP 的金库必须实现 EIP-4626 以提供基本的金库功能,并实现 EIP-20 以表示份额。
定义
- asset:金库接受和管理的底层 EIP-20 token。
- share:金库发行的 EIP-20 token。
- locked:金库的状态。当金库被锁定时,用户无法从金库存入或提取资产。
- unlocked:金库的状态。当金库未锁定时,用户可以从金库存入或提取资产。
- round:金库被锁定的周期。
视图方法
isLocked
金库的当前状态。
true 表示金库处于锁定状态,false 表示金库处于未锁定状态。
- name: isLocked
type: bool
stateMutability: view
inputs: []
outputs:
- name: isLocked
type: bool
vaultRound
金库的当前轮次。
必须以 0 开头。
每次新一轮开始时(即当 isLocked 变为 true 时)必须加 1。 除其他情况外,不得修改。
- name: vaultRound
type: uint256
stateMutability: view
inputs: []
outputs:
- name: vaultRound
type: uint256
方法
scheduleDeposit
计划在 isLocked 为 true 时存入 assets 的意图。
仅当 isLocked 为 true 时才能调用。
必须将 assets 从调用者转移到金库。 不得发行新份额。
如果无法存入 assets,则必须回退。
如果 isLocked 为 false,则必须回退。
- name: scheduleDeposit
type: function
stateMutability: nonpayable
inputs:
- name: assets
type: uint256
scheduleRedeem
计划在 isLocked 为 true 时从金库赎回 shares 的意图。
仅当 isLocked 为 true 时才能调用。
必须将 shares 从调用者转移到金库。 不得将资产转移给调用者。
如果无法赎回 shares,则必须回退。
如果 isLocked 为 false,则必须回退。
- name: scheduleRedeem
type: function
stateMutability: nonpayable
inputs:
- name: shares
type: uint256
settleDeposits
处理 depositor 的所有计划存款并铸造 newShares。
仅当 isLocked 为 false 时才能调用。
必须根据计划的 depositor 的当前份额价格发行 newShares。
如果 depositor 没有计划的存款,则必须回退。
- name: settleDeposits
type: function
stateMutability: nonpayable
inputs:
- name: depositor
- type: address
outputs:
- name: newShares
- type: uint256
settleRedemptions
通过燃烧 burnShares 并将 redeemAssets 转移到 redeemer 来处理 redeemer 的所有计划赎回。
仅当 isLocked 为 false 时才能调用。
必须燃烧 burnShares,并根据当前份额价格将 redeemAssets 转回给 redeemer。
如果 redeemer 没有计划的赎回,则必须回退。
- name: settleRedemptions
type: function
stateMutability: nonpayable
inputs:
- name: redeemer
- type: address
outputs:
- name: burnShares
- type: uint256
- name: redeemAssets
- type: uint256
getScheduledDeposits
获取 depositor 的计划存款的 totalAssets。
不得回退。
- name: getScheduledDeposits
type: function
stateMutability: view
inputs:
- name: depositor
- type: address
outputs:
- name: totalAssets
- type: uint256
getScheduledRedemptions
获取 redeemer 的计划赎回的 totalShares。
不得回退。
- name: getScheduledRedemptions
type: function
stateMutability: view
inputs:
- name: redeemer
- type: address
outputs:
- name: totalShares
- type: uint256
事件
ScheduleDeposit
sender 在此 round 中计划了一笔 assets 的存款。
必须通过 scheduleDeposit 方法发出。
- name: ScheduleDeposit
type: event
inputs:
- name: sender
indexed: true
type: address
- name: assets
indexed: false
type: uint256
- name: round
indexed: false
type: uint256
ScheduleRedeem
sender 在此 round 中计划了一笔 shares 的赎回。
必须通过 scheduleRedeem 方法发出。
- name: ScheduleRedeem
type: event
inputs:
- name: sender
indexed: true
type: address
- name: shares
indexed: false
type: uint256
- name: round
indexed: false
type: uint2
SettleDeposits
在此 round 中结算 depositor 的计划存款。 发行 newShares 并将其转移给 depositor。
必须通过 settleDeposits 方法发出。
- name: SettleDeposits
type: event
inputs:
- name: depositor
indexed: true
type: address
- name: newShares
type: uint256
- name: round
type: uint256
SettleRedemptions
在此 round 中结算 redeemer 的计划赎回。 燃烧 burnShares 并将 redeemAssets 转回给 redeemer。
必须通过 settleRedemptions 方法发出。
- name: SettleRedemptions
type: event
inputs:
- name: redeemer
indexed: true
type: address
- name: burnShares
type: uint256
- name: redeemAssets
type: uint256
- name: round
type: uint256
理由
该标准旨在成为一个最小的接口。 诸如锁定期开始和结束,以及在锁定期内如何使用底层 token 等详细信息未指定。
没有用于计划提款的函数,因为在锁定期内,份额价格是不确定的,因此无法确定可以提取多少底层 token。
向后兼容性
当 isLocked 为 true 时,EIP-4626 的 deposit、mint、withdraw、redeem 方法应回退,以防止发行或燃烧具有未定义份额价格的份额。
安全考虑
实施者需要注意未结算的计划存款和赎回。 如果用户计划了存款或赎回,但在 isLocked 为 false 时未结算,然后在几轮后结算,金库将以不正确的份额价格处理它。 我们没有在标准中指定解决方案,因为有很多可能的方法可以解决此问题,并且我们认为实施者应根据他们的用例来确定解决方案。 例如:
- 如果有任何未结算的计划存款或赎回,则不允许
isLocked变为 true - 当
isLocked变为 true 时,强制结算计划的存款或赎回 - 记住每轮的结束份额价格,并让用户根据份额价格进行结算
版权
通过 CC0 放弃版权和相关权利。
Citation
Please cite this document as:
Anderson Chen (@Ankarrr), Martinet Lee <martinetlee@gmail.com>, Anton Cheng <antonassocareer@gmail.com>, "ERC-6229: 具有锁定期Token化的金库 [DRAFT]," Ethereum Improvement Proposals, no. 6229, December 2022. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-6229.