Likely custom pricing hook on Base
Uniswap v4 Hook Contract 0x604dc51fe59125096b67eaec4b290491edbdc088 on Base · Custom pricing
- Volume (24h)
- $0
- Value locked (TVL)
- $0
- All-time volume
- $0
- Pools using this hook
- 44
- Swaps (24h)
- 0 (0 traders)
- Total swaps
- 0
What it does
An owner-managed hook that tracks a set of pools, intercepts swaps with a return delta to apply a per-pool fee that the owner can change, and gives the owner a generic call function.
How it works step by step
- Registers pools in a mapping and arrays (allPools, getPoolCount, pools(bytes32)) and exposes a default tick spacing and a 1:1 sqrt price constant, which suggests the hook creates or manages its own pools.
- beforeSwap reads the pool mapping and a mapping(address => bool), then returns a delta, so it can take or shift part of the swap amounts.
- The owner can set a per-pool fee through setPoolFee(bytes32,uint24), and a separate function writes a uint24 default fee.
- An unlockCallback is implemented, so the hook performs its own PoolManager operations such as take, settle or modify liquidity.
- The owner has execute(address,uint256,bytes), which makes arbitrary external calls, and setOwner transfers ownership.
- Swap behaviour
- beforeSwap is nonpayable, checks the pool mapping and an address-to-bool mapping, and can return a BeforeSwapDelta. This means it can take a fee or alter the swap amounts. The exact fee formula cannot be determined from the decoded output.
- Liquidity behaviour
- The liquidity callbacks are not enabled in the permissions, although the dispatcher exposes the standard function names. The hook has an unlockCallback, so it may add or remove liquidity itself. The details are not decodable.
- Fee behaviour
- Fees appear to be set per pool by the owner via setPoolFee(bytes32,uint24), with a default uint24 fee also settable by the owner. The fee is likely collected through the beforeSwap return delta. The upper bound and the recipient of the fee are not visible, so they cannot be confirmed.
- Owner & admin controls
- A single owner (slot 0) can transfer ownership with setOwner, set per-pool fees with setPoolFee, set a default fee, and run arbitrary calls with execute(address,uint256,bytes). Other owner-gated functions (0x0aa87769, 0x8ec6cd0d, 0xbfd3da96) read or write storage, but their purpose is unclear. No timelock or multisig is visible in the bytecode.
Enabled Uniswap v4 callbacks
beforeSwap, beforeSwapReturnDelta
beforeSwap is used to apply the hook's per-pool fee logic on swaps. beforeSwapReturnDelta lets the hook adjust the swap's token amounts, meaning it can take or redirect part of the swap.
Security & trust assessment
Risk level: high, estimated (decoded bytecode, low confidence).
Who controls it: The owner can run arbitrary calls from the hook, change fees on every pool, change ownership, and likely change other settings. User and pool outcomes depend heavily on this single key.
Risk to user funds: The hook can touch funds through beforeSwap return deltas and unlockCallback, which move tokens via the PoolManager. It can hold balances, and the owner could move them out via execute. The pool fee setting can also reduce swap output. No evidence of blocking withdrawals is found, since the liquidity callbacks are disabled.
Security findings
- [high] Arbitrary call by owner: execute(address,uint256,bytes) lets the owner call any contract with any calldata and value. Any tokens or approvals held by the hook could be moved.
- [medium] Owner-adjustable fees: setPoolFee(bytes32,uint24) changes the fee per pool, and the hook applies it via beforeSwap return deltas. No cap is visible, so the owner could raise fees sharply.
- [medium] Return-delta swap interception: beforeSwapReturnDelta is enabled, so the hook can take part of the swap amounts or change the pricing. Users depend on the hook logic being fair, which cannot be verified without source.
- [info] Unverified source: There is no verified source, so the behaviour is inferred from selectors and storage access. Some functions are unnamed, such as 0x0aa87769 and 0xbfd3da96.
- [low] Instant ownership transfer: setOwner(address) takes effect immediately, with no two-step process, so a mistaken or malicious call permanently changes control.
Contract details
- Verified source
- No
- Bytecode size
- 14,220 bytes
- Upgradeable proxy
- No
- Detected patterns
- return-delta
Pools using Likely custom pricing hook
- SY-hBTC / hBTC (0.00% fee) — 24h volume $0, TVL $0, 0 swaps today
- VAULT / SY-40acresUSDC (0.00% fee) — 24h volume $0, TVL $0, 0 swaps today
- USDC / SY-40acresUSDC (0.00% fee) — 24h volume $0, TVL $0, 0 swaps today
- SY-Morpho-cbBTC-USDC / USDC (0.00% fee) — 24h volume $0, TVL $0, 0 swaps today
- SY-wcgUSD / USDC (0.00% fee) — 24h volume $0, TVL $0, 0 swaps today
- SY Aerodrome VIR/CBBTC / VIRTUAL (0.00% fee) — 24h volume $0, TVL $0, 0 swaps today
- Aave GHO-USR / SY-yvBal-GHO-USR (0.00% fee) — 24h volume $0, TVL $0, 0 swaps today
- SY-sKAITO / sKAITO (0.00% fee) — 24h volume $0, TVL $0, 0 swaps today
- yoEUR / SY-yoEUR (0.00% fee) — 24h volume $0, TVL $0, 0 swaps today
- SY-aBasGHO / GHO (0.00% fee) — 24h volume $0, TVL $0, 0 swaps today
- SY-wsuperOETHb / superOETHb (0.00% fee) — 24h volume $0, TVL $0, 0 swaps today
- SY-rETH / rETH (0.00% fee) — 24h volume $0, TVL $0, 0 swaps today
- SY-uniBTC-scaled18 / uniBTC (0.00% fee) — 24h volume $0, TVL $0, 0 swaps today
- SY-sKAITO / KAITO (0.00% fee) — 24h volume $0, TVL $0, 0 swaps today
- uniBTC / SY-uniBTC-scaled18 (0.00% fee) — 24h volume $0, TVL $0, 0 swaps today
- SY Aerodrome VIR/CBBTC / vAMM-VIRTUAL/cbBTC (0.00% fee) — 24h volume $0, TVL $0, 0 swaps today
- yoETH / SY-yoETH (0.00% fee) — 24h volume $0, TVL $0, 0 swaps today
- SY-wcgUSD / cgUSD (0.00% fee) — 24h volume $0, TVL $0, 0 swaps today
- SY-apxUSD / apxUSD (0.00% fee) — 24h volume $0, TVL $0, 0 swaps today
- USR / SY-USR (0.00% fee) — 24h volume $0, TVL $0, 0 swaps today