The protocol correctly implements access control, tracks user staking times for bonus calculations, and prevents invalid pools from being created via reverting transactions.
This QA report consolidates three minor findings:
The ConfidencePool inherits Ownable but fails to override renounceOwnership(), allowing the sponsor to accidentally brick all administrative functions.
The withdraw() function calls _clampUserSums(), but this is dead code because withdraw() requires riskWindowStart == 0, and _clampUserSums immediately exits if riskWindowStart == 0.
ConfidencePoolFactory.createPool() omits minStake != 0 and expiry <= type(uint32).max validations, relying entirely on the child clone to revert, which provides poor UX for integrators.
Likelihood:
These issues require an explicit owner mistake (L-01), or they are informational / gas-related .
Impact:
bug-01 could lead to a permanent loss of administrative control, trapping swept funds if the recovery address is compromised.
bug-02 causes a minor gas inefficiency on every withdrawal.
bug-03 causes minor UX friction for integrators by returning a child contract error instead of a factory error.
The issues are self-evident in the contract logic and architecture.
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.