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,266 @@
1
+ // SPDX-License-Identifier: MIT
2
+
3
+ pragma solidity >=0.6.0 <0.8.0;
4
+
5
+ /**
6
+ * @dev Library for managing an enumerable variant of Solidity's
7
+ * https://solidity.readthedocs.io/en/latest/types.html#mapping-types[`mapping`]
8
+ * type.
9
+ *
10
+ * Maps have the following properties:
11
+ *
12
+ * - Entries are added, removed, and checked for existence in constant time
13
+ * (O(1)).
14
+ * - Entries are enumerated in O(n). No guarantees are made on the ordering.
15
+ *
16
+ * ```
17
+ * contract Example {
18
+ * // Add the library methods
19
+ * using EnumerableMap for EnumerableMap.UintToAddressMap;
20
+ *
21
+ * // Declare a set state variable
22
+ * EnumerableMap.UintToAddressMap private myMap;
23
+ * }
24
+ * ```
25
+ *
26
+ * As of v3.0.0, only maps of type `uint256 -> address` (`UintToAddressMap`) are
27
+ * supported.
28
+ */
29
+ library EnumerableMap {
30
+ // To implement this library for multiple types with as little code
31
+ // repetition as possible, we write it in terms of a generic Map type with
32
+ // bytes32 keys and values.
33
+ // The Map implementation uses private functions, and user-facing
34
+ // implementations (such as Uint256ToAddressMap) are just wrappers around
35
+ // the underlying Map.
36
+ // This means that we can only create new EnumerableMaps for types that fit
37
+ // in bytes32.
38
+
39
+ struct MapEntry {
40
+ bytes32 _key;
41
+ bytes32 _value;
42
+ }
43
+
44
+ struct Map {
45
+ // Storage of map keys and values
46
+ MapEntry[] _entries;
47
+
48
+ // Position of the entry defined by a key in the `entries` array, plus 1
49
+ // because index 0 means a key is not in the map.
50
+ mapping (bytes32 => uint256) _indexes;
51
+ }
52
+
53
+ /**
54
+ * @dev Adds a key-value pair to a map, or updates the value for an existing
55
+ * key. O(1).
56
+ *
57
+ * Returns true if the key was added to the map, that is if it was not
58
+ * already present.
59
+ */
60
+ function _set(Map storage map, bytes32 key, bytes32 value) private returns (bool) {
61
+ // We read and store the key's index to prevent multiple reads from the same storage slot
62
+ uint256 keyIndex = map._indexes[key];
63
+
64
+ if (keyIndex == 0) { // Equivalent to !contains(map, key)
65
+ map._entries.push(MapEntry({ _key: key, _value: value }));
66
+ // The entry is stored at length-1, but we add 1 to all indexes
67
+ // and use 0 as a sentinel value
68
+ map._indexes[key] = map._entries.length;
69
+ return true;
70
+ } else {
71
+ map._entries[keyIndex - 1]._value = value;
72
+ return false;
73
+ }
74
+ }
75
+
76
+ /**
77
+ * @dev Removes a key-value pair from a map. O(1).
78
+ *
79
+ * Returns true if the key was removed from the map, that is if it was present.
80
+ */
81
+ function _remove(Map storage map, bytes32 key) private returns (bool) {
82
+ // We read and store the key's index to prevent multiple reads from the same storage slot
83
+ uint256 keyIndex = map._indexes[key];
84
+
85
+ if (keyIndex != 0) { // Equivalent to contains(map, key)
86
+ // To delete a key-value pair from the _entries array in O(1), we swap the entry to delete with the last one
87
+ // in the array, and then remove the last entry (sometimes called as 'swap and pop').
88
+ // This modifies the order of the array, as noted in {at}.
89
+
90
+ uint256 toDeleteIndex = keyIndex - 1;
91
+ uint256 lastIndex = map._entries.length - 1;
92
+
93
+ // When the entry to delete is the last one, the swap operation is unnecessary. However, since this occurs
94
+ // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.
95
+
96
+ MapEntry storage lastEntry = map._entries[lastIndex];
97
+
98
+ // Move the last entry to the index where the entry to delete is
99
+ map._entries[toDeleteIndex] = lastEntry;
100
+ // Update the index for the moved entry
101
+ map._indexes[lastEntry._key] = toDeleteIndex + 1; // All indexes are 1-based
102
+
103
+ // Delete the slot where the moved entry was stored
104
+ map._entries.pop();
105
+
106
+ // Delete the index for the deleted slot
107
+ delete map._indexes[key];
108
+
109
+ return true;
110
+ } else {
111
+ return false;
112
+ }
113
+ }
114
+
115
+ /**
116
+ * @dev Returns true if the key is in the map. O(1).
117
+ */
118
+ function _contains(Map storage map, bytes32 key) private view returns (bool) {
119
+ return map._indexes[key] != 0;
120
+ }
121
+
122
+ /**
123
+ * @dev Returns the number of key-value pairs in the map. O(1).
124
+ */
125
+ function _length(Map storage map) private view returns (uint256) {
126
+ return map._entries.length;
127
+ }
128
+
129
+ /**
130
+ * @dev Returns the key-value pair stored at position `index` in the map. O(1).
131
+ *
132
+ * Note that there are no guarantees on the ordering of entries inside the
133
+ * array, and it may change when more entries are added or removed.
134
+ *
135
+ * Requirements:
136
+ *
137
+ * - `index` must be strictly less than {length}.
138
+ */
139
+ function _at(Map storage map, uint256 index) private view returns (bytes32, bytes32) {
140
+ require(map._entries.length > index, "EnumerableMap: index out of bounds");
141
+
142
+ MapEntry storage entry = map._entries[index];
143
+ return (entry._key, entry._value);
144
+ }
145
+
146
+ /**
147
+ * @dev Tries to returns the value associated with `key`. O(1).
148
+ * Does not revert if `key` is not in the map.
149
+ */
150
+ function _tryGet(Map storage map, bytes32 key) private view returns (bool, bytes32) {
151
+ uint256 keyIndex = map._indexes[key];
152
+ if (keyIndex == 0) return (false, 0); // Equivalent to contains(map, key)
153
+ return (true, map._entries[keyIndex - 1]._value); // All indexes are 1-based
154
+ }
155
+
156
+ /**
157
+ * @dev Returns the value associated with `key`. O(1).
158
+ *
159
+ * Requirements:
160
+ *
161
+ * - `key` must be in the map.
162
+ */
163
+ function _get(Map storage map, bytes32 key) private view returns (bytes32) {
164
+ uint256 keyIndex = map._indexes[key];
165
+ require(keyIndex != 0, "EnumerableMap: nonexistent key"); // Equivalent to contains(map, key)
166
+ return map._entries[keyIndex - 1]._value; // All indexes are 1-based
167
+ }
168
+
169
+ /**
170
+ * @dev Same as {_get}, with a custom error message when `key` is not in the map.
171
+ *
172
+ * CAUTION: This function is deprecated because it requires allocating memory for the error
173
+ * message unnecessarily. For custom revert reasons use {_tryGet}.
174
+ */
175
+ function _get(Map storage map, bytes32 key, string memory errorMessage) private view returns (bytes32) {
176
+ uint256 keyIndex = map._indexes[key];
177
+ require(keyIndex != 0, errorMessage); // Equivalent to contains(map, key)
178
+ return map._entries[keyIndex - 1]._value; // All indexes are 1-based
179
+ }
180
+
181
+ // UintToAddressMap
182
+
183
+ struct UintToAddressMap {
184
+ Map _inner;
185
+ }
186
+
187
+ /**
188
+ * @dev Adds a key-value pair to a map, or updates the value for an existing
189
+ * key. O(1).
190
+ *
191
+ * Returns true if the key was added to the map, that is if it was not
192
+ * already present.
193
+ */
194
+ function set(UintToAddressMap storage map, uint256 key, address value) internal returns (bool) {
195
+ return _set(map._inner, bytes32(key), bytes32(uint256(uint160(value))));
196
+ }
197
+
198
+ /**
199
+ * @dev Removes a value from a set. O(1).
200
+ *
201
+ * Returns true if the key was removed from the map, that is if it was present.
202
+ */
203
+ function remove(UintToAddressMap storage map, uint256 key) internal returns (bool) {
204
+ return _remove(map._inner, bytes32(key));
205
+ }
206
+
207
+ /**
208
+ * @dev Returns true if the key is in the map. O(1).
209
+ */
210
+ function contains(UintToAddressMap storage map, uint256 key) internal view returns (bool) {
211
+ return _contains(map._inner, bytes32(key));
212
+ }
213
+
214
+ /**
215
+ * @dev Returns the number of elements in the map. O(1).
216
+ */
217
+ function length(UintToAddressMap storage map) internal view returns (uint256) {
218
+ return _length(map._inner);
219
+ }
220
+
221
+ /**
222
+ * @dev Returns the element stored at position `index` in the set. O(1).
223
+ * Note that there are no guarantees on the ordering of values inside the
224
+ * array, and it may change when more values are added or removed.
225
+ *
226
+ * Requirements:
227
+ *
228
+ * - `index` must be strictly less than {length}.
229
+ */
230
+ function at(UintToAddressMap storage map, uint256 index) internal view returns (uint256, address) {
231
+ (bytes32 key, bytes32 value) = _at(map._inner, index);
232
+ return (uint256(key), address(uint160(uint256(value))));
233
+ }
234
+
235
+ /**
236
+ * @dev Tries to returns the value associated with `key`. O(1).
237
+ * Does not revert if `key` is not in the map.
238
+ *
239
+ * _Available since v3.4._
240
+ */
241
+ function tryGet(UintToAddressMap storage map, uint256 key) internal view returns (bool, address) {
242
+ (bool success, bytes32 value) = _tryGet(map._inner, bytes32(key));
243
+ return (success, address(uint160(uint256(value))));
244
+ }
245
+
246
+ /**
247
+ * @dev Returns the value associated with `key`. O(1).
248
+ *
249
+ * Requirements:
250
+ *
251
+ * - `key` must be in the map.
252
+ */
253
+ function get(UintToAddressMap storage map, uint256 key) internal view returns (address) {
254
+ return address(uint160(uint256(_get(map._inner, bytes32(key)))));
255
+ }
256
+
257
+ /**
258
+ * @dev Same as {get}, with a custom error message when `key` is not in the map.
259
+ *
260
+ * CAUTION: This function is deprecated because it requires allocating memory for the error
261
+ * message unnecessarily. For custom revert reasons use {tryGet}.
262
+ */
263
+ function get(UintToAddressMap storage map, uint256 key, string memory errorMessage) internal view returns (address) {
264
+ return address(uint160(uint256(_get(map._inner, bytes32(key), errorMessage))));
265
+ }
266
+ }
@@ -0,0 +1,297 @@
1
+ // SPDX-License-Identifier: MIT
2
+
3
+ pragma solidity >=0.6.0 <0.8.0;
4
+
5
+ /**
6
+ * @dev Library for managing
7
+ * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
8
+ * types.
9
+ *
10
+ * Sets have the following properties:
11
+ *
12
+ * - Elements are added, removed, and checked for existence in constant time
13
+ * (O(1)).
14
+ * - Elements are enumerated in O(n). No guarantees are made on the ordering.
15
+ *
16
+ * ```
17
+ * contract Example {
18
+ * // Add the library methods
19
+ * using EnumerableSet for EnumerableSet.AddressSet;
20
+ *
21
+ * // Declare a set state variable
22
+ * EnumerableSet.AddressSet private mySet;
23
+ * }
24
+ * ```
25
+ *
26
+ * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
27
+ * and `uint256` (`UintSet`) are supported.
28
+ */
29
+ library EnumerableSet {
30
+ // To implement this library for multiple types with as little code
31
+ // repetition as possible, we write it in terms of a generic Set type with
32
+ // bytes32 values.
33
+ // The Set implementation uses private functions, and user-facing
34
+ // implementations (such as AddressSet) are just wrappers around the
35
+ // underlying Set.
36
+ // This means that we can only create new EnumerableSets for types that fit
37
+ // in bytes32.
38
+
39
+ struct Set {
40
+ // Storage of set values
41
+ bytes32[] _values;
42
+
43
+ // Position of the value in the `values` array, plus 1 because index 0
44
+ // means a value is not in the set.
45
+ mapping (bytes32 => uint256) _indexes;
46
+ }
47
+
48
+ /**
49
+ * @dev Add a value to a set. O(1).
50
+ *
51
+ * Returns true if the value was added to the set, that is if it was not
52
+ * already present.
53
+ */
54
+ function _add(Set storage set, bytes32 value) private returns (bool) {
55
+ if (!_contains(set, value)) {
56
+ set._values.push(value);
57
+ // The value is stored at length-1, but we add 1 to all indexes
58
+ // and use 0 as a sentinel value
59
+ set._indexes[value] = set._values.length;
60
+ return true;
61
+ } else {
62
+ return false;
63
+ }
64
+ }
65
+
66
+ /**
67
+ * @dev Removes a value from a set. O(1).
68
+ *
69
+ * Returns true if the value was removed from the set, that is if it was
70
+ * present.
71
+ */
72
+ function _remove(Set storage set, bytes32 value) private returns (bool) {
73
+ // We read and store the value's index to prevent multiple reads from the same storage slot
74
+ uint256 valueIndex = set._indexes[value];
75
+
76
+ if (valueIndex != 0) { // Equivalent to contains(set, value)
77
+ // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
78
+ // the array, and then remove the last element (sometimes called as 'swap and pop').
79
+ // This modifies the order of the array, as noted in {at}.
80
+
81
+ uint256 toDeleteIndex = valueIndex - 1;
82
+ uint256 lastIndex = set._values.length - 1;
83
+
84
+ // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs
85
+ // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.
86
+
87
+ bytes32 lastvalue = set._values[lastIndex];
88
+
89
+ // Move the last value to the index where the value to delete is
90
+ set._values[toDeleteIndex] = lastvalue;
91
+ // Update the index for the moved value
92
+ set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based
93
+
94
+ // Delete the slot where the moved value was stored
95
+ set._values.pop();
96
+
97
+ // Delete the index for the deleted slot
98
+ delete set._indexes[value];
99
+
100
+ return true;
101
+ } else {
102
+ return false;
103
+ }
104
+ }
105
+
106
+ /**
107
+ * @dev Returns true if the value is in the set. O(1).
108
+ */
109
+ function _contains(Set storage set, bytes32 value) private view returns (bool) {
110
+ return set._indexes[value] != 0;
111
+ }
112
+
113
+ /**
114
+ * @dev Returns the number of values on the set. O(1).
115
+ */
116
+ function _length(Set storage set) private view returns (uint256) {
117
+ return set._values.length;
118
+ }
119
+
120
+ /**
121
+ * @dev Returns the value stored at position `index` in the set. O(1).
122
+ *
123
+ * Note that there are no guarantees on the ordering of values inside the
124
+ * array, and it may change when more values are added or removed.
125
+ *
126
+ * Requirements:
127
+ *
128
+ * - `index` must be strictly less than {length}.
129
+ */
130
+ function _at(Set storage set, uint256 index) private view returns (bytes32) {
131
+ require(set._values.length > index, "EnumerableSet: index out of bounds");
132
+ return set._values[index];
133
+ }
134
+
135
+ // Bytes32Set
136
+
137
+ struct Bytes32Set {
138
+ Set _inner;
139
+ }
140
+
141
+ /**
142
+ * @dev Add a value to a set. O(1).
143
+ *
144
+ * Returns true if the value was added to the set, that is if it was not
145
+ * already present.
146
+ */
147
+ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
148
+ return _add(set._inner, value);
149
+ }
150
+
151
+ /**
152
+ * @dev Removes a value from a set. O(1).
153
+ *
154
+ * Returns true if the value was removed from the set, that is if it was
155
+ * present.
156
+ */
157
+ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
158
+ return _remove(set._inner, value);
159
+ }
160
+
161
+ /**
162
+ * @dev Returns true if the value is in the set. O(1).
163
+ */
164
+ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
165
+ return _contains(set._inner, value);
166
+ }
167
+
168
+ /**
169
+ * @dev Returns the number of values in the set. O(1).
170
+ */
171
+ function length(Bytes32Set storage set) internal view returns (uint256) {
172
+ return _length(set._inner);
173
+ }
174
+
175
+ /**
176
+ * @dev Returns the value stored at position `index` in the set. O(1).
177
+ *
178
+ * Note that there are no guarantees on the ordering of values inside the
179
+ * array, and it may change when more values are added or removed.
180
+ *
181
+ * Requirements:
182
+ *
183
+ * - `index` must be strictly less than {length}.
184
+ */
185
+ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
186
+ return _at(set._inner, index);
187
+ }
188
+
189
+ // AddressSet
190
+
191
+ struct AddressSet {
192
+ Set _inner;
193
+ }
194
+
195
+ /**
196
+ * @dev Add a value to a set. O(1).
197
+ *
198
+ * Returns true if the value was added to the set, that is if it was not
199
+ * already present.
200
+ */
201
+ function add(AddressSet storage set, address value) internal returns (bool) {
202
+ return _add(set._inner, bytes32(uint256(uint160(value))));
203
+ }
204
+
205
+ /**
206
+ * @dev Removes a value from a set. O(1).
207
+ *
208
+ * Returns true if the value was removed from the set, that is if it was
209
+ * present.
210
+ */
211
+ function remove(AddressSet storage set, address value) internal returns (bool) {
212
+ return _remove(set._inner, bytes32(uint256(uint160(value))));
213
+ }
214
+
215
+ /**
216
+ * @dev Returns true if the value is in the set. O(1).
217
+ */
218
+ function contains(AddressSet storage set, address value) internal view returns (bool) {
219
+ return _contains(set._inner, bytes32(uint256(uint160(value))));
220
+ }
221
+
222
+ /**
223
+ * @dev Returns the number of values in the set. O(1).
224
+ */
225
+ function length(AddressSet storage set) internal view returns (uint256) {
226
+ return _length(set._inner);
227
+ }
228
+
229
+ /**
230
+ * @dev Returns the value stored at position `index` in the set. O(1).
231
+ *
232
+ * Note that there are no guarantees on the ordering of values inside the
233
+ * array, and it may change when more values are added or removed.
234
+ *
235
+ * Requirements:
236
+ *
237
+ * - `index` must be strictly less than {length}.
238
+ */
239
+ function at(AddressSet storage set, uint256 index) internal view returns (address) {
240
+ return address(uint160(uint256(_at(set._inner, index))));
241
+ }
242
+
243
+
244
+ // UintSet
245
+
246
+ struct UintSet {
247
+ Set _inner;
248
+ }
249
+
250
+ /**
251
+ * @dev Add a value to a set. O(1).
252
+ *
253
+ * Returns true if the value was added to the set, that is if it was not
254
+ * already present.
255
+ */
256
+ function add(UintSet storage set, uint256 value) internal returns (bool) {
257
+ return _add(set._inner, bytes32(value));
258
+ }
259
+
260
+ /**
261
+ * @dev Removes a value from a set. O(1).
262
+ *
263
+ * Returns true if the value was removed from the set, that is if it was
264
+ * present.
265
+ */
266
+ function remove(UintSet storage set, uint256 value) internal returns (bool) {
267
+ return _remove(set._inner, bytes32(value));
268
+ }
269
+
270
+ /**
271
+ * @dev Returns true if the value is in the set. O(1).
272
+ */
273
+ function contains(UintSet storage set, uint256 value) internal view returns (bool) {
274
+ return _contains(set._inner, bytes32(value));
275
+ }
276
+
277
+ /**
278
+ * @dev Returns the number of values on the set. O(1).
279
+ */
280
+ function length(UintSet storage set) internal view returns (uint256) {
281
+ return _length(set._inner);
282
+ }
283
+
284
+ /**
285
+ * @dev Returns the value stored at position `index` in the set. O(1).
286
+ *
287
+ * Note that there are no guarantees on the ordering of values inside the
288
+ * array, and it may change when more values are added or removed.
289
+ *
290
+ * Requirements:
291
+ *
292
+ * - `index` must be strictly less than {length}.
293
+ */
294
+ function at(UintSet storage set, uint256 index) internal view returns (uint256) {
295
+ return uint256(_at(set._inner, index));
296
+ }
297
+ }
@@ -0,0 +1,90 @@
1
+ // SPDX-License-Identifier: MIT
2
+
3
+ pragma solidity >=0.6.0 <0.8.0;
4
+
5
+ import "./Context.sol";
6
+
7
+ /**
8
+ * @dev Contract module which allows children to implement an emergency stop
9
+ * mechanism that can be triggered by an authorized account.
10
+ *
11
+ * This module is used through inheritance. It will make available the
12
+ * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
13
+ * the functions of your contract. Note that they will not be pausable by
14
+ * simply including this module, only once the modifiers are put in place.
15
+ */
16
+ abstract contract Pausable is Context {
17
+ /**
18
+ * @dev Emitted when the pause is triggered by `account`.
19
+ */
20
+ event Paused(address account);
21
+
22
+ /**
23
+ * @dev Emitted when the pause is lifted by `account`.
24
+ */
25
+ event Unpaused(address account);
26
+
27
+ bool private _paused;
28
+
29
+ /**
30
+ * @dev Initializes the contract in unpaused state.
31
+ */
32
+ constructor () internal {
33
+ _paused = false;
34
+ }
35
+
36
+ /**
37
+ * @dev Returns true if the contract is paused, and false otherwise.
38
+ */
39
+ function paused() public view virtual returns (bool) {
40
+ return _paused;
41
+ }
42
+
43
+ /**
44
+ * @dev Modifier to make a function callable only when the contract is not paused.
45
+ *
46
+ * Requirements:
47
+ *
48
+ * - The contract must not be paused.
49
+ */
50
+ modifier whenNotPaused() {
51
+ require(!paused(), "Pausable: paused");
52
+ _;
53
+ }
54
+
55
+ /**
56
+ * @dev Modifier to make a function callable only when the contract is paused.
57
+ *
58
+ * Requirements:
59
+ *
60
+ * - The contract must be paused.
61
+ */
62
+ modifier whenPaused() {
63
+ require(paused(), "Pausable: not paused");
64
+ _;
65
+ }
66
+
67
+ /**
68
+ * @dev Triggers stopped state.
69
+ *
70
+ * Requirements:
71
+ *
72
+ * - The contract must not be paused.
73
+ */
74
+ function _pause() internal virtual whenNotPaused {
75
+ _paused = true;
76
+ emit Paused(_msgSender());
77
+ }
78
+
79
+ /**
80
+ * @dev Returns to normal state.
81
+ *
82
+ * Requirements:
83
+ *
84
+ * - The contract must be paused.
85
+ */
86
+ function _unpause() internal virtual whenPaused {
87
+ _paused = false;
88
+ emit Unpaused(_msgSender());
89
+ }
90
+ }