AMM DEX Development on Uniswap V2/V3 with Audit

When we took on the first AMM DEX for a DeFi client, a miscalculation of price impact led to a $50k loss within an hour. Since then, we double-check every formula and rely only on battle-tested patterns. Building an AMM DEX is not just writing a smart contract—it's a complex system: pricing math, ME

Blockchain Development Services

Frequently Asked Questions

Latest works

  • image_website-b2b-advance_0.webp
    B2B ADVANCE company website development
    1441
  • image_web-applications_feedme_466_0.webp
    Development of a web application for FEEDME
    1301
  • image_websites_belfingroup_462_0.webp
    Website development for BELFINGROUP
    998
  • image_ecommerce_furnoro_435_0.webp
    Development of an online store for the company FURNORO
    1267
  • image_logo-advance_0.webp
    B2B Advance company logo design
    713
  • image_crm_enviok_479_0.webp
    Development of a web application for Enviok
    1003

When we took on the first AMM DEX for a DeFi client, a miscalculation of price impact led to a $50k loss within an hour. Since then, we double-check every formula and rely only on battle-tested patterns. Building an AMM DEX is not just writing a smart contract—it's a complex system: pricing math, MEV protection, pool economics, and UX. In this article, we break down how to build a DEX from scratch: from the constant product formula to mainnet deployment. We've already delivered DEXs for 10+ projects, with total value locked exceeding $50M. Our experience spans Ethereum, Arbitrum, Polygon, and BNB Chain. If you're planning your own DEX launch, you'll need more than code—you need market-making and security expertise. Here we share practical solutions.

Why the Constant Product Formula is Still Relevant

AMM (Automated Market Maker) replaces the traditional order book with a mathematical formula. Uniswap V2 popularized x * y = k—the product of reserves remains constant. The price of token X in units of Y is price = y / x. During a swap, the trader contributes Δx and receives Δy, accounting for a 0.3% fee. Price impact—the price shift—is directly proportional to the trade size relative to the pool. This is fundamental: large orders get poor pricing in small pools.

The formula with fee: Δy = y * Δx * (1 - fee) / (x + Δx * (1 - fee)). Despite its simplicity, it's inefficient for assets with the same price (stablecoins). That's where Curve's hybrid formula comes in.

Price Impact Calculation Example

If pool reserves are 1000 USDC and 1 ETH, the ETH price is 1000 USDC. A swap of 100 USDC (Δx=100) gives: Δy = 1 * 100 * 0.997 / (1000 + 100*0.997) ≈ 0.0907 ETH. Price impact = (1000 / 0.0907) - 1100? ≈ 1.6%.

How Concentrated Liquidity Changes Capital Efficiency

Uniswap V3 introduced concentrated liquidity: LPs specify a price range [Pa, Pb]. Outside that range, liquidity is inactive. Formulas: x = L * (1/√P - 1/√Pb), y = L * (√P - √Pa). Capital efficiency increases 100-4000x for stablecoin pairs, but LPs face a more complex impermanent loss.

Parameter Uniswap V2 Uniswap V3
Formula x*y=k concentrated liquidity
Capital efficiency 1x up to 4000x
Impermanent loss standard depends on range
Gas per swap ~100k ~150k

AMM DEX Smart Contract Architecture

A typical architecture consists of Factory, Pair (Pool), and Router contracts. The Factory creates pools via CREATE2:

contract AmmFactory { mapping(address => mapping(address => address)) public getPair; function createPair(address tokenA, address tokenB) external returns (address pair) { require(tokenA != tokenB, "IDENTICAL_ADDRESSES"); (address token0, address token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA); require(token0 != address(0), "ZERO_ADDRESS"); require(getPair[token0][token1] == address(0), "PAIR_EXISTS"); bytes memory bytecode = type(AmmPair).creationCode; bytes32 salt = keccak256(abi.encodePacked(token0, token1)); assembly { pair := create2(0, add(bytecode, 32), mload(bytecode), salt) } IAmmPair(pair).initialize(token0, token1); getPair[token0][token1] = pair; getPair[token1][token0] = pair; } } 

