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.

Criticallemon.fun · Robinhood Chain

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

CriticalNoon (USN) · Ethereum

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

HighFlex Finance · Ethereum

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

HighHydrex · Ethereum

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

HighOrvex · Robinhood Chain

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

HighRipe Protocol · Base

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