Omniscia Gnosis Guild Audit
PermissionChecker Code Style Findings
PermissionChecker Code Style Findings
PCR-01C: Inefficient Iteration of Child Conditions
| Type | Severity | Location |
|---|---|---|
| Gas Optimization | ![]() | PermissionChecker.sol:L423-L426, L431 |
Description:
The PermissionChecker::_xor function will inefficiently loop through all remaining child conditions if more than one validate as Status.Ok.
Example:
406function _xor(407 uint256 value,408 bytes calldata data,409 Condition memory condition,410 ParameterPayload memory payload,411 Consumption[] memory consumptions412) private pure returns (Status, Result memory result) {413 uint256 okCount;414 unchecked {415 for (uint256 i; i < condition.children.length; ++i) {416 (Status status, Result memory _result) = _walk(417 value,418 data,419 condition.children[i],420 payload,421 consumptions422 );423 if (status == Status.Ok) {424 result = _result;425 okCount = okCount + 1;426 }427 }428 }429
430 return431 okCount == 1432 ? (Status.Ok, result)433 : (434 Status.XorViolation,435 Result({consumptions: consumptions, info: 0})436 );437}Recommendation:
We advise the code to instead break when a second Status.Ok is identified within the referenced if clause.
Alleviation:
The code of the PermissionChecker::_xor function has been omitted as a result of finding PCR-01M. As such, we consider this exhibit no longer applicable.
PCR-02C: Optimization of Data Extraction
| Type | Severity | Location |
|---|---|---|
| Gas Optimization | ![]() | PermissionChecker.sol:L597-L602 |
Description:
The PermissionChecker::_bitmask function will inefficiently extract a single word from the data payload by using the Decoder::pluck function instead of the Decoder::word counterpart.
Example:
597bool isInline = condition.paramType == ParameterType.Static;598bytes calldata value = Decoder.pluck(599 data,600 payload.location + (isInline ? 0 : 32),601 payload.size - (isInline ? 0 : 32)602);Recommendation:
We advise the code to be optimized akin to PermissionChecker::_compare, performing a Decoder::word operation when the parameter is in-line (Static) and a Decoder::pluck operation when it is dynamic (Dynamic).
Alleviation:
The Gnosis Guild team evaluated this exhibit but opted to retain the current behaviour of the codebase for the sake of code clarity and evident behaviour.
