Unverified Commit 974c5342 by Andre Korol Committed by GitHub

Update contracts to support Solidity 0.8.x (#2442)

Co-authored-by: Francisco Giordano <frangio.1@gmail.com>
parent 6be0b410
...@@ -42,4 +42,6 @@ jobs: ...@@ -42,4 +42,6 @@ jobs:
- run: npm ci - run: npm ci
if: steps.cache.outputs.cache-hit != 'true' if: steps.cache.outputs.cache-hit != 'true'
- run: npm run coverage - run: npm run coverage
env:
NODE_OPTIONS: --max_old_space_size=4096
- uses: codecov/codecov-action@v1 - uses: codecov/codecov-action@v1
...@@ -27,7 +27,7 @@ OpenZeppelin Contracts features a [stable API](https://docs.openzeppelin.com/con ...@@ -27,7 +27,7 @@ OpenZeppelin Contracts features a [stable API](https://docs.openzeppelin.com/con
Once installed, you can use the contracts in the library by importing them: Once installed, you can use the contracts in the library by importing them:
```solidity ```solidity
pragma solidity ^0.6.0; pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
......
...@@ -15,6 +15,6 @@ module.exports = { ...@@ -15,6 +15,6 @@ module.exports = {
}, },
}, },
solc: { solc: {
version: '0.6.12', version: '0.8.0',
}, },
}; };
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
/* /*
* @dev Provides information about the current execution context, including the * @dev Provides information about the current execution context, including the
...@@ -13,7 +13,7 @@ pragma solidity >=0.6.0 <0.8.0; ...@@ -13,7 +13,7 @@ pragma solidity >=0.6.0 <0.8.0;
* This contract is only required for intermediate, library-like contracts. * This contract is only required for intermediate, library-like contracts.
*/ */
abstract contract Context { abstract contract Context {
function _msgSender() internal view virtual returns (address payable) { function _msgSender() internal view virtual returns (address) {
return msg.sender; return msg.sender;
} }
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "./IRelayRecipient.sol"; import "./IRelayRecipient.sol";
import "./IRelayHub.sol"; import "./IRelayHub.sol";
...@@ -87,7 +87,7 @@ abstract contract GSNRecipient is IRelayRecipient, Context { ...@@ -87,7 +87,7 @@ abstract contract GSNRecipient is IRelayRecipient, Context {
* *
* IMPORTANT: Contracts derived from {GSNRecipient} should never use `msg.sender`, and use {_msgSender} instead. * IMPORTANT: Contracts derived from {GSNRecipient} should never use `msg.sender`, and use {_msgSender} instead.
*/ */
function _msgSender() internal view virtual override returns (address payable) { function _msgSender() internal view virtual override returns (address) {
if (msg.sender != _relayHub) { if (msg.sender != _relayHub) {
return msg.sender; return msg.sender;
} else { } else {
...@@ -192,7 +192,7 @@ abstract contract GSNRecipient is IRelayRecipient, Context { ...@@ -192,7 +192,7 @@ abstract contract GSNRecipient is IRelayRecipient, Context {
return (gas * gasPrice * (100 + serviceFee)) / 100; return (gas * gasPrice * (100 + serviceFee)) / 100;
} }
function _getRelayedCallSender() private pure returns (address payable result) { function _getRelayedCallSender() private pure returns (address result) {
// We need to read 20 bytes (an address) located at array index msg.data.length - 20. In memory, the array // We need to read 20 bytes (an address) located at array index msg.data.length - 20. In memory, the array
// is prefixed with a 32-byte length value, so we first add 32 to get the memory read index. However, doing // is prefixed with a 32-byte length value, so we first add 32 to get the memory read index. However, doing
// so would leave the address in the upper 20 bytes of the 32-byte word, which is inconvenient and would // so would leave the address in the upper 20 bytes of the 32-byte word, which is inconvenient and would
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "./GSNRecipient.sol"; import "./GSNRecipient.sol";
import "../math/SafeMath.sol";
import "../access/Ownable.sol"; import "../access/Ownable.sol";
import "../token/ERC20/SafeERC20.sol"; import "../token/ERC20/SafeERC20.sol";
import "../token/ERC20/ERC20.sol"; import "../token/ERC20/ERC20.sol";
...@@ -19,7 +18,6 @@ import "../token/ERC20/ERC20.sol"; ...@@ -19,7 +18,6 @@ import "../token/ERC20/ERC20.sol";
*/ */
contract GSNRecipientERC20Fee is GSNRecipient { contract GSNRecipientERC20Fee is GSNRecipient {
using SafeERC20 for __unstable__ERC20Owned; using SafeERC20 for __unstable__ERC20Owned;
using SafeMath for uint256;
enum GSNRecipientERC20FeeErrorCodes { enum GSNRecipientERC20FeeErrorCodes {
INSUFFICIENT_BALANCE INSUFFICIENT_BALANCE
...@@ -30,7 +28,7 @@ contract GSNRecipientERC20Fee is GSNRecipient { ...@@ -30,7 +28,7 @@ contract GSNRecipientERC20Fee is GSNRecipient {
/** /**
* @dev The arguments to the constructor are the details that the gas payment token will have: `name` and `symbol`. `decimals` is hard-coded to 18. * @dev The arguments to the constructor are the details that the gas payment token will have: `name` and `symbol`. `decimals` is hard-coded to 18.
*/ */
constructor(string memory name, string memory symbol) public { constructor(string memory name, string memory symbol) {
_token = new __unstable__ERC20Owned(name, symbol); _token = new __unstable__ERC20Owned(name, symbol);
} }
...@@ -100,11 +98,11 @@ contract GSNRecipientERC20Fee is GSNRecipient { ...@@ -100,11 +98,11 @@ contract GSNRecipientERC20Fee is GSNRecipient {
// actualCharge is an _estimated_ charge, which assumes postRelayedCall will use all available gas. // actualCharge is an _estimated_ charge, which assumes postRelayedCall will use all available gas.
// This implementation's gas cost can be roughly estimated as 10k gas, for the two SSTORE operations in an // This implementation's gas cost can be roughly estimated as 10k gas, for the two SSTORE operations in an
// ERC20 transfer. // ERC20 transfer.
uint256 overestimation = _computeCharge(_POST_RELAYED_CALL_MAX_GAS.sub(10000), gasPrice, transactionFee); uint256 overestimation = _computeCharge(_POST_RELAYED_CALL_MAX_GAS - 10000, gasPrice, transactionFee);
actualCharge = actualCharge.sub(overestimation); actualCharge = actualCharge - overestimation;
// After the relayed call has been executed and the actual charge estimated, the excess pre-charge is returned // After the relayed call has been executed and the actual charge estimated, the excess pre-charge is returned
_token.safeTransfer(from, maxPossibleCharge.sub(actualCharge)); _token.safeTransfer(from, maxPossibleCharge - actualCharge);
} }
} }
...@@ -118,7 +116,7 @@ contract GSNRecipientERC20Fee is GSNRecipient { ...@@ -118,7 +116,7 @@ contract GSNRecipientERC20Fee is GSNRecipient {
contract __unstable__ERC20Owned is ERC20, Ownable { contract __unstable__ERC20Owned is ERC20, Ownable {
uint256 private constant _UINT256_MAX = 2**256 - 1; uint256 private constant _UINT256_MAX = 2**256 - 1;
constructor(string memory name, string memory symbol) public ERC20(name, symbol) { } constructor(string memory name, string memory symbol) ERC20(name, symbol) { }
// The owner (GSNRecipientERC20Fee) can mint tokens // The owner (GSNRecipientERC20Fee) can mint tokens
function mint(address account, uint256 amount) public onlyOwner { function mint(address account, uint256 amount) public onlyOwner {
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "./GSNRecipient.sol"; import "./GSNRecipient.sol";
import "../cryptography/ECDSA.sol"; import "../cryptography/ECDSA.sol";
...@@ -23,7 +23,7 @@ contract GSNRecipientSignature is GSNRecipient { ...@@ -23,7 +23,7 @@ contract GSNRecipientSignature is GSNRecipient {
/** /**
* @dev Sets the trusted signer that is going to be producing signatures to approve relayed calls. * @dev Sets the trusted signer that is going to be producing signatures to approve relayed calls.
*/ */
constructor(address trustedSigner) public { constructor(address trustedSigner) {
require(trustedSigner != address(0), "GSNRecipientSignature: trusted signer is the zero address"); require(trustedSigner != address(0), "GSNRecipientSignature: trusted signer is the zero address");
_trustedSigner = trustedSigner; _trustedSigner = trustedSigner;
} }
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
/** /**
* @dev Interface for `RelayHub`, the core contract of the GSN. Users should not need to interact with this contract * @dev Interface for `RelayHub`, the core contract of the GSN. Users should not need to interact with this contract
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
/** /**
* @dev Base interface for a contract that will be called via the GSN from {IRelayHub}. * @dev Base interface for a contract that will be called via the GSN from {IRelayHub}.
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "../utils/EnumerableSet.sol"; import "../utils/EnumerableSet.sol";
import "../utils/Address.sol"; import "../utils/Address.sol";
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "../GSN/Context.sol"; import "../GSN/Context.sol";
/** /**
...@@ -23,7 +23,7 @@ abstract contract Ownable is Context { ...@@ -23,7 +23,7 @@ abstract contract Ownable is Context {
/** /**
* @dev Initializes the contract setting the deployer as the initial owner. * @dev Initializes the contract setting the deployer as the initial owner.
*/ */
constructor () internal { constructor () {
address msgSender = _msgSender(); address msgSender = _msgSender();
_owner = msgSender; _owner = msgSender;
emit OwnershipTransferred(address(0), msgSender); emit OwnershipTransferred(address(0), msgSender);
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.9 <0.8.0; pragma solidity ^0.8.0;
pragma experimental ABIEncoderV2;
import "./../math/SafeMath.sol";
import "./AccessControl.sol"; import "./AccessControl.sol";
/** /**
...@@ -52,7 +50,7 @@ contract TimelockController is AccessControl { ...@@ -52,7 +50,7 @@ contract TimelockController is AccessControl {
/** /**
* @dev Initializes the contract with a given `minDelay`. * @dev Initializes the contract with a given `minDelay`.
*/ */
constructor(uint256 minDelay, address[] memory proposers, address[] memory executors) public { constructor(uint256 minDelay, address[] memory proposers, address[] memory executors) {
_setRoleAdmin(TIMELOCK_ADMIN_ROLE, TIMELOCK_ADMIN_ROLE); _setRoleAdmin(TIMELOCK_ADMIN_ROLE, TIMELOCK_ADMIN_ROLE);
_setRoleAdmin(PROPOSER_ROLE, TIMELOCK_ADMIN_ROLE); _setRoleAdmin(PROPOSER_ROLE, TIMELOCK_ADMIN_ROLE);
_setRoleAdmin(EXECUTOR_ROLE, TIMELOCK_ADMIN_ROLE); _setRoleAdmin(EXECUTOR_ROLE, TIMELOCK_ADMIN_ROLE);
...@@ -188,7 +186,7 @@ contract TimelockController is AccessControl { ...@@ -188,7 +186,7 @@ contract TimelockController is AccessControl {
require(_timestamps[id] == 0, "TimelockController: operation already scheduled"); require(_timestamps[id] == 0, "TimelockController: operation already scheduled");
require(delay >= _minDelay, "TimelockController: insufficient delay"); require(delay >= _minDelay, "TimelockController: insufficient delay");
// solhint-disable-next-line not-rely-on-time // solhint-disable-next-line not-rely-on-time
_timestamps[id] = SafeMath.add(block.timestamp, delay); _timestamps[id] = block.timestamp + delay;
} }
/** /**
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
/** /**
* @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
/** /**
* @dev These functions deal with verification of Merkle trees (hash trees), * @dev These functions deal with verification of Merkle trees (hash trees),
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
/** /**
* @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.
...@@ -43,13 +43,13 @@ abstract contract EIP712 { ...@@ -43,13 +43,13 @@ abstract contract EIP712 {
* NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart
* contract upgrade]. * contract upgrade].
*/ */
constructor(string memory name, string memory version) internal { constructor(string memory name, string memory version) {
bytes32 hashedName = keccak256(bytes(name)); bytes32 hashedName = keccak256(bytes(name));
bytes32 hashedVersion = keccak256(bytes(version)); bytes32 hashedVersion = keccak256(bytes(version));
bytes32 typeHash = keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"); bytes32 typeHash = keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)");
_HASHED_NAME = hashedName; _HASHED_NAME = hashedName;
_HASHED_VERSION = hashedVersion; _HASHED_VERSION = hashedVersion;
_CACHED_CHAIN_ID = _getChainId(); _CACHED_CHAIN_ID = block.chainid;
_CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion); _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);
_TYPE_HASH = typeHash; _TYPE_HASH = typeHash;
} }
...@@ -58,7 +58,7 @@ abstract contract EIP712 { ...@@ -58,7 +58,7 @@ abstract contract EIP712 {
* @dev Returns the domain separator for the current chain. * @dev Returns the domain separator for the current chain.
*/ */
function _domainSeparatorV4() internal view returns (bytes32) { function _domainSeparatorV4() internal view returns (bytes32) {
if (_getChainId() == _CACHED_CHAIN_ID) { if (block.chainid == _CACHED_CHAIN_ID) {
return _CACHED_DOMAIN_SEPARATOR; return _CACHED_DOMAIN_SEPARATOR;
} else { } else {
return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION); return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);
...@@ -71,7 +71,7 @@ abstract contract EIP712 { ...@@ -71,7 +71,7 @@ abstract contract EIP712 {
typeHash, typeHash,
name, name,
version, version,
_getChainId(), block.chainid,
address(this) address(this)
) )
); );
...@@ -95,11 +95,4 @@ abstract contract EIP712 { ...@@ -95,11 +95,4 @@ abstract contract EIP712 {
function _hashTypedDataV4(bytes32 structHash) internal view returns (bytes32) { function _hashTypedDataV4(bytes32 structHash) internal view returns (bytes32) {
return keccak256(abi.encodePacked("\x19\x01", _domainSeparatorV4(), structHash)); return keccak256(abi.encodePacked("\x19\x01", _domainSeparatorV4(), structHash));
} }
function _getChainId() private pure returns (uint256 chainId) {
// solhint-disable-next-line no-inline-assembly
assembly {
chainId := chainid()
}
}
} }
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.5 <0.8.0; pragma solidity ^0.8.0;
import "../token/ERC20/ERC20.sol"; import "../token/ERC20/ERC20.sol";
import "./IERC20Permit.sol"; import "./IERC20Permit.sol";
...@@ -29,7 +29,7 @@ abstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 { ...@@ -29,7 +29,7 @@ abstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 {
* *
* It's a good idea to use the same `name` that is defined as the ERC20 token name. * It's a good idea to use the same `name` that is defined as the ERC20 token name.
*/ */
constructor(string memory name) internal EIP712(name, "1") { constructor(string memory name) EIP712(name, "1") {
} }
/** /**
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
/** /**
* @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "./IERC165.sol"; import "./IERC165.sol";
...@@ -21,7 +21,7 @@ abstract contract ERC165 is IERC165 { ...@@ -21,7 +21,7 @@ abstract contract ERC165 is IERC165 {
*/ */
mapping(bytes4 => bool) private _supportedInterfaces; mapping(bytes4 => bool) private _supportedInterfaces;
constructor () internal { constructor () {
// Derived contracts need only register support for their own interfaces, // Derived contracts need only register support for their own interfaces,
// we register support for ERC165 itself here // we register support for ERC165 itself here
_registerInterface(_INTERFACE_ID_ERC165); _registerInterface(_INTERFACE_ID_ERC165);
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.2 <0.8.0; pragma solidity ^0.8.0;
/** /**
* @dev Library used to query support of an interface declared via {IERC165}. * @dev Library used to query support of an interface declared via {IERC165}.
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "./IERC1820Implementer.sol"; import "./IERC1820Implementer.sol";
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
/** /**
* @dev Interface of the ERC165 standard, as defined in the * @dev Interface of the ERC165 standard, as defined in the
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
/** /**
* @dev Interface for an ERC1820 implementer, as defined in the * @dev Interface for an ERC1820 implementer, as defined in the
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
/** /**
* @dev Interface of the global ERC1820 Registry, as defined in the * @dev Interface of the global ERC1820 Registry, as defined in the
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
/** /**
* @dev Standard math utilities missing in the Solidity language. * @dev Standard math utilities missing in the Solidity language.
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
/** /**
* @dev Wrappers over Solidity's arithmetic operations with added overflow * @dev Wrappers over Solidity's arithmetic operations.
* checks.
*
* Arithmetic operations in Solidity wrap on overflow. This can easily result
* in bugs, because programmers usually assume that an overflow raises an
* error, which is the standard behavior in high level programming languages.
* `SafeMath` restores this intuition by reverting the transaction when an
* operation overflows.
*
* Using this library instead of the unchecked operations eliminates an entire
* class of bugs, so it's recommended to use it always.
*/ */
library SafeMath { library SafeMath {
/** /**
...@@ -27,10 +17,7 @@ library SafeMath { ...@@ -27,10 +17,7 @@ library SafeMath {
* - Addition cannot overflow. * - Addition cannot overflow.
*/ */
function add(uint256 a, uint256 b) internal pure returns (uint256) { function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b; return a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
} }
/** /**
...@@ -44,24 +31,7 @@ library SafeMath { ...@@ -44,24 +31,7 @@ library SafeMath {
* - Subtraction cannot overflow. * - Subtraction cannot overflow.
*/ */
function sub(uint256 a, uint256 b) internal pure returns (uint256) { function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return sub(a, b, "SafeMath: subtraction overflow"); return a - b;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
} }
/** /**
...@@ -75,85 +45,34 @@ library SafeMath { ...@@ -75,85 +45,34 @@ library SafeMath {
* - Multiplication cannot overflow. * - Multiplication cannot overflow.
*/ */
function mul(uint256 a, uint256 b) internal pure returns (uint256) { function mul(uint256 a, uint256 b) internal pure returns (uint256) {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the return a * b;
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
} }
/** /**
* @dev Returns the integer division of two unsigned integers. Reverts on * @dev Returns the integer division of two unsigned integers. Reverts on
* division by zero. The result is rounded towards zero. * division by zero. The result is rounded towards zero.
* *
* Counterpart to Solidity's `/` operator. Note: this function uses a * Counterpart to Solidity's `/` operator.
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
* *
* Requirements: * Requirements:
* *
* - The divisor cannot be zero. * - The divisor cannot be zero.
*/ */
function div(uint256 a, uint256 b) internal pure returns (uint256) { function div(uint256 a, uint256 b) internal pure returns (uint256) {
return div(a, b, "SafeMath: division by zero"); return a / b;
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts with custom message on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
} }
/** /**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts when dividing by zero. * Reverts when dividing by zero.
* *
* Counterpart to Solidity's `%` operator. This function uses a `revert` * Counterpart to Solidity's `%` operator.
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
* *
* Requirements: * Requirements:
* *
* - The divisor cannot be zero. * - The divisor cannot be zero.
*/ */
function mod(uint256 a, uint256 b) internal pure returns (uint256) { function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return mod(a, b, "SafeMath: modulo by zero");
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts with custom message when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b; return a % b;
} }
} }
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
/** /**
* @title SignedSafeMath * @title SignedSafeMath
* @dev Signed math operations with safety checks that revert on error. * @dev Signed math operations that revert on error.
*/ */
library SignedSafeMath { library SignedSafeMath {
int256 constant private _INT256_MIN = -2**255;
/** /**
* @dev Returns the multiplication of two signed integers, reverting on * @dev Returns the multiplication of two signed integers, reverting on
* overflow. * overflow.
...@@ -20,40 +18,21 @@ library SignedSafeMath { ...@@ -20,40 +18,21 @@ library SignedSafeMath {
* - Multiplication cannot overflow. * - Multiplication cannot overflow.
*/ */
function mul(int256 a, int256 b) internal pure returns (int256) { function mul(int256 a, int256 b) internal pure returns (int256) {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the return a * b;
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) {
return 0;
}
require(!(a == -1 && b == _INT256_MIN), "SignedSafeMath: multiplication overflow");
int256 c = a * b;
require(c / a == b, "SignedSafeMath: multiplication overflow");
return c;
} }
/** /**
* @dev Returns the integer division of two signed integers. Reverts on * @dev Returns the integer division of two signed integers. Reverts on
* division by zero. The result is rounded towards zero. * division by zero. The result is rounded towards zero.
* *
* Counterpart to Solidity's `/` operator. Note: this function uses a * Counterpart to Solidity's `/` operator.
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
* *
* Requirements: * Requirements:
* *
* - The divisor cannot be zero. * - The divisor cannot be zero.
*/ */
function div(int256 a, int256 b) internal pure returns (int256) { function div(int256 a, int256 b) internal pure returns (int256) {
require(b != 0, "SignedSafeMath: division by zero"); return a / b;
require(!(b == -1 && a == _INT256_MIN), "SignedSafeMath: division overflow");
int256 c = a / b;
return c;
} }
/** /**
...@@ -67,10 +46,7 @@ library SignedSafeMath { ...@@ -67,10 +46,7 @@ library SignedSafeMath {
* - Subtraction cannot overflow. * - Subtraction cannot overflow.
*/ */
function sub(int256 a, int256 b) internal pure returns (int256) { function sub(int256 a, int256 b) internal pure returns (int256) {
int256 c = a - b; return a - b;
require((b >= 0 && c <= a) || (b < 0 && c > a), "SignedSafeMath: subtraction overflow");
return c;
} }
/** /**
...@@ -84,9 +60,6 @@ library SignedSafeMath { ...@@ -84,9 +60,6 @@ library SignedSafeMath {
* - Addition cannot overflow. * - Addition cannot overflow.
*/ */
function add(int256 a, int256 b) internal pure returns (int256) { function add(int256 a, int256 b) internal pure returns (int256) {
int256 c = a + b; return a + b;
require((b >= 0 && c >= a) || (b < 0 && c < a), "SignedSafeMath: addition overflow");
return c;
} }
} }
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "../access/AccessControl.sol"; import "../access/AccessControl.sol";
contract AccessControlMock is AccessControl { contract AccessControlMock is AccessControl {
constructor() public { constructor() {
_setupRole(DEFAULT_ADMIN_ROLE, _msgSender()); _setupRole(DEFAULT_ADMIN_ROLE, _msgSender());
} }
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "../utils/Address.sol"; import "../utils/Address.sol";
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "../utils/Arrays.sol"; import "../utils/Arrays.sol";
...@@ -9,7 +9,7 @@ contract ArraysImpl { ...@@ -9,7 +9,7 @@ contract ArraysImpl {
uint256[] private _array; uint256[] private _array;
constructor (uint256[] memory array) public { constructor (uint256[] memory array) {
_array = array; _array = array;
} }
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
contract BadBeaconNoImpl { contract BadBeaconNoImpl {
} }
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
contract CallReceiverMock { contract CallReceiverMock {
string public sharedAnswer; string public sharedAnswer;
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
/** /**
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "../payment/escrow/ConditionalEscrow.sol"; import "../payment/escrow/ConditionalEscrow.sol";
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "../GSN/Context.sol"; import "../GSN/Context.sol";
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "../utils/Counters.sol"; import "../utils/Counters.sol";
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "../utils/Create2.sol"; import "../utils/Create2.sol";
import "../introspection/ERC1820Implementer.sol"; import "../introspection/ERC1820Implementer.sol";
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
abstract contract Impl { abstract contract Impl {
function version() public pure virtual returns (string memory); function version() public pure virtual returns (string memory);
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "../cryptography/ECDSA.sol"; import "../cryptography/ECDSA.sol";
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "../drafts/EIP712.sol"; import "../drafts/EIP712.sol";
import "../cryptography/ECDSA.sol"; import "../cryptography/ECDSA.sol";
contract EIP712External is EIP712 { contract EIP712External is EIP712 {
constructor(string memory name, string memory version) public EIP712(name, version) {} constructor(string memory name, string memory version) EIP712(name, version) {}
function domainSeparator() external view returns (bytes32) { function domainSeparator() external view returns (bytes32) {
return _domainSeparatorV4(); return _domainSeparatorV4();
...@@ -22,10 +22,7 @@ contract EIP712External is EIP712 { ...@@ -22,10 +22,7 @@ contract EIP712External is EIP712 {
require(recoveredSigner == signer); require(recoveredSigner == signer);
} }
function getChainId() external pure returns (uint256 chainId) { function getChainId() external view returns (uint256) {
// solhint-disable-next-line no-inline-assembly return block.chainid;
assembly {
chainId := chainid()
}
} }
} }
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "../token/ERC1155/ERC1155Burnable.sol"; import "../token/ERC1155/ERC1155Burnable.sol";
contract ERC1155BurnableMock is ERC1155Burnable { contract ERC1155BurnableMock is ERC1155Burnable {
constructor(string memory uri) public ERC1155(uri) { } constructor(string memory uri) ERC1155(uri) { }
function mint(address to, uint256 id, uint256 value, bytes memory data) public { function mint(address to, uint256 id, uint256 value, bytes memory data) public {
_mint(to, id, value, data); _mint(to, id, value, data);
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "../token/ERC1155/ERC1155.sol"; import "../token/ERC1155/ERC1155.sol";
...@@ -9,7 +9,7 @@ import "../token/ERC1155/ERC1155.sol"; ...@@ -9,7 +9,7 @@ import "../token/ERC1155/ERC1155.sol";
* This mock just publicizes internal functions for testing purposes * This mock just publicizes internal functions for testing purposes
*/ */
contract ERC1155Mock is ERC1155 { contract ERC1155Mock is ERC1155 {
constructor (string memory uri) public ERC1155(uri) { constructor (string memory uri) ERC1155(uri) {
// solhint-disable-previous-line no-empty-blocks // solhint-disable-previous-line no-empty-blocks
} }
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "./ERC1155Mock.sol"; import "./ERC1155Mock.sol";
import "../token/ERC1155/ERC1155Pausable.sol"; import "../token/ERC1155/ERC1155Pausable.sol";
contract ERC1155PausableMock is ERC1155Mock, ERC1155Pausable { contract ERC1155PausableMock is ERC1155Mock, ERC1155Pausable {
constructor(string memory uri) public ERC1155Mock(uri) { } constructor(string memory uri) ERC1155Mock(uri) { }
function pause() external { function pause() external {
_pause(); _pause();
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "../token/ERC1155/IERC1155Receiver.sol"; import "../token/ERC1155/IERC1155Receiver.sol";
import "./ERC165Mock.sol"; import "./ERC165Mock.sol";
...@@ -20,7 +20,6 @@ contract ERC1155ReceiverMock is IERC1155Receiver, ERC165Mock { ...@@ -20,7 +20,6 @@ contract ERC1155ReceiverMock is IERC1155Receiver, ERC165Mock {
bytes4 batRetval, bytes4 batRetval,
bool batReverts bool batReverts
) )
public
{ {
_recRetval = recRetval; _recRetval = recRetval;
_recReverts = recReverts; _recReverts = recReverts;
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "../../introspection/IERC165.sol"; import "../../introspection/IERC165.sol";
...@@ -29,7 +29,7 @@ contract SupportsInterfaceWithLookupMock is IERC165 { ...@@ -29,7 +29,7 @@ contract SupportsInterfaceWithLookupMock is IERC165 {
* @dev A contract implementing SupportsInterfaceWithLookup * @dev A contract implementing SupportsInterfaceWithLookup
* implement ERC165 itself. * implement ERC165 itself.
*/ */
constructor () public { constructor () {
_registerInterface(INTERFACE_ID_ERC165); _registerInterface(INTERFACE_ID_ERC165);
} }
...@@ -50,7 +50,7 @@ contract SupportsInterfaceWithLookupMock is IERC165 { ...@@ -50,7 +50,7 @@ contract SupportsInterfaceWithLookupMock is IERC165 {
} }
contract ERC165InterfacesSupported is SupportsInterfaceWithLookupMock { contract ERC165InterfacesSupported is SupportsInterfaceWithLookupMock {
constructor (bytes4[] memory interfaceIds) public { constructor (bytes4[] memory interfaceIds) {
for (uint256 i = 0; i < interfaceIds.length; i++) { for (uint256 i = 0; i < interfaceIds.length; i++) {
_registerInterface(interfaceIds[i]); _registerInterface(interfaceIds[i]);
} }
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
contract ERC165NotSupported { } contract ERC165NotSupported { }
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "../introspection/ERC165Checker.sol"; import "../introspection/ERC165Checker.sol";
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "../introspection/ERC165.sol"; import "../introspection/ERC165.sol";
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "../introspection/ERC1820Implementer.sol"; import "../introspection/ERC1820Implementer.sol";
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "../token/ERC20/ERC20Burnable.sol"; import "../token/ERC20/ERC20Burnable.sol";
...@@ -10,7 +10,7 @@ contract ERC20BurnableMock is ERC20Burnable { ...@@ -10,7 +10,7 @@ contract ERC20BurnableMock is ERC20Burnable {
string memory symbol, string memory symbol,
address initialAccount, address initialAccount,
uint256 initialBalance uint256 initialBalance
) public ERC20(name, symbol) { ) ERC20(name, symbol) {
_mint(initialAccount, initialBalance); _mint(initialAccount, initialBalance);
} }
} }
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "../token/ERC20/ERC20Capped.sol"; import "../token/ERC20/ERC20Capped.sol";
contract ERC20CappedMock is ERC20Capped { contract ERC20CappedMock is ERC20Capped {
constructor (string memory name, string memory symbol, uint256 cap) constructor (string memory name, string memory symbol, uint256 cap)
public ERC20(name, symbol) ERC20Capped(cap) ERC20(name, symbol) ERC20Capped(cap)
{ } { }
function mint(address to, uint256 tokenId) public { function mint(address to, uint256 tokenId) public {
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "../token/ERC20/ERC20.sol"; import "../token/ERC20/ERC20.sol";
contract ERC20DecimalsMock is ERC20 { contract ERC20DecimalsMock is ERC20 {
constructor (string memory name, string memory symbol, uint8 decimals) public ERC20(name, symbol) { constructor (string memory name, string memory symbol, uint8 decimals) ERC20(name, symbol) {
_setupDecimals(decimals); _setupDecimals(decimals);
} }
} }
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "../token/ERC20/ERC20.sol"; import "../token/ERC20/ERC20.sol";
...@@ -11,7 +11,7 @@ contract ERC20Mock is ERC20 { ...@@ -11,7 +11,7 @@ contract ERC20Mock is ERC20 {
string memory symbol, string memory symbol,
address initialAccount, address initialAccount,
uint256 initialBalance uint256 initialBalance
) public payable ERC20(name, symbol) { ) payable ERC20(name, symbol) {
_mint(initialAccount, initialBalance); _mint(initialAccount, initialBalance);
} }
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "../token/ERC20/ERC20Pausable.sol"; import "../token/ERC20/ERC20Pausable.sol";
...@@ -11,7 +11,7 @@ contract ERC20PausableMock is ERC20Pausable { ...@@ -11,7 +11,7 @@ contract ERC20PausableMock is ERC20Pausable {
string memory symbol, string memory symbol,
address initialAccount, address initialAccount,
uint256 initialBalance uint256 initialBalance
) public ERC20(name, symbol) { ) ERC20(name, symbol) {
_mint(initialAccount, initialBalance); _mint(initialAccount, initialBalance);
} }
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "../drafts/ERC20Permit.sol"; import "../drafts/ERC20Permit.sol";
...@@ -10,14 +10,11 @@ contract ERC20PermitMock is ERC20Permit { ...@@ -10,14 +10,11 @@ contract ERC20PermitMock is ERC20Permit {
string memory symbol, string memory symbol,
address initialAccount, address initialAccount,
uint256 initialBalance uint256 initialBalance
) public payable ERC20(name, symbol) ERC20Permit(name) { ) payable ERC20(name, symbol) ERC20Permit(name) {
_mint(initialAccount, initialBalance); _mint(initialAccount, initialBalance);
} }
function getChainId() external pure returns (uint256 chainId) { function getChainId() external view returns (uint256) {
// solhint-disable-next-line no-inline-assembly return block.chainid;
assembly {
chainId := chainid()
}
} }
} }
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "../token/ERC20/ERC20Snapshot.sol"; import "../token/ERC20/ERC20Snapshot.sol";
...@@ -11,7 +11,7 @@ contract ERC20SnapshotMock is ERC20Snapshot { ...@@ -11,7 +11,7 @@ contract ERC20SnapshotMock is ERC20Snapshot {
string memory symbol, string memory symbol,
address initialAccount, address initialAccount,
uint256 initialBalance uint256 initialBalance
) public ERC20(name, symbol) { ) ERC20(name, symbol) {
_mint(initialAccount, initialBalance); _mint(initialAccount, initialBalance);
} }
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "../token/ERC721/ERC721Burnable.sol"; import "../token/ERC721/ERC721Burnable.sol";
contract ERC721BurnableMock is ERC721Burnable { contract ERC721BurnableMock is ERC721Burnable {
constructor(string memory name, string memory symbol) public ERC721(name, symbol) { } constructor(string memory name, string memory symbol) ERC721(name, symbol) { }
function mint(address to, uint256 tokenId) public { function mint(address to, uint256 tokenId) public {
_mint(to, tokenId); _mint(to, tokenId);
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "../token/ERC721/ERC721.sol"; import "../token/ERC721/ERC721.sol";
import "../GSN/GSNRecipient.sol"; import "../GSN/GSNRecipient.sol";
...@@ -12,7 +12,6 @@ import "../GSN/GSNRecipientSignature.sol"; ...@@ -12,7 +12,6 @@ import "../GSN/GSNRecipientSignature.sol";
*/ */
contract ERC721GSNRecipientMock is ERC721, GSNRecipient, GSNRecipientSignature { contract ERC721GSNRecipientMock is ERC721, GSNRecipient, GSNRecipientSignature {
constructor(string memory name, string memory symbol, address trustedSigner) constructor(string memory name, string memory symbol, address trustedSigner)
public
ERC721(name, symbol) ERC721(name, symbol)
GSNRecipientSignature(trustedSigner) GSNRecipientSignature(trustedSigner)
{ } { }
...@@ -21,7 +20,7 @@ contract ERC721GSNRecipientMock is ERC721, GSNRecipient, GSNRecipientSignature { ...@@ -21,7 +20,7 @@ contract ERC721GSNRecipientMock is ERC721, GSNRecipient, GSNRecipientSignature {
_mint(_msgSender(), tokenId); _mint(_msgSender(), tokenId);
} }
function _msgSender() internal view override(Context, GSNRecipient) returns (address payable) { function _msgSender() internal view override(Context, GSNRecipient) returns (address) {
return GSNRecipient._msgSender(); return GSNRecipient._msgSender();
} }
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "../token/ERC721/ERC721.sol"; import "../token/ERC721/ERC721.sol";
...@@ -9,7 +9,7 @@ import "../token/ERC721/ERC721.sol"; ...@@ -9,7 +9,7 @@ import "../token/ERC721/ERC721.sol";
* This mock just provides a public safeMint, mint, and burn functions for testing purposes * This mock just provides a public safeMint, mint, and burn functions for testing purposes
*/ */
contract ERC721Mock is ERC721 { contract ERC721Mock is ERC721 {
constructor (string memory name, string memory symbol) public ERC721(name, symbol) { } constructor (string memory name, string memory symbol) ERC721(name, symbol) { }
function exists(uint256 tokenId) public view returns (bool) { function exists(uint256 tokenId) public view returns (bool) {
return _exists(tokenId); return _exists(tokenId);
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "../token/ERC721/ERC721Pausable.sol"; import "../token/ERC721/ERC721Pausable.sol";
...@@ -9,7 +9,7 @@ import "../token/ERC721/ERC721Pausable.sol"; ...@@ -9,7 +9,7 @@ import "../token/ERC721/ERC721Pausable.sol";
* This mock just provides a public mint, burn and exists functions for testing purposes * This mock just provides a public mint, burn and exists functions for testing purposes
*/ */
contract ERC721PausableMock is ERC721Pausable { contract ERC721PausableMock is ERC721Pausable {
constructor (string memory name, string memory symbol) public ERC721(name, symbol) { } constructor (string memory name, string memory symbol) ERC721(name, symbol) { }
function mint(address to, uint256 tokenId) public { function mint(address to, uint256 tokenId) public {
super._mint(to, tokenId); super._mint(to, tokenId);
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "../token/ERC721/IERC721Receiver.sol"; import "../token/ERC721/IERC721Receiver.sol";
...@@ -10,7 +10,7 @@ contract ERC721ReceiverMock is IERC721Receiver { ...@@ -10,7 +10,7 @@ contract ERC721ReceiverMock is IERC721Receiver {
event Received(address operator, address from, uint256 tokenId, bytes data, uint256 gas); event Received(address operator, address from, uint256 tokenId, bytes data, uint256 gas);
constructor (bytes4 retval, bool reverts) public { constructor (bytes4 retval, bool reverts) {
_retval = retval; _retval = retval;
_reverts = reverts; _reverts = reverts;
} }
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "../GSN/Context.sol"; import "../GSN/Context.sol";
import "../token/ERC777/ERC777.sol"; import "../token/ERC777/ERC777.sol";
...@@ -12,7 +12,7 @@ contract ERC777Mock is Context, ERC777 { ...@@ -12,7 +12,7 @@ contract ERC777Mock is Context, ERC777 {
string memory name, string memory name,
string memory symbol, string memory symbol,
address[] memory defaultOperators address[] memory defaultOperators
) public ERC777(name, symbol, defaultOperators) { ) ERC777(name, symbol, defaultOperators) {
_mint(initialHolder, initialBalance, "", ""); _mint(initialHolder, initialBalance, "", "");
} }
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "../GSN/Context.sol"; import "../GSN/Context.sol";
import "../token/ERC777/IERC777.sol"; import "../token/ERC777/IERC777.sol";
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "../utils/EnumerableMap.sol"; import "../utils/EnumerableMap.sol";
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "../utils/EnumerableSet.sol"; import "../utils/EnumerableSet.sol";
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
contract EtherReceiverMock { contract EtherReceiverMock {
bool private _acceptEther; bool private _acceptEther;
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "../GSN/GSNRecipient.sol"; import "../GSN/GSNRecipient.sol";
import "../GSN/GSNRecipientERC20Fee.sol"; import "../GSN/GSNRecipientERC20Fee.sol";
contract GSNRecipientERC20FeeMock is GSNRecipient, GSNRecipientERC20Fee { contract GSNRecipientERC20FeeMock is GSNRecipient, GSNRecipientERC20Fee {
constructor(string memory name, string memory symbol) public GSNRecipientERC20Fee(name, symbol) { } constructor(string memory name, string memory symbol) GSNRecipientERC20Fee(name, symbol) { }
function mint(address account, uint256 amount) public { function mint(address account, uint256 amount) public {
_mint(account, amount); _mint(account, amount);
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "./ContextMock.sol"; import "./ContextMock.sol";
import "../GSN/GSNRecipient.sol"; import "../GSN/GSNRecipient.sol";
...@@ -28,7 +28,7 @@ contract GSNRecipientMock is ContextMock, GSNRecipient { ...@@ -28,7 +28,7 @@ contract GSNRecipientMock is ContextMock, GSNRecipient {
return _upgradeRelayHub(newRelayHub); return _upgradeRelayHub(newRelayHub);
} }
function _msgSender() internal override(Context, GSNRecipient) view virtual returns (address payable) { function _msgSender() internal override(Context, GSNRecipient) view virtual returns (address) {
return GSNRecipient._msgSender(); return GSNRecipient._msgSender();
} }
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "../GSN/GSNRecipient.sol"; import "../GSN/GSNRecipient.sol";
import "../GSN/GSNRecipientSignature.sol"; import "../GSN/GSNRecipientSignature.sol";
contract GSNRecipientSignatureMock is GSNRecipient, GSNRecipientSignature { contract GSNRecipientSignatureMock is GSNRecipient, GSNRecipientSignature {
constructor(address trustedSigner) public GSNRecipientSignature(trustedSigner) { } constructor(address trustedSigner) GSNRecipientSignature(trustedSigner) { }
event MockFunctionCalled(); event MockFunctionCalled();
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "../proxy/Initializable.sol"; import "../proxy/Initializable.sol";
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "../math/Math.sol"; import "../math/Math.sol";
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import { MerkleProof } from "../cryptography/MerkleProof.sol"; import { MerkleProof } from "../cryptography/MerkleProof.sol";
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "../proxy/Initializable.sol"; import "../proxy/Initializable.sol";
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "../access/Ownable.sol"; import "../access/Ownable.sol";
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "../utils/Pausable.sol"; import "../utils/Pausable.sol";
...@@ -8,7 +8,7 @@ contract PausableMock is Pausable { ...@@ -8,7 +8,7 @@ contract PausableMock is Pausable {
bool public drasticMeasureTaken; bool public drasticMeasureTaken;
uint256 public count; uint256 public count;
constructor () public { constructor () {
drasticMeasureTaken = false; drasticMeasureTaken = false;
count = 0; count = 0;
} }
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "../payment/PullPayment.sol"; import "../payment/PullPayment.sol";
// mock class using PullPayment // mock class using PullPayment
contract PullPaymentMock is PullPayment { contract PullPaymentMock is PullPayment {
constructor () public payable { } constructor () payable { }
// test helper function to call asyncTransfer // test helper function to call asyncTransfer
function callTransfer(address dest, uint256 amount) public { function callTransfer(address dest, uint256 amount) public {
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "../GSN/Context.sol"; import "../GSN/Context.sol";
contract ReentrancyAttack is Context { contract ReentrancyAttack is Context {
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "../utils/ReentrancyGuard.sol"; import "../utils/ReentrancyGuard.sol";
import "./ReentrancyAttack.sol"; import "./ReentrancyAttack.sol";
...@@ -8,7 +8,7 @@ import "./ReentrancyAttack.sol"; ...@@ -8,7 +8,7 @@ import "./ReentrancyAttack.sol";
contract ReentrancyMock is ReentrancyGuard { contract ReentrancyMock is ReentrancyGuard {
uint256 public counter; uint256 public counter;
constructor () public { constructor () {
counter = 0; counter = 0;
} }
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "../proxy/Initializable.sol"; import "../proxy/Initializable.sol";
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "../utils/SafeCast.sol"; import "../utils/SafeCast.sol";
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "../GSN/Context.sol"; import "../GSN/Context.sol";
import "../token/ERC20/IERC20.sol"; import "../token/ERC20/IERC20.sol";
...@@ -98,7 +98,7 @@ contract SafeERC20Wrapper is Context { ...@@ -98,7 +98,7 @@ contract SafeERC20Wrapper is Context {
IERC20 private _token; IERC20 private _token;
constructor (IERC20 token) public { constructor (IERC20 token) {
_token = token; _token = token;
} }
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "../math/SafeMath.sol"; import "../math/SafeMath.sol";
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "../math/SignedSafeMath.sol"; import "../math/SignedSafeMath.sol";
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "../proxy/Initializable.sol"; import "../proxy/Initializable.sol";
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "../utils/Strings.sol"; import "../utils/Strings.sol";
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "../GSN/Context.sol"; import "../GSN/Context.sol";
import "../math/SafeMath.sol";
/** /**
* @title PaymentSplitter * @title PaymentSplitter
...@@ -19,8 +18,6 @@ import "../math/SafeMath.sol"; ...@@ -19,8 +18,6 @@ import "../math/SafeMath.sol";
* function. * function.
*/ */
contract PaymentSplitter is Context { contract PaymentSplitter is Context {
using SafeMath for uint256;
event PayeeAdded(address account, uint256 shares); event PayeeAdded(address account, uint256 shares);
event PaymentReleased(address to, uint256 amount); event PaymentReleased(address to, uint256 amount);
event PaymentReceived(address from, uint256 amount); event PaymentReceived(address from, uint256 amount);
...@@ -39,7 +36,7 @@ contract PaymentSplitter is Context { ...@@ -39,7 +36,7 @@ contract PaymentSplitter is Context {
* All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no * All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no
* duplicates in `payees`. * duplicates in `payees`.
*/ */
constructor (address[] memory payees, uint256[] memory shares_) public payable { constructor (address[] memory payees, uint256[] memory shares_) payable {
// solhint-disable-next-line max-line-length // solhint-disable-next-line max-line-length
require(payees.length == shares_.length, "PaymentSplitter: payees and shares length mismatch"); require(payees.length == shares_.length, "PaymentSplitter: payees and shares length mismatch");
require(payees.length > 0, "PaymentSplitter: no payees"); require(payees.length > 0, "PaymentSplitter: no payees");
...@@ -104,13 +101,13 @@ contract PaymentSplitter is Context { ...@@ -104,13 +101,13 @@ contract PaymentSplitter is Context {
function release(address payable account) public virtual { function release(address payable account) public virtual {
require(_shares[account] > 0, "PaymentSplitter: account has no shares"); require(_shares[account] > 0, "PaymentSplitter: account has no shares");
uint256 totalReceived = address(this).balance.add(_totalReleased); uint256 totalReceived = address(this).balance + _totalReleased;
uint256 payment = totalReceived.mul(_shares[account]).div(_totalShares).sub(_released[account]); uint256 payment = totalReceived * _shares[account] / _totalShares - _released[account];
require(payment != 0, "PaymentSplitter: account is not due payment"); require(payment != 0, "PaymentSplitter: account is not due payment");
_released[account] = _released[account].add(payment); _released[account] = _released[account] + payment;
_totalReleased = _totalReleased.add(payment); _totalReleased = _totalReleased + payment;
account.transfer(payment); account.transfer(payment);
emit PaymentReleased(account, payment); emit PaymentReleased(account, payment);
...@@ -128,7 +125,7 @@ contract PaymentSplitter is Context { ...@@ -128,7 +125,7 @@ contract PaymentSplitter is Context {
_payees.push(account); _payees.push(account);
_shares[account] = shares_; _shares[account] = shares_;
_totalShares = _totalShares.add(shares_); _totalShares = _totalShares + shares_;
emit PayeeAdded(account, shares_); emit PayeeAdded(account, shares_);
} }
} }
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.2 <0.8.0; pragma solidity ^0.8.0;
import "./escrow/Escrow.sol"; import "./escrow/Escrow.sol";
...@@ -25,7 +25,7 @@ import "./escrow/Escrow.sol"; ...@@ -25,7 +25,7 @@ import "./escrow/Escrow.sol";
abstract contract PullPayment { abstract contract PullPayment {
Escrow private _escrow; Escrow private _escrow;
constructor () internal { constructor () {
_escrow = new Escrow(); _escrow = new Escrow();
} }
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "./Escrow.sol"; import "./Escrow.sol";
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "../../math/SafeMath.sol";
import "../../access/Ownable.sol"; import "../../access/Ownable.sol";
import "../../utils/Address.sol"; import "../../utils/Address.sol";
...@@ -20,7 +19,6 @@ import "../../utils/Address.sol"; ...@@ -20,7 +19,6 @@ import "../../utils/Address.sol";
* to the escrow's deposit and withdraw. * to the escrow's deposit and withdraw.
*/ */
contract Escrow is Ownable { contract Escrow is Ownable {
using SafeMath for uint256;
using Address for address payable; using Address for address payable;
event Deposited(address indexed payee, uint256 weiAmount); event Deposited(address indexed payee, uint256 weiAmount);
...@@ -38,7 +36,7 @@ contract Escrow is Ownable { ...@@ -38,7 +36,7 @@ contract Escrow is Ownable {
*/ */
function deposit(address payee) public virtual payable onlyOwner { function deposit(address payee) public virtual payable onlyOwner {
uint256 amount = msg.value; uint256 amount = msg.value;
_deposits[payee] = _deposits[payee].add(amount); _deposits[payee] = _deposits[payee] + amount;
emit Deposited(payee, amount); emit Deposited(payee, amount);
} }
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "./ConditionalEscrow.sol"; import "./ConditionalEscrow.sol";
...@@ -27,7 +27,7 @@ contract RefundEscrow is ConditionalEscrow { ...@@ -27,7 +27,7 @@ contract RefundEscrow is ConditionalEscrow {
* @dev Constructor. * @dev Constructor.
* @param beneficiary_ The beneficiary of the deposits. * @param beneficiary_ The beneficiary of the deposits.
*/ */
constructor (address payable beneficiary_) public { constructor (address payable beneficiary_) {
require(beneficiary_ != address(0), "RefundEscrow: beneficiary is the zero address"); require(beneficiary_ != address(0), "RefundEscrow: beneficiary is the zero address");
_beneficiary = beneficiary_; _beneficiary = beneficiary_;
_state = State.Active; _state = State.Active;
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "../access/AccessControl.sol"; import "../access/AccessControl.sol";
import "../GSN/Context.sol"; import "../GSN/Context.sol";
...@@ -30,7 +30,7 @@ contract ERC1155PresetMinterPauser is Context, AccessControl, ERC1155Burnable, E ...@@ -30,7 +30,7 @@ contract ERC1155PresetMinterPauser is Context, AccessControl, ERC1155Burnable, E
* @dev Grants `DEFAULT_ADMIN_ROLE`, `MINTER_ROLE`, and `PAUSER_ROLE` to the account that * @dev Grants `DEFAULT_ADMIN_ROLE`, `MINTER_ROLE`, and `PAUSER_ROLE` to the account that
* deploys the contract. * deploys the contract.
*/ */
constructor(string memory uri) public ERC1155(uri) { constructor(string memory uri) ERC1155(uri) {
_setupRole(DEFAULT_ADMIN_ROLE, _msgSender()); _setupRole(DEFAULT_ADMIN_ROLE, _msgSender());
_setupRole(MINTER_ROLE, _msgSender()); _setupRole(MINTER_ROLE, _msgSender());
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity ^0.6.2; pragma solidity ^0.8.0;
import "../token/ERC20/ERC20Burnable.sol"; import "../token/ERC20/ERC20Burnable.sol";
...@@ -24,7 +24,7 @@ contract ERC20PresetFixedSupply is ERC20Burnable { ...@@ -24,7 +24,7 @@ contract ERC20PresetFixedSupply is ERC20Burnable {
string memory symbol, string memory symbol,
uint256 initialSupply, uint256 initialSupply,
address owner address owner
) public ERC20(name, symbol) { ) ERC20(name, symbol) {
_mint(owner, initialSupply); _mint(owner, initialSupply);
} }
} }
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "../access/AccessControl.sol"; import "../access/AccessControl.sol";
import "../GSN/Context.sol"; import "../GSN/Context.sol";
...@@ -32,7 +32,7 @@ contract ERC20PresetMinterPauser is Context, AccessControl, ERC20Burnable, ERC20 ...@@ -32,7 +32,7 @@ contract ERC20PresetMinterPauser is Context, AccessControl, ERC20Burnable, ERC20
* *
* See {ERC20-constructor}. * See {ERC20-constructor}.
*/ */
constructor(string memory name, string memory symbol) public ERC20(name, symbol) { constructor(string memory name, string memory symbol) ERC20(name, symbol) {
_setupRole(DEFAULT_ADMIN_ROLE, _msgSender()); _setupRole(DEFAULT_ADMIN_ROLE, _msgSender());
_setupRole(MINTER_ROLE, _msgSender()); _setupRole(MINTER_ROLE, _msgSender());
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "../access/AccessControl.sol"; import "../access/AccessControl.sol";
import "../GSN/Context.sol"; import "../GSN/Context.sol";
...@@ -39,7 +39,7 @@ contract ERC721PresetMinterPauserAutoId is Context, AccessControl, ERC721Burnabl ...@@ -39,7 +39,7 @@ contract ERC721PresetMinterPauserAutoId is Context, AccessControl, ERC721Burnabl
* Token URIs will be autogenerated based on `baseURI` and their token IDs. * Token URIs will be autogenerated based on `baseURI` and their token IDs.
* See {ERC721-tokenURI}. * See {ERC721-tokenURI}.
*/ */
constructor(string memory name, string memory symbol, string memory baseURI) public ERC721(name, symbol) { constructor(string memory name, string memory symbol, string memory baseURI) ERC721(name, symbol) {
_setupRole(DEFAULT_ADMIN_ROLE, _msgSender()); _setupRole(DEFAULT_ADMIN_ROLE, _msgSender());
_setupRole(MINTER_ROLE, _msgSender()); _setupRole(MINTER_ROLE, _msgSender());
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity ^0.6.2; pragma solidity ^0.8.0;
import "../token/ERC777/ERC777.sol"; import "../token/ERC777/ERC777.sol";
...@@ -21,7 +21,7 @@ contract ERC777PresetFixedSupply is ERC777 { ...@@ -21,7 +21,7 @@ contract ERC777PresetFixedSupply is ERC777 {
address[] memory defaultOperators, address[] memory defaultOperators,
uint256 initialSupply, uint256 initialSupply,
address owner address owner
) public ERC777(name, symbol, defaultOperators) { ) ERC777(name, symbol, defaultOperators) {
_mint(owner, initialSupply, "", ""); _mint(owner, initialSupply, "", "");
} }
} }
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "./Proxy.sol"; import "./Proxy.sol";
import "../utils/Address.sol"; import "../utils/Address.sol";
...@@ -30,7 +30,7 @@ contract BeaconProxy is Proxy { ...@@ -30,7 +30,7 @@ contract BeaconProxy is Proxy {
* *
* - `beacon` must be a contract with the interface {IBeacon}. * - `beacon` must be a contract with the interface {IBeacon}.
*/ */
constructor(address beacon, bytes memory data) public payable { constructor(address beacon, bytes memory data) payable {
assert(_BEACON_SLOT == bytes32(uint256(keccak256("eip1967.proxy.beacon")) - 1)); assert(_BEACON_SLOT == bytes32(uint256(keccak256("eip1967.proxy.beacon")) - 1));
_setBeacon(beacon, data); _setBeacon(beacon, data);
} }
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
/** /**
* @dev This is the interface that {BeaconProxy} expects of its beacon. * @dev This is the interface that {BeaconProxy} expects of its beacon.
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
// solhint-disable-next-line compiler-version // solhint-disable-next-line compiler-version
pragma solidity >=0.4.24 <0.8.0; pragma solidity ^0.8.0;
/** /**
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
/** /**
* @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "../access/Ownable.sol"; import "../access/Ownable.sol";
import "./TransparentUpgradeableProxy.sol"; import "./TransparentUpgradeableProxy.sol";
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "./UpgradeableProxy.sol"; import "./UpgradeableProxy.sol";
...@@ -30,7 +30,7 @@ contract TransparentUpgradeableProxy is UpgradeableProxy { ...@@ -30,7 +30,7 @@ contract TransparentUpgradeableProxy is UpgradeableProxy {
* @dev Initializes an upgradeable proxy managed by `_admin`, backed by the implementation at `_logic`, and * @dev Initializes an upgradeable proxy managed by `_admin`, backed by the implementation at `_logic`, and
* optionally initialized with `_data` as explained in {UpgradeableProxy-constructor}. * optionally initialized with `_data` as explained in {UpgradeableProxy-constructor}.
*/ */
constructor(address _logic, address admin_, bytes memory _data) public payable UpgradeableProxy(_logic, _data) { constructor(address _logic, address admin_, bytes memory _data) payable UpgradeableProxy(_logic, _data) {
assert(_ADMIN_SLOT == bytes32(uint256(keccak256("eip1967.proxy.admin")) - 1)); assert(_ADMIN_SLOT == bytes32(uint256(keccak256("eip1967.proxy.admin")) - 1));
_setAdmin(admin_); _setAdmin(admin_);
} }
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "./IBeacon.sol"; import "./IBeacon.sol";
import "../access/Ownable.sol"; import "../access/Ownable.sol";
...@@ -24,7 +24,7 @@ contract UpgradeableBeacon is IBeacon, Ownable { ...@@ -24,7 +24,7 @@ contract UpgradeableBeacon is IBeacon, Ownable {
* @dev Sets the address of the initial implementation, and the deployer account as the owner who can upgrade the * @dev Sets the address of the initial implementation, and the deployer account as the owner who can upgrade the
* beacon. * beacon.
*/ */
constructor(address implementation_) public { constructor(address implementation_) {
_setImplementation(implementation_); _setImplementation(implementation_);
} }
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "./Proxy.sol"; import "./Proxy.sol";
import "../utils/Address.sol"; import "../utils/Address.sol";
...@@ -21,7 +21,7 @@ contract UpgradeableProxy is Proxy { ...@@ -21,7 +21,7 @@ contract UpgradeableProxy is Proxy {
* If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded * If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded
* function call, and allows initializating the storage of the proxy like a Solidity constructor. * function call, and allows initializating the storage of the proxy like a Solidity constructor.
*/ */
constructor(address _logic, bytes memory _data) public payable { constructor(address _logic, bytes memory _data) payable {
assert(_IMPLEMENTATION_SLOT == bytes32(uint256(keccak256("eip1967.proxy.implementation")) - 1)); assert(_IMPLEMENTATION_SLOT == bytes32(uint256(keccak256("eip1967.proxy.implementation")) - 1));
_setImplementation(_logic); _setImplementation(_logic);
if(_data.length > 0) { if(_data.length > 0) {
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "./IERC1155.sol"; import "./IERC1155.sol";
import "./IERC1155MetadataURI.sol"; import "./IERC1155MetadataURI.sol";
import "./IERC1155Receiver.sol"; import "./IERC1155Receiver.sol";
import "../../GSN/Context.sol"; import "../../GSN/Context.sol";
import "../../introspection/ERC165.sol"; import "../../introspection/ERC165.sol";
import "../../math/SafeMath.sol";
import "../../utils/Address.sol"; import "../../utils/Address.sol";
/** /**
...@@ -19,7 +18,6 @@ import "../../utils/Address.sol"; ...@@ -19,7 +18,6 @@ import "../../utils/Address.sol";
* _Available since v3.1._ * _Available since v3.1._
*/ */
contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI { contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
using SafeMath for uint256;
using Address for address; using Address for address;
// Mapping from token ID to account balances // Mapping from token ID to account balances
...@@ -52,7 +50,7 @@ contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI { ...@@ -52,7 +50,7 @@ contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
/** /**
* @dev See {_setURI}. * @dev See {_setURI}.
*/ */
constructor (string memory uri_) public { constructor (string memory uri_) {
_setURI(uri_); _setURI(uri_);
// register the supported interfaces to conform to ERC1155 via ERC165 // register the supported interfaces to conform to ERC1155 via ERC165
...@@ -157,8 +155,8 @@ contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI { ...@@ -157,8 +155,8 @@ contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
_beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), data); _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), data);
_balances[id][from] = _balances[id][from].sub(amount, "ERC1155: insufficient balance for transfer"); _balances[id][from] = _balances[id][from] - amount;
_balances[id][to] = _balances[id][to].add(amount); _balances[id][to] = _balances[id][to] + amount;
emit TransferSingle(operator, from, to, id, amount); emit TransferSingle(operator, from, to, id, amount);
...@@ -194,11 +192,8 @@ contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI { ...@@ -194,11 +192,8 @@ contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
uint256 id = ids[i]; uint256 id = ids[i];
uint256 amount = amounts[i]; uint256 amount = amounts[i];
_balances[id][from] = _balances[id][from].sub( _balances[id][from] = _balances[id][from] - amount;
amount, _balances[id][to] = _balances[id][to] + amount;
"ERC1155: insufficient balance for transfer"
);
_balances[id][to] = _balances[id][to].add(amount);
} }
emit TransferBatch(operator, from, to, ids, amounts); emit TransferBatch(operator, from, to, ids, amounts);
...@@ -247,7 +242,7 @@ contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI { ...@@ -247,7 +242,7 @@ contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
_beforeTokenTransfer(operator, address(0), account, _asSingletonArray(id), _asSingletonArray(amount), data); _beforeTokenTransfer(operator, address(0), account, _asSingletonArray(id), _asSingletonArray(amount), data);
_balances[id][account] = _balances[id][account].add(amount); _balances[id][account] = _balances[id][account] + amount;
emit TransferSingle(operator, address(0), account, id, amount); emit TransferSingle(operator, address(0), account, id, amount);
_doSafeTransferAcceptanceCheck(operator, address(0), account, id, amount, data); _doSafeTransferAcceptanceCheck(operator, address(0), account, id, amount, data);
...@@ -271,7 +266,7 @@ contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI { ...@@ -271,7 +266,7 @@ contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
_beforeTokenTransfer(operator, address(0), to, ids, amounts, data); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);
for (uint i = 0; i < ids.length; i++) { for (uint i = 0; i < ids.length; i++) {
_balances[ids[i]][to] = amounts[i].add(_balances[ids[i]][to]); _balances[ids[i]][to] = amounts[i] + _balances[ids[i]][to];
} }
emit TransferBatch(operator, address(0), to, ids, amounts); emit TransferBatch(operator, address(0), to, ids, amounts);
...@@ -294,10 +289,7 @@ contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI { ...@@ -294,10 +289,7 @@ contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
_beforeTokenTransfer(operator, account, address(0), _asSingletonArray(id), _asSingletonArray(amount), ""); _beforeTokenTransfer(operator, account, address(0), _asSingletonArray(id), _asSingletonArray(amount), "");
_balances[id][account] = _balances[id][account].sub( _balances[id][account] = _balances[id][account] - amount;
amount,
"ERC1155: burn amount exceeds balance"
);
emit TransferSingle(operator, account, address(0), id, amount); emit TransferSingle(operator, account, address(0), id, amount);
} }
...@@ -318,10 +310,7 @@ contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI { ...@@ -318,10 +310,7 @@ contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
_beforeTokenTransfer(operator, account, address(0), ids, amounts, ""); _beforeTokenTransfer(operator, account, address(0), ids, amounts, "");
for (uint i = 0; i < ids.length; i++) { for (uint i = 0; i < ids.length; i++) {
_balances[ids[i]][account] = _balances[ids[i]][account].sub( _balances[ids[i]][account] = _balances[ids[i]][account] - amounts[i];
amounts[i],
"ERC1155: burn amount exceeds balance"
);
} }
emit TransferBatch(operator, account, address(0), ids, amounts); emit TransferBatch(operator, account, address(0), ids, amounts);
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "./ERC1155.sol"; import "./ERC1155.sol";
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "./ERC1155Receiver.sol"; import "./ERC1155Receiver.sol";
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "./ERC1155.sol"; import "./ERC1155.sol";
import "../../utils/Pausable.sol"; import "../../utils/Pausable.sol";
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "./IERC1155Receiver.sol"; import "./IERC1155Receiver.sol";
import "../../introspection/ERC165.sol"; import "../../introspection/ERC165.sol";
...@@ -9,7 +9,7 @@ import "../../introspection/ERC165.sol"; ...@@ -9,7 +9,7 @@ import "../../introspection/ERC165.sol";
* @dev _Available since v3.1._ * @dev _Available since v3.1._
*/ */
abstract contract ERC1155Receiver is ERC165, IERC1155Receiver { abstract contract ERC1155Receiver is ERC165, IERC1155Receiver {
constructor() internal { constructor() {
_registerInterface( _registerInterface(
ERC1155Receiver(address(0)).onERC1155Received.selector ^ ERC1155Receiver(address(0)).onERC1155Received.selector ^
ERC1155Receiver(address(0)).onERC1155BatchReceived.selector ERC1155Receiver(address(0)).onERC1155BatchReceived.selector
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.2 <0.8.0; pragma solidity ^0.8.0;
import "../../introspection/IERC165.sol"; import "../../introspection/IERC165.sol";
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.2 <0.8.0; pragma solidity ^0.8.0;
import "./IERC1155.sol"; import "./IERC1155.sol";
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "../../introspection/IERC165.sol"; import "../../introspection/IERC165.sol";
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "../../GSN/Context.sol"; import "../../GSN/Context.sol";
import "./IERC20.sol"; import "./IERC20.sol";
import "../../math/SafeMath.sol";
/** /**
* @dev Implementation of the {IERC20} interface. * @dev Implementation of the {IERC20} interface.
...@@ -31,8 +30,6 @@ import "../../math/SafeMath.sol"; ...@@ -31,8 +30,6 @@ import "../../math/SafeMath.sol";
* allowances. See {IERC20-approve}. * allowances. See {IERC20-approve}.
*/ */
contract ERC20 is Context, IERC20 { contract ERC20 is Context, IERC20 {
using SafeMath for uint256;
mapping (address => uint256) private _balances; mapping (address => uint256) private _balances;
mapping (address => mapping (address => uint256)) private _allowances; mapping (address => mapping (address => uint256)) private _allowances;
...@@ -52,7 +49,7 @@ contract ERC20 is Context, IERC20 { ...@@ -52,7 +49,7 @@ contract ERC20 is Context, IERC20 {
* All three of these values are immutable: they can only be set once during * All three of these values are immutable: they can only be set once during
* construction. * construction.
*/ */
constructor (string memory name_, string memory symbol_) public { constructor (string memory name_, string memory symbol_) {
_name = name_; _name = name_;
_symbol = symbol_; _symbol = symbol_;
_decimals = 18; _decimals = 18;
...@@ -151,7 +148,7 @@ contract ERC20 is Context, IERC20 { ...@@ -151,7 +148,7 @@ contract ERC20 is Context, IERC20 {
*/ */
function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) { function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
_transfer(sender, recipient, amount); _transfer(sender, recipient, amount);
_approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - amount);
return true; return true;
} }
...@@ -168,7 +165,7 @@ contract ERC20 is Context, IERC20 { ...@@ -168,7 +165,7 @@ contract ERC20 is Context, IERC20 {
* - `spender` cannot be the zero address. * - `spender` cannot be the zero address.
*/ */
function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
_approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);
return true; return true;
} }
...@@ -187,7 +184,7 @@ contract ERC20 is Context, IERC20 { ...@@ -187,7 +184,7 @@ contract ERC20 is Context, IERC20 {
* `subtractedValue`. * `subtractedValue`.
*/ */
function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
_approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue);
return true; return true;
} }
...@@ -211,8 +208,8 @@ contract ERC20 is Context, IERC20 { ...@@ -211,8 +208,8 @@ contract ERC20 is Context, IERC20 {
_beforeTokenTransfer(sender, recipient, amount); _beforeTokenTransfer(sender, recipient, amount);
_balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); _balances[sender] = _balances[sender] - amount;
_balances[recipient] = _balances[recipient].add(amount); _balances[recipient] = _balances[recipient] + amount;
emit Transfer(sender, recipient, amount); emit Transfer(sender, recipient, amount);
} }
...@@ -230,8 +227,8 @@ contract ERC20 is Context, IERC20 { ...@@ -230,8 +227,8 @@ contract ERC20 is Context, IERC20 {
_beforeTokenTransfer(address(0), account, amount); _beforeTokenTransfer(address(0), account, amount);
_totalSupply = _totalSupply.add(amount); _totalSupply = _totalSupply + amount;
_balances[account] = _balances[account].add(amount); _balances[account] = _balances[account] + amount;
emit Transfer(address(0), account, amount); emit Transfer(address(0), account, amount);
} }
...@@ -251,8 +248,8 @@ contract ERC20 is Context, IERC20 { ...@@ -251,8 +248,8 @@ contract ERC20 is Context, IERC20 {
_beforeTokenTransfer(account, address(0), amount); _beforeTokenTransfer(account, address(0), amount);
_balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance"); _balances[account] = _balances[account] - amount;
_totalSupply = _totalSupply.sub(amount); _totalSupply = _totalSupply - amount;
emit Transfer(account, address(0), amount); emit Transfer(account, address(0), amount);
} }
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "../../GSN/Context.sol"; import "../../GSN/Context.sol";
import "./ERC20.sol"; import "./ERC20.sol";
...@@ -11,8 +11,6 @@ import "./ERC20.sol"; ...@@ -11,8 +11,6 @@ import "./ERC20.sol";
* recognized off-chain (via event analysis). * recognized off-chain (via event analysis).
*/ */
abstract contract ERC20Burnable is Context, ERC20 { abstract contract ERC20Burnable is Context, ERC20 {
using SafeMath for uint256;
/** /**
* @dev Destroys `amount` tokens from the caller. * @dev Destroys `amount` tokens from the caller.
* *
...@@ -34,7 +32,7 @@ abstract contract ERC20Burnable is Context, ERC20 { ...@@ -34,7 +32,7 @@ abstract contract ERC20Burnable is Context, ERC20 {
* `amount`. * `amount`.
*/ */
function burnFrom(address account, uint256 amount) public virtual { function burnFrom(address account, uint256 amount) public virtual {
uint256 decreasedAllowance = allowance(account, _msgSender()).sub(amount, "ERC20: burn amount exceeds allowance"); uint256 decreasedAllowance = allowance(account, _msgSender()) - amount;
_approve(account, _msgSender(), decreasedAllowance); _approve(account, _msgSender(), decreasedAllowance);
_burn(account, amount); _burn(account, amount);
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "./ERC20.sol"; import "./ERC20.sol";
...@@ -8,15 +8,13 @@ import "./ERC20.sol"; ...@@ -8,15 +8,13 @@ import "./ERC20.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.
*/ */
abstract contract ERC20Capped is ERC20 { abstract contract ERC20Capped is ERC20 {
using SafeMath for uint256;
uint256 private _cap; uint256 private _cap;
/** /**
* @dev Sets the value of the `cap`. This value is immutable, it can only be * @dev Sets the value of the `cap`. This value is immutable, it can only be
* set once during construction. * set once during construction.
*/ */
constructor (uint256 cap_) internal { constructor (uint256 cap_) {
require(cap_ > 0, "ERC20Capped: cap is 0"); require(cap_ > 0, "ERC20Capped: cap is 0");
_cap = cap_; _cap = cap_;
} }
...@@ -39,7 +37,7 @@ abstract contract ERC20Capped is ERC20 { ...@@ -39,7 +37,7 @@ abstract contract ERC20Capped is ERC20 {
super._beforeTokenTransfer(from, to, amount); super._beforeTokenTransfer(from, to, amount);
if (from == address(0)) { // When minting tokens if (from == address(0)) { // When minting tokens
require(totalSupply().add(amount) <= _cap, "ERC20Capped: cap exceeded"); require(totalSupply() + amount <= _cap, "ERC20Capped: cap exceeded");
} }
} }
} }
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "./ERC20.sol"; import "./ERC20.sol";
import "../../utils/Pausable.sol"; import "../../utils/Pausable.sol";
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "../../math/SafeMath.sol";
import "../../utils/Arrays.sol"; import "../../utils/Arrays.sol";
import "../../utils/Counters.sol"; import "../../utils/Counters.sol";
import "./ERC20.sol"; import "./ERC20.sol";
...@@ -35,7 +34,6 @@ abstract contract ERC20Snapshot is ERC20 { ...@@ -35,7 +34,6 @@ abstract contract ERC20Snapshot is ERC20 {
// Inspired by Jordi Baylina's MiniMeToken to record historical balances: // Inspired by Jordi Baylina's MiniMeToken to record historical balances:
// https://github.com/Giveth/minimd/blob/ea04d950eea153a04c51fa510b068b9dded390cb/contracts/MiniMeToken.sol // https://github.com/Giveth/minimd/blob/ea04d950eea153a04c51fa510b068b9dded390cb/contracts/MiniMeToken.sol
using SafeMath for uint256;
using Arrays for uint256[]; using Arrays for uint256[];
using Counters for Counters.Counter; using Counters for Counters.Counter;
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
/** /**
* @dev Interface of the ERC20 standard as defined in the EIP. * @dev Interface of the ERC20 standard as defined in the EIP.
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "./IERC20.sol"; import "./IERC20.sol";
import "../../math/SafeMath.sol";
import "../../utils/Address.sol"; import "../../utils/Address.sol";
/** /**
...@@ -16,7 +15,6 @@ import "../../utils/Address.sol"; ...@@ -16,7 +15,6 @@ import "../../utils/Address.sol";
* which allows you to call the safe operations as `token.safeTransfer(...)`, etc. * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
*/ */
library SafeERC20 { library SafeERC20 {
using SafeMath for uint256;
using Address for address; using Address for address;
function safeTransfer(IERC20 token, address to, uint256 value) internal { function safeTransfer(IERC20 token, address to, uint256 value) internal {
...@@ -46,12 +44,12 @@ library SafeERC20 { ...@@ -46,12 +44,12 @@ library SafeERC20 {
} }
function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender).add(value); uint256 newAllowance = token.allowance(address(this), spender) + value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
} }
function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = token.allowance(address(this), spender) - value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
} }
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "./SafeERC20.sol"; import "./SafeERC20.sol";
...@@ -23,7 +23,7 @@ contract TokenTimelock { ...@@ -23,7 +23,7 @@ contract TokenTimelock {
// timestamp when token release is enabled // timestamp when token release is enabled
uint256 private _releaseTime; uint256 private _releaseTime;
constructor (IERC20 token_, address beneficiary_, uint256 releaseTime_) public { constructor (IERC20 token_, address beneficiary_, uint256 releaseTime_) {
// solhint-disable-next-line not-rely-on-time // solhint-disable-next-line not-rely-on-time
require(releaseTime_ > block.timestamp, "TokenTimelock: release time is before current time"); require(releaseTime_ > block.timestamp, "TokenTimelock: release time is before current time");
_token = token_; _token = token_;
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "../../GSN/Context.sol"; import "../../GSN/Context.sol";
import "./IERC721.sol"; import "./IERC721.sol";
...@@ -8,7 +8,6 @@ import "./IERC721Metadata.sol"; ...@@ -8,7 +8,6 @@ import "./IERC721Metadata.sol";
import "./IERC721Enumerable.sol"; import "./IERC721Enumerable.sol";
import "./IERC721Receiver.sol"; import "./IERC721Receiver.sol";
import "../../introspection/ERC165.sol"; import "../../introspection/ERC165.sol";
import "../../math/SafeMath.sol";
import "../../utils/Address.sol"; import "../../utils/Address.sol";
import "../../utils/EnumerableSet.sol"; import "../../utils/EnumerableSet.sol";
import "../../utils/EnumerableMap.sol"; import "../../utils/EnumerableMap.sol";
...@@ -19,7 +18,6 @@ import "../../utils/Strings.sol"; ...@@ -19,7 +18,6 @@ import "../../utils/Strings.sol";
* @dev see https://eips.ethereum.org/EIPS/eip-721 * @dev see https://eips.ethereum.org/EIPS/eip-721
*/ */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable { contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
using SafeMath for uint256;
using Address for address; using Address for address;
using EnumerableSet for EnumerableSet.UintSet; using EnumerableSet for EnumerableSet.UintSet;
using EnumerableMap for EnumerableMap.UintToAddressMap; using EnumerableMap for EnumerableMap.UintToAddressMap;
...@@ -90,7 +88,7 @@ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable ...@@ -90,7 +88,7 @@ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable
/** /**
* @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
*/ */
constructor (string memory name_, string memory symbol_) public { constructor (string memory name_, string memory symbol_) {
_name = name_; _name = name_;
_symbol = symbol_; _symbol = symbol_;
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "../../GSN/Context.sol"; import "../../GSN/Context.sol";
import "./ERC721.sol"; import "./ERC721.sol";
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "./IERC721Receiver.sol"; import "./IERC721Receiver.sol";
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "./ERC721.sol"; import "./ERC721.sol";
import "../../utils/Pausable.sol"; import "../../utils/Pausable.sol";
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.2 <0.8.0; pragma solidity ^0.8.0;
import "../../introspection/IERC165.sol"; import "../../introspection/IERC165.sol";
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.2 <0.8.0; pragma solidity ^0.8.0;
import "./IERC721.sol"; import "./IERC721.sol";
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.2 <0.8.0; pragma solidity ^0.8.0;
import "./IERC721.sol"; import "./IERC721.sol";
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
/** /**
* @title ERC721 token receiver interface * @title ERC721 token receiver interface
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "../../GSN/Context.sol"; import "../../GSN/Context.sol";
import "./IERC777.sol"; import "./IERC777.sol";
import "./IERC777Recipient.sol"; import "./IERC777Recipient.sol";
import "./IERC777Sender.sol"; import "./IERC777Sender.sol";
import "../../token/ERC20/IERC20.sol"; import "../../token/ERC20/IERC20.sol";
import "../../math/SafeMath.sol";
import "../../utils/Address.sol"; import "../../utils/Address.sol";
import "../../introspection/IERC1820Registry.sol"; import "../../introspection/IERC1820Registry.sol";
...@@ -27,7 +26,6 @@ import "../../introspection/IERC1820Registry.sol"; ...@@ -27,7 +26,6 @@ import "../../introspection/IERC1820Registry.sol";
* destroyed. This makes integration with ERC20 applications seamless. * destroyed. This makes integration with ERC20 applications seamless.
*/ */
contract ERC777 is Context, IERC777, IERC20 { contract ERC777 is Context, IERC777, IERC20 {
using SafeMath for uint256;
using Address for address; using Address for address;
IERC1820Registry constant internal _ERC1820_REGISTRY = IERC1820Registry(0x1820a4B7618BdE71Dce8cdc73aAB6C95905faD24); IERC1820Registry constant internal _ERC1820_REGISTRY = IERC1820Registry(0x1820a4B7618BdE71Dce8cdc73aAB6C95905faD24);
...@@ -70,7 +68,7 @@ contract ERC777 is Context, IERC777, IERC20 { ...@@ -70,7 +68,7 @@ contract ERC777 is Context, IERC777, IERC20 {
string memory name_, string memory name_,
string memory symbol_, string memory symbol_,
address[] memory defaultOperators_ address[] memory defaultOperators_
) public { ) {
_name = name_; _name = name_;
_symbol = symbol_; _symbol = symbol_;
...@@ -288,7 +286,7 @@ contract ERC777 is Context, IERC777, IERC20 { ...@@ -288,7 +286,7 @@ contract ERC777 is Context, IERC777, IERC20 {
_callTokensToSend(spender, holder, recipient, amount, "", ""); _callTokensToSend(spender, holder, recipient, amount, "", "");
_move(spender, holder, recipient, amount, "", ""); _move(spender, holder, recipient, amount, "", "");
_approve(holder, spender, _allowances[holder][spender].sub(amount, "ERC777: transfer amount exceeds allowance")); _approve(holder, spender, _allowances[holder][spender] - amount);
_callTokensReceived(spender, holder, recipient, amount, "", "", false); _callTokensReceived(spender, holder, recipient, amount, "", "", false);
...@@ -327,8 +325,8 @@ contract ERC777 is Context, IERC777, IERC20 { ...@@ -327,8 +325,8 @@ contract ERC777 is Context, IERC777, IERC20 {
_beforeTokenTransfer(operator, address(0), account, amount); _beforeTokenTransfer(operator, address(0), account, amount);
// Update state variables // Update state variables
_totalSupply = _totalSupply.add(amount); _totalSupply = _totalSupply + amount;
_balances[account] = _balances[account].add(amount); _balances[account] = _balances[account] + amount;
_callTokensReceived(operator, address(0), account, amount, userData, operatorData, true); _callTokensReceived(operator, address(0), account, amount, userData, operatorData, true);
...@@ -391,8 +389,8 @@ contract ERC777 is Context, IERC777, IERC20 { ...@@ -391,8 +389,8 @@ contract ERC777 is Context, IERC777, IERC20 {
_callTokensToSend(operator, from, address(0), amount, data, operatorData); _callTokensToSend(operator, from, address(0), amount, data, operatorData);
// Update state variables // Update state variables
_balances[from] = _balances[from].sub(amount, "ERC777: burn amount exceeds balance"); _balances[from] = _balances[from] - amount;
_totalSupply = _totalSupply.sub(amount); _totalSupply = _totalSupply - amount;
emit Burned(operator, from, amount, data, operatorData); emit Burned(operator, from, amount, data, operatorData);
emit Transfer(from, address(0), amount); emit Transfer(from, address(0), amount);
...@@ -410,8 +408,8 @@ contract ERC777 is Context, IERC777, IERC20 { ...@@ -410,8 +408,8 @@ contract ERC777 is Context, IERC777, IERC20 {
{ {
_beforeTokenTransfer(operator, from, to, amount); _beforeTokenTransfer(operator, from, to, amount);
_balances[from] = _balances[from].sub(amount, "ERC777: transfer amount exceeds balance"); _balances[from] = _balances[from] - amount;
_balances[to] = _balances[to].add(amount); _balances[to] = _balances[to] + amount;
emit Sent(operator, from, to, amount, userData, operatorData); emit Sent(operator, from, to, amount, userData, operatorData);
emit Transfer(from, to, amount); emit Transfer(from, to, amount);
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
/** /**
* @dev Interface of the ERC777Token standard as defined in the EIP. * @dev Interface of the ERC777Token standard as defined in the EIP.
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
/** /**
* @dev Interface of the ERC777TokensRecipient standard as defined in the EIP. * @dev Interface of the ERC777TokensRecipient standard as defined in the EIP.
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
/** /**
* @dev Interface of the ERC777TokensSender standard as defined in the EIP. * @dev Interface of the ERC777TokensSender standard as defined in the EIP.
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.2 <0.8.0; pragma solidity ^0.8.0;
/** /**
* @dev Collection of functions related to the address type * @dev Collection of functions related to the address type
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "../math/Math.sol"; import "../math/Math.sol";
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "../math/SafeMath.sol";
/** /**
* @title Counters * @title Counters
...@@ -11,13 +9,8 @@ import "../math/SafeMath.sol"; ...@@ -11,13 +9,8 @@ import "../math/SafeMath.sol";
* of elements in a mapping, issuing ERC721 ids, or counting request ids. * of elements in a mapping, issuing ERC721 ids, or counting request ids.
* *
* Include with `using Counters for Counters.Counter;` * Include with `using Counters for Counters.Counter;`
* Since it is not possible to overflow a 256 bit integer with increments of one, `increment` can skip the {SafeMath}
* overflow check, thereby saving gas. This does assume however correct usage, in that the underlying `_value` is never
* directly accessed.
*/ */
library Counters { library Counters {
using SafeMath for uint256;
struct Counter { struct Counter {
// This variable should never be directly accessed by users of the library: interactions must be restricted to // This variable should never be directly accessed by users of the library: interactions must be restricted to
// the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
...@@ -30,11 +23,10 @@ library Counters { ...@@ -30,11 +23,10 @@ library Counters {
} }
function increment(Counter storage counter) internal { function increment(Counter storage counter) internal {
// The {SafeMath} overflow check can be skipped here, see the comment at the top
counter._value += 1; counter._value += 1;
} }
function decrement(Counter storage counter) internal { function decrement(Counter storage counter) internal {
counter._value = counter._value.sub(1); counter._value = counter._value - 1;
} }
} }
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
/** /**
* @dev Helper to make usage of the `CREATE2` EVM opcode easier and safer. * @dev Helper to make usage of the `CREATE2` EVM opcode easier and safer.
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
/** /**
* @dev Library for managing an enumerable variant of Solidity's * @dev Library for managing an enumerable variant of Solidity's
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
/** /**
* @dev Library for managing * @dev Library for managing
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
import "../GSN/Context.sol"; import "../GSN/Context.sol";
...@@ -29,7 +29,7 @@ abstract contract Pausable is Context { ...@@ -29,7 +29,7 @@ abstract contract Pausable is Context {
/** /**
* @dev Initializes the contract in unpaused state. * @dev Initializes the contract in unpaused state.
*/ */
constructor () internal { constructor () {
_paused = false; _paused = false;
} }
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
/** /**
* @dev Contract module that helps prevent reentrant calls to a function. * @dev Contract module that helps prevent reentrant calls to a function.
...@@ -35,7 +35,7 @@ abstract contract ReentrancyGuard { ...@@ -35,7 +35,7 @@ abstract contract ReentrancyGuard {
uint256 private _status; uint256 private _status;
constructor () internal { constructor () {
_status = _NOT_ENTERED; _status = _NOT_ENTERED;
} }
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
/** /**
......
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0; pragma solidity ^0.8.0;
/** /**
* @dev String operations. * @dev String operations.
...@@ -23,10 +23,10 @@ library Strings { ...@@ -23,10 +23,10 @@ library Strings {
temp /= 10; temp /= 10;
} }
bytes memory buffer = new bytes(digits); bytes memory buffer = new bytes(digits);
uint256 index = digits - 1; uint256 index = digits;
temp = value; temp = value;
while (temp != 0) { while (temp != 0) {
buffer[index--] = bytes1(uint8(48 + temp % 10)); buffer[--index] = bytes1(uint8(48 + uint256(temp % 10)));
temp /= 10; temp /= 10;
} }
return string(buffer); return string(buffer);
......
...@@ -13,7 +13,7 @@ OpenZeppelin provides xref:api:access.adoc#Ownable[`Ownable`] for implementing o ...@@ -13,7 +13,7 @@ OpenZeppelin provides xref:api:access.adoc#Ownable[`Ownable`] for implementing o
---- ----
// contracts/MyContract.sol // contracts/MyContract.sol
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity ^0.6.0; pragma solidity ^0.8.0;
import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/access/Ownable.sol";
...@@ -62,7 +62,7 @@ Here's a simple example of using `AccessControl` in an xref:tokens.adoc#ERC20[`E ...@@ -62,7 +62,7 @@ Here's a simple example of using `AccessControl` in an xref:tokens.adoc#ERC20[`E
---- ----
// contracts/MyToken.sol // contracts/MyToken.sol
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity ^0.6.0; pragma solidity ^0.8.0;
import "@openzeppelin/contracts/access/AccessControl.sol"; import "@openzeppelin/contracts/access/AccessControl.sol";
import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
...@@ -94,7 +94,7 @@ Let's augment our ERC20 token example by also defining a 'burner' role, which le ...@@ -94,7 +94,7 @@ Let's augment our ERC20 token example by also defining a 'burner' role, which le
---- ----
// contracts/MyToken.sol // contracts/MyToken.sol
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity ^0.6.0; pragma solidity ^0.8.0;
import "@openzeppelin/contracts/access/AccessControl.sol"; import "@openzeppelin/contracts/access/AccessControl.sol";
import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
...@@ -139,7 +139,7 @@ Let's take a look at the ERC20 token example, this time taking advantage of the ...@@ -139,7 +139,7 @@ Let's take a look at the ERC20 token example, this time taking advantage of the
---- ----
// contracts/MyToken.sol // contracts/MyToken.sol
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity ^0.6.0; pragma solidity ^0.8.0;
import "@openzeppelin/contracts/access/AccessControl.sol"; import "@openzeppelin/contracts/access/AccessControl.sol";
import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
...@@ -148,7 +148,7 @@ contract MyToken is ERC20, AccessControl { ...@@ -148,7 +148,7 @@ contract MyToken is ERC20, AccessControl {
bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");
bytes32 public constant BURNER_ROLE = keccak256("BURNER_ROLE"); bytes32 public constant BURNER_ROLE = keccak256("BURNER_ROLE");
constructor() public ERC20("MyToken", "TKN") { constructor() ERC20("MyToken", "TKN") {
// Grant the contract deployer the default admin role: it will be able // Grant the contract deployer the default admin role: it will be able
// to grant and revoke any roles // to grant and revoke any roles
_setupRole(DEFAULT_ADMIN_ROLE, msg.sender); _setupRole(DEFAULT_ADMIN_ROLE, msg.sender);
......
...@@ -34,7 +34,7 @@ Here's what a contract for tokenized items might look like: ...@@ -34,7 +34,7 @@ Here's what a contract for tokenized items might look like:
---- ----
// contracts/GameItems.sol // contracts/GameItems.sol
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity ^0.6.0; pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol"; import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol";
...@@ -45,7 +45,7 @@ contract GameItems is ERC1155 { ...@@ -45,7 +45,7 @@ contract GameItems is ERC1155 {
uint256 public constant SWORD = 3; uint256 public constant SWORD = 3;
uint256 public constant SHIELD = 4; uint256 public constant SHIELD = 4;
constructor() public ERC1155("https://game.example/api/item/{id}.json") { constructor() ERC1155("https://game.example/api/item/{id}.json") {
_mint(msg.sender, GOLD, 10**18, ""); _mint(msg.sender, GOLD, 10**18, "");
_mint(msg.sender, SILVER, 10**27, ""); _mint(msg.sender, SILVER, 10**27, "");
_mint(msg.sender, THORS_HAMMER, 1, ""); _mint(msg.sender, THORS_HAMMER, 1, "");
...@@ -132,7 +132,7 @@ In order for our contract to receive ERC1155 tokens we can inherit from the conv ...@@ -132,7 +132,7 @@ In order for our contract to receive ERC1155 tokens we can inherit from the conv
---- ----
// contracts/MyContract.sol // contracts/MyContract.sol
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity ^0.6.0; pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC1155/ERC1155Holder.sol"; import "@openzeppelin/contracts/token/ERC1155/ERC1155Holder.sol";
......
...@@ -14,7 +14,7 @@ Let's say we want a token with a fixed supply of 1000, initially allocated to th ...@@ -14,7 +14,7 @@ Let's say we want a token with a fixed supply of 1000, initially allocated to th
[source,solidity] [source,solidity]
---- ----
contract ERC20FixedSupply is ERC20 { contract ERC20FixedSupply is ERC20 {
constructor() public { constructor() {
totalSupply += 1000; totalSupply += 1000;
balances[msg.sender] += 1000; balances[msg.sender] += 1000;
} }
...@@ -26,7 +26,7 @@ Starting with Contracts v2 this pattern is not only discouraged, but disallowed. ...@@ -26,7 +26,7 @@ Starting with Contracts v2 this pattern is not only discouraged, but disallowed.
[source,solidity] [source,solidity]
---- ----
contract ERC20FixedSupply is ERC20 { contract ERC20FixedSupply is ERC20 {
constructor() public ERC20("Fixed", "FIX") { constructor() ERC20("Fixed", "FIX") {
_mint(msg.sender, 1000); _mint(msg.sender, 1000);
} }
} }
...@@ -44,7 +44,7 @@ The mechanism we will implement is a token reward for the miners that produce Et ...@@ -44,7 +44,7 @@ The mechanism we will implement is a token reward for the miners that produce Et
[source,solidity] [source,solidity]
---- ----
contract ERC20WithMinerReward is ERC20 { contract ERC20WithMinerReward is ERC20 {
constructor() public ERC20("Reward", "RWD") {} constructor() ERC20("Reward", "RWD") {}
function mintMinerReward() public { function mintMinerReward() public {
_mint(block.coinbase, 1000); _mint(block.coinbase, 1000);
...@@ -92,7 +92,7 @@ Adding to the supply mechanism from previous sections, we can use this hook to m ...@@ -92,7 +92,7 @@ Adding to the supply mechanism from previous sections, we can use this hook to m
[source,solidity] [source,solidity]
---- ----
contract ERC20WithAutoMinerReward is ERC20 { contract ERC20WithAutoMinerReward is ERC20 {
constructor() public ERC20("Reward", "RWD") {} constructor() ERC20("Reward", "RWD") {}
function _mintMinerReward() internal { function _mintMinerReward() internal {
_mint(block.coinbase, 1000); _mint(block.coinbase, 1000);
......
...@@ -15,7 +15,7 @@ Here's what our GLD token might look like. ...@@ -15,7 +15,7 @@ Here's what our GLD token might look like.
---- ----
// contracts/GLDToken.sol // contracts/GLDToken.sol
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity ^0.6.0; pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
......
...@@ -14,7 +14,7 @@ Here's what a contract for tokenized items might look like: ...@@ -14,7 +14,7 @@ Here's what a contract for tokenized items might look like:
---- ----
// contracts/GameItem.sol // contracts/GameItem.sol
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity ^0.6.0; pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/utils/Counters.sol"; import "@openzeppelin/contracts/utils/Counters.sol";
...@@ -23,7 +23,7 @@ contract GameItem is ERC721 { ...@@ -23,7 +23,7 @@ contract GameItem is ERC721 {
using Counters for Counters.Counter; using Counters for Counters.Counter;
Counters.Counter private _tokenIds; Counters.Counter private _tokenIds;
constructor() public ERC721("GameItem", "ITM") {} constructor() ERC721("GameItem", "ITM") {}
function awardItem(address player, string memory tokenURI) function awardItem(address player, string memory tokenURI)
public public
......
...@@ -20,7 +20,7 @@ We will replicate the `GLD` example of the xref:erc20.adoc#constructing-an-erc20 ...@@ -20,7 +20,7 @@ We will replicate the `GLD` example of the xref:erc20.adoc#constructing-an-erc20
---- ----
// contracts/GLDToken.sol // contracts/GLDToken.sol
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity ^0.6.0; pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC777/ERC777.sol"; import "@openzeppelin/contracts/token/ERC777/ERC777.sol";
......
...@@ -20,7 +20,7 @@ For example, imagine you want to change xref:api:access.adoc#AccessControl[`Acce ...@@ -20,7 +20,7 @@ For example, imagine you want to change xref:api:access.adoc#AccessControl[`Acce
```solidity ```solidity
// contracts/ModifiedAccessControl.sol // contracts/ModifiedAccessControl.sol
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity ^0.6.0; pragma solidity ^0.8.0;
import "@openzeppelin/contracts/access/AccessControl.sol"; import "@openzeppelin/contracts/access/AccessControl.sol";
...@@ -48,7 +48,7 @@ Here is a modified version of xref:api:access.adoc#AccessControl[`AccessControl` ...@@ -48,7 +48,7 @@ Here is a modified version of xref:api:access.adoc#AccessControl[`AccessControl`
```solidity ```solidity
// contracts/ModifiedAccessControl.sol // contracts/ModifiedAccessControl.sol
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity ^0.6.0; pragma solidity ^0.8.0;
import "@openzeppelin/contracts/access/AccessControl.sol"; import "@openzeppelin/contracts/access/AccessControl.sol";
...@@ -80,7 +80,7 @@ Hooks are simply functions that are called before or after some action takes pla ...@@ -80,7 +80,7 @@ Hooks are simply functions that are called before or after some action takes pla
Here's how you would implement the `IERC721Receiver` pattern in `ERC20`, using the xref:api:token/ERC20.adoc#ERC20-_beforeTokenTransfer-address-address-uint256-[`_beforeTokenTransfer`] hook: Here's how you would implement the `IERC721Receiver` pattern in `ERC20`, using the xref:api:token/ERC20.adoc#ERC20-_beforeTokenTransfer-address-address-uint256-[`_beforeTokenTransfer`] hook:
```solidity ```solidity
pragma solidity ^0.6.0; pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
......
...@@ -108,7 +108,7 @@ Your GSN recipient contract needs to inherit from `GSNRecipientERC20Fee` along w ...@@ -108,7 +108,7 @@ Your GSN recipient contract needs to inherit from `GSNRecipientERC20Fee` along w
---- ----
// contracts/MyContract.sol // contracts/MyContract.sol
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity ^0.6.0; pragma solidity ^0.8.0;
import "@openzeppelin/contracts/GSN/GSNRecipientERC20Fee.sol"; import "@openzeppelin/contracts/GSN/GSNRecipientERC20Fee.sol";
import "@openzeppelin/contracts/access/AccessControl.sol"; import "@openzeppelin/contracts/access/AccessControl.sol";
...@@ -116,11 +116,11 @@ import "@openzeppelin/contracts/access/AccessControl.sol"; ...@@ -116,11 +116,11 @@ import "@openzeppelin/contracts/access/AccessControl.sol";
contract MyContract is GSNRecipientERC20Fee, AccessControl { contract MyContract is GSNRecipientERC20Fee, AccessControl {
bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");
constructor() public GSNRecipientERC20Fee("FeeToken", "FEE") { constructor() GSNRecipientERC20Fee("FeeToken", "FEE") {
_setupRole(MINTER_ROLE, _msgSender()); _setupRole(MINTER_ROLE, _msgSender());
} }
function _msgSender() internal view override(Context, GSNRecipient) returns (address payable) { function _msgSender() internal view override(Context, GSNRecipient) returns (address) {
return GSNRecipient._msgSender(); return GSNRecipient._msgSender();
} }
...@@ -154,7 +154,7 @@ Once your strategy is ready, all your GSN recipient needs to do is inherit from ...@@ -154,7 +154,7 @@ Once your strategy is ready, all your GSN recipient needs to do is inherit from
[source,solidity] [source,solidity]
---- ----
contract MyContract is MyCustomGSNStrategy { contract MyContract is MyCustomGSNStrategy {
constructor() public MyCustomGSNStrategy() { constructor() MyCustomGSNStrategy() {
} }
} }
---- ----
...@@ -28,7 +28,7 @@ Once installed, you can use the contracts in the library by importing them: ...@@ -28,7 +28,7 @@ Once installed, you can use the contracts in the library by importing them:
---- ----
// contracts/MyNFT.sol // contracts/MyNFT.sol
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity ^0.6.0; pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
......
...@@ -15,9 +15,9 @@ contract('SafeMath', function (accounts) { ...@@ -15,9 +15,9 @@ contract('SafeMath', function (accounts) {
expect(await fn(rhs, lhs)).to.be.bignumber.equal(expected); expect(await fn(rhs, lhs)).to.be.bignumber.equal(expected);
} }
async function testFailsCommutative (fn, lhs, rhs, reason) { async function testFailsCommutative (fn, lhs, rhs) {
await expectRevert(fn(lhs, rhs), reason); await expectRevert.unspecified(fn(lhs, rhs));
await expectRevert(fn(rhs, lhs), reason); await expectRevert.unspecified(fn(rhs, lhs));
} }
describe('add', function () { describe('add', function () {
...@@ -32,7 +32,7 @@ contract('SafeMath', function (accounts) { ...@@ -32,7 +32,7 @@ contract('SafeMath', function (accounts) {
const a = MAX_UINT256; const a = MAX_UINT256;
const b = new BN('1'); const b = new BN('1');
await testFailsCommutative(this.safeMath.add, a, b, 'SafeMath: addition overflow'); await testFailsCommutative(this.safeMath.add, a, b);
}); });
}); });
...@@ -48,7 +48,7 @@ contract('SafeMath', function (accounts) { ...@@ -48,7 +48,7 @@ contract('SafeMath', function (accounts) {
const a = new BN('1234'); const a = new BN('1234');
const b = new BN('5678'); const b = new BN('5678');
await expectRevert(this.safeMath.sub(a, b), 'SafeMath: subtraction overflow'); await expectRevert.unspecified(this.safeMath.sub(a, b));
}); });
}); });
...@@ -71,7 +71,7 @@ contract('SafeMath', function (accounts) { ...@@ -71,7 +71,7 @@ contract('SafeMath', function (accounts) {
const a = MAX_UINT256; const a = MAX_UINT256;
const b = new BN('2'); const b = new BN('2');
await testFailsCommutative(this.safeMath.mul, a, b, 'SafeMath: multiplication overflow'); await testFailsCommutative(this.safeMath.mul, a, b);
}); });
}); });
...@@ -101,7 +101,7 @@ contract('SafeMath', function (accounts) { ...@@ -101,7 +101,7 @@ contract('SafeMath', function (accounts) {
const a = new BN('5678'); const a = new BN('5678');
const b = new BN('0'); const b = new BN('0');
await expectRevert(this.safeMath.div(a, b), 'SafeMath: division by zero'); await expectRevert.unspecified(this.safeMath.div(a, b));
}); });
}); });
...@@ -140,7 +140,7 @@ contract('SafeMath', function (accounts) { ...@@ -140,7 +140,7 @@ contract('SafeMath', function (accounts) {
const a = new BN('5678'); const a = new BN('5678');
const b = new BN('0'); const b = new BN('0');
await expectRevert(this.safeMath.mod(a, b), 'SafeMath: modulo by zero'); await expectRevert.unspecified(this.safeMath.mod(a, b));
}); });
}); });
}); });
...@@ -15,9 +15,9 @@ contract('SignedSafeMath', function (accounts) { ...@@ -15,9 +15,9 @@ contract('SignedSafeMath', function (accounts) {
expect(await fn(rhs, lhs)).to.be.bignumber.equal(expected); expect(await fn(rhs, lhs)).to.be.bignumber.equal(expected);
} }
async function testFailsCommutative (fn, lhs, rhs, reason) { async function testFailsCommutative (fn, lhs, rhs) {
await expectRevert(fn(lhs, rhs), reason); await expectRevert.unspecified(fn(lhs, rhs));
await expectRevert(fn(rhs, lhs), reason); await expectRevert.unspecified(fn(rhs, lhs));
} }
describe('add', function () { describe('add', function () {
...@@ -39,14 +39,14 @@ contract('SignedSafeMath', function (accounts) { ...@@ -39,14 +39,14 @@ contract('SignedSafeMath', function (accounts) {
const a = MAX_INT256; const a = MAX_INT256;
const b = new BN('1'); const b = new BN('1');
await testFailsCommutative(this.safeMath.add, a, b, 'SignedSafeMath: addition overflow'); await testFailsCommutative(this.safeMath.add, a, b);
}); });
it('reverts on negative addition overflow', async function () { it('reverts on negative addition overflow', async function () {
const a = MIN_INT256; const a = MIN_INT256;
const b = new BN('-1'); const b = new BN('-1');
await testFailsCommutative(this.safeMath.add, a, b, 'SignedSafeMath: addition overflow'); await testFailsCommutative(this.safeMath.add, a, b);
}); });
}); });
...@@ -71,14 +71,14 @@ contract('SignedSafeMath', function (accounts) { ...@@ -71,14 +71,14 @@ contract('SignedSafeMath', function (accounts) {
const a = MAX_INT256; const a = MAX_INT256;
const b = new BN('-1'); const b = new BN('-1');
await expectRevert(this.safeMath.sub(a, b), 'SignedSafeMath: subtraction overflow'); await expectRevert.unspecified(this.safeMath.sub(a, b));
}); });
it('reverts on negative subtraction overflow', async function () { it('reverts on negative subtraction overflow', async function () {
const a = MIN_INT256; const a = MIN_INT256;
const b = new BN('1'); const b = new BN('1');
await expectRevert(this.safeMath.sub(a, b), 'SignedSafeMath: subtraction overflow'); await expectRevert.unspecified(this.safeMath.sub(a, b));
}); });
}); });
...@@ -101,14 +101,14 @@ contract('SignedSafeMath', function (accounts) { ...@@ -101,14 +101,14 @@ contract('SignedSafeMath', function (accounts) {
const a = MAX_INT256; const a = MAX_INT256;
const b = new BN('2'); const b = new BN('2');
await testFailsCommutative(this.safeMath.mul, a, b, 'SignedSafeMath: multiplication overflow'); await testFailsCommutative(this.safeMath.mul, a, b);
}); });
it('reverts when minimum integer is multiplied by -1', async function () { it('reverts when minimum integer is multiplied by -1', async function () {
const a = MIN_INT256; const a = MIN_INT256;
const b = new BN('-1'); const b = new BN('-1');
await testFailsCommutative(this.safeMath.mul, a, b, 'SignedSafeMath: multiplication overflow'); await testFailsCommutative(this.safeMath.mul, a, b);
}); });
}); });
...@@ -139,14 +139,14 @@ contract('SignedSafeMath', function (accounts) { ...@@ -139,14 +139,14 @@ contract('SignedSafeMath', function (accounts) {
const a = new BN('-5678'); const a = new BN('-5678');
const b = new BN('0'); const b = new BN('0');
await expectRevert(this.safeMath.div(a, b), 'SignedSafeMath: division by zero'); await expectRevert.unspecified(this.safeMath.div(a, b));
}); });
it('reverts on overflow, negative second', async function () { it('reverts on overflow, negative second', async function () {
const a = new BN(MIN_INT256); const a = new BN(MIN_INT256);
const b = new BN('-1'); const b = new BN('-1');
await expectRevert(this.safeMath.div(a, b), 'SignedSafeMath: division overflow'); await expectRevert.unspecified(this.safeMath.div(a, b));
}); });
}); });
}); });
...@@ -208,7 +208,7 @@ function shouldBehaveLikeERC1155 ([minter, firstTokenHolder, secondTokenHolder, ...@@ -208,7 +208,7 @@ function shouldBehaveLikeERC1155 ([minter, firstTokenHolder, secondTokenHolder,
}); });
it('reverts when transferring more than balance', async function () { it('reverts when transferring more than balance', async function () {
await expectRevert( await expectRevert.unspecified(
this.token.safeTransferFrom( this.token.safeTransferFrom(
multiTokenHolder, multiTokenHolder,
recipient, recipient,
...@@ -217,7 +217,6 @@ function shouldBehaveLikeERC1155 ([minter, firstTokenHolder, secondTokenHolder, ...@@ -217,7 +217,6 @@ function shouldBehaveLikeERC1155 ([minter, firstTokenHolder, secondTokenHolder,
'0x', '0x',
{ from: multiTokenHolder }, { from: multiTokenHolder },
), ),
'ERC1155: insufficient balance for transfer',
); );
}); });
...@@ -464,14 +463,13 @@ function shouldBehaveLikeERC1155 ([minter, firstTokenHolder, secondTokenHolder, ...@@ -464,14 +463,13 @@ function shouldBehaveLikeERC1155 ([minter, firstTokenHolder, secondTokenHolder,
}); });
it('reverts when transferring amount more than any of balances', async function () { it('reverts when transferring amount more than any of balances', async function () {
await expectRevert( await expectRevert.unspecified(
this.token.safeBatchTransferFrom( this.token.safeBatchTransferFrom(
multiTokenHolder, recipient, multiTokenHolder, recipient,
[firstTokenId, secondTokenId], [firstTokenId, secondTokenId],
[firstAmount, secondAmount.addn(1)], [firstAmount, secondAmount.addn(1)],
'0x', { from: multiTokenHolder }, '0x', { from: multiTokenHolder },
), ),
'ERC1155: insufficient balance for transfer',
); );
}); });
......
...@@ -118,9 +118,8 @@ contract('ERC1155', function (accounts) { ...@@ -118,9 +118,8 @@ contract('ERC1155', function (accounts) {
}); });
it('reverts when burning a non-existent token id', async function () { it('reverts when burning a non-existent token id', async function () {
await expectRevert( await expectRevert.unspecified(
this.token.burn(tokenHolder, tokenId, mintAmount), this.token.burn(tokenHolder, tokenId, mintAmount),
'ERC1155: burn amount exceeds balance',
); );
}); });
...@@ -133,9 +132,8 @@ contract('ERC1155', function (accounts) { ...@@ -133,9 +132,8 @@ contract('ERC1155', function (accounts) {
{ from: operator }, { from: operator },
); );
await expectRevert( await expectRevert.unspecified(
this.token.burn(tokenHolder, tokenId, mintAmount.addn(1)), this.token.burn(tokenHolder, tokenId, mintAmount.addn(1)),
'ERC1155: burn amount exceeds balance',
); );
}); });
...@@ -190,9 +188,8 @@ contract('ERC1155', function (accounts) { ...@@ -190,9 +188,8 @@ contract('ERC1155', function (accounts) {
}); });
it('reverts when burning a non-existent token id', async function () { it('reverts when burning a non-existent token id', async function () {
await expectRevert( await expectRevert.unspecified(
this.token.burnBatch(tokenBatchHolder, tokenBatchIds, burnAmounts), this.token.burnBatch(tokenBatchHolder, tokenBatchIds, burnAmounts),
'ERC1155: burn amount exceeds balance',
); );
}); });
......
...@@ -87,8 +87,8 @@ function shouldBehaveLikeERC20 (errorPrefix, initialSupply, initialHolder, recip ...@@ -87,8 +87,8 @@ function shouldBehaveLikeERC20 (errorPrefix, initialSupply, initialHolder, recip
const amount = initialSupply.addn(1); const amount = initialSupply.addn(1);
it('reverts', async function () { it('reverts', async function () {
await expectRevert(this.token.transferFrom( await expectRevert.unspecified(this.token.transferFrom(
tokenOwner, to, amount, { from: spender }), `${errorPrefix}: transfer amount exceeds balance`, tokenOwner, to, amount, { from: spender }),
); );
}); });
}); });
...@@ -103,8 +103,8 @@ function shouldBehaveLikeERC20 (errorPrefix, initialSupply, initialHolder, recip ...@@ -103,8 +103,8 @@ function shouldBehaveLikeERC20 (errorPrefix, initialSupply, initialHolder, recip
const amount = initialSupply; const amount = initialSupply;
it('reverts', async function () { it('reverts', async function () {
await expectRevert(this.token.transferFrom( await expectRevert.unspecified(this.token.transferFrom(
tokenOwner, to, amount, { from: spender }), `${errorPrefix}: transfer amount exceeds allowance`, tokenOwner, to, amount, { from: spender }),
); );
}); });
}); });
...@@ -113,8 +113,8 @@ function shouldBehaveLikeERC20 (errorPrefix, initialSupply, initialHolder, recip ...@@ -113,8 +113,8 @@ function shouldBehaveLikeERC20 (errorPrefix, initialSupply, initialHolder, recip
const amount = initialSupply.addn(1); const amount = initialSupply.addn(1);
it('reverts', async function () { it('reverts', async function () {
await expectRevert(this.token.transferFrom( await expectRevert.unspecified(this.token.transferFrom(
tokenOwner, to, amount, { from: spender }), `${errorPrefix}: transfer amount exceeds balance`, tokenOwner, to, amount, { from: spender }),
); );
}); });
}); });
...@@ -165,8 +165,8 @@ function shouldBehaveLikeERC20Transfer (errorPrefix, from, to, balance, transfer ...@@ -165,8 +165,8 @@ function shouldBehaveLikeERC20Transfer (errorPrefix, from, to, balance, transfer
const amount = balance.addn(1); const amount = balance.addn(1);
it('reverts', async function () { it('reverts', async function () {
await expectRevert(transfer.call(this, from, to, amount), await expectRevert.unspecified(transfer.call(this, from, to, amount),
`${errorPrefix}: transfer amount exceeds balance`,
); );
}); });
}); });
......
...@@ -53,8 +53,8 @@ contract('ERC20', function (accounts) { ...@@ -53,8 +53,8 @@ contract('ERC20', function (accounts) {
function shouldDecreaseApproval (amount) { function shouldDecreaseApproval (amount) {
describe('when there was no approved amount before', function () { describe('when there was no approved amount before', function () {
it('reverts', async function () { it('reverts', async function () {
await expectRevert(this.token.decreaseAllowance( await expectRevert.unspecified(this.token.decreaseAllowance(
spender, amount, { from: initialHolder }), 'ERC20: decreased allowance below zero', spender, amount, { from: initialHolder }),
); );
}); });
}); });
...@@ -88,9 +88,9 @@ contract('ERC20', function (accounts) { ...@@ -88,9 +88,9 @@ contract('ERC20', function (accounts) {
}); });
it('reverts when more than the full allowance is removed', async function () { it('reverts when more than the full allowance is removed', async function () {
await expectRevert( await expectRevert.unspecified(
this.token.decreaseAllowance(spender, approvedAmount.addn(1), { from: initialHolder }), this.token.decreaseAllowance(spender, approvedAmount.addn(1), { from: initialHolder }),
'ERC20: decreased allowance below zero',
); );
}); });
}); });
...@@ -114,8 +114,8 @@ contract('ERC20', function (accounts) { ...@@ -114,8 +114,8 @@ contract('ERC20', function (accounts) {
const spender = ZERO_ADDRESS; const spender = ZERO_ADDRESS;
it('reverts', async function () { it('reverts', async function () {
await expectRevert(this.token.decreaseAllowance( await expectRevert.unspecified(this.token.decreaseAllowance(
spender, amount, { from: initialHolder }), 'ERC20: decreased allowance below zero', spender, amount, { from: initialHolder }),
); );
}); });
}); });
...@@ -247,8 +247,8 @@ contract('ERC20', function (accounts) { ...@@ -247,8 +247,8 @@ contract('ERC20', function (accounts) {
describe('for a non zero account', function () { describe('for a non zero account', function () {
it('rejects burning more than balance', async function () { it('rejects burning more than balance', async function () {
await expectRevert(this.token.burn( await expectRevert.unspecified(this.token.burn(
initialHolder, initialSupply.addn(1)), 'ERC20: burn amount exceeds balance', initialHolder, initialSupply.addn(1)),
); );
}); });
......
...@@ -93,9 +93,9 @@ function shouldOnlyRevertOnErrors () { ...@@ -93,9 +93,9 @@ function shouldOnlyRevertOnErrors () {
}); });
it('reverts when decreasing the allowance', async function () { it('reverts when decreasing the allowance', async function () {
await expectRevert( await expectRevert.unspecified(
this.wrapper.decreaseAllowance(10), this.wrapper.decreaseAllowance(10),
'SafeERC20: decreased allowance below zero',
); );
}); });
}); });
...@@ -125,9 +125,8 @@ function shouldOnlyRevertOnErrors () { ...@@ -125,9 +125,8 @@ function shouldOnlyRevertOnErrors () {
}); });
it('reverts when decreasing the allowance to a negative value', async function () { it('reverts when decreasing the allowance to a negative value', async function () {
await expectRevert( await expectRevert.unspecified(
this.wrapper.decreaseAllowance(200), this.wrapper.decreaseAllowance(200),
'SafeERC20: decreased allowance below zero',
); );
}); });
}); });
......
...@@ -37,8 +37,8 @@ function shouldBehaveLikeERC20Burnable (owner, initialBalance, [burner]) { ...@@ -37,8 +37,8 @@ function shouldBehaveLikeERC20Burnable (owner, initialBalance, [burner]) {
const amount = initialBalance.addn(1); const amount = initialBalance.addn(1);
it('reverts', async function () { it('reverts', async function () {
await expectRevert(this.token.burn(amount, { from: owner }), await expectRevert.unspecified(this.token.burn(amount, { from: owner }),
'ERC20: burn amount exceeds balance',
); );
}); });
}); });
...@@ -86,8 +86,8 @@ function shouldBehaveLikeERC20Burnable (owner, initialBalance, [burner]) { ...@@ -86,8 +86,8 @@ function shouldBehaveLikeERC20Burnable (owner, initialBalance, [burner]) {
it('reverts', async function () { it('reverts', async function () {
await this.token.approve(burner, amount, { from: owner }); await this.token.approve(burner, amount, { from: owner });
await expectRevert(this.token.burnFrom(owner, amount, { from: burner }), await expectRevert.unspecified(this.token.burnFrom(owner, amount, { from: burner }),
'ERC20: burn amount exceeds balance',
); );
}); });
}); });
...@@ -97,8 +97,8 @@ function shouldBehaveLikeERC20Burnable (owner, initialBalance, [burner]) { ...@@ -97,8 +97,8 @@ function shouldBehaveLikeERC20Burnable (owner, initialBalance, [burner]) {
it('reverts', async function () { it('reverts', async function () {
await this.token.approve(burner, allowance, { from: owner }); await this.token.approve(burner, allowance, { from: owner });
await expectRevert(this.token.burnFrom(owner, allowance.addn(1), { from: burner }), await expectRevert.unspecified(this.token.burnFrom(owner, allowance.addn(1), { from: burner }),
'ERC20: burn amount exceeds allowance',
); );
}); });
}); });
......
...@@ -143,7 +143,7 @@ contract('Address', function (accounts) { ...@@ -143,7 +143,7 @@ contract('Address', function (accounts) {
}, []); }, []);
await expectRevert( await expectRevert(
this.mock.functionCall(this.contractRecipient.address, abiEncodedCall, { gas: '90000' }), this.mock.functionCall(this.contractRecipient.address, abiEncodedCall, { gas: '100000' }),
'Address: low-level call failed', 'Address: low-level call failed',
); );
}); });
...@@ -155,9 +155,8 @@ contract('Address', function (accounts) { ...@@ -155,9 +155,8 @@ contract('Address', function (accounts) {
inputs: [], inputs: [],
}, []); }, []);
await expectRevert( await expectRevert.unspecified(
this.mock.functionCall(this.contractRecipient.address, abiEncodedCall), this.mock.functionCall(this.contractRecipient.address, abiEncodedCall),
'Address: low-level call failed',
); );
}); });
......
...@@ -43,7 +43,7 @@ contract('Counters', function (accounts) { ...@@ -43,7 +43,7 @@ contract('Counters', function (accounts) {
it('reverts if the current value is 0', async function () { it('reverts if the current value is 0', async function () {
await this.counter.decrement(); await this.counter.decrement();
await expectRevert(this.counter.decrement(), 'SafeMath: subtraction overflow'); await expectRevert.unspecified(this.counter.decrement());
}); });
}); });
context('after incremented to 3', function () { context('after incremented to 3', function () {
......
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