Alert Source Discuss
🚧 Stagnant Standards Track: ERC

ERC-2019: 可融资代币

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

简单概要

ERC-20 标准代币的扩展,允许代币钱包所有者通过调用智能合约并附加资金指令字符串来请求为其钱包提供资金。

参与者

代币钱包所有者

拥有钱包的个人或公司,并将代币资金请求发送到钱包。

代币合约所有者/代理

负责/拥有代币合约和代币发行/铸造的实体或公司。 该参与者负责尝试满足所有资金请求,读取资金指令,并将私人支付详细信息关联起来。

订购者

一个被授权代表代币钱包所有者发起资金订单的参与者。

摘要

代币钱包所有者(或批准的地址)可以通过区块链订购代币化请求。 这是通过调用 orderFundorderFundFrom 方法来完成的,这些方法启动代币合约运营商批准或拒绝资金请求的工作流程。 在这种情况下,提交请求时会提供资金指令,运营商使用这些指令来确定借记资金的来源,以便为代币钱包提供资金(通过铸造)。

一般来说,不建议在区块链上逐字记录明确的借记资金的路由指令,建议使用私有通信替代方案,例如私有通道、加密存储或类似方式(在区块链账本之外)来执行此操作。 另一种(不太理想的)可能性是将这些指令以加密形式放置在指令字段中。

动机

目前,大多数基于任何法币支付方式的代币发行/资金请求都需要先进行中心化交易,才能在请求者的钱包中发行所需的代币。 为了尝试将所有必要的步骤纳入去中心化,公开代币生命周期和支付交易的所有必要步骤,资金请求可以允许钱包所有者通过区块链发起资金请求。 主要优势:

  • 资金和支付的可追溯性得到增强,将发起纳入账本。 所有支付状态都可以存储在链上。
  • 几乎所有的资金/代币生命周期都通过去中心化方法覆盖,并辅以生态系统中常用的私有通信。

规范

interface IFundable /* is ERC-20 */ {
    enum FundStatusCode {
        Nonexistent,
        Ordered,
        InProcess,
        Executed,
        Rejected,
        Cancelled
    }
    function authorizeFundOperator(address orderer) external returns (bool);
    function revokeFundOperator(address orderer) external returns (bool) ;
    function orderFund(string calldata operationId, uint256 value, string calldata instructions) external returns (bool);
    function orderFundFrom(string calldata operationId, address walletToFund, uint256 value, string calldata instructions) external returns (bool);
    function cancelFund(string calldata operationId) external returns (bool);
    function processFund(string calldata operationId) external returns (bool);
    function executeFund(string calldata operationId) external returns (bool);
    function rejectFund(string calldata operationId, string calldata reason) external returns (bool);

    function isFundOperatorFor(address walletToFund, address orderer) external view returns (bool);
    function retrieveFundData(address orderer, string calldata operationId) external view returns (address walletToFund,       uint256 value, string memory instructions, FundStatusCode status);

    event FundOrdered(address indexed orderer, string indexed operationId, address indexed , uint256 value,         string instructions);
    event FundInProcess(address indexed orderer, string indexed operationId);
    event FundExecuted(address indexed orderer, string indexed operationId);
    event FundRejected(address indexed orderer, string reason);
    event FundCancelled(address indexed orderer, string indexed operationId);
    event FundOperatorAuthorized(address indexed walletToFund, address indexed orderer);
    event FundOperatorRevoked(address indexed walletToFund, address indexed orderer);
}

函数

authorizeFundOperator

钱包所有者,授权给定的地址作为资金订购者。

参数 描述
orderer 订购者的地址。

revokeFundOperator

钱包所有者,撤销给定的地址作为资金订购者。

参数 描述
orderer 订购者的地址。

orderFund

创建一个资金请求,该请求将由代币运营商处理。 如果之前已使用过操作 ID,则该函数必须恢复。

参数 描述
operationId 用于标识请求的唯一 ID
value 要资助的金额。
instruction 包含支付说明的字符串。

orderFundFrom

代表钱包所有者创建一个资金请求,该请求将由代币运营商处理。 如果之前已使用过操作 ID,则该函数必须恢复。

参数 描述
operationId 用于标识请求的唯一 ID
walletToFund 代表要资助的钱包。
value 要资助的金额。
instruction 包含支付说明的字符串。

cancelFund

取消资金请求。

参数 描述
operationId 将要取消的请求的唯一 ID。 这只能由代币持有者或资金发起人完成。

processFund

将资金请求标记为正在处理中。 状态为 “正在处理中” 后,订单无法取消。

参数 描述
operationId 标识正在处理的请求的唯一 ID。

executeFund

发行代币数量并将资金请求标记为已执行。

参数 描述
operationId 标识已执行的请求的唯一 ID。

rejectFund

以某个原由拒绝给定的操作。

参数 描述
operationId 标识已执行的请求的唯一 ID。
reason 解释为什么资金请求被拒绝的具体原因。 可以使用 EIP 1066 代码

isFundOperatorFor

检查给定参与者是否被允许为给定的钱包订购资金请求。

参数 描述
walletToFund 要资助的钱包,并检查批准权限。
orderer 订购者的地址,要检查批准权限。

retrieveFundData

检索所有资金请求数据。 只有运营商、代币持有者和订购者才能获得给定的操作数据。

参数 描述
operationId 用于标识资金订单的唯一 ID。

事件

FundOrdered

当代币钱包所有者订购资金请求时发出。

参数 描述
operationId 用于标识请求的唯一 ID
walletToFund 允许参与者开始资金请求的钱包
value 要资助的金额。
instruction 包含支付说明的字符串。

FundInProcess

当运营商在验证指令后启动资金请求,并且该操作被标记为处理中时发出。

参数 描述
orderer 资金请求订购者的地址。
operationId 用于标识资金的唯一 ID。

FundExecuted

当运营商执行了资金请求时发出。

参数 描述
orderer 资金请求订购者的地址。
operationId 用于标识资金的唯一 ID。

FundRejected

当运营商拒绝了资金请求时发出。

参数 描述
orderer 资金请求订购者的地址。
operationId 用于标识资金的唯一 ID。
reason 解释为什么资金请求被拒绝的具体原因。 可以使用 EIP 1066 代码

FundCancelled

当代币持有者、订购者取消资金请求时发出。 只有在运营商尚未将资金订单投入处理中的情况下才能执行此操作。

参数 描述
orderer 资金请求订购者的地址。
operationId 用于标识资金的唯一 ID。

FundOperatorAuthorized

当给定的参与者、运营商、公司或给定的角色被批准为给定的代币持有者启动资金请求时发出。

参数 描述
walletToFund 允许参与者开始资金请求的钱包
orderer 允许参与者启动请求的地址。

FundOperatorRevoked

当给定的参与者被撤销启动资金请求时发出。

参数 描述
walletToFund 允许参与者开始资金请求的钱包
orderer 允许参与者启动请求的地址。

理论基础

此标准提供了一种功能,允许代币持有者以去中心化方式启动资金请求。

重要的是要强调,代币运营商需要处理所有资金请求,并根据将要完成的链接支付来更新资金状态。

资金指令格式是开放的。 像 ISO 支付标准一样是一个很好的起点。

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

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

向后兼容性

此 EIP 完全向后兼容,因为它的实现扩展了 ERC-20 的功能。

实现

GitHub 仓库 IoBuilders/fundable-token 包含正在进行中的实现。

贡献者

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

版权

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

Citation

Please cite this document as:

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