Defi (2) – CPMM? CLMM? DLMM?

CPMM? CLMM? DLMM?

Meteora의 수수료 파밍에 관심을 갖다가 DLMM이라는 용어를 접하게 되었다.
DLMM을 공부하다 보니 CPMM, CLMM, CSMM, CMMM 등 유사한 용어를 함께 접하게 되었다. 이번 글에서는 이중 CPMM, CLMM, DLMM이 무엇인지 간단히 다뤄보고자 한다.

CPMM(Constant Product Market Maker), CLMM(Concentrated Liquidity Market Maker), DLMM(Dynamic Liquidity Market Maker)은 유동성 풀(liquidity pool) 안에서 작동하는 자동화된 시장 조성자(Automated Market Maker, AMM)의 작동 알고리즘을 지칭한다.

  • 유동성 풀이란 Defi 활동에 필요한 다양한 자산을 교환할 수 있게 해주는 장치라고 할 수 있다. (꼭 교환의 역할만 하는 것은 아니다. 담보를 잠궈놓는 역할을 하는 등 다양한 역할을 할 수 있다.)

    예를 들어 ETH-USDC 유동성 풀이 있다면 이 풀을 이용하여 UDSC와 ETH을 교환할 수 있다.
     
  • 시장 조성자는 호가창을 채워 거래를 원하는 사람의 거래 상대가 되어주고 매수-매도 가격 차이(스프레드)를 통해 수익을 창출한다.
    전통 금융시장에서는 Citadel Securities, Jane Street 등이 시장 조성자의 역할을 맡고 있으며, 암호화폐 시장에서는 Jump trading, Winermute, Cumeberland와 같은 기업이 시장 조성자의 역할을 맡고 있다.
     
  • DEX(Decentralized Exchange, 탈중앙화 거래소)에는 사람의 개입 없이 알고리즘에 따라 자산 교환을 자동으로 처리해 주는 시장 조성자도 있는데, 이것이 AMM이다. AMM은 스마트 계약(Smart Contract)을 기반으로 한 자동화된 자산 교환 시스템이다. AMM은 DEX의 유동성 풀에서 작동한다.

    앞서 언급했듯이, 이 AMM이 어떻게 작동하는 지에 따라 CPMM, CLMM, DLMM 등으로 용어가 나뉜다.
    참고로, 개념이 나온 시간 순서대로 나열하면 CPMM-CLMM-DLMM 순인데, CPMM과 CLMM은 Uniswap에서, DLMM은 Meteora에서 만든 개념이다.

CPMM(Constant Product Market Maker)

CPMM은 Uniswap V1, V2 등에서 사용되는 알고리즘이다. CPMM은 자산의 교환이 이루어지는 시점에 풀 안에 두 자산 x, y의 수량이 각각 x’, y’만큼 있을 때 아래의 식이 성립하도록 자산의 교환이 이루어진다.

x’ * y’ = k (단, k=상수)

즉, 곱(product) 이 일정하게 유지되도록 두 자산의 교환 비율이 설정된다. 그래서 ‘constant product’ market maker이다.

참고. CPMM에서 k가 상수라는 개념은 유동성 풀 내에서 ‘거래가 이루어지는 동안’ 일정하게 유지된다는 의미이다. 유동성이 추가되거나 제거되면 k값 또한 변하게 된다.

  • 이러한 방식은 불가피하게 슬리피지(slippage)를 발생시킨다. 주식이나 코인 등을 거래할 때 여러가지 원인으로 인해 내가 거래하고자 했던 가격에 거래하지 못하게 됐을 때, ‘슬리피지가 발생했다’고 한다.
예를 들어, 10ETH와 10000USDT가 들어있는 ETH-USDT pool이 있다면, 이 상태에서 1ETH의 가격은 1000USDT이다. (10 * 10000 = 100000)
그러나, 이때 1ETH를 USDT로 교환하려고 하면 1000USDT를 받지 못한다. 내가 1ETH를 USDT와 교환하고자 할 때, 두 자산 수량의 곱이 100000으로 유지되어야 하므로 약 909.09USDT를 받게 되기 때문이다. 이처럼 단순히 생각했을 때, 1ETH을 팔면 1000USDT를 받을 줄 알았는데, 909.09USDT 밖에 받지 못했으니 슬리피지가 발생한 것이다.

(10+1)ETH * (10000-X) = 100000 → X는 약 909.09USDT (단, 거래 수수료는 없다고 가정)

