Alert Source Discuss
⚠️ Draft Standards Track: ERC

ERC-7776: 透明财务报表

为所有投资者提供公开透明的财务数据,如收入、商品销售成本、运营费用、EBITDA 和每股收益。

Authors Ignacio Ceaglio (@Nachoxt17) <ignacioceaglio@gmail.com>
Created 2024-09-20
Discussion Link https://ethereum-magicians.org/t/erc-xxxx-transparent-financial-statements/21191
Requires EIP-20

摘要

本提案定义了一个标准 API,使基于 EVM 区块链的公司(或也称为“协议”)能够通过 solidity 智能合约以透明和可访问的方式在链上发布其财务信息,特别是利润表和资产负债表。 该标准旨在模拟传统股票市场中上市公司使用的报告结构,如 SEC 10-Q 文件。 财务报表包括关键信息,即收入、商品销售成本、运营费用、营业收入、利息、税项、折旧和摊销前收益 (EBITDA) 和每股收益-Token (EPS), 使投资者能够以标准化、透明、清晰和可靠的格式评估基于区块链的公司的财务健康状况。

动机

此 ERC 的动机是为加密货币投资市场带来严肃性。目前,情况如下:

当前 Token 投资分析的状态是不透明的,大多数信息以抽象和非量化的形式呈现。 此标准 API 确保投资者可以基于直接在链上发布的真实财务数据(而不仅仅是投机性的承诺)以一致且可靠的方式评估区块链项目。 这将在加密货币市场中建立更大的信任,并将 Token 分析与传统股票市场的标准对齐。

大多数代表基于 EVM 区块链的公司(或也称为“协议”)的 ERC-20 Token 的工作方式与代表该公司股权所有权份额的上市公司股票不同(因此,购买协议 ERC-20 的用户现在也是该业务、其利润和/或其股息的股东和共同所有者),而是充当“商品”,例如石油; 它们是由所述基于 EVM 区块链的公司(或“协议”)创建的消耗品,用于在其平台上消费。 它们公开交易并被宣传为像股票一样代表底层协议,但在实践中其工作方式与商品相同,并且没有任何像上市公司股票那样的公开、透明和_清晰_的财务信息。

除此之外,目前可以在互联网上找到的大多数 Token 研究分析报告都是非正式的 Substack 或 Twitter 帖子,其中包含大量关于所投资协议功能的抽象解释,缺乏透明的财务数据和实际财务信息,并且由匿名用户发布,其现实声誉不会受到影响。

此 ERC 将通过为用户和投资者提供透明、清晰和实际的财务信息来改进这一点,以便在分析实施此 ERC 的 solidity 智能合约的基于 EVM 区块链的公司作为潜在投资时使用,这将长期在加密货币投资市场中产生信任、透明度和严肃性。

规范

本文档中的关键词“必须”、“不得”、“必需”、“应该”、“不应”、“建议”、“不建议”、“可以”和“可选”应按照 RFC 2119 和 RFC 8174 中的描述进行解释。

所有透明财务报表标准实现都必须实现 ERC-20 以表示股份,并且收入、商品销售成本、运营费用、营业收入、EBITDA、其他收入和支出、净收入和每股收益等财务数字必须以协议选择的稳定币的价值显示。

所有透明财务报表都必须实现 ERC-20 的可选元数据扩展。 namesymbol 函数应以某种方式反映底层 Token 的 namesymbol

所有方法必须具有 external 可见性。

所有方法都必须以提供的 stablecoin 计价返回其财务数字。

如果合约所有者使用来自其智能合约的此标准实现的外部的其他拥有的智能合约的数据或方法,则这些智能合约必须在相应的区块链浏览器中进行验证,并且具有公开和可见的源代码。

时间戳约束:对于所有方法,startTimestamp 必须小于或等于 endTimestamp。如果 startTimestamp 等于 endTimestamp,则该方法返回资产负债表快照。如果 startTimestamp 小于 endTimestamp,则该方法返回该期间的损益表。

输出结构:每个方法不是返回单个 uint256 值,而是返回一个 struct,其中包含一个或_可选的_更多 uint256 条目,以允许详细的财务数据,每个条目都有自己自定义的条目 name

定义:

  • 货币:用于评估公开显示的财务数据的单独稳定币。
  • 收入:销售产品或服务在扣除费用前的总收入。
  • 商品销售成本 (COGS):生产商品/服务的直接成本,包括人工和材料。
  • 运营费用:销售、一般和管理、研发以及其他运营成本等费用。
  • 营业收入:收入减去运营费用。
  • EBITDA:利息、税项、折旧和摊销前收益。
  • 其他收入和支出:非营业收入,如利息、投资收益或损失。
  • 净收入:扣除所有费用、税项和扣除额后的利润。
  • EPS:每股 Token (ERC-20) 收益,显示每股分配的利润。

