こんにちは!ニナ(@_ninahaus_)🦆です。
タイトルを読んで「何のこと?」と思った方にとってこの記事の内容はおそらく縁がないものです。今後も堅実なcryptoライフを送ってください。
タイトルを読んで興味津々のあなた、バクチもたいがいにしましょう。
※本記事では「LPトークンを取り戻すところまで」です。
「取り戻したLPトークンを元の通貨に戻す方法」はこちら。

※LPを保有するプロジェクトが飛んだ場合は「できない」と結論付けています。
※注意事項※
本記事の内容を実施する場合は完全自己責任で行ってください。
2021年2月6日、私自身で記載手順を実施し確認しました。
ただBSCScanのUIアップデート、PancakeSwap側のコントラクト変更などにより本手順が使えなくなる可能性は十分にあります。
本手順を実施したことで資金がどこかに行ってしまったとしても私は責任を負いません。
また、これは大事なことですが…もし「よく分からない」という箇所がある方は実行しないでください。
DYOR!
※コントラクト直叩き自体はいつでも使えるもので、対詐欺専用ではないです。
(「最後に」参照)
本記事内の手順はPancakeSwap V1、V2で効果確認しています。
本記事を書いた背景:exit scamで資金を失うのを避けたい
BSCが盛り上がるにつれ、既存成功DeFiプロジェクトに続けとばかりに類似プロジェクトが続々誕生しています。新興プロジェクトは参入者が少ないことからAPYが非常に高い傾向にあり魅力的ですが、残念なことに詐欺プロジェクトがまぎれていることがあります。
exit scam詐欺の典型的なステップは以下の通りです。
- サービス開始後しばらくして突然ウェブサイトが消える
- ステークしたLPが取り出せなくなる
- そのまま資金が他所へ移される=持ち逃げされる
サービス開始からウェブサイトが消えるまでの期間は数日から数週間と様々でしたが、記憶に新しいPopcornSwap詐欺では開始後わずか3時間でした。

このようにプロジェクトが高跳びすることをExit scamと言いますが、もっと大きくRug Pullと呼ぶ人も多いです。
「Rug Pull」の直訳は「絨毯を引っ張る」足元の絨毯を引っ張られると転びますよね、そこから「信じ込ていたこと全てを覆す裏切り」を意味します。
※言葉の定義にはいろんな派閥の人がいて、「Rug Pullとは”トークン価格を釣り上げた後にDev(運営側)がトークンを売り払うこと」と言う人も居ます。本記事では大きく括ってRug Pullとしています。
Rug Pull発生に気付いたけれど、ウェブサイトに繋がらないから預け入れたLPトークンをアンステークできない…と「404 not found」画面を見ながら悔しい思いをした方。
前提条件はありますが、その状態でも引き出す方法があります。
DeFi Khaled(@DefiDebauchery)のツイートをベースに、私のほうで色々情報を付け足したものをここに記載します。長い記事になりますが、リスクの高い新興プロジェクトに参戦する人にとっては生命線になり得ますし、コントラクト直叩きって意外と面白いですよ。(当社比)
Khaled氏のツイート原文(英語)はこちら
このツイートからツリーになっています。
https://twitter.com/DefiDebauchery/status/1312745857951903744It was a bad night for #BSC #defi, but I wanted to share a tip. If you ever need to quickly get your staked LP liquidity tokens from a rug-pulled project like $SAFU, the Contract explorer on @bscscan can be your lifeline.
Let’s review!
— DeFi Khaled (@DefiDebauchery) October 4, 2020
本記事の手順が有効になる前提条件
2つの前提条件があります。
- 手順実行時にコントラクトからLPトークンがまだ抜かれていないこと。
もし詐欺側が既にお金を持ち出していた場合は引き出せません。
Rug Pull発生を出来る限り早く検知して実施する必要があります。 - コントラクト内容に詐欺プロジェクトオリジナル要素がないこと
PancakeSwap OSSを丸パクリした詐欺プロジェクトの場合は以下の手順でLPトークンを取り出すことができます。もしWidthdraw関連のソースコードが改変されている場合は同じ挙動をしないかもしれません。
ウェブサイトを介さずFarmからLPトークンを抜く
1.プロジェクトのMasterChef Contractを見つける
新興プロジェクトに資金を入れる前にMasterChef Contractを見つけておく必要があります。
詳しい手順を記載するため、架空のシナリオを作ってみます。
今回の想定シナリオ:
- PancakeSwapがRug Pull
- ウェブサイトが落ちてしまい繋がらない
- コントラクト直叩きで「FRONT-BNB Farmにステーク中のLPトークン」をレスキューする
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であると確認が取れました。
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上で完結することが可能です。
やってみたらちょっと違ったというご報告、間違いのご指摘は大歓迎です。
記事をより良くしていきたいので情報提供お願いいたします。
寄付をいただけると大変励みになります💓🦆
0x00831282F4f0F8C575993A8F2E8997BE3d77e857
(対応チェーン:ETH, BSC,Polygon, Arbitrum, Zk, Fantomなど)