Skip to main content
Фильтр tokenAccounts метода WebSocket transactionSubscribe позволяет подписке сопоставлять активность в ассоциированных аккаунтах токенов (ATA), принадлежащих кошельку, а не только транзакции, в которых непосредственно присутствует публичный ключ кошелька. Этот же фильтр доступен через gRPC — версию для gRPC см. в разделе Фильтрация аккаунтов токенов (ATA).

Проблема: обычные фильтры аккаунтов пропускают входящие переводы токенов

При отслеживании кошелька с помощью accountInclude: [wallet] сопоставляются только транзакции, в ключах аккаунтов которых присутствует публичный ключ этого кошелька. При этом пропускается распространенный сценарий: когда кто-либо отправляет на кошелек SPL-токен (например, USDC), перевод затрагивает ассоциированный аккаунт токена (ATA) кошелька — отдельный адрес, производный от программы, — а не публичный ключ самого кошелька. Поэтому обычная подписка accountInclude: [wallet] не обнаруживает входящие переводы токенов. Вам пришлось бы заранее перечислить все принадлежащие кошельку ATA и добавить каждый из них в фильтр. Однако ATA создаются по мере необходимости (по одному для каждого минта), поэтому заранее узнать их полный набор невозможно.

Как работает расширение tokenAccounts

Укажите tokenAccounts в подписке, чтобы расширить сопоставление: тогда кошелек из accountInclude также будет соответствовать транзакциям, затрагивающим принадлежащий ему аккаунт токена. Сопоставление выполняется по владельцу: LaserStream во время сопоставления определяет аккаунты токенов, принадлежащие адресам из accountInclude. Поэтому фильтр обнаруживает любой принадлежащий кошельку аккаунт токена, включая неканонические, а не только производный адрес ATA. Вам не нужно самостоятельно перечислять ATA. Подписки без tokenAccounts работают точно так же, как раньше, поэтому этот параметр можно безопасно добавить в существующий фильтр.

Режимы расширения

tokenAccounts принимает одно из трех строковых значений: Начните с "balanceChanged". Этот режим обнаруживает реальное перемещение средств, создавая лишь малую долю объема "all".

Использование в transactionSubscribe

tokenAccounts — это расширение Helius для стандартного API Solana WebSocket. При недопустимом значении возвращается ошибка JSON-RPC -32602: Invalid tokenAccounts value '<x>', expected one of: none, balanceChanged, all.

Анализ результатов сопоставления

После сопоставления транзакции через расширение ATA перемещение токенов кошелька отображается в полях транзакции meta.postTokenBalances и meta.preTokenBalances. Отфильтруйте эти записи по owner, чтобы выделить балансы, которые действительно принадлежат вашему кошельку. Затем сравните preTokenBalances с postTokenBalances для одного и того же accountIndex, чтобы определить изменение количества каждого минтируемого токена. В примере выше показан этот этап фильтрации.

Связанные материалы

transactionSubscribe

Все фильтры и параметры transactionSubscribe, включая tokenAccounts.

Token Account Filtering (gRPC)

Такое же расширение tokenAccounts для фильтров транзакций LaserStream gRPC.

WebSocket Quickstart

Подключитесь к LaserStream WebSocket и запустите потоковую передачу первых событий.