
Uniswap V3 contracts are a type of decentralized exchange (DEX) protocol on the Ethereum blockchain.
To start using Uniswap V3 contracts, you'll need to set up a wallet that supports Ethereum, such as MetaMask.
The Uniswap V3 contracts are deployed as a set of smart contracts on the Ethereum blockchain, which enables users to trade tokens directly with each other.
You can access the Uniswap V3 contracts through the Uniswap website or by using a decentralized application (dApp) wallet like MetaMask.
You might enjoy: Smart Contract Wallet
Uniswap V3 Contract Basics
The Uniswap V3 contract is a crucial part of the platform, and understanding its basics is essential for using it effectively.
The Uniswap V3 contract is based on the BaseContract, which is the foundation for all contracts.
The uniswap.v3.base module is the entry point for working with the contract, and it's where you'll find the Pool contract wrapper.
This wrapper provides a convenient way to interact with the contract, making it easier to manage the pool's data.
The Pool contract wrapper can be obtained by referring to the official documentation, specifically the UniswapV3Pool page.
Explore further: Uniswap V2 vs V3
Contract Parameters

Contract Parameters are crucial for fine-tuning the behavior of Uniswap V3 contracts.
You can adjust the maximum number of price and liquidity observations a pool stores by using the `increaseObservationCardinalityNext` method. This method is a no-op if the pool already has an observationCardinalityNext greater than or equal to the input observationCardinalityNext.
The `observationCardinalityNext` parameter is a uint16 that determines the desired minimum number of observations for the pool to store.
You can increase the observation cardinality next by providing a new value for `observationCardinalityNext`.
If this caught your attention, see: Uniswap Liquidity Pool Address
Parameters:
When defining the parameters of a contract, it's essential to understand the specific details involved.
The contract parameters include two key components: tickLower and tickUpper.
The lower tick of the range, represented by tickLower, is an integer value stored in a 24-bit signed integer type.
The upper tick of the range, represented by tickUpper, is also an integer value stored in a 24-bit signed integer type.
Here's a summary of the contract parameters:
Increase Observation Cardinality
Increasing the observation cardinality of a pool is a straightforward process that allows you to store more price and liquidity observations.
The method to increase observation cardinality is called `increaseObservationCardinalityNext`, and it takes a single parameter: `observationCardinalityNext`, which is a `uint16` type.
The `observationCardinalityNext` parameter represents the desired minimum number of observations for the pool to store.
If the pool already has an observation cardinality greater than or equal to the input `observationCardinalityNext`, this method is a no-op, meaning it doesn't do anything.
To set the initial price for the pool, you need to use a different method, but the `increaseObservationCardinalityNext` method is specifically designed to increase the maximum number of observations.
Discover more: Uniswap Usdc Liquidity Pool
Contract Functions
QuoterV2 provides price quotes for swaps without executing the swap. It uses the Uniswap v3 core, periphery contracts, and the PoolTicksCounter library.
QuoterV2 has functions to quote exact input or output amounts and handles reverts by counting initialized ticks crossed. This makes it a reliable tool for users.
SwapRouter02 executes swaps across different asset pools, considering the price of tokens, liquidity in different pools, and fees for swaps. It calculates the best price for a swap and then executes it, transferring tokens between pools and updating users' balances.
Integrating
Integrating a popular exchange like Uniswap into your smart contract can be a game-changer for your users. You can add the option for them to pay in ETH, which can be automatically converted into DAI before the actual logic.
To integrate Uniswap v3, you'll need to use the SwapRouter contract, which has several safety mechanisms and convenience functions. You can instantiate it using ISwapRouter(0xE592427A0AEce92De3Edee1F18E0157C05861564).
The SwapRouter will handle the conversion of ETH to WETH, which is ETH wrapped as ERC-20. This is a crucial step, as Uniswap has no direct ETH pairs.
The exactOutputSingle function is used to swap ETH for an exact amount of tokens, with any leftover ETH being refunded. Don't forget to call uniswapRouter.refundETH() after a swap, and make sure you have a fallback function in your contract to receive ETH.
Here's a summary of the key components:
- Swap Router: Use ISwapRouter(0xE592427A0AEce92De3Edee1F18E0157C05861564) for main or testnet
- WETH: Use ETH wrapped as ERC-20
- exactOutputSingle: Swap ETH for an exact amount of tokens, with refund
- Refund: Call uniswapRouter.refundETH() after a swap
- Fee: Use a non-stable, but popular pair fee of 0.3%
- sqrtPriceLimitX96: Set to 0 to ignore limits on pool prices
ExactInput vs ExactOutput
When trading on Uniswap, you can choose between two types of swaps: ExactInput and ExactOutput. The main difference between them is the way they handle excess funds.
ExactOutput swaps allow you to receive a specific amount of tokens in return for your input, with any excess funds being refunded to you. For example, if you trade 1 ETH for DAI on Uniswap, you'll receive 100 DAI, and any excess ETH will be refunded to you.
ExactInput swaps, on the other hand, allow you to receive as much of the desired token as possible in return for your input, without specifying the exact amount. This means that if you trade 1 ETH for DAI, you might receive 196 DAI, but you won't receive any excess ETH back.
The choice between ExactInput and ExactOutput depends on your trading strategy and goals. If you want to receive a specific amount of tokens and don't mind getting some of your input back, ExactOutput might be the better choice. If you want to maximize the amount of tokens you receive and don't care about getting some of your input back, ExactInput might be the way to go.
Here's a summary of the key differences between ExactInput and ExactOutput swaps:
Collect

