Kelp DAO | rsETH - Eigenvectors's results

A collective DAO designed to unlock liquidity, DeFi and higher rewards for restaked assets through liquid restaking.

General Information

Platform: Code4rena

Start Date: 10/11/2023

Pot Size: $28,000 USDC

Total HM: 5

Participants: 185

Period: 5 days

Judge: 0xDjango

Id: 305

League: ETH

Kelp DAO

Findings Distribution

Researcher Performance

Rank: 133/185

Findings: 1

Award: $2.76

🌟 Selected for report: 0

🚀 Solo Findings: 0

Awards

2.7592 USDC - $2.76

Labels

bug
downgraded by judge
grade-b
insufficient quality report
QA (Quality Assurance)
duplicate-168
Q-106

External Links

Lines of code

https://github.com/code-423n4/2023-11-kelp/blob/f751d7594051c0766c7ecd1e68daeb0661e43ee3/src/LRTDepositPool.sol#L91-L157

Vulnerability details

Summary

When a user deposits a small amount of tokens to mint rsETH and the current price of rsETH is bigger than the current price of the given asset, it is possible that the user will pay, but does not receive any rsETH tokens in return.

Vulnerability Details

To mint rsETH a user must call the depositAsset function, which calls the _mintRsETH, which calls the getRsETHAmountToMint function:

function depositAsset(
    address asset,
    uint256 depositAmount
)
    external
    whenNotPaused
    nonReentrant
    onlySupportedAsset(asset)
{
    // checks
    if (depositAmount == 0) {
        revert InvalidAmount();
    }
    if (depositAmount > getAssetCurrentLimit(asset)) {
        revert MaximumDepositLimitReached();
    }

    if (!IERC20(asset).transferFrom(msg.sender, address(this), depositAmount)) {
        revert TokenTransferFailed();
    }

    // interactions
    uint256 rsethAmountMinted = _mintRsETH(asset, depositAmount);

    emit AssetDeposit(asset, depositAmount, rsethAmountMinted);
}
function _mintRsETH(address _asset, uint256 _amount) private returns (uint256 rsethAmountToMint) {
    (rsethAmountToMint) = getRsETHAmountToMint(_asset, _amount);

    address rsethToken = lrtConfig.rsETH();
    // mint rseth for user
    IRSETH(rsethToken).mint(msg.sender, rsethAmountToMint);
}
function getRsETHAmountToMint(
    address asset,
    uint256 amount
)
    public
    view
    override
    returns (uint256 rsethAmountToMint)
{
    // setup oracle contract
    address lrtOracleAddress = lrtConfig.getContract(LRTConstants.LRT_ORACLE);
    ILRTOracle lrtOracle = ILRTOracle(lrtOracleAddress);

    // calculate rseth amount to mint based on asset amount and asset exchange rate
    rsethAmountToMint = (amount * lrtOracle.getAssetPrice(asset)) / lrtOracle.getRSETHPrice();
}

As we can see the getRsETHAmountToMint function calculates the amount of rsETH the user receives for the given amount of the specified asset and the formula for the rsethAmountToMint looks like this:

rsethAmountToMint = (amount * assetPrice) / rsETHPrice

Therefore, if the amount times the current asset price is smaller than the current rsETH price a zero amount will be returned and the user does not receive any rsETH while the system still receives the assets, as there is no check implemented in the system for this case:

amount = 1
assetPrice = 1e18
rsETHPrice = 1.1e18

rsethAmountToMint = (amount * assetPrice) / rsETHPrice
rsethAmountToMint = (1 * 1e18) / 1.1e18 = uint256(0.909) = 0

When the provided assets price equals around one ether, while the rsETH price already increased a lot, the problem becomes bigger.

Impact

User loses all deposited assets.

Tools Used

Manual Review

Recommendations

Revert if the calculated rsethAmountToMint equals zero.

Assessed type

Math

#0 - c4-pre-sort

2023-11-16T01:03:49Z

raymondfam marked the issue as insufficient quality report

#1 - c4-pre-sort

2023-11-16T01:05:14Z

raymondfam marked the issue as duplicate of #168

#2 - c4-judge

2023-12-01T16:58:43Z

fatherGoose1 changed the severity to QA (Quality Assurance)

#3 - c4-judge

2023-12-01T18:42:06Z

fatherGoose1 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