tokenAccounts 过滤器让交易订阅匹配钱包拥有的 关联代币账户 (ATA) 上的活动,而不仅仅是直接出现钱包公钥的交易。在 LaserStream gRPC 和 LaserStream WSS 中,它的工作方式相同。
问题:普通账户过滤器错过传入的代币转账
当你使用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+ 的一部分)。
在 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)
相同的
tokenAccounts字段在WebSocket transactionSubscribe方法中。订阅请求参考
每个交易过滤器字段,包括
tokenAccounts。压缩过滤器
在一个流中跟踪数十万个账户。