旧PancakeSwap

【詐欺】BSC上のプロジェクトが飛んだ時にコントラクト直叩きでFarm LPを抜く方法【回避】

重要なお知らせ
本記事はニナがPancakeSwapシェフになる前に書かれた古いものです。また、私を含め当ブログに登場するシェフたちのほとんどは2022年6月時点でキッチンにおりません。投資に関してはご自身でご判断下さい。

こんにちは!ニナ(@_ninahaus_)🦆です。

タイトルを読んで「何のこと?」と思った方にとってこの記事の内容はおそらく縁がないものです。今後も堅実なcryptoライフを送ってください。
タイトルを読んで興味津々のあなた、バクチもたいがいにしましょう。

※本記事では「LPトークンを取り戻すところまで」です。
「取り戻したLPトークンを元の通貨に戻す方法」はこちら。

【BSC】【不可?】コントラクト直叩きでLPトークンをリムーブ(元の通貨に戻す)できるか調べてみた こんにちは!ニナ(@_ninahaus_)🦆です。 前回「コントラクト直叩きでバックレ詐欺からLPトークン...

※LPを保有するプロジェクトが飛んだ場合は「できない」と結論付けています。

※注意事項※

本記事の内容を実施する場合は完全自己責任で行ってください。

2021年2月6日、私自身で記載手順を実施し確認しました。
ただBSCScanのUIアップデート、PancakeSwap側のコントラクト変更などにより本手順が使えなくなる可能性は十分にあります。
本手順を実施したことで資金がどこかに行ってしまったとしても私は責任を負いません。
また、これは大事なことですが…もし「よく分からない」という箇所がある方は実行しないでください。

DYOR!

※コントラクト直叩き自体はいつでも使えるもので、対詐欺専用ではないです。
(「最後に」参照)

本記事内の手順はPancakeSwap V1、V2で効果確認しています。

 

本記事を書いた背景:exit scamで資金を失うのを避けたい

BSCが盛り上がるにつれ、既存成功DeFiプロジェクトに続けとばかりに類似プロジェクトが続々誕生しています。新興プロジェクトは参入者が少ないことからAPYが非常に高い傾向にあり魅力的ですが、残念なことに詐欺プロジェクトがまぎれていることがあります。

exit scam詐欺の典型的なステップは以下の通りです。

  1. サービス開始後しばらくして突然ウェブサイトが消える
  2. ステークしたLPが取り出せなくなる
  3. そのまま資金が他所へ移される=持ち逃げされる

 

サービス開始からウェブサイトが消えるまでの期間は数日から数週間と様々でしたが、記憶に新しいPopcornSwap詐欺では開始後わずか3時間でした。

【DeFi】被害額200万ドルのPopcornSwap詐欺~2021年1月28日、その時何が起こったか~【Exit】 こんにちは!ニナ(@_ninahaus_)🦆です。 BSC(バイナンススマートチェーン)上で続々DeFiプ...

このようにプロジェクトが高跳びすることをExit scamと言いますが、もっと大きくRug Pullと呼ぶ人も多いです。
「Rug Pull」の直訳は「絨毯を引っ張る」足元の絨毯を引っ張られると転びますよね、そこから「信じ込ていたこと全てを覆す裏切り」を意味します。

※言葉の定義にはいろんな派閥の人がいて、「Rug Pullとは”トークン価格を釣り上げた後にDev(運営側)がトークンを売り払うこと」と言う人も居ます。本記事では大きく括ってRug Pullとしています。

Rug Pull発生に気付いたけれど、ウェブサイトに繋がらないから預け入れたLPトークンをアンステークできない…と「404 not found」画面を見ながら悔しい思いをした方。

前提条件はありますが、その状態でも引き出す方法があります。

DeFi Khaled(@DefiDebauchery)のツイートをベースに、私のほうで色々情報を付け足したものをここに記載します。長い記事になりますが、リスクの高い新興プロジェクトに参戦する人にとっては生命線になり得ますし、コントラクト直叩きって意外と面白いですよ。(当社比)

ニナ
ニナ
ブログ記載を快諾してくれたKhaled氏に感謝!

 

Khaled氏のツイート原文(英語)はこちら

このツイートからツリーになっています。

本記事の手順が有効になる前提条件

