Use Arrays.unsafeMemoryAccess in ERC1155Supply (#5068)
Co-authored-by: Hadrien Croubois <hadrien.croubois@gmail.com>
This commit is contained in:
@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user