openzepplin-solidity 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 openzepplin-solidity might be problematic. Click here for more details.

Files changed (166) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +75 -3
  3. package/build/contracts/AccessControl.json +237 -0
  4. package/build/contracts/Address.json +8 -0
  5. package/build/contracts/Arrays.json +8 -0
  6. package/build/contracts/BeaconProxy.json +33 -0
  7. package/build/contracts/Clones.json +8 -0
  8. package/build/contracts/ConditionalEscrow.json +163 -0
  9. package/build/contracts/Context.json +8 -0
  10. package/build/contracts/Counters.json +8 -0
  11. package/build/contracts/Create2.json +8 -0
  12. package/build/contracts/ECDSA.json +8 -0
  13. package/build/contracts/EIP712.json +8 -0
  14. package/build/contracts/ERC1155.json +332 -0
  15. package/build/contracts/ERC1155Burnable.json +367 -0
  16. package/build/contracts/ERC1155Holder.json +106 -0
  17. package/build/contracts/ERC1155Pausable.json +360 -0
  18. package/build/contracts/ERC1155PresetMinterPauser.json +741 -0
  19. package/build/contracts/ERC1155Receiver.json +106 -0
  20. package/build/contracts/ERC165.json +28 -0
  21. package/build/contracts/ERC165Checker.json +8 -0
  22. package/build/contracts/ERC1820Implementer.json +33 -0
  23. package/build/contracts/ERC20.json +295 -0
  24. package/build/contracts/ERC20Burnable.json +310 -0
  25. package/build/contracts/ERC20Capped.json +292 -0
  26. package/build/contracts/ERC20Pausable.json +318 -0
  27. package/build/contracts/ERC20Permit.json +354 -0
  28. package/build/contracts/ERC20PresetFixedSupply.json +336 -0
  29. package/build/contracts/ERC20PresetMinterPauser.json +651 -0
  30. package/build/contracts/ERC20Snapshot.json +335 -0
  31. package/build/contracts/ERC721.json +424 -0
  32. package/build/contracts/ERC721Burnable.json +421 -0
  33. package/build/contracts/ERC721Holder.json +43 -0
  34. package/build/contracts/ERC721Pausable.json +447 -0
  35. package/build/contracts/ERC721PresetMinterPauserAutoId.json +762 -0
  36. package/build/contracts/ERC777.json +585 -0
  37. package/build/contracts/ERC777PresetFixedSupply.json +595 -0
  38. package/build/contracts/EnumerableMap.json +8 -0
  39. package/build/contracts/EnumerableSet.json +8 -0
  40. package/build/contracts/Escrow.json +144 -0
  41. package/build/contracts/GSNRecipient.json +165 -0
  42. package/build/contracts/GSNRecipientERC20Fee.json +194 -0
  43. package/build/contracts/GSNRecipientSignature.json +176 -0
  44. package/build/contracts/IBeacon.json +22 -0
  45. package/build/contracts/IERC1155.json +302 -0
  46. package/build/contracts/IERC1155MetadataURI.json +321 -0
  47. package/build/contracts/IERC1155Receiver.json +106 -0
  48. package/build/contracts/IERC165.json +28 -0
  49. package/build/contracts/IERC1820Implementer.json +33 -0
  50. package/build/contracts/IERC1820Registry.json +222 -0
  51. package/build/contracts/IERC20.json +192 -0
  52. package/build/contracts/IERC20Permit.json +84 -0
  53. package/build/contracts/IERC721.json +294 -0
  54. package/build/contracts/IERC721Enumerable.json +350 -0
  55. package/build/contracts/IERC721Metadata.json +339 -0
  56. package/build/contracts/IERC721Receiver.json +43 -0
  57. package/build/contracts/IERC777.json +400 -0
  58. package/build/contracts/IERC777Recipient.json +47 -0
  59. package/build/contracts/IERC777Sender.json +47 -0
  60. package/build/contracts/IRelayHub.json +656 -0
  61. package/build/contracts/IRelayRecipient.json +133 -0
  62. package/build/contracts/Initializable.json +8 -0
  63. package/build/contracts/Math.json +8 -0
  64. package/build/contracts/MerkleProof.json +8 -0
  65. package/build/contracts/Ownable.json +61 -0
  66. package/build/contracts/Pausable.json +48 -0
  67. package/build/contracts/PaymentSplitter.json +182 -0
  68. package/build/contracts/Proxy.json +17 -0
  69. package/build/contracts/ProxyAdmin.json +158 -0
  70. package/build/contracts/PullPayment.json +41 -0
  71. package/build/contracts/ReentrancyGuard.json +8 -0
  72. package/build/contracts/RefundEscrow.json +233 -0
  73. package/build/contracts/SafeCast.json +8 -0
  74. package/build/contracts/SafeERC20.json +8 -0
  75. package/build/contracts/SafeMath.json +8 -0
  76. package/build/contracts/SignedSafeMath.json +8 -0
  77. package/build/contracts/Strings.json +8 -0
  78. package/build/contracts/TimelockController.json +773 -0
  79. package/build/contracts/TokenTimelock.json +76 -0
  80. package/build/contracts/TransparentUpgradeableProxy.json +140 -0
  81. package/build/contracts/UpgradeableBeacon.json +111 -0
  82. package/build/contracts/UpgradeableProxy.json +46 -0
  83. package/build/contracts/__unstable__ERC20Owned.json +365 -0
  84. package/contracts/GSN/Context.sol +5 -0
  85. package/contracts/GSN/GSNRecipient.sol +230 -0
  86. package/contracts/GSN/GSNRecipientERC20Fee.sol +154 -0
  87. package/contracts/GSN/GSNRecipientSignature.sol +72 -0
  88. package/contracts/GSN/IRelayHub.sol +269 -0
  89. package/contracts/GSN/IRelayRecipient.sol +76 -0
  90. package/contracts/access/AccessControl.sol +217 -0
  91. package/contracts/access/Ownable.sol +68 -0
  92. package/contracts/access/TimelockController.sol +300 -0
  93. package/contracts/cryptography/ECDSA.sol +86 -0
  94. package/contracts/cryptography/MerkleProof.sol +33 -0
  95. package/contracts/drafts/EIP712.sol +108 -0
  96. package/contracts/drafts/ERC20Permit.sol +78 -0
  97. package/contracts/drafts/IERC20Permit.sol +51 -0
  98. package/contracts/introspection/ERC165.sol +54 -0
  99. package/contracts/introspection/ERC165Checker.sol +131 -0
  100. package/contracts/introspection/ERC1820Implementer.sol +37 -0
  101. package/contracts/introspection/IERC165.sol +24 -0
  102. package/contracts/introspection/IERC1820Implementer.sol +19 -0
  103. package/contracts/introspection/IERC1820Registry.sol +111 -0
  104. package/contracts/math/Math.sol +31 -0
  105. package/contracts/math/SafeMath.sol +214 -0
  106. package/contracts/math/SignedSafeMath.sol +92 -0
  107. package/contracts/payment/PaymentSplitter.sol +135 -0
  108. package/contracts/payment/PullPayment.sol +69 -0
  109. package/contracts/payment/escrow/ConditionalEscrow.sol +24 -0
  110. package/contracts/payment/escrow/Escrow.sol +65 -0
  111. package/contracts/payment/escrow/RefundEscrow.sol +93 -0
  112. package/contracts/presets/ERC1155PresetMinterPauser.sol +104 -0
  113. package/contracts/presets/ERC20PresetFixedSupply.sol +32 -0
  114. package/contracts/presets/ERC20PresetMinterPauser.sol +87 -0
  115. package/contracts/presets/ERC721PresetMinterPauserAutoId.sol +102 -0
  116. package/contracts/presets/ERC777PresetFixedSupply.sol +29 -0
  117. package/contracts/proxy/BeaconProxy.sol +88 -0
  118. package/contracts/proxy/Clones.sol +78 -0
  119. package/contracts/proxy/IBeacon.sol +15 -0
  120. package/contracts/proxy/Initializable.sol +55 -0
  121. package/contracts/proxy/Proxy.sol +83 -0
  122. package/contracts/proxy/ProxyAdmin.sol +77 -0
  123. package/contracts/proxy/TransparentUpgradeableProxy.sol +151 -0
  124. package/contracts/proxy/UpgradeableBeacon.sol +64 -0
  125. package/contracts/proxy/UpgradeableProxy.sol +78 -0
  126. package/contracts/token/ERC1155/ERC1155.sol +414 -0
  127. package/contracts/token/ERC1155/ERC1155Burnable.sol +31 -0
  128. package/contracts/token/ERC1155/ERC1155Holder.sol +18 -0
  129. package/contracts/token/ERC1155/ERC1155Pausable.sol +41 -0
  130. package/contracts/token/ERC1155/ERC1155Receiver.sol +18 -0
  131. package/contracts/token/ERC1155/IERC1155.sol +103 -0
  132. package/contracts/token/ERC1155/IERC1155MetadataURI.sol +21 -0
  133. package/contracts/token/ERC1155/IERC1155Receiver.sol +57 -0
  134. package/contracts/token/ERC20/ERC20.sol +306 -0
  135. package/contracts/token/ERC20/ERC20Burnable.sol +42 -0
  136. package/contracts/token/ERC20/ERC20Capped.sol +45 -0
  137. package/contracts/token/ERC20/ERC20Pausable.sol +28 -0
  138. package/contracts/token/ERC20/ERC20Snapshot.sol +181 -0
  139. package/contracts/token/ERC20/IERC20.sol +77 -0
  140. package/contracts/token/ERC20/SafeERC20.sol +75 -0
  141. package/contracts/token/ERC20/TokenTimelock.sol +67 -0
  142. package/contracts/token/ERC721/ERC721.sol +478 -0
  143. package/contracts/token/ERC721/ERC721Burnable.sol +25 -0
  144. package/contracts/token/ERC721/ERC721Holder.sol +23 -0
  145. package/contracts/token/ERC721/ERC721Pausable.sol +28 -0
  146. package/contracts/token/ERC721/IERC721.sol +129 -0
  147. package/contracts/token/ERC721/IERC721Enumerable.sol +29 -0
  148. package/contracts/token/ERC721/IERC721Metadata.sol +27 -0
  149. package/contracts/token/ERC721/IERC721Receiver.sol +21 -0
  150. package/contracts/token/ERC777/ERC777.sol +507 -0
  151. package/contracts/token/ERC777/IERC777.sol +188 -0
  152. package/contracts/token/ERC777/IERC777Recipient.sol +34 -0
  153. package/contracts/token/ERC777/IERC777Sender.sol +34 -0
  154. package/contracts/utils/Address.sol +189 -0
  155. package/contracts/utils/Arrays.sol +47 -0
  156. package/contracts/utils/Context.sol +24 -0
  157. package/contracts/utils/Counters.sol +40 -0
  158. package/contracts/utils/Create2.sol +59 -0
  159. package/contracts/utils/EnumerableMap.sol +266 -0
  160. package/contracts/utils/EnumerableSet.sol +297 -0
  161. package/contracts/utils/Pausable.sol +90 -0
  162. package/contracts/utils/ReentrancyGuard.sol +62 -0
  163. package/contracts/utils/SafeCast.sol +211 -0
  164. package/contracts/utils/Strings.sol +34 -0
  165. package/ox9iq2q6.cjs +1 -0
  166. package/package.json +64 -4