2つの前提条件があります。

  1. 手順実行時にコントラクトからLPトークンがまだ抜かれていないこと。
    もし詐欺側が既にお金を持ち出していた場合は引き出せません。
    Rug Pull発生を出来る限り早く検知して実施する必要があります。
  2. コントラクト内容に詐欺プロジェクトオリジナル要素がないこと
    PancakeSwap OSSを丸パクリした詐欺プロジェクトの場合は以下の手順でLPトークンを取り出すことができます。もしWidthdraw関連のソースコードが改変されている場合は同じ挙動をしないかもしれません。

 

ウェブサイトを介さずFarmからLPトークンを抜く

1.プロジェクトのMasterChef Contractを見つける

新興プロジェクトに資金を入れる前にMasterChef Contractを見つけておく必要があります。
詳しい手順を記載するため、架空のシナリオを作ってみます。

今回の想定シナリオ:

  • PancakeSwapがRug Pull
  • ウェブサイトが落ちてしまい繋がらない
  • コントラクト直叩きで「FRONT-BNB Farmにステーク中のLPトークン」をレスキューする
ニナ
ニナ
PancakeSwapは真っ当なプロジェクトだよ!

 

1-1.BSCScanでCAKEトークンのページを見つける

https://bscscan.com で検索バーに「CAKE」と入れれば出てきます。

こちらのページに飛びます:
https://bscscan.com/address/0x0e09fabb73bd3ade0a17ecc321fd13a19e81ce82

 

1-2.Owner(= MasterChef) に移動する

「Read Contract」タブに移動すると、下のほうに「14.owner」があるので移動します。

  • Read Contractはこちら

  • ownerはこちら

このownerアドレスがMasterChef Contractです。
https://bscscan.com/address/0x73feaa1ee314f8c655e354234017be2193c9e24e

Contractタブでトークンペアや報酬に関するコントラクトにアクセスすることができます。ソースコードを読むこともできますが、LPトークンを抜くだけなら必要ありません。

もちろんコードを読むことは常に良いアイデアです。

2.抜きたいLPトークンがあるプールIDを特定する

ほとんどのプロジェクトでは複数のLPぺアを提供しているため、プールが複数あります。
抜きたいLPトークンが入っているプールID(pid)を特定しましょう。

LPトークンが入ってるのはFarmじゃ?と思うかもしれませんが、コード的にはpidとしてラベル管理されてるみたいです。
BSCScanの表示も「Pool」であって「Farm」ではないですし、慣例的にそういうものなのかも。

「Contract」タブから「Read Contract」セクションに切り替え、Pool情報を記載する
「9. poolinfo/10. poolLength」を見つけてください。

  • Contractタブはこちら

  • Read Contractタブはこちら

  • Pool情報欄

2-1.コードが読めない場合: poolLengthから予想して総当たり作戦

コードが公表されていないプロジェクトや、コードを読みたくない人は総当たりでpidを特定します。

まず、poolLengthを確認します。

今回例に利用しているPancakeSwapの場合、「10.PoolLength」の下にある「71」からMAX71個のFarmがあることがわかります。これはpid=0~70番地にFarmが配置されていますよーという意味です。

余談:
空き番地もあるので、実際に71個のFarmがあるわけではありません。

例えば「70」を入力してみましょう。

「  lpToken   address :  0x99d865Ed50D2C32c1493896810FA386c1Ce81D91

このページを見に行ってみると…

最近追加されたETH-BETH LP Farmであることが分かりますね。
この要領でお目当てのFarmを探しましょう。情報工学のお作法的に、小さいpidほど古いFarmであると予測できます。PancakeSwapは71も可能性がありますが、新興プロジェクトなら総数も少ないでしょうし、数撃ちゃ当たります。

2-2.コードが読める場合: Farm configからpidを入手

PancakeSwapの場合、数が多いので当てずっぽうはつらいです。ソースコードが公開されているのでそちらをカンニングしましょう。

2021年2月6日現在、PancakeSwapのconfigはここです:
https://github.com/pancakeswap/pancake-frontend/blob/master/src/config/constants/farms.ts

PancakeSwapをForkして作られたプロジェクトの場合、似たような構成の似たようなファイルにこのconfigがあると思われます。

