# TRC-721 Standard
A standard interface allows applications to track and transfer NFTs on Tron. Simple TRC-721 smart contracts list as below to track a large number of NFTs. TRC-20 token standard is insufficient for handling NFTs due to each token in TRC-721 being unique. The standard of TRC-721 is inspiring on Tron. It plays an important role as well as TRC-20.
# MUST Implemented Interfaces
Every TRC-721 compliant contract must implement the TRC721 and TRC165 interfaces
**balanceOf(address _owner)** Returns the number of NFTs owned by the specified account
**ownerOf(uint256 _tokenId)** Returns the owner of the specified NFT
**safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes data)** Transfer ownership of an NFT
**safeTransferFrom(address _from, address _to, uint256 _tokenId)** Transfer ownership of an NFT
**transferFrom(address _from, address _to, uint256 _tokenId)** Transfer the ownership of an NFT (the caller must confirm whether the _to address can receive the NFT normally, otherwise the NFT will be lost)
**approve(address _approved, uint256 _tokenId)** Grant other people control of an NFT
**setApprovalForAll(address _operator, bool _approved)** Grant/recover control of all NFTs by a third party (_operator)
**getApproved(uint256 _tokenId)** Query the authorization of a certain NFT
**isApprovedForAll(address _owner, address _operator)** Query whether the operator is the authorized address of the owner
**supportsInterface(bytes4 interfaceID)** Query whether a certain interface is supported (interfaceID)
**event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId)** Approval event will be triggered after Approval is successful
**event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId)** Successful transferFrom and safeTransferFrom will trigger the Transfer event
**event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved)** ApprovalForAll event will be triggered after setApprovalForAll succeeds
A wallet/broker/auction application MUST implement the wallet interface if it will accept safe transfers.
**onTRC721Received(address _operator, address _from, uint256 _tokenId, bytes _data)**
Works with the `safeTransferFrom
` method, when _to is the contract address, you need to call this method and check the return value. If the return value is not bytes4(keccak256("onTRC721Received(address,address,uint256,bytes)")) an exception will be thrown. A smart contract that can receive NFT must implement the TRC721TokenReceiver interface.
Note
The hash of bytes4(keccak256("onTRC721Received(address,address,uint256,bytes))) is different from the Ethereum version bytes4(keccak256("onERC721Received(address,address,uint256,bytes))). With the return value of function `
onTRC721Received
`, please use 0x5175f878 instead of 0x150b7a02.
# OPTIONAL Metadata Extension Interface
The metadata extension is OPTIONAL for TRC-721 smart contracts. This allows your smart contract to be interrogated for its name and for details about the assets which your NFTs represent.
**name()** Returns the contract name
**symbol()** Returns the contract symbol
**tokenURI(uint256 _tokenId)** Returns the URI of the external file corresponding to _tokenId. External resource files need to include names, descriptions and pictures.
# OPTIONAL Enumeration Extension Interface
The enumeration extension is OPTIONAL for TRC-721 smart contracts. This allows your contract to publish its full list of NFTs and make them discoverable.
**totalSupply()** Returns the total amount of NFT
**tokenByIndex(uint256 _index)** Returns the corresponding tokenId through _index
**tokenOfOwnerByIndex(address _owner, uint256 _index)** Returns the tokenId corresponding to the index in the NFT list owned by the owner