跳转到主要内容
LaserStream 的 tokenAccounts 过滤器让交易订阅匹配钱包拥有的 关联代币账户 (ATA) 上的活动,而不仅仅是直接出现钱包公钥的交易。在 LaserStream gRPCLaserStream 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+ 的一部分)。
有关 pre- 和 post- 平衡的完整示例,请参阅 事务监控指南,以及每个交易过滤字段的 订阅请求参考

在 LaserStream WebSocket 中使用

同一字段可用于 transactionSubscribe WebSocket 方法 — 这是标准 Solana WebSocket API 的 Helius 扩展。无效值会返回 JSON-RPC 错误 -32602: Invalid tokenAccounts value '<x>', expected one of: none, balanceChanged, all

读取匹配结果

一旦通过 ATA 扩展匹配交易,钱包的代币移动会体现在交易的 meta.postTokenBalancesmeta.preTokenBalances 中。通过 owner 过滤这些条目,以隔离钱包实际拥有的余额,然后在相同的 accountIndex 上将 preTokenBalancespostTokenBalances 进行比较,以查看每个铸造的移动量。上述示例展示了过滤步骤;事务监控指南 展示了完整差异。

相关内容

交易监控

全面的过滤策略以及一个可运行的基于gRPC的钱包观察示例。

transactionSubscribe (WebSocket)

相同的tokenAccounts字段在WebSocket transactionSubscribe方法中。

订阅请求参考

每个交易过滤器字段,包括tokenAccounts

压缩过滤器

在一个流中跟踪数十万个账户。