Alert Source Discuss
🚧 Stagnant Standards Track: ERC

ERC-2018: 可清算代币

Authors Julio Faura <julio@adhara.io>, Fernando Paris <fer@io.builders>, Daniel Lehrner <daniel@io.builders>
Created 2019-04-30
Discussion Link https://github.com/ethereum/EIPs/issues/2104
Requires EIP-1996

简单概要

“在银行和金融领域,清算指的是从承诺进行交易到交易结算的所有活动。” [1]

参与者

清算代理

一个处理、执行或拒绝可清算转账的账户。

操作员

一个已被账户批准代表其订购可清算转账的账户。

订购者

订购可清算转账的账户。这可以是账户所有者本身,也可以是被批准为该账户的操作员的任何账户。

摘要

清算过程将转账的承诺转化为资金从一个账户到另一个账户的实际转移。清算代理决定转账是否可以执行。应转移的金额不会从付款人的余额中扣除,但也不能用于另一次转账,因此确保了当转账被执行时,它将成功执行。

动机

受监管的代币需要遵守所有法律要求,尤其是 KYCAML。其中一些检查可能无法在链上完成,因此转账可能无法一步完成。目前没有 EIP 能够使这种链下检查成为可能。这个提案允许用户订购一个转账,这个转账可以被一个清算代理在链下检查。根据检查的结果,清算代理将执行或取消转账。为了提供更多关于为什么转账被取消的信息,清算代理可以添加一个未执行的原因。

规范

interface ClearableToken /* is ERC-1996 */ {
    enum ClearableTransferStatusCode { Nonexistent, Ordered, InProcess, Executed, Rejected, Cancelled }

    function orderTransfer(string calldata operationId, address to, uint256 value) external returns (bool);
    function orderTransferFrom(string calldata operationId, address from, address to, uint256 value) external returns (bool);
    function cancelTransfer(string calldata operationId) external returns (bool);
    function processClearableTransfer(string calldata operationId) external returns (bool);
    function executeClearableTransfer(string calldata operationId) external returns (bool);
    function rejectClearableTransfer(string calldata operationId, string calldata reason) external returns (bool);
    function retrieveClearableTransferData(string calldata operationId) external view returns (address from, address to, uint256 value, ClearableTransferStatusCode status);

    function authorizeClearableTransferOperator(address operator) external returns (bool);
    function revokeClearableTransferOperator(address operator) external returns (bool);
    function isClearableTransferOperatorFor(address operator, address from) external view returns (bool);

    event ClearableTransferOrdered(address indexed orderer, string operationId, address indexed from, address indexed to, uint256 value);
    event ClearableTransferInProcess(address indexed orderer, string operationId);
    event ClearableTransferExecuted(address indexed orderer, string operationId);
    event ClearableTransferRejected(address indexed orderer, string operationId, string reason);
    event ClearableTransferCancelled(address indexed orderer, string operationId);
    event AuthorizedClearableTransferOperator(address indexed operator, address indexed account);
    event RevokedClearableTransferOperator(address indexed operator, address indexed account);
}

函数

orderTransfer

代表 msg.sender 订购一个有利于 to 的可清算转账。清算代理负责执行或拒绝转账。如果操作 ID 之前已被使用,则该函数必须回退。

参数 描述
operationId 用于标识可清算转账的唯一 ID
to 收款人的地址,如果执行,代币将被支付给该地址
value 要转移的金额。必须小于或等于付款人的余额。

orderTransferFrom

代表付款人订购一个有利于 to 的可清算转账。清算代理负责执行或拒绝转账。如果操作 ID 之前已被使用,则该函数必须回退。

参数 描述
operationId 用于标识可清算转账的唯一 ID
from 付款人的地址,如果执行,代币将从该地址扣除
to 收款人的地址,如果执行,代币将被支付给该地址
value 要转移的金额。必须小于或等于付款人的余额。

cancelTransfer

取消可清算转账的订单。只有订购者才能取消他们自己的订单。一旦转账处于 InProcess 状态,就不能成功。

参数 描述
operationId 用于标识可清算转账的唯一 ID

processClearableTransfer

将可清算转账设置为 InProcess 状态。只有清算代理才能成功执行此操作。这个状态是可选的,但如果没有它,订购者可以随时取消转账。

参数 描述
operationId 用于标识可清算转账的唯一 ID

