// SPDX-License-Identifier: MIT pragma solidity ^0.8.20; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/access/AccessControl.sol"; import "./SellTixRewardDistributor.sol"; contract SellTixManager is Ownable,AccessControl { bytes32 public constant ADMIN_ROLE = keccak256("ADMIN_ROLE"); SellTixRewardDistributor public rewardDistributor; uint256 public organizerRewardEvent = 0.1 * 10**18; // 0.1 token for new event uint256 public organizerRewardSale = 0.1 * 10**18; // 0.1 token for sale uint256 public buyerReward = 0.1 * 10**18; // 0.1 token per ticket purchase address[] admins; mapping(address => bool) public authorizedContracts; constructor(address[] memory _admins) Ownable(msg.sender) { admins = _admins; for (uint256 i = 0; i < _admins.length; ++i) { _grantRole(ADMIN_ROLE, _admins[i]); } } modifier onlyAdmin() { require(msg.sender == owner() || hasRole(ADMIN_ROLE, msg.sender), "DOES_NOT_HAVE_ADMIN_ROLE"); _; } function setRewardDistrutor(address _rewardDistributor) external onlyAdmin { rewardDistributor = SellTixRewardDistributor(_rewardDistributor); } function addAuthorizedContract(address contractAddress) external onlyAdmin { authorizedContracts[contractAddress] = true; } function rewardOrganizerForEventCreation(address organizer) external { require(authorizedContracts[msg.sender], "Only authorized contracts"); rewardDistributor.retribute(organizer, organizerRewardEvent); } function rewardOrganizerForTicketSale(address organizer) external { require(authorizedContracts[msg.sender], "Only authorized contracts"); rewardDistributor.retribute(organizer, organizerRewardSale); } function rewardBuyer(address buyer) external { require(authorizedContracts[msg.sender], "Only authorized contracts"); rewardDistributor.retribute(buyer, buyerReward); } function setRewards(uint256 _organizerReward, uint256 _organizerRewardSale, uint256 _buyerReward) external onlyOwner { organizerRewardEvent = _organizerReward; organizerRewardSale = _organizerRewardSale; buyerReward = _buyerReward; } }