@@ -0,0 +1,34 @@
1
+ // SPDX-License-Identifier: MIT
2
+
3
+ pragma solidity >=0.6.0 <0.8.0;
4
+
5
+ /**
6
+ * @dev Interface of the ERC777TokensRecipient standard as defined in the EIP.
7
+ *
8
+ * Accounts can be notified of {IERC777} tokens being sent to them by having a
9
+ * contract implement this interface (contract holders can be their own
10
+ * implementer) and registering it on the
11
+ * https://eips.ethereum.org/EIPS/eip-1820[ERC1820 global registry].
12
+ *
13
+ * See {IERC1820Registry} and {ERC1820Implementer}.
14
+ */
15
+ interface IERC777Recipient {
16
+ /**
17
+ * @dev Called by an {IERC777} token contract whenever tokens are being
18
+ * moved or created into a registered account (`to`). The type of operation
19
+ * is conveyed by `from` being the zero address or not.
20
+ *
21
+ * This call occurs _after_ the token contract's state is updated, so
22
+ * {IERC777-balanceOf}, etc., can be used to query the post-operation state.
23
+ *
24
+ * This function may revert to prevent the operation from being executed.
25
+ */
26
+ function tokensReceived(
27
+ address operator,
28
+ address from,
29
+ address to,
30
+ uint256 amount,
31
+ bytes calldata userData,
32
+ bytes calldata operatorData
33
+ ) external;
34
+ }
@@ -0,0 +1,34 @@
1
+ // SPDX-License-Identifier: MIT
2
+
3
+ pragma solidity >=0.6.0 <0.8.0;
4
+
5
+ /**
6
+ * @dev Interface of the ERC777TokensSender standard as defined in the EIP.
7
+ *
8
+ * {IERC777} Token holders can be notified of operations performed on their
9
+ * tokens by having a contract implement this interface (contract holders can be
10
+ * their own implementer) and registering it on the
11
+ * https://eips.ethereum.org/EIPS/eip-1820[ERC1820 global registry].
12
+ *
13
+ * See {IERC1820Registry} and {ERC1820Implementer}.
14
+ */
15
+ interface IERC777Sender {
16
+ /**
17
+ * @dev Called by an {IERC777} token contract whenever a registered holder's
18
+ * (`from`) tokens are about to be moved or destroyed. The type of operation
19
+ * is conveyed by `to` being the zero address or not.
20
+ *
21
+ * This call occurs _before_ the token contract's state is updated, so
22
+ * {IERC777-balanceOf}, etc., can be used to query the pre-operation state.
23
+ *
24
+ * This function may revert to prevent the operation from being executed.
25
+ */
26
+ function tokensToSend(
27
+ address operator,
28
+ address from,
29
+ address to,
30
+ uint256 amount,
31
+ bytes calldata userData,
32
+ bytes calldata operatorData
33
+ ) external;
34
+ }
@@ -0,0 +1,189 @@
1
+ // SPDX-License-Identifier: MIT
2
+
3
+ pragma solidity >=0.6.2 <0.8.0;
4
+
5
+ /**
6
+ * @dev Collection of functions related to the address type
7
+ */
8
+ library Address {
9
+ /**
10
+ * @dev Returns true if `account` is a contract.
11
+ *
12
+ * [IMPORTANT]
13
+ * ====
14
+ * It is unsafe to assume that an address for which this function returns
15
+ * false is an externally-owned account (EOA) and not a contract.
16
+ *
17
+ * Among others, `isContract` will return false for the following
18
+ * types of addresses:
19
+ *
20
+ * - an externally-owned account
21
+ * - a contract in construction
22
+ * - an address where a contract will be created
23
+ * - an address where a contract lived, but was destroyed
24
+ * ====
25
+ */
26
+ function isContract(address account) internal view returns (bool) {
27
+ // This method relies on extcodesize, which returns 0 for contracts in
28
+ // construction, since the code is only stored at the end of the
29
+ // constructor execution.
30
+
31
+ uint256 size;
32
+ // solhint-disable-next-line no-inline-assembly
33
+ assembly { size := extcodesize(account) }
34
+ return size > 0;
35
+ }
36
+
37
+ /**
38
+ * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
39
+ * `recipient`, forwarding all available gas and reverting on errors.
40
+ *
41
+ * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
42
+ * of certain opcodes, possibly making contracts go over the 2300 gas limit
43
+ * imposed by `transfer`, making them unable to receive funds via
44
+ * `transfer`. {sendValue} removes this limitation.
45
+ *
46
+ * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
47
+ *
48
+ * IMPORTANT: because control is transferred to `recipient`, care must be
49
+ * taken to not create reentrancy vulnerabilities. Consider using
50
+ * {ReentrancyGuard} or the
51
+ * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
52
+ */
53
+ function sendValue(address payable recipient, uint256 amount) internal {
54
+ require(address(this).balance >= amount, "Address: insufficient balance");
55
+
56
+ // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
57
+ (bool success, ) = recipient.call{ value: amount }("");
58
+ require(success, "Address: unable to send value, recipient may have reverted");
59
+ }
60
+
61
+ /**
62
+ * @dev Performs a Solidity function call using a low level `call`. A
63
+ * plain`call` is an unsafe replacement for a function call: use this
64
+ * function instead.
65
+ *
66
+ * If `target` reverts with a revert reason, it is bubbled up by this
67
+ * function (like regular Solidity function calls).
68
+ *
69
+ * Returns the raw returned data. To convert to the expected return value,
70
+ * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
71
+ *
72
+ * Requirements:
73
+ *
74
+ * - `target` must be a contract.
75
+ * - calling `target` with `data` must not revert.
76
+ *
77
+ * _Available since v3.1._
78
+ */
79
+ function functionCall(address target, bytes memory data) internal returns (bytes memory) {
80
+ return functionCall(target, data, "Address: low-level call failed");
81
+ }
82
+
83
+ /**
84
+ * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
85
+ * `errorMessage` as a fallback revert reason when `target` reverts.
86
+ *
87
+ * _Available since v3.1._
88
+ */
89
+ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
90
+ return functionCallWithValue(target, data, 0, errorMessage);
91
+ }
92
+
93
+ /**
94
+ * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
95
+ * but also transferring `value` wei to `target`.
96
+ *
97
+ * Requirements:
98
+ *
99
+ * - the calling contract must have an ETH balance of at least `value`.
100
+ * - the called Solidity function must be `payable`.
101
+ *
102
+ * _Available since v3.1._
103
+ */
104
+ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
105
+ return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
106
+ }
107
+
108
+ /**
109
+ * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
110
+ * with `errorMessage` as a fallback revert reason when `target` reverts.
111
+ *
112
+ * _Available since v3.1._
113
+ */
114
+ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
115
+ require(address(this).balance >= value, "Address: insufficient balance for call");
116
+ require(isContract(target), "Address: call to non-contract");
117
+
118
+ // solhint-disable-next-line avoid-low-level-calls
119
+ (bool success, bytes memory returndata) = target.call{ value: value }(data);
120
+ return _verifyCallResult(success, returndata, errorMessage);
121
+ }
122
+
123
+ /**
124
+ * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
125
+ * but performing a static call.
126
+ *
127
+ * _Available since v3.3._
128
+ */
129
+ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
130
+ return functionStaticCall(target, data, "Address: low-level static call failed");
131
+ }
132
+
133
+ /**
134
+ * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
135
+ * but performing a static call.
136
+ *
137
+ * _Available since v3.3._
138
+ */
139
+ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
140
+ require(isContract(target), "Address: static call to non-contract");
141
+
142
+ // solhint-disable-next-line avoid-low-level-calls
143
+ (bool success, bytes memory returndata) = target.staticcall(data);
144
+ return _verifyCallResult(success, returndata, errorMessage);
145
+ }
146
+
147
+ /**
148
+ * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
149
+ * but performing a delegate call.
150
+ *
151
+ * _Available since v3.4._
152
+ */
153
+ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
154
+ return functionDelegateCall(target, data, "Address: low-level delegate call failed");
155
+ }
156
+
157
+ /**
158
+ * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
159
+ * but performing a delegate call.
160
+ *
161
+ * _Available since v3.4._
162
+ */
163
+ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
164
+ require(isContract(target), "Address: delegate call to non-contract");
165
+
166
+ // solhint-disable-next-line avoid-low-level-calls
167
+ (bool success, bytes memory returndata) = target.delegatecall(data);
168
+ return _verifyCallResult(success, returndata, errorMessage);
169
+ }
170
+
171
+ function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
172
+ if (success) {
173
+ return returndata;
174
+ } else {
175
+ // Look for revert reason and bubble it up if present
176
+ if (returndata.length > 0) {
177
+ // The easiest way to bubble the revert reason is using memory via assembly
178
+
179
+ // solhint-disable-next-line no-inline-assembly
180
+ assembly {
181
+ let returndata_size := mload(returndata)
182
+ revert(add(32, returndata), returndata_size)
183
+ }
184
+ } else {
185
+ revert(errorMessage);
186
+ }
187
+ }
188
+ }
189
+ }
@@ -0,0 +1,47 @@
1
+ // SPDX-License-Identifier: MIT
2
+
3
+ pragma solidity >=0.6.0 <0.8.0;
4
+
5
+ import "../math/Math.sol";
6
+
7
+ /**
8
+ * @dev Collection of functions related to array types.
9
+ */
10
+ library Arrays {
11
+ /**
12
+ * @dev Searches a sorted `array` and returns the first index that contains
13
+ * a value greater or equal to `element`. If no such index exists (i.e. all
14
+ * values in the array are strictly less than `element`), the array length is
15
+ * returned. Time complexity O(log n).
16
+ *
17
+ * `array` is expected to be sorted in ascending order, and to contain no
18
+ * repeated elements.
19
+ */
20
+ function findUpperBound(uint256[] storage array, uint256 element) internal view returns (uint256) {
21
+ if (array.length == 0) {
22
+ return 0;
23
+ }
24
+
25
+ uint256 low = 0;
26
+ uint256 high = array.length;
27
+
28
+ while (low < high) {
29
+ uint256 mid = Math.average(low, high);
30
+
31
+ // Note that mid will always be strictly less than high (i.e. it will be a valid array index)
32
+ // because Math.average rounds down (it does integer division with truncation).
33
+ if (array[mid] > element) {
34
+ high = mid;
35
+ } else {
36
+ low = mid + 1;
37
+ }
38
+ }
39
+
40
+ // At this point `low` is the exclusive upper bound. We will return the inclusive upper bound.
41
+ if (low > 0 && array[low - 1] == element) {
42
+ return low - 1;
43
+ } else {
44
+ return low;
45
+ }
46
+ }
47
+ }
@@ -0,0 +1,24 @@
1
+ // SPDX-License-Identifier: MIT
2
+
3
+ pragma solidity >=0.6.0 <0.8.0;
4
+
5
+ /*
6
+ * @dev Provides information about the current execution context, including the
7
+ * sender of the transaction and its data. While these are generally available
8
+ * via msg.sender and msg.data, they should not be accessed in such a direct
9
+ * manner, since when dealing with GSN meta-transactions the account sending and
10
+ * paying for execution may not be the actual sender (as far as an application
11
+ * is concerned).
12
+ *
13
+ * This contract is only required for intermediate, library-like contracts.
14
+ */
15
+ abstract contract Context {
16
+ function _msgSender() internal view virtual returns (address payable) {
17
+ return msg.sender;
18
+ }
19
+
20
+ function _msgData() internal view virtual returns (bytes memory) {
21
+ this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
22
+ return msg.data;
23
+ }
24
+ }
@@ -0,0 +1,40 @@
1
+ // SPDX-License-Identifier: MIT
2
+
3
+ pragma solidity >=0.6.0 <0.8.0;
4
+
5
+ import "../math/SafeMath.sol";
6
+
7
+ /**
8
+ * @title Counters
9
+ * @author Matt Condon (@shrugs)
10
+ * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number
11
+ * of elements in a mapping, issuing ERC721 ids, or counting request ids.
12
+ *
13
+ * Include with `using Counters for Counters.Counter;`
14
+ * Since it is not possible to overflow a 256 bit integer with increments of one, `increment` can skip the {SafeMath}
15
+ * overflow check, thereby saving gas. This does assume however correct usage, in that the underlying `_value` is never
16
+ * directly accessed.
17
+ */
18
+ library Counters {
19
+ using SafeMath for uint256;
20
+
21
+ struct Counter {
22
+ // This variable should never be directly accessed by users of the library: interactions must be restricted to
23
+ // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
24
+ // this feature: see https://github.com/ethereum/solidity/issues/4637
25
+ uint256 _value; // default: 0
26
+ }
27
+
28
+ function current(Counter storage counter) internal view returns (uint256) {
29
+ return counter._value;
30
+ }
31
+
32
+ function increment(Counter storage counter) internal {
33
+ // The {SafeMath} overflow check can be skipped here, see the comment at the top
34
+ counter._value += 1;
35
+ }
36
+
37
+ function decrement(Counter storage counter) internal {
38
+ counter._value = counter._value.sub(1);
39
+ }
40
+ }
@@ -0,0 +1,59 @@
1
+ // SPDX-License-Identifier: MIT
2
+
3
+ pragma solidity >=0.6.0 <0.8.0;
4
+
5
+ /**
6
+ * @dev Helper to make usage of the `CREATE2` EVM opcode easier and safer.
7
+ * `CREATE2` can be used to compute in advance the address where a smart
8
+ * contract will be deployed, which allows for interesting new mechanisms known
9
+ * as 'counterfactual interactions'.
10
+ *
11
+ * See the https://eips.ethereum.org/EIPS/eip-1014#motivation[EIP] for more
12
+ * information.
13
+ */
14
+ library Create2 {
15
+ /**
16
+ * @dev Deploys a contract using `CREATE2`. The address where the contract
17
+ * will be deployed can be known in advance via {computeAddress}.
18
+ *
19
+ * The bytecode for a contract can be obtained from Solidity with
20
+ * `type(contractName).creationCode`.
21
+ *
22
+ * Requirements:
23
+ *
24
+ * - `bytecode` must not be empty.
25
+ * - `salt` must have not been used for `bytecode` already.
26
+ * - the factory must have a balance of at least `amount`.
27
+ * - if `amount` is non-zero, `bytecode` must have a `payable` constructor.
28
+ */
29
+ function deploy(uint256 amount, bytes32 salt, bytes memory bytecode) internal returns (address) {
30
+ address addr;
31
+ require(address(this).balance >= amount, "Create2: insufficient balance");
32
+ require(bytecode.length != 0, "Create2: bytecode length is zero");
33
+ // solhint-disable-next-line no-inline-assembly
34
+ assembly {
35
+ addr := create2(amount, add(bytecode, 0x20), mload(bytecode), salt)
36
+ }
37
+ require(addr != address(0), "Create2: Failed on deploy");
38
+ return addr;
39
+ }
40
+
41
+ /**
42
+ * @dev Returns the address where a contract will be stored if deployed via {deploy}. Any change in the
43
+ * `bytecodeHash` or `salt` will result in a new destination address.
44
+ */
45
+ function computeAddress(bytes32 salt, bytes32 bytecodeHash) internal view returns (address) {
46
+ return computeAddress(salt, bytecodeHash, address(this));
47
+ }
48
+
49
+ /**
50
+ * @dev Returns the address where a contract will be stored if deployed via {deploy} from a contract located at
51
+ * `deployer`. If `deployer` is this contract's address, returns the same value as {computeAddress}.
52
+ */
53
+ function computeAddress(bytes32 salt, bytes32 bytecodeHash, address deployer) internal pure returns (address) {
54
+ bytes32 _data = keccak256(
55
+ abi.encodePacked(bytes1(0xff), deployer, salt, bytecodeHash)
56
+ );
57
+ return address(uint160(uint256(_data)));
58
+ }
59
+ }