-
Notifications
You must be signed in to change notification settings - Fork 155
Description
Body:
Description
CoW Protocol solvers on Base return NoLiquidity for Clanker's DERC20 token standard, despite these tokens having significant liquidity in Uniswap V4 pools ($100K+).
Root Cause
DERC20 contracts (used by Clanker's newer token deployments) include a custom _update() override with a PoolLocked() revert path. The pool address is set to 0x000...dead and the lock is purely cosmetic — it never triggers during normal transfers/swaps. However, CoW solvers appear to simulate the token transfer, encounter the revert path in static analysis, and conservatively skip the token.
Standard ClankerToken contracts (Clanker's older contract type) do not have this custom _update() and route through CoW solvers without issues.
Reproduction
- Go to CoW Swap on Base
- Try to swap any token (e.g. USDC or WETH) → CRED (Helixa Cred):
0xab3f23c2abcb4e12cc8b593c218a7ba64ed17ba3 - The quote returns
NoLiquiditydespite the token having ~$120K+ in a V4 pool
Expected Behavior
Solver should recognize that the PoolLocked() revert in _update() is unreachable during standard Uniswap V4 swaps and route the trade normally.
Impact
This is becoming increasingly common as Clanker (one of the most active token deployers on Base) has shifted to the DERC20 contract type for new launches. Examples of affected tokens:
- CRED (Helixa Cred) —
0xab3f23c2abcb4e12cc8b593c218a7ba64ed17ba3— ~$120K liq - 0xDP (0xDirectPing) —
0x0a3a6eef246ed15dbf97f8a237e20a3bc091cba3— ~$170K liq
All future Clanker DERC20 deployments will have the same issue.
Detection
You can distinguish the two contract types on Blockscout:
- DERC20 → has custom
_update()withPoolLocked()→ CoW can't route - ClankerToken → standard
_update()→ CoW routes fine
Environment
- Chain: Base (8453)
- CoW Swap UI + API
- Uniswap V4 pools
Related
- Tweet with initial report: https://x.com/projectmoltino/status/2025688694296813628