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 |
Table of Contents
ERC-1450 - 用于发行和交易符合 SEC 标准的证券的兼容型安全代币
简单总结
ERC-1450
是一个与 ERC-20
兼容的代币,它能够发行代表证券的代币,这些证券需要符合以下一个或多个证券法法规:众筹法规、D 条例和 A 条例。
摘要
ERC-1450
方便记录符合证券法 CF、D 和 A 条例出售的证券的所有权和转让。证券的发行和交易受证券交易委员会 (SEC) 和美国特定州的蓝天法和法规的约束。
ERC-1450
管理发行和交易期间的证券所有权。发行人是唯一应该创建 ERC-1450
并分配 RTA 的角色。RTA 是唯一允许执行 ERC-1450
的 mint
、burnFrom
和 transferFrom
函数的角色。任何角色都不能执行 ERC-1450
的 transfer
函数。
动机
随着 2012 年JOBS 法案的颁布,以及 2016 年众筹法规的启动以及对 A 条例和 D 条例的修订,发行人和投资者在出售和购买未经 1933 年证券法 SEC“注册”的证券方面,可获得的豁免范围有所扩大。
目前还没有明确促进符合证券法及相关法规的代币标准。ERC-20 代币不支持融资门户、经纪交易商、RTA 和投资者等受监管的角色,也不支持银行保密法/美国爱国者法案 KYC 和 AML 要求。其他改进(特别是 EIP-1404 (简单受限代币标准))试图解决 KYC 和 AML 的监管要求。这种方法是新颖的,因为 RTA 全权负责执行 KYC 和 AML,并且应该全权负责 transferFrom
、mint
和 burnFrom
。
规范
ERC-1450
扩展了 ERC-20
。
ERC-1450
ERC-1450
要求只有发行人才能创建代表仅由 RTA 管理的证券的代币。实例化 ERC-1450
需要 Owned
和 IssuerControlled
修饰符,并且只有发行人应该为合规代币执行 ERC-1450
构造函数。ERC-1450
扩展了通用的 Ownable
修饰符,以描述所有者的特定子集,这些所有者通过合约修饰符 Owned
和 IssuerControlled
以及函数修饰符 onlyOwner
和 onlyIssuerTransferAgent
自动执行合规性并使其去中心化。Owned
合约修饰符为函数实例化 onlyOwner
修饰符。IssuerControlled
修饰符为函数实例化 onlyIssuerTransferAgent
修饰符。
ERC-1450
必须阻止任何人执行 transfer
、allowance
和 approve
函数,和/或实现这些函数以始终失败。ERC-1450
更新了 transferFrom
、mint
和 burnFrom
函数。transferFrom
、mint
和 burnFrom
只能由 RTA 执行,并且受到 onlyIssuerTransferAgent
修饰符的限制。此外,ERC-1450
定义了函数 transferOwnership
、setTransferAgent
、setPhysicalAddressOfOperation
和 isTransferAgent
。只有发行人可以调用 transferOwnership
、setTransferAgent
和 setPhysicalAddressOfOperation
函数。任何人都可以调用 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
修饰符。IssuerControlled
为 ERC-1450
实例化 onlyIssuerTransferAgent
修饰符,以启用特定函数(setPhysicalAddressOfOperation
和 setTransferAgent
)以允许只有发行人才能执行这些函数。
注册转账代理控制
ERC-1450
定义了 setTransferAgent
函数(用于更改 RTA)和 setPhysicalAddressOfOperation
函数(用于更改发行人的地址),并且必须使用 onlyOwner
修饰符将执行限制为发行人的所有者。setTransferAgent
必须发出 TransferAgentUpdated
事件。setPhysicalAddressOfOperation
必须发出 PhysicalAddressOfOperationUpdated
事件。
ERC-1450
必须在其构造函数中指定 transferAgent
,并实例化 onlyIssuerTransferAgent
修饰符以启用特定函数(transferFrom
、mint
和 burnFrom
)以允许只有发行人的 transferAgent
地址才能执行它们。ERC-1450
还定义了公共函数 isTransferAgent
以查找和识别发行人的 RTA。
证券
ERC-1450
通过应用 onlyIssuerTransferAgent
来更新 transferFrom
、mint
和 burnFrom
函数,以实现证券的发行、重新发行和交易。
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 才能 mint
和 transferFrom
证券。
实施者必须维护链下服务和数据库,以记录和跟踪投资者的姓名、物理地址、以太坊地址和证券所有权金额。实施者和 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.