Likely custom pricing hook on Base

Uniswap v4 Hook Contract 0xd84d227021186b5a9542df396aae96907a7e4088 on Base · Custom pricing

Volume (24h)
$0
Value locked (TVL)
$0
All-time volume
$0
Pools using this hook
30
Swaps (24h)
0 (0 traders)
Total swaps
0

What it does

A pausable hook that appears to route swaps through external Curve pools discovered via a Curve meta registry, using a beforeSwap return delta to replace the Uniswap v4 pool's own swap, though this is inferred from decoded bytecode only.

This read was written for the hook 0x600a…0088 on Arbitrum and reused here: the two share a code shape, so constants such as fees, owners and addresses can differ.

How it works step by step

  • Registers pools in an internal list (allPools, pools, isPoolRegistered) and keeps a per-pool address mapping, likely linking each v4 pool to an external venue.
  • References a curveMetaRegistry and weth, and exposes registry-style view functions returning (address,address,address[])[] arrays, which suggests it looks up Curve pools and their tokens.
  • beforeSwap reads the pause flag, a registered-pool mapping and an address allowlist, and its return delta lets it take over the swap's accounting.
  • Implements unlockCallback, so it likely settles tokens with the PoolManager itself while handling a swap.
  • The owner can set a per-pool fee through setPoolFee(bytes32,uint24) and a default fee through a separate uint24 setter, and can pause the hook with setPaused.
Swap behaviour
beforeSwap is enabled with return delta. From storage reads it checks the paused flag, whether the pool is registered and an address allowlist, and then likely routes the trade to an external Curve pool and returns a delta that replaces the v4 pool's swap. The exact routing and pricing logic cannot be confirmed without source.
Liquidity behaviour
No liquidity callbacks are enabled. The decoded stubs for add/remove liquidity are not active permissions.
Fee behaviour
The owner can set a pool-specific fee with setPoolFee(bytes32,uint24) and a hook-level fee value through an unnamed uint24 setter. A BPS constant is present, so fees are likely expressed in basis points. How the fee is taken (for example deducted from the swap delta) cannot be confirmed from the bytecode alone.
Owner & admin controls
The owner (setOwner, owner) can transfer ownership, pause or unpause the hook, set pool fees and the default fee, change address configuration slots through unnamed setters (including one that likely sets the Curve registry), and call a generic execute(address,uint256,bytes). Another unnamed function (0xbfd3da96, address,uint256,bytes) writes slot 5 and may be a token rescue or similar. No timelock or multisig is visible in the bytecode.

Enabled Uniswap v4 callbacks

beforeSwap, beforeSwapReturnDelta

beforeSwap is used to intercept swaps, check the pause flag and registration, and route them. beforeSwapReturnDelta lets the hook return a delta that overrides the pool's normal swap amounts.

Security & trust assessment

Risk level: high, estimated (decoded bytecode, low confidence).

Who controls it: A single owner key can pause swaps, change fees, change the registry and routing addresses, transfer ownership and execute arbitrary calls from the hook. No timelock or multisig is visible.

Risk to user funds: The hook uses return deltas and unlockCallback, so it likely holds or moves tokens transiently during swaps. If it holds balances or approvals, the owner's execute function could move them, and pausing blocks swaps. Pool liquidity is not directly touched since liquidity callbacks are disabled.

Security findings

  • [high] Arbitrary call by owner: execute(address,uint256,bytes) is nonpayable and owner-gated by the slot 0 read, so the owner can make the hook call any contract with any data. Any tokens or approvals the hook holds could be moved.
  • [medium] Swaps can be paused: setPaused flips a bool that beforeSwap reads, so the owner can block all swaps on pools using this hook.
  • [medium] Owner-controlled fees: setPoolFee(bytes32,uint24) and another uint24 setter let the owner change fees. No upper bound is visible in the decoded interface, so a high fee cannot be ruled out.
  • [medium] Swap output depends on external contracts: The curveMetaRegistry and registered external pool addresses are settable by the owner, and beforeSwap returns a delta based on them, so a malicious or faulty target could give traders bad prices.
  • [info] Unverified source: No verified source is available. All behaviour is inferred from selectors and storage access, and the 20813-byte size leaves room for logic that is not visible here.

Contract details

Verified source
No
Bytecode size
20,813 bytes
Upgradeable proxy
No
Detected patterns
pausable, return-delta

Pools using Likely custom pricing hook