ERC721
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 byfrom
.- 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 {xref-ERC721-_safeMint-address-uint256-}[_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 byfrom
. 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
Name | Type | Description |
---|---|---|
from | address | address representing the previous owner of the given token ID |
to | address | target address that will receive the tokens |
tokenId | uint256 | uint256 ID of the token to be transferred |
_data | bytes | bytes optional data to send along with the call |
Returns
Name | Type | Description |
---|---|---|
<none> | bool | bool 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
andto
are both non-zero,from
'stokenId
will be transferred toto
. - When
from
is zero,tokenId
will be minted forto
. - When
to
is zero,from
'stokenId
will be burned. from
andto
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
andto
are both non-zero. from
andto
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;