오늘의 주제는 Uniswap에 대한 이야기야!! 공부를 하면서 유동성 풀에 대한 것과 LP 등 생소한 단어들이 많아서 쭉 정리해 보려고 포스팅했어!!
Uniswap
Uniswap은 DEX의 종류로 이더리움과 ERC-20 토큰 간 교환을 용이하게 해주는 프로토콜이야~~
Uniswap app에 들어가 보면 그냥 Swap에 ETH를 UNI로 바꾸는 페이지 밖에 없어
이렇게 토큰을 교환할 수 있는데, 그럼 토큰의 비율은 어떻게 결정되는 걸까?? 토큰도 환율이라는 개념이 존재할까??
그리고 이러한 거래는 어떻게 채결되는 것일까??
두 가지 궁금증을 한 번에 해결할 수 있는 개념이 있어!! 바로 AMM이야
AMM에 대해 알기 전에 오더 북에 대한 개념을 알고 있어야 해 상반되는 개념이거든!!
Order book이란 주식 시장이나 암호화폐 시장 등의 특정 시장에 존재하는 구매자와 판매자의 모든 매수 및 매도 주문을 기록한 전자 목록이야
이렇게 암호화폐 시장과 주식 시장처럼 특정 가격에 특정 물량을 거래하고자 하는 매수자, 매도자의 주문을 기반으로 거래가 체결되는 것이 오더 북이라고 한다
하지만 AMM은 AMM 알고리즘에 기반하여 자동으로 체결되는 형식인데 누구나 자유롭게 유동성을 공급하고, 유동성을 바탕으로 알고리즘에 의해 가격이 결정 돼
AMM을 구성하는 요소는 3가지가 있어
Token Pair: 거래되는 토큰 쌍. 예를 들어, 거래소에서 KRW로 ETH를 구매하거나 ETH를 KRW로 판매하는 것 모두 ETH/KRW 페어에서 거래하는 것. 이런 토큰 pair로 구된 유동성을 풀(pool)이라고 한다.
LP(Liquidity Provider): 토큰 페어를 이루는 두 가지 토큰에 대한 유동성을 풀에 공급하는 주체. 이렇게 공급된 유동성은 AMM의 가격 결정 알고리즘에 따른 가격에 거래가 이루어짐
Trader: 토큰 페어를 이루는 두 가지 토큰을 거래하는 주체자
말만 듣고는 어렵지??
자 코인을 하는 유령이 유동성을 추가하고 싶어. 그럼 ERC-20 토큰의 개수를 적어 그림에서는 A가 10, B가 50.
그러면 유령은 코인 A, B에 대한 유동성을 추가했지?? 그럼 유령이 LP가 되고, LP가 추가한 토큰의 쌍이 pool에 저장되는 거지
Uniswap은 AMM 알고리즘에서 CPMM 알고리즘을 사용해
CPMM(Constant Product Market Maker)는 모든 거래는 거래 후에 X * Y가 항상 일정하게 유지되어야 한다는 알고리즘이야. 그래서 x * y = k라는 공식이 나오지
그림에 있는 토큰으로 예를 들면 A가 10, B가 50이니까 x * y = 500 즉 k가 500이야.
k는 일정하게 유지되어야 해서 A에 의해서 B가 변화하거나 B에 의해서 A가 변해
예를 들어줄게 ㅎㅎ 어떤 사람이 A를 B로 교환하려고 1A를 유동성 풀에 예금했어. 그러면 풀에는 A가 10에서 11이 되겠지?? K가 11 * 50으로 550이 되어서 일관성이 없어지잖아?? 그래서 최대한 맞추기 위해 예금한 A의 수를 500으로 나눈 값이 B로 바뀌는 거지. 이런 알고리즘으로 교환하는 거래가 AMM인 거야.
또 원래 1A는 5B잖아 그런데 유동성 풀에 의하여 실질적으로 1A를 넣으면 4.13B를 받게 돼. 이렇게 풀에 의하여 가격이 차이나는 현상을 슬리피지라고 해
그럼 이러한 알고리즘들이 Uniswap에선 어떻게 적용이 될까??
Uniswap 과정
코드와 함께 흐름을 살펴보자~~
Step1. addLiquidity
ERC-20 <-> ERC-20 간의 유동성 풀 추가 함수이다.
tokenA, tokenB -> 유동성 쌍을 만들려는 토큰 추가
amountADesired(uint): B/A 가격 <= amountBDesired / amountADesired 일 경우 유동성에 추가할 tokenA
amountBDesired(uint): A/B 가격 <= amountADesired / amountBDesired 일 경우 유동성에 추가할 tokenB
amountAMin: 트랜잭션이 복구되기 전 B/A 가격이 상승할 수 있는 범위를 제한 <= amountADesired
amountBMin: 트랜잭션이 복구되기 전 A/B 가격이 상승할 수 있는 범위를 제한 <= amountBDesired
to: 유동성 토큰을 받을 주소
deadline: 트랜잭션이 복구되는 시간
amountA, amountB: 유동성 풀에 있는 토큰의 개수
liquidity: 발행된 유동성 토큰의 양
Step2. swapExactTokensForTokens
amountIn: 송금할 토큰의 양
amountOutMin: 트랜잭션이 복구되지 않도록 받아야 하는 출력 토큰의 최소 양
path: 토큰 주소의 배열, 연속된 주소의 쌍에 대한 풀이 존재하고 유동성이 있어야 함
path[0] = 입력 토큰의 주소, path[1] = 출력 토큰의 주소
to: 출력 토큰을 받을 주소
deadline: 트랜잭션이 복구되는 시간
amountOut: 출력 토큰의 양
amountInMax: 트랜잭션이 복구되기 전 필요한 최대 입력 토
path
to: 출력 토큰을 받을 주소
step3. removeLiquidity
tokenA, tokenB -> 유동성 쌍에 있는 토큰
liquidity: 제거할 유동성 토큰의 양
amountAMin: 트랜잭션이 복구되지 않도록 받아야 하는 토큰A양
amountBMin: 트랜잭션이 복구되지 않도록 받아야 하는 토큰B양
to: 받는 자의 기본 자산
deadline: 트랜잭션이 복구되는 시간
Liquidity Provider
자 이제 Uniswap이 어떠한 흐름으로 작동하는지 알겠찌??
그러면 여기서 의문이 들 수 있는 게 LP는 단순히 유동성만 제공하고 끝인가???라고 생각할 수도 있어.
하지만 LP는 유니스왑에서 중요한 역할을 해
Uniswap은 LP들이 거래 수수료 대부분을 가져갈 수 있도록 설계했지. 그래서 LP가 공급한 유동성양에 비례하여 LP토큰을 지급받게 되고 이 LP토큰은 곧 해당 풀의 거래 수수료에 대한 일종의 지분역할을 했어
그림으로 나타내면 어떤 사람이 1A를 풀에 보냈어. 이때 금액의 0.3%는 LP에게 수수료 보상으로 제공하고 나머지 0.9997A가 유동성 풀에 추가가 되는 거지. 그 이후 값으로 B를 구해.
만약 거래가 완료되었으면 수수료를 다시 풀에 넣는데 그 이유는 거래를 할 때마다 k가 점진적으로 증가함으로 LP 또한 수익을 얻게 되는 거지.
런칭 이후 Uniswap은 엄청난 인기를 끌었고, 2020년 5월 경 V2로 업데이트를 하고 올해 3월에는 V3로 업데이트를 하면서 AMM을 근본적으로 변경하는 큰 업데이트를 하였어
어때 이제 Uniswap에 대해서 잘 알겠어?? 이번시간은 Uniswap에 대해 공부하면서 LP, 유동성, 유동성 풀 등 다양한 개념들에 대해 살펴보았어... 난 처음에 이해하기 엄청 어렵더라 ㅠㅠ
암튼 긴 글 읽느라 고생했어!!! Uniswap에 대해 더 공부하면서 새로운 부분이 있으면 수정할게