NFTStrategyHook on Ethereum
Uniswap v4 Hook Contract 0xbd15e4d324f8d02479a5ff53b52ef4048a79e444 on Ethereum · Fee sharing · Verified contract
- Volume (24h)
- $120
- Value locked (TVL)
- $672.93K
- All-time volume
- $61.39M
- Pools using this hook
- 6
- Swaps (24h)
- 9 (4 traders)
- Total swaps
- 61,933
What it does
Charges a decaying buy fee (starting near 99% and falling to 10%) and a flat 10% sell fee on NFTStrategy ETH pools, then splits the collected fees between the collection, the PNKSTR factory, and an owner-set fee address.
How it works step by step
- Restricts pool initialization to factory-launched ETH/token pools and records each collection's deployment block
- Computes buy fees starting at 99% and reducing 1% every 5 blocks down to a 10% floor; sell fees are fixed at 10%
- Blocks exact-output swaps
- Takes the fee from each swap through afterSwapReturnDelta and splits ETH 80/10/10 between the collection, the factory and a fee address
- Converts non-ETH fee amounts to ETH through a nested swap on the same pool
- Grants NFTStrategy transfer allowances during factory-driven liquidity seeding and swaps
- Swap behaviour
- afterSwap rejects exact-output swaps, computes the dynamic fee based on swap direction and time since pool initialization, takes that fee from the output via the PoolManager, converts non-ETH fees to ETH through a nested pool swap, distributes the ETH, and returns the fee as a hook delta.
- Liquidity behaviour
- afterAddLiquidity only permits liquidity addition while the factory is in loadingLiquidity mode, and grants the NFTStrategy a transfer allowance equal to the token1 amount added. Removing liquidity has no hook callback.
- Fee behaviour
- Buy-direction fee starts at 99% and drops by 1% every 5 blocks after the collection's pool initialization, floored at 10%; sell-direction fee is a fixed 10%. Fee is taken from the swap output via afterSwap return delta. Of each fee, 80% goes to the NFTStrategy collection via addFees, 10% goes to the NFTStrategyFactory (for PNKSTR buy-and-burn), and 10% goes to the collection-specific or default fee address. Non-ETH fees are first swapped to ETH through the pool.
- Owner & admin controls
- Factory owner (via nftStrategyFactory.owner()) can call updateFeeAddress to redirect the default protocol fee recipient, and can call adminUpdateFeeAddress to redirect fees for any collection. The collection's NFT owner can redirect fees for their own collection via updateFeeAddressForCollection. No pause, upgrade, or fee-rate setter found; the fee schedule is hardcoded in calculateFee.
Enabled Uniswap v4 callbacks
beforeInitialize, afterAddLiquidity, afterSwap, afterSwapReturnDelta
beforeInitialize restricts pool creation to ETH/token pools launched by the factory and records the deployment block; afterAddLiquidity permits factory-driven seeding and sets transfer allowance; afterSwap blocks exact-output swaps, takes the dynamic fee, distributes it, and emits events; afterSwapReturnDelta lets the hook claim the fee amount from the swap delta.
Security & trust assessment
Risk level: medium (verified source, high confidence).
Who controls it: The NFTStrategyFactory owner can redirect protocol fees for the default address and for any collection at any time, including to an arbitrary address. This does not directly seize pool reserves but redirects 10% to 100% of fee flow (fees are not withheld from the pool beyond the swap fee).
Risk to user funds: The hook takes up to the full swap amount as fees via return delta (dynamic, up to 99% on buys in early blocks) and holds fees only transiently before forwarding them. It does not custody LP principal beyond the pool's own accounting, but factory-owner-controlled fee addresses determine where that fee value goes.
Security findings
- [medium] Fee destinations controlled by factory owner: Swap fees are routed via _processFees to NFTStrategy.addFees, the factory, and a fee address. If feeAddress or a claimed destination is an EOA that rejects ETH, forceSafeTransferETH still sends it, but the design relies on the factory owner setting trustworthy destinations.
- [info] Very high early buy fee: Buy fees are 99% at launch and decay 1% every 5 blocks, so early buyers pay almost the entire swap output as fee. This is intended behaviour but is a major user-cost factor.
- [low] Nested swap during afterSwap: Any non-ETH fee is swapped to ETH inside afterSwap by calling manager.swap and then settling against the pool, which re-enters the PoolManager during a callback; the hook uses ReentrancyGuard but the path is a nested swap on the same pool.
- [info] Transfer allowance coupling: afterAddLiquidity and afterSwap rely on the NFTStrategy transfer allowance mechanism to permit token transfers; a bug or misconfiguration in allowance accounting would affect token movement for the collection.
Contract details
- Verified source
- Yes (NFTStrategyHook)
- Compiler
- solc 0.8.30+commit.73712a01
- Bytecode size
- 6,781 bytes
- Upgradeable proxy
- No
- Detected patterns
- dynamic-fee, moves-currency, return-delta
Pools using NFTStrategyHook
- ETH / PAINSTR (0.00% fee) — 24h volume $54, TVL $63.27K, 6 swaps today
- ETH / VIBESTR (0.00% fee) — 24h volume $42, TVL $183.23K, 1 swaps today
- ETH / DEEDSTR (0.00% fee) — 24h volume $24, TVL $64.95K, 2 swaps today
- ETH / CHMPSTR (0.00% fee) — 24h volume $0, TVL $253.51K, 0 swaps today
- ETH / CHKSTR (0.00% fee) — 24h volume $0, TVL $61.98K, 0 swaps today
- ETH / GLHFSTR (0.00% fee) — 24h volume $0, TVL $45.99K, 0 swaps today