|
@@ -4,6 +4,7 @@
|
|
|
pragma solidity ^0.8.20;
|
|
|
|
|
|
import {ERC1155} from "../ERC1155.sol";
|
|
|
+import {Arrays} from "../../../utils/Arrays.sol";
|
|
|
|
|
|
/**
|
|
|
* @dev Extension of ERC-1155 that adds tracking of total supply per id.
|
|
@@ -19,6 +20,8 @@ import {ERC1155} from "../ERC1155.sol";
|
|
|
* CAUTION: This extension should not be added in an upgrade to an already deployed contract.
|
|
|
*/
|
|
|
abstract contract ERC1155Supply is ERC1155 {
|
|
|
+ using Arrays for uint256[];
|
|
|
+
|
|
|
mapping(uint256 id => uint256) private _totalSupply;
|
|
|
uint256 private _totalSupplyAll;
|
|
|
|
|
@@ -57,9 +60,9 @@ abstract contract ERC1155Supply is ERC1155 {
|
|
|
if (from == address(0)) {
|
|
|
uint256 totalMintValue = 0;
|
|
|
for (uint256 i = 0; i < ids.length; ++i) {
|
|
|
- uint256 value = values[i];
|
|
|
+ uint256 value = values.unsafeMemoryAccess(i);
|
|
|
// Overflow check required: The rest of the code assumes that totalSupply never overflows
|
|
|
- _totalSupply[ids[i]] += value;
|
|
|
+ _totalSupply[ids.unsafeMemoryAccess(i)] += value;
|
|
|
totalMintValue += value;
|
|
|
}
|
|
|
// Overflow check required: The rest of the code assumes that totalSupplyAll never overflows
|
|
@@ -69,11 +72,11 @@ abstract contract ERC1155Supply is ERC1155 {
|
|
|
if (to == address(0)) {
|
|
|
uint256 totalBurnValue = 0;
|
|
|
for (uint256 i = 0; i < ids.length; ++i) {
|
|
|
- uint256 value = values[i];
|
|
|
+ uint256 value = values.unsafeMemoryAccess(i);
|
|
|
|
|
|
unchecked {
|
|
|
// Overflow not possible: values[i] <= balanceOf(from, ids[i]) <= totalSupply(ids[i])
|
|
|
- _totalSupply[ids[i]] -= value;
|
|
|
+ _totalSupply[ids.unsafeMemoryAccess(i)] -= value;
|
|
|
// Overflow not possible: sum_i(values[i]) <= sum_i(totalSupply(ids[i])) <= totalSupplyAll
|
|
|
totalBurnValue += value;
|
|
|
}
|