Omniscia 0xPhase Audit
SystemClockV1 Code Style Findings
SystemClockV1 Code Style Findings
SCV-01C: Inefficient Variable Usage
| Type | Severity | Location |
|---|---|---|
| Gas Optimization | ![]() | SystemClockV1.sol:L16 |
Description:
The referenced return statement will read the lastTime value from storage, however, the result of SystemClockV1::getTime (curTime) is guaranteed to be what lastTime will represent at the statement's evaluation.
Example:
8/// @inheritdoc ISystemClock9function time() external override returns (uint256) {10 uint256 curTime = getTime();11
12 if (curTime > lastTime) {13 lastTime = curTime;14 }15
16 return lastTime;17}18
19/// @inheritdoc ISystemClock20function getTime() public view override returns (uint256) {21 return MathLib.max(block.timestamp, lastTime);22}Recommendation:
We advise the curTime value to be utilized instead, optimizing the code's gas cost.
Alleviation (3dd3d7bf0c2693b2f9c23bacedfa420393f7ea84):
The code was refactored to compare the lastTime variable as well as the current block.timestamp, minimizing redundant storage reads and thus optimizing the codebase.
SCV-02C: Potentially Redundant Evaluation of Time
| Type | Severity | Location |
|---|---|---|
| Gas Optimization | ![]() | SystemClockV1.sol:L20-L22 |
Description:
The SystemClockV1::getTime function will yield the maximum between block.timestamp and lastTime, however, the lastTime value which is solely assigned in SystemClockV1::time will always point to the highest SystemClockV1::getTime evaluation. As such, SystemClockV1::getTime will always logically evaluate to block.timestamp.
Example:
8/// @inheritdoc ISystemClock9function time() external override returns (uint256) {10 uint256 curTime = getTime();11
12 if (curTime > lastTime) {13 lastTime = curTime;14 }15
16 return lastTime;17}18
19/// @inheritdoc ISystemClock20function getTime() public view override returns (uint256) {21 return MathLib.max(block.timestamp, lastTime);22}Recommendation:
We advise the MathLib import and maximum operator to be omitted from the code as it is ineffectual.
Alleviation (3dd3d7bf0c2693b2f9c23bacedfa420393f7ea84):
The code of SystemClockV1::time was updated to compare the lastTime variable with the current block.timestamp, minimizing redundant evaluations. Additionally, the 0xPhase team stated that per the zkSync Era developer team a more reliable way to query time will be introduced at a later point in the blockchain's lifetime meaning that projects should be upgradeable in the way they query time.
As such, we consider this exhibit alleviated in full as the SystemClockV1::getTime function should remain in the codebase and the SystemClockV1::time function was optimized.
