49623 sc low unstaking allows going below minimum stake

Submitted on Jul 17th 2025 at 19:05:26 UTC by @Blobism for Attackathon | Plume Network

  • Report ID: #49623

  • Report Type: Smart Contract

  • Report severity: Low

  • Target: https://github.com/immunefi-team/attackathon-plume-network/blob/main/plume/src/facets/StakingFacet.sol

  • Impacts:

    • Contract fails to deliver promised returns, but doesn't lose value

Description

Brief/Intro

The unstake method in StakingFacet for unstaking a particular amount does not check if the remaining stake is still above the minimum stake. A staker can thus leave a dust stake amount with a validator.

Vulnerability Details

Most places in StakingFacet confirm that the user stake is above minStakeAmount, but unstaking with a specific amount does not do this:

function unstake(uint16 validatorId, uint256 amount) external returns (uint256 amountUnstaked) {
    if (amount == 0) {
        revert InvalidAmount(0);
    }
    return _unstake(validatorId, amount);
}

Impact Details

Anyone can go below the minimum stake parameter with this method. Financial incentives for this are not immediately clear, but this does lead to storage bloat.

References

See plume/src/facets/StakingFacet.sol

Proof of Concept

PoC — apply diff and run failing test

The PoC below demonstrates how a user can end up with having just 1 wei staked, below the minimum stake.

Save the diff below to poc.diff then run git apply poc.diff. Run like this:

Was this helpful?