方法

stablecoinAddress

返回用于评估公开显示的财务数据的单个稳定币的 address

- name: stablecoinAddress
  type: function
  visibility: external
  stateMutability: view
  inputs:
    /none/
  outputs:
    - name: currencyAddress
      type: address

revenue

返回协议在一段时间内产生的总收入。

- name: revenue
  type: function
  visibility: external
  stateMutability: view
  inputs:
    - name: startTimestamp
      type: uint256
    - name: endTimestamp
      type: uint256
  outputs:
    - name: RevenueStruct
      type: struct
      fields:
        - name: grossRevenue
          type: uint256
        - name: optionalAdditionalRevenueDetail1
          type: uint256
        - name: optionalAdditionalRevenueDetailN
          type: uint256

cogs

返回指定期间内的商品销售成本。

- name: cogs
  type: function
  visibility: external
  stateMutability: view
  inputs:
    - name: startTimestamp
      type: uint256
    - name: endTimestamp
      type: uint256
  outputs:
    - name: COGSStruct
      type: struct
      fields:
        - name: totalCOGS
          type: uint256
        - name: optionalAdditionalCOGSDetail1
          type: uint256
        - name: optionalAdditionalCOGSDetailN
          type: uint256

operatingExpenses

返回指定期间内的总运营费用。

- name: operatingExpenses
  type: function
  visibility: external
  stateMutability: view
  inputs:
    - name: startTimestamp
      type: uint256
    - name: endTimestamp
      type: uint256
  outputs:
    - name: OperatingExpensesStruct
      type: struct
      fields:
        - name: totalOperatingExpenses
          type: uint256
        - name: optionalAdditionalExpenseDetail1
          type: uint256
        - name: optionalAdditionalExpenseDetailN
          type: uint256

operatingIncome

返回指定期间的营业收入(收入 - COGS - 运营费用)。

- name: operatingIncome
  type: function
  visibility: external
  stateMutability: view
  inputs:
    - name: startTimestamp
      type: uint256
    - name: endTimestamp
      type: uint256
  outputs:
    - name: OperatingIncomeStruct
      type: struct
      fields:
        - name: totalOperatingIncome
          type: uint256
        - name: optionalAdditionalIncomeDetail1
          type: uint256
        - name: optionalAdditionalIncomeDetailN
          type: uint256

ebitda

返回给定期间的 EBITDA。

- name: ebitda
  type: function
  visibility: external
  stateMutability: view
  inputs:
    - name: startTimestamp
      type: uint256
    - name: endTimestamp
      type: uint256
  outputs:
    - name: EBITDAstruct
      type: struct
      fields:
        - name: totalEBITDA
          type: uint256
        - name: optionalAdditionalEBITDADetail1
          type: uint256
        - name: optionalAdditionalEBITDADetailN
          type: uint256

otherIncomeExpenses

返回指定期间的非营业收入和支出,如利息和投资收益或损失。

- name: otherIncomeExpenses
  type: function
  visibility: external
  stateMutability: view
  inputs:
    - name: startTimestamp
      type: uint256
    - name: endTimestamp
      type: uint256
  outputs:
    - name: OtherIncomeExpensesStruct
      type: struct
      fields:
        - name: totalOtherIncome
          type: uint256
        - name: totalOtherExpenses
          type: uint256
        - name: totalOtherIncomeDetail1
          type: uint256
        - name: totalOtherExpensesDetail1
          type: uint256
        - name: totalOtherIncomeDetailN
          type: uint256
        - name: totalOtherExpensesDetailN
          type: uint256

netIncome

返回该期间的净收入(营业收入 + 其他收入/支出 - 税项 - 折旧)。

- name: netIncome
  type: function
  visibility: external
  stateMutability: view
  inputs:
    - name: startTimestamp
      type: uint256
    - name: endTimestamp
      type: uint256
  outputs:
    - name: NetIncomeStruct
      type: struct
      fields:
        - name: totalNetIncome
          type: uint256
        - name: optionalAdditionalNetIncomeDetail1
          type: uint256
        - name: optionalAdditionalNetIncomeDetailN
          type: uint256

earningsPerShare

返回该期间的每股 Token (EPS) 收益。

