Closed
Description
The code snippet below was reported to generate an OOB memory access during _mint()
in the constructor.
Openzeppelin version: 5.2.0
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.28;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Pausable.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
contract MyToken is ERC20, ERC20Burnable, ERC20Pausable, Ownable {
uint256 public constant MAX_SUPPLY = 10_000_000 * 10**18; // 10 million tokens
constructor(address initialOwner)
ERC20("MyToken", "MTK")
Ownable(initialOwner)
{
_mint(msg.sender, 1_000_000 * 10**decimals()); // Initial supply of 1 million tokens
}
function mint(address to, uint256 amount) public onlyOwner {
require(totalSupply() + amount <= MAX_SUPPLY, "Would exceed max supply");
_mint(to, amount);
}
function pause() public onlyOwner {
_pause();
}
function unpause() public onlyOwner {
_unpause();
}
// Override required by Solidity to handle both ERC20Pausable and ERC20
function _update(address from, address to, uint256 amount)
internal
override(ERC20, ERC20Pausable)
{
super._update(from, to, amount);
}
}
Metadata
Metadata
Assignees
Labels
No labels