Commit b05440a7 by github-actions

Transpile ff94b777

parent 78f32a18
......@@ -20,23 +20,35 @@
## 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.
* `Context`: making `_msgData` return `bytes calldata` instead of `bytes memory` ([#2492](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2492))
* `ERC20`: Removed the `_setDecimals` function and the storage slot associated to decimals. ([#2502](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2502))
* `ERC20`: removed the `_setDecimals` function and the storage slot associated to decimals. ([#2502](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2502))
* `Strings`: addition of a `toHexString` function. ([#2504](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2504))
* `EnumerableMap`: change implementation to optimize for `key → value` lookups instead of enumeration. ([#2518](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2518))
* `GSN`: Deprecate GSNv1 support in favor of upcomming support for GSNv2. ([#2521](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2521))
* `ERC165`: Remove uses of storage in the base ERC165 implementation. ERC165 based contracts now use storage-less virtual functions. Old behaviour remains available in the `ERC165Storage` extension. ([#2505](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2505))
* `Initializable`: Make initializer check stricter during construction. ([#2531](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2531))
* `GSN`: deprecate GSNv1 support in favor of upcoming support for GSNv2. ([#2521](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2521))
* `ERC165`: remove uses of storage in the base ERC165 implementation. ERC165 based contracts now use storage-less virtual functions. Old behavior remains available in the `ERC165Storage` extension. ([#2505](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2505))
* `Initializable`: make initializer check stricter during construction. ([#2531](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2531))
* `ERC721`: remove enumerability of tokens from the base implementation. This feature is now provided separately through the `ERC721Enumerable` extension. ([#2511](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2511))
* `AccessControl`: removed enumerability by default for a more lightweight contract. It is now opt-in through `AccessControlEnumerable`. ([#2512](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2512))
* Meta Transactions: add `ERC2771Context` and a `MinimalForwarder` for meta-transactions. ([#2508](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2508))
* Overall reorganisation of the contract folder to improve clarity and discoverability. ([#2503](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2503))
* `ERC20Capped`: optimize gas usage of by enforcing te check directly in `_mint`. ([#2524](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2524))
* Overall reorganization of the contract folder to improve clarity and discoverability. ([#2503](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2503))
* `ERC20Capped`: optimize gas usage by enforcing the check directly in `_mint`. ([#2524](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2524))
* Rename `UpgradeableProxy` to `ERC1967Proxy`. ([#2547](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2547))
* `ERC777`: Optimize the gas costs of the constructor. ([#2551](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2551))
* `ERC721URIStorage`: Add a new extension that implements the `_setTokenURI` behavior as it was available in 3.4.0. ([#2555](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2555))
* `AccessControl`: Added ERC165 interface detection. ([#2562](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2562))
* `ERC777`: optimize the gas costs of the constructor. ([#2551](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2551))
* `ERC721URIStorage`: add a new extension that implements the `_setTokenURI` behavior as it was available in 3.4.0. ([#2555](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2555))
* `AccessControl`: added ERC165 interface detection. ([#2562](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2562))
* `ERC1155`: make `uri` public so overloading function can call it using super. ([#2576](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2576))
### Bug fixes for beta releases
* `AccessControlEnumerable`: Fixed `renounceRole` not updating enumerable set of addresses for a role. ([#2572](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2572))
### How to upgrade from 3.x
......@@ -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.
### How to upgrade from 4.0-beta.x
Some further changes have been done between the different beta iterations. Transitions made during this period are configured in the `migrate-imports` script. Consequently, you can upgrade from any previous 4.0-beta.x version using the same script as described in the *How to upgrade from 3.x* section.
## 3.4.0 (2021-02-02)
* `BeaconProxy`: added new kind of proxy that allows simultaneous atomic upgrades. ([#2411](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2411))
......
......@@ -4,7 +4,7 @@ pragma solidity ^0.8.0;
import "./AccessControlUpgradeable.sol";
import "../utils/structs/EnumerableSetUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
/**
* @dev External interface of AccessControlEnumerable declared to support ERC165 detection.
......@@ -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
*/
function _setupRole(bytes32 role, address account) internal virtual override {
......
......@@ -4,7 +4,7 @@ pragma solidity ^0.8.0;
import "../utils/ContextUpgradeable.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.
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../utils/ContextUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
......
......@@ -2,10 +2,10 @@
pragma solidity ^0.8.0;
import "./AddressUpgradeable.sol";
import "./ContextUpgradeable.sol";
import "./math/SafeMathUpgradeable.sol";
import "./Initializable.sol";
import "../utils/AddressUpgradeable.sol";
import "../utils/ContextUpgradeable.sol";
import "../utils/math/SafeMathUpgradeable.sol";
import "../proxy/utils/Initializable.sol";
/**
* @title PaymentSplitter
......
= Finance
[.readme-notice]
NOTE: This document is better viewed at https://docs.openzeppelin.com/contracts/api/finance
This directory includes primitives for financial systems. We currently only offer the {PaymentSplitter} contract, but we want to grow this directory so we welcome ideas.
== PaymentSplitter
{{PaymentSplitter}}
= Governance
[.readme-notice]
NOTE: This document is better viewed at https://docs.openzeppelin.com/contracts/api/access
NOTE: This document is better viewed at https://docs.openzeppelin.com/contracts/api/governance
This directory includes primitives for on-chain governance. We currently only offer the {TimelockController} contract, that can be used as a component in a governance systems to introduce a delay between a proposal and its execution.
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../access/AccessControlUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
/**
* @dev Contract module which acts as a timelocked controller. When set as the
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../utils/ContextUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
/*
* @dev Context variant with ERC2771 support.
......
......@@ -4,7 +4,7 @@ pragma solidity ^0.8.0;
import "../utils/cryptography/ECDSAUpgradeable.sol";
import "../utils/cryptography/draft-EIP712Upgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
/*
* @dev Simple minimal forwarder to be used together with an ERC2771 compatible contract. See {ERC2771Context}.
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../access/AccessControlEnumerableUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract AccessControlEnumerableMockUpgradeable is Initializable, AccessControlEnumerableUpgradeable {
function __AccessControlEnumerableMock_init() internal initializer {
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../access/AccessControlUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract AccessControlMockUpgradeable is Initializable, AccessControlUpgradeable {
function __AccessControlMock_init() internal initializer {
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../utils/AddressUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract AddressImplUpgradeable is Initializable {
function __AddressImpl_init() internal initializer {
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../utils/ArraysUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract ArraysImplUpgradeable is Initializable {
using ArraysUpgradeable for uint256[];
......
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract BadBeaconNoImplUpgradeable is Initializable {
function __BadBeaconNoImpl_init() internal initializer {
......
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract CallReceiverMockUpgradeable is Initializable {
function __CallReceiverMock_init() internal initializer {
......
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
/**
......
......@@ -4,7 +4,7 @@ pragma solidity ^0.8.0;
import "../proxy/ClonesUpgradeable.sol";
import "../utils/AddressUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract ClonesMockUpgradeable is Initializable {
function __ClonesMock_init() internal initializer {
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../utils/escrow/ConditionalEscrowUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
// mock class using ConditionalEscrow
contract ConditionalEscrowMockUpgradeable is Initializable, ConditionalEscrowUpgradeable {
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../utils/ContextUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract ContextMockUpgradeable is Initializable, ContextUpgradeable {
function __ContextMock_init() internal initializer {
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../utils/CountersUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract CountersImplUpgradeable is Initializable {
function __CountersImpl_init() internal initializer {
......
......@@ -4,7 +4,7 @@ pragma solidity ^0.8.0;
import "../utils/Create2Upgradeable.sol";
import "../utils/introspection/ERC1820ImplementerUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract Create2ImplUpgradeable is Initializable {
function __Create2Impl_init() internal initializer {
......
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
abstract contract ImplUpgradeable is Initializable {
function __Impl_init() internal initializer {
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../utils/cryptography/ECDSAUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract ECDSAMockUpgradeable is Initializable {
function __ECDSAMock_init() internal initializer {
......
......@@ -4,7 +4,7 @@ pragma solidity ^0.8.0;
import "../utils/cryptography/draft-EIP712Upgradeable.sol";
import "../utils/cryptography/ECDSAUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract EIP712ExternalUpgradeable is Initializable, EIP712Upgradeable {
function __EIP712External_init(string memory name, string memory version) internal initializer {
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../token/ERC1155/extensions/ERC1155BurnableUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract ERC1155BurnableMockUpgradeable is Initializable, ERC1155BurnableUpgradeable {
function __ERC1155BurnableMock_init(string memory uri) internal initializer {
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../token/ERC1155/ERC1155Upgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
/**
* @title ERC1155Mock
......
......@@ -4,7 +4,7 @@ pragma solidity ^0.8.0;
import "./ERC1155MockUpgradeable.sol";
import "../token/ERC1155/extensions/ERC1155PausableUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract ERC1155PausableMockUpgradeable is Initializable, ERC1155MockUpgradeable, ERC1155PausableUpgradeable {
function __ERC1155PausableMock_init(string memory uri) internal initializer {
......
......@@ -4,7 +4,7 @@ pragma solidity ^0.8.0;
import "../token/ERC1155/IERC1155ReceiverUpgradeable.sol";
import "../utils/introspection/ERC165Upgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract ERC1155ReceiverMockUpgradeable is Initializable, IERC1155ReceiverUpgradeable, ERC165Upgradeable {
bytes4 private _recRetval;
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../../utils/introspection/IERC165Upgradeable.sol";
import "../../utils/Initializable.sol";
import "../../proxy/utils/Initializable.sol";
/**
* https://eips.ethereum.org/EIPS/eip-214#specification
......
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "../../utils/Initializable.sol";
import "../../proxy/utils/Initializable.sol";
contract ERC165MissingDataUpgradeable is Initializable {
function __ERC165MissingData_init() internal initializer {
......
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "../../utils/Initializable.sol";
import "../../proxy/utils/Initializable.sol";
contract ERC165NotSupportedUpgradeable is Initializable { function __ERC165NotSupported_init() internal initializer {
__ERC165NotSupported_init_unchained();
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../utils/introspection/ERC165CheckerUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract ERC165CheckerMockUpgradeable is Initializable {
function __ERC165CheckerMock_init() internal initializer {
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../utils/introspection/ERC165Upgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract ERC165MockUpgradeable is Initializable, ERC165Upgradeable {
function __ERC165Mock_init() internal initializer {
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../utils/introspection/ERC165StorageUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract ERC165StorageMockUpgradeable is Initializable, ERC165StorageUpgradeable {
function __ERC165StorageMock_init() internal initializer {
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../utils/introspection/ERC1820ImplementerUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract ERC1820ImplementerMockUpgradeable is Initializable, ERC1820ImplementerUpgradeable {
function __ERC1820ImplementerMock_init() internal initializer {
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../token/ERC20/extensions/ERC20BurnableUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract ERC20BurnableMockUpgradeable is Initializable, ERC20BurnableUpgradeable {
function __ERC20BurnableMock_init(
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../token/ERC20/extensions/ERC20CappedUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract ERC20CappedMockUpgradeable is Initializable, ERC20CappedUpgradeable {
function __ERC20CappedMock_init(string memory name, string memory symbol, uint256 cap) internal initializer {
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../token/ERC20/ERC20Upgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract ERC20DecimalsMockUpgradeable is Initializable, ERC20Upgradeable {
uint8 private _decimals;
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../token/ERC20/ERC20Upgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
// mock class using ERC20
contract ERC20MockUpgradeable is Initializable, ERC20Upgradeable {
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../token/ERC20/extensions/ERC20PausableUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
// mock class using ERC20Pausable
contract ERC20PausableMockUpgradeable is Initializable, ERC20PausableUpgradeable {
......
......@@ -4,7 +4,7 @@ pragma solidity ^0.8.0;
import "../token/ERC20/extensions/draft-ERC20PermitUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract ERC20PermitMockUpgradeable is Initializable, ERC20PermitUpgradeable {
function __ERC20PermitMock_init(
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../token/ERC20/extensions/ERC20SnapshotUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract ERC20SnapshotMockUpgradeable is Initializable, ERC20SnapshotUpgradeable {
......
......@@ -4,7 +4,7 @@ pragma solidity ^0.8.0;
import "./ContextMockUpgradeable.sol";
import "../metatx/ERC2771ContextUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
// By inheriting from ERC2771Context, Context's internal functions are overridden automatically
contract ERC2771ContextMockUpgradeable is Initializable, ContextMockUpgradeable, ERC2771ContextUpgradeable {
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../token/ERC721/extensions/ERC721BurnableUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract ERC721BurnableMockUpgradeable is Initializable, ERC721BurnableUpgradeable {
function __ERC721BurnableMock_init(string memory name, string memory symbol) internal initializer {
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../token/ERC721/extensions/ERC721EnumerableUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
/**
* @title ERC721Mock
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../token/ERC721/ERC721Upgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
/**
* @title ERC721Mock
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../token/ERC721/extensions/ERC721PausableUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
/**
* @title ERC721PausableMock
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../token/ERC721/IERC721ReceiverUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract ERC721ReceiverMockUpgradeable is Initializable, IERC721ReceiverUpgradeable {
enum Error {
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../token/ERC721/extensions/ERC721URIStorageUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
/**
* @title ERC721Mock
......
......@@ -4,7 +4,7 @@ pragma solidity ^0.8.0;
import "../utils/ContextUpgradeable.sol";
import "../token/ERC777/ERC777Upgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract ERC777MockUpgradeable is Initializable, ContextUpgradeable, ERC777Upgradeable {
event BeforeTokenTransfer();
......@@ -40,6 +40,16 @@ contract ERC777MockUpgradeable is Initializable, ContextUpgradeable, ERC777Upgra
_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 {
_approve(holder, spender, value);
}
......
......@@ -8,7 +8,7 @@ import "../token/ERC777/IERC777RecipientUpgradeable.sol";
import "../utils/ContextUpgradeable.sol";
import "../utils/introspection/IERC1820RegistryUpgradeable.sol";
import "../utils/introspection/ERC1820ImplementerUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract ERC777SenderRecipientMockUpgradeable is Initializable, ContextUpgradeable, IERC777SenderUpgradeable, IERC777RecipientUpgradeable, ERC1820ImplementerUpgradeable {
function __ERC777SenderRecipientMock_init() internal initializer {
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../utils/structs/EnumerableMapUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract EnumerableMapMockUpgradeable is Initializable {
function __EnumerableMapMock_init() internal initializer {
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../utils/structs/EnumerableSetUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
// Bytes32Set
contract EnumerableBytes32SetMockUpgradeable is Initializable {
......
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract EtherReceiverMockUpgradeable is Initializable {
function __EtherReceiverMock_init() internal initializer {
......
......@@ -2,7 +2,7 @@
pragma solidity ^0.8.0;
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
/**
* @title InitializableMock
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../utils/math/MathUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract MathMockUpgradeable is Initializable {
function __MathMock_init() internal initializer {
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../utils/cryptography/MerkleProofUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract MerkleProofWrapperUpgradeable is Initializable {
function __MerkleProofWrapper_init() internal initializer {
......
......@@ -2,7 +2,7 @@
pragma solidity ^0.8.0;
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
// Sample contracts showing upgradeability with multiple inheritance.
// Child contract inherits from Father and Mother contracts, and Father extends from Gramps.
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../access/OwnableUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract OwnableMockUpgradeable is Initializable, OwnableUpgradeable { function __OwnableMock_init() internal initializer {
__Context_init_unchained();
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../security/PausableUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract PausableMockUpgradeable is Initializable, PausableUpgradeable {
bool public drasticMeasureTaken;
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../security/PullPaymentUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
// mock class using PullPayment
contract PullPaymentMockUpgradeable is Initializable, PullPaymentUpgradeable {
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../utils/ContextUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract ReentrancyAttackUpgradeable is Initializable, ContextUpgradeable {
function __ReentrancyAttack_init() internal initializer {
__Context_init_unchained();
......
......@@ -4,7 +4,7 @@ pragma solidity ^0.8.0;
import "../security/ReentrancyGuardUpgradeable.sol";
import "./ReentrancyAttackUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract ReentrancyMockUpgradeable is Initializable, ReentrancyGuardUpgradeable {
uint256 public counter;
......
......@@ -2,7 +2,7 @@
pragma solidity ^0.8.0;
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract Implementation1 is Initializable {
uint internal _value;
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../utils/math/SafeCastUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract SafeCastMockUpgradeable is Initializable {
function __SafeCastMock_init() internal initializer {
......
......@@ -5,7 +5,7 @@ pragma solidity ^0.8.0;
import "../utils/ContextUpgradeable.sol";
import "../token/ERC20/IERC20Upgradeable.sol";
import "../token/ERC20/utils/SafeERC20Upgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract ERC20ReturnFalseMockUpgradeable is Initializable, ContextUpgradeable {
function __ERC20ReturnFalseMock_init() internal initializer {
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../utils/math/SafeMathUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract SafeMathMockUpgradeable is Initializable {
function __SafeMathMock_init() internal initializer {
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../utils/math/SignedSafeMathUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract SignedSafeMathMockUpgradeable is Initializable {
function __SignedSafeMathMock_init() internal initializer {
......
......@@ -2,7 +2,7 @@
pragma solidity ^0.8.0;
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
/**
* @title MigratableMockV1
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../utils/StringsUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
contract StringsMockUpgradeable is Initializable {
function __StringsMock_init() internal initializer {
......
......@@ -57,18 +57,100 @@ contract ERC20PresetMinterPauserUpgradeableWithInit is ERC20PresetMinterPauserUp
__ERC20PresetMinterPauser_init(name, symbol);
}
}
import "../utils/PaymentSplitterUpgradeable.sol";
import "../token/ERC1155/presets/ERC1155PresetMinterPauserUpgradeable.sol";
contract PaymentSplitterUpgradeableWithInit is PaymentSplitterUpgradeable {
constructor(address[] memory payees, uint256[] memory shares_) public payable {
__PaymentSplitter_init(payees, shares_);
contract ERC1155PresetMinterPauserUpgradeableWithInit is ERC1155PresetMinterPauserUpgradeable {
constructor(string memory uri) public payable {
__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 {
__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";
......@@ -206,119 +288,32 @@ contract ERC777MockUpgradeableWithInit is ERC777MockUpgradeable {
__ERC777Mock_init(initialHolder, initialBalance, name, symbol, defaultOperators);
}
}
import "./ERC721URIStorageMockUpgradeable.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";
import "./ClonesMockUpgradeable.sol";
contract SupportsInterfaceWithLookupMockUpgradeableWithInit is SupportsInterfaceWithLookupMockUpgradeable {
contract ClonesMockUpgradeableWithInit is ClonesMockUpgradeable {
constructor() public payable {
__SupportsInterfaceWithLookupMock_init();
}
}
import "./ERC165/ERC165InterfacesSupportedUpgradeable.sol";
contract ERC165InterfacesSupportedUpgradeableWithInit is ERC165InterfacesSupportedUpgradeable {
constructor(bytes4[] memory interfaceIds) public payable {
__ERC165InterfacesSupported_init(interfaceIds);
__ClonesMock_init();
}
}
import "../token/ERC1155/utils/ERC1155HolderUpgradeable.sol";
import "./AddressImplUpgradeable.sol";
contract ERC1155HolderUpgradeableWithInit is ERC1155HolderUpgradeable {
contract AddressImplUpgradeableWithInit is AddressImplUpgradeable {
constructor() public payable {
__ERC1155Holder_init();
__AddressImpl_init();
}
}
import "./ERC165StorageMockUpgradeable.sol";
import "../finance/PaymentSplitterUpgradeable.sol";
contract ERC165StorageMockUpgradeableWithInit is ERC165StorageMockUpgradeable {
constructor() public payable {
__ERC165StorageMock_init();
contract PaymentSplitterUpgradeableWithInit is PaymentSplitterUpgradeable {
constructor(address[] memory payees, uint256[] memory shares_) public payable {
__PaymentSplitter_init(payees, shares_);
}
}
import "./ERC165MockUpgradeable.sol";
import "./SafeMathMockUpgradeable.sol";
contract ERC165MockUpgradeableWithInit is ERC165MockUpgradeable {
contract SafeMathMockUpgradeableWithInit is SafeMathMockUpgradeable {
constructor() public payable {
__ERC165Mock_init();
__SafeMathMock_init();
}
}
import "./ERC1155BurnableMockUpgradeable.sol";
......@@ -328,18 +323,18 @@ contract ERC1155BurnableMockUpgradeableWithInit is ERC1155BurnableMockUpgradeabl
__ERC1155BurnableMock_init(uri);
}
}
import "./ERC721PausableMockUpgradeable.sol";
import "../token/ERC1155/utils/ERC1155HolderUpgradeable.sol";
contract ERC721PausableMockUpgradeableWithInit is ERC721PausableMockUpgradeable {
constructor(string memory name, string memory symbol) public payable {
__ERC721PausableMock_init(name, symbol);
contract ERC1155HolderUpgradeableWithInit is ERC1155HolderUpgradeable {
constructor() public payable {
__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 {
__ERC721Mock_init(name, symbol);
__ERC721EnumerableMock_init(name, symbol);
}
}
import "./StringsMockUpgradeable.sol";
......@@ -370,18 +365,23 @@ contract ERC721BurnableMockUpgradeableWithInit is ERC721BurnableMockUpgradeable
__ERC721BurnableMock_init(name, symbol);
}
}
import "./ClonesMockUpgradeable.sol";
import "./ERC721PausableMockUpgradeable.sol";
contract ClonesMockUpgradeableWithInit is ClonesMockUpgradeable {
constructor() public payable {
__ClonesMock_init();
contract ERC721PausableMockUpgradeableWithInit is ERC721PausableMockUpgradeable {
constructor(string memory name, string memory symbol) public payable {
__ERC721PausableMock_init(name, symbol);
}
}
import "./AddressImplUpgradeable.sol";
import "./ERC20PausableMockUpgradeable.sol";
contract AddressImplUpgradeableWithInit is AddressImplUpgradeable {
constructor() public payable {
__AddressImpl_init();
contract ERC20PausableMockUpgradeableWithInit is ERC20PausableMockUpgradeable {
constructor(
string memory name,
string memory symbol,
address initialAccount,
uint256 initialBalance
) public payable {
__ERC20PausableMock_init(name, symbol, initialAccount, initialBalance);
}
}
import "./ReentrancyAttackUpgradeable.sol";
......
......@@ -40,3 +40,7 @@ CAUTION: Using upgradeable proxies correctly and securely is a difficult task th
== Minimal Clones
{{Clones}}
== Utils
{{Initializable}}
......@@ -3,7 +3,7 @@
// solhint-disable-next-line compiler-version
pragma solidity ^0.8.0;
import "./AddressUpgradeable.sol";
import "../../utils/AddressUpgradeable.sol";
/**
* @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../utils/ContextUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
/**
* @dev Contract module which allows children to implement an emergency stop
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../utils/escrow/EscrowUpgradeable.sol";
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
/**
* @dev Simple implementation of a
......
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "../utils/Initializable.sol";
import "../proxy/utils/Initializable.sol";
/**
* @dev Contract module that helps prevent reentrant calls to a function.
......
......@@ -8,7 +8,7 @@ import "./extensions/IERC1155MetadataURIUpgradeable.sol";
import "../../utils/AddressUpgradeable.sol";
import "../../utils/ContextUpgradeable.sol";
import "../../utils/introspection/ERC165Upgradeable.sol";
import "../../utils/Initializable.sol";
import "../../proxy/utils/Initializable.sol";
/**
*
......@@ -62,7 +62,7 @@ contract ERC1155Upgradeable is Initializable, ContextUpgradeable, ERC165Upgradea
* Clients calling this function must replace the `\{id\}` substring with the
* actual token type ID.
*/
function uri(uint256) external view virtual override returns (string memory) {
function uri(uint256) public view virtual override returns (string memory) {
return _uri;
}
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../ERC1155Upgradeable.sol";
import "../../../utils/Initializable.sol";
import "../../../proxy/utils/Initializable.sol";
/**
* @dev Extension of {ERC1155} that allows token holders to destroy both their
......
......@@ -4,7 +4,7 @@ pragma solidity ^0.8.0;
import "../ERC1155Upgradeable.sol";
import "../../../security/PausableUpgradeable.sol";
import "../../../utils/Initializable.sol";
import "../../../proxy/utils/Initializable.sol";
/**
* @dev ERC1155 token with pausable token transfers, minting and burning.
......
......@@ -7,7 +7,7 @@ import "../extensions/ERC1155BurnableUpgradeable.sol";
import "../extensions/ERC1155PausableUpgradeable.sol";
import "../../../access/AccessControlEnumerableUpgradeable.sol";
import "../../../utils/ContextUpgradeable.sol";
import "../../../utils/Initializable.sol";
import "../../../proxy/utils/Initializable.sol";
/**
* @dev {ERC1155} token, including:
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "./ERC1155ReceiverUpgradeable.sol";
import "../../../utils/Initializable.sol";
import "../../../proxy/utils/Initializable.sol";
/**
* @dev _Available since v3.1._
......
......@@ -4,7 +4,7 @@ pragma solidity ^0.8.0;
import "../IERC1155ReceiverUpgradeable.sol";
import "../../../utils/introspection/ERC165Upgradeable.sol";
import "../../../utils/Initializable.sol";
import "../../../proxy/utils/Initializable.sol";
/**
* @dev _Available since v3.1._
......
......@@ -3,8 +3,9 @@
pragma solidity ^0.8.0;
import "./IERC20Upgradeable.sol";
import "./extensions/IERC20MetadataUpgradeable.sol";
import "../../utils/ContextUpgradeable.sol";
import "../../utils/Initializable.sol";
import "../../proxy/utils/Initializable.sol";
/**
* @dev Implementation of the {IERC20} interface.
......@@ -30,7 +31,7 @@ import "../../utils/Initializable.sol";
* functions have been added to mitigate the well-known issues around setting
* allowances. See {IERC20-approve}.
*/
contract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable {
contract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable, IERC20MetadataUpgradeable {
mapping (address => uint256) private _balances;
mapping (address => mapping (address => uint256)) private _allowances;
......@@ -62,7 +63,7 @@ contract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeabl
/**
* @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;
}
......@@ -70,7 +71,7 @@ contract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeabl
* @dev Returns the symbol of the token, usually a shorter version of the
* name.
*/
function symbol() public view virtual returns (string memory) {
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
......@@ -87,7 +88,7 @@ contract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeabl
* no way affects any of the arithmetic of the contract, including
* {IERC20-balanceOf} and {IERC20-transfer}.
*/
function decimals() public view virtual returns (uint8) {
function decimals() public view virtual override returns (uint8) {
return 18;
}
......
......@@ -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:
* {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.
Additionally there are multiple custom extensions, including:
......@@ -36,6 +37,8 @@ NOTE: This core set of contracts is designed to be unopinionated, allowing devel
{{IERC20}}
{{IERC20Metadata}}
{{ERC20}}
== Extensions
......
......@@ -4,7 +4,7 @@ pragma solidity ^0.8.0;
import "../ERC20Upgradeable.sol";
import "../../../utils/ContextUpgradeable.sol";
import "../../../utils/Initializable.sol";
import "../../../proxy/utils/Initializable.sol";
/**
* @dev Extension of {ERC20} that allows token holders to destroy both their own
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../ERC20Upgradeable.sol";
import "../../../utils/Initializable.sol";
import "../../../proxy/utils/Initializable.sol";
/**
* @dev Extension of {ERC20} that adds a cap to the supply of tokens.
......
......@@ -4,7 +4,7 @@ pragma solidity ^0.8.0;
import "../ERC20Upgradeable.sol";
import "../../../security/PausableUpgradeable.sol";
import "../../../utils/Initializable.sol";
import "../../../proxy/utils/Initializable.sol";
/**
* @dev ERC20 token with pausable token transfers, minting and burning.
......
......@@ -5,7 +5,7 @@ pragma solidity ^0.8.0;
import "../ERC20Upgradeable.sol";
import "../../../utils/ArraysUpgradeable.sol";
import "../../../utils/CountersUpgradeable.sol";
import "../../../utils/Initializable.sol";
import "../../../proxy/utils/Initializable.sol";
/**
* @dev This contract extends an ERC20 token with a snapshot mechanism. When a snapshot is created, the balances and
......
// 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";
import "../../../utils/cryptography/draft-EIP712Upgradeable.sol";
import "../../../utils/cryptography/ECDSAUpgradeable.sol";
import "../../../utils/CountersUpgradeable.sol";
import "../../../utils/Initializable.sol";
import "../../../proxy/utils/Initializable.sol";
/**
* @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
......@@ -55,7 +55,7 @@ abstract contract ERC20PermitUpgradeable is Initializable, ERC20Upgradeable, IER
owner,
spender,
value,
_nonces[owner].current(),
_useNonce(owner),
deadline
)
);
......@@ -65,14 +65,13 @@ abstract contract ERC20PermitUpgradeable is Initializable, ERC20Upgradeable, IER
address signer = ECDSAUpgradeable.recover(hash, v, r, s);
require(signer == owner, "ERC20Permit: invalid signature");
_nonces[owner].increment();
_approve(owner, spender, value);
}
/**
* @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();
}
......@@ -83,5 +82,14 @@ abstract contract ERC20PermitUpgradeable is Initializable, ERC20Upgradeable, IER
function DOMAIN_SEPARATOR() external view override returns (bytes32) {
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;
}
......@@ -2,7 +2,7 @@
pragma solidity ^0.8.0;
import "../extensions/ERC20BurnableUpgradeable.sol";
import "../../../utils/Initializable.sol";
import "../../../proxy/utils/Initializable.sol";
/**
* @dev {ERC20} token, including:
......
......@@ -7,7 +7,7 @@ import "../extensions/ERC20BurnableUpgradeable.sol";
import "../extensions/ERC20PausableUpgradeable.sol";
import "../../../access/AccessControlEnumerableUpgradeable.sol";
import "../../../utils/ContextUpgradeable.sol";
import "../../../utils/Initializable.sol";
import "../../../proxy/utils/Initializable.sol";
/**
* @dev {ERC20} token, including:
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "./SafeERC20Upgradeable.sol";
import "../../../utils/Initializable.sol";
import "../../../proxy/utils/Initializable.sol";
/**
* @dev A token holder contract that will allow a beneficiary to extract the
......
......@@ -10,7 +10,7 @@ import "../../utils/AddressUpgradeable.sol";
import "../../utils/ContextUpgradeable.sol";
import "../../utils/StringsUpgradeable.sol";
import "../../utils/introspection/ERC165Upgradeable.sol";
import "../../utils/Initializable.sol";
import "../../proxy/utils/Initializable.sol";
/**
* @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
......@@ -230,7 +230,7 @@ contract ERC721Upgradeable is Initializable, ContextUpgradeable, ERC165Upgradeab
* @dev Safely mints `tokenId` and transfers it to `to`.
*
* Requirements:
d*
*
* - `tokenId` must not exist.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
......
......@@ -4,7 +4,7 @@ pragma solidity ^0.8.0;
import "../ERC721Upgradeable.sol";
import "../../../utils/ContextUpgradeable.sol";
import "../../../utils/Initializable.sol";
import "../../../proxy/utils/Initializable.sol";
/**
* @title ERC721 Burnable Token
......
......@@ -4,7 +4,7 @@ pragma solidity ^0.8.0;
import "../ERC721Upgradeable.sol";
import "./IERC721EnumerableUpgradeable.sol";
import "../../../utils/Initializable.sol";
import "../../../proxy/utils/Initializable.sol";
/**
* @dev This implements an optional extension of {ERC721} defined in the EIP that adds
......
......@@ -4,7 +4,7 @@ pragma solidity ^0.8.0;
import "../ERC721Upgradeable.sol";
import "../../../security/PausableUpgradeable.sol";
import "../../../utils/Initializable.sol";
import "../../../proxy/utils/Initializable.sol";
/**
* @dev ERC721 token with pausable token transfers, minting and burning.
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../ERC721Upgradeable.sol";
import "../../../utils/Initializable.sol";
import "../../../proxy/utils/Initializable.sol";
/**
* @dev ERC721 token with storage based token uri management.
......
......@@ -9,7 +9,7 @@ import "../extensions/ERC721PausableUpgradeable.sol";
import "../../../access/AccessControlEnumerableUpgradeable.sol";
import "../../../utils/ContextUpgradeable.sol";
import "../../../utils/CountersUpgradeable.sol";
import "../../../utils/Initializable.sol";
import "../../../proxy/utils/Initializable.sol";
/**
* @dev {ERC721} token, including:
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "../IERC721ReceiverUpgradeable.sol";
import "../../../utils/Initializable.sol";
import "../../../proxy/utils/Initializable.sol";
/**
* @dev Implementation of the {IERC721Receiver} interface.
......
......@@ -9,7 +9,7 @@ import "../ERC20/IERC20Upgradeable.sol";
import "../../utils/AddressUpgradeable.sol";
import "../../utils/ContextUpgradeable.sol";
import "../../utils/introspection/IERC1820RegistryUpgradeable.sol";
import "../../utils/Initializable.sol";
import "../../proxy/utils/Initializable.sol";
/**
* @dev Implementation of the {IERC777} interface.
......@@ -323,6 +323,37 @@ contract ERC777Upgradeable is Initializable, ContextUpgradeable, IERC777Upgradea
internal
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");
address operator = _msgSender();
......@@ -333,7 +364,7 @@ contract ERC777Upgradeable is Initializable, ContextUpgradeable, IERC777Upgradea
_totalSupply += 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 Transfer(address(0), account, amount);
......
......@@ -2,7 +2,7 @@
pragma solidity ^0.8.0;
import "../ERC777Upgradeable.sol";
import "../../../utils/Initializable.sol";
import "../../../proxy/utils/Initializable.sol";
/**
* @dev {ERC777} token, including:
......
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "./Initializable.sol";
import "../proxy/utils/Initializable.sol";
/*
* @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
{{EIP712}}
== Escrow
{{ConditionalEscrow}}
{{Escrow}}
{{RefundEscrow}}
== 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_.
......@@ -84,7 +92,3 @@ Note that, in all cases, accounts simply _declare_ their interfaces, but they ar
{{Counters}}
{{Strings}}
== Other
{{Initializable}}
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
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.
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "./EscrowUpgradeable.sol";
import "../Initializable.sol";
import "../../proxy/utils/Initializable.sol";
/**
* @title ConditionalEscrow
......
......@@ -4,7 +4,7 @@ pragma solidity ^0.8.0;
import "../../access/OwnableUpgradeable.sol";
import "../AddressUpgradeable.sol";
import "../Initializable.sol";
import "../../proxy/utils/Initializable.sol";
/**
* @title Escrow
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "./ConditionalEscrowUpgradeable.sol";
import "../Initializable.sol";
import "../../proxy/utils/Initializable.sol";
/**
* @title RefundEscrow
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "./ERC165Upgradeable.sol";
import "../Initializable.sol";
import "../../proxy/utils/Initializable.sol";
/**
* @dev Storage based implementation of the {IERC165} interface.
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "./IERC165Upgradeable.sol";
import "../Initializable.sol";
import "../../proxy/utils/Initializable.sol";
/**
* @dev Implementation of the {IERC165} interface.
......
......@@ -3,7 +3,7 @@
pragma solidity ^0.8.0;
import "./IERC1820ImplementerUpgradeable.sol";
import "../Initializable.sol";
import "../../proxy/utils/Initializable.sol";
/**
* @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 @@
"ethereumjs-wallet": "^1.0.1",
"hardhat": "^2.0.6",
"hardhat-gas-reporter": "^1.0.4",
"keccak256": "^1.0.2",
"lodash.startcase": "^4.4.0",
"lodash.zip": "^4.2.0",
"merkletreejs": "^0.2.13",
"micromatch": "^4.0.2",
"mocha": "^8.0.1",
"rimraf": "^3.0.2",
......@@ -76,6 +78,5 @@
"solidity-coverage": "^0.7.11",
"solidity-docgen": "^0.5.3",
"web3": "^1.3.0"
},
"dependencies": {}
}
}
......@@ -30,7 +30,8 @@ const pathUpdates = {
'payment/escrow/ConditionalEscrow.sol': 'utils/escrow/ConditionalEscrow.sol',
'payment/escrow/Escrow.sol': 'utils/escrow/Escrow.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',
'presets/ERC1155PresetMinterPauser.sol': 'token/ERC1155/presets/ERC1155PresetMinterPauser.sol',
'presets/ERC20PresetFixedSupply.sol': 'token/ERC20/presets/ERC20PresetFixedSupply.sol',
......@@ -40,7 +41,8 @@ const pathUpdates = {
// 'proxy/BeaconProxy.sol': 'proxy/beacon/BeaconProxy.sol',
// 'proxy/Clones.sol': undefined,
// '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/Proxy.sol': undefined,
// 'proxy/TransparentUpgradeableProxy.sol': 'proxy/transparent/TransparentUpgradeableProxy.sol',
......
......@@ -9,7 +9,7 @@ npm run compile
# -x: exclude all proxy contracts except Clones library
# -p: emit public initializer
npx @openzeppelin/upgrade-safe-transpiler -D \
-i contracts/utils/Initializable.sol \
-i contracts/proxy/utils/Initializable.sol \
-x 'contracts/proxy/**/*' \
-x '!contracts/proxy/Clones.sol' \
-p 'contracts/**/presets/**/*'
......
......@@ -179,6 +179,13 @@ function shouldBehaveLikeAccessControlEnumerable (errorPrefix, admin, authorized
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) {
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 () {
......
require('@openzeppelin/test-helpers');
const { MerkleTree } = require('../../helpers/merkleTree.js');
const { keccakFromString, bufferToHex } = require('ethereumjs-util');
const { MerkleTree } = require('merkletreejs');
const keccak256 = require('keccak256');
const { expect } = require('chai');
......@@ -15,43 +15,43 @@ contract('MerkleProof', function (accounts) {
describe('verify', function () {
it('returns true for a valid Merkle proof', async function () {
const elements = ['a', 'b', 'c', 'd'];
const merkleTree = new MerkleTree(elements);
const merkleTree = new MerkleTree(elements, keccak256, { hashLeaves: true });
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);
});
it('returns false for an invalid Merkle proof', async function () {
const correctElements = ['a', 'b', 'c'];
const correctMerkleTree = new MerkleTree(correctElements);
const correctMerkleTree = new MerkleTree(correctElements, keccak256, { hashLeaves: true });
const correctRoot = correctMerkleTree.getHexRoot();
const correctLeaf = bufferToHex(keccakFromString(correctElements[0]));
const correctLeaf = keccak256(correctElements[0]);
const badElements = ['d', 'e', 'f'];
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);
});
it('returns false for a Merkle proof of invalid length', async function () {
const elements = ['a', 'b', 'c'];
const merkleTree = new MerkleTree(elements);
const merkleTree = new MerkleTree(elements, keccak256, { hashLeaves: true });
const root = merkleTree.getHexRoot();
const proof = merkleTree.getHexProof(elements[0]);
const badProof = proof.slice(0, proof.length - 5);
const leaf = keccak256(elements[0]);
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);
});
......
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