Transactions
Submit individual transactions through Slipstream with smart routing and detailed results. Costs 1 token (0.00005 SOL) per transaction.
Basic Submission
Basic — Rust
let result = client.submit_transaction(&tx_bytes).await?;
println!("Status: {:?}", result.status);
println!("Signature: {:?}", result.signature);Basic — TypeScript
const result = await client.submitTransaction(txBytes);
console.log("Status:", result.status);
console.log("Signature:", result.signature);Basic — Python
result = await client.submit_transaction(tx_bytes)
print(f"Status: {result.status}")
print(f"Signature: {result.signature}")Submission with Options
Options — Rust
use allenhark_slipstream::{SubmitOptions, RetryOptions};
let result = client.submit_transaction_with_options(&tx_bytes, &SubmitOptions {
// Fan-out to all regions (default: false)
broadcast_mode: false,
// Force a specific sender (default: auto-select)
preferred_sender: None,
// Max retries for this transaction (default: 2)
max_retries: 2,
// Timeout in milliseconds (default: 30000)
timeout_ms: 30_000,
// Deduplication ID — skip if already seen
dedup_id: Some("my-unique-tx-id".into()),
// Retry configuration
retry: Some(RetryOptions {
max_retries: 2,
backoff_base_ms: 100,
cross_sender_retry: false, // Try different sender on retry
}),
// Direct UDP to validator TPU — fire-and-forget, costs 0.0001 SOL
tpu_submission: false,
}).await?;Options — TypeScript
const result = await client.submitTransactionWithOptions(txBytes, {
broadcastMode: false,
preferredSender: undefined,
maxRetries: 2,
timeoutMs: 30_000,
dedupId: "my-unique-tx-id",
retry: {
maxRetries: 2,
backoffBaseMs: 100,
crossSenderRetry: false,
},
tpuSubmission: false,
});Options — Python
from allenhark_slipstream import SubmitOptions, RetryOptions
result = await client.submit_transaction_with_options(tx_bytes, SubmitOptions(
broadcast_mode=False,
preferred_sender=None,
max_retries=2,
timeout_ms=30_000,
dedup_id="my-unique-tx-id",
retry=RetryOptions(
max_retries=2,
backoff_base_ms=100,
cross_sender_retry=False,
),
tpu_submission=False,
))TransactionResult Fields
| Field | Type | Description |
|---|---|---|
request_id | string | Unique request identifier |
transaction_id | string | Transaction identifier |
signature | string? | Transaction signature (base58) |
status | TransactionStatus | Current status |
slot | number? | Slot when submitted |
slot_sent | number? | Slot when sent to network |
slot_accepted | number? | Slot when accepted |
slot_landed | number? | Slot when landed on-chain |
slot_delta | number? | Difference between sent and landed slots |
commitment_level | string? | Commitment level reached |
confirmations | number? | Number of confirmations |
timestamp | number | Unix timestamp |
routing | RoutingInfo? | Region, sender, and latency details |
error | TransactionError? | Error details if failed |
Transaction Statuses
| Status | Description |
|---|---|
pending | Accepted, not yet processed |
processing | Being processed by Slipstream |
sent | Sent to the Solana network |
confirmed | Confirmed on-chain |
failed | Transaction failed |
duplicate | Duplicate detected (via dedup_id) |
rate_limited | Rate limit exceeded |
insufficient_tokens | Not 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
let result = client.submit_transaction_with_options(&tx_bytes, &SubmitOptions {
tpu_submission: true,
..Default::default()
}).await?;TPU — TypeScript
const result = await client.submitTransactionWithOptions(txBytes, {
tpuSubmission: true,
});TPU — Python
result = await client.submit_transaction_with_options(tx_bytes, SubmitOptions(
tpu_submission=True,
))Next Steps
- Bundles — Atomic multi-transaction bundles
- Real-Time Streams — Subscribe to leader hints
- Error Handling — Handle failures gracefully