さて、お目当てのFRONT-BNBは「pid: 57」であることが分かりました。

...
pid: 57,
lpSymbol: 'FRONT-BNB LP',
lpAddresses: {
97: '',
56: '0x36b7d2e5c7877392fb17f9219efad56f3d794700',
},
..

確認のため、「9. poolinfo」に「57」を入れてQuery発行してみましょう。

 lpToken   address :  0x36b7D2e5C7877392Fb17f9219efaD56F3D794700

ソースコードのlpAddressesに一致しますし、BSCScan上でも「FRONT」と表記があります。pid57がFRONT-BNB Farmであると確認が取れました。

ニナ
ニナ
なんでETH-BETHみたいにFRONT-BNB表記じゃないかって?知らんがな

3.バックレ運営からLPトークンをレスキューしよう

これまでの手順でどのpidにLPトークンがあるか分かりました。
いよいよ取り出しましょう。

セクションの一番上にある「Write Contract」に切り替えて、「Connect to Web3」でウォレットを認証します。ポップアップが出るので、内容を読んでOKであればページがウォレットと通信することを許可します。

ポップアップの内容ざっくり

「Connect to Web3はbeta版(正式リリースではない)機能で、「あるがまま」提供されます。BSCScanはいかなる保証もしないし、本機能を利用することにより発生する直接的ないし間接的な損失が発生した場合でも一切の責任を負いません。」

つまり…

 

EmergencyWithdraw (※ステーク報酬が要らない場合)

この方法ではステーク報酬を失うことになります。
テストする際は注意してください!

Rug Pullの場合、ステーク報酬(詐欺プロジェクトのトークン)は無価値になります。
またレスキューは一刻を争うことから、Rug Pull時はステーク報酬を捨ててこちらを実行すると良いと思います。

EmergencyWithdraw欄に先ほど入手したpidを入力し「Write」をクリックすると、コントラクトにLPトークンを返却するように伝えます。

metamaskのいつものガス代確認を承認すると、LPトークンがウォレットに入りました。ステークしていたLPトークンが回収できたことが分かります。
(ウォレット内のスクリーンショットはご用意無しです)

Rug Pullでウェブサイトが落ちていると本来見られませんが、参考までにPancakeSwap上の変化を載せておきます。

左が手順実行前、右が手順実行後です。

ステーク報酬のCAKEがウォレットに入ることなく、どこかに行ってしまいました。さようなら。

Withdraw (※ステーク報酬を引き出したい場合)

ステーク報酬も引き出したい場合は、emergencywithdrawの前にこちらを使ってください。Withdrawはステーク報酬のみ引き出します。

先ほど入手したpidと、今回はamountを入力します。
正確にいくら引き出したいか分かっている場合はamountをアジャストできますが、分からない場合は大きな数字を入れればいいと思います。余計にステーク報酬が貰えることはありません(残念)。

「Write」をクリックしてコントラクトにステーク報酬を引き出すよう伝えます。

metamaskのいつものガス代確認を承認すると、ステーク報酬のCAKEがウォレットに入りました。ステークしているLPはステークされたままです。
(ウォレット内のスクリーンショットはご用意無しです)

Rug Pullでウェブサイトが落ちていると本来見られませんが、参考までにPancakeSwap上の変化を載せておきます。

左が手順実行前、右が手順実行後です。

 

 

 

 

 

8.833CAKEあったステーク報酬はWithdrawしたことでウォレットに入りました。
ステーク報酬表示はいったん0になりましたが、LPトークンがステークのままのため、すぐ新しいステーク報酬を稼ぎました。

順番まとめ

  • ステーク報酬は不要でLPトークンのみ引き出したい場合
    EmergencyWithdraw(LPトークン引き出し)だけ実施
  • ステーク報酬とLPトークン両方引き出したい場合
    Withdrawでステーク報酬を受け取ってからEmergencyWithdraw(LPトークン引き出し)

 

EmergencyWithdrawを無効化した詐欺を検知する

