Commit c1c65632 by Francisco Giordano

Transpile c4833d56

parent 45880fc2
......@@ -54,6 +54,6 @@ allFiredEvents
.coverage_cache
.coverage_contracts
# buidler
# hardhat
cache
artifacts
......@@ -22,16 +22,26 @@
* Now targeting the 0.8.x line of Solidity compilers. For 0.6.x (resp 0.7.x) support, use version 3.4.0 (resp 3.4.0-solc-0.7) of OpenZeppelin.
* `Context`: making `_msgData` return `bytes calldata` instead of `bytes memory` ([#2492](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2492))
* `ERC20`: Removed the `_setDecimals` function and the storage slot associated to decimals. ([#2502](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2502))
* `ERC20`: removed the `_setDecimals` function and the storage slot associated to decimals. ([#2502](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2502))
* `Strings`: addition of a `toHexString` function. ([#2504](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2504))
* `EnumerableMap`: change implementation to optimize for `key → value` lookups instead of enumeration. ([#2518](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2518))
* `GSN`: Deprecate GSNv1 support in favor of upcomming support for GSNv2. ([#2521](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2521))
* `ERC165`: Remove uses of storage in the base ERC165 implementation. ERC165 based contracts now use storage-less virtual functions. Old behaviour remains available in the `ERC165Storage` extension. ([#2505](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2505))
* `Initializable`: Make initializer check stricter during construction. ([#2531](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2531))
* `GSN`: deprecate GSNv1 support in favor of upcoming support for GSNv2. ([#2521](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2521))
* `ERC165`: remove uses of storage in the base ERC165 implementation. ERC165 based contracts now use storage-less virtual functions. Old behavior remains available in the `ERC165Storage` extension. ([#2505](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2505))
* `Initializable`: make initializer check stricter during construction. ([#2531](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2531))
* `ERC721`: remove enumerability of tokens from the base implementation. This feature is now provided separately through the `ERC721Enumerable` extension. ([#2511](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2511))
* `AccessControl`: removed enumerability by default for a more lightweight contract. It is now opt-in through `AccessControlEnumerable`. ([#2512](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2512))
* Meta Transactions: add `ERC2771Context` and a `MinimalForwarder` for meta-transactions. ([#2508](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2508))
* Overall reorganisation of the contract folder to improve clarity and discoverability. ([#2503](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2503))
* Overall reorganization of the contract folder to improve clarity and discoverability. ([#2503](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2503))
* `ERC20Capped`: optimize gas usage by enforcing the check directly in `_mint`. ([#2524](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2524))
* Rename `UpgradeableProxy` to `ERC1967Proxy`. ([#2547](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2547))
* `ERC777`: optimize the gas costs of the constructor. ([#2551](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2551))
* `ERC721URIStorage`: add a new extension that implements the `_setTokenURI` behavior as it was available in 3.4.0. ([#2555](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2555))
* `AccessControl`: added ERC165 interface detection. ([#2562](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2562))
* `ERC1155`: make `uri` public so overloading function can call it using super. ([#2576](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2576))
### Bug fixes for beta releases
* `AccessControlEnumerable`: Fixed `renounceRole` not updating enumerable set of addresses for a role. ([#2572](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2572))
### How to upgrade from 3.x
......@@ -43,6 +53,10 @@ npx openzeppelin-contracts-migrate-imports
Make sure you're using git or another version control system to be able to recover from any potential error in our script.
### How to upgrade from 4.0-beta.x
Some further changes have been done between the different beta iterations. Transitions made during this period are configured in the `migrate-imports` script. Consequently, you can upgrade from any previous 4.0-beta.x version using the same script as described in the *How to upgrade from 3.x* section.
## 3.4.0 (2021-02-02)
* `BeaconProxy`: added new kind of proxy that allows simultaneous atomic upgrades. ([#2411](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2411))
......
......@@ -4,14 +4,23 @@ pragma solidity ^0.8.0;
import "./AccessControlUpgradeable.sol";
import "../utils/structs/EnumerableSetUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
/**
* @dev External interface of AccessControlEnumerable declared to support ERC165 detection.
*/
interface IAccessControlEnumerableUpgradeable {
function getRoleMember(bytes32 role, uint256 index) external view returns (address);
function getRoleMemberCount(bytes32 role) external view returns (uint256);
}
/**
* @dev Extension of {AccessControl} that allows enumerating the members of each role.
*/
abstract contract AccessControlEnumerableUpgradeable is Initializable, AccessControlUpgradeable {
abstract contract AccessControlEnumerableUpgradeable is Initializable, IAccessControlEnumerableUpgradeable, AccessControlUpgradeable {
function __AccessControlEnumerable_init() internal initializer {
__Context_init_unchained();
__ERC165_init_unchained();
__AccessControl_init_unchained();
__AccessControlEnumerable_init_unchained();
}
......@@ -23,6 +32,14 @@ abstract contract AccessControlEnumerableUpgradeable is Initializable, AccessCon
mapping (bytes32 => EnumerableSetUpgradeable.AddressSet) private _roleMembers;
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IAccessControlEnumerableUpgradeable).interfaceId
|| super.supportsInterface(interfaceId);
}
/**
* @dev Returns one of the accounts that have `role`. `index` must be a
* value between 0 and {getRoleMemberCount}, non-inclusive.
*
......@@ -34,7 +51,7 @@ abstract contract AccessControlEnumerableUpgradeable is Initializable, AccessCon
* https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]
* for more information.
*/
function getRoleMember(bytes32 role, uint256 index) public view returns (address) {
function getRoleMember(bytes32 role, uint256 index) public view override returns (address) {
return _roleMembers[role].at(index);
}
......@@ -42,7 +59,7 @@ abstract contract AccessControlEnumerableUpgradeable is Initializable, AccessCon
* @dev Returns the number of accounts that have `role`. Can be used
* together with {getRoleMember} to enumerate all bearers of a role.
*/
function getRoleMemberCount(bytes32 role) public view returns (uint256) {
function getRoleMemberCount(bytes32 role) public view override returns (uint256) {
return _roleMembers[role].length();
}
......@@ -63,6 +80,14 @@ abstract contract AccessControlEnumerableUpgradeable is Initializable, AccessCon
}
/**
* @dev Overload {renounceRole} to track enumerable memberships
*/
function renounceRole(bytes32 role, address account) public virtual override {
super.renounceRole(role, account);
_roleMembers[role].remove(account);
}
/**
* @dev Overload {_setupRole} to track enumerable memberships
*/
function _setupRole(bytes32 role, address account) internal virtual override {
......
......@@ -3,7 +3,19 @@
pragma solidity ^0.8.0;
import "../utils/ContextUpgradeable.sol";
import "../utils/Initializable.sol";
import "../utils/introspection/ERC165Upgradeable.sol";
import "../proxy/utils/Initializable.sol";
/**
* @dev External interface of AccessControl declared to support ERC165 detection.
*/
interface IAccessControlUpgradeable {
function hasRole(bytes32 role, address account) external view returns (bool);
function getRoleAdmin(bytes32 role) external view returns (bytes32);
function grantRole(bytes32 role, address account) external;
function revokeRole(bytes32 role, address account) external;
function renounceRole(bytes32 role, address account) external;
}
/**
* @dev Contract module that allows children to implement role-based access
......@@ -43,9 +55,10 @@ import "../utils/Initializable.sol";
* grant and revoke this role. Extra precautions should be taken to secure
* accounts that have been granted it.
*/
abstract contract AccessControlUpgradeable is Initializable, ContextUpgradeable {
abstract contract AccessControlUpgradeable is Initializable, ContextUpgradeable, IAccessControlUpgradeable, ERC165Upgradeable {
function __AccessControl_init() internal initializer {
__Context_init_unchained();
__ERC165_init_unchained();
__AccessControl_init_unchained();
}
......@@ -88,9 +101,17 @@ abstract contract AccessControlUpgradeable is Initializable, ContextUpgradeable
event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IAccessControlUpgradeable).interfaceId
|| super.supportsInterface(interfaceId);
}
/**
* @dev Returns `true` if `account` has been granted `role`.
*/
function hasRole(bytes32 role, address account) public view returns (bool) {
function hasRole(bytes32 role, address account) public view override returns (bool) {
return _roles[role].members[account];
}
......@@ -100,7 +121,7 @@ abstract contract AccessControlUpgradeable is Initializable, ContextUpgradeable
*
* To change a role's admin, use {_setRoleAdmin}.
*/
function getRoleAdmin(bytes32 role) public view returns (bytes32) {
function getRoleAdmin(bytes32 role) public view override returns (bytes32) {
return _roles[role].adminRole;
}
......@@ -114,7 +135,7 @@ abstract contract AccessControlUpgradeable is Initializable, ContextUpgradeable
*
* - the caller must have ``role``'s admin role.
*/
function grantRole(bytes32 role, address account) public virtual {
function grantRole(bytes32 role, address account) public virtual override {
require(hasRole(getRoleAdmin(role), _msgSender()), "AccessControl: sender must be an admin to grant");
_grantRole(role, account);
......@@ -129,7 +150,7 @@ abstract contract AccessControlUpgradeable is Initializable, ContextUpgradeable
*
* - the caller must have ``role``'s admin role.
*/
function revokeRole(bytes32 role, address account) public virtual {
function revokeRole(bytes32 role, address account) public virtual override {
require(hasRole(getRoleAdmin(role), _msgSender()), "AccessControl: sender must be an admin to revoke");
_revokeRole(role, account);
......@@ -149,7 +170,7 @@ abstract contract AccessControlUpgradeable is Initializable, ContextUpgradeable
*
* - the caller must be `account`.
*/
function renounceRole(bytes32 role, address account) public virtual {
function renounceRole(bytes32 role, address account) public virtual override {
require(account == _msgSender(), "AccessControl: can only renounce roles for self");
_revokeRole(role, account);
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../utils/ContextUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
......
......@@ -2,10 +2,10 @@
pragma solidity ^0.8.0;
import "./AddressUpgradeable.sol";
import "./ContextUpgradeable.sol";
import "./math/SafeMathUpgradeable.sol";
import "./Initializable.sol";
import "../utils/AddressUpgradeable.sol";
import "../utils/ContextUpgradeable.sol";
import "../utils/math/SafeMathUpgradeable.sol";
import "../proxy/utils/Initializable.sol";
/**
* @title PaymentSplitter
......
= Finance
[.readme-notice]
NOTE: This document is better viewed at https://docs.openzeppelin.com/contracts/api/finance
This directory includes primitives for financial systems. We currently only offer the {PaymentSplitter} contract, but we want to grow this directory so we welcome ideas.
== PaymentSplitter
{{PaymentSplitter}}
= Governance
[.readme-notice]
NOTE: This document is better viewed at https://docs.openzeppelin.com/contracts/api/access
NOTE: This document is better viewed at https://docs.openzeppelin.com/contracts/api/governance
This directory includes primitives for on-chain governance. We currently only offer the {TimelockController} contract, that can be used as a component in a governance systems to introduce a delay between a proposal and its execution.
......@@ -26,7 +26,7 @@ This directory includes primitives for on-chain governance. We currently only of
[[timelock-operation]]
==== Operation structure
Operation executed by the xref:api:access.adoc#TimelockController[`TimelockControler`] can contain one or multiple subsequent calls. Depending on whether you need to multiple calls to be executed atomically, you can either use simple or batched operations.
Operation executed by the xref:api:governance.adoc#TimelockController[`TimelockControler`] can contain one or multiple subsequent calls. Depending on whether you need to multiple calls to be executed atomically, you can either use simple or batched operations.
Both operations contain:
......@@ -50,16 +50,16 @@ Timelocked operations are identified by a unique id (their hash) and follow a sp
`Unset` -> `Pending` -> `Pending` + `Ready` -> `Done`
* By calling xref:api:access.adoc#TimelockController-schedule-address-uint256-bytes-bytes32-bytes32-uint256-[`schedule`] (or xref:api:access.adoc#TimelockController-scheduleBatch-address---uint256---bytes---bytes32-bytes32-uint256-[`scheduleBatch`]), a proposer moves the operation from the `Unset` to the `Pending` state. This starts a timer that must be longer than the minimum delay. The timer expires at a timestamp accessible through the xref:api:access.adoc#TimelockController-getTimestamp-bytes32-[`getTimestamp`] method.
* By calling xref:api:governance.adoc#TimelockController-schedule-address-uint256-bytes-bytes32-bytes32-uint256-[`schedule`] (or xref:api:governance.adoc#TimelockController-scheduleBatch-address---uint256---bytes---bytes32-bytes32-uint256-[`scheduleBatch`]), a proposer moves the operation from the `Unset` to the `Pending` state. This starts a timer that must be longer than the minimum delay. The timer expires at a timestamp accessible through the xref:api:governance.adoc#TimelockController-getTimestamp-bytes32-[`getTimestamp`] method.
* Once the timer expires, the operation automatically gets the `Ready` state. At this point, it can be executed.
* By calling xref:api:access.adoc#TimelockController-TimelockController-execute-address-uint256-bytes-bytes32-bytes32-[`execute`] (or xref:api:access.adoc#TimelockController-executeBatch-address---uint256---bytes---bytes32-bytes32-[`executeBatch`]), an executor triggers the operation's underlying transactions and moves it to the `Done` state. If the operation has a predecessor, it has to be in the `Done` state for this transition to succeed.
* xref:api:access.adoc#TimelockController-TimelockController-cancel-bytes32-[`cancel`] allows proposers to cancel any `Pending` operation. This resets the operation to the `Unset` state. It is thus possible for a proposer to re-schedule an operation that has been cancelled. In this case, the timer restarts when the operation is re-scheduled.
* By calling xref:api:governance.adoc#TimelockController-TimelockController-execute-address-uint256-bytes-bytes32-bytes32-[`execute`] (or xref:api:governance.adoc#TimelockController-executeBatch-address---uint256---bytes---bytes32-bytes32-[`executeBatch`]), an executor triggers the operation's underlying transactions and moves it to the `Done` state. If the operation has a predecessor, it has to be in the `Done` state for this transition to succeed.
* xref:api:governance.adoc#TimelockController-TimelockController-cancel-bytes32-[`cancel`] allows proposers to cancel any `Pending` operation. This resets the operation to the `Unset` state. It is thus possible for a proposer to re-schedule an operation that has been cancelled. In this case, the timer restarts when the operation is re-scheduled.
Operations status can be queried using the functions:
* xref:api:access.adoc#TimelockController-isOperationPending-bytes32-[`isOperationPending(bytes32)`]
* xref:api:access.adoc#TimelockController-isOperationReady-bytes32-[`isOperationReady(bytes32)`]
* xref:api:access.adoc#TimelockController-isOperationDone-bytes32-[`isOperationDone(bytes32)`]
* xref:api:governance.adoc#TimelockController-isOperationPending-bytes32-[`isOperationPending(bytes32)`]
* xref:api:governance.adoc#TimelockController-isOperationReady-bytes32-[`isOperationReady(bytes32)`]
* xref:api:governance.adoc#TimelockController-isOperationDone-bytes32-[`isOperationDone(bytes32)`]
[[timelock-roles]]
==== Roles
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../access/AccessControlUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
/**
* @dev Contract module which acts as a timelocked controller. When set as the
......@@ -54,6 +54,7 @@ contract TimelockControllerUpgradeable is Initializable, AccessControlUpgradeabl
*/
function __TimelockController_init(uint256 minDelay, address[] memory proposers, address[] memory executors) internal initializer {
__Context_init_unchained();
__ERC165_init_unchained();
__AccessControl_init_unchained();
__TimelockController_init_unchained(minDelay, proposers, executors);
}
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../utils/ContextUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
/*
* @dev Context variant with ERC2771 support.
......
......@@ -4,7 +4,7 @@ pragma solidity ^0.8.0;
import "../utils/cryptography/ECDSAUpgradeable.sol";
import "../utils/cryptography/draft-EIP712Upgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
/*
* @dev Simple minimal forwarder to be used together with an ERC2771 compatible contract. See {ERC2771Context}.
......
......@@ -3,11 +3,12 @@
pragma solidity ^0.8.0;
import "../access/AccessControlEnumerableUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract AccessControlEnumerableMockUpgradeable is Initializable, AccessControlEnumerableUpgradeable {
function __AccessControlEnumerableMock_init() internal initializer {
__Context_init_unchained();
__ERC165_init_unchained();
__AccessControl_init_unchained();
__AccessControlEnumerable_init_unchained();
__AccessControlEnumerableMock_init_unchained();
......
......@@ -3,11 +3,12 @@
pragma solidity ^0.8.0;
import "../access/AccessControlUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract AccessControlMockUpgradeable is Initializable, AccessControlUpgradeable {
function __AccessControlMock_init() internal initializer {
__Context_init_unchained();
__ERC165_init_unchained();
__AccessControl_init_unchained();
__AccessControlMock_init_unchained();
}
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../utils/AddressUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract AddressImplUpgradeable is Initializable {
function __AddressImpl_init() internal initializer {
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../utils/ArraysUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract ArraysImplUpgradeable is Initializable {
using ArraysUpgradeable for uint256[];
......
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract BadBeaconNoImplUpgradeable is Initializable {
function __BadBeaconNoImpl_init() internal initializer {
......
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract CallReceiverMockUpgradeable is Initializable {
function __CallReceiverMock_init() internal initializer {
......
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
/**
......
......@@ -4,7 +4,7 @@ pragma solidity ^0.8.0;
import "../proxy/ClonesUpgradeable.sol";
import "../utils/AddressUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract ClonesMockUpgradeable is Initializable {
function __ClonesMock_init() internal initializer {
......@@ -18,16 +18,16 @@ contract ClonesMockUpgradeable is Initializable {
event NewInstance(address instance);
function clone(address master, bytes calldata initdata) public payable {
_initAndEmit(master.clone(), initdata);
function clone(address implementation, bytes calldata initdata) public payable {
_initAndEmit(implementation.clone(), initdata);
}
function cloneDeterministic(address master, bytes32 salt, bytes calldata initdata) public payable {
_initAndEmit(master.cloneDeterministic(salt), initdata);
function cloneDeterministic(address implementation, bytes32 salt, bytes calldata initdata) public payable {
_initAndEmit(implementation.cloneDeterministic(salt), initdata);
}
function predictDeterministicAddress(address master, bytes32 salt) public view returns (address predicted) {
return master.predictDeterministicAddress(salt);
function predictDeterministicAddress(address implementation, bytes32 salt) public view returns (address predicted) {
return implementation.predictDeterministicAddress(salt);
}
function _initAndEmit(address instance, bytes memory initdata) private {
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../utils/escrow/ConditionalEscrowUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
// mock class using ConditionalEscrow
contract ConditionalEscrowMockUpgradeable is Initializable, ConditionalEscrowUpgradeable {
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../utils/ContextUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract ContextMockUpgradeable is Initializable, ContextUpgradeable {
function __ContextMock_init() internal initializer {
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../utils/CountersUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract CountersImplUpgradeable is Initializable {
function __CountersImpl_init() internal initializer {
......
......@@ -4,7 +4,7 @@ pragma solidity ^0.8.0;
import "../utils/Create2Upgradeable.sol";
import "../utils/introspection/ERC1820ImplementerUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract Create2ImplUpgradeable is Initializable {
function __Create2Impl_init() internal initializer {
......
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
abstract contract ImplUpgradeable is Initializable {
function __Impl_init() internal initializer {
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../utils/cryptography/ECDSAUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract ECDSAMockUpgradeable is Initializable {
function __ECDSAMock_init() internal initializer {
......
......@@ -4,7 +4,7 @@ pragma solidity ^0.8.0;
import "../utils/cryptography/draft-EIP712Upgradeable.sol";
import "../utils/cryptography/ECDSAUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract EIP712ExternalUpgradeable is Initializable, EIP712Upgradeable {
function __EIP712External_init(string memory name, string memory version) internal initializer {
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../token/ERC1155/extensions/ERC1155BurnableUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract ERC1155BurnableMockUpgradeable is Initializable, ERC1155BurnableUpgradeable {
function __ERC1155BurnableMock_init(string memory uri) internal initializer {
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../token/ERC1155/ERC1155Upgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
/**
* @title ERC1155Mock
......
......@@ -4,7 +4,7 @@ pragma solidity ^0.8.0;
import "./ERC1155MockUpgradeable.sol";
import "../token/ERC1155/extensions/ERC1155PausableUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract ERC1155PausableMockUpgradeable is Initializable, ERC1155MockUpgradeable, ERC1155PausableUpgradeable {
function __ERC1155PausableMock_init(string memory uri) internal initializer {
......
......@@ -4,7 +4,7 @@ pragma solidity ^0.8.0;
import "../token/ERC1155/IERC1155ReceiverUpgradeable.sol";
import "../utils/introspection/ERC165Upgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract ERC1155ReceiverMockUpgradeable is Initializable, IERC1155ReceiverUpgradeable, ERC165Upgradeable {
bytes4 private _recRetval;
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../../utils/introspection/IERC165Upgradeable.sol";
import "../../utils/Initializable.sol";
import "../../proxy/utils/Initializable.sol";
/**
* https://eips.ethereum.org/EIPS/eip-214#specification
......
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "../../utils/Initializable.sol";
import "../../proxy/utils/Initializable.sol";
contract ERC165MissingDataUpgradeable is Initializable {
function __ERC165MissingData_init() internal initializer {
......
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "../../utils/Initializable.sol";
import "../../proxy/utils/Initializable.sol";
contract ERC165NotSupportedUpgradeable is Initializable { function __ERC165NotSupported_init() internal initializer {
__ERC165NotSupported_init_unchained();
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../utils/introspection/ERC165CheckerUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract ERC165CheckerMockUpgradeable is Initializable {
function __ERC165CheckerMock_init() internal initializer {
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../utils/introspection/ERC165Upgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract ERC165MockUpgradeable is Initializable, ERC165Upgradeable {
function __ERC165Mock_init() internal initializer {
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../utils/introspection/ERC165StorageUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract ERC165StorageMockUpgradeable is Initializable, ERC165StorageUpgradeable {
function __ERC165StorageMock_init() internal initializer {
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../utils/introspection/ERC1820ImplementerUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract ERC1820ImplementerMockUpgradeable is Initializable, ERC1820ImplementerUpgradeable {
function __ERC1820ImplementerMock_init() internal initializer {
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../token/ERC20/extensions/ERC20BurnableUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract ERC20BurnableMockUpgradeable is Initializable, ERC20BurnableUpgradeable {
function __ERC20BurnableMock_init(
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../token/ERC20/extensions/ERC20CappedUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract ERC20CappedMockUpgradeable is Initializable, ERC20CappedUpgradeable {
function __ERC20CappedMock_init(string memory name, string memory symbol, uint256 cap) internal initializer {
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../token/ERC20/ERC20Upgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract ERC20DecimalsMockUpgradeable is Initializable, ERC20Upgradeable {
uint8 private _decimals;
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../token/ERC20/ERC20Upgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
// mock class using ERC20
contract ERC20MockUpgradeable is Initializable, ERC20Upgradeable {
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../token/ERC20/extensions/ERC20PausableUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
// mock class using ERC20Pausable
contract ERC20PausableMockUpgradeable is Initializable, ERC20PausableUpgradeable {
......
......@@ -4,7 +4,7 @@ pragma solidity ^0.8.0;
import "../token/ERC20/extensions/draft-ERC20PermitUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract ERC20PermitMockUpgradeable is Initializable, ERC20PermitUpgradeable {
function __ERC20PermitMock_init(
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../token/ERC20/extensions/ERC20SnapshotUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract ERC20SnapshotMockUpgradeable is Initializable, ERC20SnapshotUpgradeable {
......
......@@ -4,7 +4,7 @@ pragma solidity ^0.8.0;
import "./ContextMockUpgradeable.sol";
import "../metatx/ERC2771ContextUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
// By inheriting from ERC2771Context, Context's internal functions are overridden automatically
contract ERC2771ContextMockUpgradeable is Initializable, ContextMockUpgradeable, ERC2771ContextUpgradeable {
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../token/ERC721/extensions/ERC721BurnableUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract ERC721BurnableMockUpgradeable is Initializable, ERC721BurnableUpgradeable {
function __ERC721BurnableMock_init(string memory name, string memory symbol) internal initializer {
......@@ -16,8 +16,20 @@ contract ERC721BurnableMockUpgradeable is Initializable, ERC721BurnableUpgradeab
function __ERC721BurnableMock_init_unchained(string memory name, string memory symbol) internal initializer { }
function exists(uint256 tokenId) public view returns (bool) {
return _exists(tokenId);
}
function mint(address to, uint256 tokenId) public {
_mint(to, tokenId);
}
function safeMint(address to, uint256 tokenId) public {
_safeMint(to, tokenId);
}
function safeMint(address to, uint256 tokenId, bytes memory _data) public {
_safeMint(to, tokenId, _data);
}
uint256[50] private __gap;
}
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../token/ERC721/extensions/ERC721EnumerableUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
/**
* @title ERC721Mock
......@@ -34,6 +34,10 @@ contract ERC721EnumerableMockUpgradeable is Initializable, ERC721EnumerableUpgra
return _baseURI();
}
function exists(uint256 tokenId) public view returns (bool) {
return _exists(tokenId);
}
function mint(address to, uint256 tokenId) public {
_mint(to, tokenId);
}
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../token/ERC721/ERC721Upgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
/**
* @title ERC721Mock
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../token/ERC721/extensions/ERC721PausableUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
/**
* @title ERC721PausableMock
......@@ -21,24 +21,32 @@ contract ERC721PausableMockUpgradeable is Initializable, ERC721PausableUpgradeab
function __ERC721PausableMock_init_unchained(string memory name, string memory symbol) internal initializer { }
function mint(address to, uint256 tokenId) public {
super._mint(to, tokenId);
function pause() external {
_pause();
}
function burn(uint256 tokenId) public {
super._burn(tokenId);
function unpause() external {
_unpause();
}
function exists(uint256 tokenId) public view returns (bool) {
return super._exists(tokenId);
return _exists(tokenId);
}
function pause() external {
_pause();
function mint(address to, uint256 tokenId) public {
_mint(to, tokenId);
}
function unpause() external {
_unpause();
function safeMint(address to, uint256 tokenId) public {
_safeMint(to, tokenId);
}
function safeMint(address to, uint256 tokenId, bytes memory _data) public {
_safeMint(to, tokenId, _data);
}
function burn(uint256 tokenId) public {
_burn(tokenId);
}
uint256[50] private __gap;
}
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../token/ERC721/IERC721ReceiverUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract ERC721ReceiverMockUpgradeable is Initializable, IERC721ReceiverUpgradeable {
enum Error {
......
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "../token/ERC721/extensions/ERC721URIStorageUpgradeable.sol";
import "../proxy/utils/Initializable.sol";
/**
* @title ERC721Mock
* This mock just provides a public safeMint, mint, and burn functions for testing purposes
*/
contract ERC721URIStorageMockUpgradeable is Initializable, ERC721URIStorageUpgradeable {
string private _baseTokenURI;
function __ERC721URIStorageMock_init(string memory name, string memory symbol) internal initializer {
__Context_init_unchained();
__ERC165_init_unchained();
__ERC721_init_unchained(name, symbol);
__ERC721URIStorage_init_unchained();
__ERC721URIStorageMock_init_unchained(name, symbol);
}
function __ERC721URIStorageMock_init_unchained(string memory name, string memory symbol) internal initializer { }
function _baseURI() internal view virtual override returns (string memory) {
return _baseTokenURI;
}
function setBaseURI(string calldata newBaseTokenURI) public {
_baseTokenURI = newBaseTokenURI;
}
function baseURI() public view returns (string memory) {
return _baseURI();
}
function setTokenURI(uint256 tokenId, string memory _tokenURI) public {
_setTokenURI(tokenId, _tokenURI);
}
function exists(uint256 tokenId) public view returns (bool) {
return _exists(tokenId);
}
function mint(address to, uint256 tokenId) public {
_mint(to, tokenId);
}
function safeMint(address to, uint256 tokenId) public {
_safeMint(to, tokenId);
}
function safeMint(address to, uint256 tokenId, bytes memory _data) public {
_safeMint(to, tokenId, _data);
}
function burn(uint256 tokenId) public {
_burn(tokenId);
}
uint256[49] private __gap;
}
......@@ -4,7 +4,7 @@ pragma solidity ^0.8.0;
import "../utils/ContextUpgradeable.sol";
import "../token/ERC777/ERC777Upgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract ERC777MockUpgradeable is Initializable, ContextUpgradeable, ERC777Upgradeable {
event BeforeTokenTransfer();
......
......@@ -8,7 +8,7 @@ import "../token/ERC777/IERC777RecipientUpgradeable.sol";
import "../utils/ContextUpgradeable.sol";
import "../utils/introspection/IERC1820RegistryUpgradeable.sol";
import "../utils/introspection/ERC1820ImplementerUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract ERC777SenderRecipientMockUpgradeable is Initializable, ContextUpgradeable, IERC777SenderUpgradeable, IERC777RecipientUpgradeable, ERC1820ImplementerUpgradeable {
function __ERC777SenderRecipientMock_init() internal initializer {
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../utils/structs/EnumerableMapUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract EnumerableMapMockUpgradeable is Initializable {
function __EnumerableMapMock_init() internal initializer {
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../utils/structs/EnumerableSetUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
// Bytes32Set
contract EnumerableBytes32SetMockUpgradeable is Initializable {
......
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract EtherReceiverMockUpgradeable is Initializable {
function __EtherReceiverMock_init() internal initializer {
......
......@@ -2,7 +2,7 @@
pragma solidity ^0.8.0;
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
/**
* @title InitializableMock
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../utils/math/MathUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract MathMockUpgradeable is Initializable {
function __MathMock_init() internal initializer {
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../utils/cryptography/MerkleProofUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract MerkleProofWrapperUpgradeable is Initializable {
function __MerkleProofWrapper_init() internal initializer {
......
......@@ -2,7 +2,7 @@
pragma solidity ^0.8.0;
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
// Sample contracts showing upgradeability with multiple inheritance.
// Child contract inherits from Father and Mother contracts, and Father extends from Gramps.
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../access/OwnableUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract OwnableMockUpgradeable is Initializable, OwnableUpgradeable { function __OwnableMock_init() internal initializer {
__Context_init_unchained();
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../security/PausableUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract PausableMockUpgradeable is Initializable, PausableUpgradeable {
bool public drasticMeasureTaken;
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../security/PullPaymentUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
// mock class using PullPayment
contract PullPaymentMockUpgradeable is Initializable, PullPaymentUpgradeable {
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../utils/ContextUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract ReentrancyAttackUpgradeable is Initializable, ContextUpgradeable {
function __ReentrancyAttack_init() internal initializer {
__Context_init_unchained();
......
......@@ -4,7 +4,7 @@ pragma solidity ^0.8.0;
import "../security/ReentrancyGuardUpgradeable.sol";
import "./ReentrancyAttackUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract ReentrancyMockUpgradeable is Initializable, ReentrancyGuardUpgradeable {
uint256 public counter;
......
......@@ -2,7 +2,7 @@
pragma solidity ^0.8.0;
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract Implementation1 is Initializable {
uint internal _value;
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../utils/math/SafeCastUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract SafeCastMockUpgradeable is Initializable {
function __SafeCastMock_init() internal initializer {
......
......@@ -5,7 +5,7 @@ pragma solidity ^0.8.0;
import "../utils/ContextUpgradeable.sol";
import "../token/ERC20/IERC20Upgradeable.sol";
import "../token/ERC20/utils/SafeERC20Upgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract ERC20ReturnFalseMockUpgradeable is Initializable, ContextUpgradeable {
function __ERC20ReturnFalseMock_init() internal initializer {
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../utils/math/SafeMathUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract SafeMathMockUpgradeable is Initializable {
function __SafeMathMock_init() internal initializer {
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../utils/math/SignedSafeMathUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract SignedSafeMathMockUpgradeable is Initializable {
function __SignedSafeMathMock_init() internal initializer {
......
......@@ -2,7 +2,7 @@
pragma solidity ^0.8.0;
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
/**
* @title MigratableMockV1
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../utils/StringsUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract StringsMockUpgradeable is Initializable {
function __StringsMock_init() internal initializer {
......
{
"name": "@openzeppelin/contracts-upgradeable",
"description": "Secure Smart Contract library for Solidity",
"version": "4.0.0-beta.0",
"version": "4.0.0-rc.0",
"files": [
"**/*.sol",
"/build/contracts/*.json",
......
......@@ -17,16 +17,16 @@ pragma solidity ^0.8.0;
*/
library ClonesUpgradeable {
/**
* @dev Deploys and returns the address of a clone that mimics the behaviour of `master`.
* @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`.
*
* This function uses the create opcode, which should never revert.
*/
function clone(address master) internal returns (address instance) {
function clone(address implementation) internal returns (address instance) {
// solhint-disable-next-line no-inline-assembly
assembly {
let ptr := mload(0x40)
mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)
mstore(add(ptr, 0x14), shl(0x60, master))
mstore(add(ptr, 0x14), shl(0x60, implementation))
mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)
instance := create(0, ptr, 0x37)
}
......@@ -34,18 +34,18 @@ library ClonesUpgradeable {
}
/**
* @dev Deploys and returns the address of a clone that mimics the behaviour of `master`.
* @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`.
*
* This function uses the create2 opcode and a `salt` to deterministically deploy
* the clone. Using the same `master` and `salt` multiple time will revert, since
* the clone. Using the same `implementation` and `salt` multiple time will revert, since
* the clones cannot be deployed twice at the same address.
*/
function cloneDeterministic(address master, bytes32 salt) internal returns (address instance) {
function cloneDeterministic(address implementation, bytes32 salt) internal returns (address instance) {
// solhint-disable-next-line no-inline-assembly
assembly {
let ptr := mload(0x40)
mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)
mstore(add(ptr, 0x14), shl(0x60, master))
mstore(add(ptr, 0x14), shl(0x60, implementation))
mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)
instance := create2(0, ptr, 0x37, salt)
}
......@@ -55,12 +55,12 @@ library ClonesUpgradeable {
/**
* @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}.
*/
function predictDeterministicAddress(address master, bytes32 salt, address deployer) internal pure returns (address predicted) {
function predictDeterministicAddress(address implementation, bytes32 salt, address deployer) internal pure returns (address predicted) {
// solhint-disable-next-line no-inline-assembly
assembly {
let ptr := mload(0x40)
mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)
mstore(add(ptr, 0x14), shl(0x60, master))
mstore(add(ptr, 0x14), shl(0x60, implementation))
mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf3ff00000000000000000000000000000000)
mstore(add(ptr, 0x38), shl(0x60, deployer))
mstore(add(ptr, 0x4c), salt)
......@@ -72,7 +72,7 @@ library ClonesUpgradeable {
/**
* @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}.
*/
function predictDeterministicAddress(address master, bytes32 salt) internal view returns (address predicted) {
return predictDeterministicAddress(master, salt, address(this));
function predictDeterministicAddress(address implementation, bytes32 salt) internal view returns (address predicted) {
return predictDeterministicAddress(implementation, salt, address(this));
}
}
......@@ -7,19 +7,21 @@ This is a low-level set of contracts implementing different proxy patterns with
The abstract {Proxy} contract implements the core delegation functionality. If the concrete proxies that we provide below are not suitable, we encourage building on top of this base contract since it contains an assembly block that may be hard to get right.
Upgradeability is implemented in the {UpgradeableProxy} contract, although it provides only an internal upgrade interface. For an upgrade interface exposed externally to an admin, we provide {TransparentUpgradeableProxy}. Both of these contracts use the storage slots specified in https://eips.ethereum.org/EIPS/eip-1967[EIP1967] to avoid clashes with the storage of the implementation contract behind the proxy.
{ERC1967Proxy} provides a simple, fully functioning, proxy. While this proxy is not by itself upgradeable, it includes an internal upgrade interface. For an upgrade interface exposed externally to an admin, we provide {TransparentUpgradeableProxy}. Both of these contracts use the storage slots specified in https://eips.ethereum.org/EIPS/eip-1967[EIP1967] to avoid clashes with the storage of the implementation contract behind the proxy.
An alternative upgradeability mechanism is provided in <<Beacon>>. This pattern, popularized by Dharma, allows multiple proxies to be upgraded to a different implementation in a single transaction. In this pattern, the proxy contract doesn't hold the implementation address in storage like {UpgradeableProxy}, but the address of a {UpgradeableBeacon} contract, which is where the implementation address is actually stored and retrieved from. The `upgrade` operations that change the implementation contract address are then sent to the beacon instead of to the proxy contract, and all proxies that follow that beacon are automatically upgraded.
The {Clones} library provides a way to deploy minimal non-upgradeable proxies for cheap. This can be useful for applications that require deploying many instances of the same contract (for example one per user, or one per task). These instances are designed to be both cheap to deploy, and cheap to call. The drawback being that they are not upgradeable.
CAUTION: Using upgradeable proxies correctly and securely is a difficult task that requires deep knowledge of the proxy pattern, Solidity, and the EVM. Unless you want a lot of low level control, we recommend using the xref:upgrades-plugins::index.adoc[OpenZeppelin Upgrades Plugins] for Truffle and Buidler.
CAUTION: Using upgradeable proxies correctly and securely is a difficult task that requires deep knowledge of the proxy pattern, Solidity, and the EVM. Unless you want a lot of low level control, we recommend using the xref:upgrades-plugins::index.adoc[OpenZeppelin Upgrades Plugins] for Truffle and Hardhat.
== Core
{{Proxy}}
{{UpgradeableProxy}}
== ERC1967
{{ERC1967Proxy}}
== Transparent Proxy
......@@ -38,3 +40,7 @@ CAUTION: Using upgradeable proxies correctly and securely is a difficult task th
== Minimal Clones
{{Clones}}
== Utils
{{Initializable}}
......@@ -3,7 +3,7 @@
// solhint-disable-next-line compiler-version
pragma solidity ^0.8.0;
import "./AddressUpgradeable.sol";
import "../../utils/AddressUpgradeable.sol";
/**
* @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../utils/ContextUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
/**
* @dev Contract module which allows children to implement an emergency stop
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../utils/escrow/EscrowUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
/**
* @dev Simple implementation of a
......
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
/**
* @dev Contract module that helps prevent reentrant calls to a function.
......
......@@ -8,7 +8,7 @@ import "./extensions/IERC1155MetadataURIUpgradeable.sol";
import "../../utils/AddressUpgradeable.sol";
import "../../utils/ContextUpgradeable.sol";
import "../../utils/introspection/ERC165Upgradeable.sol";
import "../../utils/Initializable.sol";
import "../../proxy/utils/Initializable.sol";
/**
*
......@@ -62,7 +62,7 @@ contract ERC1155Upgradeable is Initializable, ContextUpgradeable, ERC165Upgradea
* Clients calling this function must replace the `\{id\}` substring with the
* actual token type ID.
*/
function uri(uint256) external view virtual override returns (string memory) {
function uri(uint256) public view virtual override returns (string memory) {
return _uri;
}
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../ERC1155Upgradeable.sol";
import "../../../utils/Initializable.sol";
import "../../../proxy/utils/Initializable.sol";
/**
* @dev Extension of {ERC1155} that allows token holders to destroy both their
......
......@@ -4,7 +4,7 @@ pragma solidity ^0.8.0;
import "../ERC1155Upgradeable.sol";
import "../../../security/PausableUpgradeable.sol";
import "../../../utils/Initializable.sol";
import "../../../proxy/utils/Initializable.sol";
/**
* @dev ERC1155 token with pausable token transfers, minting and burning.
......
......@@ -7,7 +7,7 @@ import "../extensions/ERC1155BurnableUpgradeable.sol";
import "../extensions/ERC1155PausableUpgradeable.sol";
import "../../../access/AccessControlEnumerableUpgradeable.sol";
import "../../../utils/ContextUpgradeable.sol";
import "../../../utils/Initializable.sol";
import "../../../proxy/utils/Initializable.sol";
/**
* @dev {ERC1155} token, including:
......@@ -36,9 +36,9 @@ contract ERC1155PresetMinterPauserUpgradeable is Initializable, ContextUpgradeab
*/
function __ERC1155PresetMinterPauser_init(string memory uri) internal initializer {
__Context_init_unchained();
__ERC165_init_unchained();
__AccessControl_init_unchained();
__AccessControlEnumerable_init_unchained();
__ERC165_init_unchained();
__ERC1155_init_unchained(uri);
__ERC1155Burnable_init_unchained();
__Pausable_init_unchained();
......@@ -105,6 +105,13 @@ contract ERC1155PresetMinterPauserUpgradeable is Initializable, ContextUpgradeab
_unpause();
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override(AccessControlEnumerableUpgradeable, ERC1155Upgradeable) returns (bool) {
return super.supportsInterface(interfaceId);
}
function _beforeTokenTransfer(
address operator,
address from,
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "./ERC1155ReceiverUpgradeable.sol";
import "../../../utils/Initializable.sol";
import "../../../proxy/utils/Initializable.sol";
/**
* @dev _Available since v3.1._
......
......@@ -4,7 +4,7 @@ pragma solidity ^0.8.0;
import "../IERC1155ReceiverUpgradeable.sol";
import "../../../utils/introspection/ERC165Upgradeable.sol";
import "../../../utils/Initializable.sol";
import "../../../proxy/utils/Initializable.sol";
/**
* @dev _Available since v3.1._
......
......@@ -4,7 +4,7 @@ pragma solidity ^0.8.0;
import "./IERC20Upgradeable.sol";
import "../../utils/ContextUpgradeable.sol";
import "../../utils/Initializable.sol";
import "../../proxy/utils/Initializable.sol";
/**
* @dev Implementation of the {IERC20} interface.
......
......@@ -4,7 +4,7 @@ pragma solidity ^0.8.0;
import "../ERC20Upgradeable.sol";
import "../../../utils/ContextUpgradeable.sol";
import "../../../utils/Initializable.sol";
import "../../../proxy/utils/Initializable.sol";
/**
* @dev Extension of {ERC20} that allows token holders to destroy both their own
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../ERC20Upgradeable.sol";
import "../../../utils/Initializable.sol";
import "../../../proxy/utils/Initializable.sol";
/**
* @dev Extension of {ERC20} that adds a cap to the supply of tokens.
......@@ -33,18 +33,11 @@ abstract contract ERC20CappedUpgradeable is Initializable, ERC20Upgradeable {
}
/**
* @dev See {ERC20-_beforeTokenTransfer}.
*
* Requirements:
*
* - minted tokens must not cause the total supply to go over the cap.
* @dev See {ERC20-_mint}.
*/
function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override {
super._beforeTokenTransfer(from, to, amount);
if (from == address(0)) { // When minting tokens
require(totalSupply() + amount <= cap(), "ERC20Capped: cap exceeded");
}
function _mint(address account, uint256 amount) internal virtual override {
require(ERC20Upgradeable.totalSupply() + amount <= cap(), "ERC20Capped: cap exceeded");
super._mint(account, amount);
}
uint256[50] private __gap;
}
......@@ -4,7 +4,7 @@ pragma solidity ^0.8.0;
import "../ERC20Upgradeable.sol";
import "../../../security/PausableUpgradeable.sol";
import "../../../utils/Initializable.sol";
import "../../../proxy/utils/Initializable.sol";
/**
* @dev ERC20 token with pausable token transfers, minting and burning.
......
......@@ -5,7 +5,7 @@ pragma solidity ^0.8.0;
import "../ERC20Upgradeable.sol";
import "../../../utils/ArraysUpgradeable.sol";
import "../../../utils/CountersUpgradeable.sol";
import "../../../utils/Initializable.sol";
import "../../../proxy/utils/Initializable.sol";
/**
* @dev This contract extends an ERC20 token with a snapshot mechanism. When a snapshot is created, the balances and
......
......@@ -7,7 +7,7 @@ import "../ERC20Upgradeable.sol";
import "../../../utils/cryptography/draft-EIP712Upgradeable.sol";
import "../../../utils/cryptography/ECDSAUpgradeable.sol";
import "../../../utils/CountersUpgradeable.sol";
import "../../../utils/Initializable.sol";
import "../../../proxy/utils/Initializable.sol";
/**
* @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
......
......@@ -2,7 +2,7 @@
pragma solidity ^0.8.0;
import "../extensions/ERC20BurnableUpgradeable.sol";
import "../../../utils/Initializable.sol";
import "../../../proxy/utils/Initializable.sol";
/**
* @dev {ERC20} token, including:
......
......@@ -7,7 +7,7 @@ import "../extensions/ERC20BurnableUpgradeable.sol";
import "../extensions/ERC20PausableUpgradeable.sol";
import "../../../access/AccessControlEnumerableUpgradeable.sol";
import "../../../utils/ContextUpgradeable.sol";
import "../../../utils/Initializable.sol";
import "../../../proxy/utils/Initializable.sol";
/**
* @dev {ERC20} token, including:
......@@ -38,6 +38,7 @@ contract ERC20PresetMinterPauserUpgradeable is Initializable, ContextUpgradeable
*/
function __ERC20PresetMinterPauser_init(string memory name, string memory symbol) internal initializer {
__Context_init_unchained();
__ERC165_init_unchained();
__AccessControl_init_unchained();
__AccessControlEnumerable_init_unchained();
__ERC20_init_unchained(name, symbol);
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "./SafeERC20Upgradeable.sol";
import "../../../utils/Initializable.sol";
import "../../../proxy/utils/Initializable.sol";
/**
* @dev A token holder contract that will allow a beneficiary to extract the
......
......@@ -10,7 +10,7 @@ import "../../utils/AddressUpgradeable.sol";
import "../../utils/ContextUpgradeable.sol";
import "../../utils/StringsUpgradeable.sol";
import "../../utils/introspection/ERC165Upgradeable.sol";
import "../../utils/Initializable.sol";
import "../../proxy/utils/Initializable.sol";
/**
* @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
......@@ -230,7 +230,7 @@ contract ERC721Upgradeable is Initializable, ContextUpgradeable, ERC165Upgradeab
* @dev Safely mints `tokenId` and transfers it to `to`.
*
* Requirements:
d*
*
* - `tokenId` must not exist.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
......
......@@ -39,6 +39,8 @@ NOTE: This core set of contracts is designed to be unopinionated, allowing devel
{{ERC721Burnable}}
{{ERC721TokenUri}}
== Presets
These contracts are preconfigured combinations of the above features. They can be used through inheritance or as models to copy and paste their source code.
......
......@@ -4,7 +4,7 @@ pragma solidity ^0.8.0;
import "../ERC721Upgradeable.sol";
import "../../../utils/ContextUpgradeable.sol";
import "../../../utils/Initializable.sol";
import "../../../proxy/utils/Initializable.sol";
/**
* @title ERC721 Burnable Token
......
......@@ -4,7 +4,7 @@ pragma solidity ^0.8.0;
import "../ERC721Upgradeable.sol";
import "./IERC721EnumerableUpgradeable.sol";
import "../../../utils/Initializable.sol";
import "../../../proxy/utils/Initializable.sol";
/**
* @dev This implements an optional extension of {ERC721} defined in the EIP that adds
......
......@@ -4,7 +4,7 @@ pragma solidity ^0.8.0;
import "../ERC721Upgradeable.sol";
import "../../../security/PausableUpgradeable.sol";
import "../../../utils/Initializable.sol";
import "../../../proxy/utils/Initializable.sol";
/**
* @dev ERC721 token with pausable token transfers, minting and burning.
......
This source diff could not be displayed because it is too large. You can view the blob instead.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment