[Defi 기록] 팜 사이트가 문닫았을 때 수동으로 LP를 Withdraw 하는 방법 - BSC only

in SteemCoinPan •  8 months ago  (Edited)

안녕하세요. 아마군(@skuld2000) 입니다.

올해는 연초부터 바이낸스 스마트체인(BSC) 기반의 디파이 일드파밍이 매우 흥했고 엄청난 자금이 모여 들었습니다.
덕분에 이전에는 상상도 할 수 없었던 놀라운 수익률을 올리는게 가능했고 마침 비트코인의 유래없는 강력한 상승세와 합쳐져 BNB 역시 놀라운 가격 상승을 이루어 냈죠.
수많은 디파이어들이 환호를 했지만 빛이 있으면 그림자도 있는 법.
일부 일드팜 서비스들은 러그풀(RUGPULL) 이라고 불리우는 악의적인 행위를 통해 많은 투자자들의 자산을 가로채갔습니다.
이 러그풀 수법은 스마트 컨트렉트의 코드 취약성을 노리기도 하고 프리세일을 통해 자금을 모은 뒤 잠적하기도 하고 단순 프론트엔드에 숫자를 가짜로 부풀려 재산에 타격을 입히는 등 다양한 수단을 동원하고 있으며 지금도 계속해서 진화 하고 있죠.
가장 좋은 건 참여 전 철저한 코드 분석과 초기에 소액의 자금으로 프론트엔드 속임수를 테스트 해본 후 확신이 있을 때만 담궈야 하는데요.
설령 비교적 안전한 프로젝트를 찾아내 투자를 하고 있더라도 어느날 갑자기 개발자의 변덕 또는 TVL 의 소멸로 사이트를 폐쇄 시키는 등의 상황이 발생하면 내 LP 가 온전히 남아있더라도 인출을 할 UI 가 없어져서 난감한 상황이 발생할 수 있습니다.
이럴땐 프론트엔드 지원 없이 수동으로 LP 를 Withdraw해야 하죠.
또한 LP 를 훔쳐가는 경우도 보통 웹사이트를 먼저 내리고 순차적으로 러그풀 코드를 실행하기 때문에 아주 빠르게 대응한다면 회수가 가능할 수도 있겠죠.
예전에 트론 디파이 때는 매우 간단하게 할 수 있었는데 BSC 에서는 이 절차가 매우 까다롭고 어렵더라구요.
이번엔 BSCSCAN 을 통해 수동으로 내가 스테이킹한 LP 를 회수하는 방법을 알아보겠습니다.


  • Masterchef 컨트랙트 확인

우선 이걸 찾기 위해서는 꼭 해당 일드파밍 서비스의 Masterchef 컨트랙트가 필요합니다.
보통 사이트 자체에는 없고, 미디움이나 Gitbook 등에 공지로 올려놓는 경우가 많은데요.
간혹 어디에도 없는 경우 텔레그램방의 공지에 있거나 거기에도 없으면 관리자에게 문의하면 보통 가르쳐 줍니다.
(문제는 이미 사이트를 닫아버린 경우 대부분 미디움이나 텔방 등도 다 닫아버리는 경우가 대부분이라 찾기 힘들 가능성이 높기 때문에 농사에 참여하기 전에 미리 잘 저장해 두는 것이 좋습니다.)

정 안되면 이전 트랜젝션 들 중에 내가 처음 Deposit 할때의 컨트랙트를 찾으면 거기에 Masterchef 컨트랙트(To: 항목입니다) 가 있긴 합니다..만 여러 트랜젝션 중에서 이걸 찾아내는 것도 쉽지는 않을 겁니다.
이 주소를 https://bscscan.com/ 에 가셔서 검색창에 입력해 주시면 해당 컨트랙트로 이동 됩니다.

  • pid 확인

Masterchef 컨트랙트로 이동했으면 화면 중간 쯤의 Contract 탭을 누른 후 Read Contract 버튼을 눌러줍니다.

