[UNISWAP SERIES]
- 유니스왑 이해하기
- CPMM 이해하기
- 유니스왑 V3 톺아보기
- AMM 이해하기
본 아티클은 [Uniswap Series]의 두 번째 게시글로 Uniswap의 암호화폐 가격 결정 방법을 이해할 수 있도록 수식을 기반으로 작성되었습니다. 본 게시글에서는 Uniswap 서비스의 기본 개념을 다루지 않기 때문에, 본 아티클에 들어가기에 앞서 이전 아티클인 1. 유니스왑 이해하기 를 읽고 오시는 것을 추천해 드립니다.
서론
Uniswap은 2가지의 암호화폐의 스왑(환전) 거래를 제공하는 탈중앙화 거래소입니다. 거래소 구현방식으로는 중앙화 거래소가 사용하는 오더북 형식이 아닌 AMM 방식을 선택했습니다. AMM 방식을 통한 Uniswap의 토큰 스왑 과정은 다음과 같습니다.
- ETH와 DAI를 스왑할 수 있는 ETH/DAI 풀을 만든다.
(가정: ETH의 현재 가격 = $100, DAI의 현재 가격 = $1) - 유동성 공급자는 1:1 비율로 풀에 1 ETH와 100 DAI를 예치한다.
- 1 ETH를 풀에 예치한 후 n 개의 DAI를 받는다.
2번에서 언급된 1:1 비율은 암호화폐의 개수가 아닌 가치로 결정된 비율입니다. ETH의 현재 가치가 $100이고, DAI의 현재 가치가 $1 라고 가정할 때, 유동성 공급자는 2번 과정에서 1 ETH를 예치할 때 100 DAI도 함께 예치해야 합니다. 일부 독자들은 위 예시에 의해 1 ETH를 스왑하는 3번 과정에서 사용자가 100 개의 DAI를 받으리라 생각할 수 있습니다. 그런데도 n개라고 표현한 이유는 실제 스왑에서 100 DAI보다 더 적은 개수를 받기 때문입니다.
이처럼 처음에 의도했던 가격과 실제 거래 가격 사이에 차이가 발생하는 것을 슬리피지(Slippage)라고 합니다. 슬리피지는 풀에 유동성이 적고 거래량이 많을수록 커지게 되는데, 슬리피지가 커질수록 결과적으로 거래자는 더 비싼 가격에 토큰 거래를 해야 합니다.
Uniswap에서 구현된 AMM을 통해 토큰을 스왑하면 필연적으로 슬리피지가 발생할 수 밖에 없습니다. 이러한 현상에 대해 우리는 다음과 같은 질문을 생각해볼 수 있습니다.
Uniswap에서 토큰을 스왑하면 왜 슬리피지가 발생하는 것일까?
조금 더 명확하게 질문을 한다면
Uniswap이 AMM을 통해 토큰 스왑량을 어떻게 결정하길래 슬리피지가 발생하는 것일까?
본 아티클에서는 독자들과 함께 위 질문에 대한 답을 찾고자 합니다. 이를 위해 찾아야 할 답을 좀 더 명확히 작성하면 아래와 같이 작성할 수 있습니다.
사용자가 1 ETH를 스왑할 때 몇 개의 DAI를 받을지 자동으로 결정하는 방법을 알아보자.
최종적으로, 위 질문을 Uniswap 관점에서 더욱 정확하게 이야기하자면 아래와 같습니다.
사용자가 풀에 1 ETH를 예치했을 때 몇 개의 DAI가 풀에 남아야 하는지 결정하는 방법을 알아보자
스왑 후 풀에 남아야 하는 토큰의 개수가 결정되면 자동으로 토큰의 가격이 결정됩니다. 현재 풀에 1 ETH와 100 DAI가 남아있다면, 1 ETH의 가격은 100 DAI로 결정됩니다. 이에 따라 AMM을 DEX의 가격 결정 모델이라고도 부릅니다.
이제부터 우리는 위 질문에 대한 답을 찾기 AMM을 통해 DEX의 거래 방법을 수식을 기반으로 알아볼 것입니다.
본 아티클에서는 Uniswap에 대한 전반적인 이해를 도울 수 있는 설명을 다루지 않습니다. Uniswap의 개념, 유동성 공급자, 슬리피지 등에 대해 이해하고 싶은 독자는 1편의 내용을 읽은 후 본 아티클을 읽는 것을 추천합니다.
본격적으로 설명을 시작하기 전에 Uniswap의 AMM 함수인 CPMM을 먼저 소개합니다.
CPMM은 Constant Product Market Makers의 약자로 Uniswap이 AMM 방식으로 토큰 거래를 지원하기 위해 처음으로 정의한 함수입니다. 이름에서 유추할 수 있듯이 이 함수는 변수 x와 y의 곱에 있어서 상수 k 값이 항상 유지되어야 합니다. 이어지는 글에서는 이 간단한 함수인 CPMM을 통해 토큰 스왑 양이 어떻게 결정되는지 수식을 기반으로 자세하게 살펴봅니다.
2021월 5월 5일 Uniswap이 V3로 버전 업데이트를 하면서 유동성 공급 방식을 새롭게 만들었습니다. 이러한 변화가 기존 CPMM 로직에 어떤 영향을 미쳤는지 궁금해하는 독자가 분명이 있을 것입니다. 필자도 그 궁금증을 해결하기 위해 이번 리서치를 시작했었습니다. Uniswap V3는 다음 아티클에서 다룰 주제이지만 저와 같은 궁금증을 가진 독자를 위해 언급하자면,
Uniswap V3에서는 Concentrated liquidity 개념을 추가하여 CPMM 함수를 아래와 같이 변경했습니다.
Uniswap V3의 가장 큰 특징은 유동성 공급자가 자금을 공급하고 싶은 가격 범위를 지정하여 공급할 수 있도록 하는 것입니다. 이를 포지션 설정이라고 하는데 이를 정의한 함수가 바로 식 (2)입니다.
Uniswap V2와 V3에서 핵심적인 차이점은 유동성 공급 시 포지션 설정 여부이며, 유동성을 공급한 이후 로직인 토큰 스왑 과정은 V2와 V3 모두 동일합니다. 따라서 Uniswap V3의 토큰 스왑 로직이 궁금한 독자들도 본 아티클에서 그 궁금증을 어느 정도 해결할 수 있을 것이라 기대합니다. 변경된 CPMM 함수에 대한 설명은 다음 아티클에서 다룰 예정입니다.
본 아티클에서 작성된 수식은 Uniswap V3 백서를 기반으로 작성되었으며, 일부 변수는 가독성을 위해 백서와 다르게 작성되어 있습니다.
Constant Product Market Makers (CPMM)
이제 본격적으로 Uniswap의 CPMM 함수를 기반으로 토큰 스왑 양을 결정하는 방법에 대하여 알아봅니다. 과정은 5단계로 이루어져 있습니다.
- 풀의 리저브 개수 정의하기
- 토큰 유동성과 풀의 기준 가격 계산하기
- 각 토큰의 리저브 개수를 결정할 수 있는 수식 정의하기
- 토큰 y를 n개 스왑할 때 풀에 남아야 하는 x 토큰의 리저브 개수 계산하기
- 풀에 유동성 추가하기
1. 풀의 리저브 개수 정의하기
유동성 공급자가 x 토큰과 y 토큰의 스왑을 위해 x/y 풀을 만들고자 합니다. 이를 위해 유동성 공급자는 1,000개의 x 토큰과 4,000개의 y 토큰을 예치하여 풀을 만들었다고 가정해 봅시다. 이때 풀은 각 토큰의 공급량에 의해 풀의 상수 K가 다음과 같이 결정됩니다.
- X: x 토큰의 리저브 개수
- Y: y 토큰의 리저브 개수
- K: x/y 풀의 리저브 개수
여기서 리저브 개수는 풀에 남아있는 토큰의 개수를 의미합니다. 즉, X와 Y는 x/y 풀에 남아있는(들어 있는) 각 토큰의 개수를 의미합니다. 풀의 리저브 개수는 각 토큰의 리저브 개수의 곱으로 결정되는 상수 값이며, 풀의 유동성이라고도 합니다.
현재 풀에는 유동성 공급자에 의해 1,000개의 x 토큰과 4,000개의 y 토큰이 남아있으므로 식 (3)에 의해 상수 K는 다음과 같이 결정됩니다.
위 함수에 대한 그래프는 다음과 같습니다.
- x축: x 토큰의 리저브 개수 X
- y축: y 토큰의 리저브 개수 Y
- 빨간색 곡선: x/y 풀의 리저브 개수 K (풀의 유동성)
그림 1의 X와 Y의 곱으로 만들어진 사각형의 넓이는 상수 K의 값과 같습니다. 유동성이 공급된 후 풀에 들어 있는 x 토큰과 y 토큰의 개수로 결정된 상수 K는 앞으로 풀에서 발생하는 모든 스왑 거래에 있어서 변하지 않는 고정된 값입니다. 새로운 유동성 공급자가 토큰을 추가로 풀에 예치하거나 기존 공급자가 유동성을 풀에서 뺄 때, 유동성을 의미하는 상수 K의 값은 달라질 수 있습니다. 이에 대해서는 마지막 단계에서 살펴봅니다.
2. 토큰 유동성과 풀의 기준 가격 계산하기
이제 우리는 풀에 들어 있는 각 토큰의 개수를 기준으로 ‘스왑량’을 결정할 것입니다. 쉽게 말해, 1개의 x 토큰을 몇 개의 y 토큰으로 스왑되는지 결정할 것이며, 이에 대한 값은 풀의 유동성을 기준으로 결정됩니다.
유동성의 사전적 정의는 어떤 특정 상품 또는 서비스를 다른 가치로 전환할 수 있는 성질입니다. 이를 토큰에 대입해보면 x 토큰을 다른 가치인 y 토큰으로 전환할 수 있는 성질을 의미합니다. Uniswap은 이러한 토큰 스왑의 기준이 되는 토큰 유동성을 다음과 같이 정의했습니다.
예시를 통해서 유동성의 값을 계산해보겠습니다. 현재 풀에는 1,000개의 x 토큰(X)과 4,000개의 y 토큰(Y)이 들어있습니다. 이를 통해 계산한 x/y 풀의 토큰 유동성은 아래와 같습니다.
여기서 계산한 토큰 유동성 2,000은 x 토큰과 y 토큰의 교환 기준이 됩니다. 우리는 이 교환 기준을 통해 풀의 기준 가격을 정의할 수 있습니다. 궁극적으로 ‘토큰 스왑량’은 이 단계에서 결정한 토큰 유동성과 풀의 기준 가격을 통해 계산될 것입니다.
앞으로 발생하는 스왑 거래에 의해 각 토큰의 리저브인 X와 Y는 변경될 수 있지만, x와 y의 토큰 유동성인 L은 2,000으로 동일해야 합니다.
식 (4)를 통해 상수 K의 값과 L² 의 값이 같다는 것은 쉽게 이해할 수 있습니다.
식 (5)의 L²은 풀의 유동성이라 하며, 식 (3)에서 정의한 풀 리저브 K와 같은 값입니다. 식 (5)는 Uniswap V3에서 contracted liquidity라는 이름으로 변경되는 수식이므로 기억하고 있어야 합니다.
여기서 L²와 L은 다른 것을 의미하는 것을 기억해야합니다. L²는 풀 전체의 리저브 K와 같은 값으로 풀 전체의 유동성을 나타내는 값이고, L은 풀은 구성한 토큰 한 개에 대한 기준 유동성을 의미합니다.
이제 토큰 유동성 L을 통해 각 토큰의 유동성 가치를 결정합니다. 토큰의 유동성 가치는 풀이 보유하고 있는 각 토큰의 가치로 이해할 수 있습니다.
이후 작성되는 유동성 가치와 토큰 가격의 수 기호는 가격임을 강조하기 위해 $ 기호를 사용합니다. 하지만 이는 법정 화폐인 $(달러) 가치를 갖는것은 아닙니다.
Px 를 x 토큰의 가치($)라 하면, 유동성 가치 Lx는 다음과 같이 계산됩니다.
y 토큰의 유동성 가치 Ly도 동일한 방법으로 계산됩니다.
Lv를 기준이 되는 풀의 토큰 유동성 가치라 하면 다음과 같이 정의할 수 있습니다.
식 (8)의 √P는 토큰 한 개에 대한 풀의 기준 가격을 나타냅니다. 앞서 서론에서 유동성을 공급할 때 동일한 가치를 같도록 x 토큰과 y 토큰을 1:1 비율로 예치해야 한다고 언급했습니다. 이러한 가정하에 각 토큰의 유동성 가치는 동일하며, 결과적으로 아래 식이 성립합니다.
식 (9)에 의해 Lv²은 Lx와 Ly으로 다음과 같이 나타낼 수 있습니다.
식 (4), (8), (10)에 의해 다음과 같은 수식이 성립합니다.
이제 본격적으로 풀의 기준 가격인 √P의 값을 결정합니다. 식 (11)을 Px와 Py로 다음과 같이 표현할 수 있습니다.
이제 위 예시로 돌아가서 풀의 기준 가격 √P의 값을 구해보겠습니다.
[풀 현황]
- x 토큰 리저브: X = 1,000
- y 토큰 리저브: Y = 4,000
- 토큰 유동성: L = Lx = Ly: 2,000
식 (6), (7)에 의해 각 토큰의 가격 Px와 Py는 토큰 유동성 L을 기준으로 다음과 같이 계산될 수 있습니다.
풀의 기준 가격을 결정하기에 앞서 기준으로 삼을 토큰을 정해야 합니다. 여기서는 x를 풀의 기준 토큰으로 설정하여 풀의 기준 가격을 결정합니다.
식 (14)를 통해 계산한 풀의 기준 가격은 √(4,000/1,000) = $ 2으로 기준 토큰의 가격인 Px의 값과 동일함을 알 수 있습니다.
3. 각 토큰의 리저브 개수를 결정할 수 있는 함수 정의하기
3단계에서는 2단계에서 결정한 토큰 유동성 L과 풀의 기준 가격 √P를 통해 스왑 후 풀에 남아야 하는 각 토큰의 리저브 개수를 계산할 수 있는 함수를 정의합니다. 이 함수는 식 (14)를 기반으로 결정됩니다.
먼저, 식 (14)의 양변에 X * 1/√P를 곱하여 X에 대한 함수를 정의합니다.
식 (15) 에서 √(X*Y) = L이므로, X는 다음과 같이 결정됩니다.
마찬가지로 Y에 대한 함수는 식 (14)의 양변에 Y * 1/√P 를 곱하여 만들 수 있습니다.
식 (16), (17)을 통해 유추할 수 있는 것은 다음과 같습니다.
- 토큰 유동성 L은 고정된 값이다.
- √P가 증가하면 y 토큰의 리저브는 증가한다.
- √P가 증가하면 x 토큰의 개수(X)는 감소한다.
풀에서 하나의 토큰이 다른 토큰보다 개수가 적다는 것은 개수가 적은 토큰이 다른 토큰보다 시장 가격이 높다는 것을 의미합니다. 다시 말해 다음 논리가 성립합니다.
- √P가 증가하면 y 토큰의 리저브가 증가하여 Py의 가격이 하락한다.
- √P가 증가하면 x 토큰의 리저브가 감소하여 Px의 가격이 증가한다.
4. y를 n개 스왑할 때 풀에 남아야 하는 x 의 리저브 개수 계산하기
유니스왑 AMM의 궁극적인 목표는 y 토큰을 x 토큰으로 스왑할 때 몇 개를 x 토큰을 사용자에게 제공해야하는지 결정하는 것입니다. 마지막 4단계에서 결정할 것은 사용자가 2,000개의 y 토큰을 스왑할 때 몇 개의 x 토큰을 제공해야할지 계산하는 방법입니다.
3단계에서 각 토큰의 가격을 √P을 기준으로 계산할 수도 있지만, y 토큰의 개수를 기준으로 생각할 수도 있습니다.
- 사용자가 y 토큰을 x 토큰으로 스왑하기 위해 y 토큰을 예치한다.
- y 토큰의 리저브가 증가하면 √P가 증가하여 Py가 감소한다.
- y 토큰의 리저브가 증가하면 √P가 증가하여 Px가 증가한다.
이러한 논리를 기억한 후 식 (17)에 대한 그래프를 그리면 다음과 같습니다.
[스왑 전 풀 현황]
- y 토큰 리저브: Y = 4,000
- 토큰 유동성: L = Lx = Ly: 2,000
- 풀의 기준 가격: √P = $ 2
- x 축: 풀의 기준 가격 √P
- y 축: 토큰 유동성 L
- 검은색 사각형: y 토큰의 리저브 개수 Y
이제 사용자가 2,000 개의 y 토큰을 x 토큰으로 스왑하기 위해 풀에 y 토큰을 예치했다고 가정합니다. 이 경우 풀 현황과 그림 2는 다음과 같이 바뀝니다.
[스왑 후 풀 현황]
- y 토큰 리저브: 4,000 + 2,000 = 6,000
- 토큰 유동성: L = Lx = Ly: 2,000
- 풀의 기준 가격: √P = Y/L = 6,000 / 2,000 = $3
그림 3에서 ΔY는 사용자가 스왑을 위해 추가로 예치한 y 토큰의 개수이며, 그 값은 2,000입니다. 즉, 사용자가 스왑을 위해 ΔY만큼 y 토큰을 풀에 예치하면, y 리저브 토큰 개수 Y는 Y + ΔY 만큼 증가하며, 그 값은 6,000이 됩니다. 이에 따라 기준 가격 √P도 $3으로 증가함을 알 수 있습니다.
한편, 토큰 유동성 L의 값은 스왑 과정에서 변화하지 않는 것을 알 수 있습니다. 여기서 중요한 것은 스왑에 있어 변화하는 값는 √P과 Y이며, L의 경우 유동성이 추가로 공급되거나, 기존에 있는 유동성이 출금될 경우에만 변화하는 값이라는 것입니다.
여기서 y 리저브 토큰에 대한 정의를 다시 짚어볼 필요가 있습니다. 사용자는 Y 토큰의 스왑 양을 0 부터 +∞까지 모두 요청할 수 있으며, 이로 인해 기준 가격 √P도 0부터 +∞까지 변동할 수 있습니다. 스왑에 따라서 변동하는 값을 고려하여 y 리저브를 정의하면 다음과 같습니다.
여기서 L은 스왑에 따라 변하는 값이 아닌 상수이기 때문에, 변동 값을 의미하는 Δ를 붙이지 않습니다.
식 (18)을 토큰 유동성 L에 대한 정의로 재배치하면 다음과 같습니다.
식 (19)에서 상수 L을 통해 Y와 √P값은 일정 비율로 함께 변동해야 하는 값임을 알 수 있습니다.
토큰 스왑 시 변동하는 값을 고려한 y 리저브 토큰 그래프를 그리면 다음과 같습니다.
이제 다시 예시로 돌아가서, 사용자가 예치한 ΔY에 의해 변화한 풀의 기준 가격을 통해 사용자가 받아야 하는 x 토큰의 개수인 ΔX를 결정할 수 있습니다.
사용자가 풀에 1 ETH를 예치했을 때 몇 개의 DAI가 풀에 남아야 하는가
이를 위해 식 (16)을 이용합니다.
식 (20)을 통해 도출한 값은 풀에서 빼내 사용자에게 제공해야 하는 x 토큰의 개수입니다. ΔX 값을 통해 풀에 남아야 하는 x 토큰의 개수인 X 값도 계산할 수 있습니다.
스왑 후 변한 기준 가격 √P를 통해 x 토큰 리저브 개수를 계산해도 같은 값을 얻습니다.
위 단계를 통해 2,000개의 y 토큰을 스왑하는 사용자는 333개의 x 토큰을 받고 풀에는 666개의 x 토큰이 남아있게 됨을 알 수 있습니다.
이제 스왑 이후 CPMM 그래프가 어떻게 변경되는지 알아보겠습니다.
[스왑 후 풀 현황]
- x 토큰 리저브: X = 666
- y 토큰 리저브: Y = 6,000
- 토큰 유동성: L = 2,000
- 풀의 기준 가격: √P = $3
그래프에서 알 수 있듯이 스왑 이후 변화한 값은 x 토큰 리저브와 y 토큰 리저브 값입니다. 하지만 풀 리저브를 나타내는 빨간색 곡선 K의 값은 변하지 않았음을 알 수 있습니다.
CPMM을 통해 리저브 개수가 결정되는 과정을 간단히 정리하면 다음과 같습니다.
- 사용자가 2,000개의 y 토큰을 풀에 예치
- y 토큰의 리저브 개수 증가로 풀의 기준 가격이 2에서 3으로 증가
- 풀의 기준 가격 증가로 x 토큰 리저브 개수가 1,000개에서 666개로 감소
- 풀에서 빠져나간 333개의 x 토큰을 사용자에게 지급
5. 풀에 유동성 추가하기
1단계부터 4단계까지의 과정을 통해 토큰 스왑이 일어난 후 풀 현황과 CPMM 그래프 변화를 살펴보았습니다. 이제 풀에 유동성이 추가되거나 감소할 때 위 값들이 어떻게 변경되는지 알아보겠습니다.
[풀 현황]
- x 토큰 리저브 개수 (X): 666개
- y 토큰 리저브 개수 (Y): 6,000개
- x 토큰 가격 (Px): $3
- y 토큰 가격 (Py): $0.33
- 풀의 상수 (K): 3,996,000
- 풀의 토큰 유동성 (L): 2,000
- 풀의 기준가격 (√P): $3
이제 다른 유동성 공급자가 풀에 x 토큰 1,000개를 유동성으로 공급하려고 합니다. 이를 위해서는 y 토큰의 유동성도 함께 공급해야 하며, 그 가치는 1:1로 동일해야 합니다. 따라서 이 유동성 공급자는 x 토큰 1,000개에 해당하는 $3,330 만큼의 y 토큰 10,090개를 함께 예치해야 합니다. 이 공급자의 예치로 풀의 상태는 다음과 같이 변경됩니다.
[유동성 공급 후 풀 현황]
- x 토큰의 리저브 개수 (X): 1,666개
- y 토큰의 리저브 개수 (Y): 16,090개
- x 토큰 가격 (Px): $3
- y 토큰 가격 (Py): $0.33
- 풀의 상수 (K): 26,805,940
- 풀의 토큰 유동성 (L): 5,177
- 풀의 기준 가격 (√P): $3
위 값을 통해 풀의 유동성이 변동될 때 변하는 값은 X, Y, K 그리고 유동성인 L임을 알 수 있습니다.
그림 6에서 빨간색 점선은 유동성 공급 전 풀의 리저브를 나타내며, 보라색 곡선은 유동성 공급 후 풀의 리저브를 나타냅니다. 유동성 공급 후 각 토큰의 리저브 개수는 동일한 비율로 증가하고, 풀 리저브도 이와 동일한 비율로 함께 증가함을 알 수 있습니다.
그림 7에서는 y 토큰 리저브 개수의 증가로 인해 토큰 유동성 L이 증가하였고, 기준 가격인 √P은 $3으로 유지됨을 알 수 있습니다.
마치며
본 아티클은 Uniswap의 AMM 모델인 CPMM이 토큰 스왑량을 자동으로 결정하는 방법을 구체적으로 설명했습니다. 이를 통해 x/y 풀에서 y 토큰을 x 토큰으로 스왑하고자 할 때 몇 개의 x 토큰을 사용자에게 지급해야 하는지 자동으로 결정하는 로직에 대한 이해를 돕기위해 수식을 기반으로 작성되었습니다. 본 아티클에서 중요하게 기억해야 하는 것은 다음 두 가지입니다.
[CPMM을 통해 리저브 개수가 결정되는 방법]
- 사용자가 2,000개의 y 토큰을 풀에 예치
- y 토큰의 리저브 개수 증가로 풀의 기준 가격이 2에서 3으로 증가
- 풀의 기준 가격 증가로 x 토큰 리저브 개수가 1,000개에서 666개로 감소
- 풀에서 빠져나간 333개의 x 토큰을 사용자에게 지급
[스왑 또는 유동성 변동에 의해 변하는 값]
스왑과 유동성 변동은 동시에 일어나는 이벤트가 아닙니다.
- 스왑에 의해 변하는 값
- x 토큰의 리저브 개수 (X)
- y 토큰의 리저브 개수 (Y)
- x 토큰 가격 (Px)
- y 토큰 가격 (Py)
- 풀의 기준 가격 (√P)
2. 유동성 변동에 의해 변하는 값
- x 토큰의 리저브 개수 (X)
- y 토큰의 리저브 개수 (Y)
- 풀의 상수 (K)
- 풀의 토큰 유동성 (L)
다음 아티클에서는 Uniswap이 V3로 업데이트하면서 새로 도입한 CONCENTRATED LIQUIDITY에대하여 다룹니다. 구체적으로는 변경된 CPMM 수식, 게으른 유동성(lazy liquidity) 이슈 해결, Uniswap V3의 풀 현황 살펴보기 등으로 구성될 예정입니다.
[UNISWAP SERIES]
- 유니스왑 이해하기
- CPMM 이해하기
- 유니스왑 V3 톺아보기
- AMM 이해하기