Omniscia Moby Audit
EnumerableSet Code Style Findings
EnumerableSet Code Style Findings
EST-01C: Potentially Inefficient Shift Operation
| Type | Severity | Location |
|---|---|---|
| Gas Optimization | ![]() | EnumerableSet.sol:L228-L229 |
Description:
The EnumerableSet::_remove function will unconditionally switch the last element of the array with the element being removed even if the element being removed is the last one in the array.
Example:
contracts/tokens/erc1155/libraries/EnumerableSet.sol
216function _remove(217 Set storage set,218 bytes32 value219) private returns (bool status) {220 uint256 valueIndex = set._indexes[value];221
222 if (valueIndex != 0) {223 unchecked {224 bytes32 last = set._values[set._values.length - 1];225
226 // move last value to now-vacant index227
228 set._values[valueIndex - 1] = last;229 set._indexes[last] = valueIndex;230 }231 // clear last index232
233 set._values.pop();234 delete set._indexes[value];235
236 status = true;237 }238}Recommendation:
We advise the code to perform the set._values and set._indexes assignments solely when the valueIndex - 1 value is different from the set._values.length - 1 value, optimizing the code's gas cost.
Alleviation (b02fae335f62cc1f5f4236fb4d982ad16a32bd26):
The code has been optimized per our recommendation, updating the value and index data points solely when the item being removed is not the last element in the set.
