Alert Source Discuss
🚧 Stagnant Standards Track: ERC

ERC-1450: ERC-1450 用于发行和交易符合 SEC 标准的证券的兼容型安全代币

Authors John Shiple (@johnshiple), Howard Marks <howard@startengine.com>, David Zhang <david@startengine.com>
Created 2018-09-25
Discussion Link https://ethereum-magicians.org/t/erc-proposal-ldgrtoken-a-compatible-security-token-for-issuing-and-trading-sec-compliant-securities/1468

ERC-1450 - 用于发行和交易符合 SEC 标准的证券的兼容型安全代币

简单总结

ERC-1450 是一个与 ERC-20 兼容的代币,它能够发行代表证券的代币,这些证券需要符合以下一个或多个证券法法规:众筹法规、D 条例和 A 条例

摘要

ERC-1450 方便记录符合证券法 CF、D 和 A 条例出售的证券的所有权和转让。证券的发行和交易受证券交易委员会 (SEC) 和美国特定州的蓝天法和法规的约束。

ERC-1450 管理发行和交易期间的证券所有权。发行人是唯一应该创建 ERC-1450 并分配 RTA 的角色。RTA 是唯一允许执行 ERC-1450mintburnFromtransferFrom 函数的角色。任何角色都不能执行 ERC-1450transfer 函数。

动机

随着 2012 年JOBS 法案的颁布,以及 2016 年众筹法规的启动以及对 A 条例和 D 条例的修订,发行人和投资者在出售和购买未经 1933 年证券法 SEC“注册”的证券方面,可获得的豁免范围有所扩大。

目前还没有明确促进符合证券法及相关法规的代币标准。ERC-20 代币不支持融资门户、经纪交易商、RTA 和投资者等受监管的角色,也不支持银行保密法/美国爱国者法案 KYC 和 AML 要求。其他改进(特别是 EIP-1404 (简单受限代币标准))试图解决 KYC 和 AML 的监管要求。这种方法是新颖的,因为 RTA 全权负责执行 KYC 和 AML,并且应该全权负责 transferFrommintburnFrom

规范

ERC-1450 扩展了 ERC-20

ERC-1450

ERC-1450 要求只有发行人才能创建代表仅由 RTA 管理的证券的代币。实例化 ERC-1450 需要 OwnedIssuerControlled 修饰符,并且只有发行人应该为合规代币执行 ERC-1450 构造函数。ERC-1450扩展了通用的 Ownable 修饰符,以描述所有者的特定子集,这些所有者通过合约修饰符 OwnedIssuerControlled 以及函数修饰符 onlyOwneronlyIssuerTransferAgent 自动执行合规性并使其去中心化。Owned 合约修饰符为函数实例化 onlyOwner 修饰符。IssuerControlled 修饰符为函数实例化 onlyIssuerTransferAgent 修饰符。

ERC-1450 必须阻止任何人执行 transferallowanceapprove 函数,和/或实现这些函数以始终失败。ERC-1450 更新了 transferFrommintburnFrom 函数。transferFrommintburnFrom 只能由 RTA 执行,并且受到 onlyIssuerTransferAgent 修饰符的限制。此外,ERC-1450 定义了函数 transferOwnershipsetTransferAgentsetPhysicalAddressOfOperationisTransferAgent。只有发行人可以调用 transferOwnershipsetTransferAgentsetPhysicalAddressOfOperation 函数。任何人都可以调用 isTransferAgent 函数。

发行人和 RTA

出于合规性原因, ERC-1450 构造函数必须指定发行人(owner)、RTA(transferAgent)、证券的 name 和证券的 symbol

发行人拥有

ERC-1450 必须在其构造函数中指定 owner,应用 Owned 修饰符,并实例化 onlyOwner 修饰符以启用特定函数,以允许只有发行人的 owner 地址才能执行它们。ERC-1450 还定义了函数 transferOwnership,该函数将发行人的所有权转移到新的 owner 地址,并且只能由 owner 调用。transferOwnership 触发 OwnershipTransferred 事件。

发行人控制

IssuerControlled 通过拥有合约来维护发行人对其证券的所有权,并使发行人能够为其证券设置和更新 RTA。ERC-1450 的构造函数必须具有在 ERC-1450 构造函数中指定了发行人的 IssuerControlled 修饰符。IssuerControlledERC-1450 实例化 onlyIssuerTransferAgent 修饰符,以启用特定函数(setPhysicalAddressOfOperationsetTransferAgent)以允许只有发行人才能执行这些函数。

注册转账代理控制