The Pair contract is the core: it stores reserves, issues LP tokens, executes swaps with optimistic transfer and invariant check. The flash loan pattern is embedded via callback:

function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external lock { (uint112 _reserve0, uint112 _reserve1,) = getReserves(); if (amount0Out > 0) _safeTransfer(_token0, to, amount0Out); if (amount1Out > 0) _safeTransfer(_token1, to, amount1Out); if (data.length > 0) IUniswapV2Callee(to).uniswapV2Call(msg.sender, amount0Out, amount1Out, data); uint balance0 = IERC20(_token0).balanceOf(address(this)); uint balance1 = IERC20(_token1).balanceOf(address(this)); uint amount0In = balance0 > _reserve0 - amount0Out ? balance0 - (_reserve0 - amount0Out) : 0; uint amount1In = balance1 > _reserve1 - amount1Out ? balance1 - (_reserve1 - amount1Out) : 0; require(amount0In > 0 || amount1In > 0, "INSUFFICIENT_INPUT_AMOUNT"); uint balance0Adjusted = balance0 * 1000 - amount0In * 3; uint balance1Adjusted = balance1 * 1000 - amount1In * 3; require(balance0Adjusted * balance1Adjusted >= uint(_reserve0) * _reserve1 * 1000**2, "K"); _update(balance0, balance1, _reserve0, _reserve1); } 

The Router contract provides multi-hop routes, slippage protection, and deadline.

MEV and Reentrancy Protection

A classic sandwich attack: an MEV bot inserts a buy before the victim's swap and a sell after. Protection: Slippage tolerance—the user sets a maximum price impact; private mempool (Flashbots); commit-reveal schemes; batch auctions (CoW Protocol)—all orders executed at a single price.

Reentrancy protection: the mutex lock uses a single storage slot, saving ~2300 gas compared to OpenZeppelin's ReentrancyGuard.

uint private unlocked = 1; modifier lock() { require(unlocked == 1, "LOCKED"); unlocked = 0; _; unlocked = 1; } 

Tokenomics and Governance

We recommend a two-tier fee structure: LP fee (0.3%) + protocol fee (0.05%), even if the protocol fee is initially turned off. Governance tokens are distributed via liquidity mining using the MasterChef pattern (SushiSwap). Simplified formula: pendingReward = userLPBalance * (accRewardPerShare - userRewardDebt) / 1e12.

Frontend and UX

Critical components: swap interface with real-time price impact, liquidity management with range visualization (for V3), charts via The Graph, wallet integration (wagmi + viem, WalletConnect v2), transaction simulation through Tenderly.

How to Deploy an AMM DEX in 5 Steps

  1. Develop smart contracts (Factory, Pair, Router) with Foundry tests.
  2. Security audit (Slither, Mythril, Echidna) and formal verification.
  3. Deploy to testnet, integrate with frontend.
  4. Test liquidity pools with real tokens.
  5. Deploy to mainnet, set up monitoring (Tenderly, Etherscan API).

What's Included in AMM DEX Development

Stage What We Do Outcome
Analysis Determine AMM model, tokenomics Specification
Contract Development Solidity + Foundry, tests Source code
Audit Slither, Mythril, Echidna Audit report
Frontend React + wagmi, wallet integration Ready DApp
Deployment Network setup, monitoring Live DEX

Why Order Development from Us?

We guarantee code quality and audit readiness. Our track record—over 10 successful DEX projects, including Layer 2 integrations (Arbitrum, Optimism). We use proven patterns and libraries. Uniswap V2 Whitepaper is the foundation we adapt to your needs. Automated Market Maker is the key mechanism at the core. Contact us for a free consultation and project evaluation. Order turnkey AMM DEX development—from idea to deployment and support.