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