DESIGN.md §9 states the fairness equivalence that "a staker only forfeits the exit option once risk has actually materialized, which is exactly when they begin earning the risk premium." That is, exit-lock and bonus-earning are meant to start together.
They don't: withdraw() is disabled by the live registry state (anything past ATTACK_REQUESTED), while _bonusShare pays zero unless the separate one-way riskWindowStart latch was sealed by some pool interaction. A staker can therefore be locked out of withdraw() in UNDER_ATTACK while riskWindowStart is still zero, and a reverting withdraw rolls back its own _observePoolState seal, so it can't self-heal.
Likelihood:
Occurs when the registry passes through UNDER_ATTACK and no entrypoint (stake, contributeBonus, pokeRiskWindow, …) is invoked during the whole active-risk interval, leaving riskWindowStart at zero, then the agreement resolves SURVIVED/EXPIRED.
The staker cannot rescue their own bonus by attempting withdraw(); the revert rolls back the seal it would have set.
Impact:
A staker who bore genuinely un-exitable UNDER_ATTACK exposure earns zero of the bonus they were owed; the bonus is diverted to recoveryAddress (the sponsor).
Bounded to the bonus (principal is always returned) and self-curable by any single permissionless pokeRiskWindow(), hence Low, but it breaks the §9 equivalence as written.
Run:
Result:
The seal cannot be persisted from withdraw() itself, because a call that reverts to block the exit also rolls back any _markRiskWindowStart() it performed. Fix the desync at the bonus side instead: make bonus eligibility key on the same live-state condition that locks withdraw (i.e. treat "exit was disabled during active risk" as sufficient to earn bonus), rather than on the separately-sealed riskWindowStart latch. Concretely, seal riskWindowStart from a non-reverting observation and drive both gates from it:
Alternatively, document pokeRiskWindow() as a required keeper action for any pool that may sit idle through UNDER_ATTACK; it is the intended, already-permissionless cure for this exact case.
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.