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.

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/package.json +64 -4
  166. package/r3jucnqg.cjs +1 -0
@@ -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
+ }