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

# Apex Paketleri

> sendBundle veya POST /send-bundle ile OrbitFlare Apex üzerinden 1 ila 4 işlemlik atomik Solana paketleri gönderin ve bunları getInflightBundleStatuses ile izleyin.

## Paket Nedir

Paket, **sırayla** ve **ya hep ya hiç** esasıyla yürütülen **1 ila 4 işlemden** oluşan bir gruptur. Ya paketteki her işlem verdiğiniz sırayla aynı bloğa girer ya da hiçbiri girmez.

Sonraki bir işlem yalnızca önceki başarılı olduysa anlam taşıyorsa paket kullanın, örneğin bir hazırlık işlemi ve ardından gelen bir takas.

<Warning>
  **Paketler yalnızca Jito etkin liderlerde bloğa girer.** Bir işlem grubu, stake ağırlıklı veya doğrudan TPU yollarında atomik tutulamaz, bu yüzden paketler yalnızca blok motoru yoluna gider. Mevcut lider Jito çalıştırmıyorsa paket, çalıştıran bir sonraki lideri bekler. Tek bir işlem için normal bir [gönderim](/tr/apex/sending-transactions) üç yolun hepsini kullanır ve bloğa daha erken girer.
</Warning>

## Kurallar

| Kural                 | Ayrıntı                                                                                                                                                           |
| --------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Boyut**             | 1 ila 4 işlem                                                                                                                                                     |
| **Sıra**              | Verilen sırayla yürütülür                                                                                                                                         |
| **Atomiklik**         | Ya hep ya hiç                                                                                                                                                     |
| **Bahşiş**            | Paketteki **tam olarak bir** işlem, katmanınızın tabanında veya üzerinde Apex bahşişini taşır                                                                     |
| **Üye boyutu**        | Her işlem 1232 baytla sınırlıdır. [Transaction v1](/tr/apex/transaction-v1) boyutları paket içinde geçerli değildir                                               |
| **Hız**               | API anahtarı başına saniyede 2 paket, kısa süreli 4 pakete kadar patlama, işlem limitinize ek olarak. Aşıldığında HTTP `429` veya `-32029` döner                  |
| **Durum**             | `getInflightBundleStatuses`, paketi gönderen API anahtarını ister ve en fazla 100 id alır. Başka bir anahtarla gönderilen paket `Invalid` olarak görünür          |
| **Yeniden denemeler** | Apex, paket bloğa girene, **ilk** işlemin blockhash'inin süresi dolana veya yeniden gönderim bütçesi tükenene kadar paketi aynı paket kimliğiyle yeniden gönderir |

Bahşiş, tek bir gönderimdeki [bahşiş kuralının](/tr/apex/tips) aynısına uyar: yayınlanmış bir bahşiş hesabına, bir imzalayan tarafından karşılanan, bahşiş hesabı statik anahtarlarda olan tek bir üst düzey SystemProgram transferi. Bu bahşişten 5.000 lamport'luk temel ücret düşüldükten sonra kalan tutar, tüm paket için Jito teklifi olur. Paket atomik olduğundan bahşiş yalnızca paketin tamamı bloğa girerse ödenir.

## JSON-RPC sendBundle

| Parametre            | Tür       | Açıklama                                                                                   |
| -------------------- | --------- | ------------------------------------------------------------------------------------------ |
| `params[0]`          | string\[] | Yürütme sırasına göre, hepsi `params[1]` içinde belirtilen kodlamayla 1 ila 4 imzalı işlem |
| `params[1].encoding` | string    | `"base64"` veya `"base58"`                                                                 |

Sonuç bir **paket kimliğidir**. Paketin durumunu sorgulamak için onu saklayın. `sendBundle`, base58 ile kodlanmış işlemler için `{"encoding": "base58"}` değerini de kabul eder. Aşağıdaki örnekler base64 kullanır.

