1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- // SPDX-License-Identifier: MIT
- // OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/ERC1155Supply.sol)
- pragma solidity ^0.8.0;
- import "../ERC1155Upgradeable.sol";
- import "../../../proxy/utils/Initializable.sol";
- /**
- * @dev 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.
- */
- abstract contract ERC1155SupplyUpgradeable is Initializable, ERC1155Upgradeable {
- function __ERC1155Supply_init() internal onlyInitializing {
- }
- function __ERC1155Supply_init_unchained() internal onlyInitializing {
- }
- mapping(uint256 => uint256) private _totalSupply;
- /**
- * @dev Total amount of tokens in with a given id.
- */
- function totalSupply(uint256 id) public view virtual returns (uint256) {
- return _totalSupply[id];
- }
- /**
- * @dev Indicates whether any token exist with a given id, or not.
- */
- function exists(uint256 id) public view virtual returns (bool) {
- return ERC1155SupplyUpgradeable.totalSupply(id) > 0;
- }
- /**
- * @dev See {ERC1155-_beforeTokenTransfer}.
- */
- function _beforeTokenTransfer(
- address operator,
- address from,
- address to,
- uint256[] memory ids,
- uint256[] memory amounts,
- bytes memory data
- ) internal virtual override {
- super._beforeTokenTransfer(operator, from, to, ids, amounts, data);
- if (from == address(0)) {
- for (uint256 i = 0; i < ids.length; ++i) {
- _totalSupply[ids[i]] += amounts[i];
- }
- }
- if (to == address(0)) {
- for (uint256 i = 0; i < ids.length; ++i) {
- _totalSupply[ids[i]] -= amounts[i];
- }
- }
- }
- /**
- * This empty reserved space is put in place to allow future versions to add new
- * variables without shifting down storage in the inheritance chain.
- * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
- */
- uint256[49] private __gap;
- }
|