【BSC】【不可?】コントラクト直叩きでLPトークンをリムーブ(元の通貨に戻す)できるか調べてみた
直コンでLPトークンをリムーブできるか調べてみて無理そうだと結論づけた話。
![【BSC】【不可?】コントラクト直叩きでLPトークンをリムーブ(元の通貨に戻す)できるか調べてみた](/content/images/size/w1200/2024/07/hatena.png)
こんにちは、ニナ(@_ninahaus
_)です。
前回「コントラクト直叩きでバックレ詐欺からLPトークンを取り戻そう」という記事を書いたところ、「勉強になった」「実際に詐欺に引っかかってこの手法でLPトークンを取り戻した」などなど多くの反響をいただきました。
その中で「取り戻したLPトークンを元の2種類の通貨に戻したいんだけど、それもコントラクト直叩きでできるの?」という質問が多かったので、本記事ではその方法について調べたことをまとめました。
本記事公開の2021年2月24日時点で本手順は完遂できていません。
私なりの結論は「プログラム無しに、コントラクト直叩きでLPトークンをリムるのは無理」です。本記事はあくまで調べたことのまとめです。
「自分でも手順を試したり調べたりしてみたいので、未完成でも公開してほしい」という声があったため、この記事を公開することにしました。自分はこんな方法リムーブできたよーという方、ぜひ情報提供していただけましたら嬉しいです!
前回の記事と続き物として書くので、まだ読んでいない方はこちらの【詐欺】BSC上のプロジェクトが飛んだ時にコントラクト直叩きでFarm LPを抜く方法【回避】)を先にどうぞ。
※注意事項※
本記事の内容を実施する場合は完全自己責任で行ってください。
2021年2月24日現在、記載手順でのLPトークンリムーブは成功していません。
本手順を参考に直接コントラクト操作したことで資金がどこかに行ってしまったとしても私は責任を負いません。
また、これは大事なことですが…もし「よく分からない」という箇所がある方は実行しないでください。
DYOR!
コントラクト直叩き自体はいつでも使えるもので、対詐欺専用ではないです。
本記事の手順を実施するうえでのポイント<
本当にコントラクト直叩きでLPトークンリムーブする必要があるか?
リムーブしたいLPトークンをどこから受け取りましたか?
- 真っ当な場所(例:PancakeSwap)からLPトークンを受け取った場合
コントラクト直叩きせずともPancakeSwapウェブサイトでリムーブできます。
PancakeSwapがバックレ詐欺した場合はもちろん不可ですが、その可能性は非常に低いでしょう。
- 詐欺プロジェクトで直接LPトークンを作成した場合
この場合は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://ninahaus.com/content/images/2024/07/image-30.png)
- PancakeSwap Creater Address
Overview PancakeSwap: Deployer(青枠内)となっているページです。
ここから赤枠内のInternal Txnsに移動します。
![](https://ninahaus.com/content/images/2024/07/image-31.png)
- Internal Txns
このタブ内でPancakeSwap: Routerを介して実施された色んなトランザクションが見つかります。ここからPancakeSwap: Routerに移動します。
![](https://ninahaus.com/content/images/2024/07/image-32.png)
- PancakeSwap: Router
Contract OverviewがPancakeSwap: RouterであればOK。
![](https://ninahaus.com/content/images/2024/07/image-33.png)
1-2.コードを読む場合: githubから見つける
![](https://ninahaus.com/content/images/person/left-ahiru.png)
Routerアドレスなんてそうそう変わらんはず…これはHard Codingの気配!
RouterはSwapの時に使われるものなので、アタリを付けてpancake-swap-interfaceリポジトリで「ROUTER_ADDRESS =」を検索してみます。
検索結果:
https://github.com/pancakeswap/pancake-swap-interface/search?q=ROUTER_ADDRESS+%3D
ありました。
![](https://ninahaus.com/content/images/2024/07/image-34.png)
なんで検索する文字列が分かるの?
→こういった値の命名は環境変数的なお作法に従いがちです。プロキシならHTTP_PROXY、HTTPS_PROXYとか。
いずれの方法でも辿り着くのは同じアドレスです。
PancakeSwap: Routerアドレスがhttps://bscscan.com/address/0x05ff2b0db69458a0750badebc4f9e13add608c7fであることが分かりました。
2.取り出す通貨のアドレスを見つける
今回はCAKE-BNB LPトークンをリムーブしたいので、PancakeSwapのCAKE tokenアドレスを見つけます。
前回同様にBSCScan で「CAKE」と検索すると出てきます。
同名の別トークンである可能性もあるので、供給量やリンクも確認してください。
- PancakeSwap: CAKEトークン
https://bscscan.com/token/0x0e09fabb73bd3ade0a17ecc321fd13a19e81ce82
3.いざ、LPトークンをリムーブしよう(※未完了)
実験用にPancakeSwapでCAKE-BNB LPトークンを1枚作りました。
![](https://ninahaus.com/content/images/2024/07/image-35.png)
RemoveLiquidityEthWithPermitでLPトークンをリムる
PancakeSwap: Routerページで、ContractタブからWrite Contractに移動します。
前回同様に「Connect to Web3」してください。
![](https://ninahaus.com/content/images/2024/07/image-36.png)
利用するのは「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まで)の入力を受け付けるということです。
![](https://ninahaus.com/content/images/person/left-ahiru.png)
11579208923738≪中略≫4007913129639935
私が手順を完了できなかったわけ
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
![](https://ninahaus.com/content/images/2024/07/image-37.png)
現段階で、詐欺プロジェクトLPトークンはコントラクト直叩きでリムーブできない
けっこう長い時間をかけて調べた結果、「どうも難しそうだぞ」という結論に達してしまって申し訳ない限りです。記事投稿を待っていてくれていた方々、ごめんなさい。
2021年2月24日現在の結論は「詐欺プロジェクトでLPトークンを作って、プロジェクトにExitされたら、直コンでLPトークンは取り返せるけどリムーブはできない」です。
※自分でプログラムを書く人は別です
![](https://ninahaus.com/content/images/person/left-ahiru.png)
ゴミLPトークンがウォレットに残るだけ…
長々書きましたが、やっぱり「資金を入れるプロジェクトの信頼性をよく吟味すること」が大切です。
ただこれ、言うは易く行うは難しなんですよね。最近は詐欺手口の巧妙化・仮想通貨新規参入者の増加によって詐欺被害が多くなっているのをひしひし感じます。
詐欺師の懐を肥やさないよう、なんとか被害後のリカバリ方法が欲しい。アヒルは今後も対詐欺手法を調べていきたいと思います。
記事内容の間違い指摘は大歓迎です。
より良い内容にしていきたいので情報提供お願いいたします!
関連する読み物
- 【詐欺】BSC上のプロジェクトが飛んだ時にコントラクト直叩きでFarm LPを抜く方法【回避】)