ERGO
DeFi Primitives
Intermediate
1-2 weeks

Пул жидкости AMM в Константе

Build a Uniswap-style AMM on Ergo (x*y=k) with LP tokens

GitHub

Проблема

You need permissionless, always-available liquidity for token trading without order books.

Решение

Automated Market Makers use a mathematical formula (x * y = k) to price assets. Liquidity providers deposit token pairs and earn fees from trades.

Как это работает

  1. 1Pool holds reserves of two tokens (X and Y)
  2. 2Price is determined by ratio: price = reserveY / reserveX
  3. 3Trades must maintain invariant: reserveX * reserveY >= k
  4. 4LP tokens represent proportional share of pool
  5. 5Fees (typically 0.3%) go to liquidity providers
  6. 6Anyone can add/remove liquidity by depositing/withdrawing proportionally

Примеры кода

{
  // AMM Pool Contract
  val poolNFT = SELF.tokens(0)._1  // Unique pool identifier
  val reserveX = SELF.tokens(1)._2  // Token X reserve
  val reserveY = SELF.tokens(2)._2  // Token Y reserve
  val lpTokens = SELF.tokens(3)._2  // LP tokens in pool
  
  val feeNum = 997L     // 0.3% fee (1000 - 3)
  val feeDenom = 1000L
  
  // Pool must continue with same NFT
  val poolContinues = OUTPUTS(0).tokens(0)._1 == poolNFT
  
  val newReserveX = OUTPUTS(0).tokens(1)._2
  val newReserveY = OUTPUTS(0).tokens(2)._2
  
  // Swap validation: constant product with fee
  val validSwap = {
    val deltaX = newReserveX - reserveX
    val deltaY = newReserveY - reserveY
    
    if (deltaX > 0) {
      // Selling X for Y (X increases, Y decreases)
      val xWithFee = deltaX * feeNum
      newReserveY * (reserveX * feeDenom + xWithFee) >= 
        reserveY * reserveX * feeDenom
    } else {
      // Selling Y for X (Y increases, X decreases)
      val yWithFee = -deltaY * feeNum
      newReserveX * (reserveY * feeDenom + yWithFee) >= 
        reserveX * reserveY * feeDenom
    }
  }
  
  // Add/remove liquidity validation
  val validLiquidity = {
    val newLpTokens = OUTPUTS(0).tokens(3)._2
    val lpDelta = newLpTokens - lpTokens
    
    if (lpDelta > 0) {
      // Adding liquidity: must add proportionally
      val xRatio = (newReserveX - reserveX) * lpTokens / reserveX
      val yRatio = (newReserveY - reserveY) * lpTokens / reserveY
      lpDelta <= min(xRatio, yRatio)
    } else {
      // Removing liquidity: receive proportionally
      val xOut = -lpDelta * reserveX / lpTokens
      val yOut = -lpDelta * reserveY / lpTokens
      (reserveX - newReserveX) <= xOut &&
      (reserveY - newReserveY) <= yOut
    }
  }
  
  poolContinues && (validSwap || validLiquidity)
}

Core AMM logic with 0.3% swap fee. Validates both swaps (constant product) and liquidity operations (proportional).

Варианты использования

  • Decentralized token exchanges
  • Liquidity bootstrapping for new tokens
  • Yield farming infrastructure
  • Price discovery for illiquid assets
  • Stablecoin swaps

Вопросы безопасности

  • !Protect against sandwich attacks with slippage limits
  • !Use time-weighted average prices for oracles
  • !Implement emergency pause mechanisms
  • !Audit math for overflow/underflow
  • !Consider concentrated liquidity for efficiency

Реальные реализации

Spectrum Finance

Production AMM DEX on Ergo

Прокачайте навыки ErgoScript

Получайте уведомления о новых паттернах, туториалах и ресурсах для разработчиков.

Follow for daily updates