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
NoLiquidity despite 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() with PoolLocked() → CoW can't route
- ClankerToken → standard
_update() → CoW routes fine
Environment
- Chain: Base (8453)
- CoW Swap UI + API
- Uniswap V4 pools
Related
Body:
Description
CoW Protocol solvers on Base return
NoLiquidityfor 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 aPoolLocked()revert path. The pool address is set to0x000...deadand 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
ClankerTokencontracts (Clanker's older contract type) do not have this custom_update()and route through CoW solvers without issues.Reproduction
0xab3f23c2abcb4e12cc8b593c218a7ba64ed17ba3NoLiquiditydespite the token having ~$120K+ in a V4 poolExpected 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:
0xab3f23c2abcb4e12cc8b593c218a7ba64ed17ba3— ~$120K liq0x0a3a6eef246ed15dbf97f8a237e20a3bc091cba3— ~$170K liqAll future Clanker DERC20 deployments will have the same issue.
Detection
You can distinguish the two contract types on Blockscout:
_update()withPoolLocked()→ CoW can't route_update()→ CoW routes fineEnvironment
Related