tokenAccounts в LaserStream позволяет подписке на транзакции gRPC находить активность в ассоциированных токен-счетах (ATA), принадлежащих кошельку, а не только транзакции, в которых напрямую присутствует публичный ключ кошелька. Этот же фильтр доступен через WebSocket — см. раздел Фильтрация токен-счетов (ATA) через WebSocket.
Проблема: обычные фильтры счетов пропускают входящие переводы токенов
Когда вы отслеживаете кошелёк с помощьюaccountInclude: [wallet], фильтр находит только транзакции, в ключах счетов которых присутствует публичный ключ этого кошелька. Однако распространённый случай остаётся незамеченным: когда кто-либо отправляет на кошелёк SPL-токен (например, USDC), перевод затрагивает ассоциированный токен-счёт (ATA) кошелька — отдельный адрес, производный от программы, — а не публичный ключ самого кошелька.
Поэтому обычная подписка accountInclude: [wallet] не обнаруживает входящие переводы токенов. Вам пришлось бы заранее перечислить все принадлежащие кошельку ATA и добавить каждый из них в фильтр. Но ATA создаются по мере необходимости (по одному на каждый минт), поэтому заранее узнать их полный набор невозможно.
Как работает расширение tokenAccounts
Задайте tokenAccounts в фильтре транзакций, чтобы адрес кошелька accountInclude также находил транзакции, затрагивающие принадлежащий ему токен-счёт. Сопоставление выполняется по владельцу: во время сопоставления LaserStream определяет токен-счета, принадлежащие адресам accountInclude. Поэтому фильтр находит все принадлежащие кошельку токен-счета, включая неканонические, а не только производный адрес ATA. Вам не нужно самостоятельно перечислять ATA.
Подписки без tokenAccounts работают точно так же, как раньше, поэтому это поле можно безопасно добавить в существующий фильтр.
Чтобы выполнять сопоставление по токену, а не по кошельку, см. раздел Фильтрация по минту токена. Эти два флага можно сочетать, поэтому один фильтр может отслеживать активность одного кошелька для одного токена.
Режимы расширения
tokenAccounts принимает одно из трёх строковых значений:
Начните с
"balanceChanged". Этот режим отслеживает фактическое перемещение средств, создавая лишь малую часть объёма "all".
Использование в LaserStream gRPC
ДобавьтеtokenAccounts в фильтр транзакций в вашем SubscribeRequest. SDK Helius LaserStream преобразует строку в перечисление TokenAccountExpansionControlFlag протокольного уровня (доступно в yellowstone-grpc-proto версии 12.5.0 и новее).
Как определить, что совпало
Когда транзакция найдена с помощью расширения ATA, перемещение токенов кошелька отражается в поляхmeta.postTokenBalances и meta.preTokenBalances транзакции. Отфильтруйте эти записи по owner, чтобы выделить балансы, фактически принадлежащие вашему кошельку. Затем сравните preTokenBalances и postTokenBalances с одинаковым accountIndex, чтобы определить изменение суммы для каждого минта. В примере выше показан этап фильтрации, а в руководстве по мониторингу транзакций — полное сравнение.
Связанные материалы
Transaction Monitoring
Полные стратегии фильтрации и готовый к запуску пример отслеживания кошелька через gRPC.
Token Account Filtering (WebSocket)
То же поле
tokenAccounts в методе WebSocket transactionSubscribe.Subscribe Request Reference
Все поля фильтра транзакций, включая
tokenAccounts.Compressed Filters
Отслеживайте сотни тысяч счетов в одном потоке.
Token Mint Filtering
Подпишитесь на все транзакции для минта токена с помощью
matchMints.