Omniscia Native Audit
Multicall Code Style Findings
Multicall Code Style Findings
MLL-01C: Loop Iterator Optimization
Type | Severity | Location |
---|---|---|
Gas Optimization | Multicall.sol:L15 |
Description:
The linked for
loop increments / decrements the iterator "safely" due to Solidity's built-in safe arithmetics(post - 0.8.X
).
Example:
15for (uint256 i = 0; i < data.length; i++) {
Recommendation:
We advise the increment / decrement operation to be performed in an unchecked
code block as the last statement within the for
loop to optimize its execution cost.
Alleviation:
The loop iterator is now optimally incremented in an unchecked
code block as advised.
MLL-02C: Re-Order of Input Arguments
Type | Severity | Location |
---|---|---|
Code Style | Multicall.sol:L32, L43 |
Description:
The multicall
function overloads present in the Multicall
contract should honour the original positional arguments of the "base" multicall
function they invoke.
Example:
12/// @inheritdoc IMulticall13function multicall(bytes[] calldata data) public payable override returns (bytes[] memory results) {14 results = new bytes[](data.length);15 for (uint256 i = 0; i < data.length; i++) {16 (bool success, bytes memory result) = address(this).delegatecall(data[i]);17
18 if (!success) {19 // Next 5 lines from https://ethereum.stackexchange.com/a/8357720 if (result.length < 68) revert();21 assembly {22 result := add(result, 0x04)23 }24 revert(abi.decode(result, (string)));25 }26
27 results[i] = result;28 }29}30
31/// @inheritdoc IMulticall32function multicall(uint256 deadline, bytes[] calldata data)33 external34 payable35 override36 checkDeadline(deadline)37 returns (bytes[] memory)38{39 return multicall(data);40}41
42/// @inheritdoc IMulticall43function multicall(bytes32 previousBlockhash, bytes[] calldata data)
Recommendation:
We advise the overloaded functions to have their input arguments swapped to ensure that all multicall
implementations begin with the bytes[] calldata data
argument.
Alleviation:
The Native team evaluated this exhibit but opted not to apply a remediation for it as they consider it inconsequential.