-
Notifications
You must be signed in to change notification settings - Fork 984
Add ERC: Non-Fungible Multi-Token ownerOf #1767
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
nxt3d
wants to merge
7
commits into
ethereum:master
Choose a base branch
from
nxt3d:erc-nft-ownerof-1155-6909
base: master
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Changes from 4 commits
Commits
Show all changes
7 commits
Select commit
Hold shift + click to select a range
4b251ab
Add ERC draft for non-fungible multi-token ownerOf
nxt3d 5c1ccf2
Note ERC-1155F / ERC-6909F informal nicknames in abstract
nxt3d c101c9b
Require returned owner to hold balance of exactly one
nxt3d bbadbe9
Update ownerOf ERC: contract-wide profile, set author, add ERC-5409 t…
nxt3d d6b8d6b
Update ERCS/eip-draft_ownerof_multitoken_nft.md
nxt3d 0cde730
ERC-8276: rename file and link Magicians discussion
nxt3d bb3cf0d
ERC-8276: point discussions-to at the actual thread
nxt3d File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,90 @@ | ||
| --- | ||
| eip: XXXX | ||
|
nxt3d marked this conversation as resolved.
Outdated
|
||
| title: Non-Fungible Multi-Token ownerOf | ||
| description: A canonical ownerOf interface for non-fungible ERC-1155 and ERC-6909 token IDs. | ||
| author: Prem Makeig (@nxt3d) | ||
| discussions-to: TBD | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Please create a discussions topic on Eth Magicians |
||
| status: Draft | ||
| type: Standards Track | ||
| category: ERC | ||
| created: 2026-05-23 | ||
| requires: 165, 721, 1155, 5409, 5615, 6909 | ||
| --- | ||
|
|
||
| ## Abstract | ||
|
|
||
| This ERC defines a minimal `ownerOf(uint256 id)` interface for non-fungible [ERC-1155](./eip-1155.md) and [ERC-6909](./eip-6909.md) multi-token contracts. Each token ID has a supply of either zero or one unit, and its current holder can be read with the same function selector used by [ERC-721](./eip-721.md). The interface lets wallets, marketplaces, delegation registries, indexers, token-bound integrations, and agent-binding integrations consume non-fungible multi-token IDs through a single-owner accessor without requiring the contract to implement ERC-721. | ||
|
|
||
| Implementations of this profile are informally referred to as ERC-1155F and ERC-6909F, where the `F` denotes the non-fungible profile of the respective base standard. | ||
|
|
||
| ## Motivation | ||
|
|
||
| ERC-1155 and ERC-6909 can both represent fungible and non-fungible token IDs within one contract. Their base interfaces expose balances by `(owner, id)`, but they do not expose a canonical single-owner read for IDs whose supply is fixed to one. Integrators that understand ERC-721 ownership through `ownerOf(uint256)` therefore need bespoke adapters, offchain indexing, or contract-specific logic for non-fungible multi-token IDs. | ||
|
|
||
| This gap already appears in production: the ENS NameWrapper represents wrapped names as single-unit ERC-1155 token IDs and exposes `ownerOf(uint256)` for direct owner lookup. Standardizing that profile makes the pattern reusable by tools that need to resolve a single controlling account for a token ID. | ||
|
|
||
| This ERC generalizes the Stagnant [ERC-5409](./eip-5409.md) proposal for ERC-1155 by retaining the same `ownerOf(uint256)` selector and ERC-165 interface identifier while adding ERC-6909 support and specifying the relationship between `ownerOf`, supply, and balances. | ||
|
|
||
| ## 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. | ||
|
|
||
| ### Interface | ||
|
|
||
| ```solidity | ||
| /// @title Non-fungible multi-token owner lookup | ||
| /// @dev The ERC-165 interface identifier is 0x6352211e. | ||
| interface IERC_NFMultiTokenOwnerOf { | ||
| /// @notice Returns the owner of a non-fungible multi-token id. | ||
| /// @dev Returns address(0) if the id has no current owner. | ||
| /// @param id The token id to query. | ||
| /// @return owner The current owner of id, or address(0) if unowned. | ||
| function ownerOf(uint256 id) external view returns (address owner); | ||
| } | ||
| ``` | ||
|
|
||
| The ERC-165 interface identifier for `IERC_NFMultiTokenOwnerOf` is `0x6352211e`, calculated as `bytes4(keccak256("ownerOf(uint256)"))`. This is the same function selector used by ERC-721 `ownerOf(uint256)`. Support for this interface applies to the contract as a whole: every token ID in an implementing contract is in the non-fungible profile. | ||
|
|
||
| An ERC-1155 or ERC-6909 contract that implements this ERC: | ||
|
|
||
| - MUST implement ERC-165 and return `true` for interface identifier `0x6352211e`. | ||
| - MUST implement either ERC-1155 or ERC-6909. | ||
| - MUST ensure every token ID has total supply of either `0` or `1` at all times. | ||
| - MUST NOT allow a token ID to be owned by more than one address at the same time. | ||
| - MUST return the current owner from `ownerOf(id)` when `id` is minted and has supply one. The returned owner MUST hold a balance of exactly one for that id: whenever `ownerOf(id) != address(0)`, `balanceOf(ownerOf(id), id)` MUST equal `1`. | ||
| - MUST return `address(0)` from `ownerOf(id)` when `id` has supply zero, including before minting and after burning. | ||
| - MUST ensure that `ownerOf(id) == owner` if and only if `balanceOf(owner, id) == 1` for a token ID with supply one. | ||
| - MUST ensure that `balanceOf(account, id)` is either `0` or `1` for every account and every token ID. | ||
| - MUST emit the transfer events required by the underlying ERC-1155 or ERC-6909 standard when minting, transferring, or burning a token ID. | ||
|
|
||
| If an implementation exposes a total supply function for a token ID, such as [ERC-5615](./eip-5615.md) `totalSupply(uint256)`, the returned supply for that ID MUST be either `0` or `1`. | ||
|
|
||
| Implementations SHOULD NOT revert solely because a token ID is currently unminted or burned. | ||
|
|
||
| ## Rationale | ||
|
|
||
| The interface is deliberately one function. ERC-721 `ownerOf(uint256)` is already the common single-owner read used by NFT tooling, so reusing the same selector avoids another adapter shape for multi-token standards. It also lets contracts such as ENS NameWrapper keep their existing owner lookup while making the behavior discoverable through ERC-165. | ||
|
|
||
| Returning `address(0)` for unminted or burned token IDs follows ERC-5409 and avoids requiring callers to use revert handling to distinguish absent ownership. This differs from ERC-721, where `ownerOf` reverts for invalid token IDs, but it is better aligned with multi-token balance queries where absence is represented by a zero balance. | ||
|
|
||
| ERC-1155 and ERC-6909 are included in one ERC because the ownership accessor, selector, ERC-165 identifier, balance invariant, and integration use cases are identical. Splitting them would duplicate the same interface and increase the risk that tooling supports one multi-token standard but not the other. | ||
|
|
||
| ## Backwards Compatibility | ||
|
|
||
| This ERC is backward compatible with ERC-1155 and ERC-6909 because it only adds an optional read interface and does not change either base standard. | ||
|
|
||
| Existing ERC-5409-style ERC-1155 contracts can be compatible if they satisfy this ERC's invariants and support `0x6352211e` through ERC-165. ERC-721 integrations can reuse the `ownerOf(uint256)` selector, but MUST NOT assume full ERC-721 compatibility unless the contract also supports ERC-721. | ||
|
|
||
| ## Security Considerations | ||
|
|
||
| Implementations MUST keep `ownerOf(id)` synchronized with balances and transfer events. A stale owner value can cause integrations to grant authority to the wrong account. | ||
|
|
||
| Implementations MUST enforce the `0` or `1` supply invariant across minting, transfers, burns, and administrative flows. | ||
|
|
||
| Consumers MUST treat `ownerOf(id) == address(0)` as no current owner, not as proof that the ID can never exist. | ||
|
|
||
| Contracts that use owner lookup for authorization SHOULD read ownership at the point of use and account for transfer ordering and reentrancy. | ||
|
|
||
| ## Copyright | ||
|
|
||
| Copyright and related rights waived via [CC0](../LICENSE.md). | ||
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Assigning next sequential EIP/ERC/RIP number.
Numbers are assigned by editors & associates.
Please also update the filename.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is there any way to get a different number? This ERC is needed for ERC-8217, and that is really confusing. :-/
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@nxt3d numbers are assigned sequentially, so can't issue a lower number for this ERC.
Alternatively, we could issue a new number to 8217.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I guess I can just cancel this one and create a totally new ERC, it's just not going to work to have ERC-8217 and ERC-8271. :-D in the same project.
ERC-8272 would be fine.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Number sniping isn't allowed, so please don't cancel and then recreate the same ERC. Some authors would love to have similar numbers for related ERCs.
If it really is going to be an issue, I can bump this number but it will be the next sequential number when I issue it. e.g. 8272 has already been issued.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I am not sniping. The problem I have is related directly to the confusion and lack of clarity this will introduce when trying to talk about my work. If I put the two numbers on the same slide, ERC-8217 and ERC-8271, it will just look like a typo.
Yes, thank you. I am okay with any number that solves this problem I have with my two standards.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@nxt3d assigning 8276