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

Jina Kim·2022년 9월 22일
1

Smart Contract

목록 보기
5/9
post-thumbnail

🚨 Caution 🚨

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

저번 Write Contract 1편(Liquidity)에 이어서
2편 Swap 펑션들 갑니다.

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

9. swapETHForExactTokens

BNB를 swap하고자 하는 양의 토큰으로 바꿔보자.(Exact의 위치가 어디 붙어있는지 잘봐야함!)

function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
  external
  payable
  returns (uint[] memory amounts);

amountOut: 바꾸고자 하는 A토큰의 양
path: WBNB contract address, A토큰 contract address
to: swap한 토큰을 받는 지갑 주소(내 지갑 주소)
deadline: 트잭의 데드라인. 현 Unix Timestamp에서 적당히 200~300 더해주면 된다.

🚩유동성 풀에 넣어두셨나요?
먼저 swap 하기 전에 addLiquidityETH()를 통해 WBNB : A토큰을 유동성 풀에 넣어둬야한다.
위의 트잭으로 생긴 PanCakeLP에 approve 미리 해둘것! (하는 방법은 요기 참고)

example)

swapETHForExactTokens: 내가 지불 가능한 WBNB의 양
amountOut: swap해서 내 지갑에 넣으려는 토큰 양. 여기선 0.5KB
path: WBNB contract address(테스트넷 기준 0xae13d989dac2f0debff460ac112a837c89baa7cd), KB contract address

근데 왜 내 0.1WBNB 다가져갔지?... 바꾼건 0.5 KB라 0.005 WBNB인데...😥
뭐야 내돈내놔요

어쨌든 내 지갑에 0.5 KB 추가된거 확인 완!

10. swapExactETHForTokens

swap 하고자 하는 양의 BNB를 토큰으로 바꿔보자.(Exact의 위치 확인)

function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
  external
  payable
  returns (uint[] memory amounts);

amountOutMin: 최소한 swap 원하는 A토큰의 양
path: WBNB contract address, A토큰 contract address
to: swap한 토큰을 받는 지갑 주소(내 지갑 주소)
deadline: 트잭의 데드라인. 현 Unix Timestamp에서 적당히 200~300 더해주면 된다.

example)

난 0.08 WBNB를 써서
적어도 0.8KB는 받아야겠어(10^18 * 0.8)🤑
라는 의미

swapExactETHForTokens: 내가 swap하고자하는 WBNB의 양
amountOutMin: 내가 최소한으로 받아야겠는 토큰 양. 여기선 0.8KB
path: WBNB contract address(테스트넷 기준 0xae13d989dac2f0debff460ac112a837c89baa7cd), KB contract address

0.08 WBNB로 4.097 KB를 바꿨습니다.💰💰💰

11. swapExactETHForTokensSupportingFeeOnTransferTokens

.... 펑션명부터 왜케 길어 ㅠㅠ

function swapExactETHForTokensSupportingFeeOnTransferTokens(
  uint amountOutMin,
  address[] calldata path,
  address to,
  uint deadline
) external payable;

10번의 swapExactETHForTokens 과 같은 역할을 하지만..
transfer fee를 받는 토큰에 한해서만 성공한다고 함
뭔말이야 그게...

그래서 swapExactETHForTokens 펑션과 동일하게 값을 넣어서 돌려봤음


->왼쪽이 해당 펑션, 오른쪽이 swapExactETHForTokens 돌린거
token양 차이는 내가 예치해둔게 적어서 그러함
(swapExactETHForTokens 한번 더 돌리니까 바꿔주는 토큰양 더 적어짐)

근데 수수료 차이인지도 몰겠다. swapExactETHForTokens 두번째 돌렸을때 수수료 $0.30 나왔거든..

결론: 뭔 차이일까...(미궁 속🌪)

12. swapExactTokensForETH

function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
  external
  returns (uint[] memory amounts);
  

example) 여기서 JNB는 제가 만든 token입니다.

amountIn: 바꾸고자 하는 JNB 토큰 양. 10^18 * 10 = 10 JNB
amountOutMin: 최소한으로 받는 WBNB 토큰. (10^18을 넣어서 해보다가 자꾸 실패해서 짜증나서 1 넣었더니 되네;;😂)
path: JNB Contract Address, WBNB contract address(테스트넷 기준 0xae13d989dac2f0debff460ac112a837c89baa7cd)

너무 조금 했나.. 트잭fee가 더 나감 ㅋㅋㅋㅋㅋ;;

13. swapExactTokensForETHSupportingFeeOnTransferTokens

마찬가지로 swapExactTokensForETH 펑션과 비슷한데,,transfer fee를 받는 토큰에 한해서만 성공한다고 함
11번과 같이 미궁에 빠진 SupportingFeeOnTransferTokens


이것도 넘 길어져서 swap 2편으로 넘겨야겠다..
4발 남았다...🔫🚬

profile
Hello, World!

3개의 댓글

the only difference being it doesn'f fail for tokens that take a fee on transaction
https://github.com/Uniswap/v2-periphery/issues/95

uniswap github issue에 보면 기존 애랑 차이점이 수수료가 발생하는 토큰 거래 시 실패하지 않는다고 나와 있더라구요. (uniswap docs에 나와 있는 말이랑 비슷한데 조금 다른 느낌?)

======================================================

all swap*SupportingFeeOnTransferTokens functions don't return anything, and check slippage parameters against post-hoc balances
https://github.com/Uniswap/v2-periphery/pull/34

uniswap github merge 기록을 보면 저 SupportingFeeOnTransferTokens이 들어가는 애들은 아무것도 리턴을 안 하고, 슬리피지에 대해 잔액을 사후검증 한다는 것 같아요.
그리고 여기 나오는 슬리피지는 유동성 시장에서 내가 주문한 금액과 실제 체결된 금액의 차이가 아닐까 싶은데요.
암튼 여기에 달린 댓글들 보면 신규 버전에 대한 보안 패치라는 말도 있는 것 같습니다. 참고로 저 펑션들을 FOT라고 부르더라구요.

=> 위 두 게시물을 참고했을 때 제가 생각하기에는.. SupportingFeeOnTransferTokens 이게 들어가는 애들은 한 번 더 잔액에 대해 검증을 해서 transfer를 안전한게 처리하는 애들이 아닐까 싶습니다.

1개의 답글