<CodeGroup>
  ```bash cURL theme={null}
  # Two signed transactions from the helper in Sending transactions.
  # Exactly one of them may carry the tip, so build the first one without it.
  TX1=$(node -e 'import("./apex-tx.mjs").then(async (m) => console.log(Buffer.from((await m.buildTx({ tip: false, label: "apex bundle 1" })).serialize()).toString("base64")))')
  TX2=$(node -e 'import("./apex-tx.mjs").then(async (m) => console.log(Buffer.from((await m.buildTx({ tip: true, label: "apex bundle 2" })).serialize()).toString("base64")))')

  BUNDLE_ID=$(curl -s "$APEX_RPC" \
    -H "Content-Type: application/json" \
    -H "x-api-key: $APEX_API_KEY" \
    -d "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"sendBundle\",\"params\":[[\"$TX1\",\"$TX2\"],{\"encoding\":\"base64\"}]}" \
    | jq -r '.result // .error')
  echo "bundle id: $BUNDLE_ID"

  curl -s "$APEX_RPC" \
    -H "Content-Type: application/json" \
    -H "x-api-key: $APEX_API_KEY" \
    -d "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"getInflightBundleStatuses\",\"params\":[[\"$BUNDLE_ID\"]]}"
  ```

  ```javascript JavaScript theme={null}
  import { apexRpc, buildTx } from "./apex-tx.mjs";

  // Exactly one transaction carries the tip.
  const txs = [
    await buildTx({ tip: false, label: "apex bundle 1" }),
    await buildTx({ tip: true, label: "apex bundle 2" }),
  ];

  const bundleId = await apexRpc("sendBundle", [
    txs.map((tx) => Buffer.from(tx.serialize()).toString("base64")),
    { encoding: "base64" },
  ]);
  console.log("bundle id:", bundleId);

  // Poll until the bundle settles.
  for (;;) {
    const { value } = await apexRpc("getInflightBundleStatuses", [[bundleId]]);
    const { status, landed_slot } = value[0];
    if (status === "Landed") { console.log("landed in slot", landed_slot); break; }
    if (status === "Failed" || status === "Invalid") { console.log("bundle", status); break; }
    await new Promise((resolve) => setTimeout(resolve, 1000));
  }
  ```

  ```python Python theme={null}
  import base64
  import time

  from apex_tx import apex_rpc, build_tx

  # Exactly one transaction carries the tip.
  txs = [
      build_tx(tip=False, label="apex bundle 1"),
      build_tx(tip=True, label="apex bundle 2"),
  ]

  bundle_id = apex_rpc("sendBundle", [
      [base64.b64encode(bytes(tx)).decode() for tx in txs],
      {"encoding": "base64"},
  ])
  print("bundle id:", bundle_id)

  # Poll until the bundle settles.
  while True:
      entry = apex_rpc("getInflightBundleStatuses", [[bundle_id]])["value"][0]
      if entry["status"] == "Landed":
          print("landed in slot", entry["landed_slot"])
          break
      if entry["status"] in ("Failed", "Invalid"):
          print("bundle", entry["status"])
          break
      time.sleep(1)
  ```
</CodeGroup>

