Goal: Create a standardised way of constructing NFTs that are not meant to be transfered. These non-transferable NFTs (NTNFTs, or “soulbound” NFTs) should be bound to an owner address on minting, so the owner would never change.
Potential use-cases:
- badges, POAPs
- proofs of KYC or other verifications
- ticketing, access control
- certificates
Why transferable NFTs cannot do the job?
Attributions are usually made to a specific identifier (wallet address). For that reason, transferable NFTs don’t represent a suitable design, as the owning address can change. While an NEP-171 contract could limit the transfer functionality to prohibit it, this property won’t be easy to determine without checking the actual code. A standardised way of non-transferable NFTs would make this limitation explicit, which would build trust in the owners of tokens abiding to this new NEP standard.
To increase security, minting the non-transferable NFT should be limited to the owner of the account that executed the contract function, or the NTNFT contract must check that the owner agreed to be the target of the NTNFT.
Other considerations:
- The traditional way of “burning” a token is transferring it to the Zero address. Since the transfer functionality will be missing from this implementation, the standard will probably need to add an explicit way of burning a token (should be requested by the token owner).
- This NEP could also be extended with the “usual” NFT extensions, like Metadata and Enumeration. The Approval Management extension would not make sense though.
- From a technical standpoint the functionalities described by this standard will be a subset of the standard NFT functions, so this is not really an “extension” of the NEP-171, actually the NEP-171 standard should be an extension of this one. For historical reasons this will not be the case, but it could be a future improvement to NEP-171 to show this relation (while also implementing the burning function)
Proposed interface:
The interface of an NTNFT contract is really simple, it would “inherit” the only function from NEP-171 which is not related to transferring tokens:
function nft_token(token_id: string): Token|null {}
A new function added by the standard is the explicit burning function:
funcition burn_token(token_id: string): null {}
The Metadata and Enumeration extensions could extend the interface by the usual functions, for example: nft_metadata, nft_total_supply, nft_supply_for_owner
Note: This proposal is created by the kycDAO team, as part of a NEAR grant. The “torch-bearer” for this proposal is Balázs Némethi @nembal (assisted by myself, Sándor Juhász)