51992 sc high dust accumulation in arctoken during yield distribution

Submitted on Aug 7th 2025 at 06:21:29 UTC by @Killua for Attackathon | Plume Network

  • Report ID: #51992

  • Report Type: Smart Contract

  • Report severity: High

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

Description

Brief / Intro

In ArcToken::distributeYield, the yield distribution mechanism has a logical flaw which causes dust accumulation of yieldTokens in the contract. There is no function to withdraw these dust yield tokens.

Vulnerability Details

  • distributeYield() uses a "last holder gets remainder" approach to handle rounding errors, but fails to account for cases where the last holder is yield-restricted (e.g., blacklisted from receiving yields).

  • The last holder is intended to receive lastShare = amount - distributedSum to ensure complete distribution without dust.

  • If the last holder is not allowed to receive yield, this lastShare remains in the contract.

  • There is no function to withdraw accumulated yieldTokens from the contract.

  • Distribution cycles use only the input amount parameter and never the contract's existing balance of yieldTokens, so each cycle compounds the problem and increases dust.

Impact Details

  • Not all yield is distributed to holders; some yield becomes stuck in the contract.

  • Over time, the dust amount increases with each distribution cycle.

  • Without a recovery mechanism, these funds remain stuck.

Proof of Concept

Test reproducing dust accumulation (expand to view)

Notes / Remediation Ideas

  • Ensure the "remainder to last holder" logic only applies to eligible yield recipients; if the intended last recipient is ineligible, select the last eligible recipient or redistribute the remainder.

  • Alternatively, change distribution logic to consider the contract's existing yieldToken balance (aggregate available yield) and handle rounding such that no tokens are left undistributable.

  • Provide an admin recovery function to withdraw or redistribute dust balances (with appropriate access controls and auditing).

Was this helpful?