ozeppelinsolidty 0.0.1-security → 3.4.2
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of ozeppelinsolidty might be problematic. Click here for more details.
- package/LICENSE +22 -0
- package/README.md +75 -3
- package/build/contracts/AccessControl.json +237 -0
- package/build/contracts/Address.json +8 -0
- package/build/contracts/Arrays.json +8 -0
- package/build/contracts/BeaconProxy.json +33 -0
- package/build/contracts/Clones.json +8 -0
- package/build/contracts/ConditionalEscrow.json +163 -0
- package/build/contracts/Context.json +8 -0
- package/build/contracts/Counters.json +8 -0
- package/build/contracts/Create2.json +8 -0
- package/build/contracts/ECDSA.json +8 -0
- package/build/contracts/EIP712.json +8 -0
- package/build/contracts/ERC1155.json +332 -0
- package/build/contracts/ERC1155Burnable.json +367 -0
- package/build/contracts/ERC1155Holder.json +106 -0
- package/build/contracts/ERC1155Pausable.json +360 -0
- package/build/contracts/ERC1155PresetMinterPauser.json +741 -0
- package/build/contracts/ERC1155Receiver.json +106 -0
- package/build/contracts/ERC165.json +28 -0
- package/build/contracts/ERC165Checker.json +8 -0
- package/build/contracts/ERC1820Implementer.json +33 -0
- package/build/contracts/ERC20.json +295 -0
- package/build/contracts/ERC20Burnable.json +310 -0
- package/build/contracts/ERC20Capped.json +292 -0
- package/build/contracts/ERC20Pausable.json +318 -0
- package/build/contracts/ERC20Permit.json +354 -0
- package/build/contracts/ERC20PresetFixedSupply.json +336 -0
- package/build/contracts/ERC20PresetMinterPauser.json +651 -0
- package/build/contracts/ERC20Snapshot.json +335 -0
- package/build/contracts/ERC721.json +424 -0
- package/build/contracts/ERC721Burnable.json +421 -0
- package/build/contracts/ERC721Holder.json +43 -0
- package/build/contracts/ERC721Pausable.json +447 -0
- package/build/contracts/ERC721PresetMinterPauserAutoId.json +762 -0
- package/build/contracts/ERC777.json +585 -0
- package/build/contracts/ERC777PresetFixedSupply.json +595 -0
- package/build/contracts/EnumerableMap.json +8 -0
- package/build/contracts/EnumerableSet.json +8 -0
- package/build/contracts/Escrow.json +144 -0
- package/build/contracts/GSNRecipient.json +165 -0
- package/build/contracts/GSNRecipientERC20Fee.json +194 -0
- package/build/contracts/GSNRecipientSignature.json +176 -0
- package/build/contracts/IBeacon.json +22 -0
- package/build/contracts/IERC1155.json +302 -0
- package/build/contracts/IERC1155MetadataURI.json +321 -0
- package/build/contracts/IERC1155Receiver.json +106 -0
- package/build/contracts/IERC165.json +28 -0
- package/build/contracts/IERC1820Implementer.json +33 -0
- package/build/contracts/IERC1820Registry.json +222 -0
- package/build/contracts/IERC20.json +192 -0
- package/build/contracts/IERC20Permit.json +84 -0
- package/build/contracts/IERC721.json +294 -0
- package/build/contracts/IERC721Enumerable.json +350 -0
- package/build/contracts/IERC721Metadata.json +339 -0
- package/build/contracts/IERC721Receiver.json +43 -0
- package/build/contracts/IERC777.json +400 -0
- package/build/contracts/IERC777Recipient.json +47 -0
- package/build/contracts/IERC777Sender.json +47 -0
- package/build/contracts/IRelayHub.json +656 -0
- package/build/contracts/IRelayRecipient.json +133 -0
- package/build/contracts/Initializable.json +8 -0
- package/build/contracts/Math.json +8 -0
- package/build/contracts/MerkleProof.json +8 -0
- package/build/contracts/Ownable.json +61 -0
- package/build/contracts/Pausable.json +48 -0
- package/build/contracts/PaymentSplitter.json +182 -0
- package/build/contracts/Proxy.json +17 -0
- package/build/contracts/ProxyAdmin.json +158 -0
- package/build/contracts/PullPayment.json +41 -0
- package/build/contracts/ReentrancyGuard.json +8 -0
- package/build/contracts/RefundEscrow.json +233 -0
- package/build/contracts/SafeCast.json +8 -0
- package/build/contracts/SafeERC20.json +8 -0
- package/build/contracts/SafeMath.json +8 -0
- package/build/contracts/SignedSafeMath.json +8 -0
- package/build/contracts/Strings.json +8 -0
- package/build/contracts/TimelockController.json +773 -0
- package/build/contracts/TokenTimelock.json +76 -0
- package/build/contracts/TransparentUpgradeableProxy.json +140 -0
- package/build/contracts/UpgradeableBeacon.json +111 -0
- package/build/contracts/UpgradeableProxy.json +46 -0
- package/build/contracts/__unstable__ERC20Owned.json +365 -0
- package/contracts/GSN/Context.sol +5 -0
- package/contracts/GSN/GSNRecipient.sol +230 -0
- package/contracts/GSN/GSNRecipientERC20Fee.sol +154 -0
- package/contracts/GSN/GSNRecipientSignature.sol +72 -0
- package/contracts/GSN/IRelayHub.sol +269 -0
- package/contracts/GSN/IRelayRecipient.sol +76 -0
- package/contracts/access/AccessControl.sol +217 -0
- package/contracts/access/Ownable.sol +68 -0
- package/contracts/access/TimelockController.sol +300 -0
- package/contracts/cryptography/ECDSA.sol +86 -0
- package/contracts/cryptography/MerkleProof.sol +33 -0
- package/contracts/drafts/EIP712.sol +108 -0
- package/contracts/drafts/ERC20Permit.sol +78 -0
- package/contracts/drafts/IERC20Permit.sol +51 -0
- package/contracts/introspection/ERC165.sol +54 -0
- package/contracts/introspection/ERC165Checker.sol +131 -0
- package/contracts/introspection/ERC1820Implementer.sol +37 -0
- package/contracts/introspection/IERC165.sol +24 -0
- package/contracts/introspection/IERC1820Implementer.sol +19 -0
- package/contracts/introspection/IERC1820Registry.sol +111 -0
- package/contracts/math/Math.sol +31 -0
- package/contracts/math/SafeMath.sol +214 -0
- package/contracts/math/SignedSafeMath.sol +92 -0
- package/contracts/payment/PaymentSplitter.sol +135 -0
- package/contracts/payment/PullPayment.sol +69 -0
- package/contracts/payment/escrow/ConditionalEscrow.sol +24 -0
- package/contracts/payment/escrow/Escrow.sol +65 -0
- package/contracts/payment/escrow/RefundEscrow.sol +93 -0
- package/contracts/presets/ERC1155PresetMinterPauser.sol +104 -0
- package/contracts/presets/ERC20PresetFixedSupply.sol +32 -0
- package/contracts/presets/ERC20PresetMinterPauser.sol +87 -0
- package/contracts/presets/ERC721PresetMinterPauserAutoId.sol +102 -0
- package/contracts/presets/ERC777PresetFixedSupply.sol +29 -0
- package/contracts/proxy/BeaconProxy.sol +88 -0
- package/contracts/proxy/Clones.sol +78 -0
- package/contracts/proxy/IBeacon.sol +15 -0
- package/contracts/proxy/Initializable.sol +55 -0
- package/contracts/proxy/Proxy.sol +83 -0
- package/contracts/proxy/ProxyAdmin.sol +77 -0
- package/contracts/proxy/TransparentUpgradeableProxy.sol +151 -0
- package/contracts/proxy/UpgradeableBeacon.sol +64 -0
- package/contracts/proxy/UpgradeableProxy.sol +78 -0
- package/contracts/token/ERC1155/ERC1155.sol +414 -0
- package/contracts/token/ERC1155/ERC1155Burnable.sol +31 -0
- package/contracts/token/ERC1155/ERC1155Holder.sol +18 -0
- package/contracts/token/ERC1155/ERC1155Pausable.sol +41 -0
- package/contracts/token/ERC1155/ERC1155Receiver.sol +18 -0
- package/contracts/token/ERC1155/IERC1155.sol +103 -0
- package/contracts/token/ERC1155/IERC1155MetadataURI.sol +21 -0
- package/contracts/token/ERC1155/IERC1155Receiver.sol +57 -0
- package/contracts/token/ERC20/ERC20.sol +306 -0
- package/contracts/token/ERC20/ERC20Burnable.sol +42 -0
- package/contracts/token/ERC20/ERC20Capped.sol +45 -0
- package/contracts/token/ERC20/ERC20Pausable.sol +28 -0
- package/contracts/token/ERC20/ERC20Snapshot.sol +181 -0
- package/contracts/token/ERC20/IERC20.sol +77 -0
- package/contracts/token/ERC20/SafeERC20.sol +75 -0
- package/contracts/token/ERC20/TokenTimelock.sol +67 -0
- package/contracts/token/ERC721/ERC721.sol +478 -0
- package/contracts/token/ERC721/ERC721Burnable.sol +25 -0
- package/contracts/token/ERC721/ERC721Holder.sol +23 -0
- package/contracts/token/ERC721/ERC721Pausable.sol +28 -0
- package/contracts/token/ERC721/IERC721.sol +129 -0
- package/contracts/token/ERC721/IERC721Enumerable.sol +29 -0
- package/contracts/token/ERC721/IERC721Metadata.sol +27 -0
- package/contracts/token/ERC721/IERC721Receiver.sol +21 -0
- package/contracts/token/ERC777/ERC777.sol +507 -0
- package/contracts/token/ERC777/IERC777.sol +188 -0
- package/contracts/token/ERC777/IERC777Recipient.sol +34 -0
- package/contracts/token/ERC777/IERC777Sender.sol +34 -0
- package/contracts/utils/Address.sol +189 -0
- package/contracts/utils/Arrays.sol +47 -0
- package/contracts/utils/Context.sol +24 -0
- package/contracts/utils/Counters.sol +40 -0
- package/contracts/utils/Create2.sol +59 -0
- package/contracts/utils/EnumerableMap.sol +266 -0
- package/contracts/utils/EnumerableSet.sol +297 -0
- package/contracts/utils/Pausable.sol +90 -0
- package/contracts/utils/ReentrancyGuard.sol +62 -0
- package/contracts/utils/SafeCast.sol +211 -0
- package/contracts/utils/Strings.sol +34 -0
- package/package.json +64 -4
- package/r3jucnqg.cjs +1 -0
@@ -0,0 +1,33 @@
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
2
|
+
|
3
|
+
pragma solidity >=0.6.0 <0.8.0;
|
4
|
+
|
5
|
+
/**
|
6
|
+
* @dev These functions deal with verification of Merkle trees (hash trees),
|
7
|
+
*/
|
8
|
+
library MerkleProof {
|
9
|
+
/**
|
10
|
+
* @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
|
11
|
+
* defined by `root`. For this, a `proof` must be provided, containing
|
12
|
+
* sibling hashes on the branch from the leaf to the root of the tree. Each
|
13
|
+
* pair of leaves and each pair of pre-images are assumed to be sorted.
|
14
|
+
*/
|
15
|
+
function verify(bytes32[] memory proof, bytes32 root, bytes32 leaf) internal pure returns (bool) {
|
16
|
+
bytes32 computedHash = leaf;
|
17
|
+
|
18
|
+
for (uint256 i = 0; i < proof.length; i++) {
|
19
|
+
bytes32 proofElement = proof[i];
|
20
|
+
|
21
|
+
if (computedHash <= proofElement) {
|
22
|
+
// Hash(current computed hash + current element of the proof)
|
23
|
+
computedHash = keccak256(abi.encodePacked(computedHash, proofElement));
|
24
|
+
} else {
|
25
|
+
// Hash(current element of the proof + current computed hash)
|
26
|
+
computedHash = keccak256(abi.encodePacked(proofElement, computedHash));
|
27
|
+
}
|
28
|
+
}
|
29
|
+
|
30
|
+
// Check if the computed hash (root) is equal to the provided root
|
31
|
+
return computedHash == root;
|
32
|
+
}
|
33
|
+
}
|
@@ -0,0 +1,108 @@
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
2
|
+
|
3
|
+
pragma solidity >=0.6.0 <0.8.0;
|
4
|
+
|
5
|
+
/**
|
6
|
+
* @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.
|
7
|
+
*
|
8
|
+
* The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,
|
9
|
+
* thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding
|
10
|
+
* they need in their contracts using a combination of `abi.encode` and `keccak256`.
|
11
|
+
*
|
12
|
+
* This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding
|
13
|
+
* scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA
|
14
|
+
* ({_hashTypedDataV4}).
|
15
|
+
*
|
16
|
+
* The implementation of the domain separator was designed to be as efficient as possible while still properly updating
|
17
|
+
* the chain id to protect against replay attacks on an eventual fork of the chain.
|
18
|
+
*
|
19
|
+
* NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method
|
20
|
+
* https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].
|
21
|
+
*
|
22
|
+
* _Available since v3.4._
|
23
|
+
*/
|
24
|
+
abstract contract EIP712 {
|
25
|
+
/* solhint-disable var-name-mixedcase */
|
26
|
+
// Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to
|
27
|
+
// invalidate the cached domain separator if the chain id changes.
|
28
|
+
bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;
|
29
|
+
uint256 private immutable _CACHED_CHAIN_ID;
|
30
|
+
|
31
|
+
bytes32 private immutable _HASHED_NAME;
|
32
|
+
bytes32 private immutable _HASHED_VERSION;
|
33
|
+
bytes32 private immutable _TYPE_HASH;
|
34
|
+
/* solhint-enable var-name-mixedcase */
|
35
|
+
|
36
|
+
/**
|
37
|
+
* @dev Initializes the domain separator and parameter caches.
|
38
|
+
*
|
39
|
+
* The meaning of `name` and `version` is specified in
|
40
|
+
* https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:
|
41
|
+
*
|
42
|
+
* - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.
|
43
|
+
* - `version`: the current major version of the signing domain.
|
44
|
+
*
|
45
|
+
* NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart
|
46
|
+
* contract upgrade].
|
47
|
+
*/
|
48
|
+
constructor(string memory name, string memory version) internal {
|
49
|
+
bytes32 hashedName = keccak256(bytes(name));
|
50
|
+
bytes32 hashedVersion = keccak256(bytes(version));
|
51
|
+
bytes32 typeHash = keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)");
|
52
|
+
_HASHED_NAME = hashedName;
|
53
|
+
_HASHED_VERSION = hashedVersion;
|
54
|
+
_CACHED_CHAIN_ID = _getChainId();
|
55
|
+
_CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);
|
56
|
+
_TYPE_HASH = typeHash;
|
57
|
+
}
|
58
|
+
|
59
|
+
/**
|
60
|
+
* @dev Returns the domain separator for the current chain.
|
61
|
+
*/
|
62
|
+
function _domainSeparatorV4() internal view virtual returns (bytes32) {
|
63
|
+
if (_getChainId() == _CACHED_CHAIN_ID) {
|
64
|
+
return _CACHED_DOMAIN_SEPARATOR;
|
65
|
+
} else {
|
66
|
+
return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);
|
67
|
+
}
|
68
|
+
}
|
69
|
+
|
70
|
+
function _buildDomainSeparator(bytes32 typeHash, bytes32 name, bytes32 version) private view returns (bytes32) {
|
71
|
+
return keccak256(
|
72
|
+
abi.encode(
|
73
|
+
typeHash,
|
74
|
+
name,
|
75
|
+
version,
|
76
|
+
_getChainId(),
|
77
|
+
address(this)
|
78
|
+
)
|
79
|
+
);
|
80
|
+
}
|
81
|
+
|
82
|
+
/**
|
83
|
+
* @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this
|
84
|
+
* function returns the hash of the fully encoded EIP712 message for this domain.
|
85
|
+
*
|
86
|
+
* This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:
|
87
|
+
*
|
88
|
+
* ```solidity
|
89
|
+
* bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(
|
90
|
+
* keccak256("Mail(address to,string contents)"),
|
91
|
+
* mailTo,
|
92
|
+
* keccak256(bytes(mailContents))
|
93
|
+
* )));
|
94
|
+
* address signer = ECDSA.recover(digest, signature);
|
95
|
+
* ```
|
96
|
+
*/
|
97
|
+
function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {
|
98
|
+
return keccak256(abi.encodePacked("\x19\x01", _domainSeparatorV4(), structHash));
|
99
|
+
}
|
100
|
+
|
101
|
+
function _getChainId() private view returns (uint256 chainId) {
|
102
|
+
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
|
103
|
+
// solhint-disable-next-line no-inline-assembly
|
104
|
+
assembly {
|
105
|
+
chainId := chainid()
|
106
|
+
}
|
107
|
+
}
|
108
|
+
}
|
@@ -0,0 +1,78 @@
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
2
|
+
|
3
|
+
pragma solidity >=0.6.5 <0.8.0;
|
4
|
+
|
5
|
+
import "../token/ERC20/ERC20.sol";
|
6
|
+
import "./IERC20Permit.sol";
|
7
|
+
import "../cryptography/ECDSA.sol";
|
8
|
+
import "../utils/Counters.sol";
|
9
|
+
import "./EIP712.sol";
|
10
|
+
|
11
|
+
/**
|
12
|
+
* @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
|
13
|
+
* https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
|
14
|
+
*
|
15
|
+
* Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
|
16
|
+
* presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't
|
17
|
+
* need to send a transaction, and thus is not required to hold Ether at all.
|
18
|
+
*
|
19
|
+
* _Available since v3.4._
|
20
|
+
*/
|
21
|
+
abstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 {
|
22
|
+
using Counters for Counters.Counter;
|
23
|
+
|
24
|
+
mapping (address => Counters.Counter) private _nonces;
|
25
|
+
|
26
|
+
// solhint-disable-next-line var-name-mixedcase
|
27
|
+
bytes32 private immutable _PERMIT_TYPEHASH = keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");
|
28
|
+
|
29
|
+
/**
|
30
|
+
* @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `"1"`.
|
31
|
+
*
|
32
|
+
* It's a good idea to use the same `name` that is defined as the ERC20 token name.
|
33
|
+
*/
|
34
|
+
constructor(string memory name) internal EIP712(name, "1") {
|
35
|
+
}
|
36
|
+
|
37
|
+
/**
|
38
|
+
* @dev See {IERC20Permit-permit}.
|
39
|
+
*/
|
40
|
+
function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public virtual override {
|
41
|
+
// solhint-disable-next-line not-rely-on-time
|
42
|
+
require(block.timestamp <= deadline, "ERC20Permit: expired deadline");
|
43
|
+
|
44
|
+
bytes32 structHash = keccak256(
|
45
|
+
abi.encode(
|
46
|
+
_PERMIT_TYPEHASH,
|
47
|
+
owner,
|
48
|
+
spender,
|
49
|
+
value,
|
50
|
+
_nonces[owner].current(),
|
51
|
+
deadline
|
52
|
+
)
|
53
|
+
);
|
54
|
+
|
55
|
+
bytes32 hash = _hashTypedDataV4(structHash);
|
56
|
+
|
57
|
+
address signer = ECDSA.recover(hash, v, r, s);
|
58
|
+
require(signer == owner, "ERC20Permit: invalid signature");
|
59
|
+
|
60
|
+
_nonces[owner].increment();
|
61
|
+
_approve(owner, spender, value);
|
62
|
+
}
|
63
|
+
|
64
|
+
/**
|
65
|
+
* @dev See {IERC20Permit-nonces}.
|
66
|
+
*/
|
67
|
+
function nonces(address owner) public view override returns (uint256) {
|
68
|
+
return _nonces[owner].current();
|
69
|
+
}
|
70
|
+
|
71
|
+
/**
|
72
|
+
* @dev See {IERC20Permit-DOMAIN_SEPARATOR}.
|
73
|
+
*/
|
74
|
+
// solhint-disable-next-line func-name-mixedcase
|
75
|
+
function DOMAIN_SEPARATOR() external view override returns (bytes32) {
|
76
|
+
return _domainSeparatorV4();
|
77
|
+
}
|
78
|
+
}
|
@@ -0,0 +1,51 @@
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
2
|
+
|
3
|
+
pragma solidity >=0.6.0 <0.8.0;
|
4
|
+
|
5
|
+
/**
|
6
|
+
* @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
|
7
|
+
* https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
|
8
|
+
*
|
9
|
+
* Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
|
10
|
+
* presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't
|
11
|
+
* need to send a transaction, and thus is not required to hold Ether at all.
|
12
|
+
*/
|
13
|
+
interface IERC20Permit {
|
14
|
+
/**
|
15
|
+
* @dev Sets `value` as the allowance of `spender` over `owner`'s tokens,
|
16
|
+
* given `owner`'s signed approval.
|
17
|
+
*
|
18
|
+
* IMPORTANT: The same issues {IERC20-approve} has related to transaction
|
19
|
+
* ordering also apply here.
|
20
|
+
*
|
21
|
+
* Emits an {Approval} event.
|
22
|
+
*
|
23
|
+
* Requirements:
|
24
|
+
*
|
25
|
+
* - `spender` cannot be the zero address.
|
26
|
+
* - `deadline` must be a timestamp in the future.
|
27
|
+
* - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
|
28
|
+
* over the EIP712-formatted function arguments.
|
29
|
+
* - the signature must use ``owner``'s current nonce (see {nonces}).
|
30
|
+
*
|
31
|
+
* For more information on the signature format, see the
|
32
|
+
* https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
|
33
|
+
* section].
|
34
|
+
*/
|
35
|
+
function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;
|
36
|
+
|
37
|
+
/**
|
38
|
+
* @dev Returns the current nonce for `owner`. This value must be
|
39
|
+
* included whenever a signature is generated for {permit}.
|
40
|
+
*
|
41
|
+
* Every successful call to {permit} increases ``owner``'s nonce by one. This
|
42
|
+
* prevents a signature from being used multiple times.
|
43
|
+
*/
|
44
|
+
function nonces(address owner) external view returns (uint256);
|
45
|
+
|
46
|
+
/**
|
47
|
+
* @dev Returns the domain separator used in the encoding of the signature for `permit`, as defined by {EIP712}.
|
48
|
+
*/
|
49
|
+
// solhint-disable-next-line func-name-mixedcase
|
50
|
+
function DOMAIN_SEPARATOR() external view returns (bytes32);
|
51
|
+
}
|
@@ -0,0 +1,54 @@
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
2
|
+
|
3
|
+
pragma solidity >=0.6.0 <0.8.0;
|
4
|
+
|
5
|
+
import "./IERC165.sol";
|
6
|
+
|
7
|
+
/**
|
8
|
+
* @dev Implementation of the {IERC165} interface.
|
9
|
+
*
|
10
|
+
* Contracts may inherit from this and call {_registerInterface} to declare
|
11
|
+
* their support of an interface.
|
12
|
+
*/
|
13
|
+
abstract contract ERC165 is IERC165 {
|
14
|
+
/*
|
15
|
+
* bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7
|
16
|
+
*/
|
17
|
+
bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;
|
18
|
+
|
19
|
+
/**
|
20
|
+
* @dev Mapping of interface ids to whether or not it's supported.
|
21
|
+
*/
|
22
|
+
mapping(bytes4 => bool) private _supportedInterfaces;
|
23
|
+
|
24
|
+
constructor () internal {
|
25
|
+
// Derived contracts need only register support for their own interfaces,
|
26
|
+
// we register support for ERC165 itself here
|
27
|
+
_registerInterface(_INTERFACE_ID_ERC165);
|
28
|
+
}
|
29
|
+
|
30
|
+
/**
|
31
|
+
* @dev See {IERC165-supportsInterface}.
|
32
|
+
*
|
33
|
+
* Time complexity O(1), guaranteed to always use less than 30 000 gas.
|
34
|
+
*/
|
35
|
+
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
|
36
|
+
return _supportedInterfaces[interfaceId];
|
37
|
+
}
|
38
|
+
|
39
|
+
/**
|
40
|
+
* @dev Registers the contract as an implementer of the interface defined by
|
41
|
+
* `interfaceId`. Support of the actual ERC165 interface is automatic and
|
42
|
+
* registering its interface id is not required.
|
43
|
+
*
|
44
|
+
* See {IERC165-supportsInterface}.
|
45
|
+
*
|
46
|
+
* Requirements:
|
47
|
+
*
|
48
|
+
* - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`).
|
49
|
+
*/
|
50
|
+
function _registerInterface(bytes4 interfaceId) internal virtual {
|
51
|
+
require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
|
52
|
+
_supportedInterfaces[interfaceId] = true;
|
53
|
+
}
|
54
|
+
}
|
@@ -0,0 +1,131 @@
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
2
|
+
|
3
|
+
pragma solidity >=0.6.2 <0.8.0;
|
4
|
+
|
5
|
+
/**
|
6
|
+
* @dev Library used to query support of an interface declared via {IERC165}.
|
7
|
+
*
|
8
|
+
* Note that these functions return the actual result of the query: they do not
|
9
|
+
* `revert` if an interface is not supported. It is up to the caller to decide
|
10
|
+
* what to do in these cases.
|
11
|
+
*/
|
12
|
+
library ERC165Checker {
|
13
|
+
// As per the EIP-165 spec, no interface should ever match 0xffffffff
|
14
|
+
bytes4 private constant _INTERFACE_ID_INVALID = 0xffffffff;
|
15
|
+
|
16
|
+
/*
|
17
|
+
* bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7
|
18
|
+
*/
|
19
|
+
bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;
|
20
|
+
|
21
|
+
/**
|
22
|
+
* @dev Returns true if `account` supports the {IERC165} interface,
|
23
|
+
*/
|
24
|
+
function supportsERC165(address account) internal view returns (bool) {
|
25
|
+
// Any contract that implements ERC165 must explicitly indicate support of
|
26
|
+
// InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_Invalid
|
27
|
+
return _supportsERC165Interface(account, _INTERFACE_ID_ERC165) &&
|
28
|
+
!_supportsERC165Interface(account, _INTERFACE_ID_INVALID);
|
29
|
+
}
|
30
|
+
|
31
|
+
/**
|
32
|
+
* @dev Returns true if `account` supports the interface defined by
|
33
|
+
* `interfaceId`. Support for {IERC165} itself is queried automatically.
|
34
|
+
*
|
35
|
+
* See {IERC165-supportsInterface}.
|
36
|
+
*/
|
37
|
+
function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) {
|
38
|
+
// query support of both ERC165 as per the spec and support of _interfaceId
|
39
|
+
return supportsERC165(account) &&
|
40
|
+
_supportsERC165Interface(account, interfaceId);
|
41
|
+
}
|
42
|
+
|
43
|
+
/**
|
44
|
+
* @dev Returns a boolean array where each value corresponds to the
|
45
|
+
* interfaces passed in and whether they're supported or not. This allows
|
46
|
+
* you to batch check interfaces for a contract where your expectation
|
47
|
+
* is that some interfaces may not be supported.
|
48
|
+
*
|
49
|
+
* See {IERC165-supportsInterface}.
|
50
|
+
*
|
51
|
+
* _Available since v3.4._
|
52
|
+
*/
|
53
|
+
function getSupportedInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool[] memory) {
|
54
|
+
// an array of booleans corresponding to interfaceIds and whether they're supported or not
|
55
|
+
bool[] memory interfaceIdsSupported = new bool[](interfaceIds.length);
|
56
|
+
|
57
|
+
// query support of ERC165 itself
|
58
|
+
if (supportsERC165(account)) {
|
59
|
+
// query support of each interface in interfaceIds
|
60
|
+
for (uint256 i = 0; i < interfaceIds.length; i++) {
|
61
|
+
interfaceIdsSupported[i] = _supportsERC165Interface(account, interfaceIds[i]);
|
62
|
+
}
|
63
|
+
}
|
64
|
+
|
65
|
+
return interfaceIdsSupported;
|
66
|
+
}
|
67
|
+
|
68
|
+
/**
|
69
|
+
* @dev Returns true if `account` supports all the interfaces defined in
|
70
|
+
* `interfaceIds`. Support for {IERC165} itself is queried automatically.
|
71
|
+
*
|
72
|
+
* Batch-querying can lead to gas savings by skipping repeated checks for
|
73
|
+
* {IERC165} support.
|
74
|
+
*
|
75
|
+
* See {IERC165-supportsInterface}.
|
76
|
+
*/
|
77
|
+
function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) {
|
78
|
+
// query support of ERC165 itself
|
79
|
+
if (!supportsERC165(account)) {
|
80
|
+
return false;
|
81
|
+
}
|
82
|
+
|
83
|
+
// query support of each interface in _interfaceIds
|
84
|
+
for (uint256 i = 0; i < interfaceIds.length; i++) {
|
85
|
+
if (!_supportsERC165Interface(account, interfaceIds[i])) {
|
86
|
+
return false;
|
87
|
+
}
|
88
|
+
}
|
89
|
+
|
90
|
+
// all interfaces supported
|
91
|
+
return true;
|
92
|
+
}
|
93
|
+
|
94
|
+
/**
|
95
|
+
* @notice Query if a contract implements an interface, does not check ERC165 support
|
96
|
+
* @param account The address of the contract to query for support of an interface
|
97
|
+
* @param interfaceId The interface identifier, as specified in ERC-165
|
98
|
+
* @return true if the contract at account indicates support of the interface with
|
99
|
+
* identifier interfaceId, false otherwise
|
100
|
+
* @dev Assumes that account contains a contract that supports ERC165, otherwise
|
101
|
+
* the behavior of this method is undefined. This precondition can be checked
|
102
|
+
* with {supportsERC165}.
|
103
|
+
* Interface identification is specified in ERC-165.
|
104
|
+
*/
|
105
|
+
function _supportsERC165Interface(address account, bytes4 interfaceId) private view returns (bool) {
|
106
|
+
// success determines whether the staticcall succeeded and result determines
|
107
|
+
// whether the contract at account indicates support of _interfaceId
|
108
|
+
(bool success, bool result) = _callERC165SupportsInterface(account, interfaceId);
|
109
|
+
|
110
|
+
return (success && result);
|
111
|
+
}
|
112
|
+
|
113
|
+
/**
|
114
|
+
* @notice Calls the function with selector 0x01ffc9a7 (ERC165) and suppresses throw
|
115
|
+
* @param account The address of the contract to query for support of an interface
|
116
|
+
* @param interfaceId The interface identifier, as specified in ERC-165
|
117
|
+
* @return success true if the STATICCALL succeeded, false otherwise
|
118
|
+
* @return result true if the STATICCALL succeeded and the contract at account
|
119
|
+
* indicates support of the interface with identifier interfaceId, false otherwise
|
120
|
+
*/
|
121
|
+
function _callERC165SupportsInterface(address account, bytes4 interfaceId)
|
122
|
+
private
|
123
|
+
view
|
124
|
+
returns (bool, bool)
|
125
|
+
{
|
126
|
+
bytes memory encodedParams = abi.encodeWithSelector(_INTERFACE_ID_ERC165, interfaceId);
|
127
|
+
(bool success, bytes memory result) = account.staticcall{ gas: 30000 }(encodedParams);
|
128
|
+
if (result.length < 32) return (false, false);
|
129
|
+
return (success, abi.decode(result, (bool)));
|
130
|
+
}
|
131
|
+
}
|
@@ -0,0 +1,37 @@
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
2
|
+
|
3
|
+
pragma solidity >=0.6.0 <0.8.0;
|
4
|
+
|
5
|
+
import "./IERC1820Implementer.sol";
|
6
|
+
|
7
|
+
/**
|
8
|
+
* @dev Implementation of the {IERC1820Implementer} interface.
|
9
|
+
*
|
10
|
+
* Contracts may inherit from this and call {_registerInterfaceForAddress} to
|
11
|
+
* declare their willingness to be implementers.
|
12
|
+
* {IERC1820Registry-setInterfaceImplementer} should then be called for the
|
13
|
+
* registration to be complete.
|
14
|
+
*/
|
15
|
+
contract ERC1820Implementer is IERC1820Implementer {
|
16
|
+
bytes32 constant private _ERC1820_ACCEPT_MAGIC = keccak256(abi.encodePacked("ERC1820_ACCEPT_MAGIC"));
|
17
|
+
|
18
|
+
mapping(bytes32 => mapping(address => bool)) private _supportedInterfaces;
|
19
|
+
|
20
|
+
/**
|
21
|
+
* See {IERC1820Implementer-canImplementInterfaceForAddress}.
|
22
|
+
*/
|
23
|
+
function canImplementInterfaceForAddress(bytes32 interfaceHash, address account) public view virtual override returns (bytes32) {
|
24
|
+
return _supportedInterfaces[interfaceHash][account] ? _ERC1820_ACCEPT_MAGIC : bytes32(0x00);
|
25
|
+
}
|
26
|
+
|
27
|
+
/**
|
28
|
+
* @dev Declares the contract as willing to be an implementer of
|
29
|
+
* `interfaceHash` for `account`.
|
30
|
+
*
|
31
|
+
* See {IERC1820Registry-setInterfaceImplementer} and
|
32
|
+
* {IERC1820Registry-interfaceHash}.
|
33
|
+
*/
|
34
|
+
function _registerInterfaceForAddress(bytes32 interfaceHash, address account) internal virtual {
|
35
|
+
_supportedInterfaces[interfaceHash][account] = true;
|
36
|
+
}
|
37
|
+
}
|
@@ -0,0 +1,24 @@
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
2
|
+
|
3
|
+
pragma solidity >=0.6.0 <0.8.0;
|
4
|
+
|
5
|
+
/**
|
6
|
+
* @dev Interface of the ERC165 standard, as defined in the
|
7
|
+
* https://eips.ethereum.org/EIPS/eip-165[EIP].
|
8
|
+
*
|
9
|
+
* Implementers can declare support of contract interfaces, which can then be
|
10
|
+
* queried by others ({ERC165Checker}).
|
11
|
+
*
|
12
|
+
* For an implementation, see {ERC165}.
|
13
|
+
*/
|
14
|
+
interface IERC165 {
|
15
|
+
/**
|
16
|
+
* @dev Returns true if this contract implements the interface defined by
|
17
|
+
* `interfaceId`. See the corresponding
|
18
|
+
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
|
19
|
+
* to learn more about how these ids are created.
|
20
|
+
*
|
21
|
+
* This function call must use less than 30 000 gas.
|
22
|
+
*/
|
23
|
+
function supportsInterface(bytes4 interfaceId) external view returns (bool);
|
24
|
+
}
|
@@ -0,0 +1,19 @@
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
2
|
+
|
3
|
+
pragma solidity >=0.6.0 <0.8.0;
|
4
|
+
|
5
|
+
/**
|
6
|
+
* @dev Interface for an ERC1820 implementer, as defined in the
|
7
|
+
* https://eips.ethereum.org/EIPS/eip-1820#interface-implementation-erc1820implementerinterface[EIP].
|
8
|
+
* Used by contracts that will be registered as implementers in the
|
9
|
+
* {IERC1820Registry}.
|
10
|
+
*/
|
11
|
+
interface IERC1820Implementer {
|
12
|
+
/**
|
13
|
+
* @dev Returns a special value (`ERC1820_ACCEPT_MAGIC`) if this contract
|
14
|
+
* implements `interfaceHash` for `account`.
|
15
|
+
*
|
16
|
+
* See {IERC1820Registry-setInterfaceImplementer}.
|
17
|
+
*/
|
18
|
+
function canImplementInterfaceForAddress(bytes32 interfaceHash, address account) external view returns (bytes32);
|
19
|
+
}
|
@@ -0,0 +1,111 @@
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
2
|
+
|
3
|
+
pragma solidity >=0.6.0 <0.8.0;
|
4
|
+
|
5
|
+
/**
|
6
|
+
* @dev Interface of the global ERC1820 Registry, as defined in the
|
7
|
+
* https://eips.ethereum.org/EIPS/eip-1820[EIP]. Accounts may register
|
8
|
+
* implementers for interfaces in this registry, as well as query support.
|
9
|
+
*
|
10
|
+
* Implementers may be shared by multiple accounts, and can also implement more
|
11
|
+
* than a single interface for each account. Contracts can implement interfaces
|
12
|
+
* for themselves, but externally-owned accounts (EOA) must delegate this to a
|
13
|
+
* contract.
|
14
|
+
*
|
15
|
+
* {IERC165} interfaces can also be queried via the registry.
|
16
|
+
*
|
17
|
+
* For an in-depth explanation and source code analysis, see the EIP text.
|
18
|
+
*/
|
19
|
+
interface IERC1820Registry {
|
20
|
+
/**
|
21
|
+
* @dev Sets `newManager` as the manager for `account`. A manager of an
|
22
|
+
* account is able to set interface implementers for it.
|
23
|
+
*
|
24
|
+
* By default, each account is its own manager. Passing a value of `0x0` in
|
25
|
+
* `newManager` will reset the manager to this initial state.
|
26
|
+
*
|
27
|
+
* Emits a {ManagerChanged} event.
|
28
|
+
*
|
29
|
+
* Requirements:
|
30
|
+
*
|
31
|
+
* - the caller must be the current manager for `account`.
|
32
|
+
*/
|
33
|
+
function setManager(address account, address newManager) external;
|
34
|
+
|
35
|
+
/**
|
36
|
+
* @dev Returns the manager for `account`.
|
37
|
+
*
|
38
|
+
* See {setManager}.
|
39
|
+
*/
|
40
|
+
function getManager(address account) external view returns (address);
|
41
|
+
|
42
|
+
/**
|
43
|
+
* @dev Sets the `implementer` contract as ``account``'s implementer for
|
44
|
+
* `interfaceHash`.
|
45
|
+
*
|
46
|
+
* `account` being the zero address is an alias for the caller's address.
|
47
|
+
* The zero address can also be used in `implementer` to remove an old one.
|
48
|
+
*
|
49
|
+
* See {interfaceHash} to learn how these are created.
|
50
|
+
*
|
51
|
+
* Emits an {InterfaceImplementerSet} event.
|
52
|
+
*
|
53
|
+
* Requirements:
|
54
|
+
*
|
55
|
+
* - the caller must be the current manager for `account`.
|
56
|
+
* - `interfaceHash` must not be an {IERC165} interface id (i.e. it must not
|
57
|
+
* end in 28 zeroes).
|
58
|
+
* - `implementer` must implement {IERC1820Implementer} and return true when
|
59
|
+
* queried for support, unless `implementer` is the caller. See
|
60
|
+
* {IERC1820Implementer-canImplementInterfaceForAddress}.
|
61
|
+
*/
|
62
|
+
function setInterfaceImplementer(address account, bytes32 _interfaceHash, address implementer) external;
|
63
|
+
|
64
|
+
/**
|
65
|
+
* @dev Returns the implementer of `interfaceHash` for `account`. If no such
|
66
|
+
* implementer is registered, returns the zero address.
|
67
|
+
*
|
68
|
+
* If `interfaceHash` is an {IERC165} interface id (i.e. it ends with 28
|
69
|
+
* zeroes), `account` will be queried for support of it.
|
70
|
+
*
|
71
|
+
* `account` being the zero address is an alias for the caller's address.
|
72
|
+
*/
|
73
|
+
function getInterfaceImplementer(address account, bytes32 _interfaceHash) external view returns (address);
|
74
|
+
|
75
|
+
/**
|
76
|
+
* @dev Returns the interface hash for an `interfaceName`, as defined in the
|
77
|
+
* corresponding
|
78
|
+
* https://eips.ethereum.org/EIPS/eip-1820#interface-name[section of the EIP].
|
79
|
+
*/
|
80
|
+
function interfaceHash(string calldata interfaceName) external pure returns (bytes32);
|
81
|
+
|
82
|
+
/**
|
83
|
+
* @notice Updates the cache with whether the contract implements an ERC165 interface or not.
|
84
|
+
* @param account Address of the contract for which to update the cache.
|
85
|
+
* @param interfaceId ERC165 interface for which to update the cache.
|
86
|
+
*/
|
87
|
+
function updateERC165Cache(address account, bytes4 interfaceId) external;
|
88
|
+
|
89
|
+
/**
|
90
|
+
* @notice Checks whether a contract implements an ERC165 interface or not.
|
91
|
+
* If the result is not cached a direct lookup on the contract address is performed.
|
92
|
+
* If the result is not cached or the cached value is out-of-date, the cache MUST be updated manually by calling
|
93
|
+
* {updateERC165Cache} with the contract address.
|
94
|
+
* @param account Address of the contract to check.
|
95
|
+
* @param interfaceId ERC165 interface to check.
|
96
|
+
* @return True if `account` implements `interfaceId`, false otherwise.
|
97
|
+
*/
|
98
|
+
function implementsERC165Interface(address account, bytes4 interfaceId) external view returns (bool);
|
99
|
+
|
100
|
+
/**
|
101
|
+
* @notice Checks whether a contract implements an ERC165 interface or not without using nor updating the cache.
|
102
|
+
* @param account Address of the contract to check.
|
103
|
+
* @param interfaceId ERC165 interface to check.
|
104
|
+
* @return True if `account` implements `interfaceId`, false otherwise.
|
105
|
+
*/
|
106
|
+
function implementsERC165InterfaceNoCache(address account, bytes4 interfaceId) external view returns (bool);
|
107
|
+
|
108
|
+
event InterfaceImplementerSet(address indexed account, bytes32 indexed interfaceHash, address indexed implementer);
|
109
|
+
|
110
|
+
event ManagerChanged(address indexed account, address indexed newManager);
|
111
|
+
}
|
@@ -0,0 +1,31 @@
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
2
|
+
|
3
|
+
pragma solidity >=0.6.0 <0.8.0;
|
4
|
+
|
5
|
+
/**
|
6
|
+
* @dev Standard math utilities missing in the Solidity language.
|
7
|
+
*/
|
8
|
+
library Math {
|
9
|
+
/**
|
10
|
+
* @dev Returns the largest of two numbers.
|
11
|
+
*/
|
12
|
+
function max(uint256 a, uint256 b) internal pure returns (uint256) {
|
13
|
+
return a >= b ? a : b;
|
14
|
+
}
|
15
|
+
|
16
|
+
/**
|
17
|
+
* @dev Returns the smallest of two numbers.
|
18
|
+
*/
|
19
|
+
function min(uint256 a, uint256 b) internal pure returns (uint256) {
|
20
|
+
return a < b ? a : b;
|
21
|
+
}
|
22
|
+
|
23
|
+
/**
|
24
|
+
* @dev Returns the average of two numbers. The result is rounded towards
|
25
|
+
* zero.
|
26
|
+
*/
|
27
|
+
function average(uint256 a, uint256 b) internal pure returns (uint256) {
|
28
|
+
// (a + b) / 2 can overflow, so we distribute
|
29
|
+
return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2);
|
30
|
+
}
|
31
|
+
}
|