tokenAccounts フィルターにより、ウォレットの pubkey が直接現れるトランザクションだけでなく、ウォレットが所有する関連トークンアカウント(ATAs) の活動に gRPC トランザクションサブスクリプションを一致させることができます。同じフィルターが WebSocket でも利用可能です — Token Account (ATA) Filtering over WebSocket を参照してください。
問題: 単純なアカウントフィルターは受信トークン転送を見逃す
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+ の一部)。
一致した内容を読む
ATA 拡張によりトランザクションが一致すると、ウォレットのトークン移動はトランザクションのmeta.postTokenBalances と meta.preTokenBalances に存在します。それらのエントリを owner でフィルターして、実際にウォレットが所有している残高を分離し、同じ accountIndex で preTokenBalances を postTokenBalances と比較して、各ミントがどれだけ動いたかを確認します。上記の例はフィルタリングのステップを示しています。Transaction Monitoring guide では、完全な差分を示しています。
関連
トランザクション監視
完全なフィルタリング戦略と gRPC での実行可能なウォレットウォッチの例。
トークンアカウントフィルタリング (WebSocket)
WebSocket
transactionSubscribe メソッドの同じ tokenAccounts フィールド。サブスクリプションリクエストリファレンス
tokenAccounts を含むすべてのトランザクションフィルターフィールド。圧縮フィルター
1つのストリームで数十万のアカウントを追跡。