こんにちは!ニナ(@_ninahaus_)🦆です。
前回「コントラクト直叩きでバックレ詐欺からLPトークンを取り戻そう」という記事を書いたところ、「勉強になった」「実際に詐欺に引っかかってこの手法でLPトークンを取り戻した」などなど多くの反響をいただきました。
その中で「取り戻したLPを元の2種の通貨に戻したいんだけど、それもコントラクト直叩きでできるの?」という質問が多かったので、本記事ではその方法について調べたことをまとめました。
本記事公開の2021年2月24日時点で本手順は完遂できていません。
私なりの結論は「プログラム無しに、コントラクト直叩きでLPトークンをリムるのは無理」です。本記事はあくまで調べたことのまとめです。
「自分でも手順を試したり調べたりしてみたいので、未完成でも公開してほしい」という声があったため、この記事を公開することにしました。
自分はこんな方法リムーブできたよーという方、ぜひ情報提供していただけましたら嬉しいです!
前回の記事と続き物として書くので、まだ読んでいない方はこちらを先にどうぞ。
https://ninahaus.com/2021/02/07/rescue-lptoken-from-scam-project/
※注意事項※
本記事の内容を実施する場合は完全自己責任で行ってください。
2021年2月24日現在、記載手順でのLPトークンリムーブは成功していません。
本手順を参考に直接コントラクト操作したことで資金がどこかに行ってしまったとしても私は責任を負いません。
また、これは大事なことですが…もし「よく分からない」という箇所がある方は実行しないでください。
DYOR!
コントラクト直叩き自体はいつでも使えるもので、対詐欺専用ではないです。
本記事の手順を実施するうえでのポイント
本当にコントラクト直叩きでLPトークンリムーブする必要があるか?
リムーブしたいLPトークンはどこで受け取りましたか?
- 正当な場所(例:PancakeSwap)でLPトークンを作成した場合
コントラクト直叩きせずともPancakeSwapウェブサイトでリムーブできます。
(PancakeSwapが詐欺した場合はもちろん不可ですが、その可能性は無いでしょう) - 詐欺プロジェクトで直接LPトークンを作成した場合
この場合はPancakeSwapは使えません。詐欺プロジェクトが飛んでしまったら、コントラクト直叩きルートです。
また一見詐欺プロジェクト上で流動性を提供したかのように見えても、実はバックエンドでPancakeSwapを使っていた、という場合もあります。BSCScanでトランザクションを確認しましょう。
とにかく時間との戦い
詐欺プロジェクトのトークンは詐欺露呈後すぐ価値が無くなります。
詐欺プロジェクトトークンーBNBのようなペアでLPトークンを得ていた場合、片方の価値がゼロになるとインパーマネントロスによりBNBはほぼ無くなります。時間が経てば経つほど、取り返せる資金が減ることをご承知おきください。
本記事の手順が意味を成す前提条件
前回同様にPancakeSwapコントラクトを参照しています。
したがって、PancakeSwapフォークでない、またはフォーク後コントラクトを大きく改竄しているプロジェクトに関しては本記事内容の限りではありません。
ウェブサイトを介さずLPトークンをリムる
手順説明のため、前回と同じく架空のシナリオを作ります。
今回の想定シナリオ:
- PancakeSwapがRug Pull、Exit
- ウェブサイトが落ちてしまい繋がらない
- コントラクト直叩きで「CAKE-BNB LPトークン」をレスキュー済 ←前回記事で紹介
- 「CAKE-BNB LPトークン」をCAKEとBNBに戻す ←本記事で紹介
必要なものは以下3つです。
- プロジェクトのRouter Contract
今回はMasterChef Contractではありません。 - そのプロジェクトにおける、あなたの取り出したい通貨のアドレス
今回の場合、CAKEのアドレスです。 - あなたのウォレットアドレス
1.プロジェクトのRouter Contractを見つける
1-1.コードを読まない場合: Contract Creatorから遷移して見つける
もっと簡素な手順があるかもしれません。ご存知の方はぜひ教えてください。
コードが公表されていないプロジェクトや、コードを読みたくない人はBSCScan上でリンクをたどりましょう。
前回見つけたMasterchefContractページの右上のほうにContract Createrアドレスへのリンクがあります。
- 前回見つけたMasterchefContract:
https://bscscan.com/address/0x73feaa1ee314f8c655e354234017be2193c9e24e
- PancakeSwap Creater Address:
https://bscscan.com/address/0x0f9399fc81dac77908a2dde54bb87ee2d17a3373Overview PancakeSwap: Deployer(青枠内)となっているページです。
ここから赤枠内のInternal Txnsに移動します。
- Internal Txns
このタブ内でPancakeSwap: Routerを介して実施された色んなトランザクションが見つかります。ここからPancakeSwap: Routerに移動します。
- PancakeSwap: Router
https://bscscan.com/address/0x05ff2b0db69458a0750badebc4f9e13add608c7fContract OverviewがPancakeSwap: RouterであればOK。
1-2.コードを読む場合: githubから見つける
RouterはSwapの時に使われるものなので、アタリを付けて https://github.com/pancakeswap/pancake-swap-interface リポジトリで「ROUTER_ADDRESS =」を検索してみます。
検索結果:
https://github.com/pancakeswap/pancake-swap-interface/search?q=ROUTER_ADDRESS+%3D
ありました。
なんで検索する文字列が分かるの?
→こういった値の命名は環境変数的なお作法に従いがちです。プロキシならHTTP_PROXY、HTTPS_PROXYとか。
いずれの方法でも辿り着くのは同じアドレスです。
PancakeSwap: Routerアドレスが
https://bscscan.com/address/0x05ff2b0db69458a0750badebc4f9e13add608c7f
であることが分かりました。
2.取り出す通貨のアドレスを見つける
今回はCAKE-BNB LPトークンをリムーブしたいので、PancakeSwapのCAKE tokenアドレスを見つけます。
前回同様に https://bscscan.com/ で「CAKE」と検索すると出てきます。
同名の別トークンである可能性もあるので、Supply量やリンクも確認してください。
- PancakeSwap: CAKEトークン
https://bscscan.com/token/0x0e09fabb73bd3ade0a17ecc321fd13a19e81ce82
3.いざ、LPトークンをリムーブしよう(※未完了)
実験用にPancakeSwapでCAKE-BNB LPトークンを1枚作りました。
RemoveLiquidityEthWithPermitでLPトークンをリムる
PancakeSwap: Routerページで、ContractタブからWrite Contractに移動します。
前回同様に「Connect to Web3」してください。

