Genel Bakış
İşlem abonelikleri, ağ tarafından onaylandıklarında yürütme sonuçlarını sunar. Hangi hesapların dahil olduğuna göre filtreleyebilir, oy işlemlerini hariç tutabilir ve başarısız işlemleri dahil edip etmeyeceğinizi seçebilirsiniz.
Filtre Parametreleri
| Parametre | Tür | Açıklama |
|---|
vote | boolean | Oy işlemlerini dahil et (true) veya hariç tut (false). Varsayılan: tümünü dahil et. |
failed | boolean | Başarısız işlemleri dahil et (true) veya hariç tut (false). Varsayılan: tümünü dahil et. |
signature | string | Tek bir belirli işlem imzasını izle. |
accountInclude | string[] | Yalnızca bu hesaplardan herhangi birini içeren işlemleri dahil et (mantıksal VEYA). |
accountExclude | string[] | Bu hesaplardan herhangi birini içeren işlemleri hariç tut. |
accountRequired | string[] | Yalnızca bu hesapların tamamını içeren işlemleri dahil et (mantıksal VE). |
accountInclude ve accountRequired birlikte çalışır: accountInclude herhangi bir eşleşmeye izin verirken, accountRequired listelenen her hesabın mevcut olmasını zorunlu kılar. Hassas filtreler oluşturmak için bunları birleştirin.
Örnek: Belirli Bir Programı İzleme
import Client, { CommitmentLevel, SubscribeRequest } from "@triton-one/yellowstone-grpc";
const GRPC_URL = "https://your-endpoint.grpc.orbitflare.com";
const X_TOKEN = "YOUR_GRPC_TOKEN";
const PING_INTERVAL_MS = 30_000;
const client = new Client(GRPC_URL, X_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 ${slot}] ${failed ? "FAILED" : "OK"} tx: ${sig}`);
} else if (data.pong) {
console.log("Pong received");
}
});
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);
});
});
setInterval(() => {
stream.write({ ping: { id: 1 }, accounts: {}, accountsDataSlice: [], transactions: {}, transactionsStatus: {}, slots: {}, blocks: {}, blocksMeta: {}, entry: {} }, () => {});
}, PING_INTERVAL_MS);
await streamClosed;
}
main();
Örnek: Ayrıştırılmış Çıktıyla Token Program Transferlerini İzleme
Bu örnek, bs58 kullanarak ham tampon alanlarını okunabilir dizelere dönüştürür:
import Client, { CommitmentLevel, SubscribeRequest } from "@triton-one/yellowstone-grpc";
import bs58 from "bs58";
const GRPC_URL = "https://your-endpoint.grpc.orbitflare.com";
const X_TOKEN = "YOUR_GRPC_TOKEN";
function toBase58(buf: Buffer | Uint8Array | null | undefined): string {
if (!buf || buf.length === 0) return "";
return bs58.encode(buf instanceof Buffer ? buf : Buffer.from(buf));
}
const client = new Client(GRPC_URL, X_TOKEN, {
"grpc.max_receive_message_length": 1024 * 1024 * 1024, // 1 GiB
});
async function main() {
const stream = await client.subscribe();
stream.on("data", (data) => {
if (!data.transaction) return;
const tx = data.transaction.transaction;
const sig = toBase58(tx.signature);
const accounts = tx.transaction?.message?.accountKeys?.map(toBase58) ?? [];
console.log(`Tx: ${sig}`);
console.log(`Accounts: ${accounts.join(", ")}`);
});
const request: SubscribeRequest = {
transactions: {
tokenTransfers: {
vote: false,
failed: false,
accountInclude: [
"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", // SPL Token
],
accountExclude: [],
accountRequired: [],
},
},
commitment: CommitmentLevel.PROCESSED,
accounts: {},
accountsDataSlice: [],
slots: {},
transactionsStatus: {},
blocks: {},
blocksMeta: {},
entry: {},
};
await new Promise<void>((resolve, reject) => {
stream.write(request, (err) => {
if (err == null) resolve(); else reject(err);
});
});
const streamClosed = new Promise<void>((resolve, reject) => {
stream.on("error", (e) => { reject(e); stream.end(); });
stream.on("end", () => resolve());
stream.on("close", () => resolve());
});
await streamClosed;
}
main();
Yaygın Kullanım Senaryoları
| Kullanım Senaryosu | Filtre Stratejisi |
|---|
| Swap’lar için bir DEX izleme | accountInclude: [dexProgramId], vote: false |
| Cüzdan aktivitesini tespit etme | accountInclude: [walletPubkey], vote: false, failed: false |
| Belirli bir token mint’ini izleme | accountInclude: [mintAddress] |
| Tüm oy dışı, başarılı işlemleri takip etme | vote: false, failed: false, hesap filtresi yok |
| Tek bir işlemi izleme | signature: "txSignatureHere" |