> ## 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.

# Pastikan Transaksi Perdagangan Berhasil dengan Sender

> Bangun loop pengiriman berlatensi rendah dengan Helius Sender: endpoint regional, pemanasan koneksi, biaya prioritas dinamis, tip, serta konfirmasi keberhasilan dengan percobaan ulang.

Sender mengirimkan transaksi Anda secara bersamaan melalui setiap jalur berkecepatan tinggi (Helius, Jito, Harmonic, Rakurai) tanpa menggunakan kredit API. Anda membayar setiap pengiriman dengan tip SOL. Panduan ini membangun loop pengiriman siap produksi dengan koneksi yang tetap aktif, biaya berdasarkan harga terkini, serta konfirmasi dengan kebijakan percobaan ulang.

## Pilih tingkat layanan Anda

[Sender Max](/docs/id/sending-transactions/sender-max) (tip minimum 0.001 SOL) merutekan transaksi melalui semua jalur dan memasukkannya ke buffer tip prioritas, tempat tip yang lebih besar diproses terlebih dahulu.

[Khusus SWQOS](/docs/id/sending-transactions/sender-swqos-only) (0.000005 SOL) menggunakan satu jalur cepat untuk alur yang dioptimalkan berdasarkan biaya. Tambahkan `?swqos_only=true` ke URL endpoint.

Tip di antara kedua nilai minimum tersebut diproses secara upaya terbaik melalui lebih sedikit jalur. Karena itu, pilih salah satu tingkat layanan.

## Pilih endpoint Anda

Backend sebaiknya menggunakan endpoint HTTP regional yang paling dekat dengan servernya (`http://ewr-sender.helius-rpc.com/fast`, `fra`, `slc`, `ams`, `lon`, `sg`, `tyo`).

Browser sebaiknya menggunakan endpoint HTTPS global `https://sender.helius-rpc.com/fast`, yang melakukan perutean otomatis dan menghindari masalah CORS.

## Jaga koneksi tetap aktif

Handshake TCP/TLS awal menambah latensi pada pengiriman pertama setelah periode tidak aktif.

Jika sistem Anda dapat memiliki jeda lebih dari sekitar 5 detik di antara pengiriman, jaga koneksi tetap aktif dengan endpoint ping:

```typescript theme={"system"}
const SENDER = 'http://ewr-sender.helius-rpc.com';

setInterval(async () => {
  try {
    await fetch(`${SENDER}/ping`);
  } catch (e) {
    console.warn('warm-up failed:', e);
  }
}, 5_000);
```

## Bangun transaksi

Setiap transaksi Sender harus menyertakan transfer tip ke akun tip yang ditentukan dan harga unit komputasi. Sender menolak transaksi yang tidak menyertakan salah satunya.

Menetapkan biaya prioritas secara permanen membuat Anda membayar terlalu mahal saat pasar sepi dan kalah bersaing saat pasar sibuk. Karena itu, tentukan nilainya melalui [API Biaya Prioritas](/docs/id/priority-fee-api):

```typescript send.ts theme={"system"}
import {
  Connection, TransactionMessage, VersionedTransaction,
  SystemProgram, PublicKey, Keypair, ComputeBudgetProgram, LAMPORTS_PER_SOL
} from '@solana/web3.js';

const RPC = 'https://mainnet.helius-rpc.com/?api-key=YOUR_API_KEY';
const TIP_ACCOUNTS = [
  '4ACfpUFoaSD9bfPdeu6DBt89gB6ENTeHBXCAi87NhDEE',
  'D2L6yPZ2FmmmTKPgzaMKdhu6EWZcTpLy1Vhx8uvZe7NZ',
  '9bnz4RShgq1hAnLnZbP8kbgBg1kEmcJBYQq3gQbmnSta'
];

async function buildTransaction(keypair: Keypair, tradeInstructions: any[]) {
  const connection = new Connection(RPC);
  const { blockhash } = await connection.getLatestBlockhash('confirmed');

  // Price the fee against the accounts the trade touches
  const feeRes = await fetch(RPC, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({
      jsonrpc: '2.0', id: '1', method: 'getPriorityFeeEstimate',
      params: [{
        accountKeys: tradeInstructions.flatMap(ix => ix.keys.map((k: any) => k.pubkey.toBase58())),
        options: { recommended: true }
      }]
    })
  });
  const { result } = await feeRes.json();

  const tx = new VersionedTransaction(
    new TransactionMessage({
      instructions: [
        ComputeBudgetProgram.setComputeUnitLimit({ units: 100_000 }),
        ComputeBudgetProgram.setComputeUnitPrice({ microLamports: result.priorityFeeEstimate }),
        ...tradeInstructions,
        SystemProgram.transfer({
          fromPubkey: keypair.publicKey,
          toPubkey: new PublicKey(TIP_ACCOUNTS[Math.floor(Math.random() * TIP_ACCOUNTS.length)]),
          lamports: 0.001 * LAMPORTS_PER_SOL // Sender Max minimum; tip more to land first
        })
      ],
      payerKey: keypair.publicKey,
      recentBlockhash: blockhash
    }).compileToV0Message()
  );
  tx.sign([keypair]);
  return tx;
}
```

