본문 바로가기
DeFi 뿌수기

유니스왑 v2 백서 분석

by gun_poo 2023. 2. 28.

AMM 자동화 마켓 메이커

기존 중앙화 거래소는 유동성 공급자가 원하는 가격을 정해서 호가를 올린다.

AMM은 유동성 공급을 유저가 아니라 공식을 따르게 만든다. 토큰 A와 토큰 B의 교환 비율이 자동적으로 정해지게한다.

유니스왑은 AMM 중 CPMM을 사용한다

CPMM : x*y = k 

k는 변하지 않는 상수, x와 y는 특정 거래 쌍에서 사용 가능한 토큰의 수량

x와 y는 반비례를 하기 때문에 다음과 같은 그래프 형태를 따른다.

예시] 이더리움과 오미세고 교환

많은 예시로 나와있는 예시문을 가져와보자면

유니스왑에 이더리움 10개와 오미세고 500개가 있었고 이 두개의 곱 k가 5000인 컨트렉트가 있다

유저가 1이더를 오미세고로 교환하려고 한다. 1이더를 넣을 시 컨트렉트에는 11이더가 되고 

11* y = 5000 => y=5000/11 => 454.5가 된다 

원래 오미세고는 500개가 있었고 이더리움이 추가 공급이 되었다. 하여 k 값을 5000으로 유지 해야되기 때문에 

오미세고는 454.5개를 가지고 있어야 하고 초과된 45.5개의 오미세고를 이더리움 공급자에게 지급한다.

 

추가로 1이더가 더 들어왔다 

12 * y = 5000 => y = 5000/12 => 416.7 이 되고 현재 유니스왑의 오미세고 보유량은 454.5,

454.5 - 416.7 = 37.8 만큼의 오미세고를 1이더를 공급한 사람에게 지급해준다.

이더리움의 공급량이 늘어남에 따라 이더리움에 대한 오미세고의 가격이 증가했음을 의미하고 유저들은 오미세고를 팔고 이더리움을 가져오려고 한다. 이는 시장에서 거래되는 시세 차익에 의해 벌어지는 현상이다. 시장시세보다 비싼 오미세고를 이더리움으로 시장 가격보다 저렴한 가격에 교환을 하고 이더리움을 다른 플랫폼에서 거래를 하면 이득을 보게된다. 

이런 식으로 유저들이 오미세고를 공급해주고 시장 가격과 교환 비율이 맞춰지는 그 시점까지 공급이 일어나게 된다.

하여 교환 비율은 시중에서 거래되는 두 자산의 교환 비율과 같아지게 된다.

 

다른 amm 참고 : https://blog.chain.link/automated-market-maker-amm-korean/

 

AMM DEX에 리스크는 줄이고 더 많은 자금을 유입하는 방법

DeFi 혁신 사례 중 가장 영향력 있는 기술 중 하나는 자율적으로 기능하는 마켓 메이커(Automated Market Maker, AMM) 방식의 탈중앙화 거래소(DEX) 입니다. AMM 덕분에 온체인에서 다양한 토큰에 대한 유동

blog.chain.link

컨트랙트

유니스왑은 크게 Factory Contract, Token Exchainge Contract로 나뉜다.

 

Factory Contract : 우리가 토큰 pair(거래되는 토큰 쌍)를 정할때 pair가 있으면 두 코인을 대상으로 컨트랙트를 만든 뒤 그 안에 pool을 생성한다. 그 풀에 있는 수량은 서로 곱이 일정하다. 

위에서 예시를 통한 이더리움과 오미세고 교환과 같다. 이더리움과 오미세고의 pair에 대한 컨트랙트가 생성 되는 것

pool의 규모가 충분히 클 경우 교환비 변동이 작아지고 안정적으로 토큰을 교환 할 수 있다.

 

모든 토큰 쌍 마다 새로운 컨트랙트를 만들어서 배포해줘야하는것은 매우 비효율적이다. 하여

pair가 존재하지 않는다면 직접적인 pair가 없다고 하더라도 그 pair를 만들어 낼 수 있는 루트를 찾았고 이를 "라우팅"이라고 한다.

 

