Omniscia Keyko Audit
IPCTDelegator Code Style Findings
IPCTDelegator Code Style Findings
IPD-01C: Inefficient Event Storage Read
| Type | Severity | Location |
|---|---|---|
| Gas Optimization | Informational | IPCTDelegator.sol:L51, L53 |
Description:
The linked event emits the values of variables in storage that were written to by the function itself with in-memory values.
Example:
39/**40 * @notice Called by the admin to update the implementation of the delegator41 * @param implementation_ The address of the new implementation for delegation42 */43function _setImplementation(address implementation_) public {44 require(msg.sender == admin, "IPCTDelegator::_setImplementation: admin only");45 require(46 implementation_ != address(0),47 "IPCTDelegator::_setImplementation: invalid implementation address"48 );49
50 address oldImplementation = implementation;51 implementation = implementation_;52
53 emit NewImplementation(oldImplementation, implementation);54}Recommendation:
We advise the in-memory values from the function arguments to be utilized directly significantly reducing the gas cost of those functions.
Alleviation:
The code is no longer part of the codebase rendering this exhibit irrelevant.
IPD-02C: Redundant Low Level Implementation
| Type | Severity | Location |
|---|---|---|
| Code Style | Informational | IPCTDelegator.sol:L76-L92 |
Description:
The fallback function of IPCTDelegator is a mixture of a low-level assembly block and high level delegatecall instruction which is ill-advised.
Example:
71/**72 * @dev Delegates execution to an implementation contract.73 * It returns to the external caller whatever the implementation returns74 * or forwards reverts.75 */76fallback() external {77 // delegate all other functions to current implementation78 (bool success, ) = implementation.delegatecall(msg.data);79
80 assembly {81 let free_mem_ptr := mload(0x40)82 returndatacopy(free_mem_ptr, 0, returndatasize())83
84 switch success85 case 0 {86 revert(free_mem_ptr, returndatasize())87 }88 default {89 return(free_mem_ptr, returndatasize())90 }91 }92}Recommendation:
We advise the full code block to either be in its low-level assembly format or its high-level format whereby the second returned variable of delegatecall is properly used and decoded as necessary. Examples for both implementations can be observed in the proxy patterns and opportunistical calling patterns of OpenZeppelin in its Proxy style and SafeERC20 implementations respectively. The code may misbehave in future compiler implementations as the unused returned argument from delegatecall may clear the returndata stack in the future.
Alleviation:
The code is no longer part of the codebase rendering this exhibit irrelevant.