{
"badges": [],
"description": "Uniswap v2 is a constant-product AMM where anyone can create an immutable, adminless pair for any two tokens. User funds sit only in the pairs, which no one can upgrade or pause, and every swap pays a 0.3% fee to liquidity providers. UNI tokenholder governance, acting through a 2-day timelock, holds one power over v2: choosing the recipient of a protocol fee of 1/6 of LP fees, which is currently switched on.",
"detailedDescription": "Uniswap v2 is a constant-product automated market maker: a set of immutable pair contracts on Ethereum where anyone can swap one ERC-20 token for another against liquidity other users have deposited. There is no operator in the trading path and user funds sit only in the pairs, which have no admin, no pause switch, and no upgrade path. The router most users interact with is a convenience that holds no user funds: any contract can trade with a pair and provide liquidity without it.\n\nUNI tokenholder governance exists alongside the pairs rather than above them. Acting through a 2-day timelock, it can choose the recipient of a protocol fee whose size is fixed in the pair code; it cannot upgrade or pause a pair, move liquidity providers' funds, or censor swaps or pair creation.\n\n### Pairs\n\nEach pair holds two tokens and prices them so that the product of the two reserves never decreases. Every swap pays a 0.3% fee on the input, which stays in the pair and accrues to liquidity providers. Liquidity is spread across all prices, so a position earns fees whatever the price, and is represented by an ERC-20 LP token for its share of the pair. The first deposit into a pair permanently locks a minimum of 1,000 LP token units, which makes manipulating the share price of a new pair expensive.\n\nPair creation is permissionless: anyone can have the factory deploy a pair for any two tokens, one pair per token pair. Pairs are deployed with CREATE2, so a pair's address is computable in advance from the factory address and the two tokens. Once deployed, a pair never changes: its tokens and its fee are fixed.\n\nA swap can send tokens out before they are paid for, as long as the pair is paid back, plus the fee, within the same transaction. These flash swaps let a contract borrow either token, or both, for the length of a transaction. Anyone can also bring a pair's recorded reserves in line with its actual balances, or take any tokens sent to it beyond those reserves.\n\n### Router\n\nSwaps and liquidity changes normally go through UniswapV2Router02, which finds the pairs from the factory, moves tokens in and out, and checks the user's limits. Every entry point takes a deadline and a minimum output or maximum input, so a transaction that waits too long or would trade at a worse price reverts. Which pairs a trade crosses is computed offchain by the interface or a routing API, and the chain never verifies that the chosen route was the best one, so the slippage tolerance, not the quote, is the real protection. The router also has variants for tokens that charge a fee on transfer, and it wraps and unwraps ETH.\n\n### The built-in oracle\n\nEvery pair doubles as a price oracle: on the first interaction in each block it adds the current prices to two running sums weighted by time. Anyone can read these sums at two moments and divide by the time between them to get a time-weighted average price, without any offchain reporter. Unlike Uniswap v3, a pair keeps no history of past values, so the reader has to record the first value itself.\n\n### Governance and the fee switch\n\nProtocol control sits with UNI holders. An address with more than 1,000,000 UNI of delegated votes can submit a proposal to GovernorBravo; voting starts 13,140 blocks later and runs for 40,320 blocks. Passing takes more for- than against-votes and at least 40,000,000 UNI voting for. A passed proposal is queued in the Timelock and executable 2 days later. The same Timelock is the UNI token's minter, with new issuance capped at 2% per mint and a minimum interval of 1 year.\n\nOver the pairs, governance holds one control knob, exercised through the factory's fee setter role: choosing the recipient of the protocol fee, where no recipient means the fee is off. The pair code fixes the fee at 1/6 of LP fees, paid by minting LP tokens to the recipient when liquidity is added or removed, so the fee can never be raised and can never touch principal.\n\nThe protocol fee is switched on. Since the UNIfication proposal the fee setter role sits with the Timelock and the recipient is the TokenJar, which collects the LP tokens. Under the current configuration, the Firepit releases TokenJar balances to anyone who first burns the configured threshold of UNI. This disposal path is governed rather than immutable: after the timelock, governance can choose another recipient, replace the TokenJar releaser, or change the Firepit threshold.\n\nGovernance cannot upgrade, pause, or drain a pair, change a pair's swap fee, block a swap, or stop anyone from creating a pair.",
"links": {
"websites": [
"https://app.uniswap.org/"
],
"documentation": [
"https://docs.uniswap.org/contracts/v2/overview"
],
"repositories": [
"https://github.com/Uniswap/v2-core",
"https://github.com/Uniswap/v2-periphery"
],
"socialMedia": [
"https://x.com/Uniswap"
]
},
"references": [
{
"title": "Uniswap v2 Core Whitepaper",
"url": "https://app.uniswap.org/whitepaper.pdf"
},
{
"title": "UNIfication proposal (protocol fees & UNI burn)",
"url": "https://vote.uniswapfoundation.org/proposals/93"
}
]
}
{
"censorshipResistance": {
"sentiment": "good",
"points": [
"The core contracts are immutable, cannot be paused, and have no upgrade path, so the exit window is infinite.",
"Anyone can create a pair, swap, or withdraw liquidity, with no permission and no operator in the path.",
"Governance, through a 2-day timelock, can only choose who receives the protocol fee, fixed in code at 1/6 of LP fees. It cannot block swaps, freeze liquidity or touch LP funds.",
"Passes the walkaway test: pairs work without the team, the interface or governance, and any contract can call them directly."
],
"notReviewed": [
"The interfaces users reach the pairs through."
]
},
"openSource": {
"sentiment": "good",
"license": "GPL-3.0",
"points": [
"The core, the periphery and the interface are published under the GPL.",
"The contracts are verified onchain, and can be built and run locally alongside a self-hosted interface."
]
},
"privacy": {
"status": "fullyTransparent",
"points": [
"The protocol does not make privacy claims, and is fully transparent.",
"Swaps and liquidity positions are public onchain."
]
},
"security": {
"sentiment": "good",
"points": [
"Every contract that holds user funds is immutable, with no upgrade path.",
"No external dependency: no oracle, no bridge.",
"The core has secured value at very high volume since 2020."
],
"additionalConsiderations": [
"Per-pair token and liquidity risk stays with the user.",
"No circuit breakers or rate limits. A faulty token only affects its own pairs, but a bug in the pair code would reach all of them."
]
}
}
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+23-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* 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 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 UniswapV2Factory\n * can set the protocol fee recipient, which switches on a protocol fee of 1/6 of LP swap fees on every pair, and transfer the fee setter role **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
}
]
}
}
contracts+127-0
{
"addresses": {
"ethereum": [
{
"name": "UniswapV2Pair_WETH_USDT",
"isVerified": true,
"address": "eth:0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "A constant-product AMM pool for one token pair, deployed by the factory and fully immutable: no owner, no pause, no upgrade path. Swaps pay a 0.3% fee to liquidity providers. If the factory has a protocol fee recipient set, the pair mints it 1/6 of those fees as LP tokens. Also a cumulative-price oracle anyone can read.\n",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852#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": "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": "UniswapV2Factory",
"isVerified": true,
"address": "eth:0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "Deploys Uniswap v2 pairs: anyone can create one pair per token pair, at a CREATE2 address deterministic in the two tokens. Immutable. Its fee setter can switch a protocol fee on or off by choosing its recipient, and can hand the setter role to another address. It cannot modify, pause, or upgrade deployed pairs, or touch their funds.\n* Roles:\n * **feeToSetter**: Timelock; ultimately GovernorBravo",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f#code"
},
{
"name": "UniswapV2Router02",
"isVerified": true,
"address": "eth:0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "Stateless periphery that routes swaps and liquidity changes through Uniswap v2 pairs. Immutable, with no owner, and it holds no user funds between transactions.\n",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D#code"
},
{
"name": "UniswapV2Pair_USDC_WETH",
"isVerified": true,
"address": "eth:0xB4e16d0168e52d35CaCD2c6185b44281Ec28C9Dc",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "A constant-product AMM pool for one token pair, deployed by the factory and fully immutable: no owner, no pause, no upgrade path. Swaps pay a 0.3% fee to liquidity providers. If the factory has a protocol fee recipient set, the pair mints it 1/6 of those fees as LP tokens. Also a cumulative-price oracle anyone can read.\n",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0xB4e16d0168e52d35CaCD2c6185b44281Ec28C9Dc#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": []
}
[
{
"id": "60470d30",
"date": "Fri, 16 Oct 2026 12:01:52 GMT",
"timestamp": 1791537166,
"description": "Initial discovery of Uniswap V2: the factory, two representative pairs, Router02, and the governance and protocol fee contracts it shares with Uniswap V3.",
"isHighSeverity": false,
"changeCount": 9,
"sections": [
{
"kind": "initial-discovery",
"body": "```diff\n+ Status: CREATED\n contract UniswapV2Pair_WETH_USDT (eth:0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852) [uniswapv2/UniswapV2Pair]\n +++ description: A constant-product AMM pool for one token pair, deployed by the factory and fully immutable: no owner, no pause, no upgrade path. Swaps pay a 0.3% fee to liquidity providers. If the factory has a protocol fee recipient set, the pair mints it 1/6 of those fees as LP tokens. Also a cumulative-price oracle anyone can read.\n```\n\n```diff\n+ Status: CREATED\n contract Firepit (eth:0x0D5Cd355e2aBEB8fb1552F56c965B867346d6721) [uniswapv3/Firepit]\n +++ 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```\n\n```diff\n+ Status: CREATED\n contract Timelock (eth:0x1a9C8182C09F50C8318d769245beA52c32BE35BC) [uniswapv3/Timelock]\n +++ 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```\n\n```diff\n+ Status: CREATED\n contract UNIToken (eth:0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984) [uniswapv3/Uni]\n +++ 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```\n\n```diff\n+ Status: CREATED\n contract GovernorBravo (eth:0x408ED6354d4973f66138C91495F2f2FCbd8724C3) [uniswapv3/GovernorBravoDelegate]\n +++ 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```\n\n```diff\n+ Status: CREATED\n contract UniswapV2Factory (eth:0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f) [uniswapv2/UniswapV2Factory]\n +++ description: Deploys Uniswap v2 pairs: anyone can create one pair per token pair, at a CREATE2 address deterministic in the two tokens. Immutable. Its fee setter can switch a protocol fee on or off by choosing its recipient, and can hand the setter role to another address. It cannot modify, pause, or upgrade deployed pairs, or touch their funds.\n```\n\n```diff\n+ Status: CREATED\n contract UniswapV2Router02 (eth:0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D) [uniswapv2/UniswapV2Router02]\n +++ description: Stateless periphery that routes swaps and liquidity changes through Uniswap v2 pairs. Immutable, with no owner, and it holds no user funds between transactions.\n```\n\n```diff\n+ Status: CREATED\n contract UniswapV2Pair_USDC_WETH (eth:0xB4e16d0168e52d35CaCD2c6185b44281Ec28C9Dc) [uniswapv2/UniswapV2Pair]\n +++ description: A constant-product AMM pool for one token pair, deployed by the factory and fully immutable: no owner, no pause, no upgrade path. Swaps pay a 0.3% fee to liquidity providers. If the factory has a protocol fee recipient set, the pair mints it 1/6 of those fees as LP tokens. Also a cumulative-price oracle anyone can read.\n```\n\n```diff\n+ Status: CREATED\n contract TokenJar (eth:0xf38521f130fcCF29dB1961597bc5d2B60F995f85) [uniswapv3/TokenJar]\n +++ description: Token escrow whose releaser can transfer held balances. The owner can replace the releaser, changing who controls accumulated and future deposits.\n```"
}
]
}
]
{
"censorshipResistance": {
"sentiment": "good",
"points": [
"Pools are immutable and adminless: nothing can be paused or upgraded.",
"Anyone can deploy a pool for any token pair at an enabled fee tier, and swapping or withdrawing liquidity needs no permission and passes through no operator.",
"UNI tokenholder governance, acting through a 2d timelock, holds only two bounded powers over v3 pools: enabling new fee tiers, and setting a protocol fee capped at 1/4 of LP fees per side.",
"Governance cannot block a swap, freeze a position, or reach LP funds."
"The core contracts are immutable, cannot be paused, and have no upgrade path, so the exit window is infinite.",
"Anyone can create a pool at an enabled fee tier, swap, or withdraw liquidity, with no permission and no operator in the path.",
"Governance, through a 2-day timelock, can only enable new fee tiers and set a protocol fee capped in code at 1/4 of LP fees per side. It cannot block swaps, freeze positions or touch LP funds.",
"Passes the walkaway test: pools work without the team, the interface or governance, and any contract can call them directly."
],
"notReviewed": [
"The routers and interfaces users actually reach the pools through, which sit outside them."
"The routers and interfaces users reach the pools through."
]
},
"openSource": {
"sentiment": "good",
"license": "GPL-2.0",
"points": [
"The GPL covers both the v3 core and the periphery - the business-source grant on the core expired in 2023.",
"The core, the periphery and the interface are published under the GPL. The core was under a Business Source License until it converted to the GPL in 2023.",
"The contracts are verified onchain, and can be built and run locally alongside a self-hosted interface."
]
},
"privacy": {
"status": "fullyTransparent",
"points": [
"The protocol does not make privacy claims, and is fully transparent.",
"Swaps and positions are public onchain."
"Swaps and liquidity positions are public onchain."
]
},
"security": {
"sentiment": "good",
"points": [
"Every contract that holds or routes user funds is immutable, with no upgrade path.",
"No external dependency - no oracle, no bridge.",
"The core has been battle-tested at very high volume since 2021."
"Every contract that holds user funds is immutable, with no upgrade path.",
"No external dependency: no oracle, no bridge.",
"The core has secured value at very high volume since 2021."
],
"missing": [
"A governance-set protocol fee remains: currently 1/4 of LP fees per side, 1/6 on the 0.3% tier, with proceeds burned as UNI through the Firepit.",
"Per-pool token and liquidity risk stays with the user."
"additionalConsiderations": [
"Per-pool token and liquidity risk stays with the user.",
"No circuit breakers or rate limits. A faulty token only affects its own pools, but a bug in the pool code would reach all of them."
],
"notReviewed": [
"The router and approval contracts that sit outside the pools, which are assessed separately.",
"Circuit breakers and rate limits."
"The routers and approval contracts that sit outside the pools, which are assessed separately."
]
}
}