예로 들어 

스시 코인과 yfi 코인을 스왑 하고 싶을 경우 스시-yfi 페어에 대한 컨트랙트가 없다면 다른 것을 쓰는 것이다.

스시-weth pair에 해당하는 컨트랙트와 weth-yfi에 해당하는 pair 컨트랙트를 사용하여 스시 => weth => yfi로 바꾸는 과정을 거치는 것

수수료는 추가되지만 빠르게 교환이 가능하다. 이런식으로 작동하는것을 routing 라우팅이라 한다.

 

하지만 체인에 기축통화가 명확하게 있지 않다. 그렇기 때문에 보통 많은 교환이 일어나는 토큰들과는 항상 토큰 pair를 형성해야하고 

컨트랙트가 만들어져있어야 하며 그 안에 풀이 형성되어 있어야한다.

예로들어 10개의 토큰이 있으면 그만큼의 조합이 필요한데 10c2만큼(45) 컨트랙트가 필요하다.

컨트랙트 수가 늘어날수록 조합의 수가 커진다. 이 factory 컨트랙트에는 모든 토큰 Pair에 대한 컨트랙트 address가 들어있다.

어떻게 돌아가는지 살펴보자 예시로 많이 돌고있는 샘플을 가져와보았다.

DAI를 가지고 있는 어떤 사람이 이더리움과 교환하고 싶을 경우 스왑을 실행한다.

플랫폼은 factory 컨트랙트에 createExchange라고 하는 function을 호출한다. createExchange에서 DAI 컨트랙트 address를 확인하고 이더-DAI 에 해당하는 pair 컨트랙트 주소를 찾는데 이더-다이 다이-이더 순열이 두개가 나온다. Factory는 실제주소를 확인하고 오름차순 정렬을 한다. 낮은게 앞에 오고 더 큰게 뒤에 온다.

(확인필요)

 

LP 계산식

LP토큰이란 : 덱스에 유동성을 공급한 사람들에게 제공하는 보상. 기본적으로 유동성 공급자가 소유한 풀의 지분

Liquididy Provider : 는 reserve를 제공하고 LP token를 받는다.

Lp token은 reserve를 출금 할 때 받을 수 있는 token 양과 매핑 된다.

또한 Lp token은 유니스왑에서 token 을 스왑한 트레이더들이 낸 수수료(0.3%)를 전체 token pool에서 자신의 Lp token의 지분 만큼 요청 할 수 있다.

 

유니스왑에서 유동성 공급자들이 처음 돈을 맡긴다

돈을 맡기고 나서 유동성 공급자들이 필요에 의해 되찾고 싶어지고 되찾을때 유동성 공급자들이 얼마를 돌려 받아야 되는지에 대해 알려주기 위한 증거를 LP 토큰으로 발행해준다.

 

이 그림을 예시로 들어보자

유동성 공급자가 토큰 a 토큰 b를 10,1개 공급한다.

유니스왑 풀(a-b pair)에 해당하는 exchange 컨트랙트에 보관이 되고 컨트랙트에서 이 풀에 해당하는 토큰이 발행된다.

10개와 1개를 공급햇을때 LP 토큰을 4개 지급을 받았다.

나중에 토큰을 되찾기위해 4개를 다시 돌려주면 4개에 고정된 10개와 1개가 유동성 공급자에게 돌아간다. 

 

유니스왑에서는 유동성 공급자들에게 수수료를 공유해준다. 전체 LP Token Pool 중 자신 LP token의 지분 만큼 수수료를 받아 올수 있다.(유니스왑 0.3%)

위 경우 4LP 토큰을 보유하고 있고 전체 토큰이 12개이다. => 1/3이 지분이 되고 0.3%의 1/3만큼 가져올수 있다.

0.1%를 받게 되는 것이다. 이런 수수료를 받기 위해 많은 사람들은 토큰 교환이 많이 이뤄질것 같은 컨트랙트에 돈을 집어 넣어둔다.

많은 양의 유동성 자산이 모이게 되면 풍부한 유동성이 제공이 되고 교환비율은 쉽게 바뀌지 않고 견고해진다.

 

 

