Expected: the OWNER state variable is set so owner-only checks (msg.sender == OWNER) work.
Actual: constructor uses OWNER = msg.sender instead of self.OWNER = msg.sender, so OWNER may not be initialized as intended.
...
Using bare OWNER = msg.sender does not assign the contract storage variable in Vyper; it creates/uses a local name instead. As a result owner checks throughout the contract (assert msg.sender == OWNER) will behave incorrectly ; either always failing or comparing against an uninitialized value -breaking access control and enabling unauthorized callers or preventing owner actions.
Likelihood: High (the bug is deterministic and triggered on every deployment)
Impact
If OWNER is never initialized:
1.Any call checking assert msg.sender == OWNER will always fail (breaking core owner-only operations like produce(), increase_share_cap(), set_customer_engine() etc.).
2.In some compiler edge cases, the variable may default to 0x000...000, meaning nobody can satisfy the owner check — effectively locking owner functionality permanently (a denial-of-service).
3.Alternately, if mis-scoped incorrectly, OWNER could behave as an uninitialized global and allow any caller to appear valid — compromising access control and enabling unauthorized takeover.
Deployer (acct0) can’t call produce() because the OWNER variable was never set in storage — confirming broken access control.
This ensures that the immutable storage variable OWNER is initialized correctly at deployment, preserving all ownership checks and preventing denial-of-service or unauthorized control.
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.