EthCreatorFeeHookV3 on Ethereum

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

Volume (24h)
$20.89K
Value locked (TVL)
$10.60K
All-time volume
$1.82M
Pools using this hook
299
Swaps (24h)
154 (54 traders)
Total swaps
15,131

What it does

Charges fixed, per-pool buy and sell fees of 1% to 10% on native ETH swaps in token pools, and routes most of each fee to the token creator's reward vault and a small fixed share to a treasury.

How it works step by step

  • Only pools whose currency0 is native ETH and whose currency1 is a token with a creator() getter can be registered, and the registrar must be that recorded creator.
  • Each registered pool has immutable buy and sell total fees, each a multiple of 100 bps between 100 and 1000 bps.
  • On swaps where ETH is the specified side, beforeSwap takes the total fee in ETH and returns it as a delta; on swaps where the token is specified, afterSwap takes the fee from the ETH leg instead.
  • Of each fee, a fixed 10 bps goes to the launcher accrual and the remainder goes to the creator accrual, which only the registered FeeSplitVaultV1 can claim.
  • Fees are held by the hook as ERC-6909 claims on the PoolManager until a claim redeems them through unlockCallback to the vault or the treasury.
Swap behaviour
beforeSwap and afterSwap are both active. When native ETH is the specified currency, beforeSwap charges the directional fee and returns it as a beforeSwap delta. When the token is specified, afterSwap charges the fee on the ETH amount and returns it as an afterSwap delta. The afterSwap path reverts with PartialFillUnsupported if the ETH amount actually settled differs from the amount expected from the fee formula. Token-to-token transfers outside the pool are not taxed, since TRANSFER_TAX_BPS is 0.
Liquidity behaviour
No liquidity callbacks.
Fee behaviour
Uses a fixed LP fee of 0 pips. Trader fees are the directional total fee set at registration (buy or sell, 1% to 10%). Of that, 10 bps is the fixed launcher share and the rest accrues to the creator reward vault. The fee is taken in ETH, not in the token.
Owner & admin controls
No owner, pause, upgrade or parameter-change functions exist. The contract is described as non-upgradeable. Pool fee parameters are set once at registerPool by the token creator and cannot be changed. launcherFeeRecipient is immutable and is the only address that can claim launcher fees, optionally to a different recipient. The token creator controls only pool registration.

Enabled Uniswap v4 callbacks

beforeInitialize, beforeSwap, afterSwap, beforeSwapReturnDelta, afterSwapReturnDelta

beforeInitialize restricts pool initialization to the recorded registrar and requires the pool to be registered. beforeSwap takes the directional fee in ETH when ETH is the specified side and returns it as a delta. afterSwap takes the fee on the ETH leg when the token is specified and returns it as a delta, and it also enforces the expected ETH amount. beforeSwapReturnDelta and afterSwapReturnDelta allow the hook to take fees through these deltas.

Security & trust assessment

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

Who controls it: No privileged key can change fees, pause swaps, or move pool or user funds. The immutable launcher treasury can claim only accrued launcher fees. The token creator can choose the fee levels once at registration.

Risk to user funds: The hook can take up to the registered buy or sell fee from ETH swap legs through return deltas, and it holds those fees as PoolManager claims until they are redeemed to the vault or treasury. It has no function to take pool liquidity or user balances beyond that fee logic.

Security findings

  • [medium] Swaps can revert on partial fills: afterSwap compares the ETH amount settled by the PoolManager with a fee-derived expected amount and reverts with PartialFillUnsupported on any mismatch. Swaps that partially fill, for example due to a price limit, will revert instead of settling.
  • [medium] Trader fee set by token creator, up to 10%: The registrar sets buySwapFeeBps and sellSwapFeeBps in registerPool, limited to 100 to 1000 bps, and they cannot be changed afterwards. A creator can therefore set a sell fee of up to 10% that traders cannot avoid.
  • [low] Fees held as PoolManager claims until claimed: Accrued creator and launcher fees are kept as ERC-6909 claims on the PoolManager, with accounting in creatorFeesAccrued and launcherFeesAccrued. Only the registered vault can pull creator fees and only the immutable treasury can pull launcher fees, so unclaimed fees depend on those parties to be redeemed.
  • [info] Immutable treasury recipient: launcherFeeRecipient is fixed at deployment. Its address alone can claim launcher fees and redirect a claim to another address for that call, with no admin path to change the treasury.
  • [info] Vault payout ETH transfers: FeeSplitVaultV1 pays beneficiaries with sendValue under nonReentrant. A reverting payout only blocks that beneficiary's claim, and the vault accepts ETH only from the PoolManager.

Contract details

Verified source
Yes (EthCreatorFeeHookV3)
Compiler
solc 0.8.26+commit.8a97fa7a
Bytecode size
12,944 bytes
Upgradeable proxy
No
Detected patterns
erc6909-claims, launchpad, liquidity-management, moves-currency, return-delta, rewards, self-unlock, tax

Pools using EthCreatorFeeHookV3