ERC 1155
| This document is better viewed at https://docs.openzeppelin.com/contracts/api/token/erc1155 |
This set of interfaces and contracts are all related to the ERC1155 Multi Token Standard.
The EIP consists of three interfaces which fulfill different roles, found here as IERC1155, IERC1155MetadataURI and IERC1155Receiver.
ERC1155 implements the mandatory IERC1155 interface, as well as the optional extension IERC1155MetadataURI, by relying on the substitution mechanism to use the same URI for all token types, dramatically reducing gas costs.
Additionally there are multiple custom extensions, including:
-
designation of addresses that can pause token transfers for all users (
ERC1155Pausable). -
destruction of own tokens (
ERC1155Burnable).
This core set of contracts is designed to be unopinionated, allowing developers to access the internal functions in ERC1155 (such as _mint) and expose them as external functions in the way they prefer.
|
Core
IERC1155
import "@openzeppelin/contracts/token/ERC1155/IERC1155.sol";
Required interface of an ERC1155 compliant contract, as defined in the EIP.
balanceOf(address account, uint256 id) → uint256 external
Returns the value of tokens of token type id owned by account.
Requirements:
-
accountcannot be the zero address.
balanceOfBatch(address[] accounts, uint256[] ids) → uint256[] external
Requirements:
-
accountsandidsmust have the same length.
setApprovalForAll(address operator, bool approved) external
Grants or revokes permission to operator to transfer the caller’s tokens, according to approved,
Emits an ApprovalForAll event.
Requirements:
-
operatorcannot be the caller.
isApprovedForAll(address account, address operator) → bool external
Returns true if operator is approved to transfer account's tokens.
See setApprovalForAll.
safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes data) external
Transfers a value amount of tokens of type id from from to to.
| This function can potentially allow a reentrancy attack when transferring tokens to an untrusted contract, when invoking {onERC1155Received} on the receiver. Ensure to follow the checks-effects-interactions pattern and consider employing reentrancy guards when interacting with untrusted contracts. |
Emits a TransferSingle event.
Requirements:
-
tocannot be the zero address. -
If the caller is not
from, it must have been approved to spendfrom's tokens viasetApprovalForAll. -
frommust have a balance of tokens of typeidof at leastvalueamount. -
If
torefers to a smart contract, it must implementIERC1155Receiver.onERC1155Receivedand return the acceptance magic value.
safeBatchTransferFrom(address from, address to, uint256[] ids, uint256[] values, bytes data) external
Batched version of safeTransferFrom.
| This function can potentially allow a reentrancy attack when transferring tokens to an untrusted contract, when invoking {onERC1155BatchReceived} on the receiver. Ensure to follow the checks-effects-interactions pattern and consider employing reentrancy guards when interacting with untrusted contracts. |
Emits a TransferBatch event.
Requirements:
-
idsandvaluesmust have the same length. -
If
torefers to a smart contract, it must implementIERC1155Receiver.onERC1155BatchReceivedand return the acceptance magic value.
TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value) event
Emitted when value amount of tokens of type id are transferred from from to to by operator.
TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values) event
Equivalent to multiple TransferSingle events, where operator, from and to are the same for all
transfers.
ApprovalForAll(address indexed account, address indexed operator, bool approved) event
Emitted when account grants or revokes permission to operator to transfer their tokens, according to
approved.
URI(string value, uint256 indexed id) event
Emitted when the URI for token type id changes to value, if it is a non-programmatic URI.
If an URI event was emitted for id, the standard
guarantees that value will equal the value
returned by IERC1155MetadataURI.uri.
IERC1155MetadataURI
import "@openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol";
Interface of the optional ERC1155MetadataExtension interface, as defined in the EIP.
ERC1155
import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol";
Implementation of the basic standard multi-token. See https://eips.ethereum.org/EIPS/eip-1155 Originally based on code by Enjin: https://github.com/enjin/erc-1155
constructor(string uri_) internal
See _setURI.
uri(uint256) → string public
This implementation returns the same URI for all token types. It relies on the token type ID substitution mechanism defined in the EIP.
Clients calling this function must replace the {id} substring with the
actual token type ID.
balanceOf(address account, uint256 id) → uint256 public
See IERC1155.balanceOf.
balanceOfBatch(address[] accounts, uint256[] ids) → uint256[] public
Requirements:
-
accountsandidsmust have the same length.
_update(address from, address to, uint256[] ids, uint256[] values) internal
Transfers a value amount of tokens of type id from from to to. Will mint (or burn) if from (or to) is the zero address.
Emits a TransferSingle event if the arrays contain one element, and TransferBatch otherwise.
Requirements:
-
If
torefers to a smart contract, it must implement eitherIERC1155Receiver.onERC1155ReceivedorIERC1155Receiver.onERC1155BatchReceivedand return the acceptance magic value. -
idsandvaluesmust have the same length.
The ERC-1155 acceptance check is not performed in this function. See _updateWithAcceptanceCheck instead.
|
_updateWithAcceptanceCheck(address from, address to, uint256[] ids, uint256[] values, bytes data) internal
Version of _update that performs the token acceptance check by calling IERC1155Receiver.onERC1155Received
or IERC1155Receiver.onERC1155BatchReceived on the receiver address if it contains code (eg. is a smart contract
at the moment of execution).
Overriding this function is discouraged because it poses a reentrancy risk from the receiver. So any
update to the contract state after this function would break the check-effect-interaction pattern. Consider
overriding _update instead.
|
_safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes data) internal
Transfers a value tokens of token type id from from to to.
Emits a TransferSingle event.
Requirements:
-
tocannot be the zero address. -
frommust have a balance of tokens of typeidof at leastvalueamount. -
If
torefers to a smart contract, it must implementIERC1155Receiver.onERC1155Receivedand return the acceptance magic value.
_safeBatchTransferFrom(address from, address to, uint256[] ids, uint256[] values, bytes data) internal
Batched version of _safeTransferFrom.
Emits a TransferBatch event.
Requirements:
-
If
torefers to a smart contract, it must implementIERC1155Receiver.onERC1155BatchReceivedand return the acceptance magic value. -
idsandvaluesmust have the same length.
_setURI(string newuri) internal
Sets a new URI for all token types, by relying on the token type ID substitution mechanism defined in the EIP.
By this mechanism, any occurrence of the {id} substring in either the
URI or any of the values in the JSON file at said URI will be replaced by
clients with the token type ID.
For example, the https://token-cdn-domain/{id}.json URI would be
interpreted by clients as
https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json
for token type ID 0x4cce0.
See uri.
Because these URIs cannot be meaningfully represented by the uri event,
this function emits no events.
_mint(address to, uint256 id, uint256 value, bytes data) internal
Creates a value amount of tokens of type id, and assigns them to to.
Emits a TransferSingle event.
Requirements:
-
tocannot be the zero address. -
If
torefers to a smart contract, it must implementIERC1155Receiver.onERC1155Receivedand return the acceptance magic value.
_mintBatch(address to, uint256[] ids, uint256[] values, bytes data) internal
Emits a TransferBatch event.
Requirements:
-
idsandvaluesmust have the same length. -
tocannot be the zero address. -
If
torefers to a smart contract, it must implementIERC1155Receiver.onERC1155BatchReceivedand return the acceptance magic value.
_burn(address from, uint256 id, uint256 value) internal
Destroys a value amount of tokens of type id from from
Emits a TransferSingle event.
Requirements:
-
fromcannot be the zero address. -
frommust have at leastvalueamount of tokens of typeid.
_burnBatch(address from, uint256[] ids, uint256[] values) internal
Emits a TransferBatch event.
Requirements:
-
fromcannot be the zero address. -
frommust have at leastvalueamount of tokens of typeid. -
idsandvaluesmust have the same length.
_setApprovalForAll(address owner, address operator, bool approved) internal
Approve operator to operate on all of owner tokens
Emits an ApprovalForAll event.
Requirements:
-
operatorcannot be the zero address.
IERC1155Receiver
import "@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol";
Interface that must be implemented by smart contracts in order to receive ERC-1155 token transfers.
onERC1155Received(address operator, address from, uint256 id, uint256 value, bytes data) → bytes4 external
Handles the receipt of a single ERC1155 token type. This function is
called at the end of a safeTransferFrom after the balance has been updated.
To accept the transfer, this must return
bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))
(i.e. 0xf23a6e61, or its own function selector).
|
onERC1155BatchReceived(address operator, address from, uint256[] ids, uint256[] values, bytes data) → bytes4 external
Handles the receipt of a multiple ERC1155 token types. This function
is called at the end of a safeBatchTransferFrom after the balances have
been updated.
To accept the transfer(s), this must return
bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))
(i.e. 0xbc197c81, or its own function selector).
|
Extensions
ERC1155Pausable
import "@openzeppelin/contracts/token/ERC1155/extensions/ERC1155Pausable.sol";
ERC1155 token with pausable token transfers, minting and burning.
Useful for scenarios such as preventing trades until the end of an evaluation period, or having an emergency switch for freezing all token transfers in the event of a large bug.
This contract does not include public pause and unpause functions. In
addition to inheriting this contract, you must define both functions, invoking the
Pausable._pause and Pausable._unpause internal functions, with appropriate
access control, e.g. using AccessControl or Ownable. Not doing so will
make the contract pause mechanism of the contract unreachable, and thus unusable.
|
_update(address from, address to, uint256[] ids, uint256[] values) internal
See ERC1155._update.
Requirements:
-
the contract must not be paused.
ERC1155Burnable
import "@openzeppelin/contracts/token/ERC1155/extensions/ERC1155Burnable.sol";
Extension of ERC1155 that allows token holders to destroy both their
own tokens and those that they have been approved to use.
ERC1155Supply
import "@openzeppelin/contracts/token/ERC1155/extensions/ERC1155Supply.sol";
Extension of ERC1155 that adds tracking of total supply per id.
Useful for scenarios where Fungible and Non-fungible tokens have to be clearly identified. Note: While a totalSupply of 1 might mean the corresponding is an NFT, there is no guarantees that no other token with the same id are not going to be minted.
| This contract implies a global limit of 2**256 - 1 to the number of tokens that can be minted. |
| This extension should not be added in an upgrade to an already deployed contract. |
_update(address from, address to, uint256[] ids, uint256[] values) internal
See ERC1155._update.
ERC1155URIStorage
import "@openzeppelin/contracts/token/ERC1155/extensions/ERC1155URIStorage.sol";
ERC1155 token with storage based token URI management. Inspired by the ERC721URIStorage extension
uri(uint256 tokenId) → string public
This implementation returns the concatenation of the _baseURI
and the token-specific uri if the latter is set
This enables the following behaviors:
-
if
_tokenURIs[tokenId]is set, then the result is the concatenation of_baseURIand_tokenURIs[tokenId](keep in mind that_baseURIis empty per default); -
if
_tokenURIs[tokenId]is NOT set then we fallback tosuper.uri()which in most cases will containERC1155._uri; -
if
_tokenURIs[tokenId]is NOT set, and if the parents do not have a uri value set, then the result is empty.
Utilities
ERC1155Holder
import "@openzeppelin/contracts/token/ERC1155/utils/ERC1155Holder.sol";
Simple implementation of IERC1155Receiver that will allow a contract to hold ERC1155 tokens.
| When inheriting this contract, you must include a way to use the received tokens, otherwise they will be stuck. |