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
- ETH / MTF (Dynamic fee) — 24h volume $733, TVL $863, 7 swaps today