// SPDX-License-Identifier: MIT pragma solidity ^0.8.20; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; import "@openzeppelin/contracts/access/AccessControl.sol"; /** * @title WLPReceiptToken * @notice Fungible receipt token for Chain 138 LP exposure minted on a public chain (Option A). * @dev Only addresses with MINTER_ROLE may mint; BURNER_ROLE for redemption gateway / bridge burn paths. * Not a cW* token; separate from CompliantWrappedToken governance surface. */ contract WLPReceiptToken is ERC20, AccessControl { bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); bytes32 public constant BURNER_ROLE = keccak256("BURNER_ROLE"); uint8 private immutable _decimalsOverride; constructor( string memory name_, string memory symbol_, uint8 decimals_, address admin ) ERC20(name_, symbol_) { require(admin != address(0), "WLP: zero admin"); _decimalsOverride = decimals_; _grantRole(DEFAULT_ADMIN_ROLE, admin); } function decimals() public view override returns (uint8) { return _decimalsOverride; } function mint(address to, uint256 amount) external onlyRole(MINTER_ROLE) { _mint(to, amount); } function burn(address from, uint256 amount) external onlyRole(BURNER_ROLE) { _burn(from, amount); } }