Likely custom pricing hook on Arbitrum
Uniswap v4 Hook Contract 0x600a1c80540afea5c04ed53230eb7944c7090088 on Arbitrum · Custom pricing
- Volume (24h)
- $0
- Value locked (TVL)
- $0
- All-time volume
- $0
- Pools using this hook
- 45
- Swaps (24h)
- 0 (0 traders)
- Total swaps
- 2
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.
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
- USDCUSDT0 / USDC (0.00% fee) — 24h volume $0, TVL $0, 0 swaps today
- USDCUSDT0 / USD₮0 (0.00% fee) — 24h volume $0, TVL $0, 0 swaps today
- sUSDai / USDC (0.00% fee) — 24h volume $0, TVL $0, 0 swaps today
- FRAX / FXB261231 (0.00% fee) — 24h volume $0, TVL $0, 0 swaps today
- USSD / USSD/USDT (0.00% fee) — 24h volume $0, TVL $0, 0 swaps today
- crvUSD / USD₮0 (0.00% fee) — 24h volume $0, TVL $0, 0 swaps today
- alUSDUSDC / alUSD (0.00% fee) — 24h volume $0, TVL $0, 0 swaps today
- USDT+ / xUSD (0.00% fee) — 24h volume $0, TVL $0, 0 swaps today
- ETH / uniETH (0.00% fee) — 24h volume $0, TVL $0, 0 swaps today
- USDC / crvUSDC (0.00% fee) — 24h volume $0, TVL $0, 0 swaps today
- crvUSD / crvUSDT (0.00% fee) — 24h volume $0, TVL $0, 0 swaps today
- crvUSDC.e / USDC (0.00% fee) — 24h volume $0, TVL $0, 0 swaps today
- USDai / USDai-USDC (0.00% fee) — 24h volume $0, TVL $0, 0 swaps today
- crvUSD / crvUSDC (0.00% fee) — 24h volume $0, TVL $0, 0 swaps today
- ETH / alETH (0.00% fee) — 24h volume $0, TVL $0, 0 swaps today
- USDSM / USDC (0.00% fee) — 24h volume $0, TVL $0, 0 swaps today
- crvUSD / USDC (0.00% fee) — 24h volume $0, TVL $0, 0 swaps today
- USSD/USDT / USD₮0 (0.00% fee) — 24h volume $0, TVL $0, 0 swaps today
- USD++ / USDT+ (0.00% fee) — 24h volume $0, TVL $0, 0 swaps today
- crvUSDC.e / crvUSD (0.00% fee) — 24h volume $0, TVL $0, 0 swaps today