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.