stake() and contributeBonus() gate on live registry state via _observePoolState() → _assertDepositsAllowed(), which is meant to keep staking open through NOT_DEPLOYED / NEW_DEPLOYMENT / ATTACK_REQUESTED / UNDER_ATTACK, and only close it once the registry enters the PROMOTION_REQUESTED or a terminal state PRODUCTION/CORRUPTED.
_assertDepositsAllowed is evaluated against live registry state on every call, with no memory of past observations and no one-way latch (unlike scopeLocked, riskWindowStart, and riskWindowEnd).
The agreement owner has the right to request promotion to close staking, then cancel that request to revert the registry back to UNDER_ATTACK and reopen it — since _assertDepositsAllowed re-evaluates live state each call with nothing latched from the prior observation. Repeating this request → cancel cycle lets the owner toggle staking open and closed at will, with no cooldown, cost, or bound before expiry,the owner can cause DoS for stakers by toggling it again and again.
Likelihood:
The agreement owner toggles the agreement state, by requesting promotion just before a staker stakes and again rejecting promotion.
Impact:
Stakers will face a DoS when they stake, or bonus contributors
Latch the deposit-closing decision the same way scopeLocked/riskWindowStart/riskWindowEnd are latched, so a later observation of PROMOTION_REQUESTED (or a terminal state) permanently closes staking instead of being re-opened by a subsequent rewind to UNDER_ATTACK:
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.