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