Alert Source Discuss
🚧 Stagnant Standards Track: ERC

ERC-2980: 符合瑞士法律的资产代币

一种资产代币的接口,符合瑞士法律并兼容 [ERC-20](./eip-20.md)。

Authors Gianluca Perletti (@Perlets9), Alan Scarpellini (@alanscarpellini), Roberto Gorini (@robertogorini), Manuel Olivi (@manvel79)
Created 2020-09-08
Discussion Link https://github.com/ethereum/EIPs/issues/2983
Requires EIP-20

摘要

这个新标准是一个兼容 ERC-20 的代币,具有符合以下瑞士法律的限制:证券交易所法银行法金融市场基础设施法集体投资计划法反洗钱法。还必须考虑 金融服务法金融机构法。所实现的解决方案也符合欧洲的管辖。

这个新标准符合资产代币(也称为“证券代币”)的新时代。这些新方法在发行和交易期间管理证券所有权。发行人是唯一可以管理白名单的角色,也是唯一允许执行“冻结”或“撤销”功能的人。

动机

在2018年2月16日的 ICO 指南中,FINMA(瑞士金融市场监管局)将资产代币定义为代表资产和/或相关权利的代币(FINMA ICO 指南)。它明确提到资产代币类似于股票、债券或衍生品,并且可以在经济上代表它们。上面提到的相关金融市场法律的长列表表明,我们需要比支付和实用代币更多的方法。

规范

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

“资产代币”和“证券代币”这两个词可以被认为是同义词。

每个符合 ERC-2980 的合约都必须实现 ERC-2980 接口。

ERC-2980(代币合约)

interface ERC2980 extends ERC20 {
  
  /// @dev 当资金被重新分配时发出
  event FundsReassigned(address from, address to, uint256 amount);

  /// @dev 当资金被撤销时发出
  event FundsRevoked(address from, uint256 amount);

  /// @dev 当地址被冻结时发出
  event FundsFrozen(address target);

  /**
  * @dev getter to determine if address is in frozenlist
  */
  function frozenlist(address _operator) external view returns (bool);

  /**
  * @dev getter to determine if address is in whitelist
  */
  function whitelist(address _operator) external view returns (bool);

}

ERC-2980 扩展了 ERC-20。由于资产代币的不可分割性,小数位数必须为零。

白名单和冻结名单

为了满足瑞士法律的要求,使用了两个不同的地址列表:白名单和冻结名单。 具有特殊权限的操作员(称为发行人,如下所述)可以随时将地址添加到其中一个列表中。 虽然这些列表看起来很相似,但它们的不同之处在于:白名单成员是唯一可以从其他地址接收代币的人。对于这些地址转移已在其所有权中的代币的可能性没有限制。 当白名单中的地址从该列表中删除,但未放入冻结名单并保留其代币时,可能会发生这种情况。 另一方面,分配给冻结名单的地址,正如名称本身所暗示的那样,必须被视为“冻结”,因此他们既不能接收代币,也不能向任何人发送代币。

以下是实现兼容白名单和兼容冻结名单合约的接口示例。

Interface Whitelistable {

  /**
   * @dev 将地址添加到白名单
   * 除非 `msg.sender` 是发行人操作员,否则抛出异常
   * @param _operator 要添加的地址
   * @return true 如果地址已添加到白名单,false 如果地址已经在白名单中
   */
  function addAddressToWhitelist(address _operator) external returns (bool);

  /**
   * @dev 从白名单中删除地址
   * 除非 `msg.sender` 是发行人操作员,否则抛出异常
   * @param _operator 要删除的地址
   * @return true 如果地址已从白名单中删除,false 如果地址最初不在白名单中
   */
  function removeAddressFromWhitelist(address _operator) external returns (bool);

}

Interface Freezable {

  /**
   * @dev 将地址添加到冻结名单
   * 除非 `msg.sender` 是发行人操作员,否则抛出异常
   * @param _operator 要添加的地址
   * @return true 如果地址已添加到冻结名单,false 如果地址已经在冻结名单中
   */
  function addAddressToFrozenlist(address _operator) external returns (bool);

  /**
   * @dev 从冻结名单中删除地址
   * 除非 `msg.sender` 是发行人操作员,否则抛出异常
   * @param _operator 要删除的地址
   * @return true 如果地址已从冻结名单中删除,false 如果地址最初不在冻结名单中
   */
  function removeAddressFromFrozenlist(address _operator) external returns (bool);

}

