tokenAccounts フィルターは、ウォレットが所有する関連トークンアカウント (ATA) の活動にマッチするトランザクションサブスクリプションを可能にし、ウォレットの公開鍵が直接表示されるトランザクションだけでなく、LaserStream gRPC と LaserStream WSS の両方で同様に機能します。
問題: 単純なアカウントフィルターは受信トークン転送を見逃す
accountInclude: [wallet] でウォレットを監視すると、そのウォレットの公開鍵がトランザクションのアカウントキーに表示されるトランザクションにしかマッチしません。よくあるケースでは、誰かがウォレットに SPL トークン(たとえば USDC)を送信したとき、その転送はウォレットの関連トークンアカウント (ATA) — 別のプログラムによって導出されたアドレス — に触れ、ウォレットの公開鍵自体には触れません。
したがって、単純な accountInclude: [wallet] サブスクリプションは受信トークン転送をキャッチしません。ウォレットが所有するすべての ATA を事前に列挙し、各アカウントをフィルターに追加しなければなりませんが、ATA は需要に応じて作成される(一つのミントごとに一つ)ため、事前に完全なセットを知ることはできません。
tokenAccounts 拡張の仕組み
トランザクションフィルターに tokenAccounts を設定することで、accountInclude ウォレットが所有するトークンアカウントに触れるトランザクションにもマッチするように拡張します。このマッチングは所有者ベースで行われます: LaserStream はマッチ時にあなたの accountInclude アドレスによって所有されるトークンアカウントを解決し、ウォレットが所有する任意のトークンアカウントをキャッチします — 通常のものだけでなく、導出された ATA アドレスも含みます。あなた自身で ATA をリストする必要はありません。
tokenAccounts を省略したサブスクリプションは以前と全く同じ動作をしますので、既存のフィルターに追加しても安全です。
拡張モード
tokenAccounts は三つの文字列値のいずれかを取ります:
まず
"balanceChanged" を使用します。これは "all" のボリュームのごく一部で資金の実際の移動をキャプチャします。
LaserStream gRPC で使用する
SubscribeRequest のトランザクションフィルターに tokenAccounts を追加します。Helius LaserStream SDK はこの文字列をワイヤーレベルの TokenAccountExpansionControlFlag enum に変換します(yellowstone-grpc-proto 12.5.0+ の一部)。
LaserStream WebSocket で使用する
同じフィールドはtransactionSubscribe WebSocket メソッドで利用可能です — 標準 Solana WebSocket API への Helius 拡張です。無効な値は JSON-RPC エラー -32602: Invalid tokenAccounts value '<x>', expected one of: none, balanceChanged, all を返します。
マッチした内容を読む
トランザクションが ATA 拡張によってマッチすると、そのウォレットのトークン動作はトランザクションのmeta.postTokenBalances と meta.preTokenBalances に記録されます。これらのエントリを owner でフィルタリングしてウォレットが実際に所有している残高を特定し、同じ accountIndex 上で preTokenBalances を postTokenBalances と比較し、各ミントがどれだけ動いたかを確認します。上記の例はフィルタリングステップを示し、トランザクション監視ガイド は全体の差分を示します。
関連
トランザクションモニタリング
完全なフィルタリング戦略と gRPC 経由の実行可能なウォレットウォッチの例。
transactionSubscribe (WebSocket)
WebSocket
transactionSubscribe メソッド上の同じフィールド。サブスクライブリクエストリファレンス
すべてのトランザクションフィルターフィールドを含む。
圧縮フィルター
一つのストリームで数十万のアカウントをトラッキング。