Snow and Snowman both inherit Ownable and both set an owner in their constructors, which signals that an administrator can intervene in the protocol.
No onlyOwner function exists in either contract — grep -rn "onlyOwner" src/ returns nothing. The owner has no powers at all. The only privileged role in the system is s_collector, and the function that rotates it is onlyCollector, so the role appoints its own successor with no oversight. s_buyFee is likewise fixed at construction with no setter.
Likelihood:
Permanently and by construction: the owner is powerless from deployment onward, and the collector role is unrecoverable for the lifetime of the contract.
It becomes material whenever the collector key is lost, compromised, or set to a contract that cannot call changeCollector — the ordinary key-management risks that Ownable is normally present to mitigate.
Impact:
All accrued protocol fees are permanently captured by whoever controls the collector key, with no administrative path to rotate or revoke it.
If the collector key is lost, or is a contract that cannot transact, fees accumulate forever with no way to withdraw them and no way to appoint a replacement.
Ownable's presence is actively misleading to integrators and reviewers, who will reasonably assume an admin backstop exists. It also costs deployment gas and storage for nothing.
Paste the harness and test function(s) into test/PoC.t.sol, placing test functions inside contract PoC. Any additional helper contracts go outside contract PoC. Run forge test --match-path test/PoC.t.sol -vv.
Either give the owner the administrative powers its presence implies, or drop Ownable and stop advertising a backstop that does not exist.
The contest is live. Earn rewards by submitting a finding.
Submissions are being reviewed by our AI judge. Results will be available in a few minutes.
View all submissionsThe contest is complete and the rewards are being distributed.