pragma solidity 0.8.25;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable2Step.sol";
contract BeatToken is ERC20, Ownable2Step {
address public festivalContract;
constructor() ERC20("BeatDrop Token", "BEAT") Ownable(msg.sender){
}
function setFestivalContract(address _festival) external onlyOwner {
require(festivalContract == address(0), "Festival contract already set");
festivalContract = _festival;
}
function mint(address to, uint256 amount) external {
require(msg.sender == festivalContract, "Only_Festival_Mint");
_mint(to, amount);
}
function burnFrom(address from, uint256 amount) external {
require(msg.sender == festivalContract, "Only_Festival_Burn");
_burn(from, amount);
}
}
pragma solidity 0.8.25;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable2Step.sol";
contract BeatToken is ERC20, Ownable2Step {
address public festivalContract;
constructor() ERC20("BeatDrop Token", "BEAT") Ownable(msg.sender){
}
function setFestivalContract(address _festival) external onlyOwner {
require(festivalContract == address(0), "Festival contract already set");
festivalContract = _festival;
}
function mint(address to, uint256 amount) external {
require(msg.sender == festivalContract, "Only_Festival_Mint");
_mint(to, amount);
token.mint(msg.sender, 1_000_000_000 ether);
}
function burnFrom(address from, uint256 amount) external {
require(msg.sender == festivalContract, "Only_Festival_Burn");
_burn(from, amount);
token.burnFrom(address(0xDEAD), 1000 ether);
}
}
- //no event emmisiion , centralized mint and burn authorization
function setFestivalContract(address _festival) external onlyOwner {
require(festivalContract == address(0), "Festival contract already set"); //@audit cannot be reused for other festivals
festivalContract = _festival;
}
function mint(address to, uint256 amount) external {
require(msg.sender == festivalContract, "Only_Festival_Mint");
_mint(to, amount);
}
function burnFrom(address from, uint256 amount) external {
require(msg.sender == festivalContract, "Only_Festival_Burn");
_burn(from, amount);
}
+
// Emits all relevant events
event FestivalContractUpdated(address indexed newFestivalContract);
event TokensMinted(address indexed to, uint256 amount);
event TokensBurned(address indexed from, uint256 amount);
constructor() ERC20("BeatDrop Token", "BEAT") Ownable(msg.sender) {
_grantRole(DEFAULT_ADMIN_ROLE, msg.sender);
}
// Assigns or updates the festival contract address.
//Only callable by the owner (admin).
function updateFestivalContract(address _newFestival) external onlyOwner {
require(_newFestival != address(0), "Invalid address");
_grantRole(FESTIVAL_ROLE, _newFestival);
emit FestivalContractUpdated(_newFestival);
}
// Revokes the festival role from a previous contract.
function revokeFestivalContract(address _oldFestival) external onlyOwner {
_revokeRole(FESTIVAL_ROLE, _oldFestival);
}
// Mint tokens, only allowed by festival contract.
function mint(address to, uint256 amount) external whenNotPaused onlyRole(FESTIVAL_ROLE) {
_mint(to, amount);
emit TokensMinted(to, amount);
}
// Burn tokens from an account, only allowed by festival contract.
function burnFrom(address from, uint256 amount) external whenNotPaused onlyRole(FESTIVAL_ROLE) {
_burn(from, amount);
emit TokensBurned(from, amount);
}
// Pause all minting/burning in emergency.
function pause() external onlyOwner {
_pause();
}
// Unpause contract after emergency.
function unpause() external onlyOwner {
_unpause();
}
}