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 и запустите потоковую передачу первых событий.