[DeFi] UniSwap Contract

wrld_worthy·2023년 6월 14일
0

DeFi

목록 보기
3/5

UniSwap

Router

  • 유저와 인터랙션

Pair

  • 유동성 관리

Factory

  • Pair 생성관리

FeeTo

  • Pair에서 발생하는 토큰 스왑 수수료들이 모이는 컨트랙트

토큰스왑 요청시 Router에 요청이 들어오고
적절한 스왑 경로를 통해서 토큰 교환이 진행이된다.

기존에 유동성 풀이 존재하지 않는 스왑을 요청하면 Factory를 통해서 LP컨트랙트를 생성하게되고,
유동성 풀이 기존에 존재한다면 Pair를 통해 스왑이 진행된다.

Pair Contract

1. Pool 유동성 관리

- 두 토큰 쌍에 대한 유동성 관리
- LP토큰을 통해 유동성 풀의 지분 증명

2. Swap

- 유동성에 따라 토큰 교환
- 스오바 수수료 수취

3. Flash Swap

- 유동성 풀에서 필요한 만큼 토큰을 먼저 가져온뒤, 한 트랜잭션 내에서 다시 상환할 수 있는 기능
( 아비트라지 같은 차익 거래에 많이 사용 된다. 일반 유저는 잘 사용하지 않는 기능 )

4. Price Oracle

- 시간 가중 편균 가격(TWAP, Time-Weighted Average Price) 계산을 위한 수치 제공

Factory Contract

  1. CreatePair
    • 두 토큰 쌍에 대한 LP 컨트랙트 생성
    • low level call을 통한 컨트랙트 배포
  2. allPair/ getPair
    • 두 토큰 쌍을 통해 pair 컨트랙트 주소 조회
    • 전체 pair 컨트랙트 목록 관리
  3. feeTo/ feeToSetter
  • Swap 수수료를 받을 주소 설정

Router Contract

유저들이 가장 많이 인터랙션하는 컨트랙트

1. Utility

- 토큰 교환/ 유동성 공급 등을 쉽게 할 수 있도록 도와주는 역할

2. add/ remove Liquidity

- 유동성 공급 / 해제
function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external override ensure(deadline) returns (uint amountA, uint amountB, uint liquidity) {
        ...Code
}

function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) public override ensure(deadline) returns (uint amountA, uint amountB) {
        ...Code
}
  • token{A,B}: 유동성 공급/ 해제 할 LP를 구성하는 토큰
  • to: 토큰 수령 주소
  • deadline : 실행기간 ( 최소한 deadline 시점 이전까지는 실행이 되어야 함. )
    만약 트랜잭션이 한번에 많이 몰려서 실행시켰던 tx들이 밀리게 된다면 원하는 시점의 함수를 실행할 수 없기때문에 이런 상황을 방지하기 위함.

addLiquidity

  • amountDesired: 유동성을 공급할 때 공급하고자 하는 토큰 수량
  • amountMin: 최소 토큰 공급 수량, 하한선.

removeLiquidity

  • liquidity: 유동성 해제하려는 풀의 LP 토큰 수량
  • amountMin: 최소 토큰 수령 수량, LP 토크을 해제했을 때 두 토큰을 최소한 어느정도 받아야 할 수량

3. swapToken

  • 주어진 스왑 경로에 따라 토큰 스왑

SwapToken 대표적 2가지 함수

swapExactTokensForTokens

  • 일정 수량의 토큰을 다른 토큰으로 스왑(input을 고정)
  • amountIn ( 토큰을 몇개를 내겠다. ex) 100)
  • amountOutMin ( 최소한 몇개는 받아야 되겠다. )

특정 토큰을 100개를 줄테니 그 만큼 다른 토큰으로 교환할 때

swapTikensForExactTokens

  • 특정 수량의 토큰을 얻기 위해 스왑(output을 고정)
  • amountOut ( B토큰을 이 만큼 받겠다. )
  • amountInMax ( amountOut만큼 얻는데 드는 비용은 amountInMax보다는 적어야 한다. )

B토큰을 얻고 싶은데 A토큰이 몇개 필요하는지 모르고 B토큰을 100개를 받으려고 할 때.

path

  • 토큰 스왑 경로
    ex) [ETH, USDT, USDC]
    이더리움 토큰을 통해 이더리움을 USDT로 바꾸고, USDT를 USDC로 바꿔서 받겠다는 뜻이 됨.
    이런 식으로 PATH를 넘겨줌으로 최적의 경로를 통해 최대한 토큰 손실이 없이 토큰 교환을 수행할 수 있도록 함.

4. getAmounts

  • 토큰 스왑 시 예상 수량 계산

getAmountOut

  • 유동성 풀의 reserve를 알고 잇을 대 예상 토큰 수령 수량 계산
  • amountIn: 스왑하려는 토큰 수량

getAmountIn

  • 유동성 풀의 reserve를 알고 있을 때 스왑에 필요한 토큰 수량 계산
  • amountOut: 스왑을 통해 받으련느 토큰 수량

getAmountsOut(In)

  • 토큰 수량과 스왑 경로를 알고 있을 때, 각 결로 별 토큰 수량 계산

PanCake Swap

초기 UniSwap은 거버넌스 토큰이 없이 운영을 해왔는데,
이후 UniSwap 기반 다른 Dex들은 해당 프로토콜 만의 자체 토큰인 거버넌스 토큰을 제공하면서 출시했다.
유저들은 이런 거버넌스 토큰을 추가 수익으로 얻을 수 있기 때문에 많이 넘어가기도 했다.
DEX들을 이런 거버넌스 토큰을 분배하는 마스터 쉐프라는 컨트랙트를 추가로 두었다.


위 사진은 BSC Network의 대표적인 덱스인 PanCake의 구조이다.

유저들이 유동성 공급을 하고 받은 LP토큰을 마스터 쉐프에 예치를 하게 되면
마스터 쉐프는 유저가 예치한 LP토큰의 슈량과 예치한 기간 등을 종합적으로 계산을 통해서
거버넌스 토큰을 유저에게 발행해주게 된다. 이때 마스터 쉐프에는 pull Info에서 각각 LP별로
거버넌스 토큰을 얼마나 분배를 해주는지, LP토큰의 여러가지 정보 등을 기록한다.

Master Chef

1. 거버넌스 토큰 분배

  • 거버넌스 토큰 분배를 통한 추가 수익 제공

2. 유동성 공급 유지

  • 거버넌스 토큰 파밍을 통해 유저들에게 LP토큰 예치 유도
    유저들이 거버넌스 토큰 파밍을 위해 LP토큰을 마스터 쉐프에 예치하게 되면 유저들이 유동성을 해지할
    요인들이 좀 더 줄어드는 효과로 유동성을 좀 더 안전하게 유지할 수 있다.

3. 다양한 부가 서비스 창출

  • 이자농사, Yield aggregator
    거버넌스 토큰을 주기적으로 수확(Claim)하여 재예치를 해주는 서비스 처럼 다양한 부가 서비스를 창출할 수 있음.

0개의 댓글