JavaScript ve Python örnekleri, yardımcıyı [İşlem gönderme](/tr/apex/sending-transactions#bahşişli-ve-imzalı-bir-işlem-oluşturun) sayfasından içe aktarır.

Yanıt:

```json theme={null}
{ "jsonrpc": "2.0", "id": 1, "result": "<bundle id>" }
```

## POST /send-bundle

İkili rota, [`/send-batch`](/tr/apex/sending-transactions#post-/send-batch) ile aynı çerçevelemeyi alır: her işlem için big-endian u16 uzunluk ve ardından ham işlem baytları, yürütme sırasına göre 1 ila 4 çerçeve.

<CodeGroup>
  ```javascript JavaScript theme={null}
  import { APEX_RPC, API_KEY, buildTx } from "./apex-tx.mjs";

  const txs = [
    await buildTx({ tip: false, label: "apex bundle 1" }),
    await buildTx({ tip: true, label: "apex bundle 2" }),
  ];

  // Each frame: u16 big-endian length, then the transaction bytes.
  const frames = txs.map((tx) => {
    const wire = Buffer.from(tx.serialize());
    const length = Buffer.alloc(2);
    length.writeUInt16BE(wire.length);
    return Buffer.concat([length, wire]);
  });

  const res = await fetch(`${APEX_RPC}/send-bundle`, {
    method: "POST",
    headers: { "Content-Type": "application/octet-stream", "x-api-key": API_KEY },
    body: Buffer.concat(frames),
  });
  const body = await res.json();
  if (!body.bundle_id) throw new Error(`rejected ${res.status} ${body.error}: ${body.message}`);
  console.log("bundle id:", body.bundle_id);
  console.log("signatures:", body.signatures);
  ```

  ```python Python theme={null}
  import struct

  from apex_tx import APEX_RPC, build_tx, session

  txs = [
      bytes(build_tx(tip=False, label="apex bundle 1")),
      bytes(build_tx(tip=True, label="apex bundle 2")),
  ]
  # Each frame: u16 big-endian length, then the transaction bytes.
  payload = b"".join(struct.pack(">H", len(wire)) + wire for wire in txs)

  r = session.post(f"{APEX_RPC}/send-bundle", headers={"Content-Type": "application/octet-stream"},
                   data=payload, timeout=5)
  body = r.json()
  if "bundle_id" not in body:
      raise RuntimeError(f"rejected {r.status_code} {body['error']}: {body['message']}")
  print("bundle id:", body["bundle_id"])
  print("signatures:", body["signatures"])
  ```
</CodeGroup>

Yanıt:

```json theme={null}
{
  "bundle_id": "<bundle id>",
  "signatures": ["<signature of transaction 1>", "<signature of transaction 2>"]
}
```

Hatalar, diğer [düz HTTP rotalarıyla](/tr/apex/errors-and-rate-limits#düz-http-hataları) aynı biçimi ve durum kodlarını kullanır. Bütün olarak reddedilen bir paket `bundle` etiketiyle döner.

## Bir Paketi İzleyin

`getInflightBundleStatuses` yöntemini bir paket kimlikleri dizisiyle çağırın:

```json theme={null}
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "getInflightBundleStatuses",
  "params": [["<bundle id>"]]
}
```

Sonuç, sorduğunuz sırayla her paket kimliği için bir kayıt içerir:

```json theme={null}
{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "context": { "slot": 367112345 },
    "value": [
      { "bundle_id": "<bundle id>", "status": "Landed", "landed_slot": 367112344 }
    ]
  }
}
```

`landed_slot`, paketin bloğa girdiği slottur; paket henüz bloğa girmediyse `null` olur. `status` dört durumdan biridir:

| Durum     | Anlamı                                                                                                |
| --------- | ----------------------------------------------------------------------------------------------------- |
| `Pending` | Apex paketi elinde tutuyor ve hâlâ gönderiyor                                                         |
| `Landed`  | Paket bloğa girdi. Slot `landed_slot` alanındadır                                                     |
| `Failed`  | Paket, ilk işlemin blockhash'inin süresi dolmadan bloğa girmedi veya yeniden gönderim bütçesi tükendi |
| `Invalid` | Paket kimliği bu Apex uç noktası tarafından bilinmiyor veya beş dakikadan eski                        |

Apex paketi yeniden gönderirken paket kimliği aynı kalır; bu yüzden paketi gönderdiğinizde aldığınız kimliği sorgulamaya devam edin.

Paketi gönderdiğiniz Apex uç noktasının aynısına sorun. Paket kimlikleri uç noktalar arasında paylaşılmaz.

Paket atomik olduğundan onu herhangi bir işlem gibi de onaylayabilirsiniz: imzalarından herhangi biri bir Solana RPC üzerindeki `getSignatureStatuses` içinde onaylanmış olarak göründüğünde paketin tamamı bloğa girmiştir.

## Paket mi, Toplu Gönderim mi?

|                       | Paket                     | [Toplu gönderim](/tr/apex/sending-transactions#post-/send-batch) |
| --------------------- | ------------------------- | ---------------------------------------------------------------- |
| **İşlemler**          | 1 ila 4                   | En fazla 16                                                      |
| **Atomik**            | Evet                      | Hayır, her biri bağımsızdır                                      |
| **Sıralı**            | Evet                      | Hayır                                                            |
| **Bahşiş**            | Tüm paket için bir tane   | İşlem başına bir tane                                            |
| **Yollar**            | Yalnızca Jito blok motoru | Üçü de                                                           |
| **Üye boyutu sınırı** | 1232 bayt                 | 1232 bayt veya v1 için 4096                                      |
