// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.20; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/access/AccessControl.sol"; import "../OrganizerContract.sol"; contract OrganizerFactoryContract is Ownable,AccessControl { bytes32 public constant ADMIN_ROLE = keccak256("ADMIN_ROLE"); address[] admins; address[] public deployedContract; address payable tixSellPaymentSplitter; address eventFactoryAddress; address contentFactoryAddress; address ticketFactoryAddress; address ticketTypeFactoryAddress; address nftTemplateAddress; address ticketReservationFactoryAddress; address contentTicketContractFactoryAddress; mapping (address => address) public contractForOrganizer; event NewContractDeployed(address); constructor(address initialOwner,address[] memory _admins, address _tixSellPaymentSplitter, address _eventFactoryAddress,address _ticketFactoryAddress, address _ticketTypeFactoryAddress,address _nftTemplateAddress,address _ticketReservationFactoryAddress,address _contentFactoryAddress, address _contentTicketFactory) Ownable(initialOwner) { admins = _admins; tixSellPaymentSplitter = payable(_tixSellPaymentSplitter); for (uint256 i = 0; i < _admins.length; ++i) { _grantRole(ADMIN_ROLE, _admins[i]); } eventFactoryAddress = _eventFactoryAddress; contentFactoryAddress = _contentFactoryAddress; ticketFactoryAddress = _ticketFactoryAddress; ticketTypeFactoryAddress = _ticketTypeFactoryAddress; nftTemplateAddress = _nftTemplateAddress; ticketReservationFactoryAddress = _ticketReservationFactoryAddress; contentTicketContractFactoryAddress = _contentTicketFactory; } modifier onlyAdmin() { require(msg.sender == owner() || hasRole(ADMIN_ROLE, msg.sender), "DOES_NOT_HAVE_ADMIN_ROLE"); _; } //Be able to update _eventContractFactory _ticketContractFactory _ticketTypeFactoryAddress _nftTemplateAddress _ticketReservationFactoryAddress _tixSellPaymentSplitter addressChainLinkConverter function updateFactories( address _tixSellPaymentSplitter, address _eventFactoryAddress,address _ticketFactoryAddress, address _ticketTypeFactoryAddress,address _nftTemplateAddress,address _ticketReservationFactoryAddress,address _contentFactoryAddress, address _contentTicketFactory) external onlyAdmin { tixSellPaymentSplitter = payable(_tixSellPaymentSplitter); eventFactoryAddress = _eventFactoryAddress; contentFactoryAddress = _contentFactoryAddress; ticketFactoryAddress = _ticketFactoryAddress; ticketTypeFactoryAddress = _ticketTypeFactoryAddress; nftTemplateAddress = _nftTemplateAddress; ticketReservationFactoryAddress = _ticketReservationFactoryAddress; contentTicketContractFactoryAddress = _contentTicketFactory; } function deployOrganizerContract(address _organizerAddress) external onlyAdmin returns(address) { // Contract belongs to our factory... OrganizerContract theContract = new OrganizerContract(admins,_organizerAddress,tixSellPaymentSplitter,eventFactoryAddress,ticketFactoryAddress,ticketTypeFactoryAddress,nftTemplateAddress,ticketReservationFactoryAddress,contentFactoryAddress,contentTicketContractFactoryAddress); //Transfer ownership to the Organizer //theContract.transferOwnership(_organizerAddress); deployedContract.push(address(theContract)); contractForOrganizer[_organizerAddress] = address(theContract); // Add the contract to the list of autorized deployed contracts emit NewContractDeployed(address(theContract)); return address(theContract); } }