유니스왑 v2 core 백서의 일부분을 정리해보았다.
시작하기에 앞서 유니스왑 v1에서는 ERC20과 이더리움을 Pair로 사용했었다.
즉 이더리움의 하나의 기축통화로서 작용했던 것이다.
그렇기 때문에 DAI와 USDT를 교환하려면 DAT-EHT, USDT-ETH 와 같이 두 Pair를 만들어야했다.
또한 이렇게 이더리움이 중간에 개입함으로서 이더리움의 가격이 변동되면 일시적으로 손해를 입는 경우도 생기게 되었다.
이를 개선한 것이 v2이다.
v1에서 기축통화처럼 사용되던 이더리움을 제거하고 ERC20으로만 Pair를 구성함으로서 이더리움의 가격이 변동되면서 오는 일시적인 손해를 탈피했다.
하지만 ERC20과 이더리움은 토큰 pair가 아니다.
ERC20과 이더리움 pair도 토큰 페어로 만들기 위해서 이더리움을 ERC20 토큰 형태로 wrapping 한 WETH(Wrapped ETH)를 만들어 ERC20 - WETH 페어를 만들어 사용하게 된다.
이렇게 함으로서 v2에서는 모든 Pair를 ERC20과 ERC20형태로 만들어 사용할 수 있게 되었다.
유니스왑에서 거래되는 토큰의 교환비율은 시중에서 거래되는 토큰의 교환비율과 유사하다.
그래서 이 정보를 제공하는 로직을 추가하였다.
이 가격정보는 블록체인의 인터벌 (15초) 동안 변화하는 가격의 정보들을 전체 가격에서 가격별로 유지된 시간만큼의 곱을 더해서 결정한다.
이렇게 하면 가격이 급격하게 변동하지 않게 되고, 특정 공격자가 일부러 pool에서 다량의 토큰을 교환하면서 가격을 왜곡시키는 상황을 대비할 수 있다.
또한 토큰 교환 비율은 정수로 떨어지는 경우가 거의 없으나, 솔리디티는 소수를 지원하지 않기 때문에 실수를 다룰 수 있는 데이터 타입을 정해놓았다.
v2에서 정의한 256비트의 자료형은
112 비트의 정수형 + 112 비트의 소수점 + 32 비트의 타임스탬프로 이루어져있어 가격이 유지되는 시간을 표현 할 수있다.
LP 토큰은 두가지 상황에 따라 다른 공식을 적용한다.
LP 토큰이 있는 경우
Pair 가 생성되고 거래 이루어지고 있는 컨트렉트에 토큰을 넣게 되는 경우이다.
이때 새로 생성되는 토큰은 (넣은 토큰의 수량 / 전체 토큰의 수량)이다.

LP 토큰이 없는 경우
Pair가 처음 생성이 된 경우 전체 수량은 0이 되므로 새로 생성되는 LP토큰의 수량인 무한대가 될 수 있다.
이런 경우 새로운 공식을 적용한다.
x와 y 토큰을 넣으면 두 토큰 수량의 곱의 루트값이 LP 토큰의 수량이 된다. (= 기하평균값)

예를 들어 1:100 교환비율의 ABC토큰과 XYZ토큰을 2개와 200개의 수량으로 넣었다고 가정해보자
이 경우 400의 루트값인 20의 LP 토큰이 share될 것이다.
하지만 이렇게 맨 처음에 Pair를 만들어서 토큰을 받는 사람은 20개의 토큰처럼 위와같은 공식으로 생성된 토큰을 모두 받지 못한다.
일정 수수료를 지불해야하는데 이 수수료는 Burn되는 것으로 즉 영영 돌려받지 못한다.
그 이유는 다음과 같다.
LP토큰의 최소 단위는 10^-18 이다. 이는 보통 ERC20 토큰의 최소 단위와 같다.
즉, 이후로 사람들이 LP토큰을 받으려면 최소 단위가 10^-18가 되게 된다.
LP토큰은 넣은 토큰의 비중이 최소단위인 10^-18보다 작은 경우 LP토큰을 받을 수 없다
그러므로 이런 경우를 대비하기 위해 10^-18의 1000배인 10^-15만큼을 수수료로서 Burn해야한다.
예를들어 LP토큰을 100달러로 share하려면 100달러의 1000배인 100000달러에 해당하는 토큰이 수수료로서 날라가게 된다.