Omniscia Alliance Block Audit
Router Static Analysis Findings
Router Static Analysis Findings
ROU-01S: Data Location Optimization
Type | Severity | Location |
---|---|---|
Gas Optimization | Informational | Router.sol:L73 |
Description:
The signatures
array of updateMember
is set as memory
whilst its function is set as external
.
Example:
73function updateMember(address account, bool status, bytes[] memory signatures)74 onlyValidSignatures(signatures.length)75 external override76{77 bytes32 ethHash = LibDiamond.computeMemberUpdateMessage(account, status);78 LibDiamond.validateSignatures(ethHash, signatures);79
80 if (status) {81 LibFeeCalculator.addNewMember(account);82 } else {83 LibRouter.Storage storage rs = LibRouter.routerStorage();84 uint256 claimableFees = LibFeeCalculator.claimReward(account);85 IERC20(rs.albtToken).transfer(account, claimableFees);86 }87
88 LibDiamond.updateMember(account, status);89 emit MemberUpdated(account, status);90}
Recommendation:
We advise the data location of the signatures
array to be set as calldata
greatly optimizing the gas cost of the function. The calldata
specifier can still be applied in internal
functions as well, such as the validateSignatures
function used from the LibDiamond
implementation.
Alleviation:
The membership-controlled contract implementation was replaced by a singular LibGovernance
implementation thus no longer rendering this exhibit applicable.
ROU-02S: Unused Return Value
Type | Severity | Location |
---|---|---|
Standard Conformity | Informational | Router.sol:L85 |
Description:
The ERC20 transfer
performed by updateMember
does not evaluate the return bool
value.
Example:
73function updateMember(address account, bool status, bytes[] memory signatures)74 onlyValidSignatures(signatures.length)75 external override76{77 bytes32 ethHash = LibDiamond.computeMemberUpdateMessage(account, status);78 LibDiamond.validateSignatures(ethHash, signatures);79
80 if (status) {81 LibFeeCalculator.addNewMember(account);82 } else {83 LibRouter.Storage storage rs = LibRouter.routerStorage();84 uint256 claimableFees = LibFeeCalculator.claimReward(account);85 IERC20(rs.albtToken).transfer(account, claimableFees);86 }87
88 LibDiamond.updateMember(account, status);89 emit MemberUpdated(account, status);90}
Recommendation:
Although the ALBT implementation would never return a false
boolean under any circumstance, it is still best practice to use a safe wrapper implementation of ERC20, such as SafeERC20
, to ensure return values are properly evaluated.
Alleviation:
The membership-controlled contract implementation was replaced by a singular LibGovernance
implementation thus no longer rendering this exhibit applicable.