커브 StableSwap 톺아보기

JiJay
16 min readFeb 22, 2022
curve.fi

커브를 이해하기 위해서는 커브의 핵심적인 기능인 StableSwap에 대한 백서를 이해해야한다.

커브의 StableSwap에 대한 백서(StableSwap — efficient mechanism for Stablecoin liquidity)는 6장으로 분량은 짧지만 많은 내용이 요약되어 있어 이번 글에서는 백서의 내용을 톺아보려 한다.

일반적으로 코인은 해당 네트워크의 기축 통화(BTC, ETH..)를 말하며 토큰은 해당 네트워크의 각 서비스 또는 프로토콜에서 발행되는 거버넌스 또는 유틸리티 통화를 말합니다.

다만, 이번 글에서는 편의를 위해 모두 코인으로 용어를 통일합니다

이번 글에서는 백서의 내용뿐 아니라 제 의견과 백서의 요약된 부분을 보충하는 내용이 포함되어 있습니다. 또한, 미디엄 특성상 수학 공식을 적기 어려워 노션에 작성 후 미디엄으로 글을 옮겼습니다. 원본은 다음과 같습니다.

Abstract

커브의 StableSwap은 스테이블 코인들을 위한 AMM이며 낮은 수수료와 최소한의 슬리피지가 특징이다. 커브의 StableSwap은 USDC, DAI, USDT와 같은 스테이블 코인뿐만 아니라 동일한 가치의 코인들의 Swap에도 장점이 있다. 예를 들어, BTC를 이더리움에서 Wrapping한 renBTC와 WBTC는 모두 실제 BTC와 1:1로 대응되며 동일한 가치를 가진다. 따라서, renBTC와 WBTC는 StableSwap에 적용하기 좋다.

실제 커브에는 renBTC와 WBTC 풀이 존재한다.

Wrapped 코인이란?특정 네트워크에 있는 코인을 다른 네트워크에서 사용하기 위해 Wrapping된 코인이다.예를 들어, 비트코인은 이더리움 네트워크에서 원래 사용이 불가하지만 BTC를 Wrapping한 WBTC를 사용할 수 있다. 이때, WBTC는 BTC와 1:1로 교환 가능하다.

커브는 유니스왑과 비슷하게 AMM을 활용한 탈중앙화된 거래소이기 때문에 스테이블 코인을 위한 유니스왑이라고도 부른다. StableSwap 방식은 스테이블 코인뿐만 아니라 모든 풀에 적용이 가능하지만 가격 변동이 큰 풀의 경우 효과가 좋지 않으며 Uniswap과 크게 다르지 않다.

또한, 커브의 풀 특성상 가격 변동성이 크지 않기 때문에 비영구적 손실도 적다.

정리하면, 커브는 스테이블 코인 및 가치가 동일한 코인들의 Swap에 특화된 서비스로 낮은 슬리피지와 수수료로 거래자들의 부담을 낮췄고 낮은 비영구적 손실로 LP들의 잠재적 위험성도 낮췄다. 수수료와 슬리피지가 낮아 거래가 많이 일어나면 거래 수수료가 늘어 LP들이 더 많은 유동성을 제공하고 유동성이 더 많아지면 슬리피지가 낮아져 거래가 많아지는 선순환이 일어난다. 반대로, 비영구적 손실이 적어 LP들이 유동성을 많이 공급하면 그만큼 슬리피지가 낮아져 많은 거래가 일어나고 많은 거래 수수료로 더 많은 LP들이 유동성을 제공하는 선순환 또한 일어난다. 또한, 변동성이 큰 가상화폐 특성상 디파이에서 스테이블 코인은 필수적이며 그만큼 수요가 많다. 이러한 특성들로 커브는 현재(2022년 2월 20일) Defiliaima 기준 TVL(Time Value Locked) 1등을 기록하고 있다.

Introduction

스테이블 코인은 최근 인기가 많아졌지만 비용 때문에 거래가 쉽지 않았다. 스테이블 코인은 크게 custodia과 decentralized로 나뉘는데 custodia은 USDC, USDT, BUSD, PAX, TrueUSD 등이 있으며 중앙화된 단체에서 실제 달러를 금고에 보관하고 그에 맞게 스테이블 코인을 발행하는 형태를 말한다. decentralized는 MakerDAO에서 발행되는 DAI가 있으며 담보를 예치하면 스마트 컨트랙에서 그에 맞게 스테이블 코인을 발행하는 형태다. 담보의 가치가 변할 수 있기 때문에 MakerDAO에서는 청산이 일어나기도 한다.

