Tips & Best Practices
Learn how to optimize your transaction success rate and performance with these essential tips.
Implement Retry Logic
While Payload handles retries automatically, implementing client-side retry logic with exponential backoff can further improve reliability:
const connection = new Connection('https://api.payload.wtf/sendTransaction');
// Configure retry settings
const retrySettings = {
maxRetries: 3,
initialDelay: 500, // ms
backoffFactor: 1.5
};
// Function to send transaction with retries
async function sendTransactionWithRetry(transaction: Transaction) {
let attempt = 0;
let delay = retrySettings.initialDelay;
while (attempt < retrySettings.maxRetries) {
try {
const signature = await connection.sendTransaction(transaction);
return signature;
} catch (error) {
attempt++;
if (attempt === retrySettings.maxRetries) throw error;
await new Promise(resolve => setTimeout(resolve, delay));
delay *= retrySettings.backoffFactor;
}
}
}
Skip Preflight Checks
For time-sensitive transactions, you can skip preflight checks to reduce latency. Use this option carefully as it bypasses local simulation:
const connection = new Connection('https://api.payload.wtf/sendTransaction');
// Send transaction with preflight checks disabled
const signature = await connection.sendTransaction(transaction, {
skipPreflight: true // Skip local simulation
});
Batch Transactions
When sending multiple transactions, consider batching them in parallel to improve throughput:
const connection = new Connection('https://api.payload.wtf/sendTransaction');
// Create multiple transactions
const transactions = [tx1, tx2, tx3];
// Send transactions in parallel
const signatures = await Promise.all(
transactions.map(tx => connection.sendTransaction(tx))
);
Additional Tips
- Monitor transaction status using webhooks instead of polling
- Keep transaction size small by minimizing instruction count
- Use compute budget instructions to adjust priority fees dynamically
- Consider using versioned transactions for better compatibility