[Ethereum] 아비트라지를 위한 여정 3편

0xDave·2022년 9월 26일
0

Ethereum

목록 보기
18/112

🦄 Uniswap V2 Router


현재 대부분의 DEX는 유니스왑 V2의 fork 버전이다. 이미 안전성이 입증됐으니 새로운 프로젝트 입장에서는 가져다 쓰지 않을 이유가 없다. 최근의 자체 DEX를 런칭한 Step App만 봐도 유니스왑 V2 코드를 가져다 썼다고 당당하게 홈페이지에 적어놨다. 따라서 유니스왑의 코드를 이해할 수 있다면 다른 프로젝트의 DEX 코드는 거의 이해할 수 있을 것이다.

유니스왑의 V2 Router는 토큰을 교환하게 해주는 매개체 역할을 하며, 최대 7개의 경로로 분할되어 서로 다른 풀의 유동성을 활용한다. 또한 가스비를 인식해서 더 나은 속도를 제공하는 경우에만 멀티스왑을 사용한다.


👨‍🌾 Trader Joe


아발란체의 대표 DEX인 Trader Joe도 Uniswap V2를 fork한 프로젝트다. 이번 포스팅에 사용된 예제는 Trader Joe의 router인 JoeRouter 다. 우리가 사용할 컨트랙트 주소는 다음과 같다.

JoeRouter : 0x60aE616a2155Ee3d9A68541Ba4544862310933d4
USDC : 0xb97ef9ef8734c71904d8002f8b6bc66dd9c48a6e
USDT : 0xc7198437980c041c805a1edcba50c1ce5db95118
WAVAX : 0xb31f66aa3c1e785363f0875a1b74e27b85fd66c7

각 컨트랙트 주소를 가져와서 변수에 할당하면 된다.

>>> router_contract = Contract.from_explorer('0x60aE616a2155Ee3d9A68541Ba4544862310933d4')
>>> usdc_contract = Contract.from_explorer('0xb97ef9ef8734c71904d8002f8b6bc66dd9c48a6e')
>>> usdt_contract = Contract.from_explorer('0xc7198437980c041c805a1edcba50c1ce5db95118')
>>> wavax_contract = Contract.from_explorer('0xb31f66aa3c1e785363f0875a1b74e27b85fd66c7')

🌪 getAmountsOut()


function getAmountsOut(uint256 amountIn, address[] memory path)
    public
    view
    virtual
    override
    returns (uint256[] memory amounts)
{
    return JoeLibrary.getAmountsOut(factory, amountIn, path);
}

JoeRouter에 있는 getAmountsOut() 함수다. 해당 함수는 라우터에 들어온(팔고자 하는) 토큰의 양과 해당 토큰과 배열로 된 관련 pool의 모든 주소를 인자로 받는다.


>>> router_contract.getAmountsOut(1*( 10**usdt_contract.decimals()), [usdt_contract.address, wavax_contract.address, usdc_contract.address ])
# (1000000, 58029740309068294, 993315)

1usdt와 앞서 입력했던 변수들을 이용해 관련 pool의 모든 주소를 인자로 넣어줬다. 출력값을 통해 1000000usdt는 58029740309068294 WAVAX 또는 993315 usdc로 바꿀 수 있다는 것을 알 수 있다. 그런데 숫자가 너무 크다. 특히 WAVAX의 숫자가 이상하다. WAVAX의 decimal은 18이지만 usdt와 usdc의 decimal은 6이기 때문.


>>> router_contract.getAmountsOut(1*(10**usdt_contract.decimals()), [usdt_contract.ad
dress, wavax_contract.address, usdc_contract.address ])[-1]/(10**usdc_contract.decimals())
# 0.994023

따라서 위와 같이 사용하면 훨씬 편하게 출력값을 볼 수 있다. [-1]을 사용해서 가장 마지막 풀인 usdc의 값을 볼 수 있고, 현재 1 USDT는 0.994023 USDC로 바꿀 수 있다.


출처 및 참고자료


  1. Router02

  2. Router Contracts — Exploring getAmountsOut()

  3. 유니스왑, 자동 라우터 V2 출시

  4. Forks of Uniswap on DefiLlama

profile
Just BUIDL :)

0개의 댓글