From 929f2101f4069bd9cd516175d893f9ea63b8cc15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ernesto=20Garc=C3=ADa?= Date: Sat, 17 Jun 2023 13:46:02 -0600 Subject: [PATCH 1/5] Update EIP-6093: Improve specification clarity Merged by EIP-Bot. --- EIPS/eip-6093.md | 113 +++++++++++++++++++++++++++++++---------------- 1 file changed, 76 insertions(+), 37 deletions(-) diff --git a/EIPS/eip-6093.md b/EIPS/eip-6093.md index b5fce6869f2de8..e82cc65cfed59e 100644 --- a/EIPS/eip-6093.md +++ b/EIPS/eip-6093.md @@ -32,9 +32,9 @@ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "S The following errors were designed according to the criteria described in [Rationale](#rationale). -This EIP defines standard errors that may be used by implementations in certain scenarios, but does not specify whether implementations should revert in those scenarios, which remains up to the implementers, unless a revert is mandated by the corresponding EIPs. +This EIP defines standard errors that may be used by implementations in certain scenarios but it does not specify whether implementations should revert in those scenarios, which remains up to the implementers unless a revert is mandated by the corresponding EIPs. -The names of the error arguments are defined in the [Parameter Glossary](#parameter-glossary), and MUST be used according to those definitions. +The names of the error arguments are defined in the [Parameter Glossary](#parameter-glossary) and MUST be used according to those definitions. ### [ERC-20](./eip-20.md) @@ -43,15 +43,18 @@ The names of the error arguments are defined in the [Parameter Glossary](#parame Indicates an error related to the current `balance` of a `sender`. Used in transfers. -- MUST be used when `balance` is less than `needed`. -- MUST NOT be used if `balance` is greater than or equal to `needed`. +Usage guidelines: + +- `balance` MUST be less than `needed`. #### `ERC20InvalidSender(address sender)` Indicates a failure with the token `sender`. Used in transfers. -- MUST be used for disallowed transfers from the zero address. +Usage guidelines: + +- RECOMMENDED for disallowed transfers from the zero address. - MUST NOT be used for approval operations. - MUST NOT be used for balance or allowance requirements. - Use `ERC20InsufficientBalance` or `ERC20InsufficientAllowance` instead. @@ -61,8 +64,10 @@ Used in transfers. Indicates a failure with the token `receiver`. Used in transfers. -- MUST be used for disallowed transfers to the zero address. -- MUST be used for disallowed transfers to non-compatible addresses (eg. contract addresses). +Usage guidelines: + +- RECOMMENDED for disallowed transfers to the zero address. +- RECOMMENDED for disallowed transfers to non-compatible addresses (eg. contract addresses). - MUST NOT be used for approval operations. #### `ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed)` @@ -70,15 +75,18 @@ Used in transfers. Indicates a failure with the `spender`'s `allowance`. Used in transfers. -- MUST be used when `allowance` is less than `needed`. -- MUST NOT be used if `allowance` is greater than or equal to `needed`. +Usage guidelines: + +- `allowance` MUST be less than `needed`. #### `ERC20InvalidApprover(address approver)` Indicates a failure with the `approver` of a token to be approved. Used in approvals. -- MUST be used for disallowed approvals from the zero address. +Usage guidelines: + +- RECOMMENDED for disallowed approvals from the zero address. - MUST NOT be used for transfer operations. #### `ERC20InvalidSpender(address spender)` @@ -86,34 +94,42 @@ Used in approvals. Indicates a failure with the `spender` to be approved. Used in approvals. -- MUST be used for disallowed approvals to the zero address. -- MUST be used for disallowed approvals to the owner itself. +Usage guidelines: + +- RECOMMENDED for disallowed approvals to the zero address. +- RECOMMENDED for disallowed approvals to the owner itself. - MUST NOT be used for transfer operations. - Use `ERC20InsufficientAllowance` instead. ### [ERC-721](./eip-721.md) -### `ERC721InvalidOwner(address owner)` +#### `ERC721InvalidOwner(address owner)` Indicates that an address can't be an owner. Used in balance queries. -- MUST be used for addresses whose ownership is disallowed (eg. ERC-721 explicitly disallows `address(0)` to be an owner). -- MUST not be used for transfers. +Usage guidelines: + +- RECOMMENDED for addresses whose ownership is disallowed (eg. ERC-721 explicitly disallows `address(0)` to be an owner). +- MUST NOT be used for transfers. - Use `ERC721IncorrectOwner` instead. -### `ERC721NonexistentToken(uint256 tokenId)` +#### `ERC721NonexistentToken(uint256 tokenId)` Indicates a `tokenId` whose `owner` is the zero address. -- MUST be used when attempting to interact with a non-minted or burned token. +Usage guidelines: + +- The `tokenId` MUST BE a non-minted or burned token. #### `ERC721IncorrectOwner(address sender, uint256 tokenId, address owner)` Indicates an error related to the ownership over a particular token. Used in transfers. -- MUST be used when `sender` is not `owner`. +Usage guidelines: + +- `sender` MUST NOT be `owner`. - MUST NOT be used for approval operations. #### `ERC721InvalidSender(address sender)` @@ -121,7 +137,9 @@ Used in transfers. Indicates a failure with the token `sender`. Used in transfers. -- MUST be used for disallowed transfers from the zero address. +Usage guidelines: + +- RECOMMENDED for disallowed transfers from the zero address. - MUST NOT be used for approval operations. - MUST NOT be used for ownership or approval requirements. - Use `ERC721IncorrectOwner` or `ERC721InsufficientApproval` instead. @@ -131,8 +149,10 @@ Used in transfers. Indicates a failure with the token `receiver`. Used in transfers. -- MUST be used for disallowed transfers to the zero address. -- MUST be used for disallowed transfers to non-`ERC721TokenReceiver` contracts or those that reject a transfer. (eg. returning an invalid response in `onERC721Received`). +Usage guidelines: + +- RECOMMENDED for disallowed transfers to the zero address. +- RECOMMENDED for disallowed transfers to non-`ERC721TokenReceiver` contracts or those that reject a transfer. (eg. returning an invalid response in `onERC721Received`). - MUST NOT be used for approval operations. #### `ERC721InsufficientApproval(address operator, uint256 tokenId)` @@ -140,15 +160,19 @@ Used in transfers. Indicates a failure with the `operator`'s approval. Used in transfers. -- MUST be used when operator `isApprovedForAll(owner, operator)` is false. -- MUST be used when operator `getApproved(tokenId)` is not `operator`. +Usage guidelines: + +- `isApprovedForAll(owner, operator)` MUST be false for the `tokenId`'s owner and `operator`. +- `getApproved(tokenId)` MUST not be `operator`. #### `ERC721InvalidApprover(address approver)` Indicates a failure with the `owner` of a token to be approved. Used in approvals. -- MUST be used for disallowed approvals from the zero address. +Usage guidelines: + +- RECOMMENDED for disallowed approvals from the zero address. - MUST NOT be used for transfer operations. #### `ERC721InvalidOperator(address operator)` @@ -156,8 +180,10 @@ Used in approvals. Indicates a failure with the `operator` to be approved. Used in approvals. -- MUST be used for disallowed approvals to the zero address. -- MUST be used for disallowed approvals to the owner itself. +Usage guidelines: + +- RECOMMENDED for disallowed approvals to the zero address. +- The `operator` MUST NOT be the owner of the approved token. - MUST NOT be used for transfer operations. - Use `ERC721InsufficientApproval` instead. @@ -168,15 +194,18 @@ Used in approvals. Indicates an error related to the current `balance` of a `sender`. Used in transfers. -- MUST be used when `balance` is less than `needed` for a `tokenId`. -- MUST NOT be used if `balance` is greater than or equal to `needed` for a `tokenId`. +Usage guidelines: + +- `balance` MUST be less than `needed` for a `tokenId`. #### `ERC1155InvalidSender(address sender)` Indicates a failure with the token `sender`. Used in transfers. -- MUST be used for disallowed transfers from the zero address. +Usage guidelines: + +- RECOMMENDED for disallowed transfers from the zero address. - MUST NOT be used for approval operations. - MUST NOT be used for balance or allowance requirements. - Use `ERC1155InsufficientBalance` or `ERC1155InsufficientApprovalForAll` instead. @@ -186,8 +215,10 @@ Used in transfers. Indicates a failure with the token `receiver`. Used in transfers. -- MUST be used for disallowed transfers to the zero address. -- MUST be used for disallowed transfers to non-`ERC1155TokenReceiver` contracts or those that reject a transfer. (eg. returning an invalid response in `onERC1155Received`). +Usage guidelines: + +- RECOMMENDED for disallowed transfers to the zero address. +- RECOMMENDED for disallowed transfers to non-`ERC1155TokenReceiver` contracts or those that reject a transfer. (eg. returning an invalid response in `onERC1155Received`). - MUST NOT be used for approval operations. #### `ERC1155InsufficientApprovalForAll(address operator, address owner)` @@ -195,14 +226,18 @@ Used in transfers. Indicates a failure with the `operator`'s approval in a transfer. Used in transfers. -- MUST be used when operator `isApprovedForAll(owner, operator, tokenId)` is false. +Usage guidelines: + +- `isApprovedForAll(owner, operator)` MUST be false for the `tokenId`'s owner and `operator`. #### `ERC1155InvalidApprover(address approver)` Indicates a failure with the `approver` of a token to be approved. Used in approvals. -- MUST be used for disallowed approvals from the zero address. +Usage guidelines: + +- RECOMMENDED for disallowed approvals from the zero address. - MUST NOT be used for transfer operations. #### `ERC1155InvalidOperator(address operator)` @@ -210,7 +245,9 @@ Used in approvals. Indicates a failure with the `operator` to be approved. Used in approvals. -- MUST be used for disallowed approvals to the zero address. +Usage guidelines: + +- RECOMMENDED for disallowed approvals to the zero address. - MUST be used for disallowed approvals to the owner itself. - MUST NOT be used for transfer operations. - Use `ERC1155InsufficientApproval` instead. @@ -220,7 +257,9 @@ Used in approvals. Indicates an array length mismatch between `ids` and `values` in a `safeBatchTransferFrom` operation. Used in batch transfers. -- MUST be used only if `idsLength` is different from `valuesLength` +Usage guidelines: + +- `idsLength` MUST NOT be `valuesLength`. ### Parameter Glossary @@ -250,12 +289,12 @@ Considering this, the error names are designed following a basic grammatical str ### Actions and subjects -The main actions that can be performed within a token are: +An error is defined based on the following **actions** that can be performed on a token and its involved _subjects_: - **Transfer**: An operation in which a _sender_ moves to a _receiver_ any number of tokens (fungible _balance_ and/or non-fungible _token ids_). - **Approval**: An operation in which an _approver_ grants any form of _approval_ to an _operator_. -The subjects outlined above are expected to exhaustively represent _what_ can go wrong in a token transaction, deriving a specific error by adding an [error prefix](#error-prefixes). +These attempt to exhaustively represent what can go wrong in a token operation. Therefore, the errors can be constructed by specifying which _subject_ failed during an **action** execution, and prefixing with an [error prefix](#error-prefixes). Note that the action is never seen as the subject of an error. From 2f0b191a39d1436dc2f5b77c0b246b76f840efc4 Mon Sep 17 00:00:00 2001 From: Sam Wilson <57262657+SamWilsn@users.noreply.github.com> Date: Sat, 17 Jun 2023 19:43:18 -0400 Subject: [PATCH 2/5] Add IETF as a permissible origin (#7113) --- EIPS/eip-1.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/EIPS/eip-1.md b/EIPS/eip-1.md index 5f31c5916dc506..6962a93b5ced28 100644 --- a/EIPS/eip-1.md +++ b/EIPS/eip-1.md @@ -290,6 +290,24 @@ Permitted WHATWG specification URLs must anchor to a specification defined in th Although not recommended by WHATWG, EIPs must anchor to a particular commit so that future readers can refer to the exact version of the living standard that existed at the time the EIP was finalized. This gives readers sufficient information to maintain compatibility, if they so choose, with the version referenced by the EIP and the current living standard. +### Internet Engineering Task Force (IETF) + +Links to an IETF Request For Comment (RFC) specification may be included using normal markdown syntax, such as: + +```markdown +[RFC 8446](https://www.rfc-editor.org/rfc/rfc8446) +``` + +Which renders as: + +[RFC 8446](https://www.rfc-editor.org/rfc/rfc8446) + +Permitted IETF specification URLs MUST anchor to a specification with an assigned RFC number (meaning cannot reference internet drafts), and so MUST match this regular expression: + +```regex +^https:\/\/www.rfc-editor.org\/rfc\/.*$ +``` + ### Digital Object Identifier System Links qualified with a Digital Object Identifier (DOI) may be included using the following syntax: From a92f9abb195b2e8b00ccdb49c1d53fad4a9097a2 Mon Sep 17 00:00:00 2001 From: xinbenlv Date: Mon, 19 Jun 2023 11:29:23 -0400 Subject: [PATCH 3/5] Update EIP-1 to allow link to BIPs (#6907) Update eip-1.md Commit fixed regex Apply suggestions from code review Co-authored-by: Gavin John --- EIPS/eip-1.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/EIPS/eip-1.md b/EIPS/eip-1.md index 6962a93b5ced28..ebec1036d1bf5d 100644 --- a/EIPS/eip-1.md +++ b/EIPS/eip-1.md @@ -308,6 +308,24 @@ Permitted IETF specification URLs MUST anchor to a specification with an assigne ^https:\/\/www.rfc-editor.org\/rfc\/.*$ ``` +### Bitcoin Improvement Proposal + +Links to Bitcoin Improvement Proposals may be included using normal markdown syntax, such as: + +```markdown +[BIP 38](https://github.com/bitcoin/bips/blob/3db736243cd01389a4dfd98738204df1856dc5b9/bip-0038.mediawiki) +``` + +Which renders to: + +[BIP 38](https://github.com/bitcoin/bips/blob/3db736243cd01389a4dfd98738204df1856dc5b9/bip-0038.mediawiki) + +Permitted Bitcoin Improvement Proposal URLs must anchor to a specific commit, and so must match this regular expression: + +```regex +^(https://github.com/bitcoin/bips/blob/[0-9a-f]{40}/bip-[0-9]+\.mediawiki)$ +``` + ### Digital Object Identifier System Links qualified with a Digital Object Identifier (DOI) may be included using the following syntax: From ce0299d4d2f1a9ede2b69ceab4b01c1ec4401420 Mon Sep 17 00:00:00 2001 From: Bofu Chen Date: Mon, 19 Jun 2023 23:58:11 +0800 Subject: [PATCH 4/5] Add EIP: Interoperable Digital Media Indexing Merged by EIP-Bot. --- EIPS/eip-7053.md | 117 ++++++++++++++++++ ...ia-indexing-system-and-metadata-lookup.jpg | Bin 0 -> 81772 bytes 2 files changed, 117 insertions(+) create mode 100644 EIPS/eip-7053.md create mode 100644 assets/eip-7053/digital-media-indexing-system-and-metadata-lookup.jpg diff --git a/EIPS/eip-7053.md b/EIPS/eip-7053.md new file mode 100644 index 00000000000000..2daf5d5de54a43 --- /dev/null +++ b/EIPS/eip-7053.md @@ -0,0 +1,117 @@ +--- +eip: 7053 +title: Interoperable Digital Media Indexing +description: Interoperable Indexing of Digital Media on the EVM-compatible Blockchains. +author: Bofu Chen (@bafu), Tammy Yang (@tammyyang) +discussions-to: https://ethereum-magicians.org/t/eip-7053-interoperable-digital-media-indexing/14394 +status: Draft +type: Standards Track +category: ERC +created: 2023-05-22 +--- + +## Abstract + +This EIP proposes an interoperable indexing strategy designed to enhance the organization and retrieval of digital media information across multiple smart contracts and EVM-compatible blockchains. This system enhances the traceability and verification of cross-contract and cross-chain data, facilitating a more efficient discovery of storage locations and crucial information related to media assets. The major purpose is to foster an integrated digital media environment on the blockchain. + +## Motivation + +Given the significant role digital media files play on the Internet, it's crucial to have a robust and efficient method for indexing immutable information. Existing systems encounter challenges due to the absence of a universal, interoperable identifier for digital media content. This leads to fragmentation and complications in retrieving metadata, storage information, or the provenance of specific media assets. The issues become increasingly critical as the volume of digital media continues to expand. + +The motivation behind this EIP is to establish a standardized, decentralized, and interoperable approach to index digital media across EVM-compatible networks. By integrating Decentralized Content Identifiers (CIDs) and Commit events, this EIP puts forward a mechanism enabling unique identification and indexing of each digital media file. Moreover, this system suggests a way for users to access a complete history of data associated with digital media assets, from creation to the current status. This full view enhances transparency, thereby providing users with the necessary information for future interactions with digital media. + +This method creates a common interface that any digital media system can use to provide a standard way of indexing and searching their content. + +|| +|:--:| +| ![](../assets/eip-7053/digital-media-indexing-system-and-metadata-lookup.jpg) | +| Figure 1: Digital Media Indexing Relationships and Lookup | + +This EIP aims to create an interoperable indexing system to associate all data of the same digital content together (Figure 1). This will make it easier for users to find and trust digital media content, and it will also make it easier for systems to share and exchange information about this digital media content. + +## Specification + +The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in RFC 2119 and RFC 8174. + +### Content Identifier + +Content Identifier in this EIP is the the content address generated by passing the content of a digital media through a cryptographic hash function. Before the indexing process for digital media can begin, it is REQUIRED to generate unique Content Identifiers for each file. This identifier should the same as the Content Identifiers on the decentralized storage, ensuring each identifier provides access to the metadata, media information, and the content file itself. + +### Commit Function + +To index digital media, we shall call the commit function and generate Commit event: + +```solidity +/** + * @notice Emitted when a new commit is made. + * @param recorder The address of the account making the commit. + * @param assetCid The content identifier of the asset being committed. + * @param commitData The data associated with the commit. + */ +event Commit(address indexed recorder, string indexed assetCid, string commitData); + +/** + * @notice Registers a commit for an asset. + * Emits a Commit event and records the block number of the commit in the recordLogs mapping for the provided assetCid. + * @dev Emits a Commit event and logs the block number of the commit event. + * @param assetCid The content identifier of the asset being committed. + * @param commitData The data associated with the commit. + * @return The block number at which the commit was made. + */ +function commit(string memory assetCid, string memory commitData) public returns (uint256 blockNumber); +``` + +## Rationale + +The design decisions in this EIP prioritize the effectiveness and efficiency of the indexing method. To achieve this, Decentralized Content Identifiers (CIDs) are utilized to uniquely identify digital media content across all systems. This approach offers accurate and precise searching of media, along with the following benefits: + +1. Strengthened data integrity: CIDs serve as cryptographic hashes of the content, ensuring their uniqueness and preventing forgery. With the content in hand, obtaining the CID allows for searching relevant information associated with that content. + +2. Streamlined data portability: CIDs enable the seamless transfer of digital media content across different systems, eliminating the need for re-encoding or reconfiguration of protocols. This promotes a more interoperable and open indexing system. For example, in cases where Non-Fungible Tokens (NFTs) are created prior to Commit events, the digital media content can still be indexed by converting the file referenced by the tokenURI using the same mechanism. This conversion process ensures that the digital media content associated with NFT tokens can be indexed with a consistent identification approach. + +## Reference Implementation + +```solidity +// SPDX-License-Identifier: CC0-1.0 +pragma solidity ^0.8.4; + +import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; + +contract CommitRegister is Initializable { + using ECDSA for bytes32; + + mapping(string => uint[]) public commitLogs; + + event Commit(address indexed recorder, string indexed assetCid, string commitData); + + function initialize() public initializer {} + + function commit(string memory assetCid, string memory commitData) public returns (uint256 blockNumber) { + emit Commit(msg.sender, assetCid, commitData); + commitLogs[assetCid].push(block.number); + return block.number; + } + + function getCommits(string memory assetCid) public view returns (uint[] memory) { + return commitLogs[assetCid]; + } +} +``` + +## Security Considerations + +When implementing this EIP, it's essential to address several security aspects to ensure the safety and integrity of the digital media index: + +1. Input Validation: Given that commit function accepts string parameters, it's important to validate these inputs to avoid potential injection attacks. Although such attacks are less common in smart contracts than traditional web development, caution should be exercised. + +2. Data Integrity: The commit function relies on CIDs, which are assumed to be correct and point to the right data. It's important to note that this EIP doesn't validate the content behind the CIDs and the commit data, which remains a responsibility of the users or implementing applications. + +3. Event Listening: Systems relying on listening to the Commit events for changes need to be aware of potential missed events or incorrect ordering, especially during periods of network congestion or reorganizations. + +Implementers should consider these security aspects in the context of their specific use case and deployment scenario. It is strongly recommended to perform a comprehensive security audit before deploying any implementation of this EIP to a live network. + + +## Copyright + +Copyright and related rights waived via [CC0](../LICENSE.md). diff --git a/assets/eip-7053/digital-media-indexing-system-and-metadata-lookup.jpg b/assets/eip-7053/digital-media-indexing-system-and-metadata-lookup.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8afd23d2c4d9e58e43bccd964167981c7e24418b GIT binary patch literal 81772 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%0AZlri_jUYSyyXbeZTjm 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 DH&aPQ literal 0 HcmV?d00001 From 1fe0b2e1ee8c88ef1663dc16e8e4119b8d3f6ac3 Mon Sep 17 00:00:00 2001 From: Kevin Owocki Date: Mon, 19 Jun 2023 10:00:52 -0600 Subject: [PATCH 5/5] Add EIP: Contract Secured Revenue on an EVM based L2 Merged by EIP-Bot. --- EIPS/eip-6968.md | 94 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 EIPS/eip-6968.md diff --git a/EIPS/eip-6968.md b/EIPS/eip-6968.md new file mode 100644 index 00000000000000..bdb1e0966732ae --- /dev/null +++ b/EIPS/eip-6968.md @@ -0,0 +1,94 @@ +--- +eip: 6968 +title: Contract Secured Revenue on an EVM based L2 +description: Contract Secured Revenue on an EVM based L2 +author: Zak Cole , Zak Cole (@zscole), Kevin Owocki , Lightclient +discussions-to: https://ethereum-magicians.org/t/eip-6968-generalized-csr-protocol/14178 +status: Draft +type: Standards Track +category: Core +created: 2023-05-01 +--- + +## Abstract + +Contract Secured Revenue (CSR) allows smart contract developers to claim a percentage of all transaction fees paid by users when interacting with their smart contracts. + +This EIP proposes the introduction of CSR on EVM-based L2s which would provide smart contract developers who deploy on L2s access to revenue streams and/or public goods. + +## Motivation + +Using protocol rewards of an L1 to fund smart contract development would be a big change to the way the current market works. This EIP *does not* advocate for any changes to the existing Ethereum L1. + +This EIP does advocate that L2s could begin to experiment with Contract Secured Revenue as a means of: + +1. creating a new revenue stream for smart contract developers +2. creating a new way of funding public goods +3. creating incentives for developers to deploy their dapps on your network + +## Specification + +### Parameters + +| Constant | Value | +|---|---| +| REVENUE_SHARE_QUOTIENT | 5 | + +### Fee Mechanism + +The current [EIP-1559](./eip-1559.md) fee behavior is modified so that `header.base_fee_per_gas * REVENUE_SHARE_QUOTIENT` per gas is reallocated proportionally, based on gas used, to each contract executed during the transaction. + +Implicitly, this means that no fees are redistributed to externally owned accounts (EOA). + +#### Gas Tracking + +In order to fairly distribute the fee revenue, a new transaction-wide gas tracker is defined. + +When executing a block, maintain a mapping `gas_used_by_address` of `address` to `uint64`. This will track the amount of gas used by each address. For every EVM instruction that does not instantiate a new execution frame (e.g. `CALL`, `CALLCODE`, `DELEGATECALL`, `STATICCALL`, `CREATE`, and `CREATE2`), add the cost of the instruction to the address' current sum in the mapping. + +For EVM instructions which do instantiate new frames, greater care must be taken to determine the cost of the instruction to the calling frame. For simplicity, this cost is defined to be the total cost of the operation minus the amount of gas passed to the child frame. The gas passed to the child frame is determined via [EIP-150](./eip-150.md). The computed cost is added to the address' current sum in the mapping. + +Additionally: + +- If the address does not exist in the mapping, it's total gas used is `0`. +- If the instructions throws an out-of-gas (OOG) error, all remaining gas allocated to execution frame is added to the current total gas used by the address. +- No other exceptional halt adds remaining gas to the counter for the address where the halt occurred. + +#### Setting Revenue Recipient + +Revenue recipients are tracked via a new transaction wide mapping `revenue_recipient` of `address` to `address`. The default value for every key is the key itself. For example, unless set otherwise, the key `0xdead...beef` maps to the value `0xdead...beef`. + +To set a different revenue recipient, a new instruction `SETREVENUERECIPIENT` is introduced with the opcode `0x49`. The operation takes `1` stack element as input and outputs `0` stack elements. + +The `20` least significant bytes of the input stack element is the address of the new revenue recipient for the instruction's caller. The `revenue_recipient` entry is updated to reflect this. + +The instruction costs `3` gas. + +#### Dispersing Revenue + +After a transaction completes, for every element (`addr`, `gas_used`) in `gas_used_by_address`, increase the balance of `revenue_recipient[addr]` by `gas_used * (header.base_fee_per_gas // REVENUE_SHARE_QUOTIENT)` + +## Rationale + +### Tracking Gas Proportionally + +A simpler mechanism would be to send the full transaction revenue to the `to` value of the transaction. This, however, does not accurately reward the composition of many different smart contracts and applications. Additionally, it is not compatible with smart contract wallets which, by definition, are often the first destination of a transaction. + +Maintaining a transaction wide tracker of gas uses makes it possible to distribute revenue to contracts which are genuinely the most utilized. + +### Ephemeral Revenue Recipient Mapping + +Constructing the revenue recipient mapping ephemerally during each transaction appears inefficient on the surface. This value is expected to be relatively static and even if it did need to change, the change could be facilitated by the recipient contract. + +Unfortunately such a change is much more invasive for the EVM. The recipient value would need to be stored somewhere. This would require a modification to the account structure in the state trie. Also, the recipient value would need to be set at some point. This would necessitate either a modification to the `CREATE*` opcodes or a new opcode, similar to `SETREVENUERECIPIENT`, that would be called by initcode to "initialize" the recipient value. + +## Security Considerations + +### Increased Max Block Size/Complexity + +Similar to EIP-1559, we must consider the effects this will have on block size. Depending on the method by which this is implemented, it could increase maximum block size in the event that a significant number of contracts opt-in to CSR. + + +## Copyright + +Copyright and related rights waived via [CC0](../LICENSE.md).