ERC1450 -A compatible security token for issuing and trading SEC-compliant securities
まとめ
USの証券法例外規定、RegCF, RegA, RegD準拠に特化した規格
Registered Transfer Agent(以下、RTAと呼ぶ)、によって管理することで実現
取引所やBrokerとは異なり、移転記録管理のみを役割とする
最初のTransfer agentはStartEngine Secure
コントラクトを書くのもRTA
PrimaryもSecondaryもagentが管理するのですごく中央集権的
最初にRTAに就任するStartEngineが主導権を握るエコシステムになる可能性もある
Modifierによって主要関数はRTA, Ownerのみが呼び出せるようになっている
私見:
modifierで強制的にアクセス制限して法準拠しました!っていうごり押し感ww
ERC20の拡張とか言いながらアクセス制限ができないfunction transferとかfunction transferFromとかは使えない設計になっている(マジか
正直RTAの質次第に準拠性が依っちゃってね?
Registered Transfer Agent とは
RTAの役割:
各投資家の情報と保有トークン数とを管理
発行体から年間使用量を徴収する
ATSとのトークン移転のためのスマートコントラクト作成
RTAの条件:
アメリカに登記を置く会社であること
SECよりRegistered Transfer Agentであると認可を受けていること
譲渡記録を残す技術を持っていること
インターフェース
code:ERC1450(javascript)
/**
* ERC-1450 is an ERC-20 compatible token that facilitates compliance with one or more of Securities Act Regulations CF, D and A.
*
* Implementations of the ERC-1450 standard must define the following optional ERC-20
* fields:
*
* name - The name of the security
* symbol - The symbol of the security
*
* Implementations of the ERC-1450 standard must specify the following constructor
* arguments:
*
* _owner - the address of the owner
* _transferAgent - the address of the transfer agent
* _name - the name of the security
* _symbol - the symbol of the security
*
* Implementations of the ERC-1450 standard must implement the following contract
* modifiers:
*
* Owned - Only the address of the security’s issuer is permitted to execute the
* token’s constructor. This modifier also sets up the onlyOwner function modifier.
* IssuerControlled - This modifier sets up the onlyIssuerTransferAgent function modifier.
*
* Implementations of the ERC-1450 standard must implement the following function
* modifiers:
*
* onlyOwner - Only the address of the security’s issuer is permitted to execute the
* functions transferOwnership, setTransferAgent, and setPhysicalAddressOfOperation.
* onlyIssuerTransferAgent - Only the address of the issuer’s Registered Transfer
* Agent is permitted to execute the functions transferFrom, mint, and burnFrom.
*
* Implementations of the ERC-1450 standard must implement the following required ERC-20
* event to always fail:
*
* Approval - Should never be called as the functions that emit this event must be
* implemented to always fail.
*
* Implementations of the ERC-1450 standard must implement the following required
* ERC-20 functions to always fail:
*
* transfer - Not a legal, regulated call for transferring securities because
* the token holder initiates the token transfer. The function must be implemented to
* always fail.
* allowance - Not a legal, regulated call for transferring securities because
* the token holder may not allow third parties to initiate token transfers. The
* function must be implemented to always fail.
* approve - Not a legal, regulated call for transferring securities because
* the token holder may not allow third parties to initiate token transfers. The
* function must be implemented to always fail.
*
* Implementations of the ERC-1450 standard must implement the following optional
* ERC-20 function:
* decimals - Must return '0' because securities are indivisible entities.
*
* Implementations of the ERC-1450 standard must implement the following functions:
*
* mint - Only the address of the issuer's Registered Transfer Agent may create new
* securities.
* burnFrom - Only the address of the issuer’s Registered Transfer Agent may burn or
* destroy securities.
*/
Contract ERC-1450 is Owned, IssuerControlled {
/**
* The constructor must implement a modifier (Owned) that creates the onlyOwner modifier
* to allow only the address of the issuer (the owner) to execute the transferOwnership,
* setTransferAgent, and setPhysicalAddressOfOperation functions. The construct must also
* implement a modifier (TransferAgentControlled) that creates the onlyIssuerTransferAgent
* modifier to allow only the address of the issuer’s Registered Transfer Agent to execute
* the functions transferFrom, mint, and burnFrom).
*/
constructor(address _owner, address _transferAgent, string _name, string _symbol)
Owned(_issuer) TransferAgentControlled(_transferAgent) public;
/**
* Specify that only the owner (issuer) may execute a function.
*
* onlyOwner requires the msg.sender to be the owner’s address.
*/
modifier onlyOwner();
/**
* Specify that only the issuer’s transferAgent may execute a function.
*
* onlyIssuerTransferAgent requires the msg.sender to be the transferAgent’s address.
*/
modifier onlyIssuerTransferAgent();
/**
* Transfer ownership of a security from one issuer to another issuer.
*
* transferOwnership must implement the onlyOwner modifier to only allow the
* address of the issuer’s owner to transfer ownership.
* transferOwnership requires the _newOwner address to be the address of the new
* issuer.
*/
function transferOwnership(address _newOwner) public onlyOwner;
/**
* Triggered after transferOwnership is executed.
*/
event OwnershipTransferred()
/**
* Sets the transfer agent for the security.
*
* setTransferAgent must implement the onlyOwner modifier to only allow the
* address of the issuer’s specify the security’s transfer agent.
* setTransferAgent requires the _newTransferAgent address to be the address of the
* new transfer agent.
*/
function setTransferAgent(address _newTransferAgent) public onlyOwner;
/**
* Triggered after setTransferAgent is executed.
*/
event TransferAgentUpdated(address indexed previousTransferAgent, address indexed
newTransferAgent);
/**
* Sets the issuers physical address of operation.
*
* setPhysicalAddressOfOperation must implement the onlyOwner modifier to only allow
* the address of the issuer’s owner to transfer ownership.
* setPhysicalAddressOfOperation requires the _newPhysicalAddressOfOperation address
* to be the new address of the issuer.
*/
function setPhysicalAddressOfOperation(string _newPhysicalAddressOfOperation) public
onlyOwner;
/**
* Triggered after setPhysicalAddressOfOperation is executed.
*/
event PhysicalAddressOfOperationUpdated(string previousPhysicalAddressOfOperation,
string newPhysicalAddressOfOperation);
/**
* Look up the security’s transfer agent.
*
* isTransferAgent is a public function.
* isTransferAgent requires the _lookup address to determine if that address
* is the security’s transfer agent.
*/
function isTransferAgent(address _lookup) public view returns (bool);
/**
* transfer is not a legal, regulated call and must be implemented to always fail.
*/
transfer(address to, uint tokens) public returns (bool success);
/**
* Approval does not have to be implemented. This event should never be triggered as
* the functions that emit this even are not legal, regulated calls.
*/
event Approval(address indexed tokenOwner, address indexed spender, uint tokens);
/**
* allowance is not a legal, regulated call and must be implemented to always fail.
*/
allowance(address tokenOwner, address spender) public constant returns (uint remaining);
/**
* approve is not a legal, regulated call and must be implemented to always fail.
*/
approve(address spender, uint tokens) public returns (bool success);
/**
* Transfer securities.
*
* transferFrom must implement the onlyIssuerTransferAgent modifier to only allow the
* address of the issuer’s Registered Transfer Agent to transfer ERC-1450s.
* transferFrom requires the _from address to have _value tokens.
* transferFrom requires that the _to address must not be 0 because securities must
* not destroyed in this manner.
*/
function transferFrom(address _from, address _to, uint256 _value) public
onlyIssuerTransferAgent returns (bool);
/**
* Create new securities.
*
* mint must implement the onlyIssuerTransferAgent modifier to only allow the address
* of the issuer’s Registered Transfer Agent to mint ERC-1450 tokens.
* mint requires that the _to address must not be 0 because securities must
* not destroyed in this manner.
* mint must add _value tokens to the _to address and increase the totalSupply by
* _value.
* mint must emit the Transfer event.
*/
function mint(address _to, uint256 _value) public onlyIssuerTransferAgent returns
(bool);
/**
* Burn or destroy securities.
*
* burnFrom must implement the onlyIssuerTransferAgent modifier to only allow the
* address of the issuer’s Registered Transfer Agent to burn ERC-1450s.
* burnFrom requires the _from address to have _value tokens.
* burnFrom must subtract _value tokens from the _from address and decrease the
* totalSupply by _value.
* burnFrom must emit the Transfer event.
*/
function burnFrom(address _who, uint256 _value) public onlyIssuerTransferAgent returns
(bool);
}
Source