Skip to main content

Uniswap V3 Smart Contract Reference

This page documents the core smart contracts powering Uniswap V3, a decentralized exchange (DEX) protocol. It enables users to swap tokens (trade one cryptocurrency for another) and provide liquidity (deposit token pairs to earn trading fees).

Core Contract Addresses​

Mainnet (Ethereum)​

Testnet (Sepolia)​

  • SwapRouter: 0x3bFA4769FB09eefC5a80d6E87c3B9C650f7Ae48E
  • Factory: 0x0227628f3F023bb0B980b67D528571c95c6DaC1c
  • Quoter: 0xb27308f9F90D607463bb33eA1BeBb41C27CE5AB6

Key Contracts​

1. SwapRouter​

Handles token swaps with optimized gas usage and supports multi-hop trades (swaps that route through multiple tokens).

Key Functions​

  • exactInputSingle(ExactInputSingleParams params)

    • Swaps a fixed input amount of one token for as much as possible of another token.
    • Parameters:
      • tokenIn: Address of the token to swap from.
      • tokenOut: Address of the token to receive.
      • fee: The pool fee (e.g., 3000 for 0.3%).
      • recipient: Address to receive the output tokens.
      • deadline: Unix timestamp after which the transaction will revert.
      • amountIn: Exact amount of input tokens to swap.
      • amountOutMinimum: Minimum amount of output tokens to receive (slippage protection).
      • sqrtPriceLimitX96: Price limit (set to 0 for no limit).
  • exactInput(ExactInputParams params)

    • Swaps a fixed input amount through multiple pools (multi-hop swaps).

2. Factory​

Creates and manages liquidity pools for token pairs.

Key Functions​

  • createPool(address tokenA, address tokenB, uint24 fee)

    • Creates a new pool for a token pair with a specified fee tier.
    • Returns the address of the new pool.
  • getPool(address tokenA, address tokenB, uint24 fee)

    • Returns the address of the pool for a given token pair and fee.

3. Quoter​

Provides price quotes for token swaps without executing a transaction.

Key Functions​

  • quoteExactInputSingle(QuoteExactInputSingleParams params)
    • Returns the amount of output tokens for a given input amount.
    • Parameters:
      • tokenIn: Address of the input token.
      • tokenOut: Address of the output token.
      • fee: The pool fee.
      • amountIn: Amount of input tokens.
      • sqrtPriceLimitX96: Price limit (set to 0 for no limit).

Example Usage​

Getting a Price Quote (JavaScript)​

const { ethers } = require('ethers');

// Initialize provider and contract
const provider = new ethers.providers.JsonRpcProvider('YOUR_RPC_URL');
const quoterAddress = '0xb27308f9F90D607463bb33eA1BeBb41C27CE5AB6';
const quoterABI = [
'function quoteExactInputSingle(address tokenIn, address tokenOut, uint24 fee, uint256 amountIn, uint160 sqrtPriceLimitX96) external returns (uint256 amountOut)'
];
const quoter = new ethers.Contract(quoterAddress, quoterABI, provider);

// Example: Get a quote for swapping 1 ETH to USDC
async function getQuote() {
const tokenIn = '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2'; // WETH
const tokenOut = '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48'; // USDC
const fee = 3000; // 0.3% fee tier
const amountIn = ethers.utils.parseEther('1'); // 1 ETH

const amountOut = await quoter.callStatic.quoteExactInputSingle(
tokenIn,
tokenOut,
fee,
amountIn,
0 // No price limit
);

console.log(`1 ETH = ${ethers.utils.formatUnits(amountOut, 6)} USDC`);
}

getQuote().catch(console.error);

Next Steps​

Replace with real addresses and links.

ABI and source​

  • ABI (Application Binary Interface — the contract's function and event signature list): ./abi/NFTMinter.json (add to repo or link to explorer)
  • Verified source is available on the explorers linked above.

Functions​

List public/external functions with parameters and return types. Grouped logically.

Minting​

  • function mint(address to) external payable returns (uint256 tokenId)

    • Description: Mints (creates) a new NFT to to.
    • Parameters:
      • to — Recipient wallet address (the account that will own the NFT).
    • Payable: Yes, must send msg.value == mintPrice if mint price is set.
    • Returns: New tokenId.
    • Errors: MintPriceNotPaid(), MaxSupplyReached(), Paused().
  • function setMintPrice(uint256 priceWei) external

    • Description: Sets the mint price (amount of ETH required to mint).
    • Access: Owner only.
  • function setBaseURI(string calldata newBaseURI) external

    • Description: Sets the base metadata URI (the URL prefix for token metadata files).
    • Access: Owner only.

ERC-721 required functions​

  • function balanceOf(address owner) external view returns (uint256)
  • function ownerOf(uint256 tokenId) external view returns (address)
  • function safeTransferFrom(address from, address to, uint256 tokenId) external
  • function transferFrom(address from, address to, uint256 tokenId) external
  • function approve(address to, uint256 tokenId) external
  • function getApproved(uint256 tokenId) external view returns (address)
  • function setApprovalForAll(address operator, bool approved) external
  • function isApprovedForAll(address owner, address operator) external view returns (bool)
  • function tokenURI(uint256 tokenId) external view returns (string memory)

Introspection​

  • function supportsInterface(bytes4 interfaceId) external view returns (bool)
    • Returns true for IERC721 and IERC165 interface IDs.

Admin controls​

  • function pause() external

    • Description: Pauses state-changing methods (temporary stop for safety).
    • Access: Owner only.
  • function unpause() external

    • Access: Owner only.
  • function withdraw(address payable to) external

    • Description: Withdraws collected mint fees to to.
    • Access: Owner only.

Events​

Describe what is emitted and when.

  • event Transfer(address indexed from, address indexed to, uint256 indexed tokenId)
    • Standard ERC-721 event on mint/transfer/burn.
  • event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId)
  • event ApprovalForAll(address indexed owner, address indexed operator, bool approved)
  • event Minted(address indexed to, uint256 indexed tokenId, uint256 value)
    • Custom event on mint with amount of ETH paid.

Errors​

List revert reasons and when they occur.

  • MintPriceNotPaid() – Sent ETH does not equal required mint price.
  • MaxSupplyReached() – No more NFTs can be minted.
  • Paused() – State-changing calls disabled.
  • NotAuthorized() – Caller lacks required role (owner).

Deployment information​

  • Constructor parameters
    • string name, string symbol, string baseURI, uint256 maxSupply, uint256 mintPrice
  • Initialization
    • Optionally call setBaseURI after deployment.
    • Optionally grant roles if using AccessControl.
  • Upgradeability
    • If using a proxy (an upgrade mechanism), list proxy and implementation addresses.

Interface IDs​

If using ERC-165 (an interface detection standard), list supported interface IDs.

  • 0x... – ICore
  • 0x... – IController

Security notes​

  • Access control via Ownable or AccessControl.
  • Pausable for emergency stops.
  • Link to audits if available.