Transactions Best Practices
Reliable, cost-efficient transaction landing.
How to Use This List
- Review before mainnet launch and after incidents
- Check off items per release train
A - Foundations
- Pin Agave 4.1.1 toolchain. CLI 3.0.10, Anchor 0.32.1, Rust 1.91.1 aligned in CI.
- Use @solana/kit 7.0.0 for new clients. Avoid web3.js v1 for greenfield work.
- Match RPC, wallet, and explorer cluster. Prevent false "account not found" errors.
B - Reliability
- Confirm at
confirmedorfinalized. Do not treatprocessedas final. - Refresh blockhash on retry. Expired transactions are dropped silently.
- Simulate and read logs. Decode program errors before resubmitting.
C - Economics & Security
- Budget priority fees under congestion. Local fee markets need Compute Budget instructions.
- Validate signers and account owners. Missing constraints are critical vulnerabilities.
- Close unused accounts to reclaim rent. Return lamports to users when lifecycle ends.
FAQs
How does this apply on Agave 4.1.1?
Agave 4.1.1 enforces account lists, blockhashes, and fee markets exactly as in the checklist.
What Solana CLI version should I use?
Use Solana CLI 3.0.10, which pairs with Agave 4.1.1. Install with agave-install init 4.1.1 (or your team's pin file), then verify with solana --version and agave-install --version.
Should I use @solana/kit or web3.js?
Use @solana/kit 7.0.0 for new TypeScript—typed RPC methods, smaller API surface, and examples on this page already use Kit. Keep web3.js only for legacy codebases; migrate RPC calls and transaction building incrementally.
What commitment level is recommended?
Simulate at confirmed, then poll getSignatureStatuses at confirmed for speed. Use finalized before treating token movements as settled.
How do I debug related failures?
Most failures: expired blockhash, wrong account metas, or missing priority fee—simulate before every send.
Does this work on devnet?
Yes—point CLI and RPC to https://api.devnet.solana.com. Behavior matches mainnet; only account data and economics differ.
How do compute units affect this?
Always set SetComputeUnitLimit from simulation plus ~10% headroom; add SetComputeUnitPrice when congested.
What is the Anchor 0.32.1 pattern?
Anchor 0.32.1 uses #[program], Context<T>, and #[derive(Accounts)] with explicit mut/signer constraints—run anchor build and anchor test on 0.32.1 via avm use 0.32.1.
How do I test with Surfpool 0.12.0?
Run anchor test with Surfpool 0.12.0 to simulate full transactions against a mainnet fork—especially priority-fee and v0/ALT paths.
Can LiteSVM 0.6.x cover this?
LiteSVM catches account-meta and CU issues; devnet validates fee-market landing.
What changed in the Agave era?
The validator client rebranded to Agave (4.1.1), CLI 3.0.10 aligns with it, and Alpenglow work is changing finality—pin versions and read release notes each upgrade.
Where do I find related RPC methods?
simulateTransaction, getLatestBlockhash, getRecentPrioritizationFees, sendTransaction.
Related
- See sibling pages in this section for topic-specific depth.
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.