Uniswap V3

Stage 2
Website

Protocol Decentralization

Stage 0
Stage 1
Stage 2

Risk Areas

Chain
Upgrades
Autonomy
Exit Window
Access

Summary

Uniswap v3 is an AMM that builds upon Uniswap v2 by introducing a concentrated liquidity model, providing liquidity providers with granular control over capital allocation. Unlike v2, where liquidity is distributed uniformly across all price ranges, v3 allows LPs to specify custom price ranges in which their liquidity is active. This approach significantly improves capital efficiency, as LPs can concentrate their assets in high-demand price ranges, earning fees only within those specified ranges. Uniswap v3 also introduces multiple fee tiers (0.01%, 0.05%, 0.3%, and 1%) to support different asset volatility profiles, allowing LPs to adjust their fee preferences based on expected risk and return. Additionally, it incorporates "range orders," which effectively turn liquidity positions into limit orders, further enhancing LP strategy flexibility. The protocol is deployed across multiple chains enabling a wide range of use cases across decentralized finance (DeFi) applications.

Ratings

Chain

Uniswap v3 is deployed on various chains. This review is based on the Ethereum mainnet deployment of the protocol.

Chain score: Low

Upgradeability

The Uniswap DAO can change parameters such as fees through the GorvernorBravoDelegator contract. Apart from the fees set by the governance, the protocol's contracts are immutable. No party is able to pause, revert trade execution, or otherwise change the behavior of the protocol.

No User funds nor unclaimed yield are affected by the remaining permissions.

Note that a TransparentProxy with the DAO as admin is used for the NonFungibleTokenPositionDescriptor, which is used for token descriptions. However, this does not impact user funds or otherwise materially change the expected performance of the protocol.

Upgradeabillity score: Low

Autonomy

There are no particular dependencies for the Uniswap protocol.

Autonomy score: Low

Exit Window

No "Medium" or "High" risk permissions are found in the protocol that require protection with an Exit Window, but parameters such as protocol fees can be changed by the DAO. Note that the permissions controlled by the DAO are protected with a 1-week on-chain voting window and 2 to 30 days Exit Window for approved updates.

Exit score: Low

Accessibility

Uniswap is accessible through multiple frontends. Uniswap offers main access through their main deployment: https://app.uniswap.org/. In addition to that, the frontend app is also hosted on IPFS see here https://github.com/Uniswap/interface/releases. Further details on the maintenance and access of the interface hosted on IPFS can be found here. Additionally, users are offered the possibility to self host the frontend from here: https://github.com/Uniswap/interface.

Accessibility score: Low

Conclusion

The Uniswap V3 deployment on Ethereum Mainnet achieves Low centralization risk score for its Upgradeability, Autonomy, Exit Window and Exit Window dimensions. It thus ranks Stage 2.

Overall score: Stage 2

Reviewer Notes

There were no particular discoveries made during the analysis of this protocol.

Protocol Analysis

An overview of the contracts in Uniswap V3 can be found below. Users can interact through the routers or Multicall contracts, as well as interact with the pools directly. UNI token holders may vote in the governance, which can enable fees for specific pools, collect the fees, or upgrade the NFTPositionDescriptor contract, which is used for token descriptions. Anyone can create new pools.

Overview of Uniswap V3

Dependencies

No external dependency has been found.

Governance

Security Council

On-chain governance is in place without security council.

NameAccountType≥ 7 signers≥ 51% threshold≥ 50% non-insiderSigners public
GovernorBravoDelegator (DAO)0x408ED6354d4973f66138C91495F2f2FCbd8724C3ContractN/AN/AN/AN/A
TimeLock0x1a9C8182C09F50C8318d769245beA52c32BE35BCContractN/AN/AN/AN/A

Exit Window

As the contracts are immutable the users can always withdraw their funds, but parameters such as protocol fees can be changed by the DAO. A Timelock protects the contracts and updates are governed by the GovernorBravoDelegator contract. The lock period is at least two days and up to 30 days for governance actions. When a proposal is created (at least 2.5M Uni), the community can cast their votes during a 3 day voting period. If a majority, and at least 4M votes are cast for the proposal, it is queued in the Timelock, and may be executed in a minimum of 2 days.