发行人

发行人扮演着关键角色。此角色有权管理白名单和冻结名单,撤销代币并重新分配它们,以及将角色转移到另一个地址。对于每个合约拥有多个发行人的可能性没有限制。发行人由合约的所有者提名,所有者也负责删除该角色。不排除在合约创建时(或之后立即)提名所有者本身为发行人的可能性。

以下是实现发行人功能的接口示例。

Interface Issuable {

  /**
   * @dev getter to determine if address has issuer role
   */
  function isIssuer(address _addr) external view returns (bool);

  /**
   * @dev 添加新的发行人地址
   * 除非 `msg.sender` 是合约所有者,否则抛出异常
   * @param _operator 地址
   * @return true 如果地址不是发行人,false 如果地址已经是发行人
   */
  function addIssuer(address _operator) external returns (bool);

  /**
   * @dev 从发行人中删除地址
   * 除非 `msg.sender` 是合约所有者,否则抛出异常
   * @param _operator 地址
   * @return true 如果地址已从发行人中删除,false 如果地址最初不在发行人列表中
   */
  function removeIssuer(address _operator) external returns (bool);

  /**
   * @dev 允许当前发行人将其角色转移给 newIssuer
   * 除非 `msg.sender` 是发行人操作员,否则抛出异常
   * @param _newIssuer 要将发行人角色转移到的地址
   */
  function transferIssuer(address _newIssuer) external;

}

撤销和重新分配

撤销和重新分配方法允许发行人从地址移动代币,即使它们在冻结名单中。Revoke 方法将目标地址的整个余额转移到调用该方法的发行人。Reassign 方法将目标地址的整个余额转移到另一个地址。这些操作的权限必须仅允许给发行人。

以下是实现撤销和重新分配功能的接口示例。

Interface RevokableAndReassignable {

  /**
   * @dev 允许当前发行人将代币从一个地址转移到其自身
   * 除非 `msg.sender` 是发行人操作员,否则抛出异常
   * @param _from 从中提取代币的地址
   */
  function revoke(address _from) external;

  /**
   * @dev 允许当前发行人将代币从一个地址转移到另一个地址
   * 除非 `msg.sender` 是发行人操作员,否则抛出异常
   * @param _from 从中提取代币的地址
   * @param _to 接收代币的地址
   */
  function reassign(address _from, address _to) external;

}

理由

目前没有明确促进符合证券法和相关法规的代币标准。EIP-1404(简单受限代币标准)不足以解决 FINMA 关于向投资者重新发行证券的要求。 在瑞士法律中,发行人最终必须使用“冻结”功能来执行其代币转移的限制。该代币必须是“可撤销的”,并且我们需要应用白名单方法进行 AML/KYC 检查。

向后兼容性

此 EIP 不引入向后不兼容性,并且与较旧的 ERC-20 代币标准向后兼容。 此标准允许实现 ERC-20 函数 transfer、transferFrom、approve 和 allowance,以便使代币完全兼容 ERC-20。 该代币可以实现 decimals() 以与 ERC-20 向后兼容。如果已实现,它必须始终返回 0。

安全考虑

安全考虑主要涉及发行人所扮演的角色。事实上,这个角色通常不存在于常见的 ERC-20 代币中,但它具有非常强大的权利,允许他移动代币而无需拥有所有权并冻结其他地址,从而阻止他们转移代币。所有者必须负责确保接收此费用的地址仅在被指定这样做的时间内保持拥有它,从而防止任何滥用。

版权

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

Citation

Please cite this document as:

Gianluca Perletti (@Perlets9), Alan Scarpellini (@alanscarpellini), Roberto Gorini (@robertogorini), Manuel Olivi (@manvel79), "ERC-2980: 符合瑞士法律的资产代币 [DRAFT]," Ethereum Improvement Proposals, no. 2980, September 2020. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-2980.