The graduateAndUpgrade()
function neglects to update the bursary
state variable after distributing payments, causing a critical accounting mismatch where the contract's remaining funds (60% of original bursary) become inaccessible while still appearing available in storage.
File: levelOne.sol
Function: graduateAndUpgrade(address _levelTwo, bytes memory)
State/Reality Mismatch:
Pays out 40% of bursary (5% principal + 35% teachers)
Fails to deduct payments from bursary
storage variable
Creates "ghost balance" where contract appears to have more funds than actually available
Funds Lock Risk:
60% remaining funds become effectively stuck
Subsequent operations using bursary
will overestimate available capital
Documentation Violation:
Explicitly contradicts protocol specs requiring "remaining 60% [to] reflect in the bursary after upgrade"
Test Case:
Test Result:
High Severity because:
Breaks financial accounting system
Violates explicit payment distribution requirements
Could cause cascading failures in dependent functions
Foundry (forge test)
Protocol documentation review
Update Bursary After Payments:
Funds are stuck in `LevelOne()` contract after upgrade.
The bursary is not updated after wages have been paid in `graduateAndUpgrade()` function
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.