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.
View preliminary resultsAppeals are being carefully reviewed by our judges.
The contest is complete and the rewards are being distributed.