[ERC7682] ウォレット外の追加資金をアプリケーションに教える仕組みを理解しよう！

# はじめに

初めまして。
**CryptoGames**というブロックチェーンゲーム企業でエンジニアをしている **cardene（かるでね）** です！
スマートコントラクトを書いたり、フロントエンド・バックエンド・インフラと幅広く触れています。

https://cryptogames.co.jp/

代表的なゲームは**クリプトスペルズ**というブロックチェーンゲームです。

https://cryptospells.jp/

今回は、ウォレットがウォレット外に存在する資金にアクセスして、アプリケーションにそのことを知らせる仕組みを提案している**ERC7682**についてまとめていきます！

:::note info
以下にまとめられているものを翻訳・要約・補足しながらまとめていきます。
:::

https://eips.ethereum.org/EIPS/eip-7682

他にも様々なEIPについてまとめています。

https://cardene.notion.site/ERC-EIP-2a03fa3ea33d43baa9ed82288f98d4a9?pvs=4

# 概要

**EIP5792**に準拠した機能により、ウォレットアドレスの残高を参照できます。
この時、ウォレット内にある資金しか使用できません。
この規格では、追加資金にアクセスできることをアプリケーションに知らせる機能を提案し、クレジット機能や担保を用いた融資機能などが実現できるようになります。
これにより、オンチェーンで確認できる資金以外をアプリケーションに教えることができます。

:::note info
**EIP5792**については以下の記事を参考にしてください。
:::

https://qiita.com/cardene/items/45da7ebe31ff0ee860a2

# 動機

多くのアプリケーションは、ユーザーが何らかのアクションを完了する前に、ユーザーの残高をチェックします。たとえば、ユーザーが dex で一定量のトークンを交換したい場合、ユーザーのアドレスにその量のトークンがないことが dex によって確認されると、通常、そのユーザーの操作がブロックされます。ただし、より高度なウォレットには、ユーザーが他のソースから資金にアクセスできる機能があります。ウォレットには、これらのより高度なウォレットを使用するユーザーが残高チェックによってブロックされないように、追加の資金にアクセスできることをアプリに伝える方法が必要です。




多くのアプリケーションでは、ユーザーが特定のアクションを完了する前にユーザーの残高をチェックします。
例えば、ユーザーがDEX（分散型取引所）でトークンを交換したい場合、ユーザーのアドレスの残高を確認し、もしトークンがない場合処理が失敗します。

しかし、ウォレットによっては他のソースから資金にアクセスする機能を持っています。
これらのウォレットは、ユーザーが他の資金源から追加の資金にアクセスできることをアプリケーションに伝える方法が必要です。
そうしないと、他の資金源にアクセスできるウォレットが現在のウォレット残高チェックにより処理ブロックされてしまいます。

# 仕様

この規格では、**EIP5792**に新しい機能の追加を提案しています。

## wallet_getCapabilitiesレスポンスの仕様

**EIP5792**に準拠するために、ウォレットは補助資金にアクセスできることを示す必要があります。
そのためには、ウォレットが`wallet_getCapabilities`呼び出しに対して、補助資金に関する情報を含むレスポンスを返す必要があります。
このレスポンスには、各チェーンで補助資金にアクセスできるかどうかを示す`supported`フィールドが含まれます。

```js
type AuxiliaryFundsCapability = {
  supported: boolean;
}
```

`true`または`false`の`bool`値で、ウォレットがそのチェーン上で追加資金にアクセスできるかどうかを示します。


### wallet_getCapabilitiesの応答例

```json
{
  "0x2105": {
    "auxiliaryFunds": {
      "supported": true
    },
  },
  "0x14A34": {
    "auxiliaryFunds": {
      "supported": true
    }
  }
}
```

この例では、ウォレットが2つのチェーン (`0x2105`と`0x14A34`) 上で補助資金にアクセスできることを示しています。
両方のチェーンに対して`supported`フィールドが`true`と設定されています。

## アプリの実装

**EIP5792**に準拠するために、アプリケーションは接続されたウォレットが`wallet_getCapabilities`レスポンスで補助資金にアクセスできることを確認した場合、現在保有している残高のみのチェックで処理をブロックしないようにする必要があります。

# セキュリティ

## 高度な残高取得

アプリが補助残高を取得する方法を定義しています。
`bool`値でアプリが単純な残高チェックに基づいてユーザーのアクションをブロックしないようにすることが十分と判断しました。
この方法によりアプリの実装にかかる負担が最小限で済み、将来的に機能拡張が可能です。

## 補助資金の資産ごとの管理

ウォレットが様々な補助資金をサポートしている場合、資産ごとに補助資金をサポートする方法の検討が必要になります。
ウォレットが多くの資産をサポートする場合、管理するデータが多くなり管理が大変になります。
そのため、単一の`bool`値で管理するようにしてデータ量を削減しています。

# 互換性

これまでと変わらない方法でウォレットの資金を確認できます。

# 引用

Lukas Rosario (@lukasrosario), Wilson Cusack (@wilsoncusack), "ERC-7682: Auxiliary Funds Capability [DRAFT]," Ethereum Improvement Proposals, no. 7682, April 2024. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-7682.

# 最後に

今回は「ウォレットがウォレット外に存在する資金にアクセスして、アプリケーションにそのことを知らせる仕組みを提案している**ERC7682**」についてまとめてきました！
いかがだったでしょうか？

質問などがある方は以下のTwitterのDMなどからお気軽に質問してください！

[Twitter @cardene777](https://twitter.com/cardene777)

他の媒体でも情報発信しているのでぜひ他も見ていってください！

https://chaldene.net/

https://zenn.dev/heku

https://cardene.substack.com/

https://mirror.xyz/0xcE77b9fCd390847627c84359fC1Bc02fC78f0e58

https://cardene.notion.site/ERC-EIP-2a03fa3ea33d43baa9ed82288f98d4a9?pvs=4