Transactions

Submit individual transactions through Slipstream with smart routing and detailed results. Costs 1 token (0.00005 SOL) per transaction.

Basic Submission

Basic — Rust

1let result = client.submit_transaction(&tx_bytes).await?;
2println!("Status: {:?}", result.status);
3println!("Signature: {:?}", result.signature);

Basic — TypeScript

1const result = await client.submitTransaction(txBytes);
2console.log("Status:", result.status);
3console.log("Signature:", result.signature);

Basic — Python

1result = await client.submit_transaction(tx_bytes)
2print(f"Status: {result.status}")
3print(f"Signature: {result.signature}")

Submission with Options

Options — Rust

1use allenhark_slipstream::{SubmitOptions, RetryOptions};
2
3let result = client.submit_transaction_with_options(&tx_bytes, &SubmitOptions {
4    // Fan-out to all regions (default: false)
5    broadcast_mode: false,
6
7    // Force a specific sender (default: auto-select)
8    preferred_sender: None,
9
10    // Max retries for this transaction (default: 2)
11    max_retries: 2,
12
13    // Timeout in milliseconds (default: 30000)
14    timeout_ms: 30_000,
15
16    // Deduplication ID — skip if already seen
17    dedup_id: Some("my-unique-tx-id".into()),
18
19    // Retry configuration
20    retry: Some(RetryOptions {
21        max_retries: 2,
22        backoff_base_ms: 100,
23        cross_sender_retry: false, // Try different sender on retry
24    }),
25
26    // Direct UDP to validator TPU — fire-and-forget, costs 0.0001 SOL
27    tpu_submission: false,
28}).await?;

Options — TypeScript

1const result = await client.submitTransactionWithOptions(txBytes, {
2    broadcastMode: false,
3    preferredSender: undefined,
4    maxRetries: 2,
5    timeoutMs: 30_000,
6    dedupId: "my-unique-tx-id",
7    retry: {
8        maxRetries: 2,
9        backoffBaseMs: 100,
10        crossSenderRetry: false,
11    },
12    tpuSubmission: false,
13});

Options — Python

1from allenhark_slipstream import SubmitOptions, RetryOptions
2
3result = await client.submit_transaction_with_options(tx_bytes, SubmitOptions(
4    broadcast_mode=False,
5    preferred_sender=None,
6    max_retries=2,
7    timeout_ms=30_000,
8    dedup_id="my-unique-tx-id",
9    retry=RetryOptions(
10        max_retries=2,
11        backoff_base_ms=100,
12        cross_sender_retry=False,
13    ),
14    tpu_submission=False,
15))

TransactionResult Fields

FieldTypeDescription
request_idstringUnique request identifier
transaction_idstringTransaction identifier
signaturestring?Transaction signature (base58)
statusTransactionStatusCurrent status
slotnumber?Slot when submitted
slot_sentnumber?Slot when sent to network
slot_acceptednumber?Slot when accepted
slot_landednumber?Slot when landed on-chain
slot_deltanumber?Difference between sent and landed slots
commitment_levelstring?Commitment level reached
confirmationsnumber?Number of confirmations
timestampnumberUnix timestamp
routingRoutingInfo?Region, sender, and latency details
errorTransactionError?Error details if failed

Transaction Statuses

StatusDescription
pendingAccepted, not yet processed
processingBeing processed by Slipstream
sentSent to the Solana network
confirmedConfirmed on-chain
failedTransaction failed
duplicateDuplicate detected (via dedup_id)
rate_limitedRate limit exceeded
insufficient_tokensNot enough tokens

TPU Submission

For fire-and-forget scenarios, use tpu_submission: true. This sends the transaction directly via UDP to the validator TPU. It costs 0.0001 SOL per transaction and provides no confirmation receipt.

TPU — Rust

1let result = client.submit_transaction_with_options(&tx_bytes, &SubmitOptions {
2    tpu_submission: true,
3    ..Default::default()
4}).await?;

TPU — TypeScript

1const result = await client.submitTransactionWithOptions(txBytes, {
2    tpuSubmission: true,
3});

TPU — Python

1result = await client.submit_transaction_with_options(tx_bytes, SubmitOptions(
2    tpu_submission=True,
3))

Next Steps