// SPDX-License-Identifier: MIT pragma solidity 0.8.28; // Learning-only contracts built on OpenZeppelin Contracts (Upgradeable) v5.7.0. Not audited. import {Initializable} from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; import {UUPSUpgradeable} from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; // Forgets to lock its own initializer. contract BoxOpen is Initializable, OwnableUpgradeable, UUPSUpgradeable { function initialize(address owner_) external initializer { __Ownable_init(owner_); } function _authorizeUpgrade(address) internal override onlyOwner {} } // The form recommended by OpenZeppelin: lock the implementation in its constructor. contract BoxLocked is Initializable, OwnableUpgradeable, UUPSUpgradeable { /// @custom:oz-upgrades-unsafe-allow constructor constructor() { _disableInitializers(); } function initialize(address owner_) external initializer { __Ownable_init(owner_); } function _authorizeUpgrade(address) internal override onlyOwner {} }