Why Transactions Fail to Land
Transactions fail to land when blockhashes expire, compute budgets are exhausted, priority fees are too low, or RPC submission never reaches a leader.
Search across all documentation pages
Transactions fail to land when blockhashes expire, compute budgets are exhausted, priority fees are too low, or RPC submission never reaches a leader.
Quick-reference recipe card - copy-paste ready.
solana confirm -v <SIGNATURE>
solana transaction <SIGNATURE> --output json-compact | jq '.meta.err, .meta.logMessages'const sim = await rpc.simulateTransaction(wireTx, { sigVerify: false }).send();
console.log(sim.value.err, sim.value.unitsConsumed);When to reach for this:
import { createSolanaRpc } from "@solana/kit";
const rpc = createSolanaRpc(process.env.RPC_URL!);
const status = await rpc.getSignatureStatuses([signature]).send();
const value = status.value[0];
console.log({
confirmationStatus: value?.confirmationStatus,
err: value?.err,
slot: value?.slot,
});
const tx = await rpc
.getTransaction(signature, { encoding: "json", maxSupportedTransactionVersion: 0 })
.send();
console.log("landed err:", tx?.value?.meta?.err);
console.log("logs tail:", tx?.value?.meta?.logMessages?.slice(-5));What this demonstrates:
getSignatureStatuses shows if signature is unknown (dropped) vs failed vs confirmed.sendTransaction but validator drops tx if underpriced.| Symptom | Likely cause | Fix direction |
|---|---|---|
| Signature not found | Dropped / expired blockhash | Rebuild tx, higher priority fee |
| Program error in meta | Logic bug | Fix program or accounts |
| CU exceeded | Limit too low | Raise compute budget |
| Blockhash not found | Too old | Fresh blockhash + retry |
# Check if still valid blockhash age at send time - compare current slot to tx slot in logs
solana slotsendTransaction returns signature before inclusion. Fix: track confirmation status separately.| Alternative | Use When | Don't Use When |
|---|---|---|
| Jito bundles | High contention landing | Simple devnet tests |
| Durable nonce | Long-lived signing flow | Normal fresh blockhash txs |
| Private RPC send | Better propagation | Cost-sensitive MVP |
| Lower traffic window | Ops mitigation | User-facing real-time UX |
Usually - but race conditions rare; treat simulation as strong signal.
Mainnet congestion and higher account lock contention - fees and CU differ.
Transaction recent blockhash must be in recent blockhash queue known to validators - stale hashes reject inclusion.
Yes - included in block with meta.err program failure; you still pay base fee.
getSignatureStatuses returns null for unknown signature after waiting period.
No - they improve probability under contention; program errors and CU still fail.
false catches errors early; true faster send but more dropped bad txs.
v0 enables ALTs to fit large account lists - legacy size limits cause silent drops.
Jito tips validators on bundle path; priority fees are native compute unit price - complementary.
Stack versions: This page was written for Agave 4.1.1, Solana CLI 3.0.10, Anchor 0.32.1, anchor-lang 0.32.1, Rust 1.91.1, @solana/kit 7.0.0, Surfpool 0.12.0, and LiteSVM 0.6.x.
Reviewed by Chris St. John·Last updated Jul 16, 2026