그리고 스크롤을 쭉 내리다보면 poolinfo 라는 항목이 나옵니다.
여기에 내가 LP 를 디파짓한 풀의 번호를 입력해야 합니다.
근데 웹사이트 UI 상에 각 풀의 번호를 보여주지는 않기 때문에 감으로 입력해본후 그게 맞는지 찾는 수밖에 없습니다.
다만 대부분 화면에 보이는 순서대로 0번에서 시작하는 경우가 대부분이라 찾기가 어렵지는 않습니다. (아닌 경우도 있습니다)
제가 오랫동안 소액을 넣어 용돈벌이를 하고 있는 APESWAP 의 경우를 확인해 보겠습니다.

보시면 저는 두번째 풀인 BANANA-BUSD LP 풀에 790.5 개 정도를 참여하고 있습니다.
pid 는 0에서 부터 시작하므로 두번째 풀은 1번일꺼라고 예상되네요.
그럼 위의 poolinfo 입력창에 1을 넣고 Query 버튼을 클릭해 보겠습니다.

요렇게 아래쪽에 뭔가 정보들이 나옵니다.
그중 lptoken address 를 클릭합니다.

해당 LPToken 의 컨트렉트가 보여지는데요.
위 스샷의 Token Tracker 항목을 클릭합니다.

Read Contract 버튼을 누른 후 아래로 스크롤 하면 이 LP 를 구성하고 있는 두개의 토큰인 token0 과 token1 의 컨트렉트주소가 있습니다.
이 두개를 각각 클릭해서 제가 스테이킹한 BANANA 토큰과 BUSD 토큰이 맞는지 확인 하면 됩니다.

token0:

token1 :

어? 전 BANANA-BUSD 를 묶었는데 1번 pid 는 BANANA-BNB 가 나오네요?
APESWAP 은 pid를 UI 상에 배치된 순서랑 다르게 설정되어 있는 것 같습니다.
이러면 0번 부터 하나씩 찾아보는 수밖에 없어요.ㅠㅠ
다시 위로 돌아가서 poolinfo 에 0번부터 넣으면서 찾아보겠습니다.

0번을 넣어서 들어왔더니 Token Tracker 에 보이듯이 얘는 LP 가 아니라 BANANA 토큰 자체네요.
그럼 0번 역시 제가 디파짓한 BANANA-BUSD 풀이 아닙니다.
아무래도 APESWAP 은 UI 상의 첫번째풀이 1번, 이후부터 차례대로 넘버링 될 것 같군요.
그럼 두번째 풀인 BANANA-BUSD 는 pid 가 2번일 가능성이 높아 보입니다.

빙고! 찾았습니다.

  • LPToken 갯수 확인

이제 제가 이 풀에 Deposit 한 LPToken 이 몇 개인지 확인해 보겠습니다.

Masterchef 컨트랙트로 돌아와서 아래로 쭉 스크롤을 내리면 userinfo 항목이 나옵니다.
첫번째 입력란에 위에서 확인한 풀ID 를 넣어주고 두번째 주소 입력난에는 내 지갑 주소를 넣어주시면 됩니다.
그럼 아래 amount 에 매우 큰 숫자가 나오는데요.
이 숫자는 내 LPToken 갯수의 10¹⁸ 입니다.
즉, 소숫점으로 18 자리를 조절해 주면 갯수가 나오는데요, 그냥 옆에 숫자를 클릭해서 확인해도 됩니다.

여러가지 단위가 나오는데 그중 BNB 기반의 숫자가 우리가 UI 에서 확인할 수 있는 갯수와 동일합니다.

실제 제가 스테이킹 한 갯수와 동일하네요.
만약 이때 내 LP 의 amount 가 0 이라면??
이미 내 소중한 재산을 먹튀 당한 후라고 보시면 됩니다.

  • LP 회수

이제 가장 중요한 LP 를 Withdraw 하는 절차 입니다.
먼저 Masterchef 컨트랙트로 돌아가서 Read Contract 옆의 Write Contract 버튼을 클릭 합니다.
LP의 일부를 회수 할 수도 있지만 이 포스팅은 비상상황시 탈출을 목표로 작성하기 때문에 한방에 전액을 회수하는 방법을 알아 보겠습니다.

Write Contract 메뉴는 바로 아래에 빨간 점과 함께 Connect to Web3 라는 링크가 있습니다.
우선 이걸 클릭한 후 내 지갑을 연결해 줍니다.

