// SPDX-License-Identifier: MIT pragma solidity ^0.8.19; import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/security/Pausable.sol"; /** * @title Governance Token * @notice ERC20 token for DAO governance and protocol incentives * @dev Supports minting for rewards and burning for deflation */ contract GovernanceToken is ERC20, Ownable, Pausable { uint256 public constant MAX_SUPPLY = 1_000_000_000 * 10**18; // 1 billion tokens uint256 public totalMinted; constructor( address initialOwner, string memory name, string memory symbol ) ERC20(name, symbol) { _transferOwnership(initialOwner); } /** * @notice Mint new tokens (only owner) * @param to Address to mint to * @param amount Amount to mint */ function mint(address to, uint256 amount) external onlyOwner { require(totalMinted + amount <= MAX_SUPPLY, "GovernanceToken: exceeds max supply"); totalMinted += amount; _mint(to, amount); } /** * @notice Burn tokens from caller * @param amount Amount to burn */ function burn(uint256 amount) external { _burn(msg.sender, amount); } /** * @notice Burn tokens from specified address (only owner) * @param from Address to burn from * @param amount Amount to burn */ function burnFrom(address from, uint256 amount) external onlyOwner { _burn(from, amount); } /** * @notice Pause token transfers (only owner) */ function pause() external onlyOwner { _pause(); } /** * @notice Unpause token transfers (only owner) */ function unpause() external onlyOwner { _unpause(); } function _beforeTokenTransfer( address from, address to, uint256 amount ) internal override whenNotPaused { super._beforeTokenTransfer(from, to, amount); } } /** * @title DeployGovernanceToken * @notice Deployment script for governance token */ contract DeployGovernanceToken is Script { function run() external { address deployer = msg.sender; address owner = vm.envOr("GOV_TOKEN_OWNER", deployer); string memory name = vm.envOr("GOV_TOKEN_NAME", string("DBIS Token")); string memory symbol = vm.envOr("GOV_TOKEN_SYMBOL", string("DBIS")); uint256 initialSupply = vm.envOr("GOV_TOKEN_INITIAL_SUPPLY", uint256(0)); console.log("Deploying Governance Token..."); console.log("Deployer:", vm.toString(deployer)); console.log("Owner:", vm.toString(owner)); console.log("Name:", name); console.log("Symbol:", symbol); console.log("Initial Supply:", initialSupply); vm.startBroadcast(); GovernanceToken token = new GovernanceToken(owner, name, symbol); if (initialSupply > 0) { token.mint(owner, initialSupply); } vm.stopBroadcast(); console.log("Governance Token deployed at:", vm.toString(address(token))); console.log("Name:", token.name()); console.log("Symbol:", token.symbol()); console.log("Decimals:", token.decimals()); console.log("Total Supply:", token.totalSupply()); console.log("Max Supply:", token.MAX_SUPPLY()); } }