Solana transaction failed — missing ATA, BlockhashNotFound, or silently dropped? The fixes
A Solana transaction "failed" is three or four different problems wearing the same shirt. A missing token account, an expired blockhash, and a silently-dropped transaction all look like failure — but each needs a different fix, and the base model tends to blur them together. Here's how to tell them apart.
Missing Associated Token Account (ATA)
SPL token transfers — including USDC — require the recipient to hold an Associated Token Account for that specific mint. If the destination ATA doesn't exist, the transfer reverts (often surfacing as transaction_simulation_failed). It's the single most common on-chain payment failure.
Fix: create the recipient's ATA idempotently in the same transaction, before the transfer instruction — or check for it and create it first. Don't assume the recipient has one.
BlockhashNotFound / expired blockhash
Every Solana transaction carries a recentBlockhash that's only valid for a short window (~60-90 seconds). Build a transaction, sit on it too long, and by send time the blockhash has expired — BlockhashNotFound.
Fix: fetch a fresh recentBlockhash immediately before signing and sending, not minutes earlier. On BlockhashNotFound, rebuild the transaction with a new blockhash — don't resubmit the stale one.
Silently dropped (compute budget)
A transaction can vanish with no error if it exceeds its compute-unit budget — the network drops it rather than reverting loudly. You see nothing come back, and the naive response is to resend, which drops again.
Fix: raise the compute-unit limit for the transaction (a ComputeBudget instruction) to fit the work it actually does, rather than resending into the same silent drop.
These are distinct failures with distinct fixes — creating an ATA won't fix an expired blockhash, and a fresh blockhash won't fix a compute-budget drop. Diagnosing which one you hit is half the battle, which is exactly what makes them worth a structured diagnosis.
For on-chain agents
An agent transacting on Solana needs to route each of these to the right fix, not retry blindly. diagnose_infra_error returns the solana-onchain family and identifies the specific failure — missing ATA, expired blockhash, or compute drop — with the matching fix:
diagnose_infra_error({error: "transaction_simulation_failed missing associated token account"})
// → { family: "solana-onchain",
// fix: "create the recipient's ATA (idempotent) in the same tx before the transfer" }Machine-readable guide: https://snapback.sh/llms.txt · Tool discovery: https://snapback.sh/.well-known/mcp.json · MCP endpoint: https://api.snapback.sh/mcp. Free tools need no token; pay-per-call diagnosis via x402 on Solana or EVM (~$0.0032 USDC).