Platform: Code4rena
Start Date: 01/09/2023
Pot Size: $36,500 USDC
Total HM: 4
Participants: 70
Period: 6 days
Judge: kirk-baird
Id: 281
League: ETH
Rank: 50/70
Findings: 1
Award: $9.75
🌟 Selected for report: 0
🚀 Solo Findings: 0
🌟 Selected for report: c3phas
Also found by: 0x11singh99, 0xhex, 0xta, Eurovickk, K42, MohammedRizwan, SAAJ, SAQ, SY_S, adriro, albahaca, castle_chain, jeffy, kaveyjoe, matrix_0wl, naman1778, petrichor, wahedtalash77, ybansal2403, zabihullahazadzoi
9.7506 USDC - $9.75
Number | Optimization Details | Instances |
---|---|---|
[G-01] | Do not calculate constant variables | 7 |
[G-02] | Non efficient zero initialization | 7 |
[G-03] | Using ternary operator instead of if else saves gas | 2 |
[G-04] | Pre-increment and pre-decrement are cheaper as compared to post increment and post decrement | 1 |
Total 4 issues
Due to how constant variables are implemented (replacements at compile-time), an expression assigned to a constant variable is recomputed each time that the variable is used, which wastes some gas each time of use.
Total 7 instances - 1 files:
File : contracts/usdy/rUSDY.sol 97: bytes32 public constant USDY_MANAGER_ROLE = keccak256("ADMIN_ROLE"); 98: bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); 99: bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE"); 100: bytes32 public constant BURNER_ROLE = keccak256("BURN_ROLE"); 101: bytes32 public constant LIST_CONFIGURER_ROLE = 102: keccak256("LIST_CONFIGURER_ROLE");
https://github.com/code-423n4/2023-09-ondo/blob/main/contracts/usdy/rUSDY.sol#L97C3-L102C39
File : contracts/rwaOracles/RWADynamicOracle.sol 27: bytes32 public constant SETTER_ROLE = keccak256("SETTER_ROLE"); 28: bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE");
7 instances - 4 file:
File: contracts/bridge/SourceBridge.sol 164: for (uint256 i = 0; i < exCallData.length; ++i) {
https://github.com/code-423n4/2023-09-ondo/blob/main/contracts/bridge/SourceBridge.sol#L164
File: contracts/bridge/DestinationBridge.sol 134: for (uint256 i = 0; i < thresholds.length; ++i) { 160: for (uint256 i = 0; i < t.approvers.length; ++i) { 264: for (uint256 i = 0; i < amounts.length; ++i) {
https://github.com/code-423n4/2023-09-ondo/blob/main/contracts/bridge/DestinationBridge.sol#L134 https://github.com/code-423n4/2023-09-ondo/blob/main/contracts/bridge/DestinationBridge.sol#L160 https://github.com/code-423n4/2023-09-ondo/blob/main/contracts/bridge/DestinationBridge.sol#L264
File: contracts/usdy/rUSDYFactory.sol 130: for (uint256 i = 0; i < exCallData.length; ++i) {
https://github.com/code-423n4/2023-09-ondo/blob/main/contracts/usdy/rUSDYFactory.sol#L130
File: contracts/rwaOracles/RWADynamicOracle.sol 113:for (uint256 i = 0; i < length; ++i) { 129:for (uint256 i = 0; i < length + 1; ++i) {
https://github.com/code-423n4/2023-09-ondo/blob/main/contracts/rwaOracles/RWADynamicOracle.sol#L113 https://github.com/code-423n4/2023-09-ondo/blob/main/contracts/rwaOracles/RWADynamicOracle.sol#L129s
Total 2 instances - 2 file:
File: contracts/bridge/DestinationBridge.sol 179:if (t.numberOfApprovalsNeeded <= t.approvers.length) { 180: return true; 181: } else { 182: return false; 183: }
File: contracts/rwaOracles/RWADynamicOracle.sol 132:if (range.end <= blockTimeStamp) { 133: return derivePrice(range, range.end - 1); 134: } else { 135: return derivePrice(range, blockTimeStamp); 136: }
++i costs less gas compared to i++ or i += 1 for an unsigned integer, as pre-increment is cheaper (about 5 gas per iteration). This statement is true even with the optimizer enabled..
Total 1 instances - 1 file:
File: contracts/bridge/SourceBridge.sol //@audit nonce++ 79: bytes memory payload = abi.encode(VERSION, msg.sender, amount, nonce++);
https://github.com/code-423n4/2023-09-ondo/blob/main/contracts/bridge/SourceBridge.sol#L79
#0 - c4-pre-sort
2023-09-08T14:28:46Z
raymondfam marked the issue as sufficient quality report
#1 - c4-judge
2023-09-24T06:03:59Z
kirk-baird marked the issue as grade-b