Alert Source Discuss
⚠️ Review Standards Track: ERC

ERC-7878: 可继承合约

所有者去世后代币的继承

Authors Wamith Mockbill (@wamith)
Created 2025-02-01
Requires EIP-20, EIP-165, EIP-721, EIP-1155

摘要

此 EIP 提出了一个标准接口,用于允许在所有者去世后继承代币的合约。该接口允许代币所有者设置遗嘱并指定执行人,以便在指定的等待期后将代币转移给继承人。

动机

加密代币,特别是 NFT,正开始用于代币化现实世界的资产。为了让它们被主流金融世界采用,需要有一种方法在所有者去世后继承这些代币。目前,对于代币持有者来说,在他们去世后传递其数字资产没有标准化的方法。 本 EIP 旨在通过为“可继承”代币提供标准接口来解决此问题,从而实现安全透明的代币继承过程。 在设计此接口时,我们试图遵循现实世界中遗嘱创建和执行的过程。

规范

本文档中的关键词“必须”,“禁止”,“必需”,“应”,“不应”,“应该”,“不应该”,“推荐”,“不推荐”,“可以”和“可选”应按照 RFC 2119 和 RFC 8174 中的描述进行解释。

每个符合规范的合约都必须实现 Bequeathable 接口:

/// @title EIP-7878 可继承代币
/// @dev See https://eips.ethereum.org/EIPS/eip-7878

pragma solidity ^0.8.0;

/**
 * @notice Bequeathable interface
 */

interface Bequeathable {

   /**
    * @notice              宣布所有者的代币将被继承
    * @dev                 由 `announceObit` 发出
    * @param   owner       代币的原始所有者
    * @param   inheritor   一旦暂停期 moratoriumTTL 时间过去,将继承代币的钱包地址
    */
   event ObituaryStarted(address indexed owner, address indexed inheritor);

   /** 
    * @notice               宣布所有者的讣告(和暂停期)已被取消,以及取消者
    * @dev                  由 `cancelObit` 发出
    * @param   owner        代币的原始所有者
    * @param   cancelledBy  触发此取消的地址。这可以是所有者或任何继承人
    */
   event ObituaryCancelled(address indexed owner, address indexed cancelledBy);

   /** 
    * @notice                 代币所有者可以设置一份遗嘱,并指定一个或多个执行人,他们可以在所有者去世后转移其代币
    * @dev                    虽然可以设置多个执行人地址,但只需要一个来启动该过程,然后进行转移
    * @dev                    后续对此函数的调用应覆盖任何现有遗嘱
    * @param   executors      执行人数组,例如法律顾问、配偶、子女 1、子女 2 等。
    * @param   moratoriumTTL  从讣告宣布到可以进行继承转移必须经过的时间(以秒为单位)
    * @dev                    moratoriumTTL 是一个安全缓冲时间段,允许在代币转移之前进行任何干预
    */
   function setWill(address[] memory executors, uint256 moratoriumTTL) external;

   /**
    * @notice                  获取遗嘱的详细信息(如果已设置)
    * @dev                     这是所有者确认他们已正确设置遗嘱的一种方式
    * @param    owner          代币的当前所有者
    * @return   executors      此所有者遗嘱的所有执行人列表
    * @return   moratoriumTTL  在调用 announceObit 之后,实际转移发生之前必须经过的时间长度(以秒为单位)
    */
   function getWill(address owner) external view returns (address[] memory executors, uint256 moratoriumTTL);

   /**
    * @notice              启动讣告过程,通过宣布它并声明谁是预期的继承人
    * @param   owner       代币的当前所有者
    * @param   inheritor   将要成为所有者的地址
    */
   function announceObit(address owner, address inheritor) external;

   /**
    * @notice          取消先前宣布的讣告。可以由任何执行人(或仍然在世的所有者)调用
    * @param   owner   代币的原始所有者
    */
   function cancelObit(address owner) external;

   /**
    * @notice                   获取指定的继承人以及在 moratoriumTTL 满足之前剩余的时间
    * @param    owner           代币的当前所有者
    * @return   inheritor       宣布讣告时指定的继承人
    * @return   moratoriumTTL   在可以进行转移之前,moratoriumTTL 剩余的时间
    * @dev                      moratoriumTTL 的负数表示等待时间已过,可以继承代币
    */
   function getObit(address owner) external view returns (address inheritor, int256 moratoriumTTL);

   /**
    * @notice         遗赠,即将代币转移给先前声明的继承人
    * @param   owner  代币的原始所有者
    * @dev            转移应发生在调用 `announceObit` 时的继承人地址
    */
   function bequeath(address owner) external;

}

函数

  1. setWill:允许代币所有者设置或更新其遗嘱。
  2. getWill:返回给定所有者的当前遗嘱详细信息。
  3. announceObit:由执行人启动继承过程。
  4. cancelObit:取消正在进行的讣告过程。
  5. getObit:检索当前的讣告状态。
  6. bequeath:在等待期结束后将代币转移给继承人。

事件

  1. ObituaryStarted:在宣布讣告时发出。
  2. ObituaryCancelled:在讣告被取消时发出。

基本原理

该标准遵循现实生活中准备和执行遗嘱时发生的事情。

  1. 所有者撰写遗嘱,并在撰写过程中指定其遗嘱的执行人
  2. 去世后,执行人将宣布讣告
  3. 阅读遗嘱并确定继承人
  4. 根据遗嘱的意愿执行所有权转移

但是,现实生活并不总是那么简单。冲突时有发生。为了处理这种情况并保持接口简单,我们添加了由任何执行人取消讣告的能力。这样,如果存在任何冲突,都可以在法庭上提出质疑,一旦问题解决,就可以再次启动讣告过程。

同样,为了保持接口的清洁,所有代币都转移到一个地址。然后,这个人有责任执行任何进一步的转移。

向后兼容性

此 EIP 与现有的代币标准(如 ERC-20ERC-721ERC-1155)兼容。它可以与这些标准一起实施,而不会影响其核心功能。

测试用例

测试包含在 Bequeath.test.js 中。

参考实现

请参见 Bequeathable.sol

安全注意事项

实施者应仔细考虑访问控制机制,以确保只有授权方才能执行与遗嘱相关的函数。

应将 moratoriumTTL 设置为合理的持续时间,以便可能发生争议或更正。我们建议至少 30 天,特别是对于高价值的代币。它限制了在诸如由已接管其中一个执行人钱包的恶意行为者触发 obituray 过程之类的场景中的潜在损害。

版权

版权和相关权利已通过 CC0 放弃。

Citation

Please cite this document as:

Wamith Mockbill (@wamith), "ERC-7878: 可继承合约 [DRAFT]," Ethereum Improvement Proposals, no. 7878, February 2025. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-7878.