Crypto Currency

유니스왑 V3 - 집중화된 유동성(Concentrated Liquidity)

글 읽기에 앞서

본 글에서 다양한 영어 표현이 나오지만, 번역 상 자연스럽지 못할 수도 있습니다. 따라서 제가 사용하는 용어를 정리하고자 합니다.

  • Reserves: LP 풀에 스테이킹된, 예치된, 예금된 총량입니다. 저는 '예금'이라고 하겠습니다.
  • LPs: 유동성 공급자
  • User: 유저. 스왑 등의 행위를 하는 사람

본 글은 기존 포스트를 선행적으로 읽으셔야 이해되는 부분이 있습니다.

 

관련 글

 


유니스왑 V3

유니스왑 V1,V2에서 쓰인 CFMM(Constant Function Market Makers; 상수 공식을 이용한 자동화된 마켓 메이커)은 비효율적입니다. 그 이유는, 유동성 풀에 예금되어 있는 자산의 일부분만 특정 가격에 활용가능하기 때문입니다.

 

커브나 일드스페이스는 이러한 예금들사이를 표현하기 위한 다른 함수를 사용하는 풀을 개발했습니다. 그러나 이러한 방법은 유동성 풀에 있는 모든 유동성 제공자들이 단 하나의 공식(x+y=k, x*y=k 등)에 맞춰야 한다는 요구사항이 있고, 만약 유동성 제공자들이 자신의 유동성을 다른 가격 범위에 제공하고 싶어하면 유니스왑 V1,V2의 경우와 마찬가지로 유동성 분해(liquidity fragmentation)가 발생합니다.

 

유니스왑 V3에서 달라지는 부분은 크게 다음과 같습니다.

  • 집중화된 유동성(Concentrated Liquidity)
  • 유연한 수수료(Flexible Fees)
  • 프로토콜 수수료 거버넌스
  • 향상된 가격 오라클
  • 향상된 유동성 오라클

 

집중화된 유동성(Concentrated Liquidity)

유니스왑 V3의 하이라이트입니다.

 

 

유동성 제공자들은 이제 그들의 유동성을 임의적인 가격 범위(arbitrary price range)에 묶음(bounding)으로써 그들의 유동성을 집중화할 수 있는 능력을 받게 됩니다. 이것은 풀의 자본적 효율성을 증가시키고, 유동성 제공자들이 선호하는 reserve curve(ex. x*y=k 등의 그래프)를 맞출 수 있게 합니다. 그리고 여전히 풀의 나머지는 효율적으로 집계된 상태를 유지합니다.

 

기존의 유니스왑의 유동성은 x*y=k 의 공식으로 균일하게 분배되었습니다. 두 자산의 예금 X,Y와 일정하게 유지되는 k를 이용해서 말이죠. 즉, 앞선 버전은 유동성이 모든 가격 범위(0~무한대)에 적용되도록 디자인되었다는 것입니다. 이것은 유동성으로 하여금 효율적으로 집계(aggregated)되게 하지만, 많은 수의 자산들이 풀 안에 touch 없이 남겨지고 있다는 것을 뜻하기도 합니다.

 

유니스왑 V3에서는 유동성 제공자들의  이 가격 범위를 더 좁게(0~finite) 설정하도록 합니다. 유동성 제공자들의 position이 더 좁은 가격 범위를 가지게 하여, 포지션은 단지 그 가격 범위 내에서의 거래를 충분히 지지(support)해줄 만한 예금(reserve)만 유지(maintain)하면 됩니다. 그럼으로써 더 큰 예금을 가진 constant product pool(cf. 상수 AMM 모델을 사용하는 Pool)처럼 행동할 수 있게 됩니다. 이것을, 실질적으로 예금이 늘어나진 않았지만 가상적으로 늘어났다는 점에서 virtual reserves라고 합니다.

 

 

 

Figure 1: Simulation of Virtual Liquidity

가격 범위가 [Pa,Pb]를 가진다고 하면, 현재가 Pc는 이 안에 있게 됩니다. 가격이 포지션의 가격 범위에서 벗어나면, 포지션의 유동성은 더 이상 활성화되지 않고 더 이상 수수료도 얻을 수 없게 됩니다. 그리고 유동성은 완전히 한 자산에게만 집중되고 다른 자산은 완전히 없어(depleted)집니다. 만약 가격이 범위 내로 되돌아오면, 유동성은 다시 활성화됩니다.

