// SPDX-License-Identifier: MIT pragma solidity ^0.8.24; contract OTGTestToken { string public constant name = "Own The Grid Test Token"; string public constant symbol = "tOTG"; uint8 public constant decimals = 18; uint256 public constant FAUCET_AMOUNT = 1_000_000 ether; uint256 public constant FAUCET_COOLDOWN = 12 hours; address public owner; uint256 public totalSupply; mapping(address => uint256) public balanceOf; mapping(address => mapping(address => uint256)) public allowance; mapping(address => uint256) public lastFaucetClaim; event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); modifier onlyOwner() { require(msg.sender == owner, "not owner"); _; } constructor() { owner = msg.sender; _mint(msg.sender, 100_000_000 ether); } function faucet() external { require(block.timestamp >= lastFaucetClaim[msg.sender] + FAUCET_COOLDOWN, "cooldown"); lastFaucetClaim[msg.sender] = block.timestamp; _mint(msg.sender, FAUCET_AMOUNT); } function mint(address to, uint256 value) external onlyOwner { _mint(to, value); } function transfer(address to, uint256 value) external returns (bool) { _transfer(msg.sender, to, value); return true; } function approve(address spender, uint256 value) external returns (bool) { allowance[msg.sender][spender] = value; emit Approval(msg.sender, spender, value); return true; } function transferFrom(address from, address to, uint256 value) external returns (bool) { uint256 allowed = allowance[from][msg.sender]; require(allowed >= value, "allowance"); if (allowed != type(uint256).max) { allowance[from][msg.sender] = allowed - value; } _transfer(from, to, value); return true; } function _transfer(address from, address to, uint256 value) internal { require(to != address(0), "bad recipient"); uint256 balance = balanceOf[from]; require(balance >= value, "balance"); balanceOf[from] = balance - value; balanceOf[to] += value; emit Transfer(from, to, value); } function _mint(address to, uint256 value) internal { require(to != address(0), "bad recipient"); totalSupply += value; balanceOf[to] += value; emit Transfer(address(0), to, value); } }