transactionSubscribe WebSocketメソッドのtokenAccountsフィルタは、ウォレットが所有する**関連トークンアカウント(ATA)**でのアクティビティに対して購読がマッチすることを可能にします。これは、ウォレットのパブリックキーが直接現れるトランザクションだけではありません。同じフィルタはgRPC経由でも利用可能です — gRPCバージョンについてはToken Account (ATA) Filteringを参照してください。
課題:プレーンなアカウントフィルタではトークンの受信が見逃される
accountInclude: [wallet]でウォレットを監視する場合、そのウォレットのパブリックキーがトランザクションのアカウントキーに現れるトランザクションにだけマッチします。一般的なケースが見逃されます:誰かがウォレットにSPLトークン(例としてUSDC)を送信するとき、その転送はウォレットの関連トークンアカウント(ATA) —— 別のプログラムで派生されたアドレス —— に触れますが、ウォレットのパブリックキーそのものではありません。
したがって、プレーンなaccountInclude: [wallet]サブスクリプションはトークンの受信を決して見ることがありません。ウォレットが所有するすべてのATAを事前に列挙してフィルタに追加する必要がありますが、ATAは必要に応じて作成されるため(ミントごとに1つ)、事前に完全なセットを知ることはできません。
tokenAccountsの拡張がどのように機能するか
サブスクリプションでtokenAccountsを設定すると、accountIncludeウォレットが所有するトークンアカウントに触れるトランザクションにもマッチします。マッチングはオーナーベースで行われます:LaserStreamはマッチ時にあなたのaccountIncludeアドレスによって所有されるトークンアカウントを解決し、ウォレットが所有するトークンアカウントをすべてキャッチします — 非正規のものも含む — 単に作成されたATAアドレスだけではありません。自分でATAをリストする必要は一切ありません。
tokenAccountsを省略したサブスクリプションは以前と全く同じように動作するため、既存のフィルタに追加しても安全です。
拡張モード
tokenAccountsは3つの文字列値のいずれかを取ります:
まず
"balanceChanged"を試してください。これは"all"のボリュームの一部で実際の資金移動をキャッチします。
transactionSubscribeでの使用
tokenAccountsは標準の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と比較して各ミントがどれだけ移動したかを確認します。上記の例はフィルタリングステップを示しています。
関連情報
transactionSubscribe
各
transactionSubscribeフィルタとオプション、tokenAccountsを含む。Token Account Filtering (gRPC)
LaserStream gRPCトランザクションフィルタでの同じ
tokenAccounts拡張。notifyOn Filtering
accountSubscribeとprogramSubscribeのno-opアカウント更新をスキップ。WebSocket Quickstart
LaserStream WebSocketに接続し、最初のイベントをストリーム。