Tip menentukan jalur yang dapat digunakan transaksi Anda, sedangkan biaya prioritas meningkatkan posisinya dalam antrean validator. Keduanya memaksimalkan probabilitas penyertaan.

## Kirim, lalu konfirmasikan

Kirim dengan `skipPreflight: true` untuk mengorbankan validasi sisi klien demi latensi yang lebih rendah, lalu konfirmasikan melalui koneksi RPC Anda.

Sender segera mengembalikan tanda tangan, tetapi ini bukan bukti bahwa transaksi telah berhasil masuk:

```typescript theme={"system"}
async function sendAndConfirm(tx: VersionedTransaction): Promise<string> {
  const signature = await send(tx);

  const connection = new Connection(RPC);
  for (let i = 0; i < 30; i++) {
    const { value } = await connection.getSignatureStatuses([signature]);
    const status = value[0];
    if (status?.err) throw new Error(`Transaction failed: ${JSON.stringify(status.err)}`);
    if (status?.confirmationStatus === 'confirmed' || status?.confirmationStatus === 'finalized') {
      return signature;
    }
    await new Promise(r => setTimeout(r, 1_000));
  }
  throw new Error('Not confirmed within 30s: rebuild with a fresh blockhash and resend');
}

async function send(tx: VersionedTransaction): Promise<string> {
  const res = await fetch(`${SENDER}/fast`, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({
      jsonrpc: '2.0',
      id: Date.now().toString(),
      method: 'sendTransaction',
      params: [
        Buffer.from(tx.serialize()).toString('base64'),
        { encoding: 'base64', skipPreflight: true, maxRetries: 0 }
      ]
    })
  });
  const json = await res.json();
  if (json.error) throw new Error(json.error.message);
  return json.result;
}
```

Dengan `maxRetries: 0`, Anda mengendalikan kebijakan percobaan ulang: ketika waktu konfirmasi habis, bangun ulang transaksi dengan blockhash baru dan biaya yang dihitung ulang, alih-alih mengirim ulang transaksi yang sudah kedaluwarsa.

Throughput default adalah 50 TPS. Paket Professional dapat [meminta batas yang lebih tinggi](https://www.helius.dev/contact).

## Opsional: hindari penyerang sandwich dalam perutean

Tambahkan `?mev-protect=true` ke URL endpoint untuk menghindari validator yang secara statistik terkait dengan serangan sandwich. Isi permintaan tidak berubah, dan fitur ini berfungsi pada kedua tingkat layanan:

```text theme={"system"}
http://ewr-sender.helius-rpc.com/fast?mev-protect=true
```

Lihat [MEV Protect](/docs/id/sending-transactions/mev-protect) untuk memahami komprominya. Untuk eksekusi beberapa transaksi secara atomik (hingga 4 transaksi, semuanya berhasil atau semuanya gagal), gunakan [`sendBundle`](/docs/id/sending-transactions/sender-max#bundel) pada endpoint yang sama.

## Panduan terkait

<CardGroup cols={2}>
  <Card title="Sender overview" icon="paper-plane" href="/docs/id/sending-transactions/sender">
    Tingkat layanan, endpoint, akun tip, dan batas laju secara lengkap
  </Card>

  <Card title="Trade on Preconfirmations" icon="stopwatch" href="/docs/id/pre-confirmations/guides/trade-on-preconfirmations">
    Padukan jalur pengiriman tercepat dengan sinyal transaksi paling awal
  </Card>
</CardGroup>
