MAINNETBETA

uniswap.org

3.7LOWmedium
—6 sectionsrun #2
Findings1 critical7 high19 medium3 low
DEPGOVTKNAUDCTR
Last analyzed 3mo ago runs

Summary

Uniswap is the largest decentralized exchange by usage, with ~$2.9B TVL across 50+ chains and a seven-year track record of zero confirmed exploits in core v2/v3/v4 AMM contracts despite $2T+ cumulative volume. Ethereum mainnet admin actions route through UNI token voting, GovernorBravo, and a verified 2-day Timelock; core swap logic is immutable and heavily audited, including six tier-1 v4 reviews and a $15.5M Cantina bug bounty. The primary gap between marketing and on-chain reality is cross-chain governance: L2 v3/v4 factory and PoolManager admins do not answer to UNI holders—most critically, Arbitrum v4 is controlled by a single EOA with no timelock or multisig. Overall risk is low-to-moderate (3.7/10), driven by governance centralization on L2s, not by core contract fragility on Ethereum.

Trust Assumptions

Users must trust that (1) immutable core swap contracts on each chain match audited source and have not been replaced by unverified bytecode—two in-scope contracts (Ethereum SwapRouter02, Arbitrum V3Factory) currently block that assurance; (2) on Ethereum, UNI governance and the 2-day Timelock will not pass proposals that harm LPs or redirect fees maliciously, despite ~272M UNI (~27% of max supply) sitting in the Timelock treasury; (3) on Arbitrum, Base, Optimism, and Polygon, chain-local admins—especially the Arbitrum EOA 0x2BAD…46CD—will not abuse owner privileges over v3 fee tiers and v4 protocol-fee controllers; (4) swappers verify pool hook contracts before interacting with v4 pools, since permissionless hooks can alter swap amounts; and (5) users manage Permit2 and router approvals carefully, as phishing and third-party router abuse have caused ~$8M+ in user-side losses without compromising Uniswap core.

What Could Go Wrong

Compromise or misuse of the Arbitrum admin EOA could immediately reassign v4 PoolManager ownership or protocol-fee controllers on a chain holding significant liquidity—no UNI vote, no 2-day delay, no multisig co-signing required. A user swapping through a v4 pool with a malicious or buggy third-party hook could lose funds even though PoolManager core math is audited; Cork Protocol lost ~$12M via a hook exploit in May 2025. UNI governance capture or aggressive treasury deployment (~272M UNI in Timelock, top-10 holders at ~52%) could approve unfavorable fee changes, a 20M UNI/year growth budget that outpaces programmatic burns, or governance-logic upgrades via the GovernorBravo delegator proxy—each affecting value accrual and LP economics. Finally, unverified SwapRouter02 bytecode on Ethereum and unaudited per-chain deployments across 46+ networks create a deployment-equivalence blind spot where deployed logic may diverge from audited repositories.

Recommendation

Uniswap is suitable for substantial swap and LP exposure on Ethereum mainnet, where admin paths are Timelock-gated and core contracts are battle-tested. Treat Arbitrum and other L2 deployments as materially higher governance risk until admins are verified multisigs or bridged to Ethereum Timelock control—avoid large LP positions on Arbitrum v4 specifically while a single EOA holds PoolManager owner. Never interact with v4 pools without independently verifying hook contract source and behavior; prefer established pools with no hooks or audited hook implementations. Monitor UNI governance proposals (fee switches, treasury spend, GovernorBravo implementation changes), Certora M-02 status in v4, and Etherscan verification of SwapRouter02 and Arbitrum V3Factory. UNI holders should be cautious about treasury concentration and modest net inflation from the 2026 growth budget. Retail users should treat all Uniswap-branded airdrops and approval prompts as phishing until verified on official channels.

Key Findings (30)

