Обзор
Подписки на транзакции доставляют результаты выполнения по мере их подтверждения сетью. Вы можете фильтровать по задействованным аккаунтам, исключать транзакции голосования и выбирать, включать ли неудачные транзакции.
Параметры фильтрации
| Параметр | Тип | Описание |
|---|
vote | boolean | Включать (true) или исключать (false) транзакции голосования. По умолчанию: включать все. |
failed | boolean | Включать (true) или исключать (false) неудачные транзакции. По умолчанию: включать все. |
signature | string | Мониторинг одной конкретной подписи транзакции. |
accountInclude | string[] | Включать только транзакции, затрагивающие любой из этих аккаунтов (логическое ИЛИ). |
accountExclude | string[] | Исключать транзакции, затрагивающие любой из этих аккаунтов. |
accountRequired | string[] | Включать только транзакции, затрагивающие все эти аккаунты (логическое И). |
accountInclude и accountRequired работают совместно: accountInclude допускает любое совпадение, а accountRequired требует присутствия каждого перечисленного аккаунта. Комбинируйте их для создания точных фильтров.
Пример: Мониторинг конкретной программы
import Client, { CommitmentLevel, SubscribeRequest } from "@triton-one/yellowstone-grpc";
const client = new Client(
"https://your-endpoint.grpc.orbitflare.com",
"YOUR_GRPC_TOKEN",
{ "grpc.max_receive_message_length": 64 * 1024 * 1024 }
);
async function main() {
const stream = await client.subscribe();
const streamClosed = new Promise<void>((resolve, reject) => {
stream.on("error", (error) => { reject(error); stream.end(); });
stream.on("end", () => resolve());
stream.on("close", () => resolve());
});
stream.on("data", (data) => {
if (data.transaction) {
const { transaction, slot } = data.transaction;
const sig = Buffer.from(transaction.signature).toString("base64");
const failed = transaction.meta?.err != null;
console.log(`[слот ${slot}] ${failed ? "ОШИБКА" : "OK"} тр.: ${sig}`);
}
});
const request: SubscribeRequest = {
transactions: {
raydiumSwaps: {
vote: false,
failed: false,
accountInclude: [
"675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8", // Raydium AMM v4
],
accountExclude: [],
accountRequired: [],
},
},
commitment: CommitmentLevel.CONFIRMED,
accounts: {},
accountsDataSlice: [],
slots: {},
transactionsStatus: {},
blocks: {},
blocksMeta: {},
entry: {},
ping: { id: 1 },
};
await new Promise<void>((resolve, reject) => {
stream.write(request, (err) => {
if (err == null) resolve(); else reject(err);
});
});
await streamClosed;
}
main();
Распространённые сценарии использования
| Сценарий | Стратегия фильтрации |
|---|
| Мониторинг DEX для обменов | accountInclude: [dexProgramId], vote: false |
| Обнаружение активности кошелька | accountInclude: [walletPubkey], vote: false, failed: false |
| Отслеживание конкретного токен-минта | accountInclude: [mintAddress] |
| Все успешные не-голосовые транзакции | vote: false, failed: false, без фильтра аккаунтов |
| Мониторинг одной транзакции | signature: "txSignatureHere" |