SRC-721, the popular standard for non-fungible tokens (NFTs), includes send functions, such as transferFrom() and safeTransferFrom(), but does not include a backwards-compatible transfer() found in fungible SRC-20 tokens. This standard provides references to add such a transfer().
Motivation
This standard proposes a simple extension to allow NFTs to work with contracts designed to manage SRC-20s and many consumer wallets which expect to be able to execute a token transfer(). For example, if an NFT is inadvertently sent to a contract that typically handles SRC-20, that NFT will be locked. It should also simplify the task for contract programmers if they can rely on transfer() to both handle SRC-20 and NFTs.
Specification
The key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, and “OPTIONAL” in this document are to be interpreted as described in RFC 2119.
The interface for SRC-4521 transfer() MUST conform to SRC-20 and resulting transfers MUST fire the Transfer event as described in SRC-721.
function transfer(address to, uint256 tokenId) external returns (bool success);
Rationale
Replicating SRC-20 transfer() with just a minor change to accurately reflect that a unique tokenId rather than fungible sum is being sent is desirable for code simplicity and to make integration easier.
Backwards Compatibility
This SIP does not introduce any known backward compatibility issues.
Reference Implementation
A reference implementation of an SRC-4521 transfer():
function transfer(address to, uint256 tokenId) public virtual returns (bool success) {
require(msg.sender == ownerOf[tokenId], "NOT_OWNER");
unchecked {
balanceOf[msg.sender]--;
balanceOf[to]++;
}
delete getApproved[tokenId];
ownerOf[tokenId] = to;
emit Transfer(msg.sender, to, tokenId);
success = true;
}
Security Considerations
Implementers must be sure to include the relevant return bool value for an SRC-4521 in order to conform with existing contracts that use SRC-20 interfaces, otherwise, NFTs may be locked unless a safeTransfer is used in such contracts.
Ross Campbell (@z0r0z), "SRC-4521: 721/20-compatible transfer [STAGNANT]," Sila Improvement Proposals, no. 4521, December 2021. Available: https://sips.sila.org/SIPS/sip-4521.