Ondo Finance - ybansal2403's results

Institutional-Grade Finance. On-Chain. For Everyone.

General Information

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

Ondo Finance

Findings Distribution

Researcher Performance

Rank: 50/70

Findings: 1

Award: $9.75

Gas:
grade-b

🌟 Selected for report: 0

🚀 Solo Findings: 0

Awards

9.7506 USDC - $9.75

Labels

bug
G (Gas Optimization)
grade-b
sufficient quality report
G-17

External Links

NumberOptimization DetailsInstances
[G-01]Do not calculate constant variables7
[G-02]Non efficient zero initialization7
[G-03]Using ternary operator instead of if else saves gas2
[G-04]Pre-increment and pre-decrement are cheaper as compared to post increment and post decrement1

Total 4 issues

[G-01] Do not calculate constant variables

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:

Instance#1-5 : Assign direct simple constant value after calculating off chain

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

Instance#6-7 : Assign direct simple constant value after calculating off chain

File : contracts/rwaOracles/RWADynamicOracle.sol

27:  bytes32 public constant SETTER_ROLE = keccak256("SETTER_ROLE");
28:  bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE");

https://github.com/code-423n4/2023-09-ondo/blob/main/contracts/rwaOracles/RWADynamicOracle.sol#L27C3-L28C66

[G-02] Non efficient zero initialization

7 instances - 4 file:

Instance#1: Initialisation of i as zero is redundant

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

Instance#2-4: Initialisation of i as zero is redundant

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

Instance#5: Initialisation of i as zero is redundant

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

Instance#6-7: Initialisation of i as zero is redundant

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

[G-03] Using ternary operator instead of if-else saves gas

Total 2 instances - 2 file:

Instance#1:

File: contracts/bridge/DestinationBridge.sol
179:if (t.numberOfApprovalsNeeded <= t.approvers.length) {
180:      return true;
181:    } else {
182:      return false;
183:    }

https://github.com/code-423n4/2023-09-ondo/blob/main/contracts/bridge/DestinationBridge.sol#L179C5-L183C6

Instance#2:

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:        }

https://github.com/code-423n4/2023-09-ondo/blob/main/contracts/rwaOracles/RWADynamicOracle.sol#L132C9-L136C10

[G-04] Pre-increment and pre-decrement are cheaper as compared to post increment and post decrement

++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:

Instance#1:

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

AuditHub

A portfolio for auditors, a security profile for protocols, a hub for web3 security.

Built bymalatrax © 2024

Auditors

Browse

Contests

Browse

Get in touch

ContactTwitter