SpudsHook on Ethereum
Uniswap v4 Hook Contract 0x80d1e32e13b94138ede0c8e8257837529370af40 on Ethereum · Liquidity management · Verified contract
- Volume (24h)
- $0
- Value locked (TVL)
- $7.46K
- All-time volume
- $753.99K
- Pools using this hook
- 4
- Swaps (24h)
- 0 (0 traders)
- Total swaps
- 6,429
What it does
SpudsHook is a full-range liquidity hook that mints SPUDS rewards to in-range LPs across four pools, lets users stake SPUDS with a 24-hour cooldown, and burns protocol fees through buybacks.
How it works step by step
- Seeds four full-range genesis positions owned permanently by the hook, paired with SPUDS against WETH, USDT, USDC and SATO.
- Restricts user LP to full-range positions and blocks the deployer EOA from earning LP rewards.
- Accrues SPUDS emissions per block by pool allocation and distributes them via a rewards-per-liquidity accumulator to in-range positions.
- Lets users stake SPUDS to earn emissions, with an unstake cooldown of 7200 blocks before claimUnstaked.
- Burns SPUDS fees collected from genesis liquidity and swaps counter-asset fees into SPUDS for burning via triggerBuyback.
- Swap behaviour
- afterSwap only triggers per-pool reward accrual; swaps are not blocked, modified or taxed by the hook.
- Liquidity behaviour
- Only full-range positions ([-887200, 887200]) are accepted from users, and the deployer EOA is blocked from LP. Position NFTs are tracked for emission accrual; liquidity added or removed through the PositionManager updates reward debt. Genesis liquidity is held by the hook under salt bytes32(poolIndex) and is never removed.
- Fee behaviour
- Pools use a static 10000 (1%) fee with tick spacing 200. The hook takes no fee itself; swap fees accrue to the hook-owned genesis position, and buyback logic burns the SPUDS portion and swaps counter-asset fees into SPUDS for burning.
- Owner & admin controls
- No owner or admin role is present. SPUDS minting is restricted to the hook (immutable minter), seedGenesis can only run once, and the deployer address is hardcoded as an LP-ineligible address. No pause, upgrade or parameter-change functions were found.
Enabled Uniswap v4 callbacks
beforeInitialize, beforeAddLiquidity, afterAddLiquidity, beforeRemoveLiquidity, afterRemoveLiquidity, afterSwap
beforeInitialize restricts pool initialization to the four known pool keys. beforeAddLiquidity enforces sender checks, known pool, full-range-only and the deployer LP ban. afterAddLiquidity settles accrued rewards and registers positions. beforeRemoveLiquidity settles rewards before PositionManager removals. afterRemoveLiquidity reduces tracked liquidity. afterSwap accrues per-pool emission rewards.
Security & trust assessment
Risk level: medium (verified source, high confidence).
Who controls it: No privileged key exists after deployment. The deployer address is only used to block LP rewards, and the minter and genesis seeding are fixed at construction, so no single party can change parameters, pause the pool or mint extra SPUDS.
Risk to user funds: The hook mints SPUDS rewards to LPs and stakers and holds staked SPUDS and genesis liquidity. Staked SPUDS sit in the hook with no withdrawal path other than the 7200-block cooldown, and the hook cannot block swaps or move funds from pools outside the defined reward and buyback flows.
Security findings
- [info] Protocol-owned genesis liquidity is non-withdrawable: Genesis liquidity is permanently owned by the hook under salt bytes32(poolIndex) and cannot be withdrawn; buybacks only collect fees from it.
- [low] Simplified reward accounting: Reward accrual uses the global accumulator without time-weighting per position and the emission math in _accruePool uses integer division; rounding and the simplified _computeAccumulated can slightly misallocate rewards between positions.
- [low] Immutable pool and counter-asset configuration: seedGenesis pulls counter assets from the caller and is guarded by a one-time flag, but the initial pool prices and amounts are hardcoded, so a mis-set counter token address at deployment cannot be corrected.
- [info] Flash-loan mitigations present but timing-based: Stake and reward state is updated per block from cumulative emission, and the same-block checks (SameBlockHarvest) limit flash-loan style claims, but reward distribution still depends on block-level timing and in-range liquidity reads from the pool manager.
Contract details
- Verified source
- Yes (SpudsHook)
- Compiler
- solc 0.8.26+commit.8a97fa7a
- Bytecode size
- 21,264 bytes
- Upgradeable proxy
- No
- Detected patterns
- liquidity-management, rewards
Pools using SpudsHook
- SPUD / WETH (1.00% fee) — 24h volume $0, TVL $5.81K, 0 swaps today
- SPUD / sato (1.00% fee) — 24h volume $0, TVL $288, 0 swaps today
- SPUD / USDT (1.00% fee) — 24h volume $0, TVL $857, 0 swaps today
- SPUD / USDC (1.00% fee) — 24h volume $0, TVL $511, 0 swaps today