Nuxt3とdev-kitでDApp開発を始めてみる その2 Arbitrum対応

## はじめに

https://qiita.com/hhatto/items/b551abdc3699571836ee

Nuxt3+dev-kitでDApp開発してみましたが、今日はLayer2であるところのArbitrum Oneに接続してみます。

## 前提

Layer2(L2)に接続するためにAlchemyの設定をArbitrum Mainnetを使うようにしておきます。

参考までにスクリーショットはっつけておきます。

![alchemy-settings-for-l2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1775/94991918-082c-2a74-40f4-ddb2af47f32b.png)

```diff
diff --git a/nuxt.config.ts b/nuxt.config.ts
index 9087ecd..19c76f8 100644
--- a/nuxt.config.ts
+++ b/nuxt.config.ts
@@ -11,6 +11,8 @@ export default defineNuxtConfig({
                },
        },
        publicRuntimeConfig: {
-               WEB3_PROVIDER_URL: "https://eth-mainnet.alchemyapi.io/v2/YOUR_KEY",
+               // WEB3_PROVIDER_URL: "https://eth-mainnet.alchemyapi.io/v2/YOUR_KEY",
+               WEB3_PROVIDER_URL:
+                       "https://arb-mainnet.g.alchemy.com/v2/XXX",
        },
 });
```

ドメイン名が `https://arb-mainnet.g.alchemy.com` とかになってればOKそうです。

## 差分をつらつらと書いていく

まず`import`まわりですが、dev-kitのL1とL2のインターフェースが若干異なるので、それようの記述が必要です。

```diff
diff --git a/app.vue b/app.vue
index 2d38c6c..f3a9b0f 100644
--- a/app.vue
+++ b/app.vue
@@ -8,7 +8,8 @@

 <script>
 import { ethers } from "ethers";
-import { contractFactory, addresses } from "@devprotocol/dev-kit";
+import { addresses } from "@devprotocol/dev-kit";
+import { contractFactory } from "@devprotocol/dev-kit/l2";

 export default {
   data() {
```

次ですが、L1とL2でネットワークが異なるので、存在するプロパティも異なります。
L2に存在するプロパティアドレスを指定します。

```diff
diff --git a/app.vue b/app.vue
index f3a9b0f..02ed02c 100644
--- a/app.vue
+++ b/app.vue
@@ -17,7 +17,7 @@ export default {
     console.log(config, config.WEB3_PROVIDER_URL);
     return {
       config,
-      propertyAddress: "0xac1AC9d00314aE7B4a7d6DbEE4860bECedF92309",
+      propertyAddress: "0xA3F2C13c7392924C334E72C0Bab69a5f0131A786", // for L2
       staking: undefined,
       reward: undefined,
     };
```

最後にステーキング数と報酬数を取得する処理をL2用に書き直します。

```diff
diff --git a/app.vue b/app.vue
index 02ed02c..2c37084 100644
--- a/app.vue
+++ b/app.vue
@@ -23,21 +23,19 @@ export default {
     };
   },
   async mounted() {
-    // use main net
-    const registryContractAddress = addresses.eth.main.registry;
+    // use arbitrum one
+    const registry = addresses.arbitrum.one;
     const provider = new ethers.providers.JsonRpcProvider(
       this.config.WEB3_PROVIDER_URL
     );
     const network = await provider.ready;
-    console.log(network);
     const contract = contractFactory(provider);
-    const lockupContractAddress = await contract
-      .registry(registryContractAddress)
-      .lockup();
+    const lockupContract = contract.lockup(registry.lockup);
+    console.log(network, registry, lockupContract);

-    const propertyStakingAmount = await contract
-      .lockup(lockupContractAddress)
-      .getPropertyValue(this.propertyAddress);
+    const propertyStakingAmount = await lockupContract.totalLockedForProperty(
+      this.propertyAddress
+    );
     const stakingAmount = ethers.BigNumber.from(propertyStakingAmount).div(
       ethers.BigNumber.from(10).pow(18)
     );
@@ -47,9 +45,9 @@ export default {
       }'s staking amount is ${stakingAmount.toBigInt()} DEV`
     );

-    const propertyRewards = await contract
-      .lockup(lockupContractAddress)
-      .calculateRewardAmount(this.propertyAddress);
+    const propertyRewards = await lockupContract.calculateRewardAmount(
+      this.propertyAddress
+    );
     const reward = ethers.BigNumber.from(propertyRewards[0]).div(
       ethers.BigNumber.from(10).pow(36)
     );
```

これでうまく表示することができました。

![L2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1775/ac83c90d-1f89-f840-a7d1-e629db535538.png)

## おわりに

L2なDAppもNuxt3で開発できますね。

以下のブランチにソースコードを置いていますので、参考まで。

https://github.com/hhatto/nuxt3-devkit-example/tree/use-l2