- name: earningsPerShare
  type: function
  visibility: external
  stateMutability: view
  inputs:
    - name: startTimestamp
      type: uint256
    - name: endTimestamp
      type: uint256
  outputs:
    - name: EPSstruct
      type: struct
      fields:
        - name: basicEPS
          type: uint256
        - name: dilutedEPS
          type: uint256
        - name: EPSDetail1
          type: uint256
        - name: EPSDetailN
          type: uint256

fullFinancialReport

返回一个综合结构,其中包含协议的所有先前财务详细信息组合在一起:收入、COGS、运营费用、营业收入、EBITDA、其他收入和支出、净收入和 EPS 合并为一个统一的 Struct

- name: fullFinancialReport
  type: function
  visibility: external
  stateMutability: view
  inputs:
    - name: startTimestamp
      type: uint256
    - name: endTimestamp
      type: uint256
  outputs:
    - name: FullFinancialsStruct
      type: struct
      fields:
        - name: RevenueStruct
          type: struct
        - name: COGSStruct
          type: struct
        - name: OperatingExpensesStruct
          type: struct
        - name: OperatingIncomeStruct
          type: struct
        - name: EBITDAstruct
          type: struct
        - name: OtherIncomeExpensesStruct
          type: struct
        - name: NetIncomeStruct
          type: struct
        - name: EPSstruct
          type: struct

原理

强制执行 ERC-20 是因为诸如每 Token 收益计算之类的实现细节直接关系到会计。这种标准化使透明财务报表与所有 ERC-20 用例兼容。

此实现使协议可以共享其财务信息,既可以作为其最新更新的资产负债表(如果用户选择仅查看该公司当前财务状况的快照),也可以作为损益表(如果用户选择查看公司在两个不同区块时间戳之间财务状况的演变),并且还旨在与来自同一协议的其他独立的智能合约进行交互,从中发送财务信息。

向后兼容性

透明财务报表标准与 ERC-20 标准完全向后兼容,并且与其他标准没有已知的兼容性问题。

参考实现

注意:此参考实现是一个占位符。未来会根据收到的反馈进行改进。

// SPDX-License-Identifier: CC0-1.0
pragma solidity 0.8.27;

interface IERC20 {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
}

