{
"badges": [],
"description": "Uniswap v4 is a concentrated-liquidity AMM where all pools live inside a single immutable contract and anyone can create a pool for any token pair with any fee, optionally attaching a hook: an external contract that customizes the pool's behavior. Hookless pools have no admin, no pause switch, and no upgrade path; hooked pools additionally trust their hook's code and controller. UNI tokenholder governance, acting through a 2-day timelock, holds one bounded power over pools: a protocol fee on swaps hard-capped at 0.1% per direction. Under the current UNIfication configuration, collected protocol fees are exchanged by the Firepit for UNI sent permanently to 0xdead; governance can change this disposal path after the timelock.",
"detailedDescription": "Uniswap v4 is a concentrated-liquidity AMM. All pools live inside one immutable contract, the PoolManager: it has no admin, no pause switch, no upgrade path, and user funds sit nowhere else. Anyone can create a pool for any token pair. A pool can be created with a hook, an external contract the pool calls on swaps and liquidity changes. A hookless pool has the same trust profile as earlier Uniswap versions; a hooked pool additionally trusts the hook's code and its controller. The UniversalRouter and PositionManager are optional periphery that hold no user funds; any contract can use the PoolManager directly.\n\nUNI governance, acting through a 2-day timelock, has one power over pools: a protocol fee on swaps, hard-capped in code at 0.1% per swap direction. The fee a pool is charged scales with its own LP fee (detailed below); pools with hooks are currently exempt. Governance cannot upgrade or pause pools, move funds, or censor swaps or pool creation.\n\n### What changed from v3\n\n- **One contract instead of pool contracts.** A pool is a storage entry in the PoolManager, identified by its two currencies, LP fee, tick spacing, and hook address - change any of these and it is a different pool.\n- **Flash accounting.** Every interaction runs inside a lock: the caller performs any number of swaps, liquidity changes, and donations across any pools, and only net balance deltas settle at the end; the transaction reverts unless all deltas reach zero. Multi-hop trades move no intermediate tokens.\n- **Fee tiers are no longer governance-gated.** Creating a pool was already permissionless in v3, but its fee had to be one of the tiers governance had enabled, each with a fixed tick spacing. A v4 pool takes any static LP fee from 0 to 100% and any tick spacing within code bounds, or a dynamic fee its hook sets, even per swap.\n- **Hooks** (next section): optional per-pool contracts that customize behavior - the main new trust dimension.\n- **The oracle was dropped.** A v4 pool has a price oracle only if its hook implements one.\n- **The protocol fee flipped sides.** v3's fee switch took a share of LP fees; v4's fee is added on top of the LP fee on the swap's input.\n- **Token handling.** Balances can be held inside the PoolManager as transferable ERC-6909 claims, and pools use native ETH without wrapping.\n\nConcentrated liquidity itself is unchanged: providers commit capital to tick ranges and earn the pool's LP fee while the price is in range.\n\n### Hooks\n\nA hook is bound to its pool permanently at creation. Its capabilities are encoded in the lowest bits of its own address, fixed and publicly readable. Before/after callbacks can reject swaps, deposits, or withdrawals; return-delta callbacks can take or add token amounts (for swaps, at most the swap amount) - this is how hook fees work. A hook cannot touch other pools, break settlement, or change protocol fees. Within its own pools it can censor, reprice, or extract, and the hook contract itself may be owned, upgradeable, or unverified. Assessing a v4 position means assessing its hook.\n\n### Providing liquidity\n\nLiquidity providers usually mint through the PositionManager, which represents each position as an ERC-721 NFT and pulls tokens through Permit2. Positions can be managed directly against the PoolManager, so no periphery contract can freeze or take them. What can stand between an LP and their funds is the pool's hook - on pools whose hook intercepts liquidity operations, a withdrawal only succeeds if the hook lets it through.\n\n### Swapping\n\nSwaps normally go through the UniversalRouter, which also reaches v2 and v3 pools and can use Permit2 instead of ERC-20 allowances. Routes are computed off-chain and never verified on-chain, so the signed slippage bound is the only protection. Contracts can swap against the PoolManager without a router.\n\n### Governance and the protocol fee\n\nProtocol control sits with UNI holders. Proposals to GovernorBravo require 1,000,000 UNI of delegated votes; voting starts 13,140 blocks later, runs for 40,320 blocks, and passing requires a majority with at least 40,000,000 UNI in favor. Passed proposals queue in the Timelock and execute 2 days later. The Timelock is also the UNI minter, capped at 2% per mint with a minimum interval of 1 year.\n\nThe protocol fee is exercised through the PoolManager owner role. Unlike v3's fee switch, which took a share of LP fees, the v4 fee is added on top of the LP fee on each swap's input.\n\nThe fee is switched on. The PoolManager's fee controller, the V4FeeAdapter, charges hookless pools in proportion to their LP fee - 0.0125% per direction on a 0.05% pool, 0.05% on a 0.3% pool, the full 0.1% from 0.55% up. Hooked pools currently pay no protocol fee unless governance classifies their hook as fee-bearing. Anyone can apply the scheduled fee to a pool and sweep accrued fees to the TokenJar, whose address is hardcoded.\n\nCollected fees accumulate in the TokenJar, and the only way out is through the Firepit: anyone can burn a set amount of UNI (sent permanently to 0xdead) to release the jar's balances. After the timelock, governance can replace any piece of this fee path - the policy, the fee setter, the controller, or the releaser - but none of it can touch liquidity providers' principal.\n\nGovernance cannot upgrade or pause the PoolManager, change a live pool's fee, tick spacing, or hook, block a swap, or stop pool creation. Its only upgrade power is the PositionDescriptor, which renders position-NFT images and takes no part in accounting.",
"links": {
"websites": [
"https://app.uniswap.org/"
],
"documentation": [
"https://docs.uniswap.org/contracts/v4/overview"
],
"repositories": [
"https://github.com/Uniswap/v4-core"
],
"socialMedia": [
"https://x.com/Uniswap"
]
},
"references": [
{
"title": "Uniswap v4 Core Whitepaper",
"url": "https://app.uniswap.org/whitepaper-v4.pdf"
},
{
"title": "UNIfication proposal (protocol fees & UNI burn)",
"url": "https://vote.uniswapfoundation.org/proposals/93"
}
]
}
colors+1-0
null
ecosystemColors+1-0
null
milestones+1-0
null
chainConfig+1-0
null
escrows+1-0
null
bridgeInfo+1-0
null
bridgeRisks+1-0
null
bridgeTechnology+1-0
null
scalingInfo+1-0
null
scalingStage+1-0
null
scalingRisks+1-0
null
scalingDa+1-0
null
scalingTechnology+1-0
null
daLayer+1-0
null
daBridge+1-0
null
customDa+1-0
null
zkCatalogInfo+1-0
null
interopConfig+1-0
null
privacyInfo+1-0
null
defiInfo+3-0
{
"category": "DEX"
}
externalDependencies+1-0
[]
tvsInfo+1-0
null
tvsConfig+1-0
null
activityConfig+1-0
null
livenessInfo+1-0
null
livenessConfig+1-0
null
costsInfo+1-0
null
trackedTxsConfig+1-0
null
daTrackingConfig+1-0
null
ecosystemInfo+1-0
null
ecosystemConfig+1-0
null
permissions+39-0
{
"ethereum": {
"roles": [],
"actors": [
{
"id": "GovernorBravo",
"name": "GovernorBravo",
"accounts": [
{
"address": "eth:0x408ED6354d4973f66138C91495F2f2FCbd8724C3",
"type": "Contract",
"isVerified": true,
"name": "0x408E…24C3",
"url": "https://etherscan.io/address/0x408ED6354d4973f66138C91495F2f2FCbd8724C3"
}
],
"chain": "ethereum",
"description": "Upgradeable Governor Bravo governance proxy. Holders with more than the current proposal threshold of 1,000,000 UNI can create proposals. Voting begins 13,140 blocks after proposal creation and lasts 40,320 blocks; success requires more for-votes than against-votes and at least 40,000,000 UNI voting for. Successful proposals are queued in the configured timelock. The proxy admin can replace the implementation or nominate a new admin.\n* Can upgrade **with 2d delay**\n * GovernorBravo [via: Timelock with 2d delay]\n * PositionDescriptor [via: Timelock with 2d delay → ProxyAdmin]\n* Can interact with PoolManager\n * can replace the protocol fee controller that sets protocol fees (hard-capped at 0.1% per swap direction) and collects them, and can transfer the PoolManager owner role **with 2d delay** [via: Timelock with 2d delay]\n* Can interact with Firepit\n * can change the burn-token amount required per token-jar release **with 2d delay** [via: Timelock with 2d delay]\n * can replace the thresholdSetter **with 2d delay** [via: Timelock with 2d delay]\n* Can interact with Timelock\n * can queue, cancel, and execute timelocked transactions, and change the delay or admin (through the timelock itself) \n* Can interact with V4FeePolicy\n * can replace the fee setter of the V4FeePolicy and transfer its owner role **with 2d delay** [via: Timelock with 2d delay]\n * configures the protocol-fee schedule in the V4FeePolicy: the default fee, the fee buckets for hookless pools, hook family assignments, flag rules, and per-family or per-pair fees **with 2d delay** [via: Timelock with 2d delay]\n* Can interact with UNIToken\n * can mint up to 2% of the token supply per mint after the minimum 1y interval, and set a new minter **with 2d delay** [via: Timelock with 2d delay]\n* Can interact with GovernorBravo\n * can set the voting delay, the voting period, and the proposal threshold **with 2d delay** [via: Timelock with 2d delay]\n* Can interact with V4FeeAdapter\n * can replace the fee policy contract and the fee setter of the V4FeeAdapter, and transfer its owner role **with 2d delay** [via: Timelock with 2d delay]\n * can set and clear per-pool protocol-fee overrides in the V4FeeAdapter **with 2d delay** [via: Timelock with 2d delay]\n* Can interact with TokenJar\n * can replace the releaser and thereby redirect all held and future token balances **with 2d delay** [via: Timelock with 2d delay]",
"discoveryDrivenData": true
},
{
"id": "V4FeeAdapter",
"name": "V4FeeAdapter",
"accounts": [
{
"address": "eth:0x89A5D5bF00a27D55c02951E49078a5C5771051dB",
"type": "Contract",
"isVerified": true,
"name": "0x89A5…51dB",
"url": "https://etherscan.io/address/0x89A5D5bF00a27D55c02951E49078a5C5771051dB"
}
],
"chain": "ethereum",
"description": "Protocol fee controller for a configured Uniswap v4 pool manager. Anyone can ask it to apply the protocol fee computed by the configured policy contract to a pool, and to collect accrued protocol fees to its fixed recipient. The fee setter can override the fee for individual pools; the owner can replace the policy contract and the fee setter.\n* Can interact with PoolManager\n * can set protocol fees on any pool up to the hard-coded cap of 0.1% per swap direction, and collect accrued protocol fees to an arbitrary recipient ",
"discoveryDrivenData": true
}
]
}
}
contracts+190-0
{
"addresses": {
"ethereum": [
{
"name": "PoolManager",
"isVerified": true,
"address": "eth:0x000000000004444c5dc75cB358380D2e3dE08A90",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "Uniswap v4 core: a non-upgradeable singleton that holds every v4 pool as a storage entry keyed by its currency pair, LP fee, tick spacing, and hook address. Anyone can create a pool with any static LP fee up to 100%, or a dynamic fee controlled by the pool's hook. All interactions run inside a lock that settles only net token amounts at the end of each transaction (flash accounting). The owner's only powers are replacing the protocol fee controller and transferring the owner role; the controller can set protocol fees on pools, hard-capped in code at 0.1% per swap direction, and collect the accrued fees.\n* Roles:\n * **owner**: Timelock; ultimately GovernorBravo\n * **protocolFeeController**: V4FeeAdapter",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0x000000000004444c5dc75cB358380D2e3dE08A90#code"
},
{
"name": "Permit2",
"isVerified": true,
"address": "eth:0x000000000022D473030F116dDEE9F6B43aC78BA3",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "Signature-based token approval hub. Users grant it one ERC20 approval per token, then authorize spenders via time- and amount-bounded signed permits, revocable via lockdown. Immutable and ownerless; any spender with a valid permit can pull the permitted amount.\n",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0x000000000022D473030F116dDEE9F6B43aC78BA3#code"
},
{
"name": "Firepit",
"isVerified": true,
"address": "eth:0x0D5Cd355e2aBEB8fb1552F56c965B867346d6721",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "Burn-and-release contract: anyone can transfer the configured threshold (currently 4,000 UNI) to a fixed burn address and release selected balances from its token jar to a chosen recipient. The threshold setter can change the threshold, including to zero, and the owner can replace the threshold setter.\n* Roles:\n * **owner**: Timelock; ultimately GovernorBravo\n * **thresholdSetter**: Timelock; ultimately GovernorBravo",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0x0D5Cd355e2aBEB8fb1552F56c965B867346d6721#code"
},
{
"name": "Timelock",
"isVerified": true,
"address": "eth:0x1a9C8182C09F50C8318d769245beA52c32BE35BC",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "Compound-style timelock. Its admin can queue, cancel, and execute transactions. A queued transaction becomes executable after 2d and remains executable for a 14d grace period. The delay can be changed only through the timelock itself and must remain between 2d and 1mo. After the one-time admin initialization path has been used, changing the admin requires a timelocked self-call; there is no emergency bypass.\n* Roles:\n * **admin**: GovernorBravo",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0x1a9C8182C09F50C8318d769245beA52c32BE35BC#code"
},
{
"name": "V4FeePolicy",
"isVerified": true,
"address": "eth:0x1cd822b70a0591420F65E94b9B3A0D0b0fB3a314",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "Computes the protocol fee for Uniswap v4 pools. Hookless pools are priced from a piecewise-linear schedule of their LP fee (the fee buckets); hooked pools pay a fee only if their hook is classified - by the fee setter directly, or through self-reported flag rules - into a family with a configured fee. The fee setter configures the schedule and classifications; the owner can replace the fee setter.\n* Roles:\n * **feeSetter**: Timelock; ultimately GovernorBravo\n * **owner**: Timelock; ultimately GovernorBravo",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0x1cd822b70a0591420F65E94b9B3A0D0b0fB3a314#code"
},
{
"name": "UNIToken",
"isVerified": true,
"address": "eth:0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "ERC20 governance token with checkpoint voting. Its constructor mints a fixed initial supply; the minter can mint at most 2% of supply per mint, with a minimum interval of 1y. Votes count only when delegated.\n* Roles:\n * **minter**: Timelock; ultimately GovernorBravo",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984#code"
},
{
"name": "UniversalRouter",
"isVerified": true,
"address": "eth:0x66a9893cC07D91D95644AEDD05D03f95e1dBA8Af",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "Command-based router that executes caller-supplied operations such as v2/v3/v4 swaps, Permit2 transfers, WETH wrapping, and token sweeps in one transaction. Immutable and unprivileged; routes are computed off-chain by the caller.\n",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0x66a9893cC07D91D95644AEDD05D03f95e1dBA8Af#code"
},
{
"name": "ProxyAdmin",
"isVerified": true,
"address": "eth:0xbd123D5b1E148266154F5722C1d059D70059Cf93",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "* Roles:\n * **owner**: Timelock",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0xbd123D5b1E148266154F5722C1d059D70059Cf93#code"
},
{
"name": "PositionManager",
"isVerified": true,
"address": "eth:0xbD216513d74C8cf14cf4747E6AaA6420FF64ee9e",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "Uniswap v4 periphery: represents v4 liquidity positions as ERC-721 NFTs and batches liquidity operations against the configured pool manager, pulling tokens through Permit2. It has no owner and no special privileges in the core.\n",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0xbD216513d74C8cf14cf4747E6AaA6420FF64ee9e#code"
},
{
"name": "PositionDescriptor",
"isVerified": true,
"address": "eth:0xd1428Ba554F4C8450b763a0B2040A4935c63f06C",
"upgradeability": {
"proxyType": "EIP1967 proxy",
"admins": [
"eth:0xbd123D5b1E148266154F5722C1d059D70059Cf93"
],
"implementations": [
"eth:0xb5b6d1BA9D3C85d3e94331341c1C880B22E3F144"
]
},
"chain": "ethereum",
"pastUpgrades": [
{
"timestamp": 1737658139,
"transactionHash": "0xf1670f6207b57912bacf5dd33045fa2ae7f3754f4933c11e5d8f892bf27d8977",
"implementations": [
"eth:0xb5b6d1BA9D3C85d3e94331341c1C880B22E3F144"
]
}
],
"description": "Renders the metadata and SVG image (tokenURI) of Uniswap v4 position NFTs. It takes no part in pool accounting and cannot affect funds.\n* Roles:\n * **admin**: ProxyAdmin; ultimately GovernorBravo",
"upgradableBy": [
{
"name": "GovernorBravo",
"delay": "2d"
}
],
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0xd1428Ba554F4C8450b763a0B2040A4935c63f06C#code"
},
{
"name": "TokenJar",
"isVerified": true,
"address": "eth:0xf38521f130fcCF29dB1961597bc5d2B60F995f85",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "Token escrow whose releaser can transfer held balances. The owner can replace the releaser, changing who controls accumulated and future deposits.\n* Roles:\n * **owner**: Timelock; ultimately GovernorBravo",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0xf38521f130fcCF29dB1961597bc5d2B60F995f85#code"
}
]
},
"risks": []
}