// SPDX-License-Identifier: MIT pragma solidity 0.8.30; import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol"; import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol"; /// @notice Fixed issuance, immutable features, no owner, no upgrade or administrative mint. /// @dev This is an ERC20 token, not a Uniswap hook, liquidity pool or bonding curve. contract JikoToken is ERC20Burnable, ERC20Permit { bool public immutable burnEnabled; bool public immutable permitEnabled; uint256 public immutable initialSupply; address public immutable creator; error InvalidConfiguration(); error FeatureDisabled(); constructor(string memory tokenName, string memory tokenSymbol, uint256 supply, address recipient, bool enableBurn, bool enablePermit) ERC20(tokenName, tokenSymbol) ERC20Permit(tokenName) { if (bytes(tokenName).length == 0 || bytes(tokenName).length > 64 || bytes(tokenSymbol).length == 0 || bytes(tokenSymbol).length > 10 || supply == 0 || supply > 1e33 || recipient == address(0)) revert InvalidConfiguration(); burnEnabled = enableBurn; permitEnabled = enablePermit; initialSupply = supply; creator = msg.sender; _mint(recipient, supply); } function burn(uint256 value) public override { if (!burnEnabled) revert FeatureDisabled(); super.burn(value); } function burnFrom(address account, uint256 value) public override { if (!burnEnabled) revert FeatureDisabled(); super.burnFrom(account, value); } function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public override { if (!permitEnabled) revert FeatureDisabled(); super.permit(owner, spender, value, deadline, v, r, s); } }