Figure 2: Real Reserves

위 그림을 보면 가격 범위가 b점을 벗어나 더 좌상향하게 되면, virtual reserves는 비활성화되고 real researves가 활성화되어 화살표 끝 점으로 도달하여 X Reserves 가 극단적으로 0에 수렴하는 것을 볼 수 있습니다.

 

 

유동성 공급자들은 원하는 만큼 포지션을 만들 수 있고 각각 가격 범위를 설정할 수 있습니다. 이러한 방법에서는, 아래 Figure 3의 (III)의 경우와 같이 가격 범위에 따라 유동성의 공급을 원하는대로 배분할 수 있습니다. 그리고 주어진 가격 범위에서 부과된 수수료는 LP가 해당 범위에 기여한 유동성 양에 비례하여 배분됩니다.

 

Figure 3: Example Liquidity Distributions

 

게다가, 이러한 메커니즘은 시장으로 하여금 어디에 유동성이 위치해야 하는지 결정하게 할 수 있습니다. 합리적인(rational) 유동성 제공자들은 그들의 현재가에 가까운 좁은 가격 범위(narrow band)에 집중시키며 자본적 비용을 낮출 수도 있고, 그들의 유동성을 활성화(active; touch될 수 있게)시킬 수 있도록 가격에 맞춰 토큰을 추가하거나 제거시킬 수도 있습니다.

 

범위 주문(Range Orders)

새로운 주문 방식은 기존의 주문 방식(limit order)과 두 가지의 차이가 있습니다.

  • 포지션의 범위를 좁힐 수 있는 제한(limit)이 생깁니다. 가격이 범위 내에 있는 동안, 그 제한 주문은 부분적으로 실행될 것입니다.
  • 포지션이 범위를 벗어나면(crossed), 그 포지션은 중단(withdrawn)될 것이고, 그렇지 않고 가격이 범위 내로 돌아온다면 포지션은 거래를 효과적으로 보류(reservsing)하여 원래대로 거래될 것입니다.

 

V3의 유동성 제공자들은 같은 자본으로 기존보다 훨씬 더 큰 유동성(greater depth)을 제공할 수 있도록 선택할 수 있습니다. 이는 더 큰 수수료 수익을 얻을 수 있으면서 더욱 큰 비영구적 손실 리스크를 지게 됩니다.

 

스테이블 풀의 유동성 제공자들은 적은 범위를 설정할 수 있습니다. $0.99 ~ $1.01 와 같이 말입니다. 만약 스테이블코인의 가격이 해당 가격 범위 내를 유지한다면, V2대비 2000배에 가까운 유동성을 제공할 수 있을 것입니다. 즉 가격 범위가 좁아질 수록, 집중화된 유동성 효과는 매우 커집니다.

 

 

요약

이제 유동성은 특정 가격 범위에서 추가적인 유동성을 제공함. 해당 가격 범위 내에서는 슬리피지가 줄어들 것. 변동이 심하여 가격 범위를 벗어난다면 원래 방식대로 적용됨.

 

구조적 변경(ARCHITECTURAL CHANGES)

유니스왑 V3에서는 몇 가지 구조적 변경이 이루어졌는데, 몇몇은 집중화된 유동성과 관련된 것이고 다른 몇몇은 독립적인 것들입니다.

 

페어당 다중 풀(Multiple Pools Per Pair)

유니스왑 V1,V2에서는 모든 토큰들의 페어는 하나의 LP에 상응(correspond)하며 모든 스왑에 일관된 0.3%의 수수료를 적용했습니다. 이것이 잘 적용될 때도 있었지만 몇몇의 풀(스테이블코인끼리의 페어와 같은)에서는 너무 높은 것이었고, 몇몇의 풀(변동성이 크거나 거의 거래가 되지 않는 토큰)에서는 너무 낮은 것이었습니다.

 

유니스왑 V3에서는 각각의 토큰 페어에 다중 풀을 적용하여, 각각 다른 스왑 수수료를 적용합니다. 모든 풀은 처음 만들어질 때(factory contract) 수수료 티어가 정해집니다. 0.05%, 0.03% 그리고 1% 입니다. 추가적인 수수료 티어는 UNI 거버넌스에 의해 실행됩니다.

 

요약

