SeedifyFeeHook on Base
Uniswap v4 Hook Contract 0x2fd54aaf84023eda60bd65edb5914c1a306850cc on Base · Launchpad · Verified contract
- Volume (24h)
- $2.34K
- Value locked (TVL)
- $28.13K
- All-time volume
- $4.17M
- Pools using this hook
- 6
- Swaps (24h)
- 27 (23 traders)
- Total swaps
- 22,516
What it does
Charges a time-limited launch fee on swaps of a designated fundraise token, then drops to a lower final fee, and splits the collected fees between platform and creator treasuries.
How it works step by step
- Stores a per-pool config with fundraise currency, initial and final fee in basis points, and a launch duration
- Starts the launch timer in afterInitialize and sets launchEnd to block.timestamp plus launchDuration
- Charges initialFeeBps on fundraise-token swaps during the launch window, then finalFeeBps afterward
- Takes the fee via poolManager.take and splits it between platformTreasury and creatorTreasury by platformShareBps
- Lets treasuries withdraw accumulated fees in ETH or ERC-20 with withdrawFees
- Supports global and per-pool pausing that disables fee collection
- Swap behaviour
- On exact-input swaps where the fundraise token is the input, beforeSwap returns a fee delta and afterSwap takes the fee from the input; on swaps where the fundraise token is the output, afterSwap takes the fee from the output. Exact-output swaps skip beforeSwap and are handled in afterSwap. Swaps are not blocked by the fee, and no swap is reverted by the hook unless the pool is uninitialized.
- Liquidity behaviour
- No liquidity callbacks.
- Fee behaviour
- A launch-phase fee (initialFeeBps) applies until launchEnd, then finalFeeBps applies; the fee is capped at 80% (MAX_FEE_BPS 8000) and finalFeeBps must be nonzero and not above initialFeeBps. The fee is taken on the fundraise-currency side only, either from the exact-input amount in beforeSwap/afterSwap or from the fundraise output in afterSwap, and split between platformTreasury and creatorTreasury according to platformShareBps and accrued for withdrawal.
- Owner & admin controls
- DEFAULT_ADMIN_ROLE can set globalPaused via setGlobalPaused and grant or revoke roles; MANAGEMENT_ROLE holders can call configurePool to set fundraise currency, fee tiers, launch duration, platform share and treasury addresses, and can pause individual pools via setPoolPaused. Roles are set at deployment and managed through AccessControl, with no upgradeability or timelock observed.
Enabled Uniswap v4 callbacks
afterInitialize, beforeSwap, afterSwap, beforeSwapReturnDelta, afterSwapReturnDelta
afterInitialize records the launch start and end timestamps and marks the pool initialized; beforeSwap can return a delta that takes an exact-input fee in the fundraise token; afterSwap takes fees from either input or output of the fundraise token via poolManager.take and records them; beforeSwapReturnDelta and afterSwapReturnDelta allow these fee deltas to be applied to the swap accounting.
Security & trust assessment
Risk level: medium (verified source, high confidence).
Who controls it: A MANAGEMENT_ROLE holder can configure pools and set their treasuries and fee schedule within bounds, and can pause any pool, halting fee collection and swap-side fees. A DEFAULT_ADMIN_ROLE holder can pause all pools globally and grant itself or others management and admin roles, so a compromised admin key could redirect future fee configuration to attacker-controlled treasuries.
Risk to user funds: The hook can take a fee of up to 80% of the fundraise-currency amount on each swap through poolManager.take and return deltas, and can pause fee collection. It does not hold user principal, which stays in the pool, and it cannot block swaps outright, but a management key can alter fee terms and recipients for pools that are not yet initialized.
Security findings
- [info] Pause controls stop fee collection: The admin can set globalPaused and per-pool paused flags. When paused, the hook returns zero delta and takes no fees, so pausing does not block swaps, but it halts fee collection.
- [medium] Manager can redirect fee recipients before launch: configurePool can be called by any MANAGEMENT_ROLE holder before a pool is initialized and can overwrite the pending configuration until initialization, and platformTreasury and creatorTreasury can be set to any address, so a compromised manager key could direct fees to itself.
- [low] Hook holds fee balances in custody: afterSwap calls poolManager.take to pull fee tokens into the hook and records them in accumulatedFees, which the treasuries withdraw via withdrawFees. The hook therefore custodies fee balances in the contract, and the ERC-20 transfer or the ETH call is the only outflow path.
- [medium] Launch fee up to 80% charged on swaps: Because the fee is taken as a hook return delta in beforeSwap and afterSwap, the effective swap output or input is altered by the fee amount, so traders of the fundraise token pay the configured launch fee on every swap, up to 80%.
- [info] No timelock or upgrade path observed: The contract is not an upgradeable proxy and no timelock is present in the source, so role changes and configuration updates take effect immediately.
Contract details
- Verified source
- Yes (SeedifyFeeHook)
- Compiler
- solc 0.8.24+commit.e11b9ed9
- Bytecode size
- 10,169 bytes
- Upgradeable proxy
- No
- Detected patterns
- launchpad, moves-currency, return-delta
Pools using SeedifyFeeHook
- ETH / SPARK (0.30% fee) — 24h volume $2.34K, TVL $28.12K, 27 swaps today
- ETH / ALPHA (0.30% fee) — 24h volume $0, TVL <$0.01, 0 swaps today
- ETH / EPSILON (0.30% fee) — 24h volume $0, TVL $2.94, 0 swaps today
- ETH / GAMMA (0.30% fee) — 24h volume $0, TVL $0.58, 0 swaps today
- ETH / DELTA (0.30% fee) — 24h volume $0, TVL $2.14, 0 swaps today
- ETH / BETA (0.30% fee) — 24h volume $0, TVL <$0.01, 0 swaps today