The limit is calculated as (initialLiquidity * phaseLimitBps) / 10000 where initialLiquidity is derived from sqrt price (a liquidity concentration metric), not actual token amounts. This causes the limit to be mathematically incorrect and unpredictable across different price ranges.
Normal behavior: Limits should be based on token amounts (e.g., "max 0.5 ETH per user per phase"). Instead, it's based on liquidity units, which don't directly map to token amounts.
Likelihood: HIGH
Affects every user every phase, cannot be avoided
Different price points have different effective limits (unpredictable)
Calculated in every swap, so impact is continuous
Impact: HIGH
Users can trade more/less than intended depending on pool price
At some prices, limit is 0.1 ETH; at others, 10 ETH for same percentage
Early traders can dump more tokens than protocol intended
Direct fund loss: bot can exceed intended limits and steal excess liquidity
The test does a swap that should be near the user’s allowed limit. Then it compares the limit the hook computes to the limit you’d expect based on real token amounts. They don’t match, proving the contract is using liquidity math instead of actual token amounts, which lets swaps through that should have been blocked.
Use real token amounts when calculating limits, not liquidity math. That way the “max swap per phase” actually reflects how many tokens a user is allowed to trade, instead of a number that changes unpredictably with price or liquidity math.
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.
The contest is complete and the rewards are being distributed.