Based on the code by @julianmrodri, with beacon proxy it would look something like this:
Note: Untested sample code.
// SPDX-License-Identifier: MIT
pragma solidity 0.8.4;
import "@openzeppelin/contracts/proxy/beacon/UpgradeableBeacon.sol";
import "@openzeppelin/contracts/proxy/beacon/BeaconProxy.sol";
import "./MyTokenUpgradeable.sol";
contract MyTokenFactoryBeacon {
address immutable tokenBeacon;
event TokenDeployed(address tokenAddress);
constructor(address upgrader) {
UpgradeableBeacon _tokenBeacon = new UpgradeableBeacon(address(new MyTokenUpgradeable()));
_tokenBeacon.transferOwnership(upgrader);
tokenBeacon = address(tokenBeacon);
}
function createToken(string calldata name, string calldata symbol, uint256 initialSupply, address owner) external returns (address) {
BeaconProxy proxy = new BeaconProxy(
tokenBeacon,
abi.encodeWithSelector(MyTokenUpgradeable.initialize.selector, name, symbol, initialSupply, owner)
);
emit TokenDeployed(address(proxy));
return address(proxy);
}
}