Ana içeriğe atla

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

ParametreTürAçıklama
votebooleanOy işlemlerini dahil et (true) veya hariç tut (false). Varsayılan: tümünü dahil et.
failedbooleanBaşarısız işlemleri dahil et (true) veya hariç tut (false). Varsayılan: tümünü dahil et.
signaturestringTek bir belirli işlem imzasını izle.
accountIncludestring[]Yalnızca bu hesaplardan herhangi birini içeren işlemleri dahil et (mantıksal VEYA).
accountExcludestring[]Bu hesaplardan herhangi birini içeren işlemleri hariç tut.
accountRequiredstring[]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 SenaryosuFiltre Stratejisi
Swap’lar için bir DEX izlemeaccountInclude: [dexProgramId], vote: false
Cüzdan aktivitesini tespit etmeaccountInclude: [walletPubkey], vote: false, failed: false
Belirli bir token mint’ini izlemeaccountInclude: [mintAddress]
Tüm oy dışı, başarılı işlemleri takip etmevote: false, failed: false, hesap filtresi yok
Tek bir işlemi izlemesignature: "txSignatureHere"