Renzo - mussucal's results

A protocol that abstracts all staking complexity from the end-user and enables easy collaboration with EigenLayer node operators and a Validated Services (AVSs).

General Information

Platform: Code4rena

Start Date: 30/04/2024

Pot Size: $112,500 USDC

Total HM: 22

Participants: 122

Period: 8 days

Judge: alcueca

Total Solo HM: 1

Id: 372

League: ETH

Renzo

Findings Distribution

Researcher Performance

Rank: 56/122

Findings: 3

Award: $13.57

🌟 Selected for report: 0

🚀 Solo Findings: 0

Awards

13.5262 USDC - $13.53

Labels

bug
3 (High Risk)
satisfactory
sufficient quality report
:robot:_97_group
duplicate-395

External Links

Lines of code

https://github.com/code-423n4/2024-04-renzo/blob/519e518f2d8dec9acf6482b84a181e403070d22d/contracts/Delegation/OperatorDelegator.sol#L327-L335

Vulnerability details

Impact

Total TVL calculation depends on this, thus RestakeManager.calculateTVLs() returns incorrect value.

Proof of Concept

The mapping queuedShares tracks token shares within the withdrawal queue of EigenLayer. Its definition is mapping(address => uint256) public queuedShares. Proper representation would involve accessing it as queuedShares[address(token)]. However, within the function, it's depicted as queuedShares[address(this)] == 0, which is always True. Consequently, the ternary operator always returns the token balance without considering the queued shares for that specific token.

Tools Used

Manual review.

Replace queuedShares[address(this)] == 0 with queuedShares[address(token)] == 0.

Assessed type

Context

#0 - c4-judge

2024-05-16T10:44:24Z

alcueca marked the issue as satisfactory

Lines of code

https://github.com/code-423n4/2024-04-renzo/blob/519e518f2d8dec9acf6482b84a181e403070d22d/contracts/RestakeManager.sol#L317-L320

Vulnerability details

Impact

The total TVL is inaccurate because of an incorrect calculation of the totalWithdrawalQueueValue.

Proof of Concept

The function renzoOracle.lookupTokenValue(IERC20 _token, uint256 _balance) provides the value of _balance denominated in the underlying currency for the specified _token. It's important to note that _token differs from the token whose balance is represented by _balance. Specifically, _token corresponds to collateralTokens[i], while _balance refers to collateralTokens[j].balanceOf(withdrawQueue).

Tools Used

Manual review.

The renzoOracle.lookupTokenValue() function's initial parameter should be collateralTokens[j].

Assessed type

Context

#0 - c4-judge

2024-05-16T10:34:27Z

alcueca marked the issue as satisfactory

#1 - c4-judge

2024-05-16T10:39:08Z

alcueca changed the severity to 3 (High Risk)

#2 - c4-judge

2024-05-20T04:26:26Z

alcueca changed the severity to 2 (Med Risk)

#3 - c4-judge

2024-05-23T13:47:20Z

alcueca changed the severity to 3 (High Risk)

Awards

0.0402 USDC - $0.04

Labels

bug
2 (Med Risk)
satisfactory
sufficient quality report
:robot:_20_group
duplicate-198

External Links

Lines of code

https://github.com/code-423n4/2024-04-renzo/blob/519e518f2d8dec9acf6482b84a181e403070d22d/contracts/RestakeManager.sol#L562

Vulnerability details

Impact

RestakeManager.deposit() may revert for a certain valid case.

Proof of Concept

In the function, if bufferToFill > 0, then _amount is recalculated. If _amount is equal to bufferToFill, then operatorDelegator.deposit(_collateralToken, _amount) is called with _amount=0. It gets reverted as operatorDelegator.deposit() checks for this.

Tools Used

Manual review.

Include the call to operatorDelegator.deposit() in a if statement.

Assessed type

Context

#0 - c4-judge

2024-05-20T05:03:21Z

alcueca marked the issue as satisfactory

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