I am not specialist of blockchain..
저는 코인도 안하는 블새싹입니다.ㅎ🌱
틀린게 있을 수 있는 점 양해 부탁드립니다.
저번 Write Contract 1편(Liquidity)에 이어서
2편 Swap 펑션들 갑니다.
실 Contract: 0x10ED43C718714eb63d5aA57B78B54704E256024E
Testnet Contract: 0xD99D1c33F9fC3444f8101754aBC46c52416550D1
https://docs.uniswap.org/protocol/V2/reference/smart-contracts/library#getamountsout
https://docs.pancakeswap.finance/code/smart-contracts/pancakeswap-exchange/router-v2
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 추가된거 확인 완!
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
.... 펑션명부터 왜케 길어 ㅠㅠ
function swapExactETHForTokensSupportingFeeOnTransferTokens(
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external payable;
10번의 swapExactETHForTokens 과 같은 역할을 하지만..
transfer fee를 받는 토큰에 한해서만 성공한다고 함
뭔말이야 그게...
그래서 swapExactETHForTokens 펑션과 동일하게 값을 넣어서 돌려봤음
->왼쪽이 해당 펑션, 오른쪽이 swapExactETHForTokens 돌린거
token양 차이는 내가 예치해둔게 적어서 그러함
(swapExactETHForTokens 한번 더 돌리니까 바꿔주는 토큰양 더 적어짐)
근데 수수료 차이인지도 몰겠다. swapExactETHForTokens 두번째 돌렸을때 수수료 $0.30 나왔거든..
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가 더 나감 ㅋㅋㅋㅋㅋ;;
마찬가지로 swapExactTokensForETH 펑션과 비슷한데,,transfer fee를 받는 토큰에 한해서만 성공한다고 함
11번과 같이 미궁에 빠진 SupportingFeeOnTransferTokens
이것도 넘 길어져서 swap 2편으로 넘겨야겠다..
4발 남았다...🔫🚬
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를 안전한게 처리하는 애들이 아닐까 싶습니다.