// SPDX-License-Identifier: MIT pragma solidity ^0.8.24; import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; /// @title FixedSupplyCoin /// @notice A plain ERC-20 whose entire supply is created once at deployment. /// @dev There is no owner, administrator, tax, blacklist, pause, or post-deployment mint function. contract FixedSupplyCoin is ERC20 { error EmptyName(); error EmptySymbol(); error InvalidInitialHolder(); error InvalidSupply(); uint256 public immutable INITIAL_SUPPLY; constructor( string memory name_, string memory symbol_, uint256 wholeTokenSupply_, address initialHolder_ ) ERC20(name_, symbol_) { if (bytes(name_).length == 0) revert EmptyName(); if (bytes(symbol_).length == 0) revert EmptySymbol(); if (initialHolder_ == address(0)) revert InvalidInitialHolder(); if (wholeTokenSupply_ == 0 || wholeTokenSupply_ > 100_000_000_000) { revert InvalidSupply(); } uint256 supply = wholeTokenSupply_ * 10 ** decimals(); INITIAL_SUPPLY = supply; _mint(initialHolder_, supply); } }