Research
How financial protocols behave under adversarial conditions.
17 documented findings across 11 protocols. Source-to-deployment verification. Economic analysis. Executable proofs. Falsification when the path does not pay.
LemonCurveFactory legacy bonding curve — total buyer-fund theft
LemonCurveFactory.launch() accepts caller-supplied dexFactory/positionManager addresses with no validation against canonical DEX addresses. At graduation, the bonding curve approves the attacker-chosen positionManager for all real buyer ETH and calls mint() on it.
Verified with working PoC
RedeemHandler.redeem() has no USN/collateral ratio check
RedeemHandler.redeem() burns order.usnAmount and pays out order.collateralAmount with no on-chain relationship enforced between the two, for any caller holding BURNER_ROLE.
Verified with working PoC
Lender withdrawal shortfall enables free-collateral self-deal
When a Lender (Yearn V3 vault) withdrawal exceeds idle liquidity, TroveManager.redeem() kicks a Dutch auction with receiver set to the withdrawing depositor themselves. TokenizedStrategy permanently marks the shortfall as a realized loss for all remaining depositors.
Verified with working PoC
MinterUpgradeableV4._initialize() one-time guard is a no-op
_initialize() is meant to run exactly once, guarded by require(_initializer != address(0)). _initializer starts as the deployer's address and is set to address(1) after the first call - both states are nonzero, so the guard never actually blocks re-invocation.
Verified with working PoC
VoterV5 stale reward-index lets a late voter capture other gauges' skipped-epoch rewards
VoterV5._vote()/_reset() never refresh a gauge's reward-index checkpoint - unlike real Velodrome, which updates it on every vote action. The checkpoint only advances via distribute()/killGauge(), which is permissionless and unenforced per-epoch, so a gauge that goes unvoted for N epochs then receives even minimal weight captures the full N-epoch accumulated index delta.
Verified with working PoC
Missing L2 sequencer uptime validation in ChainlinkPrices
ChainlinkPrices has no check for Base sequencer liveness anywhere in its price validation path - a known, precedented vulnerability class (multiple Arbitrum protocols were exploited by exactly this gap in 2023).
Verified against real source, 3 findings total