비상 출금! emergencyWithdraw 항목을 찾아 스크롤 해줍니다.
입력받는 내용은 pid 하나 뿐입니다.
위에서 찾아낸 pid 번호를 입력해서 write 버튼을 눌러주면 스테이킹 한 내 LP 가 다시 지갑으로 들어옵니다!

알고 계셔야 할 점은 소스코드에서 보면 내가 입력한 pid를 통해 풀을 찾아낸 후 내 자금을 인출할 때 그동안 누적된 아직 수확하지 않은 보상(rewardDept) 을 0으로 만들어 버립니다.
즉, 일반적으로 UI 에서 Withdraw 기능으로 출금할 때와 달리 보상은 수확되지 않습니다.
그 이유는 이 Withdraw 의 코드와 비교해보면 알 수 있는데요.

withdraw 의 경우도 emergencyWithdraw 와 똑같이 외부 호출이 가능하며 pid 외에 출금하길 원하는 LP 수량을 추가로 입력해 줄 수 있습니다.
그럼 수확도 함께 자동으로 해주는데 이때 수확을 위한 보상 계산이 추가 되기 때문에 그만큼 수수료가 비싸집니다.
그런데 emergencyWithdraw 함수는 말그대로 (러그풀이 의심되는 심각한)비상상황에서 비상 탈출을 위해 사용하는 용도이기 때문에 쓰레기가 되어버릴 확률이 높은 보상 토큰을 받기 위해 추가 수수료를 낼 이유가 없죠.

  • 정리

예시로 들면서 풀의 종류나 내가 넣어둔 자금의 갯수등을 확인하는 등 여러가지 정보를 다루었는데요.
실제 러그풀이 발생하는 비상상황에서는 위에 나열한 것들을 다 해볼 시간도 이유도 없겠죠.
그때는 최단속으로 출금을 실행하기 위해 Masterchef 에 들어가서 userinfo 에 대략 예상되는 pid 숫자와 내 지갑 주소를 넣고 amount 가 내 LPToken 갯수만큼 나올때까지 마구 누르다가 정확한 pid 가 발견되면 바로 write contract 의 emergencyWithdraw 에 pid 입력하고 바로 트랜젝션을 날려야 합니다.
실제로 해보면 몇 초만에 끝낼 수 있는 절차죠.
평소에 미리미리 테스트 삼아 연습해 두시면 비상시에 버벅이지않고 바로 실행할 수 있을겁니다.

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!
Sort Order:  

@skuld2000 transfered 1.0 KRWP to @krwp.burn. voting percent : 3.20%, voting power : 80.10%, steem power : 1733248.14, STU KRW : 1200.
@skuld2000 staking status : 300 KRWP
@skuld2000 limit for KRWP voting service : 0.9 KRWP (rate : 0.003)
What you sent : 1.0 KRWP
Refund balance : 0.099 KRWP [52241547 - 0ecc8a95e7ccab7d84abd3f1c2ded4eddea2dd78]

저는 안하니 비상시란 발생할수 없네요! 이만~ ㅎㅎ
즐거운 오후 되세요~

read contract에서 제가 투자한 lp들 찾아봤습니다. 아자 ~!!

masterchef/lp pid 번호만 알고 있으면, 즉시출금 !!!

암호만 같았던.. bscscan 홈페이지가 조금 보이기 시작합니다.

완전 신세계를 만난거 같습니다.
정말 감사드립니다.

팬케익 메인화면에 분명이.. 이자농사 중인데요,
이건 도통 못찾겠습니다. 워낙 소량이라고 그런지.. 한 20불 넣었는데.. 녹아 없어 졌는지.. 안보입니다.
나중에 BNB가 3000불은 가야 보일려나 ㅎㅎ
NULS-BUSD 쌍이였는데요............. 아이구...

맨 위의 Live Finished 선택하는 곳에서 Finished 선택하시면 그 풀이 보이실겁니다.

좋은글 감사합니다~

오오 대박이네요... 역시 전문가!

혹시 팬케이크버니 마스터쉐프 주소 좀 찾아주실 수 있을까요?
2시간 찾다가 포기했는데..ㅠㅠ
커피 좋아하시면 커피 기프티콘이라도 드릴게요..ㅠㅠ