Skip to main content
Фильтр 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 и новее).
Более полный пример со сравнением балансов до и после транзакции см. в руководстве по мониторингу транзакций, а описание всех полей фильтра транзакций — в справочнике по запросу Subscribe.

Как определить, что совпало

Когда транзакция найдена с помощью расширения 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.