contract TransparentFinancialStatements {

    address public stablecoin;

    struct RevenueStruct {
        uint256 grossRevenue;
        uint256 optionalAdditionalRevenueDetail1;
        uint256 optionalAdditionalRevenueDetailN;
    }

    struct COGSStruct {
        uint256 totalCOGS;
        uint256 optionalAdditionalCOGSDetail1;
        uint256 optionalAdditionalCOGSDetailN;
    }

    struct OperatingExpensesStruct {
        uint256 totalOperatingExpenses;
        uint256 optionalAdditionalExpenseDetail1;
        uint256 optionalAdditionalExpenseDetailN;
    }

    struct OperatingIncomeStruct {
        uint256 totalOperatingIncome;
        uint256 optionalAdditionalIncomeDetail1;
        uint256 optionalAdditionalIncomeDetailN;
    }

    struct EBITDAstruct {
        uint256 totalEBITDA;
        uint256 optionalAdditionalEBITDADetail1;
        uint256 optionalAdditionalEBITDADetailN;
    }

    struct OtherIncomeExpensesStruct {
        uint256 totalOtherIncome;
        uint256 totalOtherExpenses;
        uint256 totalOtherIncomeDetail1;
        uint256 totalOtherExpensesDetail1;
        uint256 totalOtherIncomeDetailN;
        uint256 totalOtherExpensesDetailN;
    }

    struct NetIncomeStruct {
        uint256 totalNetIncome;
        uint256 optionalAdditionalNetIncomeDetail1;
        uint256 optionalAdditionalNetIncomeDetailN;
    }

    struct EPSstruct {
        uint256 basicEPS;
        uint256 dilutedEPS;
        uint256 EPSDetail1;
        uint256 EPSDetailN;
    }

    struct FullFinancialsStruct {
        RevenueStruct revenue;
        COGSStruct cogs;
        OperatingExpensesStruct operatingExpenses;
        OperatingIncomeStruct operatingIncome;
        EBITDAstruct ebitda;
        OtherIncomeExpensesStruct otherIncomeExpenses;
        NetIncomeStruct netIncome;
        EPSstruct eps;
    }

    constructor(address _stablecoin) {
        stablecoin = _stablecoin;
    }

    function currency() public view returns (address) {
        return stablecoin;
    }

    function revenue(uint256 startTimestamp, uint256 endTimestamp) 
        public 
        view 
        returns (RevenueStruct memory) 
    {
        require(startTimestamp <= endTimestamp, "Invalid timestamps");
        // Logic to calculate and return revenue details
        // 用于计算和返回收入明细的逻辑
        return RevenueStruct(1000, 500, 100); // Example values
        // 示例值
    }

    function cogs(uint256 startTimestamp, uint256 endTimestamp) 
        public 
        view 
        returns (COGSStruct memory) 
    {
        require(startTimestamp <= endTimestamp, "Invalid timestamps");
        // Logic to calculate and return COGS details
        // 用于计算和返回 COGS 明细的逻辑
        return COGSStruct(400, 150, 50); // Example values
        // 示例值
    }

    function operatingExpenses(uint256 startTimestamp, uint256 endTimestamp) 
        public 
        view 
        returns (OperatingExpensesStruct memory) 
    {
        require(startTimestamp <= endTimestamp, "Invalid timestamps");
        // Logic to calculate and return operating expenses details
        // 用于计算和返回运营费用明细的逻辑
        return OperatingExpensesStruct(300, 100, 50); // Example values
        // 示例值
    }

    function operatingIncome(uint256 startTimestamp, uint256 endTimestamp) 
        public 
        view 
        returns (OperatingIncomeStruct memory) 
    {
        require(startTimestamp <= endTimestamp, "Invalid timestamps");
        // Logic to calculate and return operating income details
        // 用于计算和返回营业收入明细的逻辑
        return OperatingIncomeStruct(300, 100, 50); // Example values
        // 示例值
    }

    function ebitda(uint256 startTimestamp, uint256 endTimestamp) 
        public 
        view 
        returns (EBITDAstruct memory) 
    {
        require(startTimestamp <= endTimestamp, "Invalid timestamps");
        // Logic to calculate and return EBITDA details
        // 用于计算和返回 EBITDA 明细的逻辑
        return EBITDAstruct(700, 200, 100); // Example values
        // 示例值
    }

    function otherIncomeExpenses(uint256 startTimestamp, uint256 endTimestamp) 
        public 
        view 
        returns (OtherIncomeExpensesStruct memory) 
    {
        require(startTimestamp <= endTimestamp, "Invalid timestamps");
        // Logic to calculate and return other income/expenses details
        // 用于计算和返回其他收入/费用明细的逻辑
        return OtherIncomeExpensesStruct(100, 50, 20, 10, 30, 20); // Example values
        // 示例值
    }

    function netIncome(uint256 startTimestamp, uint256 endTimestamp) 
        public 
        view 
        returns (NetIncomeStruct memory) 
    {
        require(startTimestamp <= endTimestamp, "Invalid timestamps");
        // Logic to calculate and return net income details
        // 用于计算和返回净收入明细的逻辑
        return NetIncomeStruct(600, 200, 100); // Example values
        // 示例值
    }

    function earningsPerShare(uint256 startTimestamp, uint256 endTimestamp) 
        public 
        view 
        returns (EPSstruct memory) 
    {
        require(startTimestamp <= endTimestamp, "Invalid timestamps");
        // Logic to calculate and return EPS details
        // 用于计算和返回 EPS 明细的逻辑
        return EPSstruct(10, 8, 2, 1); // Example values
        // 示例值
    }

    function fullFinancialReport(uint256 startTimestamp, uint256 endTimestamp) 
        public 
        view 
        returns (FullFinancialsStruct memory) 
    {
        require(startTimestamp <= endTimestamp, "Invalid timestamps");
        // Logic to calculate and return all financial details
        // 用于计算和返回所有财务明细的逻辑
        return FullFinancialsStruct(
            revenue(startTimestamp, endTimestamp),
            cogs(startTimestamp, endTimestamp),
            operatingExpenses(startTimestamp, endTimestamp),
            operatingIncome(startTimestamp, endTimestamp),
            ebitda(startTimestamp, endTimestamp),
            otherIncomeExpenses(startTimestamp, endTimestamp),
            netIncome(startTimestamp, endTimestamp),
            earningsPerShare(startTimestamp, endTimestamp)
        );
    }
}

安全注意事项

此 ERC 涉及在链上显示关键财务数据,因此必须特别注意确保数据的准确性和安全性,尤其是在防止篡改或操纵关键财务数据方面。需要进一步讨论包含财务数据的智能合约的验证机制和审计。

需要讨论。

版权

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

Citation

Please cite this document as:

Ignacio Ceaglio (@Nachoxt17) <ignacioceaglio@gmail.com>, "ERC-7776: 透明财务报表 [DRAFT]," Ethereum Improvement Proposals, no. 7776, September 2024. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-7776.