#45956 [SC-Insight] EOA only on smart contract chains bypassed on ETH

Submitted on May 22nd 2025 at 21:58:14 UTC by @Machicoulis for Audit Comp | Flare | FAssets

  • Report ID: #45956

  • Report Type: Smart Contract

  • Report severity: Insight

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

  • Impacts:

    • Griefing (e.g. no profit motive for an attacker, but damage to the users or the protocol)

Description

Brief/Intro

With EIP-7702 enabling EOAs to temporarily delegate to smart contracts, agents can now implement discriminatory logic during minting, accepting payments only from whitelisted addresses while rejecting others. This breaks the permissionless nature of the FAsset system and allows agents to create unfair markets, potentially excluding users based on arbitrary criteria.

Vulnerability Details

The vulnerability allows agents to implement conditional acceptance of minting payments using EIP-7702 delegation.

When users attempt to mint: User calls reserveCollateral() and pays collateral reservation fee.

User receives payment instructions via CollateralReserved event.

User sends payment to agent's underlying address.

Agent's EOA (delegated to discriminatory contract) rejects the payment

User loses collateral reservation fee with no recourse

The protocol's EOA requirement was specifically designed to prevent such conditional behavior:

// From AgentsCreateDestroy.sol
require(Globals.getSettings().requireEOAAddressProof, "EOA proof required");

Impact Details

Because of all the other safeguards implemented, even if the agent bypasses the EOA only security on Ethereum, they can't do very harmful things. This is mostly a griefing attack, and a break of an invariant that should be aknowledged.

References

https://eips.ethereum.org/EIPS/eip-7702

Proof of Concept

Proof of Concept

Agent deploys a smart contract on Ethereum that only accepts payments ≥ 10 ETH Agent creates vault on Flare by calling createAgentVault() with their Ethereum address Agent joins available agents list by calling makeAgentAvailable()

Small user (Alice) wants to mint 0.5 ETH worth of f-assets Alice calls reserveCollateral() on Flare, paying 0.001 ETH collateral reservation fee Alice receives payment instructions via CollateralReserved event: send 0.505 ETH to agent's Ethereum address

Alice sends 0.505 ETH to agent's Ethereum address Agent uses EIP-7702 to delegate their EOA to the minimum deposit contract for this transaction Transaction reverts because 0.505 ETH < 10 ETH minimum Alice gets her 0.505 ETH back but has lost the collateral reservation fee

Alice cannot call executeMinting() - she has no payment proof (payment failed) Agent calls mintingPaymentDefault() after timeout and collects Alice's reservation fee Agent continues normal operations with large depositors while excluding small ones

Was this helpful?