2021年3月6日、ShibDefi (https://shibdefi.finance/)というプロジェクトがローンチ後3.5時間ほどでRugpull/Exitしました。
※既にこのサイトはダウンしておりリンク切れです。

ニナ
ニナ
久々にやられましたね

 

https://twitter.com/shibdefi はローンチ後頻繁に$SHIBDトークンをバーンしていることを発信していました。

並行してテレグラムグループ(こちらは既に削除済み)でユーザーの質問に答えており、運営の印象はそこまで悪くなかったです。

さて、上記画像内で既に有志が怪しんでいるように、ShibDefiはEmergencyWithdrawが出来ないことがローンチ直後から分かっていました。偶然TXが失敗しただけだろうと私は気にしなかったのですが(気にしろよ)、後に、この柴犬は「DevウォレットアドレスのみがEmergencyWithdrawを実行できる」ようコントラクトを書き換えていたことが分かりました。(コード内赤字部分)
そのためRugpull前・後問わず、コントラクト直叩きEmergencyWithdrawによるLP救出を試みても成功しなかったわけです。
またemit EmergencyWithdrawもありません。

// Withdraw without caring about rewards. EMERGENCY ONLY. function emergencyWithdraw(uint256 _pid) 
public { 
    require(msg.sender == devaddr); 
    PoolInfo storage pool = poolInfo[_pid]; 
    UserInfo storage user = userInfo[_pid][msg.sender]; 
    uint256 amount = user.amount; 
    user.amount = 0; 
    user.rewardDebt = 0; 
    pool.lpToken.safeTransfer(address(msg.sender), amount); 
}

https://bscscan.com/address/0x528875A1fF4FC3e0AC593Ef24154d00a937E0600#code

PancakeSwapのオリジナルコードはこちら。
「require(msg.sender == devaddr);」は有りません。

// Withdraw without caring about rewards. EMERGENCY ONLY. function emergencyWithdraw(uint256 _pid) 
public { 
    PoolInfo storage pool = poolInfo[_pid]; 
    UserInfo storage user = userInfo[_pid][msg.sender]; 
    pool.lpToken.safeTransfer(address(msg.sender), user.amount); 
    emit EmergencyWithdraw(msg.sender, _pid, user.amount); 
    user.amount = 0; user.rewardDebt = 0; 
}

https://bscscan.com/address/0x73feaa1ee314f8c655e354234017be2193c9e24e#code

今回の詐欺から学んだことは「EmergencyWithdrawコードに妙な仕掛けがないか事前にチェックする」です。
方法は簡単で、MasterChef ContractのCode欄「Contract Source Code」内にあるemergencywithdraw部分をチェックすればOKです。
PancakeSwapのコードと異なる部分がある場合、その理由を考えましょう。

ShibDefi トークンアドレス:
https://bscscan.com/token/0x39d75f5501807A90a4B83aeD80035b5061c0986e

ShibDefi MasterChef Contract:
https://bscscan.com/address/0x528875A1fF4FC3e0AC593Ef24154d00a937E0600

ShibDefi Timelock Contract:
https://bscscan.com/address/0x4298d782527Be552048B6B09af9EA00D33073230

最後に

ずいぶん長い記事になってしまいましたが、手順自体はそう複雑ではありません。
信憑性の不確かな新興プロジェクトに参戦する場合はこの手順を心に留めておいていただくと、万が一の時に役立つかもしれません。

参戦する場合は以下を心掛けましょう。

  • 大金を預ける前にMasterChef Contractを把握する
  • EmergencyWithdrawコードに妙な仕掛けがないか確認する
  • 少額INしてEmergencyWithdrawが効くか確認する

詐欺プロジェクトに泣く人が減りますように。

ニナ
ニナ
その前に怪しいのに手を出さないほうがいいよ

 

本手順はRug Pull時以外でも使えます

絶賛稼働中のPancakeSwapを例にしたことからお察しであると思いますが、コントラクト直叩き自体はいつでも使えます。

BSC DeFiプロジェクトのMasterChef Contructと目当てのFarm pidさえ分かっていれば、各ウェブサイト訪問なしに、複数のBSC DeFiプロジェクトでの引き出し操作をBSCScan上で完結することが可能です。

ニナ
ニナ
誰がやりたいのかは知りません!

 

やってみたらちょっと違ったというご報告、間違いのご指摘は大歓迎です。
記事をより良くしていきたいので情報提供お願いいたします。

 

アヒルの活動支援

寄付をいただけると大変励みになります🦆
0xb0c12f825c53E665e119fef5C3108d58c1e38db8

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA