Per the design doc (§8, treated as the binding source of truth), the pool's intended invariant is: "post-stake additions to the underlying agreement do not extend this pool's coverage, and stakers' exposure is bounded by what they signed up for at deposit time." This implies each staker's relevant scope commitment should be the scope that was published at the time they deposited.
The setPoolScope is gated purely on scopeLocked — a flag that is itself driven only by registry state (_observePoolState), with zero dependency on whether any staker has already deposited. Scope changes remain possible for as long as the registry is observed in NOT_DEPLOYED / NEW_DEPLOYMENT, and stake() is independently permitted during that exact same window. This means a staker can deposit under one published scope, and the sponsor can subsequently replace that scope entirely before it lock, breaking the given rule.
Likelihood:
This occurs whenever a staker deposits while the registry is still in NOT_DEPLOYED or NEW_DEPLOYMENT — the pool's normal, expected staking window per its own lifecycle — and the sponsor subsequently calls setPoolScope again before the registry transitions past that staging window.
Impact:
A staker's actual, locked-in coverage can differ from the scope they observed and relied on when depositing, directly contradicting the invariant the design doc states as ground truth (§8: exposure bounded by deposit-time signup).
The contest is live. Earn rewards by submitting a finding.
This is your time to appeal against judgements on your submissions.
Appeals are being carefully reviewed by our judges.
The contest is complete and the rewards are being distributed.