matchMints フラグを使用すると、gRPC トランザクションのサブスクリプションで、アカウントキーに加えて、トランザクションの処理前後のトークン残高に含まれるトークンミントも照合できます。
ミントを accountInclude に指定して matchMints: true を設定すると、そのトークンに関係するすべてのトランザクション(転送、スワップ、mint-to、バーン、アカウントのクローズ)を受信できます。
matchMints は LaserStream gRPC でのみ利用できます。LaserStream WebSocket ではまだ利用できません。問題:通常のアカウントフィルターでは大半のトークン転送を検出できません
accountInclude: [mint] でトークンを監視する場合、ミントの pubkey がトランザクションのアカウントキーに含まれるトランザクションだけが一致します。
一般的な SPL Transfer 命令はミントを参照しません。参照するのは送信元トークンアカウント、送信先トークンアカウント、所有者だけです。そのため、通常のアカウントフィルターでは、あらゆるトークンで最も一般的な操作を検出できません。
ミントを直接渡す命令だけが一致します。たとえば、MintTo、Burn、TransferChecked、およびプログラムアカウントにミントが含まれるスワップです。これまでは、すべてのトランザクションをストリーミングし、各トランザクションのトークン残高を自分で調べる以外に回避策はありませんでした。
matchMints の仕組み
トランザクションフィルターで matchMints: true を設定すると、LaserStream はトランザクションの preTokenBalances と postTokenBalances からミントの集合を構築します。
次に、accountInclude、accountExclude、accountRequired の各リストが、アカウントキーとそのミント集合の両方に対して照合されます。残高が変化したかどうかに関係なく、そのミントのトークンアカウントがいずれかの残高リストに含まれていれば、そのミントは条件を満たします。
このフラグはオプトインです。省略したフィルターは従来とまったく同じように動作するため、既存のサブスクリプションがすでに受信している内容を変えずに追加できます。SPL と Token-2022 の両方のプログラムが処理前後のトークン残高を設定するため、どちらのミントにも対応しています。
セマンティクス
その他のフィルターロジックは変更されません。
- 1 つの名前付きフィルター内の述語は、引き続き AND で結合されます(
vote、failed、signature、アカウントリスト)。 - 複数の名前付きフィルターは、引き続き OR で結合されます。
- リスト内の値は OR です(
accountRequiredのみ、すべてが一致する必要があります)。 - トークン残高がないトランザクションでは、アカウントキーだけの照合にフォールバックします。
matchMintsによって、トークンアクティビティのないトランザクションが追加されることはありません。 matchMintsだけではストリームを制限しません。フィルターが受理されるには、アカウントリストに少なくとも 1 つのキーまたはミントを指定するか、別の制限述語を指定する必要があります。
LaserStream は完全に一致する pubkey でミントを照合します。
tokenAccounts: "balanceChanged" とは異なり、ミントには「残高が変化した場合のみ」のモードはありません。LaserStream gRPC での使用方法
SubscribeRequest 内のトランザクションフィルターに matchMints: true を追加し、ミントを accountInclude に指定します。次の例では、メインネット上のすべての USDC トランザクションをストリーミングします。
- TypeScript
- Rust
- Go
helius-laserstream 0.8.5 以降が必要です。このフィールドは match_mints としても指定できます。laserstream-core-proto 11.3.0 以降、または SDK リポジトリに同梱されている .proto)から再生成してください。
match_mints は SubscribeRequestFilterTransactions のフィールド 32 です。アップストリームの Triton proto から生成されたクライアントは不明なフィールドを通知せずに破棄するため、再生成するまでこのフラグは機能しません。
トランザクションフィルターの全フィールドについては、Subscribe Request リファレンスを参照してください。
tokenAccounts と組み合わせて、1 つのウォレットの 1 つのトークンを監視する
matchMints は tokenAccounts の展開と組み合わせられるため、1 つのフィルターでウォレット所有者とミントを同時に照合できます。
次の例では、1 つのウォレットの USDC 残高に対するすべての変更をストリーミングします。
accountInclude と tokenAccounts を組み合わせると、ウォレットのトークン残高が変動したトランザクションを検出できます。accountRequired と matchMints を組み合わせると、さらに USDC に関係するものだけに絞り込めます。
一致した内容の確認
ミントによってトランザクションが一致したら、meta.preTokenBalances[].mint と meta.postTokenBalances[].mint でそのミントを探します。通常の転送では、ミントは一般にアカウントキーに含まれないため、そこで探さないでください。
同じ accountIndex に対して preTokenBalances と postTokenBalances の差分を取ると、どの所有者間でどれだけのトークンが移動したかを確認できます。
トランザクション構造の詳細については、トランザクション監視ガイドを参照してください。
制限事項と注意点
- ミントはアカウントキーと同じ
accountInclude、accountExclude、accountRequiredリストに指定するため、リストごとの同じプラン上限にカウントされます。ミント専用の上限はありません。 - 照合コストは、指定するミント数に応じて増加しません。100 個でも 100,000 個でもパフォーマンスは同じです。また、このフラグを設定しないサブスクライバーに追加コストは発生しません。
- 履歴リプレイは
matchMintsに対応しているため、リプレイのサブスクリプションはライブストリームと同じトランザクションを返します。 - トランザクションのサブスクリプションに圧縮(cuckoo)フィルターを追加すると、
matchMintsはアカウントキーだけでなく、ミント集合もそのフィルターに対して照合します。 matchMintsは、メインネットと devnet を含むすべての LaserStream gRPC リージョンで利用できます。現時点では LaserStream WebSocket では利用できません。- 最小 SDK バージョン:JavaScript/TypeScript は
helius-laserstream0.8.5、Rust はhelius-laserstream0.6.4、Go はgo/v0.3.0です。
関連項目
Token Account (ATA) Filtering
ウォレットが所有するトークンアカウントに関係するトランザクションを照合します
Transaction Monitoring
gRPC 向けの包括的なフィルタリング戦略と実行可能な例です
Subscribe Request Reference
matchMints を含む、すべてのトランザクションフィルターフィールドですHistorical Replay
同じフィルターを使用して、最大 24 時間分のトークンアクティビティをバックフィルします