Smart Contract for Token Swap #2-2 Pancake Router Contract 분석하기(Write Contract)

Jina Kim·2022년 9월 22일
2

Smart Contract

목록 보기
4/9
post-thumbnail

🚨 Caution 🚨

I am not specialist of blockchain..
저는 코인도 안하는 블새싹입니다.ㅎ🌱
틀린게 있을 수 있는 점 양해 부탁드립니다.

저번 Read Contract 포스팅에 이어서..
Write Contract를 파악해보자!

Pancake Router Contract

실 Contract: 0x10ED43C718714eb63d5aA57B78B54704E256024E
Testnet Contract: 0xD99D1c33F9fC3444f8101754aBC46c52416550D1

참고 Doc

https://docs.uniswap.org/protocol/V2/reference/smart-contracts/library#getamountsout
https://docs.pancakeswap.finance/code/smart-contracts/pancakeswap-exchange/router-v2

팬케이크스왑이 유니스왑에서 나왔기 때문에
팬켘스왑에서도 더많은 정보를 알고 싶다면 유니스왑 도큐멘트를 보라고 추천하고 있다.

Write Function

1. addLiquidity

function addLiquidity(
  address tokenA,
  address tokenB,
  uint amountADesired,
  uint amountBDesired,
  uint amountAMin,
  uint amountBMin,
  address to,
  uint deadline
) external returns (uint amountA, uint amountB, uint liquidity);

여담

BEP20 풀에 유동성을 더한다..
처음엔 LP(Liquidity Providers)의 존재가 이해가 가지 않았다.
왜 토큰을 유동성 풀에 예치하지..?

쉽게 설명하자면 은행에서 원이랑 달러를 5:1 비율로 가지고 있다 치자.
그럼 한국 돈은 은행에 많으니 은행에서 파는 달러 지폐의 가치는 올라가겠지?
그러면 은행에서는 "달러 맡기세요~ 이자 드릴께요" 하면서 달러 보유 비중을 높여 환율을 조정할 것이다.

이렇게 시장에는 유동성이 형성되고, LP(예치자)들은 이자를 얻고,
토큰 가치(환율)도 조정되고, swap(환전)도 활발히 이뤄지면서 시장(은행)은 수수료를 받게 된다.

그래서 여러 푸드swap들이 생기는 것..!!!!(스시스왑, 버거스왑, 팬케이크 스왑 등등)


Anyway..

이제 유동성을 더해보자고~!

는 잠깐!!🚨

이 router에 예치를 하기 전에 각 토큰들 approve를 해줘야함.
각 토큰 contract로 들어가서 내 지갑->pancake router contract에게 얼마만큼의 토큰을 빠져나가도 허용할 것인지 정해줘야함

>> 지갑 연결 후(보라색) spender에 pancake router contract 넣고, amount는 10^decimal 자리수 * N 해주면 된다.
ex) 캡쳐본에서는 decimal 18자리인 토큰이여서 10^18 * 1000000의 JNB를 저 컨트랜트에게 허용한다는 뜻.



이제 찐 예치...🚀

tokenA: A토큰 address
tokenB: B토큰 address
amountADesired: A토큰 예치할 양(decimal에 곱하는 걸로 들어가야함)
amountBDesired: B토큰 예치할 양(decimal에 곱하는 걸로 들어가야함)
amountAMin: LP풀에 예치된 비율을 유지시키기 위해서 최소한 예치 되어야 하는 A토큰(처음 스테이킹 하는거면 min값은 의미 없다)
amountBMin: LP풀에 예치된 비율을 유지시키기 위해서 최소한 예치 되어야 하는 B토큰(처음 스테이킹 하는거면 min값은 의미 없다)
to: 예치할 토큰이 빠져나가는 지갑 주소(내 지갑 주소)
deadline: 이 시간 지나면 해당 트잭을 중단하게끔 데드라인을 정함. 현 Unix Timestamp에서 적당히 200~300 더해주면 된다.

example)

>> A토큰(JNB)과 B토큰(KB)은 내가 만든 토큰들! decimal이 18이어서 각 100JNB, 100KB씩 예치했음.

이렇게 Write해서 gas fee 허용하면 내 지갑에서 돈이 빠져나간걸 볼 수 있음.
그리고 트랜잭션 보면

LP 토큰(자동으로 생김)까지 예치 성공!!
(⭐이 LP 토큰도 잘 기억해두셔야 합니다.. 나중에 removeLiquidity할 때 쓰임)

