Alert Source Discuss
⚠️ Draft Standards Track: ERC

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-4626depositmintwithdrawredeem 方法应回退,以防止发行或燃烧具有未定义份额价格的份额。

安全考虑

实施者需要注意未结算的计划存款和赎回。 如果用户计划了存款或赎回,但在 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.