// SPDX-License-Identifier: UNLICENSED pragma solidity =0.8.18; import "../TemplateFactory/TemplateDeployer.sol"; import "../SomaAccessControl/utils/Accessible.sol"; import "./ISecurityTokenFactory.sol"; import "../TemplateFactory/ITemplateFactory.sol"; import "@openzeppelin/contracts/proxy/beacon/UpgradeableBeacon.sol"; import "create2-deployer/constants.sol"; contract SecurityTokenFactory is ISecurityTokenFactory, UpgradeableBeacon, TemplateDeployer, Accessible { bytes32 public constant override CREATE_ROLE = keccak256("SecurityToken.CREATE_ROLE"); constructor(uint256 beaconVersion) TemplateDeployer(bytes32("BeaconProxy"), beaconVersion) UpgradeableBeacon(PLACEHOLDER_ADDRESS) {} function create(string memory domain, string memory name, string memory symbol) external override onlyRole(CREATE_ROLE) returns (address instance) { uint256 index = totalDeployments(); bytes memory _data = abi.encodeWithSignature("initialize(string,string,string)", domain, name, symbol); bytes memory args = abi.encode(address(this), _data); instance = _deploy(args, bytes32(index)); emit SecurityTokenCreated(index, name, instance); } function upgradeTo(uint256 newVersion) external override onlyOwner { address newImplementation = _getImplementation(newVersion); upgradeTo(newImplementation); } function _getImplementation(uint256 version) private view returns (address) { return ITemplateFactory(FACTORY).version(bytes32("SecurityToken"), version).implementation; } }