Lucene search

K
code423n4Code4renaCODE423N4:2023-04-EIGENLAYER-FINDINGS-ISSUES-450
HistoryMay 04, 2023 - 12:00 a.m.

StrategyBase.sharesToUnderlying() cannot be overridden to intended mutability

2023-05-0400:00:00
Code4rena
github.com
6
vulnerability
implementation
state modifications
strategybase.sol
istrategy
mitigation

Lines of code

Vulnerability details

Impact

An implementation of sharesToUnderlying(), as inherited from StrategyBase.sol, cannot (contrary to intentions) make state modifications. This implies that StrategyBase.sol may become useless as a base contract to inherit from.

Proof of Concept

StrategyBase.sol โ€œis designed to be inherited by more complex strategies, which can then override its functions as necessaryโ€.
Its function sharesToUnderlying() is explicitly intended to allow for an implementation that โ€œmay make state modificationsโ€:

/**
* @notice Used to convert a number of shares to the equivalent amount of underlying tokens for this strategy.
* @notice In contrast to sharesToUnderlyingView, this function **may** make state modifications
* @param amountShares is the amount of shares to calculate its conversion into the underlying token
* @dev Implementation for these functions in particular may vary signifcantly for different strategies
*/
function sharesToUnderlying(uint256 amountShares) public view virtual override returns (uint256) {
    return sharesToUnderlyingView(amountShares);
}

However, it is declared as view. Overriding functions can only restrict state mutability, never expand it. This means that any overriding function can only be view or pure, and therefore cannot make state changes.
Note that IStrategy correctly declares sharesToUnderlying() as nonpayable.

There is a similar issue with underlyingToShares(), and probably also with explanation(), both reported separately.

Recommended Mitigation Steps

Declare sharesToUnderlying() as the default nonpayable.

- function sharesToUnderlying(uint256 amountShares) public view virtual override returns (uint256) {
+ function sharesToUnderlying(uint256 amountShares) public virtual override returns (uint256) {

Assessed type

Context


The text was updated successfully, but these errors were encountered:

All reactions