OverviewVote
← All proposals
    ←Previous#99Next→

    Proposal #100

    Activate v4 Protocol Fees (Part 1/2)

    executed

    Payment status

    Description

    Activate v4 Protocol Fees (Part 1/2)

    Summary

    This proposal continues the protocol fee rollout approved in UNIfication, following proposals #93, #94, #95, and #96. It uses the expedited governance process where fee parameter update proposals go directly to a five-day Snapshot followed by an onchain vote.

    Protocol fees are now live across all v2 and v3 pools on 11 chains - Ethereum, Arbitrum, Base, Celo, OP Mainnet, Soneium, X Layer, Worldchain, Zora, BNB Chain, and Polygon. Last month, the protocol set a record burning 186,000 UNI in one day.

    Below we introduce a system for v4 protocol fees and propose to activate it on a subset of v4 pools on these same chains. This onchain vote will specifically activate v4 fees on Ethereum, Arbitrum, Base, BNB Chain, Polygon, Optimism, and Robinhood Chain. Please note that because of GovernorBravo's limit of 10 actions per proposal, there will be two separate onchain votes to accommodate all chains. The remaining five chains (Celo, Soneium, Worldchain, X Layer, Zora) will be addressed in a subsequent proposal.

    Implementation Details

    v4's hook architecture requires a different approach to fee activation than v2 or v3. v2 pools have a single LP fee tier and are charged a static fee. v3 has several LP fee tiers, each charged a static fee. Hooks mean v4 has potentially infinite distinct LP fee tiers, and a pool's fees can change dynamically from one block to the next. To manage this, we propose a V4 Fee Controller system where governance sets rules that let a dedicated contract compute the fee for any pool on demand, rather than setting a fee on each individual pool.

    The system splits across two contracts:

    • V4FeePolicy. Given any pool, it computes the fee from rules defined by governance. This is the contract governance calls to enable and adjust the protocol fee, and it can be swapped out later if the logic for setting fees needs to evolve.

    • V4FeeAdapter. Enforces governance overrides, so if governance has set a per-pool override, that override wins and the policy is skipped. Otherwise the adapter applies the policy's fee, pushes it to the pool, and collects the proceeds to the TokenJar.

    V4FeePolicy determines a pool's fee in two steps. First it sorts the pool into a family. A pool's family is determined by its characteristics, e.g. whether it has a hook, whether it uses the PoolManager's native swap math, whether it charges dynamic swap fees, et cetera. A pool's family is identified by a flag, which is stored on the hook smart contract. Hook developers can opt their pools into a family via assigning it a specific flag. Governance can also assign a hook to a family directly via a vote.

    Once it determines the pool's family, the policy then resolves the fee, applying the rules below, going in order from most specific to least:

    1. a per-pair fee, if governance has set one for that token pair in that family
    2. otherwise the family's own fee (defined by governance as a default or curve)
    3. otherwise a global default for anything still unclassified

    With this system, governance manages a handful of rules and overrides instead of an unbounded list of pools, any fee is computed deterministically and can be inspected onchain, and the policy itself is replaceable if governance later wants to change how pools are categorized.

    This proposal activates fees on three pool families:

    • Static fee pools: These are pools without hooks. The protocol fee for these pools is set via a curve targeting a proportion of each pool's LP fee. For a description of this curve, please see the appendix below.
    • CCA Pools: These are pools launched after a Continuous Clearing Auction. The LBPHook and pools resulting from previous auctions will be opted into the same curve as static pools.
    • Aggregator hook pools: These are pools whose hooks integrate external liquidity venues into the v4 routing graph. The protocol fee for the aggregator hook family is a flat fee with overrides for specific pair types. To maintain the option of charging more on this external flow than the v4 PoolManager's hard cap of 10bps, aggregator hooks will multiply their assigned fees by 25, allowing for a cap of 250bps. After the multiplier is applied, the resulting fee for aggregator hooks will be:
      • For all chains other than Base:
        • Family Default: 10bp
        • Select Stable Pairs: 3bp
      • For Base:
        • Family Default: 3bp
        • Select Stable Pairs: 1bp This proposal does not enable the protocol fee for any pools other than those in the Families mentioned above.

    Fees will flow to TokenJar on each chain. UNI burned on L2s and alt-L1s will be bridged back to Ethereum mainnet and sent to 0xdead.


    Onchain Proposal Spec

    Pre-proposal (to be completed by Uniswap Labs prior to an onchain vote)

    • Deploy V4FeeAdapter and V4FeePolicy contracts on the chains where the v2 and v3 protocol fees are currently enabled (Ethereum, Arbitrum, Base, Celo, OP Mainnet, Soneium, X Layer, Worldchain, Zora, BNB Chain, and Polygon).
    • Configure V4FeePolicy contracts with the native math protocol fee curve, CCA Hook and aggregator hook family fee logic described above

    These contracts can be found here, and this post will be updated with addresses and explorer links when they have been deployed.

    In this proposal (executed if the vote passes):

    • Set the V4FeeAdapter as the ProtocolFeeController on the PoolManager on each chain

    Next Steps / Timeline

    Snapshot: July 11-16, 2026

    Onchain vote: July 19-26, 2026


    Appendix - Static Fee Curve

    The V4 Fee Controller allows fee setting using discrete LP fee tier ranges. Each range has a floor, and the next range sets the ceiling. For each range, governance sets two inputs:

    • alpha which is the constant. This is the starting fee for that range.
    • beta which is the scaling factor. This is how fast the fee grows within that range. The growth always starts from the floor of the range.
    • Inside any range, the fee is: alpha + beta * (lpFee - floor).The output is floored to the nearest 0.01bp increment, consistent with v4's minimum fee resolution.

    | Range (bps) | Floor | Alpha (bps) | Beta (bps) | | :---- | :---- | :---- | :---- | | 0 - 0.03 | 0 | 0.01 | 0 | | 0.03 - 0.75 | 0.03 | 0.01 | 19/72 | | 0.75 - 1 | 0.75 | 0.2 | 0.2 | | 1 - 3.75 | 1 | 0.25 | 3/11 | | 3.75 - 5 | 3.75 | 1 | 0.2 | | 5 - 25 | 5 | 1.25 | 11/80 | | 25 - 55 | 25 | 4 | 0.2 | | > 55 | 55 | 10 | 0 |

    This results in the following fees at the following points.

    | LP Fee (bps) | Protocol Fee (bps) | | :---- | :---- | | 0.03 | 0.01 | | .75 | 0.20 | | 1 | 0.25 | | 3.75 | 1 | | 5 | 1.25 | | 25 | 4 | | 30 | 5 | | 83.34 | 10 | | 100 | 10 |

    Tally

    For46,604,582 97%
    Against1,274,746 3%
    Abstain1,813 0%
    Quorumreached

    Timeline

    1. Pending
    2. Active
        · block 25,567,974
      block 25,567,974 → 25,608,294
    3. Succeeded
        · block 25,608,294
    4. Queued
        · block 25,608,297
    5. Executed
        · block 25,622,665

    Votes356

    0x11dA…ECdCFor · 15,003,219 UNI
    0x6d71…75C3For · 8,007,642 UNI
    0x1d8F…6452For · 8,000,000 UNI
    0x4421…448DFor · 5,311,814 UNI
    0xA7F6…d555For · 2,891,294 UNI
    0x8d07…A265For · 2,301,703 UNI
    0x5C04…dC62For · 2,270,288 UNI
    0x683a…6C02For · 2,002,445 UNI
    0x4905…4DD0Against · 1,000,000 UNI
    0xB933…8Dd1For · 453,271 UNI
    0x3FB1…4C8AFor · 254,296 UNI
    0x40a3…1c83Against · 250,001 UNI

    Strongly against activating fees on v4. See our reasoning here: https://gov.uniswap.org/t/temp-check-activate-v4-protocol-fees/26162/10?u=gammastrategies Basically we believe it's too early to be activating protocol fees on v4 prior to achieving market dominance.

    0xd344…6317For · 32,830 UNI
    0x38e2…26c0Against · 24,745 UNI

    I support Uniswap capturing sustainable value from v4, but not without clear protections for the liquidity providers on whom the protocol depends. Before activating fees broadly, governance should establish transparent measurements of LP profitability, liquidity depth, spreads, volume, and market share, along with predefined review and rollback thresholds. Fees can then be activated selectively where the evidence shows that pools can support them without weakening Uniswap’s competitiveness. I am voting AGAINST this implementation, not against protocol fees in principle. Build the measurement and rollback mechanism first, then activate fees responsibly.

    0x8928…E372For · 13,636 UNI

    lol

    0x3205…A1c6For · 9,692 UNI
    0x0579…CA09For · 8,130 UNI
    0x8ABf…441aFor · 7,000 UNI
    0x6f9B…8A1dFor · 6,624 UNI
    0x802D…12B2For · 6,519 UNI
    0x2343…C09EFor · 6,245 UNI
    0xDbc8…4F28For · 5,407 UNI
    0xc5cb…3397For · 3,570 UNI
    0x12b3…0832For · 3,017 UNI
    0xE93D…E2b5Abstain · 1,813 UNI
    0x1B68…eeaDFor · 1,208 UNI
    0x6De8…5dFdFor · 1,200 UNI
    0xB792…89D7For · 1,040 UNI
    0x21b3…Fa75For · 1,023 UNI
    0x1106…9FdaFor · 402 UNI
    0xC208…dbc9For · 116 UNI
    0xE228…13b1For · 112 UNI
    0xa829…4153For · 79 UNI
    0x3519…52CbFor · 79 UNI
    0x7028…595EFor · 77 UNI
    0x7065…dF2DFor · 59 UNI
    0x089A…2dFdFor · 51 UNI

    I support this proposal because it introduces a governance-driven framework for activating protocol fees in Uniswap v4 that is compatible with the protocol's flexible hook architecture. Rather than managing fees on individual pools, the proposed V4 Fee Controller applies transparent, deterministic rules while remaining upgradeable through governance if future adjustments become necessary. The phased rollout across multiple chains, combined with the use of policy-based fee management and on-chain governance oversight, provides a measured approach to expanding protocol revenue while preserving the ability to refine the system as real-world data becomes available.

    0xa62D…47d9For · 50 UNI
    0x7Bb9…0418For · 46 UNI
    0xF517…29e5For · 31 UNI
    0xc58D…FB2cFor · 27 UNI
    0xFffd…bf5dFor · 20 UNI
    0xbC0F…ebb8For · 20 UNI
    0x0527…8469For · 19 UNI

    **Voting For.** Uniswap is running the experiment the rest of this industry keeps arguing about in theory. Protocol fees have been live across v2 and v3 on eleven chains, Labs has taken its interface, wallet and API fees to zero, and Uniswap is still the largest venue. If volumes hold through this extension, that is an empirical answer to the claim that a protocol must give its service away to defend market share. Extending fees to v4 tests it on the most competitive surface we have. That alone is worth the vote. Three reasons I support this proposal, and one distinction I want on the record. **It restores the link between protocol activity and the asset.** This is the property most infrastructure in this space has lost: usage grows and the token does not notice. Uniswap is rebuilding that link rather than deferring it indefinitely. **It is a credible commitment, not a promise.** Routing revenue to a treasury is a policy any future governance can reverse and any well-organised cons

    0xb201…2241For · 15 UNI
    0x2F2F…f78AFor · 14 UNI
    0xe2bc…F6dbFor · 14 UNI
    0xE0E2…5724For · 13 UNI
    0x1A9a…2E4aFor · 10 UNI
    0xc82b…d5C4For · 10 UNI

    Voting timeline

    Proposal actions

    Caller
    Uniswap Timelock
    0x1a9C…35BC
    →
    setProtocolFeeController→
    PoolManager
    0x0000…8A90
    controller→
    V4FeeAdapter
    0x89A5…51dB
    createRetryableTicket· 0.0100 ETH→
    Delayed Inbox
    0x4Dbd…AB3f
    ⇢ impl
    Inbox
    0x7C05…0a10
    excessFeeRefundAddress→
    0x2BAD…46CD
    callValueRefundAddress→
    0x2BAD…46CD
    ▶l2CallValue, maxSubmissionCost, gasLimit, maxFeePerGas
    l2CallValueuint256
    0
    maxSubmissionCostuint256
    10000000000000000
    gasLimituint256
    200000
    maxFeePerGasuint256
    100000000
    ↳setProtocolFeeController→
    PoolManager
    0x360E…FB32
    controller→
    V4FeeAdapter
    0x6b3C…b2Cc
    sendMessage→
    Base L1 Cross Domain Messenger
    0x866E…0Afa
    ⇢ impl
    L1CrossDomainMessenger
    0xb686…9FE0
    _target→
    0x31FA…72A9
    ▶_minGasLimit
    _minGasLimituint32
    200000
    ↳setProtocolFeeController→
    PoolManager
    0x4985…2b2b
    controller→
    V4FeeAdapter
    0xc53D…4b55
    sendMessage→
    UniswapWormholeMessageSender
    0xf5F4…615a
    messageReceiver→
    0x341c…302b
    ▶targets, values, calldatas, receiverChainId
    targetsaddress[]
    0x28e2Ea090877bF75740558f6BFB36A5ffeE9e9dF
    valuesuint256[]
    0
    calldatasbytes[]
    0x2d77138900000000000000000000000066276d2e80784180e4b9b859e4327b9c5646b87c
    receiverChainIduint16
    4
    ↳setProtocolFeeController→
    PoolManager
    0x28e2…e9dF
    controller→
    0x6627…B87c
    sendMessageToChild→
    Fx Root
    0xfe5e…89a2
    _receiver→
    0x8a1B…2374
    ↳setProtocolFeeController→
    PoolManager
    0x6736…5cD6
    controller→
    V4FeeAdapter
    0x59e8…2cc6
    sendMessage→
    OP L1 Cross Domain Messenger
    0x25ac…5fA1
    ⇢ impl
    OVM_L1CrossDomainMessenger
    0x1639…9F1D
    _target→
    0xa1dD…3518
    ▶_gasLimit
    _gasLimituint32
    200000
    ↳setProtocolFeeController→
    PoolManager
    0x9a13…4Ec3
    controller→
    V4FeeAdapter
    0xd853…E56B
    createRetryableTicket· 0.0100 ETH→
    Delayed Inbox
    0x1A07…7a2D
    ⇢ impl
    Inbox
    0x8D3b…91c6
    to→
    0x8366…0951
    excessFeeRefundAddress→
    0x2BAD…46CD
    callValueRefundAddress→
    0x2BAD…46CD
    ▶l2CallValue, maxSubmissionCost, gasLimit, maxFeePerGas, data
    l2CallValueuint256
    0
    maxSubmissionCostuint256
    10000000000000000
    gasLimituint256
    200000
    maxFeePerGasuint256
    100000000
    databytes
    0x2d7713890000000000000000000000006d0009504d129cf5002dba61d9ae8575aa79314c