> ## Documentation Index
> Fetch the complete documentation index at: https://www.helius.dev/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Berdagang dengan Transaksi Praproses

> Pantau transaksi Solana suatu program sebelum mencapai tingkat commitment processed dengan preprocessedSubscribe.

`preprocessedSubscribe` mengalirkan transaksi yang telah ditandatangani sebelum mencapai tingkat commitment `processed`, yang didekode dari shred saat tiba di validator, tanpa memerlukan infrastruktur deshredding di sisi Anda.

Panduan ini membuat pemantau yang mengawasi program perdagangan sebelum eksekusi, menghapus duplikasi dari feed, tetap berada di bawah batas tekanan balik server, dan merekonsiliasi dengan data processed sebelum mengambil tindakan.

<Tip>
  [Transaksi Praproses](/docs/id/preprocessed-transactions/overview) tersedia di semua paket berbayar dan dikenai biaya 0,1 kredit per pesan, dengan maksimal 10 koneksi bersamaan per API key.
</Tip>

## Batasi cakupan langganan ke target Anda

Tidak ada stream tanpa filter: `accountInclude` dan `accountRequired` harus mencantumkan setidaknya satu akun di antara keduanya. Untuk pemantau perdagangan, sertakan program yang menjadi lawan perdagangan Anda dan kecualikan noise yang jika tidak akan tetap Anda bayar:

```json theme={"system"}
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "preprocessedSubscribe",
  "params": {
    "accountInclude": ["JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4"],
    "accountExclude": ["Vote111111111111111111111111111111111111111"],
    "accountRequired": []
  }
}
```

Filter digabungkan dengan AND, setiap daftar menerima hingga 5.000 alamat, dan Helius me-resolve tabel pencarian alamat di sisi server, sehingga akun yang dimuat melalui ALT tetap cocok. Untuk memantau interaksi dompet tertentu dengan program, masukkan keduanya ke bidang `accountRequired`.

## Dekode frame dan hapus duplikasi berdasarkan signature

Notifikasi diterima sebagai frame biner: prefiks 73 byte, lalu transaksi yang diserialisasi dengan bincode. Signature berada di dalam prefiks sehingga Anda dapat menghapus duplikasi tanpa mendekode isi. Stream menggabungkan beberapa sumber praeksekusi, dan transaksi yang sama dapat diterima lebih dari sekali:

```javascript monitor.js theme={"system"}
const WebSocket = require('ws');
const bs58module = require('bs58');
const bs58 = bs58module.default ?? bs58module;

const ws = new WebSocket('wss://beta.helius-rpc.com/?api-key=YOUR_API_KEY');
const seen = new Set(); // rotate or expire entries in production
const queue = [];       // decode off the receive path; see next step

ws.on('open', () => {
  ws.send(JSON.stringify({
    jsonrpc: '2.0',
    id: 1,
    method: 'preprocessedSubscribe',
    params: {
      accountInclude: ['JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4'],
      accountExclude: ['Vote111111111111111111111111111111111111111'],
      accountRequired: []
    }
  }));
  setInterval(() => ws.ping(), 30_000);
});

ws.on('message', (data, isBinary) => {
  if (!isBinary) {
    const msg = JSON.parse(data.toString());
    if (msg.id === 1) console.log('Subscribed, ID:', msg.result);
    return;
  }

  // version (u8) | slot (u64 LE) | signature ([u8; 64]) | bincode(VersionedTransaction)
  const buf = Buffer.from(data);
  if (buf.readUInt8(0) !== 1) return; // unknown schema version; update your decoder
  const signature = bs58.encode(buf.subarray(9, 73));
  if (seen.has(signature)) return;
  seen.add(signature);

  queue.push({
    slot: buf.readBigUInt64LE(1),
    signature,
    txBytes: buf.subarray(73)
  });
});

ws.on('error', console.error);
ws.on('close', () => process.exit(1)); // supervisor restarts and resubscribes
```

## Pastikan loop penerimaan lebih cepat daripada stream

Helius tidak melakukan buffering tanpa batas untuk konsumen yang lambat: jika lebih dari 4.000 pesan menumpuk di sisi server, koneksi akan ditutup. Karena itu, handler di atas hanya membaca prefiks 73 byte dan memasukkannya ke antrean.

Deserialisasi dan logika strategi berjalan dalam loop terpisah:

```javascript theme={"system"}
setImmediate(async function drain() {
  const { VersionedTransaction } = require('@solana/web3.js');
  while (true) {
    const item = queue.shift();
    if (!item) { await new Promise(r => setTimeout(r, 1)); continue; }
    const tx = VersionedTransaction.deserialize(item.txBytes);
    strategy.onPreExecution(item.slot, item.signature, tx);
  }
});
```

Jika antrean terus bertambah tanpa batas, persempit filternya. Setiap transaksi yang Anda buang di sisi klien tetap dikenai biaya 0,1 kredit dan tetap diperhitungkan dalam batas tekanan balik.

## Rekonsiliasi dengan data processed

Transaksi praproses menunjukkan apa yang coba dilakukan pengirim, bukan apa yang benar-benar terjadi. Transaksi ini tidak memuat status eksekusi, perubahan saldo, atau log, serta dapat gagal, dibatalkan, atau masuk ke fork lain. Pengiriman dilakukan berdasarkan upaya terbaik tanpa pemutaran ulang historis, jadi:

* Rekonsiliasi dengan [`transactionSubscribe`](/docs/id/rpc/websocket/transaction-subscribe) pada commitment `processed` atau `confirmed` sebelum strategi Anda mencatat apa pun sebagai fakta.
* Jika koneksi terputus, segera berlangganan kembali dan terima adanya celah karena tidak ada pemutaran ulang untuk mengisinya.
* Jika Anda memerlukan status akun secara real-time alih-alih intensi transaksi, data tersebut hanya tersedia setelah eksekusi: gunakan [LaserStream gRPC](/docs/id/laserstream) pada `processed`.

## Panduan terkait

<CardGroup cols={2}>
  <Card title="preprocessedSubscribe reference" icon="code" href="/docs/id/preprocessed-transactions/preprocessed-subscribe">
    Tata letak payload lengkap, aturan filter, tekanan balik, dan harga
  </Card>

  <Card title="Trade on Preconfirmations" icon="stopwatch" href="/docs/id/pre-confirmations/guides/trade-on-preconfirmations">
    Sinyal transaksi paling awal yang ditawarkan Helius, langsung dari scheduler
  </Card>
</CardGroup>
