Non-critical hardening and gas notes; no fund loss. Filed as a single QA report.
Informational
I-01 — contributeBonus does not lock expiry. stake sets expiryLocked (:229-231) but
contributeBonus (:266-285) does not, so a bonus contributor's funded deadline can still be moved
by the sponsor until the first stake.
I-03 — totalBonus left stale-high. Only decremented in the totalEligibleStake == 0 || riskWindowStart == 0 branch (:499-501); non-authoritative after a normal SURVIVED distribution.
I-04 — empty good-faith pool bypasses MustClaimBountyFirst. With bountyEntitlement == 0 the
gate at :410 passes trivially, letting claimCorrupted sweep a later donation to recoveryAddress.
I-05 — _clampUserSums asymmetric guard. :681-684 tests only userSumStakeTime, never
userSumStakeTimeSq; verified safe but fragile to future edits.
Gas
G-01 — unbounded pool scope _replaceScope :749-776 (cap accounts.length).
G-02 — if (!claimsStarted) claimsStarted = true; at :402,422,448,467,600 → unconditional assign.
G-03 — flagOutcome external call without nonReentrant :322 (registry trusted, note only).
G-04 — un-asserted invariant claimedBonus <= snapshotTotalBonus at :486 (add a defensive note).
Informational — no direct fund loss; hardening against future refactors and minor gas savings.
Coverage evidence in test/audit/ (differential, conservation, underflow, escalation suites — 22 tests).
Representative fixes (full list per-item above):
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.