Skip to main content
Флаг matchMints в LaserStream позволяет подписке на транзакции gRPC выполнять сопоставление по минтам токенов в балансах токенов до и после транзакции в дополнение к ключам аккаунтов. Добавьте минт в accountInclude, задайте matchMints: true, и вы будете получать каждую транзакцию, затрагивающую этот токен: переводы, свопы, выпуск токенов, сжигания и закрытия аккаунтов.
matchMints доступен только в LaserStream gRPC. В LaserStream WebSocket он пока недоступен.

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

При отслеживании токена с помощью accountInclude: [mint] сопоставляются только транзакции, в которых публичный ключ минта присутствует среди ключей аккаунтов транзакции. Классическая инструкция SPL Transfer никогда не ссылается на минт. В ней указываются только исходный аккаунт токена, целевой аккаунт токена и владелец, поэтому обычный фильтр аккаунтов пропускает самую распространённую операцию с любым токеном. Сопоставляются только инструкции, которые передают минт напрямую, например MintTo, Burn, TransferChecked, а также свопы, у которых минт входит в число аккаунтов программы. Единственным обходным решением было получать поток всех транзакций и самостоятельно проверять балансы токенов каждой из них.

Как работает matchMints

Задайте matchMints: true в фильтре транзакций, и LaserStream сформирует набор минтов из preTokenBalances и postTokenBalances транзакции. Затем списки accountInclude, accountExclude и accountRequired сопоставляются как с ключами аккаунтов, так и с этим набором минтов. Минт соответствует условию, если любой связанный с ним аккаунт токена присутствует хотя бы в одном из списков балансов, независимо от того, изменился ли баланс. Этот флаг включается явно. Фильтры, в которых он не указан, работают точно так же, как и раньше, поэтому его можно добавить в существующую подписку, не меняя уже получаемые ею данные. Поддерживаются минты SPL и Token-2022, поскольку обе программы заполняют балансы токенов до и после транзакции.

Семантика

Остальная логика фильтра не меняется:
  • Предикаты внутри одного именованного фильтра по-прежнему объединяются оператором AND (vote, failed, signature и списки аккаунтов).
  • Несколько именованных фильтров по-прежнему объединяются оператором OR.
  • Значения внутри списка объединяются оператором OR (кроме accountRequired, где должны совпасть все значения).
  • Для транзакции без балансов токенов используется сопоставление только по ключам. matchMints никогда не добавляет транзакции без активности токенов.
  • Сам по себе matchMints не ограничивает поток. Чтобы фильтр был принят, необходимо указать хотя бы один ключ или минт в списке аккаунтов либо другой ограничивающий предикат.
LaserStream сопоставляет минты по точному публичному ключу. В отличие от tokenAccounts: "balanceChanged", для минтов нет режима «только при изменении баланса».

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

Добавьте matchMints: true в фильтр транзакций в SubscribeRequest и укажите минт в accountInclude. В этом примере передаются все транзакции USDC в основной сети:
Требуется helius-laserstream версии 0.8.5 или новее. Поле также принимается под именем match_mints.
Если вместо SDK вы используете необработанный клиент gRPC или Yellowstone, повторно сгенерируйте код из proto Helius (laserstream-core-proto версии 11.3.0 или новее либо .proto, включённого в репозиторий SDK). match_mints — это поле 32 в SubscribeRequestFilterTransactions. Клиенты, сгенерированные из исходного proto Triton, без уведомления отбрасывают неизвестное поле, поэтому флаг не действует, пока вы не выполните повторную генерацию. Все поля фильтра транзакций описаны в справочнике по запросу подписки.

Сочетание с tokenAccounts для отслеживания одного токена одного кошелька

matchMints совместим с расширением tokenAccounts, поэтому один фильтр может одновременно выполнять сопоставление по владельцам кошельков и минтам. В этом примере передаётся каждое изменение баланса USDC одного кошелька:
Сочетание accountInclude и tokenAccounts находит транзакции, в которых изменились балансы токенов кошелька. Сочетание accountRequired и matchMints сужает их список до транзакций с USDC.

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

Если транзакция соответствует фильтру по минту, найдите этот минт в meta.preTokenBalances[].mint и meta.postTokenBalances[].mint. При обычных переводах минт, как правило, отсутствует среди ключей аккаунтов, поэтому не ищите его там. Сравните preTokenBalances и postTokenBalances для одного accountIndex, чтобы определить, сколько токенов было перемещено и между какими владельцами. Структура транзакции подробно описана в руководстве по мониторингу транзакций.

Ограничения и примечания

  • Минты указываются в тех же списках accountInclude, accountExclude и accountRequired, что и ключи аккаунтов, поэтому на них распространяются те же ограничения тарифного плана для каждого списка. Отдельного ограничения для минтов нет.
  • Затраты на сопоставление не зависят от количества указанных минтов. Производительность одинакова для 100 и 100 000 минтов, а подписчики, которые не устанавливают этот флаг, не несут дополнительных затрат.
  • Воспроизведение истории учитывает matchMints, поэтому подписка на воспроизведение возвращает те же транзакции, которые вернул бы поток в реальном времени.
  • Если вы прикрепите сжатый фильтр (кукушкин фильтр) к подписке на транзакции, matchMints будет проверять по нему набор минтов наряду с ключами аккаунтов.
  • matchMints работает во всех регионах LaserStream gRPC, в основной и тестовой сетях. В настоящее время он недоступен в LaserStream WebSocket.
  • Минимальные версии SDK: JavaScript/TypeScript helius-laserstream 0.8.5, Rust helius-laserstream 0.6.4, Go go/v0.3.0.

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

Token Account (ATA) Filtering

Сопоставляйте транзакции, затрагивающие принадлежащие кошельку аккаунты токенов

Transaction Monitoring

Полные стратегии фильтрации и готовые к запуску примеры для gRPC

Subscribe Request Reference

Все поля фильтра транзакций, включая matchMints

Historical Replay

Восстанавливайте до 48 часов активности токенов с помощью того же фильтра