利用するのは「6. RemoveLiquidityEthWithPermit」です。
実装ベースがUniSwapのため関数名に「ETH」とありますが、BSCにおいてその役割は「BNB」が担います。X-BNBペアのLPトークンをリムーブする関数です。
- token (address)
今回の場合、CAKEのアドレス「0x0e09fabb73bd3ade0a17ecc321fd13a19e81ce82」を入力します。 - liquidity (uint256)
リムーブしたいLPトークン量を入力します。decimals 18。 - amountTokenMin (uint256)
受け取りたいCAKEの最少の量を入力します。decimels 18。 - amountETHMin (uint256)
受け取りたいBNBの最少の量を入力します。
BNBはdecimels 8なのですが、BSCScan上ではdecimels 18ぽい。 - to (address)
取得したトークンを送る先、つまりあなたのBSCウォレットアドレスを入力します。 - deadline (uint256)
トランザクションRevert用の指定時間。msecで入力するようです。 - approveMax (bool)
- v (uint8)
signature(署名)のパブリック・ポイント。最後の1バイト。 - r (bytes32)
signature(署名)のパブリック・ポイント。最初の32バイト。 - s (bytes32)
signature(署名)のパブリック・ポイント。2番目の32バイト。
uint256は「符号なし整数」を意味します。0以上の整数(2^256-1まで)の入力を受け付けるということです。
私が手順を完了できなかったわけ
LPトークンをリムーブする流れは以下のようになっているようです。
PancakeSwapウェブサイトのインタフェースを使うと「Remove Liquidity」ボタンを1回ポチるだけで完了しますが、裏では色々動いているんですね。
- スマートコントラクトに送信する内容を設定
(リムるLPトークンや量など) - 署名を動的に生成(65bytes)
- 署名付きリクエストをスマートコントラクトに送信
- LPトークン所持者と上記リクエスト送付者の合致確認後、LPトークンリムーブ
この中でプログラム無しでの入手が難しいのが署名から取って来るv、r、sです。
BSCScan上でコントラクト直叩きすると、②で止めることは出来ません。生成された署名も分かりません。コントラクトを叩く前に「これから生成される署名の各要素を入手する」ことは不可能ですから、BSCScanインタフェースではここで詰んでしまいます。
PancakeSwapの場合、裏で動いているプログラム内で生成された署名をsplitしています。
https://github.com/pancakeswap/pancake-swap-interface/blob/ae6d8295cbf406cb83649fe1adb77b398ac2d802/src/pages/RemoveLiquidity/index.tsx#L157-L164
これはヒトにはできないことですね…。
(参考) Signatureって何:
https://docs.ethers.io/v4/api-utils.html#signatures
現段階で、詐欺プロジェクトLPトークンはコントラクト直叩きでリムーブできない
けっこう長い時間をかけて調べた結果、「どうも難しそうだぞ」という結論に達してしまって申し訳ない限りです。記事投稿を待っていてくれていた方々、ごめんなさい。
2021年2月24日現在の結論は「詐欺プロジェクトでLPトークンを作って、ExitされたらLPトークンは取り返せるけどリムーブできない」です。
#自分でプログラムが書ける人は別ですけど…。
長々書きましたが、やっぱり「資金を入れるプロジェクトの信頼性をよく吟味すること」が大切です。
ただこれ、言うは易く行うは難しなんですよね。最近は詐欺手口の巧妙化・仮想通貨新規参入者の増加によって詐欺被害が多くなっているのをひしひし感じます。
詐欺師の懐を肥やさないよう、なんとか被害後のリカバリ方法が欲しい。アヒルは今後も対詐欺手法を調べていきたいと思います。
記事内容の間違い指摘は大歓迎です。
より良い内容にしていきたいので情報提供お願いいたします。

これは大変勉強になりました。ざっくり言うと内部Programで自動署名しているから事前に調べようがないというわけですね。怪しい場所だとLP組む気なくなるなぁ~・・w