Omniscia Kinza Finance Audit
ProtectedERC20 Code Style Findings
ProtectedERC20 Code Style Findings
PER-01C: Inefficient Override of Decimals
Type | Severity | Location |
---|---|---|
Gas Optimization | ProtectedERC20.sol:L18-L22 |
Description:
The ProtectedERC20::decimals
function will override
the ERC20Wrapper
implementation as the Kinza Finance team wishes to revert if the underlying
token has no IERC20Metadata::decimals
member exposed, however, this is done inefficiently.
Example:
18function decimals() public view virtual override(ERC20, ERC20Wrapper) returns (uint8) {19 // ERC20Wrapper would use try catch to return decimal 18 if the external read fails20 // this would rather fail and revert if the underlying decimal read does not return21 return IERC20Metadata(address(underlying())).decimals();22}
Recommendation:
We advise an immutable
variable to be introduced to the ProtectedERC20
of the uint8
type that is assigned to during the ProtectedERC20::constructor
with the value of IERC20Metadata::decimals
on the underlying
argument.
The same variable can then be utilized by ProtectedERC20::decimals
, greatly decreasing its gas cost. Additionally, the deployment of ProtectedERC20
would fail if the underlying
address does not support the IERC20Metadata::decimals
value which is the desire of the Kinza Finance team.
Alleviation:
An immutable
variable was introduced to the ProtectedERC20
token that is assigned to during the contract's ProtectedERC20::constructor
to the value of the IERC20Metadata::decimals
function of the underlying
token.
As such, the optimization we proposed has been applied properly.