Integrate Uniswap V3/V4 into your dApp. Covers swap, add liquidity, remove liquidity, and SDK setup. All examples use the @uniswap/v3-sdk and @uniswap/sdk-core packages.
npm install @uniswap/v3-sdk @uniswap/sdk-core @uniswap/v3-periphery ethers # or yarn add @uniswap/v3-sdk @uniswap/sdk-core @uniswap/v3-periphery ethers
import { ethers } from "ethers";
import { Token, CurrencyAmount, Percent } from "@uniswap/sdk-core";
import { Pool } from "@uniswap/v3-sdk";
import IUniswapV3PoolABI from "@uniswap/v3-core/artifacts/contracts/interfaces/IUniswapV3Pool.sol/IUniswapV3Pool.json";
const provider = new ethers.JsonRpcProvider("https://eth-mainnet.g.alchemy.com/v2/YOUR_KEY");
const signer = new ethers.Wallet("PRIVATE_KEY", provider);
import { SwapQuoter } from "@uniswap/v3-sdk";
import { Quoter } from "@uniswap/v3-periphery";
const quoterAddress = "0xb27308f9F90D607463bb33eA1BeBb41C27CE5AB6";
const quoter = new ethers.Contract(quoterAddress, Quoter.ABI, provider);
const quote = await quoter.quoteExactInputSingle.staticCall(
tokenIn,
tokenOut,
fee,
amountIn,
0
);
import { SwapRouter } from "@uniswap/v3-periphery";
import { Trade, Route, SwapType } from "@uniswap/v3-sdk";
const swapRouter = new ethers.Contract(
"0xE592427A0AEce92De3Edee1F18E0157C05861564",
SwapRouter.ABI,
signer
);
const tx = await swapRouter.exactInputSingle({
tokenIn,
tokenOut,
fee,
recipient: userAddress,
deadline: Math.floor(Date.now() / 1000) + 60 * 20,
amountIn,
amountOutMinimum: 0,
sqrtPriceLimitX96: 0,
});
import { NonfungiblePositionManager } from "@uniswap/v3-periphery";
import { Position, nearestUsableTick } from "@uniswap/v3-sdk";
const position = new Position({
pool,
tickLower: nearestUsableTick(pool.tickCurrent, tickSpacing) - tickSpacing * 2,
tickUpper: nearestUsableTick(pool.tickCurrent, tickSpacing) + tickSpacing * 2,
liquidity: amount.mul(1000),
});
const tx = await NonfungiblePositionManager.addCallParameters(position, {
slippageTolerance: new Percent(5, 100),
recipient: userAddress,
deadline: Math.floor(Date.now() / 1000) + 60 * 20,
});
const { calldata, value } = NonfungiblePositionManager.removeCallParameters(
position,
{
tokenId,
liquidityPercentage: new Percent(100),
slippageTolerance: new Percent(5, 100),
deadline: Math.floor(Date.now() / 1000) + 60 * 20,
collectOptions: {
expectedCurrencyOwed0: CurrencyAmount.fromRawAmount(token0, 0),
expectedCurrencyOwed1: CurrencyAmount.fromRawAmount(token1, 0),
recipient: userAddress,
},
}
);
const poolContract = new ethers.Contract(poolAddress, IUniswapV3PoolABI.abi, provider);
// slot0 — sqrtPriceX96, tick, observationIndex, observationCardinality
const slot0 = await poolContract.slot0();
console.log("Tick:", slot0.tick.toString());
console.log("SqrtPriceX96:", slot0.sqrtPriceX96.toString());
// observations — TWAP
const obs = await poolContract.observations(slot0.observationIndex);
console.log("Observation timestamp:", obs.blockTimestamp.toString());
PDF with complete TypeScript examples for each operation above, including error handling, gas estimation, and multi-hop swap routing. Covers V3 and V4 alpha patterns.
Send exactly $1 in ETH or USDC (ERC-20) to:
After payment, email receipts@wontwork.dev with tx hash to get the PDF. PDF delivered within 24h.
Ecosystem