transactionSubscribe WebSocket方法上的tokenAccounts筛选器允许订阅匹配**钱包拥有的关联代币账户(ATA)**的活动,而不仅仅是钱包的公钥直接出现的交易。gRPC上也提供相同的筛选器 —— 参见代币账户(ATA)筛选的gRPC版本。
问题:普通账户筛选器错过了传入的代币转账
当你使用accountInclude: [wallet]监视一个钱包时,你只能匹配到该钱包公钥出现在交易账号密钥中的交易。一种常见情况被忽略:当有人向钱包发送SPL代币(例如USDC)时,转账接触到的是钱包的关联代币账户(ATA) —— 一个单独的程序派生地址 —— 而不是钱包的公钥本身。
因此,普通的accountInclude: [wallet]订阅从未看到传入的代币转账。你必须预先列举出钱包拥有的每个ATA并将其添加到筛选器中 —— 但ATA是在需求时创建的(每个铸币一个),所以你无法提前知道完整的集合。
tokenAccounts扩展如何工作
在订阅上设置tokenAccounts以扩展匹配,使得accountInclude钱包也匹配到涉及其拥有的代币账户的交易。匹配是基于所有者的:LaserStream在匹配时解析由你accountInclude地址拥有的代币账户,因此可以捕捉到钱包拥有的任何代币账户 —— 包括非规范的 —— 不仅仅是派生的ATA地址。你永远不必自己列举ATAs。
省略tokenAccounts的订阅行为完全如前,因此可以安全地添加到现有筛选器中。
扩展模式
tokenAccounts接受三个字符串值之一:
从
"balanceChanged"开始。它在捕获实际资金移动时的体积仅为"all"的一小部分。
在transactionSubscribe中使用它
tokenAccounts是Helius对标准Solana WebSocket API的扩展。无效的值会返回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。代币账户筛选(gRPC)
LaserStream gRPC交易筛选中的相同
tokenAccounts扩展。notifyOn筛选
跳过
accountSubscribe和programSubscribe上的无操作账户更新。WebSocket快速入门
连接到LaserStream WebSocket并流式传输你的第一个事件。