Omniscia fetchai Audit

ACT Code Style Findings

ACT Code Style Findings

ACT-01C: Inefficient Swap

TypeSeverityLocation
Gas OptimizationInformationalACT.sol:L191-L208

Description:

The swapACTData function is meant to swap the data of two Detail structs but does so inefficiently.

Example:

contracts/RWAT/ACT.sol
186function swapACTData(uint256 actId0, uint256 actId1) external whenNotPaused() {
187 requireIsPrivilegedRole();
188 require(isValidId(lookupHashName, actId0), "ACT: invalid actId0");
189 require(isValidId(lookupHashName, actId1), "ACT: invalid actId1");
190
191 Detail memory detailsTemp;
192 Detail storage details0 = actDetails[actId0];
193 Detail storage details1 = actDetails[actId1];
194
195 // act0 to temp
196 detailsTemp.contractHashName = details0.contractHashName;
197 detailsTemp.assetId = details0.assetId;
198 detailsTemp.totalMinted = details0.totalMinted;
199
200 // act1 to act0
201 details0.contractHashName = details1.contractHashName;
202 details0.assetId = details1.assetId;
203 details0.totalMinted = details1.totalMinted;
204
205 // temp to act 1
206 details1.contractHashName = detailsTemp.contractHashName;
207 details1.assetId = detailsTemp.assetId;
208 details1.totalMinted = detailsTemp.totalMinted;
209
210 emit SwapACTData(
211 actId0,
212 details1.assetId,
213 details1.contractHashName,
214 details1.totalMinted,
215 actId1,
216 details0.assetId,
217 details0.contractHashName,
218 details0.totalMinted
219 );
220}

Recommendation:

We advise direct assignments to be utilized whereby detailsTemp is set to actDetails[actId0], actDetails[actId0] is set to actDetails[actId1] and finally actDetails[actId1] is set to detailsTemp.

Alleviation:

The swapping of data now properly uses direct assignments optimizing the statements of the function.