[UNISWAP SERIES] 3. 유니스왑 v3 톺아보기
Summary in English: https://twitter.com/Hyunxukee/status/1437370438636560387
[UNISWAP SERIES]
본 아티클은 [Uniswap Series]의 세 번째 게시글로 유니스왑 v3의 스왑 로직을 수식을 기반으로 설명합니다. 본 게시글에서는 유니스왑 서비스의 기본 개념과 v2까지 사용되었던 CPMM 로직을 설명하지 않기 때문에, 본 아티클에 들어가기에 앞서 이전 아티클을 읽고 오시는 것을 추천해 드립니다.
들어가며
유니스왑은 두 가지 암호화폐의 스왑(환전) 거래를 제공하는 탈중앙화 거래소입니다. 거래소 구현방식으로는 중앙화 거래소가 사용하는 오더북 형식이 아닌 AMM 방식을 선택했습니다. 유니스왑이 이를 구현하기 위해 선택한 수식은 CPMM(Constant Product Market Makers)으로 아래와 같은 함수로 정의되어 있습니다.
CPMM 함수를 기반으로 토큰을 스왑하면 필연적으로 의도했던 가격과 실제 거래 가격 사이에 차이가 발생하는 슬리피지가 발생하게 됩니다. 슬리피지는 풀에 유동성이 적고 거래량이 많을수록 커지게 되는데, 이 슬리피지가 커질수록 거래자는 더 비싼 가격에 토큰을 거래해야 했습니다.
이러한 슬리피지 문제는 유니스왑 v2의 고질적인 문제로 자리 잡게 되었습니다. 유니스왑은 v3로 유동성 공급 방식에 변화를 주어 슬리피지 이슈를 일부 해결할 수 있다고 주장했습니다.
이번 아티클에서는 유니스왑이 v3로 업데이트를 하며 해결하려했던 AMM의 문제점과 이에 대한 해결방법, 그리고 이로 인해 기존 CPMM 로직이 어떤 영향을 받았는지 알아봅니다.
유니스왑 v3의 변경된 유동성 공급창
본격적으로 변경된 CPMM 로직을 이해하기 전에 유니스왑 v3에서 유동성 공급 방법이 어떻게 바뀌었는지 알아봅니다.
유니스왑 v2에서 ETH/DAI 풀에 유동성을 공급하기 위해서는 공급창에서 ETH와 DAI 토큰을 선택합니다. 그다음 ETH의 공급량을 결정하면 유니스왑이 이를 기준으로 함께 예치해야 할 DAI의 개수를 결정해줍니다. 유동성 공급자는 공급해야 할 토큰의 양을 확인한 후 예치하면 유동성 공급이 완료됩니다.
아티클을 작성하는 시점에서 0.01ETH를 공급하기 위해 함께 예치해야 하는 DAI의 수는 26개입니다.
유니스왑 v3에서 ETH/DAI 풀에 유동성을 공급하기 위해서는 v2와 마찬가지로 공급창에서 ETH와 DAI를 선택합니다. 이후 ETH의 공급량을 결정하면 유니스왑이 이를 기준으로 함께 예치해야 할 DAI의 개수를 결정해줍니다. 그런데 이 과정에서 ‘DAI per ETH’의 가격 범위에 의해 DAI의 공급 개수가 변경되는 것을 알 수 있습니다.
‘DAI per ETH’는 1 ETH의 가격을 기준으로 결정된 DAI의 가격 범위이며, 유동성 공급자는 이 범위를 원하는 대로 결정할 수 있습니다. 가격 범위를 결정한다는 것은 공급한 토큰이 ‘특정 가격 범위 이내’에서 스왑될 때만 사용될 수 있도록 지정하는 것입니다.
첫 번째 사진에서 유동성 공급자가 선택한 가격 범위는 최소(Min price) 2,593.1이고 최대(Max price) 2,598.3입니다. 이는 1 ETH가 2,593.1 DAI와 2598.3 DAI의 가격 범위 안에서 스왑될 때 사용될 유동성을 공급한다는 것을 의미합니다. 이렇게 유동성을 특정 가격 범위안에서만 사용되도록 공급하는 것을 집중화된 유동성(Concentrated Liquidity)이라합니다.
아직 ‘사용될 유동성’이라는 용어를 이해하지 못해도 괜찮습니다. 이 용어는 이어지는 글을 읽으며 이해할 수 있습니다.
이 가격 범위가 바뀔 때마다 ETH와 함께 공급해야 할 DAI의 개수가 변하는 것을 알 수 있습니다. 첫 번째 조건에서 함께 공급해야 할 DAI의 개수는 19.3541개이고, 두 번째 조건에서 함께 공급해야 할 DAI의 개수는 4.89758개입니다(위 그림의 Deposit Amount 참고).
조건이 어떠하든 v3에서 공급해야하는 DAI의 개수는 v2에서 공급해야 할 DAI 의 개수(26개)보다 적은 것을 알 수 있습니다. 이는 집중화된 유동성을 통해 스왑에 사용되지 않는 유동성을 공급자가 부담하지 않도록 하여 더 효율적인 유동성 공급을 할 수 있도록 만든 것입니다. 여기서 스왑에 사용되지 않는 유동성은 게으른 유동성(Lazy Liquidity)라고 하며, 효율적인 유동성 공급의 결과를 높은 자본 효율성(Higer Capital Efficiency)라고 합니다.
유니스왑 v2의 게으른 유동성
게으른 유동성은 풀에 공급된 유동성 중 실질적인 토큰 스왑에 사용되지 않는 유동성을 뜻합니다. 이 의미를 알아보기 위해 토큰 스왑량에 따른 유동성 사용 범위를 살펴보겠습니다.
x와 y 토큰으로 구성된 x/y 풀의 현황이 아래와 같다고 가정합니다.
스왑 전 x/y 풀 현황
- x 토큰 리저브: X = 1,000
- y 토큰 리저브: Y = 4,000
- 풀의 유동성: L² = 4,000,000
- 풀의 기준 가격: √P = $2
- x 토큰 가격: $2
- y 토큰 가격: $0.5
거래자가 위 풀에서 y 토큰을 x 토큰으로 스왑하면 풀의 현황은 다음과 같이 변경됩니다.
y 토큰 스왑
- 거래자가 x/y 풀에 y 토큰 2,000개를 스왑합니다.
- 거래자는 CPMM 과정으로 계산된 334개의 x 토큰을 받습니다.
- x/y 풀에서 y 토큰 거래를 위해 사용된 유동성은 334개의 x 토큰입니다.
y 토큰 스왑 후 풀 현황
- x 토큰 리저브: X = 666
- y 토큰 리저브: Y = 6,000
- 풀의 유동성: L² = 4,000,000
- 풀의 기준 가격: √Pa = $3
- x 토큰 가격: $3
- y 토큰 가격: $0.33
위 스왑 과정에서 사용된 x 토큰은 334개이며, 이를 사용된 유동성이라 부릅니다. 이 스왑으로 인해 각 토큰의 리저브와 토큰 가격이 변화했습니다.
이제 좀 더 많은 양의 y 토큰을 추가로 스왑해보겠습니다.
- 거래자가 x/y 풀에 y 토큰 6,000개를 스왑합니다.
- 거래자는 CPMM 과정으로 계산된 334개의 x 토큰을 받습니다.
- x/y 풀에서 y 토큰 거래를 위해 사용된 유동성은 334개의 x 토큰입니다.
y 토큰 스왑 후 풀 현황
- x 토큰 리저브: X = 332
- y 토큰 리저브: Y = 12,000
- 풀의 유동성: L² = 4,000,000
- 풀의 기준 가격: √Pa = $6
- x 토큰 가격: $6
- y 토큰 가격: $0.17
첫 번째와 두 번째 스왑에서 총 668개의 x 토큰이 스왑 거래에서 사용되었습니다. 이로 인해 x 토큰의 리저브는 1,000개에서 332개로 줄어들었으며, 이에 따라 x 토큰의 가격이 $2에서 $6으로 증가했습니다.
한편, 위 스왑에서 사용되지 않은 일부 332개의 x 토큰이 존재합니다. 이 토큰을 사용하기 위해서는 y 토큰의 풀 리저브가 무한대에 가까울 만큼 증가하도록 더 많은 양의 y 토큰 스왑이 이루어져야 합니다. 이 경우 풀의 기준 가격과 x 토큰의 가격이 +∞ 증가하며 y 토큰 가격은 0으로 감소하게 됩니다.
합리적인 거래자와 차익거래를 노리는 거래자에 의해 토큰이 거래된다면, 토큰 가격은 일반적인 시장 가격에서 크게 벗어나지 않을 것입니다. 다시 말해, 각 토큰의 가격이 0이 되거나 +∞이 될 만큼 거대한 양의 스왑이 이루어지지 않을 가능성이 큽니다. 이에 따라, 스왑에 사용되는 토큰의 개수도 제한적일 수밖에 없습니다.
이처럼 급격한 가격 변동이 일어날 만큼의 스왑이 발생하지 않는 이상 사용되지 않는 토큰을 게으른 유동성이라 부릅니다.
한편, 게으른 유동성 이슈는 슬리피지 이슈와 함께 발생합니다. 슬리피지는 유동성이 적은 풀에서 더 크게 발생하는데, 이 슬리피지를 해결하기 위해 유동성을 추가하면 게으른 유동성에 해당하는 토큰의 양이 더 많아지기 때문입니다.
유니스왑 v3 — 집중화된 유동성
유니스왑 v3에서는 게으른 유동성 이슈를 해결하기 위해 유동성 공급 방법을 바꾸었습니다. 이전까지는 유동성을 공급할 때 모든 가격 범위에서 공급해야 했지만, v3에서는 가격의 범위를 지정하여 유동성을 집중적으로 공급할 수 있게 되었습니다. 유니스왑은 이처럼 공급한 유동성을 집중화된 유동성 (Concentrated Liquidity)라 합니다.
가격 범위는 토큰 스왑에 따라 변경되는 요소인 각 토큰의 리저브, 풀의 기준 가격, 각 토큰의 가격, 풀의 유동성은 아주 밀접한 관계가 있습니다. 이 관계를 이해하면 집중화된 유동성에 대해 쉽게 이해할 수 있습니다.
- 검은 점선: 스왑 전 그래프
- 파란 점선: y 토큰을 x 토큰으로 스왑한 그래프
- 주황 점선: x 토큰을 y 토큰으로 스왑한 그래프
현재 풀의 유동성이 X, Y라고 가정하면, 풀의 기준 가격은 √Pc, 풀의 리저브는 C입니다.
x 토큰 스왑 (주황 점선)
- y 토큰 리저브: Y → Ya (감소)
- x 토큰 리저브: X → Xa (증가)
- 풀의 기준 가격: √Pc → √Pa (감소)
- 풀의 리저브: C → Ca
y 토큰 스왑 (파란 점선)
- y 토큰 리저브: Y → Yb (증가)
- x 토큰 리저브: X → Xb (감소)
- 풀의 기준 가격: √Pc → √Pb (증가)
- 풀의 리저브: C → Cb
위 상황에서 풀의 기준 가격이 √Pa과 √Pb 사이일 때 사용되는 각 토큰의 리저브는 X -Xb개와 Y - Ya개입니다. 이를 그림으로 나타내면 아래와 같습니다.
풀의 기준 가격이 √Pa와 √Pb사이에서만 변동하리라 생각하는 유동성 공급자는 이 가격 범위를 지정한 후 필요한 토큰만 유동성으로 공급하면 됩니다. 이를 고려한 그래프는 다음과 같습니다.
위 그래프에서 빨간색 곡선은 v2의 풀 리저브이고, 보라색 곡선은 집중화된 유동성으로 공급한 풀의 리저브입니다. 먼저 빨간색 CPMM 그래프를 나타내는 수식은 다음과 같습니다.
보라색 그래프는 빨간색 그래프의 평행이동 그래프로 x 축으로 -Xb 만큼, y 축으로 -Ya 만큼 평행이동한 그래프입니다. 이를 고려하여 집중화된 유동성을 나타내는 CPMM 수식은 다음과 같은 과정으로 만들 수 있습니다.
아래 과정의 자세한 내용은 2편 CPMM 이해하기를 참고해주세요.
Xb와 Ya를 기준 가격 √P와 토큰 유동성 L로 나타내면 다음과 같습니다.
위 식을 통해 v3의 유동성 함수를 재정의할 수 있습니다.
위 식은 유니스왑 v3 백서에서 확인할 수 있는 수식과 같습니다.
위 과정에서 주목해야 할 것은 풀의 유동성 값인 L² 의 변화입니다.
- v2의 CPMM: L² = 4,000,000
- v3의 집중화된 유동성: L² = 1,000,000
가격 범위를 지정하면 공급해야 하는 유동성의 범위가 제한되기 때문에, 전체 가격 범위에 대한 유동성 공급보다 그 양이 줄어들게 됩니다. 위 예시에서는 동일한 풀에 대해 유동성 공급 효율이 4배 증가했습니다.
물론 이 유동성 공급 효율이 유의미하기 위해서는 스왑이 일어나리라 예측되는 가격 범위를 잘 설정해야 합니다. 가격 범위를 설정하여 유동성을 공급한다는 것은 자신이 지정한 범위 이외에 다른 가격 범위에서 토큰이 주로 스왑된다면, 자신의 유동성은 사용되지 않을 것임을 의미하며, 이는 유동성의 공급 의미가 사라지는 것이기 때문입니다.
유니스왑 스테이블/스테이블 풀 현황
유니스왑이 집중화된 유동성으로 유동성 공급 방법을 바꾸기 전, CPMM에서 가지고 있었던 게으른 유동성 이슈는 토큰의 가격이 기준 가격에서 크게 벗어나지 않도록 설계된 스테이블 코인의 스왑에서 두드러지게 나타났습니다.
USDC, USDT와 같은 달러 기반의 스테이블 코인은 그 가격이 $1에 최대한 가깝게 유지되도록 설계되어있습니다. 동일한 가치를 갖는 자산의 교환에는 슬리피지가 거의 발생하지 않도록 설계된 CSMM(Constant Sum Market Maker )모델에 의해서 AMM이 구성될 수 있습니다.
유니스왑 v2는 USDC/USDT와 같은 스테이블 코인의 풀에 유동성을 공급할 때 모든 기준 가격 범위에 유동성을 공급하도록 설정되었습니다.
그림에서 직관적으로 확인할 수 있듯이 스테이블 코인 간의 스왑에서는 실제로 사용되지 않은 게으른 유동성이 발생하여 효율적인 자본 활용이 이루어지지 않았습니다. 이에 스테이블 코인의 스왑을 지원하는 DEX인 Curve finance는 유니스왑의 CPMM과 다르게 특정 가격대에서 가격 변동 폭이 크지 않은 AMM을 다음과 같이 구성했습니다.
위 수식을 고려하여 스테이블 스왑, curve finance, 유니스왑 v2의 CPMM 그래프를 비교하면 다음과 같습니다.
위 그래프를 통해 유니스왑의 CPMM 방식보다 Curve Finance의 AMM이 실제 스테이블 코인 간의 거래(CSMM)에서 게으른 유동성이 현저히 적음을 알 수 있습니다.
최근, Paradigm에서 Uniswap v3: The Universal AMM 이라는 제목의 아티클에서 유니스왑 v3의 집중화된 유동성을 통해 특정 가격 범위에 유동성을 공급하면, DEX 상의 존재하는 유명 AMM 모델을 모두 구축할 수 있다고 소개했습니다. 이 아티클에서는 $1 가격 범위에만 유동성을 공급하면 유니스왑 v3 풀에서도 충분히 Curve Finance의 모델도 구축할 수 있다고 주장되었습니다.
이와 같은 논리가 실제 시장에서 반영되고 있는지 확인하기 위해 유니스왑 v3의 USDC/USDT 풀의 유동성 공급 현황을 살펴보았습니다.
유니스왑 v3의 모든 풀의 유동성 공급 현황은 링크를 통해 확인할 수 있습니다
위의 풀 현황을 통해 1USDC = 1USDT 가격 범위에 대부분의 유동성이 공급되어 있음을 확인할 수 있습니다.
유동성 공급현황으로 확인하는 기대 가격
유동성 공급자가 공급한 가격 범위에서 토큰 스왑이 활발하게 이루어질수록 유동성 공급자는 많은 수수료를 얻을 수 있습니다. 다시 말해, 합리적인 유동성 공급자는 토큰의 거래가 활발히 이루어질 것이라 기대하는 가격 범위에 유동성을 집중적으로 공급할 것입니다. 즉, 유동성이 가장 많이 공급되어 있는 가격 범위가 ‘유동성 공급자가 기대하는 토큰 가격’이라고 예측할 수 있습니다.
물론 이러한 논리에는 어폐가 있을 수 있습니다. 모든 유동성 공급자는 자신이 기대하는 가격 범위가 아닌 다른 유동성 공급자가 일반적으로 많이 공급한 범위에 넣을 수도 있고, 혹은 더 많은 수수료를 얻기 위해 일반적으로 유동성이 많이 공급되지 않은 범위에 의도적으로 유동성을 공급할 수 있습니다. 위와 같은 논리는 하나의 참고 지표로 생각해주시면 됩니다.
마치며
유니스왑 v3에서의 가장 큰 개선점은 집중화된 유동성을 통해 자본의 효율성을 높인 것입니다. 변경된 유동성 모델에 의해 적은 양의 유동성 공급으로 같은 자본 효율을 구성할 수 있음은 유동성 공급자가 유니스왑 v3에 더 많은 유동성을 공급할 수 있도록 유인하는 데 큰 역할을 했다고 평가됩니다.
유동성 공급 모델 변화를 보며, 저는 개인적으로 아래와 같은 future 리서치를 하고 싶다는 생각이 들었습니다. 아래 리서치의 결과가 나오면 본 시리즈와 별개로 독자분들에게 소개하도록 하겠습니다.
- 유동성 공급현황이 암호화폐 가격 지표로 갖는 의미
- v3의 슬리피지 개선 효과를 정량적으로 확인
- 3개로 유동성이 분리된 풀의 가격 오라클 계산 방법
- 유니스왑 v3는 3가지 수수료 중 하나를 선택하여 유동성을 공급할 수 있도록 함
- 유니스왑은 풀의 가격 오라클을 각 풀의 거래를 기반으로 만드는데 3개로 나누어진 상황에서 어떤 모델(예: TWAP, VWAP, LWAP 등)로 가격을 결정하는지 리서치
다음 아티클에서는 위에서 간단히 소개한 다양한 AMM 모델의 종류와 자세한 내용을 모두 다루고자 합니다.