tokenAccounts 过滤器允许 gRPC 交易订阅匹配**钱包拥有的关联代币账户(ATAs)**的活动,而不仅仅是钱包公钥直接出现的交易。同样的过滤器也可通过 WebSocket 使用——请参见 WebSocket 上的代币账户(ATA)过滤。
问题:普通账户过滤器错过传入的代币转账
当你使用accountInclude: [wallet] 观察钱包时,你只匹配该钱包公钥出现在交易账户键中的交易。一个常见的情况被忽略:当有人发送 SPL 代币(例如 USDC)到钱包时,转账触及的是钱包的 关联代币账户 (ATA) — 一个单独的程序派生地址 — 而不是钱包公钥本身。
因此,普通的 accountInclude: [wallet] 订阅无法看到传入的代币转账。你需要预先枚举钱包拥有的每个 ATA 并将其添加到过滤器中 — 但 ATAs 是按需创建的(每个铸币一个),所以你无法提前知道完整的集合。
tokenAccounts 扩展的工作原理
在交易过滤器上设置 tokenAccounts 以扩展匹配,以便一个 accountInclude 钱包还匹配触及其拥有的代币账户的交易。匹配是基于所有者的:LaserStream 在匹配时解析你的 accountInclude 地址拥有的代币账户,因此可以抓住钱包拥有的任何代币账户 — 包括非规范的,而不仅仅是派生的 ATA 地址。你不需要自己列出 ATAs。
如省略 tokenAccounts 的订阅行为与之前完全相同,因此可以安全地添加到现有过滤器中。
如需按代币而非钱包进行匹配,请参阅代币铸币地址过滤。这两个标志可以组合使用,因此一个过滤器可以监控单个钱包中单种代币的活动。
扩展模式
tokenAccounts 接受以下三个字符串值之一:
建议先使用
"balanceChanged"。它可以捕获真实的资金变动,而数据量仅为 "all" 的一小部分。
在 LaserStream gRPC 中使用
在你的SubscribeRequest 中,将 tokenAccounts 添加到交易过滤器。Helius LaserStream SDK 会为你将该字符串转换为线路级 TokenAccountExpansionControlFlag 枚举(属于 yellowstone-grpc-proto 12.5.0+ 的一部分)。
读取匹配结果
交易通过 ATA 扩展匹配后,钱包的代币变动记录会出现在交易的meta.postTokenBalances 和 meta.preTokenBalances 中。按 owner 过滤这些条目,以找出钱包实际拥有的余额,然后比较同一 accountIndex 上的 preTokenBalances 与 postTokenBalances,即可查看每个铸币地址对应的代币变动量。上面的示例展示了过滤步骤;交易监控指南则展示了完整的差异比较过程。
相关内容
Transaction Monitoring
完整的过滤策略,以及一个可通过 gRPC 运行的钱包监控示例。
Token Account Filtering (WebSocket)
WebSocket
transactionSubscribe 方法上的同一 tokenAccounts 字段。Subscribe Request Reference
所有交易过滤器字段,包括
tokenAccounts。Compressed Filters
在一个流中跟踪数十万个账户。
Token Mint Filtering
使用
matchMints 订阅某个代币铸币地址的每笔交易。