executeClearableTransfer

执行可清算转账,这意味着代币从付款人转移到收款人。只有清算代理才能成功执行此操作。

参数 描述
operationId 用于标识可清算转账的唯一 ID

rejectClearableTransfer

拒绝可清算转账,这意味着持有的金额对于付款人来说再次可用,并且没有进行转账。只有清算代理才能成功执行此操作。

参数 描述
operationId 用于标识可清算转账的唯一 ID
reason 清算代理给出的转账被拒绝的原因

retrieveClearableTransferData

检索特定可清算转账的所有可用信息。

参数 描述
operationId 用于标识可清算转账的唯一 ID

authorizeClearableTransferOperator

批准一个操作员代表 msg.sender 订购转账。

参数 描述
operator 要被批准为可清算转账操作员的地址

revokeClearableTransferOperator

撤销代表 msg.sender 订购转账的批准。

参数 描述
operator 要被撤销为可清算转账操作员的地址

isClearableTransferOperatorFor

返回一个操作员是否被批准代表 from 订购转账。

参数 描述
operator 将成为可清算转账操作员的地址
from 将在其上创建保留的地址

transfer

如果 ERC-20 的 transfer 函数应该总是回退还是在某些情况下允许,这取决于 EIP 的实现者。

transferFrom

如果 ERC-20 的 transferFrom 函数应该总是回退还是在某些情况下允许,这取决于 EIP 的实现者。

事件

ClearableTransferOrdered

当一个可清算转账被订购时必须发出。

参数 描述
orderer 转账订购者的地址
operationId 用于标识可清算转账的唯一 ID
from 付款人的地址,如果执行,代币将从该地址扣除
to 收款人的地址,如果执行,代币将被支付给该地址
value 如果执行,要转移的金额

ClearableTransferInProcess

当一个可清算转账被置于 ÌnProcess 状态时必须发出。

参数 描述
orderer 转账订购者的地址
operationId 用于标识可清算转账的唯一 ID

ClearableTransferExecuted

当一个可清算转账被执行时必须发出。

参数 描述
orderer 转账订购者的地址
operationId 用于标识可清算转账的唯一 ID

ClearableTransferRejected

当一个可清算转账被拒绝时必须发出。

参数 描述
orderer 转账订购者的地址
operationId 用于标识可清算转账的唯一 ID
reason 清算代理给出的转账被拒绝的原因

ClearableTransferCancelled

当一个可清算转账被其订购者取消时必须发出。

参数 描述
orderer 转账订购者的地址
operationId 用于标识可清算转账的唯一 ID

AuthorizedClearableTransferOperator

当一个操作员被批准代表另一个帐户订购转账时发出。

参数 描述
operator 已被批准为可清算转账操作员的地址
account 可能代表其订购转账的地址

RevokedClearableTransferOperator

当一个操作员被撤销代表另一个帐户订购转账时发出。

参数 描述
operator 已被撤销为可清算转账操作员的地址
account 可能代表其订购转账的地址

理由

此 EIP 使用 EIP-1996 在订购转账后持有资金。清算代理(其实现不是本提案的一部分)充当预定义的公证人,以确定转账是否符合代币的规则。

operationId 是一个字符串,而不是更节省 gas 的东西,以允许轻松追踪持有并允许人类可读的 ID。这取决于实现者,字符串是应该存储在链上还是只存储其哈希值,因为它足以识别持有。

operationId 是一种竞争性资源。建议(但不是必需)持有发行者使用唯一的前缀以避免冲突。

虽然没有要求,但函数 authorizeClearableTransferOperatorrevokeClearableTransferOperatorisClearableTransferOperatorFor 的命名遵循 ERC-777 的命名约定。

向后兼容性

这个 EIP 是完全向后兼容的,因为它的实现扩展了 EIP-1996 的功能。

实现

GitHub 仓库 IoBuilders/clearable-token 包含参考实现。

贡献者

此提案由 adhara.ioio.builders 协作实现。

版权

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

[1] https://en.wikipedia.org/wiki/Clearing_(finance)

Citation

Please cite this document as:

Julio Faura <julio@adhara.io>, Fernando Paris <fer@io.builders>, Daniel Lehrner <daniel@io.builders>, "ERC-2018: 可清算代币 [DRAFT]," Ethereum Improvement Proposals, no. 2018, April 2019. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-2018.