Skip to main content
LaserStream 的 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 订阅某个代币铸币地址的每笔交易。