Likely custom pricing hook on Ethereum
Uniswap v4 Hook Contract 0x81bdc19ae9f8c5e183d8634f80bada8f1d7dc088 on Ethereum · Custom pricing
- Volume (24h)
- $0
- Value locked (TVL)
- $0
- All-time volume
- $0
- Pools using this hook
- 684
- Swaps (24h)
- 0 (0 traders)
- Total swaps
- 60
What it does
An owner-managed hook that keeps a registry of pools and intercepts swaps with a beforeSwap return delta, with a per-pool fee the owner can change and a generic execute function for the owner.
How it works step by step
- Keeps a list of pools it serves (allPools, getPoolCount, pools(bytes32)) and a default tick spacing constant.
- Runs beforeSwap with a return delta, so it can take or credit tokens on a swap. It reads a pool mapping and an address-to-bool mapping, which may be an allowlist or a registry. The exact logic is not decodable.
- Lets the owner set a per-pool fee through setPoolFee(bytes32,uint24) and a default fee through a separate uint24 setter.
- Exposes an unlockCallback, so it interacts with the PoolManager itself and can settle or take tokens.
- Gives the owner an execute(address,uint256,bytes) function that makes arbitrary external calls, plus another owner-only function with the same argument types (0xbfd3da96).
- Swap behaviour
- beforeSwap (0x575e24b4) is non-payable. It reads the pool mapping at slot 1 and the address-to-bool mapping at slot 4, and it can return a delta, so it can change the swap's token amounts. The exact pricing or accounting logic cannot be determined from the bytecode.
- Liquidity behaviour
- No liquidity callbacks.
- Fee behaviour
- The owner sets fees per pool with setPoolFee(bytes32,uint24) and sets a default fee with a separate uint24 setter (0xbefa61d5, stored next to the owner in slot 0). Whether the fee is applied as an LP fee override or taken through the return delta cannot be confirmed from the bytecode.
- Owner & admin controls
- A single owner (slot 0, changed with setOwner) can transfer ownership, set per-pool and default fees, run the address[] function 0x0aa87769 (which writes the pool registry), call 0xbfd3da96, and call execute(address,uint256,bytes) for arbitrary calls. No pause, timelock or upgrade proxy was identified.
Enabled Uniswap v4 callbacks
beforeSwap, beforeSwapReturnDelta
beforeSwap is used to apply the hook's pool-specific logic before each swap. beforeSwapReturnDelta lets the hook adjust the swap's token amounts, for example by taking a fee or doing custom accounting.
Security & trust assessment
Risk level: high, estimated (decoded bytecode, low confidence).
Who controls it: The owner can change fees, rewrite the pool registry, hand off ownership instantly, and use execute to make arbitrary calls from the hook's address. That includes moving any tokens or claims the hook holds.
Risk to user funds: The hook can hold tokens because it uses return deltas and an unlockCallback, so it can take and settle funds with the PoolManager. The owner-only execute function could move any balance held there. A high owner-set fee or faulty beforeSwap logic could also reduce swap output for traders. Its ability to block swaps cannot be determined.
Security findings
- [high] Arbitrary call execution by owner: execute(address,uint256,bytes) is restricted to the owner (slot 0 read) and appears to forward arbitrary calls. It can move any tokens or approvals the hook holds.
- [medium] Return delta on swaps: beforeSwapReturnDelta is enabled, so the hook can take or credit tokens on every swap. The size of any take is controlled by hook logic and owner-set parameters that cannot be verified.
- [medium] Owner-adjustable fees: setPoolFee(bytes32,uint24) and a default fee setter are owner-only. No upper bound can be confirmed from the bytecode.
- [low] Instant ownership transfer: setOwner(address) is a one-step transfer with no timelock or two-step acceptance, which is the legacy Solmate-style pattern.
- [info] Unverified source: There is no verified source, so the logic behind beforeSwap, unlockCallback and the unnamed owner functions is inferred only from selectors and storage access.
Contract details
- Verified source
- No
- Bytecode size
- 14,220 bytes
- Upgradeable proxy
- No
- Detected patterns
- return-delta
Pools using Likely custom pricing hook
- SY-agETH / agETH (0.00% fee) — 24h volume $0, TVL $0, 0 swaps today
- msUSD / SY-msY (0.00% fee) — 24h volume $0, TVL $0, 0 swaps today
- tUSDe / SY-tUSDe (0.00% fee) — 24h volume $0, TVL $0, 0 swaps today
- sUSDe / SY-tUSDe (0.00% fee) — 24h volume $0, TVL $0, 0 swaps today
- SY-weETH / weETH (0.00% fee) — 24h volume $0, TVL $0, 0 swaps today
- SY-rswETH / rswETH (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
- SY-sUSDat / sUSDat (0.00% fee) — 24h volume $0, TVL $0, 0 swaps today
- PENDLE / SY-asdPENDLE (0.00% fee) — 24h volume $0, TVL $0, 0 swaps today
- SY SIERRA / USDC (0.00% fee) — 24h volume $0, TVL $0, 0 swaps today
- sNUSD / SY-srNUSD (0.00% fee) — 24h volume $0, TVL $0, 0 swaps today
- SY-cUSD / USDC (0.00% fee) — 24h volume $0, TVL $0, 0 swaps today
- SY tETH / tETH (0.00% fee) — 24h volume $0, TVL $0, 0 swaps today
- SY-eUSDC-22 / USDC (0.00% fee) — 24h volume $0, TVL $0, 0 swaps today
- LBTC / SY-liquidBeraBTC (0.00% fee) — 24h volume $0, TVL $0, 0 swaps today
- sreUSD / SY-sreUSD (0.00% fee) — 24h volume $0, TVL $0, 0 swaps today
- SY-SIERRA / SIERRA (0.00% fee) — 24h volume $0, TVL $0, 0 swaps today
- tBTC / SY-uptBTC (0.00% fee) — 24h volume $0, TVL $0, 0 swaps today
- bb-a-WETH / SY-swETH-BbAWeth_BalancerLP Aura (0.00% fee) — 24h volume $0, TVL $0, 0 swaps today
- SY-ankrETH-WETH_BalancerLP Aura / B-ankrETH-WETH-Stable (0.00% fee) — 24h volume $0, TVL $0, 0 swaps today