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 в основной сети:
- TypeScript
- Rust
- Go
Требуется
helius-laserstream версии 0.8.5 или новее. Поле также принимается под именем match_mints.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-laserstream0.8.5, Rusthelius-laserstream0.6.4, Gogo/v0.3.0.
Связанные материалы
Token Account (ATA) Filtering
Сопоставляйте транзакции, затрагивающие принадлежащие кошельку аккаунты токенов
Transaction Monitoring
Полные стратегии фильтрации и готовые к запуску примеры для gRPC
Subscribe Request Reference
Все поля фильтра транзакций, включая
matchMintsHistorical Replay
Восстанавливайте до 48 часов активности токенов с помощью того же фильтра