Normal behavior: initialization parameters are validated so a misconfiguration cannot permanently disable core protocol functionality.
Specific issue: initialize(address tswapAddress) (ThunderLoan.sol:139) accepts address(0) with no check, and __Oracle_init_unchained (OracleUpgradeable.sol:15-17) assigns s_poolFactory = poolFactoryAddress without zero-address validation. A zero factory makes every getPriceInWeth() lookup fail, so getCalculatedFee() and therefore flashloan() can never execute.
Likelihood:
Requires a deployer misconfiguration (passing the zero address) — rare, but nothing in the init chain detects it at deploy time.
The mistake is silent: deployment and deposits succeed, the breakage appears only at the first flash loan.
Impact:
getPriceInWeth() reverts or returns garbage on every call, so getCalculatedFee() and flashloan() are permanently unusable — protocol DoS until an owner-driven upgrade.
No direct loss of funds, but depositor liquidity is stranded in a bricked protocol.
Explanation: deploy the proxy and call initialize(address(0)) — the call succeeds; setAllowedToken() and deposit() also succeed; the first flashloan() (or a direct getCalculatedFee()) reverts inside the zero-address pool lookup, bricking the protocol with no on-chain way to recover except an upgrade. PoC requires forge verification.
Explanation: zero-address checks at both initialization entry points make the misconfiguration impossible at deploy time, which is far cheaper than an emergency upgrade after deposits are stranded.
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.