1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- // SPDX-License-Identifier: MIT
- pragma solidity ^0.8.0;
- import "../ERC1967/ERC1967Upgrade.sol";
- /**
- * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an
- * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy.
- *
- * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is
- * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing
- * `UUPSUpgradeable` with a custom implementation of upgrades.
- *
- * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism.
- *
- * _Available since v4.1._
- */
- abstract contract UUPSUpgradeable is ERC1967Upgrade {
- /**
- * @dev Upgrade the implementation of the proxy to `newImplementation`.
- *
- * Calls {_authorizeUpgrade}.
- *
- * Emits an {Upgraded} event.
- */
- function upgradeTo(address newImplementation) external virtual {
- _authorizeUpgrade(newImplementation);
- _upgradeToAndCallSecure(newImplementation, bytes(""), false);
- }
- /**
- * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call
- * encoded in `data`.
- *
- * Calls {_authorizeUpgrade}.
- *
- * Emits an {Upgraded} event.
- */
- function upgradeToAndCall(address newImplementation, bytes memory data) external payable virtual {
- _authorizeUpgrade(newImplementation);
- _upgradeToAndCallSecure(newImplementation, data, true);
- }
- /**
- * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by
- * {upgradeTo} and {upgradeToAndCall}.
- *
- * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}.
- *
- * ```solidity
- * function _authorizeUpgrade(address) internal override onlyOwner {}
- * ```
- */
- function _authorizeUpgrade(address newImplementation) internal virtual;
- }
|