Both stake and contributeBonus commit real, non-refundable value to the pool, and the sponsor's ability to move expiry is meant to end once value has been committed against a deadline (the expiryLocked one-way latch guards setExpiry).
stake sets expiryLocked = true on the first deposit, but the sibling value-committing entrypoint contributeBonus never sets it. As a result, after any amount of bonus has been irrevocably committed — but before the first stake — the sponsor-owner can still move expiry, so the two value-committing paths protect depositor reliance asymmetrically.
Likelihood:
Occurs whenever a third party funds the bonus via contributeBonus before the first stake, and the sponsor-owner subsequently calls setExpiry (permitted, since no stake has locked the term) to reschedule the deadline the bonus was committed against.
Impact:
A bonus contributor's non-refundable capital is subject to owner-controlled expiry mutation until the first stake; the two value-committing entrypoints enforce the reliance latch inconsistently. No staker principal is at risk (the first staker locks expiry before committing), which bounds this to low severity.
test/poc/ConfidencePoolPoC.t.sol (passes against the contest repo):
Mirror stake so any committed value freezes the term, or explicitly document that bonus contributions do not lock expiry:
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.