critical
Arbitrum v4 PoolManager Owned by EOAaccess-control
▼
high
Arbitrum V3Factory Admin Controlled by EOAaccess-control
▼
high
Unverified SwapRouter02 on Ethereumverification
▼
high
Unverified UniswapV3Factory on Arbitrumverification
▼
high
L2 Deployments Not Controlled by Ethereum UNI Timelockcross-chain
▼
high
Arbitrum Admin Is a Single EOAcentralization
▼
high
v4 Permissionless Hooks Alter Swap Behaviorprotocol
▼
high
Two In-Scope Contracts Are Unverified and Cannot Be Auditedverification-gap
▼
medium
Cross-Chain Governance Divergenceaccess-control
▼
medium
GovernorBravo Delegator Proxy Patternupgradability
▼
medium
v4 PoolManager Owner Can Set Protocol Fee Controlleraccess-control
▼
medium
v4 Flash Accounting Requires External Reentrancy Disciplinearchitecture
▼
medium
GovernorBravo Implementation Is Upgradeableupgradeability
▼
medium
High Holder and Treasury Concentrationconcentration
▼
medium
Net Inflation After UNIfication Growth Budgetemission
▼
medium
Governance Power Concentrated Among Few Delegatesgovernance
▼
medium
Value Accrual Improved but Still Governance-Heavyutility
▼
medium
LP Revenue Share Reduced by Protocol Feesincentives
▼
medium
Internal TWAP Oracle Exposed to External Integratorsoracle
▼
medium
Permit2 Shared Approval Layerprotocol
▼
medium
Multi-Chain Admin Fragmentationgovernance
▼
medium
Non-Standard Token Integration Risktoken
▼
medium
Certora M-02 Tick/Price Invariant Acknowledged but Not Fixedaudit-gap
▼
medium
Multi-Chain Deployments Lack Per-Chain Bytecode Verificationaudit-gap
▼
medium
Draft v4 Audit Reports with Incomplete Fix Verificationaudit-gap
▼
medium
April 2020 — Uniswap v1 ERC777/imBTC Reentrancy (~$1.1M)incident
▼
medium
July 2022 — Phishing Campaign Impersonating Uniswap (~$8M)incident
▼
low
V2Factory feeToSetter Held by Timelockaccess-control
▼
low
Undeployed Contract Addresses on Several Chainsdeployment
▼
low
v4 Protocol Fee Controller Unset on Mainnetconfiguration
▼

Analysis Sections

Ethereum mainnet Uniswap is governed by on-chain UNI token voting through GovernorBravo and a 2-day Timelock (verified on-chain). Core v2/v3 pool contracts are immutable after deployment; v4 PoolManager ownership on mainnet sits with the Timelock. However, cross-chain governance is materially weaker: L2 v3/v4 factory and PoolManager admins are chain-specific addresses that do not route through Ethereum UNI governance—most critically, Arbitrum v3/v4 admin is an EOA (0x2BAD…46CD). Permit2 and Universal Router are immutable with no admin. Overall: credible DAO on mainnet, but L2 admin centralization is the primary governance risk.

Findings (8)

highL2 Deployments Not Controlled by Ethereum UNI Timelock

Uniswap v3 Factory and v4 PoolManager ownership on Arbitrum, Base, and Optimism uses chain-local admin addresses rather than the Ethereum Timelock (0x1a9C…35BC). On Arbitrum, both V3OpenFeeAdapter.owner and V4 PoolManager.owner resolve to EOA 0x2BAD8182C09F50c8318d769245beA52C32Be46CD (code length 0, nonce 8). On Base and Optimism, admins are small unverified contracts (~2840 bytes) with no Gnosis Safe interface. These admins can call owner-only functions such as enableFeeAmount (v3) and setProtocolFeeController/transferOwnership (v4) without UNI holder votes or a timelock delay.

on-chain RPC (Arbitrum)— V3Factory.owner()=0xFF7aD5dA31fECdC678796c88B05926dB896b0699 → V3OpenFeeAdapter.owner()=0x2BAD8182C09F50c8318d769245beA52C32Be46CD (EOA); V4 PoolManager.owner()=0x2BAD8182C09F50c8318d769245beA52C32Be46CD
on-chain RPC (Base)— V3OpenFeeAdapter.owner()=0x31FAfd4889FA1269F7a13A66eE0fB458f27D72A9; V4 PoolManager.owner()=0x31FAfd4889FA1269F7a13A66eE0fB458f27D72A9 (contract, not Timelock)
on-chain RPC (Optimism)— V3OpenFeeAdapter.owner()=0xa1dD330d602c32622AA270Ea73d078B803Cb3518; V4 PoolManager.owner()=0xa1dD330d602c32622AA270Ea73d078B803Cb3518 (contract, not Timelock)
highArbitrum Admin Is a Single EOA

The Arbitrum deployment admin 0x2BAD8182C09F50c8318d769245beA52C32Be46CD has no contract code, is not a Gnosis Safe (getOwners/getThreshold revert), and holds owner privileges over both v3 fee-tier configuration (via V3OpenFeeAdapter) and v4 PoolManager ownership. Compromise of this key enables immediate admin actions with no on-chain delay or multisig co-signing.

on-chain RPC (Arbitrum)— 0x2BAD8182C09F50c8318d769245beA52C32Be46CD: code=0, nonce=8, Safe calls revert
mediumGovernorBravo Implementation Is Upgradeable

GovernorBravo uses a delegator/proxy pattern. _setImplementation is restricted to admin (the Timelock), meaning governance logic can be swapped via a successful UNI vote + timelock execution. Current implementation: 0x53a328F4086d7C0F1Fa19e594c9b842125263026. This is expected for Compound-style governors but represents a governance-controlled upgrade surface.

