今回は直接コントラクトからLPを解体する方法について画像付きで解説していきます。
この記事は「【DeFi】直接コントラクトからLPを作成する方法を解説します。」の続きの内容となっています。
まずは大きく1〜4項目に分けて各操作の流れや「なぜこの操作をするのか?」を解説し、5項目目で内容の復習も兼ねて実際にLPを解体する時の操作手順を解説していきたいと思います。
難しく感じる方は、5項目目の操作手順のところだけでもぜひ見てもらえたらと思います。
1. Router(ルーター)を探す
DEXというのはRouterとFactoryと各LPのコントラクトから構成されていて、この3つのおかげでSwapやLiquidityの提供がされるようになっています。
ユーザーはRouterを介して操作することになるので、まずはRouterを探す必要があります。
2. RemoveLiquidityを探す
次にRouterの中からRemoveLiquidityという機能を探す必要があります。今回は題材としてPancakeSwapを扱うのですが、下の画像(Pancakeのコード)で赤枠の部分(removeLiquidity)を探す必要があります。
実際は、このままコードを貼り付ける必要はなくBscScanから見つければ大丈夫です。
仮に片方がネットワークトークンの場合、例えばバイナンススマートチェーンであればBNB、ファントムネットワークであればFTM、ポリゴンネットワークであればMATICなどの場合は、先ほどのコードのすぐ下にある部分を使います。(removeLiquidityETH)
片方のトークンがネットワークトークンの場合はこっちのコードを使うんだな〜ということだけ覚えておいてください。
そしてひとつ分かりにくいところがあるのですが「RemoveLiquidity」と「RemoveLiquidityWithPermit」という2つの似ている機能(関数)があります。基本的にDeFiをやっている人が無意識に使ってるのは「RemoveLiquidityWithPermit」になります。
ここでは何をやっているかというと、LPの解体をするためにはRouterにLPの使用をApproveしなければいけませんが、それを省略することができます。
LP解体操作をやったことがある人は分かると思いますが、LPの解体をするときにApproveボタンを押してRemoveボタンを押すと思いますが、Approveの時にトランザクションを実行していないはずなんです。(DEXによっては実行しているところもありますが、基本的には実行しなくてもそのままできます。)
この際「Permit」がポイントになるのですが、イメージとしては「鍵のようなものを用意して、結果的にApproveをしているのと同じように扱える」という感じになっています。
ここはプログラムを書ける人からしたら簡単に解決できるのですが、scan上からトランザクションを発行したい直コン組には難しいポイントです。
今回は「RemoveLiquidityWithPermit」を直コンでScanからやる場合は「Permit」の処理をするのが難しいので、今回は「RemoveLiquidity」を選びました。
3. LPをRouterに向けてApprove
これはMasterChefに向けてApproveする時と同じです。
解体する時にはRouterに解体の許可をして、その後RouterがFactoryに送ったりいろいろ工程があるのですが、その時にユーザーのLPを扱うことになるのでApproveしないといけません。
Approveの処理はいつもどおり、LPのコントラクトに行きApproveでRouterのコントラクトアドレスと数量を入れるだけですので画像は省略します。
もしわからない方は記事冒頭の動画を確認してください。
4. MinとDeadlineを入れて実行
コードを見ると「Min」と「Deadline」と書かれているのがわかります。ここにタイムスタンプを入れる必要があります。
- tokenA / tokenB
各トークンのコントラクト - liquidity
LPの数量(Wei単位) - amountAMin / amountBMin
LP解体を中断させるための各トークンの最低使用量(普段はスリッページに基づいて設定される) - to
作成したLPの送付先。自分のアドレスを入力すればよい。 - deadline
強制終了させる時間のタイムスタンプ
コントラクトの実行の仕方を記事で紹介する場合、0から説明しておかないと後から訳がわからなくなるので一応ここで丁寧に説明しておくと、コード部分に「tokenA」「tokenB」と書かれていますが、これがLPを構成する各トークンのコントラクトになります。
この「tokenA」「tokenB」がネットワークトークン(BSCならBNB、PolygonNetworkならMATICなど)だった場合は「RemoveLiquidityETH」になります。(下記画像参照)
続いて「unit liquidity」の部分についてですが、これはLiquidityのamount(数量)になります。
ちなみに数量はユニットコンバーターの単位です。下の画像の一番上にある「Wei」という単位になります。
続いて「amountAMin」「amountBMin」はそれぞれAとBのトークンを「最小どれくらい受け取りたいか?」を意味しています。なのでここに書き込まれた数字以下であれば強制終了にになり、実行しなかったことにしたい。という数量になります。
ちなみに、なにがなんでも実行したいという場合は両方とも「0」「0」を入力するといけます。
続いて「address to」は、自分のアドレスを入れる箇所になります。
次に「unit Deadline」は、タイムスタンプになります。
タイムスタンプと検索すると下の画像のようなサイトが出ます。この表示されているタイムスタンプが現在時刻です。そしてこれを未来の時間にすれば良いということになります。
以上で、項目1〜4の解説を終わります。では実際に操作していきます。
5. 操作の流れ
いろんなページを行ったり来たりするので、一度開いたページは閉じないほうが便利です。
開くことになるページまとめ
- Routerのコントラクトページ
- LPペアのコントラクトページ
- tokenAのコントラクトページ
- tokenBのコントラクトページ
- timestampの取得用のサイトのページ
この方法を覚えておくと、仮にDEXを自作しているラグプルがあった場合にもLPを解体することができます。
基本的にラグプルするパターンというのは、大体PacakeのDEX(いわゆるCAKE LP)でずっとやっていたり、他のところで裏ではDEXを使っているというパターンが多いです。今のところ他のサイトがラグってもPancakeRouterで処理できるので、Pancake上でインポートすれば解体ができるようになっています。
今回は、作ったばかりの「BUSD-LINK LP」を解体していきたいと思います。
まずは項目①で解説した通り、DEXのRouterを探していきます。今回の場合だとPancakeRouterを探します。探すときは「Docs」「Github」「LPを作成した時のトランザクションのログ」のどれかから探すことができます。今回はトランザクションのログからいきます。
右上のMetaMaskのアイコンをタップして、トランザクションのログをタップします。
「↗︎」をタップします。
「Overview」をタップします。
下にスクロールすると自分が作ったLP一覧が記載されています。「Pancake LPs(Cake-L…)」をタップします。
次に「Write Contract」をタップします。
「Contract to Web3」をタップしてウォレットを繋げていきます。
接続したいウォレットをタップします。
ウォレットが接続できたら「spender(Routerのコントラクト)」と「value」に入力します。
まずは「spender」にRouterのコントラクトを入力する方法から解説します。先ほど5個前の操作(画像)で開いたページに戻り「Logs」をタップします。
下にスクロールして今回解体するのに必要なRouterアドレスを探します。(ページを開けばコントラクト名を確認できます。)
するとこのように表示されているのですが、上部にあるアドレスをコピーします。
再びウォレットを接続した時のページ(4つ前の画像)に戻りペーストします。
次に「value」に入力する方法を解説していきます。9個前の操作(画像)で開いたページに戻り、赤枠の部分をコピーします。
次に、プログラム用の単位(Wei)に変換して「value」に入力しなければいけないのでBscScanの「Unit Converter」というページを開きます。([Unite Converter BscScan] でググってください。)
このようなページが出ます。
次に「1」の欄に先ほどコピーした数値をペーストします。
そして一番上の「Wei」という単位の欄に表示された数値をコピーします。
再び、5つ前のページ(画像)に戻り「value」の欄にペーストします。
「Write」をタップして「確認」をタップします。
続いて、8個前の操作(画像)で開いたページに戻ります。
「Contract」「Write Contract」「Connect toWeb3」 の順でタップします。
ウォレットを接続するので、接続したいウォレットをタップします。
接続されたら下にスクロールして「3.Remove Liquidity」の欄を入力していきます。まずはtokenAからいきます。
8個前の操作(画像)で開いたページに戻り、赤枠をタップします。
トークンアドレスをコピーします。
再びこのページに戻りtokenAの欄にペーストします。
再び3つ前の画面に戻り赤枠をタップします。
同じようにトークンアドレスをコピーします。
そして下のページに戻りtokenBにペーストします。
続いてLiquidityの欄には11個前の操作でやった「Wei」の数値をコピー&ペーストします。
続いて「amountAMin」「amountBMin」は両方とも0と入力します。(ここは解体した後に手に入るトークンの最小量になります。)
続いてウォレットのアイコンをタップしてアドレスをコピーし、「to(address)」にペーストします。
次にGoogleで[Timestamp]と検索して赤枠のサイトをタップします。
「現在時刻を取得」をタップします。
Timesatampが表示されるのでコピーします。
↓(途中の数字を適当に増やして未来の時間にします。)
再び4つ前の操作(画面)に戻り「Deadline(unit256)」にペーストします。
そして、このままWrite」をタップしても現在時刻が過ぎていれば通らないので、数字を少し増やします。
その後「Write」をタップすると通ります。
以上で解体の操作が完了です。
6.まとめ
ページを行ったり来たりするので難しく感じた方もいらっしゃるともいますが、少しずつ覚えていただくと今後他の部分で役に立つかもしれないので実際にやってもらえたらと思います。
文章だとわかりづらい方はYoutube動画でも解説しているのでそちらも見てもらえたらと思います。
最後まで読んでいただきありがとうございました。