2. addLiquidityETH

function addLiquidityETH(
  address token,
  uint amountTokenDesired,
  uint amountTokenMin,
  uint amountETHMin,
  address to,
  uint deadline
) external payable returns (uint amountToken, uint amountETH, uint liquidity);

이것도 위의 1번과 별반 다르지 않다.
토큰 A,B 대신 WBNB와 토큰 C를 예치해두는 것

token : 예치할 C토큰 address
amountTokenDesired : C토큰 예치할 양(decimal에 곱하는 걸로 들어가야함)
amountTokenMin: LP풀에 예치된 비율을 유지시키기 위해서 최소한 예치 되어야 하는 C토큰(처음 스테이킹 하는거면 min값은 의미 없다)
amountETHMin: LP풀에 예치된 비율을 유지시키기 위해서 최소한 예치 되어야 하는 WBNB
to: 예치할 토큰이 빠져나가는 지갑 주소(내 지갑 주소)
deadline: 이 시간 지나면 해당 트잭을 중단하게끔 데드라인을 정함. 현 Unix Timestamp에서 적당히 200~300 더해주면 된다.

example)

>> 0.1WBNB : 10KB 의 환율로 예치함. (KB는 제가 만든 custom 토큰입니다.) 예치 성공!

3. removeLiquidity

이제 예치해둔거 해지하러 갑니다...🚂

먼저 예치할 때 생긴 LP토큰 contract(Pancake LPs)를 찾아갑니다.(예치할 때의 트랜잭션에서 볼 수 있습니다.)
왜냐면 LP토큰을 따로 approve 해주셔야 하거든여..!!

>> Total Supply는 내가 예치해둔 토큰량

Read contract의 balanceOf 펑션에 내 지갑 주소를 넣어서 얼마만큼 예치해뒀는지 uint256형태로 확인합니다.
저 리턴값을 그대로 복사해서 Write contract의 approve 펑션으로 갑니다.

>> spender에는 Pancake Router Contract Address를 넣고, value에는 아까 balanceOf의 리턴값을 넣습니다.

그러면 내가 예치해둔만큼의 토큰을 Pancake Router가 터치할 수 있게 허용 완!


다시 removeLiquidity로 돌아와서....
function removeLiquidity(
  address tokenA,
  address tokenB,
  uint liquidity,
  uint amountAMin,
  uint amountBMin,
  address to,
  uint deadline
) external returns (uint amountA, uint amountB);

tokenA: A토큰 address
tokenB: B토큰 address
liquidity: 출금할 양
amountAMin: LP풀에 예치된 비율을 유지시키기 위해서 최소한으로 찾아야하는 A토큰
amountBMin: LP풀에 예치된 비율을 유지시키기 위해서 최소한으로 찾아야하는 B토큰
to: 출금된 토큰을 받을 지갑 주소(내 지갑 주소)
deadline: 이 시간 지나면 해당 트잭을 중단하게끔 데드라인을 정함. 현 Unix Timestamp에서 적당히 200~300 더해주면 된다.

example)

>>저는 JNB 토큰과 KB 토큰을 1:1 비율로 예치해뒀었고, 100 JNB(10^18 * 100)를 찾았습니다. > 유동성 제거(예치금 찾기) 성공!!!

메타마스크 지갑에 보면 100 JNB와 100KB가 예쁘게 돌아왔네요 ㅎㅎㅎ😃

4. removeLiquidityETH

function removeLiquidityETH(
  address token,
  uint liquidity,
  uint amountTokenMin,
  uint amountETHMin,
  address to,
  uint deadline
) external returns (uint amountToken, uint amountETH);

3번의 removeLiquidity와 비슷합니다. A토큰 대신 WBNB를 쓴다는 것 뿐입니다.

그 외로...
5. removeLiquidityETHSupportingFeeOnTransferTokens
6. removeLiquidityETHWithPermit
7. removeLiquidityETHWithPermitSupportingFeeOnTransferTokens
8. removeLiquidityWithPermit

은 일단 pass합니다.

왜냐구요?
swap이 목적인 사람이지라 유동성제거 펑션은 더이상 안파도 될 것 같습니다.


그럼 다음 편에서는 진짜 swap하러 간다...
(지금까진 swap을 하기 위한 준비과정이었다구욧..!)

profile
Hello, World!

0개의 댓글