일관된 수수료율을 적용하는 것은 스테이블코인 페어에서 불리, 잡코인 페어에서 유리했음. 이제 풀의 수수료율은 가변적이며 최초 수수료 티어(0.05%, 0.03%, 1%) + 거버넌스로 정해지는 추가적인 수수료 티어(최초 0%, 변동가능) 로 이루어짐. 잡코인 페어에서 수수료율이 올라감에 따라, 그 보상도 더욱 높아질 것.

 

대체 불가능한 유동성(Non-Fungible Liquidity)

Non-Compounding Fees. 이전 버전에서는, 얻은 수수료는 풀 안에 유동성으로써 축적(compound)됐었습니다. 즉, 시간이 지남으로써 풀 안의 유동성이 성장하게 되고, 심지어 명백한(explicit) 출금 없이도 수수료 수익은 계속하여 누적(compound)되었습니다.

 

유니스왑 V3에서는 포지션의 대체불가능한 성질(각각 가격 범위와 수량이 다름) 때문에, 이러한 것이 더이상 가능하지 않습니다. 대신에, 수수료 수익은 따로(seperately) 저장되고, 개별적인 토큰으로써 존재하게 됩니다.

in Uniswap v3, fees are collected in the tokens themselves rather than in liquidity (Uniswap V3 Whitepaper, 6.2.2)

 

더보기

Removal of Native Liquidity Tokens. 이전 버전에서는, 풀의 계약은 곧 ERC-20 토큰의 계약이었습니다. 이것은 편리했지만 유니스왑 V2의 철학과 쉽게 동화되지 못했었고, 개선된 ERC-20 토큰의 wrapping을 새로 만드는 것에 있어서 장애물(discourage)이 되었습니다.

 

유니스왑 V3에서는 풀 계약이 ERC-20 표준(standard)를 이행(implement)하지 않습니다. 누구나 ERC-20 토큰을 더 대체가능하게(fungible) 만들 수 있지만, 그들은 분배를 어떻게 다룰지, 재투자를 어떻게 다룰 지 등에 대한 추가적인 논리(logic)를 만들어야 할 것입니다. 아니면 ERC-721의 대체불가능한 토큰 안에서 개별적인 유동성 포지션을 wrap 하는 계약을 만들 수도 있습니다.

 

GOVERNANCE

유니스왑 V3에서는 거버넌스가 스왑 수수료의 일부분을 정할 때 더욱 유연해집니다. 또한, 거버넌스는 추가적인 수수료율 티어를 추가 할 능력을 가집니다. 그리고 최초의 수수료율을 정할 때 티어에 상응하는 tickSpacing을 정의하는데, 0.05%에서 10의 tick spacing-틱마다 대략 0.1%, 0.3%에서 60의 tick spacing-틱마다 대략 0.6%, 그리고 1%에서 200의 tick spacing-틱마다 대략 2.02% 등...인데 복잡하니 생략하겠습니다.

 

오라클 업그레이드

유니스왑 V3에서는 V2의 TWAP(time-weighted average price) 오라클에서 세 가지의 중요한 변화가 있었습니다. 가장 중요한 것은, V3에서는 유저들이 외부에서 축적된 이전 가격(value)들을 추적(track)할 필요가 없어졌습니다. V2에서는 유저들이 계산하고 싶어하는 TWAP에서 일정 기간의 시작과 끝에서 축적된 가격(accumulator value)을 체크했어야 했습니다.

 

유니스왑 V3에서 축적 체크포인트를 코어 안으로 들여왔기 때문에, 외부 계약을 TWAP의 온체인 위에서 실행할 때 축적된 가격의 체크포인트의 저장이 필요없어졌습니다.

 

또 다른 변경사항으로는 가격들의 합을 축적시키는 대신, 유저들로 하여금 TWAP을 산출하도록 허락했다는 것이고, 유니스왑 V3는 로그 가격의 합을 추적하여 유저들이 TWAP의 기하학적 계산을 할 수 있도록 합니다.

 

마지막으로, 유니스왑 V3는 가격 축적에 따라서 유동성도 축적시킵니다. 이 유동성 축적기는 TWAP을 더욱 더 신뢰성있게 해 줄 것입니다.

 


관련 글


 

무료 계정 만들기 | Binance

지금 바이낸스에서 계정을 등록하십시오

accounts.binance.com

 

Join me on TradingView, this place is awesome.

If you eventually grab a paid plan, we each get $30 as a bonus!

kr.tradingview.com