Contracts & Permissions

Contracts

All Permission Owners

NameAccountType
ProxyAdmin0xB753548F6E010e7e680BA186F9Ca1BdAB2E90cf2Contract
GovernorBravoDelegator (DAO)0x408ED6354d4973f66138C91495F2f2FCbd8724C3Contract
TimeLock0x1a9C8182C09F50C8318d769245beA52c32BE35BCContract

Permissions

ContractFunctionImpactOwner
UniswapV3FactorysetOwnerChanges the owner to a new address. The DAO can appoint a new owner which can set fees on various pools (setProtocolFee), collect fees on behalf of the protocol and allow new tick spaces for new deployed pools.TimeLock
UniswapV3FactoryenableFeeAmountEnables the creation of new fee tiers for pools by enabling a specific fee amount paired with a corresponding tick spacing.TimeLock
UniswapV3PoolsetFeeProtocolAllows the owner to set a fee percentage that is deducted from the LPs fees. It only affects the pool where the function is called. The fee is required to be less than 10% of the total accumulated fees. It only affects future accumulated fees.TimeLock
UniswapV3PoolcollectProtocolWithdraws the accumulated protocol fees to a custom address. The DAO triggers the withdraw and specifies the address.TimeLock
ProxyAdminrenounceOwnershipAbandons ownership of the contract. The DAO would renounce the access to the administrative functions of the contracts, which includes upgrading the NonFungibleTokenPositionDescriptor contract.TimeLock
ProxyAdminchangeProxyAdminUpdates the admin of the TransparentUpgradeableProxy: the account with the rights to upgrade the proxy's implementation. This would replace the role of the ProxyAdmin contract and could be used to upgrade (replace) ProxyAdmin.TimeLock
ProxyAdmintransferOwnershipUpdates the owner of the ProxyAdmin contract: the account with the rights to change the admin of the proxy and upgrade the NonFungibleTokenPositionDescriptor contract.TimeLock
ProxyAdminupgradeTriggers the upgrade of the NonFungibleTokenPositionDescriptor contract which allows to change the token descriptions.TimeLock
ProxyAdminupgradeAndCallTriggers the upgrade of the NonFungibleTokenPositionDescriptor contract which allows to change the token descriptions and then call a function in the new contract.TimeLock
TransparentUpgradeableProxychangeAdminUpdates the proxy's admin: the account with the rights to upgrade the proxy's implementation. This would replace the role of the ProxyAdmin contract and could be used to upgrade (replace) ProxyAdmin.ProxyAdmin
TransparentUpgradeableProxyupgradeToUpgrades the NonFungibleTokenPositionDescriptor contract which allows to change the token descriptions.ProxyAdmin
TransparentUpgradeableProxyupgradeToAndCallUpgrades the NonFungibleTokenPositionDescriptor contract which allows to change the token descriptions and then call a function in the new contract.ProxyAdmin
TimeLockqueueTransactionQueues a transaction that can be executed once a delay (between 2 and 30 days) has passed. This can impact the own TimeLock's settings (change admin, set delays) or interaction with any other contract the TimeLock has permissions on.GovernorBravoDelegator (DAO)
TimeLockcancelTransactionCancels a pending transaction and removes it from the queue. This allows the DAO to cancel one of its own decision before it is executed.GovernorBravoDelegator (DAO)
TimeLockexecuteTransactionExecutes a transaction that was previously queued, if the corresponding delay has passed.GovernorBravoDelegator (DAO)
GovernorBravoDelegator_setImplementationUpdates the implementation of the GovernorBravo (DAO) contract. Can only be triggered by the DAO itself. The new contract would inherit all the DAO permissions mentioned above.TimeLock
GovernorBravoDelegate_setPendingAdminSet a new address for the admin of the GovernorBravo. The new appointed admin has to call _acceptAdmin before the transfer of admin rights is final.TimeLock
GovernorBravoDelegate_acceptAdminA newly appointed admin of the Governor has to call _acceptAdmin.only Pending Admin (assigned via setPendingAdmin), currently 0-address