1234567891011121314151617181920212223242526272829303132333435 |
- // SPDX-License-Identifier: MIT
- // OpenZeppelin Contracts (last updated v5.3.0) (token/ERC6909/extensions/draft-ERC6909TokenSupply.sol)
- pragma solidity ^0.8.20;
- import {ERC6909} from "../draft-ERC6909.sol";
- import {IERC6909TokenSupply} from "../../../interfaces/draft-IERC6909.sol";
- /**
- * @dev Implementation of the Token Supply extension defined in ERC6909.
- * Tracks the total supply of each token id individually.
- */
- contract ERC6909TokenSupply is ERC6909, IERC6909TokenSupply {
- mapping(uint256 id => uint256) private _totalSupplies;
- /// @inheritdoc IERC6909TokenSupply
- function totalSupply(uint256 id) public view virtual override returns (uint256) {
- return _totalSupplies[id];
- }
- /// @dev Override the `_update` function to update the total supply of each token id as necessary.
- function _update(address from, address to, uint256 id, uint256 amount) internal virtual override {
- super._update(from, to, id, amount);
- if (from == address(0)) {
- _totalSupplies[id] += amount;
- }
- if (to == address(0)) {
- unchecked {
- // amount <= _balances[from][id] <= _totalSupplies[id]
- _totalSupplies[id] -= amount;
- }
- }
- }
- }
|