ERC-1450 定义了 setTransferAgent 函数(用于更改 RTA)和 setPhysicalAddressOfOperation 函数(用于更改发行人的地址),并且必须使用 onlyOwner 修饰符将执行限制为发行人的所有者。setTransferAgent 必须发出 TransferAgentUpdated 事件。setPhysicalAddressOfOperation 必须发出 PhysicalAddressOfOperationUpdated 事件。

ERC-1450 必须在其构造函数中指定 transferAgent,并实例化 onlyIssuerTransferAgent 修饰符以启用特定函数(transferFrommintburnFrom)以允许只有发行人的 transferAgent 地址才能执行它们。ERC-1450 还定义了公共函数 isTransferAgent 以查找和识别发行人的 RTA。

证券

ERC-1450 通过应用 onlyIssuerTransferAgent 来更新 transferFrommintburnFrom 函数,以实现证券的发行、重新发行和交易。

ERC-20 扩展

ERC-20 代币提供以下功能:

contract ERC20 {
  function totalSupply() public view returns (uint256);
  function balanceOf(address who) public view returns (uint256);
  function transfer(address to, uint256 value) public returns (bool);
  function allowance(address owner, address spender) public view returns (uint256);
  function transferFrom(address from, address to, uint256 value) public returns (bool);
  function approve(address spender, uint256 value) public returns (bool);
  event Approval(address indexed owner, address indexed spender, uint256 value);
  event Transfer(address indexed from, address indexed to, uint256 value);
}

ERC-20 扩展如下:

/**
 * ERC-1450 是一个与 ERC-20 兼容的代币,它有助于符合一个或多个证券法 CF、D 和 A 条例。
 *
 * ERC-1450 标准的实现必须定义以下可选的 ERC-20 字段:
 *
 * name - 证券的名称
 * symbol - 证券的符号
 *
 * ERC-1450 标准的实现必须指定以下构造函数参数:
 *
 * _owner - 所有者的地址
 * _transferAgent - 转账代理的地址
 * _name - 证券的名称
 * _symbol - 证券的符号
 *
 *  ERC-1450 标准的实现必须实现以下合约修饰符:
 *
 * Owned - 只有证券发行人的地址才允许执行该代币的构造函数。此修饰符还设置 onlyOwner 函数修饰符。
 * IssuerControlled - 此修饰符设置 onlyIssuerTransferAgent 函数修饰符。
 *
 * ERC-1450 标准的实现必须实现以下函数修饰符:
 *
 * onlyOwner - 只有证券发行人的地址才允许执行函数 transferOwnership、setTransferAgent 和 setPhysicalAddressOfOperation。
 * onlyIssuerTransferAgent - 只有发行人注册转账代理的地址才允许执行函数 transferFrom、mint 和 burnFrom。
 *
 * ERC-1450 标准的实现必须实现以下必需的 ERC-20 事件以始终失败:
 *
 * Approval - 不应调用,因为必须实现发出此事件的函数以始终失败。
 *
 * ERC-1450 标准的实现必须实现以下必需的
 *     ERC-20 函数以始终失败:
 *
 * transfer - 对于转移证券来说,这不是合法的、受监管的调用,因为
 *     代币持有人发起代币转移。必须实现该函数以始终失败。
 * allowance - 对于转移证券来说,这不是合法的、受监管的调用,因为
 *     代币持有人可能不允许第三方发起代币转移。
 *     必须实现该函数以始终失败。
 * approve - 对于转移证券来说,这不是合法的、受监管的调用,因为
 *     代币持有人可能不允许第三方发起代币转移。
 *     必须实现该函数以始终失败。
 *
 * ERC-1450 标准的实现必须实现以下可选的
 *     ERC-20 函数:
 * decimals - 必须返回“0”,因为证券是不可分割的实体。
 *
 * ERC-1450 标准的实现必须实现以下函数:
 *
 * mint - 只有发行人注册转账代理的地址才能创建新的
 *     证券。
 * burnFrom - 只有发行人注册转账代理的地址才能烧毁或
 *     销毁证券。
 */

