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;
}
函数
setWill
:允许代币所有者设置或更新其遗嘱。getWill
:返回给定所有者的当前遗嘱详细信息。announceObit
:由执行人启动继承过程。cancelObit
:取消正在进行的讣告过程。getObit
:检索当前的讣告状态。bequeath
:在等待期结束后将代币转移给继承人。
事件
ObituaryStarted
:在宣布讣告时发出。ObituaryCancelled
:在讣告被取消时发出。
基本原理
该标准遵循现实生活中准备和执行遗嘱时发生的事情。
- 所有者撰写遗嘱,并在撰写过程中指定其遗嘱的执行人
- 去世后,执行人将宣布讣告
- 阅读遗嘱并确定继承人
- 根据遗嘱的意愿执行所有权转移
但是,现实生活并不总是那么简单。冲突时有发生。为了处理这种情况并保持接口简单,我们添加了由任何执行人取消讣告的能力。这样,如果存在任何冲突,都可以在法庭上提出质疑,一旦问题解决,就可以再次启动讣告过程。
同样,为了保持接口的清洁,所有代币都转移到一个地址。然后,这个人有责任执行任何进一步的转移。
向后兼容性
此 EIP 与现有的代币标准(如 ERC-20、ERC-721 和 ERC-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.