테라의 UST와 같이 알고리즘적으로 스테이블 코인을 발행하는 형태도 존재한다.

또한, 커브 백서에는 많은 디파이 유저들이 예치 이자율을 위해 랜딩 프로토콜에 스테이블 코인을 예치한다는 점을 언급한다.

즉, 거래자들은 스테이블 코인 거래가 비용이 비싸 거래가 쉽지 않은 문제가 있으며 스테이블 코인 보유자들은 어느정도 이자(APR)가 있다면 예치를 할 것이다.

APR이란?
Annual Percentage Rate의 약자로 단리로 계산되는 1년 이자율이다.
ex) 1000만원을 예치했는데 APR이 10%라면 100만원을 이자로 받는다.

스테이블 코인을 위한 StableSwap은 수요 측면에서는 Uniswap보다 100배정도 슬리피지가 낮으며 공급 측면에서는 300% APR에 가까운 이자를 LP들에게 줄 수 있다고 말한다. APR이 높기 때문에 LP들이 유동성을 공급할 것이며 낮은 슬리피지로 기존에 거래가 힘들었던 거래자들이 거래를 할 것이라는 뜻이다.

300%의 값은 차익 거래가 계속 일어난다는 가정하에 지난 6개월동안의 거래량과 가격을 고려하여 계산된 값이다.

How it works

백서에서는 Stable swaps를 설명하기 전에 기존 방식에 대해 설명한다.

Swap을 한다는 것은 X 코인 몇개를 예치했을 때 Y 코인을 몇개를 지급해야하는지 계산 되어야 한다는 뜻이다.

이번 장에서는 이것을 계산하는 여러 방식을 소개하며 각각의 한계와 그 한계를 해결하고자 하는 StableSwap을 소개한다.

Linear invariant(Constant Sum Market Maker)

1달러의 동일한 가치를 가지는 X와 Y 코인이 있다고 가정하자.

동일한 가치를 가지기 때문에 100개의 Y를 인출하기(사기) 위해선 100개의 X를 예치(팔기) 해야한다. 즉, -100y = 100x가 된다. 기존에 X 코인 200개, Y 코인 200개가 있었다면 거래가 일어난 후 X 코인 300개, Y 코인 100개가 있을 것이다. 기존에도 X 코인의 개수와 Y 코인의 개수의 합은 400이고 거래가 일어난 후에도 X 코인의 개수와 Y 코인의 개수의 합은 400이다. 이를 식으로 나타내면 아래와 같다.

이때 k는 상수 값이다(위 예에서는 400)

위 식을 여러개의 코인으로 일반화하면 다음과 같다

이를 linear invariant라고 한다.

X와 Y의 코인의 가격이 다르다면?Y 코인이 X 코인에 비해 5배 비싸다면 linear invariant는 다음과 같다.                              5x + y = k
https://alvarofeito.com/articles/curve/

풀의 규모와 상관 없이 가격이 항상 일정하기 때문에 슬리피지가 없다.

Linear Invariant의 문제점

현재 DEX의 고질적인 문제는 슬리피지인데 슬리피지가 없는 것은 좋은게 아닌가라고 생각할 수 있다.

실제로 슬리피지가 없게 하는 것은 DEX들의 영원한 꿈일 것이다.

하지만 Linear invariant 방식에는 큰 문제점이 있다.

바로 Pool을 균형 있게 유지하기 힘들며 특정 코인이 풀에서 없어질 수도 있다는 문제점이다.

위 예시에서는 k가 400으로 유지만 되면 되기 때문에 X가 0, Y가 400개가 있어도 문제가 없는 것이다.

이것이 왜 문제가 될까?

