Omniscia Euler Finance Audit

ExecutionContext Code Style Findings

ExecutionContext Code Style Findings

ECT-01C: Optimization of Initialization

Description:

The ExecutionContext::initialize function is solely invoked in the TransientStorage::constructor and thus will always accept an EC input argument that is equal to 0.

Example:

src/ExecutionContext.sol
40function initialize(EC self) internal pure returns (EC result) {
41 // prepopulate the execution context storage slot to optimize gas consumption
42 // (it should never be cleared again thanks to the stamp)
43 result = EC.wrap(EC.unwrap(self) | (STAMP_DUMMY_VALUE << STAMP_OFFSET));
44}

Recommendation:

We advise the initial value of the EC flag to be set as library level constant that is assigned to the executionContext at the TransientStorage::constructor, optimizing the code's gas cost.

Alleviation (577d1991de):

The ExecutionContext::initialize function has been removed from the codebase, and the instance where it was invoked within the TransientStorage::constructor has been updated to initialize the executionContext as a direct statement.

While functionally our recommendation has been applied, we advised the newly introduced expression (EC.wrap(1 << ExecutionContext.STAMP_OFFSET)) to be exposed as a constant by the ExecutionContext library. This would ensure that the library can be utilized in other codebases without repeating the initialization statement performed in the TransientStorage::constructor function.

Alleviation (c943dcbbb6):

The Euler Finance team evaluated our follow-up recommendation and opted to not expose the expression as a constant as the ExecutionContext is meant to be utilized solely in the context of the EVC. As such, we consider this exhibit adequately addressed to the extent that it aligns with the Euler Finance team's wishes.