참고. Pool을 사용하여 ETH를 USDT와 교환하는 것과 Pool에 ETH이나 USDT의 유동성을 추가하는 것은 다른 개념이다. k값의 변화는 유동성이 추가되고 제거될 때 발생한다. 위 상황은 거래를 하는것이지 유동성을 추가하는 것이 아니기 때문에 k가 변하지 않는다.

참고2. 나는 이 지점에서 '내가 909.09 USDT를 받을 것을 정확히 예측했고 그 가격으로 거래할 것을 받아들였다면, 슬리피지가 발생하지 않은 것인가?' 라는 의문이 생겼는데, GPT에게 물어보니 그런 경우에는 슬리피지가 발생하지 않았다고 본다고 답하였다.
  • 앞서 CPMM은 슬리피지를 불가피하게 발생시킨다고 하였는데, GPT가 답한 것처럼 슬리피지가 ‘예측’과 ‘실제’의 차이라면, 단순히 x*y=k라는 공식 때문에 슬리피지가 발생한다고 말할 수는 없다. 왜냐하면 해당 공식과 풀의 유동성을 정확히 알면 거래될 가격을 정확히 예측할 수 있기 때문이다.

    다만, 다수의 사용자가 해당 풀을 사용하면 거래자 수, 거래의 크기, 거래 순서, 유동성 추가 및 제거 등 변수가 많아지는데, 이로 인해 거래가 이루어질 가격을 예측하는 것이 어려워지기 때문에 x*y=k 방식에서는 슬리피지가 필연적으로 발생하게 된다.
  • x*y=k의 방식은 거래 규모가 클 때와, k가 작을 때 슬리피지가 커지는 특성이 있다.
거래 규모에 따른 슬리피지 차이 예시
슬리피지 예시2 1
k 값에 따른 슬리피지 차이 예시
슬리피지 예시1


  • 또한 CPMM은 유동성을 전체 가격(이론적으로 0~무한대)에 걸쳐 제공하기 때문에 현재 가격과 동떨어진 곳까지 유동성을 제공하여 자본 효율성이 떨어진다.

CLMM(Concentrated Liquidity Market Maker)

  • CLMM은 Uniswap V3 등에서 사용되는 알고리즘이다. CLMM은 유동성 공급자(Liquidity Provider, LP)가 자신이 원하는 특정 가격 범위에만 유동성을 제공할 수 있도록 CPMM을 개량한 버전이다.

  • CLMM에서도 거래가 일어날 때의 가격 결정 방식 자체는 CPMM에서의 방식(x*y=k)과 같다.

  • 유동성 공급자들은 대체로 현재 거래가 이루어지는 가격대 주변에 유동성을 공급한다.

    거래가 이루어질 때 그 거래의 대가로 수수료를 받는 구조이기 때문에, 거래가 많이 이루어지는 가격대에 유동성을 공급하는 것이 유동성 공급자에게 유리하기 때문이다.

  • 거래가 이루어지는 주변에 유동성이 집중되면 해당 구간에서 k가 커지는 효과가 생겨 해당 구간에서 슬리피지가 줄어드는 효과가 있다.

    다만, 유동성이 대체로 특정 구간(현재 자산의 거래가 이루어지는 가격대 주변)에 집중되어 있기 때문에 가격이 순간적으로 크게 움직이면 유동성이 적은 곳에서는 CPMM보다 오히려 더 큰 슬리피지가 발생할 수 있다.

  • CLMM은 거래가 활발한 곳에 유동성을 집중시킬 수 있기 때문에 기존 CPMM 방식에서 발생하던 자본의 낭비가 줄어든다.

DLMM(Dynamic Liquidity Market Maker)

DLMM은 Meteora 등에서 사용되는 알고리즘이다. (여기서 제공하는 설명은 Meteora 기준으로 작성할 것이다.)

  • DLMM도 CLMM과 같이 유동성 공급자가 자신이 원하는 특정 가격 범위에만 유동성을 제공할 수 있다.
  • 다만, DLMM은 유동성을 가격 빈(bin)이라고 불리는 연속된 구간으로 나누어 관리한다.
     
    • 각 빈은 고정된 가격 범위(구간)을 가지며, 가격 범위는 풀 생성자가 설정한 기준 포인트(basis point)라는 것을 기반으로 계산된다.
       
    • 각 빈은 가격 범위로 구성되지만 거래되는 가격(빈 거래가)은 특정 가격으로 고정된다. (거래가를 결정하는 수식이 있는데 약간 복잡하다)
       
      예) basis point가 1%이고, 빈1이 10달러부터 시작한다면, 빈 가격 범위는 다음과 같이 정해진다.