The Collect function is a crucial part of managing your positions. It collects tokens owed to a position.
To use Collect, you'll need to call it from the position owner's address. This is a requirement, not an option.
You can specify the recipient address to receive the collected fees. This is a straightforward process, but make sure you get it right.
The Collect function has several parameters to consider. Here's a breakdown of what they mean:
You can withdraw either token0 or token1, or both. To withdraw all tokens owed, you can pass a value greater than the actual tokens owed, like type(uint128).max.
Swap
The Swap function is a crucial part of the Uniswap protocol, allowing users to exchange one token for another. It's a simple yet powerful tool that can be used in a variety of ways.
The Swap function can be used to swap token0 for token1, or token1 for token0. This is done using the exactInput and exactOutput functions, which take a path as a parameter. The path is bytes-encoded data that represents the token addresses.
Recommended read: When Was the Uni Token by Uniswap Launched
The Swap function can also be used to determine limits on the pool prices that cannot be exceeded by the swap. This is done using the sqrtPriceLimitX96 parameter, which can be set to 0 to ignore this limit.
Here's a breakdown of the parameters used in the Swap function:
The recipient address is where the output of the swap will be sent, the zeroForOne parameter determines the direction of the swap, and the amountSpecified parameter determines the amount of the swap. The sqrtPriceLimitX96 parameter determines the limit on the pool prices, and the data parameter is any additional data that needs to be passed through to the callback.
The Swap function can be used in a variety of ways, including to swap tokens for users, to add additional payment options for users of your own contracts, and to execute swaps across different asset pools.
Protocol Settings
The Uniswap V3 contracts offer a range of protocol settings that can be adjusted to suit different use cases.
The minimum tick size is 10**-18, which allows for high precision trading. This is particularly useful for trading small amounts of tokens.
The maximum tick size is 10**-18, but the minimum and maximum tick sizes can be adjusted by the liquidity providers.
The fee tier structure consists of three tiers: 0.05%, 0.30%, and 0.60%, with the fee increasing as the liquidity provider's tick value increases.
Discover more: Uniswap Liquidity Pool
Set Fee Protocol
Setting the fee protocol is a crucial step in managing your pool's liquidity and efficiency. You can adjust the protocol fee for each token in the pool using the `setFeeProtocol` function.
The `feeProtocol0` and `feeProtocol1` variables determine the new protocol fee for token0 and token1, respectively. These fees are set using `uint8` type values, which is a standard way to represent unsigned 8-bit integers.
Here's a breakdown of the fee protocol settings:
By setting the fee protocol, you can optimize your pool's performance and reduce the risk of impermanent loss for liquidity providers.
CollectProtocol

Collecting protocol fees is a crucial part of maintaining a pool's liquidity. The CollectProtocol function allows you to collect these fees.
The protocol fee is accrued to the pool and can be collected in both token0 and token1. The amount of each token that can be collected is determined by the amounts requested.
You can specify the address to which the collected protocol fees should be sent. The maximum amount of token0 to send can be set to 0, allowing you to collect fees in only token1. Similarly, the maximum amount of token1 to send can be set to 0, allowing you to collect fees in only token0.
Here's a summary of the parameters involved:
The function returns the protocol fee collected in token0 and token1. The amounts are represented as uint128 values.
The protocol fee collected in token0 is stored in the variable amount0. The protocol fee collected in token1 is stored in the variable amount1.
Contract Deployment
To deploy the Uniswap v3 contracts, you'll need to get the "v3-deploy repo" and clone it into your local system. The repo collects all the contracts that make up the v3 protocol and provides scripts to deploy them easily.
You'll need to run a command that requires several arguments, including a private key, JSON RPC URL, WETH9 address, native currency label, and confirmations. If you're using a L2 with instant soft finality, select "0" for confirmations.
The owner address you use will control the UniswapV3Factory contracts owner privileges and the ownership of the proxy contract for NonfungibleTokenPositionDescriptor. You can choose an address to be the admin, a DAO address, or the Uniswap DAO to control the parameters.
Discover more: Ethereum Contract Address
Deploy the Suite
Deploying the Uniswap v3 suite is a straightforward process that can be automated using the official repository. The repository contains a CLI script that deploys the latest Uniswap v3 smart contracts to any EVM-compatible network.
Take a look at this: Uniswap V3