Contract ERC-1450 is Owned, IssuerControlled {

  /**
   * 构造函数必须实现一个修饰符 (Owned),该修饰符创建 onlyOwner 修饰符
   * 允许只有发行人的地址(所有者)才能执行 transferOwnership、
   * setTransferAgent 和 setPhysicalAddressOfOperation 函数。构造函数还必须
   * 实现一个修饰符 (TransferAgentControlled),该修饰符创建 onlyIssuerTransferAgent
   * 修饰符,以允许只有发行人注册转账代理的地址才能执行
   * 函数 transferFrom、mint 和 burnFrom)。
   */
    constructor(address _owner, address _transferAgent, string _name, string _symbol)
          Owned(_issuer) TransferAgentControlled(_transferAgent) public;

    /**
     * 指定只有所有者(发行人)才能执行函数。
     *
     * onlyOwner 要求 msg.sender 是所有者的地址。
     */
    modifier onlyOwner();

    /**
     * 指定只有发行人的 transferAgent 才能执行函数。
     *
     * onlyIssuerTransferAgent 要求 msg.sender 是 transferAgent 的地址。
     */
    modifier onlyIssuerTransferAgent();

    /**
     * 将证券的所有权从一个发行人转移到另一个发行人。
     *
     * transferOwnership 必须实现 onlyOwner 修饰符,以仅允许
     *     发行人的所有者的地址才能转移所有权。
     * transferOwnership 要求 _newOwner 地址是新
     *     发行人的地址。
     */
    function transferOwnership(address _newOwner) public onlyOwner;

    /**
     * 在执行 transferOwnership 后触发。
     */
    event OwnershipTransferred()

    /**
     * 设置证券的转账代理。
     *
     * setTransferAgent 必须实现 onlyOwner 修饰符,以仅允许
     *     发行人的地址指定证券的转账代理。
     * setTransferAgent 要求 _newTransferAgent 地址是新的
     *     转账代理的地址。
     */
    function setTransferAgent(address _newTransferAgent) public onlyOwner;

    /**
     * 在执行 setTransferAgent 后触发。
     */
    event TransferAgentUpdated(address indexed previousTransferAgent, address indexed
        newTransferAgent);

    /**
     * 设置发行人的物理运营地址。
     *
     * setPhysicalAddressOfOperation 必须实现 onlyOwner 修饰符,以仅允许
     *     发行人的所有者的地址转移所有权。
     * setPhysicalAddressOfOperation 要求 _newPhysicalAddressOfOperation 地址
     *     是发行人的新地址。
     */
    function setPhysicalAddressOfOperation(string _newPhysicalAddressOfOperation) public
        onlyOwner;

    /**
     * 在执行 setPhysicalAddressOfOperation 后触发。
     */
    event PhysicalAddressOfOperationUpdated(string previousPhysicalAddressOfOperation,
        string newPhysicalAddressOfOperation);

    /**
     * 查找证券的转账代理。
     *
     * isTransferAgent 是一个公共函数。
     * isTransferAgent 要求 _lookup 地址确定该地址是否为
     *   证券的转账代理。
     */
    function isTransferAgent(address _lookup) public view returns (bool);

    /**
     * transfer 不是合法的、受监管的调用,必须实现为始终失败。
     */
    transfer(address to, uint tokens) public returns (bool success);

    /**
     * Approval 不需要实现。不应触发此事件,因为
     * 发出此事件的函数不是合法的、受监管的调用。
     */
    event Approval(address indexed tokenOwner, address indexed spender, uint tokens);

    /**
     * allowance 不是合法的、受监管的调用,必须实现为始终失败。
     */
    allowance(address tokenOwner, address spender) public constant returns (uint remaining);

    /**
     * approve 不是合法的、受监管的调用,必须实现为始终失败。
     */
    approve(address spender, uint tokens) public returns (bool success);

    /**
     * 转移证券。
     *
     * transferFrom 必须实现 onlyIssuerTransferAgent 修饰符,以仅允许
     *     发行人注册转账代理的地址才能转移 `ERC-1450`。
     * transferFrom 要求 _from 地址具有 _value 个代币。
     * transferFrom 要求 _to 地址不能为 0,因为证券不能
     *     以这种方式销毁。
     */
    function transferFrom(address _from, address _to, uint256 _value) public
        onlyIssuerTransferAgent returns (bool);

    /**
     * 创建新证券。
     *
     * mint 必须实现 onlyIssuerTransferAgent 修饰符,以仅允许地址
     *     发行人注册转账代理才能铸造 `ERC-1450` 代币。
     * mint 要求 _to 地址不能为 0,因为证券不能
     *     以这种方式销毁。
     * mint 必须将 _value 个代币添加到 _to 地址并将 totalSupply 增加
     *     _value。
     * mint 必须发出 Transfer 事件。
     */
    function mint(address _to, uint256 _value) public onlyIssuerTransferAgent returns
        (bool);

    /**
     * 烧毁或销毁证券。
     *
     * burnFrom 必须实现 onlyIssuerTransferAgent 修饰符,以仅允许地址
     *     发行人注册转账代理才能烧毁 `ERC-1450`。
     * burnFrom 要求 _from 地址具有 _value 个代币。
     * burnFrom 必须从 _from 地址中减去 _value 个代币并将
     *     totalSupply 减少 _value。
     * burnFrom 必须发出 Transfer 事件。
     */
    function burnFrom(address _who, uint256 _value) public onlyIssuerTransferAgent returns
        (bool);
}

