ERC1594 -Core Security Token Standard
まとめ
証券法準拠において、譲渡制限は最もコアとなる部分
譲渡制限の可否をboolではなくbyteで返答することが特徴
拒否理由を記述するため
償還を定めた関数も設置
償還期間を定めた証券もあるため、償還が可能になっている必要がある
on-chain認証と、off-chain認証と両方に対応している点が特徴的
off-chain認証だった場合:bytes _dataを利用
それぞれ認証に必要なプレイヤーが署名をしたデータを利用する
on-chain認証だった場合:address _toをそのまま認証に利用
Tomato.icon <要・追加調査。on-chainでの認証のイメージが具体的にわかってない
内容
制限譲渡に関する部分
function canTransfer:通常の送付における制限をチェックする関数
Inputs:
address _to: 送信先のアドレス
uint256 _value:送信量
bytes _data:function transferWithDataで添付されたデータ
これがあった場合、transferWithDataのデータが譲渡制限に引っかからないかをチェックする
この変数は空でも可能:
空だった場合は、_toが譲渡制限に引っかからないかをチェックする
他の規格を利用して、addressの認証情報をon-chainでチェックできる場合に利用
Return:
byte: 認証結果を返答
bytes32:カスタマイズした認証結果を返答
規格では当てはまらない場合をサポートするため、カスタマイズできる返答を用意している
function canTransferFrom:第三者が送付する場合
function canTransferに変数address _fromがついただけ
これはmsg.senderではないアドレスがトークンを送付しようとする場合に利用
ERC20のtransferとtransferFromとの違いと同じ
tomato.icon<ERC1644のcontrollerTransferと何が違うん?
tomato.icon< ERC777になぜERC20にapproveがあるのにoperatorを加えたのかが説明されている。嫁。
function transferWithData:譲渡移転に関する資料データを添付して送金する関数
Input:
address _to:送付先
uint256 _value:送付量
byte _data:送付の許可の認証を得たことを示すデータ
トークン送信者、認証機関両者による電子署名を合わせたデータ
実装で自由に設定
Return:特になし(bool)
function transferFromWithData:第三者が送る場合
他のtransfer, transferFromと関係性は同じなので説明省略
トークン発行に関する部分
function isIssuable:トークン発行が可能かどうかをチェックする関数
Return:
bool: トークン発行が完了した場合falseを返答
一度falseになったら、以後常にfalseでなければならない
再発行を防ぐため
trueだった場合、function issueを実行
function issue:トークン発行を行う関数
Input:
address _tokenHolder:トークン保有者のアドレス
uint256 _value: 送付量
bytes _data:送付にかかる認証データ
トークン発行者、認証機関者による認証データ
Return:特になし(bool)
トークン償還に関する部分:
function redeem:償還をする関数
Input:
uint256 _value:償還を実行する量
bytes _data:送付にかかる認証データ
Return: 特になし(bool)
function redeemFrom:第三者が償還する場合
他とパラレルなので省略
インターフェース
code: ERC1594(javascript)
interface IERC1594 is IERC20 {
// Transfers
function transferWithData(address _to, uint256 _value, bytes _data) external;
function transferFromWithData(address _from, address _to, uint256 _value, bytes _data) external;
// Token Issuance
function isIssuable() external view returns (bool);
function issue(address _tokenHolder, uint256 _value, bytes _data) external;
// Token Redemption
function redeem(uint256 _value, bytes _data) external;
function redeemFrom(address _tokenHolder, uint256 _value, bytes _data) external;
// Transfer Validity
function canTransfer(address _to, uint256 _value, bytes _data) external view returns (bool, byte, bytes32);
function canTransferFrom(address _from, address _to, uint256 _value, bytes _data) external view returns (bool, byte, bytes32);
// Issuance / Redemption Events
event Issued(address indexed _operator, address indexed _to, uint256 _value, bytes _data);
event Redeemed(address indexed _operator, address indexed _from, uint256 _value, bytes _data);
}
Source