Repository navigation
Add ERC: Non-Transferable Token - #1479
Vantana1995 wants to merge 9 commits into
Conversation
File
|
| @@ -0,0 +1,313 @@ | |||
| --- | |||
| eip: <to be assigned> | |||
| title: Non-Transferable Token Standard | |||
There was a problem hiding this comment.
| title: Non-Transferable Token Standard | |
| title: Non-Transferable Token |
Standard is superfluous in an ERC title
| @@ -0,0 +1,313 @@ | |||
| --- | |||
| eip: <to be assigned> | |||
There was a problem hiding this comment.
| eip: <to be assigned> | |
| eip: 8129 |
Assigning next sequential EIP/ERC/RIP number.
Numbers are assigned by editors & associates.
Please also update the filename.
| title: Non-Transferable Token Standard | ||
| description: A minimal standard for tokens that are permanently bound to an address | ||
| author: Ivan Zemko (@Vantana1995) | ||
| discussions-to: https://ethereum-magicians.org/t/soulbound-nft-as-separate-standard/27407 |
There was a problem hiding this comment.
| discussions-to: https://ethereum-magicians.org/t/soulbound-nft-as-separate-standard/27407 | |
| discussions-to: https://ethereum-magicians.org/t/erc-8129-non-transferable-token/27407 |
Updated Eth Magicians with assigned number & title
|
@abcoathup what is the next steps, how to merge it to the main >? |
fe68cee to
7f30b97
Compare
| --- | ||
| eip: 8129 | ||
| title: Non-Transferable Token | ||
| description: A minimal interface for tokens that are permanently bound to an address |
There was a problem hiding this comment.
[...] minimal [..]
Minimal is a very subjective term and doesn't add much information to your description. It isn't a requirement, but I'd recommend trying to use terms that differentiate your proposal more clearly.
|
|
||
| ## Abstract | ||
|
|
||
| This EIP proposes a minimal standard for non-transferable tokens (commonly known as "Soulbound tokens"). Unlike existing approaches that extend [ERC-721](./eip-721.md) and disable transfer functionality, this standard defines tokens that are non-transferable by design, eliminating transfer-related functions entirely from the interface. |
There was a problem hiding this comment.
Your abstract is relying too heavily on other soulbound token standards that the audience may not have read yet. Imagine if your proposal became the non-transferable token standard, but it didn't actually explain what a non-transferable token is or what it's for.
|
|
||
| 4. **Not Truly Non-Transferable**: Existing implementations either block transfers through restrictions or allow consensual movement between addresses. In both cases, the token is not fundamentally bound to a single address - it's restricted from free transfer or requires consent to move. | ||
|
|
||
| Non-transferable tokens represent credentials, achievements, certifications, memberships, and identity attestations - assets that by their nature should be permanently bound to their owner. These use cases deserve a dedicated standard that explicitly communicates non-transferability through the absence of transfer functions, not their restriction. |
There was a problem hiding this comment.
This paragraph is, in my opinion, more important than the comparisons to other soulbound standards. You need to sell the reader on the idea of soulbound tokens at all before you convince them to use this particular version of them.
| Current Soulbound token implementations take different approaches but all retain some form of token movement between addresses: | ||
|
|
||
| - [ERC-5192](./eip-5192.md) and [ERC-5484](./eip-5484.md) extend [ERC-721](./eip-721.md), inheriting its complete transfer infrastructure and then blocking these capabilities | ||
| - [ERC-4973](./eip-4973.md) avoids implementing ERC-721's transfer interface but includes `give()` and `take()` functions that allow token movement between addresses with signature consent |
There was a problem hiding this comment.
Not necessarily a bad thing, but you should note that referencing this proposal creates an implicit dependency. You won't be able to advance ERC-8129 beyond ERC-4973's status (currently review).
| Compliant contracts MUST implement the ERC-721 metadata interface for human-readable token information: | ||
|
|
||
| ```solidity | ||
| /// @title ERC-721 Metadata Interface (from EIP-721) | ||
| /// @dev This is a REQUIRED part of the standard | ||
| interface IERC721Metadata { | ||
| /// @notice A descriptive name for the token collection | ||
| function name() external view returns (string memory); | ||
|
|
||
| /// @notice An abbreviated name for the token collection | ||
| function symbol() external view returns (string memory); | ||
|
|
||
| /// @notice A URI pointing to metadata for a specific token | ||
| /// @dev MUST revert if tokenId does not exist | ||
| /// @param tokenId The identifier of the token | ||
| /// @return The URI string | ||
| function tokenURI(uint256 tokenId) external view returns (string memory); | ||
| } | ||
| ``` | ||
|
|
||
| See [ERC-721](./eip-721.md) for a definition of its metadata JSON Schema. |
There was a problem hiding this comment.
Instead of duplicating the definition here, just link to the section in ERC-721. Something like:
| Compliant contracts MUST implement the ERC-721 metadata interface for human-readable token information: | |
| ```solidity | |
| /// @title ERC-721 Metadata Interface (from EIP-721) | |
| /// @dev This is a REQUIRED part of the standard | |
| interface IERC721Metadata { | |
| /// @notice A descriptive name for the token collection | |
| function name() external view returns (string memory); | |
| /// @notice An abbreviated name for the token collection | |
| function symbol() external view returns (string memory); | |
| /// @notice A URI pointing to metadata for a specific token | |
| /// @dev MUST revert if tokenId does not exist | |
| /// @param tokenId The identifier of the token | |
| /// @return The URI string | |
| function tokenURI(uint256 tokenId) external view returns (string memory); | |
| } | |
| ``` | |
| See [ERC-721](./eip-721.md) for a definition of its metadata JSON Schema. | |
| Compliant contracts MUST implement ERC-721's [`ERC721Metadata`](./eip-721.md#specification:~:text=interface%20ERC721Metadata) interface for human-readable token information. | |
| See [ERC-721](./eip-721.md) for a definition of its metadata JSON Schema. |
|
|
||
| 1. **Minting**: | ||
| - Tokens MUST be minted to a specified address via the `to` parameter | ||
| - The minting function MUST emit the `Mint` event |
There was a problem hiding this comment.
You should probably add a section for requirements on events. For example, if a token is created through a function other than the minting function, is the event emitted?
|
|
||
| ### Why Not Extend ERC-721 or Use Consensual Transfer? | ||
|
|
||
| **ERC-721 Extensions (ERC-5192, ERC-5484):** |
There was a problem hiding this comment.
Use subheadings instead of bold text. We have h1-h6, might as well use them.
| **ERC-721 Extensions (ERC-5192, ERC-5484):** | |
| #### ERC-721 Extensions (ERC-5192, ERC-5484) |
| ## Reference Implementation | ||
|
|
||
| ```solidity | ||
| // SPDX-License-Identifier: MIT |
There was a problem hiding this comment.
Code within the document itself must be CC0-1.0 licensed. You can include MIT code in your assets directory if you like.
|
|
||
| ### Interface Detection | ||
|
|
||
| External contracts MUST NOT assume transfer capabilities based solely on the presence of metadata functions. Always check [ERC-165](./eip-165.md#how-to-detect-if-a-contract-implements-any-given-interface) interface support. |
There was a problem hiding this comment.
Avoid creating requirements (defined with UPPERCASE keywords) outside of the specification section. They're too easy for implementers to miss. Instead, put the requirements in Specification, and discuss their relevance to security here.
|
The commit bfde567 (as a parent of 22d4998) contains errors. |
Summary
This PR proposes EIP-8129: Non-Transferable Token Standard - a minimal standard for tokens that are permanently bound to an address.
Description
Introduces a dedicated interface for non-transferable (Soulbound) tokens that eliminates transfer functionality by design, rather than extending ERC-721 and blocking transfers. The standard:
mint(),burn(),ownerOf()This approach addresses architectural mismatches in existing Soulbound implementations (ERC-5192, ERC-4973, ERC-5484) that inherit unused transfer infrastructure.