Add ERC1155.totalSupply that returns overall supply count (#3962)

This commit is contained in:
JulissaDantes
2023-01-25 15:39:02 -05:00
committed by GitHub
parent 54c31ad98b
commit e919d96ff2
3 changed files with 55 additions and 9 deletions

View File

@ -15,6 +15,7 @@ import "../ERC1155.sol";
*/
abstract contract ERC1155Supply is ERC1155 {
mapping(uint256 => uint256) private _totalSupply;
uint256 private _totalSupplyAll;
/**
* @dev Total amount of tokens in with a given id.
@ -23,6 +24,13 @@ abstract contract ERC1155Supply is ERC1155 {
return _totalSupply[id];
}
/**
* @dev Total amount of tokens.
*/
function totalSupply() public view virtual returns (uint256) {
return _totalSupplyAll;
}
/**
* @dev Indicates whether any token exist with a given id, or not.
*/
@ -41,21 +49,33 @@ abstract contract ERC1155Supply is ERC1155 {
bytes memory data
) internal virtual override {
if (from == address(0)) {
uint256 totalMintAmount = 0;
for (uint256 i = 0; i < ids.length; ++i) {
_totalSupply[ids[i]] += amounts[i];
uint256 amount = amounts[i];
_totalSupply[ids[i]] += amount;
totalMintAmount += amount;
}
_totalSupplyAll += totalMintAmount;
}
if (to == address(0)) {
uint256 totalBurnAmount = 0;
for (uint256 i = 0; i < ids.length; ++i) {
uint256 id = ids[i];
uint256 amount = amounts[i];
uint256 supply = _totalSupply[id];
require(supply >= amount, "ERC1155: burn amount exceeds totalSupply");
unchecked {
// Overflow not possible: amounts[i] <= totalSupply(i)
_totalSupply[id] = supply - amount;
// Overflow not possible: sum(amounts[i]) <= sum(totalSupply(i)) <= totalSupplyAll
totalBurnAmount += amount;
}
}
unchecked {
// Overflow not possible: totalBurnAmount = sum(amounts[i]) <= sum(totalSupply(i)) <= totalSupplyAll
_totalSupplyAll -= totalBurnAmount;
}
}
super._update(from, to, ids, amounts, data);
}