빈 가격 범위빈 거래가
빈110.0 ~ 10.1(=10*(1.01))10.03
빈210.1 ~ 10.201=(10.1*(1.01))10.15
bin
<trump-sol pair에 유동성을 공급한 예시>
상단의 막대기로 표현된 하나 하나가 빈이다.
현재 거래되고 있는 빈(active bin)은 주황색으로 표시되며, 1trump당 0.105472sol에 거래된다.
  • 빈 내에서 개별 거래는 CSPM(Constant Sum Price Model)을 따라 이루어진다. CSPM은 x+y=k 식을 따르는데, 유동성 풀 내 두 자산의 합이 항상 일정한 상태를 유지하도록 설계되어 있다. 이 때문에 CSPM에서는 두 자산의 교환 비율이 고정되어 있다. (단순 x+y=k 라면, x와 y는 항상 1:1로 교환된다) Meteora의 CSPM은 약간 변형된 형태인 P*x+y=k를 따르는데, 이는 x, y의 교환 비율을 조절한 것이다. 각 기호의 의미는 다음과 같다.
     
    • x: 해당 빈(bin)에 있는 X 토큰의 수량
    • y: 해당 빈(bin)에 있는 Y 토큰의 수량
    • k: 해당 빈의 유동성 총량 (변하지 않는 값)
    • P: 해당 빈의 고정된 가격 상수
       
  • (Meteora의) DLMM에서 사용하는 CSPM의 경우, 해당 빈에서 가격이 고정되어 있고, 교환 비율 또한 고정되어 있기 때문에, 동일한 빈 내에서 이루어지는 거래에 대해서는 슬리피지가 발생하지 않는다.
     
  • DLMM의 특징 중 하나는 동적 수수료(dynamic fee)이다.
    공식 문서에서는 DLMM의 장점으로 동적 수수료, 자유로운 유동성 범위 등을 언급하고 있지만, 유동성 범위 설정은 CLMM에서도 가능한 기능이므로 DLMM의 차별점을 꼽자면 동적 수수료라고 할 수 있겠다.

    동적 수수료(dynamic fee)는 변동성이 클때 더 큰 수수료를 받을 수 있도록 고안된 수수료이다. 동적 수수료는 기본 수수료(base fee)와 변동 수수료(variable fee)의 합으로 정해진다. 기본 수수료는 거래가 일어날 때 기본적으로 받는 수수료이고 변동 수수료는 변동성에 비례하여 커지는 수수료이다.

    DLMM에 Dynamic이라는 용어를 붙인 이유도 동적 수수료 때문으로 보인다.
     
  • 참고 1. Meteora에는 Dynamic AMM이라는 개념도 있는데, DLMM과는 다른 개념이다.

    Dynamic AMM은 기존의 CPMM과 유사하지만, 예치된 자산 중 유휴 자산을(아마도 현재 가격과 많이 동떨어진 곳에 위치한 자산을 끌어다 쓰는 것 같다) 다른 랜딩 프로토콜 등에 예치하여 추가적인 수익을 내는 AMM이다. Dynamic AMM에서는 DLMM에서와 다르게, 다양한 곳에서 수익을 낸다고 하여 Dynamic이라는 단어가 붙었다.
     
  • 참고 2. Meteora의 DLMM은 사용자가 유동성을 제공할 때 spot, curve, bid-ask 전략을 선택할 수 있도록 편리한 UI를 제공한다.

    이는 내가 공급하는 유동성을 어떻게 분포시킬지에 대한 설정이다. 그러나 이는 부가 기능이지 이것 때문에 DLMM 이라고 부르는 것은 아니다. (이 말을 굳이 쓰는 이유는.. 처음에 내가 이 기능 때문에 DLMM이라고 부르는 줄 알았기 때문이다.)
     
  • 참고 3. Meteora 수수료 파밍 때문에 이 글에 들어오게 되었다면, 단순히 알고리즘에 대한 내용을 아는 것은 수수료 파밍에 큰 도움이 안될 것이다.

    이 글의 내용은 차라리 dexscreener나 pump.fun 등에서 밈코인을 거래할 때 어떤 pool을 사용할지 결정하는 과정에서 더 유용하지 않을까? (물론, 단순히 CPMM, CLMM, DLMM이 중요한 게 아니라 pool의 liquidity와 수수료 등도 함께 고려해야 한다.) Meteora의 수수료 파밍에 대해 궁금하다면 (이 글(작성 예정))을 참고해보자.
image 2
<dexscreener에서 ai16z를 검색한 결과>
CPMM 풀과 CLMM 풀이 있다.
각 풀이 어떤 방식으로 동작하는 지 안다면, 본인에게 더 유리한 풀을 택할 수 있을 것이다.

댓글 남기기