S_minted(새로 생성되는 LP 토큰)

X_starting(x 토큰을 넣기 전의 수량)

X_deposited(x 토큰을 넣은 후의 수량)

S_starting(x 토큰을 풀에 넣기 전에 '원래 있던 LP토큰'의 양)

새로 생성되는 lp 토큰의 양은 특정 토큰의 ( input token/ all token) 칸틈 생성

X , Y 중 S_mitned 값이 더 작은 값이 되도록 하는 것을 찾아서 생성한다.

위 식은 토큰 페어를 처음 만들었을때 아무것도 없는 상태이고 starting 이 0 이기 때문에 minted값이 무한대로 날라가버린다. 하여 위 식을 따라 계산하게 된다. 

 

A 토큰과 B토큰이 있을 경우 교환비를 1:100이라 하고 initail deposit이 2A, 200B라 한다

교환비는 1:100이 맞고 depositor가 받는 토큰 양은 루트의 2*200 = > 20에 해당하는 lp토큰을 지급받는다.

처음 페어를 만들어서 lp를 지급 받는 사람은 그 토큰 쉐어를 모두 가질수가 없고 수수료를 내야된다. 그리고 그 수수료는 0의 주소로 전송되어 영원히 묶인다.

LP share는 최소단위가 10^-18이다. erc-20과 단위가 같다. 다른 사람들이 lp share를 받으려면 최소단위가 10^-18이다.

토큰의 지분 비중이 10^-18보다 작다고 하면 lp share를 못받는다. 

그래서 lp share의 10^-15만큼 (10^-18의 1000배), lp share의 가치에 1000배에 해당하는 lp token을 태워야한다.

 

예로들어 lp share 하나의 가격을 $100에 맞추고 싶을 경우 1000배에 해당하는 토큰이 없어지게 된다.

이렇게 되면 손해가 매우크다. 그래서 처음 돈을 넣을때 많이 넣지 않는다고 한다. 많이 넣게 되면 다른 lp들이 진입을 안한다.

lp share의 지분율이 큰 다른 누군가가 있다면 새로운 유동성 공급자가 수수료 이득을 보기 힘들기 때문에 들어오지 않는다.

추후 수수료를 받아 얻을 이득보다 태워지는 양이 더 많을수도있기 때문에 많이 넣지 않는다고 한다.

 

Protocol fee

 

fee라는 것은 전체 Lp token pool의 인플레이션에 비례해서 부과된다.

f1,2 : 이 풀의 인플레이션

root k1 : 그 전의 LP토큰의 양

root k2 : 늘어난 LP토큰 양

인플레이션을 보게 되면 K 값이 두 토큰 X,Y 수량의 곱이다.

사람들이 돈을 집어 넣으면 그 곱이 늘어나게 된다. 

이 수수료는 LP token이 생성되거나 burn 될때만 호출되어 부과된다. 

인플레이션의 1/6 만큼의 fee를 가져간다. 위 공식 참고

Φ에 1/6을 넣게 되면 루트 K_2 앞에 곱해지는 값이 5가 된다.

하여 식은 이렇게 성립된다.

예시문을 통해 알기 쉽게 해석해보자면

100DAI와 1ETH를 가지고 있는 토큰 pair가 있다 (처음 생성)

그럼 루트 100*10 = 10이고 s1은 10이 된다.

추후 인플레이션이 일어났고 96DAI와 1.5ETH가 됐다. 

루트 K2는 루트 96*1.5, 루트 K1은 루트 100*1, s1 = 10이다 

그럼 0.0286이라는 수가 나오고 이 수 만큼 프로토콜 fee로 가져가는것이다. 

다음 정리에서는 코드 분석을 하러가보자

 

참조

https://wdbang.tistory.com/199

'DeFi 뿌수기' 카테고리의 다른 글

유니스왑 V2 해체하기 Factory Contract  (0) 2022.04.14
유니스왑 V2 해체하기 ERC-20 Contract  (0) 2022.04.11
DeFi - UniSwap 리서치  (0) 2022.04.11

댓글