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