
【完全保存版】LayerZeroでチェーン間のトークン移動を行おう!
0 はじめに
本日は、Layer Zeroを使用した、チェーン間のトークン移動を見ていきたいと思います。
1 実行してみよう
実際にやってみましょう。
準備として、下の記事の第1章第3節までを実施してください。
できましたら、下のコードで、テストを行います。
npx hardhat test test/contracts/oft/BasedOFT.test.js

結果は下のようになりました。
3種類のコントラクトがデプロイされ、6種類のメソッドが実行されました。

2 コードを見ていこう
1 はじめに
まずは、今回のテストは下の4つになります。

では、こちらから中身を見ていきましょう。

2 チェーンID等の設定
まずはチェーンIDや総供給量などを指定しています。
なお、「parseUnits」関数では、「1,000,000 Ether」をweiの単位に変換しています。
注
イメージしやすいように、Ether、weiの単位で上は記載しました。

3 ownerの設定
次に、「before」でテスト前の処理を行っています。
なお、「before」が一度だけ行われる処理、「beforeEach」は各テスト毎に毎回事前に行われる処理です。
ここでは、「getSigners」でowner用の署名者を取得しています。

4 コントラクトファクトリの設定
そして、コントラクトをデプロイするために、コントラクトファクトリをあらかじめ作っています。

5 エンドポイントのデプロイ
次に、「beforeEach」を見てみましょう。
まずは、「LzEndpointMock」のコントラクトがデプロイされています。

このようになりました。

6 エンドポイントのチェーンの確認
こちらで、設定したチェーンIDが正しいかを確認しています。

7 トークンコントラクトのデプロイ
次に、実際に実行するコントラクトを作成します。


8 目的先エンドポイントの設定
次に、「setDestLzEndpoint」関数で、目的先をmappingで設定しています。

このようになりました。

9 信頼できるリモートコントラクトの設定
次に、「setTrustedRemote」関数で、信頼関係のあるコントラクトを設定します。

下のようになりました。

10 setUseCustomAdapterParamsの設定について
次に、こちらを確認します。
「setUseCustomAdapterParams」をtrueにしています。
その名の通り、アダプタのパラメータを設定するようにしています。

少し探ってみようと思います。
まず、こちらの「ExampleBaseOFT」コントラクトからスタートします。

このようになっていることがわかりました。

さらに、「BaseOFT」コントラクトを見てみると「OFT」を継承していました。

こんな感じですね。

同様に、「OFT」コントラクトを確認すると、下のように、3つ継承していました。

こんな感じですね。

そして、「OFTCore」抽象コントラクトを確認すると、ようやく「setUseCustomAdapterParams」関数がありました。
ただ、あまり詳しいことはここから読み取れないので、一旦スルーします。

内容的には、ここにあったのですね。

3 一番目のテストについて
次に、テスト部分を見てみましょう。
まずはこちらの「it」からテストケースが開始されています。

1 残高の確認
まずは、下の部分で、残高の確認が行われています。

初期状態ですので、こちらを確認しています。

2 送付量の設定
次に、「amount」に「parseUnits」関数を使って、100トークンを設定しています。

3 setUseCustomAdapterParamsの設定
そして、「setUseCustomAdapterParams」関数を「false」に設定しています。
つまり、ここではアダプタのパラメータはデフォルトを使用します。

4 推定される手数料の取得
こちらで、送付時にかかる、推定された手数料を取得します。

なお、「estimateSendFee」関数は「OFTCore」抽象コントラクトにありました

こちらにあったのですね。
一方、実際には、「lzEndpoint」の「estimateFees」関数が使用されています。

なお、こちらにあるように、「nativeFee」は下の3つから構成されていました。


なお、今回のケースの場合、「oracleFee」は下のように定められていました。

5 送付の実施
そして、「sendFrom」関数でトークンの送付を行っています。
例えば、下の部分では、目的先のチェーンやアドレス、量を指定しています。

こちらでは、手数料やアダプターのパラメータを設定しています。
なお、「setUseCustomAdapterParams」を「false」にしているので、「0x」 として、デフォルト値を設定しています。

6 残高のチェック
最後に、下のように、それぞれの残高が正しいかを確認しています。

このように、100トークンが送付されたことが確認できました。

4 2番目のテストについて
1 はじめに
では、2番目のテストについても見ていきましょう。
違いだけ見ていきます。
違いとしては、アダプタのパラメータを設定しています。
2 パケットタイプについて
まず、下の部分を見てみましょう。
まず、「PT_SEND」はパケットタイプです。

このようになっています。

3 最小ガスの設定
次に、「setMinDstGas」を確認しましょう。
下のように、Mappingを使用しています。
ここでは、目的先のチェーンIDとパケットタイプの組み合わせごとに最小となるガスの値を設定しています。

4 adapterParamの設定について
ここで、アダプタのパラメータを設定しています。
パラメータについては、「PingPong」コントラクトが参考になりました

下のように、バージョンとガス代を設定していることがわかりました。

その上で、送付時のパラメータとして設定していました。

5 3番目のテストについて
3番目のテストも見ていきましょう。
下のように、エラーが発生することを見込んでいます。

理由としては、下の「setMinDstGas」関数が抜けているためです。
このように、「adapterParams」を設定する場合には、「setMinDstGas」で最小のガスも設定しなければならないとわかります。

6 4番目のテストについて
最後のテストについてです。
ここでもエラーが出ることが想定されています。
こちらは、下のように、設定した最小ガス(250,000)を下回るガス量(225,000)を指定しているため、エラーが発生しています。

今回は以上です。
ぜひやってみてください。
いいなと思ったら応援しよう!