证券交易委员会要求

SEC 对允许执行特定行动的特定角色有非常严格的要求。具体来说,只有 RTA 才能 minttransferFrom 证券。

实施者必须维护链下服务和数据库,以记录和跟踪投资者的姓名、物理地址、以太坊地址和证券所有权金额。实施者和 SEC 必须能够在需要时访问投资者的私人信息。发行人和 RTA 必须能够生成所有投资者的当前列表,包括任何给定时刻每种证券的姓名、地址和证券所有权级别。发行人和 RTA 必须能够出于各种受监管的原因向投资者重新发行证券。

私人投资者信息绝不能在公共区块链上公开。

管理投资者信息

必须特别小心和注意,以确保投资者的个人身份信息永远不会公开或泄露给公众。

失去对其地址或私钥的访问权限的发行人

如果发行人失去对其证券现有实例地址的访问权限,则无法追索。发行人必须特别小心并努力确保安全地存储其地址和关联的私钥。发行人可以将所有权重新分配给另一个发行人,但如果发行人丢失其私钥则不能。

如果发行人失去访问权限,则必须使用链下服务重建发行人的证券。发行人必须创建(并保护)一个新地址。RTA 可以读取现有的发行人证券,并且 RTA 可以在新的 ERC-1450 智能合约下相应地 mint 投资者证券。

注册转账代理失去对其地址或私钥的访问权限

如果 RTA 失去访问权限,RTA 可以创建一个新的以太坊地址,并且发行人可以执行 setTransferAgent 函数以重新分配 RTA。

处理失去对其地址或私钥的访问权限的投资者(证券所有者)

投资者可能会因多种原因“丢失”其凭据:他们只是“丢失”了其凭据,他们遭到黑客攻击或成为欺诈的受害者,他们犯下了与证券相关的欺诈行为,或者发生了生活事件(如死亡)。由于 RTA 管理发行人的证券,因此 RTA 可以授权与证券相关的所有权变更(只要它们经过适当的公证和验证)。

如果投资者(或例如,投资者的继承人)丢失了他们的凭据,投资者必须经过公证流程通知 RTA 情况并提供新的投资者地址。从那里,RTA 可以将“丢失”的证券 mint 到新的投资者地址并 burnFrom 旧的投资者地址(因为 RTA 知道所有投资者的地址)。

基本原理

目前还没有促进符合 SEC 法规的代币标准。最接近的代币是 ERC-884(与特拉华州通用公司法 (DGCL) 兼容的股份代币),其中声明 SEC 要求超出范围。EIP-1404(简单受限代币标准) 在解决 SEC 关于向投资者重新发行证券的要求方面做得还不够。

向后兼容性

ERC-1450 与 ERC-20 代币保持兼容性,但有以下规定:

  • function allowance(address tokenOwner, address spender) public constant returns (uint remaining);
    • 必须实施为始终失败,因为 allowance 不是证券的合法、受监管的调用。
  • function transfer(address to, uint tokens) public returns (bool success);
    • 由于代币持有人发起转移,因此必须实施为始终失败,因为转移不是证券的合法、受监管的调用。
  • function approve(address spender, uint tokens) public returns (bool success);
    • 必须实施为始终失败,因为 approve 不是证券的合法、受监管的调用
  • function transferFrom(address from, address to, uint tokens) public returns (bool success);
    • 必须实施为只有发行人的 RTA 才能执行此操作
  • event Approval(address indexed tokenOwner, address indexed spender, uint tokens);
    • 不必实施。永远不应调用 Approval,因为必须实施发出此事件的函数以始终失败

测试用例

测试用例可在 https://github.com/StartEngine/ldgr_smart_contracts/tree/master/test 中找到。

实现

参考实现可在 https://github.com/StartEngine/ldgr_smart_contracts 中找到。

版权放弃

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

Citation

Please cite this document as:

John Shiple (@johnshiple), Howard Marks <howard@startengine.com>, David Zhang <david@startengine.com>, "ERC-1450: ERC-1450 用于发行和交易符合 SEC 标准的证券的兼容型安全代币 [DRAFT]," Ethereum Improvement Proposals, no. 1450, September 2018. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-1450.