Assessment reports>Perennial>Discussion>Unnecessary storage assignments in `MappingStorageLib` waste gas

Unnecessary storage assignments in MappingStorageLib waste gas

In MappingStorageLib, the store function stores a memory representation of a Mapping into storage. It stores the length of the mapping repeatedly into each of the storedEntries.

function store(MappingStorage storage self, Mapping memory newValue) internal {
    if (self.value.entries[0]._length > 0) revert MappingStorageInvalidError();

    StoredMappingEntry[] memory storedEntries = new StoredMappingEntry[](Math.ceilDiv(newValue._ids.length, 7));

    for (uint256 i; i < newValue._ids.length; i++) {
        if (newValue._ids[i] > uint256(type(uint32).max)) revert MappingStorageInvalidError();

        storedEntries[i / 7]._length = uint32(newValue._ids.length);
        storedEntries[i / 7]._ids[i % 7] = uint32(newValue._ids[i]);
    }

    for (uint256 i; i < storedEntries.length; i++) {
        self.value.entries[i] = storedEntries[i];
    }
}

On the other hand, the read function only reads storedEntries[0]._length to find the length of the Mapping. Instead of writing _length many times and in a new location per seven values, it only needs to be written into one location. Consider refactoring so that _length is a property of StoredMapping instead of StoredMappingEntry.

Zellic © 2023Back to top ↑