// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; import "@openzeppelin/contracts/security/Pausable.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/math/SafeMath.sol"; contract NFUEL is ERC20, Pausable, Ownable { using SafeMath for uint256; address public minter; uint256 public cap; uint256 public gasRefundPercentage; event Mint(address indexed to, uint256 amount); event GasRefund(address indexed to, uint256 amount); constructor(uint256 _cap, uint256 _gasRefundPercentage) ERC20("GasToken", "NFUEL") { minter = msg.sender; cap = _cap; gasRefundPercentage = _gasRefundPercentage; } modifier onlyMinter() { require(msg.sender == minter, "Only the minter can call this"); _; } modifier notExceedsCap(uint256 amount) { require(totalSupply().add(amount) <= cap, "Exceeds the token cap"); _; } function mint(address to, uint256 amount) external onlyMinter notExceedsCap(amount) { _mint(to, amount); emit Mint(to, amount); } function setMinter(address newMinter) external onlyOwner { minter = newMinter; } function setCap(uint256 _cap) external onlyOwner { cap = _cap; } function setGasRefundPercentage(uint256 percentage) external onlyOwner { require(percentage <= 100, "Invalid percentage"); gasRefundPercentage = percentage; } function pause() external onlyOwner { _pause(); } function unpause() external onlyOwner { _unpause(); } function refundGas(address to, uint256 amount) external whenNotPaused { require(msg.sender == minter, "Only the minter can refund gas"); uint256 refundAmount = amount.mul(gasRefundPercentage).div(100); _mint(to, refundAmount); emit GasRefund(to, refundAmount); } receive() external payable { mint(msg.sender, msg.value); } }