MTFFeeHook on Ethereum

Uniswap v4 Hook Contract 0xaa967d5918648ff09728a431a8dbdaabdc6f20cc on Ethereum · Fee sharing · Verified contract

Volume (24h)
$733
Value locked (TVL)
$863
All-time volume
$272.94K
Pools using this hook
1
Swaps (24h)
7 (7 traders)
Total swaps
1,283

What it does

Adds a fixed 1% ETH fee to every MTF buy and sell, split between treasury, backing and buyback wallets, while LPs earn no swap fee and trading only opens after the owner launches.

How it works step by step

  • Blocks all swaps until the owner calls launch(), while liquidity can be seeded beforehand
  • Charges a fixed 1% fee in ETH on every buy and sell, sent directly from the PoolManager to fee wallets
  • Splits each fee 50% treasury, 30% backing wallet, 20% buyback wallet
  • Overrides the LP fee to 0 so liquidity providers receive no swap fees
  • Caps single ETH-to-MTF buys at 2% of MTF total supply during the first hour after launch
  • Restricts pool initialization to the owner, with ETH as currency0 and MTF as currency1 using the dynamic-fee flag
Swap behaviour
Swaps revert until launch(). Every swap pays a 1% ETH fee on the ETH side, taken in beforeSwap or afterSwap depending on swap direction. During the first hour after launch, a single ETH-to-MTF swap may not buy more than 2% of total MTF supply. Swaps whose fee is taken in beforeSwap must fill completely.
Liquidity behaviour
No liquidity callbacks.
Fee behaviour
Fixed 1% fee (FEE_BPS = 100) on the ETH side of every buy and sell, paid in ETH straight from the PoolManager: 50% to treasury, 30% to backing wallet, 20% to buyback wallet. LP fee is overridden to 0, so LPs earn no swap fee.
Owner & admin controls
Owner (Ownable2Step) can call launch() once to open trading, initialize the single MTF/ETH dynamic-fee pool, and replace treasury, backing and buyback wallets via setWallets (fee rate and split are fixed constants). Ownership can be transferred in two steps or renounced. No pause, upgrade proxy or fee-rate setter found.

Enabled Uniswap v4 callbacks

beforeInitialize, beforeSwap, afterSwap, beforeSwapReturnDelta, afterSwapReturnDelta

beforeInitialize restricts pool creation to the owner with ETH as currency0, MTF as currency1 and the dynamic-fee flag. beforeSwap reverts before launch, enforces the 2% max-buy during the first hour, takes the fee when ETH is the specified side and overrides the LP fee to 0. afterSwap enforces the max-buy on realised output, verifies full fills for swaps whose fee was taken in beforeSwap, and takes the fee when ETH is the unspecified side. beforeSwapReturnDelta and afterSwapReturnDelta let the hook credit the fee amount back to settle the takes.

Security & trust assessment

Risk level: medium (verified source, high confidence).

Who controls it: The owner controls launch timing and can redirect all future fee flows by calling setWallets to any non-zero address that is not the PoolManager, MTF or the hook. The owner cannot change the fee rate or split, pause swaps once launched, or move pool funds directly.

Risk to user funds: The hook never holds user funds: fees are taken from the PoolManager during the swap and sent directly to the three wallets. Users pay a fixed 1% on each side in ETH. The hook can block swaps (pre-launch, oversized early buys, or via a fee wallet that rejects ETH) but cannot take or redirect the pool's liquidity.

Security findings

  • [medium] Swap liveness depends on fee wallets accepting ETH: If a fee wallet rejects ETH, poolManager.take reverts and every swap reverts until the owner replaces the wallet via setWallets.
  • [medium] Owner can redirect fee destinations instantly: A single owner-controlled setWallets call can redirect all future ETH fees to new addresses; there is no timelock.
  • [info] Trading gated by owner launch: Swaps revert until launch() is called, so the owner controls when trading opens.
  • [low] Exact-fill requirement on fee-in-beforeSwap swaps: Fee is taken on the ETH side with a fixed hook return delta; swaps that do not fill completely revert via PartialFill, which can block partially filled trades.

Contract details

Verified source
Yes (MTFFeeHook)
Compiler
solc 0.8.26+commit.8a97fa7a
Bytecode size
4,608 bytes
Upgradeable proxy
No
Detected patterns
erc20, launchpad, moves-currency, ownable, return-delta

Pools using MTFFeeHook