To get started, you'll need to clone the repository and run the script with the required arguments. This includes a private key, JSON RPC URL, WETH9 address, native currency label, and confirmations.
The script will deploy the full Uniswap v3 AMM suite on the specified network, and you'll see the contracts being deployed with some ownership being transferred.
Here's a summary of the required arguments:
If you're deploying Uniswap to a new chain, you'll need to specify the Uniswap DAO or a DAO on a different layer to control the parameters. The script will handle the rest, and you'll end up with a state.json file that holds the deployed addresses.
Factory
The UniswapV3Factory contract is the central hub for all Uniswap v3 pools. It allows users to create new pools, query information about existing pools, and add or remove liquidity from pools.
This contract is responsible for managing the protocol fees for all Uniswap v3 pools. It's a crucial component of the Uniswap ecosystem.

The UniswapV3Factory contract enables users to create new pools with specific parameters, such as the token pair and the fee tier. This allows for flexibility and customization in the creation of new pools.
Users can query information about existing pools, including their liquidity levels and trading activity. This information can be useful for investors and traders looking to make informed decisions.
The UniswapV3Factory contract plays a vital role in the Uniswap protocol, facilitating the creation, management, and maintenance of Uniswap v3 pools.
Contract Components
The NonfungiblePositionManager contract helper class is a crucial component of the Uniswap v3 contracts. It provides a way to interact with the NonfungiblePositionManager contract, which is responsible for managing non-fungible positions in the liquidity pool.
The NonfungiblePositionManager contract helper class takes in several parameters, including the Ethereum client, address of the NonfungiblePositionManager contract, and the path to the ABI of the contract.
Here are the parameters that can be passed to the NonfungiblePositionManager contract helper class:
- client (EtherClient) – Ethereum client
- address (eth_typing.ChecksumAddress) – Address of NonfungiblePositionManager
- abi_path (str, optional, default="../utils/abis/nft_position_manager.abi.json") – Path to json with ABI of the contract.
These parameters are used to interact with the NonfungiblePositionManager contract and perform various operations, such as creating a new position, topping up an existing position, and decreasing liquidity.
Models

The Models module is a helper dataclass for the Multicall2. It's a crucial component for working with Uniswap contracts.
The Uniswap.v3.models module is used to represent the current state of a liquidity pool. This dataclass is essential for creating and managing positions in the Uniswap protocol.
To work with the Multicall2, you can use the PoolData model, which stores the current state of a liquidity pool. This includes the pool's tick spacing, fee tier, and other relevant information.
Here's a summary of the PoolData model:
Staker
The UniswapV3Staker contract is a peripheral contract in the Uniswap v3 protocol.
It allows users to stake their ERC-20 tokens in Uniswap v3 pools to earn rewards.
The rewards are paid out as the pool's native token.
This incentivizes liquidity provision, making the protocol more decentralized and efficient.
The UniswapV3Staker contract helps ensure there is always enough liquidity in Uniswap v3 pools to facilitate swaps.
By staking their tokens, users can earn rewards, which encourages more liquidity provision.
This is critical to the Uniswap v3 protocol, as it helps maintain a healthy and functioning ecosystem.
What's New and Integration
Uniswap v3 contracts have made it easier to integrate Uniswap into your own smart contracts. This allows users to pay with multiple tokens, increasing flexibility and convenience.
One of the most significant changes in Uniswap v3 is the way it handles token pairs. In Uniswap v3, all ETH pairs must be converted to WETH (wrapped ETH) first. This is done automatically by the Swap Router.
The Swap Router is a wrapper contract provided by Uniswap that has several safety mechanisms and convenience functions. You can instantiate it using ISwapRouter(0xE592427A0AEce92De3Edee1F18E0157C05861564) for any main or testnet.
To use the Swap Router, you'll need to call the exactOutputSingle function, which takes several parameters, including the token addresses, the amount of tokens to receive, and a deadline to prevent miners from withholding a swap.
Here are the parameters you'll need to pass to the exactOutputSingle function:
After the trade is finished, you'll need to refund any leftover ETH to the user. This sends out all ETH from the contract, so make sure to change this if your contract has an ETH balance for other reasons.
Sources
- https://soliditydeveloper.com/uniswap3
- https://docs.uniswap.org/contracts/v3/reference/core/UniswapV3Pool
- https://bobanetwork.medium.com/deploying-uniswap-v3-a-developers-guide-to-navigating-the-complexities-269dde21bff6
- https://uniswap-v3.readthedocs.io/en/latest/uniswap.v3.html
- https://docs.chainstack.com/docs/scroll-tutorial-deploy-the-uniswap-v3-smart-contracts-on-scroll
Featured Images: pexels.com