ERC721

Git Source

Inherits: Context, ERC165, IERC721, IERC721Metadata

Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including the Metadata extension, but not including the Enumerable extension, which is available separately as {ERC721Enumerable}.

State Variables

_name

string private _name;

_symbol

string private _symbol;

_owners

mapping(uint256 => address) private _owners;

_balances

mapping(address => uint256) private _balances;

_tokenApprovals

mapping(uint256 => address) private _tokenApprovals;

_operatorApprovals

mapping(address => mapping(address => bool)) private _operatorApprovals;

Functions

__ERC721_Init

function __ERC721_Init(string calldata name_, string calldata symbol_) internal;

supportsInterface

See IERC165-supportsInterface.

function supportsInterface(bytes4 interfaceId)
    public
    view
    virtual
    override(ERC165, IERC165)
    returns (bool);

balanceOf

See IERC721-balanceOf.

function balanceOf(address owner) public view virtual override returns (uint256);

ownerOf

See IERC721-ownerOf.

function ownerOf(uint256 tokenId) public view virtual override returns (address);

name

See IERC721Metadata-name.

function name() public view virtual override returns (string memory);

symbol

See IERC721Metadata-symbol.

function symbol() public view virtual override returns (string memory);

tokenURI

See IERC721Metadata-tokenURI.

function tokenURI(uint256) public view virtual override returns (string memory);

approve

See IERC721-approve.

function approve(address to, uint256 tokenId) public virtual override;

getApproved

See IERC721-getApproved.

function getApproved(uint256 tokenId) public view virtual override returns (address);

setApprovalForAll

See IERC721-setApprovalForAll.

function setApprovalForAll(address operator, bool approved) public virtual override;

isApprovedForAll

See IERC721-isApprovedForAll.

function isApprovedForAll(address owner, address operator)
    public
    view
    virtual
    override
    returns (bool);

transferFrom

See IERC721-transferFrom.

function transferFrom(address from, address to, uint256 tokenId) public virtual override;

safeTransferFrom

See IERC721-safeTransferFrom.

function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override;

safeTransferFrom

See IERC721-safeTransferFrom.

function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data)
    public
    virtual
    override;

_safeTransfer

*Safely transfers tokenId token from from to to, checking first that contract recipients are aware of the ERC721 protocol to prevent tokens from being forever locked. _data is additional data, it has no specified format and it is sent in call to to. This internal function is equivalent to safeTransferFrom, and can be used to e.g. implement alternative mechanisms to perform token transfer, such as signature-based. Requirements:

  • from cannot be the zero address.
  • to cannot be the zero address.
  • tokenId token must exist and be owned by from.
  • If to refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. Emits a {Transfer} event.*
function _safeTransfer(address from, address to, uint256 tokenId, bytes memory _data)
    internal
    virtual;

_exists

Returns whether tokenId exists. Tokens can be managed by their owner or approved accounts via approve or {setApprovalForAll}. Tokens start existing when they are minted (_mint), and stop existing when they are burned (_burn).

function _exists(uint256 tokenId) internal view virtual returns (bool);

_isApprovedOrOwner

*Returns whether spender is allowed to manage tokenId. Requirements:

  • tokenId must exist.*
function _isApprovedOrOwner(address spender, uint256 tokenId)
    internal
    view
    virtual
    returns (bool);

_safeMint

*Safely mints tokenId and transfers it to to. Requirements:

  • tokenId must not exist.
  • If to refers to a smart contract, it must implement IERC721Receiver-onERC721Received, which is called upon a safe transfer. Emits a {Transfer} event.*
function _safeMint(address to, uint256 tokenId) internal virtual;

_safeMint

Same as _safeMint, with an additional data parameter which is forwarded in {IERC721Receiver-onERC721Received} to contract recipients.

function _safeMint(address to, uint256 tokenId, bytes memory _data) internal virtual;

_mint

*Mints tokenId and transfers it to to. WARNING: Usage of this method is discouraged, use _safeMint whenever possible Requirements:

  • tokenId must not exist.
  • to cannot be the zero address. Emits a {Transfer} event.*
function _mint(address to, uint256 tokenId) internal virtual;

_burn

*Destroys tokenId. The approval is cleared when the token is burned. Requirements:

  • tokenId must exist. Emits a {Transfer} event.*
function _burn(uint256 tokenId) internal virtual;

_transfer

*Transfers tokenId from from to to. As opposed to transferFrom, this imposes no restrictions on msg.sender. Requirements:

  • to cannot be the zero address.
  • tokenId token must be owned by from. Emits a {Transfer} event.*
function _transfer(address from, address to, uint256 tokenId) internal virtual;

_approve

Approve to to operate on tokenId Emits a {Approval} event.

function _approve(address to, uint256 tokenId) internal virtual;

_setApprovalForAll

Approve operator to operate on all of owner tokens Emits a {ApprovalForAll} event.

function _setApprovalForAll(address owner, address operator, bool approved) internal virtual;

_checkOnERC721Received

Internal function to invoke IERC721Receiver-onERC721Received on a target address. The call is not executed if the target address is not a contract.

function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data)
    private
    returns (bool);

Parameters

NameTypeDescription
fromaddressaddress representing the previous owner of the given token ID
toaddresstarget address that will receive the tokens
tokenIduint256uint256 ID of the token to be transferred
_databytesbytes optional data to send along with the call

Returns

NameTypeDescription
<none>boolbool whether the call correctly returned the expected magic value

_beforeTokenTransfer

*Hook that is called before any token transfer. This includes minting and burning. Calling conditions:

  • When from and to are both non-zero, from's tokenId will be transferred to to.
  • When from is zero, tokenId will be minted for to.
  • When to is zero, from's tokenId will be burned.
  • from and to are never both zero. To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].*
function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual;

_afterTokenTransfer

*Hook that is called after any transfer of tokens. This includes minting and burning. Calling conditions:

  • when from and to are both non-zero.
  • from and to are never both zero. To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].*
function _afterTokenTransfer(address from, address to, uint256 tokenId) internal virtual;