#45943 [SC-Low] rejectInvalidRedemption fee is not awarded to agent, resulting in stuck or misallocated funds

Submitted on May 22nd 2025 at 19:33:29 UTC by @magtentic for Audit Comp | Flare | FAssets

  • Report ID: #45943

  • Report Type: Smart Contract

  • Report severity: Low

  • Target: https://github.com/flare-foundation/fassets/blob/main/contracts/assetManager/facets/RedemptionRequestsFacet.sol

  • Impacts:

    • Theft of unclaimed yield

    • Permanent freezing of unclaimed yield

Description

Brief/Intro

When an agent successfully calls rejectInvalidRedemption, they are supposed to receive the _executorFeeNatGWei as compensation for providing proof of address invalidity. However, this fee is never transferred. Instead, it remains in the Asset Manager contract, effectively locking the funds or allowing unintended parties with transfer privileges to claim them.

Vulnerability Details

The expected behavior—based on logic in Redemptions.payOrBurnExecutorFee()—is that either:

  • the executor of a redemption receives the NAT fee, or

  • if the sender is not the executor, the NAT is burned.

However, when rejectInvalidRedemption is called, this fee-handling logic is not invoked. Despite the documentation in RedemptionRequestsFacet.sol implying that agents should be rewarded for proving invalidity (i.e., doing the work), they receive nothing:

This means _executorFeeNatGWei remains in the Asset Manager contract indefinitely or until claimed by another party (e.g., if they have transfer rights), which violates the economic expectations of the agent role.

Impact Details

  • The agent, who performs the required rejection work, is not rewarded, violating protocol expectations.

  • The NAT fee remains stuck in the Asset Manager contract.

  • If the Asset Manager or another privileged contract can move these funds, this could result in unfair extraction of value.

  • Incentive misalignment: Agents may avoid performing valid rejections if the cost of proof isn't compensated.

Impacts

  • High Severity: Theft of unclaimed yield

The yield/fee is unclaimed due to protocol oversight and can potentially be taken by unintended parties. OR

  • High Severity: Permanent freezing of unclaimed yield

The fee is never transferred or burned, and there's no apparent recovery path.

References

Redemptions - https://github.com/flare-foundation/fassets/blob/main/contracts/assetManager/library/Redemptions.sol

Proof of Concept

Proof of Concept

Was this helpful?