Omniscia Teahouse Finance Audit

UniswapV3PathRecommender Code Style Findings

UniswapV3PathRecommender Code Style Findings

UVP-01C: Generic Typographic Mistake

Description:

The referenced line contains a typographical mistake (i.e. private variable without an underscore prefix) or generic documentational error (i.e. copy-paste) that should be corrected.

Example:

contracts/UniswapV3PathRecommender.sol
15mapping(address => mapping(address => bytes[2])) private swapPath;

Recommendation:

We advise this to be done so to enhance the legibility of the codebase.

Alleviation (302b96f324a88038a0872015466cd43783c14543):

The underscore prefix has been properly introduced to the swapPath contract-level variable, addressing this exhibit.

UVP-02C: Ineffectual Usage of Safe Arithmetics

Description:

The linked mathematical operation is guaranteed to be performed safely by surrounding conditionals evaluated in either require checks or if-else constructs.

Example:

contracts/UniswapV3PathRecommender.sol
38for (uint256 i; i < feesLength; i = i + 1) {
39 pathExactInput = bytes.concat(pathExactInput, abi.encodePacked(_fees[i], _tokens[i + 1]));
40 pathExactOutput = bytes.concat(pathExactOutput, abi.encodePacked(_fees[feesLength - i - 1], _tokens[feesLength - i - 1]));
41}

Recommendation:

Given that safe arithmetics are toggled on by default in pragma versions of 0.8.X, we advise the linked statement to be wrapped in an unchecked code block thereby optimizing its execution cost.

Alleviation (302b96f324a88038a0872015466cd43783c14543):

The referenced arithmetic operations have been wrapped in an unchecked code block, optimizing the code's gas cost.

UVP-03C: Inefficient Emissions of Contextual Variable

Description:

The SwapPathSet and SwapPathDeleted events will emit the current block.timestamp redundantly as it is already attached to the transaction that each event is emitted in.

Example:

contracts/UniswapV3PathRecommender.sol
44emit SwapPathSet(block.timestamp, srcToken, dstToken, pathExactInput, pathExactOutput);

Recommendation:

We advise such contextual information to not be emitted as part of the event, optimizing their gas cost while minimizing their data redundancy.

Alleviation (302b96f324a88038a0872015466cd43783c14543):

The block.timestamp variable has been removed from the SwapPathSet and SwapPathDeleted events, optimizing their emission gas cost.

UVP-04C: Loop Iterator Optimization

Description:

The linked for loop increments / decrements the iterator "safely" due to Solidity's built-in safe arithmetics (post-0.8.X).

Example:

contracts/UniswapV3PathRecommender.sol
38for (uint256 i; i < feesLength; i = i + 1) {

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 (302b96f324a88038a0872015466cd43783c14543):

The for loop itself has been wrapped in an unchecked code block as part of the UVP-02C remediations, addressing this exhibit.

UVP-05C: Potential Usability Enhancement

Description:

The UniswapV3PathRecommender::getRecommendedPath function will utilize an _isExactInput boolean input and convert it to either a 0 or 1 index depending on whether it is true or false respectively.

Example:

contracts/UniswapV3PathRecommender.sol
47function getRecommendedPath(bool _isExactInput, address _srcToken, address _dstToken) external view returns (bytes memory path) {
48 return _isExactInput ? swapPath[_srcToken][_dstToken][0] : swapPath[_srcToken][_dstToken][1];
49}

Recommendation:

We advise an enum to be utilized instead, optimizing the function's gas cost as well as style.

Alleviation (302b96f324):

An enum is now utilized, however, it is not defined as an input argument to the UniswapV3PathRecommender::getRecommendedPath function. We advise this to be performed, rendering the ternary operator redundant.

Alleviation (1dc136da87):

The code was instead updated to utilize bool values as the key to the _swapPath mapping, permitting the input bool values of the referenced functions to be utilized directly and thus addressing this exhibit as the code is now optimal.

UVP-06C: Redundant Recalculation of Value

Description:

The feesLength - 1 calculation is carried out twice on each iteration of the for loop inefficiently.

Example:

contracts/UniswapV3PathRecommender.sol
38for (uint256 i; i < feesLength; i = i + 1) {
39 pathExactInput = bytes.concat(pathExactInput, abi.encodePacked(_fees[i], _tokens[i + 1]));
40 pathExactOutput = bytes.concat(pathExactOutput, abi.encodePacked(_fees[feesLength - i - 1], _tokens[feesLength - i - 1]));
41}

Recommendation:

We advise it to be cached to a local variable outside the for loop, significantly optimizing each for loop's execution.

Alleviation (302b96f324a88038a0872015466cd43783c14543):

The feesLength - 1 calculation is now cached outside the for loop to a feeLengthMinus1 variable, optimizing the code's gas cost.