今回の記事では、『コントラクトから直接LPを作成する方法』を解説したいと思います。
これは、直接コントラクトを叩くという意味の略称で直コンと言うものの中でのLPの作成方法になります。
- サイトにアクセスできない時
- 極論DeFiをする上でできるようになると安全
大きくわけてこの2点の理由で知っておくとどこかで役に立つ場面があるかと思います。コントラクトからLPを作成する際大きく分けて5つの工程になりますので是非最後まで読んで頂ければと思います。
①Routerを探す
まず始めに『Router』を探します。
パンケーキスワップからはいってLPを組んだり、単体プールで入れて運用しているという方は余り馴染みのない言葉かと思います。ただ、DEXを理解する上でかなり重要な概念になります。
そのため、DEXの仕組みを理解すると『Router』について分かるようになるのでDEXについて紹介したいと思います。
DEXの仕組み
ユーザーはDEXを利用して、SwapしたりLiquidity(流動性)の提供をしています。
そのDEXの仕組みの中に、RouterやFactory・流動性があります。実際には、このLP(流動性のペア)が元になってトークンをスワップしていたりします。
LPだけあれば大丈夫なように思われますが、RouterとFactoryが必ず必要になります。
RouterがFactoryを操作し、FactoryにLPを作らせる
DEXを作った事がある人は分かるかと思うのですが、Routerを作る際にFACTORYのアドレスが必要になります。なので順番としては、FACTORYを作ってからRouterを作ります。
Factory:LPの作成などをしています。
Router : ユーザーの経由をします。
▶Liquidityの追加や削除、Swapする人がきたかどうかなど。
なので、ユーザーは全部Routerにアクセスしており、まずはRouterを探す所からはじまります。これはLPを解体する場合やスワップしたい場合も同様です。
基本的には、コントラクトを辿っていくとRouterを見つけることができます。大体はドキュメントからもすぐ見つけられるようになっています。
スワップやLP作成・解体のトランザクションはRouterを経由してますので、トランザクション履歴から探すこともできます。また、名前がRouter名がわかっているのであればscanから探すこともできます。
※今回は、SpiritSwapで行います。
ラグプルの場合:履歴から探す or ゴリ押しで探す
通常であれば、ドキュメントにRouterが表示されています。
もし、ラグプルした場合はページが見れなかった場合は昔のトランザクションを探します。
サイトが見れないので自分がLPを作ったときのトランザクションや、その前のトランザクションなどを辿って探す方法しかないです。
AddLiquidityからLPを作成していく
SpiritRouterのURLにアクセス後、WriteContractのaddliquidtyで作っていきます。
下に行くと2.addLiquidityEHEがありますが、基本的に同じ機能になります。どこが違うかと言うと、片方がネットワークトークンになっています。
例:SpiritSwapはFantomのネットワークの為、Fantomと何かペアを組むときはこちらです。どちらも、Fantomではない場合は上記のaddLiquidityを使います。
AddLiquidityの項目の解説
今回は、BNB-SPIRITのペアを組みたいと思います。
そのため、1.addLiquidityをやっていきます。
埋めないといけない項目が沢山ありますが、まずはRouterのクラスであることを確認します。
- tokenA / tokenB
各トークンのコントラクト - amountADesired / amountBDesired
各トークンのLP作成に”使いたい”数量 - amountAMin / amountBMin
LP作成を中断させるための各トークンの最低使用量(普段はスリッページに基づいて設定される) - to
作成したLPの送付先。自分のアドレスを入力すればよい。 - deadline
強制終了させる時間のタイムスタンプ
ざっくりまとめていますが、この項目を埋めていく必要があります。詳細に解説していきます。
こちらが、RouterのSpiritRouterクラスになります。
ここにある、addLiquidityという関数を叩く事になります。ここが先程と同様に必要な項目になります。
矢印の所にあるensure(deadline)これがなにかという説明が上にある関数で宣言されています。
requireというのは、条件を満たしているかどうかを確認するという関数になります。満たしていない場合は、そこで強制終了します。また、強制終了した時にメッセージを出す場合は白いラインが引いてある部分、後ろに文字が入ります。
※ 『>=』:以上という意味です。
この画像が指す意味をまとめると、deadlineがblock.timestamp以上かどうかを確認している機能になります。なので、上記画像にensure(deadline)がついている意味としては、deadlineが今のtimestampよりも未来の話じゃないといけないという事になります。
逆にdeadlineを短く設定すると、それ以内に処理が終わらなかったら強制終了させられます。
補足:block.timestampの意味
上記関数にあるblock.timestampの意味を説明します。
blockとは、ブロックチェーンのブロックになります。
ブロックチェーンと言うのは、FTMScanをみると分かりやすいです。画像のように、ブロック単位でデータがどんどん蓄積されています。そして、その中にトランザクションが含まれています。
ネットワークによって異なりますが、0.5秒〜1秒毎に一個ブロックが積み重なる感じで無限に増えblockと時系列はうまく一対になっています。
例:先程のブロックを開いてみます。
開くとFTMScanのページが表示されます。
次に、画像にあるように、元の数字から無理やり1000程進めてみたいと思います。
するとこのように、カウントダウンになります。
このblockが実行されるのは14分後という意味なので、blockに時系列が乗っている事が分かります。
timestampの概念
普通の時系列を数字化したものをtimestampといいます。
例えば今は1900年1月1日から何日後ですか?と聞かれると全ての日数を足し、何秒後ですか?と聞かれると秒を足していかないといけないと思います。このように、計測するのが『timestamp』です。
【timestamp】と検索するとこのように出てきます。覚える必要はないですが、是非知っておいて欲しいです!
タイムスタンプの数字は、いつの日時を示しているかが分かります。
なので、上記にあった関数(deadlineとblock.taimestamp)はこのタイムスタンプの比較になります。
例:162428・・・ってものを今deadlineに設定した場合、1秒後には実行出来なくなるのでこのrequireを通ることが出来なくなります。
このように設定するのが、block.timestampの意味になります。
②AddLiquidityを実行する
addLiquidityを実行していきます。
- tokenA / tokenB
▶今回はBNBとSpiritの各コントラクトになります。 - amountADesired
▶tokenAの数量。WEI単位なので18桁増やす必要があります。 - amountBDesired
▶tokenBの数量。WEI単位なので18桁増やす必要があります。 - amountAMin/amountBMin
▶許容範囲になります。とにかく作りたい場合は0でOKです。 - to
▶自分のアドレス - deadline
▶timestampを未来のもので適当に入力
③トークンのコントラクトを探す
探し方は様々ありますが、過去にスワップしたことがある方はそこのトランザクションを辿っていくのが良いかと思います。
METAMASKを利用されている方は、アセットから探すことも可能です。
BNBのコントラクト
今回はFTMScanからコントラクトを探しました。
SPIRITのコントラクト
SpiritSwapも同様に探します。
コントラクトの入力
先程探したコントラクトを入れていきます。
この各トークンのコントラクトが全くわからないけど、LPを作りたいって事はないと思うので基本的にはスムーズに完了するかと思います。
※そもそもLPのコントラクトのReadContractにtoken0,token1と表示されていますので、LPコントラクトの存在を見つけた時点で各トークンのコントラクトはすぐ見つけられるようになっています。
④トークンの比率を決める
amountADesiredとamountBDesiredの入力になります。
今回はインターフェイスを利用して、実際の比率を入力したいと思います。
この際に気をつけたいのが、単位です。
私達の世界の1とプログラムの世界の1は単位が異なるため変換する必要があります。私は、BSCScanのユニットコンバーターを利用して変換しています。
BNBも同様に行い入力します。
⑤Minとアドレス・タイムスタンプを入れて実行
amountAMinとamountBMinですが、0でも大丈夫です。
最悪のケースは数量0で利用されるという意味になります。(スリッページが100%のような状態)
deadlineがタイムスタンプになります。
入力する際は、未来の時間になるので少し数字を増やして入力します。
Writeをクリックで実行
Writeを押す前にWalletに接続をしてください。
Writeを押し、トランザクションの確認画面で白色になっていたら問題ないです。
どこか数字が間違えていると、赤色の文言がでて実行出来ないようになります。
この状態だとどれだけお金を用意しても出来ないので意味がありません。
できるような状態にし、確認ボタンで進めていきます。
LPが作成できているかの確認方法
確認を押すと、Writeの隣に【Vew your transaction】と出てくるのでクリックでLPの確認をします。
これでLPが作成されています。
作成する前はこのように、Liquidityがもちろんない状態でした。
先程の5つの工程を踏むと、画像のようにSPRIT/BNBで作ったLPが表示されています。
まとめ
直コンでLPを作成する方法は、まずRouterとAddLiquidityを探す所からはじまります。AddLiquidityの時ですが、addLiquidityETHとの使い方の違いも覚えて欲しいです。
コントラクトの探す方法は、メタマスクから探すのが一番簡単かと思います。
トークンの比率ですが、コントラクトから探す方法や他のDEXから見るという手段もあります。
今回0で設定したamountAMinとamounutBMinですが、数量を画像のように設定したとします。そうすると、使う数量がこの数量以下になってしまった場合には強制終了させることが出来ます。
入力する欄は多いですが、以上が直接コントラクトからLPを作成する工程になります。是非興味がある方は、この記事を参考に実践してみてください。作成する機会が無さそうだなって方も、是非覚えておいて欲しい内容になっているので選択肢の一つとして覚えて頂ければと思います。
最後まで読んでいただきありがとうございました。直接コントラクトからLPを解体する方法は下記記事を参考にしてください。