Deploying Upgradeable Proxies and Proxy Admin from Factory contract

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);
    }
}
1 Like