The funding entry point fund_cyfrin(action) is designed to route ETH either to owner capital injection (action = 0, no shares minted) or to public investor funding (action = 1, shares minted to the caller). The intent is that the owner uses fund_owner() (no shares), while non‑owner users use fund_investor() (receive shares).
The internal function fund_investor() does not restrict the caller. Because the external router fund_cyfrin(1) also lacks a “non‑owner” check, the owner can call the investor route and mint shares to themselves, contrary to the intended separation of roles. This lets the owner acquire public shares, dilute other investors, and later redeem value via withdraw_shares().
Likelihood: High
Occurs whenever the owner chooses fund_cyfrin(1) (the investor route) instead of fund_cyfrin(0).
Occurs whenever the owner account is compromised or behaves adversarially, using privileged knowledge to front‑run public investment.
Impact: High
Owner self‑minting/dilution — The owner can mint public shares to themselves, diluting other investors and capturing future payouts.
Economic manipulation — The owner controls production, share cap increases, and can steer share_price and timing to accumulate shares cheaply, then withdraw with minimal penalty after the lockup period.
The owner can call fund_cyfrin(1) and receive shares (via fund_investor()), even though the owner is supposed to fund without shares (fund_owner()).
Block owner from investor route.
The contest is live. Earn rewards by submitting a finding.
This is your time to appeal against judgements on your submissions.
View preliminary resultsAppeals are being carefully reviewed by our judges.
The contest is complete and the rewards are being distributed.