> ## Documentation Index
> Fetch the complete documentation index at: https://www.helius.dev/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# WebSocketでのトークンアカウント（ATA）フィルタリング

> transactionSubscribeのtokenAccountsフィルタを使用して、LaserStream WebSocketストリーム内のウォレットのSPLトークン受信をキャッチします。これは、通常のaccountIncludeフィルタでは見逃されるオーナーベースのマッチングです。

[`transactionSubscribe`](/docs/ja/rpc/websocket/transaction-subscribe) WebSocketメソッドの`tokenAccounts`フィルタは、ウォレットが所有する\*\*関連トークンアカウント（ATA）\*\*でのアクティビティに対して購読がマッチすることを可能にします。これは、ウォレットのパブリックキーが直接現れるトランザクションだけではありません。同じフィルタはgRPC経由でも利用可能です — gRPCバージョンについては[Token Account (ATA) Filtering](/docs/ja/laserstream/token-account-filtering)を参照してください。

## 課題：プレーンなアカウントフィルタではトークンの受信が見逃される

`accountInclude: [wallet]`でウォレットを監視する場合、そのウォレットのパブリックキーがトランザクションのアカウントキーに現れるトランザクションにだけマッチします。一般的なケースが見逃されます：誰かがウォレットにSPLトークン（例としてUSDC）を送信するとき、その転送はウォレットの**関連トークンアカウント（ATA）** —— 別のプログラムで派生されたアドレス —— に触れますが、ウォレットのパブリックキーそのものではありません。

したがって、プレーンな`accountInclude: [wallet]`サブスクリプションはトークンの受信を決して見ることがありません。ウォレットが所有するすべてのATAを事前に列挙してフィルタに追加する必要がありますが、ATAは必要に応じて作成されるため（ミントごとに1つ）、事前に完全なセットを知ることはできません。

## `tokenAccounts`の拡張がどのように機能するか

サブスクリプションで`tokenAccounts`を設定すると、`accountInclude`ウォレットが所有するトークンアカウントに触れるトランザクションにもマッチします。マッチングは**オーナーベース**で行われます：LaserStreamはマッチ時にあなたの`accountInclude`アドレスによって所有されるトークンアカウントを解決し、ウォレットが所有するトークンアカウントをすべてキャッチします — 非正規のものも含む — 単に作成されたATAアドレスだけではありません。自分でATAをリストする必要は一切ありません。

`tokenAccounts`を省略したサブスクリプションは以前と全く同じように動作するため、既存のフィルタに追加しても安全です。

## 拡張モード

`tokenAccounts`は3つの文字列値のいずれかを取ります：

| 値                  | マッチ内容                                            | ボリューム          | 使用用途                                        |
| ------------------ | ------------------------------------------------ | -------------- | ------------------------------------------- |
| `"balanceChanged"` | 所有するトークン残高が実際に変わった（またはそのトークンアカウントが閉鎖された）トランザクション | 低 — 推奨されるデフォルト | "実際に資金移動があったときを教えて" — ウォレットに決済される入金、出金、スワップ |
| `"all"`            | ウォレットが所有するトークンアカウントを参照する、たとえ残高が変わらなくても           | 高              | ウォレットのトークンアカウントに触れるすべてのものを完全に可視化            |
| `"none"`           | 拡張なし — フィールドを省略した場合と同じ                           | —              | デフォルト                                       |

まず`"balanceChanged"`を試してください。これは`"all"`のボリュームの一部で実際の資金移動をキャッチします。

## `transactionSubscribe`での使用

`tokenAccounts`は標準のSolana WebSocket APIへのHelius拡張です。無効な値を返すと、JSON-RPCエラー `-32602`: `Invalid tokenAccounts value '<x>', expected one of: none, balanceChanged, all` が発生します。

```javascript theme={"system"}
const ws = new WebSocket('wss://mainnet.helius-rpc.com/?api-key=<API_KEY>');

ws.on('open', () => {
  ws.send(JSON.stringify({
    jsonrpc: '2.0',
    id: 1,
    method: 'transactionSubscribe',
    params: [
      {
        accountInclude: ['<WALLET_PUBKEY>'],
        tokenAccounts: 'balanceChanged' // also match the wallet's ATAs
      },
      { commitment: 'confirmed', encoding: 'jsonParsed', maxSupportedTransactionVersion: 0 }
    ]
  }));
  setInterval(() => ws.ping(), 30_000);
});

ws.on('message', (data) => {
  const msg = JSON.parse(data.toString());
  const result = msg.params?.result;
  if (!result) return;
  // Token balances this wallet owns that changed in the tx
  const owned = (result.transaction.meta.postTokenBalances || [])
    .filter((b) => b.owner === '<WALLET_PUBKEY>');
  console.log(result.signature, owned);
});
```

## マッチした内容の読み取り

ATA拡張によってトランザクションがマッチすると、ウォレットのトークン移動はそのトランザクションの`meta.postTokenBalances`と`meta.preTokenBalances`に存在します。これらのエントリを`owner`でフィルタリングして、ウォレットが実際に所有する残高を特定し、同じ`accountIndex`で`preTokenBalances`を`postTokenBalances`と比較して各ミントがどれだけ移動したかを確認します。上記の例はフィルタリングステップを示しています。

## 関連情報

<CardGroup cols={2}>
  <Card title="transactionSubscribe" icon="bolt" href="/docs/ja/rpc/websocket/transaction-subscribe">
    各`transactionSubscribe`フィルタとオプション、`tokenAccounts`を含む。
  </Card>

  <Card title="Token Account Filtering (gRPC)" icon="coins" href="/docs/ja/laserstream/token-account-filtering">
    LaserStream gRPCトランザクションフィルタでの同じ`tokenAccounts`拡張。
  </Card>

  <Card title="notifyOn Filtering" icon="filter" href="/docs/ja/rpc/websocket/notify-on-filtering">
    `accountSubscribe`と`programSubscribe`のno-opアカウント更新をスキップ。
  </Card>

  <Card title="WebSocket Quickstart" icon="rocket" href="/docs/ja/rpc/websocket/quickstart">
    LaserStream WebSocketに接続し、最初のイベントをストリーム。
  </Card>
</CardGroup>
