Commit b05440a7 by github-actions

Transpile ff94b777

parent 78f32a18
...@@ -20,23 +20,35 @@ ...@@ -20,23 +20,35 @@
## Unreleased ## Unreleased
* `IERC20Metadata`: add a new extended interface that includes the optional `name()`, `symbol()` and `decimals()` functions. ([#2561](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2561))
* `ERC777`: make reception acquirement optional in `_mint`. ([#2552](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2552))
* `ERC20Permit`: add a `_useNonce` to enable further usage of ERC712 signatures. ([#2565](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2565))
## Unreleased
* 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. * 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)) * `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)) * `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)) * `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)) * `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 behaviour remains available in the `ERC165Storage` extension. ([#2505](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2505)) * `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)) * `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)) * `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)) * `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)) * 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 of by enforcing te check directly in `_mint`. ([#2524](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2524)) * `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)) * 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)) * `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)) * `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)) * `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 ### How to upgrade from 3.x
...@@ -48,6 +60,10 @@ npx openzeppelin-contracts-migrate-imports ...@@ -48,6 +60,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. 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) ## 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)) * `BeaconProxy`: added new kind of proxy that allows simultaneous atomic upgrades. ([#2411](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2411))
......
...@@ -4,7 +4,7 @@ pragma solidity ^0.8.0; ...@@ -4,7 +4,7 @@ pragma solidity ^0.8.0;
import "./AccessControlUpgradeable.sol"; import "./AccessControlUpgradeable.sol";
import "../utils/structs/EnumerableSetUpgradeable.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. * @dev External interface of AccessControlEnumerable declared to support ERC165 detection.
...@@ -80,6 +80,14 @@ abstract contract AccessControlEnumerableUpgradeable is Initializable, IAccessCo ...@@ -80,6 +80,14 @@ abstract contract AccessControlEnumerableUpgradeable is Initializable, IAccessCo
} }
/** /**
* @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 * @dev Overload {_setupRole} to track enumerable memberships
*/ */
function _setupRole(bytes32 role, address account) internal virtual override { function _setupRole(bytes32 role, address account) internal virtual override {
......
...@@ -4,7 +4,7 @@ pragma solidity ^0.8.0; ...@@ -4,7 +4,7 @@ pragma solidity ^0.8.0;
import "../utils/ContextUpgradeable.sol"; import "../utils/ContextUpgradeable.sol";
import "../utils/introspection/ERC165Upgradeable.sol"; import "../utils/introspection/ERC165Upgradeable.sol";
import "../utils/Initializable.sol"; import "../proxy/utils/Initializable.sol";
/** /**
* @dev External interface of AccessControl declared to support ERC165 detection. * @dev External interface of AccessControl declared to support ERC165 detection.
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
pragma solidity ^0.8.0; pragma solidity ^0.8.0;
import "../utils/ContextUpgradeable.sol"; import "../utils/ContextUpgradeable.sol";
import "../utils/Initializable.sol"; import "../proxy/utils/Initializable.sol";
/** /**
* @dev Contract module which provides a basic access control mechanism, where * @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to * there is an account (an owner) that can be granted exclusive access to
......
...@@ -2,10 +2,10 @@ ...@@ -2,10 +2,10 @@
pragma solidity ^0.8.0; pragma solidity ^0.8.0;
import "./AddressUpgradeable.sol"; import "../utils/AddressUpgradeable.sol";
import "./ContextUpgradeable.sol"; import "../utils/ContextUpgradeable.sol";
import "./math/SafeMathUpgradeable.sol"; import "../utils/math/SafeMathUpgradeable.sol";
import "./Initializable.sol"; import "../proxy/utils/Initializable.sol";
/** /**
* @title PaymentSplitter * @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 = Governance
[.readme-notice] [.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. 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.
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
pragma solidity ^0.8.0; pragma solidity ^0.8.0;
import "../access/AccessControlUpgradeable.sol"; 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 * @dev Contract module which acts as a timelocked controller. When set as the
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
pragma solidity ^0.8.0; pragma solidity ^0.8.0;
import "../utils/ContextUpgradeable.sol"; import "../utils/ContextUpgradeable.sol";
import "../utils/Initializable.sol"; import "../proxy/utils/Initializable.sol";
/* /*
* @dev Context variant with ERC2771 support. * @dev Context variant with ERC2771 support.
......
...@@ -4,7 +4,7 @@ pragma solidity ^0.8.0; ...@@ -4,7 +4,7 @@ pragma solidity ^0.8.0;
import "../utils/cryptography/ECDSAUpgradeable.sol"; import "../utils/cryptography/ECDSAUpgradeable.sol";
import "../utils/cryptography/draft-EIP712Upgradeable.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}. * @dev Simple minimal forwarder to be used together with an ERC2771 compatible contract. See {ERC2771Context}.
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
pragma solidity ^0.8.0; pragma solidity ^0.8.0;
import "../access/AccessControlEnumerableUpgradeable.sol"; import "../access/AccessControlEnumerableUpgradeable.sol";
import "../utils/Initializable.sol"; import "../proxy/utils/Initializable.sol";
contract AccessControlEnumerableMockUpgradeable is Initializable, AccessControlEnumerableUpgradeable { contract AccessControlEnumerableMockUpgradeable is Initializable, AccessControlEnumerableUpgradeable {
function __AccessControlEnumerableMock_init() internal initializer { function __AccessControlEnumerableMock_init() internal initializer {
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
pragma solidity ^0.8.0; pragma solidity ^0.8.0;
import "../access/AccessControlUpgradeable.sol"; import "../access/AccessControlUpgradeable.sol";
import "../utils/Initializable.sol"; import "../proxy/utils/Initializable.sol";
contract AccessControlMockUpgradeable is Initializable, AccessControlUpgradeable { contract AccessControlMockUpgradeable is Initializable, AccessControlUpgradeable {
function __AccessControlMock_init() internal initializer { function __AccessControlMock_init() internal initializer {
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
pragma solidity ^0.8.0; pragma solidity ^0.8.0;
import "../utils/AddressUpgradeable.sol"; import "../utils/AddressUpgradeable.sol";
import "../utils/Initializable.sol"; import "../proxy/utils/Initializable.sol";
contract AddressImplUpgradeable is Initializable { contract AddressImplUpgradeable is Initializable {
function __AddressImpl_init() internal initializer { function __AddressImpl_init() internal initializer {
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
pragma solidity ^0.8.0; pragma solidity ^0.8.0;
import "../utils/ArraysUpgradeable.sol"; import "../utils/ArraysUpgradeable.sol";
import "../utils/Initializable.sol"; import "../proxy/utils/Initializable.sol";
contract ArraysImplUpgradeable is Initializable { contract ArraysImplUpgradeable is Initializable {
using ArraysUpgradeable for uint256[]; using ArraysUpgradeable for uint256[];
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity ^0.8.0; pragma solidity ^0.8.0;
import "../utils/Initializable.sol"; import "../proxy/utils/Initializable.sol";
contract BadBeaconNoImplUpgradeable is Initializable { contract BadBeaconNoImplUpgradeable is Initializable {
function __BadBeaconNoImpl_init() internal initializer { function __BadBeaconNoImpl_init() internal initializer {
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity ^0.8.0; pragma solidity ^0.8.0;
import "../utils/Initializable.sol"; import "../proxy/utils/Initializable.sol";
contract CallReceiverMockUpgradeable is Initializable { contract CallReceiverMockUpgradeable is Initializable {
function __CallReceiverMock_init() internal initializer { function __CallReceiverMock_init() internal initializer {
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity ^0.8.0; pragma solidity ^0.8.0;
import "../utils/Initializable.sol"; import "../proxy/utils/Initializable.sol";
/** /**
......
...@@ -4,7 +4,7 @@ pragma solidity ^0.8.0; ...@@ -4,7 +4,7 @@ pragma solidity ^0.8.0;
import "../proxy/ClonesUpgradeable.sol"; import "../proxy/ClonesUpgradeable.sol";
import "../utils/AddressUpgradeable.sol"; import "../utils/AddressUpgradeable.sol";
import "../utils/Initializable.sol"; import "../proxy/utils/Initializable.sol";
contract ClonesMockUpgradeable is Initializable { contract ClonesMockUpgradeable is Initializable {
function __ClonesMock_init() internal initializer { function __ClonesMock_init() internal initializer {
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
pragma solidity ^0.8.0; pragma solidity ^0.8.0;
import "../utils/escrow/ConditionalEscrowUpgradeable.sol"; import "../utils/escrow/ConditionalEscrowUpgradeable.sol";
import "../utils/Initializable.sol"; import "../proxy/utils/Initializable.sol";
// mock class using ConditionalEscrow // mock class using ConditionalEscrow
contract ConditionalEscrowMockUpgradeable is Initializable, ConditionalEscrowUpgradeable { contract ConditionalEscrowMockUpgradeable is Initializable, ConditionalEscrowUpgradeable {
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
pragma solidity ^0.8.0; pragma solidity ^0.8.0;
import "../utils/ContextUpgradeable.sol"; import "../utils/ContextUpgradeable.sol";
import "../utils/Initializable.sol"; import "../proxy/utils/Initializable.sol";
contract ContextMockUpgradeable is Initializable, ContextUpgradeable { contract ContextMockUpgradeable is Initializable, ContextUpgradeable {
function __ContextMock_init() internal initializer { function __ContextMock_init() internal initializer {
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
pragma solidity ^0.8.0; pragma solidity ^0.8.0;
import "../utils/CountersUpgradeable.sol"; import "../utils/CountersUpgradeable.sol";
import "../utils/Initializable.sol"; import "../proxy/utils/Initializable.sol";
contract CountersImplUpgradeable is Initializable { contract CountersImplUpgradeable is Initializable {
function __CountersImpl_init() internal initializer { function __CountersImpl_init() internal initializer {
......
...@@ -4,7 +4,7 @@ pragma solidity ^0.8.0; ...@@ -4,7 +4,7 @@ pragma solidity ^0.8.0;
import "../utils/Create2Upgradeable.sol"; import "../utils/Create2Upgradeable.sol";
import "../utils/introspection/ERC1820ImplementerUpgradeable.sol"; import "../utils/introspection/ERC1820ImplementerUpgradeable.sol";
import "../utils/Initializable.sol"; import "../proxy/utils/Initializable.sol";
contract Create2ImplUpgradeable is Initializable { contract Create2ImplUpgradeable is Initializable {
function __Create2Impl_init() internal initializer { function __Create2Impl_init() internal initializer {
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity ^0.8.0; pragma solidity ^0.8.0;
import "../utils/Initializable.sol"; import "../proxy/utils/Initializable.sol";
abstract contract ImplUpgradeable is Initializable { abstract contract ImplUpgradeable is Initializable {
function __Impl_init() internal initializer { function __Impl_init() internal initializer {
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
pragma solidity ^0.8.0; pragma solidity ^0.8.0;
import "../utils/cryptography/ECDSAUpgradeable.sol"; import "../utils/cryptography/ECDSAUpgradeable.sol";
import "../utils/Initializable.sol"; import "../proxy/utils/Initializable.sol";
contract ECDSAMockUpgradeable is Initializable { contract ECDSAMockUpgradeable is Initializable {
function __ECDSAMock_init() internal initializer { function __ECDSAMock_init() internal initializer {
......
...@@ -4,7 +4,7 @@ pragma solidity ^0.8.0; ...@@ -4,7 +4,7 @@ pragma solidity ^0.8.0;
import "../utils/cryptography/draft-EIP712Upgradeable.sol"; import "../utils/cryptography/draft-EIP712Upgradeable.sol";
import "../utils/cryptography/ECDSAUpgradeable.sol"; import "../utils/cryptography/ECDSAUpgradeable.sol";
import "../utils/Initializable.sol"; import "../proxy/utils/Initializable.sol";
contract EIP712ExternalUpgradeable is Initializable, EIP712Upgradeable { contract EIP712ExternalUpgradeable is Initializable, EIP712Upgradeable {
function __EIP712External_init(string memory name, string memory version) internal initializer { function __EIP712External_init(string memory name, string memory version) internal initializer {
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
pragma solidity ^0.8.0; pragma solidity ^0.8.0;
import "../token/ERC1155/extensions/ERC1155BurnableUpgradeable.sol"; import "../token/ERC1155/extensions/ERC1155BurnableUpgradeable.sol";
import "../utils/Initializable.sol"; import "../proxy/utils/Initializable.sol";
contract ERC1155BurnableMockUpgradeable is Initializable, ERC1155BurnableUpgradeable { contract ERC1155BurnableMockUpgradeable is Initializable, ERC1155BurnableUpgradeable {
function __ERC1155BurnableMock_init(string memory uri) internal initializer { function __ERC1155BurnableMock_init(string memory uri) internal initializer {
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
pragma solidity ^0.8.0; pragma solidity ^0.8.0;
import "../token/ERC1155/ERC1155Upgradeable.sol"; import "../token/ERC1155/ERC1155Upgradeable.sol";
import "../utils/Initializable.sol"; import "../proxy/utils/Initializable.sol";
/** /**
* @title ERC1155Mock * @title ERC1155Mock
......
...@@ -4,7 +4,7 @@ pragma solidity ^0.8.0; ...@@ -4,7 +4,7 @@ pragma solidity ^0.8.0;
import "./ERC1155MockUpgradeable.sol"; import "./ERC1155MockUpgradeable.sol";
import "../token/ERC1155/extensions/ERC1155PausableUpgradeable.sol"; import "../token/ERC1155/extensions/ERC1155PausableUpgradeable.sol";
import "../utils/Initializable.sol"; import "../proxy/utils/Initializable.sol";
contract ERC1155PausableMockUpgradeable is Initializable, ERC1155MockUpgradeable, ERC1155PausableUpgradeable { contract ERC1155PausableMockUpgradeable is Initializable, ERC1155MockUpgradeable, ERC1155PausableUpgradeable {
function __ERC1155PausableMock_init(string memory uri) internal initializer { function __ERC1155PausableMock_init(string memory uri) internal initializer {
......
...@@ -4,7 +4,7 @@ pragma solidity ^0.8.0; ...@@ -4,7 +4,7 @@ pragma solidity ^0.8.0;
import "../token/ERC1155/IERC1155ReceiverUpgradeable.sol"; import "../token/ERC1155/IERC1155ReceiverUpgradeable.sol";
import "../utils/introspection/ERC165Upgradeable.sol"; import "../utils/introspection/ERC165Upgradeable.sol";
import "../utils/Initializable.sol"; import "../proxy/utils/Initializable.sol";
contract ERC1155ReceiverMockUpgradeable is Initializable, IERC1155ReceiverUpgradeable, ERC165Upgradeable { contract ERC1155ReceiverMockUpgradeable is Initializable, IERC1155ReceiverUpgradeable, ERC165Upgradeable {
bytes4 private _recRetval; bytes4 private _recRetval;
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
pragma solidity ^0.8.0; pragma solidity ^0.8.0;
import "../../utils/introspection/IERC165Upgradeable.sol"; import "../../utils/introspection/IERC165Upgradeable.sol";
import "../../utils/Initializable.sol"; import "../../proxy/utils/Initializable.sol";
/** /**
* https://eips.ethereum.org/EIPS/eip-214#specification * https://eips.ethereum.org/EIPS/eip-214#specification
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity ^0.8.0; pragma solidity ^0.8.0;
import "../../utils/Initializable.sol"; import "../../proxy/utils/Initializable.sol";
contract ERC165MissingDataUpgradeable is Initializable { contract ERC165MissingDataUpgradeable is Initializable {
function __ERC165MissingData_init() internal initializer { function __ERC165MissingData_init() internal initializer {
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity ^0.8.0; pragma solidity ^0.8.0;
import "../../utils/Initializable.sol"; import "../../proxy/utils/Initializable.sol";
contract ERC165NotSupportedUpgradeable is Initializable { function __ERC165NotSupported_init() internal initializer { contract ERC165NotSupportedUpgradeable is Initializable { function __ERC165NotSupported_init() internal initializer {
__ERC165NotSupported_init_unchained(); __ERC165NotSupported_init_unchained();
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
pragma solidity ^0.8.0; pragma solidity ^0.8.0;
import "../utils/introspection/ERC165CheckerUpgradeable.sol"; import "../utils/introspection/ERC165CheckerUpgradeable.sol";
import "../utils/Initializable.sol"; import "../proxy/utils/Initializable.sol";
contract ERC165CheckerMockUpgradeable is Initializable { contract ERC165CheckerMockUpgradeable is Initializable {
function __ERC165CheckerMock_init() internal initializer { function __ERC165CheckerMock_init() internal initializer {
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
pragma solidity ^0.8.0; pragma solidity ^0.8.0;
import "../utils/introspection/ERC165Upgradeable.sol"; import "../utils/introspection/ERC165Upgradeable.sol";
import "../utils/Initializable.sol"; import "../proxy/utils/Initializable.sol";
contract ERC165MockUpgradeable is Initializable, ERC165Upgradeable { contract ERC165MockUpgradeable is Initializable, ERC165Upgradeable {
function __ERC165Mock_init() internal initializer { function __ERC165Mock_init() internal initializer {
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
pragma solidity ^0.8.0; pragma solidity ^0.8.0;
import "../utils/introspection/ERC165StorageUpgradeable.sol"; import "../utils/introspection/ERC165StorageUpgradeable.sol";
import "../utils/Initializable.sol"; import "../proxy/utils/Initializable.sol";
contract ERC165StorageMockUpgradeable is Initializable, ERC165StorageUpgradeable { contract ERC165StorageMockUpgradeable is Initializable, ERC165StorageUpgradeable {
function __ERC165StorageMock_init() internal initializer { function __ERC165StorageMock_init() internal initializer {
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
pragma solidity ^0.8.0; pragma solidity ^0.8.0;
import "../utils/introspection/ERC1820ImplementerUpgradeable.sol"; import "../utils/introspection/ERC1820ImplementerUpgradeable.sol";
import "../utils/Initializable.sol"; import "../proxy/utils/Initializable.sol";
contract ERC1820ImplementerMockUpgradeable is Initializable, ERC1820ImplementerUpgradeable { contract ERC1820ImplementerMockUpgradeable is Initializable, ERC1820ImplementerUpgradeable {
function __ERC1820ImplementerMock_init() internal initializer { function __ERC1820ImplementerMock_init() internal initializer {
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
pragma solidity ^0.8.0; pragma solidity ^0.8.0;
import "../token/ERC20/extensions/ERC20BurnableUpgradeable.sol"; import "../token/ERC20/extensions/ERC20BurnableUpgradeable.sol";
import "../utils/Initializable.sol"; import "../proxy/utils/Initializable.sol";
contract ERC20BurnableMockUpgradeable is Initializable, ERC20BurnableUpgradeable { contract ERC20BurnableMockUpgradeable is Initializable, ERC20BurnableUpgradeable {
function __ERC20BurnableMock_init( function __ERC20BurnableMock_init(
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
pragma solidity ^0.8.0; pragma solidity ^0.8.0;
import "../token/ERC20/extensions/ERC20CappedUpgradeable.sol"; import "../token/ERC20/extensions/ERC20CappedUpgradeable.sol";
import "../utils/Initializable.sol"; import "../proxy/utils/Initializable.sol";
contract ERC20CappedMockUpgradeable is Initializable, ERC20CappedUpgradeable { contract ERC20CappedMockUpgradeable is Initializable, ERC20CappedUpgradeable {
function __ERC20CappedMock_init(string memory name, string memory symbol, uint256 cap) internal initializer { function __ERC20CappedMock_init(string memory name, string memory symbol, uint256 cap) internal initializer {
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
pragma solidity ^0.8.0; pragma solidity ^0.8.0;
import "../token/ERC20/ERC20Upgradeable.sol"; import "../token/ERC20/ERC20Upgradeable.sol";
import "../utils/Initializable.sol"; import "../proxy/utils/Initializable.sol";
contract ERC20DecimalsMockUpgradeable is Initializable, ERC20Upgradeable { contract ERC20DecimalsMockUpgradeable is Initializable, ERC20Upgradeable {
uint8 private _decimals; uint8 private _decimals;
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
pragma solidity ^0.8.0; pragma solidity ^0.8.0;
import "../token/ERC20/ERC20Upgradeable.sol"; import "../token/ERC20/ERC20Upgradeable.sol";
import "../utils/Initializable.sol"; import "../proxy/utils/Initializable.sol";
// mock class using ERC20 // mock class using ERC20
contract ERC20MockUpgradeable is Initializable, ERC20Upgradeable { contract ERC20MockUpgradeable is Initializable, ERC20Upgradeable {
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
pragma solidity ^0.8.0; pragma solidity ^0.8.0;
import "../token/ERC20/extensions/ERC20PausableUpgradeable.sol"; import "../token/ERC20/extensions/ERC20PausableUpgradeable.sol";
import "../utils/Initializable.sol"; import "../proxy/utils/Initializable.sol";
// mock class using ERC20Pausable // mock class using ERC20Pausable
contract ERC20PausableMockUpgradeable is Initializable, ERC20PausableUpgradeable { contract ERC20PausableMockUpgradeable is Initializable, ERC20PausableUpgradeable {
......
...@@ -4,7 +4,7 @@ pragma solidity ^0.8.0; ...@@ -4,7 +4,7 @@ pragma solidity ^0.8.0;
import "../token/ERC20/extensions/draft-ERC20PermitUpgradeable.sol"; import "../token/ERC20/extensions/draft-ERC20PermitUpgradeable.sol";
import "../utils/Initializable.sol"; import "../proxy/utils/Initializable.sol";
contract ERC20PermitMockUpgradeable is Initializable, ERC20PermitUpgradeable { contract ERC20PermitMockUpgradeable is Initializable, ERC20PermitUpgradeable {
function __ERC20PermitMock_init( function __ERC20PermitMock_init(
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
pragma solidity ^0.8.0; pragma solidity ^0.8.0;
import "../token/ERC20/extensions/ERC20SnapshotUpgradeable.sol"; import "../token/ERC20/extensions/ERC20SnapshotUpgradeable.sol";
import "../utils/Initializable.sol"; import "../proxy/utils/Initializable.sol";
contract ERC20SnapshotMockUpgradeable is Initializable, ERC20SnapshotUpgradeable { contract ERC20SnapshotMockUpgradeable is Initializable, ERC20SnapshotUpgradeable {
......
...@@ -4,7 +4,7 @@ pragma solidity ^0.8.0; ...@@ -4,7 +4,7 @@ pragma solidity ^0.8.0;
import "./ContextMockUpgradeable.sol"; import "./ContextMockUpgradeable.sol";
import "../metatx/ERC2771ContextUpgradeable.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 // By inheriting from ERC2771Context, Context's internal functions are overridden automatically
contract ERC2771ContextMockUpgradeable is Initializable, ContextMockUpgradeable, ERC2771ContextUpgradeable { contract ERC2771ContextMockUpgradeable is Initializable, ContextMockUpgradeable, ERC2771ContextUpgradeable {
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
pragma solidity ^0.8.0; pragma solidity ^0.8.0;
import "../token/ERC721/extensions/ERC721BurnableUpgradeable.sol"; import "../token/ERC721/extensions/ERC721BurnableUpgradeable.sol";
import "../utils/Initializable.sol"; import "../proxy/utils/Initializable.sol";
contract ERC721BurnableMockUpgradeable is Initializable, ERC721BurnableUpgradeable { contract ERC721BurnableMockUpgradeable is Initializable, ERC721BurnableUpgradeable {
function __ERC721BurnableMock_init(string memory name, string memory symbol) internal initializer { function __ERC721BurnableMock_init(string memory name, string memory symbol) internal initializer {
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
pragma solidity ^0.8.0; pragma solidity ^0.8.0;
import "../token/ERC721/extensions/ERC721EnumerableUpgradeable.sol"; import "../token/ERC721/extensions/ERC721EnumerableUpgradeable.sol";
import "../utils/Initializable.sol"; import "../proxy/utils/Initializable.sol";
/** /**
* @title ERC721Mock * @title ERC721Mock
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
pragma solidity ^0.8.0; pragma solidity ^0.8.0;
import "../token/ERC721/ERC721Upgradeable.sol"; import "../token/ERC721/ERC721Upgradeable.sol";
import "../utils/Initializable.sol"; import "../proxy/utils/Initializable.sol";
/** /**
* @title ERC721Mock * @title ERC721Mock
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
pragma solidity ^0.8.0; pragma solidity ^0.8.0;
import "../token/ERC721/extensions/ERC721PausableUpgradeable.sol"; import "../token/ERC721/extensions/ERC721PausableUpgradeable.sol";
import "../utils/Initializable.sol"; import "../proxy/utils/Initializable.sol";
/** /**
* @title ERC721PausableMock * @title ERC721PausableMock
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
pragma solidity ^0.8.0; pragma solidity ^0.8.0;
import "../token/ERC721/IERC721ReceiverUpgradeable.sol"; import "../token/ERC721/IERC721ReceiverUpgradeable.sol";
import "../utils/Initializable.sol"; import "../proxy/utils/Initializable.sol";
contract ERC721ReceiverMockUpgradeable is Initializable, IERC721ReceiverUpgradeable { contract ERC721ReceiverMockUpgradeable is Initializable, IERC721ReceiverUpgradeable {
enum Error { enum Error {
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
pragma solidity ^0.8.0; pragma solidity ^0.8.0;
import "../token/ERC721/extensions/ERC721URIStorageUpgradeable.sol"; import "../token/ERC721/extensions/ERC721URIStorageUpgradeable.sol";
import "../utils/Initializable.sol"; import "../proxy/utils/Initializable.sol";
/** /**
* @title ERC721Mock * @title ERC721Mock
......
...@@ -4,7 +4,7 @@ pragma solidity ^0.8.0; ...@@ -4,7 +4,7 @@ pragma solidity ^0.8.0;
import "../utils/ContextUpgradeable.sol"; import "../utils/ContextUpgradeable.sol";
import "../token/ERC777/ERC777Upgradeable.sol"; import "../token/ERC777/ERC777Upgradeable.sol";
import "../utils/Initializable.sol"; import "../proxy/utils/Initializable.sol";
contract ERC777MockUpgradeable is Initializable, ContextUpgradeable, ERC777Upgradeable { contract ERC777MockUpgradeable is Initializable, ContextUpgradeable, ERC777Upgradeable {
event BeforeTokenTransfer(); event BeforeTokenTransfer();
...@@ -40,6 +40,16 @@ contract ERC777MockUpgradeable is Initializable, ContextUpgradeable, ERC777Upgra ...@@ -40,6 +40,16 @@ contract ERC777MockUpgradeable is Initializable, ContextUpgradeable, ERC777Upgra
_mint(to, amount, userData, operatorData); _mint(to, amount, userData, operatorData);
} }
function mintInternalExtended (
address to,
uint256 amount,
bytes memory userData,
bytes memory operatorData,
bool requireReceptionAck
) public {
_mint(to, amount, userData, operatorData, requireReceptionAck);
}
function approveInternal(address holder, address spender, uint256 value) public { function approveInternal(address holder, address spender, uint256 value) public {
_approve(holder, spender, value); _approve(holder, spender, value);
} }
......
...@@ -8,7 +8,7 @@ import "../token/ERC777/IERC777RecipientUpgradeable.sol"; ...@@ -8,7 +8,7 @@ import "../token/ERC777/IERC777RecipientUpgradeable.sol";
import "../utils/ContextUpgradeable.sol"; import "../utils/ContextUpgradeable.sol";
import "../utils/introspection/IERC1820RegistryUpgradeable.sol"; import "../utils/introspection/IERC1820RegistryUpgradeable.sol";
import "../utils/introspection/ERC1820ImplementerUpgradeable.sol"; import "../utils/introspection/ERC1820ImplementerUpgradeable.sol";
import "../utils/Initializable.sol"; import "../proxy/utils/Initializable.sol";
contract ERC777SenderRecipientMockUpgradeable is Initializable, ContextUpgradeable, IERC777SenderUpgradeable, IERC777RecipientUpgradeable, ERC1820ImplementerUpgradeable { contract ERC777SenderRecipientMockUpgradeable is Initializable, ContextUpgradeable, IERC777SenderUpgradeable, IERC777RecipientUpgradeable, ERC1820ImplementerUpgradeable {
function __ERC777SenderRecipientMock_init() internal initializer { function __ERC777SenderRecipientMock_init() internal initializer {
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
pragma solidity ^0.8.0; pragma solidity ^0.8.0;
import "../utils/structs/EnumerableMapUpgradeable.sol"; import "../utils/structs/EnumerableMapUpgradeable.sol";
import "../utils/Initializable.sol"; import "../proxy/utils/Initializable.sol";
contract EnumerableMapMockUpgradeable is Initializable { contract EnumerableMapMockUpgradeable is Initializable {
function __EnumerableMapMock_init() internal initializer { function __EnumerableMapMock_init() internal initializer {
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
pragma solidity ^0.8.0; pragma solidity ^0.8.0;
import "../utils/structs/EnumerableSetUpgradeable.sol"; import "../utils/structs/EnumerableSetUpgradeable.sol";
import "../utils/Initializable.sol"; import "../proxy/utils/Initializable.sol";
// Bytes32Set // Bytes32Set
contract EnumerableBytes32SetMockUpgradeable is Initializable { contract EnumerableBytes32SetMockUpgradeable is Initializable {
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity ^0.8.0; pragma solidity ^0.8.0;
import "../utils/Initializable.sol"; import "../proxy/utils/Initializable.sol";
contract EtherReceiverMockUpgradeable is Initializable { contract EtherReceiverMockUpgradeable is Initializable {
function __EtherReceiverMock_init() internal initializer { function __EtherReceiverMock_init() internal initializer {
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
pragma solidity ^0.8.0; pragma solidity ^0.8.0;
import "../utils/Initializable.sol"; import "../proxy/utils/Initializable.sol";
/** /**
* @title InitializableMock * @title InitializableMock
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
pragma solidity ^0.8.0; pragma solidity ^0.8.0;
import "../utils/math/MathUpgradeable.sol"; import "../utils/math/MathUpgradeable.sol";
import "../utils/Initializable.sol"; import "../proxy/utils/Initializable.sol";
contract MathMockUpgradeable is Initializable { contract MathMockUpgradeable is Initializable {
function __MathMock_init() internal initializer { function __MathMock_init() internal initializer {
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
pragma solidity ^0.8.0; pragma solidity ^0.8.0;
import "../utils/cryptography/MerkleProofUpgradeable.sol"; import "../utils/cryptography/MerkleProofUpgradeable.sol";
import "../utils/Initializable.sol"; import "../proxy/utils/Initializable.sol";
contract MerkleProofWrapperUpgradeable is Initializable { contract MerkleProofWrapperUpgradeable is Initializable {
function __MerkleProofWrapper_init() internal initializer { function __MerkleProofWrapper_init() internal initializer {
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
pragma solidity ^0.8.0; pragma solidity ^0.8.0;
import "../utils/Initializable.sol"; import "../proxy/utils/Initializable.sol";
// Sample contracts showing upgradeability with multiple inheritance. // Sample contracts showing upgradeability with multiple inheritance.
// Child contract inherits from Father and Mother contracts, and Father extends from Gramps. // Child contract inherits from Father and Mother contracts, and Father extends from Gramps.
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
pragma solidity ^0.8.0; pragma solidity ^0.8.0;
import "../access/OwnableUpgradeable.sol"; import "../access/OwnableUpgradeable.sol";
import "../utils/Initializable.sol"; import "../proxy/utils/Initializable.sol";
contract OwnableMockUpgradeable is Initializable, OwnableUpgradeable { function __OwnableMock_init() internal initializer { contract OwnableMockUpgradeable is Initializable, OwnableUpgradeable { function __OwnableMock_init() internal initializer {
__Context_init_unchained(); __Context_init_unchained();
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
pragma solidity ^0.8.0; pragma solidity ^0.8.0;
import "../security/PausableUpgradeable.sol"; import "../security/PausableUpgradeable.sol";
import "../utils/Initializable.sol"; import "../proxy/utils/Initializable.sol";
contract PausableMockUpgradeable is Initializable, PausableUpgradeable { contract PausableMockUpgradeable is Initializable, PausableUpgradeable {
bool public drasticMeasureTaken; bool public drasticMeasureTaken;
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
pragma solidity ^0.8.0; pragma solidity ^0.8.0;
import "../security/PullPaymentUpgradeable.sol"; import "../security/PullPaymentUpgradeable.sol";
import "../utils/Initializable.sol"; import "../proxy/utils/Initializable.sol";
// mock class using PullPayment // mock class using PullPayment
contract PullPaymentMockUpgradeable is Initializable, PullPaymentUpgradeable { contract PullPaymentMockUpgradeable is Initializable, PullPaymentUpgradeable {
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
pragma solidity ^0.8.0; pragma solidity ^0.8.0;
import "../utils/ContextUpgradeable.sol"; import "../utils/ContextUpgradeable.sol";
import "../utils/Initializable.sol"; import "../proxy/utils/Initializable.sol";
contract ReentrancyAttackUpgradeable is Initializable, ContextUpgradeable { contract ReentrancyAttackUpgradeable is Initializable, ContextUpgradeable {
function __ReentrancyAttack_init() internal initializer { function __ReentrancyAttack_init() internal initializer {
__Context_init_unchained(); __Context_init_unchained();
......
...@@ -4,7 +4,7 @@ pragma solidity ^0.8.0; ...@@ -4,7 +4,7 @@ pragma solidity ^0.8.0;
import "../security/ReentrancyGuardUpgradeable.sol"; import "../security/ReentrancyGuardUpgradeable.sol";
import "./ReentrancyAttackUpgradeable.sol"; import "./ReentrancyAttackUpgradeable.sol";
import "../utils/Initializable.sol"; import "../proxy/utils/Initializable.sol";
contract ReentrancyMockUpgradeable is Initializable, ReentrancyGuardUpgradeable { contract ReentrancyMockUpgradeable is Initializable, ReentrancyGuardUpgradeable {
uint256 public counter; uint256 public counter;
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
pragma solidity ^0.8.0; pragma solidity ^0.8.0;
import "../utils/Initializable.sol"; import "../proxy/utils/Initializable.sol";
contract Implementation1 is Initializable { contract Implementation1 is Initializable {
uint internal _value; uint internal _value;
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
pragma solidity ^0.8.0; pragma solidity ^0.8.0;
import "../utils/math/SafeCastUpgradeable.sol"; import "../utils/math/SafeCastUpgradeable.sol";
import "../utils/Initializable.sol"; import "../proxy/utils/Initializable.sol";
contract SafeCastMockUpgradeable is Initializable { contract SafeCastMockUpgradeable is Initializable {
function __SafeCastMock_init() internal initializer { function __SafeCastMock_init() internal initializer {
......
...@@ -5,7 +5,7 @@ pragma solidity ^0.8.0; ...@@ -5,7 +5,7 @@ pragma solidity ^0.8.0;
import "../utils/ContextUpgradeable.sol"; import "../utils/ContextUpgradeable.sol";
import "../token/ERC20/IERC20Upgradeable.sol"; import "../token/ERC20/IERC20Upgradeable.sol";
import "../token/ERC20/utils/SafeERC20Upgradeable.sol"; import "../token/ERC20/utils/SafeERC20Upgradeable.sol";
import "../utils/Initializable.sol"; import "../proxy/utils/Initializable.sol";
contract ERC20ReturnFalseMockUpgradeable is Initializable, ContextUpgradeable { contract ERC20ReturnFalseMockUpgradeable is Initializable, ContextUpgradeable {
function __ERC20ReturnFalseMock_init() internal initializer { function __ERC20ReturnFalseMock_init() internal initializer {
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
pragma solidity ^0.8.0; pragma solidity ^0.8.0;
import "../utils/math/SafeMathUpgradeable.sol"; import "../utils/math/SafeMathUpgradeable.sol";
import "../utils/Initializable.sol"; import "../proxy/utils/Initializable.sol";
contract SafeMathMockUpgradeable is Initializable { contract SafeMathMockUpgradeable is Initializable {
function __SafeMathMock_init() internal initializer { function __SafeMathMock_init() internal initializer {
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
pragma solidity ^0.8.0; pragma solidity ^0.8.0;
import "../utils/math/SignedSafeMathUpgradeable.sol"; import "../utils/math/SignedSafeMathUpgradeable.sol";
import "../utils/Initializable.sol"; import "../proxy/utils/Initializable.sol";
contract SignedSafeMathMockUpgradeable is Initializable { contract SignedSafeMathMockUpgradeable is Initializable {
function __SignedSafeMathMock_init() internal initializer { function __SignedSafeMathMock_init() internal initializer {
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
pragma solidity ^0.8.0; pragma solidity ^0.8.0;
import "../utils/Initializable.sol"; import "../proxy/utils/Initializable.sol";
/** /**
* @title MigratableMockV1 * @title MigratableMockV1
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
pragma solidity ^0.8.0; pragma solidity ^0.8.0;
import "../utils/StringsUpgradeable.sol"; import "../utils/StringsUpgradeable.sol";
import "../utils/Initializable.sol"; import "../proxy/utils/Initializable.sol";
contract StringsMockUpgradeable is Initializable { contract StringsMockUpgradeable is Initializable {
function __StringsMock_init() internal initializer { function __StringsMock_init() internal initializer {
......
...@@ -57,18 +57,100 @@ contract ERC20PresetMinterPauserUpgradeableWithInit is ERC20PresetMinterPauserUp ...@@ -57,18 +57,100 @@ contract ERC20PresetMinterPauserUpgradeableWithInit is ERC20PresetMinterPauserUp
__ERC20PresetMinterPauser_init(name, symbol); __ERC20PresetMinterPauser_init(name, symbol);
} }
} }
import "../utils/PaymentSplitterUpgradeable.sol"; import "../token/ERC1155/presets/ERC1155PresetMinterPauserUpgradeable.sol";
contract PaymentSplitterUpgradeableWithInit is PaymentSplitterUpgradeable { contract ERC1155PresetMinterPauserUpgradeableWithInit is ERC1155PresetMinterPauserUpgradeable {
constructor(address[] memory payees, uint256[] memory shares_) public payable { constructor(string memory uri) public payable {
__PaymentSplitter_init(payees, shares_); __ERC1155PresetMinterPauser_init(uri);
} }
} }
import "./SafeMathMockUpgradeable.sol"; import "../token/ERC1155/ERC1155Upgradeable.sol";
contract SafeMathMockUpgradeableWithInit is SafeMathMockUpgradeable { contract ERC1155UpgradeableWithInit is ERC1155Upgradeable {
constructor(string memory uri_) public payable {
__ERC1155_init(uri_);
}
}
import "./PausableMockUpgradeable.sol";
contract PausableMockUpgradeableWithInit is PausableMockUpgradeable {
constructor() public payable { constructor() public payable {
__SafeMathMock_init(); __PausableMock_init();
}
}
import "./ERC721URIStorageMockUpgradeable.sol";
contract ERC721URIStorageMockUpgradeableWithInit is ERC721URIStorageMockUpgradeable {
constructor(string memory name, string memory symbol) public payable {
__ERC721URIStorageMock_init(name, symbol);
}
}
import "./ERC721MockUpgradeable.sol";
contract ERC721MockUpgradeableWithInit is ERC721MockUpgradeable {
constructor(string memory name, string memory symbol) public payable {
__ERC721Mock_init(name, symbol);
}
}
import "./ERC165CheckerMockUpgradeable.sol";
contract ERC165CheckerMockUpgradeableWithInit is ERC165CheckerMockUpgradeable {
constructor() public payable {
__ERC165CheckerMock_init();
}
}
import "./ERC165/ERC165InterfacesSupportedUpgradeable.sol";
contract SupportsInterfaceWithLookupMockUpgradeableWithInit is SupportsInterfaceWithLookupMockUpgradeable {
constructor() public payable {
__SupportsInterfaceWithLookupMock_init();
}
}
import "./ERC165/ERC165InterfacesSupportedUpgradeable.sol";
contract ERC165InterfacesSupportedUpgradeableWithInit is ERC165InterfacesSupportedUpgradeable {
constructor(bytes4[] memory interfaceIds) public payable {
__ERC165InterfacesSupported_init(interfaceIds);
}
}
import "./ERC165StorageMockUpgradeable.sol";
contract ERC165StorageMockUpgradeableWithInit is ERC165StorageMockUpgradeable {
constructor() public payable {
__ERC165StorageMock_init();
}
}
import "./ERC165MockUpgradeable.sol";
contract ERC165MockUpgradeableWithInit is ERC165MockUpgradeable {
constructor() public payable {
__ERC165Mock_init();
}
}
import "./ERC1155ReceiverMockUpgradeable.sol";
contract ERC1155ReceiverMockUpgradeableWithInit is ERC1155ReceiverMockUpgradeable {
constructor(
bytes4 recRetval,
bool recReverts,
bytes4 batRetval,
bool batReverts
) public payable {
__ERC1155ReceiverMock_init(recRetval, recReverts, batRetval, batReverts);
}
}
import "./ERC1155MockUpgradeable.sol";
contract ERC1155MockUpgradeableWithInit is ERC1155MockUpgradeable {
constructor(string memory uri) public payable {
__ERC1155Mock_init(uri);
}
}
import "./ERC1155PausableMockUpgradeable.sol";
contract ERC1155PausableMockUpgradeableWithInit is ERC1155PausableMockUpgradeable {
constructor(string memory uri) public payable {
__ERC1155PausableMock_init(uri);
} }
} }
import "./OwnableMockUpgradeable.sol"; import "./OwnableMockUpgradeable.sol";
...@@ -206,119 +288,32 @@ contract ERC777MockUpgradeableWithInit is ERC777MockUpgradeable { ...@@ -206,119 +288,32 @@ contract ERC777MockUpgradeableWithInit is ERC777MockUpgradeable {
__ERC777Mock_init(initialHolder, initialBalance, name, symbol, defaultOperators); __ERC777Mock_init(initialHolder, initialBalance, name, symbol, defaultOperators);
} }
} }
import "./ERC721URIStorageMockUpgradeable.sol"; import "./ClonesMockUpgradeable.sol";
contract ERC721URIStorageMockUpgradeableWithInit is ERC721URIStorageMockUpgradeable {
constructor(string memory name, string memory symbol) public payable {
__ERC721URIStorageMock_init(name, symbol);
}
}
import "./PausableMockUpgradeable.sol";
contract PausableMockUpgradeableWithInit is PausableMockUpgradeable {
constructor() public payable {
__PausableMock_init();
}
}
import "./ERC20PausableMockUpgradeable.sol";
contract ERC20PausableMockUpgradeableWithInit is ERC20PausableMockUpgradeable {
constructor(
string memory name,
string memory symbol,
address initialAccount,
uint256 initialBalance
) public payable {
__ERC20PausableMock_init(name, symbol, initialAccount, initialBalance);
}
}
import "../token/ERC1155/ERC1155Upgradeable.sol";
contract ERC1155UpgradeableWithInit is ERC1155Upgradeable {
constructor(string memory uri_) public payable {
__ERC1155_init(uri_);
}
}
import "../token/ERC1155/presets/ERC1155PresetMinterPauserUpgradeable.sol";
contract ERC1155PresetMinterPauserUpgradeableWithInit is ERC1155PresetMinterPauserUpgradeable {
constructor(string memory uri) public payable {
__ERC1155PresetMinterPauser_init(uri);
}
}
import "./ERC1155MockUpgradeable.sol";
contract ERC1155MockUpgradeableWithInit is ERC1155MockUpgradeable {
constructor(string memory uri) public payable {
__ERC1155Mock_init(uri);
}
}
import "./ERC1155PausableMockUpgradeable.sol";
contract ERC1155PausableMockUpgradeableWithInit is ERC1155PausableMockUpgradeable {
constructor(string memory uri) public payable {
__ERC1155PausableMock_init(uri);
}
}
import "./ERC1155ReceiverMockUpgradeable.sol";
contract ERC1155ReceiverMockUpgradeableWithInit is ERC1155ReceiverMockUpgradeable {
constructor(
bytes4 recRetval,
bool recReverts,
bytes4 batRetval,
bool batReverts
) public payable {
__ERC1155ReceiverMock_init(recRetval, recReverts, batRetval, batReverts);
}
}
import "./ERC721EnumerableMockUpgradeable.sol";
contract ERC721EnumerableMockUpgradeableWithInit is ERC721EnumerableMockUpgradeable {
constructor(string memory name, string memory symbol) public payable {
__ERC721EnumerableMock_init(name, symbol);
}
}
import "./ERC165CheckerMockUpgradeable.sol";
contract ERC165CheckerMockUpgradeableWithInit is ERC165CheckerMockUpgradeable {
constructor() public payable {
__ERC165CheckerMock_init();
}
}
import "./ERC165/ERC165InterfacesSupportedUpgradeable.sol";
contract SupportsInterfaceWithLookupMockUpgradeableWithInit is SupportsInterfaceWithLookupMockUpgradeable { contract ClonesMockUpgradeableWithInit is ClonesMockUpgradeable {
constructor() public payable { constructor() public payable {
__SupportsInterfaceWithLookupMock_init(); __ClonesMock_init();
}
}
import "./ERC165/ERC165InterfacesSupportedUpgradeable.sol";
contract ERC165InterfacesSupportedUpgradeableWithInit is ERC165InterfacesSupportedUpgradeable {
constructor(bytes4[] memory interfaceIds) public payable {
__ERC165InterfacesSupported_init(interfaceIds);
} }
} }
import "../token/ERC1155/utils/ERC1155HolderUpgradeable.sol"; import "./AddressImplUpgradeable.sol";
contract ERC1155HolderUpgradeableWithInit is ERC1155HolderUpgradeable { contract AddressImplUpgradeableWithInit is AddressImplUpgradeable {
constructor() public payable { constructor() public payable {
__ERC1155Holder_init(); __AddressImpl_init();
} }
} }
import "./ERC165StorageMockUpgradeable.sol"; import "../finance/PaymentSplitterUpgradeable.sol";
contract ERC165StorageMockUpgradeableWithInit is ERC165StorageMockUpgradeable { contract PaymentSplitterUpgradeableWithInit is PaymentSplitterUpgradeable {
constructor() public payable { constructor(address[] memory payees, uint256[] memory shares_) public payable {
__ERC165StorageMock_init(); __PaymentSplitter_init(payees, shares_);
} }
} }
import "./ERC165MockUpgradeable.sol"; import "./SafeMathMockUpgradeable.sol";
contract ERC165MockUpgradeableWithInit is ERC165MockUpgradeable { contract SafeMathMockUpgradeableWithInit is SafeMathMockUpgradeable {
constructor() public payable { constructor() public payable {
__ERC165Mock_init(); __SafeMathMock_init();
} }
} }
import "./ERC1155BurnableMockUpgradeable.sol"; import "./ERC1155BurnableMockUpgradeable.sol";
...@@ -328,18 +323,18 @@ contract ERC1155BurnableMockUpgradeableWithInit is ERC1155BurnableMockUpgradeabl ...@@ -328,18 +323,18 @@ contract ERC1155BurnableMockUpgradeableWithInit is ERC1155BurnableMockUpgradeabl
__ERC1155BurnableMock_init(uri); __ERC1155BurnableMock_init(uri);
} }
} }
import "./ERC721PausableMockUpgradeable.sol"; import "../token/ERC1155/utils/ERC1155HolderUpgradeable.sol";
contract ERC721PausableMockUpgradeableWithInit is ERC721PausableMockUpgradeable { contract ERC1155HolderUpgradeableWithInit is ERC1155HolderUpgradeable {
constructor(string memory name, string memory symbol) public payable { constructor() public payable {
__ERC721PausableMock_init(name, symbol); __ERC1155Holder_init();
} }
} }
import "./ERC721MockUpgradeable.sol"; import "./ERC721EnumerableMockUpgradeable.sol";
contract ERC721MockUpgradeableWithInit is ERC721MockUpgradeable { contract ERC721EnumerableMockUpgradeableWithInit is ERC721EnumerableMockUpgradeable {
constructor(string memory name, string memory symbol) public payable { constructor(string memory name, string memory symbol) public payable {
__ERC721Mock_init(name, symbol); __ERC721EnumerableMock_init(name, symbol);
} }
} }
import "./StringsMockUpgradeable.sol"; import "./StringsMockUpgradeable.sol";
...@@ -370,18 +365,23 @@ contract ERC721BurnableMockUpgradeableWithInit is ERC721BurnableMockUpgradeable ...@@ -370,18 +365,23 @@ contract ERC721BurnableMockUpgradeableWithInit is ERC721BurnableMockUpgradeable
__ERC721BurnableMock_init(name, symbol); __ERC721BurnableMock_init(name, symbol);
} }
} }
import "./ClonesMockUpgradeable.sol"; import "./ERC721PausableMockUpgradeable.sol";
contract ClonesMockUpgradeableWithInit is ClonesMockUpgradeable { contract ERC721PausableMockUpgradeableWithInit is ERC721PausableMockUpgradeable {
constructor() public payable { constructor(string memory name, string memory symbol) public payable {
__ClonesMock_init(); __ERC721PausableMock_init(name, symbol);
} }
} }
import "./AddressImplUpgradeable.sol"; import "./ERC20PausableMockUpgradeable.sol";
contract AddressImplUpgradeableWithInit is AddressImplUpgradeable { contract ERC20PausableMockUpgradeableWithInit is ERC20PausableMockUpgradeable {
constructor() public payable { constructor(
__AddressImpl_init(); string memory name,
string memory symbol,
address initialAccount,
uint256 initialBalance
) public payable {
__ERC20PausableMock_init(name, symbol, initialAccount, initialBalance);
} }
} }
import "./ReentrancyAttackUpgradeable.sol"; import "./ReentrancyAttackUpgradeable.sol";
......
...@@ -40,3 +40,7 @@ CAUTION: Using upgradeable proxies correctly and securely is a difficult task th ...@@ -40,3 +40,7 @@ CAUTION: Using upgradeable proxies correctly and securely is a difficult task th
== Minimal Clones == Minimal Clones
{{Clones}} {{Clones}}
== Utils
{{Initializable}}
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
// solhint-disable-next-line compiler-version // solhint-disable-next-line compiler-version
pragma solidity ^0.8.0; 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 * @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 @@ ...@@ -3,7 +3,7 @@
pragma solidity ^0.8.0; pragma solidity ^0.8.0;
import "../utils/ContextUpgradeable.sol"; import "../utils/ContextUpgradeable.sol";
import "../utils/Initializable.sol"; import "../proxy/utils/Initializable.sol";
/** /**
* @dev Contract module which allows children to implement an emergency stop * @dev Contract module which allows children to implement an emergency stop
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
pragma solidity ^0.8.0; pragma solidity ^0.8.0;
import "../utils/escrow/EscrowUpgradeable.sol"; import "../utils/escrow/EscrowUpgradeable.sol";
import "../utils/Initializable.sol"; import "../proxy/utils/Initializable.sol";
/** /**
* @dev Simple implementation of a * @dev Simple implementation of a
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity ^0.8.0; 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. * @dev Contract module that helps prevent reentrant calls to a function.
......
...@@ -8,7 +8,7 @@ import "./extensions/IERC1155MetadataURIUpgradeable.sol"; ...@@ -8,7 +8,7 @@ import "./extensions/IERC1155MetadataURIUpgradeable.sol";
import "../../utils/AddressUpgradeable.sol"; import "../../utils/AddressUpgradeable.sol";
import "../../utils/ContextUpgradeable.sol"; import "../../utils/ContextUpgradeable.sol";
import "../../utils/introspection/ERC165Upgradeable.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 ...@@ -62,7 +62,7 @@ contract ERC1155Upgradeable is Initializable, ContextUpgradeable, ERC165Upgradea
* Clients calling this function must replace the `\{id\}` substring with the * Clients calling this function must replace the `\{id\}` substring with the
* actual token type ID. * 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; return _uri;
} }
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
pragma solidity ^0.8.0; pragma solidity ^0.8.0;
import "../ERC1155Upgradeable.sol"; import "../ERC1155Upgradeable.sol";
import "../../../utils/Initializable.sol"; import "../../../proxy/utils/Initializable.sol";
/** /**
* @dev Extension of {ERC1155} that allows token holders to destroy both their * @dev Extension of {ERC1155} that allows token holders to destroy both their
......
...@@ -4,7 +4,7 @@ pragma solidity ^0.8.0; ...@@ -4,7 +4,7 @@ pragma solidity ^0.8.0;
import "../ERC1155Upgradeable.sol"; import "../ERC1155Upgradeable.sol";
import "../../../security/PausableUpgradeable.sol"; import "../../../security/PausableUpgradeable.sol";
import "../../../utils/Initializable.sol"; import "../../../proxy/utils/Initializable.sol";
/** /**
* @dev ERC1155 token with pausable token transfers, minting and burning. * @dev ERC1155 token with pausable token transfers, minting and burning.
......
...@@ -7,7 +7,7 @@ import "../extensions/ERC1155BurnableUpgradeable.sol"; ...@@ -7,7 +7,7 @@ import "../extensions/ERC1155BurnableUpgradeable.sol";
import "../extensions/ERC1155PausableUpgradeable.sol"; import "../extensions/ERC1155PausableUpgradeable.sol";
import "../../../access/AccessControlEnumerableUpgradeable.sol"; import "../../../access/AccessControlEnumerableUpgradeable.sol";
import "../../../utils/ContextUpgradeable.sol"; import "../../../utils/ContextUpgradeable.sol";
import "../../../utils/Initializable.sol"; import "../../../proxy/utils/Initializable.sol";
/** /**
* @dev {ERC1155} token, including: * @dev {ERC1155} token, including:
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
pragma solidity ^0.8.0; pragma solidity ^0.8.0;
import "./ERC1155ReceiverUpgradeable.sol"; import "./ERC1155ReceiverUpgradeable.sol";
import "../../../utils/Initializable.sol"; import "../../../proxy/utils/Initializable.sol";
/** /**
* @dev _Available since v3.1._ * @dev _Available since v3.1._
......
...@@ -4,7 +4,7 @@ pragma solidity ^0.8.0; ...@@ -4,7 +4,7 @@ pragma solidity ^0.8.0;
import "../IERC1155ReceiverUpgradeable.sol"; import "../IERC1155ReceiverUpgradeable.sol";
import "../../../utils/introspection/ERC165Upgradeable.sol"; import "../../../utils/introspection/ERC165Upgradeable.sol";
import "../../../utils/Initializable.sol"; import "../../../proxy/utils/Initializable.sol";
/** /**
* @dev _Available since v3.1._ * @dev _Available since v3.1._
......
...@@ -3,8 +3,9 @@ ...@@ -3,8 +3,9 @@
pragma solidity ^0.8.0; pragma solidity ^0.8.0;
import "./IERC20Upgradeable.sol"; import "./IERC20Upgradeable.sol";
import "./extensions/IERC20MetadataUpgradeable.sol";
import "../../utils/ContextUpgradeable.sol"; import "../../utils/ContextUpgradeable.sol";
import "../../utils/Initializable.sol"; import "../../proxy/utils/Initializable.sol";
/** /**
* @dev Implementation of the {IERC20} interface. * @dev Implementation of the {IERC20} interface.
...@@ -30,7 +31,7 @@ import "../../utils/Initializable.sol"; ...@@ -30,7 +31,7 @@ import "../../utils/Initializable.sol";
* functions have been added to mitigate the well-known issues around setting * functions have been added to mitigate the well-known issues around setting
* allowances. See {IERC20-approve}. * allowances. See {IERC20-approve}.
*/ */
contract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable { contract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable, IERC20MetadataUpgradeable {
mapping (address => uint256) private _balances; mapping (address => uint256) private _balances;
mapping (address => mapping (address => uint256)) private _allowances; mapping (address => mapping (address => uint256)) private _allowances;
...@@ -62,7 +63,7 @@ contract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeabl ...@@ -62,7 +63,7 @@ contract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeabl
/** /**
* @dev Returns the name of the token. * @dev Returns the name of the token.
*/ */
function name() public view virtual returns (string memory) { function name() public view virtual override returns (string memory) {
return _name; return _name;
} }
...@@ -70,7 +71,7 @@ contract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeabl ...@@ -70,7 +71,7 @@ contract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeabl
* @dev Returns the symbol of the token, usually a shorter version of the * @dev Returns the symbol of the token, usually a shorter version of the
* name. * name.
*/ */
function symbol() public view virtual returns (string memory) { function symbol() public view virtual override returns (string memory) {
return _symbol; return _symbol;
} }
...@@ -87,7 +88,7 @@ contract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeabl ...@@ -87,7 +88,7 @@ contract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeabl
* no way affects any of the arithmetic of the contract, including * no way affects any of the arithmetic of the contract, including
* {IERC20-balanceOf} and {IERC20-transfer}. * {IERC20-balanceOf} and {IERC20-transfer}.
*/ */
function decimals() public view virtual returns (uint8) { function decimals() public view virtual override returns (uint8) {
return 18; return 18;
} }
......
...@@ -10,6 +10,7 @@ TIP: For an overview of ERC20 tokens and a walk through on how to create a token ...@@ -10,6 +10,7 @@ TIP: For an overview of ERC20 tokens and a walk through on how to create a token
There a few core contracts that implement the behavior specified in the EIP: There a few core contracts that implement the behavior specified in the EIP:
* {IERC20}: the interface all ERC20 implementations should conform to. * {IERC20}: the interface all ERC20 implementations should conform to.
* {IERC20Metadata}: the extended ERC20 interface including the <<ERC20-name,`name`>>, <<ERC20-symbol,`symbol`>> and <<ERC20-decimals,`decimals`>> functions.
* {ERC20}: the implementation of the ERC20 interface, including the <<ERC20-name,`name`>>, <<ERC20-symbol,`symbol`>> and <<ERC20-decimals,`decimals`>> optional standard extension to the base interface. * {ERC20}: the implementation of the ERC20 interface, including the <<ERC20-name,`name`>>, <<ERC20-symbol,`symbol`>> and <<ERC20-decimals,`decimals`>> optional standard extension to the base interface.
Additionally there are multiple custom extensions, including: Additionally there are multiple custom extensions, including:
...@@ -36,6 +37,8 @@ NOTE: This core set of contracts is designed to be unopinionated, allowing devel ...@@ -36,6 +37,8 @@ NOTE: This core set of contracts is designed to be unopinionated, allowing devel
{{IERC20}} {{IERC20}}
{{IERC20Metadata}}
{{ERC20}} {{ERC20}}
== Extensions == Extensions
......
...@@ -4,7 +4,7 @@ pragma solidity ^0.8.0; ...@@ -4,7 +4,7 @@ pragma solidity ^0.8.0;
import "../ERC20Upgradeable.sol"; import "../ERC20Upgradeable.sol";
import "../../../utils/ContextUpgradeable.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 * @dev Extension of {ERC20} that allows token holders to destroy both their own
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
pragma solidity ^0.8.0; pragma solidity ^0.8.0;
import "../ERC20Upgradeable.sol"; 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. * @dev Extension of {ERC20} that adds a cap to the supply of tokens.
......
...@@ -4,7 +4,7 @@ pragma solidity ^0.8.0; ...@@ -4,7 +4,7 @@ pragma solidity ^0.8.0;
import "../ERC20Upgradeable.sol"; import "../ERC20Upgradeable.sol";
import "../../../security/PausableUpgradeable.sol"; import "../../../security/PausableUpgradeable.sol";
import "../../../utils/Initializable.sol"; import "../../../proxy/utils/Initializable.sol";
/** /**
* @dev ERC20 token with pausable token transfers, minting and burning. * @dev ERC20 token with pausable token transfers, minting and burning.
......
...@@ -5,7 +5,7 @@ pragma solidity ^0.8.0; ...@@ -5,7 +5,7 @@ pragma solidity ^0.8.0;
import "../ERC20Upgradeable.sol"; import "../ERC20Upgradeable.sol";
import "../../../utils/ArraysUpgradeable.sol"; import "../../../utils/ArraysUpgradeable.sol";
import "../../../utils/CountersUpgradeable.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 * @dev This contract extends an ERC20 token with a snapshot mechanism. When a snapshot is created, the balances and
......
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "../IERC20Upgradeable.sol";
/**
* @dev Interface for the optional metadata functions from the ERC20 standard.
*/
interface IERC20MetadataUpgradeable is IERC20Upgradeable {
/**
* @dev Returns the name of the token.
*/
function name() external view returns (string memory);
/**
* @dev Returns the symbol of the token.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the decimals places of the token.
*/
function decimals() external view returns (uint8);
}
...@@ -7,7 +7,7 @@ import "../ERC20Upgradeable.sol"; ...@@ -7,7 +7,7 @@ import "../ERC20Upgradeable.sol";
import "../../../utils/cryptography/draft-EIP712Upgradeable.sol"; import "../../../utils/cryptography/draft-EIP712Upgradeable.sol";
import "../../../utils/cryptography/ECDSAUpgradeable.sol"; import "../../../utils/cryptography/ECDSAUpgradeable.sol";
import "../../../utils/CountersUpgradeable.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 * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
...@@ -55,7 +55,7 @@ abstract contract ERC20PermitUpgradeable is Initializable, ERC20Upgradeable, IER ...@@ -55,7 +55,7 @@ abstract contract ERC20PermitUpgradeable is Initializable, ERC20Upgradeable, IER
owner, owner,
spender, spender,
value, value,
_nonces[owner].current(), _useNonce(owner),
deadline deadline
) )
); );
...@@ -65,14 +65,13 @@ abstract contract ERC20PermitUpgradeable is Initializable, ERC20Upgradeable, IER ...@@ -65,14 +65,13 @@ abstract contract ERC20PermitUpgradeable is Initializable, ERC20Upgradeable, IER
address signer = ECDSAUpgradeable.recover(hash, v, r, s); address signer = ECDSAUpgradeable.recover(hash, v, r, s);
require(signer == owner, "ERC20Permit: invalid signature"); require(signer == owner, "ERC20Permit: invalid signature");
_nonces[owner].increment();
_approve(owner, spender, value); _approve(owner, spender, value);
} }
/** /**
* @dev See {IERC20Permit-nonces}. * @dev See {IERC20Permit-nonces}.
*/ */
function nonces(address owner) public view override returns (uint256) { function nonces(address owner) public view virtual override returns (uint256) {
return _nonces[owner].current(); return _nonces[owner].current();
} }
...@@ -83,5 +82,14 @@ abstract contract ERC20PermitUpgradeable is Initializable, ERC20Upgradeable, IER ...@@ -83,5 +82,14 @@ abstract contract ERC20PermitUpgradeable is Initializable, ERC20Upgradeable, IER
function DOMAIN_SEPARATOR() external view override returns (bytes32) { function DOMAIN_SEPARATOR() external view override returns (bytes32) {
return _domainSeparatorV4(); return _domainSeparatorV4();
} }
/**
* @dev "Consume a nonce": return the current value and increment.
*/
function _useNonce(address owner) internal virtual returns (uint256 current) {
CountersUpgradeable.Counter storage nonce = _nonces[owner];
current = nonce.current();
nonce.increment();
}
uint256[49] private __gap; uint256[49] private __gap;
} }
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
pragma solidity ^0.8.0; pragma solidity ^0.8.0;
import "../extensions/ERC20BurnableUpgradeable.sol"; import "../extensions/ERC20BurnableUpgradeable.sol";
import "../../../utils/Initializable.sol"; import "../../../proxy/utils/Initializable.sol";
/** /**
* @dev {ERC20} token, including: * @dev {ERC20} token, including:
......
...@@ -7,7 +7,7 @@ import "../extensions/ERC20BurnableUpgradeable.sol"; ...@@ -7,7 +7,7 @@ import "../extensions/ERC20BurnableUpgradeable.sol";
import "../extensions/ERC20PausableUpgradeable.sol"; import "../extensions/ERC20PausableUpgradeable.sol";
import "../../../access/AccessControlEnumerableUpgradeable.sol"; import "../../../access/AccessControlEnumerableUpgradeable.sol";
import "../../../utils/ContextUpgradeable.sol"; import "../../../utils/ContextUpgradeable.sol";
import "../../../utils/Initializable.sol"; import "../../../proxy/utils/Initializable.sol";
/** /**
* @dev {ERC20} token, including: * @dev {ERC20} token, including:
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
pragma solidity ^0.8.0; pragma solidity ^0.8.0;
import "./SafeERC20Upgradeable.sol"; 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 * @dev A token holder contract that will allow a beneficiary to extract the
......
...@@ -10,7 +10,7 @@ import "../../utils/AddressUpgradeable.sol"; ...@@ -10,7 +10,7 @@ import "../../utils/AddressUpgradeable.sol";
import "../../utils/ContextUpgradeable.sol"; import "../../utils/ContextUpgradeable.sol";
import "../../utils/StringsUpgradeable.sol"; import "../../utils/StringsUpgradeable.sol";
import "../../utils/introspection/ERC165Upgradeable.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 * @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 ...@@ -230,7 +230,7 @@ contract ERC721Upgradeable is Initializable, ContextUpgradeable, ERC165Upgradeab
* @dev Safely mints `tokenId` and transfers it to `to`. * @dev Safely mints `tokenId` and transfers it to `to`.
* *
* Requirements: * Requirements:
d* *
* - `tokenId` must not exist. * - `tokenId` must not exist.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
* *
......
...@@ -4,7 +4,7 @@ pragma solidity ^0.8.0; ...@@ -4,7 +4,7 @@ pragma solidity ^0.8.0;
import "../ERC721Upgradeable.sol"; import "../ERC721Upgradeable.sol";
import "../../../utils/ContextUpgradeable.sol"; import "../../../utils/ContextUpgradeable.sol";
import "../../../utils/Initializable.sol"; import "../../../proxy/utils/Initializable.sol";
/** /**
* @title ERC721 Burnable Token * @title ERC721 Burnable Token
......
...@@ -4,7 +4,7 @@ pragma solidity ^0.8.0; ...@@ -4,7 +4,7 @@ pragma solidity ^0.8.0;
import "../ERC721Upgradeable.sol"; import "../ERC721Upgradeable.sol";
import "./IERC721EnumerableUpgradeable.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 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
......
...@@ -4,7 +4,7 @@ pragma solidity ^0.8.0; ...@@ -4,7 +4,7 @@ pragma solidity ^0.8.0;
import "../ERC721Upgradeable.sol"; import "../ERC721Upgradeable.sol";
import "../../../security/PausableUpgradeable.sol"; import "../../../security/PausableUpgradeable.sol";
import "../../../utils/Initializable.sol"; import "../../../proxy/utils/Initializable.sol";
/** /**
* @dev ERC721 token with pausable token transfers, minting and burning. * @dev ERC721 token with pausable token transfers, minting and burning.
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
pragma solidity ^0.8.0; pragma solidity ^0.8.0;
import "../ERC721Upgradeable.sol"; import "../ERC721Upgradeable.sol";
import "../../../utils/Initializable.sol"; import "../../../proxy/utils/Initializable.sol";
/** /**
* @dev ERC721 token with storage based token uri management. * @dev ERC721 token with storage based token uri management.
......
...@@ -9,7 +9,7 @@ import "../extensions/ERC721PausableUpgradeable.sol"; ...@@ -9,7 +9,7 @@ import "../extensions/ERC721PausableUpgradeable.sol";
import "../../../access/AccessControlEnumerableUpgradeable.sol"; import "../../../access/AccessControlEnumerableUpgradeable.sol";
import "../../../utils/ContextUpgradeable.sol"; import "../../../utils/ContextUpgradeable.sol";
import "../../../utils/CountersUpgradeable.sol"; import "../../../utils/CountersUpgradeable.sol";
import "../../../utils/Initializable.sol"; import "../../../proxy/utils/Initializable.sol";
/** /**
* @dev {ERC721} token, including: * @dev {ERC721} token, including:
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
pragma solidity ^0.8.0; pragma solidity ^0.8.0;
import "../IERC721ReceiverUpgradeable.sol"; import "../IERC721ReceiverUpgradeable.sol";
import "../../../utils/Initializable.sol"; import "../../../proxy/utils/Initializable.sol";
/** /**
* @dev Implementation of the {IERC721Receiver} interface. * @dev Implementation of the {IERC721Receiver} interface.
......
...@@ -9,7 +9,7 @@ import "../ERC20/IERC20Upgradeable.sol"; ...@@ -9,7 +9,7 @@ import "../ERC20/IERC20Upgradeable.sol";
import "../../utils/AddressUpgradeable.sol"; import "../../utils/AddressUpgradeable.sol";
import "../../utils/ContextUpgradeable.sol"; import "../../utils/ContextUpgradeable.sol";
import "../../utils/introspection/IERC1820RegistryUpgradeable.sol"; import "../../utils/introspection/IERC1820RegistryUpgradeable.sol";
import "../../utils/Initializable.sol"; import "../../proxy/utils/Initializable.sol";
/** /**
* @dev Implementation of the {IERC777} interface. * @dev Implementation of the {IERC777} interface.
...@@ -323,6 +323,37 @@ contract ERC777Upgradeable is Initializable, ContextUpgradeable, IERC777Upgradea ...@@ -323,6 +323,37 @@ contract ERC777Upgradeable is Initializable, ContextUpgradeable, IERC777Upgradea
internal internal
virtual virtual
{ {
_mint(account, amount, userData, operatorData, true);
}
/**
* @dev Creates `amount` tokens and assigns them to `account`, increasing
* the total supply.
*
* If `requireReceptionAck` is set to true, and if a send hook is
* registered for `account`, the corresponding function will be called with
* `operator`, `data` and `operatorData`.
*
* See {IERC777Sender} and {IERC777Recipient}.
*
* Emits {Minted} and {IERC20-Transfer} events.
*
* Requirements
*
* - `account` cannot be the zero address.
* - if `account` is a contract, it must implement the {IERC777Recipient}
* interface.
*/
function _mint(
address account,
uint256 amount,
bytes memory userData,
bytes memory operatorData,
bool requireReceptionAck
)
internal
virtual
{
require(account != address(0), "ERC777: mint to the zero address"); require(account != address(0), "ERC777: mint to the zero address");
address operator = _msgSender(); address operator = _msgSender();
...@@ -333,7 +364,7 @@ contract ERC777Upgradeable is Initializable, ContextUpgradeable, IERC777Upgradea ...@@ -333,7 +364,7 @@ contract ERC777Upgradeable is Initializable, ContextUpgradeable, IERC777Upgradea
_totalSupply += amount; _totalSupply += amount;
_balances[account] += amount; _balances[account] += amount;
_callTokensReceived(operator, address(0), account, amount, userData, operatorData, true); _callTokensReceived(operator, address(0), account, amount, userData, operatorData, requireReceptionAck);
emit Minted(operator, account, amount, userData, operatorData); emit Minted(operator, account, amount, userData, operatorData);
emit Transfer(address(0), account, amount); emit Transfer(address(0), account, amount);
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
pragma solidity ^0.8.0; pragma solidity ^0.8.0;
import "../ERC777Upgradeable.sol"; import "../ERC777Upgradeable.sol";
import "../../../utils/Initializable.sol"; import "../../../proxy/utils/Initializable.sol";
/** /**
* @dev {ERC777} token, including: * @dev {ERC777} token, including:
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity ^0.8.0; pragma solidity ^0.8.0;
import "./Initializable.sol"; import "../proxy/utils/Initializable.sol";
/* /*
* @dev Provides information about the current execution context, including the * @dev Provides information about the current execution context, including the
......
...@@ -40,6 +40,14 @@ Finally, {Create2} contains all necessary utilities to safely use the https://bl ...@@ -40,6 +40,14 @@ Finally, {Create2} contains all necessary utilities to safely use the https://bl
{{EIP712}} {{EIP712}}
== Escrow
{{ConditionalEscrow}}
{{Escrow}}
{{RefundEscrow}}
== Introspection == Introspection
This set of interfaces and contracts deal with https://en.wikipedia.org/wiki/Type_introspection[type introspection] of contracts, that is, examining which functions can be called on them. This is usually referred to as a contract's _interface_. This set of interfaces and contracts deal with https://en.wikipedia.org/wiki/Type_introspection[type introspection] of contracts, that is, examining which functions can be called on them. This is usually referred to as a contract's _interface_.
...@@ -84,7 +92,3 @@ Note that, in all cases, accounts simply _declare_ their interfaces, but they ar ...@@ -84,7 +92,3 @@ Note that, in all cases, accounts simply _declare_ their interfaces, but they ar
{{Counters}} {{Counters}}
{{Strings}} {{Strings}}
== Other
{{Initializable}}
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
pragma solidity ^0.8.0; pragma solidity ^0.8.0;
import "./ECDSAUpgradeable.sol"; import "./ECDSAUpgradeable.sol";
import "../Initializable.sol"; import "../../proxy/utils/Initializable.sol";
/** /**
* @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data. * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
pragma solidity ^0.8.0; pragma solidity ^0.8.0;
import "./EscrowUpgradeable.sol"; import "./EscrowUpgradeable.sol";
import "../Initializable.sol"; import "../../proxy/utils/Initializable.sol";
/** /**
* @title ConditionalEscrow * @title ConditionalEscrow
......
...@@ -4,7 +4,7 @@ pragma solidity ^0.8.0; ...@@ -4,7 +4,7 @@ pragma solidity ^0.8.0;
import "../../access/OwnableUpgradeable.sol"; import "../../access/OwnableUpgradeable.sol";
import "../AddressUpgradeable.sol"; import "../AddressUpgradeable.sol";
import "../Initializable.sol"; import "../../proxy/utils/Initializable.sol";
/** /**
* @title Escrow * @title Escrow
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
pragma solidity ^0.8.0; pragma solidity ^0.8.0;
import "./ConditionalEscrowUpgradeable.sol"; import "./ConditionalEscrowUpgradeable.sol";
import "../Initializable.sol"; import "../../proxy/utils/Initializable.sol";
/** /**
* @title RefundEscrow * @title RefundEscrow
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
pragma solidity ^0.8.0; pragma solidity ^0.8.0;
import "./ERC165Upgradeable.sol"; import "./ERC165Upgradeable.sol";
import "../Initializable.sol"; import "../../proxy/utils/Initializable.sol";
/** /**
* @dev Storage based implementation of the {IERC165} interface. * @dev Storage based implementation of the {IERC165} interface.
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
pragma solidity ^0.8.0; pragma solidity ^0.8.0;
import "./IERC165Upgradeable.sol"; import "./IERC165Upgradeable.sol";
import "../Initializable.sol"; import "../../proxy/utils/Initializable.sol";
/** /**
* @dev Implementation of the {IERC165} interface. * @dev Implementation of the {IERC165} interface.
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
pragma solidity ^0.8.0; pragma solidity ^0.8.0;
import "./IERC1820ImplementerUpgradeable.sol"; import "./IERC1820ImplementerUpgradeable.sol";
import "../Initializable.sol"; import "../../proxy/utils/Initializable.sol";
/** /**
* @dev Implementation of the {IERC1820Implementer} interface. * @dev Implementation of the {IERC1820Implementer} interface.
......
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -67,8 +67,10 @@ ...@@ -67,8 +67,10 @@
"ethereumjs-wallet": "^1.0.1", "ethereumjs-wallet": "^1.0.1",
"hardhat": "^2.0.6", "hardhat": "^2.0.6",
"hardhat-gas-reporter": "^1.0.4", "hardhat-gas-reporter": "^1.0.4",
"keccak256": "^1.0.2",
"lodash.startcase": "^4.4.0", "lodash.startcase": "^4.4.0",
"lodash.zip": "^4.2.0", "lodash.zip": "^4.2.0",
"merkletreejs": "^0.2.13",
"micromatch": "^4.0.2", "micromatch": "^4.0.2",
"mocha": "^8.0.1", "mocha": "^8.0.1",
"rimraf": "^3.0.2", "rimraf": "^3.0.2",
...@@ -76,6 +78,5 @@ ...@@ -76,6 +78,5 @@
"solidity-coverage": "^0.7.11", "solidity-coverage": "^0.7.11",
"solidity-docgen": "^0.5.3", "solidity-docgen": "^0.5.3",
"web3": "^1.3.0" "web3": "^1.3.0"
}, }
"dependencies": {}
} }
...@@ -30,7 +30,8 @@ const pathUpdates = { ...@@ -30,7 +30,8 @@ const pathUpdates = {
'payment/escrow/ConditionalEscrow.sol': 'utils/escrow/ConditionalEscrow.sol', 'payment/escrow/ConditionalEscrow.sol': 'utils/escrow/ConditionalEscrow.sol',
'payment/escrow/Escrow.sol': 'utils/escrow/Escrow.sol', 'payment/escrow/Escrow.sol': 'utils/escrow/Escrow.sol',
'payment/escrow/RefundEscrow.sol': 'utils/escrow/RefundEscrow.sol', 'payment/escrow/RefundEscrow.sol': 'utils/escrow/RefundEscrow.sol',
'payment/PaymentSplitter.sol': 'utils/PaymentSplitter.sol', 'payment/PaymentSplitter.sol': 'finance/PaymentSplitter.sol',
'utils/PaymentSplitter.sol': 'finance/PaymentSplitter.sol',
'payment/PullPayment.sol': 'security/PullPayment.sol', 'payment/PullPayment.sol': 'security/PullPayment.sol',
'presets/ERC1155PresetMinterPauser.sol': 'token/ERC1155/presets/ERC1155PresetMinterPauser.sol', 'presets/ERC1155PresetMinterPauser.sol': 'token/ERC1155/presets/ERC1155PresetMinterPauser.sol',
'presets/ERC20PresetFixedSupply.sol': 'token/ERC20/presets/ERC20PresetFixedSupply.sol', 'presets/ERC20PresetFixedSupply.sol': 'token/ERC20/presets/ERC20PresetFixedSupply.sol',
...@@ -40,7 +41,8 @@ const pathUpdates = { ...@@ -40,7 +41,8 @@ const pathUpdates = {
// 'proxy/BeaconProxy.sol': 'proxy/beacon/BeaconProxy.sol', // 'proxy/BeaconProxy.sol': 'proxy/beacon/BeaconProxy.sol',
// 'proxy/Clones.sol': undefined, // 'proxy/Clones.sol': undefined,
// 'proxy/IBeacon.sol': 'proxy/beacon/IBeacon.sol', // 'proxy/IBeacon.sol': 'proxy/beacon/IBeacon.sol',
'proxy/Initializable.sol': 'utils/Initializable.sol', 'proxy/Initializable.sol': 'proxy/utils/Initializable.sol',
'utils/Initializable.sol': 'proxy/utils/Initializable.sol',
// 'proxy/ProxyAdmin.sol': 'proxy/transparent/ProxyAdmin.sol', // 'proxy/ProxyAdmin.sol': 'proxy/transparent/ProxyAdmin.sol',
// 'proxy/Proxy.sol': undefined, // 'proxy/Proxy.sol': undefined,
// 'proxy/TransparentUpgradeableProxy.sol': 'proxy/transparent/TransparentUpgradeableProxy.sol', // 'proxy/TransparentUpgradeableProxy.sol': 'proxy/transparent/TransparentUpgradeableProxy.sol',
......
...@@ -9,7 +9,7 @@ npm run compile ...@@ -9,7 +9,7 @@ npm run compile
# -x: exclude all proxy contracts except Clones library # -x: exclude all proxy contracts except Clones library
# -p: emit public initializer # -p: emit public initializer
npx @openzeppelin/upgrade-safe-transpiler -D \ npx @openzeppelin/upgrade-safe-transpiler -D \
-i contracts/utils/Initializable.sol \ -i contracts/proxy/utils/Initializable.sol \
-x 'contracts/proxy/**/*' \ -x 'contracts/proxy/**/*' \
-x '!contracts/proxy/Clones.sol' \ -x '!contracts/proxy/Clones.sol' \
-p 'contracts/**/presets/**/*' -p 'contracts/**/presets/**/*'
......
...@@ -179,6 +179,13 @@ function shouldBehaveLikeAccessControlEnumerable (errorPrefix, admin, authorized ...@@ -179,6 +179,13 @@ function shouldBehaveLikeAccessControlEnumerable (errorPrefix, admin, authorized
expect(bearers).to.have.members([authorized, otherAuthorized]); expect(bearers).to.have.members([authorized, otherAuthorized]);
}); });
it('role enumeration should be in sync after renounceRole call', async function () {
expect(await this.accessControl.getRoleMemberCount(ROLE)).to.bignumber.equal('0');
await this.accessControl.grantRole(ROLE, admin, { from: admin });
expect(await this.accessControl.getRoleMemberCount(ROLE)).to.bignumber.equal('1');
await this.accessControl.renounceRole(ROLE, admin, { from: admin });
expect(await this.accessControl.getRoleMemberCount(ROLE)).to.bignumber.equal('0');
});
}); });
} }
......
const { keccak256, keccakFromString, bufferToHex } = require('ethereumjs-util');
class MerkleTree {
constructor (elements) {
// Filter empty strings and hash elements
this.elements = elements.filter(el => el).map(el => keccakFromString(el));
// Sort elements
this.elements.sort(Buffer.compare);
// Deduplicate elements
this.elements = this.bufDedup(this.elements);
// Create layers
this.layers = this.getLayers(this.elements);
}
getLayers (elements) {
if (elements.length === 0) {
return [['']];
}
const layers = [];
layers.push(elements);
// Get next layer until we reach the root
while (layers[layers.length - 1].length > 1) {
layers.push(this.getNextLayer(layers[layers.length - 1]));
}
return layers;
}
getNextLayer (elements) {
return elements.reduce((layer, el, idx, arr) => {
if (idx % 2 === 0) {
// Hash the current element with its pair element
layer.push(this.combinedHash(el, arr[idx + 1]));
}
return layer;
}, []);
}
combinedHash (first, second) {
if (!first) { return second; }
if (!second) { return first; }
return keccak256(this.sortAndConcat(first, second));
}
getRoot () {
return this.layers[this.layers.length - 1][0];
}
getHexRoot () {
return bufferToHex(this.getRoot());
}
getProof (el) {
let idx = this.bufIndexOf(el, this.elements);
if (idx === -1) {
throw new Error('Element does not exist in Merkle tree');
}
return this.layers.reduce((proof, layer) => {
const pairElement = this.getPairElement(idx, layer);
if (pairElement) {
proof.push(pairElement);
}
idx = Math.floor(idx / 2);
return proof;
}, []);
}
getHexProof (el) {
const proof = this.getProof(el);
return this.bufArrToHexArr(proof);
}
getPairElement (idx, layer) {
const pairIdx = idx % 2 === 0 ? idx + 1 : idx - 1;
if (pairIdx < layer.length) {
return layer[pairIdx];
} else {
return null;
}
}
bufIndexOf (el, arr) {
let hash;
// Convert element to 32 byte hash if it is not one already
if (el.length !== 32 || !Buffer.isBuffer(el)) {
hash = keccakFromString(el);
} else {
hash = el;
}
for (let i = 0; i < arr.length; i++) {
if (hash.equals(arr[i])) {
return i;
}
}
return -1;
}
bufDedup (elements) {
return elements.filter((el, idx) => {
return idx === 0 || !elements[idx - 1].equals(el);
});
}
bufArrToHexArr (arr) {
if (arr.some(el => !Buffer.isBuffer(el))) {
throw new Error('Array is not an array of buffers');
}
return arr.map(el => '0x' + el.toString('hex'));
}
sortAndConcat (...args) {
return Buffer.concat([...args].sort(Buffer.compare));
}
}
module.exports = {
MerkleTree,
};
...@@ -171,6 +171,133 @@ contract('ERC777', function (accounts) { ...@@ -171,6 +171,133 @@ contract('ERC777', function (accounts) {
shouldBehaveLikeERC777InternalMint(to, operator, amount, data, operatorData); shouldBehaveLikeERC777InternalMint(to, operator, amount, data, operatorData);
}); });
}); });
describe('mint (internal extended)', function () {
const amount = new BN('5');
context('to anyone', function () {
beforeEach(async function () {
this.recipient = anyone;
});
context('with default operator', function () {
const operator = defaultOperatorA;
it('without requireReceptionAck', async function () {
await this.token.mintInternalExtended(
this.recipient,
amount,
data,
operatorData,
false,
{ from: operator },
);
});
it('with requireReceptionAck', async function () {
await this.token.mintInternalExtended(
this.recipient,
amount,
data,
operatorData,
true,
{ from: operator },
);
});
});
context('with non operator', function () {
const operator = newOperator;
it('without requireReceptionAck', async function () {
await this.token.mintInternalExtended(
this.recipient,
amount,
data,
operatorData,
false,
{ from: operator },
);
});
it('with requireReceptionAck', async function () {
await this.token.mintInternalExtended(
this.recipient,
amount,
data,
operatorData,
true,
{ from: operator },
);
});
});
});
context('to non ERC777TokensRecipient implementer', function () {
beforeEach(async function () {
this.tokensRecipientImplementer = await ERC777SenderRecipientMock.new();
this.recipient = this.tokensRecipientImplementer.address;
});
context('with default operator', function () {
const operator = defaultOperatorA;
it('without requireReceptionAck', async function () {
await this.token.mintInternalExtended(
this.recipient,
amount,
data,
operatorData,
false,
{ from: operator },
);
});
it('with requireReceptionAck', async function () {
await expectRevert(
this.token.mintInternalExtended(
this.recipient,
amount,
data,
operatorData,
true,
{ from: operator },
),
'ERC777: token recipient contract has no implementer for ERC777TokensRecipient',
);
});
});
context('with non operator', function () {
const operator = newOperator;
it('without requireReceptionAck', async function () {
await this.token.mintInternalExtended(
this.recipient,
amount,
data,
operatorData,
false,
{ from: operator },
);
});
it('with requireReceptionAck', async function () {
await expectRevert(
this.token.mintInternalExtended(
this.recipient,
amount,
data,
operatorData,
true,
{ from: operator },
),
'ERC777: token recipient contract has no implementer for ERC777TokensRecipient',
);
});
});
});
});
}); });
describe('operator management', function () { describe('operator management', function () {
......
require('@openzeppelin/test-helpers'); require('@openzeppelin/test-helpers');
const { MerkleTree } = require('../../helpers/merkleTree.js'); const { MerkleTree } = require('merkletreejs');
const { keccakFromString, bufferToHex } = require('ethereumjs-util'); const keccak256 = require('keccak256');
const { expect } = require('chai'); const { expect } = require('chai');
...@@ -15,43 +15,43 @@ contract('MerkleProof', function (accounts) { ...@@ -15,43 +15,43 @@ contract('MerkleProof', function (accounts) {
describe('verify', function () { describe('verify', function () {
it('returns true for a valid Merkle proof', async function () { it('returns true for a valid Merkle proof', async function () {
const elements = ['a', 'b', 'c', 'd']; const elements = ['a', 'b', 'c', 'd'];
const merkleTree = new MerkleTree(elements); const merkleTree = new MerkleTree(elements, keccak256, { hashLeaves: true });
const root = merkleTree.getHexRoot(); const root = merkleTree.getHexRoot();
const proof = merkleTree.getHexProof(elements[0]); const leaf = keccak256(elements[0]);
const leaf = bufferToHex(keccakFromString(elements[0])); const proof = merkleTree.getHexProof(leaf);
expect(await this.merkleProof.verify(proof, root, leaf)).to.equal(true); expect(await this.merkleProof.verify(proof, root, leaf)).to.equal(true);
}); });
it('returns false for an invalid Merkle proof', async function () { it('returns false for an invalid Merkle proof', async function () {
const correctElements = ['a', 'b', 'c']; const correctElements = ['a', 'b', 'c'];
const correctMerkleTree = new MerkleTree(correctElements); const correctMerkleTree = new MerkleTree(correctElements, keccak256, { hashLeaves: true });
const correctRoot = correctMerkleTree.getHexRoot(); const correctRoot = correctMerkleTree.getHexRoot();
const correctLeaf = bufferToHex(keccakFromString(correctElements[0])); const correctLeaf = keccak256(correctElements[0]);
const badElements = ['d', 'e', 'f']; const badElements = ['d', 'e', 'f'];
const badMerkleTree = new MerkleTree(badElements); const badMerkleTree = new MerkleTree(badElements);
const badProof = badMerkleTree.getHexProof(badElements[0]); const badProof = badMerkleTree.getHexProof(badElements[0], keccak256, { hashLeaves: true });
expect(await this.merkleProof.verify(badProof, correctRoot, correctLeaf)).to.equal(false); expect(await this.merkleProof.verify(badProof, correctRoot, correctLeaf)).to.equal(false);
}); });
it('returns false for a Merkle proof of invalid length', async function () { it('returns false for a Merkle proof of invalid length', async function () {
const elements = ['a', 'b', 'c']; const elements = ['a', 'b', 'c'];
const merkleTree = new MerkleTree(elements); const merkleTree = new MerkleTree(elements, keccak256, { hashLeaves: true });
const root = merkleTree.getHexRoot(); const root = merkleTree.getHexRoot();
const proof = merkleTree.getHexProof(elements[0]); const leaf = keccak256(elements[0]);
const badProof = proof.slice(0, proof.length - 5);
const leaf = bufferToHex(keccakFromString(elements[0])); const proof = merkleTree.getHexProof(leaf);
const badProof = proof.slice(0, proof.length - 5);
expect(await this.merkleProof.verify(badProof, root, leaf)).to.equal(false); expect(await this.merkleProof.verify(badProof, root, leaf)).to.equal(false);
}); });
......
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