1瘾带,關于ERC1400
"ERC1400"是新提案的證券型代幣的標準,新標準主要是把 Token 的互換性(fungible)結合證券相關的業(yè)務場景熟菲,設計了一套通用接口看政。
標準制定了 Token 持有人的余額分離成多個分片(tranche)的能力。tranche 是一種以債務為基礎的投資結構抄罕。這些證券將具有不同期限的允蚣,投資風險或高或低的 tranche 組合成一個整體,以達到降低投資者的風險呆贿,提供長期投資的目的嚷兔。例如,你可能有一筆貸款轉付證券做入,其中包括5到30年期的高風險和低風險的轉付證券冒晰,基于 ERC1400 標準的 Token 將支持這種投資方式。
我們先了解 ERC777 標準竟块,ERC777 是 ERC20 的加強版壶运,旨在加強用戶的控制權限,具體有:
1. 隨交易發(fā)送可以附帶描述數據浪秘,以供某些業(yè)務場景使用
2. 設置一些轉賬限制前弯,如黑名單
3. 支持一些高級交易
無論是 ERC20 還是 ERC777,每個單位的 Token 都是相同的秫逝,并無附加屬性恕出,屬于 fungible token(同質化代幣/可互換 Token)。ERC721標準的 Token违帆,每個 Token 均有不同的ID浙巫,不同ID可以有不同的解釋,屬于 no-fungible token(非同質化 Token刷后,不可互換 Token)
ERC1410標準的 Token 屬于Partially-Fungible Token (部分可互換 Token )的畴,將 ERC20/ERC777 中不存在解釋屬性的余額,附加額外的信息尝胆,從而劃分成不同的部分丧裁,就可以做一些操作上的限制(例如:某些操作只限定于指定 tranche 的 Token,某些操作優(yōu)先消耗指定tranche的 Token)
ERC1400 則是繼承 ERC1410 標準含衔,增加了證券相關業(yè)務會使用到的函數:證券增發(fā)煎娇,相關法律文件存儲等二庵。
先前一些證券型 Token 的合約大多是在 ERC20 標準的基礎上,通過維護一個或多個以太坊地址集合缓呛,對這部分地址做出了劃分:是否通過kyc催享,是否處于鎖定期等,來進行轉賬上的限制哟绊。這些都是在地址層面做出不同的解釋因妙。而 ERC1400 對 Token 本身做了不同解釋,以適用于更復雜的證券相關業(yè)務場景票髓。
關于ERC20攀涵,以及其它ERC成員的關系,可見下圖:
2洽沟, Security Token Standard
eip: ERC1400
標題: Standard for Security Tokens
作者: Adam Dossa (@adamdossa), Pablo Ruiz (@pabloruiz55), Fabian Vogelsteller (@frozeman), Stephane Gosselin (@thegostep)
譯者: Jason(來自臨界Hashgard團隊)
狀態(tài): Draft
類型: Standards Track
范疇: ERC
創(chuàng)建于: 2018-09-09
需要: ERC-777, ERC-1066
Motivation
通過指定一套標準的接口汁果,加速發(fā)行和管理以太坊上的證券,通過該接口所有相關方可以查詢和操作證券型代幣玲躯。
證券型代幣與其他代幣用例存在重大差異据德,鏈上與鏈下參與者的交互更加復雜,有著相當嚴格的監(jiān)管審查跷车。
證券型代幣應該能夠對標任何資產類別棘利,在任何司法管轄區(qū)內發(fā)型和管理,并遵守相關的監(jiān)管限制朽缴。
Requirements
將證券的發(fā)行善玫,交易和生命周期事件遷移到公共賬本上需要采用標準的方式對證券,其所有權及其在鏈上的屬性進行建模密强。
經證券型代幣生態(tài)中各方討論后茅郎,編寫了如下的要求:
必須有一個標準的接口來查詢一筆轉賬交易是否成功,失敗的話則返回原因或渤。
必須能夠強制轉賬以應對法律訴訟或資金回收系冗。
必須發(fā)布用于發(fā)行和贖回的標準事件。
必須能將一些數據附加到代幣持有者余額的子集上薪鹦,例如特殊股東權利或是轉賬限制的數據掌敬。
必須能根據離線數據,鏈上數據和轉賬的參數在轉賬時修改元數據池磁。
可能需要將簽名數據傳遞到轉賬交易中奔害,以便于在鏈上驗證。
不應該限制可以代表司法管轄區(qū)內的資產類別范圍地熄。
應該兼容ERC20和ERC777標準华临。
Structure
1. `ERC-1400: Security Token Standard`
2. `ERC-w: Semi-Fungible Token`
3. `ERC-w-1: Tranche metadata schema`
4. `ERC-x: Permissioned Token Transfers (canSend() and status codes)`
5. `ERC-y: Token Metadata (set/getDocument)`
6. `ERC-z: Optional Security Token features`
7. `Forced transfers`
8. `Permanent end to Issuance`
9. `Trading Halts`
10. `Batched transfers`
Semi-Fungible Token
- 1410 Partially-Fungible Token (部分可互換代幣)
Permissioned Token Transfers
1400 Security Token Standard (證券型代幣標準)
1404 Simple Restricted Token Standard (簡單的受限代幣標準)
Abstract
有許多類型的證券雖然代表相同的標的資產,但需要有與之相關的差異化數據端考。
這些額外的元數據隱含地使這些證券不可置換雅潭,但實際上這些數據通常應用于證券的一個子集而不是單個證券揭厚。將令牌持有者的余額劃分為各個部分的能力,每個部分具有單獨的元數據寻馏,在 Partially-Fungible Token 部分中進行了說明棋弥。
例如核偿,代幣持有人的余額可以分為兩部分:在首次發(fā)行期間發(fā)行的代幣和通過二級市場交易得到的代幣诚欠。
證券代幣合同可以引用該元數據去應用額外的邏輯來決定轉賬是否有效,并確定一旦轉賬到接收方賬戶中漾岳,這些代幣所關聯(lián)的原數據轰绵。
這些條件可能與正在轉賬的證券代幣關聯(lián)的元數據有關(即它們是否受制于鎖定期),證券發(fā)送方和接收方的身份(即他們是否通過了KYC流程尼荆,是否是經認可的左腔,或是發(fā)行方的附屬公司)或者是與具體轉賬無關的原因,而是設定在代幣的級別上(即代幣合同強制執(zhí)行投資人數量的上限捅儒,或任何單一投資人持有的百分比上限)液样。
對于ERC20/ERC777代幣而言, balanceOf
和 allowance
方法提供了一個在執(zhí)行轉賬之前檢查轉賬是否可能成功的方法巧还,轉賬在鏈上或是鏈下都可以執(zhí)行鞭莽。
對于標的證券的代幣而言,這個標準引入了一個函數 canSend
麸祷,當失敗的原因更加復雜的時候澎怒,它提供了一種更通用的方法來實現這一目的。還引入了一個用于整個轉賬行為的函數(即包括同轉賬一起發(fā)送的任意數據和證券的接收方)
為了提供同true或false相比更加豐富的信息阶牍,會返回一個字節(jié)返回碼喷面。這使得我們能夠說明轉賬失敗的原因,或者至少是失敗原因的類別走孽。查詢文檔的能力和對轉賬成功的預期會包含在 Security Token 部分中說明惧辈。
1410 - Partially-Fungible Token
一個 Partially-Fungible Token 允許將元數據關聯(lián)到代幣持有者余額當中的一部分上面。這些部分的余額稱為 tranches (tranche磕瓷,實際上是一個法語單詞意為“切片”或“部分”咬像。在投資界,用來描述可以被分割成并賣給投資者的小額證券生宛。)县昂,并由 bytes32_tranche
鍵來建立索引,該鍵可以同鏈上或鏈下的元數據相關聯(lián)陷舅。
Sending Tokens
代幣轉賬始終具有關聯(lián)的源tranche和目標tranche倒彰,以及通常的轉賬數量和發(fā)送方/接收方的地址。
getDefaultTranches
為了提供對ERC777的兼容性莱睁,實現需要決定在執(zhí)行ERC777發(fā)送函數時要使用哪一個tranche待讳。
這個函數返回在此情況下使用的tranches芒澜。例如,一個證券型代幣可以返回 byte32("unrestricted")
tranche, 或者使用一小組可能的tranches的簡單實現创淡,可以返回與代幣持有者相關聯(lián)的所有tranches痴晦。
返回值可以為空,這意味著沒有默認的tranche(因此ERC777的發(fā)送函數將拋出錯誤)琳彩,或者返回多個tranches誊酌,在這種情況下,ERC777的發(fā)送函數應該按照順序循環(huán)遍歷這些tranches露乏,直到指定數量的代幣已經成功轉賬碧浊。
1. `function getDefaultTranches(address _tokenHolder) external view returns (bytes32[]);`
setDefaultTranches
允許為指定的地址設置默認的tranches,將會在ERC777的發(fā)送函數執(zhí)行時使用到這些設置瘟仿。
這個函數可以供所有代幣持有人自行調用箱锐,或僅限于那些實現了某些必要行為的持有人。
1. `function setDefaultTranche(bytes32[] _tranches) external;`
balanceOfByTranche
除了有查詢所有tranches下總的代幣余額的 balanceOf
劳较,也要有查詢某個特定tranche下代幣余額的函數驹止。
1. `function balanceOfByTranche(bytes32 _tranche, address _tokenHolder) external view returns (uint256);`
sendByTranche
通過拓展ERC777標準并提供一個默認的tranche(通過 getDefaultTranches
函數獲取),就可以發(fā)送代幣了(從默認的tranches)观蜗。要從一個特定的tranche來發(fā)送代幣的話臊恋,可以使用 sendByTranche
函數。
例如嫂便,一個有權限的代幣可以使用tranche元數據來強制執(zhí)行如下的轉賬限制:
_tranche
值與
_tranche
值相關聯(lián)的任何額外數據(例如捞镰,可能與_tranche
關聯(lián)的鎖定時間戳)與代幣的發(fā)送方或接收方相關聯(lián)的任何細節(jié)(例如,他們的身份信息已經創(chuàng)建)
轉賬的代幣數量(比如毙替,它是否遵守任意按天或者基于其他時間周期的轉賬數量限制)
_data
參數允許調用者提供與轉賬相關的任何附加的授權或詳細信息(例如岸售,來自一個被允許對轉賬行為進行授權的授權實體的簽名數據)
其它的用例包括通過把先前的持有者與目標tranches關聯(lián)起來,跟蹤代幣的出處厂画。
如果轉賬代幣因某種原因失敗凸丸,這個函數必須拋出錯誤。
當從特定的tranche上轉賬代幣時袱院,了解這些代幣的鏈上的(即不僅是通過一個響應的事件)目標tranche是有用的屎慢。目標tranche將會由這個函數的實施來決定,并依據用例而有所不同忽洛。
這個函數在轉賬成功時必須觸發(fā)一個 SentByTranche
事件腻惠。
1. `function sendByTranche(bytes32 _tranche, address _to, uint256 _amount, bytes _data) external returns (bytes32);`
2. `function sendByTranches(bytes32[] _tranches, address[] _tos, uint256[] _amounts, bytes _data) external returns (bytes32);`
redeemByTranche
允許代幣持有者贖回(銷毀)代幣。
必須從代幣總量和代幣持有人賬戶里扣除已銷毀或已贖回的代幣欲虚。銷毀代幣應該像發(fā)送代幣一樣集灌,受到相同條件的限制。每次此函數被調用時复哆,必須觸發(fā) RedeemedByTranche
事件欣喧。
1. `function redeemByTranche(bytes32 _tranche, uint256 _amount, bytes _data) external;`
tranchesOf
代幣持有者可以把他們的余額拆分成多個部分(tranches) —— 此函數將返回與特定代幣持有者地址關聯(lián)的所有tranches腌零。
1. `function tranchesOf(address _tokenHolder) external view returns (bytes32[]);`
Operators
操作者可以獲得以下授權:
所有的代幣持有人和tranches(
defaultOperators
繼承自ERC777標準)一個特定tranche的所有代幣持有人(
defaultOperatorsByTranche
)一個特定代幣持有人(
isOperatorFor
繼承自ERC777標準)的所有tranches(當前的和以后的)一個特定代幣持有人的特定的一個tranche(
isOperatorForTranche
)
defaultOperatorsByTranche
此函數返回默認的由所有代幣持有人和一個特定tranche授權的操作者集合。
1. `function defaultOperatorsByTranche(bytes32 _tranche) external view returns (address[]);`
authorizeOperatorByTranche
允許一個代幣持有人去為他的某個指定tranche的代幣設置一個操作人唆阿。
每次調用此函數時益涧,必須觸發(fā) AuthorizedOperatorByTranche
事件
1. `function authorizeOperatorByTranche(bytes32 _tranche, address _operator) external;`
revokeOperatorByTranche
允許一個代幣持有人撤銷其某個特定tranche的代幣的操作人。
注意 —— 操作人可能會通過 defaultOperatorsByTranche
或 defaultOperators
保留對該代幣持有人和tranche的授權驯鳖。
每次調用此函數時闲询,必須觸發(fā) RevokedOperatorByTranche
事件。
1. `function revokeOperatorByTranche(bytes32 _tranche, address _operator) external;`
isOperatorForTranche
返回某個特定地址是否是給定代幣持有人和tranche的操作人臼隔。
如果地址是上述任何類別下的操作人嘹裂,則應該返回TRUE妄壶。
1. `function isOperatorForTranche(bytes32 _tranche, address _operator, address _tokenHolder) external view returns (bool);`
operatorSendByTranche
允許操作人代表代幣持有人發(fā)送證券型代幣摔握。
此函數應該返回接收方的 bytes32 _tranche
。
如果是在鏈下生成的話丁寄,接收方的 bytes32 _tranche
可以在 bytes _data
中定義氨淌。
如果此函數被一個缺少由 isOperatorForTranche
定義的合適授權的地址調用的情況下,必須回退伊磺。
此函數在成功發(fā)送代幣后必須觸發(fā)一個 SentByTranche
事件盛正。
1. `function operatorSendByTranche(bytes32 _tranche, address _from, address _to, uint256 _amount, bytes _data, bytes _operatorData) external returns (bytes32);`
2. `function operatorSendByTranches(bytes32[] _tranches, address[] _froms, address[] _tos, uint256[] _amounts, bytes _data, bytes _operatorData) external returns (bytes32[]);`
operatorRedeemByTranche
允許一個操作人代表代幣持有人銷毀或贖回代幣。
必須從代幣供應總量和代幣持有人賬戶中扣除被銷毀或贖回的數量屑埋。銷毀代幣應該同發(fā)送代幣一樣豪筝,收到相同的條件限制。每次調用此函數時必須觸發(fā) RedeemedByTranche
事件摘能。
1. `function operatorRedeemByTranche(bytes32 _tranche, address _tokenHolder, uint256 _amount, bytes _operatorData) external;`
Interface
1. `/// @title ERC-PFT Fungible Token Metadata Standard`
2. `/// @dev See https://github.com/SecurityTokenStandard/EIP-Spec`
4. `interface IERCPFT is IERC777 {`
6. `function getDefaultTranches(address _tokenHolder) external view returns (bytes32[]);`
7. `function setDefaultTranche(bytes32[] _tranches) external;`
8. `function balanceOfByTranche(bytes32 _tranche, address _tokenHolder) external view returns (uint256);`
9. `function sendByTranche(bytes32 _tranche, address _to, uint256 _amount, bytes _data) external returns (bytes32);`
10. `function sendByTranches(bytes32[] _tranches, address[] _tos, uint256[] _amounts, bytes _data) external returns (bytes32[]);`
11. `function operatorSendByTranche(bytes32 _tranche, address _from, address _to, uint256 _amount, bytes _data, bytes _operatorData) external returns (bytes32);`
12. `function operatorSendByTranches(bytes32[] _tranches, address[] _froms, address[] _tos, uint256[] _amounts, bytes _data, bytes _operatorData) external returns (bytes32[]);`
13. `function tranchesOf(address _tokenHolder) external view returns (bytes32[]);`
14. `function defaultOperatorsByTranche(bytes32 _tranche) external view returns (address[]);`
15. `function authorizeOperatorByTranche(bytes32 _tranche, address _operator) external;`
16. `function revokeOperatorByTranche(bytes32 _tranche, address _operator) external;`
17. `function isOperatorForTranche(bytes32 _tranche, address _operator, address _tokenHolder) external view returns (bool);`
18. `function redeemByTranche(bytes32 _tranche, uint256 _amount, bytes _data) external;`
19. `function operatorRedeemByTranche(bytes32 _tranche, address _tokenHolder, uint256 _amount, bytes _operatorData) external;`
21. `event SentByTranche(`
22. `bytes32 indexed fromTranche,`
23. `bytes32 toTranche,`
24. `address indexed operator,`
25. `address indexed from,`
26. `address indexed to,`
27. `uint256 amount,`
28. `bytes data,`
29. `bytes operatorData`
30. `);`
31. `event AuthorizedOperatorByTranche(bytes32 indexed tranche, address indexed operator, address indexed tokenHolder);`
32. `event RevokedOperatorByTranche(bytes32 indexed tranche, address indexed operator, address indexed tokenHolder);`
33. `event RedeemedByTranche(bytes32 indexed tranche, address indexed operator, address indexed from, uint256 amount, bytes data, bytes operatorData);`
34. `event IssuedByTranche(bytes32 indexed tranche, address indexed operator, address indexed to, uint256 amount, bytes data, bytes operatorData);`
35. `}`
Notes
ERC20 / ERC777 Backwards Compatibility (向后兼容ERC20/ERC777標準)
為了保持向后兼容ERC20/ERC777(以及其它可互換代幣標準)续崖,必須去定義在執(zhí)行一個 transfer
/ send
操作時(即未指定tranche時),應該使用哪一個或者哪幾個tranche团搞。
如果函數實現保證每個代幣持有人盡可能的tranches的數量严望,則迭代代幣持有人的所有tranches(通過 tranchesOf
)是合理的。
代幣創(chuàng)建者必須為所有的代幣持有人指定一個或多個默認的供ERC20/ERC777標準下函數使用的tranche逻恐。每個代幣持有人或者其所有tranches的代幣余額的操作者像吻,可以更改代幣持有人的默認tranche。代幣持有人去更改他們的默認tranche的能力允許他們更改顯示在還未兼容ERC_PFT的ERC20/ERC777錢包中的tranche复隆。
以下是對ERC777標準函數的實現描述:
send()
必須使用getDefaultTranche()
來獲取默認的tranche拨匆。opratorSend()
必須使用getDefaultTranche()
獲取默認的tranche。REDEEM()
必須使用getDefaultTranche()
來獲取默認的tranche挽拂。opratorRedeem()
必須使用getDefaultTranche()
獲取默認的tranche惭每。balanceOf()
必須計算指定代幣持有人的所有tranche的余額總量。totalSupply()
必須返回被該合約跟蹤的所有代幣總量轻局。defaultOperators()
必須查詢可以操作所有地址和tranches的操作人列表洪鸭。authorizeOperator()
必須對msg.sender
的所有tranches授權一個操作人样刷。revokeOperator()
必須撤銷先前對msg.sender
的所有tranches授權的操作人。isOperatorFor()
必須查詢_operator
是否是_tokenHolder
所有tranches的一個操作人览爵。事件
Minted()
和IssuedByTranche()
必須在代幣供應總量有任何增長時觸發(fā)置鼻。事件
Burned()
和RedeemedByTranche()
必須在代幣供應總量有任何減少時觸發(fā)。事件
AuthorizedOperator()
必須由authorizeOperator()
觸發(fā)蜓竹。事件
RevokedOperator()
必須由revokeOperator()
觸發(fā)箕母。
3,ERC1400 - Security Token
Methods
getDocument / setDocument
這些函數用于管理與代幣關聯(lián)的一個文檔庫俱济。這些文件可以是法律文件或者是其他參考資料嘶是。
文檔與短名稱(表示為一個 bytes32
)相關聯(lián),并且可以選擇有一個同其鏈上相關聯(lián)的文檔內容的哈希值蛛碌。
1. `function getDocument(bytes32 _name) external view returns (string, bytes32);`
2. `function setDocument(bytes32 _name, string _uri, bytes32 _documentHash) external;`
canSend
證券轉讓可能由于多種原因失敗聂喇,例如:
代幣發(fā)送方或接收方的身份信息。
對轉賬的特定代幣的限制(即與轉讓代幣相關tranche的限制)
對代幣總體狀態(tài)相關的限制(即投資人總數)
該標準提供了一個鏈上函數蔚携,用于決定轉賬是否能成功希太,并返回指示轉賬失敗原因的詳細原因。
這些規(guī)則可以由智能合約還有鏈上數據來定義酝蜒,或者依賴可以表示對轉賬進行授權的 sendByTranche
函數(例如誊辉,聲明轉賬有效性的轉賬代理的簽名信息)返回的部分 _data
。
此函數將會返一個遵循ERC-1066標準的ESC (Ethereum Status Code亡脑,以太坊狀態(tài)碼)堕澄,還有一個可以用于定義程序指定原因碼及額外詳細信息(例如,執(zhí)行發(fā)送操作的轉賬限制無效)的 bytes32
參數
此函數也會以與 sendByTranche
類似的方式返回所轉賬代幣的目標tranche
1. `function canSend(address _from, address _to, bytes32 _tranche, uint256 _amount, bytes _data) external view returns (byte, bytes32, bytes32);`
issuable
一個證券型代幣發(fā)行人可以指定此代幣的發(fā)行已結束(即霉咨,不能鑄造或發(fā)行新的代幣)
如果代幣在 issuable()
返回的是false蛙紫,今后只能返回false。
1. `function issuable() external view returns (bool);`
issueByTranche
此函數在增長代幣供應總量時必須被調用躯护。
在調用時惊来,此函數必須觸發(fā) IssuedByTranche
事件。
1. `function issueByTranche(bytes32 _tranche, address _tokenHolder, uint256 _amount, bytes _data) external;`
Interface
1. `/// @title ERC-ST Fungible Token Metadata Standard`
2. `/// @dev See https://github.com/SecurityTokenStandard/EIP-Spec`
4. `interface IERCST is IERCPFT {`
5. `function getDocument(bytes32 _name) external view returns (string, bytes32);`
6. `function setDocument(bytes32 _name, string _uri, bytes32 _documentHash) external;`
7. `function issuable() external view returns (bool);`
8. `function canSend(address _from, address _to, bytes32 _tranche, uint256 _amount, bytes _data) external view returns (byte, bytes32, bytes32);`
9. `function issueByTranche(bytes32 _tranche, address _tokenHolder, uint256 _amount, bytes _data) external;`
10. `}`
Notes
Forced Transfers
可能是法規(guī)要求發(fā)行人或受信任的第三方保留代表投資人轉賬代幣的權利棺滞。因此裁蚁,ERC-ST規(guī)范取代ERC-PFT,因為不得允許代幣持有人撤銷默認的操作人继准。
Restricted Transfers
相比實用型代幣枉证,證券型代幣的轉賬可能因為多種原因而失敗,而實用型代幣通常僅要求發(fā)送方有足夠的余額移必。
這些條件可能與被轉賬的證券型代幣的元數據有關(即它們是否受制于鎖定周期)室谚,代幣發(fā)送方和接收方的身份及資格(即他們是否已經通過了KYC,是否是可信任的或是發(fā)行方的附屬機構),或者出于與特定轉賬無關的原因秒赤,而是出于監(jiān)管下證券層面的原因(即證券強制執(zhí)行投資者的最大數量和單一投資者持有百分比的最高上限)猪瞬。
對于實用型代幣(ERC20/ERC777標準的), balanceOf
和 allowance
函數提供了一種方式用以在執(zhí)行轉賬操作前檢查轉賬是否可能成功入篮,可以在鏈上或鏈下執(zhí)行陈瘦。
該標準引入了一個函數 canSend
,它提供了一種更通用的方法來查詢發(fā)送代幣能否成功潮售。它接收一組參數痊项,參數可能包括簽名數據,并返回關于交易成功或失敗的原因字節(jié)碼酥诽。
注意——調用 canSend
的結果可能會根據鏈上狀態(tài)(包括區(qū)塊高度或時間戳)和鏈下預言機發(fā)生改變鞍泉。因此,在作為不修改任何狀態(tài)的視圖函數被調用之后肮帐,它不能保證將來的轉賬一定會成功咖驮。
Identity
在許多司法管轄區(qū),一方能否接收和發(fā)送證券型代幣依賴于該方身份的特征泪姨。例如游沿,在一方有資格購買或出售特定的證券之前饰抒,絕大多數的司法管轄區(qū)都要求具有某種程度的 KYC/AML 流程肮砾。另外,一方可能被分類到投資人資格類別(比如袋坑,合格的投資人和購買者)仗处,并且他們的公民身份也可以告知與其證券相關聯(lián)的限制。
多種身份標準(比如ERC725枣宫,Civic婆誓,uPort)可用于捕獲某一方的身份數據,以及集中管理的其他方法(例如也颤,維護一個經KYC批準的地址白名單)洋幻。這些身份標準的共同之處是以太坊地址(可以是一方的錢包地址或者身份合同),因此 canSend
函數可以使用證券型代幣的發(fā)送方和接收方的地址作為確定是否符合資格要求身份的代理翅娶。
除此之外文留,該標準并未強制要求任何特定的身份識別方法。
Reason Codes
為了改善代幣持有人的體驗竭沫, canSend
必須依據下面指定的ERC-1066標準應用程序特定狀態(tài)代碼返回成功或失敗的原因字節(jié)碼燥翅。具體的實現還可以將任意數據以 bytes32
的形式返回,以提供原因碼以外的額外的信息
Code
Reason
0xA0
Transfer Verified - Unrestricted
0xA1
Transfer Verified - On-Chain approval for restricted token
0xA2
Transfer Verified - Off-Chain approval for restricted token
0xA3
Transfer Blocked - Sender lockup period not ended
0xA4
Transfer Blocked - Sender balance insufficient
0xA5
Transfer Blocked - Sender not eligible
0xA6
Transfer Blocked - Receiver not eligible
0xA7
Transfer Blocked - Identity restriction
0xA8
Transfer Blocked - Token restriction
0xA9
Transfer Blocked - Token granularity
On-chain vs. Off-chain Transfer Restrictions
確定一個證券型代幣能否被發(fā)送的規(guī)則是可以自動執(zhí)行的(例如蜕提,對證券投資人的最大數量限制)森书,或者需要一些鏈下的輸入(比如,經紀人對交易的明確批準)。為了方便線下的情況凛膏, sendByTranche
和 canSend
函數接收一個額外的 _data
參數杨名,該參數可以由批準方簽名并用于驗證傳輸。
此規(guī)范超出了本標準的范圍猖毫,具體的實現也是特定的镣煮。
本文轉載自《ERC1400提案中文版,關于ERC的新成員鄙麦,你想要知道的都在這里了》典唇,翻譯版權屬于原作者
- 官網參考:
1) ERC 1400: Security Token Standard #1411
https://github.com/ethereum/EIPs/issues/1411
2) ERC 1410: Partially Fungible Token Standard #1410
https://github.com/ethereum/EIPs/issues/1410