우리가 스테이블 코인이라고 부르는 코인들은 항상 가격이 동일하게 유지가 되진 않는다. 시장 상황에 따라 가격이 변동할 수 있으며 X가 0, Y가 400가 되었다는 뜻은 외부 시장에서 X 코인의 가치가 급등했거나 Y 코인의 가격이 급락했다는 뜻이다. 외부 시장에서는 X가 Y보다 비싼데 현재 풀에서는 X와 Y의 가치가 같기 때문에 외부 시장에 비해 X가 싸다는 뜻이다. 따라서, 현재 풀에서 X를 사서 외부 시장에 팔면 시세 차익을 볼 수 있다. 마찬가지로 Y 코인이 외부 시장에서 급락하게 되면 Y 코인에 비해 X 코인이 비싸다는 뜻이기 때문에 외부 시장에서 상대적으로 싼 Y 코인을 사서 풀에서 X 코인을 산 뒤 외부 시장에 팔면 시세 차익을 볼 수 있다.

즉, 크립토 시장에서 스테이블 코인은 항상 가치가 유지되는 것은 아니며 항상 가치가 동일하다는 가정하에 만들어진 linear invarinat 방식은 가격이 변동하는 시장에 취약할 수 있다. 커브에서는 이를 price oracle를 통해 해결할 수 있으나 이는 위험이 존재하며 탈중앙화되어있지 않다고 말한다.

Price Oracle 사용?Price Oracle를 사용하면 위에서 말한 문제를 어느정도 해결할 수 있다. X:Y = 1:1의 가정하에 만들어진 linear invariant 풀이 oracle을 계속 참조하며 X와 Y의 상대적 가치를 조정하는 것이다.

CPMM

Uniswap과 같이 가격 변동성이 큰 코인의 스왑을 지원하는 AMM에서는 따라서 Linear Invariant 방식은 부적합하다. Uniswap에서는 항상 X와 Y의 달러 가치가 동일하게 유지되도록 풀을 재조정한다. 이를 위해 X의 개수와 Y의 개수의 곱을 일정하게 유지한다.

이를 여러 코인에 일반화하면 다음과 같다.

이를 CPMM(Constant Product Market Maker) 또는 constant-product invariant라고 한다. 자세한 내용은 Uniswap의 글을 참고하길 바란다

CPMM의 문제점

CPMM으로 풀이 재조정되고 풀의 유동성이 바닥나는 것을 막을 수 있지만 슬리피지가 발생하며 모든 가격에 대해 유동성을 공급하기 때문에(어떠한 가격이든 유동성이 존재해야한다) 가격이 일정한 풀일 경우 자본을 비효율적으로 활용하게 된다.

Stableswap

StableSwap은 쉽게 생각하면 linear invariant와 constant product invariant의 중간이라고 생각하면 된다.

즉, 1달러 근처에서는 linear invariant처럼 동작하다 1달러에서 멀어지면 constant-product invarint처럼 동작하게 하는 것이다. 따라서, linear invariant에서는 1달러 근처에서는 슬리피지가 굉장히 작으면서도 가격이 변동해도 풀이 바닥나지 않는다.

https://alvarofeito.com/articles/curve/

위 그래프에서 풀에는 x 5개, y 5개가 존재하며 가격은 1이다.

Stableswap invariant를 보면 x와 y의 개수가 같은 지점 근처에서는 linear invariant와 같이 직선처럼 진행하다 x와 y의 개수가 불균형해지면 Uniswap invariant와 같이 곡선처럼 진행하는 것을 볼 수 있다.

StableSwap은 linear invariant와 constant product invariant의 중간이라고 언급했는데 StableSwap invariant에서는 ‘amplification coefficient’(A)라는 값으로 이 둘의 영향력을 조절한다. 쉽게 표현하면 아래와 같다.

A의 값이 커질 수록 linear invariant에 가까워지며 A의 값이 작아질 수록 constant product에 가까워진다.

https://curve.fi/files/stableswap-paper.pdf

위 그래프는 A에 값이 100일 때의 그래프인데 유니스왑에 비해 슬리피지가 적은 것을 볼 수 있다. 또한, x의 변화량이 많아져 가격이 변동하면 uniswap처럼 동작하여 어떤 가격에도 유동성을 제공한다.

Constructing the StableSwap Invariant

Fig 1에서 보이는 것처럼 StableSwap invariant는 동일한 가치일 때는(x=5, y=5) 직선(linear invariant)에 가까우며 풀의 균형이 깨질 수록 곡선(constant product invariant)에 가까워져야한다.

앞에서 linear invariant와 constant product invariant의 일반화된 공식은 다음과 같았다.

linear invariant

constant product invariant

여기서 코인들의 가격이 같다면 다음과 같이 된다.

linear invariant

