The pool sponsor can pause deposits and later unpause them. Resolution, withdrawal, and claim paths remain available while paused so existing capital is not trapped by a temporary pause.
However, pause() and unpause() are both onlyOwner, and the inherited OpenZeppelin Ownable/Ownable2Step path exposes renounceOwnership(). If the owner pauses and then renounces, unpause() becomes permanently unreachable. Future stake() and contributeBonus() calls revert forever.
Likelihood:
Occurs when the pool owner pauses and then renounces ownership, whether accidentally or deliberately.
Requires only the owner's normal privileged actions; no external attacker is needed.
Impact:
All future stake and bonus contributions are permanently blocked.
Existing principal remains recoverable through withdraw or claim paths, so the loss is ingress liveness rather than theft of deposited funds.
Setup: append the function below to test/unit/ConfidencePool.t.sol (same ConfidencePoolTest harness / BaseConfidencePoolTest helpers already used by the suite), then run:
The pool owner calls pause().
The owner then calls renounceOwnership(), leaving owner() == address(0).
Alice's stake() and contributeBonus() both revert with PoolPaused.
Any subsequent unpause() attempt also reverts because there is no owner left to call it.
Disable renounce for the pool, or allow a fallback unpause path that does not depend on the owner.
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.