ERC-721: Non-Fungible Tokens (NFTs)

The ERC-721 standard introduces a non-fungible token (NFT) in which each issued token is unique and distinct from others. This standard defines functions and events that enable the creation, ownership, and transfer of non-fungible assets.

ERC-721 defines several key functions, including:

Supported

From interface ERC721

balanceOf

function balanceOf(address _owner) external view returns (uint256)

Returns balance of the HTS non fungible token from the account owner. The _owner is the Hedera account ID 0.0.x in Solidity format or the evm address of a contract that has been created via the CREATE2 operation.

ownerOf

function ownerOf(uint256 _tokenId) external view returns (address)

Returns the account ID of the specified HTS token owner. The _tokenId is the Hedera serial number of the NFT.

approve

function approve(address _approved, uint256 _tokenId) external payable

Gives the spender permission to transfer a token (_tokenId) to another account from the owner. The approval is cleared when the token is transferred. The _tokenId is the Hedera serial number of the NFT.

This works by creating a synthetic CryptoApproveAllowanceTransaction with payer - the account that called the precompile (the message sender property of the message frame in the EVM).

If the spender address is 0, this creates a CryptoDeleteAllowanceTransaction instead and removes any allowances previously approved on the token.

Fires an approval event with the following signature when executed:

event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

setApprovalForAll

function setApprovalForAll(address _operator, bool _approved) external

Approve or remove an operator as an operator for the caller. Operators can call transferFrom for any token owned by the caller.

This works by creating a synthetic CryptoApproveAllowanceTransaction with payer - the account that called the precompile (the message sender property of the message frame in the EVM).

getApproved

function getApproved(uint256 _tokenId) external view returns (address)

Returns the account approved for the specified _tokenId. The _tokenId is the Hedera serial number of the NFT.

This works by loading the SPENDER property of the token from the NFTs ledger.

isApprovedForAll

function isApprovedForAll(address _owner, address _operator) external view returns (bool)

Returns if the operator is allowed to manage all of the assets of owner.

This works by loading the APPROVE_FOR_ALL_NFTS_ALLOWANCES property of the owner account and verifying if the list of approved for all accounts contains the account id of the operator.

transferFrom

function transferFrom(address _from, address _to, uint256 _tokenId) external payable

Transfers a token (_tokenId) from a Hedera account (from) to another Hedera account (to) in Solidity format. The _tokenId is the Hedera serial number of the NFT.

This works by creating a synthetic CryptoTransferTransaction with nft token transfers with the is_approval property set to true.

From interface ERC721Metadata

name

function name() external view returns (string _name)

Returns the name of the HTS non-fungible token.

symbol

function symbol() external view returns (string _symbol)

Returns the symbol of the HTS non-fungible token.

tokenURI

function tokenURI(uint256 _tokenId) external view returns (string)

Returns the token metadata of the HTS non-fungible token. This corresponds to the NFT metadata field when minting an NFT using HTS. The _tokenId is the Hedera serial number of the NFT.

From interface ERC721Enumerable

totalSupply

function totalSupply() external view returns (uint256)

Returns the total supply of the HTS non-fungible token.


Not Supported

The following ERC-721 operations are currently not supported and will return a failure if called.

From interface ERC721

All semantics of interface ERC721TokenReceiver.

  • Existing Hedera token association rules will take the place of such checks.

From interface ERC721Enumerable


Additional References

Last updated