Where is the upgradeable version of ERC1967 Proxy?

As far as I understand, whenever I want to work with upgradeable contracts I should only use the upgradeable counterpart of every contract I might need to use. I am trying to include an ERC1967 proxy contract in my UpgradeableContract.sol but I can't find it in the docs as the only one there is the abstract ERC1967Upgrade one:

And I see from the README that it is not upgradeable by default? Does that mean that it needs to be built or that I am able to use the non-upgradeable one while having the same functionality? Thanks for the guidance guys!

Proxies are what make upgradeable contracts work. There is no upgradeable version because they already are upgradeable.

For deploying upgradeable proxies you should generally use our Upgrades Plugins for Hardhat and Truffle, which will deploy the proxy contract for you.

Hello @frangio and thank you for your answer. Let's say I want my dapp to let users create proxies they might be able to manage afterwards. Setting aside the Upgrade Proxy part from the plugins which is a multistep process, what do I need to consider when doing the simple contract creation by doing:

ERC1967Proxy proxy = new ERC1967Proxy(
      eventImplementation,
      abi.encodeWithSelector(
        TokenContract(address(0)).initialize.selector,
        _paramOne,
        _paramTwo
      )
    );

Does the previous deploys the new proxy in the same way the plugin does? What do I need to take into account?

If you're using the UUPS pattern then yes that should be enough!

Thank you for your reply @frangio . Im running into the "code size exceeds 24576 bytes" warning on remix even using the optimizer. Here is the snippet causing the warning:

function createTargetContract(uint8 _eventNumber, string calldata _seriesName)
    external
    payable
    onlyRole(DEFAULT_ADMIN_ROLE)
    returns (address)
  {
    TargetContract implementation = new TargetContract();
    targetContractImplementation = address(implementation);
    ERC1967Proxy proxy = new ERC1967Proxy(
      targetContractImplementation,
      abi.encodeWithSelector(
        TargetContract(address(0)).initialize.selector,
        _eventNumber,
        _seriesName
      )
    );
    contractsToOrganizer[implementation] = msg.sender;
    targetContractArray.push(implementation);
    emit LomEventDeployed(address(proxy));
    return address(proxy);
  }

What might be causing this?? I opened a topic regarding this here