constant product invariant

여기서 D는 코인들의 가격이 같을 때 코인들의 총 개수이다.

ex) x = 10, y = 10, D = 20

즉, linear invariant에서는 k값이 코인들의 총 개수가 되며, constant product invariant에서는 k값이 D와 n(코인의 개수)으로 결정된다.

linear invariant의 경우 모든 코인의 가치가 같기 때문에 모두 같은 개수일 수밖에 없고 따라서 D가 된다.

예를 들어보자

DAI와 USDC는 모두 1달러에 페깅된 스테이블 코인이다. 따라서, 외부 요인이 없다면 가격이 1달러로 같을 것이며 풀에 같은 개수가 있을 것이다.

풀에 DAI 15개, USDC 15개가 있다고 가정해보자.

위 공식에 대입해보면 다음과 같다

DAI + USDC = 30 = D

DAI * USDC = 15 * 15 = 225 = (30 / 2)²

따라서, 가격이 똑같다면 또는 풀이 균형 잡혀있다면 Stableswap의 invariant의 가장 간단한 형식은 다음과 같다.

하지만 실제로 위 공식으로 그래프를 그려보면 Uniswap과 거의 비슷하다.

https://alvarofeito.com/articles/curve/

따라서, linear invariant의 영향력을 키우기 위해 linear invariant에 \chi(chi)라는 값을 곱해준다.

앞서 StableSwap에는 linear invariant의 영향력을 결정하는 amplified coefficient(A)가 존재한다고 언급했다. A의 값이 커지면 linear invariant에 가까워진다. 이는 A의 값은 풀마다 다르며 거버넌스에 의해 변경될 수 있지만 알고리즘적으로 변경되지는 않으며 고정된 상수이다. 즉, A의 값은 해당 풀이 다른 풀에 비해 전체적으로 얼마나 더 linear invariant에 가깝게 할 것이냐를 결정하는 값이다. chi는 해당 풀 내에서 코인들의 balance에 따라 A의 영향력을 결정하는 변수이다.

예를 들어, 완전히 균형 잡힌 풀이라면 chi = A이지만 불균형하다면 chi = 0.5A가 된다. 풀 균형에 따라 A의 영향력이 달라지긴 하지만 A의 값이 애초에 클수록 A의 값이 작은 풀보다 chi의 값이 커져 똑같이 불균형하더라도 더 linear invariant에 가깝다. 같은 10%라도 분모에 따라 절대적인 값이 다른 것과 같다.

chi가 풀의 균형에 따라 A의 영향력을 동적으로 결정하는 변수로 만들기 위해 아래와 같이 계산된다.

위 식에 따르면 풀이 불균형할수록 분자의 값이 분모에 비해 작아져 A의 계수가 작아지게 된다.

예를 들어, 풀에 코인은 2개이며(n=2) DAI 15개, USDC 15개 있었다고 가정하자.

수식의 간편화를 위해 코인이 2개라고 가정하자(x,y). 이때 n은 2가 된다.

linear invariant, constant product invariant와 같이 Stableswap invariant을 통해 거래 이후 제공해야하는 코인의 개수를 결정할 수 있다.

Curve에서 거래가 진행되는 순서는 다음과 같다.

  1. 먼저, 풀에 대한 amplification coefficient A를 정한다.
  2. 유동성을 추가한다.(이때 D의 값이 계산된다)
  3. X 코인을 예치한다
  4. Stableswap invariant에서 A, D, x의 값을 활용해 제공되어야 하는 y 값을 계산한다.

Simulation and performance

DAI, USDC, USDT를 대상으로 시뮬레이션을 돌렸을 때 최적의 A 값은 85, 최적의 수수료는 거래마다 0.06%였으며 LP들은 최대 312% APR를 받을 수 있었다.

Implementation

Stableswap의 식이 vyper 코드로 스마트 컨트랙에 구현되었다.

Other applications

Stableswap은 비단 스테이블 코인뿐만 아니라 Compound의 cToken과 같은 interest-bearing asset이나 스테이킹된 코인에도 적용이 가능하다. 이는 앞으로 디파이 생태계에 중요한 역할을 할 것으로 보인다.

Acknowledgment

이 글을 쓰는데 도움을 준 Kevin Lee, Donggun LEE 그리고 박가영님께 감사함을 전합니다.

References

--

--