Omniscia Moby Audit

SettlePriceFeed Code Style Findings

SettlePriceFeed Code Style Findings

SPD-01C: 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/oracles/SettlePriceFeed.sol
25for (uint256 i = 0; i < _tokens.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 (a8720219a6a97e10b8d9c6a70c6345747f0fdcb3):

The referenced loop iterator's increment statement has been relocated at the end of the for loop's body and has been unwrapped in an unchecked code block, optimizing its gas cost.

SPD-02C: Potentially Inefficient Storage Relation

Description:

The settlePrices mapping is used as a token to timestamp to settle price relation, however, the SettlePriceFeed::feedSettlePrices function will utilize it as a one-to-many relation of a timestamp-to-tokens.

Example:

contracts/oracles/SettlePriceFeed.sol
24function feedSettlePrices(address[] memory _tokens, uint256[] memory _settlePrices, uint256 _expiry) external override onlyKeeper {
25 for (uint256 i = 0; i < _tokens.length; i++) {
26 // @TODO: get rid of expiry requirement for test
27 // require(_expiry < block.timestamp, "SettlePriceFeed: EXPIRY_NOT_PASSED");
28 require(_settlePrices[i] > 0, "SettlePriceFeed: INVALID_PRICE");
29 settlePrices[_tokens[i]][_expiry] = _settlePrices[i];
30
31 emit FeedSettlePrice(_tokens[i], _settlePrices[i], _expiry, msg.sender);
32 }
33}

Recommendation:

We advise the mapping relation to be adjusted to a timestamp to token to settle price relation, permitting the SettlePriceFeed::feedSettlePrices function to cache the settlePrices[_expiry] lookup and utilize it for each token in a significantly efficient manner.

Alleviation (a8720219a6a97e10b8d9c6a70c6345747f0fdcb3):

The Moby team stated that it is difficult to restructure the data type, however, our recommendation is to swap the key order which should not affect how the code currently operates on the mapping.