contract source— require(msg.sender == admin) on _setImplementation; admin set to Timelock
on-chain RPC (Ethereum)— GovernorBravo.implementation()=0x53a328F4086d7C0F1Fa19e594c9b842125263026, admin()=Timelock
lowv4 Protocol Fee Controller Unset on Mainnet

Ethereum v4 PoolManager.protocolFeeController() returns address(0). Protocol fee collection on v4 is not yet activated; when set, only the PoolManager owner (Timelock on mainnet) can assign the controller.

on-chain RPC (Ethereum)— PoolManager.protocolFeeController()=0x0000000000000000000000000000000000000000
infoVerified 2-Day Timelock on Ethereum Mainnet

The Uniswap Timelock (0x1a9C8182C09F50C8318d769245beA52c32BE35BC) has delay=172800 seconds (2 days), GRACE_PERIOD=14 days, MINIMUM_DELAY=2 days, MAXIMUM_DELAY=30 days. Timelock.admin is GovernorBravo; pendingAdmin is zero. Governance-proposed actions queue through this delay before execution.

on-chain RPC (Ethereum)— Timelock.delay()=172800, admin()=0x408ED6354d4973f66138C91495F2f2FCbd8724C3, GRACE_PERIOD=1209600
contract source— Timelock MINIMUM_DELAY=2 days, MAXIMUM_DELAY=30 days, GRACE_PERIOD=14 days
infoOn-Chain GovernorBravo with UNI Token Voting

GovernorBravo (0x408ED6354d4973f66138C91495F2f2FCbd8724C3) is wired to the Timelock and UNI token. Verified parameters: votingDelay=13140 blocks (~1.8 days), votingPeriod=40320 blocks (~5.6 days), proposalThreshold=1,000,000 UNI, quorumVotes=40,000,000 UNI. Governor.admin is the Timelock (mutual admin pattern with Compound-style governance).

on-chain RPC (Ethereum)— votingDelay=13140, votingPeriod=40320, proposalThreshold=1e24, quorumVotes=4e25, timelock()=0x1a9C8182C09F50C8318d769245beA52c32BE35BC, admin()=0x1a9C8182C09F50C8318d769245beA52c32BE35BC
infoMainnet Core Admin Roles Route to Timelock

On Ethereum, v2 Factory feeToSetter, v4 PoolManager owner, and UNI minter all resolve to the Timelock. V3 Factory owner is V3OpenFeeAdapter (0xf2371551Fe3937Db7c750f4DfABe5c2fFFdcBf5A), whose owner() is the Timelock—adding an indirection layer but preserving DAO control for fee-tier enablement.

on-chain RPC (Ethereum)— V2 feeToSetter=0x1a9C…35BC; V4 owner=0x1a9C…35BC; UNI minter=0x1a9C…35BC; V3OpenFeeAdapter.owner()=0x1a9C…35BC
Etherscan— 0xf2371551Fe3937Db7c750f4DfABe5c2fFFdcBf5A verified as V3OpenFeeAdapter
infoIndividual Pool Contracts Are Immutable After Deployment

Uniswap v2 pairs and v3 pools have no admin keys after creation—liquidity cannot be seized via factory ownership. Factory owners can only enable new fee tiers (v3) or set protocol fee recipients (v2). v4 uses a singleton PoolManager where owner controls protocol fee settings but not existing LP balances. Permit2 and Universal Router have no owner/admin functions.

contract source— V3 enableFeeAmount requires msg.sender == owner; individual UniswapV3Pool has no owner/admin

Governance Checklist

✓
On-chain token voting (UNI + GovernorBravo)— 40M UNI quorum, 1M UNI proposal threshold
✓
Timelock on mainnet admin actions— 2-day delay, 14-day grace period (verified on-chain)
✗
Multisig (not EOA) for admin keys— No Gnosis Safe detected; Arbitrum admin is EOA
✗
Consistent cross-chain governance— L2 admins differ from Ethereum Timelock
✓
Core pool contracts immutable— v2/v3 pools have no post-deploy admin
✓
Governance only on Ethereum— UNI/Timelock/GovernorBravo exist only on mainnet

Key Governance Entities (Ethereum Mainnet)

tokenethereumUNI Token
governanceethereumGovernorBravo
timelockethereumTimelock
adapterethereumV3OpenFeeAdapter

Cross-Chain Admin Comparison

ChainV3 AdminV4 PoolManager OwnerMatches ETH Timelock
EthereumV3OpenFeeAdapter → TimelockTimelock (0x1a9C…35BC)Yes
ArbitrumV3OpenFeeAdapter → EOA 0x2BAD…46CDEOA 0x2BAD…46CDNo
BaseV3OpenFeeAdapter → 0x31FA…72A90x31FA…72A9 (contract)No
OptimismV3OpenFeeAdapter → 0xa1dD…35180xa1dD…3518 (contract)No
Loading dependency graph…